{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"pygments_lexer":"ipython3","nbconvert_exporter":"python","version":"3.6.4","file_extension":".py","codemirror_mode":{"name":"ipython","version":3},"name":"python","mimetype":"text/x-python"}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"# CycleGAN with two-objective dualhead discriminator with bce and hinge losses \n\nThere are two implementetions:\n\n1. DiffAugment (look https://www.kaggle.com/unfriendlyai/diffaugment-is-all-you-need for details)\n\n2. My own contribution two-objective dualhead discriminator with bce and hinge losses \n\nWhy do I need such discriminator? We have only 300 Monet paintings and discriminator overfits quickly. Existing solutions are considered but they do not completely solve the problem of small amount of training data, which threatens to overfit the discriminator and the continious deterioration of the result. Successful results under such conditions are achieved by early stopping. A two-objective discriminator is proposed, which is expected to avoid the negative effects of overfitting the discriminator and the need for early stopping.\n\n\n\n\n\n","metadata":{"papermill":{"duration":0.02436,"end_time":"2021-05-03T04:05:22.090062","exception":false,"start_time":"2021-05-03T04:05:22.065702","status":"completed"},"tags":[],"id":"strange-equality"}},{"cell_type":"markdown","source":"![image.png](attachment:455d6ca8-3c80-454b-a7fd-786265809c43.png)","metadata":{},"attachments":{"455d6ca8-3c80-454b-a7fd-786265809c43.png":{"image/png":"iVBORw0KGgoAAAANSUhEUgAAA9wAAAF5CAYAAABtHiJpAAAgAElEQVR4Aeyd+bccxXn++bvu95z8mB+SX+Icn9jJibc4uXZyTOI1hM1sNiAB4kpoZZOFEItZjEC6gCwJCQkkFiEkARK6rJIFBmNjMLExjl3f+lT32129zEzPvTN3Znqe1rnqnup633rfp7q666n1PKdDCAgBISAEhIAQEAJCQAgIASEgBISAEBg4AucNXKMUCgEhIASEgBAQAkJACAgBISAEhIAQEAJOhFsPgRAQAkJACAgBISAEhIAQEAJCQAgIgSEgIMI9BFClUggIASEgBISAEBACQkAICAEhIASEwMQQ7vnZWTc/8PxacPNzs25m5jx33nn2N+Nm5+bdgv8358+TdAwHo0lCQLYKASEgBISAEBACQkAICAEhIATGB4HJINwLc27mvAET7oV5NwvRnpl1c/MLUY6kJBwCPjPnafeEHMPAaEJcl5lCQAgIASEgBISAEBACQkAICIFxRGACCLfvaQ490IMk3J5shx7tLjrnZyeIcA8Do3F8XGWTEBACQkAICAEhIASEgBAQAkJgchAYe8KdkG0b7s05Ismhl3omGw4+43urC53VHfJhfjbRN9tjxHjdEO0FhqDb8PM4vQXfMz47k/bEewLsr8MwdeKU7Gimw3rg015265GP0w56jWwvEqOC3aU0S3brpxAQAkJACAgBISAEhIAQEAJCQAg0R2DsCTeuJAS5TFyTXupZY9iekCbkfMbNdR0H3qB3uwN+C3OeUHuWHtRDgLNe8pj02hxwryQM8/ZEOGL2jXV4vxboZQ8NDGlaWdoMsS/qXRxGJbsLaXYAQcFCQAgIASEgBISAEBACQkAICAEh0AiBiSXcgWBGRDZ4W0NwKyhYnE7zswPJjXuLz3MzgcFDeoukH/JML7aZUSW9KaG1CL6vu38deJAQ7sQOfqd6Ix+qaacNFVnayPnD/I/C62STyPpfCAgBISAEhIAQEAJCQAgIASEgBBaLwIQS7jIBzd3vSR6NUEdkNZfOrxgeft55vrfaxoObnA3pjs5GhKtplwj3onTkNnG1EA+jj3yopt0co6psMU39EgJCQAgIASEgBISAEBACQkAICIH+EZhMwp320hrRjd1Oep2LPdHx/ayH15PpbkPPEz1RnECWu+j1iVSJax3h7ldHar3N4Q7zxtPh890Idx8YVe0uIKYfQkAICAEhIASEgBAQAkJACAgBIbAIBCaTcKdDrOO50eZ7T8Jtw7F9D3UdYS/qKRPufPi4xYvPVeJaR7j71UEKaW911t3eZEh5ItMEo6rdsVe6FgJCQAgIASEgBISAEBACQkAICIHFIDChhLuuNzlxH/LYjUiHWDaPuUsvd6WHO5axhdpQ5sNn067yKnEtEe5F6fBphN71iPxbo0G3Hu4gxlz0ao96GaOq3TimQwgIASEgBISAEBACQkAICAEhIASWgsDEEe75OdsmK12p25NO47/5qt4NIMnIryfovufY746VHcyTrlvxPCHhxQXVmOed8O2UXBcIbtrLHBHj/nV4s9K539aQgJ9hlXL0elvxPybN/WFUZ3cGhS6EgBAQAkJACAgBISAEhIAQEAJCYJEITATh7jjv2uY1pwuYzczm5LsZHn7vbPbVnsn38k72zk63/4pIuOkr76FdJNtGxulVTsm2La5WIN3FvbzrdRiRT1JOFnHz+tO9vxOCzRZkqZFZA0JRzu8t5mZnzC4aF2KMjGzb/ZKsOa2zEBACQkAICAEhIASEgBAQAkJACPSNwGQQ7r7dkoAQEAJCQAgIASEgBISAEBACQkAICIHRIiDCPVr8lboQEAJCQAgIASEgBISAEBACQkAItBQBEe6WZqzcEgJCQAgIASEgBISAEBACQkAICIHRIiDCPVr8lboQEAJCQAgIASEgBISAEBACQkAItBQBEe6WZqzcEgJCQAgIASEgBISAEBACQkAICIHRIiDCPVr8lboQEAJCQAgIASEgBISAEBACQkAItBQBEe6WZqzcEgJCQAgIASEgBISAEBACQkAICIHRIiDCPVr8lboQEAJCQAgIASEgBISAEBACQkAItBQBEe6WZqzcEgJCQAgIASEgBISAEBACQkAICIHRIiDCPVr8lboQEAJCQAgIASEgBISAEBACQkAItBQBEe6WZqzcEgJCQAgIASEgBISAEBACQkAICIHRIiDCPVr8lboQEAJCQAgIASEgBISAEBACQkAItBQBEe6WZqzcEgJCQAgIASEgBISAEBACQkAICIHRIiDCPVr8lboQEAJCQAgIASEgBISAEBACQkAItBQBEe6WZqzcEgJCQAgIASEgBISAEBACQkAICIHRIiDCPVr8lboQEAJCQAgIASEgBISAEBACQkAItBQBEe4JydgjR464d999d0KslZlCQAgIASEgBISAEBACQmB5Edi2bZt77rnn3MqVK90dd9zhtm7d6n7605+648ePu1dffdVt2LDBffTRR27fvn3u9OnT7oMPPnAPPvig279/f4j/zDPPuFWrVrm77747/CFLHfzll19269atc++8806QJezcuXNB9oknnnCbN292hw4dcmvWrHH33Xdf+Lv33nvd4cOH3bFjx9xNN93kFhYWgixpvfHGG+6BBx5wu3fvdrfeeqs7ePCgW79+/fKCpdSWDQER7mWDur+EXnzxxVBIKYgUdnth9KdFsYWAEBACQkAICAEhIASWAwHI3m9/+1v31FNPubNnz4aOku3bt7u9e/c6yNeTTz7prr/+enfnnXc64v7sZz8LRPCFF15wW7ZsCfGJc/LkSff22287ZKkH3nXXXYEQzs3NBT3ogqw9//zzgVzefvvt7vXXXw9xIJsQu4ceesjt2rUr1B8hhGvXrg0y999/fzhDDvm75ZZb3IkTJwIRJB7EErseffRR95Of/CTYvnHjxmALOpHHxgMHDjjCIZTIPfzwww4/IK87d+50t912m/v5z38eyCS/d+zYEUgo/hAf4rtnz55wjX/Yguwjjzzibr75Zvf444+H9Dk/9thjQRab0AnxBRtI86ZNm4IOZLEPm+bn5wPG4E4aEGDsQx5Z8If0khfoRpY/7pH+PffcE3wkDrJgjTz30Y//V1xxRUiPe2BiNpE3T3j/SBtZ6vDoxE7wxJ6rr7465CP3kAcLbOe3jnYiIMI9Bvn63nvvuWeffTYj2LSa8RKglYwXJK10tHzxktEhBISAEBACQkAICIE6BFasWBF66SAUEJxXXnnFPf3006EyT28cpAYi99prr4X7kBkq/BCzG264IRA7evYgCPTKUfeABEDmIFiQMcgg9yEv3EOW+grX/EGEIH2QFYgUMlzTc0gvI/chYKRD+pANCB52cMZeyAoEFEJppIm6EaSEtOmEgChBFvmNTggTBIy6EgQUeyF33MNvdCMP6YGQ0SOJD+BE2sih08gevyHF2I4s+iGR2E76Fh+yhT70QMaIByZcc+Y3ccxW/MZObCMcm/ijdxO9yFAHxC9kwRRdxIHA4ReEjmvksQ0M8Qv7r7322uAP95CF6BGH36QJ5kYEwYbeVWzCftIlzywvsdlkjTRzz54R8ggbiXPjjTcGG7iHfvRyD2ztDBkFU/AiHc7oo/cXO7mHLPmHHH/o4w9ZeqzxERkw4DkHG54/7iGLTfiKLJjwB4Emv8EWW2kkIA3y87rrrgtxkAV/zshiD88CsvgCduQJzzB4E/eqq64KOpDBduxCFnv4QxY9kGyeNcqRNZpccsklQT+yxLNGFDDHZh3tQkCEewT5+etf/zoMa+HjwYeLQsuLlpcphZuXOC1ll19+eXhxUPh4QVKQKZg6hIAQEAJCQAiMGwJ8095///1A8qgUU0Hnj54hKrXWq8c9SJhV/iF/VIDffPPNUJmlEm4kijMVVCqk/HGPEWBUnNGLHggIPXT0rkEaCKeCjyzfUirffDu5R+M26RNGfCrtpE048fkO863lmoqyETl00mtpRAECx7caHyCIFs+ICJV5fCccnaRD+pABrrGBcMgcZ+wBH9KBOPDNJz5+4Ct6IAdU2tFL5Z70IQ/YSwWdOKRP5R79VPxNB77wG78gKPiBbjBFLzaAEfagF3vQTRgYmm2QcuKiC8JkhAxdkEhsRQZ5/qjTYBO6GKZr9RjCSBc5/vAXv7jPH/EhSKaHZwAbICXYDL7IEQ/MsIl7/PEbfMCD35A54pMmv9GL/eYf6aETf8CL3+CHDnyHXHGNrJE50rPnGb1ckzfoJH/JDzBfvXp1qOOhk7oe/iCL79iBbJzfPEtgyn06W9CDLOmDK7LUF9GNveggv8Dv6NGj4R42QgTxGVnS4AwekGKIILKQSJ4V/k6dOhXKGeEQQWwgPXDBb/wi//AHX9FNQwhpv/TSS+Ee4ZdddlmwjfjYTLr80XmE3djGH7JgzDuDZ4oweoyJwzNqWGEPtvBHmugEX54VyiANBIT/6Ec/CvlMHoAZ+WtpcUYeO5Dl+eDMO4nwa665JuBCWQYTbAd/cOOP/Lfnm3vYTd4Qjg5ssJ52MLayhgzPHv5QrrCJ/KNRjHDwpHGE98oFF1zg/ud//sd9/etfd9/4xjdCnozb+132LA0BEe6l4ddI+syZM6GVmBciLwg+7rzUeQHxIuPlYC9EzoTxkuElQRxeMBRwXn7c1yEEhIAQEAJFBKi0UuGjIsW8PCo59KhRkYRY/fKXvwy9ZRACKj28j3mnxr16VLioPFIho4LENe9reiXQxXuYShSVPSrOVFypxPHOtgovFS67Rge9IVSiIThUuLjP2Spx2MA99GMX97nGFr4XkEm+F8RDjvSpFGIj1/hJHCqC2MI1lU7kwYJ42Mc94vNd4T7p8EfFF71gR8Wb+NhBRZr7fHP4HqGfM+HYYxVP7KLCawSO75URD66pOJMu8bCHe6SH3VTmIX92n4qq+YUc30bukRZ+GZkjDLvAEN/4owKLXvIFXyAixMMX/MI+MCAOtlChJi42IMuZcGy2Cjv+I2cYch+d2GZ4IMuzhw323f7mN78Zng3ikB66SRt9nPEdGyFz5CW+8IcebCI9ZPgjnHOMOXkIMeEPe7lvBAXd3Oc39vCHDzyz4EBegTkEljjYjQ58QxaCbMQGG3mWwR38uQdBgWyQhvmMLPaBBbqRwxeeFYgIjRnYasSIvAEH7OaMLKSF8oRN4I+tDNuFkKGXMAiZ5Ru4IEv+QgLBkjSRR5bnmrLLPdKFgGI7eYK/yGI3zxDPHfrRiSz+kjbklPz58Y9/HOKQL+hHDlyxBd38oQ9ZsKbsQabACzKH74STBvkLdoYRNvFMYS/6iQcW2AUxow5IHpAGzxL2kBa2gjUyyOIXfxBAZNCB79wzv4kPXugBL9LivpUD8hUZ/Oa9CAYmg07i84wQB4wozzwD+IOt+Eweood3FzLYhz4wwQ/iIMdzQf7jD2nxPJIW1+Q517wrsJNRFmYL1+SrPedgjA5sAGfe2fb8kD/oYpQE+cZ7lUYJ8olnwMoW+ckzScMfYTzr3Kcxjz9w5RvCaBHSxmeeWfvjN9MHiMd98MVOvhuUARoDuebMPb4L+I8d6ODbBGaXXnqpu+iiiwIG2KOjXQiIcA84P6ncUWgpmBQsCi8vIF4yvOj44PKyoTDxwrYXPeHE50XBi4HfvKBoyeclQWHXIQSEwHgiwJw9PrBWeeGDSuWPjygVK8o6H3EWbOHjzFBNyjblmgVYuMeHmQ8/5R4ZKilUSPjjncHHGlkqMlQiIHG8a0iLigz3IISkRSWFShQVM/SSDvexj/cJ+rCBM5Ua0uDDz5kKDO8q5NFHBYJwKuy0xBNG2lQWCCM94pMW7zX0UIHkHpUkZK2SwXsNe6isUWGiUsM9/OYaP9BFJQ0ceH8SzjVxuIe96OE9iU/mJ/agk0oPcZCjwkUlERv5bfepnPGbtIkPhsTjN7rBnwov6RGX9zTxuG/vaK6x02SxjzjoBUOukUUP97CT39iNLLaAAzrwA8w4EwdZnh8qkNgOtsiZLBibL4Yv+rnGfnTwDHBGJzbhE3HIF87YhG6u8ZM00Yl/yFJJB3/ixLLoMjyxCxl0gh/5j838Ec/yjzS4D2nAL/RhF2H2PJBXYGVEEF9IBzvJT+4RBwzQy7MC9kYoqKBDNtCPbuKYrFXmuYdOnidrzECO/IJU4Ts+kTZn7OPbjT9gabKUA9IGJ5P98pe/7L73ve+57373u6GXisozhINnx/KBdK2iDYnkHnM5wYX8BzPSxW70QiSwCfyQBSvKH4QHuyFzxLHygCw2IkNeoJd8RRZfyCveK/gDQSKPeZawD1nzEYzB2sohZ55ZyBA+gTO2ky+kg73YQRxwRy/pkS5+EWaEGh2kz7NPGvhG3mIbevCLvEXWbOI9Sh5iO+mT5+BDetSv7L1BfvAeQNbswE/SJB64GXEDF36TH/hButwjX7ED28gjbCUt/KXhAH953gnj3Uh8niueJ96t3OM3ecCZZ50z71tswjZ+8/5n2D0+QAjtfUwcwuwPW6hXgiP22W+IJc8CctwnbbAEV/AAf/L2rbfeCtfYCsZMJ2CxLr451FO5z7eFdwA+8GzbM8pCveDJ94Nnj+mPhPGbOeJco4t0IKbYgh3o+c1vfhN0oZu0WKSM7ySNoaTJffThA51S6KFxEh3/+7//G75xfC/B6I9//GP441vJtAjuf/LJJ8GmDz/8MIyqwR50/9///d94VhJ6WGWjE8DeykYPEd2eMAREuAeUYbwI+Sjx4uFlysuJjxLDRfjNx4aXolVM+KBTKeDFSKWXlzIvUl6SnHUIgX4QoCLAB4vKwC9+8YtQMeBjyseIZ5GXOB9ySCGVIZ5HqxBDnng2qSDYh5sKAB82ZPngUolDBxU4Ki5UhHiGqWzwkaSiBgnko87HlQ8fHw3+SIdKBnGo1FBxQB69pEM45Qc7iE9FhHJBJYiKH2fKh1UAqVRwn/jIcp80KX+E8dsqPVQwsB09lC3S5h52I8tv/MIefOUeMmBBhQwf+cMuKiSkQTxksQm/0M095DiTB5RhdKKf8o0c+tCPbiqnVDTwCfuoMBOX3+QT8ujDL94p+IxuZKmcEkYFkPywihnX6CIu6VApJV3sQBZ7iUMYzwB/vIOIj16TBScwNP/tbHZiI/mIPnSDhckiR1roJAxZrrERH0mfCizpkTbYmSx4EMYfzwx4II+v2IxsTASJE8vyniUMnaQHfuQVZ2SpqJM2MvyBM7bxLIEF8vwRBgY8k+CIv1S8qZzjM8+D5RHPBXrRDw7kG/ooB2BBPhtBwS58Q5542AYRIB8ND54nyhE6qNAja98QsEaWM/ZBQIiDLDajj4ou98ifWJb0sJn0yR+eIXxGFpyRpUyAMxgjC1HBJ7AEL2TRAx78IYsuMEAePeAUy5J/hpnlDeUDWfIFWezFJ/xBHnLFfSOR+Mxv0id/kEcGWeKg13rW+OaSF+jGdmTBCDuIxz2w5Q/M0Gs9geQFfqGbNEgPLPjNNXlJ/iCLXvDDVkgg6f/3f/93mAZG7zbX3//+90N88MMG3gPIYgf4W7r4TLqUV+whPunyriZtfIYE8TxyDx94ZrAHOfTx3iOPKCvYznuV9xo+8m3gD13EtWefM/ogT5zJQ/yCyBGfZx8SwPsdXeQ9uPJHvqOPbwxp8uyQFzQAIk98CBjfAQgY8QnDRzDgTI8fePLMkpd8t/iGkTZykDDIGulQJgjnfUh8vk1cYztnVpmml5A0mZbAtAbrXUQX4WDCt4W46MJOyBzkDTIICcQGriGS5BdnCCp+oud3v/tdwINrbPvzn//s/vSnP7lf/epXgTxCDHUIgcUgQOMD3wzeJ5Q9ypOOdiEgwj2g/OSDyoeQD5xV+PgY8lGlkscHm0oF13y4eJnzISGcCskkH1QM8IGPIpVSKmpWkSaMDx8VDD5KxOXjxzx2Ptx8qKlQUEGlksHLhoohf4Qxx53KIzqQ5ePN0B0+8ny0qVTxwaUCgjz4gylhtJQSzkcWWTDnQ4kslQsqN4SRT1SeqBSQR+jlQ0yeIocuXoDoQRZiQKWGSgI6sIFw8pUwKkfoIx6VJMKpEOGvVeDJezDDT+JR4eEe9lCR4jcVFLDBVirC/HGPM5UlfKXCQkWXlzMVGe6DPT5gP+H4xR82ERd80AH2hBOG/ciCF+lBqrGNiir3CQcbfMF2q2DxmzR49tHPB4MKJJhwDz/QS5r8xlcwQi9hyGIvf9hA+SA/SBv/0Guy+AeG6OQ+spzNBmzkD13YSt5QgUQPaXImLpVOZLlGH7ZgO2mTr6QH7iYLHuDNb3Qjiww6wQZ78RkdxDGCYfmDTtIEE/C25x5Z/KPMkDa+WDrI0iDBs48t+IIs2FMGkEUv5YW8Qj9pm83Iopc4pGH28gxzTTgkAZKBvfiMLJggSzj5ZrJgQOXW/CVdyA2yYI0sZ8t/ZM1mcKIs4xPPJMQKWWw2WeTxj/wDT7DiGSXPedawj3cIPpkstoIZf5bfJmvl1PIOEmiyVnY484cPnMEErMGY55TyyG/kTBabef44IwM++IWvxMVeMMAX7oFTLAv2pIc8vuIjzxSy2IosvoAT3w6w4owMzx3xkOV5w0auwYryjt385lmyHkHyEf08c9jIfXTyniEd7vGOIo/AEZt4nsCa9ym4Yxf3LP8gPGAD/uQr70f8Qr9hyBl7uQdepI8PEDjea+QP3wZIED7bs0capIlvvIOJZ+WMxkCIEs8nZMeIHWkTHz2kg37uI8ezwz3IFN8dbEcPxJByBGa8r7ETvfhDTxlyxAUbiBwkjrIDIYTsQUJ593KmXPB+Z8gyPc6cGRZKvtOjR0Wa7w7fLb576EcvOunBQy9nSCL44Bd/n376aSB4pIcOiCHX2IUerpGDmEIS+VaSjg4hIAQmDwHKL+993p28M3m/6mgXAiLcA8pPPt7/8R//ERZu+MpXvuJmZ2fd5z73Ofc3f/M37qtf/Wpo9f/BD34QCtOVV14ZKmZ8LKksUKGhgspHmAoP11TYqHjw4adSQuWHM3GoWNDiShwqFVQyqWRQ4eeaig6yVKqoUFCxIh7kkcoYFRD0UNmiooANVKBIm3tU6ijsyHDmHhU6KmFUiMxOKhzIUmmEGFA5okJH+sTnpYGN6OQ+FTL8oRKKDLL8oZczlS7sRT8Ve9Iy3diNTsg8vqGbP2Q54yOVXeIgSxxkwYMXGPcgGPhMXGR4uZGG4QOuhFO5pOIGDtiEX1RCqUBTyUYGvWDDHzjgJ9f4jyzxCOMPG/GftImDPaTJNZU8bOWP+6RFOPaSDjZCFkwGm4jLPXw1G6l0IwuOYEwcbKRyzXPBbyq8JsuzQTj2ohtZ7OY5xn/yioo+toMB/pgszxrPI/aSBnJgR8WReNhEPkEK+I28yWIb+YB+nnNkef752GALsvToYbeliaxhRTj5wB8284ySLr7hB0QD/aRp6SLPc8UzhBxp80zzXFLBJk2wwF8ICvFNFizIQ2zFV+KiC3/xBV3kLWkiT75a2viDLmSQxUbSRB67sQUcjbzio8kSF3yRRxZdyGA3fmMvzyR4QEB5HoiLvZYezwJpgCMYI8vzjb2kGctiN/F4jshz4oInYTxnpIlu7MVPI5Gki93YBxaEkxbXxOdZIY+xCXuxlTN4UU6xkXj4i26ID36gFyJE2QIT/MVusOBs+Yc/pE96RtCwlWvkyTt082fYoNPs4h2BPASNMO7RUAeJIo+xg/cZf1xjH88MeWH5AYGy9HiOeTdTvrAD7NBJnkMWeVZJh2eHMySM+JBPSCAkDEKFDDq5Jh7EDqLIb9JHFz11EEnkIV0QQ/RjI3GRIR4kjHikgV+QOYZj0gBKevTiQQz5HhEfIkcDJ/FML9cQVsIZsgn5gwRC/CCGxCPtaT54HniWKEt8wxj+qkMICAEh0AQBvh18Y/jG8a3ifaKjXQiIcA8wP1lZ8MILL3T/+Z//GVZq/Id/+Af3+c9/3kG0CfvHf/zHUIGl0g0xoBJI5dIqwVRA+VhDwqjs8fGm4FFxo/LLNeGQAiqwVEQpoJAydJgslVGTtXAq71T6qEBzJpwKLpVr7hGfNNDHNZU84mIflXCzh4okdpAmlWsqusQnDmfkqUyiC/s4I0vFmooiaRFGpR0Sg83gwBlZKotUqEmbFw9Y4T+VOeTwm14EGgewzWxElgYFbEIfFXRk+aPySVrEpfcBv7ENecMfWWxCP74hxwsPWX6jE1nIAraCAbKGOeQSLCA4li42I0s48/QgONiJHaaDvMAX5MDQesjAyhpfIK9GUCA2yHIGUzDBN+wzAkDegSHyEByeFyMeyNqzgw5wwhdIEjiTPs8EGCGHPKTE8ghfkCevkQUDyAGkinjIgRGEjmeccJPFR2SIBy7ogJAY6QFD/AQnfMYek+VZQDfYIguOPIsQIeIYeSRtZCkD+Id9pIk9pIUeyhkVYvTzPFrvJ5ihxxo7iMd95GmYQhd6yRtrKMEndIIJ8cCeOOjGP/KaXit+gxOEB9JEfvAMkh/4gq2kgV7yEUz44yOMTsoFpIdnivKE35x5fngOIFPIgwny6IFM0UgHcYN0QajAgPvoQy/X6MUuCCplF/8gYaQNEYWsQaisJxAb0EmZgWxC+EgHOeIzjYH43IN0QOywDxkIG8SN9IiDjRBDMOIe5A0Sx9BOCCXEkPjopQcQWyiTXGMj16TPtQ4hMEoEKIeUed7HvDspvzqEgBAQAk0Q4JvH95u6At93vuc62oWACPcA8/NrX/ua+853vpMR6H/6p39y559/fujtZkEWCB0VdHrA+TBffPHFgRhR6TYCSOWbgsYHm0o4pImKOiSA4WwQSir+LMhCjx16YlkqwZAWSAjEBJICSYKYoYcKOhVm9EASIJFcU8CNeJMupIGKA2SCcCrwvAggC8QnHOILkSEcXdjOGaJiBAQyhyzEi5cJsvgEGcNHSAP20QCAjcTHH+LgGwTByAWyMREEE2SQxVb0kDaEkTOyEBsqQhAp5LEXQgbBJC+IB1RFkaAAACAASURBVE6khx9gigy2cg97wJM/5Ol9xR+ThaRB8tCHbfgJacEm7MFHfIXUIYtewrGJdAmH/GE/WJD3YE/+4Qd/YA0ZJW+N9IEvBJ0eKcKwCdKDfn6TZ/xhP7YSjwogBIvnDfsgOqQF+eKa3m3s4h4YGCnkecE/dKMD3CFw+IleSA+EiGcLQsxzRjpgARnCbsgaYZzp1YOA0ZPIM03PHjLggA3Exx8ImBFG0iI+5A3iSJp8oGzBMcgcaUHkIH7cg6hhOzpJg/l35AU2QtgghthvPXnoBQfukTb6kIfMMU+PXkCuOUMMsYd46NEhBITAdCNAAxPfQFbS5r3Pe0aHEBACQqAJAtQtqOtST6LeRv1OR7sQEOEecH5CSCBe7GP47W9/2/3Lv/xLWLkUIvetb30rLKTCaqZcs5oppBWCAbFClniQOIgQBI8zPVF8yCGi9DhCGrmHrPUIU1CRRQ/EBxKILMSF+BRiCA1kCpJKGCQUoolOiAfEDlnCrFcPIgjRgrRACCGChPEH6SNNeqfoyYOUEYadEB+IH75xH8LEb2scgEzzQoHsQPLwESKIzRAd7MAmriFdkF8IHPf5Aw9IH+QPEgd2pAGBw0+IEiQLeYg0PhAOCUc3PWX8Jg2wwV7IG7YiAykkDveIY0SONBhySRhx0YEdkC4qXKTJUEv+8An/CIfI4Qe9dpBTyCA6SPMPf/hDIHKkiR6IIcQbX3gJI49NH3/8cdBPeujjNwfxdXRGgGeUZ4tniLLJ86NDCAgBITBIBHif2wJ3NKTy7dAhBISAEGiCAJ1ZdJLQGUH9VvWUJqhNVhwR7gHnF8QMQgchguxCan/4wx8GggpBZuVSeqfp7WZhFYg55AoiiCwEEpIG0aLXjmGd9NbRkwbhJIwPO0SWXkHm7UHskIXwQuQge/ymFxBShixDNxmqyVYMyEHmIJSkBTm11Tfp5SMNevE+++yz0NsHwWRoJ716EEz0QxzRAfnTIQTGGQEapeitp8GHhhk+aDqEgBAQAoNEgMZYerVp4KMRW4R7kOhKlxBoNwLUu+lIo3ebDjTq2jrahYAI9zLkJz2XEFOGatOrS08bBJszPb0QYIgAPZk6hIAQGCwCDKln5AejKzgzUkOHEBACQmCQCNCwzfedxm4a+Oil0iEEhIAQaIIAnV1MeWP0KCNMId062oWACPcy5icFit41hkAzzBnSTU81Q7yZ80UYf/RU6xACQmAwCFCeqPwyrJzyxugRHUJACAiBQSJgU6wYpcY0KYaI6hACQkAINEGAqYb0cLNeEB0DjFzV0S4ERLhHkJ8Mx2ZYOItnMdeaOdOcmffFsFfIAWEMhdUhBITA0hCwkSS0GjPUk0YtHUJACAiBQSIAwWaNFBr4mE7Guhs6hIAQEAJNEGCNH6aa8sdIGRrudLQLARHuEeYnhJr53pBtWrVYyIxh5yxARms5w9IYXkKrlw4hIAQWhwBTNejdZi0FyplGkCwOR0kJASHQGQEW0YRwU1lmihhro+gQAkJACDRBgG0y6Ryg/k/HG2s26WgXAiLcY5CfDCWBXNMDx2rafLCtpxtCrkMICIHFI8AwclYP5kPG9mqUMR1CQAgIgUEiwJxLRqfRaM63XN/uQaIrXUKg3QiwsDE8gM4BVitnRyAd7UJAhHuM8pPVwFmxnILGYmp8uNmOS4cQEAKLR4C5UAzPYiQJi5JobtTisZSkEBAC9QiwujALoDIqjW84i6fpEAJCQAg0QYCdjXiH8EfnAKNldLQLARHuMcxPerwZTsKewTqEgBBYGgLsEMAUDbbMY8iWPmRLw1PSQkAIVBGgosxWPqy/wjXvGx1CQAgIgSYIHDt2LBBtdlNhpAydbjrahYAI9xjnJ3ts6xACQmBpCDC8k0ow++JCttXztDQ8JS0EhEAVAdaHoJJMYzkLolJx1iEEhIAQaILAa6+9FlYnp1OArUsZ4aqjXQiIcLcrP+WNEBACJQTYEYC5UQz3ZCs+7XdfAkg/hYAQWDICTFvhPQPpZh6mFmdcMqRSIASmBoHPPvssbBlMBwEjZOgg0NEuBES425Wf8kYICIESAhBuKsG333576H1iyoYOISAEhMAgEWDv7c2bN4eeKaawMCxUhxAQAkKgCQIff/xxaLC77bbbwugYdjrQ0S4ERLjblZ/yRggIgRICDCOHcLMQyYYNG0JPdymKfgoBISAEloQAw0DpmWIoOZVl9tXVIQSEgBBogsC7774b6ilMR2E4OaNldLQLARHuduWnvBECQqCEAMM79+zZE8g22+2dPHmyFEM/hYAQEAJLQ4BtwOjlZoVyeqm0OOPS8JS0EJgmBD744AN36NChbFoKU1R0tAsBEe525ae8EQJCoIQAhHv//v1u7dq1YZin5nCXANJPISAElozAqVOnwt7bvGdWrFgR9tJdslIpEAJCYCoQ+PTTT92BAwfC3G0WXqTeoqNdCIhwtys/5Y0QEAIlBFavXh2I9vbt2x0LkrAKqA4hIASEwCARYFeRLVu2uPXr14ctPbdu3TpI9dIlBIRAixE4e/ZsGCHDYos7d+4Ma8602N2pdE2EeyqzXU4LgelBgJXJbfVghnmyV64OISAEhMAgEWDOti2ctmbNmrA12CD1S5cQEALtRoAGO94hrAcB6X777bfb7fCUeSfCPWUZLneFwLQhwCJG7MPNommsVE5Ptw4hIASEwCARoHJMJZnKMg18VJ5feOGFQSYhXUJACLQYAd4ZNNax2wHEWwsvtiuzRbjblZ/yRggIgRICLD7C6sHMiXrssce0aFoJH/0UAkJgMAjQoAfpZlgoFWaGieoQAkJACDRBgAUX161bF6alsFo5K5fraA8CItztyUt5IgSEQA0CbNHDvG1aj9kWTD3cNSApSAgIgSUjQKMe75tdu3aFqSt/+MMflqxTCoSAEJgOBFj3gQUXb7rpprAAIwsx6mgPAiLc7clLeSIEhEANAqdPnw4k+7rrrnMrV67Uomk1GClICAiBpSMA0b7vvvvCkHK2+GGrHx1CQAgIgSYI0DHAloL0dDNChq0GdbQHARHu9uSlPBECQqAGAVqJV61aFVYoZ7gW8yt1CAEhIAQGjQDvlm3btoUF0+jtfueddwadhPQJASHQUgSYs80IGdadYRoc60HoaA8CItztyUt5IgSEQA0CBw8edOxryZZgEG9ajnUIASEgBAaNgFWW6aWCfH/00UeDTkL6hIAQaCkC7KJyxx13hEY71oNQXaVdGS3C3a78lDdCQAiUEHjrrbfCCuVsB8YH7N577y3F0E8hIASEwNIRsAUab775ZkdD3x//+MelK5UGISAEpgIBFltkZIxNS+F9oqM9CIhwtycv5YkQEAI1CNx///1h1U8+XvR079mzpyaWgoSAEBACS0OA4eQMA6Vhb/369W5hYWFpCiUtBITA1CDAUHJWJ6eeAulmRJ6O9iAgwt2evJQnQkAI1CBw4MCB8PFiS7Ddu3e7o0eP1sRSkBAQAkJgaQhQSaaBj4rzXXfd5V588cWlKZS0EBACU4PAyy+/HOZub9q0KexywDxuHe1BQIS7PXkpT4SAEKhB4MSJE2GVcirAbAn2wgsv1MRSkBAQAkJgaQgwB5P3DBVlzseOHQtrR2ho6NJwlbQQmAYEqJuwQvmtt94aRuKJcLcr10W425Wf8kYICIESAjt37gy9Tgz3ZCEShmvpEAJCQAgMEgHmbV988cWOvXSZh8mw8jfffDOsGUHPN2tHzM3Nqdd7kKBLlxBoEQJsA8birtRVGClDB4GO9iAgwt2evJQnQkAI1CBATxM9TMyN2rJli3vqqadqYilICAgBIdAfAmvWrAnEGnK9efNmd8kllwRiTYWZ3m7eN1Scbag58Y4fP95fIootBITAVCDAFBR2OuC9wftDo/Hale0i3O3KT3kjBIRACQEqv/v27XNs1cNwLYZ56hACQkAILBUBGvEefPDBQKoh1pdffrn78Y9/7K6//np33XXXhT96vnnvQMipTOsQAkJACNQhcPLkyTCUnNXKIdyHDh2qi6awCUVAhHtCM05mCwEh0AwBKr8M8WRoOcM9IeA6hIAQEAKDQICKMcSb98oFF1zgfvjDH4bVhVevXh1WKrcebkbZaMHGQSAuHUKgnQgcPnw4jJjhXcEuB+zJraM9CIhwtycv5YkQEAI1CEC0GcpJxZd5lMyT0iEEhIAQGAQCLGxEDzaNevRuX3bZZWHRo5UrV4Y1IyDiGzdudKw8fOrUqUEkKR1CQAi0EAHqKNRVGErOsPLXXnuthV5Or0si3NOb9/JcCEwFAiySxseLii8VY3qkdAgBISAEBoHAnj17wrByeqPOP//88AcJZ373jTfe6G666Sb3ox/9KPRYaTrLIBCXDiHQTgQYSs5UFHq32cZ0//797XR0Sr0S4Z7SjJfbQmBaEKBH27bqeeihh9zTTz89La7LTyEgBJYBAd4xzNX+0pe+5GZnZ8NomiuuuMJ973vfC8PNN2zYEPbmXgZTlIQQEAITisCuXbvc2rVrw1Dya6+91j377LMT6onMrkNAhLsOFYUJASHQGgQeffTRMEyLHm4WLoJ06xACQkAIDAoBFjdat25dINtf/vKXQ+/2DTfcEBr66OlmHQkq0zqEgBAQAp0QoFeb9waNdQwvX1hY6BRV4ROIgAj3BGaaTBYCQqA5Aq+88oqDdFMhXrFiRehxai6tmEJACAiB7gg8+eSTYb42i6Z99atfdZdeeqm7+uqrw7xt3j/skMBOCTqEgBAQAp0QYBcDCPett94athJkPreO9iAgwt2evJQnQkAI1CDw3nvvhbnbzIuy4Vo10RQkBISAEFgUAgcPHnSsLAzJvvjii92//du/uS984Quh8kw4c7qff/75RemWkBAQAtOBwDvvvONovGMBxvvuu0+jYlqW7SLcLctQuSMEhEARgSNHjoRFjRhOzgJGnHUIASEgBAaJAL1RP/jBD8Jw0C9+8Yvu61//euipYlE1rRsxSKSlSwi0EwHWgmC9Bxro2NlAdZV25bMId7vyU94IASFQQuCtt94KW4HxMWOFclYs12rBJZD0UwgIgSUhwKJp3//+90Mv9ze/+U134YUXhh7uHTt2uJdeemlJuiUsBIRA+xGgc4Bh5Wxfyloz9HbraA8CItztyUt5IgSEQAcEbr/99kC6d+/eHXq7IeE6hIAQEAKDRIC5lwwhv/LKK8MCauzLTdiLL744yGSkSwhMHAInT550fH+ZWnHgwIHQ6E3DN2H8ZuFBu37jjTfc66+/7o4ePepefvlld+7cOffUU0+FbbKYvkF5OnHihGMbLZNlJAkENZaloQtZRpiwhgI60El4WZYtuJDlz/THsuiAEGMPsqSFzXv37g26sddkjx8/HtLl/hNPPBHSx28wiGW5x5/JMuXtoosuCu8M3h3f/va3QxrPPfecO3XqVBhibuniDz4j++abb2Z4YvMzzzwT7CJ9rk+fPl2RBWuTxV58RpaV0dF7+PDh8MfCbSz4aOmCEz6wRzjpIgumJoteZEkb/bEsOviNLHUw8pA9x5HFR2Sxl3wCS96lpIcu8pnfsSz5gSzYYhO283xgl8mSb8iyjo/Jkv/IIIsObEKWeG+//XZBFn101oAD95A9c+bMosqfCPeiYJOQEBACk4QALca0HNvL/9NPP50k82WrEBACE4AAQ0CZe3nJJZc4erm/853vhPmYZ8+enQDrZaIQGA4CEJm5ubmwhgrfYvasf/DBB8PQafad5h6LhW3atCmUHwgO5OvOO+8MI9IYJcIQ661btzp2G2EFb/SY7KpVq8J9yt7OnTuDLPF+8pOfOJMlTbYHJQ5/dbLEhWwSj7JssoyKY5g3aTJKLpZlCDj6TJZ4NPCbLDbcc8894Q+fV65cGfzFZtaVQfaRRx4J6XLvK1/5ijN/TBad9HjHsiwCG8tiG417li72EwYO1H1M9sYbbwz5gCzhNBgwZ/yWW24JsuQB9hMG/uiLZZmWh+z27duDLNeM7iEesiwQSRh5RV6wUC35S7rs2BDLgiUyJov95C14Q5Bj2dWrVwdZcKCRAix5JkwW+5EFM8i2yZI2f6Rrskz/Id9MFvuxBcwg7rEsdiOLDOmiA1sg7/0eItz9Iqb4QkAITBwCvIB5GfORoPX117/+9cT5IIOFgBAYbwSovLIXN3O56Rmh8kfPyZ///OfxNlzWCYEhIcDzD7mBpEKiIS8QUMggJBhyAxGDbEG06S21eBAgyBDb6lmYyULojAhC8iBP9NISj289pBEShiwkOk4XWeyBTBGPegE9tchC5AjDHmQp07EsJJRwSDH2QcSst51rbOGPOBA0bDGbkaVhgXu8G7hnve0QuW6yEGfSxG4IKYTYetuxH3uxG930fqMbjI104ytYgzkEnt0TIJeQbmTxBVl6lMuyEFb2BbcGD+upp6EAjPEFWXqwY1kaLiCnLCaJ78i/+uqrIV3yK5alUaYsy3NBT781ntBTj80QeZ4LcCDdsiz+0TBw1VVXhcYTcKGHGlmeMWTBAVne05Btw8pkGaXENTZCrumsYds2GgjAimcCX/o5RLj7QUtxhYAQmEgE+Jjx0uYFzcv1l7/85UT6IaOFgBAYbwSopFEZtoo77x4dQmAaEWBoL72QEONrrrkmEB6ICt9iCI8RWQg5pI2ywjcagkr5gQRBJiE6EDQIGcSNOCZri4uZLOUP4hvLQtCQtTqAyVqPLGmgM5ZFH+nGskaSsQ/SBlGFsCILuUSGdE0Wcke61mPONbKQOP6QBQfs6iSLTRC8WBa7IbvIggey6MVvbKZ32OJDNu0ae8ErlsX3sqzhQwOAyXJNjzz5QLqQ57IsaSMLBibLNTbQI48scsibLPmMHJ0iyPLuxE7SRRbfGWpPPpgsuGFzL1nyC9JOPiBLPpks9UDShUiTLn/kiaVLXBoLTBZd4Ea62MUzS/x+DhHuftBSXCEgBCYSAV6UfLj4CPCi/+STTybSDxktBOoQOO+885z+hIGegcU/A3XlSmFLQ4A5svSYQqL4g1TR82jkChJFDyPzd+mFpjccUgZxZC6vEUd+QzIhQ3y/IUfI0qPKXFxkiU8YRAo9yBLPZLmGbGEHJAq7mL9rshYfWSOOJgvBog7BGVl6kJl7jCwj5vCHe8iabyYLQcMuzqRBr7f14iNLryv3wMDIn8lSZyE9zsiSnvXiM6+Z35D5siyNAZB4ZLjPmd57mzOPLHZA1pHFBsMKWcLBAB2cuW8jAJgTDXYQWLBHL5hiM7KEg4Hp4JoRAMRDljyDzFq+xbKEg4HpIG0bAcC8bp4VCHidLISYNCDzpInPsSxpU/9D1obRm83oBEtLn/yy0QOkST7RCMDzAm7ggR/I9XOIcPeDluIKASEwkQjwguTjwUuTj82f/vSnifRDRguBOgREtBZPtISdsOMZ0DF4BCBAEGUIJWQMUqRDCEw6AhB1Gn9ohOnn0FumH7QUVwgIgYlEwFqIaf3mw69VyicyG2V0BwREGkUa9Qws7RnoULQUvAQE6D2FnND7y5neQR1CYNIR4Hnmj574fg4R7n7QUlwhIAQmEgFaI/mjpZ0/hjjpEAJtQUBka2lkS/gJv7a8C8bJD4b2MneXYeB8f5n3qkMITDoCPMsQboap93OIcPeDluIKASEwkQgwP4m5TPR086Jkbo8OIdAWBEQYRRj1DCztGWjLu2Cc/GAON3OyWQ2a+bj0cusQApOOAHPBqUuy4nw/hwh3P2gprhAQAhOJAAt48McCHcy70b64E5mNMroDAnVkq0NUBQuBqUdA5WV5HoEzZ86EFbTZkopFrFhVetDH/OyMXzBy1s0PWrH0CYEOCNBwxOrnTE/s5xDh7gctxRUCQmAiEbCtIGz7DVredQiBtiAgAtGWnJQfy4GAystyoOzC6s5s6cToMhq7GWnW7ZjtttvCzIybnZt3CyUFItwlQPRz6AgwRYL9wSHd/Rwi3P2gpbhCQAhMJAIMZ2MvyOuuuy7srcgWFzqEQFsQEIFoS07Kj+VAQOVlOVB27tSpU2EoOfsVM5WLrZ16HvOzbsYT75m5iFovLLiEWPtpAzNzFdLdU6ciCIEBIsA6QHTeiHAPEFSpEgJCoB0IQLjXr1/vGNrG+dVXX22HY/JCCHgERCD0GAiB5giovDTHaikxGVLOyuTse8woM/Yz7nkszFUJdyo0P8s8/RkXc/Ge+hRBCAwYATpv2OKu323u1MM94IyQOiEgBMYPAeaOsdAFe4JCut9+++3xM1IWCYFFIiACsUjgJDaVCKi8LE+2v/LKK2EYOYSb7+/GjRt7J9yTcJ/nZrMJ2wtuIfSIp3O4057wmTCne8HNhfnd9IqX5ngvzLvZmWiRvfh+QUcazw9np9c9e26yXnafRqanlEZvTxVjQhFgPQI6bfpdBFCEe0IzXGYLASHQHAFa2Zl3w1Ag5pQdPXq0ubBiCoExRyCrCEaVwjE3WeYJgZEhoPKyPNDzzWU15wVPYjk3msrVgXBDrEO+ZWTX+2BhRrAz8hvN9071nZexdE+ieU/632HQeuF+TKC9jvmE0IdF2TxJD+Q6Tj/AiD5PtqMR8MuDrlIZFQJMkdi1a1ezKRKRkSLcERi6FAJCoJ0IsG/iQw895A4dOuS2bt3qjhw50k5H5dVUIiACMZXZLqcXiYDKyyKB61OMIeQrV64Mo8p27tzp9u3b11uDEeCo8dDya8ZIcqQlGWae9y6XfztPqwNRLhHufI54ej8i0lUdaYIpwc9U+eCFOd/7rTHuUY60//KOO+5wPM905PRziHD3g5biCgEhMJEIsCUYK6Q+/vjjYV/Q3/zmNxPph4wWAnUIWIU0PtfFU5gQEAJa82C5ngEWSVu9enUYWcaCpXv27OmddG0Pt180bS5ZTI3h4TG/LZPj8u8q4c5NWAhDy9lWjGHn+WJsVR0mUybn/NacckNnWs5sLUsv99zcXF8ui3D3BZciCwEhMIkI7N+/P/Rw86Lk+r333ptEN2SzEKhFICbadl0bsfWB6ZxOP7R02XqdPEGYnfWV9cLcz85A972NUUO9nVPUnTICVkbiczmOfi8dAXoAWTPlkksuCVuDnTx5srfSWsKditkQ8qiLuUyOy79rCbfN4Wbuds1Q8aqOyOxgQ0qysTUi6lEsXbYYgQceeMDRy01dsp9DhLsftBRXCAiBiUSA4T9s48CqkvR0v/HGGxPph4wWAnUIxMTBruviDSssXzjIFhaKen2skhwPEY0qzIO0ieGd5n9zwp32ni2CpIcFm0KlPe35Cj7mw1vrfOuPcDfXW5eWwuoRsGckPtfHVOhSENi9e7e74YYbQm8g+3CzeGnPoxvhdun86zBnO9FUJsfl31XCnehgeHpypGUsIs5VHbHV+Rxw4jV/z8Q6dD3JCFCfvP7665tNkYgcFeGOwNClEBAC7USAFkmINiul3nrrre7s2bPtdFReTSUCMXGw62UHwhPrsH9uVpGNLfCV2rClT3E4aBxjYNddK+zlVKhs5ysQ91V5piEhXt3Yq+5eUS+n3fz3sPQ2t6BdMa2MxOd2eTge3rzzzjvuySefdJBtm9LV07Ju5dca77qQ42pZSQm1vZeCjqhB0OZ4d9FZtjlv2OveuFaW0+92IEDP9oEDB8J0iX48EuHuBy3FFQJCYKIQuPnmm0MrJC2StK6vW7cuzCP76KOPAvFmewcdQmDSEYiJg10vu0/dKsremGpFeEgW9rCjNtW+ZZJeLqvDm85h+TgsvWb3tJ2tjMTnacNgOfz9+c9/HrYCY3cQtuTcvHlz72St4S6eqO2lFuaT/bnJs7zcpWQ66/Eu/ya5tEfaCHVK2q1xLdlWLJ3D7YeXz/spHMmInW5kOu/l7u2QYrQNAbYDYyFe6pX9HCLc/aCluEJACIw9AjfddFMg1xBsPvAPP/xwmG/DgmmPPfZYWOiCe6xazkvzrrvucsicOXNm7H2TgUKgDoGYONh1XbyhhvUgrZ1I44IthhQWLmJOZWSlzbW04eilHuUQM44ThncnFXOrUEfaOl/2sL0sGHq4rAIf3cx99JX22j2AS/sGp7IxBjPMB490ctlbbyIQ6wm976aoMA/ckwW2T6qxv5Rsa39aGYnPrXV2hI49//zz4Tt77733hj2Le815Ddt1WVmvnP1IlFC+c4fynmb/PPtyU5zaAmFOibHpSp/5ZFoHZSB53yTlK9lKrKgj7gnP0+UKmZz4F+/pV7sRYMQkzzRbzPZziHD3g5biCgEhMPYIsN+nkWkINXuBskIq17wkGVJ+8cUXBxLOb8Ih5TqEwKQiEBMHu152X3qQ1pw05pZRYc62+oE4h4qx9SzlvUiBN6b68/10vZ5ymhH5Hh7hTnvAamrbccU9tjmzxYbEZj1yuMC8c6vY+/nkYei9JwNgkabRU2+AohOW1mOHztLewnlWTNWVlZH4PFUALJOzNHAzqozvMUPK169fv0wpDzsZGq2qDWPDTlX6xwMBtpal7vjss8/2ZZAId19wKbIQEAKTgACkm95ttgNjNUm2cGBYGy/JK664IizkwkuT+7fffrujJV6HEJhUBGLiYNfL7osRYutNqj0bmcY6CHX828in9RwlhDsjq53mWpaJb2nIaCMcysS9m1Aat5xs8Cidp27LMXmPkl63KHKx4aF63xoRIpGoh9sMK8v1wjLuJTcd03u2MhKfpxeN4Xl+7ty5sA0nC0xBvhmK24YjNBSWhry3wS/50AyBLVu2OOqYdOT0c4hw94OW4goBITARCNCaDsFmsRY+9D/60Y8CASfsu9/9rlu1alV4YTLHjGFubOmjQwhMKgIxcbDrZfelB2ktEk1vXdbbm/bmRgQ9J9mJF7X75XYivmU7atKJyWxIoSzTDbxUX0VHcAlf4kaEMjEuE9/0ftxbVmNLBbsyka/x0Z4Dw7Kqo5uT7b5n2MTndns8Gu9YnJQRZnxvWS9lkgl3Yfh6oYyPBlulqUZydgAAIABJREFUOjoEmJLINERGb/RziHD3g5biCgEhMBEI8HFnng2917SuX3DBBWFIG4R7bm4uVABWr17t1qxZ444fPz4RPslIIdAJgZg42HWnuEMLryGKcVoVwhdIYkxO49jptQ0RD3Mt55PeYiOnnYhv2Y4aMlohy2WZGlOyoE7p+ggVH8vEuC6O18fq7rPp5HWr2Mc29tQbbOqOZVVH5tHUXVgZic9TB8IyOHzo0KFATFgnxVYqX4Zkh5NEWk5t3vdwEpHWSUCARiQ6cdjyrp9DhLsftBRXCAiBiUDg8OHDoUUdUn311Ve773znO4Fcc/7bv/3b0Mt9zTXXhPncItwTkaUysgsCMXGw6y7Rh3OrB2mtEL4uxDUxMB1SnjHPUm9wKm89uJlTPezI4sUX/ch0sbviYxPC7e1gEacZFjILvfzJPOvYvJ56u9hkeqo67M70na2MxOfpQ2H4Hp86dSp8h9kthMbugwcPDj9RpSAEhozAxo0b3bZt29yKFSv6SkmEuy+4FFkICIFJQWDHjh2hdZ0X43/913+5K6+80n3jG99wX/va19zll18e7jHcXIcQmHQEYuJg18vuUw/SWiF8afywYFi8NLkPn2V+ZCCRtpgY3pQIt61AbD3e5nAPOyxa4dyPTJe4FR/N5qzRoNoL3mQ+aE+9qU0dsfTOVnUUEJiqH1ZG4vNUAbBMzrLzxxNPPOH27t3rHnnkkb4XmVomM5WMEOgLARqPGD1JQ1I/hwh3P2gprhAQAhODAPOzWYGcIeWzs7PuC1/4gvv3f/9396//+q/usssuC8PKT58+PTH+yFAh0AmBmDjYdae4Qwv3BJmh0aw6Xj08WU4XFIvXGrLh02Zzck5Jdtpraz3Y1f1y80XWspXOIbj0Ftt88Jottqq2+ZAuJLoaPyX+FT/TcD+/M/cx6aXPt+DK4yQo2W/r3Y7OWUOCxemmN8eiFksj/pp7GrKziFGCeTWfFbJUBE6ePBmmcu3Zs8fddtttLVqlfKnISH6SEWCNIOqOTJXo5xDh7gctxRUCQmBiEDh69Gh4IXJmrs3f/d3fhd5thpUzj5sVy3UIgTYgMGoCUdy7FgIT9UynxLlgY0RWy3tH52Q1GWod5Cr75eaLHBbl/VY9gTwne+rmsTrnctLzGxHdBqQ0NBRkhBjdRopND/OpU7Jt5N/Hnw9bgKVxUgyyhgSLF51n5tJ561lYvV7zs4iFEfSybVHedIal1XcKz2KKbasdHpFzbAdGb+Drr78eFik9ceLEiCxRskJgcAiwvd2uXbscDUkfffRRY8Ui3I2hUkQhIAQmCYEXX3wxbAfGyqjf//733Ze+9CXHnO4LL7zQXXrppY77OoRAGxAQgVjuXEzIdNRusGgDIMlxI4MpCg0Hg0jAFOqcIaDykkEx1ItnnnnGrVy5Mowmm5+fd/v27RtqehOt3O+UEtZyaNDgN9F+tsB4tgTjeWa6xPvvv9/YIxHuxlApohAQApOGACuVM3fs85//vPv7v/97961vfSvM3+Zl+dlnn02aO7JXCNQiIAJRC8twA0PPffeVwXsagI5OpNqv0O5fUzqGgIDKyxBArVH59NNPh0ZuRpNBvHfv3l0Ta3qD5v1Ut+rUEgubXlzG3XO2BWP+9tq1a90nn3zS2FwR7sZQKaIQEAKThgDbkjDfBrL9uc99zv3zP/9z2M5BLe2TlpOytxsCIhDd0BnePYaDF4bP95lUMoc9WZXchoUHFZ5sz/nh5DqGg4DKy3BwLWvlO3vjjTe6iy++OEzvYtVyHSkCYepLkVxrYcPxfzqOHTsW1ga644473MMPP+z+8pe/NDZahLsxVIooBITApCHAwmnM2f7yl7/s/uqv/sr99V//dejlZiiQDiHQFgREIEaYk+wV3nRxthozwxzubEswP797protWI2YgpaAgMrLEsDrQ5Tv73XXXRemdrEPNz2DOkDA1lUQ4Z6054GF0niuWYyXERsffPBBYxdEuBtDpYhCQAhMGgK8HBk+fv7557v/9//+n/viF78YVijX/O1Jy0nZ2w0BEYhu6OieECgioPJSxGNYv95991134MABB9lmxxAWmmp00IjlG54sn2ZYcNCGgBTmOhOPRiq/WKIprsh6UpvdtEipnF8wb4bGstBoFo8o6XWfXQGSXRmCjemijkF7wT5PrP2uCVmcJIKrLjKZEO+8h7tOzgsXdC/Gdz9PPNjNwonJnPEMYz+1JYHJ680WaYyxtUYCFn0sNhQYqtNwpmebZ5o95Rm9cfz48cZui3A3hkoRhYAQmEQEHn30UXfBBRe4a6+9NqxUvm7dOkdFQIcQaAsCVmmKz23xTX4IgUEjEJcTux50GqPWZ35xHtVBT+CGDRvCSuUbN24MW4P1tCXdZWDOWHK6ZV9CqmPSl07FKKylkJDF2UzWVvkvrswPsZ3NViqEeHoSGa2l0Os+U0GyrQgh64GgQkJL9vlpIYHEmg+lNMrENSHc0Q4LqVyyNWJJt/cxmdJi5Le374l+CDP2540Y2faMZp/3KTQKxA0ZIeNIw6dXacDomautiUA9koV4aUBiuuKrr77a2LfRlcTGJiqiEBACQmDxCNxyyy3ZYmm0SvLhZ6swHUKgLQjElWu7botv8kMIDBoBKyPxedBpjFJf7Ff5ejntOnLkiNu+fXvYghOS8uSTT/ZIPiGVCcHMo7J6d0xOE+JoRDOOVyTO4U6F7BoxzeX8BoR+Woj1cDe5X0zbCKupqNqXkmWL4JOuxqkLayaHJ0FfpD94V/GdnnmwLDZAZPJxz3VoyPANEwaLjxQaGrKGipDC1P1Hhw1TI1gIkLrlgh8p0PQQ4W6KlOJNDQLlD5R+0yKqP2EwPc/ApL3s6p7NSfNB9gqB5UKg7eWlzr+6sGHjzegyCApkm95A9i/ueqQEMSZ5dfHryGogzb6eUibryBfj5z3FcS9vnk6P+ykRrcPT0i6mh+ZmxHmxcs1970y4y40Gmc1ZLzc+VIl6jtt0XB0+fDiM1IBwM4Lj448/buy4CHdjqBRxWhCoe5EqbHrIlvJaeT1p77q6Z3bSfGibvQvzc8n80tBY2WMhtMLczLYhMX7+tL281PnXLWxYOXTu3Dm3Y8eOsMDUY489Foh317SWQrhTWSO9cToJmYx7pT15tLnVlM94DnYQ7HK/MIQ9TiW/XixxXqyc73p2Mx0aG8q+J79riHNNj7Zvqch7w0kjI9+5r9N2xR7c27Ztc5w3bdrkXn755cYQiHA3hkoRpwWBbh8m3RMZ0zPQ/mdg0t51dc/kpPkwSnvz/XAHZIVVypMJnEnlvmNlNe39CsQ8JgUDskVqKghMQ3mp87FJWAWsJQScPXs2bJ10ww03uH4Idzyfui75KjElVjIUvE62TDoznYWFw2rKXt39OmKaKUwuqvalZTzquq/GKffEo6uZXD++dyfcZSKeY4q9dY0ZJddb/5Ot7h544AF30003hUXTNIe79VkuB4eJQJOPkuK0n3Qpj6c3j4f5fhmG7rpndRjptFJn6B2qqWwvwdlQme5IsOsV11XA62MqdKkITFN5qfO1adhScT506JBbvXp16A1kSDmrlXc/8sanGVtwzAQ80TW+2qmsdAvPyaJPo7yNn9c9k81r7nE/7U0O86Dj1cN8uC3EVrWjGXFerBwQVWUT4AjPfe88pDzI17yzEoJOXWCw70jL1kk779mzJ4zUuOqqqwLhZhRH00M93E2RUrypQaDpx0jxppeQKe/bnfeT9rKrex4nzYfR2GsV/EFWJlOdNZXXbj52qjB3k9G9xSEwreWlzu+mYYtB+tSpU4553CxUes8994StlHrqSXuQq3ZZGe1SZo0M+7JnXLi4kjepJ/LZKuOEhDSL+jvfN9Ja/gZa73CdfWlPcfROiMv7/BzbmuVy+bpkZbk8TrSWWQJpI98j2ysYMe0lUVX8P+/lLoZP569f/epXjhEbbDm7cuVKxyiOpocId1OkFG9qEKi+6FVMpibz5ejUIdCG8j4ePviKGXviMpewdm9b/2hV9sjNK8bZg1eJ4yvC8UKwhfnOaZpRRbbj/rhZAnZhlde44myV7jpbS3aYmvhcSxZSncGvKC3mjUaycQWc4LxnyctENeHm/kXKdVlAYDzKS8GkZf9Rh0GTsH4MPXPmjGMI7t69e8Nc7ueff76ReHH9A/8+yeZYl8uskdxIbamcVRdG8zroPadHOn1fFedw97qfpFUuhwlJLttHGU8Ja5gy4suyvauMIIee9SZyvoff7A26FuO7vVe8rF9jgnnfIc89vjnJj7BML3k3Ra+gaoQpCjl27FiYJnHbbbeFhiR6vJseYhJNkVK8qUGg7qMzNc7LUSEwZQi0obyPgw+hUpbV2qp72yYL+1DRS9mzVTitAhqeu6Ry2nkf3bhiWt2HF5Ka9UxR8Q4VyiKxLT/eZaKb3O9lR1lL/Du1scYviHMyrTut7Ea12IodEILSsNrF+BdbpusEgXEoL+OUF3V4NAnr5QM93AwlZzXnW2+91a1du7aXiO4PGYGkIa+GrHdM178LC++yjhGn4sYLL7zg7rzzzrAdGL3cWqV8KrJdTg4LgboPzbDSkl4hIARGi0AbyvvofTCCGuelD8sIZUJC47mExKzdXzeTSXUZMY/CK+Q0RMWGIrm2XuJINFWan+p0hbCyUI0duZb4qjPhzv2vxontoPfM5oPmmhfnXy6vK0Ng9OXFLBmvcx0uTcPqPHnooYfCfsVvvfVWGIJ74sSJumgKW0YE+iXcoZEva0hdRkPHNKnjx4+7DRs2uF27doWFAD/66KPGlqqHuzFUijgtCNR9YKbFd/kpBKYNgUkt73V2x2HLm48pgfQ9ytUhnN6SlKyWOWzRxoS056Q0vxuTUULLv0PM2uHcyZDJOp2mvaqruR2mo3iukun4/kI8ZD7qOTI75nwvfTyEPJNdpH+ZvC4yBOJyout0WLENL17iOQPZXzzzzDNuxYoVYc4rq5QzvFzHaBFIGjkZIh7P0ynaZA2VSdkoNmIWY07fLxb+Y5Vy1iZgqgTTJpoeItxNkVK8qUGg7gM8Nc7LUSEwZQhMWnmvs7cubPmz0RPNTnvbNiHcaZw6cpxUAPOKn5HTeA50smdsHqep/xVdfdhRn0YHwm1zS8N81Hk3x3zMGsI96+dLhhWQy/XhwsJO9SkrtBkCdeVFYYMl3uD59NNPh1XKISkQb4aW6xgVAnmjqD3rde/aYJ1/14T53dnc+VHZPH7pnjx50t1///3u5ptvdps3b3Zvv/12YyNFuBtDpYjTgoC9jOLztPguP4XAtCEQl3O7HlcMzL4m55H5ULd3bUpia3tuM0OTnuW6OM0Jd/+L+1QIty1yVNMdX7YjM71wUUe4017zTGc1TrAjEHCrGJcaD9Ie7kxFIU396AeBJuVHcQZDwG+88UZ30UUXhSHlp0+f7iebFFcIjB0CTzzxRFiX4I477gjb3f3+979vbKMId2OoFHFaEKj70E6L7/JTCEwbApNQ3uts7BW2vPnoSWKvvW1tBfPSQmD0TBuJrJLfxAvC496Y2nhG6ln1Nx4u6cOr86FzdOp01YUhUbYj1xJfVcl00vseL1RUjRPSzHq808aH7LfXv0j/Yst0nSDQq+zo/mDINjjSs01voA3F1TMoBCYZgbvvvtvt3r3bXX/99WEetwj3JOembB85AnUf25EbJQOEgBAYCgLjXN7rbGsaNhSwOipNCGS2QriPV9zb1gekPbRV+6OeXCOVnmgaZ67oifarLQwpJ03mP1fmoMZEt+pATK6T/XCDonRIZTc7qrpCSLw6ug0LT323RgN8SoZs+v13ffx5G24eL/qWxjEZdC/Gvw5WTnVw9RkZHMGU7iKWTz31VCDbDMPVkPKpLnatcJ6VyVmL4ODBg27NmjXu8OHDjf0akx5uv4WIX5VzJv7YNHZhqRH9dvN82Hzre/xh66a1uEdgsjVJx/iFPUM7xtKNMUKg7oM5RubJFCEgBAaIwDiW9zqb+g0bIEQNVHnC3XVv20RF8dsZ768bJZGRz6TiXlyELe0Zzkh1lUzX748b6S9fGskP++FGN7vaEcWLL1NiXcirtPveFiuyPX8Tou/rD3O+Bz7zB58Tn4rkOm+U6Nu/2D5dBwQK+ZNiL2g6I1CHV5MwVnJev369u+eee8KexWwNpkMITDICq1atCnO4WTiN7cFeeeWVxu6MB+HOPlL5R6WxB0uMGH/UGhHuYKu3M7Rc+48/i8TEw74K9sSVg+X3rWCKfjRGoO5D0lhYEYWAEJgoBMapvNfZstiwicoEGSsElhGBujK1jMlPRFJ1GDUNMwePHDniHn744bA1GFuEHThwwG7pLAQmEgFGavzsZz8LzzTzuJ999tnGfowH4fbmxsO6Gls/qIhpC3cTwl2cZ9XMgJH61sxExYoQqPuoRLd1KQSEQIsQGJfyXmdHkzCyoi5ei7JIrgiBgSKg8tIZzjpsmoTVaZyfn3fr1q1zDz74YBhWTm+3DiEwyQjs3LnTbdq0KWtE+vDDDxu7I8INVI0Jd9pj3bFHux53Ee56XMY1tO7jMq62yi4hIASWhsCoy3td+v2E4X1d/KWhImkh0F4EVF6KeVuHR5Owopbqr3PnzrkdO3aEBabYh5ueQR1CYJIR2L59eyDbLJ7G37Fjxxq70x/hLsxH9qtolvaRLM8tskVPgjWl+VBhHlNkZiNS2k1HwbZ0qDdzc9hHLkqnYkvYZ24uLGDStYc7G/YeLwiR6u5ml0+w7Fs8jD3eAqUrfmUf9HtoCNR9aIaWmBQLASEwUgRGVd7r0l1MGODVyY0UVCUuBMYYAZWX+ndGHS51YU2z9he/+IV75JFHRLibAqZ4Y48AozYYVr527drwXL/wwguNbe6LcM+l23qwqMesZ9Px6qGQyGyFUghoWIjCyG762y8ekkx9TghuTDbLpLTqQTcd8VxpFiHpnE6lNzsiy10JdzCoroe7m12JFxXffI96ZmPqaHf8qmgoZHgILOUDMzyrpFkICIFhILDc5b0uvcWGGR518nZPZyEgBIoITHN5qfO9SVgRwWa/nn76ab+Y4lzoCbzvvvtCz2AzScUSAuOJwNGjRwPhvvLKK8OzffLkycaG9kW40VohjyEpSKeR6yRt68VNFuhMSGlOaKvEtV5voiv5fzE60nRsk0+vKKQT/Q66097r3L443fi6arfXGBoXctlqnNg3erGre4L2wi+2QdfDRqDu4zPsNKVfCAiB0SCwnOW9Lq2lhBlidTrsns5CQAgUEZi28lLnb5OwImr9/4KMPProo27Dhg1hpXK2Ulr0QUfVrN9Gb9EKllNwFDsvee4x63nYZAC0nJkx0LROnz7trr322tCIxF7cr732WmP9gyHctcOt0y095oq5z56TszPpXpnRXOiYlPayvrmOEuFO52qX+Xal17ujAVUyHUftZdcce4RWEvca+sAvTk/Xw0Gg7kM0nJSkVQgIgVEjsBzlvS6NQYQZdnW67J7OQkAIFBGYpvJS52u3sCJSS/t15syZsGfx3r17w1zufobfxiknW/dCJpMOro72e25RHj0a6/ELNiVbEGejdZl2mozYDZ1noX7eI410G7m8k62YQviV1emLHZE1MQcbBMfJ/BmsamlLEGBf+ccff9zdcsstYUFAnu2mxwAJd48Hy4ZuhznT8y4MT++XcPeto0S400JQ4bwpEe9agAKiHQh3Q7tmZ2mEqO4bmhDuHvg1zVHFWzICdS/zJSuVAiEgBMYSgWGW9zrddWEAUxfeLSwGsy5efF/XQkAI5AhMU3mp87UuLEdncFevvvqqYyg5+3GzB/eaNWv6V069vbwWkw+b8cS3UGdP13EKvkXcIkswreeja67QDQwJTzsBY3JQl0aqjJGqtZ1nWWLpaNrSyN/o9hAvkwaD2JUhJjZ1qk+dOuW2bNkSerZZNI0e76bHAAn3eX5ed6dkkweAOd7JUSWuvXu4F6OjnnAXCikGLYlwN7QrvABSe8qFsFNDQIqWTsuLwHJ9jJbXK6UmBIRAHQLDKu91esthZk85PP5NnPi3XZtsk/tx3GFdz89SaZ30hmP/jdawzGE9ImOj18pQfB4b4wZsSOxj+XrASVXUsSr5T3/6U0dP97Zt29xLL71UidM9oAN57FJnT7hEqWMrI9tdhqQHYh/d75JG3hve2frenKaz7JLvBE4x6e/iJaMwFAU802wLRiMSK/D/6le/apzOYAi3Pcz03sYtRz48zFcOmR8XgEUQ7kXpKBHudL71eeXWr64FK8ayanfSO93AtyzN5AVSsKEXfrEJuh46AuWPEr91CAEh0E4EhlXe6/TGYTGacXh8TZz4d3zdSz6+vxzX7SDcHim+xxqWuRyPzMjSiMuRXY/MmGVI2HzkvJzHM88841asWBFWc2YY7v79+/tKPqwFldWdI9EudfaE6BY7AOvCIm3pJY1tDQi3T9uvy9zzqCXcYTRs2ptOD30Y8VtW5TlCOuR9BnuQyToridvrPnESrlLpXOSWjiUh8MQTTzi2BmObO4aT05jU9Oiz9KWEs6YV2xZJiwt2Nnw6kOV8+EeYj+EftkA6/cM074eCJCugd2mRWZSOKrk1O7MV1Xkwfcs8w1OC7XGBK6PIgx/ieTttanpPu6xwRL55mfJwGLOrFr+yHfo9VASKeZA8F0NNUMqFgBAYGQLDKu91egkrH73i1d1voqMcR7/7QSD51hfquf2IK+5YI9CkTI21AxNiHKuUr169OqzqzEJT9Ao2P1JeUFcIOxDuZOeklFtkCUX19iyswUWnNPzw8zqTyhqrhNveKSl58Hwi4T1xh10yFD1fWNkPd2cqapQgv7vdNzuCXF1jhUXQeVEIsA4Bozbo5WZIOdMmmh7Vr38XyXxbMEhI8SFBrLyPdLxeWtL6TUFIyGryMLLAgd9ezOZPQGajB6tsSmcd9uBiF3+QWytkaVj04BXtpAWJbcp6LLaQEuvCizq1tbNdvoc/2GN2JZgV/I0aL4p2+XkmRurLQOj3UBEo5HGaf0NNUMqFgBAYGQLDLO+x7joH4/vxtcWNw+Jru2/n+J5d2z2dF4lA+OZHDeWLVCOx8UPAykh8Hj8rJ9+iffv2ha2TLrzwQnfXXXf5unYfldqU8NZSgvRenH92nXempfhZ3IgDNELW5Ap1+KQuX2tTSWnCcfL3R/hdFrQ0snAj5bEyH9b4fi6X8IwqT8tj6GoxCDz88MNhXYKtW7e622+/3b3zzjuN1fRFuBtrVUQhMMEI2Is7Pk+wOzJdCAiBLgjE5dyuu0Qf2C1Lq3yOEyjf43fd0TRenexgwnzDeRi5lVYw0wWMZkKDcjKKLNhoix/5imZh2GRsBCPJCqsI55VWixY3Todhl3YjOsdxrKE/v52nUT9sk5hJD5uGZeaoteVq9OWlLUh294Nht/Rs33zzzaFX8IEHHuguEN9NO7kyrhnfS4lqsWzaVlyeFLMwmnF76yxbJOEupkHH4mJ6uBMiXdaFS0Vinvbq+/c876VsJG3me6/7WUQUhw7IWvyiaLrsD4F7773X7d69O0yTYMu7Dz/8sLGC+q93Y3FFFALtQ0Af4/blqTwSAp0QGEV5r0vTwmI7LSw+x/ftOr5v13ZvWc5WqTWCnRHmaOSYVZL9omS21osNAc0rhUnFlJFuob5c6QFKKrz5CLt0yKX1QqWKqBRnPV3xVLAUDCq5Gpa5LE/GWCZiZSQ+j6WhE27U+++/7xhWzhBcyDZEpfHRjTDauyRj1ZFWexfZS8XeIdFo0ih258tOafjwvudwd9LlU096ouNGxaiBkvdaZZ53r/upS93w6+y17vRAgGd5z549ju3B1q1b544cOdJDIr8twp1joSshEBCIP8J2LWiEgBBoJwJWxuPzMD2N0ylfx+mW79nvOI5d2734bPeW61zsqSn33GBF2jtjFeEQxHSufH0XLxWmYeU9QalM1jvVWUeuFh1xBdYqtbaQUpJGHh9DfFgxgMC0MqxhmQGMFv0XlxO7bpF7Y+MKC6VBSu655x63YcOGsHdxY+O6EcYuBNbeIfmOCek7w79naop4Z3O6ptFZzO4U34fJO6duymyVcKca4m3OSu+zEKPX/W74mZE6940AW9tZA9LmzZvds88+21iHCHdjqBRxWhCwD3B8nhbf5acQmDYE4nJu18PCwPTXnctpNoljMv3ENZlBn4sVzMUS7tyqsDqvXy08+FYm3NlvH79cMbYeLuv1js4Jkc8r4PXDNnMbNCwzwqJFl+NQXloEZ0dXWGDqkUcecQzDfeihh0KvYMfI5Rvlch3f73bPyn/8jqgLi/WFa0bL+GHcFt4tDeL4+/koGRPKz73fh0lc4hUaGMsLN3vbWWMq6cz3766u9/P0EyJvcnm4rpaGAKM0eJZ5pmlIEuFeGp6SnnIE9DGe8gdA7k8VAstV3uvSsbA6wO1efK6LR1gcx647xR1WeO8KZufe6bzC6a2zOdxhKGW6IGqp8kyv+Gw6wTGpWEa9V6FyXezhrvpMxTXfnqc6bDOVSCvqffWMVRNTyJghYGUkPo+Zia0wZ35+PvRwP/jgg6FXcP369X34VfO+MOlAQmOimtxYmE9GzJCv5TKb746UTGmxKd5IJo170bxvAjukEeKHdLq9Y1Lb457plMCzO5PNzU6m1MR6ErlsOgy2Fd5nve5jXXKE93H83rQbOi8JARb/4zmGcHN9+vTpxvrUw90YKkWcFgTij7BdT4vv8lMITBsCVsbj86AxiHWXr+vSKsex33VxCbP78blT3GGFD4ZwJ0MvqXAmR1pxLVUc2RlkJp4nbjVYhPohyRqWmeI8Xae4nNj1dCGwPN4eP348LJjGftzMe73lllv6Sjg0phXKfjo0Oxq1YvmXnHkveAIbs+k4RbbiircBRo8fRTPrJ2XnIr3SSFYqrxsebklZI2CwKXuX+bvWmJjaXx1h49932ELvub3fCv70up9ZELYMbXgsAAAgAElEQVQcKzRk2i2dl4QA0yRYj4DebVYsP3XqVGN9ItyNoVLEaUGg+AJPXq7T4nsjPwsrEDeSGHKkdIVk/4Hq/oGxVUzjFuUhmzZi9bT4Zx9utj7sWBMZsaEjTH7Y5b1Ov4V1ctvux+dOcQmP49l1t/jDuDcQwh3IcjwMskq4qcx2LefWk8QwzPh5z4aAep0aljmMR2BidFoZic8TY/wEGXru3Dm3Y8eOsKIzK5b/7Gc/69P6hPzGnLVPBdMZvdArPp0QDMtrhpPfd999bu3atW7lypXu4MGDjZMS4W4MlSJOCwLxR9iup8X3MC/JWlZ9K6y1wM77lYWTPqe0AhxaaC1stOjErcldK+Jpz1e+mMpo7R566vbRDU33kAw/hLbQWzB0CyYiASvj8XmQhsd64+tuacTx7HqQ8bvpWtw9ey/YO6H8G61pzxE9NpaIf0YZHp71FqVl1MpxPgx0Lgz7nPeNfXPR+8mwCefo2Y7fCXkcI/KJjs7DNs24dB56pDe/o6tJRiB/JtLeSv8M6hg8AqxQPjc35+6+++5AUhiG2/dh37G+BadVQI0Uw8x5hpDzHF9xxRVu9erV7rnnnmucXN9vGYZyTU2FtTGMitgmBKb2Y5z2DM1Ew6uSuU1USqJKss/scm/WyPM/sz0fGFZn09jZXWfkgMKCryILPdEcZnmv001Yt2NQMt3SGPS9AsH1vcdFUsy7ozRMk+cy64lOSU/ajZXUMXxYOpQyKbMM+0zKdkbCQ6NfTpjAzYg6/pX34c53EPKEu+uwTUMnJea5oN3QecIRqCtjE+7SWJp/8uRJxzxuViiHdB84cGBRdibzmK3BbFEqpkMoDFnXSLZhZvbhw4fd1VdfHZ7nVatWuWPHjjVOrvuXv0aNCHcNKApqFQLT+jHuTNCoLItwT9ZDnvYEinD3zLZhlfc6vYT1OurkhiHTS+e43odI13HgQOAHOfZUPWvj+ggs2a7FlLElJzqFCs6cOeP279/v9u7d63bu3OmOHj26eBQgk+WpIIvX1kJJ/833IxHr3o0tdHZkLu3bty/sJ79p0ybHFmEaUj6yrFDCbUBgWj/GSU9SdXVP8jQfUp7kcBIXEs5L3rbuKZLy8gIhocfKHpDCPHD/IWWYaEQOy71T8VTMoCJefCT0hJX387WEiufc7jQ81kOPWTbctaZHLkk46r3L/e1ob1c/U7/pmaMiESoU2WDbouHxr2BzvsJyZZGYdFhu8TnObY1V6Xo485+L2Oe9sE3wrpPtJbcYmV46x/I+z3YnUu3Lhe9MG9CRlP9OSQ0oEakZEQJTU15GhK8ly/Bb5rvu2rXL3XrrrYGg2D2dhcAkIsAzvWXLFvf666+HoeVPPfVUYzd6N7c3VqWIQqAdCEztxzgiajZ3u1OOJsQ1Wt2zMqQ7Jay+xppMIU636wg12LT3FYKbLuQVb30RFkXK5Iz4RoSxnFZEmuMhpXW2Fwl3Nxu9tNcbhsZGDQGJTuS8Peno9c72dvcTW2yYrE8sGabfs4af2JwtfmY2Zvt0mtdp2hXb7b7OhsCgy3udPguzNHudLT7nJkcc366byE1anGToejJksjB5hHLgh4kP5AjvEw3LHAiWY6rEykh8HlNTJ9osFkmDcJ89e9Zt27bNnThxYqL9kfFCgOkRrLZPI9L27dvDs90UlWZf80xbuhqwDS8t9N7U9HT5irGtkBt6cDI9/iJ81PKW/7xnKY8U9xpV5NNocRyb85Vr8JXTdIGVvnqQcgW6mkIE4o+wXU8LDIXylPa8GrGMMSgSV+6kBC8jjAkxzAlwlQBWdaAnJbNcpofNDzXVQc5+WKS0sSBPz24Uz8U0e9tYt8VQINjZuK2G9to7MzMnSbvohg8rBmSx7aLWd5sLW5Ct4m06dC4iYGU8PhdjNP8V6yhfN9fSf8xyWvxu6xHmcMcLp7GtT91LalEAUI/RsMxFQTdBQtNUXkaZLcx3ZSXnG264IRAUhpfrEAKTjMALL7wQVt5ne7AnnnjCMW2i6dHfVznrAaO3Ka3QWS+VLbRkvU98tNKPYNJ7FQ9VTSqbDA2r9n4lpltLdlKvTXt/QlqepKcVy1DxzXSkOqOKLZXT/nuQmkKneG1FYOo/xvQW2TDxtMzl++ImuV4kroSl74MC6UviJguv2bBzP3Q6Ca5feC17x0SNcWYDL4P0/VJJxt47GRFOEymdqnZ3tzHzK+spxs9o8ZZe9nr19Wnm789eowlyF5J3XF2jQjWNVH9md65FV0UEBlXe6/RYWDHFwf+ydOLz4FORRiHQDgTicmLX7fBsvLxglXJWcr7//vvdihUrAukeLwtljRDoD4FDhw6FPbiZw/3ggw+6l19+ubGC/gi3V1uu2JV/ZxXUuEZcqQyXK47lymH6u0ZHHoSOaJipt63YE5akkccHEx9WDCBQhxAoIGAf4PhciDAtP9IRLIZDTPSalXtf3sLcbIZfV4dnV3V4YAOBLZbrAtwpwa0U48o7piCV/aikaSNtwjzwqo1BMKSZkmzSiUlsL3u9gkqamTX+PRc3bKSrMme3yxddfEzefTFu5XdqWZl+GwL2fMdnu9f0HMuWr5vqWEq8cpr81iEEhEA9Aiov9bgMOpQFptgW7MILL3R33XWXX6fEmtsHnZL0CYHlQYAtwWhA2rp1q9u4caN75ZVXGifc91e5XHks/25GuHP76nu/aiqL5cpmWvGue3EmxCDV4SsezXuQcrt0Nb0I1D1T04BGeWG0zOe07MWLmvUu90mDV94zXi3TVR0+xU6E2oxJ78fkP9wqvx8sfulcTLO3jYl4Eo+RNcgX0u5lr1dQTLNkED8LDRsxaS7Hze0o3xHhLiPS/PdSy3udvIU1t2JpMS29+Lw0jZIWAu1FIC4ndt1eb0fn2aOPPuquueYaR28gRIUeQR1CYJIReOCBB8JIjeuvvz6svP/ee+81dmd0hLtXz5KvyM54smxzs4q9196/UNHtVjkFA1/J76cHqTFsithmBOwDHJ/b7K/5BjGs9ByHmylZjm5WSWQpTiif0dBrG3Ie9Q5XdfjEjNyzCFg8L9OHJ9NDUtIZ6UlMXMQq5Q1sNGzs/VPej7y3vZ0IN++mfHh9SCe882LMLPX8XIuZv014oSGgBu9ci65iBOJybtfx/W7XFr/u3E1u0PdGnf6g/ZE+ITBMBFReholurhsywirOP/3pTx1EZffu3flNXQmBCUTAnmOea3q4+9nqbkSEu1nPEnt+z2SLo5QWRgmV5U4EoZSLjXuQSnL6OZUITOvHOCFzELd0bYWQ+379hDnmX8dEMCXXfkpHPmW6RITT8mkkMCx0xFxsiLJvbJv3ZTKsAF6aFkKSObmN53Hn6dt9es+TAWqQV/+uQD9/ZSKbPcWlNHvamAn6i169y7GtXJu9pTQzlUl47oP3O9jToxHRGiQ8jtYeUStHg2bAw+vTKL4M9bqLpZT3OlnClvuos2O5bVB6QmBSEFB5WZ6cYiXn9evXh95tVndmazAdQmCSEVi3bl3WgMRq5Syc1vTou2ZQ7mEp/w69ypDkqDfMeoGs8p30TluFFFPTSmnUa0WlOotf541VPDv2hHmd5Yq3r9DOZBXhOqUKEwLD2Zd3EnC1IeUL8/nuAlRMivs8G4E0gglBNHKXhqXlmAazULFJ5yYn7wrfcOYJfUK2TUf8LkiQKqyW7uVzYl93HxJPD3eiuxO/NKIebErfT51trGrB/vi1Fudpvb1lrGI//T0aNui5t0bFXnO4LUEbHRQItc8f/54rkOq0IaFQqexkuOmc4nMBpxTTJnDUyRE2iqPOllHYoTSFwCQgoPKyPLnEis4PP/xwINxsEXbw4MHlSVipCIEhIUDPNlMjmCJBb/dzzz3XOKU+awdWgbRemPJv0rWeLotDUDI8PCPhaYXQCHXn3i+rkEfnEimvvjitUpvY1ncPUmPoFLGtCFSfqT6LSVuBmWq//HstevdMNRQtc34x5b1OhrBRHXX2jMoWpSsExh0BlZflyaH5+fnQww0xYVg5vdw6hMAkI3DbbbdlaxLcfvvtjlXLmx591RCKPURzpV6qDj1dWU90Spob9ixlJDztcYhfkEbUcbK+ZyncWXwPUlP0FG/oCMT5zvVyHOU0lyvd5fBNaSwOgZ4jbhanVlJjgEC/5b0u/qjfEXU2jQG0MkEIjCUCKi/Lky3Hjh1zN998s3vmmWfcnj17HENwdQiBSUaAdQhoQLrnnnvCmgRvv/12Y3eWh8E0NiePCJEuDyPlbhg6quGROVAtvqr7KMZhw3I9TsOuh5WW9I4vAoUGxpq55uNruSzrBwEr4/G5k3wcp3zdSWY5wsu28FuHEBAC9QiovNTjMujQc+fOuR07djhWdH7sscccw8p1CIFJRmD79u1hODlzua+99lr385//vLE74/lVZsh5J1LNgkvzjf1TxAlGoO6j2C1sUK7WpTEo3dIzQQjYVJimc6snyDWZmiPQtLzXxbOwXNtorswOnaPpZzWj44SP8On0DIym5LY7VeZw33TTTe7OO+909913X18LTLUbGXk3qQi8+uqrYQ/uyy+/POwx/+STTzZ2ZSwJd9KzlKxKXli6yJNtFhrSMR0IdPowNglfCkJ1+peiT7JCQAiMLwJNyntdHAsbB8/MFp1FKPUMLO4ZGIdy3DYbICfM437ooYdCT3fb/JM/04cAPdqrVq0KQ8rn5uaGN4d7OaENc7ht9V5aqmdK24ItpzFKa2QIDKry0I8DdWn2I6+4QkAITA4Cvcp73X0LGxcvzR6dF0e2hJtwG5ey3CY7fvGLX4Rebea9btq0ye3bty/M5T558mQYXv7444+7n/zkJyEO24ex+jPzY/ljMSpWhGZhqpdeeinIPv300+GaYb0Q+bvuusux9RjDe++///7Qi849Vo5+wm/XxErSyO7fvz/sl/ziiy+6Rx55JPyRBsPd6YGn951F3Xbu3OnolWf4O/dOnDgRVlbH3ueffz6kybB4dCC/evXqkAbzebHj+PHjoXGB9Ji/fvjwYffGG2847MZXbCQedt94443u7rvvDn/g8sorrwQSx77OR44cCX/vvPNO8IP57/iCXvC44YYbgg7k0U3DxubNm92bb74Z0sTuDz74IPiBzLZt20I4OF133XVhxAGypPP666+Hhe1++9vfOnprF/yWrb/73e+CH+C/ZcsWB27IMYT6jjvuCDaTBr6B32effRbsbNOz28mXAwcOuEcffTQsAAjxBqOmx1j2cDc1XvGmC4FBVYp6oVaXTi8Z3RcCQmAyEehW3uvuWdg4eWs26SziqGdgcc/AOJXnNtkCmYQc7927N5xXrlwZCBsEF6ILEYfEQkYhpZBd7kEwIc/s3Q1BhQBD+iC3yHGfBdmQhfzS82iyyBPOIm3IsjUZ88gtTXRwz2RpEEAWvdiBPnRDSumdh1jZPcKwicYB/vALu+0+Z3wiHnroBUUnfxBfCDNypE2jgMkSF582btwYzti6Zs2arBGCYfmQamSxCSJtNhNGeqwCjxzXa9euzfyDJNOwQRpgCmk0WezALmu02Lp1a9BDGuhFDvlYFsKJP8QhPo0lXEPOwcZksRfdxCVdCD2NGvwmT9CLv+QtuCBPPNLlN36YLP5aQwdn7CKPsIU0iYss/rCSODjwhy08g6SHXtLHLuLQ+MFzQJ4hS1x0kSZ5wW/yiDN6SQudPM/oIx44Nj1EuJsipXhjhcAgKxVlx+p0l+PotxAQAu1AoFN5rwu3sHHz3OzSeXFkS7gJt3Er022xh15UyAukx4biXnzxxYHoQF4gv9yH0ECKrfcW0gqZhQzTc0s48S+66KJAtOpkkYd4QeKQhYSzijThkKoLL7ywIgsJ477JQlqRhYydPXs2hEOskMUm0sVe/iChrMAey9IbjeyZM2cyoo7N2FSWpQccWRoFSBdfkcVmes+Jf8kll4R7lqalywgAZCG06MZXZN96663Q64zspZdeGshwL1nk+ANnyDPxL7vsskDCLX8sXXrUSZcGAPCgwQBZeruxg/jMb4bAl2XpDUYWko4sZBXZ1157LTwP5N2VV14ZGgu4NrvBmT3ckYWkG9FGlh55yDMYXnXVVcH3WJa8o4EBWQg9shBm8Dp9+nQg7mD44x//ODRwoMfSLctCzmkcIF1sYlRCP4cIdz9oKe7YIjCoChMO1ukaW8eHatiCs6kd8VZ887MzHiO2ARz+Mai0BqVn+B4rheVGoFN5rwsnTIcQEAJCQAg0R4DeScgKvdsQSYZTcw2JguDRW0iPLGSGP+7Tm4gcRBkCRHx6i5G/5pprgiwEj55JdEBYIVL0CqMDgg8pgnxB1iH7yDIsGlIMSYNsQ/wgh6SHDog/vZqcIV+kiTyyK1asCGlAGCG09IZiN6TTekqRxR9IHLZA9JDFfnTiC3rpoeU+5I1rwpDFdmTRS48+6aMDP+hphXBCdgmHNCIHkUQWH7gHHqQHjvhNjy736DWGBBMOBhBK7EYWH5AFA/xEjjT4TQMERJX4yPKbXmbSAWd0YR9xsJk42I/fEHTyCUz4TXzsZig6+UuvN1iSH5YmeYIehveTBrYTn7j8oQdZdIMp/oElcfAHWaYAcM0zQfro5HnjjL00WOADeJIGzwD5ic/oBQvyAszQQxg4gxOy/ZJtSotqD83fGYo5QQh0qiwvNnyCXB+YqfG2WCLc9bDOzy5Pw0N96godBAL9vBMGkZ50CAEhIASmDQF6GekNhrhAuiCa77//fiBfzFuGVL388svu3XffDXOwT5065ZgDTs8pxId52ZAoekkhfMxv5hpSxm9k0cfZZOmh5t6zzz4b5lRzxg56kJljTe87Opjn/Zvf/CakxXxotjP75S9/GeylF5o53Mxj5preWP6QxR7mbX/00UfBHnpbkWX+NHZA8JgjDTkjPnZhN9ekj9+ffPJJljb+fvjhh6F3HBJMLznypIGNpIOszSn/wx/+4H7/+9+HnnhkP/74Y8dcbEjhe++9F/AjbeQ//fTTkCa9utjNPO0//elPATNs5je6ILT8Bkv8JC1sxDf+sBs7/vKXv4Qz6SDLPG78oYcdG3RUERDhrmKikJYh0E+FulvclsHSzJ2FOTfje/Viwt1McApiBWxEuCc9p7uV+fjepPsp+4WAEBACQkAICIHRINCVcMeVDV1rjpOega7FZTQleNipinB3QHjBzYVdFES4OwA0McFN3msT44wMFQJCQAgIASEgBMYOgY4MokklRHFEwqftGRi7Ejxog/xe97O2Hd+MJ5MVwp3O6z4vJpq5zMzsnB925H/PlmZ4B73M/U7KzMzMnNedGu+HKTHHeiboTHX5+z6lZA65pVWI5wlvmEvu9WEnqrytZnuwI8OmTz0mF2MRtiY0n41sx+Xf7mEHPsS++nvmK7oLfsT+cjP9zaiCTlgSTcfAELBnstt5YIlJkRAQAkJACAgBITB1CIhwpwSgW2VL92JiMd3XrX5DlMl1RDizIeXzsylpzgnm/Ox5bnbOGCXk2T8jMeEOemfcnLHONJ3zUlKd9BTzXM24WR+HhdrComyFtGKS6+PNzXs67g+z2c+lNv2JvLfJOH8fenK7PfHl3eCVxOnk9z01xk9rDMgejEQOP8LhMUz88/4nitLfNf56gZ5YZunoYlAI9Hq/Dyod6RECQkAICAEhIASmEwERbhHulEBBAPTXDYO2vyIqRBmHU7KaEe4QFBNNI5gxOj4sY7sJUY7lE7XFlc7ryWuV1FbjpUQ8S89rNxKeNQIsRk/iV253mk5oJEh8rdqSphPbQlRrYIjC62S9dCD5UTQvHGOZpKv/B4tAtzLPPR1CQAgIASEgBISAEFgKAl1rE70qIrovgjotz8BSCtlEyKaksEj2vOU9yWve88wQaOvYzXzupDeLkFzUE9DFEOUmNlf1ekeTnucKAP5OPES8K+Euk/TcybJ/5d9JzB5Y5up0NUAEmrzDBpicVAkBISAEhIAQEAJThkBXwj1lWMjdliHQpCJdjgME5TB+t/5Ie7IrfLMn4QYZTxRtPjWjJMLc7xSxSSbcNqQ++JMODe9GuGuwsucm2WKtOAy/Ohy9B5amTOeBIlBX3uvCBpqolAkBISAEhIAQEAJTg8AUMImpyUs5+v/bO/NvOYrzfuuvyvnm/pRzkpMfkpPETnwc20nseDnX8RI7NvaxMXgTmySQdIUktAAS2gCBLAktVwvaJYQ2BJJA20VCCwKz2BibYGxOqG8/Nf3O1PT0zPS9d5ZePq1z1T3d9Va971Nd1fV2LR0RSGsodzuXBJcWPhmmdL9Tho57G1OcyPTe2Sh0vBhYjV/sXMby4dznNHbt4kyeT/5O7ZnOoHP3eOLe6vobiLj3uZPDHQ8JT7M1u8Md00ljmQZO56ZNIK28tzs37cQUgQiIgAiIgAiIQOUIyOGuXJaX0+B2DeRO59uRSJNpF7Y852sOZm0hs8Cqrs4rvdusKB5skfM+Ei2AllwkbMQWOrOgUTjzZ1sd4Fqg5Pnk77453P4FhNmALlkc7rSh6g07GvPB24XrxrIWl/7vLYG08t7uXG9TVmwiIAIiIAIiIAJVICCHuwq5XGIb2zWM253PgiJNNotc0cPUemH5HFW8Mnc8VHzEFtPzjnXseNZX5679bshErql3VhvDp23htVauFiYZp5FMnk/+Jpy9KLC4OIXDHw1tN2/enOWEzs1Dui2e+OWBtyFiES+8hk0+Tnq4o6HmzFUPnf/xsVjOevSjcDafvYVHiz7N9nZkaUG17xmB1vuy9lhMO885bSIgAiIgAiIgAiIwGQJqPUyGlsLmgkC7hnCn85NRPC2eycgXOezEWOxY+rnYOJdjvrfaPsNlTrln5B3ayAmm5zoKZ9/AbprDHcOYGA+uR3GP1Od5mxNtCxA2epWb0xoLPqdFWBzs2ElG1yZ9La5oz8uDscY3sWdELw0anyHrEE+kN98Gr8UbpVV3sPkkWdyfb851vTe/bmyDBbY2LSbX3l7fi56BZZHvrzzq3qm8p13jnDYREAEREAEREAERyEpALYespBRu6ATaNX47nZ+K0mnxTSUeyYiACOSfQKfynnbNzuXfMmkoAiIgAiIgAiKQBwJyuPOQC9KhKwFr5GbZd42sS4C0NLqI6LIIiEBBCXQr72nX7VxBTZbaIiACIiACIiACAyQgh3uAsJXU1AlYA7fTfuqxN0umpdEcQr9EQATKQiBLeU8LY+fywsH00T6YUmLTTbSf0hc8qnYv5aUsl1WPCxcuuD179rhTp065w4cPuzNnzvg/zvH7+eef99c5vnr1qrty5Yp78cUX3SuvvOJu3brlnnvuOXfw4EF35MgR99JLL7lz5865Z599ti67d+9ed+jQoSbZl19+2csePXrUHThwwMdBnJxPyhI36fJn8ZOuybJ/4YUXvD7IkhY679u3z8eNviZ79uxZny7X9+/f7+PAbhiEslzjz2SNCekeO3bMx00cJ0+edBcvXnS7d++up4s92Izsa6+9VueJ7PHjx+uyHF++fLlFFu4mi77YjOyJEyd8vKTP30T01ZQwXThhw6uvvurTRRamJku8yKE38YeyMOM3steuXfN5ePr0aS+LjciiL3kNy127dvk8Jy7uC36HsuQH6cIWndCd+wMeJku+Ibtjx466LPmPDLLEgU7IEu769etNssQ3Ps7UyQl/DdkbN25MupjK4Z40MgkMg0CnB3+v9UlLq9dpKD4REIF8EMha3tPC2bk8WGK6aC+HW/fA1O6BPJTjsuqAIzMWLS66aNEit379erd69Wq3ceNG98QTT7j777/fX5s7d65btmyZe/rpp72Dg/O1du1at2rVKrdt2za3dOlSt2bNGrdu3Tq3YcMGH4/Jzps3z19Hdvv27d5xI9xjjz1WlyXNxx9/3MdPuDRZ0sGJJdzKlSvrsuiAruj+q1/9qkl2yZIlPk6TJdyKFSvqsujw5JNP+j9snjNnjrcXnR966CEvu3XrVp8u4R599NEWWeLcvHlzk+zixYubZNHtkUceqcuiP+fgsGXLlrrs/PnzfT7AgPO8MHjqqafcww8/7GXJA/TnHPyxy3RGduHChT7dZ555xssSz/Lly+uy6M858oq8mD17trcX2QcffLBJFpakRxrs0Z+8hTcOcii7YMECLwsHXlLAknvCZNEfWXjjbJss9x1/6GSymzZtcuSbyaI/usAMxz2URW9kkSFd4kAXHP/JbHK4J0NLYYdKIGxE9FORMB077md6ilsERGB4BKyMh/t22oRhksftZAZ1PqmPfk/N6RK36nIbVFmtWjr0HOLc4ODiROO84Fia441zgyOGs0VPIr2lFg4HCGfogQceqJ8zWRw6cwTNSaWXFlkcL5xGnDBkcaLDdJFFH5wpwuE80lOLLI4c59AHWRzSUBYnlPM4zOiHI2a97RyjC3+EwUFDF9MZWV4scA3HkGvW244j10kWx5k00RuHFIeY3n8cRPRHX/Qmbnq/iRvG5nRjK6x58YADf/78eS+L040stiBLD3ZSFod11qxZ9Rce1lPPiwIYYwuy9GCHsry4wDm99957vfMO90uXLvl0cXZDWV7KJGW5L+655x7/0oA06KnHXhx57gs4kG5SFvt4MXDXXXf5lydwoYcaWe4xZOGALD3YONvGymRnzpzpOaEjzjW94Dt37vQvBmDFPYEtWTc53FlJKVxlCKQ1uCpjvAwVgYoRmGx5Twtv54aJznTQvroOo/J+enk/zPJb1rQZ2ksvJI7xfffd5x0eHBWcRxwec2RxyHGocDpxonBQcXxxgnAmcXRw0HDIrNfbZIkfB8hkcZhwfENZHDRkSZf4TZZeVZxc0uB8KEt8pBvKmpOMfjhtOKo4rMjiXCJDuiaLc0e61mPOMbI4cfwhCwf0aieLTtgXyqI3zi6y8ECWeLEbnekdtvA4m3aMvvAKZbE9KWt8YGOyHNMjTz6QLs5zUpa0kYWByXKMDvTII4sc8uQq1bUAACAASURBVCZLPiNHrzSyvEhAT9JFFtsZGUE+mCzc0LmbLPmF004+IEs+mSxONuniSJMuf+SJpUtYXhaYLHHBjXTRi3uW8Fk3OdxZSSlcZQikNVoqY7wMFYGKEZhKeU+TsXPDwmfpaz89p0v8qstvWGW3zOkyR5YeU5wo/nCq6Hk05wonih5G5u/SC01vOE4ZjiNzec1x5DdOJs4QjhrOEbL0qDIXF1nCcw5HiniQJZzJcoyzhR44UejF/F2TtfDImuNosjhYOFvskaUHmbnHyDJfGXu4hqzZZrI4aOjFnjTo9bZefGTpdeUaDMz5M1mcbdJjjyzpWS8+85r5jTOflOVlAE48MlxnT+89c8TZI4seOOvIooOxQpbzMCAO9ly3EQDMiYYdDizsiQ+m6Iws52FgcXDMCADCIUue4cxavoWynIeBxUHaNgKAed3cKzjgabI4xKSBM0+a2BzKkjYvAZC1YfSmM3HC0tInv2z0AGmST7wE4H6BGzywA7msmxzurKQUrjIE0hpclTFehopAxQhMtbynyXFuWFuaPsPSRemKQN4JqLwMJodwgHCUcShxxnCKtIlA0QngqPPyh5cwWbfhtQ6yaqhwIjBgAnoQDxi4khOBIRKYTnlPk+XcMLY0XYahh9IUgSIQUHkZTC7Re4pzQu8ve3oHtYlA0QlwP/NHT3zWbTgtg6zaKZwIDIGAHsRDgK4kRWBIBKZb3tPkOTfoLU2PQeug9ESgKARUXgaTUwztZe4uw8DpEWTeqzYRKDoBm+fNMPWs2+BbBVk1UzgRGBIBPYiHBF7JisAQCEy3vKfJ27lBmmNphvtBpq+0RKBIBMJyYsdF0r8oujKHmznZrAbNfFx6ubWJQNEJMBecefWsOJ91k8OdlZTCVYaAPXzDfWWMl6EiUDECYTm348kiMLm0/WTjmmr4YaY9VZ0lJwLDIqDyMhjyN27c8Cto80kqFrFiVWltIlB0Arw4YvVz1iXIusnhzkpK4SpDQA/iymS1DBUB16vynhaPnRsEZksr3A8iXaUhAkUkEJYTOy6iHXnXmdWd+aQTK2WzGjUrYWsTgaITYIoE3wfH6c66yeHOSkrhKkPAHr7hvjLGy1ARqBiBsJzb8VQRmHzafqpxZpUbRppZdVM4EcgbAZWXweTIxYsX/VByvlfMIlN82mmg28SEGx8dcSMzRt34IBLOmB46zZi2ThNuYnzUjYzMcCNjEz21bmJ8zI1G8dbKyYgbHU/GH3Edi9Ketg09VXtgkbHqPp9Mk8M9MORKqIwE9CAuY67KJhFIJ9Dr8p4Wn51L16A3Zy2NcN+bmIscS/8apG2pTEQN1dExN9GvhnfGeNvqpwueQFhO7Fhoek+AIeWsTM53j/kGNj3ek9tix67u/OEERg706LhLuoAW7/ioOdcTbqwuZ+csVD/22dPrhcM9MYbTXnOKe+pwR068fxngAUc28XJgJKrTQmQ+DGkPgmuYcD6OV6xY4T9xN5nP3KmHOx95Jy1yRMAqsHCfI/WkigiIQA8JhOXcjqcbvcWTtp9u3O3kB5lWOx3sfKOR2+ghqXfA1Btqdi3aR43nfmyTb5DGjcu4ETtjZNTV9c6gYK23KWqARk5xg0HnBunkGt7Z482gbqWD5Km8lDkjzp8/74eR43Cz0NTSpUuzmxu9vBqhLEbOXlMH68R4XL7oeU1E52Way9z4KHVN87mEVE9/DjS9mFEvHW6vf9LBTiE0UDtT0h/mKdYjuHTp0qQWAZTDPcwcU9q5JKAHcS6zRUqJQF8I9Ku8p8Vr5/phiMUd7vuRTuY4GeoYNZbpiWrdcGxrjeDJOLSt8WQ4k7lBik44y3GcUaO+NqRyJJvTzYuEyEEPre1Xg7Rf8WagWZogYTmx49IYlyNDmOvKas6M+GB/9uzZbNoFzrYVyWZBe/kUlk87N5hy2KxP49dAy2fm+q2hX+ejmKEc7o6YmCKxe/fuSU2RkMPdEakuVpGAPXzDfRU5yGYRqAKBsJzbca/stviS+17FH8aTTIPfQ926NAQH1ijtokedURSuxfnPKhu52aMR7+S7hX7Z2K946ywqcJC78lJS5gwhnzNnjmOV8u3bt7sDBw5ksNQc59CZThGLy2dtuLPJ8CLP/mqOd6O8RGH83OnoeuLlGLFP+DnJsSzXzdNvmsYRv4jr4JA20qvpHI60qY3miae6WK97U/yddYwmbTfmVnsda6MAMvVwe9lgGHpoI6qmjT4yHWumNP2ftNNf7JaGD9SwYcRPv4l+N1We3a43qTGUH6tXr/b3M9Mlsm5DfiJnVVPhRGBwBBqVtVXaKiaDo6+URGCwBPpd3tPi51yvt7R0ep3GpOLr4qymNtaiBNo2ekk8bGzSqE5pNDeFmWyDtMXAqOEXpdOtMesb1CkN8IaN7RrRiYZ3nH7IwDdIE3p1j7cmEMbjWU3RgUgkX4qfuSsvpaDaagSLpC1YsMCxyNT999/v9u7d2xooecYc6Q7OXk2kVj6Z020vyxploxFp7Vw0/HwsnvedUjdRhuvzwqlnvNOOwx468rXFw5g60mmIeosOUXr1tFGr7timxJ/QsWm6TVLvoD7sVkdFicYvBeNKIJKtTXtpsKsRi+1Nqc8aRGtHLXZmTAO5UcuwiK+PJ3C4u11P6jGM31u3bnX0co+NjWVOvvdP/cxJK6AI5JOAHsT5zBdpJQL9IDCI8p6WBud6uaWl0cv4Jx1XsnGYiKC1sYaz3a7Ri3DcCI4aZr7JGMffuwZpQkF++jSSDdJkuLiBGjQYLUTNxg4N/aaGd02q1htmacaNUd/4j14wxGl0jder3o7l5B0Is6dM+9yVlzLBDWyhB5De7TvvvNN/GuzChQvB1TaHVi66On2Ne9mKX1q90nouWWapW2q94aZRrRw2Rq20xmEhW/dhWF56NZzLRtgwDGeTv6PKp+YQm2EWJvjtY4tZdXO4ffxJ2bQ61NLtyr5V52xpmOPvtY//i87Vdet2PZQb3vGvfvUrRy/3wYMHMyvR2yd+5mQVUATyS0AP4vzmjTQTgV4TGFR5T0uHc73a0uLvVdxTiscac+Yspu7DRm63Rm+tIdZoWMYN0qBhmNrgy9ggTbOR+BrppYWIzsV21tuLQTCvT1NDvk0juh6m9Xpa/N3j7caytbEcqF2Jw9yVl5JS37Nnj5s7d67vDeQ73Bs3buxu6aAdbksvpY6y8t9a5tqbYWHHWEU8rWKIRC2MrfmQ/N3icLerZ+Lzpme6Vsm6sxGqbbpBvdoI3XzULJs1jbiOi1gzeqc+bL8edbfr9YBDPWB6xAMPPJBxikRN1d497YdquhIXgd4R0IO4dywVkwjkncCgyntaOnauEyMLw77TFoaz407h+36tS0OwubEWaZOh0Ws6T/ihlPFcRGsYZm2QpqST2iYmPovbEk7bx/GlxdFio/UeBYGbw8SNzTDdFI7NMiiVcNRTbLR7whrmrXGkGVfec8Yj3JfX2uFZ9sYbb7hDhw45nO2nn37a7dq1q7sy8T3fadh2LRJzzmxESKsjS7jWez2tvIQv/1pVbI2jNYydsbCjfmHIhm52nb2Fyexwt6tnUuqHMB1/3CFMrSc/tD2lDmqJsHaiyYbJpmFz6XnJkZxLTn3W8XobhQZ4mp7tw4cP++kSWZPt/ATPGovCiUCJCIQPYDsukXkyRQREICBgZTzcB5d7ehimkTxOSygZht/ttsmEbRdHT893aICRTlNjrXai47xIr5vNWfQNtHgOojmnWRukKc5o4P/6ZGoObHpDOQ7Q2LVLNwrRYmPSMU4LE8XH6u6jcddPcmgrCXeN1+sUNqKRat5a42i+XvZfuSsvJQX+7LPP+k+BMYd72bJlbuXKlRksNUe6MaQ7VSiuY8JvRKfd163n0hzuzmm1xpGqkT/pw/p6yexoLYvJ+JK/271Esxdm9dS71LO1cLXe57Te9p453MGUn7pu8UFrGnaBKTO2iFsro2hp+87XkwkN8PemTZvchg0b/MJpWZNt//TOGoPCiUDJCOhBXLIMlTki0IHAoMt7Wnp2LqmmnQ/3yTD2Owxjx3ZtKPsuDcGWBmYHx7Wmfzxkse4dx43ZhMM9tQZpMyEagfVkmi+1/uqgd4uNWRzuKAXSHxmxRTtrCzWFCXeNt4NOFk9rHHalGnsrI+G+GpYP1spTp065zZs3u/Xr1/tvFmee85riTDdrbusbNL8YS7uvW88lHG5Li8XXwjHO0Xmbf90aR7M24S8f1uolc0Trv2shk/Elf7c43G3isSknLfVeqFB03Bp/Q49m2US9mogn/JmMM/nbwnK+kUYUPyuT20X2UX01Ul/4rtv1UHB4x8zh5p5etGhRZiXkcGdGpYBVIRA+gO24KrbLThGoGgEr4+G+3wzCtJLHYdrJa/Y7DGPHdi3c27Wh7CfrcHdr9HonMmxcJxuGcS9OomGbtUFqjFqdbRr2o/VVkC1cfd/BztYGaKxz4M0nw9Ab1Gic1lNpOkjKtDTOu7GMYmuNoymJ0v8Iy4kdl97oIRi4c+dOt3jxYu90M6T8oYceyq6Fd8RShhzbSJe6k9aIMryvx6MVpKPvAMSrcYdluLWusJEkdi/U9lbfNOKwIeCNFJNHUdz+ZVnQYxvb0SjXyfiSv4mzvY711dSxjZdzDMvmL+nIhqpZnRDVj/ZOIXW1ddj6+CL9m7ziMDKOU3TOlEZNrmFDFJOv241Xt+tJPYbze82aNd7hPnHiRGYF5HBnRqWAVSHQXOHWKrKq2C47RaBqBIZV3tPStXNhHti5cB9et+Pwuh3btaHsrZEZOJcNPWgoUreGjeCo4cUiQ9Z4rO/jRq9vlDV6Smik+YYmDnbUSKRxaPKNxhzpZGyQRso1hjfGDVjTIenENwyJjmoNxNbhmvH5JhuTjehGmFpD3n4n0kePug4WJmSXjLfBopnnVByIJmNL86OZS413aYzLkSG3bt1y27Zt8wtM4XwzFHdSW/0b1UGZGAlW/k9GZk6fd8atrJgsTp05lPG5ermizMR1ii9vVr6ScVgZSibM70Tc8QsBq5dq91wUb1jPRU5y7fNcU9GRuo/vcHfgEapZf1FRS6tl0bK4jm0qG6n1d6J+CcN0S4P6kk+fRXrXXkxEujTN4e52PTRoeMerVq1yTzzxhP/UXVYt5HBnJaVwlSHQVNnEDa7KGC9DRaBiBIZZ3tPStnOWDfY7ubfrtk9e5/ewtuYGJI27oJHapVGX3uitWVJ3iOMGWq03i8ZmoyumWT57g3Q8bATH9b4xbfRMpRP1Deqg4V53wuvxpDf0m9KMG631Fwl1WWuI87LBvp1r59LjNRrNLKbiQKTbW4azlrfhvgx25c2GmzdvumeeecbNmzfP7dixY/IOd94Mkj4iEBFgtf2FCxf60RtZgQzviZxVQ4UTgQETCB/AdjxgFZScCIjAgAhYGQ/3A0raJxOmmzw2PZLn+Z3csoRJyuh3rwjUerbCjp6pxoyTHLw/qEfje7J6kUA9xmofqLwMJv+ff/5575g8/vjj9ZXKB5OyUhGB/hHgJdLdd9/tP3mXNZXWp3ZWSYUTgZIS0IO4pBkrs0QghUAeynuaDpyzrdt1wqWFMXntB0DA99zbPMQppkcc7Zxqhs13n0A6xYSrJ6byMpg8v3jxou/ZXr58uWOl8iNHjgwmYaUiAn0ksHTpUrdu3To3e/bszKk0nuiZRRRQBMpNQA/icuevrBOBkEBeynuaHpyzLe26XWPf7XoYVsf9IVBb/CcYPj/JZGpzPWurktuwcB9F5Gwz71Fb7wiovPSOZaeYbty44fbv3+/27dvntm7d6iazyFSneHVNBIZJgJdHK1ascLxIyro1nuZZJRROBEpOQA/ikmewzBOBgECeynuaLpxj63St3XUvqP8GS4BFgzqtFtxFGz+Hu/5JMBYUqjngXcR0eZIE0srTJKNQ8AwELly44FidfO/eve7RRx+d3CrlGeJXEBEYBgHu6cuXLzumSmTd5HBnJaVwlSGgB3FlslqGikCqIzssLGl1j51DJzsO96ZreM6O7Zr2IiACzQSsjIT75hD61QsCfIOb3sArV674VZ3PnTvXi2gVhwgMlQCft9u9e7d/kfT+++9n0kUOdyZMClQlAuED2I6rZL9sFYEqEbAyHu4HYX+79MLzWY/RNy3sIOxQGiJQRAIqL4PJtePHj7s5c+b4VcrHo0UIDhw4MJiElYoI9JEAnwTjfma6xNtvv50pJTncmTApUJUI6EFcpdyWrVUnMIzynpYm52xrd73deeTSrll82ouACDQTUHlp5tGvX0ePHnULFixw69ev9473nj17+pWU4hWBgRHgs2DM3160aJH74IMPMqXbeMJnCq5AIlB+AnoQlz+PZaEIGIFhlPe0NO1cJ70sTNa9xaW9CIhAM4G0MtQcQr96QYAe7fnz57s77rjDz3dl1XJtIlBkAmfOnHEbNmxwq1evdlu2bHGffPJJJnPkcGfCpEBVIqAHcZVyW7ZWncAwyntamslz5Evy3GR/Vz1vy2v/hBuPvtc9MmOanyErL6CulqWVpa5CJQkQ2t5vk5599ll3//33u4cffth/h5ueQW0iUGQCLJTGff3AAw84Rmy8++67mcyRw50JkwJViUD4MLLjKtkvW0WgSgSsjIf7QdgfptfuGD3aXctyfhB2lDGN8dGcO7L+m9/RCuZyuKd8+6WVnylHViDBNLvtXD/MePPNN93hw4e9s02vIAtNaROBIhOgZ5t7mm/KM3rj7NmzmcyRw50JkwJViYA9fMJ9leyXrSJQJQJhObfjQdpvafZjP0g7SpPWxFgheo7HR+VwT+eeSytv04mvKLJpdifP9dIWegKXLFniVypfunSp/zRYL+NXXCIwaAKzZs1ymzZt8sPK+TzYpUuXMqkghzsTJgWqEoHkw4ff2kRABMpJIA/lPU2HXpwrZ47106oJN+a/gZ3zHu4IgRzu6d0HaeVrejEWQzrN7k7npmvVCy+84J555hm/aBpOyqFDh6YbpeRFYKgEFi9e7JgawUKATJWYmJjIpI88iUyYFKhKBNIePlWyX7aKQJUI5Km8p+kynXPDzcdxN+qd1xluZHQsapREv0fHm1Xi3MhIfdj8yMiYG0+2XVrCRM5wGCZq7IyPjsS90nGaUTwWZMLPdaY3OPobScg2aWPOdhyW8OGQ7W56NMUV/5iObj69QBd0D9KQwx3AmMJhWrmaQjSFFEmzvdu5qRq6Y8cOh4OCs01vIN8v1iYCRSZw7NgxP1IDh5sRHL///e8zmSOHOxMmBaoSgbQHT5Xsl60iUCUCeSvvafpM9dww8xGHcHSs7vbWemRDh9sP3R5xY+Y9+984xQ1nOerHdaOR4ztaDzMe90BHcj7q0Eke8eEm/PzmmnM6MRY54lGataC1uJqc6BRA6Y5sNz1SIopSrfWW4zRPVrdY17ruDHOP4gn4peuZpofOpRFIK1Np4cp8Lo1BlnOTYXLr1i23bds2v8DUzp07veM9GXmFFYG8EeAb3OvWrXPsly1b5l555ZVMKsrhzoRJgapEIO2BUyX7ZasIVIlAXst7ml6TPTe8fDQHNdQgOld3GGvO6EjdIa+Fo6c6dIi9U1mXieMyxzw4n+58okNzrzAOOAwD0VBBf5wWV1Y9WiKLTqTFV3uR0Em3Gr8Gn9h5D15GpMebpoHOpRFIK0tp4apyLo1Ht3NZ2Ny8edN/Omnu3LmuZw53VAeM+lEz4eiW9tok65X2Ift9ZRhfF4jqDhaBtHef/TaxAvHzqbtf/epXbuHChX7RNM3hrkCmy8T+EEh7yPQnJcUqAiIwbAJ5Lu9puk3m3PDYNnp3GU7e0tiLneZOjq/1bjeczoY1SWcz+duHrK/kHQzL9sPEoyHuCUe/EXOag5x0fhuhU9NtXI7VIP1m5zrywr3jn5aXSd38UHwbdi+HO0F36j/T2E89tvJIpnHJcq4dgeeff94tWLDA9wYypPypp55qFzTTeUawjPipIY06pqV8JWLKjcNdL/eJ+iChb89/Ut9GdUh9pFDPE6hWhHv37vUjNe666y7vcDOKI8umHu4slBSmUgTSHi6VAiBjRaBCBIpQ3tN0zHJuuNlIz0pjfnbT/OksDnccJumAYlOtp7rRaE11fH3jthEmK4uWuCahR1oaLfERKItuNofbOxfxUHo53GmIp3QurfxMKaISC6Ux6nYuiePixYuOedysUP7kk0/6Tyklw2T+Tbkp+FoGqfVBZgDTCVh7cdj5Jed04q+O7DvvvOMYscH3uOfMmeMYxZFlk8OdhZLCVIpA2gOlUgBkrAhUiECRynuarp3O5SIb44XDanrGDnDsxIZzklt1rTUQ08Jkd7g7Dx9vTbN9D3cWPbLFF4WKe7raN37jXvV6gLg3Tw53GuIpnetUbnStdVTIVJncuHHDMQR33759fi73qVOnppRfUaGJ13NoFh+eA9usR9ZfQ9U3y4u+rIZUONyZM2f8NIlHH33Uv0iixzvLJoc7CyWFqRSBtAdLpQDIWBGoEIGilfc0fdudG1420rsdLn4WaRI19kaixcOSi52NjMWLmpmyUTjzM9s1Tjkf9nynhjOnnjTDMe3R+cZibpZoY58WV9o5JJJ6NGJpHKXKdtPNN4yNFXHJ4W4Q7c1RuzKj871zto0lQ8lZzfmRRx5xixYtmlIG+pdswQsni6RRvoIRNU294BPOD0O3aR1NXw5oJ1OLPfzCgf/SgiUa7MMwTaN4gjDhYUPf4GymLyBELxw6fvWh23XSq9UjYd0ZaKHDjAROnz7t1q5d6z8HRi+3VinPCE7BRCBJwB4S4T4ZRr9FQATKQSAs53ZcBMtM10774dkRN+wiz9nW6glXD/d6eacyrXEfDAM3xzRqaJvP3BKPOaPWoA6MtkXSmhmFjmwQOD4MG8TjY/FLg0x6tMZlDdy0OaYddYvZWMO45jBErHA4osb5eOQ0FOV74WlU8nCu+Z5Iuw91rpeMrl275ofgnjt3bgrZH9/v9iYuiKFWXqP5yfbiLi6rVnZsNEmtDFq5IW9bZcJRLLXyaXUFi7MF90OsB2Gm/xUE67mPa8qofNfKtqVdM5b0Gy8KY30CHt2uGzJvR8qLC7uufXcCZ8+edUuWLHG7d+/2CwG+//773YWiEOrhzoRJgapEIO0hUyX7ZasIVIlAkct7mu7hueHlY9SwpQEcNX6tVyat92diPLgeLWhWWwwpobXNZbYFz5oWYQsb0LVGdHI9tGQPVPJ6IjUmiNc+wVXvjY9DdNSjJZboxPR0qy30FNnk53DXetNrTkLUYxevtu7zOmh0p2mhc+kEwnKi48CZjMtZr5nYKuUML5/0FpfJtFu95ggHL+ms3AWBk2GSv+tltS4Tl93670jjFh1wlMN0CTL5ryB4XcJ0gGN1UP28OeUhuehc5usNueYXCY3zOspOgIX/WKWctQmYKsG0iSybHO4slBSmUgTSHjSVAiBjRaBCBMpQ3tNs4Jw2ERCBdALtyozO98f5xkmZPXu2H1qeniMdzsYjPur+ZRC0u/NsL6saznF3mdjhDnuCYye4tee8lVc9TKCnHTanXXOk08I3h2u8vEv96oO9ZOClZdMLSUs12HdgGYTSYQcCFy5ccBs2bHDLly93K1eudNevX+8QunFJT+QGCx2JgCeQ9sAVGhEQgXISKEt5L4sd5bzLZFXeCKi8TC1H0rh1Ozd//nz3k5/8xA8pv3z58uQT7uAkNjumRN3aO50Mk/ydJlNbc4JFF2tDvVt6r71ODSc+q1FNaSed+CCSWnph/JFd7b764OW6XY8j78AySF6HHQjs37/fsS7B6tWr/efuPvzwww6hG5fkcDdY6EgEPIG0h4fQiIAIlJNAWcp7Wewo510mq/JGQOUle46ksep0Lox5165dvmeb3kAbihtez3TcwUlscmB9ZD1yuKO4mNYxEi9U5qdz2EISpNNBJ69Gm/+a9a31cIdzx02s1eGOr6R99cGE2He7PkW9wySqfvzEE0+4PXv2uAceeMDP45bDXfU7QvZPmUDag2TKkUlQBEQg1wTKUt7LYkeubxYpVxoCKi/dszKNUadzaTG+9dZb7rnnnvPONsNwWa180luHnuBmB5aYe+Nw4/CmDfWu627zrKf5FYRW/WspcL6RPr3XXb760PF6Xet4nnnzgmyNqzrKQoCVyVmL4MiRI+7BBx90x44dyyKmRdMyUVKgShFIe6BUCoCMFYEKEShLeS+LHRW69WTqEAmovLSHn8am07n2MTnfA/jQQw+5J5980n+zmE+DTX5rdaJrccTno8XLGoshxr3G9fnXjTDjXij5m5PtZFrnZ/svBdQSry+S1symkzObkrY57pG+1oHe7ksM9RXRo/Sbw9TibX89VhhLI0c+tKFxRUdZCcybN8/P4WbhND4Pdv78+UyiGlKeCZMCVYlAc+VZq3CrZL9sFYEqEShLeS+LHVW692Tr8AiovLSyT2PS6VxrDK1nXnjhBbdlyxa3fv16t3nzZnf48OHWQBnO+CHWdScaAXNezSlmvnPsONtK6zixTSv6j8Wf3Oosw6zt+qf4LK5g3+h5jsKNjcZfNcCRDR3/VqNqw8TjtMMV4Lp+ASGyteNXH7pdN11ix7zxdsIuaD8JAozU2LRpk7+nmcd94sSJTNJyuDNhUqAqEej0gNE1e1Bpr3uhvPdAEeu7tPuxiHZIZxEYBAGVlwblNBadzjUkux+Nj4+7xYsXu40bN/ph5fR2T22rOdOhnzq1eLJJ4Uin+aV86pCe5EJufv52uBBbIa0YutLbt293y5Ytq79Eeu+99zLpJIc7EyYFqhKBTg8aXSuvk6W8Vd7aPVDE+s50D/dFtEM6i8AgCITlxI4HkW6e0jC7s+6novutW7fctm3b/AJTO3fu9D2DU4nHywzKYSSddk511BsdvUMo4DbYFxYFBJRZ5WeeecY72yyext+ZM2cyycrhzoRJgapEIOvDYsYohwAAIABJREFUR+HkoOkeKOc9UMT6Lu1eHKYdrPA7I5pbWci2aR1cNARzNLKh9mWg+lkdFJ9A3srLoImm2d/u3HR0e/31193WrVt743BHitTmLneaJz0dbWuytaHfI/6TYE1FP3K2GdpduM0PWa/ZUzjdc6gwozYYVr5o0SJ/X58+fTqTlnK4M2FSoCoRaPfQ0flyOlfKV+Vr8h4oYn2XtIHfw9zK4XBHBBlCOqLG6jDvpX6knbfy0g8bO8WZZn94rpPsZK4dPXo0clLHfE8g3y5mLve0NxzI5Krc0460OQI/h7v+SbDoGVnYOqD20jBteHyzxfqVlcCLL77oHe6ZM2f6e/vChQuZRIf7RM6kogKJwGAJhA8dHcsZ0z1QvXtgsDVOb1JLu097E7NisVWM240yFaHiEah6eUmzn3O93nBGduzY4ZYsWeJXKudTStpEoMgELl++7GbNmuVfIvEt7ldffTWTOb0vXZmSVSAREAERGD4BvqXIZ0qYhzPV1VOHb4U0EAEXDd9ufTEiLj0kMKj5oz1UWVG1J6Dy0lxntCc1vSs3btzw3yzet2+fn8uddfjt9FKVtAj0jwDfld+1a5d7+OGH/YKA3NtZNjncWSgpjAiIQOkI0BCYM2eO+8UvfuFuv/12d++99zq+q6hNBIpIIF8OxET8WZ14DvfERPT915Ho8zn8Zogj87sZpmnXx9xoPHxzJDlU1M8/DF4mmEyQSeGneVrk43BhGJ9u0+TMaIhqmL4fspqcq6lP6gTIC3+Yr/JSeJxtDbh06ZJjKPnu3bv9y+0HH3ywbVhdEIEiELh48aJbtWqV79mms4Ye7yybHO4slBRGBESgdATo0f7617/ufvSjH7lvfetb7itf+Yrbs2dP6eyUQdUgkCsHwvcG4yTHDnZ9LmQ0F5rvyZIlzI2OnO6RaFGysXhVstqCSDOixYosz2or67JicCgTriBsCxzV5iji2AfOeRwRYfiUTy2OOM5gQTdkRuuTHOM4GkqYMrW4m74FXL+kg4IRyFV5KRi7yajL94qfeuopxwvudevWuZdffnky4gorArkjwD3NZ8F4icQK/O+8804mHeVwZ8KkQCIgAmUj8Pjjj/uebRZxueOOO9w//uM/Os0vK1suV8eevDkQNcc37sGOsiH5O/K43RiOeOjYmhNed35rzvFI/XcsU3d628fRiJY4GnpwR9ScdHPsa2k0whMiOtd8gpOxXH9XSPYJ6b++E8hbeem7wUNK4Pjx42727Nl+NWeG4R48eHBImihZEegNgf379zs+DcZn7hhOzsukLJsc7iyUFEYERKB0BNasWeP+4i/+wv2///f/3L/927+5T3/6074SLZ2hMqgSBPLmQCQd7OTvbA53I+sm4k/beDuTDnf9dxQ+6bTXe9uDnu94vnvNkY+ddt/bPtb5E2BxXCm+eENRHRWCQN7KSyGgTUFJVilfsGCBX9WZhaboFdQmAkUmwDoEjNqgl5sh5UybyLLJ4c5CSWFEQARKR2DevHnuL//yL93f//3fu7/+6792n/rUp/wby9IZKoMqQSBvDkTSwU7+zuxw2xxu5m5Hx75XPHSwIyeYoemjNiw9Gj4Oi7pT7J3k5h7u1hsicrptXjnOuE+rNVTUTd8cd0oQnSoGgbyVl2JQm7yWLEzKZ8FYJ4VRZRPReg7aRKDIBLZs2eLXJaDTZsWKFe6NN97IZI4c7kyYFEgERKBMBN58803/mZL/+I//8L3cf/u3f+sXTWPFchbE0CYCRSOQNwci6WAnf2dzuOMh5XXvOTmkvJZLfkG2cJ547Hz7q5NxkuPF3WosU5z0ycRVtBuoYvrmrbyUFT/DbunZXr58ue8V1MKkZc3p6tjFNETW++GTYHzy7r333stkvBzuTJgUSAREoEwErly54ubPn+++9rWv+d7tf/mXf/GLpz3//PPu5s2bZTJVtlSEQN4ciKSDnfydyeH2Dm44Z7rV4fYLotXneKdkdjzEfMaMKJ7QEY/O1xZKo3d7rLagmolH6Y4QPtEZ17xAmwXWvogE8lZeisgwi85vv/22Y1g5Q3BxtrUwaRZqCpNnAtzLe/fudXwebPHixe6FF17IpK4c7kyYFEgERKBMBFi8hc868OadxdI+85nPuO9///v+jSWLYWgTgaIRyJcDETvG9cXKkr+hW+u9rn8azJ+qDQ+vL6QW9yjbommsYs7w8RkMKY+Gl49HPdJ+iDnnkn/BsHNbJK05jDnUtTjqq5hHetRWS2/t4fYvDYJ4UVlbMQk03wu1+6eYluRba561OCVPPvmkH1XGt4u1iUCRCfBpO3uBtHLlSnfixIlM5sjhzoRJgURABMpCgCHjzLthiNsPf/hD9w//8A9+HvdnP/tZv5rqxo0by2Kq7KgQgTw5EE0ObtR73OwU48jGzrY5yd6Brn0mrG5HPIyc4eL+XDyvutZTzufFat3PdSfc4gr25qhzGyS/w93ovY4cbj5VRo+3DUtPncMdO+YNwQrdXeUztX6fBfdL+awcvkUsMLV161bHMNzNmzf7XsHhayUNRGDqBBilwb3MPc2LJDncU2cpSREQgRITOHfunJszZ4677bbb/EIuP/7xj90PfvAD993vftevOsk8bobBaROBIhGoqgOBI53mA+NA02vds833trf2evcsfkU0UAJVLS8DhRwlNj4+7nu4eZFNr+BDDz00aBWUngj0lACL/3Ef43BzfPny5Uzxq4c7EyYFEgERKAsBPkvCkKCZM2e6z33uc+6nP/2pd76/+tWvuoULF/pe7qyfeSgLE9lRfAKVdCBwgts51Qw575m/XeuRb5dU8e+e6llQyfIyhGw+e/asH03G97iZ96oh5UPIBCXZUwJMk2A9Anq3WbE860K7crh7mg2KTAREIO8E1q5d6+du85mSL3zhC354Od8JZQ73vn373OrVq92mTZvybob0E4EmAlV0IGwRMz4J1rS+GZ8Pi4aJ92SL4hodiYawhwuu9SRiRTJMAlUsL8PgfevWLbdt2za/PgorluvZOoxcUJq9JMBw8qefftotWrTIj5Y8cuRIpujlcGfCpEAiIAJlIMDDn8XSGA60dOlS73hzzDe5GVLOKuU0CLLOySkDE9lQDgJVdSD8HG6be8183J46x9G87dH0IevluGuqa0VVy8ugc5wVyvkO9xNPPOGdFIbhahOBIhNgCDn38S9/+UtHZ83JkyczmSOHOxMmBRIBESgDAYa3MaSc4UBLlixx3/jGNxyrTH75y1/2x7yJ5zoLvWgTgSIRkANRpNySrsMmoPIymBy4cOGCn8fN8xan+/Dhw4NJWKmIQJ8IHDt2zN17773+fqaz5syZM5lSksOdCZMCiYAIlIEAc29YoZyFLmbPnu3uvPNO99hjjzkbZs5QIT4LxvcVX3/99TKYLBsqQkAOREUyWmb2hIDKS08wdo3kxo0b7uDBg3661vbt292LL77YVUYBRCDPBA4cOOC/J79s2TK/HpCGlOc5t6SbCIjAwAmwOjkO9YYNG/xqqY8++qi77777HE44Pdu8qVy3bp13wLn2yiuvDFxHJSgCUyUgB2Kq5CRXRQIqL4PJdYbfMt+VkWN8AYQFS7WJQJEJcE8zNfHKlSt+aDkdNFk29XBnoaQwIiAChSeAAz1//ny/siQNABZHY4XJHTt2+EpzNJqryVBznG1tIlA0AnIgipZj0neYBFReBkOfNVF43t68edO/0ObFtzYRKDIBpkew2j4vkRgRyb2dZZPDnYWSwoiACJSGAJ8noVeb72/jdLNAGk43vd/aRKCoBORAFDXnpPcwCKi8DIY6813nzJnj5s6d6x0UhpdrE4EiE2CNH0ZF0o7cv3+/Y9pElk0OdxZKCiMCIlA6AhMTE3618uXLl/uebTUESpfFlTJIDkSlslvGTpOAyss0AWYUZ5VyVnJmKhfrptArqE0EikyAr9nwDW7mcG/cuDHz9EM53EXOdekuAiIwZQJvvPGGW7x4sR9CjtO9Zs2aKcclQREYNgE5EMPOAaVfJAIqL4PJLRaY4rNgt99+u1+slBfd2kSgyAT4JBgvkGgz8nnZ8+fPZzJHDncmTAokAiJQNgI8+FnEheFuixYt8qtOls1G2VMdAnIgqpPXsnT6BFReps8wSwxM12JxUnoDcVToEdQmAkUmwFo/jNR44IEHHCvvv/XWW5nMkcOdCZMCiYAIlI0AbyUXLlzoVyfnW9wsoKZNBIpKQA5EUXNOeg+DgMrLYKjjjLCK81NPPeWnbu3Zs2cwCSsVEegTARxu7mPua3q4s37qTg53nzJE0YqACOSbwO9+9zt36NAh3wigMSCHO9/5Je06E5AD0ZmPropASEDlJaTRv2N6Ah966CHfu83qzowq0yYCRSbAVER7gcRq5SyclmWTw52FksKIgAiUjsBrr73mne3HH3/cr1auz4GVLosrZZAciEplt4ydJgGVl2kCzCjOis68zGY4OZ8IO3LkSEZJBROBfBKgZ5upEdzT9HafPHkyk6JyuDNhUiAREIGyEWAON5924E0lFac+C1a2HK6WPWkOhM7NcGIgBlnvgWrVGIOxdnx83Pdw45jwrKWXW5sIFJkAnTO2JsGKFSscq5Zn2eRwZ6GkMCIgAqUkQO/2unXr/IqTfOaB1cq1iUARCWR1KhRODqjugfR7oIjlPu86nzlzxj9Xjx8/7vbu3esYgqtNBIpMgPnbvECizcjx9evXM5kjhzsTJgUSAREoI4G1a9d6Z5uGABXorFmzymimbKoAATlR6U6UuIhL1nugAtXEwE28deuWH0nGis47d+70w8oHroQSFIEeEnjmmWf8qEjmctNmfPbZZzPFLoc7EyYFEgERKCOBF154wa1atco99thjbt++ffoWdxkzuSI2ZXUqFE4OqO6B9HugIlXFQM1kDjdfA+Hl9tNPP515gamBKqnERGASBC5duuTbir/4xS/8N+ZZfDfLJoc7CyWFEQERKCUB3lQyH4eh5czhZq9NBIpIQE5UuhMlLuKS9R4oYrnPu844J8zj5vnKminaRKDoBOjRnjdvnh9SPjY2pjncRc9Q6S8CItB/Asy/4c07vdysoMrqk9pEQAREQAREQASmT+D111/3vdo8a1lo6sCBA34u94ULF/wzd9euXX6EGZ9W4vNhrP7M9C7+WIyKZzILU7388ste9ujRo/6Yl+U48rwk59NjDO/dsGGD70XnGitHEycLoiJ78OBB/73kl156yW3dutX/kQYvAeiBp/edRd22b9/u6JVn+DvXzp0751dWR99Tp075NGkrEAfyCxYs8Gkwnxc9zp49618ukB7z148dO+auXr3q0Btb0ZFw6D1//nz3xBNP+D+4nD9/3jtxfNeZ0Xf8vfHGG94Opr1hC/HCY+7cuT4O5ImbFxsrV650fH2FNNH73Xff9XYgw1o1nIfT/fff79s9yJLGlStXPHv7VCoLyv7hD3/wdsCf9hHckGMI9erVq73OpIFt8Pvzn//s9Zz+HZP/GA4fPux27NjhFwDE8c7ablQPd/7zVhqKgAj0iYA9WO3hffny5T6lpGhFQAREQAREoHoEcCZxjpm2xX7OnDneYcPBxdHFEceJxRnFKcXZta+H8Gzm2904qDjAOH04t8jhgLLQKbI4v/Q8mizynGeRNmT5NBnzyC1N4uCayfJCAFniRQ/iI26cUnrncazsGufQiZcD/GEXett19thEOOKhF5Q4+cPxxWFGjrR5KWCyhMWmpUuX+j26Pvjgg/WXEHQO4FQji0440qYz50iPVeCR43jRokV1+3CSmTpHGjDFaTRZ9EAve2mxZs0aHw9pEC9yyIeyOJzYQxjC87KEY5xz2Jgs+trCtKTL8GteaiBLnhAv9pK3cEGecKTLb+wgLOew1150sEcv8ghdSJOwhMMeRi7CgT904R4kPeIlffQiDC8/uA/IM2QJS1ykSV7wmzxiT7ykRZzcx8RHODhm2eRwZ6GkMCIgAqUkwBt0qzipgHkwaxMBERCBfhHgO8Q03rWJQFUI0IuK84LTY0Nx77jjDu/o4Lzg/HIdhwan2HpvcVpxZnGG6bnlPOF/8pOfeEcrTRZ5HC+cOGRxwllFmvM4VbfffnuLLE4Y100WpxVZnLGbN2/68zhWyKIT6aIvfzihrMAeytIbjeyNGzfqjjo6o1NSll5nZGl7kC62IovO9J4T/s477/TXLE1Ll/YLsji0xI2tyF67ds33OiP705/+1DvD3WSR4w/OOM+E//nPf+6dcMsfS5ceddLlBQA8eGGALL3d6EF45jfjwCdl6Q1GFicdWZxVZF999VV/P5B3M2fO9C8LODa94UzdiSxOujnayNIjb1MD77rrLm97KEve8YIBWRx6ZGn3wYtOFhx3GN5zzz3+BQd5YekmZXHOeTlAuujEqISsmxzurKQUTgREoHQEeGtJxUllTEXK0DNtIiACItAvAvSufO1rX3Ojo6MOp4OGKUNItYlAmQnQO8kzlt5tHEmGU3OME4WDR28hPbI4M/xxnd5E5HCUcYAIT28x8vfdd5+XxcGjZ5I4cFhxpOgVJg4cfJwinC+cdZx9ZBkWjVOMk4azjeOHc0h6xIHjT68me5wv0kQe2dmzZ/s0cBhxaOkNRW+cTuspRRZ7cOLQBUcPWfQnTmwhXhw9rtMG4ZhzyKI7ssRLj/7nPvc591//9V/u7rvvdt/85je9Y4izi144jcjhSCKLDVyDB+nBEbvpUOAavcY4wZyHAQ4leiOLDcjCADuRIw1+8wICR5XwyPKbXmbSgTNxwZkw6EwY9MduHHTyCSb8Jjx6MxSd/KXXG5bkh6VJnhAPoxBJA90JT1j+iAdZ4oYp9sGSMNiDLFMAOOaeIH3i5H5jj768sMAGHHjS4B4gP7GZeGFBXsCMeDgHZzghOxlnm7Ith7vMNZxsEwER6EjAKnkeyrxppXLXJgIiIAL9IkDj7tvf/rb7p3/6J9+IxpmgAalNBMpOgBfb9AbjuOB04Wi+/fbb3vnipRNO1SuvvOLefPNNPwf74sWLjjng9Jzi+DAvGyeKXlIcPuY3c8xzm9/IEh97k6WHmmsnTpzwc6rZowc9yMyxpvedOHjZ/tvf/tanxXxoPmf261//2utLLzRzuJnHzDG9sfwhiz7M237//fe9PvS2Isv8afTAwWOONM4Z4dELvTkmfez+4IMP6mlj73vvved7x3GC6SWnx9ecdhx/HEubU/7HP/7Rffjhh74nHtnf//73jrnYOIVvvfWW50fa6PjRRx/5NOnVRW/maX/88ceeGTrzm7ioj/gNS+wkLXTENv7QG3s/+eQTvycdZJnHjT30sKODtmYCcribeeiXCIhAhQjgaPMWljeYvJnlIahNBERABPpBgEYpQ0YZqvnFL37R3Xbbbe7LX/6ydzj6kZ7iFAERKD4BXhAwGo+ecXqJ1U4pZp7K4S5mvklrERCBHhBgKBJDnxhCxBAx3hBrEwEREIF+EKAXjSGZ9Fh96Utfcp///Od9vcMQV4Y2ahMBERCBJAGGWtvcaIY+MzJAW/EIyOEuXp5JYxEQgR4R4I0xc32Yu8MbZA3t7BFYRSMCItBCgGGczAtk8aW/+Zu/cX/1V3/lvve97/nfOOLaREAERCBJgPnO1A9MgWOIOkPdtRWPgBzu4uWZNBYBEegRARa+4CHGoiMsnqI3xz0Cq2hEQARaCNBwZjEkFiFi8SPmcX/3u9/1Pd4sZERPtzYREAERCAnQNqGdYouBUY9oKx4BOdzFyzNpLAIi0CMCzI3iQcbqmgzb4libCIiACPSDAAs/sZoujvU3vvEN38vNiuXM42Z0DU63NhEQAREICbDQGp0CfNWAKXAspqateATkcBcvz6SxCIhAjwjwphhnm4YuDzT1cPcIrKIRARFoIcAKvqwVwbdx+V7spz/9affDH/7Qfec73/GfrtELvxZkOiEClSfAJ6yY+kY7hc9hsaq6tuIRkMNdvDyTxiIgAj0iwKfAmFPJ/Cj+cLq1iYAIiECvCfzmN7/x01YYSfPjH//Yz91mscavfOUr/pvcrCdBD7g2ERABEQgJ8Am17du3+95tvq3Np8m0FY+AHO7i5Zk0FgER6BEBvvvJEE8+1UNjd+HChT2KWdGIgAiIQIMA37PlG9yrVq3yQ8pHR0cd3+C+9957vdPNSBvqIW0iIAIiEBLgG9r0bvN9cOoJPg2mrXgE5HAXL8+ksQiIQI8I0AjmW9w42rxFpgGsTQREQAR6TeDatWveocbp5tM+ONp33323r3vYM9qGXm7qI20iIAIiYASWL1/u15hh7jZtFD4vqK14BORwFy/PpLEIiECPCJw8edL3cK9YscL3cNPg1SYCIiACvSbAwke7du3yTjfzMFkACeebuZnM48bhZvXyffv29TppxScCIlBgAkePHnXPPPOMrxuoH65fv15ga6qruhzu6ua9LBeByhNgLhSLGD322GN+hXItmlb5W0IARKAvBHCoGQrKNBac7W9961uOniuOf/7znztG27COhOZn9gW/IhWBwhJgkTQ6A1j/gXqEoeXaikdADnfx8kwai4AI9IgADy6cbBq6mzZtcqdPn+5RzIpGBERABBoEeLHHwkc0nufNm+e/x83vBx54wC+gxp75mZzTJgIiIAJGgGkmfMFg3bp1fjrK8ePH7ZL2BSIgh7tAmSVVRUAEeksAh3t8fNw73axQrvmTveWr2ERABJx7/fXX/VxtViWnnsGxZogonyVk/YgvfelLfpQNQ8ppVP/2t78VNhEQARHwBDZu3OjbKUxFoY3y2muviUwBCcjhLmCmSWUREIHeEDh06JB/gJ06dcoxj5s5ltpEQAREoJcEXnrpJf9JH6au4HTzHW4WP2JeNz3fv/zlL93s2bMdn/xh2Ll6sHpJX3GJQLEJMPqOoeSMgtm6dau7detWsQ2qqPZyuCua8TJbBETA+YfYI4884udVbt682bGImjYREAER6CWBvXv3+mHkONoslMZcTHq2165d6xdrNGebughHXMPKe0lfcYlAsQkw8oVebpxtvnCgzwcWMz/lcBcz36S1CIhADwgwn3Lu3LmOhi69T1ohuAdQFYUIiEATgcOHD/sVyHG0cagZGjp//nzfu00DmrqHRjTDRfneLmG0iYAIiAAEWGcGh5t53Kw3oxEwxbwv5HAXM9+ktQiIQA8I0BCm8UtvE2+RGVquTQREQAR6SeDEiRN+FA2ONA1nFk1jaPmsWbN8bzc92vR82xcTmMetTQREQAQgQH3AyzpextE5oI6BYt4XcriLmW/SWgREoAcEGOrJvCgavixkhAOuTQREQAR6RYCFGWkor1q1yvdk8ymwn/3sZ36+Nr3cXKOHG6ebHm56sJjeol7uXuWA4hGBYhPYtm2bb5/Qw01v99WrV4ttUEW1l8Nd0YyX2SIgAs69+OKLfh4lvUs0cHmwaRMBERCBXhFgwTR6talfcKaZh4kTzirl9Fxxjm9zc56FGwnLH6NutImACIgAdQXONvXD0qVL/acFRaV4BORwFy/PpLEIiECPCLBKsD3MGM6pXqUegVU0IiACngDDyZm2QoOZ+gUnm3N8Hmz9+vVu5cqV9dE19H5rfqZuHBEQgZDA6dOnfR0xc+ZMv+aMhpSHdIpzLIe7OHklTUVABHpMgEXT6N1mWCcONz1L2kRABESg1wRwpBkO+vDDD7vnn3/e1znUO0xlGR8f73Vyik8ERKAkBI4cOeJf2jGPm5d3/NZWPAJyuIuXZ9JYBESgRwSOHTvme5rofWL+pBzuHoFVNCIgAm0J7N+/38/bZjg5fzjd2kRABEQgjQD1BaNj+KIBa87QbtFWPAJyuIuXZ9JYBESgRwR4cDFXkh4m5lCyAqg2ERABEegnAXq4mYtJQ5q6Z9myZf1MTnGLgAgUmABDynkxR73BAous+aCteATkcBcvz6SxCIhAjwi8++67bteuXX6YFg43f9pEQAREoJ8Ebt265RdopLdq586dbtOmTf1MTnGLgAgUmAAjYFjrAYebnu6TJ08W2Jrqqi6Hu7p5L8tFoPIEbt686edS0sNEo1cN38rfEgIgAn0ncO7cOb/iMCNq9AmwvuNWAiJQaAJ0CtDDzWdMOb527Vqh7amq8nK4q5rzslsERMBduHDBN3wZpsUCRlu2bBEVERABEegrAT4VxirlfOaHlcrp5dYmAiIgAmkEmPqGw80XDlh4cWJiIi2YzuWcgBzunGeQ1BMBEegfgRs3bjg+scGiaTzQDh061L/EFLMIiIAIRASuXLni9uzZ4xdqZFQNnwnTJgIiIAJpBJjqxou5VatW+Zd0p06dSgumczknIIc75xkk9URABPpH4O233/a9SzR+afjyTW5tIiACItBPAlevXnXbt2/3TjfzM/lCgjYREAERSCNA/YDTzSrljIy5dOlSWjCdyzkBOdw5zyCpJwIi0D8CDClfu3at79nmDTJDtrSJgAiIQD8JHD582C9+xNByeq1wvrWJgAiIQBoBOgOYdsIiizjeLLqorXgE5HAXL8+ksQiIQI8IMISct8bPPvusn7998ODBHsWsaERABEQgnQAjaliokU+CsWiahpSnc9JZERAB5z8hyPoyLJi2ZMkSp3ZKMe+K0jvc46OjbrzneTPhxsdG3cjIDDdjhv2NuNGxcTcR/RuL9kXa+sOoSASka1UJMLRzzpw5btGiRW7NmjX6vmVVbwTZLQIDJMDnfebOnetYpZwFG1l9WJsIiIAIpBFgqhvDyvkkGEPKjxw5khZM53JOoNwO98SYG5nRY4d7YtyN4miPjLqx8XClwNgJxwEfGYvc7oJs/WBUENOlpggwF2psbMy/QV68eLG+w61bQgREoO8EGFK+YMECt3DhQt9jpR7uviNXAiJQWAI426tXr/ZfUmGvxV2LmZUldrijnmbfA91Lhztytn2Pdoc4x0cL5HD3g1ExC4K0riYB5lDS6L333nvdo48+6g7fxc6RAAAgAElEQVQcOFBNELJaBERgYAQYUs58zFmzZvlG9HPPPTewtJWQCIhAsQjgcDMCj6+pMAXl5ZdfLpYB0tYTKK3DXXO2bbg3+8BJ9r3UI/Xh4CNRb3VTZ3Wbm2N8tBbfaJcR42lDtCcYgm7Dz8P0ou/pjY+OxD3xkQMcHfth6oRJ6JEtDuuBj3vZrUc+TNvHa872FBk16Z1IM6G3fopAXgnQw42jzfdwWS2Yh5k2ERABEegngRdffNEv0MiCaQwT3bZtWz+TU9wiIAIFJkD9QD1BfcHCrtQf2opHoLQON1lRc5CTjmutl3rUPOzIIa055yNurOM48Ay9223yf2IscqgjL91HjwNc7yUPnV6bAx5F4od5R45w4NlnjiOya4Jedv+CIU6rnjZD7JvjnRqjhN5NabaBoNMikEMC77zzju/V3rhxo3e4eahpEwEREIF+EqCHipd79FjRc0UPljYREAERSCPACJgnn3zSj4hhZAwjZLQVj0DlHG7vYAaOrM+yFAe3JSstTLv52d7JDXuLZ7gR78Hj9DY7/TjP9GKbGq1Ob+zQWoCor3vycWBBzeGu6cHvON7Ahta04xcV9bSRizazPzifJlsLrP9FoBgEGFLOokW8NWZuFI1fbSIgAiLQTwLMwQznZMrh7idtxS0CxSbAGg+sTs70N9Z+YA0IbcUjUDGHO+mANjKsq/NoDnXgrDakG0cMD58xI+qttvHgJmdDuoO9OcKtaScc7inF0dCJo4lwGH1gQ2va2Rm1yjanqV8ikHcC58+fr/c0bdiwwX8aLO86Sz8REIFiE2CVYVYbZkQNzjarEGsTAREQgTQCfMWAjgG+asDXDfjKgbbiEaiWwx330pqjG2ZXrde5uSc6vF7v4Y2c6U5Dz2vxBGG8s9wh3iiRVsc1zeGebByx9jaH288bj4fPd3K4J8GoVe8mYvohArkn8Morr/gVytevX++d7bVr1+ZeZykoAiJQbAJ8R5ceK76ry/d1ly5dWmyDpL0IiEDfCNDDzRSU8fFxt2zZMg0p7xvp/kZcLYc7HmIdzo02vF0dbhuOHfVQpznszfEkHe7G8HELF+5bHdc0h3uycZBC3Ftd727PMqS8JpOFUaveoVU6FoH8E/j444/d0aNH/Ztjepx2796df6WloQiIQKEJ3Lp1yy+UxnzMnTt3uk2bNhXaHikvAiLQPwLbt2/3C6YxBY5RMRpS3j/W/Yy5Yg53Wm9yDS/OYydH2oeyecwderlberhDGVuojcii86NxV3mr45pwuKcUR5SG710PnH97adCph9uLMRe9tUc9yahVbwzTJgLFIfDRRx/5t8WsVI7DzRtkbSIgAiLQTwJ8HYH65qGHHnJbt27Vomn9hK24RaDgBJh2wldUWCwN5/vq1asFt6ia6lfG4R4fs89kxSt1R06n+b+NVb0z3AR15zdy0KOe4+jrWPWNedJpK57XnPDmBdWY513zt2PnusnBjXuZA8d48nFEasVzv+1FAnb6VcqJN9IV+0OneXKM0vSuo9CBCBSCwNtvv+0YRr5y5Ur/QNPiRYXINikpAoUmcOrUKf8pQj7zw3QWnG5tIiACIpBGgCHljIKhfYLTfeXKlbRgOpdzAqV2uNvOu7Z5zfECZiOjDec7W35F387mu9ojjW95176dHX/+K3DCLb7kN7SbnW1zxulVjp1tW1ytyelu/pZ3ehzmyNdSri3iFsUff/u75mDzCbJYyfoLhGa56NtibnTE9OLlQsjInG27npA1o7UXgZwTwOFmARIWTKPHaceOHTnXWOqJgAgUncBE9Kae6St8HYG659ixY0U3SfqLgAj0iQDTTngxt2LFCt9OYWi5tuIRKLfDXbz8kMYiIAIDJPCnP/3JN3ZZBZTh5FoteIDwlZQIVJTAtWvX/IJp1Ds43Cyepk0EREAE0ggwb5tF01ilHKf73LlzacF0LucE5HDnPIOkngiIQH8JMCeKnm2cbVYA1bDy/vJW7CJQdQInT570ix8xusams1SdiewXARFIJ8Bwcnq5WWSR6ScsuqiteATkcBcvz6SxCIhADwmsWbPG9zDt27fPz5NimLk2ERABEegXAV7w8V1dm85y+vTpfiWleEVABApOgI4ARuDt37/ff0JQ3+EuZobK4S5mvklrERCBHhFYvXq1mzdvnu9poiHMZ8K0iYAIiEC/CDBnm94qVilnuCgNaW0iIAIikEaAFcqZesIfL+pUX6RRyv85Odz5zyNpKAIi0EcCLFy0dOlSP5x8yZIl7saNG31MTVGLgAhUncCRI0fcggULHJ8jZM9vbSIgAiKQRoDebZzuJ5980v+phzuNUv7PyeHOfx5JQxEQgT4S4EE2a9YsN3/+fD+X+/r1631MTVGLgAhUnQDTV+bOnetmzpzpG9IaUl71O0L2i0B7ArRRWOuBlcr5mgqfCdNWPAJyuIuXZ9JYBESghwR4gDG0k6HlGzdudFu2bOlh7IpKBERABJoJPPfcc35UDSsOP/XUU/o6QjMe/RIBEQgIMNWN4eSMxmNx10uXLgVXdVgUAnK4i5JT0lMERKAvBF5++WXfs03Dl789e/b0JR1FKgIiIAIQuHr1qv8ON/UNvVfbtm0TGBEQARFIJUCbhOHkjMKbM2eOrztSA+pkrgnI4c519kg5ERCBfhOg0ctwrbVr17rly5f7YVv9TlPxi4AIVJcAQ8r5pi6NaOZx03OlTQREQATSCJw5c8bXE0x9Gxsbc4cOHUoLpnM5JyCHO+cZJPVEQAT6S4AVP/n2NqsFM1zrwIED/U1QsYuACFSawPHjx/0QUV72MY1l9+7dleYh40VABNoToIebaW98wpRebi2a1p5Vnq/I4c5z7kg3ERCBvhNgSCdzKTdv3uyHlPOJMG0iIAIi0C8C1oDeunWrd7j5OoI2ERABEUgjwKdKmXbCKLyFCxe6gwcPpgXTuZwTkMOd8wySeiIgAv0lcP78eT+0c9myZX6oFg64NhEQARHoF4Fbt275BjTf4t65c6fbtGlTv5JSvCIgAgUnwBByercvXrzoR+JpREwxM1QOdzHzTVqLgAj0iMC5c+f8pzaYv83wcuZVahMBERCBfhF47bXX/DQWvsHNN3YZVq5NBERABNIIrFq1yn9F5dlnn/XT3l599dW0YDqXcwJyuHOeQVJPBESgvwQYqrV06VK/WjCf3mA+tzYREAER6BcB5nAzJ5PF0pjHrTqnX6QVrwgUn8CpU6f850q3b9/uWHDx2rVrxTeqghbI4a5gpstkERCBBoGXXnrJvzVmHjcO9wsvvNC4qCMREAER6DEBvqPLUHJWKF+/fr3ju9zaREAERCCNwN69e/3IO0bhMRqGUXnaikdADnfx8kwai4AI9JAA86IYSs5wLeZS8jZZmwiIgAj0i8D169d9TxW9VXwZgUWRtImACIhAGgH7msHq1asdCyyqUyCNUv7PyeHOfx5JQxEQgT4SOHnypHe0d+zY4Yd5Pvzww31MTVGLgAhUncDLL7/sFz/iRR+93PRcaRMBERCBNAJ0BDAihkUW+bIBiy5qKx4BOdzFy7OOGvPm68033+wYRhdFQAQaBPj+9pYtW/wwLYaVX716tXFRRyIgAiLQYwLUN3wNgaHlLNJ49uzZHqeg6ERABMpCgBdyrEx+5MgRx9dU1MNdzJyVw13MfKtrzfzTY8eOOb7rybATPh3AXpsIiEA2AgwlnzNnjlu0aJEfVn7gwIFsggolAiIgAlMgwDObOmf+/PmOhZBU50wBokREoCIE6AigY4DFFc35rojppTJTDneBsvOtt95yJ06cqDvYvOViiMmDDz7onQUe4LwBw4HQJgIikI0A5WXx4sV+xeB7773Xl69skgolAiIgApMnwCJpfBKM3u3777/fsSiSNhEQARFII8BaDyzoygKLLJrGNDhtxSMghzvHefab3/zGDznDsb5w4YLvveZTIps3b/ZvucxR+MUvfuH4Th9zT3ft2uV7uHkbpk0ERKA7AcrM3LlzHeWIcnPlypXuQgohAiIgAlMkwNxterfvuOMO9/jjjzsWbtQmAiIgAmkEHnvsMd/mx+FmzQeNiEmjlP9zcrhzlEc3btzwPdQ4AM8//7zvaeMbwQx1paBR6Jj3xZBx9pzjYY2zTRi+6cnCCjgNXNcmAiLQnQCrBNPL9Mgjj/iywxtkbSIgAiLQLwK8LKfO4SW5rUDcr7QUrwiIQLEJMH+bHm5GxNDb/frrrxfboIpqL4d7SBnPG+1XX33VnT9/3s/LwEFmaPi8efN8DzZOAG/BV65c6Z1qFkrA4eY88zg4Zr42v5m/zVzu48ePu9OnTw/JIiUrAsUkwCKDhw8f9s42DzVNyShmPkprESgKgV//+tf+5TrOtuqcouSa9BwmAZ7TOJqs0s0UDMoNPb1MpaQtvHbtWt925gsAjArl99tvv+3LGaPWbt686dvL9k3rQ4cO+ZFtdFrxx4t22tG0oZkzzUrgBw8edMRHZxgjS5ElXtoLY2NjvtOLji90YZg3srTVX3vtNa8bU0A5Jm7a6bTbmfa5cOFCL4McdQAdbMjScYZvgF20//ERaO/fdddd7utf/7q77bbb3Kc+9SnfsTbMvFDaUyMgh3tq3KYsRSFnhVJ6rvmmnr3pnjVrlv/NnGwKHAupjI+P+zdaFGh6vSmAFHZ6sLmmYeNTzgYJikCdAJ8D49uWvD1mz8NWmwiIgAj0iwA9VkwPo85ZunSpHybar7SKFO/777/vnRzaOrRvaC/R6TB79mzvVOEY4bBcvnzZs3vllVe8k4SjxBo3OEI4Njgy9ATSXmK6EHJ0auDI0MlB3DhDyLG/du2aY1497Sxk2ZM3zLOn/cUx8Z45c8Y7T8Tz4osvel1oryHLcwRZ2nbEz7og5lAx8hAnEKeNcKdOnfLtOeJAlvYeYbmOc8Y9waegOMc1Ftmjc4VzdKygC3KwwAElnMkzUos2JvFwjTD8xgazEXlYcR45rhE/rEmPY3QhH4iDtirH2IEMjijXkYUx5wjDdewnbdq2yDIEGp7YTR6QL2YbDihhiIPwhMHBZE+cOK/oQrzEQxjihi+/CWNxWi8w8SHDs9zaznRmEafJEi+yXMcWmyONXthF3sECTvfdd58PiyzOsU3rtPsTLhwbf2tDIHvPPfd4e7hGGK4RP/HgvBOG8+iB3iyIZn4B6ZIvhEX/L3/5y+5f//Vf3X/+5396nYtUrqVrjYAc7gHfCRQoGvQUQN7KUblQceBoU5ApeFaoKYgUZpxrzlMpaRMBEegtARo/9vDlYUhDZBCbvWSjXPPgpRFJw4T0+TQZb7zfeecd/7kyztOQodGAjjRAeTBbQ4XPC9EYob7gjTo20YtGg5TGCo0o/rDTegSYgkK8rA/Bwx95ZGmA8nafhinpIUdjgPQZBkuaNn2FMKRJOGRpDNKTQJzUW/zR+CEO6jjkaPxynp4DGq7ES4OXt/zs7YUjcdIAYm+NZmSJ69y5c74xDgvSPXr0qJ97DwfjRAMJ+xg1ZA1u7OATTDCm7kWWRijskeU6vKifacAxz5YGHX+wo4FOeOpjZGnMYivyXEeW+pv8pAeEBpM1Zmlcoye6kL/oAAOTRVfCkhdh7wk2ci/Ah2cGsjgiNP4nJiY8X2St4YmTgA7oCD/uBRrsNG7p6aGBSXzIEjd2ki/kIw07ZPmDH7025CnPLHpbkOUcxyaLTuQjvTY8s/iDLfcRfwybJi3CoAey6MX9xj1MnGGPD+wJRzo0jOGDLNxDWeyBA71CpGeNWjhhM89T6y0iHLLYRLrYA38a1pxDHpvJHxwj4iRfSRcuJku+8rwm300WeVijH1xhSLlDlvDYTvwcwwLZ22+/3d8vP/jBD9wPf/hDnx7pEid79OW+p3wZZ9JFFxwqnAHuN3TmfiGPcNJgiSwyxEMY4kGWfIYZ+UUZIp+4b9AHvQiHLHFiC2WBcMiyp9xzj3GPYw/n0Ifr/MZe7iPsRJY/OFP+kSNe2JP36MUxdiCDDUyN4zx/yCBLvLCFMU4R55Gn/sAWwmADe8LZdfuNjZyDC/oQH/Eji/NDXWE8iZd0sAeduJ+QgYnxIgz8YG060qYjXv6IF04cI4tdpIHtyFL2iZ9j7DWnkLQoC8RtsnBGV7OfOAhjOnCvoCfnSZNrJkvahKM+IW7Okzb3BWG5v0mfuInDZEnPygOyxI0Me+JElnSxgTzlL5QlPv44jzwypM29hW2USdihC9eRRT/SJW50QZbr5DFpcz+hK3LUE4QjDeJDlnzgPiIMspyHHWmTd9wL3N88B0jPeHFvED/5xz2ALPlHOSG/qbu4Rtw8q9kja8zhCwvyEFmYoCu28nziGrrOnDnTXyM97CIOZKnjqauRJR3uFe5l6mieO9jIGg9c++lPf+r+/d//3f3P//yP++pXv+rrqUG0UZRGbwnI4e4tz66x8WD85je/6e6++273pS99yY2OjrpPf/rT7u/+7u/8mysqQh7AFG4KKgWQhiAFlAcUFQOVCA0RjqkwKJg8UGhkUMjZE4aCn3xg81Ck8qFyoKJClocmjRsqDho69oCh0iAMOhCeBx57KjAqSCoOzlExURny4KYRQ0VHY5AwVHyEpyJij10myznSo0JBf2S5RqOFOEzWGgpUhpyn4oIFDStsoaJCFhbYYQ1u0kJ3KlkqY84jyzkaVthC3NgLX3ShorWHuT0kkOc8lTs6YSe2EA5ZHlA0UAjDH3qyp7Kl8iecPXTQE72wA5s5zznCIIOeXKNiRt5kLS2uY6fJkp9cwzauwY8KHFn0RzfiJRx2kB7H2AI3ZEnP4uUhyAMFO2FCvNwf2AE7jtnDjfiRJV7S4V5Cb/giyzXuD3QhXo6RJU1k0dV04l5Cb+LFPq5xf6ALcaIrssSJLPel6cR5k+U8f9wfxpBjwhBvKEuacPjRj37k/vu//9s3gil7HBMfuqEPspZ/xGH2cA6b0RO9sBnbkeUegCGypEO6Jst1k8UuGCNLGDjZvYVuhIWXycID1lb2yFt+EwZdqBOID1m794gbOfQOZZHhN3EgS1mCO7rZPWyysOAYe7gH0JVwpIUu1EdcJz50IE6T5d4yWe49uCBLWshSd/CbMMRDnMRD/lFWOI893PPw5Zg8RpY6iz18aMyRDyYLR5OlnJKXyBIWOwgPb+LCSUIfk8WGUJY8RpZzyFLPwhQZGkfEgSz5BUfCYRNlmzxGlusmC0/s5AUG+hAWWerCpCwyXCcOdIYnfHlxYmGxw2QJBysrM/xGHlbIku/Iog/nyXu4owdhySPsJV1+E448QpZ852WP6ZOU5d4wWeSJk7ixl3yn4Uqc/FneW35QP1hZ5RpMk7LEaX/oZLKkGcqSL/CgDHDPkC66pskiZ+WcMNxD5CHlxWThi07oDUfS5TdyhCFewpCn3DvcG1wjXfKVsJYHyOJwcw/97Gc/c9///vfdV77yFS/LPUt4OPOSCebES7rYQxzERd6iJ+lSTkgXW7mO7dzPpgeyPOvMdmTtXsRGZEkTOe4n7IOt1a+UQdJEHlkY8cd108HqA3TELpMh3wmLDsha3cl50kMPK1voaHojY2GRJQxxYitMuDeQ517FZrjhvKA3tsDfuCFr9wKy2Ej54TnOscnS9iJ+5ENZ7KE+5I+0uI9pK5C+yVIHmL7Iwor7CqeKfECWc9wTtFHgxXkcSMqicQpleUHJ/Y8sPLADWeLlPHrRC4pN5A+y7CnfpJuUpc2DLHUIecwXOYgbvtiMLFzhYLKcI104I8s1GCOL7eQfrAlHPMhRdsxeZPlDlvzhOrLYTjmAGbKkT/7zRz5bnsOa8gVfZLGXPfcdzGDKfcgxaSJPHnGvcV9bOUJnyiK2c87SYE+eowf3CPcD9RAcuEfIA1iRR9yb2IHu2I2dpE/eEIb7gfqPa8gjQx4RB2UZhuiO3ehDWoTlHkBXrmM356hjOY/dpve3v/1tP6z8n//5n92Pf/zjrr6GAuSPgBzuIeQJczF44H7nO99xP//5z91nP/tZ95nPfMY72pz7/Oc/7ysBKhsKLZUBhZqKhIJKgaSSolKh8qDQU2FRaKlAOLaKhorIHh7JBzYVSihrFTvnKej8NlkqF9K3Cpi0kLWHPelwjfNUrFTG6EEFQgXFnvBUvvaQNll7sHOeSoZKk2vIcIycyVKRWbqEp7JHLyo7HgboyTnCoIPJUlFS0fGb68iShlWOVMTwgbXJYg/HyFI5hrLYxjmrPKlIzQ7ygPwyWfQzWfTkGnL8IUeeGj/LA8LzcIYBeqAzshzDAFn0paK3By57yy9kicNkjRtxIAsnbCY9woT3CbKc4w8ehEcPmHFMfiJrdiJrec3DER2w0WSxn/sCWfKThxB5QxiYhbIcI4+sPZC4H9HfZNlbmFCW/LTz5Cvp0fhAlvRIF7sJA0+7x2DIW2NegpGu3RPIwstk4U16oSxlFBuIC1m7Fyl/8DJZ8hlZwlm6hIEd8SFrjIkTXiaLfiYXypJ3yPFHXiODLHqbLPlE/JY2aXCdvENvZMlnGJN36IQscpQnk2VvslxHb2TJQ5NF3mQpx1w31sgSjnuH+9SuoQtylDHyFVupP+w66WIbsuSd2Yw96Mq9Sj2ILOWIegu7LF3jQt6hG/HBEE7I0shBJ/LHekCwydKFKdeIn3P8oS+yOPHoRNw0qrALWeInXfIfe4gfOfQyWV7QIcc16vg0WfKAMMjCmzThRGPfdKIxZmXY0uWe5V4nDLLEjRx/NNjhRP7T8GVP/iPLHlnyzu45rpssL0LRifQoK/AMZSlnNEpJm/i4bo1tXsByHjusxwdZ8pE9ZZV8J21k4U2+kja9xXY/8SUBriVlyXfkkSVPkIUXL6vtPM4tvE2WvKKOId9xUNAF3jS4kaVXm3gJd+edd/p4keXe4hz1BA1p5JGFq8lev37dX+M++MlPfuLjTcrS9OC+QWdkYcX9wQgGOJIOOsONeCxdjrn30Bme2IS+3NO8YCePKD/M+4QbZY80SB+9SYeyTT6Sv6SJLCMwuGc4z71B/NRnJouNlFfCkLfcV8hSDrkn4W73M0xCWeKw+p/8oyxYXYUtyBGvOSfoTHroyz2MzdiKLLaZLLZwDptJE3ljBS/CIk/6JovO2GF1HYywlZdfMOKPtJHFRuLDXn6bLOWE+JAzWdJDb9IjLDZxf8ETe8kj0uW+4Rr6cm+SLjKEJRzH3A/UH/xGB+xEX3Sz+oZ0sRcu6EM47MQe+GAD+UtZ4DfXiJf6hvua9LmOTthHeOIkLWxGRxxIbMYe6gR0JQz3J/YTljiwm3TJS/TGZl42Ur9aXOas2z3GCw/sQ3ds4h5CV+ynM4UXBGYX+hEnNqILnUrYg12cp24iPGnRAcToDngTF3aRN/xxzKgiOFJWiYOOJeSpv9jb6CnuPe5Z+yNuRquQT9jGb+oXRsKgB3Ucv6ljuUb6Vj6Ig3ngsKHTjd+MkKKswxid+M2ecgMbWKIjzz6mS5AGdvGbUVraikdADvcQ8oy5GN/73vd8waIC/MIXvuB71ejtZs4HlSgVDD3gFFyGlRCOSoJKg4qACo4Khgc+lQqVGJUfBZxCTEVOOIai8DAinlCWAk2FS+VFZUfDBlkqFCpOKiZeBtjDnt/ERzxUBNaw5SFrFQuVDWlRif3yl7/0D3XCmyz6UwFTYVtDgTT5o6GAjehjDYWkLJUPFT2VLpW9yVJJYQOVN/ywPZRFb9hgF5UzbKm8rJLEBuK0RgZ6ms7IYh8PCx4s/PHgQ5YGCnoQJw1f7Apl4U04GJJmKEvFyW/O8zYTnklZ0oEnYUiDByPxUaHzm7R5eJKP6Gn5y55KmQekyfIbWSp7Y2+Nm6QsDwXuJ+KHi8nakFZYc98hT1r2BzMeWlw3WXMCcTDsPkVfk7W0keUhRF6EsuQxDzdrLMCJhz7h4UXaHFsjJilLTx/XYUH+IEtcxpprlCXkTBb7SZcHIfGTB9xTsMYGu7eQ5RjGSVkaDthG3pss9zZpkT7xct3uRzhbutyr6Mc9x/1Outzb1oA13siQdijLvYos9zp/yJLf8EF3ZEmfc9x/pE+6VoaxhzRNlrhpYKA7ssSBLiZLgwhZ7lVsw1b0Jl3iJk+RxVbkOOY88ibLfY0s+WOy2MW9hAyy6Eva6GOy1Fncm3DhvjBZ8oK4kYEFMuQVv4kXe5Hl3kzKcv9xHhlk0RW70YN4TZb4keVeJo+xl/sefZCx+wLdsZnGK7LkLXYhSxkyWeo+GGIbsqRF+tiMTiYLz1CW+5n7k7KNbXAkLeLAZnRClvuRfESWsgcrZEmf/CM9rpEWcWAzdQAsQllkkCUO7hHsIT3uL9Jij96UN2SpszlH3KEs9wnXSA+9SIs9aWOPySLHH3xJD2bkNc8R0kMGdsYF3cgDyi5x8WeyVu/w/DIZ9CQ/iIf4kSXuUJbygCzx8NxEhvxHT/bIYw/3sTkY8KdeRxZ9eT7wvEaG/IA7+rMRBnstXe4Z+CJHvPTqoTOMsJM4kCfPkQ115j5F1vKHZxrxGmdkKWf2PESWOhJ7ufeMEfGjP7JWjtGX8+hCnmOvjewiXdOLa+hNvNhiZZF7DKeK+5L6lWcR9xb3Gmlz/1JGSYc6Hzn0Iw7qLHOK0J1j8oJ7i2vESTjk0Yl7Gj7kK/cPThRlHntwVnDYYM41mPLHfcszDvsIi32kT7uGOEmPdgpxET/6YQfpcA/g6PHHfY2O/OFE0U7AVuJhegRckCEd9CEO2gPoxTn7Y1oPUyKQZ5gx022Ih3jRH5bEhaNHvNxfnOOPqUiE52UVL39YcIxwpMc5psYQzq6jN0z5Yx49Dh5tQRYps8/TkifYYzphD9OW0A8m/P3xj3/08jiXpPn73//eO5rwIyy6wJA26nvvvedliA+n9f/+7//cn/70J7/QGYudffTRR+7dd9/1eUI82kSg6ATkcA8pB6mseXjx5px5GQwpYwVCHloMHWFu1xe/+EV/zJAzHrrJh6WarhgAAAiCSURBVD2NBh4IPNzYU5ny4OQBRuMmfGBTWRKeBwNp0GjggZJ8YPPgyvKwp3EYNhR4cNE4RJaHNtfQGZ142PNAI00aRDxsaNxYIwNZGqU0pvgzWRpNPLx5aCKLDA864qDRQtzI8rBHjrRNloceD3geyMjCiIcozGGPLNd4QKMvvEyWBxoPf+KGmTVQ4AY/k6UhYrLohr2kwXnygQYSeUCjAh2Q5QFJuta4scYgDTIevOiDLI0O0oUBx/DjQUwcOAPYg82wQHeYwh9Z7MYW9MQOZMl/mBE/uqIX9hAHstwzyKIXcZIW6SDLfce9Qh7Bj7SNizlayBI3dpIWuiDLg9Z0Q4a44YJ+yJK3yBI35wmPLsjSgCC/zXFAX+4l4kAf8pE8osHFecLT0IURDSe40wjjHiJtuKCfNaSQJS1rCKILsjRE4E5c8CNuuKAf5Qx7kLXrNILQBVmOyWOuI0Pc3A/EgSz3B/nPdc7z8oTzyNPogR16wJ7rMEUHwnBPI8t1ztPoQhdkiQf70YHywHWYEgflzO47rnOehhX3OfeENd445hp/5pQjS/6TJtfJVxpr8OEaDUX0Rj9r+MKUOLiOTsjCnHyk0ce9RXhkSZv7wBrMNHo5RhaW3Ad2f9Kg4/4gLmscUmbs3uU+Ir+RJV5kuX+Ik5dy5CuyNBCxAfsJD1P+yE9kuQ4nrnOOBiJ80QM5GsbkBfESjnTIT2S5Rn5wnXM0JNEVPbEdPcgL4oUnYeGDLI1fflv9QoOW9LCBeNGD+wM7sQMZ0mdPOsRH3MRHAxxe3G/Icp28QCfsgDnhyQfCEgdxYws9u6SF/cSBHuQFssSHLcjxhyPAnnxBF34THvuxlUY7eQFfyiPypI0MjXf2lFXs5jfhubdgQVzkBbIwIU7SxnYa9OzRCztwLmjEYz+yHGM3stxvyJM2Mjgy6MB9i93EhTz2Y7c5KshiF/LojgxOBPywCd1xSFizgDICYxwKHAjyALuQxx5kcSLQn/sBWfRjwwbSRQ9sRid04494SRtnBf3gwW/SsPUdyD9bwdnuM/KNe5b0SZdj0iM+OONUkRaciIc/GGED55GnfOJskY8wRZ833njDO1Wkh76//e1vvVPFvcV9w3X0QeZ3v/udz0+7j4kLp4rz2IMThYMFD7jhgGkTAREQgbISkMM9pJzlIcPDn4cgD1CcKxvyhuOGw03vNE4kQ9JwzHmo0eiwBhwPNR58PEx5UPLw52FJA4Rz9sCm4cQDjgcqsjQ8eIDyFpPfPLyRpaFBQ4DGBA9bSy/5sCctHuI0IHmY0oDh4UujgvhoFNC4JT1kiYdzNDwIz1tLdOfBzAOatGkoEIY4aYDQyEGWYxqdNKQIz0Ob9GmYYTvy2EcY4kR3GhnIckx8NFQIzwOdOGgYcJ0/eBKGBg+600jivOlCXDClkcCeP7hhPzqRf9agQFdkiY/zxEWDhoaFNQiRo3GDTjRq0Iuw5Bey2MB54qJh9Ic//ME36DhGFvvhSTjiZk9eoRNcrKFFA+Z///d/PR/SJk3sJ1+Q4Rw2Yyey1kgiLvLyww8/9PpwTH7RQENH7hsamNiMncjCk/Pw4xpvpkmPY/TFBq4RhnsFm9ETWexCD/KP++DPf/6zb8QRDtkPPvignj/wgT/xwMLelsOP8B9//LHPJ+4JGoLYgK3ET3hstnuXtDjmOrI0BNGTNODEm3quI4secMBm7OK+o8xwjbQ++eQTz5o0kKURCU+uc9+QFjYji83EQ9zaREAEREAEREAEREAEyk9ADneO8hgHhYY6vUj0cPGGHYeQPT0iOJb0BNB41yYCIiACIiACIiACIiACIiACIpBvAnK4c5g/9IDR00jvKsPLcLoZCsYQVYYAc44/eqq1iYAIiIAIiIAIiIAIiIAIiIAI5JOAHO585ovXiqG8DAtnHiZzXm3uK3NYmXvIXD7OMTxZmwiIgAiIgAiIgAiIgAiIgAiIQL4IyOHOV36kaoNDzXxvnG4W6WLBK4ad28JGLHRjK4OmRqCTIiACIiACIiACIiACIiACIiACAycgh3vgyKeeIAtN4Vyz4jELkDHP23q6cci1iYAIiIAIiIAIiIAIiIAIiIAI5IeAHO785EVmTVhVmZWq+fQOi6nR282q1tpEQAREQAREQAREQAREQAREQATyQ0AOd37yYtKa0OPNJ8D4NrI2ERABERABERABERABERABERCBfBGQw52v/JiSNnw7WJsIiIAIiIAIiIAIiIAIiIAIiEC+CMjhzld+SBsREAEREAEREAEREAEREAEREIGSEJDDXZKMlBkiIAIiIAIiIAIiIAIiIAIiIAL5IiCHO1/5IW1EQAREQAREQAREQAREQAREQARKQkAOd0kyUmaIgAiIgAiIgAiIgAiIgAiIgAjki4Ac7nzlh7QRAREQAREQAREQAREQAREQAREoCQE53CXJSJkhAiIgAiIgAiIgAiIgAiIgAiKQLwJyuPOVH9JGBERABERABERABERABERABESgJATkcJckI2WGCIiACIiACIiACIiACIiACIhAvgjI4c5XfkgbERABERABERABERABERABERCBkhCQw12SjJQZIiACIiACIiACIiACIiACIiAC+SIghztf+SFtREAEREAEREAEREAEREAEREAESkJADndJMlJmiIAIiIAIiIAIiIAIiIAIiIAI5IuAHO585Ye0EQEREAEREAEREAEREAEREAERKAkBOdwlyUiZIQIiIAIiIAIiIAIiIAIiIAIikC8CcrjzlR/SRgREQAREQAREQAREQAREQAREoCQE5HCXJCNlhgiIgAiIgAiIgAiIgAiIgAiIQL4IyOHOV35IGxEQAREQAREQAREQAREQAREQgZIQkMNdkoyUGSIgAiIgAiIgAiIgAiIgAiIgAvki8P8BFn3bID6UUW4AAAAASUVORK5CYII="}}},{"cell_type":"markdown","source":"Main idea: shared layers are disturbed with two different losses and  discriminators cant overfit quickly\n\nRelated works: \n\n[Nguyen, T. et al. «Dual Discriminator Generative Adversarial Nets.» NIPS (2017).](https://arxiv.org/abs/1709.03831) - but discriminators have no shared layers there.\n\n[Hoang, Q., Nguyen, T., Le, T., & Phung, D.Q. (2017). Multi-Generator Generative Adversarial Nets. ArXiv, abs/1708.02556](https://arxiv.org/abs/1708.02556) - discriminator and classificator have shared layers, but they are not both discriminators with different losses","metadata":{}},{"cell_type":"code","source":"BATCH_SIZE = 32\n\nimport tensorflow as tf\nfrom tensorflow import keras\nfrom tensorflow.keras import layers\nimport tensorflow_addons as tfa\n\nimport matplotlib.pyplot as plt\nimport numpy as np\nimport re\ntry:\n    from kaggle_datasets import KaggleDatasets\nexcept:\n    pass","metadata":{"papermill":{"duration":6.682951,"end_time":"2021-05-03T04:05:28.79917","exception":false,"start_time":"2021-05-03T04:05:22.116219","status":"completed"},"tags":[],"id":"individual-handy","execution":{"iopub.status.busy":"2022-10-26T19:42:47.203831Z","iopub.execute_input":"2022-10-26T19:42:47.204746Z","iopub.status.idle":"2022-10-26T19:42:54.166040Z","shell.execute_reply.started":"2022-10-26T19:42:47.204644Z","shell.execute_reply":"2022-10-26T19:42:54.165165Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"try:\n    tpu = tf.distribute.cluster_resolver.TPUClusterResolver()\n    print('Device:', tpu.master())\n    tf.config.experimental_connect_to_cluster(tpu)\n    tf.tpu.experimental.initialize_tpu_system(tpu)\n    strategy = tf.distribute.experimental.TPUStrategy(tpu)\nexcept:\n    strategy = tf.distribute.get_strategy()\nprint('Number of replicas:', strategy.num_replicas_in_sync)\n\nAUTOTUNE = tf.data.experimental.AUTOTUNE\nAUTO = tf.data.experimental.AUTOTUNE    \nprint(tf.__version__)","metadata":{"papermill":{"duration":6.164365,"end_time":"2021-05-03T04:05:34.988047","exception":false,"start_time":"2021-05-03T04:05:28.823682","status":"completed"},"tags":[],"id":"external-girlfriend","outputId":"83bc1eee-0a75-4189-a125-72368285feb2","execution":{"iopub.status.busy":"2022-10-26T19:42:54.169344Z","iopub.execute_input":"2022-10-26T19:42:54.169687Z","iopub.status.idle":"2022-10-26T19:43:00.164062Z","shell.execute_reply.started":"2022-10-26T19:42:54.169645Z","shell.execute_reply":"2022-10-26T19:43:00.162878Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"GCS_PATH = KaggleDatasets().get_gcs_path(\"gan-getting-started\")\n\nMONET_FILENAMES = tf.io.gfile.glob(str(GCS_PATH + '/monet_tfrec/*.tfrec'))\nPHOTO_FILENAMES = tf.io.gfile.glob(str(GCS_PATH + '/photo_tfrec/*.tfrec'))\n","metadata":{"papermill":{"duration":1.039093,"end_time":"2021-05-03T04:05:36.052642","exception":false,"start_time":"2021-05-03T04:05:35.013549","status":"completed"},"tags":[],"id":"atmospheric-vampire","outputId":"5b6d0bd6-57be-41df-ec98-b620b7909610","execution":{"iopub.status.busy":"2022-10-26T19:43:00.165467Z","iopub.execute_input":"2022-10-26T19:43:00.165747Z","iopub.status.idle":"2022-10-26T19:43:00.797203Z","shell.execute_reply.started":"2022-10-26T19:43:00.165715Z","shell.execute_reply":"2022-10-26T19:43:00.796404Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def data_augment_flip(image):\n    image = tf.image.random_flip_left_right(image)\n    return image","metadata":{"execution":{"iopub.status.busy":"2022-10-26T19:43:00.799419Z","iopub.execute_input":"2022-10-26T19:43:00.799678Z","iopub.status.idle":"2022-10-26T19:43:00.804652Z","shell.execute_reply.started":"2022-10-26T19:43:00.799651Z","shell.execute_reply":"2022-10-26T19:43:00.803684Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"IMAGE_SIZE = [256, 256]\n\ndef decode_image(image):\n    image = tf.image.decode_jpeg(image, channels=3)\n    image = (tf.cast(image, tf.float32) / 127.5) - 1\n    image = tf.reshape(image, [*IMAGE_SIZE, 3])\n    return image\n\ndef read_tfrecord(example):\n    tfrecord_format = {\n        \"image\": tf.io.FixedLenFeature([], tf.string)\n    }\n    example = tf.io.parse_single_example(example, tfrecord_format)\n    image = decode_image(example['image'])\n    return image","metadata":{"papermill":{"duration":0.04111,"end_time":"2021-05-03T04:05:36.119243","exception":false,"start_time":"2021-05-03T04:05:36.078133","status":"completed"},"tags":[],"id":"labeled-aerospace","execution":{"iopub.status.busy":"2022-10-26T19:43:00.805922Z","iopub.execute_input":"2022-10-26T19:43:00.806404Z","iopub.status.idle":"2022-10-26T19:43:00.818808Z","shell.execute_reply.started":"2022-10-26T19:43:00.806361Z","shell.execute_reply":"2022-10-26T19:43:00.817460Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def load_dataset(filenames):\n    dataset = tf.data.TFRecordDataset(filenames)\n    dataset = dataset.map(read_tfrecord, num_parallel_calls=AUTOTUNE)\n    return dataset\n\nmonet_ds = load_dataset(MONET_FILENAMES).batch(1)\nphoto_ds = load_dataset(PHOTO_FILENAMES).batch(1)\n\n\nfast_photo_ds = load_dataset(PHOTO_FILENAMES).batch(32*strategy.num_replicas_in_sync).prefetch(32)\nfid_photo_ds = load_dataset(PHOTO_FILENAMES).take(1024).batch(32*strategy.num_replicas_in_sync).prefetch(32)\nfid_monet_ds = load_dataset(MONET_FILENAMES).batch(32*strategy.num_replicas_in_sync).prefetch(32)","metadata":{"papermill":{"duration":0.266134,"end_time":"2021-05-03T04:05:36.475007","exception":false,"start_time":"2021-05-03T04:05:36.208873","status":"completed"},"tags":[],"id":"automatic-kernel","execution":{"iopub.status.busy":"2022-10-26T19:43:00.822718Z","iopub.execute_input":"2022-10-26T19:43:00.822980Z","iopub.status.idle":"2022-10-26T19:43:01.053131Z","shell.execute_reply.started":"2022-10-26T19:43:00.822954Z","shell.execute_reply":"2022-10-26T19:43:01.052337Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def get_gan_dataset(monet_files, photo_files, augment=None, repeat=True, shuffle=True, batch_size=1):\n\n    monet_ds = load_dataset(monet_files)\n    photo_ds = load_dataset(photo_files)\n    \n\n        \n    if repeat:\n        monet_ds = monet_ds.repeat()\n        photo_ds = photo_ds.repeat()\n    if shuffle:\n        monet_ds = monet_ds.shuffle(2048)\n        photo_ds = photo_ds.shuffle(2048)\n        \n    monet_ds = monet_ds.batch(batch_size, drop_remainder=True)\n    photo_ds = photo_ds.batch(batch_size, drop_remainder=True)\n#     monet_ds = monet_ds.cache()\n#     photo_ds = photo_ds.cache()\n    if augment:\n        monet_ds = monet_ds.map(augment, num_parallel_calls=AUTO)\n        photo_ds = photo_ds.map(augment, num_parallel_calls=AUTO)\n        \n    monet_ds = monet_ds.prefetch(AUTO)\n    photo_ds = photo_ds.prefetch(AUTO)\n    \n    gan_ds = tf.data.Dataset.zip((monet_ds, photo_ds))\n    \n    return gan_ds\n\ndef get_photo_dataset(photo_files, augment=None, repeat=False, shuffle=False, batch_size=1):\n\n\n    photo_ds = load_dataset(photo_files)\n    \n\n        \n    if repeat:\n        photo_ds = photo_ds.repeat()\n    if shuffle:\n        photo_ds = photo_ds.shuffle(2048)\n\n\n        \n    photo_ds = photo_ds.batch(batch_size, drop_remainder=True)\n#     monet_ds = monet_ds.cache()\n#     photo_ds = photo_ds.cache()\n    if augment:\n        photo_ds = photo_ds.map(augment, num_parallel_calls=AUTO)\n    \n    photo_ds = photo_ds.prefetch(AUTO)\n    \n    \n    return photo_ds\n\n","metadata":{"papermill":{"duration":0.037798,"end_time":"2021-05-03T04:05:36.538454","exception":false,"start_time":"2021-05-03T04:05:36.500656","status":"completed"},"tags":[],"id":"dynamic-consumption","execution":{"iopub.status.busy":"2022-10-26T19:43:01.054692Z","iopub.execute_input":"2022-10-26T19:43:01.054925Z","iopub.status.idle":"2022-10-26T19:43:01.065220Z","shell.execute_reply.started":"2022-10-26T19:43:01.054897Z","shell.execute_reply":"2022-10-26T19:43:01.064273Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"final_dataset = get_gan_dataset(MONET_FILENAMES, PHOTO_FILENAMES, augment=data_augment_flip, repeat=True, shuffle=True, batch_size=BATCH_SIZE)","metadata":{"papermill":{"duration":0.086784,"end_time":"2021-05-03T04:05:36.651728","exception":false,"start_time":"2021-05-03T04:05:36.564944","status":"completed"},"tags":[],"id":"collaborative-impression","execution":{"iopub.status.busy":"2022-10-26T19:43:01.066562Z","iopub.execute_input":"2022-10-26T19:43:01.066792Z","iopub.status.idle":"2022-10-26T19:43:01.241204Z","shell.execute_reply.started":"2022-10-26T19:43:01.066767Z","shell.execute_reply":"2022-10-26T19:43:01.239736Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"with strategy.scope():\n\n    inception_model = tf.keras.applications.InceptionV3(input_shape=(256,256,3),pooling=\"avg\",include_top=False)\n\n    mix3  = inception_model.get_layer(\"mixed9\").output\n    f0 = tf.keras.layers.GlobalAveragePooling2D()(mix3)\n\n    inception_model = tf.keras.Model(inputs=inception_model.input, outputs=f0)\n    inception_model.trainable = False\n\n    \n    \n    def calculate_activation_statistics_mod(images,fid_model):\n\n            act=tf.cast(fid_model.predict(images), tf.float32)\n\n            mu = tf.reduce_mean(act, axis=0)\n            mean_x = tf.reduce_mean(act, axis=0, keepdims=True)\n            mx = tf.matmul(tf.transpose(mean_x), mean_x)\n            vx = tf.matmul(tf.transpose(act), act)/tf.cast(tf.shape(act)[0], tf.float32)\n            sigma = vx - mx\n            return mu, sigma\n    myFID_mu2, myFID_sigma2 = calculate_activation_statistics_mod(fid_monet_ds,inception_model)        \n    fids=[]\n","metadata":{"papermill":{"duration":30.966971,"end_time":"2021-05-03T04:06:07.64481","exception":false,"start_time":"2021-05-03T04:05:36.677839","status":"completed"},"tags":[],"id":"enabling-rehabilitation","outputId":"a74dd122-3c29-49e3-d0e1-b489226d014e","execution":{"iopub.status.busy":"2022-10-26T19:43:01.242698Z","iopub.execute_input":"2022-10-26T19:43:01.243054Z","iopub.status.idle":"2022-10-26T19:43:31.997718Z","shell.execute_reply.started":"2022-10-26T19:43:01.243008Z","shell.execute_reply":"2022-10-26T19:43:31.996466Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"with strategy.scope():\n    def calculate_frechet_distance(mu1,sigma1,mu2,sigma2):\n        fid_epsilon = 1e-14\n       \n        covmean = tf.linalg.sqrtm(tf.cast(tf.matmul(sigma1,sigma2),tf.complex64))\n#         isgood=tf.cast(tf.math.is_finite(covmean), tf.int32)\n#         if tf.size(isgood)!=tf.math.reduce_sum(isgood):\n#             return 0\n\n        covmean = tf.cast(tf.math.real(covmean),tf.float32)\n  \n        tr_covmean = tf.linalg.trace(covmean)\n\n\n        return tf.matmul(tf.expand_dims(mu1 - mu2, axis=0),tf.expand_dims(mu1 - mu2, axis=1)) + tf.linalg.trace(sigma1) + tf.linalg.trace(sigma2) - 2 * tr_covmean\n\n\n    \n    \n    def FID(images,gen_model,inception_model=inception_model,myFID_mu2=myFID_mu2, myFID_sigma2=myFID_sigma2):\n                inp = layers.Input(shape=[256, 256, 3], name='input_image')\n                x  = gen_model(inp)\n                x=inception_model(x)\n                fid_model = tf.keras.Model(inputs=inp, outputs=x)\n                \n                mu1, sigma1= calculate_activation_statistics_mod(images,fid_model)\n\n                fid_value = calculate_frechet_distance(mu1, sigma1,myFID_mu2, myFID_sigma2)\n\n\n                return fid_value","metadata":{"papermill":{"duration":0.045472,"end_time":"2021-05-03T04:06:07.720198","exception":false,"start_time":"2021-05-03T04:06:07.674726","status":"completed"},"tags":[],"id":"subsequent-franklin","execution":{"iopub.status.busy":"2022-10-26T19:43:32.001938Z","iopub.execute_input":"2022-10-26T19:43:32.002218Z","iopub.status.idle":"2022-10-26T19:43:32.012566Z","shell.execute_reply.started":"2022-10-26T19:43:32.002185Z","shell.execute_reply":"2022-10-26T19:43:32.011322Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"OUTPUT_CHANNELS = 3\n\ndef down_sample(filters, size, apply_instancenorm=True):\n    initializer = tf.random_normal_initializer(0., 0.02)\n    gamma_init = keras.initializers.RandomNormal(mean=0.0, stddev=0.02)\n\n    layer = keras.Sequential()\n    layer.add(layers.Conv2D(filters, size, strides=2, padding='same', kernel_initializer=initializer, use_bias=False))\n\n    if apply_instancenorm:\n        layer.add(tfa.layers.InstanceNormalization(gamma_initializer=gamma_init))\n\n    layer.add(layers.LeakyReLU())\n\n    return layer","metadata":{"papermill":{"duration":0.039575,"end_time":"2021-05-03T04:06:07.790381","exception":false,"start_time":"2021-05-03T04:06:07.750806","status":"completed"},"tags":[],"id":"static-fluid","execution":{"iopub.status.busy":"2022-10-26T19:43:32.013894Z","iopub.execute_input":"2022-10-26T19:43:32.014149Z","iopub.status.idle":"2022-10-26T19:43:32.029905Z","shell.execute_reply.started":"2022-10-26T19:43:32.014120Z","shell.execute_reply":"2022-10-26T19:43:32.028661Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def up_sample(filters, size, apply_dropout=False):\n    initializer = tf.random_normal_initializer(0., 0.02)\n    gamma_init = keras.initializers.RandomNormal(mean=0.0, stddev=0.02)\n\n    layer = keras.Sequential()\n    layer.add(layers.Conv2DTranspose(filters, size, strides=2, padding='same', kernel_initializer=initializer,use_bias=False))\n    layer.add(tfa.layers.InstanceNormalization(gamma_initializer=gamma_init))\n\n    if apply_dropout:\n        layer.add(layers.Dropout(0.5))\n\n    layer.add(layers.ReLU())\n\n    return layer","metadata":{"papermill":{"duration":0.04203,"end_time":"2021-05-03T04:06:07.862571","exception":false,"start_time":"2021-05-03T04:06:07.820541","status":"completed"},"tags":[],"id":"fewer-playlist","execution":{"iopub.status.busy":"2022-10-26T19:43:32.031332Z","iopub.execute_input":"2022-10-26T19:43:32.031876Z","iopub.status.idle":"2022-10-26T19:43:32.043030Z","shell.execute_reply.started":"2022-10-26T19:43:32.031820Z","shell.execute_reply":"2022-10-26T19:43:32.042040Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def Generator():\n    inputs = layers.Input(shape=[256,256,3])\n    down_stack = [\n        down_sample(64, 4, apply_instancenorm=False),# (size, 128, 128, 64)\n        down_sample(128, 4),                         # (size, 64, 64, 128)\n        down_sample(256, 4),                         # (size, 32, 32, 256)\n        down_sample(512, 4),                         # (size, 16, 16, 512)\n        down_sample(512, 4),                         # (size, 8, 8, 512)\n        down_sample(512, 4),                         # (size, 4, 4, 512)\n        down_sample(512, 4),                         # (size, 2, 2, 512)\n        down_sample(512, 4),                         # (size, 1, 1, 512)\n    ]\n\n    up_stack = [\n        up_sample(512, 4, apply_dropout=True),       # (size, 2, 2, 1024)\n        up_sample(512, 4, apply_dropout=True),       # (size, 4, 4, 1024)\n        up_sample(512, 4, apply_dropout=True),       # (size, 8, 8, 1024)\n        up_sample(512, 4),                           # (size, 16, 16, 1024)\n        up_sample(256, 4),                           # (size, 32, 32, 512)\n        up_sample(128, 4),                           # (size, 64, 64, 256)\n        up_sample(64, 4),                            # (size, 128, 128, 128)\n    ]\n\n    initializer = tf.random_normal_initializer(0., 0.02)\n    last = layers.Conv2DTranspose(3, 4, strides=2, padding='same', kernel_initializer=initializer, activation='tanh') \n    # (size, 256, 256, 3)\n\n    x = inputs\n\n    # Downsampling through the model\n    skips = []\n    for down in down_stack:\n        x = down(x)\n        skips.append(x)\n\n    skips = reversed(skips[:-1])\n\n    # Upsampling and establishing the skip connections\n    for up, skip in zip(up_stack, skips):\n        x = up(x)\n        x = layers.Concatenate()([x, skip])\n\n    x = last(x)\n\n    return keras.Model(inputs=inputs, outputs=x)","metadata":{"papermill":{"duration":0.047878,"end_time":"2021-05-03T04:06:07.940505","exception":false,"start_time":"2021-05-03T04:06:07.892627","status":"completed"},"tags":[],"id":"judicial-petite","execution":{"iopub.status.busy":"2022-10-26T19:43:32.044572Z","iopub.execute_input":"2022-10-26T19:43:32.045035Z","iopub.status.idle":"2022-10-26T19:43:32.064953Z","shell.execute_reply.started":"2022-10-26T19:43:32.044991Z","shell.execute_reply":"2022-10-26T19:43:32.063975Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Headless discriminator (shared part)","metadata":{}},{"cell_type":"code","source":"def Discriminator():\n    initializer = tf.random_normal_initializer(0., 0.02)\n    gamma_init = keras.initializers.RandomNormal(mean=0.0, stddev=0.02)\n    \n    inp = layers.Input(shape=[256, 256, 3], name='input_image')\n    x = inp\n    \n    down1 = down_sample(64, 4, False)(x)       # (size, 128, 128, 64)\n    down2 = down_sample(128, 4)(down1)         # (size, 64, 64, 128)\n    down3 = down_sample(256, 4)(down2)         # (size, 32, 32, 256)\n\n    zero_pad1 = layers.ZeroPadding2D()(down3) # (size, 34, 34, 256)\n    conv = layers.Conv2D(512, 4, strides=1, kernel_initializer=initializer, use_bias=False)(zero_pad1) # (size, 31, 31, 512)\n\n    norm1 = tfa.layers.InstanceNormalization(gamma_initializer=gamma_init)(conv)\n    leaky_relu = layers.LeakyReLU()(norm1)\n    zero_pad2 = layers.ZeroPadding2D()(leaky_relu) # (size, 33, 33, 512)\n\n    return tf.keras.Model(inputs=inp, outputs=zero_pad2)","metadata":{"papermill":{"duration":0.043275,"end_time":"2021-05-03T04:06:08.014899","exception":false,"start_time":"2021-05-03T04:06:07.971624","status":"completed"},"tags":[],"id":"sudden-directory","execution":{"iopub.status.busy":"2022-10-26T19:43:32.066263Z","iopub.execute_input":"2022-10-26T19:43:32.066774Z","iopub.status.idle":"2022-10-26T19:43:32.083935Z","shell.execute_reply.started":"2022-10-26T19:43:32.066741Z","shell.execute_reply":"2022-10-26T19:43:32.083093Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Head for two-objective discriminator for Monet","metadata":{}},{"cell_type":"code","source":"def DHead():\n    initializer = tf.random_normal_initializer(0., 0.02)\n    \n    inp = layers.Input(shape=[33, 33, 512], name='input_image')\n    x = inp\n    \n    last = layers.Conv2D(1, 4, strides=1, kernel_initializer=initializer)(x) # (size, 30, 30, 1)\n\n    return tf.keras.Model(inputs=inp, outputs=last)","metadata":{"papermill":{"duration":0.039997,"end_time":"2021-05-03T04:06:08.085191","exception":false,"start_time":"2021-05-03T04:06:08.045194","status":"completed"},"tags":[],"id":"extreme-invention","execution":{"iopub.status.busy":"2022-10-26T19:43:32.085150Z","iopub.execute_input":"2022-10-26T19:43:32.086020Z","iopub.status.idle":"2022-10-26T19:43:32.105967Z","shell.execute_reply.started":"2022-10-26T19:43:32.085975Z","shell.execute_reply":"2022-10-26T19:43:32.104699Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Discriminator for Photos (unchanged)","metadata":{}},{"cell_type":"code","source":"def DiscriminatorP():\n    initializer = tf.random_normal_initializer(0., 0.02)\n    gamma_init = keras.initializers.RandomNormal(mean=0.0, stddev=0.02)\n    \n    inp = layers.Input(shape=[256, 256, 3], name='input_image')\n    x = inp\n    \n    down1 = down_sample(64, 4, False)(x)       # (size, 128, 128, 64)\n    down2 = down_sample(128, 4)(down1)         # (size, 64, 64, 128)\n    down3 = down_sample(256, 4)(down2)         # (size, 32, 32, 256)\n\n    zero_pad1 = layers.ZeroPadding2D()(down3) # (size, 34, 34, 256)\n    conv = layers.Conv2D(512, 4, strides=1, kernel_initializer=initializer, use_bias=False)(zero_pad1) # (size, 31, 31, 512)\n\n    norm1 = tfa.layers.InstanceNormalization(gamma_initializer=gamma_init)(conv)\n    leaky_relu = layers.LeakyReLU()(norm1)\n    zero_pad2 = layers.ZeroPadding2D()(leaky_relu) # (size, 33, 33, 512)\n    last = layers.Conv2D(1, 4, strides=1, kernel_initializer=initializer)(zero_pad2) # (size, 30, 30, 1)\n\n    return tf.keras.Model(inputs=inp, outputs=last)","metadata":{"papermill":{"duration":0.044783,"end_time":"2021-05-03T04:06:08.16026","exception":false,"start_time":"2021-05-03T04:06:08.115477","status":"completed"},"tags":[],"id":"protecting-fusion","execution":{"iopub.status.busy":"2022-10-26T19:43:32.107380Z","iopub.execute_input":"2022-10-26T19:43:32.108223Z","iopub.status.idle":"2022-10-26T19:43:32.122082Z","shell.execute_reply.started":"2022-10-26T19:43:32.108185Z","shell.execute_reply":"2022-10-26T19:43:32.120119Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"with strategy.scope():\n    monet_generator = Generator() # transforms photos to Monet-esque paintings\n    photo_generator = Generator() # transforms Monet paintings to be more like photos\n\n    monet_discriminator = Discriminator() # differentiates real Monet paintings and generated Monet paintings\n    photo_discriminator = DiscriminatorP() # differentiates real photos and generated photos\n    dHead1 = DHead() # Head for BCE\n    dHead2 = DHead() # Head for hinge loss\n","metadata":{"papermill":{"duration":10.251708,"end_time":"2021-05-03T04:06:18.443074","exception":false,"start_time":"2021-05-03T04:06:08.191366","status":"completed"},"tags":[],"id":"compliant-strike","execution":{"iopub.status.busy":"2022-10-26T19:43:32.123871Z","iopub.execute_input":"2022-10-26T19:43:32.124172Z","iopub.status.idle":"2022-10-26T19:43:42.388704Z","shell.execute_reply.started":"2022-10-26T19:43:32.124133Z","shell.execute_reply":"2022-10-26T19:43:42.387418Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# CycleGAN with DiffAugment and two-objective discriminator","metadata":{}},{"cell_type":"code","source":"class CycleGan(keras.Model):\n    def __init__(\n        self,\n        monet_generator,\n        photo_generator,\n        monet_discriminator,\n        photo_discriminator,\n        dhead1,        \n        dhead2,        \n        lambda_cycle=3,\n        lambda_id=3,\n    ):\n        super(CycleGan, self).__init__()\n        self.m_gen = monet_generator\n        self.p_gen = photo_generator\n        self.m_disc = monet_discriminator\n        self.p_disc = photo_discriminator\n        self.lambda_cycle = lambda_cycle\n        self.lambda_id = lambda_id\n        self.dhead1 = dhead1\n        self.dhead2 = dhead2\n        \n    def compile(\n        self,\n        m_gen_optimizer,\n        p_gen_optimizer,\n        m_disc_optimizer,\n        p_disc_optimizer,\n        gen_loss_fn1,\n        gen_loss_fn2,\n        disc_loss_fn1,\n        disc_loss_fn2,\n        cycle_loss_fn,\n        identity_loss_fn,\n        aug_fn,\n\n    ):\n        super(CycleGan, self).compile()\n        self.m_gen_optimizer = m_gen_optimizer\n        self.p_gen_optimizer = p_gen_optimizer\n        self.m_disc_optimizer = m_disc_optimizer\n        self.p_disc_optimizer = p_disc_optimizer\n        self.gen_loss_fn1 = gen_loss_fn1\n        self.gen_loss_fn2 = gen_loss_fn2\n        self.disc_loss_fn1 = disc_loss_fn1\n        self.disc_loss_fn2 = disc_loss_fn2\n        self.cycle_loss_fn = cycle_loss_fn\n        self.identity_loss_fn = identity_loss_fn\n        self.aug_fn = aug_fn\n\n        self.step_num = 0\n        \n    def train_step(self, batch_data):\n        real_monet, real_photo = batch_data\n        batch_size = tf.shape(real_monet)[0]\n        with tf.GradientTape(persistent=True) as tape:\n        \n            # photo to monet back to photo\n            fake_monet = self.m_gen(real_photo, training=True)\n            cycled_photo = self.p_gen(fake_monet, training=True)\n\n            # monet to photo back to monet\n            fake_photo = self.p_gen(real_monet, training=True)\n            cycled_monet = self.m_gen(fake_photo, training=True)\n\n            # generating itself\n            same_monet = self.m_gen(real_monet, training=True)\n            same_photo = self.p_gen(real_photo, training=True)\n\n            \n            \n            # Diffaugment\n            both_monet = tf.concat([real_monet, fake_monet], axis=0)            \n            \n            aug_monet = self.aug_fn(both_monet)\n            \n            aug_real_monet = aug_monet[:batch_size]\n            aug_fake_monet = aug_monet[batch_size:]\n            \n            \n            # two-objective discriminator\n            disc_fake_monet1 = self.dhead1(self.m_disc(aug_fake_monet, training=True), training=True)\n            disc_real_monet1 = self.dhead1(self.m_disc(aug_real_monet, training=True), training=True)\n            disc_fake_monet2 = self.dhead2(self.m_disc(aug_fake_monet, training=True), training=True)\n            disc_real_monet2 = self.dhead2(self.m_disc(aug_real_monet, training=True), training=True)\n\n            monet_gen_loss1 = self.gen_loss_fn1(disc_fake_monet1) \n            monet_head_loss1 = self.disc_loss_fn1(disc_real_monet1, disc_fake_monet1)\n            monet_gen_loss2 = self.gen_loss_fn2(disc_fake_monet2)\n            monet_head_loss2 = self.disc_loss_fn2(disc_real_monet2, disc_fake_monet2)\n\n\n\n            monet_gen_loss = (monet_gen_loss1 + monet_gen_loss2) * 0.4\n            monet_disc_loss = monet_head_loss1 + monet_head_loss2\n\n\n           \n            \n            # discriminator used to check, inputing real images\n\n            disc_real_photo = self.p_disc(real_photo, training=True)\n            # discriminator used to check, inputing fake images\n\n            disc_fake_photo = self.p_disc(fake_photo, training=True)\n\n            # evaluates generator loss\n\n            photo_gen_loss = self.gen_loss_fn1(disc_fake_photo)\n            \n            # evaluates discriminator loss\n\n            photo_disc_loss = self.disc_loss_fn1(disc_real_photo, disc_fake_photo)\n\n\n            # evaluates total generator loss\n            total_cycle_loss = self.cycle_loss_fn(real_monet, cycled_monet, self.lambda_cycle/ tf.cast(batch_size,tf.float32)) + self.cycle_loss_fn(real_photo, cycled_photo, self.lambda_cycle/ tf.cast(batch_size,tf.float32))\n\n            # evaluates total generator loss\n            total_monet_gen_loss = monet_gen_loss + total_cycle_loss +  self.identity_loss_fn(real_monet, same_monet, self.lambda_id / tf.cast(batch_size,tf.float32))\n            total_photo_gen_loss = photo_gen_loss + total_cycle_loss + self.identity_loss_fn(real_photo, same_photo, self.lambda_id/ tf.cast(batch_size,tf.float32))\n\n\n\n        # Calculate the gradients for generator and discriminator\n        monet_generator_gradients = tape.gradient(total_monet_gen_loss,\n                                                  self.m_gen.trainable_variables)\n        photo_generator_gradients = tape.gradient(total_photo_gen_loss,\n                                                  self.p_gen.trainable_variables)\n\n        monet_discriminator_gradients = tape.gradient(monet_disc_loss,\n                                                      self.m_disc.trainable_variables)\n        photo_discriminator_gradients = tape.gradient(photo_disc_loss,\n                                                      self.p_disc.trainable_variables)\n        \n\n        # Heads gradients\n        monet_head_gradients = tape.gradient(monet_head_loss1,\n                                                      self.dhead1.trainable_variables)\n\n        self.m_disc_optimizer.apply_gradients(zip(monet_head_gradients,\n                                                  self.dhead1.trainable_variables))       \n\n        monet_head_gradients = tape.gradient(monet_head_loss2,\n                                                      self.dhead2.trainable_variables)\n        self.m_disc_optimizer.apply_gradients(zip(monet_head_gradients,\n                                                  self.dhead2.trainable_variables))     \n        \n        \n        \n        # Apply the gradients to the optimizer\n        self.m_gen_optimizer.apply_gradients(zip(monet_generator_gradients,\n                                                 self.m_gen.trainable_variables))\n\n        self.p_gen_optimizer.apply_gradients(zip(photo_generator_gradients,\n                                                 self.p_gen.trainable_variables))\n\n        self.m_disc_optimizer.apply_gradients(zip(monet_discriminator_gradients,\n                                                  self.m_disc.trainable_variables))\n\n        self.p_disc_optimizer.apply_gradients(zip(photo_discriminator_gradients,\n                                                  self.p_disc.trainable_variables))\n        \n        return {\n            \"monet_head_loss1\": monet_head_loss1, \n            \"monet_head_loss2\": monet_head_loss2, \n            \"disc_real_monet\": disc_real_monet1, \n            \"disc_fake_monet\": disc_fake_monet1, \n            \"disc_real_monet2\": disc_real_monet2, \n            \"disc_fake_monet2\": disc_fake_monet2, \n            \"monet_gen_loss\": monet_gen_loss, \n            \"photo_disc_loss\": photo_disc_loss, \n            }\n","metadata":{"papermill":{"duration":0.069666,"end_time":"2021-05-03T04:06:18.54469","exception":false,"start_time":"2021-05-03T04:06:18.475024","status":"completed"},"tags":[],"id":"surrounded-seven","execution":{"iopub.status.busy":"2022-10-26T19:43:42.392668Z","iopub.execute_input":"2022-10-26T19:43:42.392929Z","iopub.status.idle":"2022-10-26T19:43:42.422134Z","shell.execute_reply.started":"2022-10-26T19:43:42.392898Z","shell.execute_reply":"2022-10-26T19:43:42.420921Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"with strategy.scope(): # for TPU\n\n    def discriminator_loss1(real, generated):\n        real_loss = tf.math.minimum(tf.zeros_like(real), real-tf.ones_like(real))\n\n        generated_loss = tf.math.minimum(tf.zeros_like(generated), -generated-tf.ones_like(generated))\n\n        total_disc_loss = real_loss + generated_loss\n\n        return tf.reduce_mean(-total_disc_loss * 0.5)\n\n    def discriminator_loss2(real, generated):\n        generated_loss = tf.keras.losses.BinaryCrossentropy(from_logits=True, reduction=tf.keras.losses.Reduction.NONE)(tf.ones_like(generated), generated)\n        real_loss = tf.keras.losses.BinaryCrossentropy(from_logits=True, reduction=tf.keras.losses.Reduction.NONE)(tf.zeros_like(real), real)\n        total_disc_loss = real_loss + generated_loss\n\n        return tf.reduce_mean(total_disc_loss * 0.5)\n\n","metadata":{"papermill":{"duration":0.043363,"end_time":"2021-05-03T04:06:18.621276","exception":false,"start_time":"2021-05-03T04:06:18.577913","status":"completed"},"tags":[],"id":"alpine-physics","execution":{"iopub.status.busy":"2022-10-26T19:43:42.423611Z","iopub.execute_input":"2022-10-26T19:43:42.423937Z","iopub.status.idle":"2022-10-26T19:43:42.437499Z","shell.execute_reply.started":"2022-10-26T19:43:42.423903Z","shell.execute_reply":"2022-10-26T19:43:42.436405Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"with strategy.scope():\n    def generator_loss1(generated):\n        return  tf.reduce_mean(-generated)\n\n    def generator_loss2(generated):\n        return tf.reduce_mean(tf.keras.losses.BinaryCrossentropy(from_logits=True, reduction=tf.keras.losses.Reduction.NONE)(tf.zeros_like(generated), generated))","metadata":{"papermill":{"duration":0.042475,"end_time":"2021-05-03T04:06:18.695758","exception":false,"start_time":"2021-05-03T04:06:18.653283","status":"completed"},"tags":[],"id":"immune-novelty","execution":{"iopub.status.busy":"2022-10-26T19:43:42.439030Z","iopub.execute_input":"2022-10-26T19:43:42.439327Z","iopub.status.idle":"2022-10-26T19:43:42.449265Z","shell.execute_reply.started":"2022-10-26T19:43:42.439273Z","shell.execute_reply":"2022-10-26T19:43:42.448499Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"with strategy.scope():\n    def calc_cycle_loss(real_image, cycled_image, LAMBDA):\n        loss1 = tf.reduce_sum(tf.abs(real_image - cycled_image))\n\n        return LAMBDA * loss1 * 0.0000152587890625","metadata":{"papermill":{"duration":0.04152,"end_time":"2021-05-03T04:06:18.770802","exception":false,"start_time":"2021-05-03T04:06:18.729282","status":"completed"},"tags":[],"id":"violent-miami","execution":{"iopub.status.busy":"2022-10-26T19:43:42.450621Z","iopub.execute_input":"2022-10-26T19:43:42.451335Z","iopub.status.idle":"2022-10-26T19:43:42.468256Z","shell.execute_reply.started":"2022-10-26T19:43:42.451262Z","shell.execute_reply":"2022-10-26T19:43:42.466985Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"with strategy.scope():\n    def identity_loss(real_image, same_image, LAMBDA):\n        loss = tf.reduce_sum(tf.abs(real_image - same_image))\n        return LAMBDA * 0.5 * loss * 0.0000152587890625","metadata":{"papermill":{"duration":0.041199,"end_time":"2021-05-03T04:06:18.843205","exception":false,"start_time":"2021-05-03T04:06:18.802006","status":"completed"},"tags":[],"id":"permanent-weekly","execution":{"iopub.status.busy":"2022-10-26T19:43:42.469748Z","iopub.execute_input":"2022-10-26T19:43:42.470071Z","iopub.status.idle":"2022-10-26T19:43:42.480847Z","shell.execute_reply.started":"2022-10-26T19:43:42.470038Z","shell.execute_reply":"2022-10-26T19:43:42.479905Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"with strategy.scope():\n# Differentiable Augmentation for Data-Efficient GAN Training\n# Shengyu Zhao, Zhijian Liu, Ji Lin, Jun-Yan Zhu, and Song Han\n# https://arxiv.org/pdf/2006.10738\n# from https://github.com/mit-han-lab/data-efficient-gans/blob/master/DiffAugment_tf.py\n\n\n\n    def DiffAugment(x, policy='', channels_first=False):\n        if policy:\n            if channels_first:\n                x = tf.transpose(x, [0, 2, 3, 1])\n            for p in policy.split(','):\n                for f in AUGMENT_FNS[p]:\n                    x = f(x)\n            if channels_first:\n                x = tf.transpose(x, [0, 3, 1, 2])\n        return x\n\n\n    def rand_brightness(x):\n        magnitude = tf.random.uniform([tf.shape(x)[0], 1, 1, 1]) - 0.5\n        x = x + magnitude\n        return x\n\n\n    def rand_saturation(x):\n        magnitude = tf.random.uniform([tf.shape(x)[0], 1, 1, 1]) * 2\n        x_mean = tf.reduce_sum(x, axis=3, keepdims=True) * 0.3333333333333333333\n        x = (x - x_mean) * magnitude + x_mean\n        return x\n\n\n    def rand_contrast(x):\n        magnitude = tf.random.uniform([tf.shape(x)[0], 1, 1, 1]) + 0.5\n        x_mean = tf.reduce_sum(x, axis=[1, 2, 3], keepdims=True) * 5.086e-6\n        x = (x - x_mean) * magnitude + x_mean\n        return x\n\n    def rand_translation(x, ratio=0.125):\n        batch_size = tf.shape(x)[0]\n        image_size = tf.shape(x)[1:3]\n        shift = tf.cast(tf.cast(image_size, tf.float32) * ratio + 0.5, tf.int32)\n        translation_x = tf.random.uniform([batch_size, 1], -shift[0], shift[0] + 1, dtype=tf.int32)\n        translation_y = tf.random.uniform([batch_size, 1], -shift[1], shift[1] + 1, dtype=tf.int32)\n        grid_x = tf.clip_by_value(tf.expand_dims(tf.range(image_size[0], dtype=tf.int32), 0) + translation_x + 1, 0, image_size[0] + 1)\n        grid_y = tf.clip_by_value(tf.expand_dims(tf.range(image_size[1], dtype=tf.int32), 0) + translation_y + 1, 0, image_size[1] + 1)\n        x = tf.gather_nd(tf.pad(x, [[0, 0], [1, 1], [0, 0], [0, 0]]), tf.expand_dims(grid_x, -1), batch_dims=1)\n        x = tf.transpose(tf.gather_nd(tf.pad(tf.transpose(x, [0, 2, 1, 3]), [[0, 0], [1, 1], [0, 0], [0, 0]]), tf.expand_dims(grid_y, -1), batch_dims=1), [0, 2, 1, 3])\n        return x\n\n\n    def rand_cutout(x, ratio=0.5):\n        batch_size = tf.shape(x)[0]\n        image_size = tf.shape(x)[1:3]\n        cutout_size = tf.cast(tf.cast(image_size, tf.float32) * ratio + 0.5, tf.int32)\n        offset_x = tf.random.uniform([tf.shape(x)[0], 1, 1], maxval=image_size[0] + (1 - cutout_size[0] % 2), dtype=tf.int32)\n        offset_y = tf.random.uniform([tf.shape(x)[0], 1, 1], maxval=image_size[1] + (1 - cutout_size[1] % 2), dtype=tf.int32)\n        grid_batch, grid_x, grid_y = tf.meshgrid(tf.range(batch_size, dtype=tf.int32), tf.range(cutout_size[0], dtype=tf.int32), tf.range(cutout_size[1], dtype=tf.int32), indexing='ij')\n        cutout_grid = tf.stack([grid_batch, grid_x + offset_x - cutout_size[0] // 2, grid_y + offset_y - cutout_size[1] // 2], axis=-1)\n        mask_shape = tf.stack([batch_size, image_size[0], image_size[1]])\n        cutout_grid = tf.maximum(cutout_grid, 0)\n        cutout_grid = tf.minimum(cutout_grid, tf.reshape(mask_shape - 1, [1, 1, 1, 3]))\n        mask = tf.maximum(1 - tf.scatter_nd(cutout_grid, tf.ones([batch_size, cutout_size[0], cutout_size[1]], dtype=tf.float32), mask_shape), 0)\n        x = x * tf.expand_dims(mask, axis=3)\n        return x\n\n\n    AUGMENT_FNS = {\n        'color': [rand_brightness, rand_saturation, rand_contrast],\n        'translation': [rand_translation],\n        'cutout': [rand_cutout],\n}\n    def aug_fn(image):\n        return DiffAugment(image,\"color,translation,cutout\")","metadata":{"papermill":{"duration":0.063213,"end_time":"2021-05-03T04:06:18.938375","exception":false,"start_time":"2021-05-03T04:06:18.875162","status":"completed"},"tags":[],"id":"located-trout","execution":{"iopub.status.busy":"2022-10-26T19:43:42.482128Z","iopub.execute_input":"2022-10-26T19:43:42.482416Z","iopub.status.idle":"2022-10-26T19:43:42.509974Z","shell.execute_reply.started":"2022-10-26T19:43:42.482385Z","shell.execute_reply":"2022-10-26T19:43:42.508947Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"with strategy.scope():\n    monet_generator_optimizer = tf.keras.optimizers.Adam(2e-4, beta_1=0.5)\n    photo_generator_optimizer = tf.keras.optimizers.Adam(2e-4, beta_1=0.5)\n\n    monet_discriminator_optimizer = tf.keras.optimizers.Adam(2e-4, beta_1=0.5)\n    photo_discriminator_optimizer = tf.keras.optimizers.Adam(2e-4, beta_1=0.5)","metadata":{"papermill":{"duration":0.04133,"end_time":"2021-05-03T04:06:19.011148","exception":false,"start_time":"2021-05-03T04:06:18.969818","status":"completed"},"tags":[],"id":"joined-qualification","execution":{"iopub.status.busy":"2022-10-26T19:43:42.511388Z","iopub.execute_input":"2022-10-26T19:43:42.512222Z","iopub.status.idle":"2022-10-26T19:43:42.526348Z","shell.execute_reply.started":"2022-10-26T19:43:42.512179Z","shell.execute_reply":"2022-10-26T19:43:42.525331Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"with strategy.scope():\n    cycle_gan_model = CycleGan(\n        monet_generator, photo_generator, monet_discriminator, photo_discriminator, dHead1,  dHead2\n    )\n\n","metadata":{"papermill":{"duration":0.100669,"end_time":"2021-05-03T04:06:19.143362","exception":false,"start_time":"2021-05-03T04:06:19.042693","status":"completed"},"tags":[],"id":"underlying-diabetes","execution":{"iopub.status.busy":"2022-10-26T19:43:42.528101Z","iopub.execute_input":"2022-10-26T19:43:42.528451Z","iopub.status.idle":"2022-10-26T19:43:42.558659Z","shell.execute_reply.started":"2022-10-26T19:43:42.528408Z","shell.execute_reply":"2022-10-26T19:43:42.557655Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# 30 epochs with lr 2e-4","metadata":{}},{"cell_type":"code","source":"with strategy.scope():\n\n    cycle_gan_model.compile(\n        m_gen_optimizer = monet_generator_optimizer,\n        p_gen_optimizer = photo_generator_optimizer,\n        m_disc_optimizer = monet_discriminator_optimizer,\n        p_disc_optimizer = photo_discriminator_optimizer,\n        gen_loss_fn1 = generator_loss1,\n        gen_loss_fn2 = generator_loss2,\n        disc_loss_fn1 = discriminator_loss1,\n        disc_loss_fn2 = discriminator_loss2,\n        cycle_loss_fn = calc_cycle_loss,\n        identity_loss_fn = identity_loss,\n        aug_fn = aug_fn ,\n\n\n    )","metadata":{"id":"unIOk8SNJz_y","execution":{"iopub.status.busy":"2022-10-26T19:43:42.560063Z","iopub.execute_input":"2022-10-26T19:43:42.560424Z","iopub.status.idle":"2022-10-26T19:43:42.599590Z","shell.execute_reply.started":"2022-10-26T19:43:42.560373Z","shell.execute_reply":"2022-10-26T19:43:42.598828Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"cycle_gan_model.fit(final_dataset,steps_per_epoch=1407, epochs=26)\nFID(fid_photo_ds,monet_generator) ","metadata":{"id":"Ms4V35Ar2ZNS","outputId":"b4004129-a7fe-4e21-8a02-f4d759fdfa65","execution":{"iopub.status.busy":"2022-10-26T19:43:42.600799Z","iopub.execute_input":"2022-10-26T19:43:42.601482Z","iopub.status.idle":"2022-10-26T19:46:57.377713Z","shell.execute_reply.started":"2022-10-26T19:43:42.601438Z","shell.execute_reply":"2022-10-26T19:46:57.375708Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# 8 epochs with lr 1e-4","metadata":{}},{"cell_type":"code","source":"with strategy.scope():\n    monet_generator_optimizer = tf.keras.optimizers.Adam(1e-4, beta_1=0.5)\n    photo_generator_optimizer = tf.keras.optimizers.Adam(1e-4, beta_1=0.5)\n\n    monet_discriminator_optimizer = tf.keras.optimizers.Adam(1e-4, beta_1=0.5)\n    photo_discriminator_optimizer = tf.keras.optimizers.Adam(1e-4, beta_1=0.5)","metadata":{"execution":{"iopub.status.busy":"2022-10-26T19:46:57.378938Z","iopub.status.idle":"2022-10-26T19:46:57.379798Z","shell.execute_reply.started":"2022-10-26T19:46:57.379476Z","shell.execute_reply":"2022-10-26T19:46:57.379504Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"with strategy.scope():\n\n    cycle_gan_model.compile(\n        m_gen_optimizer = monet_generator_optimizer,\n        p_gen_optimizer = photo_generator_optimizer,\n        m_disc_optimizer = monet_discriminator_optimizer,\n        p_disc_optimizer = photo_discriminator_optimizer,\n        gen_loss_fn1 = generator_loss1,\n        gen_loss_fn2 = generator_loss2,\n        disc_loss_fn1 = discriminator_loss1,\n        disc_loss_fn2 = discriminator_loss2,\n        cycle_loss_fn = calc_cycle_loss,\n        identity_loss_fn = identity_loss,\n        aug_fn = aug_fn ,\n    )","metadata":{"execution":{"iopub.status.busy":"2022-10-26T19:46:57.381148Z","iopub.status.idle":"2022-10-26T19:46:57.381521Z","shell.execute_reply.started":"2022-10-26T19:46:57.381333Z","shell.execute_reply":"2022-10-26T19:46:57.381355Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"cycle_gan_model.fit(final_dataset,steps_per_epoch=1407, epochs=18)\nFID(fid_photo_ds,monet_generator) ","metadata":{"execution":{"iopub.status.busy":"2022-10-26T19:46:57.382665Z","iopub.status.idle":"2022-10-26T19:46:57.383008Z","shell.execute_reply.started":"2022-10-26T19:46:57.382826Z","shell.execute_reply":"2022-10-26T19:46:57.382851Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# 8 epochs with lr 1e-5","metadata":{}},{"cell_type":"code","source":"with strategy.scope():\n    monet_generator_optimizer = tf.keras.optimizers.Adam(1e-5, beta_1=0.5)\n    photo_generator_optimizer = tf.keras.optimizers.Adam(1e-5, beta_1=0.5)\n\n    monet_discriminator_optimizer = tf.keras.optimizers.Adam(1e-5, beta_1=0.5)\n    photo_discriminator_optimizer = tf.keras.optimizers.Adam(1e-5, beta_1=0.5)","metadata":{"execution":{"iopub.status.busy":"2022-10-26T19:46:57.385123Z","iopub.status.idle":"2022-10-26T19:46:57.385698Z","shell.execute_reply.started":"2022-10-26T19:46:57.385452Z","shell.execute_reply":"2022-10-26T19:46:57.385487Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"with strategy.scope():\n\n    cycle_gan_model.compile(\n        m_gen_optimizer = monet_generator_optimizer,\n        p_gen_optimizer = photo_generator_optimizer,\n        m_disc_optimizer = monet_discriminator_optimizer,\n        p_disc_optimizer = photo_discriminator_optimizer,\n        gen_loss_fn1 = generator_loss1,\n        gen_loss_fn2 = generator_loss2,\n        disc_loss_fn1 = discriminator_loss1,\n        disc_loss_fn2 = discriminator_loss2,\n        cycle_loss_fn = calc_cycle_loss,\n        identity_loss_fn = identity_loss,\n        aug_fn = aug_fn ,\n    )","metadata":{"execution":{"iopub.status.busy":"2022-10-26T19:46:57.386631Z","iopub.status.idle":"2022-10-26T19:46:57.387366Z","shell.execute_reply.started":"2022-10-26T19:46:57.387124Z","shell.execute_reply":"2022-10-26T19:46:57.387151Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"cycle_gan_model.fit(final_dataset,steps_per_epoch=1407, epochs=8)\nFID(fid_photo_ds,monet_generator) ","metadata":{"papermill":{"duration":345.558625,"end_time":"2021-05-03T08:27:47.892184","exception":false,"start_time":"2021-05-03T08:22:02.333559","status":"completed"},"tags":[],"id":"acquired-breed","outputId":"e4e223b3-e6db-4424-9710-ae4766e691bf","execution":{"iopub.status.busy":"2022-10-26T19:46:57.388725Z","iopub.status.idle":"2022-10-26T19:46:57.389476Z","shell.execute_reply.started":"2022-10-26T19:46:57.389230Z","shell.execute_reply":"2022-10-26T19:46:57.389256Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"ds_iter = iter(photo_ds)\nfor n_sample in range(8):\n        example_sample = next(ds_iter)\n        generated_sample = monet_generator(example_sample)\n        \n        f = plt.figure(figsize=(32, 32))\n        \n        plt.subplot(121)\n        plt.title('Input image')\n        plt.imshow(example_sample[0] * 0.5 + 0.5)\n        plt.axis('off')\n        \n        plt.subplot(122)\n        plt.title('Generated image')\n        plt.imshow(generated_sample[0] * 0.5 + 0.5)\n        plt.axis('off')\n        plt.show()","metadata":{"papermill":{"duration":31.920165,"end_time":"2021-05-03T08:28:46.022003","exception":false,"start_time":"2021-05-03T08:28:14.101838","status":"completed"},"tags":[],"id":"clear-subsection","outputId":"3569fd63-e08e-488a-c023-4f5c6828e9cb","execution":{"iopub.status.busy":"2022-10-26T19:46:57.390546Z","iopub.status.idle":"2022-10-26T19:46:57.391148Z","shell.execute_reply.started":"2022-10-26T19:46:57.390945Z","shell.execute_reply":"2022-10-26T19:46:57.390966Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"ds_iter = iter(monet_ds)\nfor n_sample in range(8):\n\n        example_sample = next(ds_iter)\n        generated_sample = photo_generator(example_sample)\n        \n        f = plt.figure(figsize=(24, 24))\n        \n        plt.subplot(121)\n        plt.title('Input image')\n        plt.imshow(example_sample[0] * 0.5 + 0.5)\n        plt.axis('off')\n        \n        plt.subplot(122)\n        plt.title('Generated image')\n        plt.imshow(generated_sample[0] * 0.5 + 0.5)\n        plt.axis('off')\n        plt.show()","metadata":{"papermill":{"duration":36.884887,"end_time":"2021-05-03T08:29:49.326769","exception":false,"start_time":"2021-05-03T08:29:12.441882","status":"completed"},"tags":[],"id":"actual-reader","outputId":"82845e69-16b4-4ac1-f34f-fc5e28938c70","execution":{"iopub.status.busy":"2022-10-26T19:46:57.392543Z","iopub.status.idle":"2022-10-26T19:46:57.392874Z","shell.execute_reply.started":"2022-10-26T19:46:57.392702Z","shell.execute_reply":"2022-10-26T19:46:57.392718Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import PIL\n! mkdir ../images","metadata":{"papermill":{"duration":27.421043,"end_time":"2021-05-03T08:30:43.35362","exception":false,"start_time":"2021-05-03T08:30:15.932577","status":"completed"},"tags":[],"id":"educational-taxation","execution":{"iopub.status.busy":"2022-10-26T19:46:57.394516Z","iopub.status.idle":"2022-10-26T19:46:57.395192Z","shell.execute_reply.started":"2022-10-26T19:46:57.394910Z","shell.execute_reply":"2022-10-26T19:46:57.394937Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"%%time\ni = 1\nfor img in fast_photo_ds:\n    prediction = monet_generator(img, training=False).numpy()\n    prediction = (prediction * 127.5 + 127.5).astype(np.uint8)\n    for pred in prediction:\n        im = PIL.Image.fromarray(pred)\n        im.save(\"../images/\" + str(i) + \".jpg\")\n        i += 1\n    ","metadata":{"papermill":{"duration":308.75455,"end_time":"2021-05-03T08:36:18.774144","exception":false,"start_time":"2021-05-03T08:31:10.019594","status":"completed"},"tags":[],"id":"attended-venture","outputId":"a22cd9cf-e6b1-4e28-e1b8-c49d7cd6d07f","execution":{"iopub.status.busy":"2022-10-26T19:46:57.396331Z","iopub.status.idle":"2022-10-26T19:46:57.397026Z","shell.execute_reply.started":"2022-10-26T19:46:57.396726Z","shell.execute_reply":"2022-10-26T19:46:57.396753Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import shutil\nshutil.make_archive(\"/kaggle/working/images\", 'zip', \"/kaggle/images\")","metadata":{"papermill":{"duration":30.599746,"end_time":"2021-05-03T08:37:15.966355","exception":false,"start_time":"2021-05-03T08:36:45.366609","status":"completed"},"tags":[],"id":"expired-battery","outputId":"fab9dc38-ce09-4de4-ec3e-36ecb491b3ae","execution":{"iopub.status.busy":"2022-10-26T19:46:57.398292Z","iopub.status.idle":"2022-10-26T19:46:57.398770Z","shell.execute_reply.started":"2022-10-26T19:46:57.398523Z","shell.execute_reply":"2022-10-26T19:46:57.398547Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"\ndHead1.save_weights(\"dHead1.h5\")\ndHead2.save_weights(\"dHead2.h5\")\n\nphoto_generator.save_weights(\"photo_generator.h5\")\nmonet_generator.save_weights(\"monet_generator.h5\")\n\nphoto_discriminator.save_weights(\"photo_discriminator.h5\")\nmonet_discriminator.save_weights(\"monet_discriminator.h5\")","metadata":{"papermill":{"duration":26.776775,"end_time":"2021-05-03T08:38:09.478891","exception":false,"start_time":"2021-05-03T08:37:42.702116","status":"completed"},"tags":[],"id":"sharp-thesis","execution":{"iopub.status.busy":"2022-10-26T19:46:57.400075Z","iopub.status.idle":"2022-10-26T19:46:57.400570Z","shell.execute_reply.started":"2022-10-26T19:46:57.400285Z","shell.execute_reply":"2022-10-26T19:46:57.400332Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{"id":"Ox0FyidjuWX5"},"execution_count":null,"outputs":[]}]}