python311-gevent-23.9.0-150400.13.6.1 >  A e1p9|3,mvv`<J7w_B͘Y?RBGСAҋ#9_$ RGnSy[)R-㏰g3J֨-%&&t^;+ƴWC9-0f,>Wd Nւ^vDJK:xј=m$2[f e=]o= $/^P[+)Q-a"$@3>~6%aժ؊oF'aYFs/cpAG?Gd ( _HLX\u XTX X X ,X X DXX \X11@X>>"?T"B"(C8C.9C.:G .FxGxXH@XIXXY\,X]X^4bqcdefluXv wXx,@Xy9`zG G0G4GEGHGLGRGCpython311-gevent23.9.0150400.13.6.1Python network library that uses greenlet and libeventGevent is a Python networking library that uses greenlet to provide synchronous API on top of a libevent event loop. Features include: * Fast event loop based on libevent. * Lightweight execution units based on greenlet. * Familiar API that re-uses concepts from the Python standard library. * Cooperative sockets with ssl support. * DNS queries performed through libevent-dns. * Ability to use standard library and 3rd party modules written for standard blocking sockets * Fast WSGI server based on libevent-http. gevent is inspired by eventlet but features more consistent API, simpler implementation and better performance. Read why others use gevent and check out the list of the open source projects based on gevent.e14s390zl34$SUSE Linux Enterprise 15SUSE LLC MIThttps://www.suse.com/Development/Languages/Pythonhttps://www.gevent.org/linuxs390x5eeh_ N P PBdC u uuv0ss;};&zBB ''2/245)))MCNTeGesmFmF66""22%%,,YY55HPHSScc . . KL=?%?ĐĵKKwxaWLL4848$%0 0 ==5$%x !,--7L7Luv X Smmsnsnww^|Q^2(5GP@8xw@<(+'6&,#<QUfW/ 7*!@ &n:Ad\ __bb[[9905?__1U1U\^xz4=0=kl3S,PP|d" [Q*11~:-:-KK2Z PP 3,*dFy{>LLyy L L$$#7#7EEuuAR'' b1b'^ O Ors&.  , #d"# r9   DyvmH##00ooZ,[z--_`U4p4pO4T4T-- 4D4jj//J ((XX  ett  jj66 }  ,n14Udd]^TT1~Ad ] ]-- Q Q KK @ @//eeamm++AA & &uu " 1NSNS&& U e+`  L Cz;\;\ii$5}g++ b b"x"xVKV3;;:>]]R x x y yb I I{8{/^ee)) PPQgE*s+]IJ<0/:7Yrtp] PDAUbIk44r=e =1P (K {j  <7`t'  a/Gy| 5 aR >  jJ1(-LdJ Wh(01  {)2eKG33X]5M ![FrMVOGNZ  Z >&`{(Q  pX"Mx2V5eG =r   Sj9)?`AA큤A큤A큤A큤큤A큤A큤큤큤A큤A큤큤A큤A큤큤A큤A큤AA큤큤A큤A큤A큤A큤A큤A큤큤A큤A큤큤A큤A큤A큤e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1dr6dr6dr6dr6dr6e1e1e1e1e1e1e1e1dr6dr6e1e1e1e1e1dr6dr6dr6dr6dr6dr6dr6dr6dr6dr6dr6dr6dr6dr6dr6dr6dr6dr6dr6dr6e1e1e1e1e1dr6212e2db6e8a800dc79b9c66a3971e27b30bdcacda7929c65d4cffc7fbed195eaceebae7b8927a3227e5303cf5e0f1f7b34bb542ad7250ac03fbcde36ec2f15084d46bc11d19e3853d54325973b8e2c53090f5638a7bf27fa1f5f1232c78901f797f48a0d12ebf307f02bc09789f5dd6913428fc0c1150beefffbd49fbe473f0d64938247ca9a57fee4c11656404b93c313029187e13da787c927b6c64a6805837c6411ccde8a1030d232c0f91a4650c08a1ce8dabc0a811c6f85b5354c01071ce3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855f2233ae9d3fa9da1617e7b1043276a4dbbafdfa16b6cd4c39de59a2220b355fb8363132f729f749549e82129d1de1ff71e878cb029f8c9255d897195943dfeee7e91251a24ded9f770dbbbe6371755e4c429ca7763cd664c9394c1fcd3183d2269be91dd3d0e1aca48a0fb9b644793dc2a66090567bafc41d3f888ac9126d1849d1d171270980a9f3f7b5095dd29f2f42a078ae90aabc292377bb453bf5d18549d1d171270980a9f3f7b5095dd29f2f42a078ae90aabc292377bb453bf5d18545f68629add60086699ab8fb3fa90443b0025195e5867f57d1bfbffec0ad6ae92024283d6feefe417234fae402d5d425b6b39bc19f43e69f4e34dd8906c19d33876a1a7f3ffb6d019edbe1a032c6e612c38587f7972072c9cc9dbc8a29c1cf47076a1a7f3ffb6d019edbe1a032c6e612c38587f7972072c9cc9dbc8a29c1cf470a80a1d83d42d5460ed849bb9a39c448c44c04d37f61d3692cce7ae2560a0be60045276974f57c0ea5490b678f523a16002e9909d9f755203ab78757a4ab80f36861b216296372a630452a253a64a53834e325526143a2e8d1e4c096eb8050649861b216296372a630452a253a64a53834e325526143a2e8d1e4c096eb8050649039e1cc6bc495e2c5007a6daaee3622c0ff04a2b34db03dbf2f61302b61e81c3c8e6cb1443058bf110fcad99009d594e93ffba5fe45ffeff173b64224992fca67be5e0f7fe14fc8934563c7f32f87dd6adcb711d0f3d4c6289cf3ce0e7f97a897be5e0f7fe14fc8934563c7f32f87dd6adcb711d0f3d4c6289cf3ce0e7f97a8982dd2113160196783a0269eb7a9d47959d7d79bbdc7910945d1738fa060f3de83dd982f93d77552d36a7cf97cc51c4533f709278c7b2fdea328d2866d6769418af88639ed1de15d8e0e7a1e45825c4b3544507d34b094c4d18d221a71a86e2cdaf88639ed1de15d8e0e7a1e45825c4b3544507d34b094c4d18d221a71a86e2cdfb6e64fe77a1af48753fa01e8f5a82e4a9d63315d3ef313f92622eb5eb7e4810fb6e64fe77a1af48753fa01e8f5a82e4a9d63315d3ef313f92622eb5eb7e481045334a28b78b17f5791adc0f9b17afd3a1a66629d2d2474c33b626cebbeb69cf45334a28b78b17f5791adc0f9b17afd3a1a66629d2d2474c33b626cebbeb69cfab359612fc419fb8f7e40dcc07f92dc8a5a0f13e43d1f72c10da9425fa5d197f5440ba3c886107ba8f40ce8901dcde4266ba49e4699f08f22c11976a0be6e6523ea5584aed6f5ec4554c5b4d2e1d885e6f25acd7cf4142dd55f3e0093fd3c2884246ce17004e875b6cdedf284ffdca13bab9b7abfae479f5b2f1d502b8b0c9c81d3e68d6fc2460a945fe4b33b12a91180711e9a9af2dfe78a8140ac1293e43ba4911069ff091c3f9b160dc2d678af28fec7dd8fad851a478220fca0398680890f5b4f3e6ebbe2a6580cc7592259876aff51e3771ebd9635f499a1ac4eb33638d81117e793137a6e7b819c6bcafad475b36a2ea93cfbcb0bd3df8aafab094be258f8bbe8264ac6b46933bcc7a88439c6adfdac497299753e2373731fad5af3d7530dcbe3f11c5069e4e8ed4a853126c1dff8d4bbe3541133a4ac8821d7d7fcf3c523b4d44d3f5cb3ea92d38ed18dee3f17b222103ea3f8c8bcbb7a9a29ca94282523b4d44d3f5cb3ea92d38ed18dee3f17b222103ea3f8c8bcbb7a9a29ca942823f45bd5f4790f19d0514b5deb3d5f712bc4dcbe24cc85262d00e8e4f8e92aee5a27c3fdaa6caa0227be4f7d0a569eb0965c5dc38880d4e4986e0a6e613f593210e513e13e10408ec2a38063b01eb62212cb7c83cbcb99719b3608b0259c3046e0e513e13e10408ec2a38063b01eb62212cb7c83cbcb99719b3608b0259c3046e518dcc5f8fff733341cd5e104d66c8bdd5922e8d6e769d4cba2ff5033b890eba518dcc5f8fff733341cd5e104d66c8bdd5922e8d6e769d4cba2ff5033b890eba5765d5e873149ceff07cceddcaddf432a94301f6c885c091bdf048d9cebe0c3f5765d5e873149ceff07cceddcaddf432a94301f6c885c091bdf048d9cebe0c3f3bbac8586dec73b586e5573589f75c7318c84e88ef22dbadae1d969a27890ad33bbac8586dec73b586e5573589f75c7318c84e88ef22dbadae1d969a27890ad39e2c599fcf8cd106c985b97c0288f5fe3f60ccdedaa2f577366209375d84802c9e2c599fcf8cd106c985b97c0288f5fe3f60ccdedaa2f577366209375d84802c4981a6c67295953888826bbe6dc44694621dbc185eff79f10c2ee98e4870579a4981a6c67295953888826bbe6dc44694621dbc185eff79f10c2ee98e4870579ab9a87773187a081e3834d367ac37a0861ebc11b175cca466063a301fbebba84ab9a87773187a081e3834d367ac37a0861ebc11b175cca466063a301fbebba84a70cba0e86a7a4270845fbe11fd83845af54ca823fde89c643c649daa2beeafd470cba0e86a7a4270845fbe11fd83845af54ca823fde89c643c649daa2beeafd4c18f653d04785587e2d5aad207497b0f08773df921868e5d768e7f2827ea99f1c18f653d04785587e2d5aad207497b0f08773df921868e5d768e7f2827ea99f17be75c9a05414c318e4b83f0f050b76ba841fa059495b7a9007a5f9d1c3a3bcc7be75c9a05414c318e4b83f0f050b76ba841fa059495b7a9007a5f9d1c3a3bccf4ee68c27488186a7ab920242caedceb3b67a549acf387a70d68c998baac0837134f67427b5b498489fd4787aa45d425b671e185265a0570421e10b17e94fc5e1306d7081e2f597d2fe3ceff9ef48cc1a31ca6f26fcf288d48ca52842846b77c1306d7081e2f597d2fe3ceff9ef48cc1a31ca6f26fcf288d48ca52842846b77c04039f3191a597649fbaf4cdfbc600f3388b6488c94b05e4e1d82bc751d1e5d604039f3191a597649fbaf4cdfbc600f3388b6488c94b05e4e1d82bc751d1e5d6fb454feff061a229244a376327fcf1b1ba75e936baf56c45fd8b76e2e8da1bd6fb454feff061a229244a376327fcf1b1ba75e936baf56c45fd8b76e2e8da1bd6bd652dcdc67921855d79dc638493856efdcb6c0dc8260f30e350883ab8d5ca43b3c2b67116c075996bfd03e750ca5beb392c46f0bbeb5568856d37d7fe82f18639ac16b8e756eb82a5ac9eeb6298c950a6f2eed898c8f1011fe9cd9f82bdd7b9ab7c41ab4005467aa41793564f8c56ff7eaa6284219c9131f957f190a778a5f9f2581366af5a811b8d13c836526428572ff8a97ace768609c5f83119b0193a53264213e400dc223abd628dab0712c87393ea2012efc37e6358d37a32650f825810c847eb098266902e92f3a70305a68f728de86097c697bd9b5907d1a0aabb2d567e12b70fd7d71000acea26b934c8c67ef338c5dc345ec5bf0e0ff405ae88b9127af7a3c9fa935006040b0bbb5453e3a9b0ff1580a3fbb50db884d2f0a84516f479aa7f9be3262f89c8e04041624d5d73de0623ecf1dd16372aae8779491d8969f4ee92d88b3cc713fa7cdcaf5c127bea374e9e23454a1c96039107d2d2e48169f4ee92d88b3cc713fa7cdcaf5c127bea374e9e23454a1c96039107d2d2e48189681132f21ce396c1d6e321f37ab58825ab35b1dcf89f0d747b268b8a321037992b9c36e66f0393aa86e67e126d1632344315a5ef91f1f94700a013aef306a3d5f9ddd02e13e4d5c1ad585546439aed42405984e9ca7edb03cd895875469ed71c40dc636e4568e57c4baa318b493f88d944b6ed72745a7be27c5dca5effa7299f564fad8daea6c6026e740ad1937d07a921df2594f03cf6b1e8d6d0607d6c119f564fad8daea6c6026e740ad1937d07a921df2594f03cf6b1e8d6d0607d6c118f083750e756df4266e1a246411fb1ab873cc514e8ba777e28147370b32e68468f083750e756df4266e1a246411fb1ab873cc514e8ba777e28147370b32e68463cfb0825f963070fd37b433319ae980391c502a951ca833d5a4d5a019a54cd653cfb0825f963070fd37b433319ae980391c502a951ca833d5a4d5a019a54cd65b975304ee01f52f81ee92563cade1bc20fbc94b230ca20c5f21a5227a8727befb975304ee01f52f81ee92563cade1bc20fbc94b230ca20c5f21a5227a8727befe4dcf4f8e96daac878be58c73031c4fcb4f27c12c81456fb5d9bd528ccef3ab173e50bcd907b143a9ae84f238c18cf62cefdf4a0c205671fb73972af523c86ce4a2f94577cb59b0e6cc5670d03ed30028babb7fc07de3482094942b62243decb4a2f94577cb59b0e6cc5670d03ed30028babb7fc07de3482094942b62243decbfab0a61cac417f3eee98a026fc2f165b860248ed8c15511007c232e70113bf16fab0a61cac417f3eee98a026fc2f165b860248ed8c15511007c232e70113bf162ef5d5152aa3a730524f7d0672fca8d92f692e66a49a8c86865b9466127719092ef5d5152aa3a730524f7d0672fca8d92f692e66a49a8c86865b946612771909a4c5ca02fc5fd3194739ed09893ee8bda8f35955672e0aa6df55962ba2e1ef37efb7ef241a792bad5f278c43b714f68e14a8d9c0edeebdac0c12fd2687c28c5154580ccd993aafc589cbb60e55af1520d7ab7bdd4286b54000d50e3d2aa9a6d6e7766bdcb4d2029337f372a5c3f184e2a675fa16ab097efeca083712157caa1baabca8627bf05c2cd0e61f164810d7e43c3fba82e6dca39d3c40273382e58a1eaabca8627bf05c2cd0e61f164810d7e43c3fba82e6dca39d3c40273382e58a1e564839e5d3bf5548f326f0c7b3d9829e9a1266bd6c38f7b97187ecfd834c8627366535abe8fc8f0d8326cf0905053b586fa32645f5d3f14e588cdb7d84da44216eede6b6d7ea394e9212c6f8e0e8cb2433fb9a2be7c10081ad1a2df2c8eb1b266eede6b6d7ea394e9212c6f8e0e8cb2433fb9a2be7c10081ad1a2df2c8eb1b262115107ce6c7c1bcf3a403b3d6cb0e690dc3b67b1e0a74be11408d91cf9af1772115107ce6c7c1bcf3a403b3d6cb0e690dc3b67b1e0a74be11408d91cf9af177096a067bdee08af614bcfa2e0f238fa5082dc830bfb5ee1d73de5c9fd977600a096a067bdee08af614bcfa2e0f238fa5082dc830bfb5ee1d73de5c9fd977600a84abd7bd13170f7bd9587a0ad7971edb312f2027f2d167608353fef0b4e97b03dcbb16bce5fb295d2ca350524b581b36d0aaee1bfa7f2a08a4cdf2237249fae06d18286c03528349c13ca23b864a3468513bbd75efe68126e26433c2378c20d96d18286c03528349c13ca23b864a3468513bbd75efe68126e26433c2378c20d9be91d1290174ab0e0530a610302098ef48f3b96194a4bf9515e06c85c846dfae9f6da501cb7cfb2dbb5f3d4d8b05f11398b4f7d8e8fc5530b808755a0e0ddf432f1d62b15c078c5bad5872f63ad87563a95cf729c436e72385c64539516bc6770530608e3bcee1e71004f6d178185e9bed33bf2d4caba8d77f974caf2906221be5696fee5dc4aa44e5af8e7a159ee1cce0ca0bfafa1754c1c5c5d14fae7870d5e5696fee5dc4aa44e5af8e7a159ee1cce0ca0bfafa1754c1c5c5d14fae7870d52e4bfb0ea39f9dbf7f9c9ee617c424eb2210ea9bdb47bc3508c6aa20e3e0b7532e4bfb0ea39f9dbf7f9c9ee617c424eb2210ea9bdb47bc3508c6aa20e3e0b753d523d64ca6c8aaf20e16ed3b95e1c077e6ad3012a1e684c3bee08b3b9e667c87d523d64ca6c8aaf20e16ed3b95e1c077e6ad3012a1e684c3bee08b3b9e667c87e502547d25cd41e01cd9e5296d3ab47c7119552a5fb611767efdeb5eeba1a6e29b8aa26e02d8f32c9254787cef0bede56f68a53f86afe6af32a1d0ed4ae8137424bda6bcc543eef55a6ad21d531a3d51fbd426f230887859eea2c682205cf1801002828a6bbfbca55d2fd7aef7618b97350eacf5cc77a03a726dcd4cecd7f5ada94157007339ebf195c82aefbfa56403bdf966fb6f2c1f19bf6e88f2230a220b19f268505fcba83ab1f9975d32fc5b8be53dc255ef968749424d2645a477dddf9f8ce23e8468ab7ef8d5710737e51329d5e2868abc4d4ca293a93d1c3f94148f2f5651b2dc1818a07ab6645bb5286f24eafaf898b7c245dfcbc30178077f248151de1e373d996879b1a2f025732fe93e3ded9fc0ef46f657fd118d40b97ea16398c54a83cd656e516ce7cc3b8ba2385479cc38eb3b21caf9d447c4cfc1ae54725a5f38a7d89a6462f81744b144013b12681fb59a0008015256f3c11205ba1ec4444e0ab22121414d4c41bcef251c7d9bc3718fd476f7599c1bb1a3461cc4b7b6c5ba75348eff5701321a6669bce1f29957514bd92094652c40428f6725b09cdaa3aac7e539f0bed66c0e6a16f35134faca2cbeb2b1456fcc142f75f1e2b04436c4a34a73d59c411e17f17d6985f9f64b9bff640628dfc03e1b4abcae08db14820be05cfb9222959c697b9f7573231bf2c9a5d6e1d9dbaf2a290067a8521a1683130e9b73a6e3820063e4bc45dc263106dc37a7f254b37e6577e44db02bf4465b680f66590aee11803d4e9d70922958515753567ea3563a24b83f4f20c0ea24e14400b18faf91d4d7ee5a09affda040ef2cefbabe587a66d71f452b8a676d3d1fa28cb45418663996e2fbaa56742e7b81521ed41c93b8f781672a3dceff29a0278b66f46e3e6862be6ace145140f8736c230483dccc440c7fce18923821ed4de63893d3ed066e7f3804815dd226f39551622a85800a5607e7da61b1f62b26205a693097847d6024d75bd4938dcfb5f47c19cd0aef4bbf5539e6c545d9d5e99d49c3b9236f268d478315cd14e3074ff765467e2584ba7ae918e7997eaff31d8cce46dac87f250f3cc171357e20495b8940b8e7ea8c48748dadf4445512b220b7080fe649b86b1efe0b63f17393450c9782c8fd14d2c2afd5ed9fff54e53c64f82798494195464e962a7777ffe397efbadd14842766fa997a6046582f81bee6c0fa7b875f3c1f4c8669e2a55a70c043dc0a131b882d85d11a7f31d930674d9917f75fc4fb91983c50839d55e464e0a38de7506f4f2b74b59e05d3809f627ddee77e44006ad51dd18aa80182b1a8baaf49936c1d54ad87137110c2ba3cdf73fee22e6b0149556e21aadf7bc5c829caf225d566dd921c28b2fef7c59d663d700afe23b33285d5dc8ae042c4dbfe38bf1c813d96ad02d65ee7bc3432c7a48b895dfc8099814f2e14a54965d31838b134b9b42457e78778c7d5ee757f29798925da7333157d41fbab3b19658a2ef71d60a4596026c7001cbd8b7739a7ae9ccbde628ca3828dd5b8c62fd64f73a6f3641a9d0c6f1653e209f7c5fbad03d1e3a18f46ea797c2556e40c5baaf21844e8076c2db69258d7afac0722be787cf78fb5354ca16ed8b2d15e85a4c92e58c12a49d1bed1fdedccf22930a6c039dde5168b3cacf1e31e7edd657033cb05b2a499b63043535992d2e2852b4a9ae2cbf029cf65feedfec78cd675b13926d3980aebc6428cc25207e902b84dd263cc5dd2dd3c34626272d0aee1684b340e17c812102b05ac5a451c7f8b70f0b3666a1567b2e873988c7a6b47fc1b1c1011291033ecd434efa07660dc5bedbe915df6d5ab84e8a6d21c6c5e0695ade1e872f3bd24255bcb7242a3c8b16e59492f4f15f4eac0ec44c3687b673551e5eb2d852be87369b94517ae9c3424641dec43e8722ac6726c00844d7a2124e64c22bf9a81d529128f0a01b30607ae739071039e0f3de6fed93f60a34ce89be80a06f845e72b97f92782d05ef19c77eaec1ce6a4da90b252241415afc218d79899b1922d6abcb77d75a556e062cc83a73326b50f26d9f1c8d796b41292b0bd8700452e43f5c8af4a900dba97fc1eec4961c21b62b2abb49c0bd2eafd20fd9a1d1e71126e79e3daa83ca7ee1a1a16381c7e2efbb4fbc091c8d34258240323a8696052429db0410eba2eb0acd9ed097efa69df005c1f336ab506ec5c31f250d2b2d3eeaebe4530f62c671bb4ceda73c32bd6a764c0df1605c0129adedd4f50d2b2d3eeaebe4530f62c671bb4ceda73c32bd6a764c0df1605c0129adedd4fd99559cc4e14b69e9d3b6b782660d82903bb8aabe7675eeade858105efd43066d99559cc4e14b69e9d3b6b782660d82903bb8aabe7675eeade858105efd43066f641984bf44af9ae7b60656e7f3ace8405920e9cd5b50d855ecd37ea7e778aab79b787f5be753073d5d3991adc3161851720a2f56c15b6ce8f57336f8ad7c9a255eeb8ce052443c2557d2148ce04143c29cd104e6b5acf28d36f948f56e1215748417faa03a84f9ad3ad88bdc60459b96d03c9fb991891a096f0536e5c83537dd40bcad894afc6563d1e8903d2c61a4fe375f5d7472723f3e153795f6655864801150ef6388ca9d7e4f34692b38fc2901208c1ca54685f5e9f28fe00955754ffab4358ceb47c19eff6a9d04a22dde49495c2d1d0248a0896798016e6309b50f6cb1cf4c7a6337104853d2b9b6b7249a4f26491d53b281c053dadbdf5c18e192c0c6062fc9164b2a2efe227cee68f9e213f0f3a7fa89b711d8898500d5c78a4bb23a8696052429db0410eba2eb0acd9ed097efa69df005c1f336ab506ec5c31f2b414ba86363a193a639cef0a8b829542bddd488d62165fe4f1ea8839374dd81fb414ba86363a193a639cef0a8b829542bddd488d62165fe4f1ea8839374dd81fa59582e185a2752c2926de5d1a9fd83494398b4a960bf063c8344ee96e7d70b8a59582e185a2752c2926de5d1a9fd83494398b4a960bf063c8344ee96e7d70b8ab6499f55eebf80511d0042e4e1f71dc41292018c412f84186133d31308c8d2fe73ea7111c9704c12f228aa717e29d1b0a633c9e741728224f49062f566731405fefe774d59306fbcb3531490b14f5ab3df2cda91deffae9088209b86112701a3b597fdc3596bb6aa0e5ea12a8c4f94d952e4f7680b2c17fa57b121ca130afbafa08d398997a2b872f3460d28f2288d57550c027aaabefd590262e1135c52a59bb3033ad686d97ac9f8ef05247ed5691d3edb0f48fa3ea12fe4aa28b55803277abb7aced14e77b5c25d84109f40547c39fa606fbbdd9c9b1439aa1fd078ab653fc0a52b34ee016989394dc79cca300f98fb3a83a6069d392692fd65fbe382e73235d8e5a0f27591e6aee9dd466126348c7dbc87b92855a98a904e498f745fbc95ac7e476fd81cb40beee995c1a62b9396117f4499586f63552911d6241d43580f6b99fd14aedc070553c945f4b753a2205044d5148a2010ab5f453cf37ca09f9fa2e419a81a179feb0a0bc4c7c6d05c2dc495b8ec91600a1a0ef38b55ebf3b11252b74235d3a490af7c188dcf73f75f5e6dc5f7314c8cdf781a01ba21497342a65664c2a69f6d64dcae4d4ba24b27852b3cb4c0df3d9b9fe8cf8c74639bb7ca782ae3aef3429b07744c4f60b31d1314ab835c3da9c1e8a3ef0e83e7d6a3f427f971d0bf14a770d7929eb5450c5c7906e68f901516df5618c8478b5dbe8b2ec6276fdb60853650e10fcab260fe83575de14d2a4b3518e0cb4ae0d7bd5db04410d76fdb60853650e10fcab260fe83575de14d2a4b3518e0cb4ae0d7bd5db04410d761ddd961e1e42cc80a6dc03a1f1719629a32a05438bd7319c1b881c5b779ca2761ddd961e1e42cc80a6dc03a1f1719629a32a05438bd7319c1b881c5b779ca2cd1f69f2c8679870d97f8bb632cde4cea1b6926fae17b7862437b062d4add9a895daf16042230ea24ddc75ac36f1098120e7de2ab3fee126a9da59a80330c0414bcc2e9cd41df85050414bec1b8af354545177204423fface957019850199eb94bcc2e9cd41df85050414bec1b8af354545177204423fface957019850199eb93dc2790b28d5f69f4cc5cabe5c702423bc2737c7947e420fcea6333875404e773dc2790b28d5f69f4cc5cabe5c702423bc2737c7947e420fcea6333875404e7706a37d6de2adaddd5720c9887c400a253c7801b786d09115ea0e6b713a734e62295d56c1666a2be1afaa400a8c2406a3c1cacb333d621d68df037f8fda9b5cc043f6bb477f3dd56ce43c8ad61129f3be2e794b5be86ee6897cb40794344a93d843f6bb477f3dd56ce43c8ad61129f3be2e794b5be86ee6897cb40794344a93d806f2d7c703754134383da8e0939530bc744fe89f130d0f27fbfef901f21a395a298eaaf9a6391757f7315e12662a0072cb4146fc66e3ae3bf892a50ad638ec4dd064e520e5e6bf5d791bac5bc27ddd29a30ba6f865d9dfef0171f7cd6efcfd48e6e6c131ec01ed7f89a2e30a2257ffb3624dc38289fc4aa6355520e0faeb49a0afb94c534ce6d9d9649bbebc8cafc2e03d72fbb8eba10827d12fdabd9268f9af9cdf0bd14014e6261572c4867527cd900db524156af281cf7467c1f3a8ad8c190d34b04b0051b1224a8cf8f20074b4a93d3ba03c6614e851e3060b7d249a2425b39268f59d1bfb32b1496708bd6e689da144d8eadfa8bb8d9d33e53a8c45c4448dc29c115097c3246a72c0d4666af243d85cfbcdf2ced81a33892e4ca1cebdacefe2cd7ad288961a41dd889f4399a89922d05e7b79abdda0f040c9682e2a1841581edfd17e2e7c234846a536ed36a0c0025852179f8ae90fb7e0273dd69556a3eebacddc87ae8e5a34bca75d0f2608aa0a1cb25b16fb754d1be7da39f3a4eef184f418b70f256b09572ee71d9c74c23992ce21d5f16af4fb243f1e0ae4bebb25dc56220820c3e4740bac9cf9fb5430017d01f33534b2f6f8f8a3c1ef75f2f6a4a8d77c472e35aaa0b86783e95c62f01414352a535897c9124fe1871d776ee5a860095e73ac2112bd6fb4731ed780b944f98632244b5288d3ff7cb6515863a09b28234aa0b96a54358df2e42dbca89f12cf2facbd982523521c18c9635f85d7c1a17c9673d76c879902b006ca44ca4babfcc74980e2d2769bcd8ca7d99ad62bb3a17c9673d76c879902b006ca44ca4babfcc74980e2d2769bcd8ca7d99ad62bb3972a8f14865f245f344f15ea95fb46b8bbb72b92bbc7dcbd1a9eba7d5a09afb7972a8f14865f245f344f15ea95fb46b8bbb72b92bbc7dcbd1a9eba7d5a09afb70b6c9c764714496c91eaf5a975b63379cba02cf4465a2b3f4f5711b99e06a57e0b6c9c764714496c91eaf5a975b63379cba02cf4465a2b3f4f5711b99e06a57eff83bcca9a521ba27fd04c69fb98ee9fe1c4f23fd96f375ceb1f9d8bd6b4b8deff83bcca9a521ba27fd04c69fb98ee9fe1c4f23fd96f375ceb1f9d8bd6b4b8de53550743f1c5c45a4ff1def2dd77f0d4983c39fd34dc3df260988f2bbcd0757d53550743f1c5c45a4ff1def2dd77f0d4983c39fd34dc3df260988f2bbcd0757dd6526d76ae0d392d4df13807647f8bf1982cd271d1a69fcd5d27279aef4f9ca7d6526d76ae0d392d4df13807647f8bf1982cd271d1a69fcd5d27279aef4f9ca7e157c2fd2d7face2dd00e916eb513c2e3c19d77560f8190e118180e3fc010785e157c2fd2d7face2dd00e916eb513c2e3c19d77560f8190e118180e3fc010785246c2047b5fc72296356c985913cea4bb94d2ab986fabcda0b3a1b613c40a922246c2047b5fc72296356c985913cea4bb94d2ab986fabcda0b3a1b613c40a922077ca6be3c549aaf56b45086795f482eb8767a8ebbe0b99fda3bf27cc51a677d077ca6be3c549aaf56b45086795f482eb8767a8ebbe0b99fda3bf27cc51a677d5dd3937acd506fae05ecf030c69c8b56a8ffe0d7ee88d02b55292bcd109eaf4e5dd3937acd506fae05ecf030c69c8b56a8ffe0d7ee88d02b55292bcd109eaf4e6d2c23428b8ca084b980518d5f954464ea405dfe4f4e17945a00badd321df6006d2c23428b8ca084b980518d5f954464ea405dfe4f4e17945a00badd321df60072e043c291fb8ef89badf87c6e4135ab452cee62b4095e4b2215706c2f31453872e043c291fb8ef89badf87c6e4135ab452cee62b4095e4b2215706c2f314538ffd2e94aabf48074ee48059c6836982bb4dcaecbcba2fe314dba4324ffa7c0e1ffd2e94aabf48074ee48059c6836982bb4dcaecbcba2fe314dba4324ffa7c0e1d879ad178315831761df98a9d7330abb15e0420051855cf172890d673f108549981d917eb9bbdfffc59c6f6a4cd4d401f2828057ed1c81afbc377b6913262df0221ad80cd35a015cd2b33946af1fcfd494f4cd62d69a793228f7df16bcc3c63e221ad80cd35a015cd2b33946af1fcfd494f4cd62d69a793228f7df16bcc3c63eb2c91b6e210edbdbd729ae38f426807dd18b0a72eb250342f983e2b1b648edfeb2c91b6e210edbdbd729ae38f426807dd18b0a72eb250342f983e2b1b648edfe092ea361f0a259ac5224e3bd36e33a48578b7231609bc10d3ef934d04e82a7559cb8611a1fbd39ad4756e8330f9e9634a444ecfcc89e641f8bd19fa2b8db62cb835d2f751a38d1e1b05234391bf6ac123e48616e9a70671d2a27a9398b0597b4835d2f751a38d1e1b05234391bf6ac123e48616e9a70671d2a27a9398b0597b4a67b1324c27b0c5b23653446565cf94cbe479a6f99a7c0bc212776a261d7314f654d670163a5f0e586e058ff7872f51b5c2fccca32d60f6d6559a4a04f5e8d0ace87b55ca6ec5bdc7146aca6b0553308f187e92868030f29bb67bc5c4cf11456cbcefe92ab6822d28c1422b4852a348e812b5e385124e43b905d00d866d38d9979b15f75d024ef3395f50ebcb02e40155e968b4826f23744bb13c9c17b71661d79b15f75d024ef3395f50ebcb02e40155e968b4826f23744bb13c9c17b71661d076dea011b21cfac09b1431ed5b2bc22724438318e8225964775138f5ef16cae076dea011b21cfac09b1431ed5b2bc22724438318e8225964775138f5ef16cae4c03a4d099468ac38b89f6f3a9d244ea070998fdc73170f112bc57f68097570ba2b16e7cf2ca25bc4e57caec423ecae55462f362063bfc8c45e53eb3b9f79e1de3d3141aae470870db4563e7f05c1151f0836a65076ada0af4ebdf7d3108c5e3e3d3141aae470870db4563e7f05c1151f0836a65076ada0af4ebdf7d3108c5e31923a41e1c4b13fa63387b949f82272a69ae2f2206488ba6c9215555299ce15a373a08b48addcfcb7460e14401ae9f9fd5b2167b9bb3f7a09e957cc83ec07034c901c5f446e89b6240294abbd262ec74593da787a8ae92b7e8efb7887d4b2f54c7e22e8c86462bf9b61584728b847128c6612dfc6adb9a78ec49f80c0958842bc9d8df0a68c59861975dba017d39c72a169ad4a8ada262ac34dbe9634c20f2c798753e328784b47577d7d6936c378cc7e1743b00d699fdeb248fac60997d966233a44302dc4dbc425e94a4a1bca8a6582ed10f128d7ad8a2570bac150fa71baa8aaa22f7fe4207a8f0bb57c886bd0c0eb0404fae8b8d9144a5002505bb9d87fc75ac9b726dbb7643863a29681a3d06a1c1f33d15f6aba36f5bceb55b2956c45007ee4fa1cb597ebb628b7adc8c0ebc926234c2fc20effb07278a5617344071bc92ed9e580dbcbdfdc47a8ae764e5ad97f7893a6da2bec17258aef76138d090360b77316838b9ea8acbcece74bd30a718497193e0a12418c5577257d9feb5d3f0e068b43d38d9f6b2879fe0c6cbd59d452c6e60599ea13a270ff2cbfd3bf2adc585ccca6a6438c89a596e257e5947b97ba5f373686b0a0d1f9e6b584a99824ce30afb5188257109772ffd5bf7385422118107f8ca24df6b18d7c26201311b788ef9ccdec9105424103a96bd486cb5815dc6e61ab79b923eed20e5449677b61c2eea2748682887285645f1a89b7878f121d662dfc7315c22ae850447513d585a8a707c215024daa1f5ee855f6c41c4c403b7540074bbc09d9a8a6a8ed0c8603a910d9d2d81222ec3b85416397b4b4bc40415894505dfaf923e7ecc74a152696b55b93705b4b26300b70e3f12c6826cdb5f3f78b17e8aed68a4eb56d07216752627632f5d4372af27db8457a070a603376449d560fd6273a8e0546a99175b962cb7c98265218d8be2f3334b168e0cf56100d15a07fb2f366c21af0e02468b505e57a952d11d569e277b6f096816e0de1086295871859ee717678b6fd17c028d013d3ee48edaa0a681ae1a9fba644acedea75168d7acab40a77d8bce039eba9261c2e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b8556158ef112c1a0a500b8e99db31c5c892f70807b88e16d557c3d1ac7ec12f7128e78e2c4f320c3e47e0d00d81998d0c6d0310c06c612a7c103c776aa7ed243bcce78e2c4f320c3e47e0d00d81998d0c6d0310c06c612a7c103c776aa7ed243bcc8b438fc6b307793d467dbda4e0553b4a3455327802850c6ac4202cda11622e4f8b438fc6b307793d467dbda4e0553b4a3455327802850c6ac4202cda11622e4fca3a709ac7f86049ca4beb99088bb26919c9771820eb60e7a0a56c7f4fd72fdeca3a709ac7f86049ca4beb99088bb26919c9771820eb60e7a0a56c7f4fd72fde49997373a3d755757db376dd6d48279aef9b5543376e1dbc83b9d6d2a308d0a049997373a3d755757db376dd6d48279aef9b5543376e1dbc83b9d6d2a308d0a03871ff34f70de0e64bd212e421cdd4c41ab7fe455297e71f9444e16616a182d83871ff34f70de0e64bd212e421cdd4c41ab7fe455297e71f9444e16616a182d8356d3a82d4ac0f0c385b92e3059f3e5afe9c3275bb8da3adf1a1bb1a3031f937356d3a82d4ac0f0c385b92e3059f3e5afe9c3275bb8da3adf1a1bb1a3031f9370b4ed64c6c0ae4db638d018e706b7b80063309e0dce5cd383ebcd0f3d60346790b4ed64c6c0ae4db638d018e706b7b80063309e0dce5cd383ebcd0f3d60346792e4779b437cd6bff37eb78d65b195974bff1c39a02e27ae58bf3621916eabbf42e4779b437cd6bff37eb78d65b195974bff1c39a02e27ae58bf3621916eabbf43c43a3ff9d9758ae227a687851dd2443b8132956f15c4d0f42974742e58b37da3c43a3ff9d9758ae227a687851dd2443b8132956f15c4d0f42974742e58b37da41dfdcda942b24a7c6b89b02b019b102fc186dc153398029ac9620a29005e97e64a8cdfc1899a4673ea92415e87c8a5f67c30ce7fed99339455c5b2e4eaab031ca93d5c81871c0a3527119ac687584cbd4358e5b7958bc5838ef8307208def6eca93d5c81871c0a3527119ac687584cbd4358e5b7958bc5838ef8307208def6e39ae3557b6b25cd0f23076a893c55c6ecce2a5f74cc96489500208438f3b2b6a013c26de1af224686cec4707c27ecc569294f7c0dcc3f6f427fff44252a564dcbf29ec12a6083ee99b21fded0e24f7406907e8bfe7cd18b8c4edfdc0000d8edebf29ec12a6083ee99b21fded0e24f7406907e8bfe7cd18b8c4edfdc0000d8ede4a0e1c106254a08f35baec5c76548dd6af1672f3f5193d0257a12edeec746eb44a0e1c106254a08f35baec5c76548dd6af1672f3f5193d0257a12edeec746eb45b5f8a36f6eb8758446a15a199816b7a63659a9a8c1c2e3fb452bebd0888053e9cee3338541a067c61faba97ad2c4c9574ce4a3c13113e48f290238af8f449ebf1975e58f2465990b00848553790c1aacee3ece8a442c461584f8e8f9597a9dcf1975e58f2465990b00848553790c1aacee3ece8a442c461584f8e8f9597a9dc5f1bede43a7eb19e089e79da466e5a8aacb253b5bd3477d1fa5b0b716b4ce3635f1bede43a7eb19e089e79da466e5a8aacb253b5bd3477d1fa5b0b716b4ce363e809931451213f3e15125c65a3a2037a3620a1ad68db6f775d9f20dc15731d72690fb68ff05632b8c084e9119f17fccb8213e857e8498ef883c30eb48d9c2fd90b0b38a895d863aa66af93d4374025898f0d6674ed3cd13879fd4e9d4acc00630b0b38a895d863aa66af93d4374025898f0d6674ed3cd13879fd4e9d4acc0063b9dc6b8f8efae781076950a811f2eef36e4fd914f87bc126920472cb91192a99b9dc6b8f8efae781076950a811f2eef36e4fd914f87bc126920472cb91192a99a5d01da0dcc87a9e0e485d7ede20a356b75574dfa0919b5152ab6419dccb417ea5d01da0dcc87a9e0e485d7ede20a356b75574dfa0919b5152ab6419dccb417e64c5623f710c5d60520fe5599e47f3df0534e4e9708c440550b1a43037f3fdee4d9e37311086ce9933e39a7645ecc24a3d5da4f752068c0d14a4883fbb3749a5e10938d85bbcec16fe9992489a9bf2d281788d6cbb59c69c164a67037ace273fe10938d85bbcec16fe9992489a9bf2d281788d6cbb59c69c164a67037ace273ffe9793aa64f107ebe30feb589f50910017e9bf0897015f7bb84d87dd498a8cb7fe9793aa64f107ebe30feb589f50910017e9bf0897015f7bb84d87dd498a8cb79988390a379e1e3335d3ebfb03b789a67651c7fc154404f7245d87b1d90e392c9988390a379e1e3335d3ebfb03b789a67651c7fc154404f7245d87b1d90e392ced8ec7eabf75ce018931e337ba7ed3385f9962dbab5f59d85cf0d83b9a7dcda9ed8ec7eabf75ce018931e337ba7ed3385f9962dbab5f59d85cf0d83b9a7dcda9e9b699e6b93d44a1f312e2583c7672eceed9b3a518c33ac5a2e69a28c9db4dab4ff7923915aec756534522e2f4f0b0ae117512099ba8af83beab97aa4b720e727fdb5d8d56ffa7177809142676a5196b0e193b2680935618e938da4f1b6bf60befd2c9e8b5eb77856c2e0815cf92123956a05548a900504edf87ac4a175e9f1b49a713d0bdf101db3ae0347cf62d24e2ab2b1308300249e2f7195e2c513c7c2d0a78ec3c5bd2e6be7bd1d3e3285f138a42fb48118e9d5c2753371bdefde8ee993dd7d83aab8b980ef600cc7ef402a49ae3ffaf1744204cf2d151bd40b59f79533dd7d83aab8b980ef600cc7ef402a49ae3ffaf1744204cf2d151bd40b59f79536cd4f0a61d9c83cdde5f9ff24b9aadb2d15bf4a25ba09fc3e0b3c17e6983e1ec6cd4f0a61d9c83cdde5f9ff24b9aadb2d15bf4a25ba09fc3e0b3c17e6983e1ecf8d5f9d0bfcdabf9b2a7ae4727f84bbc4258e5c245fcb91a0b646d461c910e2d026529e38751073beb6f09c25870abad20609585055e678855e72285ea1641db3ce505ae5062b1a00ec46e92f52cee433422f7bebac914d330e5ca938ce357093ce505ae5062b1a00ec46e92f52cee433422f7bebac914d330e5ca938ce35709fd3b901221c6317f4b4aac2398e283145f05411a6023a12b03da410665256df7fd3b901221c6317f4b4aac2398e283145f05411a6023a12b03da410665256df79a8251be4ae6f2ab9f840be192dcee993c42e903a03cf3517e92c2a007a0866e9a8251be4ae6f2ab9f840be192dcee993c42e903a03cf3517e92c2a007a0866e88e39686ce0666e8d3d2f9eb709c91235bbf30a02756238243e54ab447a7856788e39686ce0666e8d3d2f9eb709c91235bbf30a02756238243e54ab447a78567f6568c4f7411aaa5389432b96ee0d2863c4b76d5fd64005a0ee99d9458d75e56118741a587b3ad563b685bca7725a8fe3091110d468c4761088ccba7f04517b2dfc84606278c5a8f4a2f4296902cd0ed19b0db462b4969fc4cca60ab147bf01fdfc84606278c5a8f4a2f4296902cd0ed19b0db462b4969fc4cca60ab147bf01f87d8e1e28e87683277ec01757e2104a0d517cde353f5daff6c78621a8c21b6c187d8e1e28e87683277ec01757e2104a0d517cde353f5daff6c78621a8c21b6c13a4f79ed5b1a9c2a912358124adc4d9a6236b8622fcc4c91126f5a3154ed74d73a4f79ed5b1a9c2a912358124adc4d9a6236b8622fcc4c91126f5a3154ed74d79b72b7a40688f1a1cd16413896c9e56c4064235b215348bd1762c7de74df077c9b72b7a40688f1a1cd16413896c9e56c4064235b215348bd1762c7de74df077caa841efbeeb4596857afabf13f9fadcd59fbbd75283e7cede51e731d74e6b7c4aa841efbeeb4596857afabf13f9fadcd59fbbd75283e7cede51e731d74e6b7c4b608ec4a19b135838f837869614606dd322f2f8f4ec233181944664b010c1ac8b608ec4a19b135838f837869614606dd322f2f8f4ec233181944664b010c1ac86b11ec6a14a3287f687cfaca7e2929ca4a094f88e89fe487833e5961bd8412ae6b11ec6a14a3287f687cfaca7e2929ca4a094f88e89fe487833e5961bd8412aed772a91d5f3f3b511ac0cd43bdeea71a62aa5663475a53bce3aee21d6d15389ed772a91d5f3f3b511ac0cd43bdeea71a62aa5663475a53bce3aee21d6d15389e8780c688b4a322bf130adcc5c2806d06c95203737b9c8c36403e903cb98cc9e68780c688b4a322bf130adcc5c2806d06c95203737b9c8c36403e903cb98cc9e6f7113021fbff5ba0e24b68ebd5bab5aab8785e303997ad5c1f930e561176efc6f7113021fbff5ba0e24b68ebd5bab5aab8785e303997ad5c1f930e561176efc6e7c3522408f90f6c1ef233a1fe1c73625dbf6e7b75c8bac0816ca2f43e8982d5ee6d9cb909b2d8c3c9143b8c52a627b271fc65916777435ee4fb4f44275ef2ca085db86a0373964161b472871ff90f9a2daab17b5e459a65bd361a7e80eea108085db86a0373964161b472871ff90f9a2daab17b5e459a65bd361a7e80eea108e75be5ff450e5a2f0365b761909699b03fbcf085f58e0fba0998ffd1527800bde75be5ff450e5a2f0365b761909699b03fbcf085f58e0fba0998ffd1527800bd332c4b1b255d0a9cf539d7cbca35d33eaa990a08f0fa2f3c78bfc74e87dedcae332c4b1b255d0a9cf539d7cbca35d33eaa990a08f0fa2f3c78bfc74e87dedcae24d30f26d2c2fa87db160852aa4250dac012efb4ed4da89a6da93f5bdd12635ce9a16185f41ee00a4d15a79ca7e409d81a9a54270a2b0b9008bc61b6b8d472642403323e0c7d719edc2468690ac9959dbbaa3d97ed3d569bb0116d74f05f343f2403323e0c7d719edc2468690ac9959dbbaa3d97ed3d569bb0116d74f05f343f1f78854d4cf391707d6317d2bc19d69a9df87a30fcfc540e1d4ee3f3bc39178ddea982930218c18e1648fd45a879fcb957d501ac68072bfaadfce48e0ce6a91a05e74c26edef3a9575bf82290833287e6cc6c6c8fda6fbc72e95a856405deafb05e74c26edef3a9575bf82290833287e6cc6c6c8fda6fbc72e95a856405deafb8b08e5a101648343fcae67ff6d57a4a1daf1e7fab18752dffb9aa950a10e889c6b3543a9e3c49466612785e18f5b9bfbc3cffd50881ae9a90e7c10c7be1c70d46fa8567a4a3eca636bd8118ada3ab65c46b444d7b62e8ce9f2f6f664840f6e546fa8567a4a3eca636bd8118ada3ab65c46b444d7b62e8ce9f2f6f664840f6e541c84b543b0645a171b026c6ce089e2ebe29ca34deac5061edf7464fab3fe65cb1c84b543b0645a171b026c6ce089e2ebe29ca34deac5061edf7464fab3fe65cbc14f16ca6e7c016c7e584f42ab27714a2bcc0a06c79e99460dcfbc87dcccac3f658ff9fda42877950af346ec1bc81f74bffc8253caf9a890c18cd278e90f5311adfb3d96895e798ddcfa1be01c42abe84d77f6ae3ee59164156d21f6da01a5d2875f24cd1559485fdf0b1c9e179630a1eaf4b2c574b91386710ad56b8899375c4ec265aeef5479194286d8e1700aa1d7d791043064aa3b55c9048404dbacec854ec265aeef5479194286d8e1700aa1d7d791043064aa3b55c9048404dbacec859879ddea69a1c943adc9b5db05f8cf225204b6d789715b0955a15015d35925659879ddea69a1c943adc9b5db05f8cf225204b6d789715b0955a15015d3592565c5ee538c40256cb67d73e071a09f593318035538704e75a3bdae505c768d9aecc5ee538c40256cb67d73e071a09f593318035538704e75a3bdae505c768d9aec310b6a122d8c41df6c541d0d4f1b1eaa08c1a66aa57165c0057f9bbf12571f5d310b6a122d8c41df6c541d0d4f1b1eaa08c1a66aa57165c0057f9bbf12571f5da4aa68c62f40b66009085bb618e468b510ad50c4f760f2eff418cc6d90e317a0a4aa68c62f40b66009085bb618e468b510ad50c4f760f2eff418cc6d90e317a0227c883b55b5301bf0df52a8430f601099cc49dae825bf7ec0be7dc37a7f3a4e227c883b55b5301bf0df52a8430f601099cc49dae825bf7ec0be7dc37a7f3a4e4c89966656f9144a1dae67523aea9524637ee6cbd2d5c4ca2d4857a250f88f9287fb04fb3a609c33cf7ee2431b6997ce06a12a63e00de05c9bfc3ca135df3fa46856e051ab79944db89de4c2f8ad72a2dc4eb42aa6e1bb9887af82bd0ada61456856e051ab79944db89de4c2f8ad72a2dc4eb42aa6e1bb9887af82bd0ada6145be3a23e4ca3fcba7a7643de62769219eb44f05af52e3c84db8ee6195b27070aeb5e17613d65994b5edfd22f177cbdd9b796f80d10d47e415cd501a46eeaf9f730daaf9ff6c52ad659723e56392ce6c44eba2ef84eceb0336aaac3edc099bfa340daaf9ff6c52ad659723e56392ce6c44eba2ef84eceb0336aaac3edc099bfa34fd7ed554e8af5133c71ae3808a251571af2343341a16de6011572161e925a1c0fd7ed554e8af5133c71ae3808a251571af2343341a16de6011572161e925a1c0f0f71426a06023b9ec4ea3affb985f5a01eb9cb11e203cec8617add726af4e7af0f71426a06023b9ec4ea3affb985f5a01eb9cb11e203cec8617add726af4e7a2bdf4e6e108b241cd5f1d8b62507c9615dcefbdeb9509015b69f6798a1710aa82bdf4e6e108b241cd5f1d8b62507c9615dcefbdeb9509015b69f6798a1710aa8a6198e42453f80ba4941e4db7ec0cd4eb011796387f69e1ab448ce0a60d761bea6198e42453f80ba4941e4db7ec0cd4eb011796387f69e1ab448ce0a60d761be4b682a6df7d2c009fb0f1a8f3254526948763c313e9bb8032877faf0ebc5f0e2ecd3b2b21a60f3ecccff84afc77c015e22b0558d9b8b080bb1e9219ff60395d914d94210e2332177f8008893b4b2652a5f7adf1bf78eba3ce0f81bf85cf8233814d94210e2332177f8008893b4b2652a5f7adf1bf78eba3ce0f81bf85cf82338093543722f606354fac18b76002431714909bef05748bdff51bf722a1dcec342093543722f606354fac18b76002431714909bef05748bdff51bf722a1dcec342d221722089bec730b4a14f5133370538f2fcec4e2aab7db92d5765068bec4b64441a45435b5e4589e9d506cc49a0ee4f4c28f289a8d23dd017f79fdcfb0da1d2b6d7c1339f1800a99836df694ddc050cb6c1c1d803a1a845665f4b0c17a17cfdb6d7c1339f1800a99836df694ddc050cb6c1c1d803a1a845665f4b0c17a17cfd16988d12d6fbed3656b35ffb231c204c614d8617057f61829570ecb717a83acf16988d12d6fbed3656b35ffb231c204c614d8617057f61829570ecb717a83acf3b0a7ff8ef12318fe06ec22152a9f40da7f7af64eda2ebdce22919747238c16c3b0a7ff8ef12318fe06ec22152a9f40da7f7af64eda2ebdce22919747238c16c019c999a8a9e6c718cf9583330420b9b717f1ac63b5cd94a46d9b72b1cfa07ed019c999a8a9e6c718cf9583330420b9b717f1ac63b5cd94a46d9b72b1cfa07ed0909e43448ac13100783c61a44ab1cb57a7c27596a5cd7485163143fa598852f0909e43448ac13100783c61a44ab1cb57a7c27596a5cd7485163143fa598852f7441a2cd66683c63d95be1cf1bf9a94750f485d7714e9858ba5f043d1f460527811950bf72e73f09ca72d534b020cc4af81ced314b2fafd5ad63d065b559ecfbd08069daeef9f668af56b6787f6417c7c8bc4d5c1e8a1e3518753e97e2e49d9fd08069daeef9f668af56b6787f6417c7c8bc4d5c1e8a1e3518753e97e2e49d9f1fc3674d6b52189e2655b6483215dab4aeb32dba6fd6dc1c91442ea6b318d62a1fc3674d6b52189e2655b6483215dab4aeb32dba6fd6dc1c91442ea6b318d62a628e270e35b86cfaac1fcd19549b8005a68b3e915c5d6b7058324b4e6ef6f8e3628e270e35b86cfaac1fcd19549b8005a68b3e915c5d6b7058324b4e6ef6f8e3959c9132587c706669be383cd54bb43e2edf0beeb87b609953b5fbd59b19bb05959c9132587c706669be383cd54bb43e2edf0beeb87b609953b5fbd59b19bb053118668a361fe4b0b86b514039af8ffc653fc9d4693cc8cec9c78a6a51c9b1723118668a361fe4b0b86b514039af8ffc653fc9d4693cc8cec9c78a6a51c9b172ce1dfb9ba6ff7f5f2eab5e3519428c80f0ea3b12287fc7c9d15f53c03252e497a81a501380af607c6669a0366e838dc52bb72614c14a0d196c43e0255e7cbd70bf317612daa4c89dd473a23e09dedd329ed70819273baf3583f39665802791214f79837e1d2cbbb32b363758e02f9954f94745f39b0c0692f907bfdf8d9f3982a3782a2c43148ef85e3572fb16775d8ab9fe2ea712c788ce08d15be96979413fc72d318f4e34310df1f6d3d0e2c786723517563d6edfa5ccc93d98c229fe7de983c846fca75cd198038184cf61ba7da2c89bd83e73bca24edd14800072ca191283c846fca75cd198038184cf61ba7da2c89bd83e73bca24edd14800072ca1912406ae43718784c8547534c2ad668b8ba3fad08a3334a3539ecf171040af87c15406ae43718784c8547534c2ad668b8ba3fad08a3334a3539ecf171040af87c1575934ebe470aa19a194584432c476507d8c5554cec99fdbd914a1dafb71150e575934ebe470aa19a194584432c476507d8c5554cec99fdbd914a1dafb71150e5555e0ecbf60ae0f82001c85078838e7f2a157a705e58ce34dc10f7bcd30ae24b29c2fe300f3277e204db3ada89b555c2c3dfb04a987ec4abed82278984e616f08560639f7c7a480fecf893555d11cfe6568829295524bfe329f2c67ae797c4ee8560639f7c7a480fecf893555d11cfe6568829295524bfe329f2c67ae797c4ee7f0453401c5667c11907fca376492979ef31c2e556adb28043f9cf43ba364bc97f0453401c5667c11907fca376492979ef31c2e556adb28043f9cf43ba364bc9cfa640763fa56b809c7cbfd9ae07100b9522c23d87ed55df93180adc5020c282cfa640763fa56b809c7cbfd9ae07100b9522c23d87ed55df93180adc5020c2823dcdc3865bcdbd9aea15cf0577db6381103a9b7fe95f2df8600edaaa075129fdd7b1c6b53b50fe09e01e916365fb53408fc44c0097ebbfce40b237b968e4287783b28f29c7f89e4e3d039a5ce1bd9371f533bf6c3037413f2359025fdc1ff3219d98279d1b5f515ee00cd65bc328e5607f90c334c4c478e8fbb6baff1ce61f5f80dfd17a998e330ebcdbf387c1d6e6fb957916546e6d50766ae71390421f59b680dfd17a998e330ebcdbf387c1d6e6fb957916546e6d50766ae71390421f59b62f0891a314798127a796b3bde757f716981bc12c41b386c0f459ab628bcf57f22f0891a314798127a796b3bde757f716981bc12c41b386c0f459ab628bcf57f24497a839022f818fa34b44fc8198daa6136a6516835015316ab61164d9a1a2243f1c943af30f7830b4d9edd4de1dc156b29a500c9394c7642a710131112f6d23df4c4ae7e1b669900f9f386161c17daaebe085a589dec72b0e20dcab1e377ec9df4c4ae7e1b669900f9f386161c17daaebe085a589dec72b0e20dcab1e377ec953b38f2013f19cbdcd2c3071bbdd30a17e2ae7449faab04b5cf98cfd332d945d53b38f2013f19cbdcd2c3071bbdd30a17e2ae7449faab04b5cf98cfd332d945d7ce6a0d36c1d343e7cb17f355f6ce946c8095dc5627574f086225a7dde374cb77ce6a0d36c1d343e7cb17f355f6ce946c8095dc5627574f086225a7dde374cb7bbfe527f259f2333e0f5488921ebea15ecc4d8fcb6ab7a9818867ef233712daceed47f28b9547a7c19e97a0b62d854282d39f7d8763740d9356bcb64f75aff8248173965e1f44c88aa214d96200b871630506307581e673dbe5c13ffb54e5603a431750dd2122daf86c66d2b43d0abc0eb1b208b95a239eb43e8ad022d73ae356008c8bbdb2c1cc8c084be8f897f9078c4940728ef726a954c27e115d8ae30466008c8bbdb2c1cc8c084be8f897f9078c4940728ef726a954c27e115d8ae3046c3bd1588b11fed1999de5113d2f01ee736fbaf013f899edfe328b96d10147d371202ce0e40f3155732af0a4a14004135a07e554efbfd61a53b99b14f2a795f2ff09a35bebfcda96fb42371422d0c0976336bb6791ab98369c6fe7ba3780ff91cf09a35bebfcda96fb42371422d0c0976336bb6791ab98369c6fe7ba3780ff91c4cf07240bf5a8e09e578324a0ea9c0017fcb1084e66f27217ffd07a1365166e22b2094a575945b6ce22979fbdacc42ce9f4ba401dcd09b01d51fcb4104eef768bd1938c4288f4b55b28cd0d1725c1025d30699525e717f81e59d1167fdcff9cfbd1938c4288f4b55b28cd0d1725c1025d30699525e717f81e59d1167fdcff9cf0cc01ac52d59fd9c4f0638a724a2b474b38728a7d5e75a5a229a811b54f093ecb26281edd501faae5529ba3af5b5770d13233ca71abf06dd2939cb2fd92ec3e8151a9a9a2be8c7824c02ae34b0e8fc9b2e96cb9a5d29e9a9d79417b2d212c465151a9a9a2be8c7824c02ae34b0e8fc9b2e96cb9a5d29e9a9d79417b2d212c4656a8e6f08151f5d49d7741a6b1f524814523963fcb8fee49c88f0726c455270746a8e6f08151f5d49d7741a6b1f524814523963fcb8fee49c88f0726c4552707416779e6e1482fca7af8e4500b00d8d9b4f6c6dd42fe44f1041ddb96424495c1816779e6e1482fca7af8e4500b00d8d9b4f6c6dd42fe44f1041ddb96424495c18ee97a8e87fa9d22fae016e69bac1abe0f59e335ebd1d0f85191cdeb531288b5eee97a8e87fa9d22fae016e69bac1abe0f59e335ebd1d0f85191cdeb531288b5eebb9ba4e2db8ae56284f8b28cd5d952f5683cb53bb72b291d3d0d4ad565a3b8ff0204dc63cdefa90f7d1a46a11b6bb0681b949ab29e7ad7832b287d88abe98b0afd0154be7822dde20277626e1d6c80a4787492a901c794d0a8f2a0d2a201aabafd0154be7822dde20277626e1d6c80a4787492a901c794d0a8f2a0d2a201aab688baa44a2e55e99ce9646ad21260e79b2cb8d5cb461410cc81e77459eb80df9688baa44a2e55e99ce9646ad21260e79b2cb8d5cb461410cc81e77459eb80df90cb7ba7aeb7a9c678887bf21ff4cfbfad6f6c9d1ece08f2d76c996e2a7c814a20cb7ba7aeb7a9c678887bf21ff4cfbfad6f6c9d1ece08f2d76c996e2a7c814a2f3289a54c652763e305cb04a352278c5c18a664823ac24ee41923500f195fc7e1bf05c5472d2b0f50bf13710483e7edc3e945bc9afc5da3973cecffbfb815c7bdb6ff37dab3b811c9f33b65b870429fae032e926da680b34c9c4e5a8da3a57118ab564b758b060fd5097d938d7f04e8e3253808f8393efafc0b4982e3cc0350f73019edd001ff8b3f9c330f7dd4f9cfd944166f14e1e65f3b531f02739ef482973019edd001ff8b3f9c330f7dd4f9cfd944166f14e1e65f3b531f02739ef48292eaeb268b37743df5275f39a24405cd7e9849291d8d38bfc71fe7e83927fd27868e040b6f5026127a02c8106afcb05e2b3904c1ac3673da4bbb2eb3741d9374e2575f5b5e66077f470c3ace0cf86d6ead070a9932877d1f09c50011ff545d7882575f5b5e66077f470c3ace0cf86d6ead070a9932877d1f09c50011ff545d788ddf55528065035ac15cd5e6155b094ea21b94ee8a5e70cb3a21fd50590df50eebac6de98492ab9aac183822b720c536ccd91a912d7db0adf42ad32b4a0d8e56e7f807f154989d283fa63b971f6e6f83bc0a40ee3c8ac6c9691d453d5746560517f807f154989d283fa63b971f6e6f83bc0a40ee3c8ac6c9691d453d5746560514607688a78517aa8114b08a2acf7afd098b0f644ce76833640ff1f172795d63a4607688a78517aa8114b08a2acf7afd098b0f644ce76833640ff1f172795d63afa51d06dae6a8275a6ced7d08760b89fab506131272b29a89b62ff4672a5264efa51d06dae6a8275a6ced7d08760b89fab506131272b29a89b62ff4672a5264e63c9620afbe40c904ebe3d1dcb6a72662f051482e023b9072d52a993056f790d63c9620afbe40c904ebe3d1dcb6a72662f051482e023b9072d52a993056f790d09ba6d780f9afe9f8d03aa7b75a83ddb919789167d49857644233d10bd85699109ba6d780f9afe9f8d03aa7b75a83ddb919789167d49857644233d10bd856991ddd19f4f2a6e16b6d415211d147860082ff6cd1d7fd6e64e9b4a5c00a4bacb2eddd19f4f2a6e16b6d415211d147860082ff6cd1d7fd6e64e9b4a5c00a4bacb2e10ad7f3fc85dab4e0569ffe6f43bbcfaebf1126cfb25fb110c6b495b0a3b5502b39f5b96833d985508aca67c757868cc0922b3eb51f4cf55e86d973d74ccbfe4efcfdd9d5459fdc009bfc5e6e584df6a36df590138c0fe8bc51ce7bd7f3e8e1befcfdd9d5459fdc009bfc5e6e584df6a36df590138c0fe8bc51ce7bd7f3e8e1bdb3d591437caf9eb5943fd01fd739cf652f9f1f4e85e8e948f4acc716de50582f680a399175cbf9a194dff6dd990b482634fd863991d000cb976ea398234be5db38b8d06378dc9a1de897974fdf6507c6a1037593ca3517349c2f6560e711c0ab38b8d06378dc9a1de897974fdf6507c6a1037593ca3517349c2f6560e711c0adc95ae4fb7046b178773df0ff0b94ecc396cdf25d822c624b2703d6819523bb801d1969a252264e68c63f3ed573f4f2ac1b128446f9a554b26c82972afc662fe427dc2695e9d2bdc384661ead7ef31c920673da3c6bbdc325f9d0b0259b2e927c84af1a1c6cd5bb5610270335395fe72f62892e9d20e49d731fc44a5a90d204e1e9dfa445882d1d8cc49fbd41d9b2ef2956db6973b1db9afffb546abac56eb7d21b82b698eca68f820717d493559144134c149ba1e805fd55920c5269dfc6ee2fcf59188b8e9b05ca14f60b14c3204f59552f6070216acd018529e974d33736bf37e77a37d124d66d1839de8a7d0969935df12553a555e2494b76a8aaec99a38f520a8f35b91313f3159b0c550185b73f1300288a2f68ca0c0e05248d59f596255c21a0c42dc76078432a3bf0a7772d17323c74e61e5e1b8fc5ff5da088e483b262a107916641c7f211ac5898c0177535cd0bdc5aa872cc6e883842694d8f52181a04af69c7f806ec39ab2cac5f0fa7fa8beb6802601105355fb3e606151405da05c9e351cb073740ee47969b95e4355ca546e697c8459fcea96d69bf986417fd3b8c45f71627122ae89425b43fd781f430ff2feebdf987fbac19499270f9d23c0e0773a79dceb622ef6410577c19c1e177fb2eb9c623a49340de3c9f1de2560af4284d561fd795e97e26532929098e439bcfeba1b0528b8cf031c1813ed322ecbb053abd76547e02de39e7e439602279a670da5ce9e6a3932cdf5edf71b6c3a3b18b4ba810f57303534a3fab7af5fb9ecee1c2644d314196c706e310b53c14b6ef6393175a287ec3422c86b26610a9cf4c8db9474782fe66b45dad9b4f75c22989c7a611998a6540463c2dbde140e3eb6c88f66779b0ad9637c0b2fba76cdc3bc51c5783f5bdbecbae3e80dff65e3a2239c8b059475348c7eab848d7b44b965bc51c5783f5bdbecbae3e80dff65e3a2239c8b059475348c7eab848d7b44b96533aa1f6bc7bb94c5069ad272aefe69bfe3b797a16648e39c63034b87ffba0d6c33aa1f6bc7bb94c5069ad272aefe69bfe3b797a16648e39c63034b87ffba0d6c1487ea997f9e8d11cd47016d5312d6afabf04f5e12f4a6cf357963f9d69c33d3deeea67b84bcb15ce5d735a9897ee78989f5f01933e2f5b9a15c5a11282c151a2de83b907ec2392883dd9e30ad62c6a868fa64e703776be23832cdba1e6431506af9d1c3f96347d11c0e8a2411c5dc8d7420f85ec8c8d0add26f45a4a8890283e69df7bc891b198cb323b21ded7a3d545c266c0c61e764fa78e4c9e632248d7b97a118c886615f5551ef5b71b7b5687fc5a45503693fc36b556be82e0b9752f27e3fb6e6252a35b3a6a7598b84a2a4e1b53ee976b4132c20b4810ec63405ddeb7e3fb6e6252a35b3a6a7598b84a2a4e1b53ee976b4132c20b4810ec63405ddebd09f7838e3477c232c947b69387010a57032a6f5a7becbd1a9151b9e7b6a026dd09f7838e3477c232c947b69387010a57032a6f5a7becbd1a9151b9e7b6a026d18ef65c90d54d0eea67446b7bb42171ab06af46658480e032135683ddcf5b01718ef65c90d54d0eea67446b7bb42171ab06af46658480e032135683ddcf5b017983758e7f63820305df1bfa08d83502a1f14e236fc367ede4840bf0ccee54b19e666d5a1c9288d7399419c1015a3eb315720e744ffbc3d56463d3b17aa4e8ff66a2b530f2af1259238104fe7ea0834a3801f1c442c14f7f342d55599632be894e2aebde619ff4b7600d9a421e134728d527b400f7195fa8d4eb7b39546648d54d0696ed88ba088aeab4fa7d865b82a98681c8948d45fee9e6a79e4a9e9334e2e73e6dd3b04c78e1073966709305ca2c4bdd68e9fb05cee13d55648182ddc9461e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b8552cec89d66b9119a0d96a9650f71dc144d188ac2e232a2888c8d649bcc339790209723c6e8f24bd3a3723fa349153da6ee434a0706ca0d6e01554f56d6353c0e2b6b62c03b158d21c95a15d40a0637067fb3a4fcf5e8a238815ec68351bf4dbdba87b42eca9e3086d37f45fd51835e7b2b87259a417bdf726827541d917dafd5998225f00e1bd0c4014e51b5483f5201f0b01e9fd31f8a5938c75fd693692eddfd79b9c5577b9cb8844f45fbe63c7e1c4df7e59c1a15edd9e84730b4f30ee0cabfa1a7bc4d4664b7767aa075f79af76dbc84e510fc8b86dba5974e4da0b156601d96e9917781309287d4a0523254b97d8e3f56590aaf558ecbf6d143ea82b5e76e28b8c398be99b27741dfafe437b7928765125a76d73da16d76f6ba8fc07e820cc917a71f40a9cfb1c662a3d12ba64636327d8d34f3b3367cd7e09f2e8f1e30c8acf8738149088c28f73aeebe3516a6a62f728e1790677e6b55f245b4d4921de7fe649b9b235c32cc91313227d09d114da4d731919d18932a765bbe632e3aea6eb9302e0d74f609cdb2cef741518f0b4fbb3dc4fd8d09266d8b7796837182dc50986733bb2abe2b32f149625e8763e01e7db5c7e8a49032eb648086d3a31b67d433dde2a675c63d5b2bf0a3fc62a397959e1dc2a7557e95c59419d61403620d6601138209c2d468cdc091a9e65763d764c6a8d9ea6db14b43e4d5c780a63be712543d0dd3ce948b4d091d44dafb8363a013398520ae6f77c9a5d9b17b04d4d87543c4e6b3723132869e28d3de3141c292ba99be41fd1a0cd374a3725afd417bb5f808d5382aba1e6bd7f28e57ddfe5f0798c2ca7ef79cf9e138ab3a933d9368ca1c73e6ee3ababc0eb6c9d065331de31517e41cbaee5ee2a9d43e7ae6aafabcd8b859d88d20bfcb58834c837f2b9cd6a47c27d5662324160568f7052c897c47e37a6471ae55fadc947a0aacbd51f13ec178e6d3f4fdbc132db07efca8fe3189b62fa8b49efbd8f9b48142e8ca0f4210f9ff431d06dc6b6d56a0a78a348f3a70f7ba546f881cb890dce92b4ce60688b317e15754e912c6dd4a00ebdb9aa36c46f50b7ed50026aacc2d883322d992cc4a2c81e6a029b23bda6d2885e2a7d78bd8a7f2f46875587e944642c24e356fd91cf19635fa0c34595e6682b9410754261fff4ab036f98bb367e2e16b36b7d3fef3182ce1bb555ebe869e3a1c6945834ea77699a8d2d00cea72bc5624866aa05f20d186d5770a7379d07e0e9d9929d2f0b4154005b2d8b1c546ee1217dccd014535ceaf7673485892e8db79b5d24a60da92e5154f58dce65816a1326759211384e86b57791a5c293ba00e9a8bc77e2626184c1af266529cc0ac67fa97d9a9342f0cb7444d0ca977dd6927af2efd0f1335c53a072e4a3e7c3aeb852fb762b4abf3a079f7d5b5c30d7e3254e899aaecccbb9938485453cff0205aa7347dd7c3c196b64cfd989bb7c3b2cc374a0fd575bdf81bc5460c73ff718325c670e4a96d44d5fb3e5ad78b1ffe8eedeb96dd262f03532f90299d6ce486a9475e610b33082f885afc8dfd90538a1b1d879f582ab5b76ce564e0e1d55b4bbdb9c8e415a2c94fcf716903a48502860a20f02175dc14bc4bc4b6dabe573d39f745764ca26f1c46841ba11055ce61c7f273f26a8343fc81f404a66d9fcdd778c4cb10d71976e85d1368621988ad4af8b484440b25a0f5b4ba5d0176b40cc3b460d8cf79a8f58e6ed147e09d71944d2cfa4dbb712bf2f3109c854aa9e09fd326b3e4dc96a401306fc8e04effb51b121a685e6a954a13512b7caf68f24977b3fe6779894486361f91dd1599072ffaab4ac0e1bea2f46e04921b34cdfc45d744664f9374ad1a7642e9666aca414909c1789f005adc4f67ef9158802472dab0ef688a2b39e85185a52c8291334ac54d6a01cfafacb1795eeb0c83461bd8cf0fed480019c43d138db2adffdc32ff628cdfbdbb623504766709e8636f716a57aef2dca5c4fccbb11e424a596227772a5632f7846df236aad6940d87ffd35a222914bf00bb15c1e3650db83f76e5a77896e1568b22625fa87fc4ea656ea633b448fc70c5b75e46d3b684493eff0ae722ae811c21956cbab3330a470936a913d53eedcc3019d73994dc4b181a1181ab2611bfb69c315813037fc11353a4df95d4b8e116d64e02f093589b2ac6c2ca14689ca036e9dcda688e54b510e64a713a525d71859d51a3bfc8331f50641a5fd73cd6975cab6164b5d4adb92722e1a116268dd8f100b45cd181bf5e991ed2c14ad8656b34b1f6104c56831624c0c89bda3f229c5363c48dd3546094a6468cbe7aa5ee5ad8ee972b9254ffa97bd110d3b16a6360245d5094aba2af0fe324d633a44f383e08d83f6cf5c76ee7eb52507e42228a0ad4cb5e40fb5259a58fa6fcb332297f38b72f2187878c87191e5a7115dbdc2700af1603a31fa5083a473a9c13904e575ccde32b9cea524df3c8a1b39df31333f97cbc0b68751e5f4c4d9ed576f40861b47afff6dd1c1b548f49adb87a836ea48a7ef67821d47fafb3f00c0b827d342e6448cb10b48ad48bd3a30a1a23eba929444507fc5edb7288d07935166a128f03d1c98d4e23bca8875a99180f838e05b584c26038ccac6917c8d9ff97e6e04eee1ca6eac4feb716213492d53dc74a5be47377368985597c7429690732f38118cc9fb065a9e4c888807ded1f5ccfa542e27155f20f0e1aeb7f51bed81a486d0ab00ccca00deb91321eef00d18f3131583797a940ea1935c5d6bc7ab754908da7381962aa676a29bac4e9c608b587073aecdc7542485ba2591578de0622e2254f32e183d80dafbb3dee47b06abe6fd7c23f88986818b937161b12130026dadc51a74479a55d9c530e490286b8958bb379fd60292a3c7436dc8b28d9a1b92521734375cf81d1e84429bde2227d818500579ebe34c3cb86cf1305827ea9c3400bc813fd9a1401c3aadb6fea6044193d624e12b185199b4c6e5a1fdd6454d384754f380a7b13dd832a8d7df36395975f50068b9cebf4b8c55c1bc6b6893694cf375d92ed1f5ce328ffe26c05dbc2ae04942a6b9a421e2c482d5f4f21afdf36931b536424ded3e04689b7e7b377fc13eb3d9f420fac70804b2e59ed9b6d785e83dc0795744d98ff62c8761892b6b5db062aded7d699ba60239858a29a335841d26cff17b38943a81050efa8a7da617173335629cc004f60df94568251cfe061dd89d41d4e18f7bf06a79972973feeb72654263ef05b3f6311af6f0cf49d10fae3a9ec2253006ca66b6087b44df0bca60d6e5580a56260a806e7851ca4f52ba9ec469f0841ba4e04b81b8a0226928bf6488c5afe1af00832fe5959ca96315e8eb691207b2cb4dd346e6ef4dfde1ca220fdbbca3330d79399eaf3e55e1f77aee52f9c410786c8e36f0d6bf3d7c2d8237541be6c70a8c2b2ade1d0d4828b44781e6b5fcc95943adfa6921118a60920e740f430989278af745739086d8bfe6f8f72deb74ce5957ceae06c0363c36acc952e477d9b899f04f3056b96e1bb234e38430712804b73b6ef942cfb4378db38350b953bee9a8b217fb6c02b5d63b0b18a07d3d308124c1a87b377b9dde6a3255e390828a2d3ee8fa1e9fd9b93fc28509a3911ef94d8f713664d736ad274db47110c55382fc01c889fb5fa2bf031995f20c920a66a16155c71959ae2d1bb09ff5befaba86eae5207382b318dcdfdae3f136ac158c1cc2238e1cd905491a0fe295ec757656831bdb7890f45f853e9a9d94510a496dbd048a58d78a3ce05dedda00806aadf9f151b3d9f982ea93f5b896ef5f3a54c213d29e558992f34354afc372bbb2351959f3eb3e768382eb136441b6a254f21aa8eb4505f126433cab2ac52e930c59910e1d0a1ec1802e609bb47fc50c8e9991cda47407eb1fd30061bda44a4c4463722b813f121774a63b7035225bc2d27178182ab1cef2844b42aabceef672b1888f30877d7ab0d89adb42241f1ef04a713f2ca742b2c7ba43cf7156441ebf55172c04341272ce87294ddd9d2bfdd57ea5561412b694f3613e6fbcaa43190e886ff9064b42c49ef1dfada1c800675796c0923d804eda7ad831f1ef5ff3e8e2f6a144a1f31439fe732a9f3e31ebb3f6823f79ee4faf14de21f59e0fa3ba7ee72a1994dad9772eb1e12a24a34e6b4e02964e22a4f18f0a0b00446a34f670e3c3194a8650f1c635c101499d5993171b98bd7a34f0a5726fdf5952a1830546e8d42eaea74c2b842208b59321b9576f1bc6276016422995f752831666b01d5f97e6295e24e65369181fe26454835c8768e9035bc654a39ceae7dd3d6dbc0cc369a3d7680eebb5a076ef721a4c6f7084cc2fb46c06f1ce36c533ed6f8887f604d1e031abbc05368b2062ad93e8105e919f8329989f3505676f35ebfa77efe1e7b0a553481d80e7cd4637464397faa4e4b75021e188daae8a6e2c2fecd19ab36dfc33a79be087aca13f4b9cb229de8eefc6fa8fc02f993169813549b464fe6fdd670ef0566a681c290f5ba6da0e57f385f83d260f0b20a79fb0e91768fd0a11460ab54ed05aaeab2ebd5f296edd45c04ef77ffd8f704c15e7a213fd7ddbc4a14846cac228b2f562d2547e53f0c554df311aba65ffa512f27725c6c190d1540c9c905192ba8aee38f8ec68f9359b4b6137fe14a691f8916e24f5f1d05c3b8b5e7737bb998bdcb78c8b2679772b00459dad7800649de2467cb4aa41f134444283092b5572fe589d87a0bc492ba9ddabe95ca51dbf42a4a24d4688b6da0bfe439fa8648914a39873ad4797c82427af016c38cd9d8d69f6b4201ada7fb1f903f05b18b23437c6ab6fe9f18ab5666b050ffe9677d369bf8e5344d70e80546158a8409b5f7ce02fa659ca66249181aae95fd2ee5cdd0b60f527ed23424285f7fc72b4095d40df4584f9eae6d4c43f9ed77c0bd6b1b9352f5a7f1d206aa61f29cab32f4b92d13dc613722fbcbf4eb886acc6c9bca99bc0445e501311fcce8b28bd25d086ab05b13b6964dc704f30ce52f2cf066f4c1100c6e1d5869f6c4bb8c152399ec3d97845fd3a82b1638faca34c27c385bca1a32c86e24e80e6ed7d58d70271477f6b24c154a8bde320130414f32ac37b4bb0f5ae9c7e1aba2925fd2a5d1a70f464f8ddcd993bd9eabf6127187ff6c8b03e0403c1a1bb7385938c30c83ebe09b1f63b2690ee1072cf4621e3f046f770700e19c6c993ef3273e55b5d512d29a9e87cb775a4a8daf8182c20fb184bad92c61e7a6b4082e78f4834f3e1a8cef60295247fb84d00595025970d09f0ca3f9cf079fa0699216f3deff5713e47a54bbf5436e9e0b9960520fa0ac943a5533578ce4e441019db3a9bb3e6b683e075d1beb5851162c5c61ca1e99fc743387692a4a37683e811d5144738fc03607697575b5e9bafd727a3994636d2f73fcb4adb2e1a2af266f24479f93bf7b3e314d9f24139521a26b83424ee538ede54ccb55bd7b53175b0dd6ce33b983fc325fab75a6b8de70e00580e1744155518e8b4dbfbbe08dca822144c56f9a16f4a7fc1f234ef312fcd8d6ae485a42234ecd5e465a61b4317470220dcf5e8cead522f6164c07e47f795308cae7c739667146a1aa0e2958421d87ee5b98831d1a7e5e77e57b863b7e5b15c3a2ea54c77cf43a273b533ba956f0eb88f4f58bcf39ff1ebf5d24b3efee73867ed16463ddde45f929663b1b1332db24bbed23df8f38c6c0198777229244f29787cd04680b653911c98dfc64519cc628bd653a1f8e63d8596b547a328504d1e487abec46902a62299f78f186ab24e3fbc33e4a91a6c15374d4943ac913a42818e5f1617de5b4259e54fdef3807c4372486fa281c57285906483e91b1854d1cc32832a287030067f8507d90619f1bff082c7c1c99ef75068ac7168cbae26457d2223b918ce721ae9e8d56b8e4c6b096f5431deabe6285e45ef048f3a56e570c3ec18044f10878549820abf343dae7af5088229e82e9bbff56720879a4f4c83d7049b40829f090fa3a705afcf024b3be78e4aa4f64d3484544f872dc0b5c33b3e60dce72538418ef98155b04ede1313910a9223a110d1303b478ff681b759307476d977345710507feee665148e40340d5509f60277d1d320da834e2d41708933c4e63c7f24418f21a52970cd7264250a53b1cce4359d77b94c6458cf879780b3fb049e1b00723d82c0512c12d99f44e6373458887bb5eaa5bdc02b523e9d02ba7f60ea7e2eef071a94d282b6732cabb27763bb8e89ecfdd3564b887dfca04d231943ed2713314916842816e0fc871dfba606ea11abc43551a6b0b553808250cd4ab4e9e7acc54f010a27f3f942db0cb0fb0967e12ac62638c2d76aeea9f6a315dbde890f7458b785b26d5750cfdc23f59e86d2862e1f4127eafe7e0b9b3efb324c4a0b4791947ab4ac1c72f6d0bf4ac232c2461a04d9703b56dcd38a858b639c781e456b314ff350ceb4edc42705eacd056289b67a060ef2af21f8ef19f0a4cda46ded55778cca3b24be71112419c715c81efea7a709a36c6c1e6252fc37917149ed58193f60d7ff924dd01773cc51d49caa033f3eb785e0e0617d7ab65b9dbae27d212e2db6e8a800dc79b9c66a3971e27b30bdcacda7929c65d4cffc7fbed195eae9846c480208da996135e03d0133e0a39c987397c7938316608863f80bec366648197060b864a70d1051f2e3902c24c9907722d526cf85f1eacfa0d21bcda0b9b2df46c16ef9910090da54f90d241e9f45eb3fc59f587e19f66e92adc5031f581fe22cbab1696dfc7b38055b1c4d769b1b5d61909b38367d71aa66be4d55298c3c3036ea28e7cd643fc22c20053a07e4143bd9e7dbd236adfd77655e6d29f1589db1e6d14d00dd9ba057700ddb13b711082f6b9a437d1e030f9bdb3621cac55b0cf0cfbec760d47c1a078e29339f11fd4dc80f94533f9c5ae3062f30694518cd4d160b44698b3e925b900927d587324831155b48ae01104bbdcb90c8d289c796fce71cb772f6588379d774cb5b8c37cc6f4f7f0721f60340df07d3950d85608259dd12c17c1f054d72e572f0c0ea394f98659ce19db6b482d6f2dbaf407b91b000076dc25f1501c71404ea70134ff1f3ac6b135f64cea700e25a09d6001d269b2cec89d66b9119a0d96a9650f71dc144d188ac2e232a2888c8d649bcc339790209723c6e8f24bd3a3723fa349153da6ee434a0706ca0d6e01554f56d6353c0e2a4317d44f62469d56db0b40b4e82565e697d54c5b30940a2ca780beafb2763e99d6b52f7347859254833d7eaae0280663cd39c2598d4cbbf6d66d5dad40feddef0e89798954e0d50f48e0cbb48061fc9ac8deb42fa3a33c8a77998cbf5ed5102914de3471617614dfc742d7cff01d27baef151b8069dc933c9efeb9d6f786f006229228fcb176c2a3199e65967adda622b8013bceb3843e75985ac55a2c9f0e5e95d0ab25e5dbaa23d1a1506b91f9c8ef15319d6ce0aa3f4269c92835c59f4c9e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b8553a4fd7c126d2ebe8fc17659f36031ff8be1da85831400d5cf86c5b8ac24927afe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855c5983b91ee8b4255a595a3762b5a4e9ba914cd03c164f3cfcf05b386977858bc4b9510aa8b39902ec84679264393076c225cfa17a0467289d2b2b76a98ca7cb3712eddbd00bfce9609dd3e962fa68a44a782318c7fd51e321798a7efc168fd76fa87a67afdbbc5b89c7bcb690ac7bf6c843f95ac53d82fdcc64a267a3fe3b8333fe980249971d52b953ed4684c677ddc4eeebca2d61c53882e34022b0a729d9822c3933a232ab45739319041575494a02a6e09a9687e8bcc5aba68e89e34e9cd15510643032c1132e769eaea1dc5f04d4111f086868e2346cee4befa5fa71f55a46b35664a2711fd7428f841f700521ac041ce7445de952382298a4e12da777a31fb19bf30ec10ac0cec21677c2e2ff9cc4f4759e4c684cd78ee9968acb94af62383f9b1a87487e42b921c49d5f5d937d6e93a2665090886a463b8c3321766822c8b41b1e83bced57e894627afe9329a5a5423c84af62a6b4f264823810e4e53fc018f5c47d497349286946c82c2bd87c903d298dd72316f334b89a65a3244cd6eb09fb405311512e74f956d323e7d64f1abddfb7015326cc492c5d63c0f1bf7981215285bc97a2aa15b8117a2d5d0ab7432b03a54882231eff6ee2194200265e29ff0b675a96d1dd47697894df3969f0a81f881cb14378816a77001e0cd8f967b5f9e752981adcaa2750caeef0ddd708e92bc75b7fb4e69a34172c2760745bb4d46bc11d19e3853d54325973b8e2c53090f5638a7bf27fa1f5f1232c78901f7rootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootpython-gevent-23.9.0-150400.13.6.1.src.rpmpython311-geventpython311-gevent(s390-64)@@@@@@@@@@@@@@@@@@@@@@      /usr/bin/python3.11libc.so.6()(64bit)libc.so.6(GLIBC_2.10)(64bit)libc.so.6(GLIBC_2.17)(64bit)libc.so.6(GLIBC_2.2)(64bit)libc.so.6(GLIBC_2.28)(64bit)libc.so.6(GLIBC_2.3)(64bit)libc.so.6(GLIBC_2.3.2)(64bit)libc.so.6(GLIBC_2.3.4)(64bit)libc.so.6(GLIBC_2.4)(64bit)libc.so.6(GLIBC_2.6)(64bit)libc.so.6(GLIBC_2.7)(64bit)libc.so.6(GLIBC_2.8)(64bit)libc.so.6(GLIBC_2.9)(64bit)libcares.so.2()(64bit)libdl.so.2()(64bit)libdl.so.2(GLIBC_2.2)(64bit)libpthread.so.0()(64bit)libpthread.so.0(GLIBC_2.2)(64bit)libpthread.so.0(GLIBC_2.3.2)(64bit)libpthread.so.0(GLIBC_2.3.3)(64bit)python(abi)python311-cffipython311-dnspythonpython311-greenletpython311-importlib-metadatapython311-requestspython311-zope.eventpython311-zope.interfacerpmlib(CompressedFileNames)rpmlib(FileDigests)rpmlib(PartialHardlinkSets)rpmlib(PayloadFilesHavePrefix)rpmlib(PayloadIsXz)3.112.0.03.0.4-14.6.0-14.0.4-14.0-15.2-14.14.3e;d@d@dx@dbdbdS@dEdBzd7dxcK@a5a``&m`&m`"y@__@_~@_xg^,^ @\,@\j@\ac\X)@\T4\R@\5@\5@[i[!@ZZH@Zg#ZfZ7Y.@XQ@XOVaVT@U@UTk4dmueller@suse.comdmueller@suse.comdaniel.garcia@suse.comdmueller@suse.comsteven.kowalik@suse.comdmueller@suse.comdmueller@suse.commcepl@suse.comdmueller@suse.commcepl@suse.commcepl@suse.comdmueller@suse.comcode@bnavigator.desteven.kowalik@suse.comalarrosa@suse.compmonreal@suse.compmonreal@suse.comdmueller@suse.commcepl@suse.comhpj@urpla.nethpj@urpla.netmcepl@suse.commcepl@suse.commcepl@suse.comtchvatal@suse.comtchvatal@suse.comalarrosa@suse.comtchvatal@suse.comtchvatal@suse.comtchvatal@suse.comjbrownell@suse.comtoddrme2178@gmail.comtoddrme2178@gmail.comaplanas@suse.comaplanas@suse.comdimstar@opensuse.orgjmatejek@suse.comarun@gmx.dedmueller@suse.comtoddrme2178@gmail.comdmueller@suse.comtoddrme2178@gmail.comtchvatal@suse.comtchvatal@suse.comtchvatal@suse.comtoddrme2178@gmail.com- update to 23.9.0 (CVE-2023-41419): * Make ``gevent.select.select`` accept arbitrary iterables, not just sequences. That is, you can now pass in a generator of file descriptors instead of a realized list. Internally, arbitrary iterables are copied into lists. This better matches what the standard library does. * On Python 3.11 and newer, opt out of Cython's fast exception manipulation, which *may* be causing problems in certain circumstances when combined with greenlets. * On all versions of Python, adjust some error handling in the default * -based loop. This fixes several assertion failures on debug versions of CPython. Hopefully it has a positive impact under real conditions. * Make ``gevent.pywsgi`` comply more closely with the HTTP specification for chunked transfer encoding. In particular, we are much stricter about trailers, and trailers that are invalid (too long or featuring disallowed characters) forcibly close the connection to the client *after* the results have been sent. * Trailers otherwise continue to be ignored and are not available to the WSGI application. Previously, carefully crafted invalid trailers in chunked requests on keep-alive connections might appear as two requests to ``gevent.pywsgi``. Because this was handled exactly as a normal keep-alive connection with two requests, the WSGI application should handle it normally. However, if you were counting on some upstream server to filter incoming requests based on paths or header fields, and the upstream server simply passed trailers through without validating them, then this embedded second request would bypass those checks. (If the upstream server validated that the trailers meet the* HTTP specification, this could not occur, because characters that are required in an HTTP request, like a space, are not allowed in trailers.) CVE-2023-41419 was reserved for this.- update to 23.7.0: * Add preliminary support for Python 3.12, using greenlet 3.0a1. * Update the bundled c-ares version to 1.19.1. * Fix an edge case connecting a non-blocking ``SSLSocket`` that could result in an AttributeError. In a change to match the standard library, calling ``sock.connect_ex()`` on a subclass of ``socket`` no longer calls the subclass's ``connect`` method. * Make gevent's ``FileObjectThread`` (mostly used on Windows) implement ``readinto`` cooperatively. * Work around an ``AttributeError`` during cyclic garbage collection when Python finalizers (``__del__`` and the like) attempt to use gevent APIs. This is not a recommended practice, and it is unclear if catching this ``AttributeError`` will fix any problems or just shift them. * Remove support for obsolete Python versions. This is everything prior to 3.8. * Stop using ``pkg_resources`` to find entry points (plugins). Instead, use ``importlib.metadata``. * Honor ``sys.unraisablehook`` when a callback function produces an exception, and handling the exception in the hub * also* produces an exception. - drop skip-tests-in-leap.patch handle-python-ssl-changes.patch (obsolete)- skip test__util.py in s390x arch- handle-python-ssl-changes.patch: refresh to handle ssl.shared_ciphers() behavior change in python 3.11 as well- Add patch handle-python-ssl-changes.patch: * Handle Python 3.10 changes where ssl.shared_ciphers() changes behaviour.- skip one more test from testsuite- update to 22.10.2: * Update to greenlet 2.0. This fixes a deallocation issue that required a change in greenlet's ABI. The design of greenlet 2.0 is intended to prevent future fixes and enhancements from requiring an ABI change, making it easier to update gevent and greenlet independently.- Switch documentation to be within the main package.- add sle15_python_module_pythons (jsc#PED-68)- Make calling of %{sle15modernpython} optional.- Clean up the SPEC file.- update to 22.10.0: * Update bundled libuv to 1.44.2. See :issue:`1913`. * Upgrade embedded c-ares to 1.18.1. * Upgrade bundled libuv to 1.42.0 from 1.40.0. * Added preliminary support for Python 3.11 (rc2 and later). Some platforms may or may not have binary wheels at this time. .. important:: Support for legacy versions of Python, including 2.7 and 3.6, will be ending soon. The maintenance burden has become too great and the maintainer's time is too limited. Ideally, there will be a release of gevent compatible with a final release of greenlet 2.0 that still supports those legacy versions, but that may not be possible; this may be the final release to support them. :class:`gevent.threadpool.ThreadPool` can now optionally expire idle threads. This is used by default in the implicit thread pool used for DNS requests and other user-submitted tasks; other uses of a thread-pool need to opt-in to this. See :issue:`1867`. * Truly disable the effects of compiling with ``-ffast-math``.- Update to 21.12.0 * Fix hanging the interpreter on shutdown if gevent monkey patching occurred on a non-main thread in Python 3.9.8 and above. (Note that this is not a recommended practice.) See :issue:`1839`. * Update the embedded c-ares from 1.16.1 to 1.17.1. See :issue:`1758`. * Add support for Python 3.10rc1 and newer. As part of this, the minimum required greenlet version was increased to 1.1.0 (on CPython), and the minimum version of Cython needed to build gevent from a source checkout is 3.0a9. Note that the dnspython resolver is not available on Python 3.10. See :issue:`1790`. - Meanwhile Cython 0.29.24 and dnspython are compatible with python310 - Revert threading test skip, fixed in 21.12- Skip test__threading_monkey_in_thread as it breaks with Python 3.9.9.- Skip two tests that fail in SLE/Leap: * skip-tests-in-leap.patch- Relax the crypto policies for the test-suite- Update to 21.1.2: * Features: - Update the embedded libev from 4.31 to 4.33. - Update the embedded libuv from 1.38.0 to 1.40.0. - Update to 21.1.1: * Bugfixes: - Fix a TypeError on startup on Python 2 with zope.schema installed. - Update to 21.1.0: * Bugfixes: - Make gevent FileObjects more closely match the semantics of native file objects for the name attribute.: Objects opened from a file descriptor integer have that integer as their name. (Note that this is the Python 3 semantics; Python 2 native file objects returned from os.fdopen() have the string "" as their name , but here gevent always follows Python 3.) The name remains accessible after the file object is closed. * Misc: - Make gevent.event.AsyncResult print a warning when it detects improper cross-thread usage instead of hanging. - AsyncResult has never been safe to use from multiple threads. It, like most gevent objects, is intended to work with greenlets from a single thread. Using AsyncResult from multiple threads has undefined semantics. The safest way to communicate between threads is using an event loop async watcher. - Those undefined semantics changed in recent gevent versions, making it more likely that an abused AsyncResult would misbehave in ways that could cause the program to hang. - Now, when AsyncResult detects a situation that would hang, it prints a warning to stderr. Note that this is best-effort, and hangs are still possible, especially under PyPy 7.3.3. - At the same time, AsyncResult is tuned to behave more like it did in older versions, meaning that the hang is once again much less likely. If you were getting lucky and using AsyncResult successfully across threads, this may restore your luck. In addition, cross-thread wakeups are faster. Note that the gevent hub now uses an extra file descriptor to implement this. - Similar changes apply to gevent.event.Event - Update to 20.12.1: * Features: - Make :class:`gevent.Greenlet` objects function as context managers. When the with suite finishes, execution doesn't continue until the greenlet is finished. This can be a simpler alternative to a :class:`gevent.pool.Group` when the lifetime of greenlets can be lexically scoped. * Bugfixes: - Make gevent's Semaphore objects properly handle native thread identifiers larger than can be stored in a C long on Python 3, instead of raising an OverflowError. - Rebase fix-no-return-in-nonvoid-function.patch- update to 20.12.0: * Make worker threads created by :class:`gevent.threadpool.ThreadPool` install the :func:`threading.setprofile` and :func:`threading.settrace` hooks while tasks are running. This provides visibility to profiling and tracing tools like yappi. * Incorrectly passing an exception *instance* instead of an exception * type* to `gevent.Greenlet.kill` or `gevent.killall` no longer prints an exception to stderr. * Make destroying a hub try harder to more forcibly stop loop processing when there are outstanding callbacks or IO operations scheduled. * Improve the ability to use monkey-patched locks, and `gevent.lock.BoundedSemaphore`, across threads, especially when the various threads might not have a gevent hub or any other active greenlets. In particular, this handles some cases that previously raised ``LoopExit`` or would hang. Note that this may not be reliable on PyPy on Windows; such an environment is not currently recommended. * Make error reporting when a greenlet suffers a `RecursionError` more reliable. * gevent.pywsgi: Avoid printing an extra traceback ("TypeError: not enough arguments for format string") to standard error on certain invalid client requests. * Add support for PyPy2 7.3.3. * Python 2: Make ``gevent.subprocess.Popen.stdin`` objects have a ``write`` method that guarantees to write the entire argument in binary, unbuffered mode. This may require multiple trips around the event loop, but more closely matches the behaviour of the Python 2 standard library (and gevent prior to 1.5). The number of bytes written is still returned (instead of ``None``). See :issue:`1711`. * Make `gevent.pywsgi` stop trying to enforce the rules for reading chunked input or ``Content-Length`` terminated input when the connection is being upgraded, for example to a websocket connection. Likewise, if the protocol was switched by returning a ``101`` status, stop trying to automatically chunk the responses. * Remove the ``__dict__`` attribute from `gevent.socket.socket` objects. The standard library socket do not have a ``__dict__``.- mock dependency was actually not needed at all- Disable more tests failing for Python 3.6 - Don't bother with python2 tests- Update to version 20.9.0 (2020-09-22) + Features * The embedded libev is now asked to detect the availability of clock_gettime and use the realtime and/or monotonic clocks, if they are available. * On Linux, this can reduce the number of system calls libev makes. Originally provided by Josh Snyder. See :issue:`issue1648`. + Bugfixes * On CPython, depend on greenlet >= 0.4.17. This version is binary incompatible with earlier releases on CPython 3.7 and later. * On Python 3.7 and above, the module gevent.contextvars is no longer monkey-patched into the standard library. contextvars are now both greenlet and asyncio task local. See :issue:`1656`. See :issue:`issue1674`. * The DummyThread objects created automatically by certain operations when the standard library threading module is monkey-patched now match the naming convention the standard library uses ("Dummy-12345"). Previously (since gevent 1.2a2) they used "DummyThread-12345". See :issue:`1659`. * Fix compatibility with dnspython 2. * Caution! * This currently means that it can be imported. But it cannot yet be used. gevent has a pinned dependency on dnspython < 2 for now. * See :issue:`1661`. - Update to version 20.6.2 (2020-06-16) + Features * It is now possible to build and use the embedded libuv on a Cygwin platform. * Note that Cygwin is not an officially supported platform of upstream libuv and is not tested by gevent, so the actual working status is unknown, and this may bitrot in future releases. * Thanks to berkakinci for the patch. See :issue:`issue1645`. + Bugfixes * Relax the version constraint for psutil on PyPy. * Previously it was pinned to 5.6.3 for PyPy2, except for on Windows, where it was excluded. It is now treated the same as CPython again. See :issue:`issue1643`. - Update to version 20.6.1 (2020-06-10) + Features * gevent's CI is now tested on Ubuntu 18.04 (Bionic), an upgrade from 16.04 (Xenial). See :issue:`1623`. + Bugfixes * On Python 2, the dnspython resolver can be used without having selectors2 installed. Previously, an ImportError would be raised. See :issue:`issue1641`. * Python 3 gevent.ssl.SSLSocket objects no longer attempt to catch ConnectionResetError and treat it the same as an SSLError with SSL_ERROR_EOF (typically by suppressing it). * This was a difference from the way the standard library behaved (which is to raise the exception). It was added to gevent during early testing of OpenSSL 1.1 and TLS 1.3. See :issue:`1637`. - Update to version 20.6.0 (2020-06-06) + Features * Add gevent.selectors containing GeventSelector. This selector implementation uses gevent details to attempt to reduce overhead when polling many file descriptors, only some of which become ready at any given time. * This is monkey-patched as selectors.DefaultSelector by default. * This is available on Python 2 if the selectors2 backport is installed. (This backport is installed automatically using the recommended extra.) When monkey-patching, selectors is made available as an alias to this module. See :issue:`1532`. * Depend on greenlet >= 0.4.16. This is required for CPython 3.9 and 3.10a0. See :issue:`1627`. * Add support for Python 3.9. * No binary wheels are available yet, however. See :issue:`1628`. + Bugfixes * gevent.socket.create_connection and gevent.socket.socket.connect no longer ignore IPv6 scope IDs. * Any IP address (IPv4 or IPv6) is no longer subject to an extra call to getaddrinfo. Depending on the resolver in use, this is likely to change the number and order of greenlet switches. (On Windows, in particular test cases when there are no other greenlets running, it has been observed to lead to LoopExit in scenarios that didn't produce that before.) See :issue:`1634`. - Update to version 20.5.2 (2020-05-28) + Bugfixes * Forking a process that had use the threadpool to run tasks that created their own hub would fail to clean up the threadpool by raising greenlet.error. See :issue:`1631`. - Update to version 20.5.1 (2020-05-26) + Features * Waiters on Event and Semaphore objects that call wait() or acquire(), respectively, that find the Event already set, or the Semaphore available, no longer "cut in line" and run before any previously scheduled greenlets. They now run in the order in which they arrived, just as waiters that had to block in those methods do. See :issue:`1520`. * Update tested PyPy version from 7.3.0 to 7.3.1 on Linux. See :issue:`1569`. * Make zope.interface, zope.event and (by extension) setuptools required dependencies. The events install extra now does nothing and will be removed in 2021. See :issue:`1619`. * Update bundled libuv from 1.36.0 to 1.38.0. See :issue:`1621`. * Update bundled c-ares from 1.16.0 to 1.16.1. * On macOS, stop trying to adjust c-ares headers to make them universal. See :issue:`1624`. + Bugfixes * Make gevent locks that are monkey-patched usually work across native threads as well as across greenlets within a single thread. Locks that are only used in a single thread do not take a performance hit. While cross-thread locking is relatively expensive, and not a recommended programming pattern, it can happen unwittingly, for example when using the threadpool and logging. * Before, cross-thread lock uses might succeed, or, if the lock was contended, raise greenlet.error. Now, in the contended case, if the lock has been acquired by the main thread at least once, it should correctly block in any thread, cooperating with the event loop of both threads. In certain (hopefully rare) cases, it might be possible for contended case to raise LoopExit when previously it would have raised greenlet.error; if these cases are a practical concern, please open an issue. * Also, the underlying Semaphore always behaves in an atomic fashion (as if the GIL was not released) when PURE_PYTHON is set. Previously, it only correctly did so on PyPy. See :issue:`issue1437`. * Rename gevent's C accelerator extension modules using a prefix to avoid clashing with other C extensions. See :issue:`1480`. * Using gevent.wait on an Event more than once, when that Event is already set, could previously raise an AssertionError. * As part of this, exceptions raised in the main greenlet will now include a more complete traceback from the failing greenlet. See :issue:`1540`. * Avoid closing the same Python libuv watcher IO object twice. Under some circumstances (only seen on Windows), that could lead to program crashes. See :issue:`1587`. * gevent can now be built using Cython 3.0a5 and newer. The PyPI distribution uses this version. * The libev extension was incompatible with this. As part of this, certain internal, undocumented names have been changed. * (Technically, gevent can be built with Cython 3.0a2 and above. However, up through 3.0a4 compiling with Cython 3 results in gevent's test for memory leaks failing. See this Cython issue.) See :issue:`1599`. * Destroying a hub after joining it didn't necessarily clean up all resources associated with the hub, especially if the hub had been created in a secondary thread that was exiting. The hub and its parent greenlet could be kept alive. * Now, destroying a hub drops the reference to the hub and ensures it cannot be switched to again. (Though using a new blocking API call may still create a new hub.) * Joining a hub also cleans up some (small) memory resources that might have stuck around for longer before as well. See :issue:`1601`. * Fix some potential crashes under libuv when using gevent.signal_handler. The crashes were seen running the test suite and were non-deterministic. See :issue:`1606`. - Update to version 20.5.0 (2020-05-01) + Features * Update bundled c-ares to version 1.16.0. Changes. See :issue:`1588`. * Update all the bundled config.guess and config.sub scripts. See :issue:`1589`. * Update bundled libuv from 1.34.0 to 1.36.0. See :issue:`1597`. + Bugfixes * Use ares_getaddrinfo instead of a manual lookup. * This requires c-ares 1.16.0. * Note that this may change the results, in particular their order. * As part of this, certain parts of the c-ares extension were adapted to use modern Cython idioms. * A few minor errors and discrepancies were fixed as well, such as gethostbyaddr('localhost') working on Python 3 and failing on Python 2. The DNSpython resolver now raises the expected TypeError in more cases instead of an AttributeError. See :issue:`1012`. * The c-ares and DNSPython resolvers now raise exceptions much more consistently with the standard resolver. Types and errnos are substantially more likely to match what the standard library produces. * Depending on the system and configuration, results may not match exactly, at least with DNSPython. There are still some rare cases where the system resolver can raise herror but DNSPython will raise gaierror or vice versa. There doesn't seem to be a deterministic way to account for this. On PyPy, getnameinfo can produce results when CPython raises socket.error, and gevent's DNSPython resolver also raises socket.error. * In addition, several other small discrepancies were addressed, including handling of localhost and broadcast host names. * Note * This has been tested on Linux (CentOS and Ubuntu), macOS, and Windows. It hasn't been tested on other platforms, so results are unknown for them. The c-ares support, in particular, is using some additional socket functions and defines. Please let the maintainers know if this introduces issues. * See :issue:`1459`. - Update to version 20.04.0 (2020-04-22) + Features * Let CI (Travis and Appveyor) build and upload release wheels for Windows, macOS and manylinux. As part of this, (a subset of) gevent's tests can run if the standard library's test.support module has been stripped. See :issue:`1555`. * Update tested PyPy version from 7.2.0 on Windows to 7.3.1. See :issue:`1569`. + Bugfixes * Fix a spurious warning about watchers and resource leaks on libuv on Windows. Reported by Stéphane Rainville. See :issue:`1564`. * Make monkey-patching properly remove select.epoll and select.kqueue. Reported by Kirill Smelkov. See :issue:`1570`. * Make it possible to monkey-patch :mod:`contextvars` before Python 3.7 if a non-standard backport that uses the same name as the standard library does is installed. Previously this would raise an error. Reported by Simon Davy. See :issue:`1572`. * Fix destroying the libuv default loop and then using the default loop again. See :issue:`1580`. * libuv loops that have watched children can now exit. Previously, the SIGCHLD watcher kept the loop alive even if there were no longer any watched children. See :issue:`1581`. + Deprecations and Removals * PyPy no longer uses the Python allocation functions for libuv and libev allocations. See :issue:`1569`. - Use the system libev by default - Remove fix-tests.patch - Remove use-libev-cffi.patch - Greatly reduce the list of non functional tests - Add fix-no-return-in-nonvoid-function.patch, applied for 15.1 and below in order to not fail the build - Add missing runtime dependencies: python-zope.event and python-zope.interface- Use bundled libev library to overcome the current incompatibility with libev > 4.25. gh#gevent/gevent#1501- Upgrade to 1.5a3: - The file objects (FileObjectPosix, FileObjectThread) now consistently text and binary modes. If neither 'b' nor 't' is given in the mode, they will read and write native strings. If 't' is given, they will always work with unicode strings, and 'b' will always work with byte strings. (FileObjectPosix already worked this way.) See :issue:`1441`. - The file objects accept encoding, errors and newline arguments. On Python 2, these are only used if 't' is in the mode. - The default mode for FileObjectPosix changed from rb to simply r, for consistency with the other file objects and the standard open and io.open functions. - Fix FileObjectPosix improperly being used from multiple greenlets. Previously this was hidden by forcing buffering, which raised RuntimeError. - Fix using monkey-patched threading.Lock and threading.RLock objects as spin locks by making them call sleep(0) if they failed to acquire the lock in a non-blocking call. This lets other callbacks run to release the lock, simulating preemptive threading. Using spin locks is not recommended, but may have been done in code written for threads, especially on Python 3. See :issue:`1464`. - Fix Semaphore (and monkey-patched threading locks) to be fair. This eliminates the rare potential for starvation of greenlets. As part of this change, the low-level method rawlink of Semaphore, Event, and AsyncResult now always remove the link object when calling it, so unlink can sometimes be optimized out. See :issue:`1487`. - Make gevent.pywsgi support Connection: keep-alive in HTTP/1.0. Based on :pr:`1331` by tanchuhan. - Fix a potential crash using gevent.idle() when using libuv. See :issue:`1489`. - Fix some potential crashes using libuv async watchers. - Make ThreadPool consistently raise InvalidThreadUseError when spawn is called from a thread different than the thread that created the threadpool. This has never been allowed, but was inconsistently enforced. On gevent 1.3 and before, this would always raise "greenlet error: invalid thread switch," or LoopExit. On gevent 1.4, it could raise LoopExit, depending on the number of tasks, but still, calling it from a different thread was likely to corrupt libev or libuv internals. - Remove some undocumented, deprecated functions from the threadpool module. - libuv: Fix a perceived slowness spawning many greenlets at the same time without yielding to the event loop while having no active IO watchers or timers. If the time spent launching greenlets exceeded the switch interval and there were no other active watchers, then the default IO poll time of about .3s would elapse between spawning batches. This could theoretically apply for any non-switching callbacks. This can be produced in synthetic benchmarks and other special circumstances, but real applications are unlikely to be affected. See :issue:`1493`. - Fix using the threadpool inside a script or module run with python -m gevent.monkey. Previously it would use greenlets instead of native threads. See :issue:`1484`. - Fix potential crashes in the FFI backends if a watcher was closed and stopped in the middle of a callback from the event loop and then raised an exception. This could happen if the hub's handle_error function was poorly customized, for example. See :issue:`1482` - Make gevent.killall stop greenlets from running that hadn't been run yet. This make it consistent with Greenlet.kill(). See :issue:`1473` reported by kochelmonster. - Make gevent.spawn_raw set the loop attribute on returned greenlets. This lets them work with more gevent APIs, notably gevent.killall(). They already had dictionaries, but this may make them slightly larger, depending on platform (on CPython 2.7 through 3.6 there is no apparent difference for one attribute but on CPython 3.7 and 3.8 dictionaries are initially empty and only allocate space once an attribute is added; they're still smaller than on earlier versions though). - Add support for CPython 3.8.0. (Windows wheels are not yet available.) - Add an --module option to gevent.monkey allowing to run a Python module rather than a script. See :pr:`1440`. - Improve the way joining the main thread works on Python 3. - Implement SSLSocket.verify_client_post_handshake() when available. - Fix tests when TLS1.3 is supported. - Disable Nagle's algorithm in the backdoor server. This can improve interactive response time. - Test on Python 3.7.4. There are important SSL test fixes. - Python version updates: gevent is now tested with CPython 2.7.16, 3.5.6, 3.6.8, and 3.7.2. It is also tested with PyPy2 7.1 and PyPy 3.6 7.1 (PyPy 7.0 and 7.1 were not capable of running SSL tests on Travis CI). - Support for Python 3.4 has been removed, as that version is no longer supported uptstream. - gevent binary wheels are now manylinux2010 and include libuv support. pip 19 is needed to install them. See :issue:`1346`. - gevent is now compiled with Cython 0.29.6 and cffi 1.12.2. - gevent sources include a pyproject.toml file, specifying the build requirements and enabling build isolation. pip 18 or above is needed to take advantage of this. See :issue:`1180`. - libev-cffi: Let the compiler fill in the definition of nlink_t for st_nlink in struct stat, instead of trying to guess it ourself. Reported in :issue:`1372` by Andreas Schwab. - Remove the Makefile. Its most useful commands, make clean and make distclean, can now be accomplished in a cross-platform way using python setup.py clean and python setup.py clean -a, respectively. The remainder of the Makefile contained Travis CI commands that have been moved to .travis.yml. - Deprecate the EMBED and LIBEV_EMBED, etc, build-time environment variables. Instead, use GEVENTSETUP_EMBED and GEVENTSETUP_EMBED_LIBEV. See :issue:`1402`. - The CFFI backends now respect the embed build-time setting. This allows building the libuv backend without embedding libuv (except on Windows). - Support test resources. This allows disabling tests that use the network. See :ref:`limiting-test-resource-usage` for more. - Python 3.7 subprocess: Copy a STARTUPINFO passed as a parameter. Contributed by AndCycle in :pr:`1352`. - subprocess: WIFSTOPPED and SIGCHLD are now handled for determining Popen.returncode. See https://bugs.python.org/issue29335 - subprocess: No longer close redirected FDs if they are in pass_fds. This is a bugfix from Python 3.7 applied to all versions gevent runs on. - Fix certain operations on a Greenlet in an invalid state (with an invalid parent) to raise a TypeError sooner rather than an AttributeError later. This is also slightly faster on CPython with Cython. Inspired by :issue:`1363` as reported by Carson Ip. This means that some extreme corner cases that might have passed by replacing a Greenlet's parent with something that's not a gevent hub now no longer will. - Fix: The spawning_stack for Greenlets on CPython should now have correct line numbers in more cases. See :pr:`1379`. - The result of gevent.ssl.SSLSocket.makefile() can be used as a context manager on Python 2. - Python 2: If the backport of the _thread_ module from futures has already been imported at monkey-patch time, also patch this module to be consistent. The pkg_resources package imports this, and pkg_resources is often imported early on Python 2 for namespace packages, so if futures is installed this will likely be the case. - Python 2: Avoid a memory leak when an io.BufferedWriter is wrapped around a socket. Reported by Damien Tournoud in :issue:`1318`. - Avoid unbounded memory usage when creating very deep spawn trees. Reported in :issue:`1371` by dmrlawson. - Win: Make examples/process.py do something useful. See :pr:`1378` by Robert Iannucci. - Spawning greenlets can be up to 10% faster. See :pr:`1379`. - Removed remove-testCongestion.patch which was subsumed in the upstream tarball.- Switch off type_https test as it fails with new Python 2.7.16 - Clean up the SPEC file.- Skip the SSL tests as they just only triggers false positives with hope upstream sorts it out someday- Switch to pkgconfig requirements as c-ares was renamed between SLE12 and SLE15- Add patches to fix building the package: * remove-testCongestion.patch to remove a test that is failing due to a timeout * fix-tests.patch to fix some tests - ssl.OP_NO_COMPRESSION is set by default by ssl. - thread_ident can be represented as a negative hex number now, so replace the negative sign with the regex too, and not just the number. * use-libev-cffi.patch, libev-cext seems to be broken on i586, so use libev-cffi by default (also, the gevent documentation mentions that upstream will make libev-cffi the default soon).- Make sure to skip tests that need network access- Version update to 1.4.0: * generate with cython 0.29 * Refactored the gevent test runner and test suite to make them more reusable. In particular, the tests are now run with python -m gevent.tests. See issue #1293. * Formatting run info no longer includes gevent.local.local objects that have no value in the greenlet. See issue #1275. * Fixed negative length in pywsgi’s Input read functions for non chunked body. Reported in issue #1274 by tzickel. * Fix opening files in text mode in CPython 2 on Windows by patching libuv. See issue #1282 reported by wiggin15. * gevent now depends on greenlet 0.4.14 or above. * gevent.local.local subclasses correctly supports @staticmethod functions. Reported by Brendan Powers in issue #1266. - Do NOT bundle c-ares and libev- Switch the condition logic to match the previous changelog- Use "Requires:" instead of "Recommends:" on older Red Hat platforms- Update to 1.3.5 * Update the bundled libuv from 1.20.1 to 1.22.0. * Test Python 3.7 on Appveyor. Fix the handling of Popen's ``close_fds`` argument on 3.7. * Update Python versions tested on Travis, including PyPy to 6.0. See :issue:`1195`. * :mod:`gevent.queue` imports ``_PySimpleQueue`` instead of ``SimpleQueue`` so that it doesn't block the event loop. :func:`gevent.monkey.patch_all` makes this same substitution in :mod:`queue`. This fixes issues with :class:`concurrent.futures.ThreadPoolExecutor` as well. Reported in :issue:`1248` by wwqgtxx and :issue:`1251` by pyld. * :meth:`gevent.socket.socket.connect` doesn't pass the port (service) to :func:`socket.getaddrinfo` when it resolves an ``AF_INET`` or ``AF_INET6`` address. (The standard library doesn't either.) This fixes an issue on Solaris. Reported in :issue:`1252` by wiggin15. * :meth:`gevent.socket.socket.connect` works with more address families, notably AF_TIPC, AF_NETLINK, AF_BLUETOOTH, AF_ALG and AF_VSOCK. - Update to 1.3.4 * Be more careful about issuing ``MonkeyPatchWarning`` for ssl imports. Now, we only issue it if we detect the one specific condition that is known to lead to RecursionError. This may produce false negatives, but should reduce or eliminate false positives. * Based on measurements and discussion in :issue:`1233`, adjust the way :mod:`gevent.pywsgi` generates HTTP chunks. This is intended to reduce network overhead, especially for smaller chunk sizes. * Additional slight performance improvements in :mod:`gevent.pywsgi`. See :pr:`1241`.- Update to 1.3.3 * :func:`gevent.sleep` updates the loop's notion of the current time before sleeping so that sleep duration corresponds more closely to elapsed (wall clock) time. :class:`gevent.Timeout` does the same. Reported by champax and FoP in :issue:`1227`. * Fix an ``UnboundLocalError`` in SSL servers when wrapping a socket throws an error. Reported in :issue:`1236` by kochelmonster. - Update to 1.3.2 * Allow weak refeneces to :class:`gevent.queue.Queue`. Reported in :issue:`1217` by githrdw. - Update to 1.3.1 * Allow weak references to :class:`gevent.event.Event`. Reported in :issue:`1211` by Matias Guijarro. * Fix embedded uses of :func:`gevent.Greenlet.spawn`, especially under uwsgi. Reported in :issue:`1212` by Kunal Gangakhedkar. * Fix :func:`gevent.os.nb_write` and :func:`gevent.os.nb_read` not always closing the IO event they opened in the event of an exception. This would be a problem especially for libuv. - Update to 1.3.0 + Dependencies * Cython 0.28.2 is now used to build gevent from a source checkout. * The bundled libuv is now 1.19.2, up from 1.18.0. * On Windows, CFFI is now a dependency so that the libuv backend really can be used by default. * Cython 0.28b1 or later is now required to build gevent from a source checkout (Cython is *not* required to build a source distribution from PyPI). * Update c-ares to 1.14.0. See :issue:`1105`. * The bundled libuv is now 1.20.1, up from 1.19.2. See :issue:`1177`. * gevent now **requires** the patched version of libuv it is distributed with. Building gevent with a non-embedded libuv, while not previously supported, is not possible now. See :issue:`1126`. * gevent is now built and tested with Cython 0.27. This is required for Python 3.7 support. * Update c-ares to 1.13.0. See :issue:`990`. + Platform Support * Travis CI tests on Python 3.7.0b3. * Windows now defaults to the libuv backend if CFFI is installed. See :issue:`1163`. * Python 3.7 passes the automated memory leak checks. See :issue:`1197`. * Python 3.7.0b4 is now the tested and supported version of Python 3.7. PyPy 6.0 has been tested, although CI continues to use 5.10. * Travis CI tests on Python 3.7.0b2 and PyPy 2.7 5.10.0 and PyPy 3.5 5.10.1. * Add initial support for Python 3.7a3. It has the same level of support as Python 3.6. > Using unreleased Cython 0.28 and greenlet 0.4.13; requires Python 3.7a3. > The ``async`` functions and classes have been renamed to ``async_`` due to ``async`` becoming a keyword in Python 3.7. Aliases are still in place for older versions. See :issue:`1047`. * gevent is now tested on Python 3.6.4. This includes the following fixes and changes: > Errors raised from :mod:`gevent.subprocess` will have a ``filename`` attribute set. > The :class:`threading.Timer` class is now monkey-patched and can be joined. Previously on Python 3.4 and above, joining a ``Timer`` would hang the process. > :meth:`gevent.ssl.SSLSocket.unwrap` behaves more like the standard library, including returning a SSLSocket and allowing certain timeout-related SSL errors to propagate. The added standard library tests ``test_ftplib.py`` now passes. > :class:`gevent.subprocess.Popen` accepts a "path-like object" for the *cwd* parameter on all platforms. Previously this only worked on POSIX platforms under Python 3.6. Now it also works on Windows under Python 3.6 (as expected) and is backported to all previous versions. * Linux CI now tests on PyPy3 3.5-5.9.0, updated from PyPy3 3.5-5.7.1. See :issue:`1001`. PyPy2 has been updated to 5.9.0 from 5.7.1, Python 2.7 has been updated to 2.7.14 from 2.7.13, Python 3.4 is updated to 3.4.7 from 3.4.5, Python 3.5 is now 3.5.4 from 3.5.3, and Python 3.6 is now 3.6.4 from 3.6.0. * Drop support for Python 3.3. The documentation has only claimed support for 3.4+ since gevent 1.2 was released, and only 3.4+ has been tested. This merely removes the supporting Trove classifier and remaining test code. See :issue:`997`. * PyPy is now known to run on Windows using the libuv backend, with caveats. See the section on libuv for more information. * Due to security concerns, official support for Python 2.7.8 and earlier (without a modern SSL implementation) has been dropped. These versions are no longer tested with gevent, but gevent can still be installed on them. Supporting code will be removed in the next major version of gevent. See :issue:`1073`. * `gevent.subprocess.Popen` uses ``/proc/self/fd`` (on Linux) or ``/dev/fd`` (on BSD, including macOS) to find the file descriptors to close when ``close_fds`` is true. This matches an optimization added to Python 3 (and backports it to Python 2.7), making process spawning up to 9 times faster. Also, on Python 3, since Python 3.3 is no longer supported, we can also optimize the case where ``close_fds`` is false (not the default), making process spawning up to 38 times faster. Initially reported in :issue:`1172` by Ofer Koren. + Bug Fixes * :class:`gevent.local.local` subclasses that mix-in ABCs can be instantiated. Reported in :issue:`1201` by Bob Jordan. * Fix a bug detecting whether we can use the memory monitoring features when psutil is not installed. * On Python 2, when monkey-patching `threading.Event`, also monkey-patch the underlying class, ``threading._Event``. Some code may be type-checking for that. See :issue:`1136`. * Fix libuv io watchers polling for events that only stopped watchers are interested in, reducing CPU usage. Reported in :issue:`1144` by wwqgtxx. * Fix calling ``shutdown`` on a closed socket. It was raising ``AttributeError``, now it once again raises the correct ``socket.error``. Reported in :issue:`1089` by André Cimander. * Fix an interpreter crash that could happen if two or more ``loop`` objects referenced the default event loop and one of them was destroyed and then the other one destroyed or (in the libev C extension implementation only) deallocated (garbage collected). See :issue:`1098`. * Fix a race condition in libuv child callbacks. See :issue:`1104`. * If a single greenlet created and destroyed many :class:`gevent.local.local` objects without ever exiting, there would be a leak of the function objects intended to clean up the locals after the greenlet exited. Introduce a weak reference to avoid that. Reported in :issue:`981` by Heungsub Lee. * pywsgi also catches and ignores by default :const:`errno.WSAECONNABORTED` on Windows. Initial patch in :pr:`999` by Jan van Valburg. * :meth:`gevent.subprocess.Popen.communicate` returns the correct type of str (not bytes) in universal newline mode under Python 3, or when an encoding has been specified. Initial patch in :pr:`939` by William Grzybowski. * :meth:`gevent.subprocess.Popen.communicate` (and in general, accessing ``Popen.stdout`` and ``Popen.stderr``) returns the correct type of str (bytes) in universal newline mode under Python 2. Previously it always returned unicode strings. Reported in :issue:`1039` by Michal Petrucha. * :class:`gevent.fileobject.FileObjectPosix` returns native strings in universal newline mode on Python 2. This is consistent with what :class:`.FileObjectThread` does. See :issue:`1039`. * ``socket.send()`` now catches ``EPROTOTYPE`` on macOS to handle a race condition during shutdown. Fixed in :pr:`1035` by Jay Oster. * :func:`gevent.socket.create_connection` now properly cleans up open sockets if connecting or binding raises a :exc:`BaseException` like :exc:`KeyboardInterrupt`, :exc:`greenlet.GreenletExit` or :exc:`gevent.timeout.Timeout`. Reported in :issue:`1044` by kochelmonster. + Enhancements * Add additional optimizations for spawning greenlets, making it faster than 1.3a2. * Use strongly typed watcher callbacks in the libuv CFFI extensions. This prevents dozens of compiler warnings. * When gevent prints a timestamp as part of an error message, it is now in UTC format as specified by RFC3339. * Threadpool threads that exit now always destroy their hub (if one was created). This prevents some forms of resource leaks (notably visible as blocking functions reported by the new monitoring abilities). * Hub objects now include the value of their ``name`` attribute in their repr. * Pools for greenlets and threads have lower overhead, especially for ``map``. See :pr:`1153`. * The undocumented, internal implementation classes ``IMap`` and ``IMapUnordered`` classes are now compiled with Cython, further reducing the overhead of ``[Thread]Pool.imap``. * The classes `gevent.event.Event` and `gevent.event.AsyncResult` are compiled with Cython for improved performance, as is the ``gevent.queue`` module and ``gevent.hub.Waiter`` and certain time-sensitive parts of the hub itself. Please report any compatibility issues. * ``python -m gevent.monkey