{"id":108405,"date":"2023-07-10T07:00:00","date_gmt":"2023-07-10T14:00:00","guid":{"rendered":"https:\/\/devblogs.microsoft.com\/oldnewthing\/?p=108405"},"modified":"2023-06-19T07:48:17","modified_gmt":"2023-06-19T14:48:17","slug":"20230710-00","status":"publish","type":"post","link":"https:\/\/devblogs.microsoft.com\/oldnewthing\/20230710-00\/?p=108405","title":{"rendered":"How to wait for multiple C++ coroutines to complete before propagating failure, concluding remarks"},"content":{"rendered":"<p>For the past several articles, we&#8217;ve looked at how we could write a <code>when_<wbr \/>all_<wbr \/>completed<\/code> function that awaits a set of awaitable objects, and only after all of them have been awaited does it propagate any exception that occurred. A lot of our work was erasing sources of exceptions that could occur <i>before<\/i> all of the awaitables have completed, most notable &#8220;out of memory&#8221; exceptions in the internal bookkeeping. We eventually were able to get rid of all the dynamic memory allocations in the coroutine body.<\/p>\n<p>So we&#8217;re done, right?<\/p>\n<p>Well, no, because things could go wrong before we get to the coroutine body.<\/p>\n<p>Consider this usage:<\/p>\n<pre>co_await when_all_completed(First(), Second(), Third());\r\n<\/pre>\n<p>This breaks down into multiple steps:<\/p>\n<pre>auto first = First();\r\nauto second = Second();\r\nauto third = Third();\r\nauto action = when_all_completed(first, second, third);\r\nco_await action;\r\n<\/pre>\n<p>(I&#8217;ve removed some <code>std::move()<\/code> calls for expository simplicity.)<\/p>\n<p>All of our work to get rid of exceptions in the body of <code>when_<wbr \/>all_<wbr \/>completed<\/code> ensure that the <code>co_await action<\/code> throws an exception only because one of the awaitable parameters threw an exception, and not because we encountered a <code>std::<wbr \/>bad_<wbr \/>alloc<\/code> trying to do our work.<\/p>\n<p>However, there are all the other steps that lead to the <code>co_await<\/code> that could still go wrong.<\/p>\n<p>For example, if we make it past the calls of <code>First()<\/code> and <code>Second()<\/code>, but the call to <code>Third()<\/code> throws an exception, then the exception will propagate out of the full expression, and the <code>First()<\/code> and <code>Second()<\/code> coroutines will be left running without having ever been awaited.<\/p>\n<p>So it&#8217;s not good enough to say<\/p>\n<pre>try {\r\n    co_await when_all_completed(First(), Second(), Third());\r\n} catch (...) {\r\n    \/* Ignore errors, but at least we know that all of\r\n     * the coroutines have completed, right? *\/\r\n}\r\n<\/pre>\n<p><img decoding=\"async\" src=\"data:image\/jpeg;base64,\n\/9j\/4AAQSkZJRgABAQAAAQABAAD\/2wBDAAsICAoIBwsKCQoNDAsNERwSEQ8PESIZGhQcKSQrKigk\nJyctMkA3LTA9MCcnOEw5PUNFSElIKzZPVU5GVEBHSEX\/2wBDAQwNDREPESESEiFFLicuRUVFRUVF\nRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUX\/wAARCAHoAeYDASIA\nAhEBAxEB\/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL\/8QAtRAAAgEDAwIEAwUFBAQA\nAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3\nODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWm\np6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6\/8QAHwEA\nAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL\/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSEx\nBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElK\nU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3\nuLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6\/9oADAMBAAIRAxEAPwB3k7hs\nc5A5HtT5EJCkHpwDT5nRj8qYPtTISA\/zEkV5Wwx0weSJNyg7OpA\/nTQFONp4H6UjSl5GVDt49aiU\nFSwHU0a8t2BpxXEc8BiY89jis2QCKVzuI7ZFJv2Ic\/fNPV1YEuMepNLnAbGSh3hiATzzTLlsXwGS\nUQcc5oM43lQOB2qSLZIxd1A\/lWiegDlQnBQ5LetX7CFT\/rDyO2KbbPEgEUhOw96U30ds+xcEetbK\nKKUbluHT7eC4LFBjjPYir888AKxqqrKBlGPWucv9X3xEREDd19aoLeSTnLkEIMA9xVl8qOnuUlaN\n2Ei5YcoOhP8AQ1mPfvExO4ggdD1FJZav5iBHB3IDhl7j3qF9St5GPmRBj3Jp3DlLkfiSaFHwQCwx\n9anhu4biLbOBuPVhwTXNOIxKXU5QnoakR3Dg\/wAPbNPcXKdNJoaXC+ZBMoA52nrj8axZYikrI4BA\nPUU+HU7eI5y5f37fStzS\/wCzbiMyTY8xskhuv4Vm6a6ENGGd1qzAnAOOh61YFx9nV0WONww43jJB\n9RUmoxBHRmgbyVY4NUJJhsBJyTXLNOLEMaQy+YWHOe1QrvI2k4U9jU7AKrFMc80Rp5ikgYOO9LW4\niMx5QMQSo7ilBGS2Mkd6kO6ONAM4bjimupIwBRzX0Aj83DAvnOOKQK+Bx+NOSMPJ83VeKtyIGjGO\ng4qZNIY1VVRkc+tQWUmHlbaOTgc1IPlT8Kq28wUhQPm3ZqoNvYRrXMDIA2U2uMgKareaqsABgHoM\n02e5lCAFSfQelVlDSzAjjaMnJqrXVguacLPFJuQfMV\/SnSzXLKQwO33JxVOOZkfg8gcGnvOzoQxZ\n\/qeKVtBgWGPl4P8AOprO3V3y\/wA2P4fWqyqSdzcVr6UVbcDtUhcZq4K71AbPNHDGyBsHrhRgVmya\niEjzwSevfNQ61I1vK8abG9DmuZe+cMQccfpXTypGy0NiXUd7sEAGfSn29kLhxJcMW77R0FZdgrMc\n+taM10Y1CKwUDrjrTGaz6zDpsJWFxHjrtHJrBu\/ErzuSXOO2eTWNfXQDkkA+mazjKXYE4\/KnYL2N\nsajNKSSW+ueTTBeTK2VZgB2WqT3GfkUbVx24qIuQMLTsI0ZdR3gqS5PoWqFVeUkruAAyQTVMRs3O\nfzqZImBGSaoYjPI3yqQF7+9EZ2HC5p\/l81MkWR0oCwI575xViNgSM00Q8dKcsZUg0CsXkuSijyhh\nvWtLTbtIG8ydt8h6Keaxk+XNMdpACQevehgkb95qf2hyGcIueaz5ZrBGCyTSux7KKw5ZZO7GqxuW\ngfcg5H8R61Nhs6TFrJxHaup7HdzSNaQbckZP+1XO\/wBsXLnBkbj0q7Z37FSZZRg9icmnqI0fJRTu\nWQE+h6U4Ry\/eRwp9jVSWETRl7c\/N1xVEX81seSdvcGlYRsK7+YDMikjncKSe3ilj3p97qxHeqaXk\nF2oXO1qef3H\/AC1wfUdKm4xsbLFIBHDuf1IzTpJpc5ygx2AqeSRblFjUbT\/eUfeqqdNuFcbRkGmK\nxd0+7GXzkA0VFa2UvzEsq445OKKzcbsRuR7izP1AqZRvfAWqa5aX91xg55q3HckliSAw64rlcU9T\nMSWBcFvSoI2BBxkYqxId3BON3aqzBUBCtjNJOwxsoxKMmo5yTIqA8daWRSZVbOQMZpZUZcHH40PR\niGICJjn0qZblYU2nmoSyxo0jZz2qut2jN+9VWUe9bUoczuxo1nu7aW2GxikvcE8VgSvcCfBBI7EG\nrJkhJLQsAD\/C1R\/KynK8Drg8GuixqtiXyoto8yVo5CMhSOCaiUneyZ2lumT0NRPLmLyi2+POfdal\nmtXiRPKbcGGQzc0DFW7eMcrhxwTjr702e684b8Dc3GV4rPuJZ42KPzjkHsfcVA8zq3QgnnFOwzWi\nDK6biffIqUy\/LuJ\/AVmvcyNEGwcetNjuCwDH5gpoEbUEQnbeCSccA1dtkmjlxsO\/tzWLBesdiIMH\nPFakcrPIheTa38XuaBHS3Amm02MNCSEU5YDOc1zLBjIdwIANdroV7C8YheQnAxg9DWbrmnpFIZFA\nAbsPSspq6uZtHNsNkBYZxnirFvKfswZh0ODUUisYgirkZyKlgQCNkY\/NjJ9q5Z7akEjNwGAz6c9K\na7EEZPyk8GmyLg\/IQcgcVHMzEBXAwOazjF3GNjZskjkk9auk4thk\/eNU4pMDAGc1MxZUGfu0TV1Y\nCNg69WG0mlt4sk46gnpTHbzSFAwFOaliJTe4PDVpF+6Jk0hfATgseWY9qqSxgzh0PzCpmjLRtsJO\nT1qBIzHk85p3sBaSB\/vnjcOtTq4jU\/IST3NLDNGUQOGPHTNWP3UjDlkH0zT6FJEIClBuzvPbHSnD\nzSCsSkMRgECtNLa22b2OfXJqpI+G2wxsQTxinsVZnLX9lcRM7XUhB7CsVLKYvl8BD0PrXeX9lA9i\nRdhkkc\/L9Kwm0eMAkTMePlHrXRGXctFaJxAn7tcY9eazLm+Yhsv19Kv3x+yQ4PUcYrA+zSTKzR\/M\nM+tWtSiCYmV8np2pUQcYGTVuGwlCkshz7mplsZCAQBj2qrklZEB4aniH2q4tjIDg4H41citEXliC\nR70XQ0ZyW7HoKsx2b45rTWJFGcCnYFUMzRZsO1PERXqKv7aQqDRYLlPbmnbPWpzFzxR5fc0DIgo7\nimMmRjFTlaRhSGZ80IINUpLf15FbBTINV5IeOlIRiyRFPuYzUSS7Cd7Y\/CtGaHk1QlG08jNMlo0r\nK\/UlVDY7cVdkhtZY2aXnOQuKwImVCD37kdquNdNJFtQYVOgPekSJNCsbDyyFWrEVwrIYyNzD1qAS\nRSACTIB5pxuLe3wyRM7\/AN4mgCxENrAuHU54xW1Gw8sbnG\/HTvWCuos0RWBVVyeT3pF1CW2cFDvc\n\/wATVLGmaN1FIDtVDycmiore+aTJmdQfrRSuB0CERIzYxvHFRoMLuPUmmSgZ6HYOhNKm52Vl6DrX\nM3oYFltoYE9QKq3HyTK7dD2qxOdrKT3qqxMsu3GQKwixgZR9pAx8pFS7w7Mu7J9KiCeXcKSPzp25\nAry9NtW0CKd7MVIjGTjqKyppce30qzcOEQuzZZ+ay5ZCW4HPvXfBWVi0KXJPXB9M1KZ2UAZx+NVh\nnGP1pGmIPHIFUUiUzMpJDkZ7mpoNUlidRvzjgZ6VWLjZk4INRF0PTp3BFIo2Y9YiLnzY1IYYPt9K\nglmSePyzIMLypI5+mayZPLx8uQfakiY5wTwaLAasdzvjMKrtIGME9ar7iCV6Y7VTklKyU\/zCxVs8\n45oA0IZ2R1bGSK0reZp5SDknpWIjk4x2rZ0yY2ymQ4JbjnpSA6fTImhAZjt3dD1xXQztBLbLEwYM\nBjc3ORXP2F6skJ37Nqodv1qeCeeQHLB0H93+GlYTKkrLbqYhtLKSQQagh8yQl3ONwqeW2YX3mRAM\nRyQ1MmuFSVkwN36CuSpdPQwsVpWZJV2MDxzmht3ljcQxqN9iyM3c9BUgZHYqx2IoHPvWfTQCwiIk\nYyPmPQ+lJIVKkE5x1qHzC5IQkL23daRojHGxBzuNTOS2GNgPmPLg4GMU+L5rdATjB596h8hBA7tO\nYmQ5AXkmn2x8zA7AZq2mlcm5d88kKuAqDjp1pgAdgRgjNE+1ZfYjIoSZYgHwMg\/dPeoT5tSh1q0Z\nu2SToBxj1zWvFbRgb2DAelZOnzRCaWQx\/M4IHyFgp9cV0NtHstvtF2gcAZBb5AfoK1NIRurj4reO\nbafKkC+vrUE1riTGGjHqTWlBcgwb0aFIzwuwnP0qlNPNd5VTgbsEZ5+tUlc1SMrU4I45Yw7MwC9+\ngqlPholeNWUdEwM1qNpVxfamskihY1wMHkY+lbzQRW8DHyiQgyC2AK6F7oPRnlGvJNGqmcFSRnnr\nWZbJstt+7DE8Ve8Uai15qUh7dAB0FVolRtPB6Nnj3rSPcrqWpZAUVRycDJHrTb6aO20tVJxMxyMG\nkgRgQQu7bUWpW5dxI4wtSprmuTdXJY5WezjJJyRzU8MRkhwGwW71Uik3LtXkAdh0q5ArSRnaAqp1\nJOKzer0I1bHIVjjd5Gcxx9cHqfSpxcwz2zTRZUqe5rJW8ijLw3ADIzZIB9KsyTxG2P2aMiLuQK3h\nDkj725rypLUnW9xksM1Il5EykksD6VjxTEsdwqYuFQmseZmNzQF2hPWpRMrDrWLBKJSchuPardla\nrPCWeV1bPAB6VpBuTsaR1NDePwpMgmsuW4mtbkwB94Hc1M107gA4GPQUSbi7MHpoy\/gUxlzVf7Wq\nABvzpUvUcle9JTTBMZNDx0rMniAJ4rYLh1JqlcpxmncDHCqGIwacrBX5PGKllTawOKp3DFfmH0oJ\nZOCSoxyKmQhkIwDVOKQ+RkGlt5SrGgksrdG3UrFCuW4yRk0+3Tzc+fubPQjtVeRWkJaNtuBzRGZ9\nmxGLA\/rQI0IFjwwwGA70VWis5VGZGdc+gzRSGdWrtINj8CpoVEbbQd2eKqpwxGeB1q3HEvkGVX+Y\nHkGuJx7GSC7XaVy3I4ANSLbpHZtM3Djpg1WuCZpFUdx3pXyYRuyD0NLRB1HRTefFyOV7moLtF+yT\nDG04znNWFiWOFGRgd3UVV1FHFq7AjkGq1TBGLLIrDvgDrVNzgZHemySs7kEn60x2NdqLQbmIJzim\n8k89aI87iD0NWY4fMyewoNEittI49aa0ZB61f+yHGRTRatu5FFyrFRYs9BStC2OBWkkAUdKXywKd\nx2MlozwPSnCMnGc1oGEE9KBAPSlcViqinIAFX1f5QvOB2FKkKqOlTLb7sYoEWrKcodqk5x37Vv6Z\nevDbeWsatk8sG5rnDaSwgSDsasQySCTdEceozRYk6LU2OY5PK8on071mzDIDqOc4Jq1cTyNaxbmD\nY9WzVH7SA+4MfmONp6flXNVi2zKW4eQfMXIJHaoomOGyverPn4i3gYweaqLMrXAIjJU+9ZpXdiGX\n4lXZnv7d6WSQMoVFOCcfhxUaggFvujsKRX3RBkGPasZLXUZFcRHHI6mmpugAIP3qmAEsR81sP1FR\nyojgqucr0962iuVITLJVmizkjHAJHJquVLNtB4BqZZmZVVwVCrz70xwwGUPDdyKzimrtjJ7W8\/s2\nXzEYZf5fm6ev8xWwdTsZLdrq\/lyyfKueVb6CsYXkWmwym6RZVWMiMMuRuyP\/AK9ZD3f9t3aJG8as\nRhIscD8BW0Gmjopr3bnYx3Z1EJNptypSPpb7cY98d60bediQZolZj1Ljmud0+FNEmUtIXmTjA4AN\nOk1rzLgszEc9qvToa2OzN7awRBnVc98DgVxXijxZK6vBagKOnWql\/rfm4jDHB7DisS4kijBZYQzE\n9WOavcFGMdTPWzaWKSeUku3QUkcYMYhbIx3NWnleYbdx57LwBViPTo3Rd24kjJJNaK9iG9RLURoA\nocH8ag1WfeRCqkjPWrcenQo3Q5+tSNpsUg5LevWo5CeUzrG2MEZJ6sale6MAceXvQ9atPpoxgOwq\nF9OkCkLIcVSi07iSadzGj23epiWaPbCD931rZgjmBkjldVtz91R6VAbBxxj8RTmSVo9jMOO5FaKp\n3RqpdyoCY5HVApUHg46055FJy0QJ+tSG1KjhgajlidOCKwdm7mXUIX80FFU+Weu3rSYkt3IjyV96\nltDNaQMIgshbtnGKaskgUpJguxycdvauiKjFXRsmkisQ0kpkkbLdqsKRtpdoJppU9jXPKTk7mTd3\ncq3snKjJAPU1emNkLVPs\/EoxyKgltxNFkpkL1NVILR5nxDj\/AArWlJPQ0p7GlZO11LIqhiqjkjpT\n2IwUPzY9ao20kmmTuu\/r1B6VOr5DPuyW5zTqKKVwmkivKu\/OO1Z1yhyc9K1bPF1K8ROxVGQB3NVb\nmHBYZzg4qUrK5LWlyjGyiMqB0qRACOai2lH5HFPIGNymmZkykRkZTcKv2tyqsHXCjNZMb\/NhicVZ\nUBDkAkUAbbXoB5OSaKx\/M+cheR60UDOuig807lGB\/Opo4wy\/OMbegxVi3YhQijAU5GKbM4J\/eZJ9\na4JXexiUp8+YvqO9SMfOh3enUVFGBcO2DjDY5qwLba+Q2OwFS4uwblVZCuP9o4qWYq0coIyTkAVM\nltuHmEqAnOO9VCxYkGqcWBx8pKOVHrQvvUmorsu3C9mqBWGM559K7Yu6LRajQOeK0YIVVaz4Dg1o\nwtVM1iWAAo4FNY+1GSRRikWRkYplTE1ETzTAQ9aUCmkjNPXFAh4FWYDgiq4OKvWEDXMwVOppiLMr\njywMcYyaqCMGQuhPPYHFat5p0sMR3KcY4NZFupaQqv3qCS4tqJI3xISF5HvUO0Y3jjBx9avvHLa2\nkWUIyp5xwarQpu+9zXLUfvGMh7jZEzEH7oODUJCoFYcBvWrMoO3puHAwTVdhuyhHK8YrJb6EFu0i\nluPlUbjtJA9Khm3WxG5OfTtSfant4FjQkbupHeo7uVvKjQHIwDihpJ3Ach3beCWPapHj2Kdv3hya\nWL\/Q1R2A3FcgelMaVp0aRemOaUrrYaJUfzp8bcMByKsQwS71VyqxuNwLdKqA+QsT7gWcgn6VMzsg\nVA3y8nnmk4pbgmUPEkUk+nx7I2J83DbTnPB5qnpcMejQG5mY\/a34QY+771pahfGGNUDbF37cjuKy\nZbVJ5Q0c\/mY5Ck1vTfu2todEFpcvLdlopCXLEnrTEJ5ywUY70zyxGgQY45NOEQlw5J46D1qzbWxW\nf5ZAFIPqxqOYEqO+T1q7LEsKeue9ZF3ckghM8elNDtZaktoxafCjvW4nyEg1j6LHg+Y\/bmtbf5j5\nxVoiw9eTU6rxUSADmpfNUCrQmMbioyeadJIp70zdQAhpuwHtS5zSjrTuAwwKf4aY1oh7VY70UgsZ\n8lhzlWINQGxkXlWB+taxNNIpNIdjIME8fVc0whsfMpFbBpjAE8gVLghcqMhiWUIMhe\/vUVpeGykc\nGMlT6CtdoEY5xTDaDngHPrUxi4O6KWhhOst\/ctK4Cg+tXYoWWPZngVbe1ZeVX8qrszRH5kIqZtvd\nGbuym9rJFKZInKk9celRSEqu0\/XNX\/NVsjIJqlLkgjGBU8z2DyZSlJByORQjDv0pzRlvlHeonjMT\nbTW0dRWJCq9VNNErKcdvSmLzT9ucetWSWUnOzBOB7Ciq7fKoJoqWM72O4YlzgDPT2NXTD5sBdnC4\nHcVR+QuIwefapXnwm1DkE4INcPXQwGRWjI+FYMTycCmPeHeYlHA457U9P3Q3lj6gg1GoEhaQglmP\npVXAFAyzFtoxioc4UsT+FOnJKuU+VQcVAHJcHA4\/I01qM5\/W08m63Y4cZrOdGABAxXR6n5V4xjMe\nCnQ1lGI5w4wAK6YLQ0UXuNtwTgVpou1RVS2X5hVwnaM1RqtiQUFwBVN7iQ52Lj61VmkmxnNNDuah\nbI4qJ3VRywzWFJcTjjzAPxpI\/MZss9OwXNwSA5FIJgi5Y1DAD5dVLlix2k4qRml9rhxnd+FWLPWo\n4G+VTn1BrnkRc8At\/KpEkdThYauxnqejaT4ijvWW1uFJVuAT2qrdWR0\/VJgFDKRkE+h71zemyzbx\ntjIPau41NB5FnLIPmeIKxpD3M+41Ce5BtjhoowAAO3rUKOYPuoCx\/hPpSxxIEecFuTg49arzSBz8\nqkMvHHeuaprIzq6NDxMzT5I+UDnFPtZFLtKxzt557moo8pbEuRktyO9XYLBbi1\/czxtIxyUB5+nN\nQlroYlUxFUfB56nNMPz4IG4KOR+NXLuGW3dVlXaCMZ9KzYipBPJO7rnBpO99QLSwmSZ\/NYk4\/KnC\nyXYRux602IjczbsEnjNWm3+R6F+MgZ4rOo5LUaKMKgq7NyqcDPrVqWHcquvJI5FRSEx\/IAGwfzNW\n44XkgjG4Ke+aifvK7BGDrLL9nUFDuEgIB57GqMETPOOSqr949OfStq\/C7cSDhWySOlZLiRpcHAj7\nEd666TfLys6Ka0uXRhmxntTmmEagfoKovJsPccVXacryGqmrHQibUL3IyOAO1YoleaUdeTVi7bdC\nzscA\/magsj5kygDAFXFEyZ0VnH5cA96svMsCZIzTY\/8AVKBTn2Y+aqDoVZdQlYEIuBVGS9nU85xW\nmzJjoKhcxsOQKdyGjP8A7TkPenLrDLwRmnS28LHIFVms0J4NMVmaMOqo\/wB7ir0c6v0IxXNtAyDj\nkU6GZ4zwTQO50+\/NLurNt7rdgZq6G4pFEu6jINRbuadnigBTTCBSFx60hlUdSKQDx1pwqFZVPcU\/\nzU7sKBjmNROFYcipdynoaTAIoEZVzZoclflPtWVL5sbYPzCuguF4NZEy4bmpaQrFRZF4J4OaZcbW\nk3k9e1STgYzVb7xojoTsKq5PFKzbfwpyEAnPaoJTjvnJp3JsK7bgBRTFzRQFjvbfBLTbsjt70\/AO\nTyox2p0tsIkaND0AIohZRlSuQOtcsrxZzkQlLkIPXmrFupwSxzjOBVeRxH823oe1WoZwiNtIAI6M\nKI+80mNEE+5kbCHJ7Cq9sgkOJOc9B0q3BdB\/M34DduKjGduFAXPU1coxgtGCV9TKlUfbpF\/GqlyM\nIc81duxsvCynO5SMj1qgFM0q5\/Gtoao61rEjt2y4Aq8VyKoRoYbrZ2B4rRU1RKKc4lxiMBfc1nvb\nTOT5svHoK3HXIqBoAaa0KsYwsEHOSalitgvAzn61p\/Z+OaekKr0FO4coyGArEKgubU5DKK0MgDFS\niHdFk0ITMZIyDyMVMkJYirLgK+KUcGgEa+iRxo+5wCe3tW1r1wBplsRyUc\/liuatHMbbsnityz1A\nCWBZNpR2KsWGcDH\/ANei4WKFrIV0ty\/UtkA1DHO7TYONp7Ec\/nWsNMmt5TFC0cuz52JxgjtjNVtm\n1neeHGM4A4zXLUlHmtfUxqu7uMldHtymMuo3bgelRJHuXIzhWByPWnucwyHGN2KezGGzcqMVindm\nRHNNKkCIZWaPduJP97vioIwrTMpB65B+tSGRjb7+oHy9On+eabDgENzuIrZ3W5O4QRmSXe5IRefT\nNaBlLqpfK+gU1VyCBxlFH5mkbcSATu3enaueS5mUtCSVSkxCknIzz1qxFMfL27Tk9DmqsqSu6KX5\nC9enFFsGkdYgCecbs549afKnoGxneJLpmtUW3VmJYb8Dnv8A4VgR3FwkwQFtpHQ10uow3ECi4jC7\nGl2q7dCBn\/Cqzy24uzlg0pXIAGADiuqN4qzRvT1RkzyPuKtnp61GJcL1pbkOspZ+o\/WoC4PTvVbm\nyIrpmaM7jn0qzpCAHOOTULsoQ7lDe1X9MwduFAz2FUhM3IxhAcVXmY5JrW+xstorEcnms6aDNMZm\nz3Hlrkms6S+bPLYrQubFm5zWbJY+WxJG6rViG2M+3nP3\/wBKkW7Y9CGqqFiiDF4yzdh2p9lbCeVV\nEm0n2p6E3ZejuQ3B6+hqTYkg9Kr3NqbZ9rMD6EUsEjZwaTRSdzQtotjZ7VoqOKz4M8VpRjK1JQma\nY7kCpGFVZpMCkMp3F0wbAqhJcuxPJqzKFZqi2oP4aaJZWMkp6MR+NHmyD+Nj+NWh5foKlRYj2FFx\nWK0WoTpgZOKtpqr9xU6Qwn+EVMtpbkfcFFx2ZEl8s4w3BqrOMn1q1NZRlSUODVDDxvtY5HrUsZDc\nL8vTvVfGBV6ZNymqTDtSBkTHAJqLaH9qmYHFQt8oyetCM2IxK8AGihHYjjJoqhHosrlSSMDjgDnA\nqK3+YlySCT0pZMBO\/WkVX8oBF+cniuK9loYDlaTzWAjwAM5IqC4bMm0sWYj8BV9YxGqxyOd7DqKq\nOirPl1PT86UWmDK9vEySHcSS3QVbldmCwxfdB5PvToY2B3eveq10zxSgJwc0NrmRSC6sBDENzgy\/\ne4rM+zKQzDKMO3atDczxzPKeW6AdhWVazvNEc5+U4z611qUdom0JLZCYORuwTUqnimSOq5xyaVel\nM0JM5NO6dKiU0\/oDVXLBjgUxWJzio2JY4FIysOVPNMTLKDjJPNWIJ0GUc8GsoecoJY\/gKbvkbPVc\n96EyWXL0oSpjPPeo43yOaZHHgdSfrT9mDTYkWoz8lW1EieXhTjGcmmWUIkQk9qvzKo8vGcgDPpWc\npWVxSdtR80uyUbX3HaFJzTDiTDtIo55Ut2pJXdGG6PC7jhiOtV7h1dvlHJI4FYPXVnM2XGt2lbyo\nWVm7DOakNsFhQXBwqEb9p5298VBKFgQSx5EnYjtSwyNcs2eFxz71knd36IkhkiiDbUc+UWYDd3FP\nWMKAQcdTx2qKdzJKFbCR9AcdqcQyKQpDYPTtWr96N0GxFM\/mHZHnA6VNb2hWNgz\/ADDptbmpUuoW\ngYCHbKVwx9KrwKqS+a0nXoOmazu0mhonYhJlDr2OT3NOAghjlmSUq2DhfU05sSYZuecE1FdwIkHy\n8q3A9s1EZJSTY2uhU1qea30GFFcNKsn3Ou0YPNcR5kn2gOzEk967PWo0tbVJlbcjTCM5PUkH\/Csj\n7DbLIZnwqDkEnrXZGonrY1px92wTyh7SN5M7sd6yJDtbcOhq7dyef5ihSFAyDVJ1ZYV3DH1ppWNh\nwkD4zWxpIBkjHvXPKa39JbDx\/UVdrDvc7uRlOEHQLWPMnzH61babDcdxURAbk00UZ8i1Sli56ZrW\nkQVVkip2IaMmSFG6qKhEKxMSnyn2rSkgz3qBrXPencmxQlR5Dy2frSwwOD8wzV9bQemamSAL2oAb\nbpgjNaC4C1DFHzUxpFCNis+55PFX26VTkTdSK6GRcOUOByapNI5J5PHYVp3dmzEkNjNQJaFFK7hz\n3xTRDuUUaWRGdVwi9SaatxKDwGq29g4Tasny9cVLBHNEylgGUdsU7k6kcV26cFufQ1fhvQ3GeaqX\nVu1y+8KENVlikjfk5I70mgTaNwT5GKhcAnNQxEkDOc1K2ccVmy73EKgiqVxFtyRVxTzUdwPlNAzO\nDAjHcUyRBJ2x61FK2JTtpBIRTsQStIIvkQgY6miop42yDj71FFkLU9AfDSKoPGcmrSFsn5lx7dqj\nmH7xDG2wMoPAzSqgMpcHPPpXntrl1OdBKwRlUOQfTHaq80jTSBucAYXNPPMuWPHcmmsPNJZeADxS\njpZgyGBnXOWPJzirlwqO6HjIHU0woVkOYiQMAEjGae0ZkwXA64wDVyb0dgRFcGNwFQDlSSRWJpCF\nJpwSNqmtsRvHMxCewX2rHjie31G6A5ycfnzTp7MouLCsxLlQADk8VTkTZIyjpmtS3DOpVlwCvNUb\npNq7s8g9PatE+WVioPUrgYNK3Smg80u4YrpOkjBAJzTw6gZNVH3vJhTiozFNnDyfpTSuK12XHnTH\nUVXa4QcDk+1V2il6BlI+lNEDbvmkwPar5S+Qti6RevFPSXew4P41AiRjouT6mpsc5FJmbtc3dPcC\nNs1enVgQG+VAoP1NZmmDe6oehNbWr2YNwJlJhkjKng8OpFQ48yIkrqxTzKEKs+6N2yFPbmop4dk8\nQ3qh68+npVtkhcFipJ6gL0FZ9xuDlj2HSudqUXYwkrFmdd8YKngH9KmzHBbqWUgsM8VFEP8AR0Rv\n4sCpJwstzhWOFXBrmk\/et0JQ2eWBIthiO4qAHB6H\/JqsCUtRLuLF5M49MVNfr5cSsYip7NnGaWK3\nM8AR0ZtgyWQ4rVNqKTBkTJE9u0hlKyg\/6sjqD3zTrW1aVkZ1wqDNW\/7Pja1cPuVyBtJzge2aqCdI\nIAgDb2ypYd6JVOZWgCTHykhBt3DPftSXpY2UKjux\/pTUB8ld\/Geg74q2Yc21vMRuVHZ2B\/Soloyj\nN1lkezt7aZQfKYO2OzEH+lcteTefvRXOB0roNRR7qIK52neHPv1rm5F2ztnpnoK6aUbq5tB6WG2U\nbR7mbnPrRcZl4FEjso4GM9Kco2x72NbPuWuxSZNnBre0peFNYjqzgt2rotKTES\/SncZ0MalwD2xU\nhXaKntAgtwSeagnfLECmhkDdaicZqXaaY+AKtDK7KM03YKcx5pu4CgVhcAdBQqZpQQe9TIARxSEN\nVMUuKlK4FMbgUAiCTpioymRUj9aFHFSMgaIOMGqslvjPFaJFN2hjzQhGX5JHSnqj+lXmhFM8vFDH\nYrGJm6jFAt17irIQ5p2ylYLFZYVHQU2VMKauFKqXTbUNIdimpG45PAqpdXHmkhOn86SWXJKjp3qL\ncCCewoYiq67ee9P8tVjDynAPQUxX3z5xkCpNR3FUHAUDtR1SJ6XLDOiW8bqpO7iiksWEtnsJ5VqK\nzsk7MLnd+Zi4RIwWiiGHfAye+BU58hGwryAg85A60yB7a2d4II\/tE8n35GzgfSo2OyIqB827n1Jr\nkqxtE5EypcxvI6Mj4G7BHtU0ciqBHGwU9cnvQw2qImOWPXHamPtWQgdQMCp5rWQxyHEjO+Dx65pc\nyjBB6dulK2FAVfvDr71HK6uTuY8dSO\/tRzc24xZHDSDk\/N69azoGVNXu5fMJGwEKO\/SrksokA8nn\n61mWhKa04PQj+ldEFbVBuaq3Pl7X2BQRTTA84dUj3Z7+1WHg8xgyLhSOQex9qq\/aZlu44EYg8\/KB\n7U4RjKWrKja+plOGhkZHGGU4ppzU98xlk3nJcDDnHGaq79nB6V0NJPQ3TXQeiYOabJxUiOKUjcOR\nQijPkZs\/KppmyVj6VpGJAM1HlRVXHdkEaFetWkUAc1HvWmSz8bV60EM07C4CXK4OBmtXVNTS4uQF\nJwoA49q5Iz+Qnmc8dPc1ENTkQ7s7mPrVJE3sdnBKCOjHPrVW4DLOTJzk\/Lisex1y8BAC8dsCt+Bp\nbxf9IiCnsw4IqZR6mclzbCpt\/csCT2FXb37LEENsZNxADF8HmqZSS3ki3ncYwSuO9TyJPeBZDGzO\nW3Y21wyjq1bcy23KE8m6VFZnZAdzA9OtW4444CZlfORgZPBNQXMDSXcayKUUcEEdgOTUF27TkhEI\nji4ArOfM0ogXG1R44vIlR2EnXLYwfaqUpV845QHg+gp1kzXfDtygx+FNuIdjmNeVY8ZHNVBR2Q0T\nRncoyCAat3rmO1ijQnaSAfyqsi5AGduOo9amu5ALdWPIVsDFKprJAjOvGCRAAYY5z+Vc5KevHPrW\nzqkpgtfNZSCX2gfXNY6\/NnPKnpXVB6GsNhiL5iEHJIqNwHIQD7vWpldU3DoTUTExqcdWPWqNkQEl\n36nbnpXS2C7Y1+lYCKSUAGMt19a6W3Tai1Y+ppxTER7c8U0yZaoFfAoL5poqxK0mB1qB5c013z3q\nvJJgdaq4DnlxVZrglsDrUMkpkbatWYIAoyeTSEySFWfqTWhAmOtQwlEFWRKuOtMhg7c0xjTWbJzm\nkDZp3GkMfrTDKVXIp8nSotpIpbjGi5DNg9amUg81mTkpLx1qe3uMjBpDL2OKTFCuDTqYDNopdtOG\nM0rDigZA+BWVfyfwitCdsCsuf5zUMDNIJc5plwdqBV71ZMfzc96imhyw9KCGVUzHHkDJJq+kSzxe\nZKOFGSKjRBGN5GQvOKdbSmVZVbqw4FRK72DYnsBBNuKDYo9KKoadc+Q8kbDjrRWc4Pm0uJSR39hA\nwmkY\/K2Op4xTGJaQLkHy+SfU1H57KGKk9yc1HFgR72JLE9qwbbWpyEyMiKzMfmqGRzklO\/FOU72B\nI+ROg9TUUiZLbzhvapdk7lImhcLGYi4Z8ZPrQFWQ+WBkKOcVVt7donkmLZL9PYVejughAWE7j39a\nOVv4UGhVkAIBYYULkY+tZyPs1nAGQ3yjPuK0rqTzCmBgYHFZE8gGoq2OuMVtTvsNHSJIbKE5Qt77\nuKzrmaOXUreSMv5q8kr0FTQ\/u4gZPmOPuk8YqVFtpIjLCgDdDj+H8Kzg7P3vvEULpjLqLLGUCsME\nEHBJ71nunJU9jir0uY53diCwJ5rMhn815ATyrV1U4ytdlweohDx8jkULdgdTg1ZGGGKpTxD0rU3H\nPeKR1qFroduaiMajtSBcmgdyQSs3tQWCjJNBwgqpcy7VPPJqkiW7DJ5zI+M8CmKcEZquDUgbArSx\ni2dDBq0VvbqvlgsBwas2Wq3NxNn7sY65rm7dPMbc3CD9a1YplUDAwB2FCiJyZ0i6nJuAJBVehFdF\nZeJpjGibUbafvKAGx\/WuDS4LEAVu6fjAzW0UjGdzvRdabrEWy42NJjBJGGH41h6r4XniLzWLm4iI\n\/wBWTyP8aps6KgBGcU+HV57YBY5mUDs3IolSjLcz1Wxzs8M9pJyGXJwVxirdnGskTuR84xgmuhfW\n4LxCl9axzD+8vWqwtNNmBFnO0Wf4G5xXHPCyWsSlIzXQRMjDBz1zUmPOhJ2ghWyFqy+kXKruj2Sh\nRxtNVIYpraFzco8YBz8wrgqQnCL5kaJpmfrsayWCpKSd0gIHpwa555fs6LEq5VfvHHNbepXqyQbW\nxnfkH8DXPSPPE7PIoZD6VpRbcTphblB1DjcvehW3lQcDZzzUsHltCWCEA+tVZlKyEVuty0SQuZLh\nWHChsADpXURD5BXLW4KzR4OBkZ966uIfuxVDvqITimluOaV6ryvtFNFjXcJnmqMk5kbavNMllMkh\nXPAqxbqoHSqJbHwRbRk9atA4FR7gBxSjJoExJGYjg4qNJJUbk5WpWHtUTA0ATiU+tOExFUnm7YpP\nOyMAUii013zyactzuHHSqqjNPwe1AmRync5Y1GGKMCKlZPWonGKYjQikyM1OHrOt5OMVbV+KLlIs\nq1DvxUIakd+KVxkFw3BqhwzEVblbNV0Xkn1qWIgljxzVZX3Eg1euSEgYmstM9aOhLJZgfLIHSo7V\nGEu8Lx0zVgjclVZ52Tai\/dByfepWuiJaLE4tLKT503u\/JHpRSXFst4FmiYZIwQaKScbavUDrWj\/0\nVc53PyB7dqbI37pVB6DnFTXOZrlyhIRVwAPSqzbVfARsDsa4o66nMAOTtUHj9TTooGmmWJztdm70\n145EkCMjKSc9OTT1LPOEmBLL09RVpPcRLcRCMNGrfeOAaeiFIzvcZHyqpHWhSJpdm3YACfWrUMIn\nQ+aSsYPytnk0oSl8PUehmXsfzxqpG4jdtz+HFYl4CmooJFK9OK6tnjtx5p2o+MBiAT+Fc9rFwlzP\nEw5I4LHqa66dCaXMwUlexpTLGATI2D0AHXFZs2oC33RwH5j1NULy\/KgqjZc\/pVGNySWbrXZClCC0\nRm22zSNxyATlmrJhn8rU2B6PxUkMnmXYJPQGs26Yrc7geQac97GkNrnSZOMioJX9aW1mEsKt7USq\np61z9TpRUJ3NTwNoyaUgDpTHbFMGyOWQDJPFZsshkcmp7qXPy1VrRIybFHFKoMjYFMGWOBVmNQgw\nOvc1ZDZYTCqFHQVKr5IANVg2BRu4wKZJqW0mW4xxWxbXBQDmsGzG1cmr6S469PSnFg1dG6t0WHJq\nVZV\/iFY0cxPU4FT+dxgGtUzJxL8pHVGIPvUP250ID7Wx7VWadgOeKgebJ4pthY3INUwRsleM+h5F\nbNtrDbQk8YlQ9cDcPyrh1uBu5Na9ncARkkkDHYgUr3FY19fsdLvdPWW1ijjnMgDBfTB7VzbaO5XC\nbW443Vqw3UE935UdwLjCbtmMFfr+dWSZHbkBV9AK82vFKehvTk4o5q50S4EILzIi+g6msq4j2ThS\nc4HWu1urVpbcyFsInf1rjbnm5kfHHQUoG6k2rshQpHImTzmupiOYVPqK46Vsn6V1WnSebYxnPIFW\nwi9SVzVaYZU1YbrUbDK0jcxNpEzUpmlUkDj3q15f781FcptPStES9yql3JJP5e6rqyyoO5+lZ9sy\nR3+XwoIxXR28EThSMYNU9CW7Oxnfa2B+bI+tSrcqRyBWi+nLLKRjiqjaQzzFUOAKE0NNFZ3jbmow\n0eetPuNOlibaDmk\/sq4C7mOBRZFaEiyR+tSCRP7wqsunyEE7jintY7YtxY0rIRMSp6EVE+DVV4WR\ncrJUIvDG2x+aTQFoHY1Wkkz3qgZVcZBqaJvSpGi8H4prScVGDTWNSxiOc0IKSnrSEyjqsmyAKOrG\ns6JiODVnUpd0rYGSg4+tU1znLEZp9CepbDHOPamm3EzDJpufmDZ4p8dx5cgOOKjXoJitcw2v7uKL\ndjqTRTbuA8PEMhqKFGLV2S7na7rUW7sA3nEZByMEZ54p4hiS1EwnXd1ZADlfzpn2VoSJSY3TOAG4\nz7U8RPIDsTc0jYAUcYrnlaKtY5upJNfh7LymxIh5RiuCKrQ+UyGSQlXHC7vumo7pQkgjBX5e2aie\n5jjHzhSy+ldFKjKqtdETKVjQ\/dpbM7ModjycdvSqUmoKqkg4QfrWZdX7THBPHpWZd3RYbFPArthQ\npwd0tTPmbLV7qjSMcnPoPSs24uHdBg9GBquWy3NPwWjarb7lK6d0MYkuSacXwlRd6GNAD7M7r0jP\nRDVS6H7w59asaYc3rNz0IqG8H7w\/Ws3ubR2LWlz7X2E8GtOQVgwEowI6it3zBJGrDuKza1NouyIX\n4qtcPsQmpmPXvWddSbmx6U0iW7kDNkkmmE0MeafDHvbJ6CrM2x8KbRvPU9KkzSnnmmnimZ3FJ9Ot\nSxR5OT0FRCpg2FAFMdyysu3gVKs2OSaprmgmgLmgtxk9aspP71jh8GrUcnHvVIW5pmdD1NRPL8p2\ngY9arx4J5NPn2xx5J69KYDRNHFyRub+VUrq\/Z+CcL7d6gnmAzz+NU2YscmpbHY6PwnI8uqSqG2\/u\nT\/MV1p2qcbiT3NcT4XfZqMhwW\/dEYH1FdeYpZl+ciJD+Zriq\/EaKN9yLUL57rFrb52j7xFZF1aOs\nZRAD+HNbYgSL5UXA\/U0qwuX3Bcge1QpdhuXRHGtayBiMH8q2dHZkRomyO4rVmgIy4jVQOtULWPUN\nWvms9Js\/PuVG5jkAAe5PArWN5aDvbUnl4NRk8Utz4e8URXtvaSaaTNcgmPY6svHXLA4H41W1bTdb\n8OxxyavZmGOUlVdXDrn0JBOKrkZqqsRFGZiaZdx5XNTSeHvEEOl\/2sbNRZGMSiTzkztPQ4zmn3Hh\nrxFHJaRS2aBr04hHnJ83GfXjiqUWL2kbnOXkRYZHUVJZapcWbKH+eOpdVsL\/AErUDp17Btu\/l\/do\nwfOenStG48C+JrW1+0T6Z+646SKSM+oByKtq4pTi9S9p2txSBmmYIc8A+la1pPDIrSRsDuPWuW1P\nwhr+iWL3t\/aRxWyAEkToTyQBwDk8kVfj8FeMEh8yG2jEOM7hdR4\/9CpcpLlE2pFjaRCcE9qldFkj\nYcdKwz4P8bq4Y2icLu\/4+I+n50S+H\/GFvYNdS20SQbN+83EfT6ZpcouZGoYEW2PTNULhV8pUB+pr\nO0fSvFPiGxafTbcywBtu95FQE+2SM0+Hwv4xv5riGLTyrW7bH8x1UZ9iTz+FJwZSmkVb7bGrMDx0\nArGRXmlLg8CteHwL4r1OW4jFmS1pJ5UiySquDgHueRgjmn23gzxINTl0yPTW+0woJHy6hNp6HdnB\n79+x9KpRaGqi6lJISoyTz6Veto\/kyasDwV4pe7ktRpwEsaBzmVACPY5wfwqwngjxaFQCwiBcZXNz\nHz+tS4tj9rEr4wKibrV8+CPFwLA2MeVGSPtMfA\/76qP\/AIQrxW0iJ9gTMill\/fpyB+NTyMr2sSiW\nOaeWEcTM3YZqaXwb4ogtGu5LFPJCFuJ0JIxngZyT7U3UvCPiiz0uW6udPIt0UO5WRWZV9doOaXIy\nXUizA8zzSzE9Tmm\/e3ADoKSJi67QAMHrVlgEBA71D0ZRWJEYCLyR3pxRyBgZz6UqxF2zjgVat5Yi\n6o3ygdCaTdhbkkQ+ywqZpOW6KO1FKbaKQkyS7jn7x4FFZOz3GdbNDPqTW0UQDbRsRRxgD1+tQXF3\nJp0TbiUbOBg1fiF7IDs2wr7Cuf8AEc7JcrAXLsoySfWlDknNQucTbSuVXvScuCd7dzVd5jjk5Jqt\n5nemPJzXqrTQxHvL1NU5G5pR508nlwRSSv12xqWP5CmvaagQx+w3WF6\/uW4+vFFykhgNWYuYn+tV\nvsWogr\/oN0N33R5Lc\/pU6W2oJGwOn3Qwef3LcfpUS2NI7kBHzU1jhSfapWstRyT\/AGfdgevkt\/hT\nGsdQPyfYbrcRkDyWyf0ppg1qN05tjhs4y3NLfJtnI7E5qBd8CMkiskik5Vhgg1emgmvSqwQyyyKA\nT5aFsD8Kh7mkXYitofMf\/ZHWr\/AHHAHFQIlzE4tltJxLjd5ZjO4j1xjNOVbwzeQLS480DcY\/KbcB\n64xSsVzIJm2IWPXtWS5JJzVu+lfzvKdGRl6qwwR+FUmJL4UZJOAB1NNBcTFXI02oB+JqN7G9twJZ\n7S4jjHVniYD8yKmigvbiLzILO4lQn76RMw\/MCqRnJjcZNNxk0+K3vbiPzILO4ljPRkiYj8wKDZ6g\nY\/MFjc7MZ3eS2MfXFMgaBzT1GTR9h1JV3GwugAM5MLYx+VHk3aQee1rOIcZ8wxnbj64oAlJCim5w\nM0fY9ScArYXZUjIIhbn9KQ2OqYx\/Z939fIb\/AAoGIDzT1c560wWOpAZ\/s+7xjr5Lf4UosdSI\/wCQ\nfd49fJb\/AAp3AmSTb7moZ7k4xuNQtPsBU5BHBB6iqxYucnpSbGKzF25\/KlAzSAc4pWYLwOtIs6Lw\nfs\/teVWI\/wBSefxWvQUhQqCqknHBrz\/wLuGsSsoBPkkc\/wC8tek26Fj87HPoorjq\/EPcqC0ZiWZO\nfcYqtKxtwc5yegFb0iJHDljjPqeaw70yKpESZH96lGJaiYN9dsQwLEAdqt\/DW4vo\/FN0bS2FxC8Q\nEwLhSozwRn8eKxNSuY4mPmE571l2Xia50TU1vdKl8uYAqQwyrD0IrogKa0PdbCwnj121vINQlm0y\nS3kEdtKB+7bKkbTjOMZGDXP\/ABLBbwHjuboD\/wAfNcGfiL4hubi2uTdwxNb52RxxgIc8cjvVXXfF\n2q+IYoYdRuYvLhbescSbVLep9a0uZJHsd1ppbwR\/ZzAlVsVTdjGSFFUtUP8AxMPCH+\/\/AOyV5zL8\nTfERUhprTYybMeT2\/Ooh8TfEAjhUtZMIQBGWtwSv0OaLhZmx4nx\/wuS1z03Rfyr1HUM\/ZtU\/65cf\n9814Xq3inUfEDw3F69uk0Db0lhiCNn3PerV18SfEN1bG2e6gCnG5liAZsdiaLjszq\/jAbD7Fpqzx\nTtfMjfZ3RgEUZXduHU8dKTSQf+FHS\/SX\/wBGGuE13xVfeJWtjqckLG2DBPLTb1xn+Qoj8Y6lbeHW\n0KKSD7CQwIMeW5JJ5+pp3Hy6H0G5XYRg7\/s557Y4rhviC9gvgWz\/ALRinkyFEXksBhscE57VwzfF\nbxJ3ktPu7P8AU9vzqGb4j65d2P2K4FlJBt2gNbgkD296CbM9I8Krdt8ONNXTHijuyRsaUEoDk9QK\n6CxTUY9NddVlglvPPXe1upVCNwxwfavENE8c614eszZ2E8TQbtwWZN20+3pU1n8R\/EVnLcOt3FKZ\n33sJo9wB9vSgbR7k+wSaoZASmBuC9SNgpJjJ9p1LdtA+zpswecfN1\/GvD7f4i+ILc3jfaYHN4++T\nzI844AwOeBgCpj8S\/ERvvtZuLfeY\/KKeV8hGc8jPXr+dK4rM9tP\/ACE4\/wDr0b+a1h65zq3hb\/ru\nf\/QDXlX\/AAn\/AIhbVV1P7bH5qRmPy9n7vaf9morr4ga3d6la30txAZbTPlKI8ICe+KLj5Wev2P8A\nyOHiH\/rhF\/6Ca3rcI1vDn\/WLHkfQ\/wD6q8Fj+I+vRX11erJa+ddKqyZi4wBgY5qdfih4jDpIJrUb\nU2D9z2\/Oi6Fys9C8YyW0XhbSGuIZZp\/tMf2URsFAmwdu7P8ADnrWhrNtfatpNz9nuJdL1VbYGWIF\nZEZfmwDweOG6eteUy\/EjXLizFrMbJ4gMLutwSvuOeD706T4keIZtPa2N3BhoxGZREBIRjufWjmQH\nOWzqsQ9TVpAZKp2UJlcAHNb8VgEQEnk1yTaR0KSsVFQAbDxnvTYbVVk3s4x2rWWxjbjnNTx6VDkF\nsmsOZg5x6mC9jI75Zwfb0orqo9OhOeM0Uc8hc8TQuL+WO2aWOLhRnmuFvrl7m7klc5LGumv5WFsd\nzllb0\/KuQkPzGngqMYNyRzTfQN\/akJzTc0ucL9a9JEWNzwDdtaeOtP29Ji0bZ9CCf6V7m8IEGoLn\nDTbsf98gV876PfLpniLT76QkRwzKXPovQn8jXsdx8SfC5u7YpqqmPLeYfJk444\/hpsqOxp6hdGLx\nT4fsh\/FHNIef7qgf+zVoXSulnqLMCA2Sp9RtFcHfeOvD0\/jjSr5NSU2dtbSq8vlScM2MDG3PatWb\n4h+F5IL5Bqyky\/dHkyf3QP7tIom8b\/2n\/ZOmtpuoRWYEimYSTBDKuPuj1PtXUrbCSW1uP4o0x9QR\nXmni\/XvC\/iax06NPECQPZSCUg2srb8DGOgxW9H8S\/DKXyA6qvkeSAW8mThh\/wGgDx3xcxPivV\/U3\nLfzrufg6Cl1q87jiKGMZx\/vE\/wAq5TXNI1PUPEd\/e2ml381tPM0kUgtZMMp6HpXWeBdVtPCOi6iv\niFZrKe6kJijuLaQCUBR\/s+ppD6HU39ts+K2kXgPFxp8keP8AdOf\/AGaizP8Axd++H\/ULX\/0MVSuv\nG\/he41zR9QGpKDapIj4ikwoZR\/s+oFQxeK\/CsPjSbXf7fQpNai38r7NLlcNnOcf0piPNvHR\/4rfV\n\/wDrt\/QVb+GVvDd+OLRbiNZFVWcBhkAgcGneL9LOta3Pqvh1rnVre7cs5gs5QIiMDbkjk0zwgNQ8\nJ+IoNV1PSb+KzjBWWRrdwEB4zyKB30PUfE3iW1tzq2lX1jf3KNHhTDbF0XKevauh0yCKwsNMtbRB\nFB5eNgGB92uP1r4i+HYNL1NrC\/a6urtCqRpCw2nbjJLADFT6T8S\/Dc+m2Mt7fG0uYkxJC0Tsc4x1\nAxQI63SreC0S8hgjWKL7S2FUYALYJ\/UmodRiFp4ZubdT\/qYCv6Vy1h8TPDs1lcSzXn2WaW5LrE8b\nk7QwAJIBHIGcZ70\/UPiH4YubHUYl1Rd0q7Yx5MnzfL\/u+tAHZL5hW1x\/qfL\/AHmen3a5TxnsX4a3\nwh2iPaQu3pjdXHfErxbpWt6Hp0Gj6gZpopMyKiumBtI7gd605PE3hrUPAEWiT62ltcNAqMTbyPtP\n4Dn86AN7xZJqUXgSzl0rUEsZo40dneUJuUJyo9T7VT1TWtRi+EEGpx3kq3zQxEzg\/MSSM1l+Ktd8\nLeI\/C9tpaeIY4ZLfa242srbtq4xjAxWfqninRZvhTFosN+H1BIYlMXluOQwzzjH60Adn41\/tNvCN\nm2l6jFYygq0jyzCPemxsqCepJxx7V06SMPsCg\/K6\/MPX5a818Xa94X8U+HLLT18QR20ls6ykm1lf\nJCEY6D1610afETwli1ZtZUGFcY8iT0x\/doA8f+IKLF451VI1CqJQcAYH3RWAK1fF2pwaz4r1C\/sy\nTBNJlCwwSAAM4\/CsscCgpDug96Z1bFLmljGTmkM6rwIANYkGM\/uD0\/3lr0Fnl7RkD271wPgKFrjX\nJkUnIt2PH+8td\/dRC0t2Z2Jx6tXNP4jSCKrSqjbpSQPQ1YudRtPsJMmEUdB3Nc3NqBmkJ6KtULia\nS9kYjhRwKuKstSzD8R3HnSsUG1e1e8w6bYyaVAs1nbNC9r+8Xyhub5R7Z9a8M1GxLQkLknua9Gg+\nKegwrbI0F+Whh8s4iXrx\/te1axtYxqJ3NS\/0m0h+G9zBDaxiSPTWZT5Y3cKcc9c8Vs6VpVnPpemX\nBtYCy267sxjnKj29cVyr\/FHQJYXg+yX2x4fLz5K57\/7XSmWHxQ0i0gsoDBfFYbfy5MRL94AYI+b2\nNURZmT4BvGk8cappkkMD2jTzPtaJSQQxxg9hXZ6ZFb3F1rNxNZ2rPazmCI+SowmAcfma808L69Z6\nJ4wvNXuo5zbztKUCIC3zNkZGa3tK+Ien2moawLq1ujZXk3nRPGoLjgAggnHb1pXBpknirSLEfE7Q\noFtY1iuhulRVwGIz2\/CtvxDc6LLeSaLeaLNKfOjCSw2n7tc46uOnU1xmueMItS8Z6brVtZzfZrDg\nK5AZxzn6da3tW+KNgbOUaVZXT3MsiswnUKoAIzyCfSgLM7DUNH06axvLVrG38uGFWTEYBBGSDn8B\nVyXSbCSa2kNrbjyTuYeWvOVI9K4i9+KelPZT+RZ3pup41jKuihV7E5zzjJ+vtUsvxV0Uu+23v8FU\nHMS9ic\/xelMLM6z7Bb+bfiGyt2dSuweUvp9Koaxp2nwaLrbQWluG8ssSsY4bbXOXnxL0W6tdQijh\nvw90m1CYlGDjH96sHwr4r0zSPCl1pGrrfNJcsxZ4UDYBGOpPWgLM6rXTPp3gWxvNLXToZlhRna5j\nT5ht6DI5NaN3Kkf\/AAjm21tR9vkCz\/uF5GwnjjjmuL8ReKfDev8AhqHStuqI1so8phEgywGBu56f\nSrNz4+0mb+wdsF5\/xLpA0uY15Gwrx83PNFwszu\/7KsLe61C7WytzK0kceTGDhfl4x+Joi0LTTqWp\nwrZQKs0cbt+7H3juBP5AVyY+KWjtdXizWt8LaRkdHWNd2RjIIz7Dv3ph+KmmGfUJvst4jSKqQYQH\nIGTlueOSfWlcLMj8b20Nv448JwpBEqtIA6qgAb5l6+tdpq2naf8AZ5TPZ2xRHQxhYhlWz3wK8y8T\neMdO1rxPoWp28V0sNg+6YOgDHkHjnnpXRz\/FPQX+0H7Pf4k24zCvb\/gVF0FmdXLpNgt\/c3K2NuZY\n4AE\/dj69KpabYWFxrs9wdGa1lktlD+fEgV8E8gAmucb4taHLeyg2199mli2lhGu4N9N39asJ8UdD\nFwsgt9Q2iLy\/9Uuf\/QqLoRt6msdhqPh+3itrXZdzNFN+5U7gEJ4OPUVlalfy23jO6s7Xw8mpR29v\nG8axLGhiLZyTnrnA\/Ksu+8eaXe3uhzRW96FsJi8m6JQSNhXj5vUioJvFekz+Kr3U5hqsUE1vHEgt\n2MbblLZztYccilzICf4k6bbW8Ok38VukN1IfLk2LtyNueQPeufgj+QEjtVLz7vVb1pry7uLmNHby\nRcOWKrnjr7YrTDAcCuWq1J6FIcIu4FSKADilRuKaSC1c6Ey3E4xjbRUCsB3opiOdOpoYxGYiAO27\n\/wCtWY0G7v8ApQOTmn78L7e9dcUo7DSTIWiVc\/P+lMMbFeDip1UHk9e1J05PWr5mPlRXaAOOWx+F\nRjTw3O8D221YZznFOTIxnqaOZlciKgsR03fpU0dqicnkkelTsuBnvTCrHHPFHMxqKI\/s6An5etQS\nWAk+6238KvhcDFOCikm0VyplBbWRNv71uPepSoyN+W+pzVkqRzUbDNPmYcqE2xY4Tiqc1qJJCQcA\n9BjpVnBHSnqm7tRdhyozxayqMK5A9qcLeQH53Zh6E1pLCcUGLIo5mHIjO+yL3fr7U\/7Eh4D5\/CrR\ngpDEVp8zFyIp\/ZAT97ke1K1kJBw238KtFOaeqYFHOw5EVkslCbS2ffFO\/s8Ofvj8qthamjjJ6Clz\nMOSJBbaFHOQDPgn0TP8AWtRfAsjReZ9p49VjBA+vNNQFAOdtWE1GWNdqufqO9S5y7j9nEqTeDCq5\nW64x18v\/AOvVVPCIZsNfbffyv\/r1uLftKoDDJ7kcZpwkMhA520ueQ\/ZxMiPwWHJ2X+7b\/wBMsZ\/W\npW8DyBQ4vM57eV\/9et9CYdrHhPX1qwbyIyjy5GUYxmlzyDkRzFr4He7kCC8Kk\/8ATLP9an\/4QUxs\nUa+ww4P7n\/69dxo7JDOGADMeATzUmrp5d7tIXgDpUyqyS0IkrK5zHhzQm0LU3uBdeaXiKbdm3uD6\n+1bmopJfWxV7hYuwRUyT+tRMzKw29fanDecEqQfUcVg6kn1JU2jIbQWUBWnPPUbOf58VetfDv2lw\niTYHQDZ\/9erzQvxn5QRwO5q\/p9y1lcZmChQPUVUakr6samzltW06G1XyzOvoeKwk02DzgA4bP+z0\nrZ8S38V1cM0aBSWxx0qnp9vtffIfccE10X7GlxZdLhigVt2W7jbjaPrWdP5EAzjcfYVoX90sjFVy\nQnr0\/KsG8kMsmATj0oTbAsLNFIrkrt29O+aXz4lAITcPfg1UjQJgE5JPT0qbycYxzVBdk4vARgW\/\nH1\/+tT1lU8+QP++v\/rVEkPPAOatR2zv0HHrQUNJj\/wCeI\/OhURv+WVXBYueSKkW0ZO35U9QKiWqY\nzsAp5tUPVQatBcYFO2cUAVFs4\/7oFBsUzyMfhVxVIFLjPU0AZktooAwoNVXiAHCZPpWvIuW4qs8W\nSeKQzNDxr96MYHvUNxPHcKY4omB9QKvyrxyoP4VQnhUnjcP1pWQmRW9kg5LYYc7SMVv20MbKu5F2\ngcvngVz8UOGxvGPUgf1q+t4qKYsg549hQ0nuZtGhcalHaHZHbpu\/vbuv44qm2txkkS22CP8Aazn9\nKhjkE8bRM+0g9CcY\/H\/Gmm1tiD9ruNpH3Qi7if6UuSIrIsx3ysvmRR8HtmrMWoEAtNbuijvnP6Vk\nJdQWr7Y4nft87cY+g6\/nSvL9tO6RuB0wAMewFLkiOx0dveJcDEauDjPIod5QMom78a5mS6ljYIC6\nJ256\/jVm2v8AZhpJWcjsAeaTpxXQOVGjJqskRw9vg5x9\/wD+tRUZkiuiWjBVv4sE4NFHs4i5UY4I\nA9fakLZAPakOVOTSH5hkdKshEhbIFMPJpBTsdxQUhNg705OacBgUip83WgoV+2KkjiLUqxljV2KL\nCYA5pFoq\/Zz2NKYDj3q+sB71IIaRRl7COoqMx+1a724I6VXa1J6U7gZ4iyeakWL2q4ttipBGBTAq\niE4o8mrW2kPFAFfyR6UxoRVumHrQBT+z46UeTVvFIUoArCLB6VNHH6dqkC0u2kAxiT1GaVULHpip\nAlSolAgiQA81bghyRn7uajRfm6Vr6dbgnLcrUsdzNvS7SBU4VBwPWnxRI8eXOH7CrF9AIpM9j0qo\nF8rLckE9aQma+mW04YNkiMEd+fwrX1l43u1EbZwoB9jWNb3zC3BibLL6DpTJLmRpsy53nk5rOWxl\nO1jREBlwVOMdeaspaFUDL8z56DtVbT7lcsGRX+X+Lt71pJcJ5a4jA+hrGKvuZoqeXO7ncgHtip1g\njYky49NiD+tWAwcbpIWYDoM0pmnlGyGExjuxNNItI5vWNLWfLJC+V7CspIjEMtGUAXjPU12dwXhh\n3b8yAZ+U8D61y2syMYWkcnew4reLurGkUcvJK7gs2fmY\/gKhWJnXPXPQ96u20ziXaY0fAJ5HatEu\nn2dJI40iYg5AFbJO1x2MmO2bACox\/CrUFnK7Y8sgd8irF9ctYR2zRyDc\/LL3qWadyyhG25x0qZNx\nsD0J7fT1UZbkmrYjVBgCqMiyqQ\/mkKOOvWp4ri3iuPImkkMjYyOwohPmdkgV2WcDFNIqncXRileN\nTnB6kVGNQHmgFDt9jircrOzAuMgNIIxVVr9N2CGpVvYj\/Hj60KaYXLBWmFeMU1bqKTpIv50ocFS2\n5cD3p8y6lCFajZPanLOjd6cXU96V0Ipyw5qlNAa1mxj1qrOmQaLDMSSIq+7j86iKFGY4q9NHntVR\nxgcjPY0XJaGlyJByCSMH608HK5HOeMelUfN2zdO9WN5SUY70EgMKTvTO2nPczeV5cCKidSFHJ\/Gl\nlfzRlep6rVZ1Y5XPPcUAW4Y1aPLoHUjnceRToHjjJ3SAD0NU4IpZW2jd+Rq4mmSo3zJu+hoA07bV\nIrcEhA2aKpfZDAcOoAIyAOcUUrBcqTEKcd6aDgZH4imyZI3N1NNU4xzQYomUk88YpQeeabtzyv5U\n7AHXrQWhwYs3SrEaButV1znirkI4oKRYhiC4NW4xjFVkNWI+ak0RYI9KCQBzTAaVuRzQMQsKZkGg\n47Un40DDikIpRQaYhhGKawpxppHNADcU0inmm96ADHFJxQaBQIXijFKOaUCmMUVKh5qMCnoDSEWo\niK07NZGYKp6+lZkQyQBWxZ\/uk3dGHNJiRHfkSyYHQcVWFgD96TgchQeKW4cl2Jzg1XSVS4VgSD6V\nI2bumwnzIV+zxojE\/NkAms3UI3bUGUtu2nGRWhau0giTacICR7VCkWZmduTnNZVJcquYzEsyFnCn\nrjmteKdNhB3jsBjp+NZ1mLgXUr2tuLiTyz8hOOMjpW7HHLfRqZVk06NPv4YBc+5xWS1QRjdD7WJA\nVcIrk8fOc\/pVxo2uCy5jyO3TFJbtGX8qGT9woB8xflOfr3zVzyPPdWV8ccjcefrVxRdrGZc6W1xs\nhLuyt1K8AVznjBbTT7SOCPDyHqx5IrtL65trGEPcSKNvQZ615P4m1L+2NSKwA7Qa2VkXG71MmxDT\nTTbTglTirNuS6r5hO0fyFQxQG1uJFJxletX9OhfrIPYAfzq5u0dAexR1C38y9VySUGMZOKublZlJ\nwMHnBp2tvGRHCnEgosIfLtB5oy3J5rNybRLdx968ggRsEJuHU02K5spp3nYEzk8Keeah1K\/ia1KN\nG28LhfQ+9QadAyWYlhAN1vzz2HtXTTiktDWNraDru5Zrg\/KQ2ctkdKckmT+Gas6pHmOKYspnzhgB\nwRiqyyuqFSFZSMYIrGaadzOW+pXeSRpgETd+OKtReWL9BMFwq8qex96iMrMUiWNQzH5dvGKnntWC\nAugEhHBB5anTi279C4R6i6ssAgEkQCPu6jjiqsDExjk89aJLY52ycle1KMKemKqrJPQJu+w9m2xn\nFMs0ur7zPKwRHxknFDAyAhMVThnutP3BG2gnuev4VFNRb1Jj5l4zMgYSZV0bBGeKmO\/CvwVPbPSs\niSd5iPl3c5YHjNa813HdQQrGnluvX2FbOmuhbiQzKo+bmqEyHBxVyZlWJd\/I9u9IsJu7L7QrKCpP\ny9his4JvqQlcwpU\/eAninlwSNv61NPH1OOtVlIHDDp0p3JaJSCQHT9KVZx3BU+ophJX7p\/8Ar0iq\nsmcMc+lUI0UnCKMygjGeBUovQ5G04FZa4GAeFFOibLZUYHYUgNbzN4GSD3oqvE20UUuYdigx55qM\njB96W8UwzNGeqnFNiZnToDihIwJFkK9aejb265pj8r0qNGKtQUi+tWIjgVUjJAGasIcmkzRFwHkY\nq1G3FU48mrUYxSLJs+1NYk0val60DIxkDBpcZpxGKWmMAvFIVpSeKTNAhrCo+lSE1GxpgNJFNzzS\nkHGabjmgQtFFHegBRxThSCnCgBRUyCo1HNTxqCaALNpHubPHFbcUBZBmo7KAMowABjpW7BYfuM8f\nhUSZSRympReWc4\/Ks6Jt0mAPp7Vv63BiMnFYulJJJeiONQzHselLoTJana6Po63cSM5aMtGfmznP\n0FZV3CbOaSLO4g4z61Yurg2GmGRZFikY+WUU1Rmk3nLE5x1rGqrpGc4+7zDbea4i8+S2iaR0jJIQ\nZIGRyK0LPU7xLNZ7x43hPJi8li+fQlu5rItbp7fUIpgSEiO+TBxkAdPzxVd9aa9uGadnctIfLQEn\nAPb6UoaK1h09UdSmomVSbiJY0zwqP930z60HVxDCTvHPQZAzXN3lz5cixREEgc\/WqstzOYeZW989\nKteRvYsardXl8+G2pGeNzMKx4YYIWYhjLITwVGB+ZqV5wyBAMg9TjGaqAsmQDhTnODVoG9CfyXvZ\nHAVEHXccnpT0sLoOM3OB9KntDug3KPunBNXcfMKqyM7FJ9JklZXaVS4PXBFOls7jAUSLnGOCa0kB\nIpWXnJp8sQsYM9jcsoUqjKtQxw3MD7lXaR2xkGugPPao2UYpqKWwJGI8Tyvvk2ofQAikFs7fdKn0\n5HNbXlgnpSGFD1UflScb9QtcwltGaVZJN6bO6jJFOn8wzCaW5WTZ9xVGOa2WtIz\/AAioXsIyT1wf\neqjeKKV0ZQ3MNzHczck0MMLlh+lX201DyGb8aj\/s3ByHP5Vm4tu5NmUkQNIoA71BeMjSCSEEKpwc\nnqfatBrGTPElQyWMjJsYZHXip5WpJ2HHQfctaRaSSrqcr8vqWrFt\/OciRSxUHtxV\/wDstQATuPt6\nVYWBkG3PA6c5rWdTSw5NvYjZfNixtA+lURFcwKYkkPlMckDFaBk2jB4PvTGZWXBrGMuXYhNoozfL\nhTwMd6pSHk8AgdauyuSpQDHGKqvH8uf5VUZdwZGrLgbvwNDY6r19aJbdokUn+KowMD3rdCasO3t+\nNPR1BztYn\/aam7cLuNJtxGzUmImMpc5HAoqFG+UKO1FQUa+qWCySvKP4jnFUbaELlW7mtjeXj2vz\n7ms+ZCjcDFXcmVNdCF0BJFQeXhulWowXPNK8YB5pE2GIpq1FFnmmRrirsKcVLLiOijPGasYwKYvW\npOMUFi9qcBgUwsBQGyOTQA7qaDgCo2fBprPTAkzmimJz3p7dKAGk1G3JpxFMbimAHpTCaC1GRnmg\nAx70CgnNCmgBc808Hmo9wA5pBIB3oAsBqntz81UGuFXqajOobDkGgR11pcGPAU10mnX24YfGK80h\n1h1IIrXs9c2jJUj8ahxGpI7TV7JZrWRk5BGRXEWivDcu8bFHXkEV2eh6gL6MxuMqeBmsGa1+zapO\no4wTip20E9SDUJEmW1jI\/fMdztnr9aBdeZIRjvirEkaTPA6p8y5VvfiskPsc+oNTNXQqztTSLGo2\nlxNCq2kXmM5ww\/2fWoYj9i3tLFCZQNsQ6lR61ONTe3ikIAO5Cgz2z3rLiuI5ZFMmWnx971qI81rC\npJcpOA80rucLg1POVaAIqc9yabGv3cHAPNPWUBmz361RvYqFRGPnGRj0rOnmzGduBzgVNeXGAVU9\nKyjcDyhz1bOKuOopaHVaaix2Sg8seelWgpY1U08EwR+pGSTVv7RDFnLgEdqpC6FqKPA5pJM1nvrM\naNgVE+sxkcGrIL7cCoiaoHWIiOTilS\/ikPDigZeHSndqrpKD3p4f3oGS5ppJJpu6jdQAEUxvanFq\njJ9KBjaXbmkJoByKADaPSkKqeozT88c0mM0AVntoz\/CPwrOuLBQxZGKk1sMuKqXHQ0mkIwJY5UPX\ndUYcL98EfSr8w5zVS4YBeKmyFYgll3RhDzg8VGi5NGw9fXilBwp\/KquxMZMcYx0qJ3yAO1OkkDKM\n8c0xiueDkUIQ5VJ+6aKVOOlFGoWOlRcxk1EcOpBHIqeMYtQf71RcDNI0K\/lqozioXYFwBVibgcdD\nVXCq\/HWmZy0JU+8MVfjHyVRjI3YzV+LlaTCI6l6DJpQKhnyQQKEUKZlUZJqN7tVHFV2jbFRtFnk1\nQrkrXmT1qB70g0xox71BICKYtSyuokGnnU8VkyEjq6ioixP\/AC0Bp2Qrs2DqpB5pDqO8VkbGJ5ap\nY4mVuuRRZBdmpHc7j1qzuJPFZcClWPoa04AWFSykS9qa7hBkmlYbapXEhxikMbNe4PBqq927HrTW\njByWNSRQh2AUAe5q0iHcaJHf1NOWNj1NPntpIdp3gqarMGU\/fzTsyLovxpjvV+1UFgM5rHj85CMH\nd7Vo2jOZA20gjqKlplJnoHhqQRTRxkck5qXXlWHVWJH3uaoeGldrjzG\/CtHxWP8ASYHx94Vi9y0U\nrM\/vZEU\/dbdisS4GJ3z3Y1raY4+1THuBzWfNGJJ2PqaUhV9kU76GSa0WOIZO4FvpVOzifLSuoUDP\n1qfU3dFjERIbeBxUk15FgxAYZOGxjk0R0Jpaoc10FiXjnHFVXm+QsScmqz3HGB9OaYWVlC7jk0rH\nTcY5YyKwG4Hr7VmlQ1yI1Ofnq7NMqyBAeDwAKrafH5uqovqwrSJEjsrUbEUZxgVTe3VnJLHOauXI\naAY46VmtMc0IHsRz2If+LBqjJZSoeGyKszXoTvzVR9QPp+dWrktIia2lppV0HIIPrUn2tjyFz9DS\nrdgnDDH1o1FoPgvJEIyTita2uvM4zmssLG\/t9Kt2iCM5zkGkykawajPNMTkUrdKCgeTHJqs94iZy\naWcnYcVizlizDmhCZffVEU9Kj\/tuMcBSTWUYJDzigWzfjT0FdmoNZGeVwKnXVoW74rGFk79SKnj0\ntv74o0Fqah1SKmtcRzA7TUEWkjq8mfpT5NMVV+VyDQGpWl5PFU7gfOuelTtFJA2M7lNNnXdGrjqv\nOKkZVI+VaZKm3p0qV1yuVP8A9akPzpn86AKDgDg01VBHyn8DUsy\/LnvUSYjzk5qkQK+QcEdKKicP\nI529KKqwrnXSPsgjHooqlI5IODUrEvaI3oMVAgDcGpRv0GxAgbWOd1QsGWbae1X4YgZlJ6DoKh1C\nLZNvA+tJmclcZGcnitO3HyVkxnkD1rXg\/wBWKTJiSEVC5xVjrTHTIoRRUdwo5qjLdEHCg1pPbhqi\nNtGOSOaYGO9w7ttwQafJp8sluXLZI7A1eaFck4FRbCh4zz6GrTRDi2ZLRqdu4\/dGMYqWGKIRszjr\n0FXWhXIOBmmNGOwp3JUO5SA2ngEirKAMoIGD3FSrH7U\/oMUmzQbGPmrRiG0CqcMRZulaaw\/IKljI\n5TkcVl3AJlwela\/l84qld2\/zZFAmUDb7zljx6VIkCA96eoK8EVIFB5qgGGLIIycelN8gA8AVOEzS\niPmi4WQ+3iGea3dOsvtEoAAA7msiEba6LSpgqgDrUsXKdLpdskGFXpUHi\/G60GcHkk1bsiM5JpfF\nVmbrRkeGLdKGA3DqBWXUu1jnLORYxK0Z3YHLetQAgn60k4awsUi5DycmqdtMzTAVM1cwqy1sNulY\nNuAyQeOMkfSshNNu1EksikqxBDDnNa2s3L2lsGj4dnCg+nBqjb3l1Haym7lfy2HRjzx6UQ0VyobW\nM\/DDcCCGU9KRTkn1xT7hxPiVHLMBznjiqqzDOKrc2Q4IrliWO9ORx1q7osAGswHOQeR7VUiOHLYz\nx6VY0Hd\/au5j0YYpoGjqtQT58Csa5QqDgV0V+mJKz3iDdRmqQM5G4SbccDk96hmtipXc5wwzmuju\n7XnIFUJbQOADnjp7VaM2jJKoJAsEpwB95h1NaH2Gf7IJ3Cuh7qeaQ2Cbw24n26VceVzGETaAPan6\nhZ9DPjLRnAOVrTtmzjFVBBJuB2rjvg9av2kRBGR1NSykakI+WlanINqgUE4pFFG5JVeaypZOpNat\n1859qybxOcdKAZUkugDjPPpTftJXlgB9TUSqJJSqEKB1Y96ZNEkF18wMidQM4zVWJbLa3wHofoat\nRX698j61jqiTOzMGTJ4C84q5JZXNtGrIxdSM4I6UWRPMbCXII4OaDcZ71hx3BJ4BRh1q5HKXHPBq\nWi0y07Bqj2ijaSKMEdakZUmhMeSvIqHdgZX8RWiQG4qheqI\/mBx60wsV5GB5xVWTaDg8U7zSaicl\niM81aRmyYP5UahDg+uKKGiMkKsuOKKNB6nTKgBeFuAeVqpJBJC33cj2rTukVpmQcMADUULOrhWGa\nmLui4y5o3Kay7WUsCKfc4nU46Grt3CjpxgGqEcTqSOop7hYpxgpIAw6VrRH5RUGxWAJFTKahsm1i\nwDTqjBp+aaGNYVC4qY+9MYVQ7FV0zUTRGrhWmFc0CKnkjvSFAOgqz5ZNHk+tMRU2+lSR2xY5NWhE\nKlRccCkFiOKDaatEDbQi460rjjikMhPWklQOOaU9alCEiqJZRa3BqMwAdKuyoQDVfvQJEflGnrHU\nqmncUFDUTFaVi4Vhis8dauWvBBpMDrLOYhRWtaa2kVw1tKu5WFcvby7SMHg1C0xm1IbWxtPJrNj0\na1K2uOZtTlC\/cVsKB6VDZQ7Z13Dmtk2EbT+Yxzk5pl15Fu4YYzXPOtG1kcbV3cz9bMMdmDIV+8ME\n9veuXvlmlVSzIUzng1pa7KkqqZiTHvzgfQ1QsL8LLsEIMZBwvp9TVU4tLmN6b0sV7eJ2n44VRyaq\nXA2Snaa0p5mYCKIANjlxWdcxMgUE5PrWsXd3NbWFjmI4Oea1dIwLs44HBrGgjJbcegNa2nTD7W6D\nsODVdRncSjz9oXnjvVJo+SMVNb3A8lD3xikYgtmqQypJCGHSqUtoM8VqvioHFMkyHtW7GmLa8\/NW\nqUzQIOeaYiglv6CrcEOCOOlWFiHYVNHHQBEwppGKnYc1C9BSKzpuqncQBhnGa1EXcKY8PPSpBmEb\ndV6IPypjJG3DRitaW32nIHFQG3DdRVCMwWcedwUA57VOys33yW+tW\/sopwtgOtK47IzWthKRhAKl\nS029q0BEFHAoK89KQWKojwOaikOKtScCqE8gQMfyoAZJMsQJ6nsKzJi075bP0qcnPLHr3qSKHcSe\nwpXAzZl8lMd6S2h82NmY4A60t8czbR2qwoIsnCgA4xVN2RO7H2IhlDIq8L3JorPtZTbyMSeoxRUy\nptu6Ep6HWa5M1trXmkYUqMj2qbzAV3joazdZmNzqJDdBhau6fazSaW02MqrkfhWdN8sVczg7Dnl8\nwY71Cdw6Gnhcc00nnNa2OgFGBinCoXlCuvPXiplqWiWSq1ScdaiAxSg0IEOLUhNNJ5oAyetWUHWk\nApx4ppOaBCgU1utLntSGgBAeamQAnNQZ5qQEgYFAiwSAKaTmow3NSAZoAaF5q6sfyA1U71ft8OhF\nMmRSul+Xisvcd3NbrxbiVNYlxGYrhlNAoj1NOzUSmn9RSLJFNW4WwapJVhGx0oYM1rSQnJJ6DNUy\n7BmKcHOasWqkWzv+FVtwExHrWTZz1ZPY0IL2VowHODVO9LvIMmkZ2XB\/hpHkMkyD1rD2ajLmM+lg\nTT49QDpMuUjQv1x0rAkKliqKAATzjHFdMJ\/si3A\/vRFSPxH+FcxcLukcx8LnIFbR1RvTXugHVV2r\n6fjVeU4j3yDj0p8CMGd2GFxgE1WvkZ4tyHcoPaq62NCWMoFZtp9R71JpR\/018nlhUHKW8aY+Y4BN\nTWTKl8oGSWOM0IrodZbNiMCrGapwHGKt5yKpDAmm96UDijGBVoVhBk0pOOtHSo3egLE0WDVnZtjz\n61Std0kwA6Cr0zAHFCEyBhUD1OahcZFDAbHwcU5jxUYfFNMwPFIY44NRPH7U8HNOPSgZXKYoxUpp\npHFA0MK00rxUuKjc4FKwFO5O0Gsa5ctJgdhWrdNnIFZcyfMrfhQIrqCxUelaC4WNgOOKoqpjkz2N\nXGYCM+mKTEYcmXuz9auWzGRzFg49e1U4xumY8k5qzNP5LJGoIx8zGqlroSu5LcSW9m4jaAM2OTRU\nWrAP5MyHIZcE+9FEIpxuyZPXQ09ZQxajLkfxZrpvCs4lsPJYAYYj61i+IwGvoyfvMuDV7R7SVbBJ\nYmwWYmuVr93aRg3dXRpahoSMzPbN5Zz909Kx20m93lQEb6NXbIhksA0xGV6tWG8qeaxVtw6ZFHO4\nrQcakkYMmlSQqXuGXevOxeaRa1\/J85n5OSO9ZO0qzK3UHFXGTluaRm5PUd2pppw6U09a0Rqg70tJ\n1pcVRQZz0o6U0AA0E0wDeKTNRs2KTNAh5bBzU8ZBXNVuowajExi4bp60CLwABp5fjis1rxe2T9Ke\ntxn1H1oGXN2BUtvc+W45rOab3pBMFG7PSgTNqW5UnIrKvm8ycMPSoBcPIemBT+TyetMlIYtSD2pu\nOaeo5pFD0FWoIyzAUyNC2BjrWpa2+3GetJsCdsQWCp\/ExzWZIpXDnsa2riAyFQBwq1j3SuCwKkCu\ndO7sctXc09PMFzA0bgbqgeyaGXOOAeKp2sjxSK6cZrVmuWkiHFOckomauY+oMQJHAyMY+lY4+Y7x\n92tqRg28N93BrIlhCoSvAPpUxlbQ6qfwkNwW+zvtHHtVXTyZBJGxwAM4qVJHRtpOAT1NOuZCsbi2\nRcn05NadLGnmRJ80rknCDkCn2UYN0HJ6EY96hgZpLORjwwG3jvViBUieJyd27G3HUfWntoVujo4j\nirKtkVXQfKDUqnFUgJQeKQntSBsd6CR1FUAjMRUBYsakYk0IgFMC5bsltCCfvHk1G9yrsTms+\/af\nA8lsH1IqKKSRowZBhhwcUtRJGn5wJoZ0I4PNUBLkHFULrUJYZAEgLj1zRdlWNfHJxVaRsPxUdpfG\nZcspU9waRj5krEdM0XFsWYn4qcHIqnHleDVhTTAeRTaUmkouMQ1XmbANTsaqztQBTkOTVeVAy4xU\n0jhQT6UzO5QcY4qQKwUEAHpUcrGNGXtjipnBUn0qG4+5mgmxQUbXDdPXFNvNzXIx828YAFTMpKYX\nv796sxwkAPIAWjTIo5raha6sSWtr51uIbhFymCBuwaKzI9QeO4kdxuLe3SiolCpfQlSidJ4jXDwS\ndfl\/rV3w9I4tmJY4VsYqvriZjiB5wataNGY7DJ\/jOalv3dTl6GhO0knG9gh4wD1psVh+8G1sL1xV\nu3AdcYHHWnwwn7WGU5Udc1zzu5b6ANiiKyEsMcVhXy4ui4HDV0F3dxpIyZwT0rJvBHJaEj\/WxsCR\n6iqg9dRp2ZnimvxSg8UHmulHUhq9KcBxSCn9qsobio2NSNULnAoAYzYpV5qMfO1TIuKZIoFI6Aip\nQuKGHFAFURKD0pko9KnPWoZCOlAFf5ieTUirnrQvWnrQBJGgzUxUdqYvFSH7uaCSH+LmpI+uKazr\nmm7sScUDNWzTc+MVtxRdMVi2LfvFIrdRiV+UZOOgrORSGS6kLWQoBuNRvvuVMhjrFmkcXhaQHrW7\na6lF5QQ4rmblFaHG9ZakOnRrko6jg1NeoiAhPSp7J4WmkzjOeKp6hKPOYKeKxl7z1GZkS+YXRh1H\nB9DVK6hkWHcqgEYyD0rUtk3MxxzT7m1FxCYw2wnvitrFU58ujOWuISFJwMeo7VSi3rMNoJBPI\/rW\n9dWrQhY5FYg9COlY8cb+adjbcHGa0jI6NOhJco0CqowMncQO4qJn33cW1Qqggin3bp54XcxYDqO1\nXNP0yXULhS2fKTlpFHQVSelymb0S5jBpelPiXCYHQUjDFUhIacEYNM+6MDpSk4ph61dyh4NPFRDr\nUi89KaJYjgHrVSYsAQKuMvHNVZRwcc02gRUWVgxUCp1XcvOKhXJf7tWV4HSpsURi39+DU6RhRgUA\n07tVCG45pwbFJTc4NIESZozgVGGoLcUrlCSNxVSVs1LI9V3NAiEjdwelOVe3pQOTUyrSGVpk4+n6\n1Skw649K1ZUynvWNI4WZvTNBLI4SQ2O2agiuWtr11bJUnB5qUHbID2zTltla4eaXlFGaE11JfkSL\npcU0rODkNyAO1FRwaxLGzAKNg6AdqKhqrfQLwNjxCXUQtuIBB496uaJeNdWSoUI8sYz61H4liU+U\nc884FXtJiRLGIJ3TNOUo+yPP5ZXuaFqfKV27Uy3vvMnYZ+XNOGI4WB5zVcW6opcADNcktWaGhcQq\nu2QqPm71WmWB4iAP3jDBNT21yJYSkozt6U37Ikp8xXwPSp9n71x3ObOUYqeoNBNW9Vtzb3ZzxmqQ\nPFdsWdEHdDgadmo804NVmgMTUMp4qYtUEvIzTGMQhV5qRJASKqOxPAqBvPTLIc47UyTW3d800zAd\nTWSlzcPwRinN5vrmnyjsaLTJioGlQmqW9+maVUd+QRVco7FoyotNFzjoKrPHIvUD86Ztc9DRyhYv\nfawOtPGoIBzVJbYty7E1MlogbNDSJY4zl2yF4qVG3EGkKADihDg4qANnTj+8Ga20nWOVeecZrC04\n\/MK0FcPIz59hUW1BFm6tkuAGxhjzVL7IVbjoKvwsZFZSME1nGZ45mjk4IOKxqJp3RhUjZ3LKyLA5\nJPaoBKsrkk5yajuF3LnNNgUAYrNrQyuW4ZNlwQOm2rAXeaqQrvuSB\/d\/wrRjgKkepoaBakF+qLYu\nWGQBxWPoWji\/V5ZlPlknHOMmtK9f7dMtjAw25\/eP2FbMCWlnAsUB3beM9KaVka3cUV4vD1hbg+ZG\njk+vNWBa29vZSrs8mMcgAY3Vct9rfOwyBycniqWqz+ftwCq9CB3qo6asFJvcx4cFeDnHFD1FaxtB\nPNGxyCdy1NJWt7m0XoV29qjJxUrVXlJHSqNBDMA3WkfUVi+VBk+tZ1yJMFlPSsqa6lAyyk\/SriiT\nbmvy38VRC79zWfZyRSAmYn2FaUFpb3EJZSynJ71YXSGm8PanLekHGaR9PRXULKeQeDSf2eu0t5hG\nKLoOZFqO+TOH4q0rq4ypzWDJCEjLrMrY7ZpkF4yHrSsPc6Bmpp5GRWcL4MRzzVmOYMMVm9Bonyaa\nz4pM4qNjSGRyyVAzE1I4zUZFACoasAjFQLgUk9ysK4Xl\/wCVDFcfcTeWhJOABWA8mSWPrVi4meYn\n5sn9BVMgn5etNEtkinerADtUqXK2pEbjcGGGzScW0QYjNI1ulzcK4YbD1wanR77C9CO5tCjh4Buj\nfkY7UVYW9hh3RNEdqngZopqUl0E1HqzV1qUveRq38K4IrW0cf6JBzxtx+tZXiiE2+sSoOxGPyrU8\nP\/Np3zfwMamtDkTXYwnBwfKy1O5L7F5p7AlAp\/Gmu6pcBhV2SMPHvFcq2TMyBgtvIm1c54NW4LeI\nb5ZW\/dRAsef0piqrIpes3UplRhbRliXYEjPGKuGugeZFc772KWeTqxyB6DtWTnFdM+BbKoGBXO3M\nRinZccZrWL1saU2NDCjNR9D7U\/qK0OhCk5qKRuMU6mkZNMohRKsJED1pgUipN2KoQ1rdCeBioym0\n8ipi3emM+4dqaYIrtGp7CkWML0NK7D1qAyc9atMomdQTzTcKKiaTnimhjRcCxvyaeDmoE5NTAjtU\nN3IZJSBeaVM1MoA5NIRagcQx7v4jwKsR3GMfLgmsj7WTNiMArjqT1q5BIpK7sKPzppCTNmC6O\/G3\ntnNR6p88H2hQd4OCRS2kkGMPIDzwPStCZLWe2MZkAJHsamUeZWYSV0c9DcGVdpPNWlUooNNGkyQz\nbonWVR129RUnzSEIo5rkaa0ZytNPU1\/DsFvNfyNdFRGkRb5jgE5FNvjJcTvDa\/uoc48w9x7VFA32\nPOApcjuMinq7uSzOCT7Uk+qLjJRXmTWVtDaxlYxucnlsZJq4Yo2UFWUOOoPP6CqUa7chcn1xViNZ\nMA7mRT0ycZp2JvcmZygVWJOO3SoLgeYGA6fyp4UliMMSe4qOeCRAC5IXrT3Gis1vhhnHTrVSUEHB\n7VorNuBJIC9\/es65uIXk2owz7VcbmsG0ys54qBvmNPeRRkFhUYkTPUVqjcSSENGRiqf2aNhhhWgX\nU9xVOfYeQwBq07EopS2CjoAaiFsV4G4fQ1YMpTILAikN1GSSSBxitdCysYGyCZH9uaDHIBgSMR71\nYFzFjr0FKLmNmyKVg0KZtZHGN7Y9hUJ07YwYu2a1hICOBgetKAjcsQTQ2kJ2KVtZEtk5q+iFMcVO\njIB1FDsnXcKzbuIdnK1EzUGVQPvComlT1FQUIzVEzmnmRMcsKaGRj1FAFe4uvs4yeuOKpI5ly8r7\nV\/U1av7TznDow9wTVVYy528YHFF1YljZH3YCDj0p8MOMk9asRW2Dgda04LDeAeueKzcuiJuY8qBk\nCEZDfoamt7c28a+XGG55z1\/Ct2LTI0ceYAfxqddEgaQyBWI6YzWbnpYOZHKzWMMspeOQgn7wx0NF\ndj\/Ylr\/dYZ\/2qKPbNC5oGR4luBd6yzYGQoz+VXtJRotIV1P3mJIrD1dtupSkeuK2PD85bTnic\/cb\nj8a6KjujKpLmdyUEvL75rYgY+UAayQMOWz0NaNtIGQZrnktLGCWtyScjyMrWNGPNvnkf+HpWs2fJ\nfv1rMs4i0ckp6FqilpcctSfzmdgq+tVdWh2MhP3iORUsUqQM0r\/dUE1RuZ1nlLMxLuMgHsK3jG7u\nVTKftRnbx2pWHNBGa1OpC5BoIqMgr06U5XzQUOC0EU5cUMy7sZ5pjIWzUbBu1WCtIY80wKRRj1oE\nXFXBF60nlgUCKnk8UeTzVvbRtFAFYR46U9UOalxRxQIUDFVb25EaCPJy3pT7m5S3iLt17VhSTvJI\nXY8mqirkSdjQjnAThxuHfPNI99JjGeazw3pVm1t2uJQo79zVmd2TwXUgYHJ\/Cta0u55nVVyc9aWP\nT12BQgXsTWvZQxWuMDtUtotRZPYwTIQQxDfpV+WExo8yplgMnFRR3Kp1IFW0nUruBJUde9ZSipKz\nLcU1YxrK6a5uZAwPAzV\/zABggcGmyW9vb3DSQOMuOVHaljUO2SQMetcri4uxytW0J4CXfEUfzDpW\ntHGVXMzRsTjhT836VnQSoqOEU4PB96twOVX5VIB75xVrYaNGIsGAijJz3IxWLe2t5rGvxaWs\/klw\nWLkZ2qPat1bhY1G9SzgZrnSJL3xrZOl59hcZ2SY3ZOPukHrmtaaTepTWlyO+8BXPmW8NlrqTtJP5\nUiPHsKDnJAyc9DVPxD4BuNB0ufU7XVTd\/ZW\/extFswO+Dk56ivQrvT7A6np+q30MVvfwXLRpNwpl\nBUpz65BFUfHkiWvgvWvPYR+cSI8n7xIAGK6rIi7OK0jwRJrnhlda\/tV4SyO4hEOR8pI67vaoH8Gu\nnh\/TtU\/tVyb2SNDH5P3Nxx13c4r0bwnZLb+DtLtxhQ9qTt9Swyf51n3mnXE3hLSoLWFpDBdxlgo6\nKrnJosh8zPPvFmiyeFNRtrJLxrtrhNwLJswc4x1Nb3\/CrLqWyEh1kC8MXmeT5Py59N2f6U34sWdy\nNc0vUPJf7HEqq82PlB3ZxXpMcsbRrdh1+z\/Zh+8z8vfvRZBzM8j1zwTaaB4fj1O812XfMn7mIW2Q\n8m0kLkNx060aD4GsPEOhtqkWvyxiFf8ASE+y58ttoJAO7nGetdT4\/vJbPwLp6RRQSC5IhYyxhtoM\nZ5X0PvVP4bxFfAeuLjrLJ\/6LWiyC7sU7X4Tw3lvaXEGvyGK5TehNrjjGRxuqvdfDqz0zSZNTvdfl\njhiYqcWu7ocdmr0nw0xXw5oa4GDapkkcj5Kz9ZF8PB10NOtEu7gyPtieMOD8x7GiwuZnm\/hbwbL4\nns7i9fUvstnE+xHEe5nOfTIxWwPhTdLezpLrIW0jjDrKIssfquePzrR+HCi88G6hp5O2489hJGhw\ny5Pb0rptL0y00tNQ06zvLi6mMYZluJ\/NdSRjHPQUWQ3JnExfCy5bVJ7WXWCtukSyxTLDktkkEEbu\nMY9+tRn4X3japawQauHsZ4TK07RYZcY4255zkd\/WvS4p421uaBXVpYrVC6Z5XJbGfyNMikX+0LF5\nJArzWjKsfQE\/KeBRZC5medt8K5PtltGuuM1vcK2JPI+YEDPTd0x71FefDO20+2jnu\/EMqJJKIQRa\n5+YnA6NXojzw2t3o1vPKkczFgqMcEnYayvGWI9K0+FyFkfUIyqnqfmzRZBzM5Q\/Cu2XU00\/\/AISG\nX7Q8ZlC\/ZeNucdd1OX4TMVgZNbkKyOUb\/Rx8vXn73tXayKf+FgW5\/wCnA\/8AoVa9nKIooY3HMjNj\n60WQczPKtQ+HVppelT6lf+IZYreByjEWm7+LaOA3rTk+Ffl2MUkuurHdywmRY2iwhOBxuz7jtXca\n\/wDbl8Jah\/Zlml5decdkMkYkDDzOeD6DJosNLS98P21hqzx6paPAT58kYUx4AGOvXlueOlHKg5me\nR6bG2XSZV3ISrc9xWxDEpAPPHAArO0q1jgvLqGI7oopnWNuuVBIB\/KttQAuD0+lebUdpNGlx0cSq\n\/bPrU7AIy4bcxHOKhVSfu84qReCDXLVbWwrkwP7oNxnOOvNFG0Y3HAB7UViqrQHF6uA1\/nvgZq3p\nDFYJcDqRVPWD5eovmr+jMGs8jqGOa9W94XJeiNEpiIMeKsBwsa4qKdJJYF2A\/hULyLDEBI2G9Aea\nUYyktEZ3SNKSRVtJMcnbVC1LR2wVyFU8nNVGvXfhTtT270wygglj8o9a6IYXrJkufYS+lUYSIl8n\nJ44ArFiuCdSGScEEcmrk9yZjJgjCjHFYZk2X6Hpg1bik7I2grI6E80nSmo24UucVkdKHYqN07jrT\nwcUp5oGQrLg4apQVJz3qvMKjWYqcGnYZeODSgiqwmBHWjzRTGWWYY4qFn96jaXjrULSe9AFjzKDI\nKqb\/AHpDJ70wLRcGopZljG4nAFVnudo61nXNyZOM\/hTSuRJ2C8ujcSew6VXBptKDWiRg3cmTBIzW\nhaSojAE8DpWWGx3qWKQoc07AmdvFIiQb1OSRVSfVVhJ+b5vSueOpzbdqsQtQqZLqT19TUqJpz6G2\nb6W5YKoJyelbVtcGOERF8Z4PtWBAvkqAOtXYie5zVKK6mbm+hsW2z7U+zJXb+uatquWLEniqWl7G\nnbdkgIScfUVsW1u0zBnG2L+f0rjr6TIWoW\/mSsGCgqvc1pwvGMEAKe\/enwadcTj93GViHfpWhbaV\nHCh3FSfbn9azVzRRMzUL6O0tDKQCcVyN5YeINbjS5tdInkt3+eORMdPUc1veOXitdLKqMM1dZ4OK\nnwhoO9mBMa7cdztPWumlHqE3bQ8a\/sTxHq1n9ohsr6aCNm\/eM5O0qcHqeCCKih8O+I9Sgtbg2l7d\nWsxBiZn3Bj7ZNe96dC62TxSRhTNJMzBeQMse\/wCNUPBNt5Xg7S7e4wJIRtx\/tKx\/wraxnc8dj0bx\nDc3c1paQ3zXFrgSQrKR5eRx3pG8NeLopY4TaakrSZ2qJTz6966NZJF+Nkyq7BWnGQDwfkFegWzN\/\nwlmufMflt49oz04NFgueKahZ6tprLb6zHeRs\/KpM5YN9OamufD3iS309ppLG\/SyVckBjtC\/7uf6V\n3nxM5fwsTyTdLk\/itdL4gm19LyZNGgsZYPso837U7KR16Ae1Fh3PIE0PxHJp63TaffTWar5iliSA\nMdQM+ntTzoHiVbdJItPvI4JyNux8K5bp0Pfivdocia3Tov2Y5A6dVplqsbadZxuOEjWQf8BxRYOZ\nnhg8LeL1YRpZaipReEEuMD86SPw74sWWSMWmpBowGdfNPAP417sTu1CUk7QbYHPpzWbpet6fq63k\nenXIuPskPlyOFIG78fpRYVzxi08NeI7mEXWn6feeXIP9ZE+N3P1pw8H+LEkaVdNv1dh80gkwx+pz\nXoLPar8Jw19NcQw85e3xvB3HHWnxSv8A8K20N1lkJM9v8xPJG8daLBc82HhrxRHfGFbLUBdypvOJ\nDuZRxknP86X\/AIRvxQ935Bs9QNxAvmBTIcqDxkHP8q95n+We8YcMLUYP\/fVH\/MXtSf8An0fJ\/wCB\nJRYLnz5qGkazZR213qUN3GJWAglkfJJ68HPFW7rwt4qSPz7qwv2SL5g7Pu2+45rvvi4qx6doix\/d\n+1jH5Gu7uWxHJ5eWl+znCHhTRYfMeDP4e8UrcQhrTUPOmB8s+YSSOvXPSkfQPFK3sdo9tqIuWUyJ\nGZDyBwSOfeveoeZbUkYIt\/yqhZrfG\/sXuJbWS32v5ZjjYOOnUk\/0osK54ovhbxsfu2mo4JI4mPX8\n6F8LeLrUJHJY6giSNtVBJwSeegP1r1\/xe+zRLQwu4zqUAJzg\/wCtGRWd4unvIvGemLZatb6YzWcu\nZrlQyfeXjBIGaGguefx22o6A0SapYS2gl4RnHB\/EVvwsJlBAAHrWn421G0k8G21m2p2l7f8AnLlo\nHDbjnJOB0rFsJTHAq4+bHBrhrwUXoUtS\/EfLDB9oB6ZqNyN2VbdTC24kkZJ7004ArinKxRIGyTRU\nSkiiueVO7EcprxWS\/faeRxx61b0Kbyo5egXPXFFFe9TgotRIl8JZuNSY5WMnHrnms9ptx55NFFdh\nzoFfNQXFzvYIp4FFFAxm7Fu7AYJOM+tYdw\/78HuDRRXP1OlfCbtnL5kSmrVFFZPc3iJyKUNxzRRS\nKI5KqSUUU0NEW4qeDR5rCiiqBjTKTSb3NFFAhCW9aYx2jJNFFAFaR+Mn8BVVjk5ooq0YSYUUUVRA\nopc+lFFMCSJDI2B071fj2wrhOtFFMGTxuepqdXb1oooA6fwZHFd6rKk7ERiAk\/8AfS13Hm2VtIvl\nIHxxubnFFFclX4zSC0HNfidyA3bhT\/hULXUpYqDtC989aKKg1SOI8WGS42x7i3B6mo7L4ga3pFhZ\n2EFnYvFZgKjOrknAxzhveiitouyJnFMnf4s+II2Uiy0\/Ck8BZMHPr81RWnxG12OOFIrKxCxSNIPl\nf+LOQfm6fMaKKvmZHIjPXV7\/AP4SdvEPkQfbGbf5eDszgD1z29aur4116PXptWSK2DzRCKSDa3ls\nB0OM5zz60UUuZj5EUtf8Q6x4kmtZbtYIPshDQpChAVvXkmtG++IviO7sJbXybOJpY\/La4jRhJj88\nfpRRS5mPkQ2P4l+JIbBbYQ2bSLF5QuWjJkHv1xn8KcnxK1+O3ihWzsSIovKDFXyRxyfm68UUU+Zi\n5ESD4oa+ZCxsLDJTZ9x+n\/fVZOgeKtT8Mm9aztLWX7a++QTKxA68DBHrRRS5mHIi83xB1OXTzp8m\niaQ1mf8AliYX2j8N1QDxhq\/9i2ulLZ2Yt7Z0dCFbOVbcB97HaiihyYciL7fEfxE16bn7LZYaLymh\n2NsYZ4J+bOevfvQPiL4jN6101rZHMXlLHsbagzkkfNnJ46ntRRRzMORGbrniPVvENlZW17BbKtm4\ndGjDZYgY5yTWs\/xM8QlyfsGn8ps+4\/T\/AL6oopc7DkRGfiR4jM9vKtrZJ5KldgRsOD6\/N\/Kop\/it\nrtvLFnT9OUx52qEfAz\/wKiimpsTgilqPxK1nU7WK2nsrFFSdLgFVfO5WDAct0yKsD4g6vqGt2+oy\n2NiZ7eJ4VTY+0hiCSRu68UUVLm7E8qIvI\/tbULm\/uYo455m3FYxhQcds1dtpBCTFKxDD7nvRRXDK\nTlLUcS0s277owKeDnrRRXNPcQoQkUUUU29RH\/9k=\" alt=\"Anakin\/Padme meme. Anakin says, &quot;when_all_completed&quot;. Padme asks, &quot;So all of the coroutines ran to completion right?&quot; Anakin says nothing. Padme asks, &quot;So all of the coroutines ran to completion right?&quot;\" width=\"486\" height=\"488\" \/><\/p>\n<p>If an exception occurs while producing the coroutines, then that exception is thrown, and <code>when_<wbr \/>all_<wbr \/>completed<\/code> is never even called. Any coroutines which started prior to the exception are still running.\u00b9<\/p>\n<p>There&#8217;s also the possibility of a <code>std::<wbr \/>bad_alloc<\/code> thrown by the failed allocation of the coroutine frame. We were able to eliminate this in our custom promise by preallocating space and using a secret signal to pass this preallocated space to the promise&#8217;s <code>operator new<\/code>. However, we want <code>when_<wbr \/>all_<wbr \/>completed<\/code> to return a C++\/WinRT <code>IAsyncAction<\/code>, and we don&#8217;t control the <code>operator new<\/code> of the associated promise; that one came from C++\/WinRT.<\/p>\n<p>The best we can do is to catch the exception from the creation of the <code>IAsyncAction<\/code> and fail fast.<\/p>\n<pre>template&lt;typename... T&gt;\r\nIAsyncAction when_all_complete_worker(T... asyncs)\r\n{\r\n    std::exception_ptr eptr;\r\n\r\n    auto accumulate = [&amp;](std::exception_ptr e) {\r\n        if (eptr == nullptr) eptr = e;\r\n    };\r\n\r\n    (accumulate(co_await wrapped_awaitable(asyncs)), ...);\r\n\r\n    if (eptr) std::rethrow_exception(eptr);\r\n}\r\n\r\ntemplate&lt;typename... T&gt;\r\nIAsyncAction when_all_completed(T&amp;&amp;... async) noexcept\r\n{\r\n    return when_all_complete_worker(\r\n        std::forward&lt;T&gt;(async)...);\r\n}\r\n\r\nfire_and_forget SomeFunction()\r\n{\r\n    auto first = First();\r\n    auto second = Second();\r\n    auto third = Third();\r\n    try {\r\n        co_await when_all_completed(\r\n            std::move(first),\r\n            std::move(second),\r\n            std::move(third));\r\n    } catch (...) {\r\n        LOG_CAUGHT_EXCEPTION();\r\n    }\r\n}\r\n<\/pre>\n<p>We move the coroutine into a helper function <code>when_<wbr \/>all_<wbr \/>complete_<wbr \/>worker()<\/code> and and the new <code>when_<wbr \/>all_<wbr \/>complete()<\/code> function just forwards the parameters to the worker, but does so in a <code>noexcept<\/code> function, so if there is a problem allocating the coroutine frame or copying the parameters into the coroutine frame, the exception triggers a <code>std::terminate<\/code>.<\/p>\n<p>Note that we called <code>First()<\/code>, <code>Second()<\/code>, and <code>Third()<\/code> outside of the <code>try<\/code>. This means that if (say) <code>Third()<\/code> throws an exception without producing an awaitable, the exception propagates immediately, and the coroutines <code>First()<\/code> and <code>Second()<\/code> are never awaited to completion.<\/p>\n<p>That&#8217;s probably not what you want, since the point of running them to completion is to make sure they have stopped doing work before allowing the next thing to happen.<\/p>\n<p>So the calls to create the three coroutines should probably be inside a <code>noexcept<\/code>.<\/p>\n<pre>\/\/ Go back to the old when_all_completed\r\n\r\nfire_and_forget SomeFunction()\r\n{\r\n    try {\r\n        co_await [&amp;amp]() noexcept {\r\n            return when_all_completed(\r\n                First(),\r\n                Second(),\r\n                Third());\r\n        }();\r\n    } catch (...) {\r\n        LOG_CAUGHT_EXCEPTION();\r\n    }\r\n}\r\n<\/pre>\n<p>This is still awkward enough that it&#8217;s unlikely anybody would write it.<\/p>\n<p>How about changing <code>when_<wbr \/>all_<wbr \/>completed<\/code> so it returns the exception instead of rethrowing it?<\/p>\n<pre>template&lt;typename... T&gt;\r\n<span style=\"border: solid 1px currentcolor;\"><a href=\"https:\/\/devblogs.microsoft.com\/oldnewthing\/20210429-00\/?p=105165\">com_aware_task<\/a>&lt;std::exception_ptr&gt;<\/span>\r\nwhen_all_complete(T... asyncs)\r\n{\r\n    std::exception_ptr eptr;\r\n\r\n    auto accumulate = [&amp;](std::exception_ptr e) {\r\n        if (eptr == nullptr) eptr = e;\r\n    };\r\n\r\n    (accumulate(co_await wrapped_awaitable(asyncs)), ...);\r\n\r\n    <span style=\"border: solid 1px currentcolor;\">co_return eptr;<\/span>\r\n}\r\n\r\nfire_and_forget SomeFunction()\r\n{\r\n    auto eptr = co_await when_all_completed(\r\n            First(), Second(), Third());\r\n    if (eptr) {\r\n        try {\r\n            std::rethrow_exception(eptr);\r\n        } catch (...) {\r\n            LOG_CAUGHT_EXCEPTION();\r\n        }\r\n    }\r\n}\r\n<\/pre>\n<p>This time, we allow any exceptions from <code>First()<\/code>, <code>Second()<\/code>, <code>Third()<\/code>, or <code>when_<wbr \/>all_<wbr \/>completed<\/code> itself to propagate outward, which in the case of a <code>winrt::<wbr \/>fire_<wbr \/>and_<wbr \/>forget<\/code> means immediate termination. If any of the awaitables complete with an exception, we log the exception (by rethrowing it and immediately catching it with a logging function). If this is pattern you intend to use a lot, you could wrap it in a helper.<\/p>\n<pre>void LogExceptionPtr(std::exception_ptr eptr)\r\n{\r\n    if (eptr) try {\r\n        std::rethrow_exception(eptr);\r\n    } CATCH_LOG();\r\n}\r\n\r\nfire_and_forget SomeFunction()\r\n{\r\n    LogExceptionPtr(co_await when_all_completed(\r\n            First(), Second(), Third()));\r\n}\r\n<\/pre>\n<p>But if you&#8217;re going to be logging and discarding exceptions, maybe you want to just make <code>when_<wbr \/>all_<wbr \/>completed<\/code> do it. After all, there could be multiple exceptions, and <code>when_<wbr \/>all_<wbr \/>completed<\/code> returns only the first one.<\/p>\n<pre>template&lt;typename... T&gt;\r\nIAsyncAction when_all_complete(T... asyncs)\r\n{\r\n    std::exception_ptr eptr;\r\n\r\n    auto accumulate = [&amp;](std::exception_ptr e) {\r\n        <span style=\"border: solid 1px currentcolor; border-bottom: none;\">if (e) {                          <\/span>\r\n        <span style=\"border: 1px currentcolor; border-style: none solid;\">    LogExceptionPtr(e);           <\/span>\r\n        <span style=\"border: 1px currentcolor; border-style: none solid;\">    if (eptr == nullptr) eptr = e;<\/span>\r\n        <span style=\"border: solid 1px currentcolor; border-top: none;\">}                                 <\/span>\r\n    };\r\n\r\n    (accumulate(co_await wrapped_awaitable(asyncs)), ...);\r\n\r\n    if (eptr) std::rethrow_exception(eptr);\r\n}\r\n<\/pre>\n<p>That said, you may want to make <code>Log\u00adException\u00adPtr<\/code> a macro, so that the error log will have a line number that points to the <code>LOG_<wbr \/>EXCEPTION_<wbr \/>PTR<\/code> rather than to the helper function.<\/p>\n<pre>#define LOG_EXCEPTION_PTR(eptr) \\\r\ndo { if (auto&amp;&amp; __eptr = eptr) \\\r\n    try { std::rethrow_exception(__eptr); } CATCH_LOG(); } while (0)\r\n<\/pre>\n<p>After all this discussion, maybe your conclusion is that <code>when_<wbr \/>all_<wbr \/>completed<\/code> is just too weird, because it conflates exceptions that occur while producing or consuming the awaitables with exceptions that are produced by the awaitables themselves. And the correct answer is &#8220;Don&#8217;t use it. Just catch the exceptions in the awaitables themselves.&#8221;<\/p>\n<pre>IAsyncAction First() <span style=\"border: solid 1px currentcolor;\">try<\/span>\r\n{\r\n    \/* original body of the First() function *\/\r\n} <span style=\"border: solid 1px currentcolor;\">CATCH_LOG();<\/span>\r\n\r\nIAsyncAction Second() <span style=\"border: solid 1px currentcolor;\">try<\/span>\r\n{\r\n    \/* original body of the Second() function *\/\r\n} <span style=\"border: solid 1px currentcolor;\">CATCH_LOG();<\/span>\r\n\r\nIAsyncAction Third() <span style=\"border: solid 1px currentcolor;\">try<\/span>\r\n{\r\n    \/* original body of the Third() function *\/\r\n} <span style=\"border: solid 1px currentcolor;\">CATCH_LOG();<\/span>\r\n\r\nfire_and_forget SomeFunction()\r\n{\r\n    co_await when_all(\r\n            First(), Second(), Third()));\r\n}\r\n<\/pre>\n<p>We caught the exceptions in the awaitables and ignored them (after logging). This means that <code>when_all()<\/code> doesn&#8217;t have to report any exceptions in the awaitables, since we removed them. Any exceptions that come out of the line <code>co_await when_all(First(), Second(), Third())<\/code> were the result either of producing or consuming the awaitables, and those are probably failures you want to treat as fatal errors since you have no reasonable way of recovering from them.<\/p>\n<p>There, I managed to convince myself that, after spending a very long time trying to write the <code>when_<wbr \/>all_<wbr \/>complete<\/code> function, it was a bad idea after all.<\/p>\n<p>\u00b9 The Windows Runtime uses eager-start coroutines, so the coroutine starts on creation. If you use lazy-start coroutines, then the exception is thrown even before the coroutine starts, and you end up abandoning the coroutine without starting it. You don&#8217;t have the problem of a coroutine still running, but you do have the problem of a coroutine that never started.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>The things that could go wrong before you even start.<\/p>\n","protected":false},"author":1069,"featured_media":111744,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[1],"tags":[25],"class_list":["post-108405","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-oldnewthing","tag-code"],"acf":[],"blog_post_summary":"<p>The things that could go wrong before you even start.<\/p>\n","_links":{"self":[{"href":"https:\/\/devblogs.microsoft.com\/oldnewthing\/wp-json\/wp\/v2\/posts\/108405","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/devblogs.microsoft.com\/oldnewthing\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/devblogs.microsoft.com\/oldnewthing\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/oldnewthing\/wp-json\/wp\/v2\/users\/1069"}],"replies":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/oldnewthing\/wp-json\/wp\/v2\/comments?post=108405"}],"version-history":[{"count":0,"href":"https:\/\/devblogs.microsoft.com\/oldnewthing\/wp-json\/wp\/v2\/posts\/108405\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/oldnewthing\/wp-json\/wp\/v2\/media\/111744"}],"wp:attachment":[{"href":"https:\/\/devblogs.microsoft.com\/oldnewthing\/wp-json\/wp\/v2\/media?parent=108405"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/oldnewthing\/wp-json\/wp\/v2\/categories?post=108405"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/oldnewthing\/wp-json\/wp\/v2\/tags?post=108405"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}