{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.7.10","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"gpu","dataSources":[{"sourceId":22990,"databundleVersionId":2048213,"sourceType":"competition"},{"sourceId":1782290,"sourceType":"datasetVersion","datasetId":1059618},{"sourceId":2010866,"sourceType":"datasetVersion","datasetId":979056},{"sourceId":2072010,"sourceType":"datasetVersion","datasetId":1241983},{"sourceId":2180975,"sourceType":"datasetVersion","datasetId":1309339},{"sourceId":2210499,"sourceType":"datasetVersion","datasetId":1327520},{"sourceId":2219451,"sourceType":"datasetVersion","datasetId":1332847}],"dockerImageVersionId":30096,"isInternetEnabled":false,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"# HuBMAP - Hacking the Kidney\nLet’s understand the competition  first.\nThis competition is about developing a segmentation problem to identify regions with glomeruli in human kidney tissue images. \n* train : 15 images\n* test : 5  images\n* Each of them has ~50k pixel size and is saved as a high-resolution tiff image.\n* Credits:<br />\n[https://www.kaggle.com/yassinealouini/all-the-segmentation-metrics](http://) <br />\n[https://www.kaggle.com/iafoss/256x256-images](http://) <br />\n[https://www.kaggle.com/iafoss/hubmap-pytorch-fast-ai-starter](http://) <br />\n[https://www.kaggle.com/iafoss/hubmap-pytorch-fast-ai-starter-sub](http://) <br />\n[https://www.kaggle.com/harshsharma511/one-stop-understanding-eda-efficientunet](http://) <br />\n[https://www.kaggle.com/vineeth1999/hubmap-eda-pytorch-efficientunet-offline-training](http://) <br />\n","metadata":{}},{"cell_type":"code","source":"import cv2\nimport datetime\nimport gc\nimport glob\nimport math\nimport matplotlib.pyplot as plt\nimport numpy as np\nimport os\nimport pandas as pd\nimport skimage.morphology\nimport sys\nimport tifffile\n\n\nplot_full_image = True\n\n# Number of glomeruli to display for each image\nnum_glom_display = 5\n\n# Number of glomberuli to save as tiff files.\nnum_glom_save = 5\n\nglob_scale = 0.25\nbase_path = '../input/hubmap-kidney-segmentation'\n#Directory Contents\nprint(\"Directory Contents\")\nprint('%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%' )\nprint('\\n'.join(os.listdir(base_path)))\nprint('%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%' )\ntrain_files = sorted(glob.glob(os.path.join(base_path, 'train/*.tiff')))\nprint(f'Number of training images: {len(train_files)}')\nprint('\\n'.join(train_files))\nprint('%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%' )\n\n#Test Images\ntest_files = sorted(glob.glob(os.path.join(base_path, 'test/*.tiff')))\nprint(f'Number of test images: {len(test_files)}')\nprint('\\n'.join(test_files))\n\ndf_train = pd.read_csv(os.path.join(base_path, 'train.csv'))\ndf_info = pd.read_csv(os.path.join(base_path,'HuBMAP-20-dataset_information.csv'))\n","metadata":{"execution":{"iopub.status.busy":"2024-01-15T13:35:25.189929Z","iopub.execute_input":"2024-01-15T13:35:25.190287Z","iopub.status.idle":"2024-01-15T13:35:27.134073Z","shell.execute_reply.started":"2024-01-15T13:35:25.190207Z","shell.execute_reply":"2024-01-15T13:35:27.133286Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Visualizing the trainging images and thier masks ","metadata":{}},{"cell_type":"markdown","source":"The masks for the training images is in the csv file (train.csv) .It contains RLE encoded (run-length encoding) of the mask for each training image.</br>\nlet's talk about RLE: RLE is lossless compression algorithim that helps to compress when there is a lot of repetation .</br> In this competation the mask is compressed such that the segment is encoded as pairs of values that contain a start position and a run length for example 0 5 10 3 implies pixels 0,1,2,3,4 and 10,11,12 .</br>The pixels are numbered from top to bottom, then left to right.\n![](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAt0AAAJdCAYAAADuh8sqAAAgAElEQVR4Aey9CZTdVHb3a9Z6WWQlnU5Dvu5Oj3QC6U43SSfdgX4vnaTzJXm9IGElXyB5gQRXuTzjecQGm8F4wC5P5bnKVeUJD2VDAw22wWCMZzy7PJVd5QFjMxnbgDGDDTTeb/2P7r51SnV0JVXp6F5dba11SyrpSDp7n629f2frSOpAMokGRAOiAdGAaEA0IBoQDYgGRANWNdDB6tHl4KIB0YBoQDQgGhANiAZEA6IB0QAJdIsRiAZEA6IB0YBoQDQgGhANiAYsa0Cg27KC5fCiAdGAaEA0IBoQDYgGRAOiAYFusQHRgGhANCAaEA2IBkQDogHRgGUNCHRbVrAcXjQgGhANiAZEA6IB0YBoQDQg0C02IBoQDYgGRAOiAdGAaEA0IBqwrAGBbssKlsOLBkQDogHRgGhANCAaEA2IBgS6i9AG/vM//5P69u1LM2bMSM0PMpeXl6dG3jFjxhBkTlMbd+/ePXUyo43T1s6QV/xXcftu8V/F3b4cl9LqvyZPnuxJlgLdnqpJ5oZx48ZRhw4d5Cc6EBsQGxAbEBsQGxAbEBuI2QauvvpqunLlihEiBbqNamnbyif3nCX+te0I7d9rzZo16gL78pe/TLfffnsqfj/60Y+UzN/97ndTIS/a9Zvf/KaS+cc//nFqZP6d3/kdJfMvfvGLVMh82223KXnRif63f/u3VMj885//XMks/qu4fbf4r+JuX8SoNPuvr371qwLd7cdZ/yN0rGmguzM//9J2SjB033jjjXZOUIBH5ex+aWmpp6EXYLXbVaU77rhDwcm0adPadZwk7XzdddcpmTdv3pykare5rufOnctC98cff9zm4yRpR91/eWWKkiRPkLqm2X9VVFQEUVFRlGH/tWnTpqKQx08I8V+S6fazkXZvF+hutwrbdIA0By2B7jaZTCJ2kqBlDlqJaLwQlUyz/xLoDmEoCSsq/svsv2R4SYSGLNAdoTJDHCrNQUugO4ShJKyoBC1z0EpYM/pWN83+S6Db1zwSW0D8l9l/CXRHaNIC3REqM8Sh0hy0BLpDGErCikrQMgethDWjb3XT7L8Eun3NI7EFxH+Z/ZdAd4QmLdAdoTJDHCrNQUugO4ShJKyoBC1z0EpYM/pWN83+S6Db1zwSW0D8l9l/CXRHaNIC3REqM8Sh0hy0BLpDGErCikrQMgethDWjb3XT7L8Eun3NI7EFxH+Z/ZdAd4QmLdAdoTJDHCrNQUugO4ShJKyoBC1z0EpYM/pWN83+S6Db1zwSW0D8l9l/FSR041VRX3zxReJe/ybQnR//kOagJdCdH5uL46wStMxBKw7dx3mONPsvge44LS3ec4n/MvuvgoPuDRs20FVXXUX/+I//SB988AF9/vnn8VpKO84m0N0O5bVj1zQHLYHudhhOge8qQcsctAq82UJXL83+S6A7tLkkZgfxX2b/VVDQjQz32rVrFXT/9V//NR07dozwUYikfCRBoDs//iDNQUugOz82F8dZJWiZg1Ycuo/zHGn2XwLdcVpavOcS/2X2XwUH3fgiGTLdN910E+3du5fef/99+s1vftPKWngICoahYDvmXkNS9LK8jH14v6igXqC7VTPFsiLNQUugOxYTy8tJJGiZg1ZeGsPiSdPsvwS6LRpWng8t/svsvwoKujG0pEOHDq1+AO/PPvssa0Jnz56lYcOG0R/90R9ly/7DP/wDrVixgi5duqTgmwsDxPmYR48epa5du9JXvvIVte573/seTZkyRWXTTWDPxwg6F+gOqqloy6U5aAl0R2tLhXQ0CVrmoFVIbRRFXdLsvwS6o7CgwjyG+C+z/yoY6Ea2eceOHfRnf/ZnCoh/93d/l/7yL/+Sbr75Zjpy5AhdvHhRDTN555136Cc/+Ykq8+Uvf5l+9rOf0Q9+8IMsWE+fPl2VBUTjmJ9++ml22w9/+EPCPhi68s1vfjO7/t5776ULFy4YM+phzFmgO4y2oiub5qAl0B2dHRXakSRomYNWobVTe+uTZv8l0N1e6ync/cV/mf1XQUH3J598QsuXL1fDS3784x/T008/TVu2bFFjuz/88EOVwQYgI3MN0EZme926dbRx40YCbHNGe/369Sp7jSw3Mt+8/m//9m/pqaeeUsfctGkT3X///Wrb7/3e76lz4PztGWoi0J0fB5DmoCXQnR+bi+OsErTMQSsO3cd5jjT7L4HuOC0t3nOJ/zL7r4KBbpgD3lSycuVKBd0//elPafPmzXT69GmVucY2ZK95SEltbS1t27aNTp48SWfOnKFTp07Rf/zHfyiIBpgjI459ANIM3ZWVlbRr1y51TOzz6quv0p/+6Z+q7VVVVfTuu++2GJoS1kQFusNqLJryaQ5aAt3R2FAhHkWCljloFWJbtadOafZfAt3tsZzC3lf8l9l/FRR0I8vMD1L+1V/9Fe3Zs0c9SMkPSGJcNx6yBETjLScAbmSyAeOXL1/OZq4xbhvbsE6H7hdeeEHBOdZjH7wZ5e/+7u/U8aZOnUpvvfVWu4aYCHTnxwmkOWgJdOfH5uI4qwQtc9CKQ/dxniPN/kugO05Li/dc4r/M/qugoRtvL8G7ugHj+AGWGboxpATZbAA5JswffPBBBdCAbrxuEMCtQzce1NT3QSb87//+79U+kyZNojfeeEOgO97rMpKzpTloCXRHYkIFeRAJWuagVZCN1Y5Kpdl/CXS3w3AKfFfxX2b/lSjoRlaboRtDT9CoOnQ/9NBDWejGm0rc0I1x3Po+yHYLdBf4lRugemkOWgLdAQwkoUUkaJmDVkKb07PaafZfAt2eZpH4DeK/zP5LoFsy3Ym/uNMctAS6E2++ngJI0DIHLU+FJXRDmv2XQHdCjTZAtcV/mf1XoqAbw0uuu+46lc2uq6trMVQEGe+ysjK1rX///sbhJcuWLWuxD4aX4C0pGCMuw0sCXEUFWiTNQUugu0CNMoJqSdAyB60IVFtQh0iz/xLoLihTjLQy4r/M/qvgoPvAgQNqCMk3vvEN2r17d6sHKfk1f9///vepvr4++yDlyy+/rOAZAL1w4ULjg5QYSoJ9+EFKlEP5L33pS/Tiiy/Kg5SRXnLxHSzNQUugOz47i/tMErTMQSvudrB9vjT7L4Fu29aVv+OL/zL7r4KDbrxR5Lvf/a6CYbzO7xe/+EWLVwY2NTURPnIDWMb7tbH9L/7iL7LAPXz4cPUebtMrA2+44Qb1cRzAN75GiWPg16dPH9q+fbu8MjB/12e7zpzmoCXQ3S7TKeidJWiZg1ZBN1obKpdm/yXQ3QaDScgu4r/M/qugoBu2hC9I4rWB3/rWt7JQjDeR8Mdx8HAkXiXYsWNHQjacwRlfrhwzZgzhDSXHjx83fhxn9uzZ9K//+q/ZffBVSnxOHlnyEydOqAcv5eM4CbmitWqmOWgJdGuGUGSLErTMQavImpnS7L8EuovNmpvlEf9l9l8FB90Ym43XBOLT73hDCX76Z+DxxhF8Eh7v4cbwE7w6ENAM2MaHb/DBG2xHOQC0/kXK559/nnbu3Kk+N4/y+JolPrADqMc5sU97prS+p7u8vJxuuummbGfm+uuvJ6w7f/58e9QZeN98BC23zJAfzxnENd1xxx1K37agG/Jdc8016hy33HJLTrFQFp1flIejtTXx8xzwCVFO+DCWbr9YDmq/qAt3/NFxj3KyGbRQ7zvvvDNbd79rFtfyiBEjCOVYXthF1DaPhAuOf+ONN7br68C52gGy81uwcrXZvn37lI74OkC9oLOo7S8O/8XXKNov1+SWGbL36tVLJaVy7Rd2G/uvKKGbZWT7dM9hr7mSarBxbmscK+qJ/RfeomZj0u06qI2iHOsJycooJ1v+i+uba+5u59WrV7fydzbsOoj/KjjoRqMDfpHZPnv2rPra5Pvvv0/4MA5PAHPANNbjy5L4qA3m7733nlrPrxF0QzdAG1+4hDG8/fbb6oevUGJIS3uBG3VLI3TDcL2MH/ASB3jHEbTY9jDXYcUtO/QRx8RBywZ06wAK+XJBtx6o8MVXmxMHraABJUhdevfu7Wm/ueTmY996661qfxvtbitoAZTddsv/m2RGG7ttgstjPmHCBFZHu+dBglZ7TxKkzQCfDGC6rLyMh/Kjmmz7L7Tftddeq9o8VycJ15WXzFiP56Gimth/FRJ0M7SjY2IjbrH/sgXdbNeIT0En3gf+yw2qQY/hVc6W/+JrMNdclwU2z51s9z6wa9QzqimI/ypI6IYCoDTAM//cStG3A5i5nK5sLOuZbhg7QJ4/Kc/76fu4zxPm/7RBNwITGzFngOC4kRHj9cgi2p5sBy29/jqwsMzoRQNWWOYooVA/t77MQcsGdEMOBB7OappAjOuiB6qoriM+tnvOQSsq/aLd2BlzW+LYWOa2RBmvCWV5/1wZU6/9/dbbCFp6JwkgvWrVKpW5zSWzfj0DsCE39KKDeFSBK0jQ8tNbru16m+XK7LE+EJQB2NgP1z7LjPVR2btt/6Vfo7l0w9e7LjP2xf+4HuAHopKZ/ZcN6EYbIdajzfQf4pXXFLRj4rV/kPXsv2xAt27XQX1RW/YJIieXseG/cGz2zUjy6O3LMRjXLtspdMH2q/s7viZwLPg3Ls91b+s8iP8qWOhuq9D6flCkDt1oIBgCZ8L1slEspw262XDhrN2T6QJwl4nqf9tBS6/nyJEj1UVvkpmDFvRie+KgZQO64YQQhDgL4gXdOsAB3mxPHLRwHUcx3XXXXaot4YzdEzvqXG3JWXIv/biPGfZ/G0FL7zSi/fSJgdItM+vCHZz0TndUIBEkaOl1DrvMd+bQZrkCLQd2d0ZbB5WoMr+2/Rf7pVx3JGALXjLrmcJcOgvTFuy/bEC3X9ua6smxzOQLTOXbso79V1TXil4HyMwAqa/PtZxE/wV52E7demQ/pd9xRdKPy7sTA9yxbou9eOk1iP8qeujG6wHxhhM8aBnFG0q8lI31aYVuGK17YicWpUG7z8H/2w5afB7MGdRMMmMdLnA3tOj7R7XMQcsGdHMd/aCbM6BxtDHqxEErKuhmOU1zLwDlssigcJbbVn1sQDfX3zQPa786qLkDoOn4QdYFCVpBjmMqgzbjAOxX31zluN39jmGqg2mdTf/FnSwAiRs69Lrk6kDpHY1ihG7YBQ+/sXUtQ9fsv6KyG24/3HWCvfq1MZfHPMn+y3Rtot14fa47WLoObMSvIP6r6KEbY8Ex3vvQoUPqgUmMFY/KcegNiGWB7maNFCt0c885V6Y7jiE1+YZuHWBsBqpmi2oOWrbPp8vmNbyEM6Y2M2NxQzdnRIPaLwMdgl0uoNPb0G85SNDyO4bXdr3N/GIAB3ATICUJurlN3XcpTDriTKE7u8+Zbmz305vpuKZ17L9sZLpxTXJbox3RmfS6jlE32xlflt8WdHMb57qTwXXgOctcLP6LARryBLVR1luQa4P15jcP4r+KGrqhIAwlwRATvJ0EwI3x3LYmge5mzRYrdOtDKnB7CgAIh85ZQlz07tv2zVqJbomDVr4y3ey0EYg5WEN2m8NMOGjZhm6+mwGnbJp0G2BAAaijXrnGjZqOlWtdHNCNOuPHt1ohcxD7RRkOWgCcoIEul7zYFiRo+R3DtD1smxUDdKNdWQ7O/sE+sR726p7YZ+N65nHsWMfXN9u6e7+2/M/+ywZ0s8zuOToP7gl64E4U2zPkhU1H1ZHkc7L/MnXkuEzYud7x5fpjjnbzmnAtcGaf2zSp/otlZNmDAjQnz2AjfG3wsdozD+K/ih66oUAEBP61R6F++wp0N2uIHXgcQw9s3p5tlqh5CYGLA5Hu2LEuCLA0H6ntSxy08gHdeqDS5eflXFmltkscT6YbzpiDMODENLFtw9EzbPK6KO09DuhmWdF2AO+g9suQDpuPEk6CBC1Tm/it4/YJ2mZsyyZAYp2ZtvnVw7Tdlv/iRIDeKeJ10Idp0jPErAPMw2RRTcd1r2P/ZQu6OSECKGUgg63y9cr18ZIXMofJmvLxcs1tQDfLprcVL3sBaNhrIZdMubbF4b9wfn1oVJCkh14+arsO4r9SAd25DCPKbQLdzdrkCztKCGk+esslW0Gr5Vmc/wAlcMbs2NxzbItj4qCVD+jWwRTtDDhFcOPsiS0dcNDyguH26h3OmIHKC0pwDu5wcZYI62zYexxBi+VlO84lN+tXzxJF3RZBghbXI8yc20zPduZqM9aHCaxZZ6ZtYerEZW34Lx0s9Kx2LujWs6Ysvz6P8i4W+68ooRu2iDaFfeoT1rMc7jZju4DPMr3JJ0qZ2X+566DXNcyy3sbcyUDCQ49Ppg4xy1wM/gv6Yn+EDojfhPjNHRUbbBLEfwl0+7VSiO0C3c3KyhXQmktFs2QjaHnVjOWC49IDOJbZmaGM7YmDVj6gmx+wRJZIn6ADBpKgGVN9f79lDlpRgx7Oi/py+8EZe00MJiirBzS2iygdeRzQzXJCpyy/bte8necox21sw86DBC2uS9C53ma6XeZqMy9IwzlZ/qjgyYb/4uFfblvG/5DN3Xa6/QPg+JY7gN3GXQ32X1FCdy57MLWnDuMsLx+DwQzZ4qgm9l9R2Q3brxs20WYsr7vToF8LxeK/8JIMyOuOR6Z249gFX6f7AlPZtqwL4r8EutuiWY99BLqbFcMOIUoIaT56yyUbQavlGZr/u+GGG9QF7s6moAQcNC5+ZBrctzGbjxDNEgetfEA368AduPVhJzbAmIOWjWMzjCCA6cHI3VocjN2y27D3OKFbt1+vaxZBiu9mAMRsTEGCVtjzetlrrjZjaDEBUqFDd67rkO3cbb86jLl9F9qdZXZDXNi24PLsv/IJ3Swz2totMw87gb6imth/mWyqLefw6ljhWOyn3MMnvNbnuhbaUjfsE4f/0m3db1gjy4j2xl0CG1MQ/yXQHaHmBbqblckG7hXAm0u2fylO6ObgYwI/XPQcrN1OvP1StjwCB618QDfrwB249eBs0k9LCcL/x0Er6mNzZwltl+vdy3qQRlujHvzjII0OV1RBNY6gpbeC3zXLGSUEbhtZItQlSNDS6+y3jDZjew3TZnwdm9qSj2fa5lcf0/ao/RfDGNqJ7ZPnPPQA9qqDR9C2d0OcSZ4g69h/5RO6WWa0tdtfs08oZOjmrK2pjtzOenvp/ouH0rBdJNV/6dd3LrvDtc/XrSlhlmvfMNuC+C+B7jAa9SmbVuiGc3dPcARwZsiIuR2au2x7/486aOWqD2f6TLcddcdlW2YOWvmAbnb2kFefgjpAfZ8wyzagW+8o+TljPUgzlHnNo2h/G9DNQGYK1Gy/2OauP0MI5M3VMQnTnqayQYKWaT+vdW1tM25XfdwrzgFI4eAdlR6i9l98fbIMXnO9nXlcLMrC7vRJzyYWcqabh8HAjnX7RZuxDvSOkr7ea3iJDq26TtqyzP5Lr0NbjsP7sG274y/ayyQvl+dtueZ8jvbMbfgvd334TVO57rxBHxy3c5VzH7st/wfxXwLdbdGsxz5pg27TgxxwZHqA9gMZD1WGWh110Mp1coYWOCw4d8iLHwML1sO52Z7yCd2688Yy5Adws2MzAV0U+uCghfNFMcF+uc7IDHFb6nNTNjBXsOJtetBva11tBC0924UAxLLqbYrrV6+/vo9u87wv5ghsUUxBglaY8+hycdt4zXWZGeAw9hPgDRmhB84gYr1ePkyd3GWj9l9tgW4d1ABxusz4HzqDzG4gd8sS9H/2X1FmunU7BSxzm3H9MdfbDHdrIBNkQ7ty9pfbHuujAmTohf1XVMeEfGzLfC0jiaDbqN5eYa6FoO2Yq5wN/6WfT7+zirY3TSij64PbGLrTf6Z927IuiP8S6G6LZj32SRt0Qw06bLID4DmM3dZtaL0Jog5a+rHdy/pFzHLq87hk5qCVj0w3dMBDDXTZsYwgpoOqW3/t+Z+DFpxlFFOQIKRnA3Odk48VtHyuY/E2W0Er1zWL9nNfs5DJ3c7u/6PKCAYJWqyf9s5ztRlsmIHMLSv+d2fA21OXOP0XtyVkd086tNqWmf1XlNANeVg+U/0BpO4JMvOdC/c+uE50SHfvG/Z/9l9RQTfOn+ta9gJRU71zXQum8kHW2fJffG59yIhXp1/vmLjbV/8/qnYO4r8EurkFI5inEbqhNlyw3JuEISOjgHXu4B2Bio2HiDNooQKQC/JxBgUyQ/44ZeaglQ/oZh3A4bMOACjItkR1y93U0By0BLpN2gm3DgHZfc2iPU3XbC6Q4cBVbNANbQK8YdM6fHNGMZy2c5eO039xW8JXmSZcW5CR25Wv66iuOT4n+6+ooRvHd/tmvzYDvLFedF/OdY1qzv4rSuhmefVrGbKYOhi55IDOIDv2jQpAbUM333WG7F4T7JZtOdc8KpkFur1awtL6tEK3JXUGPmycQStwpSwX5KBlE7otixD68By0ogaA0BWJaQfbQSsmMUKdJkjQCnXABBROs/+yAd2F2uTsv6KG7kKVV/zXFWPTSKbbqJa2rRTobpve2rtXmoOWQHd7radw95egZQ5ahdtibatZmv2XQHfbbCYJe4n/Mvsvge4IrVegO0JlhjhUmoOWQHcIQ0lYUQla5qCVsGb0rW6a/ZdAt695JLaA+C+z/xLojtCkBbojVGaIQ6U5aAl0hzCUhBWVoGUOWglrRt/qptl/CXT7mkdiC4j/Mvsvge4ITVqgO0JlhjhUmoOWQHcIQ0lYUQla5qCVsGb0rW6a/ZdAt695JLaA+C+z/xLojtCkBbojVGaIQ6U5aAl0hzCUhBWVoGUOWglrRt/qptl/CXT7mkdiC4j/Mvsvge4ITVqgO0JlhjhUmoOWQHcIQ0lYUQla5qCVsGb0rW6a/ZdAt695JLaA+C+z/xLojtCkBbojVGaIQ6U5aAl0hzCUhBWVoGUOWglrRt/qptl/CXT7mkdiC4j/Mvsvge4ITVqgO0JlhjhUmoOWQHcIQ0lYUQla5qCVsGb0rW6a/ZdAt695JLaA+C+z/xLojtCkBbojVGaIQ6U5aAl0hzCUhBWVoGUOWglrRt/qptl/CXT7mkdiC4j/Mvsvge4ITVqgO0JlhjhUmoOWQHcIQ0lYUQla5qCVsGb0rW6a/ZdAt695JLaA+C+z/xLojtCkBbojVGaIQ6U5aAl0hzCUhBWVoGUOWglrRt/qptl/CXT7mkdiC4j/Mvsvge4ITVqgO0JlhjhUmoOWQHcIQ0lYUQla5qCVsGb0rW6a/ZdAt695JLaA+C+z/xLojtCkBbojVGaIQ6U5aAl0hzCUhBWVoGUOWglrRt/qptl/CXT7mkdiC4j/Mvsvge4ITVqgO0JlhjhUmoOWQHcIQ0lYUQla5qCVsGb0rW6a/ZdAt695JLaA+C+z/xLojtCkBbojVGaIQ6U5aAl0hzCUhBWVoGUOWglrRt/qptl/CXT7mkdiC4j/Mvsvge4ITVqgO0JlhjhUmoOWQHcIQ0lYUQla5qCVsGb0rW6a/ZdAt695JLaA+C+z/xLojtCkBbojVGaIQ6U5aAl0hzCUhBWVoGUOWglrRt/qptl/CXT7mkdiC4j/Mvsvge4ITVqgO0JlhjhUmoOWQHcIQ0lYUQla5qCVsGb0rW6a/ZdAt695JLaA+C+z/xLojtCkCwm6v/KVr1BZWVkqfj/96U+pQ4cOdP3116dCXrTrddddp2T+2c9+lhqZv/SlLymZ//mf/zkVMt91111KXth2SUlJKmT+5S9/qWQW/1Xcvlv8V3G3L2JUmv3X17/+dbpyRaA7Qrw2H6oQoJuzJgjU8hMdiA2IDYgNiA2IDYgNiA3EZwNXX321QLcZk6NdWwjQvWbNGgXbX/va12js2LGp+HF27Cc/+Ukq5EW7/uhHP1LtfNttt6VGZmQ/ETj+n3+6k/7lrsFF//t/b++V7Tjf8v/1L3p50aY3/+87lMxf+v0/SIW8kPkHP/5bJbP4r+KOV+y/unfvngqfPWLEiKz/evjhh1Mhc6dOnZTM3/nOdwS6o8Vr89EKCbpvvPFGcyWLcC1n90tLSz0NvdjEvuMOB07SOKa73+jlVPH48aL/jZ23Kxu0yhcfLHp50aY9Ry5QMv/hd/6EKlYcS4XMt/33ECVzGv2XjOkutsjULI+M6ZbhJc3WYGlJoNuSYn0OK9Dto6Ai2czjQAW6i7fDIdBtDtRFcglnxeCkgUB3ViVFtyDQbb6W5UHKCE1doDtCZYY4lEB3CGUluKhAd/HCNt+5EOg2B+oEX7bGqgt0G9VSVCsFus3XskB3hGYu0B2hMkMcSqA7hLISXFSgW6Cb4byY5jK8JMFOKUTV2X9t2rQpxF7JLSrQLdBt3XoFuq2r2HgCgW6jWopuJQctGV5SvPAtmW5zoC62i1ky3cXWoq3lEeg2X8uS6W5tK21eI9DdZtW1a0eB7napLzE7C3QXL2xz5lqg2xyoE3ORBqyoQHdARSW4mEC3+VoW6I7QqAW6I1RmiEMJdIdQVoKLCnQLdDOcF9Nchpck2CmFqDr7LxleEkJpCSvKr2zG2+Pk4zgxNJ5AdwxKNpxCoNuglCJcxUFLhpcUL3xLptucHSu2y1ky3cXWoq3lkUy3+VqWTHdrW2nzGoHuNquuXTsKdLdLfYnZWaC7eGGbM9cC3eZAnZiLNGBFBboDKirBxQS6zdeyQHeERi3QHaEyQxxKoDuEshJcVKBboJvhvJjmMrwkwU4pRNXZf8nwkhBKS1hRGV4Sc4MJdMes8MzpBLrzo/e4z8pBS4aXFC98S6bbnB2L+1qzfT7JdNvWcP6PL5lu87Usme4IbVOgO0JlhjiUQHcIZSW4aLFA97bV/Yl/uTK2xfAZeJYT81yy8rZihG4/HUimO8FOKUTV2X9JpjuE0hJWVDLdMTeYQHfMCs+cTqA7P3qP+6wctJKe6aYNHYh/FY8f84TRYoBu2nCVJqt/hr4YodtPBwLdcXuS/JyP/ZdAd370H8dZBbrj0LJ2DoFuTRkxLgp0x6jsPJ6Kg5ZAtz+8cuY433M/4HTXT4aKJGIAACAASURBVKDbfEs6j5edlVPL8BIrai2og8rwEvO1LMNLIjRTge4IlRniUALdIZSV4KIC3cmBbYZpge7j5KcDyXQn2CmFqDr7L8l0h1BawopKpjvmBhPojlnhmdMJdOdH73GflYOWZLqTA99+wMlwznPJdJuzY3Ffa7bPJ5lu2xrO//El022+liXTHaFtCnRHqMwQhxLoDqGsBBcV6E4ObDNEC3RLptvkcgS6TVoprnUC3QLd1i1aoNu6io0nEOg2qqXoVgp0C3QzzCdp7tfxkOElReeqjAKx/5LhJUb1FMVKGV4SczMKdMes8MzpBLrzo/e4z8pBS4aXJAe+/YDTDc8yvMScHYv7WrN9Psl029Zw/o8vmW7ztSzDSyK0TYHuCJUZ4lAC3SGUleCiAt3JgW2GaYFuGV5icjkC3SatFNc6gW6BbusWLdBtXcXGEwh0G9VSdCsFugW6GeaTNPfreMjwkqJzVUaB2H/J8BKjeopipQwvibkZBbpjVnjmdALd+dF73GfloGVjeMnUFcfI/XODnXu71//u/dz/84dxMM/nx3H0+k/JyO+uK/8fpizvg7kfcOplsRzn8BJdJl5214fX63N3Gb///XQg0B23J8nP+dh/CXTnR/9xnFWgOw4ta+cQ6NaUEeOiQHeMys7jqThoRQ3dE+qaaMCCw9RtXgPdXdNAJbUN1H3eYRqwoIGmrjiqvhiJef8FDVRScyjnr+/85n28YKwQoHvisiYauLBZZsjdueYgDVt0OCsz1z9MWd6H537AyeV4Hhd0oz0HLzzcoi1Laxpo9NLGbOdr3LKmVm0+aGFr/XDdveZ+OhDozqNTifHU7L8EumNUesynEuiOWeFphu7Vq1fTDTfcQB06dFC/OFWfD+guLy+n66+/PivvTTfdRNBBXBOPiZw2bZqVU+Zqz6uuuiorN7e3e26jUhy0ooTuR5c1ZmEb4NllwREF3ljGr2ftISpf1kjliw9Sx+pDLbZxGfd8wuKDCty8ISy/n4Efv7SRumc6GKh714WtZZ6yvEnJELSst6yF9xl4ZK3HLzlMur/+nxqnbYfP30+T6xppyAJzW5dVH6RJS9GxOqY6Y15y6+sLBbpvvfVWdd326tXL8/I8f/48Yfs111yTvcbvvPNOqq+v99ynLRvYf1VUVLRld+M+mzdvztbZ7Y/4/ytXmsfZwofzeq/5hAkTjOdqy0r2X7agG2137bXXKpkgm2m65ZZbcsocpbw2xnS3tc3q6uoIMZrbGctYF/Uk0B21Rn2Opztxn6LWNuuNbu0krgOPGDEia8xs1K4iVv+NG7oRhFhO99zGhWxSHgctG9Dt157FAt1T6pqocwa2Jjz3Gp1+9zLtfPUDanjzI9p67ALd9+RxBdm9aw/Q2Hm7stD94eXf0FsXLtO+0xdb/EozIDt2/p5W2eKWEJY/6IbMXWoOKrnGrnqNDr31EW05doHOf/QZ7T31IQ1cflRtG7rgAE1ediRwWb4joMuJZT/gdJePI9MNHQys3a/knPzCaSU/Oh+lVfU0au4rNGHRfupevZ/+p6aBprxwio6/8zG9eeGyKl869wCNX7QvZ/u6ZfLTQRyZbgApX7cnTpwwuRQCtOmJBN23AcKjBG/2XwLdxqZo00oGUrQh2tI0pRG60YnUbVlfjrKTAX3r/KV38PS2kLeX6Npo53JaoRsXMpyy3pNspypD7R4ndCMDzBct4BvBDOtYdujBy+GFEsqnMActG9Dt154cvKuqqpT80AF+7NChFxsTZ4qiyHQDEh9c6IDX/U+eoNffu0QD6hzgBIABSF87d0mBVqeag/Rw5eYsdH9w6XPq/lij2ubOcuP/0bW7ckJZvoaXKJkXHFD1Hv6r43Ti7CfUa0lTVo7nD75Lj+86q/7vXl1PI2r3BC47aelhY+bXDzjdgGobupGhLl98iEqrnY7HwTc+ovHPvabk7DltA42p2UGPLthLXSod2as2vEm/2n1WdUocMN9P4xbk7lS5ZfLTQRzQHSTLrXe2ASO4ppFE4Kw3rm8vkAh7vbP/sgXdyCazX9Lnej0ZUuG79fKQmX18lB0N9l82Mt16ljtX4od9NEBU1wsve3XIdL0FXbaZ6Q7aZpCL29IUr7EN9YxqEuiOSpMBj5NW6IbzwsXKTgyGHOcUJ3SzjMgm6BOcHl/ccQwz4aBlA7r92pOhGw5Nn/jWJmDcxsRBKwroxhCC/jV7FWwN+9VxGv7kCbVcOuMVujsDZEfPfEKDVxxzwHNWM3S/dt6B8bvnHqCSWTuodOYOKp2xjUpnbqce0zfS2Hm7CxK6IXO/akfmgcuPUZ+lTiejY6Wz7tHVr9HZi585epi7n3rP2aGW/cp2mrtfZYdNQy78gNMNqLahG8Nmhszbp+Qa/exJajrzsVouqT5IwyteVFlsQHfnObvVeu5UnXzXafPSquRBN3yz1zWrX6c6kOlwDX/G+0cFKOy/bEG3Xn9dRn2Zfbm7MwH/BV+OzkaQ4+jHzLXM/ssGdLMsgNFcE7dx1Ble0zltQnfQNuMsN/Sit6Uer6NsD4FukyVYXJdW6GaV8oVfzNDNGSNc9O6JHRr0YHvioGUDurnuXu3JAViHbizz+iizJVwXzDlotRe6AYcTlxyiHlVONpPB6m48QPnoM1nofvXcJeq12MkED5v+UjbTnYXuzLhvlQGds5t6TF1H9097kSY8diDnmN98ZLqdDO/BVjLDZ3We+LwCzEHLj9LJTIeitHIvdZ3lQDfrx7NsVb3KDhc6dKN+GI/dudrJ9r9y/ALNfvkNJXu3aRtpVNVWtX38wnrqOQudr0N099yDdHd1AyUZuhk8TD5Lv744aWACMr62owIU9l+FCN3sx6E3HdR0XbVlmf1XVDrkOsDf8t0Iv2OzbKY25uNFNY8TulmuMG3G9u6nszD6EOgOo60Iygp0Nz+YEoE6Ax8izkz3yJEjVRbElFFgx1fs0G1qmFx6MZVvyzoOWlFANx6MHDF9LfWY+Dx1G79K/e4pX0U9pm9WEHbv48fozfedcbydqg/Q8KlrstCN8dwMoqOePUm9FjcPNbmvdo96EM+dwdX/zyd03zf9JYKc3cc9TWWTXszKAXnmbX6Lxq12hlp0mbaRBjz6VKCy3We+khDoPkrD5ztZ7nufOE5nPvjUkb+6gTrNracuNQfUQ7WjFuyjkTPWUf8xK6hjlVM+qdANIGO4WLVqVc7LDj4NZTHMRIfNffv2ZTvUUQGKbegGVLI/hlxBfbKeAfXTV05lGjay/4pKh3wKvVOltxtv1+cMpxhqwcvQE/6PcigNzmkDunVZeFlvs6B3mfXrIkq5Bbq5VWKaC3QXP3Tr4/14GAUuenZ8CFp6BtiW6XHQykem2yQTv7kGAdvWxEGrvdANAMZDghi/C/AePuV59es/fUMWQve9/iHNWe9kQbvO2KLK8dtLPv/iCh0/+wmtPnCentp7lj66/Bv6df05tW9pzUF1bB2y3cv5gG5d5pEzX1by9pjmyNvjsUZauv0MTVpziu7Gg6W1h6nvlLWEcoBP6CdX2QHT1ydieAnGnXetdsbxv9jwLi3Zfibb3tyJwnzgvP00bv5uJXvHuU75pEI3363CcDgGMvgn/OC39Il9GCCMwRBwwjAO38bH0PdryzL7L1uZbu5o6PMgWVDdv0c1lIb1w/6Ldcvr2zPX4ZEfgkX7QVZ3++I8DNq6XngZ+0UJoHFBt95mJplZv9gGu9efwUJnIyqbxnkEulnbMc0FuosfumFKehBih6XP4zA3DlqFAN16JixKp+3WIwetKKAbQw0A3sh4420VD8/fQxjXC+gCQOONHgrEqhto8OQ19ODsDdlM97oj7xIeRGRQ6zTvMJ06f4mGPu6M/x61oL4gx3Qrmeuc1x9i3HlvDKGoaaBHn3uNTp77hADf+L9jVT0NnbNFjW+GfvzLOsMyCnl4CR4iHTnfAeh7FjeqjpL+esixq06qTD/k71u1Sw0RQqesJDMUJYnQDcgASME3LVu2LHs5sa9ywx8AjstzGX0OYIsKUNh/2YJu+GhkqgFYOmj6+SdAGGSOGsagfPZfbr1nG6YNC9xR0tuJl6EDd3vpusDdAEAoOmbc7lHKHRd033XXXdk2y6VCyMrDpKCjoHc/ch3TvU2g260Ry/8LdKcDuhHM4OzYUXGGARcy1scxcdAqBOhGxh/OTM+m2dABB60ooJuzzwyi3Wsd4J6x7nU1rrl03mEFoBin/dCcTepVcpzpZtgumbObSmbvVOVW7T9P09aeVsv31uwhvJaOz+Ge5yvTzfUAgAKm+8zZruqLseyQadbLb9CUFxwZ7pm7l5AZDlOWj6/PC+VBSnSwetY4Q0We3HOWnt2XuTMxy2m/qS+eJqyHHvAAKcblo7ORZOjmBwLd1yVDmQn+0IFm8EQ53bfp4N7e65v9V5TQjU4DQAo/PeOpdz78xjKzT8/1BpC2ys7+y6T3th6T68udDICl3n7uITKQC/pxD8PAOrYLN6i3tW5xQTc/wO/XZm7ohu7c+mmrrLyfQDdrIqa5QHfzhRuTytVp4hzTbZKLoRNOC44/jomDViFAN2f+0eGIymGbdMhBK0roxtssBsxzHqwbtPwYvf/xZ3T/U86bTDpP20T3VbygxivjPd09Zmyi0lnbqXTmNjXvOfZX1KN8dRZY63a+o5b7V+1UwKrDp76cT+hGJ2PS8iYajzHtszZQl4oNVDZlnao3MsBnLzrjnDGOHeA5sS5YWUB8oWa6Ua+HFzpt3LG2gS588jkN1F4PCdDWoRv/D5m3X72bPcnQzcAMoNInhqsg8McA5wZ3/XhtWWb/FSV056oHZ3hzQTdAlHVjw4+z/wqi91yy8DZApFd9ue3d4/N5X/dcB9KofHgc0I024+x1mDbjDin0d/z4cbc62vy/QHebVde2HQW60wndPJ45riw3rJODVr6hG46OHX/UWQP3VchBKyroRhb3vsx7qwFa+CgOsr1Y7jRrBw2duJLG1DoAPXJevVqPbfjhWu8yZxd1n7lV/Y/9HnrmVbXcd8529XYUE4QCvvMF3ehgdM1ktVkOvKEEDwyWzHHe5IKHRIc+4Qyd6ZwZbhOk7MPzzR+MKYRMN+464O4D5Jj+0uvKrDCkpvOCI9nfuiPv0aE3P6JO8zN3OObW0yNzX0lsppvHuSKbp2d9ITxfr37wp1/bUWa5df9VSNDdu3dvpRskEWxM7L/89B703NzGaE/3hFiE9UGHBCUVutvTZpwsytURc+vV73+Bbj8NRbxdoDt90A3H15aedntNr1CgW3f8UWVIvHTDQSsK6AYQj1l8mEpqHch67uB5eiozvADXcafZu6jr3HrqUXuIes8/RA9V71CvjsOwk4nPO0Mw8NBhWZXzjusNje8T3nMNsBsyZ0vBQTfkRTa6LDNGGZ9+Z3/VqdoZdjGwrkmpnj8Ljy80Qp4gZUfV7CBAvZ7RdzoY+f0MPOTGMJkhVc7rDx9+5lXafuKDVj+2OTxQilcEdqvcpYYVJTXTzYkAZKoBVPqPobuysjLnnTkGt6iz3NA1+69Cgm7WmfvOANtGe+fsv6KCbn1IiLtu/KGjYofu9rRZkLsfbr36/S/Q7aehiLdzEEOgytekN3rcdcjlBGzWJZ/DS/iijzPLDV1y0Mp3pptvP2OeJOhG9rN/5lPgI59yhgThU/C4dk2/QbO3UqfMB1OerT9HE9WbPpyyI546oT4T3m3hEbXvyDmbM+Ohj7WC0HxlugGfeP/0PbO2qTriK4zPHXy3hawY07zrtYtqXafK3dRl6suBynaeu5dG12wvYOhuoMGVjtymtsW6uRveoBcONeuj25xd6uHZpEI3JwIYsL3mXlk+PcuNjnXUE/uvKKGbhwy4OwlBxnTrD4Nj2cYUNXSjI8Xt6h5awcNL3O3LY8Dddy702B2VH7c9vCRIm3npAe2ba1tb21/nLy89tr4v0dazyX7ZzBGceL4mvdHjroN+4cZ57nxBt57ljnJcWBDdcdDKJ3QjmLHTdzvxIDKELcNBq72ZbgAoPo7Tu3KXgkpkuC999oX67Tv9Iem/B3/tDBnpP309da9ofqXgk3vPUeOZj2n/6x+prxqOygwtKZu9k0ZXbyu4BykhM8ZoD5q+Pgvai7e9TTtPfkBbj1+g9z76nNYdeZ/6Z8Y6d67YSL0nrApUttvMV9Qr9jBcp1Az3Q9XbqEu0zdTJ/ymbcr+SmZuIzxIOvmFU/T4LozJP0QllXto8LSXWmS6m975ROkiKV+kbC908217gImNif1XlNCtdxQ4w+9+e4mXn+bvDNiSFzpk/xVVplvvTHg9SOk+F9+9AHzDZwPcEbcZxrHdCxbD2oFt6A7SZiwv4hQ6IHzHh5NFWB/lsEidv7z0KNAd1pJylJdMd7qGl3BPOUpHlcO8WmzioJVP6NYfPPIKZi0q3c5/OGhFAd0YatEr85lzr+ynvn7AjI00bPJq6lrRDK3YXqKNkQZwD5m0KvOhmNYAykCajzHdPMzi4crNdM+kNVmYhgw8nITlLZu+RY1nx0OkQcqinNdXOAtiTPfyJtUpQD0HjX+KBo57Uv0GjH2CemgdC5YfnSu8InKUNqabtyUFunNdatxRdgMZ7wN4ZWi3keXGedh/RQndOK6e+GE5eZ7rocKbb75ZJRDgy21N7L+89N6W8+rD+1hOnpvikg7qXI7nAO8o/bht6A7SZpCXx26znPo86PCboG0j0B1UUxGVE+hOD3Trzi5KRxXUFDlo5RO6OYsAp+bVqw8qT5ByHLSigu5BszZTRzwsOPdAzl/pnN00cvZG9WCdAu/Ja6l0Bt5x7bxmsNOcndR56noaMOHXBKjFp8YZsE3zfEA36oFM9PhF+9SHfnpNWEmdKjYRXnsIoIQekPXFkJIh5c8o4MQbW/BZ+1xlh5Y/q4aWTK5rNMpcCNCNDgfqh/exj1uwRwE4XgeIITHDpq2lksq9dDfsoPogdaw5RAOnb1DlIH/3GVuyNgId9Zy51bdT5W5zPx3c9t9DFPCVlpbGch0xdHjBn+0sN6519l9RQzeOjWSADlpYztV50DsZ2NfWxP7LS+9tPa87mw950fnwmgCi8N2c3cYc/7uHqHjtH3S9TejW28wvUw15oQ9OksH+/XQUVEZ3OYFut0Ys/5926LasXs/D52t4iWeFYtjAQcsmdMcgRqhTcNCKArrxcB2GHAwe/zTheP0eqTP/Ri933mJSs0MNSQGIIWOKbCn26Tt6BSFjeu+klep4zqvzvLPcALJ8QTfOjbHsGNv9wMz1Cq7x5pLeo1coWQaO+xUNm/KcGh6DjgNANWhZgK0bNh1Z8/sgpV4n1BEdD/7h3d0Ab3QcuP1hD7ALyA9IR6cD7Yvt0A++YOr1ekT9XPpyoUF3qIvOUmH2Xzag21KV231Y9l9RQ3e7K2bpADah21KV231Yge52qzDcAQS6w+krqtIC3VFpsrCPw0GrvdANIAJ4AZ7w1cFRVVsVaAG29B/W4wfQBoRhH86YYh1vxzEAp/wxGR24TMv5hG7UB28ZwZh2ZH0x/hzZeciC1yMiEw4YdQD1WOCyJjmxzg843fv1HLlAZX3/8Dt/QhUeIO/ep63/Q0a0K7cl2h4QDruAjlQHZdE+pSPoB7qCfrA+zDn9dBB3prsQrnKB7kJoBbt1EOi+YlSwjOk2qqVtKwW626a39u4l0N1eDSZj/yihG9AEiAZAAaQBmq1+WF/XqABMz+RiGVCm9stuRwbVnO11A1q+oduR3cn6Kvkhe1aO1jJArqyufMq2lrVwMt3uurEedBvAMmTlslm5oR/XNi7jNxfobu1fBLpb66TY1gh0C3Rbt2mBbusqNp5AoNuolqJbGTV0+8GSre2FAN22ZHMf1w843eXjzHS7z23rfz8dSKa76FyVUSD2XzK8xKieolgpw0tibkaB7pgVnjmdQHd+9B73WTloRTG8xBZgBTmuQPfxbCbZrS+BbnN2LO5rzfb5JNNtW8P5P75kus3XsgwvidA2BbojVGaIQwl0h1BWgosKdHvDqhteC+V/vyyvu54C3eZAneDL1lh1gW6jWopqpUC3+VoW6I7QzAW6I1RmiEMJdIdQVoKLCnQLdLshPQn/+3U8ZHhJgp1SiKqz/5LhJSGUlrCiMrwk5gYT6I5Z4ZnTCXTnR+9xn5WDlgwvSQ58+wGnG5ol023OjsV9rdk+n2S6bWs4/8eXTLf5WpZMd4S2KdAdoTJDHEqgO4SyElxUoDs5sM0wLdDt/9pEyXQn2CmFqDr7L8l0h1BawopKpjvmBhPojlnhmdMJdOdH73GflYOWZLqTA98C3QLdJj8hmW6TVoprnWS6JdNt3aIFuq2r2HgCgW6jWopupUB3cmBbMt3NbeXX8ZBMd9G5KqNA7L8k021UT1GslEx3zM0o0B2zwjOnE+jOj97jPisHLcl0NwMdw22hzv2A011vGdNtzo7Ffa3ZPp9kum1rOP/Hl0y3+VqWMd0R2qZAd4TKDHEoge4QykpwUYHu5MA2w7RAtwwvMbkcgW6TVoprnUC3QLd1ixbotq5i4wkEuo1qKbqVAt0C3QzzSZr7dTxkeEnRuSqjQOy/ZHiJUT1FsVKGl8TcjALdMSs8czqB7vzoPe6zctCS4SXJgW8/4HTDswwvMWfH4r7WbJ9PMt22NZz/40um23wty/CSCG1ToDtCZYY4lEB3CGUluKhAd3Jgm2FaoFuGl5hcjkC3SSvFtU6gW6DbukULdFtXsfEEAt1GtRTdSoFugW6G+STN/ToeMryk6FyVUSD2XzK8xKieolgpw0tibkaB7pgVnjmdQHd+9B73WTloyfCS5MC3H3C64VmGl5izY3Ffa7bPJ5lu2xrO//El022+lmV4SYS2KdAdoTJDHEqgO4SyElxUoDs5sM0wLdAtw0tMLkeg26SV4lon0C3Qbd2iCwG6ly5dSh06dKDf/u3fpj//8z9Pxe/rX/+6kvmaa65Jhbxo1y9/+ctK5m984xupkfm3fuu3lMx/8PXv0je++4PE/mhDB+LfN6/zluPr375ByYvr+Q+/8yeJlPfK+mZZg7TZtV/7tpL5//qtqxMpr0lGPx383lf+l5JZ/Fdxxyv2X3/8x3+cCp/9wx/+MOu/brzxxlTI/L3vfU/J/Pu///t05YpAdyqgm7O+CNTyEx2IDRSeDTBwY37VVYVXvyhtRgfOKI+bpGOJDorbxpNki1LXeGzx6quvFui2TtxEVAiZbh7Ij1vxzz33XCp+nTp1Uh2Mf/qnf0qFvGjXv/mbv1Ey//yX/0097p+Xit+Xfv8PlMz/VnJfouXVobvn/bWespQOnJ7tOHe5d45nuUJu/ysbrspm9YPU81/uGqRkvuar36QeOXQT5FiFUsZPBz/733comb//5z9PZBu3Rc9/9IO/UjL37NkzNT77a1/7mpJ54sSJqZB5+fLlSl6A/tNPP50KmceMGeNcy9//vkB32qAbt3PSMnF2v7S01NPQi00XPCby9rIHiMfPFvv8mq9+Szk0eZAyOWO7ZUx38DHdN//97VTx+LFUXM8//r9vUddyRUVFsblmT3n4mRR5e4mnihK/gZOe4C8ZXhJDcxZSplugO4YGz+MpBLqTA57uzpCe6c4FWWPn7cpmisoXH0wkjAl0C3S77R//C3TnMXjEdGp5kFLGdFs3NYFu6yo2nkAy3ckFUFNA9lonme7ktbNAt0C36XoW6DaGsqJaKdAt0G3doAW6ravYeAKB7uTBmCkQ+60T6E5eOwt0C3SbrmuBbmMoK6qVAt0C3dYNWqDbuoqNJxDoTh6MmQKx3zqB7uS1s0C3QLfpuhboNoayolop0C3Qbd2gBbqtq9h4AoHuZMHYttX9iX+mgOy1TqA7We2MdhTo9tcBfwZeHqQ0uveiWSkPUhZNU3oKIg9SeqrGzgaBbjt69TuqQHeyYCwsiDGEC3Qnq50Fup328rN3gW4/D18c2wW6i6Mdc0kh0J1LOxa2CXRbUGqAQwp0JwvG/CCEIds9F+hOVjsLdKcHuvnOFebu69b0vwwvCRDYEl5EhpfI8BLrJizQbV3FxhMIdCcLxgS6mz+NLq8MbGm7PUcuUK9JxGfvK1YUxzur/ey9GDLdQV+DyQAu0G0MZUW1UqBboNu6QQt0W1ex8QQC3S3BhQNboc79IMSr3pLpTlY7ox3DtrVAdzI7GgLdxtDUYqUML2mhjqL8R4aXxNysAt0xKzxzOoHuZMFYWBBjCBfoTlY7C3Q77eVn75Lpzk/ciPusAt1xazz+8wl0x6xzge6YFZ45nUB3smDMD0IYst1zge5ktbNAt0C3+xrm/2V4SX5iZZxnleElMrzEur0JdFtXsfEEAt3JgjGBbhnTzfDlnsvwEhleYnTyRbBSMt1F0Ig+Ikim20dBUW8W6I5ao8GOJ9At0O2Gt0L+P+j417HzdqmHCjt06EDliw8GeitEockdtoMl0C3QHczrJ6+UQHfy2ixsjQW6w2qsneUFutupwDbuLtAt0F1osJmrPgLd3vYq0C3Q3cYwUPC7CXQXfBO1u4IC3e1WYbgDCHSH01dUpQW6vSEmF/zla1vY7CfXU8Z0J6ud0W5h21qgW6A7qrhQaMcR6C60Fom+PgLd0es05xEFunOqx9pGge5kwVhYEBPoluElbANJnPvZu7y9xFpoKKgDC3QXVHNYqYxAtxW1eh9UoNtbNza3CHQLdCcJxmR4ibe9SqZbMt02Y0U+jy3QnU/tx3Nuge549Jw9i0B3VhWxLgh0e0NMIcKoX+bPq84yvCRZ7Yx2DNvWAt0C3bEGjxhPJtAdo7LzdCqB7pgVL9Ads8IzpxPoThaMhQUxhnCB7mS1s0C3015+9i7DS/ITN+I+q0B33BqP/3wC3THrXKA7ZoVnTifQnSwY84MQhmz3XKA7We0s0C3Q7b6G+X/5OE5+YmWcZ5WP48jHcazbm0C3dRUbTyDQHT2MTV1xjMbXNWV/DC2zzQAAIABJREFU+J8DJub43ylzlB5ZdpQmZ/7Xy3gtFyJ0szzldZCniSYtd+TzkgHrJy93dPRoRk9TXDry2rcQxnSzvBPqjtKopU00PoC83N7j644S/7DOS06sD9vWcQwvCSpHs46O0WhlE0eVzeeS17TNTwc2Mt2OjE0E2zT9cG2b2g7rypcfo9FLG+nhpdg3mMxBbZr1I9BtDGVFtVKgW6DbukGnFbpXr15Nd955Z/ZDHtdffz316tWLTpw4YV3nOIFN6D5//rySBR8owW/ChAmtZNq3b5+S/5prrsnqAPrYvHlzq7JRrbjjjjvUuW4veyAn9HCQCzqftPwoDV3UQJ3nNdDdNc2/IQsbaOoKJwCX1zXRPfMaqLS2eTvKdqttoAcWHzEGc/38fhCil9WXbWW6pyxvor7zD1Enlzydaw/R/Y8dVnLr9QCYPLqskUpdOiqrPUw4ll7WtBwUUGx9HAftOGBBA3U2yDviMXP7YZ97F7Vsb7T5wAWOXZjkxLqwbW0buiHH4AWt5RiysGU7T65rot7zG4w2EcTGdX346SBq6IYN9nTZpn4t83L3eQ1Ze4VNj1mK/Q61uO5Rtqy2ge5b5NfOwb6yynqJGrrha9lHe829fG95eTnddNNN2f2xXFdX51W8zevjGF4CWSA/YhFil9906623qvK33HILXblihkS/Y3httwHdXF+vNsb6TZs2eVVJrYesKAdGiVpmGV6SU/XRb0wjdMM5eV0AQS/89raELehGp0EHacjphm4A97XXXuupAxvOG/qyAd1T6pqoa21z0O08/wj1XtKkgnCv6nqatPQwjVt6hLppgfm+Xx2n0StPUucFR7LB+r4MoHOAdc/9IMRdnv+3Ad2Q+Z7ag9m6D3viOI1d9Rp1f6wxu26oSx7s06/2gNrebWEj9croqEv1PvXlSFMGkWXAPJ/QzR0MBq9BuKPx3Gs0cPnRrLzDFx5q1dGYtLSBymocPfVZ2kRdFh5W5ftX71F24SVz2La2Cd2oY/nSBiqpdmy837Im6rzAkWNwzR6avMzpcEyqa6Iemk0Mz9h414XNNj7MZRN6+7qX/XQQJXQrGRejnRwZh6w4TkMfb/3rWOvIPf6xA6qtH1ns/A+76LOkkcauOkmT1pymISuOZe1iyILWdsGyBrVpLl8o0K0ni9xxLGoosw3dgGyORVVVVb5hFR2Vq666SsUuxLGop0KEbr1zZiMpKNAdtRX5HC9t0K1DKbIDq1atUtld7m3DiY0YMSLy3qS7GWxBN1+g3DM2Qfddd92lnBbgHICNfTDnzAnW25iihm4E6wmPOSCJgF1/+kNV7Q1N76ug26NyF41fWE/3ZGBz/OrX6Pi5T2jVgfP09N6zqvzT9eeyAXr8EmTGzEMP/CCEA7N7HjV0KwCd54Dk4BXHqPHtj2nLsQu0fOc71HjmY3rp8HtZecYtQSbUGXLy6GMH6e5qJ1t6/OwnNPRxB0z6TltP4xft85Sb5QkKKFFnuiHvoPmOvD0ea6RXjl2gFxveo1/Xn6MPPvmcqje+qeQtqTmk4JTrq7Lc8/apbSOfOkGvnrvk6KX6II2YuYEmLgGMRdPWNqEb8g+Zt1/V/dHVr9GhNz9y5K0+QA/O3kDoWKBD1TsD3Pc/dYJOnv+ENjS+T4/veofQ1qsPnHdkr2mgCYu95WbdYe5n79FC91Eat2BPFro/+80V2vPaRVVv1J1/pfMcyB4zb7fqNHXPdKgefuZV+vzKFcJ1vz/jA3BNcCftEQ+Zg9o068UmdMMHm35uP6wnjPjOJO7a6v7eL2vqPmau/21DN8dd3GkOMnHWGJ0LG5NN6Ead9TYGZyA+I97myl7bllmg24Yl5Thm2qAbvWnODrhvZXEGwcZtK3cT2IJu9P45Y8AZAXemm9cvW7asRbXgEHibjSxC9NB9lMbOR7BuINjxQ8+8Sit2vaOCL9Z1n72DRtdsp5JMcD578VO678kT2WCMMpuPXqDJL5xS64bPq8/euuZAy3M/COFy7nmU0A1IBCx2zsiz59RFeujXr7aQ58AbH9GMda+rdffW7lVABigbUFOv1lWsPU0bM52S0jm7aeSMdQWb6WZ5u1Q70Ln28Ls0cY3TVmg7ZHExPfzMSSXbg/P3Z4cT4Q5Hl2qnQ7a+8T2q2eTAeddpm2hU1VaVIXa3Ff8ftq1tQTfkV9n6jBw7T16kaWtPK1l7TNtAj8x9RclRvvgglVQ7HZPjZy9lO1TQEX7H3vmEJjzv6O3+HDbO8mPup4OooXvsvN10d0aGN967rOrN9XfPH6nZQWMWOh2qexY3KmDRs9sltQ2099SHNPwJp2M5tNZ8XRcSdLdwxDn+YVADpLpBDetMSZYch/PdZBO69Sw3Og5+E8cnQKqNjC/ObxO60cHQJ+YNzN1tyeUgJ8dkyG9jEui2odUcx0wbdOdQhcpww2klGbp1+fhi9YJuU0aE97FxgduA7jHzdrUI0MhqcqYb0D2s8hW1/YGnX6Udr36gljtW7afS6VvVcsWLp+m5g++q5V5zndv1Onzwsh+EcDn3PFroPkoPzXdgo9O8wzQAwytqG6hkzm4qnbZZyTD9pddp5joHzHrPxTAKZDcBZc6te2RK7890PHpNXUdjanYoMHfX2/1/UECJMtMN6By1wJG3Y20DdeOhEtWHqOOcvUpedDzmbnhDLQ+u3kOT6xpVx+n+jJ4G1B2lcx9+pjplgLfBFWvV3Q9kwt0y8v9h29oedB+lYZls/f1PHqfX37uclWNoxYvqDgU6VCPnOR2qTvMPU/+6jE3M3EElMxwbr970JpVnoLtP9e6cHY6gOrAJ3a/xXYm5B6hk5jZl26VT1lHnKS+TstnanXRfzW7V5qOfPanu8KBtO87dRyUztqn1y3acoecyGf7eVebhREFtmnViM9Ot++1cywxqphjF2W63v891PL9tNqGbOxCod5Dp5ptvjrxT4T5vnNDNyb9cwzl79+6tZA6qI7c8Qf4X6A6ipQjLCHQ3K5MzBUkeXtIsDWV7yG4nzGBdDNCNDFlXBGYVbA+RDt3dZm+nYTPWqyDcc3GjGoaB4FxSuZfKZjgwPvH5U7Rw69uqTN852z2zvmFBjAN1lNCtAEvBRvNYVsjTadom6jz1ZSXD0u1n6LFtzfJMWLSfBtc64Ipx0K8cd267l1TuofunvaiG5wBuub5e86CAEiV0Y2jFg7XIgDaP2Wd5SzPth4wmxvJi/dDKbWrYAbLc3asdmVfuP08rdr6jtpfN2EIPzt5IE5d6DyOC/GHb2hZ0O9l6R451R96jBRk77TJ9Mz1UuUnJgTHd91XvVPLxmGilo4qNVDZtk1qPoVRzM8NwBszZlnNoDbe/nw6sQ7frgVnI1G3GFnVn5tEFe2lo1XYl25QXTquhRtjeZcrL1PPRZ9T6B59u7nz3rNxtvK6D2jTrxCZ0IwuKDC5ADMP83FlR9ut8pzZXpruyspKLt3tuC7qRwWXoNMUhd8UBpohb0BHA2NZkA7pNdUVmn+V333Hn8nqWO8idAN4v7FygO6zG2lleoNtRIDszXAi2bl3pTWVreIl+Dobr4oXuYwSovK/iBeo93gm2bugeMf0lKpvtZMXmbX6Lui1qfrAMgRowwg+bDcsx1tcPQjgwu+dRQjeyuMhMD5y4knqNfZLuGfMr6jX2Kbpn0poMdDXQqXcvZYecDJq1icbN302dMrftMU4WQ3Agd8fqA3RPdT09+FhuAGV5ggJKpNBd10RjanfSkInPUu/RK6jXI8up41xnqAlkwG/dEWf8fsfqg/TQnE0qs//gQqdMlwVH6OLl31BP7QFT3u9e15s/WE7Mw7a1DehGJn7EAkcOPAR64ZPPCcMmuP48v3fBQRo19xUa4LKJnpNeyJZFpv9eHmoxe7PSkV9Hy08HNqH7vY8dWXFnAx1iztJDZjw8iuc4hlQ5GW1A91N7zipZe8zYRAOmOHKP0O94zdlp7FwGtWm2DZvQzQCmz03jlgFoDOfIeuOOpD6mG8AeJZTagm7IBlkhC8uDunvBJSfEeI59IX99fb0e8tq9HBd0cwYbMntNpvHuaG/8vEDd61i51gt059KOhW0C3UQYv8yA6pVhiFr1At3RvKcb2V9kvobM3KACrw7dGF7y0OyN6pY0Q0rF2tdp9vo31Nsv5m9xMsLY1nX6Znq4covnrXc/COHA7J5HCd0AMYzfxZjkB2auV1m/YTPXE4ATMjxTf47WNzoQWla1V5UZUo0OxyEF27DhMStPtuh44AHEMUvNr9zTZQkKKFFCN8AQ8o6u3qYeGkTnittx4da3shlOrOs2fZMqhzHvvTJZbgwxWJMZOsT7YZgKlnvU7FdZcV1GXg7b1jagGxnsHpmx7GjXJzNgmZUj86aPe2r2qY4VbJdtYujMDdQxs33NoXfp+YwOSufsymnjLD/mfjqwCd14kPLN9y9T3Y4zagz7kbc+pq3HnaFhkH/cwnoaXNkauu+ZtZWGZO5stYLuRRjv3/KOTlCbZr3YhG7AFx7q1wEaYGl6tgbr+I0fOqTbyALbgG49y63Xn5ehB33SHx7lMjyHzMePH9eLt2s5Lujm9uPnr9yV1se7689esdxB7g64j+n1v0C3l2YsrU87dMO4b7jhBtXrtjluyt18At3RQDcCorrFnsl8uaEbwNZ3ljO2FQH76b3naPuJD2jrsQu07cQFKslkTLvO2q7gxWusrx+EcGB2z6OEbhwb9YO8gEtk+btnwAxjuU+/e5nK5jtQec+UtfRw5WbqPtd50BTDEzC9dv4SXbz0GzrzwaeEzD90ggczkUV3113/PyigRAndWXnrGpW8aEuGzkVb324B3V3m7FLt98hCfptNgxrLzW9pwX54TeL+1z9Ux+hWtVfpzw1iOGfYto4autHGD2XkwDjtjz/9DfXJvOIRctz7xPHsMKEeVXuUHBiKApvAm2i6ZmwCY92Pnvk4q7M+U9YShmNh2I7etqZlPx3YhG50ht13J/CWHlzbkH9EzU4aPMcZHqZnuu+Z9QoNnbnRKePOdBcgdAM+keTBT89cYpmzv+4kELYB0Bm+3HNs83oozx2DgvxvA7r1u8q4C4vMLcCaZXbLwOPYsR0AivLQC8se5XDQOKBbT/J53VWHjpAIdA8jYpkFuoNYb4GWSTt08+t4cEHrjs92cwl0RwjddY1031xnjGcr6K7Znv0gzpLtb9OQzKvyGN4ee+Ut6rvUed/zffPw6jzzA3Z+EGICF6yLGrpxTICieiPJPAcwBy0/Rhcvf0F4WBRydZ6xWY3XdiDVGQ/93kef09QXnQcsUWbUsyfpvBp2cFztM2qh8+YPLznyBd1cH4AigLGkyhnjzO330pH3qFOmo/Fg7R7qW+08VIhXCW474WRHSzIPXerQ3blyb+aBypbZT5wvbFtHDd3oAHG2fsm2t7Ovgew423loWIfurlV7M698PKpsom/m9ZjI9H5w+YvssJIu0zbSyJkvG8c2s471uZ8ObEB3SeYtLdy2eBC0dNoWZZ+/2n2W5qx3HpgdVLmdBs1xOtJJhu5cMYYfinRDN8MmAygfQ4dW93BCLtOWuQ3oZtkwxETvIOgZbcAvTwyaesYX23iIihvSeb+2zOOA7pEjR6oOA4Daa+JhNO62ZF0IdHtpLgHr0wzd7MBgyFGPDfNreoHueKCbH7jCx3CWbD+jAnjHynrqNNV5wLL30iZ6sSHz9pLq+oIeXsJQhI7B8AXOkBIACt5IUpkBktLZGAO9Uo2FfrjGgbR+y47SOx98pmS/e+4hKsk8hIj3Xc/KvF5waM2enG8xyRd0o4OBT76PWtJEI+bVU68pL1HX8auoZKbTyXp23zlakBkm1G8OHih0OhmvnvuExq16zZE5czdDh27orXvNAaPMfsDJ7cDzKKEb8o7FO9UzdX7n4mfZt83wOh26sQ7vocfdj2ELmrP8eD/3tLXOqyNLZ22neyetUncCgmS5IZefDqKGbrynu/vMrVQ6Y7t6KLp01g7q80gddZ+wSuli1stvqHfRQ94+s7fRwFnOQ6Jpg26GMdPDkvw2EEBoVJMN6GYZ3B0KfdgJQ6VpHcsGSOdhoTq88/a2zOOAbr6zjvYyTdz5QMdK73ygrEC3SWMJW5dW6MbYOTZgkwOz3YwC3fahG28v6TXHgTO8wQFfq0PQ7jrxBeo7aln2obwT5z5R60urD3hmAv0ghAHMPY860w0oG7P4cHZYDF6LBvCEXBjb3ad8pRpWgrHQIzLQjez/y5kHDvF6wbIpL6nyeD/58p1OR6Rf1S6frzQG+2R2lMNL0Lkwfca919SXqOtkZ3w3hlDw22e6zt6h5Oq77Ki6fKEbdLb4t/awM8RmUuZd36XVB43tHbato4Xuo/TgPGdIEL4qiQm2yzJgvuno+/TFFYzPz9zZqN5PI+c5r1CEHbyc+TCOsomqfdR/wrPqOQAMQYH9uG3U9L+fDqKG7vvVqxGdt/L8T6bDUVa5h3pUOG/lwQPP3M59Zm2lAZlhJIBufu98t9k7aMBMJzOOuzrZV4fiQcoCHF6SK8ZwNtgNphyzGEr1YyCmMYTq69uzbAO6WQa3bLjTzNtYPgwlca9jeXR5kwLd6ERwG0E208SdEn5QFuX4x7oAs3gNTTEdM9c6GdOdSzsWtqURumGs6EXCgGHYUV2wYZqnEKDbfbsOFzY7BNMDPGHkM5WN+j3dDAu4HW8aXtJt1jbqPc3JaOODMXh9HMNpaWaYAr7gh3c9Y33Xyt2eX2f0gxCui3seNXRjWEm3GiejWbnhzew7ilF/fFwED0byb2DVjuzr9t6+8KmSUck/19kf47zxGkGsGzJ7qxoT7AVlcWe6UQ9kb++tdrL1GOPLb+AALCt5axpU2+FrnPi/W4XzMG3XhY0qK4r1+q/hzY+UWT65xylfOveA8Z3dYds6SuhWr4XMvAIQH37R68/L+LompsWvOA8Cd6raS50zb3WZv+Ut9aVV1o/bJkY+Fgy8/XQQJXRD5lE1TocJdyrwACXXv2PmdZF4xz6+PIn1g2asJzwsimV0TM5ebH4POz9U/NzB8/TEbuetJr1nv1KQby/hsc2ALH3KNaab45ZpHLM+3EI/XnuWbUA3dyhyDS/RYzKDpjtesbw4nl6+PfLaznTzWG20o9fE8vrN3UNPvI7nt16g209DEW9PG3TrD6LA8Pkz8NyT5HnEam51uHxCd7F8Bp4BNxd0D5nivE4PAIOHCCszH1JBwO63rIlOnr+kAjf+7zVjc0FDN0B09CLnNXL4JPbnX1xRnzfnN3JABufnDLHoVrmbOs123uGMbCCADK/RQ5kpL5yiE2c/ph6ZVyiO9HmVXD6gG5nZByvx0R9HnsNvfUwzM8Nh8HGgqg1vqusKb2SBTD0nPp+Rn/XQcu4eXlI6d7/6/Lh7HL8fcLLd8TxK6IYtj6xmAG1Zf27flsNLDhOPWe+S+UInfyqey+vz3rX7fR+ahVx+OogauvEqzLLMnQrcocCbZ/hhSnxNFF/V5M/Aj5j5Mj0wy4FuyNZ05mN1t6fPkkbV/rWb36IrRIRx7dg+YNZmjzsawe7ecDtH/fYSfegEZzXdby9xZzMZNAFkWOZ4pa+PCsZwcdmAbn1YJ+oKGfQx6W6IZkhHvDY9SBmlvLahmz/wg/bymvxgm7dHJbdAt1dLWFqfNujGBc5Gm2seVc/Zq9nyCd1er5xifcAB2pjiyHTjc9BOpuwQYXgJPgBTNtN560X3RY3qK3V7T11U2UDcpp+SebgQGbKhM9Ybg3MQCOHA7J5HmenGeNyHap3MLx7+PPzWR+p36I0Pad/pi9nfE7uRyT1EnWdtp+6TnaEkgA8MQzn4Jsp+qB7OwwOYWN955lb1uj1kHN315//jhm6cF/UZXbOdumS+rIi6rtp/jra/eoFOvXuZth6/kP0sfGlVvRrLfs/E56jrpBeoy0Tn13niGiqb9KKSs8djjbQ685XC0sq9NHDqiwWZ6QaA9pqyVskBWViesinrqGPtYcJXNvFgIfRROmc3dR+/Ui3jIWG2if2vN9sDbAMPZMImelaZPxTD7czzOKEbnR6M6ea7UpBr4prThDsTB974iF5oeJd6Z97e0nXGFvVe8kfmvkLdpzlvKsG1gA7lyXOXCK8XrD/9YfYOTtmcXep1k6ahNUFtmnUSNXTDx+oAyv6X56Yxv3rSiMvpc4zndo8Dbo8vtwHduWQAWLufr0K8wnpdTl6OWl6b0A25+U6yO2sftI1Ybh5+E3S/XOUEunNpx8I2ge4Oxou5mKEbZgRHhuyK7sw422LBzNQh44BuBGz+4T3deG3e0IkrqazCCdC8TZ+XVu2lvuWr1LhXDGngIKvP/SBEL6svRwrddU30YPY2fLOcuiz6cpfZO2hI+TPULTOGW9/Gy51mbFUP2Y1fWO/55hbIExRQoh7TjVfgDZ/yPHXJfHGT663PO1XupX7lKxVcjZyxjoZNeY7unbRS/dD2/R99OmsTvF/ZrB0qWzrJ8HXKsG0dZaYbAIqPvyCTO2zy6mY5yp+lvpkPQLEMmHeesZX6lq9uJZ9eRl/u4TG+WbdZp72vyra5exv+jzLTjTs4eAYBb1fprn3UR683lvGFTbQt3ssPex0+dU32y7Lusvi/BNf15DXqoWJThzKoTbP8NqAbjhHZbcAjAxWWcyU+AG+AdR77i/2wD9ZhW5STDehG/VBPZHtZBsQhxB+vYY3ueIX9sH+UHQzUyyZ0o00Zuttab7YRge4orTzmY6UNumNWr+fp4sh0e548TxtsQbfKiFZvI2TBSmduV79Os3bSkBkbCF9kxBf7AF/dJz5HyBaWzNxGeKCwU8VG56HKR59WHxYB7LiHGnDADQtivF+k0L3c+UIjPoet5JyxzXnTg3s+czt1mrWDBlS8pL7SCGjtOfE56jzlJbVfyexd1GnqBupW/hwNLX+WkDX06mywHEEBJUroxrkx3AJfpQSA9iiHDOuUzCWVe6l02ibVfv3GP62AGw/LAd4wB6wDzABo+EBS12kbCW/xKJ25TemmX8U6ZRumt3mEbesooRsyo06Qg2WAHMgEPzh7g/qIUws5prxI91e80Gz7blvg/5VN7KTB09cbxzdzO/PcTwdRQjfLjLaCLD3LV1HnyWvVG2pKZu2ksqnrqXv58+oaxp0P2Cp+WIb9di9fTZ2mbaaSWTuoY+UeKp2+hTpPfokGjHtS6Qy6BNizbDwPatNc3hZ058kdBzqtLegOdPI8FLIJ3XkQJ9ApJdMdSE3RFRLojk6XYY4k0B3d20sAygATBOyB456kAWOfUMEYX+nDB0OQzQS4YagJMr8Dx/1KlRk0/imVOUM2HKBmAjAOuH4QwuXc8yihG+CAekKOQY8+Sf3HPG78QX7Iic+ioyOBjgcywAAUln3w+KeVvgAupmyvW46ggBI1dENmABbe0T1i+kvZ9oPs0AEyn6r9Hjug2g/lW/6OKngdMX2tKg/dDJ7wawXisA2UbS1r7iyvu3zU0I3jt5ThmJKNbRxyZ9t49kYFn/haJ2w/l02g/XFNBGvv3DqIGrohMzrP6Fwg493CVif8Wtkqht3wMBHoB8tYh+sB9syyQw+OXWzJdDC83r2f3zHdYeJFvsoKdOdL8/GdV6A7Pl2rMwl0x6zwzOkEuqODbg7YAFLAGX4I3g5UHVUAg4wpMl7IpgEMAeGAUezjBHJzYGbAKgTozsqZAWnI4fVj+dGRAMy0kn3BHgUkAFoTeLLcPM8XdOP8qF8rGWp2BG4/7MudD+gLuoE+vDpZYdvaBnSz3vW5kmPRfiW3Lgfst9n2/W3C626Ofi4/HdiAbpyfs/wtrlO21brGFraq2wWuZVzTgHBc/0Gu66A2zXqRTHd+YmWcZ5VMNx5Bbj11aL1K1rRVAwLdbdVc+/YT6I4WuhEYEYQBFM2/lllM3q5AdHlTppyTGeXA6jX3gxCv/aLMdPM5WI5mOXWZ9eVm+Xkft+x8TL95UEABDPK4Q4Ct33HDbPeSAev9jsP7NuvMe5+wbR0XdENGkxzOOrft63agL3vLrevQTwe2oFuXMaitsk7c5bFel8m9HNSmeT+B7vbFvCTsLdAt0G3dTgW6ravYeAKB7uihm4OjjbkfhHid0wZ0e53L5vqggGITum3Kpx87bFvHCd16PW0u++nAJnTblEs/dlCb5n0Euo2hrKhWCnQLdFs3aIFu6yo2nkCgW6Cbg3kS5kEBRaA7d3Y1CW2NOgp0t/ZPAt3GUFZUKwW6BbqtG7RAt3UVG08g0N06qBUykPhBiFfdJdOdrHYOApzutpZMdzI7GkE7ktzeAt3GUFZUKwW6BbqtG7RAt3UVG08g0J0sGBPoDvamB8l0JxNAGSx57mfvMrzE6NaLbqW8vaTomrSVQPL2klYqsbtCoNuufr2OLtAt0M2Ak4R50KygQLdAdxLsGXUMatMsj2S6vaJZ8ayXTLdkuq1bs0C3dRUbTyDQLdDNwTwJ86CAItAt0J0Ee0Ydg9o0yyPQbQxlRbVSoFug27pBC3RbV7HxBALdAt0czJMwDwooAt0C3UmwZ9QxqE2zPALdxlBWVCsFugW6rRu0QLd1FRtPINAt0M3BPAnzoIAi0C3QnQR7Rh2D2jTLI9BtDGVFtVKgW6DbukELdFtXsfEEAt0C3RzMkzAPCigC3QLdSbBn1DGoTbM8At3GUFZUKwW6BbqtG7RAt3UVG08g0C3QzcE8CfOggCLQLdCdBHtGHYPaNMsj0G0MZUW1UqBboNu6QQt0W1ex8QQC3QLdHMyTMA8KKALdAt1JsGfUMahNszwC3cZQVlQrBboFuq0btEC3dRUbTyDQLdDNwTwJ86CAItAt0J0Ee0Ydg9o0yyPQbQxlRbVSoFug27pBC3RbV7HxBALdAt0czJMwDwooAt0C3UmwZ9QxqE2zPALdxlBWVCsFugW6rRu0QLd1FRtPINAt0M3BPAnzoIAi0C3QnQR7Rh2D2jREKeuqAAAgAElEQVTLI9BtDGVFtVKgW6DbukELdFtXsfEEAt0C3RzMkzAPCigC3QLdSbBn1DGoTbM8At3GUFZUKwW6BbqtG3QhQfePfvQjunz5cip+jzzyCHXo0IHuvvtuunTpUipk/vd//3cl8/8puZ8mLT2cqB9tuCobpMPU/Zr/9U0lc++HFidKXreMOqBMWtrgKcuouVuVvLDtcfP3eJZzH7+Q/g/b1t3uq1Eyf/3bN9CkJd66KSQZ/erip4N/vnOgkvmmv/s/lMse/M6Tz+1BbZrr+Oc3/1LJPGnSpFT4a8Ti7373u0rmdevWpULmN998U8kL//Xee++lQuaVK1cqmW+88Ua6ckWgOxXQzVlfGLr8RAeFaANX1nfIQnch1s92nXRAueqq4rbRtLc1bCkNOkiTTdv2D3L85PvEq6++WqDbOnETUSFkugW6k3/BFrvTTQOE5GrDNAFK2tsadpAGHaTJpnNd27JN4i9sQKA7DuIuEOhes2aNynD/4Ac/oHfeeScVvxEjRiiZ/+u//ovOnDmTCplvu+02JfO/3DWIxtTsSNRPv90epu5f+YNvKJm7Da9OlLxuGXVAGVOz3VOW+yteUPLCiT80e6NnOffxC+n/sG1dOnC6kvlr3/xjGlPtrZtCktGvLn46+OXtvZTMf/nzf6Fc9uB3nnxuD2rTXMcf/fQflMxjxoxJhb9GLP72t7+tZH7mmWdSIfORI0eUvPBfr732WipkXr58uZJZhpekELrR6GmZOLtfWlrqeUun2HRxxx13qIv79rIHiB9OSspch5Awdb7mq99SMvcbvTxxMuty6oBS8bj3w4LyIKW3bnR9Fvqyn73f9t9DlF3f/Pe3Uy57KGQ5g9o0yyAPUhZbRGotjzxIKWO6W1tFxGsKYXgJZ7oFuiNu3AI7nEB3st7YwrCBeVBAEegW6NbtppCXg9o0yyDQXWABxUJ1BLoFui2YVctDCnS31Edc/0mmO1kA6pf548DsnkumO1ntjPYL29Y9Ry5QWd8//M6fUMUKgW73NVCo/wt0+0e76667Ttn2pk2b/AsXQQmBboFu62Ys0G1dxcYTCHQnC8bCghiDhkB3stpZoNtpLz97l+ElRrdedCsFuouuSVsJpI80kFcGtlJP9CsEuqPXaZAjCnQnC8b8IIQh2z0X6E5WOwt0C3S7r2H+X4aXBIlsyS4jmW7JdFu3YIFu6yo2nkCgO1kwJtDd/J7yXA/OyZhuGV7CkFrocxleYgxNLVZKpruFOoryH8l0x9ysAt0xKzxzOoFuge5ChxK9fkEBRaBboFu3m0JeDmrTLINkuvMTK+M8q2S6JdNt3d4Euq2r2HgCgW6Bbg7mSZgHBRSBboHuJNgz6hjUplkegW5jKCuqlQLdAt3WDVqg27qKjScQ6Bbo5mCehHlQQBHoFuhOgj2jjkFtmuUR6DaGsqJaKdAt0G3doAW6ravYeAKBboFuDuZJmAcFFIFuge4k2DPqGNSmWR6BbmMoK6qVAt0C3dYNWqDbuoqNJxDoFujmYJ6EeVBAEegW6E6CPaOOQW2a5RHoNoayolop0C3Qbd2gBbqtq9h4AoFugW4O5kmYBwUUgW6B7iTYM+oY1KZZHoFuYygrqpUC3QLd1g1aoNu6io0nEOgW6OZgnoR5UEAR6BboToI9o45BbZrlEeg2hrKiWinQLdBt3aAFuq2r2HgCgW6Bbg7mSZgHBRSBboHuJNgz6hjUplkegW5jKCuqlQLdAt3WDVqg27qKjScQ6Bbo5mCehHlQQBHoFuhOgj2jjkFtmuUR6DaGsqJaKdAt0G3doAW6ravYeAKBboFuDuZJmAcFFIFuge4k2DPqGNSmWR6BbmMoK6qVAt0C3dYNWqDbuoqNJxDoFujmYJ6EeVBAEegW6E6CPaOOQW2a5RHoNoayolop0C3Qbd2gBbqtq9h4AoFugW4O5kmYBwUUgW6B7iTYM+oY1KZZHoFuYygrqpUC3QLd1g1aoNu6io0nEOgW6OZgnoR5UEAR6BboToI9o45BbZrlEeg2hrKiWinQLdBt3aAFuq2r2HgCgW6Bbg7mSZgHBRSBboHuJNgz6hjUplkegW5jKCuqlQLdAt3WDVqg27qKjScQ6Bbo5mCehHlQQBHoFuhOgj2jjkFtmuUR6DaGsqJaKdAt0G3doAW6ravYeAKB7uihe+qKY/TQkkYaudj5jVl6lDhgYo7tE+qa6MHFjTTssSM0elmTWqeX8VqmDVdlg7RXGdP6a776LerQoQP1G728RV1MZcOugzwT65rooSVNdO9jR+jhJY00oe5oC5lGL23WB+vFPR8VQA9BAcUmdEPeySuO0ailjUreEY8dJsiH9bruRi07mrUBt6z8v3sfff+wbd1z5ALVxn/4nT+hCldd9OO2Z3nqiuP0wOIj2d+DS1rLjeNDrkeXNdHIJY00/LEj6nqY1IY6+engtv8eomS++e9vp4rHW+q/PXKyDNxOXvNHljVl2xwyT1lxVOmGy+M68KtHUJvm4wh0G0NZUa0U6Bbotm7QaYXuuro6uummm1TgABRhGevimuKC7tWrV9MNN9yQldMtX3l5OV1zzTVq+y233EJXrpgvOvd+bfn/jjvuUOe5vewB34DIgS7IfOqKozR80RHqUttAd9e0/E1Y5sDJuGVN1NmwvWNtAw1f1EA4Rq5z+UGI1762oHvy8ia6Z15LWVn2fgsaaMryJhq/rLGVPriMe/7Q4sOt4FWXKSig2IJuyDNooVnePvMP0fg6tPNRGrXkcCCZsQ+OqcvIy2Hb2jZ0o56mtr5vEdrMsVuA59iljdSl9lAr+TvVwMaby7KcueZ+OrAF3ZC197zWMrjtFf8/suQwTaprosELD1Op69qGHqbUmduX5Q5q01zeBnTD/yL+eP28fDL8uh6/rr/+esKxop6uu+46VbdNmzZFfejs8VgHiEPnz5/PrucFL93o66OKWzagm+XT6+tenjBhAotLmzdv9rQH3i8qeXHSNWvWqPPdeOONnvG/Q7Z2stBuDaQRunv16uVp1DYcl6mR4oDukSNHtpJTr8vNN9/cYruXg9f3ac+yDegGdNy7sDlI3/fkcZqz/g3quvCIgo+HF+yjR5ccpm4ZQB284hjN3fgmLXrlbXrw169mAeW+hYd8oLNwMt2T6hqpR+1BVfdeixtpxrrXafnOd6h8zSnqudgB7Z61B+jBeXtVmR6PNSqdQC/u34C6o6rMsJq9OSElKKDYgG6AWL/5jryArfLnT9FTe89S5Ybmdu5Ze5AmLW2g4bWOzP2WHW0lK2Qfu+qko5O5+2jiEnOb+wEnQxjPbUI37PuhRY7sJbUNNPXFU1Qyz+lY3F+9kyarzsYxemTJESrLgOeQx49R7ea3aPG2t6n30uaO1wgfG2d5MPfTgQ3oRscBbdJt7j7VRuNWnzS2Yd+lTWr78Jrd1Kf2gFqGXTy6+jWaue519X9JzSGa8NgBn2u6g3b3yj9bXyjQXVVVRVdddVUL380whtgWJZDZhm5A9rXXXqtkgVymiWXLNY9KZoFuc9JNoNtkmW1clzbo1nuRd955p+pVurMGpt52G9XruVsc0H3rrbeqLLaeEdErBMeNDAl+cGhJg24E6cnLjlD/ubtVoJ2+9nRWvKGPH1PrRszdTr1q9qvlKS+cprcvfKoAdcm2t6nx7Y9pzcF31TYFc0u9s71+EKIDi74cdaYbADpwniPPyKdO0MnzlxSAPvLsSXp23zk6/e4lGvbEcSVTv8rtjg6eOqH0Urv5TZr98hvqt2z7GbWu3zIHYIZU7qBJOeUPBihRQzegc8RCBzrL5h+m/a9/SMt2nKHRK0/SpqPv07mLn9LA5U7H4d7avTQkI/PUF0/T5c+/yMrLco9Z6UB3t8rdNGHRfiOUhW1rm9ANqL6nxoFQyI02hq12nrWDRlVtVfaPMt1rHB3Nfvl12nPqIs146XVauPVtZR8vNDg2XlZzUJXX7dNr2U8HtqB7/KJ91KVyj5Jx/xsf0rYTF1q1YZ8MdA+atYm6VzrXPjphmC599oXaF9A9bsGe7J0Ak5xBO5K8r03oho9GNhnxSf/t27dPycV/EJsYPrHPqlWrVHnEMl4fZVbaNnRzFhgxyGtiuSorK1voBvEK2yB7EqDb3ca4s86y1dfXZ8XXGcVkE9ge5SSZ7ii1GeBYaYPu3r17K0PHBaBPujOL2qj18/ByHNANh3bixAl125Evbj4/5siEQ252XkmEbmTG+szZpgJt32VNVDrvMJ04d4mQ7QOcDJu1kcoymbPX379M/TIBG9vw23vqQxr1rJPxfmD+Ps8g7QchHJjd8yihmzOBnTPy7D/9IY1d2ZythzzP1J9TEI7lbrMcvYx46gRtaHpfyctyY/72B59S90XOHYERlVsLErrRqepVXa/qvmLXOzTlhVMt5Nj92kV6ut4B0T5VO2ngrM1qO6D7yT1nW5TVZe8+ZycB8KBTd5uFbWtb0I26jc5kuVH3dy5+Snxnos/UtTRu/m51d2LsIqcTVrbgCMEmMGSKZcWdH0zdFzkZ73EeMofVgTXoXlhPnec4IA3ovidz5+bumua7WSzb4GkvU9fZO5WsfZY0qbIXL/1G/d+x+iCNnbfb83qGvIUE3UF9rw5kx487bcs+HTENfn7EiBG8qt1zm9CN2MNZbiS+vCaOXe7OBA+LBIxHNdnMdLvbGJl9yAY59E6D3sb6+qhkdB9HoNutEcv/pw26c6mTL+5igW6WlbMJkM80JRm6yxcfpN6zX3ECbQakkR1j6B40bb3a1m3RETry9sdquWTmDuo0dYNartnkDDVBIB9YvVvdrncDiBOg8z+8REHYQifryeCh5lX7qdPUl5U89z5+jJ7JZEM7zd6l1vVfdpQq179Bd1c3UMmsHWqObOHxdz5R20sr99Koua94yh4GUKLMdENetG9HA3CVztiq6l698U2VDYUeus3ZRQNmblLrdegumbObSmftpLKpG6lL+fPUo/x5un/ai+rYhQzdGJPcN5PlhpwbMx2n0tm7aOTMl9VQDJQZUuMMqdFtomT2Luo4x1n/5vuXaeTTJ5ReHqjNnf1l2/freMQK3bWHqWTGNuo0fSt1nryOuoxfRb0nPqfakKGbZT/17iUlZ7FCt+7L3UDG2+DPo5psQjc6B4hJfvXluKxDtw6m7s5He2SPE7o57rqHBOmyudu4PbJ57SvQ7aUZS+sFuh3FIiPMF7f7lp4N1ceR6eZ6szMuRuhGpvu+WRupy7RNDlDWNCgIY+geULFOBWFkzBrPONBdOnsnlWWgDWNfOSPap2qXGhccBYgxvESb6T6qsndlgOnqQ3R3NYYUHKKyik3UearTuajc8Cat3H9eydx5ugOgDCSYdwR01zSosbJcruvMV9RxMXSF6+2eB80KRg3d4xfWU9c5O6ljZb2CSMxLZ+6gkiqn84G2W7L9jNPGMzZT/+lOZ0qHbl1+LPeeuYXG1OzwHGrhB5xu3djIdMMGxy9GGzsZXty9eSjzDEL36ZtoRO1uNY4bQ4KGVW2j0qqMfubspY5V9VSGtp/rDDl5/+PPCH4ev4ert+ccu8+y+ekgVuh2PRxdMnc/DZ+5XnUUB05bR50rNmTtIanQjSy1/qwRgMyU/cU6jlMARH3iISZ+EKvv47dsC7r1eKvDtF99eDsDO/QWJZjagG6usz7X76y721mHbjxgyRl9yIpYHvUk0B21Rn2Ol2bohuHDwGH0fGsOjiuOSaA7mlcGYjzr6JrtdO+kVVQ23cl+tsh0T31RARtg640Ll4nHMDOI7XntIg1a4QxF6T/nlciynwwvUUP3owv20rDJq6n/mBXU75E69SrCXlNeVNAJmU6eu6TGO2O5x6Q11G3yWuo0db36lVVsoE6Zzsb6xvdp4vPOUI1+0zd6jm9mOfIF3Rh3fX/FCzRg7BPU95E66jTTGTID+TDGe8XOdwgPGOL/gRUvUf8ZG9UyoBtDh7osPEIYv//YtrepZtNbWT2NXIDx3OY31vgBJ+uE5zagW43dr3U6FpBl3+sfOnXXho5A5mELDij4HFr+rLKFnmOfzMqI7eXPv6YetFX6mrVDdTZyda5YJj8dxAXds15+nXotaaQXG96llfvPUe/M8LDuNfsJHbKHKzfT4Am/ppJKJ6ufVOhmkHbP3W/U0mEVkM7gzUMVsL/+Joz2xjJb0M0dDAClDpVuAPWqPz+HBPhOInTr47nBIfqkQ7fbHvC/OzOu79uWZYHutmitHfukGbph3PpT4DZ6kV5NI9AdDXQDnPDWCoB319lOFleH7sEVa6lzBtSmv/Q6vfH+ZZUZnbTmFGE8MKYemXHNw2dtiuyNFgwv0UK38+AoxqpiOMjDlVvovjlbqERlvBtUhnvT0QsKupD5REcEgD6k/BkaPP5pGjjuSepY7bztAeODOy9wxnPjToHXmzxYjnxAN86N4ROAK7TvA7M2UOc5u+ju2sM0f8vbdOD1j5Ss/1N9iDrPeIVGzljXYkw32rZu5zuEcc0T15yifac/pKf3OuO8e9TsL9hMN7LcaI9OmYcjD7zxEU3WxrJjfDZ3HvtX7yV0xHCHAQ9WDp7uDDPqX3dM2fe0taeVjtDu/aa+5PtwYXN75x5OFRd0v/7eZZr18hvUbVGjegD60udfqPZEJ+L++fvUG0pwHcDesS7J0I2ED2ISgIyh0j3eFzbNWV4TkGFdWzLHyhEa/tiAbr3jYJIBD4fmmnAnmvfTH0DMtU/QbXFluu+66y4lgynJp0M3koHQBzojPBwFskcpt0B3UOuIqJxAd/Orl+Dggva026t+ge5ooBuQAPDGQ3HdMg9V6dA9dMZ6GjjpOSrNDEfAg2jDf3VcvV7s8FsfKTBBsC6ds1tBLB7cY/DQ536ZP72svhwldOO4ADJkKlFPjHfuXuNANF6Vhix3aebViL2mvqQgDEDmQNluGlbpjH3HuG+8uYXl9hvPjfPmC7odmY8q+MaDg10qm8ep46HRAZk3l0CW4VXbaNBs524HXpM4SNuG7Xho9NyHnym5y6oPer5SLmxbR53pRvsOnedkufFWmlfPOWPvO2aGmqAD8et6p/PQp3KnsgN0TtD5vK/KaeOy+UcIwD1vc3N2v1vVXk+ZdZt12jv/0H3vE8cIz2Kg7fi3fOcZqtvhDCfqX71HyQy74Os7adANwEKyx/26vP+fvfcAz+K49v9xmuPENy6JEyexc+Nrpzm/OLFjO/FNbpJf8kuc9k/xzX3iGyOBKALRscHG9N5BoqmDEEVgwPReJUTvRRIgwGDTezG96Pyf7+x7Xo1Wu+/uK3bfIp33eVaz2p3dmXNmduYzZ8/O6OBlBdG4hsGcQ8AY9r20/PoB3WarPA80dIt3KBn4eq9lRZ8eKejmD0jNbzKQBwxKUL7YdCs49llHXr7NEOi+V5oL8/q6DN26qvhBRsOFSu/3T6DbS+jer9wj8CEdOmcdumEJhoW0xeAFlBCYiow7cMzVPWypYQlsPGZDSL/mcEGMIcZr6DYgdL+C0NaBOYo7Tj9Al27coXffNz6WS0orps4jlinAAsAZbwPKqE22MStE3toTlTOcjFxjzIIRwp/bgLDoTBnIelQDq/HbKTkwIwuX4Ywtpwlgiv9bZ26mjmOM2Uv4PMKkgYuC/v74mJZn8ug9blvMzV6CQRXgOSnwRmLtgYuEj33hu18/8GGsDt1NMrfSgAmGqwxcrbpnrg36N7MOYCnHrD74v7/NNImsZw6d6ruflu6mY4ypLjn/+Ag2qf8clf+usw6qqSJxrlnWVjXgiGfoDtXPsDXXCrr163TLb0FBgX7qnvf9gG622JrdJHSXC3absRKA15cwX28VN9xjkYBuGPb4DXu4rMG6E+gOt2RjKL5Ad2VhsF83Rph+/wS6IwPdnTPXq1fqXUetUu4Vyf3epzewal92CW08dFl15HgGOgxbHNKv2QlCGFbMoT/QXU7v5FUuCgKQ5EVBEkdvpI5D5hkDiMCKfOyu0CTLeAW/8YNLytIPcMGHh3bzVeuyRMvSjby/O2EvdczfQ2+O3almqmnebxYlDTb82HvOOaTm7oYsjTO3UofRxZSYuY0SxmxSW4Mxm6hNn2nUcKRhAd506BK1m2r48HfP3Wzp1x1uWXtp6cbgonOeYeXGYAo/XuiJIVSHbgWfObuoY34ZdRhfSm2zt1LK8BXUrPc0SkwzBiAbDl6iAQsPq7r+bu5225U4q5Z3lCzd+Tuo+ej1aoDMZdhs8EJqiec2p5SwMM72jwz/dsy1jjdcdR262T/aD8uvH9DNlnlzP6u7ndgNNBCHgdWPt9KRgG67aYvdMIdAtxstxXgcge7KAuIKbW4MKmN4tyfQHRno7pJtLPoCVwy4UaSMMkAEqxoWbDylOvLGI9co1xLMBKGDh74fLojxtV5DNyC090TMRGHMarGk5FzAT7lE+Wu3GLKYOmeuoz4TK1dbxDX9xu9Qs1cAXC5eux20fL47utDRnxuyRAO6ke9eEytdCxg6k8ZsouaBj0c7zThAH503ponDrBbJgcVSOC7ClqPXUcPAWw4MUOAfjOM9czZaAmi4Ze0ldMNa/Xa28cYGb2HwKyq/QBPXnwxupy7fUsf5LQ3k1uXFfvO0Qmo4co06jjnau84y5nNvl7XF1ped66xR3tGBblji6+caVnmWCXW99UhjJh7IURT4bkHNtT5+e52Gbh1UrVwV7rXH8gO62YJv7mfhPsHn7KAbMjJ036tsVtdHArqfeeYZJadZfqv8mI8xo4il26yZOPq/rkF3qApvNwL3ozgFuiMH3fB3hZsFLLoNAoCy+fBlgt8vOva2w5cpv2dYGXXw0PfDBTG+1mvohixNAh/YYTl7fGimP8MMKghb55UquSF7p8Dy6Jh2ruSY8QFig/Qt1Mthfm6WIxrQjXz3zd1MCQGfXn32EZZz9vYztPnQJVWOSaM3UMvhy9V+t1kHaUpgUMVxUybuVfrC/1gwCdMGIg2WkcNwy9or6MYgAwM/XlWz+aR9NGDhh9W20mNX6NK129RlJlYeLaPEdGMFRyyCxAs9scwAVqzSyC44HdOxCFKppVsNy4/QSQf+uJeUq7dSjQJuYrO3naZ3ZhguUywPpojESpv4H1M/4iPbeLZ08zR/ZlcJJ59u7pPYaoq+y4+fH9DN4GiWWXcvsfPpDvUBohfy+w3dcAXiQYPd1MTs6mp+cyE+3V6UcAzcQ++wo5Ud3ZHf7zxwI4URNUaaaNywceOH4368tjLLJdAdeejuFPg4DR9SYso8dNxwP+g2ptARRJwgRAcWfd9L6AaUDZxguJXgub1zt0JVq77zD1OHaQeCW7spxrLoSdk7lRUbINcyywAzTLE3fYth4U8O+HOHGmywLNGC7j65mwj+9igrwNamQ5fV7BVtppSrD+qggIzCo+p8clohvTl4vtpH/HUHLqnVKuFOMmwJphC8HPywsPHo9QrWrGQPt6y9hu53MiqnRYQc5k13L0E9aJBmWIGbTdhL8N/GkvfYH7joMBWXX6TdRz8ODsy6ZRSHXHm0sryjZOnO20YpAas26jU+dsbsJc0n7lPTQ+JDSV4G/q1RRep5iGfo1kET1kv0RTjGBiAzeOn9iO5qgWv8+PkB3eh32aKty8wfCQLKraAb0MnA6pe8fkM3VoGG7KEGSfrbC57RBkzCgxVc7+WCQDp/Wekd9cp6WT0/alwduGddg248uOy7zQ++HqJiR+In0O0fdKevOhJcPhruJXhlD/BsElg+ffiyI9Q24NebkrYq5AeUbiGE45lDb6G7nPqOM+AZz+3C3ecst8kbANVlypoLSyBca5IC/txj1xyndoFZPdqMdOfPDZmiAd0YZGDmldZpKwMLAZVSi0n71KABS8LD6onlvwGlCVk7qH3qMrVSY9NUY6EgHM8tPkbF+y+qVToB3jiWmLNbzekda8vAQ17UVbx9aD14ASUPmENN+81SW5N+Mylp8GL6V04Jwdd78OLDah/A3br3VGoYAG/Ih9Url5WdVwPLvDXHg8ANNypMvYi3JeZ6av7faeDhj6XbWIG008gVhFU3IQveRs3YcorWHbhIE9adIMw+hOONlEsYBhClyjrOs5dM3nCS/oWFgOJkGXj0NTpM6X0R9kMZgNiAFArg7rUv8wO6Q/XBAG+76fCgC4ZugKkfP7+hW/8INFT+9YGJuU54PTe5QHeokvDhXF2DbqgQDz0qNVsTUKkB4jgWqZ9At3/QjZke0DFjU9BdsIf65et+r8b5+lk71SwfgFIAjxk89P+dIESPq+97Dd19xhowwvKFChtkbldA0i9PXyZc082YIkcLP8sSLejGfNV4E9Fy4PzgAihmmTFHc8tB89RCKZiv+p3hi6nxMGMlUnNcwFjKoPnUPYTs4Za1V5Zu6BqWd7zNwKIvmIEGy9VjcaB3hi0i+Oub5UnG6pQjlhEWx2lkIzOuaTR8pbqH3UCDy5lDJx34Ad1ImwcdbQfOoYTRm6rJC1kajFij5qDvl7fVmEoyb2twykDWTzxBN/occ3/EFk67/igSVm6k7Qd0477og+Fewn0wYBsy27lc4BoeZKCv9uvnJ3TrZeY0FznkwyBDNxBi3w8Lv0C3X7XJ5r51EbptVBHRw5GE7ogKFiKx1157Tb1a+3vDriEBlzt+tyGAGeD89ojl1Ch1FTUctoKShq2k5sNXEtwT0JGjg04ZUURJw1cGz7ccuph6Z6/3xPJnl1evoRtytBi+TMkHOe02yIkVGpXPK64ZUVhF9hbDlrm2ekK2aEA30oXPNUCxy6iV1Lb/TGrafw4lDV1GiSPWUNKQZer/Nv1nEmanAazijQYWDwJ4t+g/ixoNXEgNUldTw6HLqemAedR6wCy1iA7uaeXPbcga2rXCXNZeQjfLDAsu6jRvsPhj8NFE1V/U4ZXUKK2I3k1bpuo2LNhvD1tIKQPmUONBC6nh8FXUMLVI7TcfMEctksTPgjn/Vv0TLssAACAASURBVP9HC7r5WcagqH3/9yk5UN4N0oqp0eDF1Lz/HOoweJ56G4CyxiAFdbxt6vLK+j18JbUavtzFdxrupsFk/Tz3k1dV+5Wamhqilatdp/yC7ljVkp/QHasyC3RHuGQEuiOs8EByAt3eWbrRKWKxGAA0LIKw+qFjZhADXAHIAG44jhUasVojIMaNlRv3d4IQ7pjNobfQbQwukG9MC6hWmhw4Wy2DjaWwecNxrESJlfpgKYbs0EWl7PPU3OU4buXTbJbBkN8doMDSzK9DoVure4V7jMsP8sDqCzmwwiZC/I/jkAXx2EUDkIr52QGi0AvidlJxi9UHtXbAbcgaXehGHiCHviG/gEu2aqOMMbDAx6Co+9gwIGOZuW6gHqDs4feMwSfu6Ub/TvXdL0u3IXu5ei7hZgNLvyrvgbPVM4tVRzF44I9BIQ/qON4M8OqreLYB7U7PttuBJOtLoDs6fWUkUxXoNr4TMutcfLrNGrmH/wW670F593CpQLe30A14hOULM5QAuNiXmUEMITphHFfn83eozjoUfHFni9AJQvS4+r6X0I37muWALFYbLLkGmJRXu0bXjZ7XUPtuAcUP6Ea+uHy5DAGYLAdbPDn/ADHoCfLr9QFgbo7L1+hhuGXttaVbz4u+D19syMDlDdkA2wznZpkRD3EApTjnFriRppMO/IRupI/yhmxc3pAFdRr/mwcPiAsZcZ7jscy6/sz7bus0XyfQfQ8dXpxcKtAt0O17VRXo9l3FlgkIdHsL3egYGT70kDtMN+f1uOZ9Jwgxx+f/vYZu3FeXz2mf82EVj8+5Cd0Cil/QzXkMRw6ruDjG97ILwy3rSEE38muWySyD+Tz/b47n9L+TDvyGbs4f518P+Zwe6ud5Xz9vte+2TvO1At2WXVmtOijQLdDte4UW6PZdxZYJCHR7D93cOfoROkGIXZp+QLddWn4edwsofkO3nzLyvcMt60hCN+fR79BJB5GCbj/ldFunOQ8C3ZZdWa06KNAt0O17hRbo9l3FlgkIdAt0c2ceD6FbQBHodrakx0d5h/ZrF+i2bNZr3UH5kLLWFWk1geRDymoq8feAQLe/+rW7u0C3QHc8wBfnUaDbvr6KpTs+Bxpu6zQ/A2LptuvNas9xsXSLpdv32izQ7buKLRMQ6LaHGO7kYil0et1ul1dxL4mvckY5hlvWAt0C3ZaNfC04KJbuWlCIDiKIpdtBQV6fFuj2WqPu7ifQHV8wFi6IMYQLdMdXOQt0G+XlVN/FvcRdOx/vsQS6470EnfMv0O2sI09jCHR7qk7XNxPoji8Yc4IQhmxzKNAdX+Us0C3QbX6G+X9xL3HdvcVtRHEvEfcS3yuvQLfvKrZMQKA7vmBMoDt6i+Mw9EQqDLesxb1E3EssG/lacFAs3bWgEB1EEEu3g4K8Pi3Q7bVG3d1PoFugO1IQ6UU6bj86k9lL4hNAzXXEaeAh7iXu2vl4jyXQHe8l6Jx/gW5nHXkaQ6DbU3W6vplAt0C3GXRi+X+Bbvv6Kpbu+BxouK3T/FyKe4nr7i1uI4p7ibiX+F55Bbp9V7FlAgLd9hDDnVwshU6WP7u8ik93fJUzyjHcshboFui2bORrwUGxdNeCQnQQQSzdDgry+rRAt9cadXc/ge74grFwQYwhXKA7vspZoNsoL6f6Lu4l7tr5eI8l0B3vJeicf4FuZx15GkOg21N1ur6ZQHd8wZgThDBkm0OB7vgqZ4FugW7zM8z/i3uJ6+4tbiOKe4m4l/heeQW6fVexZQIC3fEFYwLdMnsJw5c5FPcScS+xbORrwUGxdNeCQnQQQSzdDgry+rRAt9cadXc/gW6BbjO8xfL/bj86k9lL4hNAzXXPaZAp7iXu2vl4jyXQHe8l6Jx/gW5nHXkaQ6DbU3W6vplAt0C3GXRi+X+Bbvv6Kpbu+BxouK3T/FyKe4nr7i1uI4p7ibiX+F55Ywm6n3rqKVq7dm2d2Jo1a0b16tWjP/zhD7RmzZo6IfMvf/lLJfMv/9iQ2vSZFldbReF9xJ10OHn/t4cfUzL/o0nvuJLXLCPLjrBtn/dsZUl+d6ySF3W7ZY+JtvHM94+l/8Mt67816KJk/uKXn6Q2IXQTSzI65cVJB//52/9VMn/v+V/GZRlDfrd1mnX1zLM/UTK3bdu2TrTX6Isff/xxJXN6enqdkHnhwoVKXrRfK1asqBMyDx8+XMn83e9+lyoqBLrrBHSz1RcVXTbRQSzWgYpVlT7NsZg/v/OkA8p999XuOlrXyxp1qS7ooC7Vab/bB7l//LeJ999/v0C378RNRLFg6c7Ozlaw/elPf5qefPLJOrE99NBDSubPf/7zdUJelOsDDzygZH7g81+gh7/41bjadAgJJ++f+MQnlcwPPvTFuJLXLKMOKI98yb7sHnr0K0pedMIPf/HxuJQ53LJ+8AuPKpk/+clPxaW85rLG/046eOBz/6Zk/sz9D8StzG7rNOvn05/5rJL54YcfrjNt9qc+9Skl85e//OU6IfPXv/51JS/aryeeeKJOyPzYY8bb2AcffFCgu65At+7IHwmZYyENtu4nJibaVvRYyKeXeXjttddUg/b3hl2J/STjJXT6sMxODpky0N4X2k5n0T4eblmLT7f4dHvZTsbSveRDylgqDX/yovOXuJf4o+Mqd40FS7de6FUyV4v/EeiOLxgLF8QYHAW646ucUW7hlrVAt0B3be2qBLpra8lWyqXzl0B3pV582xPo9k21IW8s0B1fMBYuiAl016NBE3fH3RsNgW7juXSq7zJlYMjmvdacFOiuNUVpK4hAt61q/Dkh0O2PXp3uKtAt0M1gHg+h7v+aOs3esinzdNvrJh7KmfMo0F29fZIpA516tfg/L1MGyuwlvtdigW7fVWyZgEB39U6NO/xYDJ0gxC7P4l4SX+WMcgy3rMW9JD4HGm4HkvxsC3RbdmW16qBAt0C37xVaoNt3FVsmINAdXzAWLohxRy3QHV/lLNBtlJdTfRf3EstmvdYdFPeSWlek1QQS95JqKvH3gEC3v/q1u7tAd3zBmBOEMGSbQ4Hu+CpngW6BbvMzzP+LpduuN6s9x8XSLZZu32uzQLfvKrZMQKA7vmBMoLtycSDx6a5ad8W9RNxLLBv5WnBQLN21oBAdRBBLt4OCvD4t0O21Rt3dT6C7KriwNSlWQ4FugW67uinQLdDtrtWPv1gC3fFXZuHmWKA7XI3dY3yB7ntUYA0vF+gW6LaDuFg87vajM5m9JD4B1FznnAaZ4tNdw4Y/zi4T6I6zAqtBdgW6a6C0e7lEoPtetFfzawW6BbrNoBPL/wt029dXsXTH50DDbZ3m51J8umve38XLleLTLT7dvtdVgW7fVWyZgEC3PcRwJxdLoZPlzy6v8iFlfJUzyjHcshboFui2bORrwUGxdNeCQnQQQSzdDgry+rRAt9cadXc/ge74grFwQYwhXKA7vspZoNsoL6f6Lu4l7tr5eI8l0B3vJeicf4FuZx15GkOg21N1ur6ZQHd8wZgThDBkm0OB7vgqZ4FugW7zM8z/i3uJ6+4tbiOKe4m4l/heeQW6fVexZQIC3fEFYwLdMnsJw5c5FPcScS+xbORrwUGxdNeCQnQQQSzdDgry+rRAt9cadXc/gW6BbjO8xfL/bj86k9lL4hNAzXXPaZAp7iXu2vl4jyXQHe8l6Jx/gW5nHXkaQ6DbU3W6vplAt0C3GXRi+X+Bbvv6Kpbu+BxouK3T/FyKe4nr7i1uI4p7ibiX+F55Bbp9V7FlAgLd9hDDnVwshU6WP7u8ik93fJUzyjHcshboFui2bORrwUGxdNeCQnQQQSzdDgry+rRAt9cadXc/ge74grFwQYwhXKA7vspZoNsoL6f6Lu4l7tr5eI8l0B3vJeicf4FuZx15GkOg21N1ur6ZQHd8wZgThDBkm0OB7vgqZ4FugW7zM8z/i3uJ6+4tbiOKe4m4l/heeQW6fVexZQIC3fEFYwLdMnsJw5c5FPcScS+xbORrwUGxdNeCQnQQQSzdDgry+rRAt9cadXc/ge7oQ/fw9/YTb2aQMv8v0B170I2yM5eTF/+HW9YC3f6UQ03KMpw6IR9SOvdVAt3OOor3GALdES5Bge4IKzyQnEC3d9CNjrb/lH3UeUIZtc0ro9Z5pfROfhn1nrxPQbXeeSPuwCn7qMN4I16zsSXqmrfzy2j4e+W2EBcuiHGafrmXQI7ek/cqOVuNK6V2eaXUeeIeGlCwr5oMiNuvYB91nlhG7caXEeJDXlyPc5zXUKFbQPFzysBKOfZSG5TzuBLqkF9G/aZUL2eWZfDUcmo/3pAbsrfP30N9LHTE8RGGW9Z+Qzfq5dv5e5UckAVbt0n2ZRdufF123nfSgR8+3UNRVvl7VB1FWVltb+XvqfacDpq6n7pOhH5KqVVeGXXML6OeFs8+y8ah2zrN8cW9JDp9ZSRTFfcScS/xvb4JdBP9/ve/p3r16lFKSorv+uYE/IbuBQsW0DPPPKPkgmzm39mzZ6lz58709NNPB+O8+uqrNGXKFHNUz/5/7bXXVFp/b9jVFehxZxcqBGB0mlBGb+SUWm7txpXQsKkGiCJux/GIW2IZt3FuCXWfCPiuDqJOEGKXRz+gG/K0HGctA57nLhMqZVD6ybfXT9u80qB+7GTAcbeA4hd0Qw4MpOzKuX1eaTUYg55ajd1d7ZpWYyvrhJXM4Za1n9BtlF/1sm6YW0JDp+yt9hyFG99KfqO87wuWuVUcr6EbZdVmnFFW/8q2fpbfyDHKv0PeblXWeE57TNxDibnW9SJlLHRUfRDK8rit0xw/EtDNfRHaYrvfjh076J///Cc98sgjwbYb/xcXF9tdUuPjflu6kef77rtPyREq/2aZITv664MHD9ZYNqsL/YJu9MFOW0WFNfCir+ayHjRokFW27+mYWLrvSX3hX1zXoVt/6L1+gEOVhp/QDZg2P+B6XvAQv/TSS9Xi8DV+PNhI32voViA2vhJIsgqP0uryC7Ry7wXKW3Oc6gc645Zjd9OwKfuoe35l3IxA3O0fXabFJeeo59xDCs6SckpoSEF1mAkXxLij9hq6FXCP3aXy2nziXpqy8STt+Ohjmr/zLKWvOhoEzE7jS5TMb42vBJjsomNUuO8CFe27QHlrj1PDcQaspEA/gYEJ59scugUUP6Ab5dwhr7LsIMea/ReVHOPXHg/K3GW8AWPIO4CsT34lcE/ZdIqa5u9Vcd/K3ECDJ5VYDq5wbbhl7Sd0D5lcRo2zd6p8j1xxhLrP+UDtp2RsooETdlWTIdz45nLm/5104CV0o6yGTC6lFllblWzDl35EC3adrbb1nndYnW+btZkgZ/cJpVQ/MIAesfwILSs7r+pFwcaT1H5quYrbJNd4DlguPXRbp/kav6Fb74sAmVY/HGcA4/ZaDwsKCqwuq/Exv6GbBxkYNNj9oBc7mXF8+/btdpeGfTwWoRv9McoYBjL03V7/BLq91qjD/eo6dPNDH0krN4rET+iGlQSN0YsvvhgEa70adOnSJXgcDzQaNVjG9fh+PNxeQzc63sRsA6wW7T5HS0vPUZdZB+mtaftp4voTtPfEVdXxvpFdQv3H76DGOQasztp2hspPXqVRK45Qk/w9tKTkHF2/dZcGLDQ69fZjd1WDUCcI4Y7ZHHoJ3YDPbuMNGVpO3kcfnLlOkzecpOQJe6nPvEO09sBFGrPymJK5efYOGpi/k5Kyjfgr9pxXg4u33ttPuDar8BjtP3WNEgIDkz751QFOl8UtoPgB3aqcA3AFOQBVrSbvo8GLPqSy41eUXLCAA04RF/nGIKt1zg6li4zCY6puIE6D9M3UbUyhgjyrNxq4Ntyy9gu6Ud6d8wzgblNQTmc+vkXcXr+VtrwadFvF5zcDVvH18jXvO+nAa+geNHE3Nc/YpMoLzyMGzx2mHaiyJQcGTa3T16u63SzH0M34tSdo/cFLNHDRh4SBaFbRMTrz8U1qNH6Pul/38ajb1V3H3NZp1o3f0O2mLwKcAsDQvgOw0Xbj7SS33ThuZzHV+wC3+35Ctz7ICGXw4rexuszot/A/dIH+ziuZ/YbujIwMVWaQHRvyDhlQrlYyoB9+9NFHVRy/3kILdLt9GjyKx404Gudo/fRCj2Qe8KDzq63Vq1dHMmlfoRsNEmTjETIeav3HDzEs4voPVhTWBxoEr39eQrcC0HEGVLUp2Eer9l6o5jZSeuwK9Z5nWLDfzlhPCQFAv3rzDrV/b7/qkBlKxq05TusOXFTHmmVtrwZlThDCHbM59BK64U7QOnubymN64VEFzpx/hLDunf34ljqfmL2LumSuV/stJu2jfScDAxDNDef9raeD1vG3crYqUDXnn/93CyheQzfK+d1AOQPC8teeUDKx3P0WHKYrN+6oYyhfDDRwTf+JGIwZ1vH9p68RBhu4psXw5YQ8AspZNnMYbln7Bd1DC/ZQ02yjjs/dcYambjqpZGg0ch31yCgODjA4/+HG5+usQicdeA3dsNrr0M3PLZezHrYfvYb65G4KWrm3Hr5MjccbbzE43qLdZ4N1pV32NktXHLd1mvXjJ3QzgAIkDxw4YNv0oi3HZrZo43o+56Xl10/oZuA090O68IBOlsssMyCU+ysrYNXv43bfb+g2cwYPHADjVj/uwzGo8uun85edHqsShF85qSP3rcvQDes2HmgvR8puq42flm7OAz+wkNHNDw0cN2KxDt2AprYBAOWOFmHDwUsocXihgpM5288oazaOtxpVrI7VH1tGJy/dNPYztlHTnlPV/tvTD9CGgwZ0N8zaUc2K6AQh3DGbQ6+gG1ZZWAMbBlwNdJkb951J9TMMGD9+8SYljjXcRtqNWq1kG7ToQ5q386zabzhkOSUNXqT2+y84THiVj3u1yNqiIM7e+hud2UsAkilZhmy6zEn959IbgUHUzdt3qUnAqtln7FYFWO1yDViFfMaArJQS07dQ5xHLlR7t5ET5hVvWfkC3GlQGrNxwA7p07TYl5xuW2zbDl1K/vK1VrLfhxjfXU/P/TjrwG7p7Bdy96o/ZQgljNlOD1EJqPGgBtR44l7qnr6a3swyrOA+sUDcSR6ylhsNWqPqctvwIzd95xqjbGajb8Pmv+q1GLEE3W6oHDhwYsqlmADXDGy4KdS7kTUOc9Au68WYV+QV0AnTtfjAE2cnFAxWct4NFu/vaHY8kdOsDJauBFgxnbCDzoz9mHQh0syYiFNZV6EaF5od5/vz5EdJ2ZTKxCN265SCW3UvQecKN4N30NZSQsYUSRq03ttGbqFm/96l+AMZ2Hb1C78w4oDreVsOWGmFBOW378LLabzhqPbXr937QInr4zHV1vEHmdhowfnuVTtoJQszQwv97Cd2w4rYeWUwJAJGAzA3TiqnpkCUq360L9tGR8zfUfmLGNuow1IBrAElhOd4ElFJC+laqn7Fd7eevO0EAbxxvP2ZNSBh1CyheWrpRzvC97jimmJJGraMGacWUmLpa5T9x1EaVb5Tv5sMfq/0GGduUFXvAhJ2UGLBy7z52hdpMKaf6OWXUZMRq6pOzMaSVG+UWbln7Ad14q5EScI+BOw3cp1BO9dO3UOv0ddQxb1eVWVjCjc/10y500oHf0G1n6W43Zi31G7eFematoyR+7ketp8Qxm6nZgLnUYLRRLzDIxHcb0FmbMess67bbOs068svSjXbXDYCi9+A+K96hm11GnAYZkJmtwXaWbpyPdeiu7Pkr9/jbKwy4rPLfokULVd4wCvr5E+j2U7sW966r0M1WYDz8XOExmsTmB3CaVR9r0A2ZebYTv/zbvXIvAYzBAto7ez11GDyP2vadrrb2/d+nRumbVUcLV4vdR68YoJJTQu2HLFD7rTToThq9kTqlGsCKzlmH7v5522IOumHp7jq6kN4cOJva9JlG7frNoDZDFhJ81pH/+TvP0YR1hvtFo9HrlWxJozeoc51mHAgCNuK2nLSXhi4xrNz4GK3rmCJLayADh1tA8Rq6MbjqmbmWOg6Zp+RNHrxQyQMZYAHOXn2MWkzep44lj1yjoDsl1/D1hetJ0K8/4FaTAFknVLd6spwInYBTj4t9r6Eb9bt3vuGLDzlPX76lvlPAvr4l5paqAQSs3Hr8Uw7xzfm3+t9JB35D9/Ky88o1bNa208o1KlhXMcPQ+F3Ud+wWenvYQuMZUM/C+9R05Bqlnw7T9tOFq7epYeCNT4fRqy0/nHVbp1k/fkE3AyiHAGv4+Fp9TFkboJsHGZCFZUaIPtnqx3014Jr92HHMDsat7uH2mF+Wbqv0WXbANzMIx9NdXzke5EXfHOrNAF8fTijQHY62PIhbF6EbgGn1wHKD5uerHC6yWINu/QMdvwYdXkE3OkGABl4ZA44BerBgtszcojpd+HhfvH6b+s43rLjJqauow3ADrnXoBqB3GbUyCDKxDN2QGTOMALzhWgCfVgw6GgXcTXJWH6cDp68FZWk3fJny+31z6EKqn2VAaG7xcSo5doU2fnCJissNV5o3skup+fDl1DtnQ0gLsFtA8RK6uZxh7UY5Q942I4uUjH3nH6KPb9xRH4UCRBMztlLH4UtVXUgK6GTL4cvqccMML73mfkBdZx1U1+Lj0V42U0MiTSfgRBx98xq64TrVKsd4G4EZedYduGSUq3qDU0YjlhsWXLTd8IWGlTuc+IB6Pf9W+0468Bu6j124QZ1nGuXVY84HtPPIx9QtMHMLXIdQJ/A2CvCNZ799hmHhRl3AQAuDTOzD/x2DNujILKfbOs3X+QHdOoBy/8Mh+ijAl/7jc/Fs6WaIZFn00ApAIT+7gupxse/GUq7rz2k/UtCtu81YDa7s5IXMdpZxJ9nszgt022nGp+N1EbozMzPVaxs8/PoIkx/ougbdrA/Ib9WYe1X1vIRudISAB8A3IKVTwP8VHS3cSjCjAfbhcvD20AXUadQq9b8O3Y3TNyvLMeJhi3Xo1mWGpb9VwKKLGVuu3LhLbzNojFitZujAa/jGmcY0bO2mlKtZP+BO0nPOBwTXkoGB2VoSs3ZTr/E7qvgIM2hw6BZQvIZuXWaAVvv0daqsMGczIDpn9bHg1IfJmVupa7bh69tswl5VbXcd+ZhSl36kphc8f/UW5QXqRbPcXbaDDCfgZJ1w6CV0o073n1hC9QNvLzBDDQYMqJ/sFnTorOEGhbYb0Nkvf5djfMTFhjqBZ4bzbhc66cBP6K6fW0rYlMyZhm/+gAWHq3zojLqgnv2p+6jXhN1B+TH959LS84E6Ukrthi1RAzYrmd3WadaRH9CtGzt0Ky73RWYI5eNW7XSoczVtw7326dZhE7KjrzXPnGW25IYamEBmL91DIwXd3OeCQax+bBQEYEM+6InritcyC3RblYCPx+oidPNI2/w6ixutugTdkJXl9tpqYK62XkM3OkNASt9JZUEf3nk7z9CyUsP/FZ12y8ELlcW3S4bx6jneoduQuZzezjOmSsRc5AfPXCN8OAZ5E0dtUIMMwFWPPOMDxNYF5TR966kgiCAeNlzDs7h0yN1RbZpEhg2EbgHFD+jmcsabjc4Zaygxcxu9kWXIjykfDwYs/Ik5u6lthjFjy5vv7Vfzl7OsCKGH81dvK9kb5Oy29PM1ZA29MIyuF+x7Cd14m8EfgcKlAm8m3sgtU98p8BsLhm4lU/ZWahuwioeKz+084jrNye5GB15DN97gtAl87MxlljhyPSV3Hh/85uKDQDmrD53VLDX7lQWbpwLFWwGlr0D9bjZ0KXUPuE2Zy8yQ0d3HwXytH9DNbS/AUv+xpdNs1eT48Qrd7Cpihk27b6z0t9KATv7gEPEZQgGoZlDXdRnOfqSgm9fJQDmbf3qfzPJyHGYX82CMz9ckFOiuidbu4RpujNHQReunF7rfeeBRMx5UsxsFN2h1BbrNDZpu9fejHPyAbli5k3MNABu98iiVHa+cGi956FLqMnKFeg3dPcvwbdahG9PqwUeaO/l4sXT30Bb5wcwc0zcbQF0/a4ea3QEfmQFi2ucY0A3XE/aJbZC2hhoPmG+A59hSWrvfcDNJtpgmkWEjHEDxGroxqOo0YQ+1HFdKWMSnWfZ2apZaSC17TKLEwEdzKPN33zfcCZJHG9A9fcupoH97YloxJQTiwgUHUyiizHuNq+q3z/I6WXk5HodeQTdkxcCC3WMwJznPOsN1FCF8vJUMAWtwg4D7kNv4vSfYLwzEMjnpwA/oNqYMLDFmpcneTQ3GbCR8p1E/y/BvP3z2urLWN8jaoazXyg0n1zgHV5RzV25R2ynGojiNUlfRu2lLAx9EW1v23Q4kWSdeQ7cOmuY+h/sp9El6u8x9VLxCd6iPAxkodeMP6wH9ta4H9E/ov3i2La+s3ZGAbpQ75xtWfvOPZTaXPeLxYMzLGdd0/jLrmPPmbv4zji1hSA3UNejmjwX51RYaO964QcOrHzwYfv5iwaebR9to7MwDED9k9xq6YbFrHeh0O04/QKcu3aTmE/YS/JQbjFxPrUcU0du526lzfil1zzZ8PuF2cOm6Ma8z3CqaBRbkwIqU5ScNn+iG6VsDr6QrfV+dIIQ7ZnPo1ewlfN/BBXsoKccYZGA1RjW3OJbNzi6lRqmF1G7MOnpn3C4CmLcI+LgD3LAQEIAtaeRaSk4zBhopE7HATkBmi2kSOU2EbgHFa+iGG03jgLwKPAOL+TRN30gJgWkSPzx3PbiwUaPAx3T4oDQjsEJn0ohi9QYA1+/86GO1mBD2e+VutrT6hlvWXkL3gPwd1DDT8OfGTDT4FZdfCG7wV8bv2IWb1KrAGDwkhhm/W+4WS7mrlndoa78f0N2gynSYxsfBTQO+2piZZ/dRY5aapPQtxoeUeZUfm2IwNWjRYfUcYIrBlqmrqGPOVvXsW7mWhFOnWS9eQzf6He5zzNDNU+qZwYvjxyt08wJAVjNywKoP+XToZsu4HWRyH6Zfox6QGv6JBHQDqhm6rbLJMpvLHnFh4cZxO31Y3c/pmEC3k4Y8q9lErgAAIABJREFUPl/XoJsrOzdedqFXD7FdcUUbuvVVKa0+5LDL970c9xK60ZF205b5Boy8F7D4KjgzzfTQNmMjJQQsgh+dvx78SIvjTt10Si2Rjv+bjtkQc1MGouPXBxmYxxg/rL7JMpjD1qMMl5qBiw6r5bHN5+HfzHMZw0JsniaRYSMcQPESumH5xYeCKenGWwr4ZvOqoSxL15nG4LhxYJ7u5oOM2U0w5Rw+pOR4CFMm7iV8oIf9BlnbjekDp1ZfJCea0I0PRhm6sWw9Bon6BvnxG1t8PLiaKKaBhExu43fJ2mj5YWHV8o4sdGOw0Wz0WiVHwYaThAGlXnZYvGruDmOu+eRRa6lnTuWHkyv3XqBNhwIfm5qee9yj1bgSy0GG24Ek68Vr6EY5cv8DENN/dhZNjm+ePk8H+FheHIeBMpR7iT6gYN9nyG12IdEtxvFk6X799ddVucPwZ/XTy9LOvcRLPhHotioFH48JdBsrfHFjxqGXldqq+KIJ3fpIG407HnLz5oel30voxmwEHbMN2Bi54ohSMT46G7PyqPpwDiG2TjOMGRBSRq9Vcz2jE8Yy0XfuEi3YdVYtn47ZPGAlhx8wzrccVUyAAEAfd7jhghhf55Wlm10PsFom8rhgl7GgBFwKWFYOmwSWy247rHI6xPk7zyrwHrniqPqAcubW04SPDAF0uF+bEYWB1RwrZWYZELoFFK+hG24yb440LPNY9GfDwUuE2UgA1ZhO7tTlmzRj62klQ+KYLdR+4By1D5mWlZ6n9QcvKteaietPKqs+LwbUaPQ6248Kwy1rTy3d47dT01H8sWjVKQIhEzbdp7tB+hZqOKxyBh6Oo4eIz+18UuY26pW1zvYjUi5zJx14benG4Kr9SONjZ+Qdc+nztIGo47BkJwfqauuRRdQl09BRu6n7qSLQwGYXHavyLPQOLLCTnL3NcjpMt3WadeIHdMNiiT4H7hNWH1ICUvWf7sfM8dGes5XYyg1Dvz7cfa8/pNSBkt826x9SIv86XKMf4j4ZoK7LzO4o5mvClVGP77elW3eJMQ+0OB+626fdh5T6wISvq2ko0F1TzdXwOm6M0dBF66cXerTygHT54UbD4PcvmtDNr/hYXqvQ3Nh7oQ+voNsA0DJ6M8OwgLadWq6WM09fdbRa2Ol9A7qbjSym1gCywMI5WFQF8D1t8ynletEgMKdvg1Eb1DSCxuwIlQDqBCHcMZtDL6EbYNI0w5gWsfe8D6rJyvLD4onnuf3wpZQ8dHkQQiFzZuExZUWEOw2DWaMRa9RsJ1ar9rE8bgHFa+jGPN1YgbBxmjFVIPLcfc4HahYSQBZPK4fjKcOWKT/eZsMqZe4+25ipZfSKIwRAQzwsHPRW6jLbQUa4Ze0ldKOMO49YRq37vU8ter8X3FJ6TlGLIiH/8M/HYj9ou1v1mqIWeGrVd0YwLq6zi4853jHjidPHlE468Bq6uZybpFaWM6z6feYdUm83+E0G6iqm+cQHtdBFo/F7bZ+DPvONOt40c4tlWbut0/wM+AHdeMsIaLRqgwFcZre/UPFxD7MF/F7bba+hG/lhK76VzFYgimNWcfmYlzL7Dd0YYPDb9lCGLcjM8VhODqE/O9/rmpS3zl929xWf7ppo1uYage5KxXClFuiuZ7tQQaW2wt/zFrpLqUNgpgp0vk5bi5HF9G7qEkoZvJASRhmwbr6mYWoRtRs8X82BjY+0uLNF6AQhelx931Pozt9JyWOs826WBf+/M3KlWkAkGS4X2ZX+r3rcRsNWUsch85XVNxSIuQUUL6EbeoQbEVwu3hm2iJoMXWZdztkl1HzQArXEO+ZsRjk3Hbo0aN3V5YX/c+tB89SMNgA9/W0Gl1u4Ze0VdCN91DvI2yPDGAh1G1OoBkRYxKnBaF763KjvCVk7lMyYv9xtfHw4bB5Qstx66KQDL6Eb6erlnGRjuU8asUbVVZRx18y1yn9bL1u7/aZjNlZ7c4U03dZp1osf0I1WFCANqy/DNyy4ACszcHOLa46PfoutxhzHq9AP6EbeYNRh6zzyD4u/1UeFLAf6ZLbyIz505YfMfkM3f0gK2Z1+0Ae/CYHMuMYPY5hAt1NJeHxeoNtjhbq8XSQs3S6zErFoXkI3PrDDLB0thiymJgPnqxk5MCuHecO55kOWUNdRqxRMYzYTLP3erP9sajxwPjUaspSaDJhHzQfMpg6D5ip4sYISJwjhjtkcegndcLWAFTR5sJPMC6j10EXKjQCL6OAarF7ZvO9MajxwATUavISS+86kVn2mKSgHxECfVgDK8rgFFK+hG+nDlQjWWYBnm77TKbnfTGo0eBE1HriQmvWdqWTrPGK5glWANKZLBHhjpVIj7mJV1s37zlCzYQA8YVG2/8AutD8z64RDL6EbZYDBD8oDshibMR93h2GLqOnghUqWJgMXUNuhi5ReEDec+KEGVyyTU333Grory3mzGmC17jODkvvPoUZDl1LT/nNUXcXgEIs44TlAvW49FM/BgmrPPLcBePbxrKD+4xpz/XZbp1knfkF3xBrgGiTkF3TXICsRucRv6I6IEGEmItAdpsLuNbpA971qsGbXC3RXXdWPOza3IYAJftewBALGYAm13IYvVsAN6yHABLAFyyDgG/GxcM47iDO6UAGM4WJRfYoxJwixy7dX0I37G/C52cj78MXW8g5bpPQBlwyABq4ZmL9TDVCUzIHrACKwjiq9TNlbDUjM8rgFFD+gW4HolH3qQ0/kGYDNZQ2ZMPiCjIDJYNz8HWolQo6LOoKBF8oeegkFnuGWtZfQresdsvAG+AZwotwgOwYVWGlRHyByXIRu4utpmfeddOAHdCPflZb+YuUqhKXeISvqMwZTeIZRdijDHhnG2yuuC9XC4YvVs4I6ieeguozRn6e7Zr1H5K4S6I6crqOVkkB3hDUv0B1hhQeSE+i+N+hGB4rOF9ABkAZ0WW4TdhmQNcUAMsA6OmB02ogPcMf1gG2GNnPnjP+dIMTqGhzzEroBJcG8O8isy6NkLthjyBy4TgG5sm5XH2BYyRJN6Ob8VJEjUN52clSLO2GXqivQH87xPa3CcMvaL+jW86bKnssQsqs6C/cYa1nCja+nhX0nHfgB3ZwHyIRBAz+jCPG//nxiH3XczbNvlHnl9xmcjts6zfHF0h2dvjKSqYqlmz9Lrqp18emuqo97+k+g+57UV+OLBbrvHbrRGQIu3GzccXJodQ2f27YoqYq/p945W+0jPl9rDr2Ebr63Vd6tjnF8Ds1x+LibUJc7dVp1gOF7+GHp5ntzGI4c4cTl+zsBJ8fjMBLQzWmFK0+48TkdJx34Cd2cB6e8m8/b/c/3M4du6zRfJ9Bd4+4ubi4U6Bbo9r2yCnT7rmLLBAS6vYFu7hC9DNOnb6ti6dM7Z/P+jVVfoLHvr4oodHspq9t76XJHG7rd5rmm8ZyA03zfSEK3OW2//nfSQSSg2y/Z+L5u6zTHF+i27Mpq1UGBboFu3yu0QLfvKrZMQKA7dqEbnaxba3coKzfu44elmyEgkqFbQImEpdtvuZ2A05y+QLf9mw+zrmLpf7d1mvMs0G3ZldWqgwLdAt2+V2iBbt9VbJmAQHdsQ7dh7a780ErvoHnfycqNzlqgO7bLmYFKDwW6o+vTrZeFn/v8HCMM9faG8yDQbdmV1aqDAt0C3b5XaIFu31VsmYBAd+zDmJO128nKjc5aoDv2y5mhikOBboFurgt6KNBt2ZXVqoMC3QLdvldogW7fVWyZgEB37MNYKGu3YeUutPXl5s5aoDv2y5nLikOBboFurgt6KNBt2ZXVqoMC3QLdvldogW7fVWyZgEB3fMCYnbXbjZUbHbZAd3yUsw5XAt0C3Xp94H2BbsuurFYdFOgW6Pa9Qgt0+65iywQEuuMDxqys3W6t3ALdux3fBDDQxFIo0C3QbVUfBbotu7JadVCgW6Db9wot0O27ii0TEOiOD+hG52u2dru1cuNasXTHTzkzaAl0C3RzXdBDgW7LrqxWHRToFuj2vUILdPuuYssEBLrjB8b0ebvDsXILdIulW4e2eNp3GnjIPN2WzXqtOyjLwNe6Iq0mkCwDX00l/h4Q6PZXv3Z3F+iOH+gGLLG1Oxwrt0C3QHc8gbaeV4Hu6u2TWLrterPac1ws3WLp9r02C3T7rmLLBAS6q3dqeqcfa/uwdt9Y9VDI1Set8izuJfFVzihDJ+A0l7MsjiOL41g28rXgoFi6a0EhOogglm4HBXl9WqDba426u59Ad/zB2KSZ88L+MFCgO/7KWaDbeeAh7iXu2vl4jyXQHe8l6Jx/gW5nHXkaQ6DbU3W6vplAd3Rh7L1ZU4k3s+VS/z9/5mJaNHcYFcycFTZw4z5uoDtzxmaaNXsszZszmibMXFijdPQ8+7HvdvU+WQY+Pq2+5jrjNPAQ6Hbd1Md1RIHuuC4+V5kX6HalJu8iCXR7p8tw7iTQHR3ozp+5hI6v/BXdWf0QXd/4Ct0ufpxWzu1VDXR3Lk6iu0X30+2Nz9PN0kZ0c93/oYqi+6lseYNqcc3Aov8fCrrHzVhF5wt/RLdXf4lubP8L3d7xF7q5/rt0ofhlmjF7Uljp6Gn6sS/QbV9fxb0kPgcabus0P0/i0x1ODxefccWnW3y6fa+5At2+q9gyAYFue4jhTs7rcPm8PkRFn6Dbh4dUlsmeZDqf+z1an9YpCLkHVr5Ot3f8kejWeSPezeNGePsCVez6/+jEkl8H4zrl0Q66YTm/UfQE3T40yLj3ncuVeTqRR1T4aZo0bb7rdJzyca/n3QKKWLrjE0DN9UMs3dXbJ4Huyiaqtu4JdAt0+163Ywm6v/rVr9LIkSPrxPbnP/+Z6tWrRy+//HKdkBfl+sMf/lDJjM7rtaTuEd+W5r5CdLAT0cmJROueIKI7RHua0pXMJ+lQ55+q/PTsXJ+urnuRiCro7qHhVLHqAbq74otUUfg5oqNp6nms2PIKlQ1+3lX+P/fgQ0rmX/yxYZX4aye+TLd3/5PozhW6u+V3RIWfUmlV7Pwf45k/3JduzX6c2ia3rXJdNPSGNHXo/u8QZffnf3VQ8qJu/zXx3ZjIe7g6qyisF5TXzbU/+90bSuYvPPJYXMprJaOTDr7/418rmb/xzHNxK7PbOs36+dq/f0/J/Nprr9WZNvvRRx9VMrdr165OyDxgwAAlL9qvoUOH1gmZU1JSlMzf/OY3qaJCoLtOQDdbfVHRZRMd+FUHpvb4DN1Y/S26vfQrCnIBvAzde9/8gap7I9o/TPTBu0TX9hGt+gRdHvYt+vCd5+hov2eIVn2S6MpOokPd6NqUZyjvH0/RfTWss9eX30904yOq2NuSbs//Ap3r9jyd7PUsXZv5MNHp6URX91DFyseI8+WXTtzeVweU++6r3XW0YlUldLvVT22LVxd0UJfqdG2rnyKP923w/fffL9DtO3ETUSxZur/whS/Q3//+9zqxPfvsswryvvGNb9QJeVGuX/va15TMzz33XFRkLhjwLM0Z/kM61fUFolWfVlZmhu5D776o8lQ+40mis/OJTo6nmzO/Rie6vkB73nmJxjT5NZVP+AbR8Qyi80vpzuLH6WSXF+g1h/r6uc99Tsn89Pdeoh+8/Du19Wn7Pbq76pN0u/ALanq6iwOepQ/e+TFNa/IKbcv4Ct3Z9ldlaafCT9KRzs9Twqu/Cl7L94h0qAPKcz8x5LDKw7Mv/ErJi07x/7z4m6jn2yqPTsd04HSKi/NPfefHSubPPvBgXMprJaOTDh5/4ltK5ke+9LW4ldltnWb9PPTIV5TM0Wq/otE3cvv1i1/8IiptdqRl/tOf/hRsv/7yl7/UCZn/8z//U8n82GOPCXTXNej+/ve/HwmRYyINtu4nJibaVvSYyKiHmcBrWcBYWprhpuHhrV3fquL6ZTrf5+dERfdXge7zA39j3KM8hejIMKLzy+n2wsfofN//olsfbDbO7fgN0blFREdG0K1536VzvV+huxeOhkybv/5v3XtqFf/szBmb6MCQv9L5Pj9QVu7dgxuq8zsWJtCN8p5ElzdTRdETdKb7y7Q4Pa3KtWb/20j8rwNK6jR7v2Xx6bbXTSTKyas0xKdbfLrRsHH7tXr16pDtXG05KT7d4l7ie12OJUu3QLfvxR3VBGIBuqGA28f3Eq1+wBq6T02lip1/VpbminXfoVuzH6K7ezoS7fwN0ebniCpuU8XOv9CV7O/S+T4/o9vH94TUKXdaZugGHM3NyqGVo/pT2aT/oc2zkmnv0v+mO0WfU64l9GEfujnnB3SqxysC3dOqA5BXcGl1HyfgNF8js5fE50DD7UCSy1s+pAzZ1NWKkwLdAt2+V2SBbt9VbJmAWLot1RK5g3bQjRzs+gPRviZEN49RRflbRFt/YXyAeeMjor2N6M7yb9HZrs/TuV4/NdxAQuQ6FHRzZ45pA++UvkG3P0wjun6IKnb+iajwQbo0+Dt0qsdPKWfyOrF0RxC8BbplcRx+NvVQoDtEQ1dLTgl0C3T7XpUFun1XsWUCAt2WaoncwVDQ/WE/qlj3dPW83DpDtOaLdC3/KTrf8yW6Mr2zZ9BNJycQ3Tyh0qxY+w2qWPFvdHbQD+lw3z9EHbgBHm6tguJeEp9WXx0ujfK+L1jm5nP4XxbHqd481MYjbDQQ95LaWLqGTLI4ToTLVqA7wgoPJCfQHR29B1O1g25MC7j1RTWzCH04jCrWfJOo8DNUUfwU0dERRDc+JNr4HF2f9mOCf7jTjzstK/cShpmPlv2Krqz6DlWs+hTdXfczIswLXvovujXn32lGboFAdwSt3G6Ak8uNQ3Evic+BhtuBJJezWLqdWrv4Py+WbrF0+16LBbp9V7FlAgLdlmqJ3EE76N79V6JTU9R2d/kjdHnkU+pDx4/Tv013lz1MhIVrTk+jO8u/Q9eWjnTMrxvoRqcOuD7T80W6MetRurunneFmsvoROtX9pwLdAt0RrwNOLjZi6XZ89GtFBG6/xNJdK4rTUgixdFuqxb+DAt3+6TbUnQW6Q2knAufsoHvNQ0S3TlBFSWO6mvt1Ot/vF3RxxN/p2spMurXyn1SxO4EIbiZFn1UwXnHtUsjMcqdltnTnv7+EsGEWE7akFYybQ6sm9aTbq78Z+JDzW3RxyPcIxzlOtEK3VkFxL4lPq6+5Xgl0V/94VyzdIZu6WnFSLN1i6fa9Igt0+65iywQEui3VErmDVtB99ypR0SeJKm4SlSXR1awn6HzvVyrdSI5nEe1tYOSx6NN0oc8LdGPb7JB5toLuLQsb053iR+nG2m/R7cLPkz4F37RZU+jGWkydWUEVG39El4Z/m9aM6CrQHUFrtxNwmgFV3Evic6DhdiDJ5S3QHbKpqxUnBboFun2vyALdvqvYMgGBbku1RO6gFXQj9e0/Izq/jOjEeLqz6Et0adQrRp6ulhJt/y+i49lEF4vobuE3laUbFvBQPyvoBljf2fRDddndtd+j4+N+QjmT19LYGUV0fPmLdGVfL6K714kKP0HnevyIygf8Q6BboDuidcBp4CHuJaGe+tpzjtsvcS+pPWVqlkTcS8wa8fl/gW6fFWxze4FuG8VE6rAddB/sRLT958asJPvfpYpVnycq+hTR2kfV8u+wQNO2n9ONGd9VM5jcLFsRMsfcaZndS26s/rryDaePt1HFuu9SReFn6HbRw3R9V0Oiu9eIDvWgOyuepHPdfkQbh3eIKHCxZU8P3VoFxb0kPq2+elljX6Bb3EvQsHH7JdAdspmP65MC3REuPoHuCCs8kJxAd3T0HkzVDrpvXyDCypP7mhHd+diIjhlL8LtzhWhPM7qz/Ck63/u5e1qRcuncAcovnM7ODNw7kBb+OzWZKooeoMupz9DZ7i/GxAwmAt3VIYxBVdxL4nOg4bZOczmLe4nRVNXmv+JeIu4lvtdvgW7fVWyZgEC3pVoidxDQvfEFotWP0pXMJym4DHwgB7cXfZuo8FNEG79HtOFpqtjwHfX/rblPKLeS8z1fpsu5je5pnu6l0wZSxaqHiIofpYqtvyba/n+JVv8b3V35Rbo86kfKyn285y9kcZwIupa4sfIyhHEo0C3QHbmGK7IpiaU7svqORmpi6Y6w1gW6I6zwQHIC3VHQe2Hlgh+6lSvW9xnuohnqOtI//DTnSdxL4hNAzeUo7iXV32yIpTsKbXaEkxRLt1i6fa9yAt2+q9gyAYFuS7X4dzBOgRuwOzcrJ+rTBgp0V4cwBlWxdMfnQMNtneZyFuj2r3mOlTsLdAt0+14XBbp9V7FlAgLdlmrx9eDdC8eUa8i5bs/HXXi016+qTC3IIBCp0C2giKU7PgHUXI/E0l19kCXQ7WvzHBM3F+gW6Pa9Igp0+65iywQEui3V4utBLNt+dV5/+nhqx4ht7yV+n/L+8RQV93idtg1NqfG2bPSQqM5gItBdHcIYVMXSHZ8DDbd1mstZoNvX5jkmbi7QLdDte0UU6PZdxZYJCHRbqqXWHeQPkcxTBnJHHi+hW0ARS3d8Aqi5Hoqlu/ogS6C71jXP1QQS6BborlYpvD4g0O21Rt3dT6DbnZ7iPZZAd3V4MQNerP3vBJzm/IqlOz4HGm4HklzeAt3x3ho751+gW6DbuZbcYwyB7ntUYA0vF+iuoeLi7DKBboFuhrZ4Cp0GHrIiZZw1RDXMLrdfsjhODRUYB5fJlIERLiSB7ggrPJCcQHd09B7pVLnTEveS+IFvJ+A0w7NYusXSHel2JVLpcfsl0B0pjUc+HYHuCOtcoDvCCg8kJ9AdHb1HOlXutAS6BbrNsB7L/zsNPMTSHemWJDrpcfsl0B0d/UciVYHuSGhZS0OgW1NGBHcFuiOo7CgmxZ2Wn9A9/L39xJsTyHE8hE5x9fNu/V8j9SFlKDn0c3b7umzmfSfgNMePlKXbLIs5H+bz5v/N8UP976QDv6DbnGer/+3yrce1i6Mfd1un+Rrx6Y5iQxqhpMWnW3y6fa9qAt2+q9gyAYFuS7XUuoN+QTcAo/ukvfTm+DJKHltKSbkl1HJsKXXML6PBU8urADXidpu0l9qPL1VxG+eWUJu8Uuo8cQ8Nf69qXAYMc+gWUPyEbkOOfdRufBk1zS2lRjkllDK2lDpNMOTA+f4Fe6nZuDLHrUN+ma3sTsBp1o3f0I0yQn6bjUP5laitdV5l/nH+rfHOMr8dQmazTE468Bq6UXY9Ju1xLLeWmtzIM67rPmmfqtvQT6PcUmo+toTenlCpH7Ns/L/bOs3xBbprXfNcTSCBboHuapXC6wN1DbqLi4upXr16ITevdWx1P7+he9CgQfTII48oOV999dVqWTh48CClpKQE4yAu/sdxv36vvfaayk9aWppfSVBmZia9+OKLwfLFPnRx9uzZamk66ajaBTU44Ad0A7LeyS+lN3KsN0B138l7A9bvcuo4vsQ2LkB92NR9VSCdIUMP3QKKX9CtwDLPXo6mubtpyOQyajd2tyFrtn1c1tvgyaWWcjsBp64X7PsJ3YDKnhOsy7nPhBI1cBg4iWUtsy1nQ+YSGmIjs1kmJx14Dd3DpuyjZi7LrvP43Upu4zmwlxnPweApey3LGPK6rdOsm0hCt95P2bl2RLL9sstDDZrEapdADvTJ6IOs2mlcsGPHDvrnP/8ZbNe5vwIke/nzC7qdmAPnKyoM4NXL3u469Okc/17lF/eSe9VgmNcLdFcH8DBVWKPofkK3Dp14aM3QjQbs0UcfDTZg+oMdquGrkaDaRX5DNwYNuiz6vrmRctKRlu172vUaugEab+cFwDKnlAYv/ogOnL5G2z+6TOsOXKLBiz9U4NUAwDG5jDpqcRfsOksfnrtOh85ep2Wl56hNQbmK2zJ3lyN4uwUUP6AbMrfXgHvEiiO0++gVOnz2OhVsPEEdpx9QcrTK2U4tMzar/Zyio1R2/Art+Ojj4Ib/sXGb12/8NjUwYaji0Ak4OR6HfkL30Cl7KSVnp5Jp5PIjNLb4uNpvlL6Z+o3bQjjfd9xWdazhuD1KPrPcWw5fVuffyCmh/nnWMrMsHDrpwEvoxsBi0MTd1CRrm8rn3O2nq5UdyrHH7EPqfMfszWqA1UGrE0OWfEglR6/QB2ev04ytp6nLrIMqbquxu23rtts6zTqJJHSjvUL7BdC0gquXXnqpSltnbuPvqdHSLub2yy/oBmRzXwSDidUP/ZXeluv7aMe9BG+BbrF0W9VBT49xBwRLSLR++kjL7zzoo0jsW21+5wH39xO60Sg9/fTTasO+uUH+/e9/rxoxAPaUKVOUDtjagPidO3f2RQV+QveCBQuCDTM6Ki5X3Toyf/78oFxOOgpGvMcd7rS88umGNbdJAMIWl5yj6VtOUcrEvQowusw8SGc/vkW95xlw8m7uVmqcbQDbqr0XaOqmU9Q8EDdn9TEFrU3zjWv7T4TV1N7P2y2geA3dyBOss0k5xkBj3YGLlLf2hJK3Sf5eBVgYdKD9SsjeTc1GrVX7s7edpjk7zqh9tmynLfuITl66GYi7i/qO3WLpYuIEnAxhHPoF3ZC9d/6uoAwnL9+kdlP3q/9bp61QAA0Lce/cTepYUt4eunH7bnAQwnIHw+zdtjKzLBw66cBr6B6Qv4MaZ2xRcmz/8DKhfgbzbXqj82bGekL8RoG6vWLPeZqy8aSK32BsGU1Yf5JOXLxJibnGG4IBE2EZr1633dZp1kmkoFvvo+zePN53330h2/h7bLaCl3P75Rd0c7+D/sruxwYS9FcFBQXV+quBAwfaXRr2cb+hOyMjI9g3oZytBld6+UPv3JchhA7Qd+E+Xv10/rIa4CGdel4lJvehoNUHDVy0fnqh+50HvUL7nVao+/sJ3YBmWBAYrnXoRiOOBhsPrg6hyGuXLl3UcT1+KBnCPecndDNco4E2NxzcUOmNcygdWcq14SnjdfTt85an7Q5yp+UFdAMc+uUbEJ2QW0Yzt54iWC/x7NbP2K5CQPjUTQaAtBiznhIC508FYFOBTJYBcoV7z1P/BYcbFomTAAAgAElEQVTVde+O3W5rEQR0uAUU76G7nLrm7VB5bD5hLwGclbzZBoQnT9irVN86YLVvPGKNOg/oHhKw+v8rEHfAwg8Jgw9cnzR6g7IUw4rOUMWhE3ByPA79gm4Adesco1wzC49ScflFlffE9C3UZdRKGjypRJWZDt3lJ6+qOMFyRlln7aL62bupyah1tjKzLBw66cAP6G6kQXeryfsMObKN/EMGbEr2McXUNcd4o9Eobw+NWXm0UuYAoF+/dZfefd+wdncdC+u+VTnXC9br1GnVoZx1wWGkoJvb7VDGD7TVdm28XVtUk+PcfvkB3bqVG0YTux/6KmwAbv0H/eC4VZuvxwtn32/oNuuR+yYdonVG0fsy3eK/ffv2cMQKGVfnLz09/SKBbl0b97hfly3d96i6e7rcT+jmjHHj7Rai2ergNj6n4zb0E7pD5YEtJTp0c3zXOlrzSNShG77X7+QargQKqgKA0SCtiBqmFirwyCg8SjO3GRbeJqPWq2OAD4bNhPQtlDR0uTqeuuwIFQQshG2yttDQgj3VAJSBI1rQDfeJdtkBmQOWS8jeaPAieiPLAO8j529Qx+mGBbjxiGIlG6CNrfiJIwzr95ztZyij0LCgthixmgaM325jAb1PgzHnqQ79gG4MsGCh5UHVgdPXqccc4w1G8+ErqE/uJgKUAyatoBuQDT0lpG+jpLQiShkwj95NXUID83dayszlzGG0obv5hD0q/2/ANz97F6EMmwxZQm8NmkM9s9bRm1mGdV9/DpKGLKP6gQElXGx6zjX01Snb0BXLxqHbOs3xIwHdgE8YRQBjgFKnn+v2y+lGNuf9hG6G5lD9jQ6gZmDFOTYg2cGijVi2hyMJ3bpsBw4cCOZJP67Lxf0z3grox4MX1nBHoLuGiqvpZXUZulGJeaQJMMP/kfrFInS3aNFCWQ5gNfbjFw3ohmWfLSVmyz5kdN1pxQJ0w5UgZwM1TSukhsNWUsOhKygptZBa9ZtFCRmGNbho3wUaueKIApZmw5epENbAYxduBCBmNzUYs1HtL9p9jnIDPsJtMjYoNw7A3tw5GbRk7qAqmw4oS+YOrHJu+qzJQVj32tINd5oeGcXUNHUlNRq8hJIGL6aEjK3KcgvgSpm0lzYduqTkaZC1g5KHLjXkDLoklFD9dMNXuPzUNWpdYFhQO4wqVH7E1m4H0YduDLDa5xplOnTJR7TzyMdKrvo5JZScvola5e6it/JLFXhbQTd0A3cThtLE7N3Uc6zhA84QGSqMNnQHLd3BcjRcRQDbGCz1yFhDyVqdqJ9eWScScktoz4lKlyNAOgZvZnn1Oh0rlu5nnnlGtVdu+yLX7VcNG3S/oFtvl80wrWcVAw+79hs+4PEC3bpMvM+DDreWejYe4TqBbtZiHIZ1Gbr5YdZDfIwXiV+sQDdeWWFkzaNo6ALH/PhFA7rZ7cTOOuC604oB6IZVEx/CvZu2VFn83hw4mzoMmkuN041X7YMWfag+kmTQajNongJU/F+09zwNXGR8ZIn/33pvv/Jv7hr44OzNMWuUuwIgFMCtA4nT/voFbYJA4zV0w5oL32vI3GHwPGo1aH4QJCFDzurjlBCwgDdKW6300XLgXGrW931q1ncGNes3W8VPzt9DR88bA4+EzB0K5O0s+07AaYY3ry3dKAO4jgCUUVb4iHDYEsOthsuWw275u6lXjjGIAmTjN2/nWVqw+6wC9eMXb9DogPtFcu5uBenm/Fv976QDv91L8PHnlI2naMPBS3Tl5l0aFxgcQu6e+buUm0znEcup45B51GbQ3GCdaFOwTw0kjbccZdRo9Hrqk7PR0nVKr9exAN34voYhEu0V2mKEoQDcdftVwwbdL+jmj95h9NINX1ZuJqwLQCdbhNFn8XWwlHsFoX5Zuq3Uz3K5gWh9kGJlPLK6v9tjYul2qymP4tVl6MZDjAqMBx0PLsO3X9CpF1msQLcuN/Thpa+YLi/2Iw3dsIRwmdpZU1x3WjEB3fuVxW7ghF0KvgGjrbONj8/wMSU+omQ/5sZpRfTOsEXUhN0tCsqpaN9FOnDqGuHDM/zwsRkgBh8gdk9frWaEYMvvpRVPuAJvxEufvs036EZ+YKWEzJito+Po1SrPHaYdoNOXb1HHacbMJfUzd1Kb1BXUM3MtdR9TRF1GrlCg3iJtlYqftvwILS87r/YbjV5HGBzYTZXoBJxmSPUaupGvDmMNK3ePOR+ogZTRTsN/v4RGLv+IOgRmbHknezP1yDLciDB7yYdnr9NgbXCFj2qv3LhDyfzB7ATrjwrNMjnpwE/oXlpylmZuOa3KCvWz5eR9BAjPLjJcg97K3abeyqg6kbeVOo0x6kTLyeXqjU6q5vffOm1lCDei2PLpZis3t1l6CDCz+rluv6wudnHMD+jWAVKXkffNUIn+mc9ZhVZugy5Es4wSKejW/bPd8Ab3ZRhoeDXAYAUIdLMmIhTWNejGAw/LATbdZw77PHIOZVnwqlhiEbrRoMEyrOvFK3lxn0hCt96ohSpP151WDEA3gxFAFGDWZbxhCQWYAEombzA+oEzM3EFvDVukABTg3TDN8HNGvH8F5q/GzB6YWg3HErN2GNbAKZXzdbu1dutWbuTPa0u3LjMs0+9mbQjCGPIOV5ohiw0rcMOsHcpnGbOdYAo6vBVIDnyct7T0HGHKPVzTEv7c+TtsfZudgJPzxKHX0K1mawnMzLFm/8WgC1DCaMOPGVM/9gt8ANshYx11zzR81t/IqZyzOiFrByWMNizg6w9eol4B/+bOuVstPypkWTh00oGf0K38uANuJfyB8KgVR2jhrrOq/Fpkbg24QpWrAVnX7Kp1YsTyI4RN1e3sXWrAxoNJlg9hLFm60V6xlRttMCy5gE0YQhg0rdpl1+1XDRtyP6CbARJyAZghK6z83P9CZjNY6rpAPI6Le7D1u4YiVrksUtDNOoC1282P39jiDYFZN26uDxVHoDuUdnw4V9egO5QK2eobCtJCXR/OuViBbs4zBiM896tfLjaRgm50Tjz3K8o01M91p3UijwhbmD/utLyYvUQHhn6Ty6hBYGaS97eepsJ9xqwcAI0Wgxcqn1dYAvFqHW4ZjYcup4SRhkUUcWDt5hk/YCE2PiqsOsPDpRVPVgETHVKwb7ZyI3++QveUvdQrax01HrmWEiFL4KO5YxdvBmXplQeYLlcbPhpMCMQ5euEmtZhk+HO/ParI1p/bgLHo+XQj753GGTPUvDVtP52/ertykJFpHNehu0H2TuqSuZ4aj1xDCRlbqH76ZqqfvoWa9JtNDQJvOcatOU4dZxhvBNpnbbb0b9brlhsdeA3dKKvWI4uUOxTkwIYPI5N7T1fyY6pLngKycea2QPmVK3cZ1PEmI1YH6oTxhmDfyavB2Uu6jcMHs1XrtiFj7Fi60ecAIAFhOlShXWYYB3iaf67bL/OFLv/n9svuTaHL21SJxv2sGSAB3jzAAPyG+jF0m+8R6ho35yIF3eH0tejPWC/Qkdc/gW6vNepwP4HuSgVxY1AXoRtaQKPODXylVrzbixR0c0eEDszKOqRLxHGd4Fy/Jpx97rS8hG74OTfLNazcw5d+RPhAECCNrenQZQRfVwA3rOH4ELF39np6e9hCaj5wnoqTMmkfwYKK+IljNlPX0YXBjyh1+HKydput3LjWa+gGLGFJ70a5JWprmLObGo3ZRK16TaGGw40ZW+A2wtPGvZWzTYEYZO821phuD3NbYyEdyAvLKT7Cs/PndgOcuo6w76WlG/lqGVgkBm4SWMyIy5ZDvNUYH5irHMeaZ5hn8iijpiOKCbOc4Dyge+waY1Gddhkbq7gRmWXh/yNt6UZ95QGSIWcJNcjYSu2HLlIyALp3HTU+Jm2UsVW533CdSMopoUYZm6lV76mUNMyQedb2M5S/zpjPHbPf4Jlh2TjUB5HR9ukGPAKs0A7p0I22ht1OrPqlSLVfXkI3+zKb5dHdTkKlp8O5l1Zu6DoS0O00kDL3L7q8Tv2Z+Vo3/wt0u9GSh3EEuiuVWdehG6/54h26ea5xdGBufOUi1Wl5Bd2AybZjjXm28dHYqUu3gouhJI7ZQs1Gr6PWOTuoXV4pDSzAUvDlCjDh/9008MEl5vJm94SU1FUh/ZvtrN1WVm7AjNfQDQhtkWNYLxk6EWIhFZ4Wb8+Jq5S+ypiruV2mAZX6VIPwBV6023BNaDJ6fUh5IYMTcDK0cegVdMMFAm4xKQGInr71NJ26fJPKT11VwAno3HfyerDBYt/lpqPWKTBtMK6MWk02VhlNzN5FmM0FusJbEF4wqUP6WssBFsvCoZMO/LB0M3S3VQsAGfPPJwUGIPiQNFiGI9dSi0zjWwZVJ7KNASdgPCHwNkAfmLRWA43Sau5EsQTd3PdYQTdbRc2QiooQqfYrFAQHK6TLHbbamuXRLbqh0uNBiNdWbmQ/EtANiA6nn+VZxVA3/PgJdPuh1RD3rGvQbedLhQeeX1mZG4MQ6qvxqWi5l/ADD1nNr/D4HBpFP35+W7p1S72+2EAoWSLVaXkB3YCyvmruZgMydh35mLBCow6jxr4BLCljjcVTAN69xxuuCTi//aPA9HNZu+ndEctCulrYWbutrNwANi+hmyG03RjDZ7nP/EM0f6cBzywzZjDBr/1UAzY7jSlWM39g9g9eVnztgYuENwK4puWIwpD+3JDBCTgZTDn0Erph8W0+pqqPMsvK4bYPL9Ok9Yb/Po4lD19BCVlG+e47eS3oRoNzSePK6OK129RonOHv3S1jTUxauuF/3zQwrzzcZzArDcuLEO5Q/DajRepK9dEsjneeeZBWBD6Q5fh4k4Nft9kfqHt0CNQJs193LEE3+hy0u6HcS2AUMf8i1X6FgmBznpz+5wGGGZp1i67Z2s/31PsoWIy9/kUCul9//XVV1vDTdvNjV0mwix8/gW4/tBrinnUNuvVXWPoHK9wQoOHz42E2F0G0oFt/tYUPVgCq/CELP9w47sfPT+iGVZsHTcg/OgnIpW9Wlu9IdVpeQDes3D3GGQvFtJ9qwCbKCR8JLtxduWUFZnlIztqugBpW38qVDY8pdwMASuMRq5WPtNUcxgyUCM0zmRhW7q3VXtcjrtfQDXjuPNpwI0Ge4TIAKyaW/caAA7+JAQCFfzNmL4FLDT6UxJzWuObc1duElSux/06I+blZ5mhCNyzdb45aTQkZ29X84phjPLhlGm84UNb8puKNjG3UZvB8SgqsxImFkD44c12B6OKSc3Tp2m1iizjcNTDPu5WrBcvOoZMO/LB0tx5RWc4o211Hr1DBhpOExY8gM8oP25upy6lT6hKqj9Uqc0opq/AoYQD63uZTatXOO3craEZg9hPUAczzjjrBsnEYS9CNdoqtn3q/hLYMfRLaNivXgki1X15CNw8wIJfVh5RW1n7uj3QrNx/zMvQbulGGXM4YQDj9dEOSX1wi0O1UCh6fr2vQDfXpDz0efH2zm5rJY7VTtKAbcujWAl123kcH4MfPT+gOVaYsl9XrOded1pbniTZ8kyiKy8ADlroF5mRuMLZMuZV0nH6gWthlqmEZbpKxRcHngIm7KCHH8AFvW7Cf6ucaVs/2qcssP6BkKOHQbO22s3IjvpfQjfthQABQTBm6lOrnGhAN0IKFs/ucDyhxrCEL4KrlsKVqTm9c03mssSBOw3FlBJ9uXJOYuV1BeSh/bqTpBJysFw69tHQbiwGtIczB3qbPe4TBGjb4sLO/covJ5dRovLHwTcrghca87YPnUYOApRiyvvv+AaUj7GNLyNhG7YYuUjO6WH1UyLJw6KQDr6EbM7Z0G1NITYYbUzwiz/jQt/+Cw9Q4ICuONR+2TEE0Blcthy4mTBXJMmLAgVla9EWBUoYtC67eybJxGEvQjfaW3Qi4vdJD8xLo3D67br/4gjBD/ibFS+gGePJgQpcR+xhc2E1bq/dbfgGo39AdLkSzuyTegPj1E+j2S7M2962L0A1VoPLrDz723Yw8bdQY9uFoQjcyC7DmaYi4scP/dg1e2AJaXBDX0B0DUwYCugGgACgGDQ4LZnalD1b8nG4XfY5uFT1CV1c/SXsW/4YmTR1LvfO2EU/DNrQgnW4XPkB3Cj+rtruFnyXzhnOzZ2dXsQyytTuUlRswA+j+8yv16ObyT1a7r56OVRoMQ3oIQITLBT4OTRkwlxIxbV7Ah5dlTxiziVIGzqMuo1Yalv2CPfR2tvnjwlJqOnKtgnK8MdDTMO87Aac5vlfQjftCXli7oUd8AIsNM7YASJunVVqCITvmV397xEolEz4ObT9gFjUcuZbqB1xNVJycEkocuYFaDZyj5i8H3JrdLMzy4H8nHXgJ3UgPZQIXk3eGL6bGw1dQfVMdh5W+6ZAlaoCBtxiY7QRzsbccMIcSMTViYCEhrhOI32zQAlVvoE8rmWMNutFkwnig90swFKCvsvvFI3RDFoA33Ev4o0rANvofq7eRLLvfVm6k4zd088AKZezmxzL7aQwU6HZTEh7GqavQ7aEKa3SrSEB3jTLm40V+QreP2TZuHQPQDSDDB5GYAjCl7/vUvM90tc2fmEA31jxNdH4JUcVdI79X9xGVt6KKovtp5pRB9NbQRZTSbyZlpHekK5t+R3Tnqu12Z+tvqWT8/9KM3IIgnLK1O5SVG/AEWPzbz+vR2cJXiO5cCZHG76qlYQV/Csim7FMWeUB1+wEzldW3Wb+ZlNxvlpqxAsdwDtMeAt5gyQasth08n5r3maG2lgNmU+cRy2znbNbTdgJOPS72vYRu3A+ACDkwyMIGyz0GHphlptXAuarsUf7tB81VcsI6DrAEeGOFUljGm/ebRc37zqLWvabQmwNmKWgHqLqxciMPTjrwGrqRJmRF/YbrSNu+06lFnxmUPGAuteg1ldr1e1+VX788YyYSxAV8QyeQD3I27zdTrUDasvd71L7/+wrKuU7g/uYtFqHb93YszAT8sHSHmYWIRvcbuiMqjMvEBLpdKsqraALdXmkyvPsIdIenr6jHjgno3q9mngBQAjYAmpPy+9D1tc8R3ThMdG4J3dn6V6pY8y2q2PMW0d2rROfmU8WqT9OYUdOo66hVNCm/N13d8kelzortf6SKLb+qvhU/Qh+P/A860P/vpE+ldmTZTyh9urUvNwMNQ/eZwp8RUQVVbP9T9fsjzSppVAcivh+HgFCAZZ/cTcq9ALJjw0qaOIZziIP4bB2HCwJkRjz49cKSCljje9qFTsBpvs5r6DbfH/9DNkAm5IA8kKtn1jolN+TFBvgGlJrlBsjCN571Y3V/8zEnHfgB3WqwMWWfsmIH6/jIFcpCj7m4MfDQy4/rBOoc6wXWb6xIivh6nTDLh/8Fup1bVYFuZx3FewyB7giXoEB3hBUeSE6gOzp6r3GqMQDdAAXAFSyfcBMASB1c/jeiY6OJbp5S1smr2V+ny6OeotuzH6S7O/B1fAXRpufo0tBvU0beKpr1/gi6tvXPhhqKHqSPRz1Fl9Oerrad6/ajatCtL/duBTE4ZoZuKvo3+zS6/zCQhjN0G7IbFmBYsiE7NoAmQMzsPgAgw7kq8RzcSlgmJ+DkeBxGArqRllkm6AH1gfMBHaj6oekHcXCdWT98jV3opAM/oJvzYq7jdmWM+ArUA283qpS1RZ3g+3Mo0O3cGgp0O+so3mMIdEe4BAW6I6zwQHIC3dHRe41T3fCUYRm7/kFYt+BOy4vZSxgWGDbS3ttLFYWfIjqeS7T7H3Tjva/SqR4/peM9/4sOpv6NqOgBA7rLW9LV3K9TcVoXmjM7vQp0n+/9AzrS69cKfmHZ1reikb2DQKenHWrfCrq9ToPldwOSBogCRve7lsUJOM3yRwq6dbmd5GG5zXl1+7+TDvyEbs4jy+Akqzk+/+8UCnQ7N2Xcfnn5IaVzqtGLIe4lFZbK92cSYcukav9Bge7olLFAd3T0XuNUsQT8kVSi2xfCugV3Wl5DNwPFB8tepfOLf0y35j2prNlHe/+aCsbNofz3F9ON1U8Z0L3rb/TxmG/SwX5/o7lzMjTo/hzdnvdVurXyS3Sx+AXavawJzZo9zjWcch70sDp0f97zNPT0/Nh3Ak5zmpGEbnPafv3vpINIQLdfsvF9BbqdmzJuvwS6nXUVrzHE0h3hkhPojrDCA8kJdEdH75FOlTstv6AbALE+rROd7v4SnerxCh3u+wcFzTuWNKKbe9sTVdyhitWP0YV+z9KRPr+tCt3FD1PFwV5E1w4QXSwi+rA/VRR9jubMyaoxeFeD7uJHbNLIrHEaDE1+hU7AaU5XoNv9WwSz7qL5v0C3c2vI7ZdAt7Ou4jWGQHeES06gO8IKDyQn0B0dvUc6Ve60/IRugEvO5HVqGzNlJ+XPXGLMPnHjI6JD3ejW/G/TuW7P096B/6oK3VDG6elUsfNfRMcyiSpuEZ1bRFT4SVowaVSNoLgadNum8akap+E3qAl0R2f2Er/L1Xx/gW7n1pDbL4FuZ13FawyB7giXnEB3hBUeSE6gOzp6j3Sq3Gn5Dd06UJxZ9QLdPpxKdGk9UeEn6EK/79PJXj+nuVk5Crqvb3mV6NYZovK36M7Sr9ONyV+im9Mfpoo1TxrqKU2gq2O/RQXjZocN3gzd5wp/QnTrtE0aFUSliYE05oSdhi6rH/sC3QLdVvXquZ+8qhZSS01NjXQzErX0uP0S6I5aEfiesEC37yqumoBAd1V9ROo/ge5IaTq66XCnFSno3rPkf+hmaRPD93zdf9CVnO/QqR4/Cc4SMnNOHt0s/CJVFD5IdxZ/hc73eo6O9/oVHe/5C7q75AGiq6VqNpRbc79LH/V5tcqUgVYgYj4G6H715Xp0adFnQqRRYkrD3ewl5rT8+l+gW6Dbqm4JdEe3LY1E6vIhpXxI6Xs9E+j2XcWWCQh0W6oldg/u+L9EW34U1WXgrUBAP7Z2URe6vuGnSod3t/+Jrhb8O53t+jyd6Plz9XGlHhdAfbrHT+lUz1eU28mYKTvo/PJniI5lER3LoDtLv0anu79cI+jmpZ0P9/qdKY2ddH750xZpCHTrZRML+04DD/mQMnabKi9zxkYDsXR7qdXYupdYuiNcHgLdEVZ4IDmB7ujovcapxtiUgWYww6wjt4seJrq2jyr2v0O3F/678uM+0esXyq3EHH98/nLD3SQrh+AHjvOlS143gPjiGgXdmH4wZ/LasNw/YOlm6M7Jme8yjXVhpWGWxev/nYDTnJ58SCkfUta4XYnxCwW6Y7yAPMieQLcHSgznFgLd4WjLu7gC3d7pMiJ3imHozp2xmm4UPU50dhbRyUlUsfJRwtzYJ3v+XM1sokNiyZL6dKno+2rbt/RvVWD3oxW/JTpVQHR2Ht1Z8u90vNcvw/brBnSP7XQ/HZrxEF0sepaMNCqh7KMV/88ijdjy6xboFvcS/ZnhfXEviUhLG9VExL1E3Et8r4AC3b6r2DIBgW5LtcTuwRiG7hMr/4tuf9CH6ONtREWfoktDv0Wnur9M5QP+QXAbYWhAuHFRe6KyfxGdW6YW+1k2brA6nz1jHVHRJ4juXCY63IOuT3mmxtDdL/mzWhr30bJxg7Q07iO6c8mUhkC3XkaxsO808BD3kthtqrzMmVi6vdRmbN5LLN0RLheB7ggrPJCcQHd09F7jVGMUunctaUg3dr6uFsGp2Pgs3V3+CN1Z9FW6tfjrdHbVy3Sm8KdqWzu/vQLf8TOX0e3iLys1VOxtRRWrPkPXlj2mZjlRH2DiTtt+Qx+P/A8173dN3Eu+/WQ9ur7yC0ae9ra2SKOCKrb9Py0NcS+JBdDW8yDQXf07A7F017j1jJsLxdItlm7fK6tAt+8qtkxAoNtSLbF7MEah+0bRl4luHDL0dnEN0YWi6tv+9vThwj8GP6Y8vPz3RGX/a1xz84Th7oEpBPE78BbdWfFt9QEmVrdMnVbpGqJDmd0++3QvHva5QBoVRNXS6GBKozrg2N0/EsedgNOcB/HpDq+OmPUXrf9lnm7jkQ/1VyzdobRTO86JpTvC5SjQHWGFB5IT6I6O3mucKpaAP9Au5paBV9B98C3lrgG3EMtt9x/p+vT/UB9WsrvJmQU/p4oNPyDa34qovAXR/jZUsfFHdGf5N+l8jx/Sme4v0ZZhbaq4priBI4ZufEx5et7PfEnDTT7uJY5At/h0W9UfsXTXuPWMmwvF0i2Wbt8rq0C37yq2TECg21Itte4gW4r8mKdbt9TF874V4ETzmEC3QLdV/RPornXNczWBBLoFuqtVCq8PCHR7rVF39xPodqeneI8l0F1PfbDpNCgI143FCoq8OibQLdBtVZcEuuO9NXbOv0C3QLdzLbnHGALd96jAGl4u0F1DxcXZZX5CN8DgSK9fK7eRc92ej/uQXV+sgCeSxwS6Bbqt6ptAd5w1vjXIrkC3QHcNqk14l8QSdD/88MPUsGHDOrG98MILahGRp59+uk7Ii3JlAH355ZfrjMwPPvigKufvPf9LevlX/+35tqz1z+hE5xdiajvW6YeELZx8Hev8Y/rL7//quX5qovOKVZXWeTfXf+e5n6syfuDzX4iJ/LvJs1McJx088R/fVzJ/6fFvxK3M+tuXn7h4Nh957OtK5rrYfv3hD3+oE23266+/rsoY36QkJCTUCZl/+9vfKpm/8pWvUEWFQHd4BF2D2LEA3Wz15ZXsJKwXfPBFF7Ghi+Gt6tGqtHr01OOxkR+pF/6Vgw6cdVXPdUEHOnTfd59/9amu1iGRO77q1P333y/QXQOGDvuSWIBunrLmy1/+MvXt27dObDy6fP755+uEvCjXZ599Vg0m/vSnP8WdzCcXfFX5Juektgwr73h7g86nadOmYV0Xr89B586dgwPGV/+nDf3x9TfjbqsorLR0u8n/S796Tcn84ENfjDtZ7eRz0gFb97/+1LNxK7MO3X9yUU8ff+Jbcdt+1bQ9qcvtV48ePepEm92gQQNVr5988kmB7rAJugYXxBJ0f//736+BBPF5CVv3E8eIB+wAACAASURBVBMTbSt6fEpmn+vXXjPgJC0tzT5SrJ7Z8rzxQSBWfQzjxy41xcXFYVwVv1F1n8hBE3eHPeWglS9tpI+JT7f4dFvVOfHpjt92yW3O9fbr6tWrbi+L63hs9AR/iXtJBIpSoDsCSrZIQqDbQimxfEig21Xp6J2WQHdsLfpjBZJ2x5wGHrIMvKvHIe4jsdFg9erVcS+LGwH09kugu1Jj9Sp3Ze9eNSDQfa8arNn1At0101vUrhLodqV6vdMS6BbotoP6WDiuu5e4mbJSLN2umoC4jqS3XwLdlUUp0F2pi3veE+i+ZxXW6AYC3TVSW/QuEuh2pXu90xLo/v/ZOw8wualz79u5NwESIAFugIDpBgIJNTiEkAQI94a0my/hptDcMOAYML0bN4x7W3ev1xVcce99i3v32t5d997reu21t8//e96jeWc1Ws2MRqvRjGZePY9WWunolP85Ouend14dCXQnAlyHyoNAd+RbWizdkTXyeghxL3G5BgW6XRbcn5xAd3x0t53qvnbAtiZAyd6oouBBS3y6vQOgkVwrjBDXvNUI9SLS9Tfdid4TdnrSj91YpkgaiHtJVN2AZwNz/yXuJZ6twogZF+iOKJGzAQS6ndXTamwC3VaV8nY4HrQEugW6jWCbyP8LdNdsr+Je4u2+2Eru9b/UiXtJtWLiXlKtRa33BLprLaGtCAS6bcnmuYsEumvCSyLDJuUtEnAa8y+Wbm9a98W9JHJ3yv2XWLoja+XVEGLpdrnmBLpdFtyfnEB3fHR3O1UetMTS7R34FuiO/OAh7iVu9yTxSY/7L4Hu+OjvRqoC3W6orEtDoFsnhou7At0uih3HpHjQ8hR088dhYP5J4HBy6n+elRcpvfOgYbTeR3rwEOgOdxckzznuvwS6k6dOjSUR6DYqEuP/BbpjLHCI6AW6QwiTqIdT6UVKgW7tQ0jZdSy9FCnuJeJekqjdVm3zJdBdWwUT/3qBbpfrSKDbZcH9yQl0x0d326nmPqWBWGFmVFHwoCWWbu9YfSNZeY1WYYFuge6oOgUPBeb+SyzdHqq0KLMq0B2lYLUNLtBdWwXtXS/QbU+3uF0l0G1JenEv8SaAGh8kIj14iHuJpdvB84EEuj1fhRELINAdUSJnAwh0O6un1dgEuq0qlSDhBLotVYRAt0C3EeAT9X+ZvSTyLS3QHVkjr4cQ6Ha5BgW6XRbcn5xAd3x0t52qQLcl6QS6BboTFbKN+RLojnxLC3RH1sjrIQS6Xa5BgW6XBfcnJ9AdH91tp5pK0H10BECrjUWgW6DbCLeJ+r9Ad+QbXKA7skZeDyHQ7XINCnS7LLg/OYHu+OhuO1WavSTvr8D5jVFFwYOWp16kjKqEwYEFugW6ExWyjfkS6A6+d83+4/5LXqQ0Uyc5jgl0u1yPAt0uC+5PTqA7Prq7nSoPWgLdMnuJEfoS+X95kbJme5XPwLvde7qfnt5oIJ+Br9ZfPgNfrUWt9wS6ay2hrQgEum3J5rmLBLprwksiwyblLRJwGvMvUwZ607ovlu7I3Sn3X2LpjqyVV0OIpdvlmhPodllwf3IC3fHR3e1UedASS7d34FugO/KDh0wZ6HZPEp/0uP8S6I6P/m6kKtDthsq6NAS6dWK4uCvQ7aLYcUyKBy1PQfeqWwFa5TPw8kXKEF/lFOiOY6fiYtLcfwl0uyi6y0kJdLssuEC3y4L7kxPojo/utlM92BvY9Q5QsjeqKHjQ8hR0y2fg5TPw2XXDaiDQHVU34NnA3H8JdHu2CiNmXKA7okTOBhDodlZPq7EJdFtVKkHCpdKUgQkM3b0m7ASt3cbvUFvaN/pY8/8cVr/lc+G2iepeoi9HuHJT2YxhI4U36hFJg1hAt1mezY4Z88r/RxOWrhGf7sh9q0B3ZI28HkKg2+UaFOh2WXB/cgLd8dHddqoC3Zak07/93/XrLSGBmEHJ6paAqtXXW/H68Hw0GZaPFzPy0TAjD68Nz0f70dsUZHJcFLbj2O1oOTwfLwfC5qP58AK8N7IAvSbsCJuvSMDJ6fA21i9SUnk++UorL5WZ189G5QeVm/PTZew2vDI0OHyLYfnoOX572HLz9bSNpIHT0N1z/A68Oiw4z1xO/fZDVeaa9ddt3A68Zrj+38PzwpZZoDvyLS3QHVkjr4cQ6Ha5BlMduk+dOoWrr74aderUQdeuXV1TP5bQnZubi2eeeUaVicoV6adB0uCqq65S4ceOHRszDZ599lmVRlpamuNpDB48GI888kigzLRP9UllMy507LPPPsMdd9wRCE96jRs3zhi0+v8Eg27Kq7G84fJPbeJf//pXoJ6pXdD/pm4vCWbpJkj+eOQWBdoE27S+Pnpb0P+fjCQA1azfbUcXoHFGXuD8KyODw74RAUAjAaceTmk/1tDdfUwBmmYEl580eGdoLnqM2xYE0gTWbw/bHCg769V0yCZ0G51nCunG8rgN3VRvrUfUzDPnXb99JWMLSA99nqnM7w+v1ueFIVobaZKxBfTgRw8t+vC8n4jQTfdj3bp1Vb9kem8Cqk+Luv+q7smi2nMauqlPpr4n3NqlS5caeZw9e3bQmEbjVYsWLbB79+4aYWtzQG80cGrKwN///vdhyxtqjCatounj7ZZboNuucjavS3Xo5k6AAMwM0GzKGvGyWEE3dU7GDi0SdOs18Pl8EfNuN0CsoJs6X2OZ+X+CaX2ZqI71HRmH461Zh6/Km0DQ/frrr4csL9WlcSHg5ocqLqd+W+NBK4Ggm4Dp8680iCL4mp57EvmHi7F6TxEulFVhyoaTCjAbDslD59H56D5mK7hPG5R9CFuPXMCKXWeRd7gYC/JOo+XY7Sr8m8O2hLSCJhJ0E5B+NHyTyvOHE3dhx7GLap/K+PnAZeg+Jj8AlKRV56/JEq7ptfnQeXwyabdW3r5L0XlUbkgAZRDlbSQNnLR004PDJ0PWqny2m7EXJeVVKDhcjNwD5wLrnM1Uz3loOngDuozaFCgHlZkeJhoP0aB77d5z6DRrr4qrRb+l6DxyYyAsl423iQjdDGj0QGy22O6/zCKzcCwRoJuMCfr+Sr9P/drGjdF9sCxcsRMFuqn+9eXU79N4px/TwpXHyjmBbisqORiGByga0OK16CvdzTxQB8ZW7hrgEeOMxAq6GaCtWrpJAwayWGsQC+jWP2Sw5ZYsRPpOa9asWYHaJAsRd2AE2BSW4tCDOHW8NZYEgW69JYzLa8w/1al+YS2onqmOKQ69pZyOB3Xi9NIorTYW/aDlhHsJAdnrGbkKonovPKCgmy2f74zfqcCbjtOxj4duwCfDNqr9jrP3KeBuNnKr+p/Opy08gC2HitX/ZDkOZQWNBJwMbbyNpaWbrLrNhmjQvbDgNIYvO6Ly36zPUrRLXxFk6SaL77tDNa26z9uvHjao3A0HrcdnfRaFLC+XQ7+NpIGj0D12Kz4evEqV64uZe7Fmb1Ggzriuedtk0IYgkKYyfzBMK3O76Xuw47j/oWTIFnzSe2HYMicadOvv7VAWXNv9l417mS6JFXRTf0vl5VUP1kaI5vGJrqG+nK6hXzb5OPVvQf2XzbLSZfr+y2lLN8Eyl5e2XJfG/levhb6PtzqmR1t8PX+F0lE+jhOtqmHCpzJ0M6DSzRyqsYWRrlanYgXddMPyjc0/U4azdPMNTje+KWzWqpTBF8cCup977jkF0VSHxoU7Zb31mo9Rh6evc7IGM4yb6kWfgV/3IFCYaUwm7P88aFGdOLGwldtYXgJtzr8xLT5Oda1fKByfMw50+nDR7OsHrdpCN1kxKY6Gfitmm2l78GJGgQKylwZpoLV051l8s/a4OvbGoNV4fbBmMZ264QT6Zx5Uxxv1XoKXBq5X+wTd703YqfbbjiAraE3/4EjAqYdT2o8VdFPePhuhlZPcac5cqAhY8d/ttQCdRmwI5J+1auTXKvdgMTS98vHvXovxRcaqIEA3lsH4fyQNYgnd8/NOq/p5afAmNOy/Fo36rlRr4/6r0TItM2DppjKTpb/pEM01ZdnOsxiUdUhd2ywtp8ZDSc0y1gm8TNn7G3MXFP01sf4iJVu5qW8Ktdjuv0JFGOE491+mfWKEa81O85hLAKlfCKKpL6Ly6ftlfR+1a9cu/SXKfdDsmqBAUf6j77+chm7jr5BsDDE+NDCM06/vei2oKOwSqR/ToixijeAC3TUkie2BVIVusiRwB+ZUhxJNTcUKujkP1FlZgW6+iY0dAsfj5DYW0B0ufwSm1Clb6aD00Opke+BBywjC4fJt9xwDtDGtUMcpHT7nVJn1g5YT0P3F8A0KotjSSdtGfVehcdpSdXz6xpP4asVRtf96/+Vo3n+F2p+07gTazSBIz0fTrnPRuHe22s/aVoi3x+1Q+59nrEXPcTVfLowEnHoQo/1YQXePsVvx2hANuqduOInJ609o5em3Aq0HZCvgJPCkPCi/Zr/Fl6zF5GZBZW84aCM+7T0fXb7aHNLNwlge+j+SBrGGbv24pOq83yq80X2OKjf7ptNDySfDNX0++GYnjhWVqTJT+Pd7LfBbxGs+VHF5E8nSTb9WUX9NY5Id40es+y+n+odQ0M1WXKPrhB66jQCqH+OM5+z2ofr+K9bQzX2v0RjCME6aGMvFOlkZ06xqINBtVSmHwuk7N4eijDoafaVHfbHNC9gP2Kxh24wyqssSAbrZyk03v9ElIarCWAzsJnTTQxV3anr3klBZ1WthZ9ALFa9b0K0vL1nt9QvrYIRxCsPnnBpU9YNW7aF7BzqOWI+3e87Ha52n45WOU9Co38oAWBFckW83ARftv9NrIVr2Wqj2m47YiiE5h4PCUpgp6zUfcPIN/mLIyoSFboLptqM0P+VGw/JRVFqJ10dr/uiN03PxcsZmvDIsH+3UzC07FIA3Sdcsvqt2F6GD36+58cANeHvwGnQZu9Uz0E0PRlRXNEvNv7/ejkbDtF83GqdvQoeRueoBQ7NyF+BV/0PJvLzTGLv6mLrupfRNaJqei2ZD8/DOCO0FWwZt/TaRoJuNH3ZhKtb9l1P9g75f4n39AwM9fOiXZIBufXl4n8rJfa9x7GWrfzhL96BBgziqWm/1/GWEfI5c3EtYCQe2qQjdekDhzo4sDATixhvAAYlNo0gE6OafM6nctFDZqZMzgzPTQkR50E3oZrcTs47LmG0qN7cDo6XFGDba/2MJ3Vxfep9uspIYF+7czeqVzzk1qDoL3Zp7SdtBy/BZn4X4sPssNBqk+WzTS4XTNp7Cq6M0n+1GA9aiVd/Fyne5cf81Cr5eHrEVaQsPovlX2/DxpF3ou0hzN6EX8pqn5eDLYetMX6aMZOXVgxvtx8LSTb7sLfy+7F+vPIaF+ZrLBcGotmqzs7w+TJvN4z2/L/enk3er74gyoHP4V4fmeca9hNrvgrwzmLnpJLK3FaLK5wP77f87Y7N6UCIr9+d+15vXvtqG86WVaDai2n+fy03bziFmbUkU6NYDM/dDtLX666Mb/ZdT/YOxb6L/9eWnsuiXZIXuUG6CVHbSgH+Fp/6cNKA+nq3c9Auuk4YhgW59i3NhPxWhm63cDBz6rdFXNlZVEG/ophuZ3U/oIYQW/bFYlNst6CZLAZeNyhRpYUC3+9NuuPhjCd1UNn3bDTVIcxgzLfhc0KBKvuu0JsBn4Amu6GVCspq3T1+BRoM1d4LJG05g+a6zfgDNR7O+y5XlmqzXr/VZEji+/dgF7Dx+EWculKPfYs3f96UhW/Bu3+yQLhfxhm6y4nYYVT2F3tGiMvXQwCBJL5DOyNUs9q8NXq9+DXgtXXPDWVRwRjXHwosV2H70onqZsv0M/2weQzebPmQYHyLo/0gaxMq95P1vdmL2ppPqQYnLS79kHDxTouqUfNapLZDrzb/9Vu6Ja49j1qZTWp2nay+dZm07A36J9ovh6wK+7/qyJgp0M2jzvajfGt89Metr2B0hlv1XUP9glolaHOP+18xgoO/jjFZYOsf9vPGc3ezojQZOuZeY5YUncKCxymyhXys5jL49xKKOBbrNaiCGx1IRuvkpkgCb34bmjosauPEnrljIH2/o5o6OrdxURn0nFosyuwHd1FlxRxwKQvVlswzoR0doM3ok0Gfg9QMStVtq12ZtlzttCm9c+FzQoJpAUwYSJBGEEnyTqwlDNwEZWTgnrDmOFn63i0+HrscnQ7UXJun8uDXHg6yfPRccwED/i3Y0hzO9hEdx60GM9iMBpzG805Zu8jN/M0Oz6FN+1+zRZvN4aZBWNrLy0zSIVMZXB65VLwy+NESzfJ8uLseEtcfx6ihtbnLydz9VXKG0ovCdvgo9b7W+XJE0iBV0Ux55fWngOrzkd5nZc/IiXvOXqf2w9Wjrt3JTWHqgeme85qffcMA6dX3BkeLAryDtMlabPmwkAnTrX+DWWzVpbOJ7M5xVk10RKKzZ/W2836P9n40GQf1DtJFECM9wSRZv46Lv44xgTee4rzeeM8Zj9X83oFs/RrHBS58/snTr65/bAW/pnFPlpXQFuvXqu7CfatCtv4mNDZ4tDlasC7WtmnhCN5WbOyt9R63vxGpbPrPrYw3d1FlxB04/xUVa9OWNCOh5f9NmOjg5JVK0Qed50NLrHBTAoX/0g6+xXXNnbZYHPhc0qCYYdPekWSrGb8eXIzbgrbTFaNorEw37rVZwRX68E9dpLxi2HLwOLQZr0EWWz3cDILYGL/k/ljNlwwkQtBKstR5B81bXfNEuEnDq4ZT2nYRuegiguba5X6Yp8DrN3hcAUcq3Hrrp/+b+Mn/wzS4cLyoLXPuifyaT9fvP4ctZWhyfDdtgCqDGMkXSwFHoHrdN/YrRtP9KNOq/SvntN+6zDG+0G4MmvXNU2TO3nsHnavaafHwyeBVeH6JZ9kcsO4IlOzQfcNKCVz10N03fjG5jtpo8XMV/9hLqd+gepLFHD1J0D/O9GeqdlKj6L5v9DPdfQf2DzbjMLiMjAY9Fxn6LwlMZWQe9PnyOrzWeM0vLyjE3oLtVq1aBOjfLE7cJMqLop/GlhxI2GNr1/TdLT6DbTJUYHuPOnTqreC36So91HvT+Y8a02O3EjZcr4wnd7E9mBFN9J27Uxon/Yw3d7PNGA1g46xCVRQ/oZj9r1ihvgkM35ZetI8YHCB60vAbdBKBtR9f00/13z4V4uVeWAqwOM/eqD99Q/9V00DrQS4a0v/mwNh83zd7RovVXaNpbcznpOnc/Rq/SXrh7O2NDwr1ISQ8BbYZrVm7yQ6dlUPZh0IuhvE5cdxwnz5cHPvTT2O9yQ3DO0+017pWFl7vOUVrQ3N6tpmozubyTvs6Sb7eb0E2W/bf8ln2GZtq+npaDRumaFgTdTUdoL1R+0H8JXh6sHadpArcevaBcSVifz6fuRnmlDyOXH8VLQ7VrWg+v+YCVCJbucGMOG4HMACvq/qtGh2btQKyhm8ci6rvMlmSE7vr16yvoDjU1JNe72cuSPJ2gk9ZuPX+FeniRFynNWqfNY6kG3fwUSSBiXLhBJzN0663c1JlTp8ar0dWCOnYnl1hCN9cd1auVOacZUK0AutLAA9DNDx3JAt0EY638U8I1HFoAejGSYKxJ+kY08c+7TZZrAi863rTfSjQeqM3TTSD2ln9qwJf7rwL5cVMYmnYv3T+ryduDVpu6mEQCTqNV2ElLtyrzEO1F0LfG7gDNRGJc6UuctBCIvjgkH438WtDLk2ThpXKSlfulwZpfOH1Uhy3dHwxcoXzkzdxq9OWKpIFTlm7KB/nsvzd4NV4cWoCWY3eg1VTtK5pNB20IWO2PnK224H+StiBQ/zQfu1Ef+monLeR28v432q8anw5ZU+NhIxGgm+9ZszGH+ygz6G7QoEHAWup0P63E8/+JNXQzgBr7LM5DskG3fvylspktbCQx+3VB/8tAKEA2izPcMYHucOrE4FyqQbf+Jjb+nMVPmKE6ACflj5elm8rPP8nxzR1qG6pTsKtDrKCbOiIug5l1wJjfaAFdXZ8g0B1ukArVflkbo8+k/l4IelBJEPcSmsGDvrrY0P9y3MYD59F9nvb1SQJLeqHwcGEpRvnn6X6150K84reAk0Wb/Z4VhGbkg+avPlNcEZin++MBS9QnxI0AGgk49XBK+05CN5W51RDNdYbzbdzSi5GbD57X4JrmLR+4Fo38lt8NB86DLL18DX0I6FBhaeClws8HLk1A6M7HZwO0XyLowWrvqYtBL472WnCg2oI/cJ2aoYYfuricxu3+0yUBNyI6Ry4p9PKlvu4SAbrZCET3rh6iaGzi+9YIX7b6L2MnaPH/WEK33reZ9s0WfR/l1Y/j6MvFhi1yEwm1sAsJ1bO+TVB4/mVELN2h1PPA8VSDbrIKcKOmhmv2IqXTsGnWDAS6zVSJ/hh11vr6pAGK6k+/6jt0vXsRdWD6cLxvfBhTuUoQ6OafY2lApgGb8xzuRWA+RzpZ+gw8fX2TVhuL3ieytvN00wdfOgxdg2b9tA/evDJyKyat1yybmw8V48S5sqDPwr/Vcz7e7Dk/AJzjVh/DpgPnFXyv33cO+YeL0drvF9xo0Aa0G7wcc6d1wsrZbwWtehgznps/o2sQuDkN3WTppq9HvpKWg8Z9lqJx2pLqte9yvDg0H+S7vWQ7+THnoeHgjXityww0SdOgteXY7WqavbzD57Fh/3n1WfR2/tlLmgxYE3Jucj2M0n6kBw+nLN2UFj1o0Mw0TfxTPdK0h2v3ncOG/eew/dhFzMw9qVxrCJ5f67sMbQbk4O3ei9Ck77Jqbfw6vcTuRQfP45WRmmtJsz5LVbkpHX059fUcry9S0v3LcG32IiXds3pXOdv9l417mS6JJXTzwwM9cIRb9P07j9cEr3ycdDPCabj4wp3T91+xmL2Ef6GgsSfUwmBN7UI/RumPm/36ESq+SMfF0h1JIYfPpxp0k3z6jos7PN6GuxmclD5e0B2uDDQAsBU8XDi752Jh6WZLEdef2Vb/0y3/nGsWjo+Zdmi73gVW3QrE+UVKemjkjpvzq99S+YyL/sFEH5b39S/rGK+N9n/9oFVb6CYLdJdRm/Bxz7mBF+rYoskzlvD/zXsswOf9stRc3c17VIM3neep4zhs0wGr8W73Weg4fB2mTx0Q+BS4HsJC7ccausmnm8pM85K/13kq3uk42b9OQouOUwIPFIGy9F2OD7vPxHtdpqFJn2VB5xv5/ZkpbJOBa/Bet1lBn47XA6hx303opjLTJ+0/6D4LjXUfPyIfbS4nbZv2zlFf1/xy2Fq0GbgEH3SbqdNnMt7qMAGN/C/Y6q/7oOdc069T6us4XtBN95cepvie5K3x1ynb/Ve0N7I/fCyhm91nIo254cZrAu+gX+lslpMv0/dfTkM39d08vobrcykca8PtQL+lc/oHMc673a1At13lbF6XitBNUpFLgr4Do4bshlsJV5NANytRu61r0G0zmzxo0QONUwt1ylRudiehDjlS+yXwJosQW4foGrasOZUvikc/aNUWupUVdOxWZfklwGrWYyEa9VmBF/3WTLLykjW4edc5+DRtgQI3gjcC1hZdZ6Fx7xw0HKD5eNPsJQ37rVQzn7zTaYqCNp4ysGhxPUvgTeEGTtwQZC2lPDrpXkLxkbWbPttOUyTSgwGtZPFv1S8TTfqtUv7aymc7Iw+v98lWVlyy2r/fdTpe7pWJRn1XBmZraTxgNZr2zMTbXaaBPjJE/tNGwDb7303opvQpX1QGenh4uWcmGvbXXGxoKsRGfVegWc9F6uNIBNwUlj4FT3XN+tCHjtoOWormadkBfUijpv1WqHiNriWUZqJAN903dD/rQYvGJhqjjIt+zNKDmH7f1GhgjMji/9x/GV1cLF4eMpjefSbU7Cz6i43jNfVjBOumv0rqL4xyX99/OQ3d9PDA0B0JmsP18XTOyUWg20k1LcSVqtBtQZqYBok1dMc08zYjj4Wl22ZWXLuMBy0nodu1zNtISD9oOQHd/KJdh4zV+KT3fLzbaTJafjEeb3SYqLZkDaYvURKAEazSSvtk9SaAe6vDN3jjiwlo2X4c3uk4SYEbwSfljacLnDF9UBCA6WFMv29m5SZ4cxq6KU4qt7buUPmkchFgftRjtrLoUnlIi8/7Z6uyEITSh4E+6jlHlfPNL8bjzQ4T8PaXE5Ul3FhmSiPc6jZ0U1mpTgi86cujlO83/XVM1v6Pe81TDx4Ez9XaaPO3Uz2qXwi+2qweTCg86UN1T9d1HrkxxHzs8Z8y0MYt5uol3H85Dd2uFiKKxPT9l9PQHUU2XA0q0O2q3Ai8HU4/x8Vr0Vd6vPLgdroC3W4rHp/0eNAS6A4PeeEAkCCL/HHJ+kuWTnq5kqya5AdMIEqwRv7fHAft0zGyFBOIEnASzJG1mACMLKUM3HxNJGt3KCs3XR8L6OZ88VZpMHarKq9W/mXqFwDShMpL5SEg7TwqV5WTykvlpocVeggxKzPHbbZ1G7opD1QGyifVEfm1q3pLX6HqnFxuqA2QDmb5pWOkA4XjOqf2QWU3+nLz9foHqni6l8SnZ7KWKvdfAt3W9PJiKD1/hfKNrznXmxdLmiB5Fkt3fCpCoDs+urudKg9anoLu3CcBWhPgM/AMSLTVLJw7FEQRYCqYmrANfSbUdJngsGQh5rAKzCdsNw2vWbvrhrR4z5/RJSTsuQHdXH4qA5WbykRlMz48ULmDwviBPBys6jXm/XhAN5eRymSsN6v5Vw8ffn1IJ9Ii1LUC3ZF7Q+6/BLoja+XVEALdLtecQLfLgvuTE+iOj+62Uy3MAuhT8An0GXjbZYl0YYJMGcgAaLbNn/8cipfei6ollwHZ38KFJbdi6ewPQ4KxlfBFi28yhW7Nyr0+ZNxG6N6/6BlU5lyOqpxLcWRRA1ixopqVMZ7H4gXdbpZZoDtSRxDb2Usip+5+CHEv8ZmKLpZuU1nsHRTotqdbba8S6K6tgi5fv62pBmRHh0eVMFuKPGXpTmDoHjRpHY5n/xqVW18FijdX18Wp2fBt4MAmJwAAIABJREFU/itOL3o4CI6jCR/K2h3Oyk2QqIfub6aMQemy24CKsyhf1QAFo/+BzH6dMGDcpqB8uQmXdtIS6K7pDnX/o8+o6f169+5d3e6SfI/7L7F0J29Fi6Xb5boV6HZZcH9yAt3x0d12qgLdlqTTW4rIr9oO8IW7ZufCv6Ni52ea68vOj+Bb+QCq1v4xMJWjb+NvcXjUY4F0g8N/aBL+qaDwRmt3JCs35VUP3fsX/TcqDgwAjo9F5bzrcbr1Qzje5lFkjFkeyFO48iXKOYFugW664QW6LXV7ng4k0O1y9Ql0uyy4PzmB7vjobjtVgW5L0sUSutO+2YHKnO8BpQfh2/YmKmbegHO97sSF9HrwZV4KlOwBTk5FxZxbsLrXB9DCX245PAGv0dodasYSPRwzdP/fM/VQupQ+9OGDb9kdONfndhxv+xhy+n7hKeCmsgl0C3TTDS/Qbanb83QggW6Xq0+g22XB/ckJdMdHd9upCnRbki6W0D1vRndULvsRKja/AF/W93C287041u5X2NH57zg7vj58e9oBF7bBl3UNTrRpgEXTv4wq/IBxuQqO2dodbsYSM+hemn4NKg4MBA4PQPmcW5WV+0TbX4Dj1V+T6PsC3QLddMMLdFvq9jwdSKDb5eoT6HZZcH9yAt3x0d12qqkE3duaALQm2OwlQyavwLzp3XE041Gc769BLQE3+Uvnzn0RlXs6AEXLULX4ehxv9ximfj0iqvBjh09T0M3zdluxchM8k6X76Z/VQdGiGwBfBbD0OhT1uAvH2v9K+XMnOmCb5U+gW6Cb+kqBbtsjhmcuFOh2uaoEul0W3J+cQHd8dLedKn0GftkPgFR4kdK2SM5/kdIMCDf0aIEDHZ7Bwe5PYvbo/lg4oxNKs38IXNwO7P0cZdMexNF2v8GM9AwF0dGGpzQPLnzU9OuTZvkh6M7qexku7u6Dqp0foGL2tSgedDOOdScrt7deoOTyCXQLdFM3INBdi87QI5cKdLtcUQLdLgvuT06gOz66u50qD1qemr2kFiLF0r2EgZC3JdnXoWxZfVzY8H8oPzIeOD4eyPkuinreieNtf4GMMSuCfKlLsq81CX+ZLnz1y45mn3vndI3bsYMb4uzCGzTVsr8F35oG8G35JyqX34CLObfg6ymzgvJhvD4R/xfoFuimBs39l8xeUotOMcEvFeh2uYIEul0W3J+cQHd8dHc7VR60BLprQkxtYbM05zqg7KhWpQfT1Mt/FTP+S/lSkyXcGH9pzrURwof+2qExLv3/6yc/iYs7u2n5KDsGVJypbmbk351VD1+PnVsjP/o4Em1foLtme5UpA6ubdbLu6Y0G8hn46lqWebqrtaj1nkB3rSW0FYFAty3ZPHeRQHdNeHEKMMlyXbXkalSteERz+6k4Dd+Gp1E87CZMGjq2BuSWZP/QJPxvQ4a3ms/SrO8DJfuA8hOoWvMH+LLogz3/CWxvqbXX3P9GycQ7PDVtoEB3zXYr0O257jfqDAt0y8dxom400V4g0B2tYs6EF+h2RsdEj8WT0J2gL1IaIXjApFxkZXRA8YBb4Vt8iTZX96npqFx8N7Z1eaEGdA+YGCl89JburyfPQsmyu1Uz9OW/iYppV+F02wdxpONvUDn/cuB8LnBmISoz6+NQ+ydr5MlYpkT5X6BboJsaNfdf4l6S6CON/fyJe4l97WxdKdBtS7ZaXyTQXWsJ3Y2APgN/cipQURhVujxoecq9JIG/SGmEUvLbXtanNQ599StUrf0TUHlOuZmcbPdIDZ9uurZm+PO68NU+3cZ0Qv0/bfpQlKx9WrWJqiX11bzhx9o+jtzuzbFz+u9Qtb21soD7sr9n6mceKt54HxfoFuimRs39l0B3VN2+pwILdLtcXQLdLgvuT06gOz662041laYMTFDoLpj/TzVLyYXsW7BzwZ/Q+5tqy/SiGR1Quupn/g/T3IrCrj/FwZlPGMJXg1R1eMC3TAvPs51EA7zTpmWgZM2Tqln5sr+Pwo73Ym/H/1V5y5nVCmWbGwEVp4Dsb+NUm0dM3V6iSc+tsALd1W2FNRf3Etu9p2cuFPcScS+JeWMV6I65xKYJCHSbypK4B2nKQILRg72iyiNbisTSXRNiGGasbpfNaQ3k/QM4v1FZp5cP+zTgrkHzdJfu/FID3JxLcbr1g9g//pmowq9M+yQQn9U8DZm0EpVLrlJtomrtX1Dy1bXK8k7XH1z0OMqPTVHuJVWL78DJNj/3zLzdAt0126tAd1RdnycDC3QLdMe84Qp0x1xi0wQEuk1lSdyDAt2W6kY/aHX9ekvUEBsOdodNzkbl0ms0a/buNvBlXo7jc3+Bs1l3oXTZncDFncChNFTOv0VBd+6AV6IKT5+OD5d+qHPFi68HTs8CTs+BL+sqXJx7C4qz6uHCise0j+Xk/T+UTrgN9HVKsxc8Q8Ubz+MC3QLddMOz0UDcSyx1f54MJO4lLlebQLfLgvuTE+iOj+62UxXotiRdLKGbIHTvot8D+f8HVJUAxVuAY2OAcyu1vBWtgG/pNbgw9C71eXgC3Mjhrw4Kbwd0Jw5tisplt2gzmFBOTk4Gzq/X8nRsJHw51+Bs53vEp/ubmiBrR2+nrlG/XPldqfSuSqHiF0u3pS7A04H0/ZdMGVhdlTJlYLUWtd5LBOgeM2YM6tSpg0svvRT33XdfSqzXXXedKvNVV12VEuWler3yyitVmX/0ox95rsxftfsv5V7StWV0ef/2t7+tynz77bd7psyL+14JWu+3cS/ec889qrx0P19/05340c13O75uGlofyLkU2P4KcGQwcKAzfJv+Al/Od1Gc8WM1T/e+jx/EI/f+WKVtNXwDf/ho83z1tfUw7L0r4VtyLVDwAnCoP7CvHXwbn4Iv6zs41/dBZXlf8eYDjmsRbV6thvdl1dHcqbLrmOb5ih/8l6rny753pel5q+nEM5weum+4JXI7vfS7V3i2/7I7rnqx/7JbVrpO33/95Cc/8UyfXZsy33rrrapdf//734fPJ+4ltYbqSBEkAnSz1ZcGallFg0RsA73e1CDk3b9L/SRC/cx960acG1wPZdNuQ+nkH6M4/R71EuPp1g9h30cP4O8/vSqoL4k2vJ0ydvp/1+DsgJtRNvV2lE66B+cH/QSn292Po58+iPx3fopbfvCdoDzZScOta/TQ7Vaabqejh+66deW+dlt/SS+x2twll1wi0B0JmJ04nwjQzT5F5D82Z86clFgbN26sBuCnn346JcpL9fr444+rMjdv3tyTZV44d2LU+b722mtVmbt37x71tV68F8aPHx8Ay6lTpzpWZj0geXn/7U8H4rVPhyX86suuG7B0m+X3508+q+r5rvt+mfBlMcs/HdO3o+afDo1Yjtvu/pmn+y87/Qn3X926dXPsXraTD7euiVX/5Vb+7aTToUMH7V6+6y6BbiegOlIciQTd9HNOqixs3W/UqFHIhp5sWjz7rDZQp6WlJVvRQpaHX0Ty1OwlIUsT+URMfSJ5KkMPb8kSv6VbE1svbIbyNY7FcXmRsqb/ufh0R77/vR4ipv1XgorDRk/iL3EvcaGSBLpdENkkCYFuE1GS8JBAt3OVWlV4GGe++CXOtP9FQq0n2zTA4U8ewJFPH8SJNo9GXDf0aCHQnQAvVeot3fIipfl9yv2XzF5irk8yHBXodrkWBbpdFtyfnEB3fHR3O1UetDxl6d71DkArzF+qCadhKluK6MXR3hOqP9gTCwu0W3GKpVss3XSfc/8l0B2u1/P2OYFul+tPoNtlwf3JCXTHR3fbqZbs1T7KQtsoFh60PAXd7L4h0G2ppnnQEuiuCapuPSTYSUcs3ZGbN/dfAt2RtfJqCO6/xL3EpRoU6HZJaEMyAt0GQRL9X5mn21INedrSzS8PRvmwwYOWQLdAt6WbxEOBBLo9VFk2s8r9l0C3TQGjvUygO1rFnAkv0O2Mjq7FItBtSWqBbnEvsWN1jsc1YumOfEsLdEfWyOshBLpdrkGBbpcF9ycn0B0f3W2nKtBtSTqBboHueAC0nTQFuiPf0gLdkTXyegiBbpdrUKDbZcH9yQl0x0d326kKdFuSTqBboNsOAMfjGoHuyLe0QHdkjbweQqDb5RoU6HZZcH9yAt3x0d12qqkE3blPArRG6dtM2gp0C3THA6DtpCnQHbk3FOiOrJHXQwh0u1yDAt0uC+5PTqA7PrrbTjWVoNu2SALdMmWgd16mFOiOfKMLdEfWyOshBLpdrkGBbpcF9ycn0B0f3W2nWlEI0HSBtI1i4UHLU1MGRlE+Y1BPW7qPjgBojXLhQUtmL/EOcJNlXKA7ckPn/kumDIyslVdDcP8ls5e4VIMC3S4JbUhGoNsgSJL+y4OWQHeSVjAAHrQEugW6k62Vc/8l0J1sNVtdHu6/BLqrNYnpnkB3TOUNGblAd0hpkuoED1oC3UlVrUGF4UFLoFugO6hhJME/3H8JdCdBZYYoAvdfAt0hBHL6sEC304pai0+g25pOXg/Fg5anoHtfO4BWG4un3UtslJcu4UFLoFug22YTStjLuP8S6E7YKqp1xrj/EuiutZTWIhDotqaT06EEup1WNMbxpZJPt3wGPqrGxIOWQLdAd1QNxwOBBbo9UEm1zCL3XwLdtRTS6uUC3VaVcjacQLezesY8NrL8EozuaxtVUjxoecrSnarQveo2YNWtUU+VyIOWQLdAd1SdgwcCc/8llm4PVJbNLHL/JdBtU8BoLxPojlYxZ8ILdDujo2uxCHRbktrT7iXZdbUHqyjnJ+dBS6BboNvSTeKhQALdHqosm1nl/kug26aA0V4m0B2tYs6EF+h2RkfXYhHotiS1QLd8HMfOh2ricY1MGRj5lhbojqyR10MIdLtcgwLdLgvuT06gOz66205VoNuSdALdAt3xAGg7aQp0R76lBboja+T1EALdLtegQLfLgvuTE+iOj+62U00l6Ca/Zhu+zaStQLdAtx0Ajsc1At2Re0OB7sgaeT2EQLfLNSjQ7bLg/uQEuuOju+1UUwm6bYsk0C2fgfeOX7dAd+QbXaA7skZeDyHQ7XINCnS7LLg/OYHu+OhuO1WaMvD8Ru1T8FFEwoOWp2YviaJ8xqCetnQf7A3QGuXCg1YsX6TsNWEnuozbic7jdgRWOsYW4h7j6dx2dAqx0rnu43cEwvN1obbgl0qz65he86fn30edOnXQ4Im/ofc31fkIFZ+V41SeSGXQlzna8MY8CHRHbujcf8nsJZG18moI7r/kRUqXajDVoLtr165qsKABI9RKYWK9xBK6T506hRYtWgTK16VLl6DiRNLgmWeeCQrv1D/PPvusylNaWppTUap4qLyfffYZ7rjjjkCZqQzjxo0zTWf37t1Kn6uuukqFpy3pRcedXnjQihV0R1sWqnsudyzqOZbQTRr+61//CtQx1TeVh+rfbOH7gMtL9ztdn5ubaxbc9jEetGIF3b0m7MAno/LxYkbw2nJ4PnqO347OY7eh0dDgc8aw9H/DjDx0HrsdenA1gij/7zZ0UzmaD4tchleHaWWONjyXS79NROjmvpnabKh2He09b7thA+D+KxbQTf1PqDGYj+v7Tbpvf//73weu0Z+rTRn118aq/+LyhNv6fD59VjB79mw88sgjgfJyfxcUyIF/uP8S6HZATCtRCHTXhG/q+GK9xAq6qUPWQwbd5MkM3TQw6TsmY6dmrEvquI368DV0nDpdJxcetGIxQERbFqNOXoJueoDiejJuzcpB7UL/EKa/hup548aNjlUzD1qxgu7uYwrwcsZmBd1vjN6OV0ZtVftvDlmPrl9vwecjctX/L4/Yig++2WW6vjxSu6bV8FwF6nr4NNt3E7rpIYDK8WJGnirH+xPMy/DS0AJ1vtOoTVGF7/zVZtMHjUSDbmqzV199tWrngwcPNm2f0d7zppFEcZD7r3hDNwFo3bp1g/qAWPSpiQLdVP/G8nIfRgYiI6BHUaU1gnL/JdBdQ5rYHEhV6CYAoZuWV/2gTh1brJdYQTeVh25OvRUhFHQbNWAtYlX+WFi6W7VqFeiICbCpDEYLgR6kWRcCr7Fjx6rwbF0i3chi7mSHxoMW5cvpJdqyUPkIRBlGzWBV5fHoCIBWG0ssBi2CEaovyj+12VmzZql601u9qc71C9UjhaeV2j/pT/c4x0Nld6qeedCKBXSTlfvTEZsUbL43YSeOFZWpfbJcf9Q3C51HbsRH6avUsS9n7VMSLMg/jdmbT6l11e4idazL3P0qzEfpq9Fj7FZTlxE9fLsL3TvQccT6AHSXV/qwft+5QBm4LI2GadDdYdg6dBy+LhC+LFL44etBOurLR/uJBt3cD9H9GWqJ9p4PFY/V49x/xRK6CSJ57KEt37t0r/LC2nD56b6ORZ8ai/6LysB90aBBg4LKyuWhvoz7I+rvOHyo/s7J+uD+S6CbW1uMt6kK3dTY9Qs9WVJD19/o+vNO78cKugmY2UrCT8qhoNuogdNlNMYXC+hmyxB11PqFdOCOizso+hWAj4WCNNKEOz99fCCfblqjXHjQcnqA0JeFIFS/8KBlLAsdpw6df6INWf8J9kVK/QMx5V+/0KBEdUqDsn6hstFxo1WI6p3bgP5hTH9ttPs8aMUCugmQXx2iQfeczacwetUxBc8v91mOtoOWostXm/HhoJUB6F6Yf1rt691Lzl6swKt+63irQSsSErq/HLYOLw4ha3c+Dp0phX5c0peF9ttnrEaHoWsC4Q9GCP/F0DUJD93UrrkvM97P3B7t3PN8rd0t91/ch9qNx+w6vkeN49Nzzz2n7lECUV6oD2Aw53HN6T6V0oo1dBt1ZCMAwTgvVC7uo3bt2sWH1Zb7O+rLTcepoNDW/uH+S6Dbml61DqXv3Godmc0I9JVuMwrLl+mfmPUXMYjQIO3GEivo1uedOydjpxZKA/21sdiPBXSHyqfeWmDs6Myu0Wti2pnRC3b0ctmud8wuD3mMB61YDBChEo1UFm7rXoHuUOWk4zxwU5n1Cw9axrZPYfhcjXax7iFg3YMJ8xl4ss5+7rdyk0tJ0cUKkAsJgefbvRYo63D3MfkB6P586h6MXnkULwzJx0sDyBKcjzfH7sCO4xfVfqNBG9A+fQV6jNtWw+pb0wrs/zqnCy9SUjn10L3vZIkG3emb0bDfSjRKW4pGPRejac9MtOi1WIXVQ/feCOHJKp7olu5QD8r6Nh1uP9I9H+7acOe4/6pxr4S7yOI5vneN9yiPW/RLpHGhfpTPx6JPdRO6Q8E11yX1U8axiM+RdsZzRq2s/q/nr1Bx1rEamYSLrECqQbeZIgRofCMbLaBm4Z04lgjQTU/N9JDBEEI3cizL7yZ0662jViyarIP+Z76gevYQdEcqSzJBN7vK8K87XGehLEJmv4DwNQGXigT5DDzB8b+HbFTA/M3a45iRe1LtN+m/Ep/3z1J+zeTvzZbuFzM09wuC7Ub9NJeTgVmHMH2jdt2rfZcrYDUD0ISDbpMXQ1/puwyt+mWiy6hN+HLY2oClW0F3mPDkL2728miiuJfoLdh24TbSPR9o41HuxBK6zbJC4w+PxWb9tleh26ys/KBFfZUedsP9GscudQLdZop65JhAN5SvJ9/oxp+vY1WNiQDdDNvGLQFrLBa3oJvqsH79+uphggYjfYemLxcBGHXibD0gHUK+YJfg0B1NWbwO3VRntPIAROBtvG8ZQujnWwYZghuGcarrGu2Cp8lLAOgmSGw3UnMrIYg+VVyOt8ftUNBN//P67vA8tB20DE37rUDD/msCa+P+mstJ9rZCdPX7c7fsm62A1QxAEwm6z1yoULOxvDJyK0YuPxrIP5X5vaEbQA8aesv46QjhQ1n2EwW69W2V3Q2onUYygERzz+v7vWj23YZu1sIIopznZIJuNhgYXUX0D2GkBz98sAss9V3GXwdYHztbsXTbUa0W1wh0A2Y+ZLWQ1NKliQLdBC7UkRFocycQK792t6Cb65PKYYQxfeUwfFInRp08DWIhlwSHbmNZQj48AJ7z6TbWCT8gU71R+zWrYxq4GGAonHE1tRQlEHT3HLcdb/it3EOXHkHO9sIAaBN8vuS37DYbsglfDFmJj3vOxTsdJ+GtDt+g5Rfj8VK6Buwnz5ejyXDNAv5Jvxx0G51navVNJOimFykPF5Zi3OpjSFt4AFuPXMDyXUWB8nf5eksQdNOLlOHCdx2Tb1rmRIBuPWAZ2yj9Hw68jfd82P7LeBNZ/N9t6OZ7Vu/jrM9qskA31RXXt1m9sRWcwxi3bEjQa2N3X6DbrnI2rxPoRuAFllhZeM2qJp7QTR0XWXeNP8nHukNzA7qpTAxlVJ5wi37Qok6NAI6tCjWu8xB0RyoLl5vA03RZ9gOA1igtvhQX6ccDxIULF0yjr+1Brl9Oh9qy2UKDGVvDKSw/VNK+mb9ooriXkCW6o5pCT7No7z9dgjbT9gSgs/GwAuw6oflpNx28UQEozWJCLhdfZKzC+/2XqLAfTdqFrUcvqP3Gg9ajnUV/bgLwgBZx8Okevuwomn+1LVBeesjYdvQCWk3ZrY61Hr4h6EXKyOE3JqxPt9F6SX0WjUMMn6EsvtTe+T7m+yBs/2V2g1g45iZ060HU+AIhZzXWY5Qb/ReVheud+qRQC/Vr3GfxlvuxGr/ShYrEwnGBbgsiORkk1aFb70NGVge3lnhCd7gyMtBEAtZwcYQ6F2vo1nfI0fz8RvVOgxt1aPRznmmHluDQzZpbKQsP1iGhmyOzsXVr0KKsUX0znFh5YGYApwHMtI4TxNJNVu63h2pzb6ctOojcg+cVbL6Urh3TQ3eTwRvRccQGNfc2fTCGXqx8K52m38tXrhmT159Q++QPTS8UUhijVXv0lJmYOHVM0KqHbuM5Cu/kFyn5RcqGQ7S5yCnvtDbsuxyN0pap/UnrToD80+n4e+lr1MOF1fDvD1mLjG8yMWxydtCqt3QPm5wVdG7gxA01dLr/UW1GnN69o/9qaahbie5Bs36H2jPDNN1T4RYr93y468OdcxO62bob8v703/OxHKPc6r8aNGgQqPdw+vM5/QOJqcGAA9rYCnTbEK02l6Q6dL/++uuq8RN0ubkIdDurNrkYMIARXJlCVZgk9S+vmF5bshcozNI+BR8mHuMpHrRi8RBjTIv/1z9ImpUlWaCbyssDtam7CAsCqK+NMsSEBPR97QBao1x40HJiykCycpMLSKMh2odi8g4XI23hQQWbDKN66KZjzTI2g0Cdr202eIMKv3pPETrO2qf23wrjzz1/RtegOav1MGq2v3L2W45DN83T/Wq/5WjUdxUa9V2JRv1X44324/Bql1kq//0zD2H8muNq/81Bq9UsLPQgYSV8y0FrsHzmG1GX0fhwEgvoZgum8dcaAmlur1ZcCSL2X1G2aQ7O/ZeVPPA1dreshdHHWR+f3rASiz7VDeimuuUHB6o3Kwv7uod7ILESj1kY7r9kykAzdWJwLNWhm1+4i8Yy6kQ1CHQ7oWJ1HGyppk4pkmWo+qrqPerAeZAzA9XqkNHt8aAViwEiVE70A5NZWZIJuglWqN4iQTc/XFP7cHrhQcsp6O44UpuxhKYHpCV7eyG+mLk3sM7M1SyfA/yW35eG5KmZTMhizNcSjBderAj4fn/WL1tZwUO9RFm0+CZLUFqadSUGTlzvOHR/Ooys+Jrv+Qt+S3eTQevxWu9MBdrpOYeV5Z7K9ebAFfgwfY3l8C0HrUKfsStRtPjGKMrojqWb+xwjdJMRgc9ZAd5Y919W8lCb+8rqQ4a+b4tFn+oGdNNDP0O3Fc302oQ0GFiJKEQY7r8EukMI5PThVIZu+smGG3+4F8+c1pziiyd084uG9PSsX2LdocXKvYStnTRIhatH/smWLOLGl+/4HMVhBqp6naLZjxV0c36pLMaHDDrH7dqsLF6DbgZmM3cYtgCFg269ZYm0cXrhQcsZ6N6BL2g6PJr2b1iBsu6ShVe/bth/XhVhbp72IRyCbrIUk7X7k6Galbvd9D3YcqhYxdNk4DplGabzRust/2/V2k1WbrrGSfcSyle7jNUqr/QpeHqBkspPK5WNtmS1bztd82t/r28WWg3U/NathP9gwFL168GK2W9Zgm4uI2vD21hYuqndUp9jdGvj+1vfH/GxUPc8hdWHd6Kdc/8Va+hmH2cqm1mfxWWJ9RjlBnTz+Eu/yFpZuP+LhcGA0uf+S6DbSm04ECaVoZthLRY/2USqmnhCtx7KyMJCHRkdIx2o047VzR0L6OaBiPJNAxeVxbgSdNGitxiQZZw/J05xUGdPcdDxcJ1+pHo1nudBi/Lk5FKbskSE7pNTAVptLLEYtPR1TAMV1y9buanewv0k7dag5Rh009cWddMCGveN7iUvpW9WL1PSVHpv+P25J6w9Dlrp2tf6af7ckebnLlpcLyyUspU7FtDdIWM1mgzQwJu+vDl29bHAy5QZSw5j5/GL6iGEytOqf5b6GqfV8K0HLlHTDJKfdiSLvlbGmlZuKnMsoFvfhunXVmrb+v5I/zBZm3vexq2sLuH+K9bQzb9UGh8+jPkmfdig4HSfSmnFov/Sl4GMPZx/qudIC9V5NOEjxWd2XqDbTJUYHktl6LZ6o8dC/nhCN5WHwYuAxbha9TOLVpdYQHe4cnC59K5DeoDj8/qt04MLD1qxGCDsloU1M7McqzpNsM/AU57Yoq2vK96nBybjLxfcNt0ctJyCbnrh8Y2eC9CsxwK83G1+YG3abb6C6EZDC7B46xm133DQRrTsqX2dkj4J33SI9rLlnC2n8PGkXSrM2+TP/dVm02nz2IpL20jWbr0F2ElLt3KLGbEer6dlqfwSWHebdwD5h4ux+VAx5uefxuujt6tzzfouU1Mk0kwtlsNnrFK/AlAZqQxmfup8TF9GvTa0HwvopnbL4xC3Z95Su6ZfY/WL3XteH0c0+9x/Od0v6vNAGnCZI4Go16Fb/74N9U2RllgbDCh9ge5IteDw+VSFbr3VgCzSA674AAAgAElEQVSebi/xhm4qL1lZ2LpNnR5bEWOlRSJAN5WNOm4qK3f0NLjR/8YBLkgHmr2EptFLsM/AhypLODcbL0I31QUNyHpAobZLMB4KuOmaqAat3KeA3CejniqRBy1noHun8s9uMyAHH/Wcgw+7z1TrB91m4u1OkwNQytbvxgPWqq800lcXO/h9wfkcb1v1D+/PrYfLUNZuvZWbwjsL3VqZ6WuTr3bXHiw47/ptk7QlShOaHpEeIlr1XWw5PPuyh7N2G8uo1yVW0E1tlNovtWPuiyP1R6Hu+bD9V1BnZv0fN6Bb/yAR7l6mXHsdurk/on4s0uKGwYDywP2XuJdEqhGHzqcqdDskn+1o3IBu25mL0YWxgO4YZbVmtB6ZMrBmxm0cSUBLt41SRH9JokwZOH678kGmz513HpULgsxOIzYol4pXe2ehUf9VaNRvJRrTDB+9M9X83PTVRbKQv9JvpfoEvJoBpN8qNO+dqabXC+fPrYfLUNZuowXYSeim9GkqQyrjp73no3nXWWjaYyEa9lulvrDZpFcWXu06F/TgQfOQ9xi7VVmuowmvL2Moa7exjPpraD8Wlu7oG6m7V7gB3e6WKHxqsXYvCZ96fM4KdLusu0C3y4L7kxPojo/utlMV6LYknacHrQSBbgI8sswGrzvUJ9w/67MI73aarL48+V6XaWg9IBu9xqxF3vwXsWnOv7Bq0p/xeffhePvLiXi38xRQeM21ZAeWz/0c+fOfV2vu3JdCvlRp9Hs283Oe2v9xjPj0O5jZp34gTo6bt5vnPocxU6aFTMcItfRgQC+Edh88Hmsn/wGrJz6D1RN/hzWTfo/1U/+M3JnPYsvcfyFv/nOguEdNmqnCk4X8g64z1Bc5qdzzxzbB1tl/xInFD+Fg1h+weva/MXLygkA+zKzd4azcX0+Zrco4rddtSH+/Dgb07WLpXkiGQALdyVCL4csg0B1eH8fPCnQ7LqmlCAW6LcmUOIGOjtC+0retSVR54kGLfhb1zCKW7qiqigctJ9xLjCCq/5+glACaLNrk00yASm4lOTM/RMWanwP7v4Qv+z8xLH2Mdn74OhV+5KTZOJL1BC6seRo4nA4c7IvKnMswctSiAIjq0zFau80swMfm3gzs+VyLj+I0WSvXNsCSSZ9gwLhNpuno0+R9snh/M3EQylfeYxonp1O55mEsntJBWchJA7J6jxwzFGez7kb55ueAY18B59YBJyYAm/5H+XEvnf1hIB9Ga7dZGTlP2xf8DVWb/wrseh8XFl6Gob06RNU+vByY+69Y+nQnkj6eNhrYFJL7L3EvsSlgtJcJdEermDPhBbqd0dG1WAS6LUnt6UErgSzdDHzGrWb93qE+a04vINL/F7JvAYpWAjs/wMWJd+J064ewIu1jFabPNwVATl1U7OsOVJwBfJVA5Xn4sr+jws1IzwiAqD4ttnabWbkpnILu8xuA0gPA8bHB62n/Bz82/wNnB96BvV/+2TQNfXr6/SlTh6Fk3f9ovvUnpwXH7U/Lt+ZhnOt3B/K7NAxocTq7ASq3+6dBpbztbVX9Mauzy4Cc72LJqM9VXjRrtzZbSzgr95gp01Ge80Ogqgy+9U+icEh9pduFOT0s3Q9eDyTQ7fUajJx/ge7IGjkaQqDbUTktRybQbVmqxAiYStBdC8UFundGBZh62LSzP29Gdw1QfRXw5VyOs53vwfG2v8DY4ZpbR7+J+ajKuQQ4kgHfku/Ct+01Bd3IvgTH2z6GUNDN1u5QFuAAdB9MQ9WiH6B8+s1qrZh9HXyr7lPA7Ft2C852uxsHOjwTlSZTpw1HybrfaXHkXI3yGTcG4ud0aFvU7W7s6vQ39P5mJ2ZP74OSdc9oLTf3f1G14HKUjLoOFdMuh2/JDxQ041A/lE69EZOGjlH5YWt3qDJSfexa9FdU7O0CnJyCikU/UsB9tM2jqCo8VIu7xDuXCnR7p67s5lSg265yNq8T6LYpXC0vE+iupYBuX06fgSfwpk/BR7HwoOUp95IoymcM6mno3tYUUO5DPmOxwv7Pg1as3UvMoPx09s+AU1OBw/0UmJKVe1uXFxSIUniCbl/2f6BkUX2UfPVD+PKaWoJuuvbEontBFmGzdPXQXfrNbTje5lGcaPNzXBxzC3w7PwYuFMCXdbWCVC0/u0zjMYvbCN2FHX6KY20fN113dP67KuuK2W8Dez7TrONZ30bhF/fh4Bf/jaPtfoXy6VcBJyYD59ajKvMGnGj7C3UNle3EontClnHslKkoX3Id4CuHb+VPcK7fbdj30QNY0qmRlk7YVpEcJ7n/EveS5KhPs1Jw/yXuJWbqxOCYQHcMRLUQpUC3BZGSIAgPWgLdSVCZIYrAg5bb0D1l2giUrrxfswgvvw3net2JI+2fwKShY4MAd+70ntjQowXOp9+CqrxmlqE7FHATKB+ZXQ+lKx6Eb8UdIOgm2Cff7XM59wBnlwMHe6Ns0s042aYBMvt1CsqPGWjrjxmhu3hQPRya9ARWTX8L0yYOR8aYFYGV/cV3LnoW2P4acGYxfJmX4njbR9XDB/mt75j3B/i2vgaUnwSyv6N+CRg5aqHK07DJ2SHztnvhX1CxtxtwdBgq592oyrjrg/sxsHe3EC0h+Q5z/yXQnXx1yyXi/kugmxWJ8VagO8YCh4heoDuEMEl2mActge4kq1hdcXjQchu69y96BhUHBwMnJ6NygQaF5MqR9k3Nz73PG5iGbWP/H8q2trAM3XoQNu6/8/aL6Pr8FTibdgcKv/ypAtIRkxejbOl1Shnfuidxvt9tCnAJko3Xh/tfD91Ycimw5CpU7W4N7GiB8lU/RVHOPRg8aXVQnAq6j45S0F059wYcaVf98LF4ZnuU578GVF1U0E2WbuODiTE/46ZORtmSH2k+8Mtuwrk+t+HQZw+jzW9vQFpab13tJ/cu918C3clbz9x/CXS7VMcC3S4JbUhGoNsgSJL+y4OWp6CbXGiidKPh6vO0ewkXIsotD1puQvfoKTNRtuR6zcq99lc4P+BWFI/iz7jXxcnM+wIuJgyUmTPboqzgdUegm+bp/ul1l2HBm79ULzOSJZ3iL89rDFSVADnfwum2D0Ttz015DYJusprTUpgJlJ/Q9ve2xcXFd2HwuHUB8DZC97F2j4Ot2QTdZQXNA9Adzpedtdqz6M+o2NcDyHsWyP5P+LKvRFXWNZje+QpMHNpS3Eu0mki6v6ncfwl0u9ScBbpdEtqQjEC3QZAk/deT0J2qUwbabIPxgG6aC7tid3ugaAV8mdfg1OcP4cKoG4B9X6qp8koW34ZlfVoHTdfnNHTTF10bPKG9yEiweijzaW2KvpPTUDn/Fpxu/SBW9/ogAMYMtJG2QdBNsJ3zPVTOv1ZN++ej6QDhA7b8HaeH/CRQPiehe8TkReqhQaVzcSdwcrrWMi4UANuaoWLJfwEXd9hsLd66jPsvsXR7q96iyS33XwLd0ahWi7AC3bUQrxaXCnTXQrx4XEovUa66FdjXLqrUedDylKU7VaHbIy9SDpm0Asj+lrL8+vJfxMWRt+N4m59j/ze/DkB31cLr1cuNY4dPD0BvLKG770R6cfI/gMoi+ApewcURt+NYu19FdOMwA3CC7ool18C39gkg6xLlpkI+40c6/Rq+rEuA8qPAga4onXy38lWnOJyE7iUzP0VZwasa3BdvgS/3efhWPQ7sbavd+wd7onLh9ag4sjWqvsCLgbn/Euj2Yu1Zy7NAtzWdHAsl0O2YlFFFJNAdlVzxD5xKUwamKnR7YJ5uAsx181qirKAFQDPqZH8HZ9rdr2bp2DizcRB0H2v/K7gF3TOmD8bFNU9p9+myG3G2649VngaMyw1Avxlghzo2ddownOz/EIp63oVjbX6BQ+2fBPmlH57zGHB0JHBmISrn11MPFjRloJPQfSzrMeDULKCiUOl7ccT1ym+9fNp18O3xfxgn50oUdvoZfCXn4t83xTAHAt0xFDdBohbodrkiBLpdFtyfnEB3fHS3napAtyXpPO0T6QHoTpu4A2U51wDFefDteF/NHEJWbvKpXj27RdygO2/Bi6jY2x0o3oSqxVfppgq0P285zXpCUwLSB3D4xcct8xsBh/oqF5qqhdf5X9Rc7ih0X1hym+Y+cmIyyqdfq6D/SLvfoKDzXajIuVezgG/4Dc71uRslK0Zbui+8Gkig26s1Zz3fAt3WtXIkpEC3IzJGHYlAd9SSxfcCgW5L+gt024fMUFZf/fHMme1wccPftLrI+U9ULbgalfN/iKLMH6Mk+9oAdNPHbyrn/Rcmj/oqYGmOpXvJhZyb1YMADnRD6cRb1FzY0U4VyOWcPj0dS2Z9rNY5M3oH8k/nTy2+V4Pu46NB0K1Z86c5Ct2VOd8FSo/AV3IeZROvwv4Of1AfEXrosd8pv3JUFgMFL6M4/SacG/qypfvCq4EEur1ac9bzLdBtXStHQgp0OyJj1JEIdEctWXwvEOi2pL9Ad2yhO2/+S8DhgVpdnFsLGFeuJTq+9EZsGNxczWlNwBor6B4zZRrKVtytUvat+SXO971dfcgmY8zyIGBmqI60pTJWbfwVqvKeR3nWlUFxnM++Vfu0+5F0lM/+SQC6189rAezvAJSfBrL/A8fb/zIwe8n2+X/Gxb3p2gd7Mq8N+yVOytvpnEeBwsXq8/PlU/5LPUDQtIevvvgIDk6/UbN0r3kQRT3uwpnOfpca1j3JtgLdSVahJsUR6DYRJZaHBLpjqW7ouAW6Q2uTkGdSCbrJV5hWG4tAd+yh27fhV/AVvAxs1Vba5xWnpmlT9m1tBiy5AoVdf4qVaZ8ocI0VdC+b9R7Ktr4FVJ5TL3iebvugf6pAe1pMnDoWVWu0j/5UrXkKpeOuwYaZzbBjwV9Qupzg3gdsfxUXv/qp8ukmuJ8/sxvKtzyvWqxv1aMomXgttk7+G9bNaYbKnO8B5ceA3Z+iYt7tCqLZXcXsAWDTvKYgiz0qioCsb6Fk9A+xftbLKBj3Q5Rso69eVvinRHwQRf3/YeMu8c4lAt3eqSu7ORXotquczesEum0KV8vLBLprKaDblxOEHuwNnJwaVco8aHlq9pKoShgc2NPQnfc3IO+vGtQFFyvsfzxouTFP94Sp47Fi8tsoSr8NxYNuClrLJ10ZcC/xLf4+igffpHyrYw3dxzIbAKfnAicmomLOTWomFU7TDGqtHDufUx84PBiovAAc6oPK1Y/h/M7e2suNZ+YB2XXVy5r06Xl6kbLfxDyULblRfRxHvQB5oC8qV/8SxVtbKT9zVYGr7sT5vton68NZ4WdMH4TKpdcCxZuBkt2o2vYhytf9CRcPTtTawY7XUTGLvsL5IIqntg/bNrx+kvsvmb3E6zUZOv/cf8mUgaE1cvSMQLejclqOTKDbslSeDsiDlkC3p6sxbOZ50HIDuglY6dPn9IIhfX1SvxZ9fQew8z01rzRNGUhT9tF59q0mS3f5lheA87kgn28rH4kJBcj0cRyap/uZP/4RlVmXARe3w7f5b7iQUc/0U/Sh4gl1fPTUmajIqQds/iNwdhngqwDOrQYOpqm8nx/0E+2z7J2q5wmfN6O7NpXige7AhXzta5Il+4H9HYFV96Bscj01n/nRdr9CpFlVls/6HL4VtwJH0jVfdXJbOTUDWPdzVC66XaVd2Ok3KCvIDNs2vH6S+y+Bbq/XZOj8c/8l0B1aI0fPCHQ7KqflyAS6LUvl6YA8aAl0e7oaw2aeBy23oDsUqC6b9QFKcm6CL/MqVMy4xu/vXD1P97wZPVCccxuqMq9G1fwrHYHuhs8/hXPZt6I860fwLb4KZzvfo1w+IkFtqDLoj48bPx2lU+9BVWY9IKsuqrLqoWxqfZzro0HvsbaPB2Y14esmjR+D8hk3oSrrh9rHdHKuQsXcG1Ccfo8C7uPtHsPC/t2D/MT5WuN2w/hmKJ/zE/iyfwjkXILKxXehZOxdOPPF/TjTrgHOj/9QpgwMe2d476Snf6mzKTf3XwLdNgWM9rJEgu57770XpaWlKbG2b99eWYpefPFFlJSUpESZ//rXv6oy9+jRIyXKS2355ptvVmXOzMz0TJnLiraDVjv34uHDh1V5yQp65swZW3HYSTee18ycOVOV+bp69dF9dD66jymIyUouFeA51D20jUYPL5Yvnm0v1mlz/7V48eKUuJdTuf8S6I6Wnm2GTwToZqsvDdSyigbSBuLbBhh86taNbz6kHQTr78uq40nonvRiffz0usss9e3c9ry0Hf/8HfjBpf9hqXzSpoPbtOiROHpccskl8Pl8piRZx/SoHLSlgEB34jR66YASty7++qs62Di0Dto2Sdw8OtV+GHhSDbp7vVkHvd+sg7oJ/PDf/Y/ay5H0WXQvrc8/cLVlKC149z5PlY3q4ZYffMdy+Zy6TyWe5O+L3axjgW5bCB39RYkA3ZTr/Px8HD9+PKVWKbN36vvsrpFqxoTS9X+Iuo16rZ4Zuo8fPxZ1WekepvJ6rcyUb3bfsFNu18p7YDdOrJyaEOuu+aOs5WPDQhw/sNt6W8pbYS3eOOhgWmYqXxKPXa617QTR0Kv9V23aIJU53CKW7nDqRHkuUaA7ymxLcFHAXQVoqkDyqVVTyrmbtOupsb8wzYecSgv7TKdauVOpjqWsooAoELUCAt1RSxb6AoHu0NrIGVEgoIBAd0CKpN0R6E7aqpWCiQKigH0FBLrta1fjSoHuGpLIAVGgpgIC3TU1SbYjAt3JVqNSHlFAFHBAAYFuB0TkKAS6WQnZigJhFEgl6D6/EaA11ZZUhe5AuVOswgNuVClWbimuKBClAgLdUQoWLrhAdzh15Jwo4FeAIHTXO1F/Bl7085ACuU8BuU9G/Rl4D5XQPKsC3ea6yFFRQBRQCgh0O9gQBLodFFOiEgVEAVHAawoIdHutxiS/ooCrCgh0Oyi3QLeDYkpUooAoIAp4TQGBbq/VmORXFHBVAYFuB+UW6HZQTIlKFEgGBSoKAVplSQ0FBLpTo56llKKATQUEum0KZ3aZQLeZKnJMFEhhBQIvmKXYPN2pWuUC3ala81JuUcCSAgLdlmSyFkig25pOEirFFaAXKelFu33tkl+IVIVuqttUqF9jCz46AqA11ZZULXeq1bOUt9YKKOj2+XyoqqoCbWWxr4BAt33t5MoUUqAwS/sipZrdIsnLnarQHbD4ypiS5C1ciicKiAJRKFCnoqIC586dw6lTp9SW/o/FwmAfCu4jnY9FnpyOU6DbaUUlvqRUQKA7Kas1qFAC3UFyyD+igCggCpACdRYuXIg6dergsccew65du3DhwgXHLd4E1KWlpQrsCe5pX29VJxCndOlcYWEhysvLPVk7At2erDbJtNsKCHS7rbj76Ql0u6+5pCgKiAIJr0CdefPmKeh+5JFHkJubi6KioiAgdqIEBNW//e1vVTrp6ek4efKkcmehuAm+y8rK1DmC/y1btuDs2bOO58GJckSKQ6A7kkJyXhQAINCd/M1AoDv561hKKAqIAlErEIDun/3sZ9i4caMC3srKSvAayh2EUiJgppXChAtPLitPPvmkAusePXrg4MGDyprN11+8eDEA3cuWLcPx48dB19B5/cJpcXq0DZU/fVjepzwar+Fz+jjpmJ1FoNuOanJNyimQStBNZaU11ZZUhe5VtwGrbk212tbKnIrlTr2alhLXUoEg6F63bh2OHDmiLNFHjx4FrWfOnEFJSUnAMs3pEZiShZos4ydOnFDXUXhyESFXEQJcWigcQfWvf/1rBdYdO3bE5s2bcezYMRWOXEnIpYSs3LSS5X3r1q0qD3o3FIJiygeFpWspn7Q1yx+FZXeV06dPqzzSVl8myhOBPcVJcVBcdJ7C0TmKI9pFoDtaxSR8SipQshfY1iQ1Z7dIlQoPwKc9A4ZnZQo8bHi2BPYyHnhh2N7lcpUokCoKBKD74YcfxrBhw/C73/0uAMB33303hgwZgn379imIZQswbQ8dOoSWLVvipptuCoRv0KABevbsie3btys4JqgleGXXEgZr2tK1BM7FxcWoW7duIA4OQ3khGKbrCeApD2+88Qbq1asXCEvppaWlYc+ePeolUArHDwMc5/z58/HPf/4TV155pbqOytS7d2/s3r1b5ZPi5HM33HADevXqpc6dP38+8OBgtTEIdFtVSsKJAqKAKJCECgh0J2GlSpFEAecUCED39ddfj8svvxwEnj//+c9xxRVXBOC2f//+CrLJKk1QS7D8wAMPqPN0DfmDE8wyMLdq1Qr5+fnKwkzg/d577wXiu/3221X4Ll26BKzdTz31VOBaipdgetKkSQFXF3JHue+++wLp0Xl9em3atAm8BEqQTtZrhu769eurtB999FFVNs4jWdx/8YtfBM7deOONgTxQfHv37lXx8IOGFckFuq2oJGFEAVFAFEhSBQS6k7RipViigDMKBKCbYLRp06bK9YOs2ATWzz//vALR3/zmN9i0aRPY+vv++++r43feeSemT5+OHTt2KNeMKVOmBMB19OjR2L9/v5qphCCY4qA0OnXqhIKCAuXGQccJyslFhWGYZlOhWVR4FhOyXr/zzjuB9ObOnauAmNxBCMwZridMmBDwBSf3ED7++9//Hhs2bFB+5FSmF154IZAW5X/RokXKik6uJV9++aU696Mf/Qhr1qxReYjGzUSg25lGKbGIAqKAKOBJBQS6PVltkmlRwC0FAtBNoEkvMRLMkq82wTC5bTAMr1ixQoEyHb/11lvV8aFDhyqAZhin65o0aaLOkfsIWbvJfYSu4Rcpu3XrFvZFyiVLlih4ZlcRsq7fcsstKs5Ro0YFLNB0nny+GzVqpM699dZb6hwd00M3XXPgwIFAmWhOcgbytm3bYufOnSo85ZHyevPNN6v4yK2GtKB0rC4C3VaVknCiQIooEPB1TTHf5hSp3hrFFOiuIYkcEAVEgWoFAtBNs5esX78+MF0fuVUQvDJ0EwzTVH8EwXxszpw5yppNwEoLXdO+fXt1vlmzZoEpCPXQ3b17d+WqwjBL15DFm+NcunRpYEpBOkcQzeeys7MVkLP1mbatW7cOpMcArYfunJwc9aInX0P55weAAQMGqAcAzj9tn3jiCRUfzbJy+PBhge7qtiJ7ooAzCtBn4OlFyoO9nYkvkWNJVehO1c+CU5tOhXZtvOdStdxGHeR/USCCAkHQTVMG8jzdRhgOBd3kiqIHaD10c3y1gW49kHMeGKBpS/7XBOUE+eTmQsCth249xJMWlFeGbnrpU59/OsfQbXw4iKCjOi2WbisqSZiUVyCVpgxMVegOWHzFwp/y97sIIAqIAgEFUhq6yZot0B1oC7IjCrijgEC3OzrHMxWB7niqL2mLAqJAgioQBN3J6F4SztIt0J2grVKyldwKCHQnd/1S6QS6k7+OpYSigCgQtQIB6LbzIiXNpU0zkVh5kZKnBSS3DZrVhKcfNPptkw+2/ouUxhcpab5ucjkhVxArL1IKdEfdJuQCUSC2Cgh0x1bfRIhdoDsRakHyIAqIAgmmQAC6yS+apgykqQHNpgykr0gyXLPftpUpA2lGEwJkipvS+Oijj9S0hPQVS4Jn8sumMDxDyciRI9VHa+jDOATcdC37bVN69MVKmkPb6pSBAt0J1uIkO6IAvUhJULbuweTXIlVfKExV6F73UGq0a+OdS/dyKtzPxnLL/6JAlAoEoJs+jkNQbPZxHAJhmsmDrdPRfByHoJpWsorTVH38MR2ar5vAmcGapxqkfNDHdiZOnBj4OA49BNj9OM7y5cvVp+kpD7QQxLPVnV6k1M9QQuf4JUuZvSTKliTBRQGrClQUAnl/02YwsXqNhPOWAsuuApb9gOa08la+a5vbwMNGbSPy2PWBF4Y9lm/JrijgsgJ16GM0BNv0xcaMjAzce++96n86Rl9+pGM0z/WFCxfUlICUP3IJIRC28hl4Lg9Zs99+++1A3PwZeAZ5+uokf0CH0nbqM/BbtmwJTINIeSH45s/S01zcNA0iAzltGcjT09ODznE5eFtwpBhr954LWl/MyAevxnMUXhZRQBQQBUSBJFZAoDuJK1eKJgrUXoE6NJ0ffTDm1KlTIJcO+hIkuX6QNZss0fQ/+U4zmHKSBN4E0jTFIIenrzpSPAToZDXWL+y7TWlQvAS7FI7jpS1N9UfHOR5Kl66jhc6TOwrlh67n/FF87KbC6VFYipvywl+25HOcDzpHqz6NcOf4et7mbC8MADaDdrjt5PUn+FLZigKigCggCiSjAgLdyVirUiZRwDEF6lBMBJsEqvqVoJn/Z/A1pkrH+VoKz9eEC89x0tYYTh9XuPN0jtMyC2csU6h0zK7lPJidM5b/nfE7LIH3q6O24UJZ8EOIMS75XxQQBUQBUcDjCgh0e7wCJfuiQGwVUNAd2ySSN3ar1m6xcidvG5CSiQJhFVh1K0Brqvk2hxUliU8KdCdx5UrRRIHaKyDQXUsNI1m7xcpdS4Hl8uRToGQvsOud1PhcduAFsxR7ofDkVIDWVFv2tQNoTbUlVcudavUs5a21AgLdtZQwkrVbrNy1FFguTz4FUmnKwFSF7oDFN8UeNpLvbpUSiQKigIMKCHQ7IOa7IXy7ycpdLL7cDigsUSSVAgLdSVWdpoUR6DaVRQ6KAqKAtxQ4ca4cX6885limBbodkDKUtVus3A6IK1EknwI0Tze5l6TCz/AHe6eGG42xlYq7gVER+V8UEAU8qABBN89M5wR8C3Q71AiM1m6xcjskrEQjCogCooAoIAqIAqJAHBTQQ7cT8C3Q7VAlGq3dYuV2SFiJRhQQBUQBUUAUEAVEgTgoYAbdtYFvgW4HK5Gt3TJjiYOiSlSigCggCogCooAoIArEQYFw0G0HvgW6HaxEtnYngpWb8sANQrb5okWGaCD3gbQBaQPSBqQNSBuIVRuw4vMt0O0gdFNUn03ZnRBfnxTolo4lVh2LxCttS9qAtAFpA9IGpA3UbAPk6XD8XHlIshToDimNvROJ8ijeYiMAACAASURBVLl3ge6aN4N0EKKJtAFpA9IGpA1IG5A24HQbINgm7orEgALd9tharhIFRAFRQBQQBUQBUUAUSGIFIvl0W4Vtlkigm5WQrSggCogCooAoIAqIAqKAKOBXIBR0RwvbLKhANyshW1FAFBAFRAFRQBQQBUQBUcCvgBG67cI2CyrQzUrIVhQQBUQBUUAUEAVEAVFAFPArwNBdW9hmQQW6WQnZigLxVKDgRSC7jqyigbQBaQPSBqJtAwUvxLP3lrSTWAF6MdLKC5JWJRDotqqUhBMFYqlAdl0ZaKMdaCW8tBlpA9IGuA3Esn+WuEUBhxQQ6HZISIlGFKiVAgzdtYpELhYFRAFRIMUUkL4zxSrc28UV6PZ2/Unuk0UBGTiSpSalHKKAKOCmAtJ3uqm2pFVLBQS6aymgXC4KOKKADByOyCiRiAKiQIopIH1nilW4t4sr0O3t+pPcJ4sCMnAkS01KOUQBUcBNBaTvdFNtSauWCgh011JAuVwUcEQBGTgckVEiEQVEgRRTQPrOFKtwbxdXoNvb9Se5TxYFZOBIlpqUcogCooCbCkjf6abaklYtFRDorqWAcrko4IgCMnA4IqNEIgqIAimmgPSdKVbh3i6uQLe3609ynywKyMCRLDUp5RAFRAE3FZC+0021Ja1aKiDQXUsBvXC5z+dDVVWVWmm/tos+PifjrW2+PH29DByerj7JvCggCsRJAek74yS8JGtHAYFuO6p56JqcnBzUrVsXv/3tb1FYWIjy8vJa5f7kyZP4xz/+gTp16qj1qaeeCsSrh3En4L5WGfXaxTJweK3GJL+igCiQCApI35kItSB5sKiAQLdFobwYjMA3MzNTQfdjjz2GLVu24OzZs6gNEDdv3lzBdr169dCgQQM0bNgQW7duRVFRETp27KjOtW3bFhcuXFCWdS/qFpc8y8ARF9klUVFAFPC4AtJ3erwCg7Of7MY7ge7g+k6q/6jxLl68WEH3I488guXLl+PUqVO2YZjie/rppxVYDx8+HPPnz8eKFSuwc+dOnDt3Du3atVPnWrZsiUOHDqGsrKxWgJ9UlRGpMF4cOKpKgd0fAbs/0NajQ81LWZgFHOgOFDwP7HoPOD4OKD1gHjbc0bLjwLGvgV1vA/n/BPZ8DpyeE+6K6M4V5wJHBgPbXgZ2/Bs4kgGc31AzjsMDqsvMZTdu97aqeZ3ZEctx1d4trEbyp2YB+9oCW/4E7HxHK3uNQLoD0YbXXRpyV69b0aqQwRw9sb8TsOdjbT053Tzqc2uC6zhSez09Lzi8vlz6/UN9zdOL1VG6X/Tph9o3S7/8NHCgG7C9GbDpv4GdbwCH+piFtH7sxITq/OxrZ/26cCG92HeGK08Kn3Pyl/lEhXeB7iRu4Hro/tnPfoalS5eC3EPID9u4cAOtrKwErRSGjukXOk7uJORaMnv2bOTm5uLIkSPKyl1aWoo2bdqoc82aNcP27dvF2q0XL9K+0wMHDbYF7wNr/gysbwIc6g9UnImUC+vnT00HVtcHdryuAXX+P+Hb/Bx8JUXBcRS8AOT+BtjTCjg1G9jfGch/Flh6BVC4MDhsuP/OLgdW1gMovsODgONjgb3tgFV3ANsah7vS2rlD/YAVNwA73gBOTgQIjijeFdcBBMb6Je+vwLYmwMEe5uv+DsCy76Oq8LD+KvP9vL9ZjOuQ+fV2jvrKACrD5meA/R2BUzO0cmz6A7D+5zUfNCKGX28nF8CRdGDNjzWwW3Ylqg5NsxdPNFeV7AOWXAbsbQusvQe+PT3gKzkXHMP+L7UwW57V2vaae+DbNyI4jPG/A12B3KfM2wO3k23N4Nv4PzXTM8bl5P8E2Vv+HDZfviXfRdXJvOBUjw4Dlv8QWPcwcHQEcHquAm5f3j+BdQ8ChTnB4a3+R/W9vbnKky/3L6gqdKBdO913Wi2LhHNUAeIN/S/zeXl5ii2MHGIlUbvwzhxkxj9W0rUSRqDbikoeDUMNiC3doaCbwnz99dd46KGHFDATUD/wwAOYMGECLl68GAB0Csd+3PrtE088gTNnzqBDhw41ztM5soBXVFR4VEEXs+3UwHFxJ5DdABh6OfBSHeDXdYB/1AHerwMs+B4QyhodTVEJeFffAZycBlzcpV15dDjKpt6K060fqoaKLX8BtjUF4AOKVgCH0rTB21cOnJgE5HwLlbtGRU6ZrM1LLgWOfQX4qoCTU4HjY4DKC9q1m/4XFTnPaulEjq1miANdgNV3AcV5gK9Si/v0LC1c8WZgxW2oXP9GdfwErCenaHkh669xPT4evqzvKi3KCjJrpqc/QtAdMa7L/HEt1l9pf3/j49qvBRQD/QpxeCBQsluL73A/VOXcGwxDgfA+a+Gt5mzNXcCZxcDu1iifeQdOt/s5ivr9n9Wr7YXb84lm1T+/Eb6sH6g0z3R4vLpu8/+lPZCU7AEubldp+NY9jXP97sS54a+FTpOgm371obZubA/0Py2nZqFynv8euWh4OA0dc+3OEHTTr0y0mOXr1Cz4sr+Lwo4P42LmYC1cyX7toeOY/0GD7t0T46sf2ne9harMesFtRLsy/F/6FYkeACrPw5d9Oc71ftCZdu1U3xk+93I2xgoQY9Cv44cPH8b69ethF7opHj28W3WrJdBmtiGmqe37b6HkEugOpUwSHKfGFw666fxHH30UaGg//vGPlZ82N7yPP/5Y+YCz5ZtexrziiitU+Pvvvx8PP/yw8ukuKCjAgAEDQH7edO11112nIL5Ro0bYu3evgndKS5YwCjg1cCx/Auj6baBOHeAHdYA/+bf0//11gMV1ULmvli4ZR0cBWxsCuz8Bsr8FFGYDBN2Tb8Lpdo9q0E0wvqKeBiG7Pocv69soHX8DKmbeAN/yu4CyI8rqXTrhdlQc2RZGGAB7P9eAhn7uXvlTFUf59Ou0tMl6XrwRvuxLcG7U69XwFD7G4LOr7wROz1AA6Mu+FOXTr0XFrGuAnO8BpYeBUzNRuag+SlaP165j6D45Db7sK1Ax56Yaa/m060EwV7ohhPsC54ChW8V1eY14KO7quBywBBctA9bep1L35TeDL/M7qJx7BXyZlwFbNaj0rXsM5/reo2kZFP6VEOF/6Q/PhbKwPTII2PK/QPkJIPsSnO18Dwq7/DayXhaiDhmkqkT9AoGL2+AraIaLX92C0+0fxcUFOpePvGeBQ/3gW/cUkP0fSgPfut/ifJ/bUTTwuZBRg6G77BiQ/e2geqTygVyX9rUHtXdqF45YeEPnpvoMQ3fxFlDbNmurdE/Sw3IAure3APa2VnH4VtyByvnfR8nXt8C36LvwrfsfLe5Nf8GFIbdHV45VdwKFmfDt+ABlE29WaZ7pSpb/Wj6AONV3Vqsme3FSgMCX3gf7/+1dCZQV1ZlujCgIiqCi7KgsIqCgQVyAkDhRk+AyGeOMy2TUaM4kMUaTeCaSGFmaRVFUctwAh2BUEIONoCiydDfdNE2zNI2sDSKLymb36319r745339fva639nvdxfRr+d85r+t11a3/3vrqVtV3//r+/1IG29TED07eE6+slvuQ8NvcZ9u2bc2Of4sGoZLuaMh8C9Y7O18kTzdHk+xkJNIkzZ9++inS09Mxd+5cdOzYUbatWrUKFRUVIjnhRcCATO6zYMECKZ+bm4vCwkIcOXIEjz32mGy75557RH6Sl5eHQ4cOobq6Okyq8i2A191DcOPBQc/zgi5CuK3H2wCr26D2zU7wLW0La/5phojfk4K6tzqhdmczvKYk3dnnom7pJfB+0jUy6eYr6Z3/AfhqgfTTUDJ1MIonjDTEakF34MBUoDRbPGbFk66LjeX6PsBXrwM7H0DNwm745i/D4Um9AZVz+8DafKvsa629ACXPXpX4cZWsBTZdITZ8uWNR+XpPFE263rRz4QWwCicYD19GOyEJIkVwkO765X3hmTpWiBTJlPPLAUgipLt+eZ9GbLlAuvf+zrx9OPIGfGs6yTF5pt+IkmeuBDI6mvNQ+CtUzumN8oVPAHsfdZQ/N0r5XzeUj30mG7ZSFlSSAWvPI6h592KxG5PUNuzZ9F9fvmDiCupIjNvAM3koiqeMCZYBkXRnpKB6QT9YmcTDQlyk++B0MzCsPQor/exAPyh9YRisrO7GzobhKHuxH4pTRydGVpt+xEY/TU93xWfwre4aaJezn/I33zJU57xlaiq40Ui/PJnwftLZXG8zboEn9RrBBt4y4OB01Cy6xPQRevcb+/BtCt981Rww2E8Z7N4gy417Z2Pt1+3NRoB8hKTalm5wGSpntcvw7Ti38X/nx94eup/TLsuEOhuPHz8ub9xD97Ntcx++2bdJN6W4x44dk31C22Dv09Slku6mItcK9ovU+WxNN7f98Y9/lE725JNPghoo6rCp0T58+DCmTZsm25544olA56Nue8yYMbKemm56uNmZKSHh6JR22Gnvv/9+bNmyBUePHpX17Oj6aQQBNx4cDHp6/ExDuj88DSXTBwmpoAexPq0TcH0KMCAFvnfbonja9xtpUIzN9WUi8SieeC28K3pEJt181V5wC1CeD6S3RdGka0U6IF7tI3NhfXYPUHcMyDgdRZOuCyY+oVXnj4K1YTi8Ky5C6XMD4Jk2VsisdSQNWH+JKZ15lmwL8lqG2on0/4FUIKsjsPY8IP07KHp6mGBDAmLtnQTsetB4fDPPQknqcNTt32jkB5SEnFiC+o97o3Lu5fDl/wK+g/Ph+2aXHAv13PyG6YVD2+DwdNd/3Kt5tkJtR/p/x53ApuHwruyJqjf7Sv+oeG+8aeu6vkDlbqDgJlS/1QvFU8cCO/4tjvI3N5SPVGfoOsYXbL/d1JXRVsivZ8po1O3PCy3p7v+UEHGQ9flTAU+reTviqKYkG3WFi+FJHQ5knp0Y6c67DFb+zbDWdIBnyhjTRwvHA3t+A9QeEY8+PcolM8eZPuWo9qT9dHi6SborZg+Bd/1d8B2YDd/x/Mh9lbET1L5/8WdUzbsInmdvQsX7T8sbKV/eWOD4Yrn+OUjkPUAkNY0dgD3I2vUQqt/uZQZZr90b376N2Xbj3tlYHbq9WQjYfIKZzT755JNAQgbyhdtvvx1r164F+UVGRkbUFMd07t15553CMbgfZbB0/k2cOFHW2VnTyDecpPuNN97ArbfeGrTfwoULA85EciHuYxNu5/LDDz+UdrlJvJV0N6srJffOsUg3R4aUi7CDLVq0SAg00/7xFQs902lpabJt7Nix2Ldvn3Q8dkw7kHLlypVCzql7sjutHUj54IMPaiBlol3DjQfHZz8Hbk0BhpJYnyke29KX7zIPy4LHYY1vC7RPAVa2EaLbqKyjkWMom/sgrHVDI5Nuet0LbjIP1fQzUPbSCAT0zRuvMIGd33wA76pLxfMX8LJFqbMq8w3jZZ0yGiUv3mbs7vklsPcRQ2gyje65SRKT2q/hee46eCZfgeIJI4RgSDOY1YNe/fItsDL4Cv4qI0VweLqR2R7W5h8D9A5uvdFozw9MinIUEVY7SDcy20WwNTnCTs1bxYEDyR+JLklT/de7gKJlQK5/ALP5epS9eKmfUEEGGrHL3xBUvtHWsR6S3+33GonHpGv9eulgr1ajdhIpwDiErT8we2Txrchlcg3IICrEDgdL5W/8B5DdRfpZXJ5uktQv56HilX4iRSlOvcH0961jjZb66Juo//DicDlLSN2u/+sg3chg//qh6afUVmefCxT+Kpz45vQAar4E9o9H1RvdZfAVkMNw0MZ4jG+WgqSbHvJG5SEMUuY1Qx19xlkonjhUvNyRsG/S8btx72xSxbpTPAiQH6SmpgqfGDRokCwHDx6Ma6+9Vt6yd+/eXZx+dAiSV3BeEWeKY3IVep07d+4s+5KzUDYycODAgC2ue+SRR4STkLzzDT3tdOvWTd7aU/pKm6zLJtWvv/66SFjoVSfvYQyavY2EnuoAknPqu9kGtz5Kut1CMgntxCLdTgLNzjVq1Cgh1CTV/NoebW5jIEJ5ebmMBm3SzU7NgAfa4Yed0ibdzF7CUanKShLoFG48OLbdB/woBbgyBd6328EzzaGRpTxjQkfg9BRgVYoQqgAJTqCZYUXzx0Qm3fUlhoBSw/nFdPEie7PHAPmjgfyxgLcC1va7UTX/YvEKxtMWDhJ8238Ha9NIgDrsTVcCpeuBXXej/qNLUPTUMFSkTQxrYjwrqGe1vzIY8XwK5PaWXa3t96L6H72FkItcxCbdDDijp9xXBZRtMtXUfgXkDkR9boygO2eDbNId1dYAvy13CSmP0ftFGrBxBJDVyWSq4JuS0hzRx1PCU/L8jwItjV2+nUgQnOUDO4b+YCwAj7lsvWifGRNgZZ4HK5/Bqf8MLe3e/+x3x9+TQOL65b1RMv1y8TzLWw6+6WDgpPNT9w2w7rz4Sbd/37L5vxHtN6Uy9ftWmYBEqx7W9n9Hxau9ZaDjGtl0tjfab5t0c/vnT5hSTIdof7b8APU5IcGroaRb5F/+/hdCuilNCRBy22boMrePGWTlDgDS24tExbd2kNGNM3C5uR837p3NbYPuHxUB8hDbG03Z6rPPPisebaYwpieZclZKXfnWnBJXkmWnFpscY9asWbKepHn27NniLefb+VdeeUXWkyw/8MADwjsoE7FJN9f//ve/F893dna2eNRtr/eAAQNkjhHKZ+0ATpt0M5EEveV2EKaS7qinVzc4EWiMdNOLbXeyaEsGSzI1ICUkTqKupNuJtAu/3XhwhJLuKaONF5PNI+meeHYD6Y4nyC+ew4pGurnv8UUmGO3EYtGU4sgcoNifJnDbrfCuGCQeV2qf40qvR5v0zO19HCj3p6nLHwMrvSNKpl3uJ+/N0Krbx8uAO3rjv54tqdaszPNR9NfhooeVdtqkm+X3jheNqm/lBbCy+kmgGEqzJHtJ9YZ3bYvRlzbpFltPhthKh7HVviGIM7qlxLcwx/mWkUCJP/3bnoeFEFXMHSADmPL3QnKNJ1o+Uos2XGYIGHwm57q3AgxslPSBazsAxR9H2qt56zyrgbzBxsb6y1H20qUoe/FqWOv7Q/TJOX1QvWaikQ7ZNTWRdNu7y/LoW8bDS114ZicUpw4OvD0IKncy/3GQbuvAizLQYPCsteYC4Oh8oN4DK/McVLz/WEMr3CTdTD342R3Gm85UnxUFAK8v5jXfdBWsLS5Ibdy4dzYcvf5yGQEn6b7llluwfPlyIbN02lGCai8pUbU93c4YNHqi7flBKImlFIVzgzCOjDFj9gzZlLVSIusk3RdddBGWLFkiclfKZlkfkzvYCSHsNMp8Y883/TYPIvnnG/6mBnPGglA93bHQaeXb4iXdHGlSo82Rnf0lqeYFwNEkOzgvCCXdJ7FDuPHgSDbSve9xgKS8vgioOWheS1fsMCAeTIWVcRFKnrsSlcumxg8sSXfBj01uZ3qHj/4d1oarUD2/u2hlG33VHU9NzAXOgEPqcLO6ovxvfUUWEEgZR9K95XqAeYY/vRCeKYNFs16zsBd8G5jdwQJy+sAzY1iDpCZavSTdMW0ByOntt+XCgMLZDpJovjH44q8mpWNJlpBT7yc9RfITprFutPxGp/Xw3/SwbiT5tSTA1jowHb4NY4B9JHw+4JsPYKW3R/3eFeH7NmfNjp8ZOVPRcnhXXmj0xLNGAhuHiFUrqydKpl4e3A/dIN277jMTDpWshU/qHebPsNOcg0lwX5LujVfAyr8V1uqOKJ3ZH0WTr0fV/IHwZfsz1OT/AOV/G9AQ9Osm6ea1wjkD+CnNhrXlJ7AK7jZyJq4ruA21Hw43fcKUSvyvG/fOxGvVPeJEwEm66Y2mx5nkl0SXnIKk2g6cdGqxnYTYfsM+ffp07N69O6DHppTEjiWj7VDSTachCTTJOb3ZrI9v4O03+TNnzpSJ/NgWZyAleQ8lLSzv9kdJt9uIJpG9xkg3R4Yc2TE1YEFBgXRMjjr55YyS/PLisHNt8xWL3fnV0+3yiXbjwZFMpPubNGBdV+PV+ny8ZHSoW9YDvlUXmJSBooGdhfoVfRsPNnRCfWIxrN1PoOadCyR9HaifrtgJZHZE5bIpzpJN+31gMlDgT4u28XuofrO3SCcYVBh4jV6WB+/umSh/pb8JApw6VoJEa3JmAVnnGgKx7Q6Uv9wXlcv9OZKjtSamrU5mr223x2crWh3R1pNYHpiE+mXnwbfyXFh515iSm0ei/LXvhhOhqOWv9ZePVpF/Pck9Z4Kk5zf3CtS+1xWlz/eXjDTW5ptNfVt/iLK/9Ws8jWQjVQU2V2430hnmd8+/WSQezJZTs/JPIaR7kPuke935QPUXkvKyemG/uGVUgba78aNqD6zD81D+cj+UPHOZDB4ZE0GZlMVA0ZrDknWFQbWM0TADxhBNd1PlJZSOZH4HoNTsxAfwreqMyjk9UP1mV1hrzjaTMJWuh291L5RKUGUTD9iNe2cTq9bdGkfASboZ70UpSUlJScTMJNFIt/1WntIUEmiSdH7ISZ566inhMbRNWavT002POQk0pSu2RMTpPHzuuefw+eefCxF3km560+2kE40fYWIllHQnhlerKs3OvmHDBtE8Ub9kj97YYdkBly1bJp2VOqv3339fLgSOBvll4AO12Tbhpq3GSPecOXOkrnHjxolWit5xu6O3KuBaorFuPDiSiXRzqnZOOlO2Ab413eCZNFQe+Mw8Urv4PKDgp4C3VOQnxZOvS4h4MyNI8eRR4rWzsvzBf3lXovSFwc3LgMGsDOLlOwRrz6OoX9ZHvKJM8RaaYpFtKH3tPtHvMngzkKUk8wzAVyPpDSte7eUnMrE7lLF1r8OWP29xZluTcnHn/Wiw5a62my2jDpkBldbqdmZCmP1/Qc0/h/jTwYW3PdHyAQucKImTM9WdgLWmrQnmnDYWZXOYpu9MQ/j2P4nqdwY0Ped6oDL/DwbaMud0xVZY6SZFItMEWsU5DfnKxdPtMun2ZACb/QOX9UNkcJGQjCr0OJrxP/uXrTXn25qAlCvvcqByh6T/Y0aRQCYStzzdHFiv7yUt9xXcb4Iyp4yR7EC17w+EVfikmeAq4/QG6VZTjtONe2dT6tV94kLASbrJKfLz8yPONMlyjZHuGTNmiDPQ9kCTX4TGkoWSbttjbnMRJ48h6baJupLuuE6nFoqFADsxCfS5554r5JrEe/To0SgqKpL11DDdddddso0e7yFDhoAjyk6dOsm6c845R4g6yXM8pJsXE4MgaIuRyY8++mjgNVCsduo2iJaX+YGb9Ukm0k1NNIMcD7+Amvf6iFyhbPZ/mUwqx9bCyu5hPJ4brkbZSwMbXm2HAlC5y0wdz+nj+Q39ZF8E1BySfMTMtNCoZzl0f/t/6oqZzYHTXX89B75V56N4wpXinQyTv3z1GmB/mfPZ+Qkh3cXTb3RuDf9t2+EyzFYw6Ta2mkm6bRy5ZIYKx8daP8DIMDzp8K7sjiKmg0u0vMNe2E++QWDg6fFF4FsPz4ybULncPw07Ax2LPwUKf4O6pb0bCGCYkQRW1J0wnlYGtxb+N3wrz4Z3+UXwZQ42093b8pLsXvAuPw+1K/zaY1bRXHnJ/ifNpE41h2X2xYZUgQm0342ilHbYfax8a7DFENLNNoJ5kd0i3SXZQBbTLgJW9qUo/9vF4FsGCVT+8iVwEiZ565HVC6UzrmjIEx7cysb/U9LdOEYtWEJJdzD4zXzKBxvT/5IPAY4IOXrs0aNHgFxTSsIAAeqhKCWZNGmSpMexgwgYIfzwww9j6dKlkkqQ3m6bdNtpBjnNKnN62yNObic5p0bKnliHxFsnx4mzT7jx4Egm0l3wLzKTIzNG1C25UEh3wMNGcrV1jPFsrrtY0reVv01dbwRCWZIOrO9uZAnZ5wEnVjUAWlVoJCxcs/NuVLySQN7gBivmF3XVh2cCpetkpsvSGQNlMh+ZIMbZLk5hz1k4d/0c4DTm+37bYKl4hdFns3zecPFuxiTdVr0JNI1pC0DeMIetCBg1tKDxX1kdgMJfAltGwCpkNguHvc1XAww6PPY26j/uLyn1kHVWQuUD5zhSS5g9g6S7ah+s1e3hee7HRvNOTDPPNER33+Ooevsy/8ymzZypkN7m/O+ZYyQB55Tzzi9nieSHQbm7H0DtB99tCDxuLuneNFw0zPh6Lmrf5wAmZObLSPicjHXU7DNuYPMIgNek/eG1k2Mm7cGue+XaCZBulpWp399FXVoXIcqBfsIc3lV7gK9eRm3apX4PdfDgza5CglR5XikD2PATVM7uKTIsWfHFBGDfH8zEU/50nwnn2LcrcuPeadvSpesIuEm6KYUNlZdQy03uEk1eop5u10+pGoyFgE2GqVtiih7OOMmJa5h7koSZr1RIvEnEGeDA7fyyrD35Db3l/NAWtVhMo0MbnKrVfmXD7bTHdbTFJPc5OTk6DXysk+Pc5saDY+fjwH+mAJ1TgE/bSHoyycHMevb8Ani4C9AtBdaS78jDstHZEp3ti/Y7WvaSAxNNijJmR8jqibrFnWGdWAEwowMnKeEsedUHJXMCH/ZmNkIHAXTWt74HULkL1t4n4f34PNRlPwow7zI9lXv9pHddT5lK3Ez6E8WO06bz956HgN2/MAQg63yZrr781f6omneV5F7GsQWQr73PrnuFdKC8QAL/qtNuAI7OM3mgD00DhEyfhuKnr/RPhGLvGGHJYLuvXoax1Q6RbbVx2Erw2EKrZIYSGVzkAumno/a9ngBnCySOG/qZ0oWPoOqtQfBMHQNf/s8c5dtGKf/bQPmY6fCII2d8pKY7ZxBqF3WDt+BxYOd9fkJoAVtGoeyFfiI9sapcIN2UN5DsR/rab04OpgL5o1CzoB+KJ11vMGgO6a7+HMi5UOxYm39iCO2k64Kzo4Sel5P1//6/+MltCZDRHlV/7w0cet5MTsS+wHOxrq+ZSMue6IZ9svDXktaTM3dWze8BHHzJrNs0zBzXrv9G1d/jmNKe3nROkMVYjNVnoCbte+ba52DOswYoXgXvKsq4WEvDxwAADT5JREFUhgVr6hPBw417ZyL1admEEHCDdD/zzDNCrPv37y+SWTuxA51/9tv1SIGUziwoNleJJi9hgGXv3r2lnnfeeScwKWBCBxtHYfV0xwFSay/CTkZyzcAAptkhMaaXmxcDvyTV9GYz2IDb+WVZ5uam/ptl7A+jfEm8SdptG/Y2Lu3UOwzAZPSvbcNZRn9HQMCNBweJ35QOMiOl77XTUZd2Puq3TgY4/fXqc4DuKcDdKfD+o30D6d4zAdjxK/M9mEAWEfsQopFuTzqwrhvAV8zV+2HteEC8v2Amia9fl72tHff782sPjy0LkTSBj5gav3wJvtzRgExc879m3VevBvS6pa//3Hg27fY1tqSchLISfmoOwdp6u0xQI1kWtt8J7Px3813XBSjNNeVOfABknWOymxQtgy9vHLBtnMkDzRKf/wnej7vFlzdcbHUCao9KRodwW/8Tvy3Tuth/v1lq2s4Av5JM+DaOAzZdbTzQlTuN1zerq8zuKROfHHk3jvIXNpSvLotePzW+TAt4Ig2o/Rq+nX+EtX4ocPhFM+A5Og9WRhcUcbAiOcIb7jvRjcbYQg/6oWdR/fYgVM7tEfSVYL6sPrIzB4VVfzdBnUbX3Ex5CQdRu/7L2M7sgOLJQ/ze4hhtPVmbKj4Dcnoa4utZA9+We2BtGgUc8V87vJ7SLzAZXexrp+gjIJcDMAsoy4Nv871A7lCAA0p6yCu2SY51ydozYWTs643knbOa0lbRx/BtuBHY+XOA9wdmrMn/Hqr/0UfwiSdXf0SY3Lh3RjSsK91AoLmkmxyEGdQ4wY39Np7ZRziBDf+310dKGZgI6SYPuu+++8QmJ9Xh3CUMqCSncfOjpNtNNJPYFjs+yTe90Vw6iTSb7dwerYyzXCQb9uHbtmKVscvq0o+AGw+OuuPAqnbAoBQh2NYjbWEtage80A34gSHjeOU0VM5iSjj/jHkZVwKPpQC/SYG14uKGgMB4TwxJ9/E0IU61i3v5ZQF+4nX0TRMgR5JdvsVYpI6YqeEKbkf9yqEmmG7qmNip9SwvfHk3AQXjTH5fSgXoTaZmfMe/wcrsGsjMkPArapLurd8Hao/F/FrrBqJs5hDRIPNALObnzuknxyLT2TN4siQD1pax8K3pi+KJVzRg3AiW1t4/+20tRWxbLqUMPDgdVnY34NhCoHqfaR2188f+AWttZ1TMYZ5ue7pySKCdKb8gvvKxjrf4E5koSQZezCzCD/tG4cOwMtqjbNZwkWI0dZKjSFVL4Oe070sAH9+E8Fv60ghYWb1MUGdWd5RMHSQ68sC08OLp7iKDIStvlMwyad7GRKohZN1nt5m8+McXw/spZzIdFjUoNWTPk/Pv16/BWtvJpIZk6k5+ynKB7T8z1860QYK5M3bB2nEfrNzBwJezgLois0/NV/JGx8rqIl5uHlcg44kpEfGvb+MtIt8BU07WlwrmOLEE1tZxqFt+lfQ1xg/ElCZFtOxf6ca9M5Z93dYsBMgH7MlxHnroIZn3g/FkkTiIHUgZOjkOnYZ8e37bbbcFiDdlsH/4wx8k4QPJdyTS7bRDPsIPl7ZM9vnnnxdCTy83yT1TDlIWa5P7+fPni5PR3rdZQPh3VtLtBopqQxFoLgJuPTi+ehnWB6cBN6cAHVLE6402KcCoFFgz2sA7/yx5yDGDgzzkSLqHpwCXcep4M5V6Qg+/bTeDD2Gkn42aBd2DSTeA+h0zUbdsIHzp3YHMM2BlnAPvyn4ywyOJHaddD5uEJQqWNe9dDu+qi4H0dkBmG/jSe6M2rZ9MjCMk8fkfNaT1i2IjbDV1v+u6SkpDTrIT9bumgxD7ACmjM3TVz+DlQCXjLDPLXvolqFk8UNIIFk+4xp83PIbn19GYulV3xmGrmXILR321mb+E95P+sNK7AGs7wsroirqPLkHF7MtM/5jMQVkDyY+v/BpHDdF/enc+j7rlg2Gld5VUj1ZmD9QuuRRlMykrGQbPsz9sOgGLXm3wFokHOB9WZkdYa9rBkxqSp9tbafpFZidYazqI5CVu0k1Ji/+aoBfXM4WDygYsgxvy//Nffd6f4F3RT64/ZJwBX3ov1L7fT+IpiDnfLAQy8PibVJvxMHyrustgCJkdZIKf+o8uMJlYnhou13pYLvcoh1P7z6Hwru7nn4W0ndwDqub3NX1t4jVIeLDsrMete6fTpv52DQGSa8pBONnMxo0bZWknZ3BWwnL0NjNVMcs5Z4OkI5BEnR7v9evXS5waZbD8zenfSZK55HYSaL6FD7Vjk3wubZks62E51mu3c//+/WFSXCXdzjOlvxWBbwMCLj44vPvmw7eoPbCyjSHg6SnwpZ2OylfpdRsuJCDwkHOQbu/CM/068N0JIcrXwpwOmuSC9kMf3tT5CsFOvVqWRU9dheKJ18hDO1GPJgMuKXvwTDK2ip8eAU/qDc2eGIe5i+n95zFE+zLzgpN0EyTiKJimXmuO8ekRkvWj5KV/DcOhMVBj23KPcNvt4Hlj20umXw85JxNGymt+5iSv2fqRXSywTLR8YMcIP+w+4Zk60l/3NXIe6YVOaNAXwXYiq5gfmueVshKnp9e2UfHen8321Bv8cQf2ltjL6py3JBBVrgnx4kYJNoxtxtWtNuYlz9jn22BeMnNcVMyrMt8w/XvqCNO/J4wUrT/xqtmyJKH2McUmr132OelvT39X7huJ3gPCKnXx3hlmW1e4ggC9yJSwUtpqpyGOZJjkloSc5ezZIEmG+aXslftS+sokDvxSxtqnTx8h3a+++ipImEmgSdJD7Tjro2SE9lkPy9mkmstoUlzn/s35rZ7u5qCn+yoCbiHg8oODQZJ8MJY+dw2Knh4mHsRikqrU0UIUA8TYT7qtX7aBd1G7JpFuQkBCxm+sQDpuY7tISPg70IYEMeR+rKtqzWtiT1KQJWgjtDht2McQaxmtLjfb46at0OOM9D/r4znhl8fX2HlJtHykOu11obbs9f9fSx4v+yS/kci+s19EO/eR2kpbPDZ+Y10TkfY92evYpkSuHef15ta121w7QRi5fO8Msq3/uIYAiTNJLZexPnY5Z1kmbujcuTPuuOMOSeJAosxEDz/96U+FcFO7TfkJiTkJPj+R7Nj1xrMtlszWttOUpZLupqCm+ygCbiNwkh4c9gOWXjybVAU1naR76unwLjgLxZzAxs6jG1RI/1EEFAFFIEkROEn3ziQ92lOuWSTIJNh9+/YNaK1tzTWX1HbPmzdPsqZF0oonG2BKupPtjGh7Tk0EWurBsfZ8WB/1hGfK9fKqlxPYNObpPDVPkB61IqAIJCUCLXXvTEowvn2NIummRpupiBmQyQn8GCDJ5fjx47F48WLRgFNq4namkZOBppLuk4Gq2lQEEkWgpR4cNYflFTh1lkq4Ez1pWl4RUARaHIGWune2+IGfOg2g1IPphzkxDgMsc3NzJYhy06ZNknGE6Y4jpTBORoSUdCfjWdE2nXoItOCDg1rVwHTcpx7yesSKgCLQmhFowXtna4attbWdGm8GSTKYsqioKBBsSX03ddz0iLeGj5Lu1nCWtI3ffgT0wfHtP8d6hIqAIuA+AnrvdB/TJLboDIJ0BlsmcZODmqakOwgO/UcRaCEE9MHRQsBrtYqAItCqEdB7Z6s+fada45V0n2pnXI83ORHQB0dynhdtlSKgCCQ3AnrvTO7zo60LQkBJdxAc+o8i0EII6IOjhYDXahUBRaBVI6D3zlZ9+k61xivpPtXOuB5vciKgD47kPC/aKkVAEUhuBPTemdznR1sXhICS7iA49B9FoIUQ0AdHCwGv1SoCikCrRkDvna369J1qjVfSfaqdcT3e5ERAHxzJeV60VYqAIpDcCOi9M7nPj7YuCAEl3UFw6D+KQAshoA+OFgJeq1UEFIFWjYDeO1v16TvVGq+k+1Q743q8yYmAPjiS87xoqxQBRSC5EdB7Z3KfH21dEAJKuoPg0H8UgRZCQB8cLQS8VqsIKAKtGgG9d7bq03eqNV5J96l2xvV4kxMBfXAk53nRVikCikByI6D3zuQ+P9q6IASUdAfBof8oAi2EgP3gyEgB9KsYaB/QPqB9ILE+0EK3bq1WEUgEASXdiaClZRWBk4XAznsTe8DoA1nx0j6gfUD7gOkDO+85WXdmtasIuIqAkm5X4VRjioAioAgoAoqAIqAIKAKKQDgCSrrDMdE1ioAioAgoAoqAIqAIKAKKgKsIKOl2FU41pggoAoqAIqAIKAKKgCKgCIQjoKQ7HBNdowgoAoqAIqAIKAKKgCKgCLiKgJJuV+FUY4qAIqAIKAKKgCKgCCgCikA4Akq6wzHRNYqAIqAIKAKKgCKgCCgCioCrCCjpdhVONaYIKAKKgCKgCCgCioAioAiEI6CkOxwTXaMIKAKKgCKgCCgCioAioAi4ioCSblfhVGOKgCKgCCgCioAioAgoAopAOAJKusMx0TWKgCKgCCgCioAioAgoAoqAqwgo6XYVTjWmCCgCioAioAgoAoqAIqAIhCOgpDscE12jCCgCioAioAgoAoqAIqAIuIrA/wGRaJfjQ8wrwAAAAABJRU5ErkJggg==)","metadata":{}},{"cell_type":"code","source":"#credit https://www.kaggle.com/harshsharma511/one-stop-understanding-eda-efficientunet\ndef rle_to_image(rle_mask, image_shape):\n    \"\"\"\n    Converts an rle string to an image represented as a numpy array.\n    Reference: https://www.kaggle.com/paulorzp/rle-functions-run-lenght-encode-decode\n\n    :param rle_mask: string with rle mask.\n    :param image_shape: (width, height) of array to return\n    :return: Image as a numpy array. 1 = mask, 0 = background.\n    \"\"\"\n\n    # Processing\n    s = rle_mask.split()\n    starts, lengths = [np.asarray(x, dtype=int) for x in (s[0:][::2], s[1:][::2])]\n    starts -= 1\n    ends = starts + lengths\n    image = np.zeros(image_shape[0] * image_shape[1], dtype=np.uint8)\n    for lo, hi in zip(starts, ends):\n        image[lo:hi] = 1\n\n    return image.reshape(image_shape).T\n\n\ndef overlay_image_mask(image, mask, mask_color=(0,255,0), alpha=1.0):\n    im_f= image.astype(np.float32)\n#     if mask.ndim == 2:\n#         mask = np.expand_dims(mask,-1)        \n    mask_col = np.expand_dims(np.array(mask_color)/255.0, axis=(0,1))\n    return (im_f + alpha * mask * (np.mean(0.8 * im_f + 0.2 * 255, axis=2, keepdims=True) * mask_col - im_f)).astype(np.uint8)\n\n\ndef overlay_image_mask_original(image, mask, mask_color=(0,255,0), alpha=1.0):\n    return  np.concatenate((image, overlay_image_mask(image, mask)), axis=1)\n\ndef get_image_id(image_file):\n    return os.path.splitext(os.path.split(image_file)[1])[0]\n\n\ndef read_image(image_file, scale=1.0):\n    image = tifffile.imread(image_file).squeeze()\n    if image.shape[0] == 3:\n        image = np.transpose(image, (1,2,0))\n    \n    orig_shape = image.shape\n    if scale != 1.0:\n        image = cv2.resize(image, (0,0), fx=scale, fy=scale)\n    return image, orig_shape\n\n\ndef read_mask(image_file, image_shape, scale=1.0):\n    image_id = get_image_id(image_file)\n    train_info = df_train.loc[df_train['id'] == image_id]\n    rle = train_info['encoding'].values[0] if len(train_info) > 0 else None\n    if rle is not None:\n        mask = rle_to_image(rle, (image_shape[1], image_shape[0]))\n        if scale != 1.0:\n            mask = cv2.resize(mask, (0,0), fx=scale, fy=scale)\n        return np.expand_dims(mask,-1)\n    else:\n        return None        \n\n    \ndef read_image_mask(image_file, scale=1.0):\n    image, image_shape = read_image(image_file, scale)\n    mask = read_mask(image_file, image_shape, scale)\n    return image, mask\n\n\ndef get_tile(image, mask, x, y, tile_size, scale=1.0):\n    x = round(x * scale)\n    y = round(y * scale)\n    size = int(round(tile_size / 2 * scale))\n    image_s = image[y-size:y+size, x-size:x+size, :] \n    mask_s = mask[y-size:y+size, x-size:x+size, :]\n    return image_s, mask_s\n\n\ndef get_particles(mask, scale=1.0):\n    num, labels, stats, centroids = cv2.connectedComponentsWithStats(mask)\n    df_particles = pd.DataFrame(dict(zip(['x','y','left','top','width','height','area'],\n                               [(centroids[1:,0]) / scale,\n                                (centroids[1:,1]) / scale,\n                                (stats[1:,cv2.CC_STAT_LEFT]) / scale,\n                                (stats[1:,cv2.CC_STAT_TOP]) / scale,\n                                (stats[1:,cv2.CC_STAT_WIDTH]) / scale,\n                                (stats[1:,cv2.CC_STAT_HEIGHT]) / scale,\n                                (stats[1:,cv2.CC_STAT_AREA]) / (scale * scale)])))\n    df_particles.sort_values(['x','y'], inplace=True, ignore_index=True)\n    df_particles['no'] = range(len(df_particles))\n    return df_particles\n\n\ndef analyze_image(image_file):\n    image_id = get_image_id(image_file)\n    image, image_shape = read_image(image_file, glob_scale)\n    mask = read_mask(image_file, image_shape, glob_scale)\n\n    mask_full = read_mask(image_file, image_shape, scale=1.0)\n    df_glom = get_particles(mask_full, scale=1.0)\n    df_glom['id'] = image_id\n    del mask_full\n    gc.collect()\n    \n    info = df_info[df_info['image_file'] == f'{image_id}.tiff']\n    print(f'Image ID:        {image_id:}')\n    print(f'Image Size:      {info[\"width_pixels\"].values[0]} x {info[\"height_pixels\"].values[0]}')\n    print(f'Patient No:      {info[\"patient_number\"].values[0]}')\n    print(f'Sex:             {info[\"sex\"].values[0]}')\n    print(f'Age:             {info[\"age\"].values[0]}')\n    print(f'Race:            {info[\"race\"].values[0]}')\n    print(f'Height:          {info[\"height_centimeters\"].values[0]} cm')\n    print(f'Weight:          {info[\"weight_kilograms\"].values[0]} kg')\n    print(f'BMI:             {info[\"bmi_kg/m^2\"].values[0]} kg/m^2')\n    print(f'Laterality:      {info[\"laterality\"].values[0]}')\n    print(f'Percent Cortex:  {info[\"percent_cortex\"].values[0]} %')\n    print(f'Percent Medulla: {info[\"percent_medulla\"].values[0]} %')\n    \n    # Plot full image\n    if plot_full_image:\n        scale = 0.1\n        image_small = cv2.resize(image, (0,0), fx=scale, fy=scale)\n        mask_small = cv2.resize(mask, (0,0), fx=scale, fy=scale)\n        mask_small = np.expand_dims(mask_small,-1) \n    \n        plt.figure(figsize=(16, 16))\n        plt.imshow(overlay_image_mask(image_small, mask_small))\n        plt.axis('off')\n\n    # Plot glomeruli images\n    fig_cols = 5\n    fig_rows = int(math.ceil(num_glom_display/fig_cols))\n    plt.figure(figsize=(4 * fig_cols, 4 * fig_rows))\n    if num_glom_save > 0 and not os.path.exists(image_id):\n        os.mkdir(image_id)\n    for i in range(min(max(num_glom_display, num_glom_save), len(df_glom))):\n        image_s, mask_s = get_tile(image,mask, df_glom['x'][i], df_glom['y'][i], 1000, scale=glob_scale)\n        ovl = overlay_image_mask(image_s, mask_s)\n        if i < num_glom_display:\n            plt.subplot(fig_rows, fig_cols, i+1)\n            plt.imshow(ovl)\n            plt.axis('off')\n        if i < num_glom_save:\n            cv2.imwrite(f'{image_id}_{i:03}.png', cv2.cvtColor(ovl, cv2.COLOR_RGB2BGR))    \n    \n    del image, mask\n    gc.collect()\n    return df_glom\n\n\ndef plot_glom(df, image_id, glom_no):\n    image, mask = read_image_mask(os.path.join(base_path, f'train/{image_id}.tiff'), scale=glob_scale)\n    glom = df.loc[(df['id'] == image_id) & (df['no'] == glom_no)]\n    im, ma = get_tile(image, mask, glom['x'].iloc[0], glom['y'].iloc[0], 1000, scale=glob_scale)\n    del image, mask\n    gc.collect()\n    plt.figure(figsize=(16,8))\n    plt.imshow(overlay_image_mask_original(im, ma))\n    plt.title(f'Image: {image_id}, Glomeruli No: {glom_no}, Area: {glom[\"area\"].iloc[0]}')","metadata":{"execution":{"iopub.status.busy":"2024-01-15T13:35:27.135608Z","iopub.execute_input":"2024-01-15T13:35:27.135985Z","iopub.status.idle":"2024-01-15T13:35:27.174693Z","shell.execute_reply.started":"2024-01-15T13:35:27.135942Z","shell.execute_reply":"2024-01-15T13:35:27.173763Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Execute code to define df_glom (output of analyze_image)\ndf_glom = analyze_image(\"/kaggle/input/hubmap-kidney-segmentation/train/1e2425f28.tiff\")\n\n# Now you can call visualize_tissue_depth using df_glom\nvisualize_tissue_depth(df_glom)\n","metadata":{"execution":{"iopub.status.busy":"2024-01-15T13:35:29.685274Z","iopub.execute_input":"2024-01-15T13:35:29.685618Z","iopub.status.idle":"2024-01-15T13:36:21.492247Z","shell.execute_reply.started":"2024-01-15T13:35:29.685587Z","shell.execute_reply":"2024-01-15T13:36:21.490861Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import numpy as np\n\ndef artistic_mask_representation(mask):\n    # Assuming mask is a binary mask\n    artistic_mask = np.zeros_like(mask, dtype=np.uint8)\n\n    # Your implementation for creating an artistic representation goes here\n    # You might consider using image processing techniques, filters, or other methods\n\n    return artistic_mask\n","metadata":{"execution":{"iopub.status.busy":"2024-01-15T13:36:30.317216Z","iopub.execute_input":"2024-01-15T13:36:30.317575Z","iopub.status.idle":"2024-01-15T13:36:30.322136Z","shell.execute_reply.started":"2024-01-15T13:36:30.317541Z","shell.execute_reply":"2024-01-15T13:36:30.321048Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def visualize_novelty(image, mask):\n    fig, axes = plt.subplots(1, 5, figsize=(25, 5))\n\n    # Original Image\n    axes[0].imshow(image)\n    axes[0].set_title('Original Image')\n    axes[0].axis('off')\n\n    # Masked Image\n    masked_image = overlay_image_mask(image, mask)\n    axes[1].imshow(masked_image)\n    axes[1].set_title('Masked Image')\n    axes[1].axis('off')\n\n    # Artistic Mask Representation\n    artistic_mask = artistic_mask_representation(mask)\n    axes[2].imshow(artistic_mask, cmap='gray')\n    axes[2].set_title('Artistic Mask Representation')\n    axes[2].axis('off')\n\n    # Unique Mask Visualization\n    unique_mask_values = np.unique(mask)\n    unique_mask_colors = plt.cm.get_cmap('tab10', len(unique_mask_values))\n    colored_mask = color.label2rgb(mask.squeeze(), colors=unique_mask_colors.colors, bg_label=0)\n    axes[3].imshow(colored_mask)\n    axes[3].set_title('Unique Mask Visualization')\n    axes[3].axis('off')\n\n    # Outer Layer of the Image (Assuming a standard RGB image)\n    axes[4].imshow(image)\n    axes[4].set_title('Outer Layer (Full Image)')\n    axes[4].axis('off')\n\n    plt.show()\n\n# Assuming image and mask are loaded from your data\nimage, mask = read_image_mask(\"/kaggle/input/hubmap-kidney-segmentation/train/b9a3865fc.tiff\", scale=glob_scale)\n\n# Visualize novel visualizations\nvisualize_novelty(image, mask)\n","metadata":{"execution":{"iopub.status.busy":"2024-01-15T13:37:11.521378Z","iopub.execute_input":"2024-01-15T13:37:11.521738Z","iopub.status.idle":"2024-01-15T13:38:40.014519Z","shell.execute_reply.started":"2024-01-15T13:37:11.521704Z","shell.execute_reply":"2024-01-15T13:38:40.013548Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def visualize_novelty(image, mask):\n    fig, axes = plt.subplots(1, 5, figsize=(25, 5))\n\n    # Original Image\n    axes[0].imshow(image)\n    axes[0].set_title('Original Image')\n    axes[0].axis('off')\n\n    # Masked Image\n    masked_image = overlay_image_mask(image, mask)\n    axes[1].imshow(masked_image)\n    axes[1].set_title('Masked Image')\n    axes[1].axis('off')\n\n    # Artistic Mask Representation\n    artistic_mask = artistic_mask_representation(mask)\n    axes[2].imshow(artistic_mask, cmap='gray')\n    axes[2].set_title('Artistic Mask Representation')\n    axes[2].axis('off')\n\n    # Unique Mask Visualization\n    unique_mask_values = np.unique(mask)\n    unique_mask_colors = plt.cm.get_cmap('tab10', len(unique_mask_values))\n    colored_mask = color.label2rgb(mask.squeeze(), colors=unique_mask_colors.colors, bg_label=0)\n    axes[3].imshow(colored_mask)\n    axes[3].set_title('Unique Mask Visualization')\n    axes[3].axis('off')\n\n    # Depth Map\n    depth_map = np.mean(image, axis=-1)  # You can customize this based on your image structure\n    axes[4].imshow(depth_map, cmap='viridis')  # Using viridis colormap for depth\n    axes[4].set_title('Depth Map')\n    axes[4].axis('off')\n\n    plt.show()\n\n# Assuming image and mask are loaded from your data\nimage, mask = read_image_mask(\"/kaggle/input/hubmap-kidney-segmentation/train/b9a3865fc.tiff\", scale=glob_scale)\n\n# Visualize novel visualizations\nvisualize_novelty(image, mask)\n","metadata":{"execution":{"iopub.status.busy":"2024-01-15T13:43:19.598215Z","iopub.execute_input":"2024-01-15T13:43:19.59856Z","iopub.status.idle":"2024-01-15T13:44:43.041296Z","shell.execute_reply.started":"2024-01-15T13:43:19.598532Z","shell.execute_reply":"2024-01-15T13:44:43.040387Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import numpy as np\nimport matplotlib.pyplot as plt\n\ndef generate_synthetic_glomeruli(image_size=(512, 512), num_glomeruli=10, max_radius=30):\n    image = np.zeros(image_size, dtype=np.uint8)\n\n    for _ in range(num_glomeruli):\n        center = np.random.randint(max_radius, image_size[0] - max_radius, size=2)\n        radius = np.random.randint(5, max_radius)\n        y, x = np.ogrid[:image_size[0], :image_size[1]]\n        mask = (x - center[1]) ** 2 + (y - center[0]) ** 2 <= radius ** 2\n        image[mask] = 1\n\n    return image\n\ndef overlay_image_mask(image, mask, mask_color=(0, 255, 0), alpha=0.5):\n    overlay = np.zeros_like(image, dtype=np.uint8)\n    overlay[mask] = 255  # Set the intensity to 255 where the mask is true\n    return cv2.addWeighted(image, 1 - alpha, overlay, alpha, 0)\n\n# Generate synthetic data\nsynthetic_image = generate_synthetic_glomeruli()\nsynthetic_mask = synthetic_image.astype(bool)\n\n# Overlay mask on the original image\noverlay_result = overlay_image_mask(synthetic_image, synthetic_mask)\n\n# Plot the results\nplt.figure(figsize=(12, 4))\n\nplt.subplot(1, 3, 1)\nplt.imshow(synthetic_image, cmap='gray')\nplt.title('Original Image')\nplt.axis('off')\n\nplt.subplot(1, 3, 2)\nplt.imshow(synthetic_mask, cmap='gray')\nplt.title('Synthetic Mask')\nplt.axis('off')\n\nplt.subplot(1, 3, 3)\nplt.imshow(overlay_result, cmap='gray')  # Display in grayscale since it's a binary mask\nplt.title('Overlay Result')\nplt.axis('off')\n\nplt.show()\n","metadata":{"execution":{"iopub.status.busy":"2024-01-15T13:46:25.703716Z","iopub.execute_input":"2024-01-15T13:46:25.704101Z","iopub.status.idle":"2024-01-15T13:46:25.99674Z","shell.execute_reply.started":"2024-01-15T13:46:25.704071Z","shell.execute_reply":"2024-01-15T13:46:25.995875Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import numpy as np\nimport matplotlib.pyplot as plt\nimport cv2\n\ndef generate_synthetic_glomeruli(image_size=(512, 512), num_glomeruli=10, max_radius=30):\n    image = np.zeros(image_size, dtype=np.uint8)\n\n    for _ in range(num_glomeruli):\n        center = np.random.randint(max_radius, image_size[0] - max_radius, size=2)\n        radius = np.random.randint(5, max_radius)\n        y, x = np.ogrid[:image_size[0], :image_size[1]]\n        mask = (x - center[1]) ** 2 + (y - center[0]) ** 2 <= radius ** 2\n        image[mask] = 1\n\n    return image\n\ndef overlay_image_mask(image, mask, mask_color=(0, 255, 0), alpha=0.5):\n    overlay = np.zeros_like(image)\n    \n    if len(image.shape) == 2:  # Grayscale image\n        overlay[mask] = mask_color[0]\n    else:  # RGB image\n        for c in range(image.shape[2]):\n            overlay[mask, c] = mask_color[c]\n\n    return cv2.addWeighted(image, 1 - alpha, overlay, alpha, 0)\n\n\n\n# Generate synthetic data\nsynthetic_image = generate_synthetic_glomeruli()\nsynthetic_mask = synthetic_image.astype(bool)\n\n# Overlay mask on the original image\noverlay_result = overlay_image_mask(synthetic_image, synthetic_mask)\n\n# Plot the results\nplt.figure(figsize=(12, 4))\n\nplt.subplot(1, 3, 1)\nplt.imshow(synthetic_image, cmap='gray')\nplt.title('Original Image')\nplt.axis('off')\n\nplt.subplot(1, 3, 2)\nplt.imshow(synthetic_mask, cmap='gray')\nplt.title('Synthetic Mask')\nplt.axis('off')\n\nplt.subplot(1, 3, 3)\nplt.imshow(overlay_result, cmap='gray')  # Display in grayscale since it's a binary mask\nplt.title('Overlay Result')\nplt.axis('off')\n\nplt.show()\n","metadata":{"execution":{"iopub.status.busy":"2024-01-15T13:46:51.039145Z","iopub.execute_input":"2024-01-15T13:46:51.039528Z","iopub.status.idle":"2024-01-15T13:46:51.313071Z","shell.execute_reply.started":"2024-01-15T13:46:51.039497Z","shell.execute_reply":"2024-01-15T13:46:51.312177Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_glom = pd.DataFrame()\ndf_glom = df_glom.append(analyze_image(train_files[0]), ignore_index=True)\n","metadata":{"execution":{"iopub.status.busy":"2024-01-15T13:47:06.75908Z","iopub.execute_input":"2024-01-15T13:47:06.759423Z","iopub.status.idle":"2024-01-15T13:47:54.987415Z","shell.execute_reply.started":"2024-01-15T13:47:06.759391Z","shell.execute_reply":"2024-01-15T13:47:54.986575Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_glom = pd.DataFrame()\ndf_glom = df_glom.append(analyze_image(train_files[0]), ignore_index=True)","metadata":{"execution":{"iopub.status.busy":"2024-01-15T13:51:23.608334Z","iopub.execute_input":"2024-01-15T13:51:23.608687Z","iopub.status.idle":"2024-01-15T13:51:54.213512Z","shell.execute_reply.started":"2024-01-15T13:51:23.608658Z","shell.execute_reply":"2024-01-15T13:51:54.212589Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_glom = df_glom.append(analyze_image(train_files[1]), ignore_index=True)\n","metadata":{"execution":{"iopub.status.busy":"2024-01-15T13:49:30.126281Z","iopub.execute_input":"2024-01-15T13:49:30.126628Z","iopub.status.idle":"2024-01-15T13:50:46.712948Z","shell.execute_reply.started":"2024-01-15T13:49:30.126592Z","shell.execute_reply":"2024-01-15T13:50:46.711914Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_glom = df_glom.append(analyze_image(train_files[1]), ignore_index=True)\n","metadata":{"execution":{"iopub.status.busy":"2024-01-13T10:53:13.94539Z","iopub.status.idle":"2024-01-13T10:53:13.945871Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"for i in range(5):\n    plot_glom(df_glom, df_glom['id'].iloc[i], df_glom['no'].iloc[i])","metadata":{"execution":{"iopub.status.busy":"2024-01-15T13:51:54.21512Z","iopub.execute_input":"2024-01-15T13:51:54.215509Z","iopub.status.idle":"2024-01-15T13:52:54.725713Z","shell.execute_reply.started":"2024-01-15T13:51:54.215471Z","shell.execute_reply":"2024-01-15T13:52:54.724835Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_glom = df_glom.append(analyze_image(train_files[2]), ignore_index=True)\n","metadata":{"execution":{"iopub.status.busy":"2024-01-15T13:52:54.727496Z","iopub.execute_input":"2024-01-15T13:52:54.727845Z","iopub.status.idle":"2024-01-15T13:53:29.664447Z","shell.execute_reply.started":"2024-01-15T13:52:54.72781Z","shell.execute_reply":"2024-01-15T13:53:29.663561Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_glom = df_glom.append(analyze_image(train_files[3]), ignore_index=True)\n","metadata":{"execution":{"iopub.status.busy":"2024-01-15T13:53:29.665715Z","iopub.execute_input":"2024-01-15T13:53:29.666017Z","iopub.status.idle":"2024-01-15T13:54:57.856915Z","shell.execute_reply.started":"2024-01-15T13:53:29.665987Z","shell.execute_reply":"2024-01-15T13:54:57.856032Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_glom = df_glom.append(analyze_image(train_files[4]), ignore_index=True)\n","metadata":{"execution":{"iopub.status.busy":"2024-01-13T10:53:13.951614Z","iopub.status.idle":"2024-01-13T10:53:13.952131Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_glom = df_glom.append(analyze_image(train_files[5]), ignore_index=True)","metadata":{"execution":{"iopub.status.busy":"2024-01-13T10:53:13.953073Z","iopub.status.idle":"2024-01-13T10:53:13.953543Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_glom = df_glom.append(analyze_image(train_files[6]), ignore_index=True)","metadata":{"execution":{"iopub.status.busy":"2024-01-13T10:53:13.954523Z","iopub.status.idle":"2024-01-13T10:53:13.955051Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_glom = df_glom.append(analyze_image(train_files[7]), ignore_index=True)","metadata":{"execution":{"iopub.status.busy":"2024-01-13T10:53:13.956076Z","iopub.status.idle":"2024-01-13T10:53:13.956549Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_glom = df_glom.append(analyze_image(train_files[8]), ignore_index=True)","metadata":{"execution":{"iopub.status.busy":"2024-01-13T10:53:13.957666Z","iopub.status.idle":"2024-01-13T10:53:13.958204Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_glom = df_glom.append(analyze_image(train_files[9]), ignore_index=True)","metadata":{"execution":{"iopub.status.busy":"2024-01-13T10:53:13.959395Z","iopub.status.idle":"2024-01-13T10:53:13.959875Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_glom = df_glom.append(analyze_image(train_files[10]), ignore_index=True)","metadata":{"execution":{"iopub.status.busy":"2024-01-13T10:53:13.96089Z","iopub.status.idle":"2024-01-13T10:53:13.961377Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_glom = df_glom.append(analyze_image(train_files[11]), ignore_index=True)","metadata":{"execution":{"iopub.status.busy":"2024-01-13T10:53:13.962347Z","iopub.status.idle":"2024-01-13T10:53:13.962801Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_glom = df_glom.append(analyze_image(train_files[12]), ignore_index=True)","metadata":{"execution":{"iopub.status.busy":"2024-01-13T10:53:13.963702Z","iopub.status.idle":"2024-01-13T10:53:13.964171Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_glom = df_glom.append(analyze_image(train_files[13]), ignore_index=True)","metadata":{"execution":{"iopub.status.busy":"2024-01-13T10:53:13.965051Z","iopub.status.idle":"2024-01-13T10:53:13.965491Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_glom = df_glom.append(analyze_image(train_files[14]), ignore_index=True)","metadata":{"execution":{"iopub.status.busy":"2024-01-13T10:53:13.966401Z","iopub.status.idle":"2024-01-13T10:53:13.966841Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#Glomerulis","metadata":{"execution":{"iopub.status.busy":"2024-01-13T10:53:13.96811Z","iopub.status.idle":"2024-01-13T10:53:13.968732Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_glom.to_csv('glomeruli.csv')\ndisplay(df_glom)","metadata":{"execution":{"iopub.status.busy":"2024-01-13T10:53:13.969822Z","iopub.status.idle":"2024-01-13T10:53:13.970316Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import numpy as np\nimport matplotlib.pyplot as plt\n\ndef generate_synthetic_glomeruli(image_size=(512, 512), num_glomeruli=10, max_radius=30):\n    image = np.zeros(image_size, dtype=np.uint8)\n\n    for _ in range(num_glomeruli):\n        center = np.random.randint(max_radius, image_size[0] - max_radius, size=2)\n        radius = np.random.randint(5, max_radius)\n        y, x = np.ogrid[:image_size[0], :image_size[1]]\n        mask = (x - center[1]) ** 2 + (y - center[0]) ** 2 <= radius ** 2\n        image[mask] = 1\n\n    return image\n\ndef overlay_image_mask(image, mask, mask_color=(0, 255, 0), alpha=0.5):\n    overlay = np.zeros_like(image, dtype=np.uint8)\n    overlay[mask] = 255  # Set the intensity to 255 where the mask is true\n    return cv2.addWeighted(image, 1 - alpha, overlay, alpha, 0)\n\n# Generate synthetic data\nsynthetic_image = generate_synthetic_glomeruli()\nsynthetic_mask = synthetic_image.astype(bool)\n\n# Overlay mask on the original image\noverlay_result = overlay_image_mask(synthetic_image, synthetic_mask)\n\n# Plot the results\nplt.figure(figsize=(12, 4))\n\nplt.subplot(1, 3, 1)\nplt.imshow(synthetic_image, cmap='gray')\nplt.title('Original Image')\nplt.axis('off')\n\nplt.subplot(1, 3, 2)\nplt.imshow(synthetic_mask, cmap='gray')\nplt.title('Synthetic Mask')\nplt.axis('off')\n\nplt.subplot(1, 3, 3)\nplt.imshow(overlay_result, cmap='gray')  # Display in grayscale since it's a binary mask\nplt.title('Overlay Result')\nplt.axis('off')\n\nplt.show()\n","metadata":{"execution":{"iopub.status.busy":"2024-01-13T10:53:13.971237Z","iopub.status.idle":"2024-01-13T10:53:13.971673Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"In this competation i used segmentation-models-pytorch :\n* [https://github.com/qubvel/segmentation_models.pytorch](http://) . \n* https://smp.readthedocs.io/en/latest/install.html \n\nIt contains: \n* 9 models architectures for binary and multi class segmentation such as Unet,FPN,Unet++ ,...\n* 104 available encoders and thier pre-trained weights for faster and better convergence\n* Loss functions such as dice ,BCE,jaccard,focal loss ,... \n \nThe offline instalation is required in this competation because you can not access internet when you submit the kerenl.<br/>\nrefer to this notebook for the offline instalation of segmentation-models-pytorch :<br/> https://www.kaggle.com/raghaw/offline-install-segmentation-model-pytorch\n![](https://camo.githubusercontent.com/88abf70c26a0eda1d22062e84053f8c72883623cb38b523c1e447a6a6930b4c5/68747470733a2f2f692e6962622e636f2f646331586468542f5365676d656e746174696f6e2d4d6f64656c732d56322d536964652d312d312e706e67)","metadata":{}},{"cell_type":"code","source":"#!pip install segmentation-models-pytorch\n!pip install ../input/segmentation-models-pytorch-0-1-3/pretrainedmodels-0.7.4/pretrainedmodels-0.7.4\n!pip install ../input/segmentation-models-pytorch-0-1-3/efficientnet_pytorch-0.6.3/efficientnet_pytorch-0.6.3\n!pip install ../input/segmentation-models-pytorch-0-1-3/timm-0.3.2-py3-none-any.whl\n!pip install ../input/segmentation-models-pytorch-0-1-3/segmentation_models.pytorch.0.1.3/segmentation_models.pytorch.0.1.3","metadata":{"execution":{"iopub.status.busy":"2024-01-13T10:53:13.97253Z","iopub.status.idle":"2024-01-13T10:53:13.972988Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\nimport os\nimport torch\nfrom torch import nn\nimport torchvision\nimport cv2\nfrom torchvision import transforms\nfrom torch.utils.data import Dataset,DataLoader\nfrom torch.utils.data.sampler import SequentialSampler, RandomSampler\nfrom torch.optim import Adam\nfrom torch.optim.lr_scheduler import ReduceLROnPlateau\nfrom scipy.ndimage.interpolation import zoom\nimport albumentations as A\nfrom torch.nn import functional as F\nfrom sklearn.model_selection import GroupKFold\nfrom tqdm.notebook import tqdm\n\nimport time\nimport random\nfrom albumentations.pytorch import ToTensorV2\n#from segmentation_models_pytorch.unet import Unet","metadata":{"execution":{"iopub.status.busy":"2024-01-13T10:53:13.973868Z","iopub.status.idle":"2024-01-13T10:53:13.974334Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# For REPRODUCIBILITY https://pytorch.org/docs/stable/notes/randomness.html\nimport os\nimport numpy as np\ndef seed_everything(seed):\n    \n    random.seed(seed)\n    os.environ['PYTHONHASHSEED'] = str(seed)\n    np.random.seed(seed)\n    torch.manual_seed(seed)\n    torch.cuda.manual_seed_all(seed)\n    \nseed_everything(42)\ndevice = torch.device('cuda' if torch.cuda.is_available() else 'cpu')\n","metadata":{"execution":{"iopub.status.busy":"2024-01-13T10:53:13.975351Z","iopub.status.idle":"2024-01-13T10:53:13.97583Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class CONFIG():\n    \n    # data paths\n    data_path = '../input/hubmap-256x256/'    \n    image_data_path='../input/hubmap-256x256/train/'\n    mask_data_path='../input/hubmap-256x256/masks/'\n    test_data='../input/hubmap-kidney-segmentation/test/'    \n    model_file = '../input/humap-fpn-dice-focal-15-epochs/FOLD-0-model.pth'\n\n    reduce = 4 #reduce the original images by 4 times\n    tile_size = 256\n    padding = (100,100) # Border overlap for prediction\n\n    # pytorch model (https://github.com/qubvel/segmentation_models.pytorch)\n    encoder_name = 'timm-efficientnet-b5'#\"efficientnet-b4\"#efficientnet-b3\n    encoder_weights = None\n    in_channels = 3\n    classes = 1\n    \n    # dataloader \n    train_batch_size = 16\n    val_batch_size = 4\n    test_batch_size=64\n    no_folds=5\n    # prediction threshold\n    threshold = 0.43\n    #\n    epochs=15\ncfg = CONFIG()","metadata":{"execution":{"iopub.status.busy":"2024-01-13T10:53:13.97678Z","iopub.status.idle":"2024-01-13T10:53:13.977296Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Trainig Dataset \nThe images in the train folder have large size to train deep learning model reasonably on them we have to split this image into tiles of specific size for example 256X256 .<br/>\nFor example if the image is 5000x5000 , we split this images into tiles of size 256x256, we divide 5000/256=19.53 then we ceil it to 20 so we have 20x20 grid with tile size 256x256 . we pad any image to be of size 256x256. <br/>\nThe dataset i used for training is 256x256 dataset which is the ouput of spliting the image into grid of tiles of size 256x256 <br/>\nRefer to this notebook : https://www.kaggle.com/iafoss/256x256-images <br/>\n\n![](https://www.mdpi.com/symmetry/symmetry-10-00107/article_deploy/html/images/symmetry-10-00107-g004.png)","metadata":{}},{"cell_type":"code","source":"# pytorch custom dataset if your are new to pytorch dataset \n#refer to this link https://pytorch.org/tutorials/beginner/data_loading_tutorial.html\nclass HuBMAPDataset(Dataset):\n    def __init__(self, ids, phase):\n        self.ids = ids\n        if phase=='train':\n            self.transform = get_train_transform()\n        else:\n            self.transform = get_val_transform()\n        \n    def __getitem__(self, idx):\n        name = self.ids[idx]\n        #img = cv2.imread(f\"../input/hubmap-256x256/train/{name}\").astype(\"float32\")\n        img = cv2.imread(cfg.image_data_path+name).astype(\"float32\")\n\n        img /= 255.\n        #mask = cv2.imread(f\"../input/hubmap-256x256/masks/{name}\")[:,:,0:1]\n        mask = cv2.imread(cfg.mask_data_path+name)[:,:,0:1]\n\n        transformed = self.transform(image=img, mask=mask)\n        img = transformed['image']\n        mask = transformed['mask']\n        img = img.transpose(2,0,1).astype('float32')\n        mask = mask.transpose(2,0,1).astype('float32')\n        return img, mask\n\n    def __len__(self):\n        return len(self.ids)\n    \n#  the albumentations libarary of data augmentation\n# albumentations : https://github.com/albumentations-team/albumentations    \ndef get_train_transform():\n    return A.Compose([\n        A.HorizontalFlip(),\n        A.VerticalFlip(),\n            A.OneOf([\n                A.RandomContrast(),\n                A.RandomGamma(),\n                A.RandomBrightness(),\n                ], p=0.3),\n            A.OneOf([\n                A.ElasticTransform(alpha=120, sigma=120 * 0.05, alpha_affine=120 * 0.03),\n                A.GridDistortion(),\n                A.OpticalDistortion(distort_limit=2, shift_limit=0.5),\n                ], p=0.3),\n            A.ShiftScaleRotate(p=0.2),\n            A.OneOf([\n                A.HueSaturationValue(10,15,10),\n                A.RandomBrightnessContrast(),            \n            ], p=0.3),\n      \n            A.Resize(256,256,always_apply=True),\n    ],p=1.)\n\ndef get_val_transform():\n    return A.Compose([\n        A.Resize(256,256,always_apply=True),\n    ],p=1.)\n    ","metadata":{"execution":{"iopub.status.busy":"2024-01-13T10:53:13.97841Z","iopub.status.idle":"2024-01-13T10:53:13.978894Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# The Segmenation Model\nThere are a lot of available options for the model to use in this competation that are available in Segmentation Models library:\n* 📦 Segmentation Models\n* Unet\n* Unet++\n* MAnet\n* Linknet\n* FPN\n* PSPNet\n* PAN\n* DeepLabV3\n* DeepLabV3+  \n\nYour chossing of specific model to experiment with usually depends on your familiarity with problem at hand (for example if your are new to segmentation you will start with Unet) and  the available resources and time you have for training the model.<br/>\n\nThere are a lot of available options for the model you can use as encoder for segmentation model in  Segmentation Models library: <br/>\n🏔 Available Encoders\n* ResNet\n* ResNeXt\n* ResNeSt\n* Res2Ne(X)t\n* RegNet(x/y)\n* SE-Net\n* SK-ResNe(X)t\n* DenseNet\n* Inception\n* EfficientNet\n* MobileNet\n* DPN\n* VGG\n\n","metadata":{}},{"cell_type":"markdown","source":"I experimented with Unet and FPN as segmentation model \n* Unet Paper : https://arxiv.org/pdf/1505.04597.pdf\n* FPN paper : https://arxiv.org/pdf/1612.03144.pdf\n\nFPN and Unet are so similiar but their is subtle difference :\nThe Feature Pyramid Network (FPN) looks a lot like the [U-net] (https://vitalab.github.io/deep-learning/2017/02/27/unet.html 221). The main difference is that there is multiple prediction layers: one for each upsampling layer. Like the U-Net, the FPN has laterals connection between the bottom-up pyramid (left) and the top-down pyramid (right). But, where U-net only copy the features and append them, FPN apply a 1x1 convolution layer before adding them. This allows the bottom-up pyramid called “backbone” to be pretty much whatever you want.\nrefer to this link : https://forums.fast.ai/t/differences-between-u-net-and-feature-pyramid-networks-fpn/33166/3\n\nI experimented with ResNet and EfficientNet as encoder :\n* ResNet Paper : https://arxiv.org/pdf/1512.03385\n* EfficientNet paper : https://arxiv.org/pdf/1905.11946\n\n\n![Unet](https://camo.githubusercontent.com/d55a437337d0e08c6a082714959253d80b81ce4e6c18e94688d9aff16e3bf2f8/68747470733a2f2f6c6d622e696e666f726d6174696b2e756e692d66726569627572672e64652f70656f706c652f726f6e6e656265722f752d6e65742f752d6e65742d6172636869746563747572652e706e67)\n\n![](https://www.fatalerrors.org/images/blog/0e227108d1defa0b433b51b1f453e67e.jpg)\n\n","metadata":{}},{"cell_type":"code","source":"import segmentation_models_pytorch as smp\nclass HuBMAP(nn.Module):\n    def __init__(self):\n        super(HuBMAP, self).__init__()\n        #self.cnn_model = smp.Unet(cfg.encoder_name, classes=cfg.classes, encoder_weights=cfg.encoder_weights)\n        self.cnn_model = smp.FPN(encoder_name=cfg.encoder_name,classes=cfg.classes, encoder_weights=cfg.encoder_weights)\n        \n    \n    def forward(self, imgs):\n        img_segs = self.cnn_model(imgs)\n        return img_segs\n       ","metadata":{"execution":{"iopub.status.busy":"2024-01-13T10:53:13.979893Z","iopub.status.idle":"2024-01-13T10:53:13.98046Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Loss Function \nrefer to thoes links:\n* https://ilmonteux.github.io/2019/05/10/segmentation-metrics.html\n* https://www.kaggle.com/yassinealouini/all-the-segmentation-metrics\n* https://www.kaggle.com/c/hubmap-kidney-segmentation/discussion/208413\n\nLoss functions that are used in semantic segmentation can generaly be divided into two families:\n* Intersection-Over-Union (IOU) Jaccard and Dice family\n* Cross Entropy family <br/>\nas described in the image below \n![](https://www.googleapis.com/download/storage/v1/b/kaggle-forum-message-attachments/o/inbox%2F4367831%2F717956da11a8953a81ec75a79495929c%2FLossOverview.jpg?generation=1609672056006545&alt=media)\n\n* (IOU) Intersection-Over-Union,Jaccard index and Dice family\n\n\n![](https://miro.medium.com/max/270/0*kraYHnYpoJOhaMzq.png)\n*IoU calculation visualized*\n\n$ Dice(A, B) = \\frac{2 \\|A \\cap B\\|}{\\|A\\|+\\|B\\|}, \\qquad Jaccard(A, B) = \\frac{\\|A \\cap B\\|}{\\|A \\cup B\\|} $\n\n![](https://ilmonteux.github.io/assets/images/segmentation/metrics_iou_dice.png)\n\n* Cross Entropy family \n  * Binary cross entropy : $ -{(y\\log(p) + (1 - y)\\log(1 - p))} $ <br/>\n  * Cross entropy : $ -{(log(p_{t}))} $     ,  where $ p_{t} $ = the probability of ground truth class\n  * Focal loss : $ -{\\alpha(1-p_{t})^{\\gamma}(log(p_{t}))} $\n  * ![](https://amaarora.github.io/images/FL_v_CE.png)  \n  \n* We can achieve the best result by combining loss functions from thoes families .\n  I experimented with \n  * (dice,cross entropy) \n  * (jaccard,cross entropy) \n  * (dice,focal loss) \n  * (jaccard,focal loss)  \n\n* Loss functions available in Segmentation library <br/>\n  refer to this link : https://smp.readthedocs.io/en/latest/losses.html <br/>\n  📉 Losses\n  * Constants\n  *JaccardLoss\n  *DiceLoss\n  *FocalLoss\n  *LovaszLoss\n  *SoftBCEWithLogitsLoss\n  *SoftCrossEntropyLoss","metadata":{}},{"cell_type":"code","source":"from segmentation_models_pytorch.losses import LovaszLoss\nfrom segmentation_models_pytorch.losses import JaccardLoss\nfrom segmentation_models_pytorch.losses import DiceLoss\nfrom segmentation_models_pytorch.losses import FocalLoss\nfrom segmentation_models_pytorch.losses import SoftBCEWithLogitsLoss\n\nlovasz=LovaszLoss(mode='binary')\njaccard=JaccardLoss(mode='binary')\ndice=DiceLoss(mode='binary')\nfocal_loss=FocalLoss(mode='binary')\nBCE=SoftBCEWithLogitsLoss()\n\ndef symmetric_lovasz(outputs, targets):\n    return 0.5*(lovasz(outputs, targets) + lovasz(-outputs, 1.0 - targets))\n\n\nclass DiceLoss_(nn.Module):\n    def __init__(self, weight=None, size_average=True):\n        super(DiceLoss_, self).__init__()\n\n    def forward(self, inputs, targets, smooth=1):\n        \n        #comment out if your model contains a sigmoid or equivalent activation layer\n        inputs = F.sigmoid(inputs)       \n        \n        #flatten label and prediction tensors\n        inputs = inputs.view(-1)\n        targets = targets.view(-1)\n        \n        intersection = (inputs * targets).sum()                            \n        #dice = (2.*intersection + smooth)/(inputs.sum() + targets.sum() + smooth)  \n        dice = (2.*intersection + smooth)/(inputs.sum() + targets.sum() + smooth)  \n        \n        return 1 - dice\n    \n    \n    \nclass DiceBCELoss(nn.Module):\n    # Formula Given above.\n    def __init__(self, weight=None, size_average=True):\n        super(DiceBCELoss, self).__init__()\n\n    def forward(self, inputs, targets, smooth=1):\n        \n        #comment out if your model contains a sigmoid or equivalent activation layer\n        inputs = F.sigmoid(inputs)       \n        \n        #flatten label and prediction tensors\n        inputs = inputs.view(-1)\n        targets = targets.view(-1)\n        \n        intersection = (inputs * targets).sum()                            \n        dice_loss = 1 - (2.*intersection + smooth)/(inputs.sum() + targets.sum() + smooth)  \n        BCE = F.binary_cross_entropy(inputs, targets, reduction='mean')\n        Dice_BCE = BCE + dice_loss\n        \n        return Dice_BCE\n","metadata":{"execution":{"iopub.status.busy":"2024-01-13T10:53:13.981565Z","iopub.status.idle":"2024-01-13T10:53:13.982111Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"\ndef HuBMAPLoss(images, targets, model,loss_fun_0,loss_fun_1,device):\n    \n    model.to(device)\n    \n    images = images.to(device)\n    targets = targets.to(device)\n    \n    outputs = model(images)\n    loss_0 = loss_fun_0(outputs, targets)\n    \n    if loss_fun_1 != None:\n        loss_1=loss_fun_1(outputs, targets)\n        loss=loss_0 + loss_1\n    else:\n        loss=loss_0\n   \n    \n    return loss, outputs\n\ndef train_one_epoch(epoch, model, device, optimizer, scheduler,loss_fun_0,loss_fun_1,trainloader):\n    model.train()\n    t = time.time()\n    total_loss = 0\n    tk0=tqdm(trainloader)\n    for step, (images, targets) in enumerate(tk0):\n        loss, outputs = HuBMAPLoss(images, targets, model,loss_fun_0,loss_fun_1,device)\n        optimizer.zero_grad()\n        loss.backward()\n        #if ((step+1)%4==0 or (step+1)==len(trainloader)):\n        optimizer.step()\n        scheduler.step()\n        #optimizer.zero_grad()\n        loss = loss.detach().item()\n        total_loss += loss\n        tk0.set_postfix(loss=(total_loss / ((step+1) * trainloader.batch_size)))\n\n        #if ((step+1)%10==0 or (step+1)==len(trainloader)):\n    epoch_loss=total_loss/(len(trainloader)*trainloader.batch_size)    \n    elapsed_time=time.time() - t\n    return epoch_loss,elapsed_time\n\n            \n        \ndef valid_one_epoch(epoch, model, device, optimizer, scheduler,loss_fun_0,loss_fun_1, validloader):\n    model.eval()\n    t = time.time()\n    total_loss = 0\n    tk0=tqdm(validloader)\n    running_jac=0\n    running_dice=0\n    for step, (images, targets) in enumerate(tk0):\n        #with torch.no_grad():\n\n        loss, outputs = HuBMAPLoss(images, targets, model,loss_fun_0,loss_fun_1,device)\n        loss = loss.detach().item()\n        total_loss += loss\n        tk0.set_postfix(loss=(total_loss / ((step+1) * validloader.batch_size)))\n        jac_metric=jaccard(outputs.to(device),targets.to(device))\n        dice_metric=dice(outputs.to(device),targets.to(device))\n        jac_metric=1-jac_metric.item()\n        dice_metric=1-dice_metric.item()\n        running_jac+=jac_metric\n        running_dice+=dice_metric\n        #if ((step+1)%4==0 or (step+1)==len(validloader)):\n        #    scheduler.step(total_loss/len(validloader))\n        #if ((step+1)%10==0 or (step+1)==len(validloader)):\n    val_loss= total_loss/(len(validloader)*validloader.batch_size) \n    Jac_metric= running_jac/(len(validloader)*validloader.batch_size) \n    Dice_metric= running_dice/(len(validloader)*validloader.batch_size) \n    \n    elapsed_time=time.time() - t\n    return val_loss,Jac_metric,Dice_metric,elapsed_time\n","metadata":{"execution":{"iopub.status.busy":"2024-01-13T10:53:13.983179Z","iopub.status.idle":"2024-01-13T10:53:13.9837Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"\ndef prepare_train_valid_dataloader(df, fold):\n    train_ids = df.loc[~df.Folds.isin(fold), \"Image_Paths\"].values\n    val_ids = df.loc[df.Folds.isin(fold), \"Image_Paths\"].values\n    train_ds = HuBMAPDataset(train_ids, \"train\")\n    val_ds = HuBMAPDataset(val_ids, \"val\")\n    train_loader = DataLoader(train_ds, batch_size=cfg.train_batch_size, pin_memory=True, shuffle=True, num_workers=4)\n    val_loader = DataLoader(val_ds, batch_size=cfg.val_batch_size, pin_memory=True, shuffle=False, num_workers=4)\n    return train_loader, val_loader\n    ","metadata":{"execution":{"iopub.status.busy":"2024-01-13T10:53:13.984734Z","iopub.status.idle":"2024-01-13T10:53:13.985237Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"\ndef load_checkpoint(path,model,optimizer,scheduler,device):\n    checkpoint = torch.load(path,map_location=device)\n    model.load_state_dict(checkpoint['model_state_dict'])\n    if optimizer!=None and scheduler !=None:\n        optimizer.load_state_dict(checkpoint['optimizer_state_dict'])\n        scheduler.load_state_dict(checkpoint['scheduler_state_dict'])    \n    epoch = checkpoint['epoch']\n    val_loss = checkpoint['val_loss']\n    jacard_metric=checkpoint['jacard_metric']\n    dice_metric=checkpoint['dice_metric']\n    \n    print(f'epoch={epoch},val_loss={val_loss} ,jacard_metric={jacard_metric} ,dice_metric={dice_metric}')\n\ndef load_models(MODELS,device):\n    models = []\n    for path in MODELS:\n         \n           \n        model = HuBMAP()\n        load_checkpoint(path,model,None,None,device)\n        \n        model.eval()\n        model.to(device)\n        models.append(model)\n\n    print(len(models))\n    return models\n\ndef save_checkpoint(epoch,val_loss,jac_metric,dice_metric,model,optimizer,scheduler,path):\n    checkpoint={\n                'epoch': epoch,\n                'val_loss':val_loss,\n                'jacard_metric':jac_metric,\n                'dice_metric':dice_metric,\n                'model_state_dict': model.state_dict(),\n                'optimizer_state_dict': optimizer.state_dict(),\n                'scheduler_state_dict':scheduler.state_dict()\n                }\n    torch.save(checkpoint,path)\n\n","metadata":{"execution":{"iopub.status.busy":"2024-01-13T10:53:13.986223Z","iopub.status.idle":"2024-01-13T10:53:13.98671Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import pandas as pd\ndirectory_list = os.listdir(cfg.image_data_path)\ndir_df = pd.DataFrame(directory_list, columns=['Image_Paths'])\nar=dir_df[dir_df.columns[0]].values\ngroups=[id_[:-9] for id_ in ar]\ndir_df\n","metadata":{"execution":{"iopub.status.busy":"2024-01-13T10:53:13.98783Z","iopub.status.idle":"2024-01-13T10:53:13.988353Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.GroupKFold.html\nFOLDS = cfg.no_folds\ngkf = GroupKFold(FOLDS)\ndir_df['Folds'] = 0\nfor fold, (tr_idx, val_idx) in enumerate(gkf.split(dir_df, groups=groups)):\n    dir_df.loc[val_idx, 'Folds'] = fold\ndir_df","metadata":{"execution":{"iopub.status.busy":"2024-01-13T10:53:13.989394Z","iopub.status.idle":"2024-01-13T10:53:13.989861Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Training","metadata":{}},{"cell_type":"code","source":"'''\ntrain_from_scratch=False\nload_model_path=cfg.model_file #'../input/humap-fpn-dice-bce-10-epochs/FOLD-0-model.pth'\n\n\nfor fold, (tr_idx, val_idx) in enumerate(gkf.split(dir_df, groups=groups)):\n    if fold>0:\n        break\n    \n    trainloader, validloader = prepare_train_valid_dataloader(dir_df, [fold])\n\n    loss_fun_0=dice       #jaccard#dice#symmetric_lovasz\n    loss_fun_1=focal_loss \n        \n    model = HuBMAP().to(device)        \n    optimizer = Adam(model.parameters(), lr=3e-3)\n    scheduler = torch.optim.lr_scheduler.StepLR(optimizer, gamma=0.1, step_size=5000)        \n       \n    if train_from_scratch==False and load_model_path !=None:\n        load_checkpoint(load_model_path,model,optimizer,scheduler,device)\n        \n    num_epochs = 5 #cfg.epochs\n    \n    best_mertic=0\n    \n    for epoch in range(num_epochs):\n        train_loss,train_elapsed_time=train_one_epoch(epoch, model, device, optimizer, \n                                                      scheduler,loss_fun_0,loss_fun_1,trainloader)\n        with torch.no_grad():\n            val_loss,Jac_metric,Dice_metric,val_elapsed_time=valid_one_epoch(epoch, model, device, optimizer,\n                                                                             scheduler,loss_fun_0,loss_fun_1,\n                                                                             validloader)\n        \n        print(\n            \n            f'epoch {epoch}  \\n' \n            f'train loss: {(train_loss):.4f}, ' + \\\n            f'train time: {(train_elapsed_time):.4f} \\n'            \n            f'val loss: {(val_loss):.4f}, ' + \\\n            f'Jacard metric: {(Jac_metric):.4f}, ' + \\\n            f'Dice metric: {(Dice_metric):.4f}, ' + \\\n\n            f'val time: {(val_elapsed_time):.4f}'\n        )\n        \n        metric=(Jac_metric+Dice_metric)/2\n        if metric > best_mertic  :\n            path=f'FOLD-{fold}-model.pth'\n            save_checkpoint(epoch,val_loss,Jac_metric,Dice_metric,model,optimizer,scheduler,path)    \n            best_mertic=metric\n            print(f'Saving Model Dice={Dice_metric} , jaccard={Jac_metric} , metric={metric}' ) \n'''","metadata":{"execution":{"iopub.status.busy":"2024-01-13T10:53:13.990905Z","iopub.status.idle":"2024-01-13T10:53:13.991406Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Exploring the trained model on the validation dataset","metadata":{}},{"cell_type":"markdown","source":"## Predicted Mask VS Actual Mask","metadata":{}},{"cell_type":"code","source":"\n#path=f'FOLD-{0}-model.pth'\npath='../input/humap-fpn-dice-focal-15-epochs/FOLD-0-model.pth'\nmodel = HuBMAP().to(device)\nload_checkpoint(path,model,None,None,device)","metadata":{"execution":{"iopub.status.busy":"2024-01-13T10:53:13.992398Z","iopub.status.idle":"2024-01-13T10:53:13.992888Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"trainloader, validloader = prepare_train_valid_dataloader(dir_df, [0])\ndl = iter(validloader)","metadata":{"execution":{"iopub.status.busy":"2024-01-13T10:53:13.99399Z","iopub.status.idle":"2024-01-13T10:53:13.994462Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"\nimport matplotlib.pyplot as plt\n\njaccard_=JaccardLoss(mode='binary',log_loss=False)\ndice_=DiceLoss(mode='binary',log_loss=False)\ndice__=DiceLoss_()\nimgs,masks = next(dl)\n\nwith torch.no_grad():\n\n    model.to(device).eval()\n    images = imgs.to(device)\n    outputs = model(images)\n    f, axs = plt.subplots(4,3,figsize=(20,20))\n    for i,(img,mask,out) in enumerate(zip(imgs,masks,outputs)):\n        img = ((img.permute(1,2,0))*255.0).numpy().astype(np.uint8)\n                         \n        out = (torch.sigmoid(out)>.43).type(torch.uint8)\n\n        print(1-symmetric_lovasz(mask.float().cpu(),mask.cpu()).item(),\n              1-dice_(mask.float().cpu(),mask.cpu()).item(),\n              1-jaccard_(mask.float().cpu(),mask.cpu()).item(),\n              dice__(mask.float().cpu(),mask.cpu()).item()\n             )\n        \n        axs[i][0].imshow(img,vmin=0,vmax=255)\n        axs[i][1].imshow(mask.squeeze().cpu().numpy())\n        axs[i][2].imshow(out.type(torch.uint8).squeeze().cpu().numpy())\n\n","metadata":{"execution":{"iopub.status.busy":"2024-01-13T10:53:13.995751Z","iopub.status.idle":"2024-01-13T10:53:13.996238Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"'''\n#del trainloader,validloader,imgs,masks,outputs\nimport gc\n\ngc.collect()\ntorch.cuda.empty_cache()\n'''","metadata":{"execution":{"iopub.status.busy":"2024-01-13T10:53:13.997301Z","iopub.status.idle":"2024-01-13T10:53:13.99779Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Inference","metadata":{}},{"cell_type":"code","source":"\npath='../input/humap-fpn-dice-focal-15-epochs/FOLD-0-model.pth'\nmodel = HuBMAP().to(device).eval()\nload_checkpoint(path,model,None,None,device)\n","metadata":{"execution":{"iopub.status.busy":"2024-01-13T10:53:13.998725Z","iopub.status.idle":"2024-01-13T10:53:13.999226Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"sz = cfg.tile_size#256   #the size of tiles\nreduce = cfg.reduce #4 #reduce the original images by 4 times\nTH = cfg.threshold #0.43  #threshold for positive predictions\nDATA = cfg.test_data #'../input/hubmap-kidney-segmentation/test/'\n","metadata":{"execution":{"iopub.status.busy":"2024-01-13T10:53:14.000222Z","iopub.status.idle":"2024-01-13T10:53:14.000699Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import rasterio\nfrom rasterio.windows import Window\n#functions to convert encoding to mask and mask to encoding\ndef enc2mask(encs, shape):\n    img = np.zeros(shape[0]*shape[1], dtype=np.uint8)\n    for m,enc in enumerate(encs):\n        if isinstance(enc,np.float) and np.isnan(enc): continue\n        s = enc.split()\n        for i in range(len(s)//2):\n            start = int(s[2*i]) - 1\n            length = int(s[2*i+1])\n            img[start:start+length] = 1 + m\n    return img.reshape(shape).T\n\ndef mask2enc(mask, n=1):\n    pixels = mask.T.flatten()\n    encs = []\n    for i in range(1,n+1):\n        p = (pixels == i).astype(np.int8)\n        if p.sum() == 0: encs.append(np.nan)\n        else:\n            p = np.concatenate([[0], p, [0]])\n            runs = np.where(p[1:] != p[:-1])[0] + 1\n            runs[1::2] -= runs[::2]\n            encs.append(' '.join(str(x) for x in runs))\n    return encs\n\n#https://www.kaggle.com/bguberfain/memory-aware-rle-encoding\n#with transposed mask\ndef rle_encode_less_memory(img):\n    #the image should be transposed\n    pixels = img.T.flatten()\n    \n    # This simplified method requires first and last pixel to be zero\n    pixels[0] = 0\n    pixels[-1] = 0\n    runs = np.where(pixels[1:] != pixels[:-1])[0] + 2\n    runs[1::2] -= runs[::2]\n    \n    return ' '.join(str(x) for x in runs)\n# https://www.kaggle.com/iafoss/256x256-images\nmean = np.array([0.65459856,0.48386562,0.69428385])\nstd = np.array([0.15167958,0.23584107,0.13146145])\n\ns_th = 40  #saturation blancking threshold\np_th = 1000*(sz//256)**2 #threshold for the minimum number of pixels\nidentity = rasterio.Affine(1, 0, 0, 0, 1, 0)\n\ndef img2tensor(img,dtype:np.dtype=np.float32):\n    if img.ndim==2 : img = np.expand_dims(img,2)\n    img = np.transpose(img,(2,0,1))\n    return torch.from_numpy(img.astype(dtype, copy=False))\n\n\nclass HuBMAPDataset_test(Dataset):\n    def __init__(self, idx, sz=sz, reduce=reduce):\n        self.data = rasterio.open(os.path.join(DATA,idx+'.tiff'), transform = identity,\n                                 num_threads='all_cpus')\n        # some images have issues with their format \n        # and must be saved correctly before reading with rasterio\n        if self.data.count != 3:\n            subdatasets = self.data.subdatasets\n            self.layers = []\n            if len(subdatasets) > 0:\n                for i, subdataset in enumerate(subdatasets, 0):\n                    self.layers.append(rasterio.open(subdataset))\n        self.shape = self.data.shape\n        self.reduce = reduce\n        self.sz = reduce*sz\n        self.pad0 = (self.sz - self.shape[0]%self.sz)%self.sz\n        self.pad1 = (self.sz - self.shape[1]%self.sz)%self.sz\n        self.n0max = (self.shape[0] + self.pad0)//self.sz\n        self.n1max = (self.shape[1] + self.pad1)//self.sz\n        \n    def __len__(self):\n        return self.n0max*self.n1max\n    \n    def __getitem__(self, idx):\n        # the code below may be a little bit difficult to understand,\n        # but the thing it does is mapping the original image to\n        # tiles created with adding padding, as done in\n        # https://www.kaggle.com/iafoss/256x256-images ,\n        # and then the tiles are loaded with rasterio\n        # n0,n1 - are the x and y index of the tile (idx = n0*self.n1max + n1)\n        n0,n1 = idx//self.n1max, idx%self.n1max\n        # x0,y0 - are the coordinates of the lower left corner of the tile in the image\n        # negative numbers correspond to padding (which must not be loaded)\n        x0,y0 = -self.pad0//2 + n0*self.sz, -self.pad1//2 + n1*self.sz\n        # make sure that the region to read is within the image\n        p00,p01 = max(0,x0), min(x0+self.sz,self.shape[0])\n        p10,p11 = max(0,y0), min(y0+self.sz,self.shape[1])\n        img = np.zeros((self.sz,self.sz,3),np.uint8)\n        # mapping the loade region to the tile\n        if self.data.count == 3:\n            img[(p00-x0):(p01-x0),(p10-y0):(p11-y0)] = np.moveaxis(self.data.read([1,2,3],\n                window=Window.from_slices((p00,p01),(p10,p11))), 0, -1)\n        else:\n            for i,layer in enumerate(self.layers):\n                img[(p00-x0):(p01-x0),(p10-y0):(p11-y0),i] =\\\n                  layer.read(1,window=Window.from_slices((p00,p01),(p10,p11)))\n        \n        if self.reduce != 1:\n            img = cv2.resize(img,(self.sz//reduce,self.sz//reduce),\n                             interpolation = cv2.INTER_AREA)\n        #check for empty imges\n        hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)\n        h,s,v = cv2.split(hsv)\n        if (s>s_th).sum() <= p_th or img.sum() <= p_th:\n            #images with -1 will be skipped\n            return img2tensor((img/255.0 - mean)/std), -1\n        else: return img2tensor((img/255.0 - mean)/std), idx\n#iterator like wrapper that returns predicted masks\nclass Model_pred:\n    def __init__(self, models, dl, tta:bool=True, half:bool=False):\n        self.models = models\n        self.dl = dl\n        self.tta = tta\n        self.half = half\n        \n    def __iter__(self):\n        count=0\n        with torch.no_grad():\n            for x,y in iter(tqdm(self.dl)):\n                if ((y>=0).sum() > 0): #exclude empty images\n                    x = x[y>=0].to(device)\n                    y = y[y>=0]\n                    if self.half: x = x.half()\n                    py = None\n                    for model in self.models:\n                        p = model(x)\n                        p = torch.sigmoid(p).detach()\n                        if py is None: py = p\n                        else: py += p\n                    if self.tta:\n                        #x,y,xy flips as TTA\n                        flips = [[-1],[-2],[-2,-1]]\n                        for f in flips:\n                            xf = torch.flip(x,f)\n                            for model in self.models:\n                                p = model(xf)\n                                p = torch.flip(p,f)\n                                py += torch.sigmoid(p).detach()\n                        py /= (1+len(flips))        \n                    py /= len(self.models)\n\n                    py = F.upsample(py, scale_factor=reduce, mode=\"bilinear\")\n                    py = py.permute(0,2,3,1).float().cpu()\n                    \n                    batch_size = len(py)\n                    for i in range(batch_size):\n                        yield py[i],y[i]\n                        count += 1\n                    \n    def __len__(self):\n        return len(self.dl.dataset)\n","metadata":{"execution":{"iopub.status.busy":"2024-01-13T10:53:14.001849Z","iopub.status.idle":"2024-01-13T10:53:14.002377Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import pandas as pd\ndf_sample = pd.read_csv('../input/hubmap-kidney-segmentation/sample_submission.csv')\nmodels=[model]","metadata":{"execution":{"iopub.status.busy":"2024-01-13T10:53:14.003447Z","iopub.status.idle":"2024-01-13T10:53:14.003933Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Visualizing the predicted mask of one image from the public testset","metadata":{}},{"cell_type":"code","source":"bs=cfg.test_batch_size#64\nnames,preds = [],[]\nidxs=['2ec3f1bb9' ,'3589adb90','d488c759a','aa05346ff','57512b7f1']\nidx = idxs[3]\nprint(idx)\nds = HuBMAPDataset_test(idx)\n#rasterio cannot be used with multiple workers\ndl = DataLoader(ds,bs,num_workers=0,shuffle=False,pin_memory=True)\nmp = Model_pred(models,dl)\n#generate masks\nmask = torch.zeros(len(ds),ds.sz,ds.sz,dtype=torch.int8)\nfor p,i in iter(mp): mask[i.item()] = p.squeeze(-1) > TH\n\n#reshape tiled masks into a single mask and crop padding\nmask = mask.view(ds.n0max,ds.n1max,ds.sz,ds.sz).\\\n    permute(0,2,1,3).reshape(ds.n0max*ds.sz,ds.n1max*ds.sz)\nmask = mask[ds.pad0//2:-(ds.pad0-ds.pad0//2) if ds.pad0 > 0 else ds.n0max*ds.sz,\n    ds.pad1//2:-(ds.pad1-ds.pad1//2) if ds.pad1 > 0 else ds.n1max*ds.sz]\n\n#convert to rle\n#https://www.kaggle.com/bguberfain/memory-aware-rle-encoding\nrle = rle_encode_less_memory(mask.numpy())\nnames.append(idx)\npreds.append(rle)","metadata":{"execution":{"iopub.status.busy":"2024-01-13T10:53:14.004911Z","iopub.status.idle":"2024-01-13T10:53:14.005419Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"mask_np=mask.numpy()\nimage_id = get_image_id(test_files[3])\nimage, image_shape = read_image(test_files[3], glob_scale)\nmask_np=np.expand_dims(mask_np,-1)\nmask_np = cv2.resize(mask_np.astype('float32'), (0,0), fx=glob_scale, fy=glob_scale)\n#mask = np.expand_dims(mask,-1)\n\nscale = 0.1\nimage_small = cv2.resize(image, (0,0), fx=scale, fy=scale)\nmask_small = cv2.resize(mask_np, (0,0), fx=scale, fy=scale)\nmask_small = np.expand_dims(mask_small,-1) \n\nplt.figure(figsize=(16, 16))\nplt.imshow(overlay_image_mask(image_small, mask_small))\nplt.axis('off')\n#del mask, ds, dl\n","metadata":{"execution":{"iopub.status.busy":"2024-01-13T10:53:14.006396Z","iopub.status.idle":"2024-01-13T10:53:14.006862Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Making the submission file","metadata":{}},{"cell_type":"code","source":"\nnames,preds = [],[]\nbs=cfg.test_batch_size#64\nfor idx,row in tqdm(df_sample.iterrows(),total=len(df_sample)):\n    \n    idx = row['id']\n    print(idx)\n    ds = HuBMAPDataset_test(idx)\n    #rasterio cannot be used with multiple workers\n    dl = DataLoader(ds,bs,num_workers=0,shuffle=False,pin_memory=True)\n    mp = Model_pred(models,dl)\n    #generate masks\n    mask = torch.zeros(len(ds),ds.sz,ds.sz,dtype=torch.int8)\n    for p,i in iter(mp): mask[i.item()] = p.squeeze(-1) > TH\n    \n    #reshape tiled masks into a single mask and crop padding\n    mask = mask.view(ds.n0max,ds.n1max,ds.sz,ds.sz).\\\n        permute(0,2,1,3).reshape(ds.n0max*ds.sz,ds.n1max*ds.sz)\n    mask = mask[ds.pad0//2:-(ds.pad0-ds.pad0//2) if ds.pad0 > 0 else ds.n0max*ds.sz,\n        ds.pad1//2:-(ds.pad1-ds.pad1//2) if ds.pad1 > 0 else ds.n1max*ds.sz]\n    \n    #convert to rle\n    #https://www.kaggle.com/bguberfain/memory-aware-rle-encoding\n    rle = rle_encode_less_memory(mask.numpy())\n    names.append(idx)\n    preds.append(rle)\n    del mask, ds, dl\n    #gc.collect()\n","metadata":{"execution":{"iopub.status.busy":"2024-01-13T10:53:14.008077Z","iopub.status.idle":"2024-01-13T10:53:14.008574Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df = pd.DataFrame({'id':names,'predicted':preds})\ndf.to_csv('submission.csv',index=False)","metadata":{"execution":{"iopub.status.busy":"2024-01-13T10:53:14.009525Z","iopub.status.idle":"2024-01-13T10:53:14.01002Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#from IPython.display import FileLink\n#FileLink(r'FOLD-0-model.pth')","metadata":{"execution":{"iopub.status.busy":"2024-01-13T10:53:14.010972Z","iopub.status.idle":"2024-01-13T10:53:14.01144Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#os.stat('submission.csv').st_size/(1024*1024)","metadata":{"execution":{"iopub.status.busy":"2024-01-13T10:53:14.012397Z","iopub.status.idle":"2024-01-13T10:53:14.012883Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}