ETH Price: $2,567.38 (-1.93%)

Transaction Decoder

Block:
17943334 at Aug-18-2023 06:02:59 PM +UTC
Transaction Fee:
0.05859496088366928 ETH $150.44
Gas Used:
1,836,222 Gas / 31.91060824 Gwei

Emitted Events:

384 TransparentUpgradeableProxy.0x5e3c1311ea442664e8b1611bfabef659120ea7a0a2cfc0667700bebc69cbffe1( 0x5e3c1311ea442664e8b1611bfabef659120ea7a0a2cfc0667700bebc69cbffe1, 0x00000000000000000000000000000000000000000000000000000000000fc552, 0x74dcb49c40f1fa2df2ee95c6b74c38fd12724cfb34b4dcd20747ff0ca2dadee0, 0000000000000000000000001c479675ad559dc151f6ec7ed3fbf8cee79582b6, 000000000000000000000000000000000000000000000000000000000000000d, 000000000000000000000000c1b634853cb333d3ad8663715b08f41a3aec47cc, 7a0e4543b2a0079f4a5449c655396eb0e92ba2b5cd77684d736d9f13de2df247, 000000000000000000000000000000000000000000000000000000076b0a4cf0, 0000000000000000000000000000000000000000000000000000000064dfb253 )
385 TransparentUpgradeableProxy.0xff64905f73a67fb594e0f940a8075a860db489ad991e032f48c81123eb52d60b( 0xff64905f73a67fb594e0f940a8075a860db489ad991e032f48c81123eb52d60b, 0x00000000000000000000000000000000000000000000000000000000000fc552, 0000000000000000000000000000000000000000000000000000000000000020, 0000000000000000000000000000000000000000000000000000000000000094, 0000000000000000000000000000000000000000000000000000000064dfb253, c1b634853cb333d3ad8663715b08f41a3aec47ccbad9035aafcae00a1c30609a, 13d0ed0f0f7f27b554fbd9edfa59d61fcf5f681b000000000000000000000000, 000000000000000000000000000000000004d721000000000000000000000000, 000000000000000000000000000000076b0a4cf0000000000000000000000000 )
386 TransparentUpgradeableProxy.0x7394f4a19a13c7b92b5bb71033245305946ef78452f7b4986ac1390b5df4ebd7( 0x7394f4a19a13c7b92b5bb71033245305946ef78452f7b4986ac1390b5df4ebd7, 0x000000000000000000000000000000000000000000000000000000000004d721, 0xa1a44381050673c744024bd8f278163a5e75d73b5edef704305ff52a7c9ef178, 0x61c136a4e803375064171c2a78596e2cc42bba0c9629e8397b24a198ae1e526a, fb3a15745828bbcd787921e3c9fddd2c30b1926a51b43c8e1f7f8c54aa15bf85, 00000000000000000000000000000000000000000000000000000000000fc546, 0000000000000000000000000000000000000000000000000000000064de60d3, 0000000000000000000000000000000000000000000000000000000064dfc063, 000000000000000000000000000000000000000000000000000000000111b4a6, 000000000000000000000000000000000000000000000000000000000111cb32, 0000000000000000000000000000000000000000000000000000000000000000 )
387 GasRefunder.RefundedGasCosts( refundee=[Sender] 0xc1b634853cb333d3ad8663715b08f41a3aec47cc, contractAddress=[Receiver] TransparentUpgradeableProxy, success=True, gas=1873814, gasPrice=31910608240, amountPaid=58578780329098540 )

Account State Difference:

  Address   Before After State Difference Code
(builder0x69)
1.944865326130624556 Eth1.944957137230624556 Eth0.0000918111
0x8315177a...4DBd7ed3a
(Arbitrum: Bridge)
0xC1b63485...A3Aec47cc
(Arbitrum: Batch Submitter)
5.00147388904958218 Eth
Nonce: 266003
5.00145770849501144 Eth
Nonce: 266004
0.00001618055457074
0xe64a54E2...80E2E4eb5 97.93356852718334052 Eth97.87498974685424198 Eth0.05857878032909854

Execution Trace

TransparentUpgradeableProxy.8f111f3c( )
  • SequencerInbox.addSequencerL2BatchFromOrigin( sequenceNumber=317217, data=0x005BFAFB34D994E15EAE9300C67EFFABAB7A712861C7BE10B7E334413ECF8E0CE47148127A0394FF22C13644B31DFA0258AA4DDD6A70A0C7B81C1034D0080D9EC102A61BB1192A144223742888143BDDFC15869F3803DB46FE9693D7E2F9399B7DEF7D8B13428B5430AD0A17AAD49DBB065A4F55728452155A4FDD433535F7703A8073DBCF8908E99028C193922D554AB4429F4809A91E482999C225254A42502424AA06E09C4B9097F4603F400F7CC87F7FE52937EBAA3A2D3FF7C02E761D9638669D88BF803238100982486127862A2AA9FEFF5E55DBE2830242E6984AA94C6D3A729ACEAC01999F90627C2A05348F66C0680A539440560A5CF83F292862B10D51694D4A93344DB49C22A77E5C3C881408458D3E87A05228A63395B2A648A995A495910F69A71514C54381445A91A2A40BE4FF461AA234D9C0572492504AE33980CA391FE0145A9AA232858E3776562A539433BBD9CF6AB6B35B38337D2759D3BCD86976B3D9684A5F0DFF4FDD3300BAD6B16F94FBE29BA54031F3C4E2799E7B153C14C4792D0F30164C807242E16045BAFD2FEAD8D86D5EE24950920DDE0A584F815A6DBD958505E6042460E7250FB0F03697A8767BFF9307DE7889271858FE7FAFD3EE1BA595F948FBCD994F6D1667C986D84A0CB688294DD426813AA0027D0BFC03B859BD1F4A572CA79AF3CC6A47CB4A3BD48552413550208205DACECD1790CB236C571AD0A2601110C251DAF6EE2A80030000F413377D1011684CE5C870624BBC347913D895A31CE73023F47F7DBFB934F6A7EEBBA1A8EC2D4CDD5404221CA21C05AA00BDED600B6D64BE9592F26ECC59B296D5E5ACD6FFAE167E72A2D115D6B02E50E7D7EB664E8D0C064C075A928E5259F56F5A330B174DCE975F1897420E9965C50100C081A13068C101CFB092FA304808220203FB133202D548C9386D26340D95D37A28435054A86BEE9FE53B33377771447B17ECC717041A30E776DC5357814D17B0C16E5E6C333AC05241F87879E1F199655E672510900EA8B75BBDF846D73D2EA1648E2203ECFABEF97AE654B18B8CB3BC5FF03D77215D00232319E72582FDC6484A15562D24E6934258EA4E89D22C351B2A9ABFF9B17FA5AFAC5223342590B22BFF66CA98BC7CBD7CEC81B2FBAE110C5D3291C9ECFC1D1F5218E259EAB0321306D85EBA83C211FC7C17FDB99D4A2801EFE7D15BD42480BD9A6C86E26233827BB6ECE1C4F07F754E90591F0DC03EA70A1AFEBBABDD5126A03A13BFAD48DC9F84C20FB0BFE80D258DE429CE77B98C9D400A8EAF41865710808D307F30660950B1BBA2F26EF7615E67935074C006D802A7BC27392CDE81969F54418EF137513187940AC03ED3310852CA56E576FBDC6F0D2777B5FADBFC5807B019A746229D7063FFE5293E384D2CBF7523FBF42E1960F71EBAA580D1D17F6DDFA8632FE2665DF5B4897107D8E54B8251CB7774B47E75E8B53EC974E0D84A0E7E05D877F27E7A356A25D799F9C95DD20EA8D019D917A3003BE601243E7FEB4446D9B6146CCC3A306F4DC9B904D8BF331373AFDEEFB259E8DB8062F512D5EDF0651180EDF0D9CD7CDD49A219B126C1BD545E36B563BDF80B602FFDD8D9EAC030B77229B37D67E2BEFCB229BC0B01B0E5DE717004DB248B7F7D33D36CD3F687905C79F223C03E15F11269EE481AC6C2932F31B274C28BF026F501B6CD959EA810627D8ED46998722F1BBB7BD790550BC05ED0FC33BCA9FDDAD148A4085357E0CB527214112DC0BE37409B38207F0533193BC131D1FC79A47F003B07839613BC1858FF6DC5F1A90A2F6C0E13986973A4B9DD21713425AC96F51D976F875D86B9ABB35465EFD6B860252318836CA0A50C4EE87FF7EE0F8E88FDA8C21D8BAC90DC43A86FE807A364CCEF68552595ADC49582403BC412154A2F31A7C610BFEF9FE69B28C497A152A23E42BED93459512BBA0689119E30F40C5B57F24DFB81F0D1CF5A6AA76A0E3A756BF755B0B30F46CFF3F4224053770F4ECE8F42B8188EEA7CCAB31490808A58C409AE57BFFD10FBEF82ED779CDB57C55904DF722AF2B8EE43BD7AD6F3A815665505D8ECCD77F357050EA1E46108559029745F896B0A62A5EFCDA6A7D4F98390330E1C1BBEF0FCF9ACBCCF9F0FE2D4E17C22C9468A683CED66C8DAA020575E5D3BEF4670ACF0AFD4105CFB3BC8DB3FA01D812A968C35E64FFF8B4A444A11A5178C2D759E685A30AAD233E423EA12087DC30464F5804E23E20115065EE51EC8EE3CFA941142C68DB8FEAC65A1F1235925D52822F04FC24B65D5F138220D6C5DAE06C16760EFFBEDAD2A7BCF9A7332B39B0851E07981207B60234921CE71BD7964C7EB18BE0AB2C0332D5D9E21A2DC7EB693361824AC181FE0B987A0164696ED9B24E7E577BDA7B30847AAD0B9A8DA91B434CE70CF59F7E18D75ADCA523118B8A447972B22D9C5DA618400E794EAC9D2CB5041D33A649A9E8E5C4599546EA9B78494A4C155C161145A3915FAEA20371E09C2B56556982BF4695D78D637CC743EF938C83F68710329439E1F6016B580CA6BE1937316250262CA5012AEE79F3665141A8A5CB6F00CE6AFF8618B00B5C7FF971F71C5C96842C1FC25AC90F72DE25C43300C4EF60D8D05FE76A65348B729D65ACA95AE9A222E2CF8D3083B09E80BA929354E13705C04FF748311D392BAEA46EE331573DB32E7D610F21B9F771E0BC416BAC626348D99B4680264C1A78E8210F0F00E87D0427F1919F6DE9F7AF566966D7BD202A481385DC8A09841936815787130BDDF33C2AB87C818CBFC26427AD49266B246B4EF7C0A785ECB153396A1149842C2E887FEDA7433A1F96A512887DD47D864DA4AC0226513391D6E6317DA06269AB9C4E84F391247FAE348F3829C58B622C4E4D0CB083AFD3B0DE3DABFD752A40F2C027CC7EB5C18748D86ACDDC6E977D1A15306511F652920DC01DCFAB9D3007EC893C618DEF16111939ADF940E51F2B65352B369EC01380D3796745CC42A3CB0C40A8A48A7DEAB43D9B12E1CF5867C4E12D907EF36DB6A7E5FC3DBFC57137E5E2EEB0125FF85B8572E9B7BDC3D16ADE7FF48E4892EB8E1AFD09829A4E27AEE07E749C64A14E478494CD9FFF6036FD06E141CC303AEAB4DEDF3BC8C3927A2FFB9DAECDC418A314B654DC9988E4DD590BFBFB7E2F1AA092D731197908AB172551F504C7579BD01FDAA9D8A4AFE66649CB298C85C24B980647FD8BA0827B29582E15F34E2D50187B42152CFA632A365254E5B67A258615782D8BE137FD0E306909D74793EDC6619E8FECC26EA213017E09E4E53A495E1B80C10FCE4FAD1C764FF6311B76BD73D3CC42808762CD6198EB73F0B48C4E09108574E5A104DE63D17ADB6626BABCD347BCD50390A1235D4CE09941E14A0217FBDB6E4E2640AF88F8A85AC4CD7611E13313352E9B0EDE229DA043A3D76B321735B81350DB8B00CBF1B150527C2B208B75119D00877CC9360069DABE5CC7F9108E885506F4531302AC4C6761635FA99A9F2CC0D8500148105ABEAE26F25F2EF185B86D8BA237E71D8C4F6D6FCCAF5A3C1621ED1DE8DB8C6E3739A07DDDB0609C595E63C078F9141428D2984623A23D4BFFBA340EC2F360E99AD05F31023010BDAFEAB64D8D6F47A9073D9B0531681F853E4DFF3ED9D18C7F5B590CA43AD81DB216548ACAE00D9A6F89EA09CC931DE67EE3CAFFF04CAFC12735C24416EA91F9DB735D1EA29894EC740D25DA0540511890C6905D38682790F2E0B201239A982D963D65A472C431E69D37BF89A520F601CCFFADD3A698BBAA6912C125BB32289549088DA6462408A87B0B629852532B4880F22D7A1C585130023B751F7775E75753C17D94C6FD91D491CE4CBFC993540EAA78B0751A77F44F01A418EA98D9073D4D32B5E2FF69928C44DEEFE224E8A8C32320A24423DA7340C3258397AA5945C51483194412379C300ED56F2296E7FCACCC583148C2B726FF1E95A05C6AA580CC93441227438869CE4038528674F418EBFB22F23D0B14D8DFF537442C76A1E457AAB4DA9BAB31F70CA13BF1AA028E5C7DF52E57B10707B0B630BFFFFF68ECC2F8334511EA526DFB599246C3518012368A434D7D0BE2FBE5393ADAC2D76084E0CF532DA895354F157F9BE470FB64C676ABE29E22A2773943AE0BDC72A61F34DCBC7EEA55410C788BC58D3C9079A29F67F5B08C6FD99B8402669B97E46FC3C2526E086FC6464FE759B9FAD99BDE9DCC7CA231C4A377C13B1BDC4E0D9E25286EBE895E29270A608ABEFE8E1A6CDA27F99E43BCCAEF29BC9F52A7F3AC2F6FE8C2FCA2250211D6BFA62A064E9A93E9B8B9B3C4784F5645BA4D9BBBB7E23FF9FC150E23A5211B2FA73F9A98C327D9C43D9815C94990146E7B5058E64DC76DF5028F8E61A9F74255FB4A9EC386605122074855A8FC1FB89844EAFB358C4278E067F52DB8610663BC3126A1777F773A7FDB7057A963161AC3E5CC478D7F0BB6AF450D260C607045EA978574EE3741CB152B602E861850A30EBD8DC2BD6AFA18C10C58F20FEA8F285BFC6DC5A35EE28F105B059ABB72EA5D948D88CC25B1924C099C640D340E6F6659A7576E68B04B74B586E83AAB11BD6A5486034FEDFC10AD86942A6362609D6DE12C9FC84CFA5087DE1EA9AA2175E11CF5EB0C88878624E1AED387D1B1916D258AB4A6DE4039CD5F44595B8C284F108AFFFCBF1052A943514C98D7CD8B5A412E8F0A1EEC7AA0ABEE2D3128A3943C219952B27E7FFBCFFF18327F485F0D1B2C8AB4B41321826731B030BA53A1E7EB6600761AAC5E8927491C5D0E2B65B4C8313BBFC2F2C25EFC480AC993B23640A9DF9E6ED48465A90B8EAADEC9806906CF50B85641331D624CBFF37E9F0C381C2D2C626337A104A4144D2488A12D4A14E7E376ABC3D5523E155A0DFF010D0536D8E3B061B923BE554B6A50743B35BCE4657E4CC2FADCB4EEFC7C547631B0A5DD672150BAE260EA9B54C4E5DB8398B819FE63522E069438DA81E012247AF5B01F02159FF0C469E852B1A3C2403BE0A3D9071A1BA78762C5FADFFCD0E3125CEB54C0E7708E5C84A300DEB323735D8243E822AC8CE78E4A77D72374296E99B759AC73CF09A6D86E038FAB94DDFA42F8F445A2BCCFB7D5048B01491AD350D20B79EB13D2121C36DC666BD7C48FFC4B13F1D09C5D64BF243458A90505B0CF8AFF8C0D7AFB6FD08F603B200E913C70D64D4486BC5AE48EE30BD5C2A7961A3B4D298EFBB02B9B2D4FC234073B07F15D5A4195E395FF9AE88C386A8588E83124D415649137E2FA3A6ED6680BA5D2C20909985547A85ED7B49024E12EDC7B04858631B6FC8697E62A1F0CDC842F0B68CDEF834D55397C4B917A22CA699F5A93D05709A21818B576F377CEE86A045506745EAD6E518F1166EB6AAE38DC2D25154514111E5F6616C7D2B4722B0CFCB7F71A08AEDD796DF4BC88D7A5BCDA2139CCBBE21F2BEBED11C3723B2DE2A623A91DE73BDD3CA9015AAB12E6B39877359769881A864599339F32870FF2CACB07D3D22459F8E136F226584AA929B0BE91373A875277D45F49EC7595F23886180A33652D5BFA07AD34134AFA3966EA969AF41246D8861DB911F33F7A46F6CBAD4DDBE47793C1002A1D34D52B6C545430D5B665D53DDAEC79AD8263741FE388990040049264A4DDEA8618DA7E0771E906A90FB6790F60E2887D24CC0DDF993003F050733B13984D916EAECC5BD016F9D8B23534C7A6096AFE5AE0761DFC820E683BD730DF4A692841FEBF6ACD0989443F0D9153D88F8818CB9E426618C3252E215DD888B48504A7E43EDCEDFA8728516F727512B700E24954E44EA62157D34096D827E2C0926C3CCC4F1E3983E065969662DB5401682F05D49F808854DB4C8FC8D9740DC475373861A09FDC8F195873950DDE31C6AE02D90039826A1D0E2493045646B344FC12A71CE73065F04AC14122CBADC120A39F476CAC5093995BB72D01D29ADC8DE1EE86083D96FB9836D2515149BA3136A41A675ED00791C2BA8BA3D1F0FBAA716A641E5963F88266ACE374C810681B849F29C915EC528C27F0C1064C95DBF4641648C45A3A36F3A7BB22768049B4A01C96468F554736F148B25B2E2CB0ADD6862F0159242EAE66631055393320D3D05FD5B955D186023782991949D5DF3EF6666AF9CAC9514B827526BA78C6C45C475E7C153C093DF959FED29F03D1A963A7EF00E0FB9836BF89EBAF6DE3CE2CCD8B5AF1787BAA9B0EE42A2B80EC963D66CFA9FB32AF93653EF7A5BA74988914DD4129139C4697A482C72E328266F73F559A15B4489CF31EF8AAE11D11575AECB667989D906A7E817A144E786F0AE31D0CF6E68E7004079F05F3127C9205828A61496F87C1A79917A60D2B0FAF4ECFEE8B588F4D5F830EC9B7408BC0F039B84A26AC3EEDF1E34C44998D2CA378C4C8B40F27C007E2837D606916E0F3973C091E9452FF6C6F65619DDA245D65C689E20445E4F88ECE074B4C9CF62A52E0D6ED7F491559AAE912ABDFA7CD51DA35D4F7F0B9215E3998E3C7D3650646BBEFF4D2FF6C49C5AB3485CC3A28385D243260C899271887ED525855E5ACCC2B0F8B79BE33A9A8C88EC9CFC174383923736EE39F8A97E0FD139B5C6DB40D0C2AC18C7B99D21BAB44285376C7B13C27A121F1191DA31B67FEF7C282CA783E2DD2BA3054C53CCA1088ACC9E3202112381B9D2C516AF4472B484ECC723D2C52FD2EF54F84FDDFC6F0602FE17987480752008021433C220B2DBD2A9C4515601F55E01F7348CDB4302BDC94B4B8C567D943FFF9969344D1DCEF0E4F722E5EB7088ABC888C4F76DF6BAF61E984F41CBA7C84803A15B3F6B88D5E76A09FB047EF43450D00A1C0D51DCF2344775A2F86D2DDE969EECFD0DBA378210477406D8BC71B3905E407B07DBD75F5757C4B344C410BAE0953577015E8F6D2361417A72D488AE32440EE41399DA7B5EA1DF13328E48739C12B9E11444A51E811FB8F8AAF93FCF9816E6919F2731B2D57945B9884C320AA58133C15777D1AA156BE81B672315F1252259BFD6D2910F2D796368C476662C34D224AA791F089749B2D9B6A78F6903D54FC92856EE82C93F0541443FAC4C7CC0B4D5E8FF56C04C6289443F312CD203B2378A1459CE1F33FF7A764F3099B2BD83EC955489C4ED0251EB56B90468573A3B5329A14966C59B4891052706EE4E27D362BA971DC2AFE811B4C8955D3B841ADB5A72F9FACDE7B2863C3499536224405D2B1AB90E845EBAC83CC16D483DA0432528E077CB1C2640D0C20D33F48D2E5BE62D1FF013C152BEC56683F9115F0EA9C2E577A3AC4F4E4D7142E92754B02E66626405A3F6D9731E4FF7455BE6904E0BEC4C54BBA6194160DE4B65FA56BEC8B1837050A81C35CC638D5647626CA7843D4F6113C6C21DFAE670856947F9C56C11C895F2E499FE14BE0326FD0FC6F97238FDBB010F84179E317FFBA7AEA007C3596932446CC37370670A71AC4C76C4B16AD9805EB17C729CC930F089570843FC5DB41EDFE9591E8EEF9F58AD170E8E4BBF5506D1E46C2C0BB6C5B00E2C82CFEAB4BE921DFCDEB2A09508EA5F653578D3718F2F2D6E7571288834E0EF467655CFD1D2458052BC7A1FA23A6ED950B46B897388C1D89D78572B0F1A4E2355552DD7CF3F78228A7F886426904F4697B9DF9901395A424196804A64010DB1D57E9241A0FFC14A55E6596FE9CF1A0B6883AA41E49F23C884067703A0FEA84DDB43C37F3A272AA923F32CFC74EA5D6D1836DE1AED06175CC222588942C8A74D06E187F53CA3DC8FE828C8030913F91DD013C187520C322EDEF54B0D5AA3EAECFE5541B5A0D7405E9BC8B8F768C485E0C028CDF4B8436498B0F1E011CCCBC2A815864BCD38BAF627B31AADDE1130DA71746C6E5A584842BC68A7E7DDE897367C4BB94878BAC4603AD3FE4672290AF38E910D62B43E579F7934024EA362709F5577039AAB380990518F9BB776BD46CE71F00B4C15F944D4F895D4CA3F0DAAFA18EEC61134CFDFACE25A1FE390A8E4CCA62B36EA22AB744484212888F03EF631654AF854CC688B76AB04CD1D9F0CCF0265DCECF59447AF494BF0428D0A26DDF80E1195DDF961A3C48C92978A80B738DDCBCD71FEF887C0E650D4C419DDD8F7153F0C59A0FC98273E501C20501D4F2106E8BDEC0F3D4299A6160D166478F63088098565A27A1B3FB2A3988C581156BE1F6F9D730DF25FF5DD9674E94F0563AA49D65F35E5FF7FDC2EB191CF9148658C738F372EDD58F4283A1B192538272E646BB38447880AC3656D375B58FAC41AAED4C39712F9515885B4E82DB79792FAD296F0E3D2F41E3182452A24A2C739D13A68C5B4444BB397923A961BB2FE2302BD4060BBE142116FC3F7FCF54773FEDCA82A2252593CD2DB67AB08C32F3CBE50F52714ACCFE9FE1F42AFFBB3E898C67AD19593411B6B89E302FBDFEB18F91ED89537BF0E5880BE9EE4B8F42DC79358C9444656133E531D2593B6BC386DC0D6C824DA3896829C901F1F918B210C387F4109581A6178831C0D4BF37C24184A463F13642EBDF1A48C569FBEE5BB16078F10712F66E9FAC17FA025CAD8C775DAD986BA359D2A469A3A7FCA2BBFDA72612098469BDBD22C76247473908AAC585A44C1FF44EDC3709347A183D62F167DD9489EAED5FADF3D6860E123B6C0934851A775507B1BC2B825301C80CB781B5052C268953AB4E0FA2AF68C481943A27527F49CAC313D506DAABAC9535F4C39228B9E9711D769D822C262F88941FBE382ECF830C7084560424A7DC23BE73CC7EE9F786EBE979056F135A408A1A62D3FFBF48620FF1530BCF1C09FCE30F589483323204520B935A859F5B3BB76EF607C23D7432304A1D2093E23B33BD56FFBF2FD314833B17E315308F867B5859887CE9021D37C7BFBB85827A93D3450649CE4BAE02EE4817FC234CE924970A368CB58490DB18A4B29C2FA2931E51C8CF325428C96C93E194B43A88CA132486526C67AC314C6D9A5E25595FA42A310D41CFCE224D49AF9AAC2856B8DD9FC0CE254EB0104A9F890F7445BD9D1331995FB08BC37CB7701A704C9CC95F6D6CC1D12B36F9B395E1AD0F3C5CAAD434344A4AC8844FFF7E20329B95B0B51359AC0F7350390F49BEEA19D0CC62F275C673C692CB4760B0CD14D44A7C735D22799774D116A15522801C222EE2A261FD1C24D072F7413D3D4E1594090D32C15DC4D3C4E4408B04B471EE8778693379BC6E77EAF42296140DB119FF53DAD70BF9303E7D2009EC933A057A1FC8C022232D9EDCAEF36D7D2BFBB714F2FE93BCFEDC6238C9948FBABFC82ADF4F1933D6AF60C6A8E6E5F513CDDB291A94AB8E3148F99180EA50846E987208D2D4BFE75A43AC6B8EA533DE1CC3EBB93D96406C4B44924B10BB13FB9D16BE842E197980BD93BB2DF12F22E09B640BA76FF85789B7B4B55394A94E5F8B0E46E9FF2BF1C39F1E1CF5F8A92E598CDE960F7B00A01194605FA37C8A93C6253E7964D8FA45DB9ADA76C9834B4D6500A4959C724DD9D4CE83539A5F7894AEF89603F4EF880446D73A77F2CDB608BA9687263BAB394FFB9D33389341C39206238328F9FBE926A97FDF3E1BEA73A1F1DF1F631362C201FABE6525F1A4653C148C6A56330412AF2C8B834022706E4F1BFDD2C3857248316661808D5DA30B3673C3715D686ACCC398E6295FFE18722BAF810F4BC416378E6DA87056F12B6EF2353D5EF9137966F8971D1AD795CBED1C73141497FD33839E75A6A84F4175340FAA495EDFDC3CF5E3462D60C50DC9E11B927CB2E56403ADB7785F8083849762000EBE9B1407C674E95CF5E7127A8A6C910ED4AB52553F30D50C9DF702D86BDB9585EBE3ADEF90F4F7DB863E8B626E9767B2B284D67CF8F06ED3ED860600A710B136E28278A80A13DCCF8DA09DE889C70E227C07317198790A1D1BD2DABEA3C1C2DC427314008057FDC0A441DB3EAA54C11CE5040B1E3511732F199B2FE7737139D34DE6745724C6216A638BC71C96D0CDA9F0248153BD780E3A1C4493FD4A2C781A9BF3BA4487B3A7292A20B0E792E6D4C28C78481C011E4BE2C6F668B9821DC8510B926E42D31EBC4E83B1A99B4CC88E720CF62F75D0CA1EDB68BAEC8F8B5552B871CF91EC28825C1ED31AD1D22207DB960D60E45DD86ED2C910911ED72C1C66BE0BA28BC176B323F19B1CAC1412F448407EE0CF5143F0C037D2BC988A359B1EF078C9B10CC7EA8E4FE019A547D86C7CCEED323DAF315174664FD48C5D6F5EC19D8E3357552D6C1B2364DBB8389DC8AE52075C4FBA795DA6A99A962F9A1980B070C21A236E589744D2D8B99A22CAB8114E0FA010B769F48B437F6F77D2FD66A38E9704016336D772AF36D1C72C2A024F62797B531F13D8FB855DC585F46A6D01249DC8378E48614AAABB9F80D61F83F224580C2508688D3B00C4F97CCCE17341D73FB019DFE4B1A60B5220D8E05566E363512D527B9FCFF1FE80EFDF27E5590A9A10F93BAD41E9F9CD2A305BEBF94BDBB992E59C87ECEF1FA2407353DC68A950CCF10E89FCE28742099A794E698102467B63B601B4D02913DA783CC878494D328DE53317F2AFBAD39D6415361F8EDCC3E2337C43406ABDE5CD2A49BA70A83D33AD1B17EF08248B3787C952DBDD15BE11233E4BB7404D9B3BA3936328BDCCAFD66BBD3FD1AA905ABA14DB618233FE08038B6D669D5507FB8D316C727F5C25ADDBE19651D23A5C649E3E0FE51706A95B0556CA354322C052CAC88CC595E181F071E9E4C32FC82B8C3442991C1BD0172EA8781C34F707F724B313105E1614F63B06D1383E41B556C0B66F199C8984157E05AB2E4960D945321DB291E8E42A415365F44723C955DCFF2FF92C88691FD64DEF858F4638CA17A82A64B5A188F48967FC4088ED6504CE662CDE37D7B481967D248EA743C4C01426DA895BDE5A23B1A1211E38F8DFB44B7F279038F5891182CBF304812C0B6F4E9B8EBC67890F27C3321EEC7BA0AA743517C5FBC3057B90D81EF9712BB3FC8EE2908EA8072E448DAFCC66C7BA56B324C34672022943883A3245BE3FCAF221179F382D007AEA2BE1D49ECB8A290C1BFD9E85AC22E132034C4B961729645F0E5E7E7086B318F24EB486FD02B84561C18EF7990936BCF893F6BB44D30F809E6B53C28FDBB4262B088D0DBF3A4AC04FD4DDBE37D044E08C6A4A1B2B368041732A8398CE11D60A1CF232550F00D2B26C6648BE05860E8912F60D9CDD3D7B8726643CCE5B381F52395A6612E2CC2C5C1129A41A7D124585462A60BCF48C01029417F3120ED9BAA1BC83CEE78A670C80382186EA6B9B1A7DA6C1DF0DD48EC82F2A5238189AC2257DEB5967F95913D1479CF0E0ABB1FCACB7010F790372A074C3A1FF93249EF85C0F96DACACC0CAA03044F0A3B4D3AA5109E8EC5A8E52C34CE511BF903C12F2870C862F8E7DD107C11F8CD4B2E1DFD9C56C4420A200DF9B65032D044A4F8015E1DC8E6485F358218D949F39B7997264290F5F811B381E122A728D9EC720D7624934D57839FDBF361BD1E0625060046A7D3508AC03D4695F4CD0F06314F2393AFE7A4914D5912E52B0E221CDA343ECABFB89B35B74EBBBD875D0508454BE26B4952C417CCD34C13173CD5CAB4163DB6B2294EA0D8ABF9C2107B43822C8DDB4F1D281CF237448C78EC95B66BDAF09EFF04628E5DF53E91E26F40F242345B4AC1944B2817FD9E7948D4A3639C4DDE00F52E6434C270D5A00E580F27706BA0DE6C40E9B810A312A2FFECA9B42C88924271FC1A41ED3CCB50DD5453ECB788EA645224E4DF9734A7F9653BB894C816D88430654656DE290FAF3B6F02A9A9D0A3406BAAD1E123A9719DC86D9FAFFDB39DC80DE6DD8BFC848231BB12775FDF3BD8FB4B8A6072B7DAD34FFBE0ABE488550012385C08D937DCE6F8D0A783FE61AB2AC1A444472D429F049CE4B5EA55C282FC93A8A3FE73A5A1AF9DBC93D5673433ACCB8F845390953BDF18059548CF0F344E5EC68923C4ABE41AE2C12BE1963C0E4B1224C4BB0F36257C4C8EA67EBE4245DD9AC94656933085B032EE8C0B3B777C8024BC59F0C1A42318C7C7C249866ADB9FF31FE31740125E90823BED0240E3E4780BA1BAAFDB7EE638B33ED03380119FED74AF88542BCC74A159A5B42EC5E265429CE5F1430F6D00F9610CE8BE88BB34E4B116DCE8CEFA7E1848FF5967A5884B2C5518FA15488EC7518CEAA1B0627E676633317B1B6928301E78446326AC19DC0C23FF7DC2FFD2141E0D17A392E1848399818CBF8031FF342ABB4BBB291A478B1556956897A0571A9161C000C889E5334843CE0907EA14FE51FEADCB9FE149673E0E180411322C6FB5D1CB79F5A3C45DC77EAE1947171BB001B32E4C2CB43AACFFCECC8E1B48C62CC1DC28D90C6B707298BB1653817D40692DA4F07848EDB5937A6307B20BD3F35F9211B27ECFAA279DEFE5A2E3DD8FA548BE49FF7F5B9470A496FF00BBAC7657B0389E4F0E42206A8D3A06EF3D4F405282C96854CF2707786566E8886D93198A5FFCD7929DF9492C170CAEFE4D65605E2169F69F93E617BB98031A7D4B0A3DA8D015B9584F0257FC80672BE920861C7EB89D47F3374E1B10F2012A029BEACDE6D8CD03D7FFCF5CA73DA719785FC901DC1FB1FBFA9461C5DE91539F835733C9B3B68474470A4704D6C9EE88F6AC22174AD8A3FF9937210259891394B4BEFF1F54B320D7F4B82D996FC11647B29D0112750010EE6BD4DA2CEC6CB3F2188FAB0D12E904F921E7384DC505ACB7D4777785B84D02CC6E38842D699437DC8E8A19551979319FC3B953625138C87400E8DB31744CE2A626CBB8A54BE6DFD34BA5DB2E02263353D329503FFD5A9515F2D42A310FFB3277DD047EA649B32A874F155DE86851C9EEEABB81DE841F122BF83CEE6CDDA2527574B6C2170C6FD4B9FC5C75541D62197D53EB81A966C49102BA542D6C8E65D80A648E371683C4C13C592841E271C38E2263F4F478634448C1126BCE03079E5F33A4220D6784D49BB1EB280BCBC7BE9E968A198E135DA420D24E64246C77831460C18A3572CE3D3B74C3456288848861F97DE9208918261F4DCE17CA473D5F5F4A412D0C7FE6DE7B53AB401AA6B3178D8DE0798242A5D5CEF15B4A36730418B2832EBF6BB4624A55782AD37FEA4958ADA1E82C8645F4B9BA415AF20E340FCE09E653C8FE2370AC3978FA481B3D919A89A2F097A07085926F3C14ECE938422FCFAF90CB60E8CD3CD2606F9B45AE7D6E40FDABD08B9BA15EB737BE3D8F34EB9008E4F4865B7364B076286C566AFDD7A401B688F893D8C204B84F60B5E815044A8964F80F1FE7F5801879DA3BE4F5E62839F40C2CE94BEBE7BFEA75C8CDEDEE3E38BC04AFA116A21843D5094521EF20EE0F793D5C87107936C4C6952484F40D8F600463217DC624DA724ABF8444586D82FC24A75B7050FD742C84B4BF80AD5BAF3F4B011B8858869D04C14624DBD2CF30F6557707339BB90B9632160772A0421A6374BFC650DB22123C3474B6584ED08F6A151E9DE0C79E60D648FFBED506115CB4A4A189237CBF9D5A364622DEC7E1651362846E9E6D37C8FB8B57523BFA88D0ED4D2077A24847C1036824B9F211637C85412FF155D06375C68C5FD11BC6394910D113A177970B295EF5D37E4EA13BDB1BF8DF5BEC58D48F55F7AD88EF142F7FCEE39426EDD0659DC3E3B708452D4C903B979EFFA236D1992EE20E2479497891279B958C2EFC2A9425A2FD0DFD4995BD7F0CD50F44710EE8F0C27511FBA9E5C503EA6A18AC017785789118F0360267FA428711006AC3EF1399C2A68B4B90AD2EF4AD43AD6BDD242DC9C09EB6DF0EAF9D42E20855471DF7FAAC45809879C4FFD1351091335A1AD474730F5C66161E8EB8B2E464B4F634F2AE9ED77C78311D037409783E4CE7B2DA0A8C7635DBDC52B806B0CE956D5778BBA590F4CF3D6DC2B429187C138DD44406E5D5CB55F90954BDBD356408B618DEAF6CD2B73107A33ECE36D10895D3192EB8E93FE42B87423340244E92B17600537C974A66883A762CE9AAB9EBE1910BDD5BFD261DC5ED890B51FB6AA237B3032AB820108E25D327C69AA52FFD77BB6BE18CFBD765DF905399297BA9C83B0F66B66258A60BDC9F3449D74DE1750A2801CFE7FC74C9A6C78546E8E6954EAD429EC2B8F9B81AC5530553BA71E138EF01D7DCBACAD2FD137624144AECBADA985E84EFA78A8A6FA6581C365B98B9A8121D35763593CD2F26F0EB4D9FCF5C9ECE006C051DE21995585B3F65AAA59C6B123F0FF4A93E90374833810CF7B44FDDD90145547D2E967B3B5C052E501CE15E4CFA3E32E8C291E8B2E971DAA5E1528936D7A2E036403AAAC148E7CB860CC09613E939379B9E8565313C2FCA818C74E655F1266A9A458E7A84B3AAE17FC91CD7B39054F4D7CE4372669C6BC4A9076E385EE66C8DE0CD3425BC6A8FFCAE154E4C9E692348D11F970489F8177AE92BAA4CE7C5B033AABB254BE5CE20D3144E771B17834F15014ABCD071A758BF3C402025119A9470C0E5E3D9539403782B73F46285AC2598FBC4EE0A869759A22C226E60F22BCADAAEB0AD2E57E319171B954934F5FED43F338F0717BDB690644FCFA1F88577388B4DA33259E0D1D14DB70D33D19E9626B1BA93795C377A4CB803ADBF2DBFCEFC15D8BFC36D51839762255DD642A6F043C46053BDDECE95685F80B837CFA72CD61ED92D1BB5C699AE5B71022167D0512837483D431CE6279EB09D516ACA44DAE5E889183F54316270F5B1BFC64F73669DE114B5C686F7F0B15E42243A4234F17781387442B15F7D82794A85AF23AFE22AF265A274A2F979AEB67F7977FE7B9765EA142DA90DC1374061158E2D0D29843293D4F56B000FF6966A4EF20CCB449984A3CF4B33ECEE3D8255DCF37CC3E728BFEFBB506DB526CEB7736F5C47F110BE6390E0F19A8F22DF9CC5AC4A410F871FB8B03B954182C72080945D435F29A23B1564AA5D06F27A0FFA6018526106DCDE6BB66C38989CBB5768FD378427277BD810449FCD8ED2D1E903CC2F6278BA068EAD315E7046C053958DFC80B51FD4C435D028BE1EE54040237E26303923F12B4FE2A1733BD89792695C5E4121983E8668508C181DB162F2F7B9422CD3F89367913CAE7403DE47AAFA9A6F26BC5792818E704AC1A1FADEF9C992532C76419F62027E8F5FF491C5DAD23DFF23F68F111E4FD100BCAC98DDBB84465890A662A5849159BDF2FD2D0AB4B99C5F0D9C8A0709742E7D54643392867178970481F59606EFC605F9698F5A668E5D2F20A6A42BE936FCF12FCDB3BE6B46786C2756258A3017BF740C274E6E69846CCADFF5418731FF0179B5DC29E0A22235FCFB97746A6AD562AF6EDD827B9C91A34BFB491FD65080B44CA45FCD2F355F8D95A575E387CAA1048B015AC314CDBB381AA81C83DAFF35F1FB727A100F26107CAE00541346BFAE184A5948E03D69F7E9651A4BB2AAE886B93598CAA21094CD8BA29D4623FD811E2DE4DD675882B6365DF949E73F22B18EE9859AB4616040E863028C84BC74E5930416B3DC0D24BA0DF2015093E2D22CD98AF9BCCB87A5255D2E308CDC9739159ED5E1E75DC06C38479EA58C7C78A78484B08B748859DA79EC92E11C000429255443F5B356BF0A274C41921DF8AC94230FAF7C75DEC4AFFD2260543085130F8D40C0ED639948407CE8683B57525E4D44E6DC547CE0A5E38FF4837C746D1C2294621EDFC0F1423D184C332FB3937EB4F7D9383B585D389E1E2DE8AF5B3D34A37005788EF007EBF261D000D0EA89A090344B5C207014646BEB5743A1B123F8CE9BF25CD12BB436218B2B723509034ED9316762562DE01A5452ED23929D11684A886178FA8889F8B8701B7FB86D1962B460F48B12F9739D92BB53FF8BB6B28EA7D38DCF530C0CD1E7297FEB4C53CAFCD41DD8B47B959219C5AE60E6539A9111C111CA8819B1BFFBCED77EE294E741D93EA415E8FD4438909524E793267238A0FA24095593AB9AB27688178A02598FE119C57D2707D9ADC697CC232267F06E54487ACD0A8C3AA58A958F3F0850EBD847D4018C3AAE4C32121AF7B8551D839A4F3EC42D591E0B39D679E6DE42B7C4813C2191FFC04778E0221B28000E986ADF0770DA318AA3709F0AEB0CABE2EAEBAB9B3211A4C891DB26B65C40362A18EFB32FA1034CF55455485BA9B00D42D01CC7A8C567DA2CAA6EBAB7F169D93FF05796994A84C0C80C18EFD66F26BD8F2F1BF7DA3E553AE8794CEF6E96D83DE6694BCEC0B1671F688EBA3FEC3447EF0B71CD0E928D0AC165133C1104263963A9237C5CF21490829CB2085850B0262CB7A39642818483E4439800300003E07FE81B214665A18100E458507C881C0F7EF4AC70AE0DC3EA2C255D8A6DD605608354DEC22594F0EEE02336761F2030150B75E8099CBF3847AD41C1F0C0B2B1459BFCE1F84B7F5B7EC02B028245E8AE9B4E85C40764F45423A1FECB58A3B0B21F048A5182F4F0A10212AB4955EA5B622C4921100C9EF03AE9C7903335569D98348D35FDE1F32EFA7504ABBB4FB2C83AA4D1E605A04E0DDAAD7FDD6F58079BEA7EA746C63EF0A51C1949A05F44D393D234080098C0C2DCD45569D27977355FEDD49006A64467A0514C928C04654E443CA27003CAA6DD6D2796B24B33475FFC5ABE96E030E241EE6A6C0B6B1D157ECA223E8CA6097F4DD64EFCCB9976C7E005476B7BF3CBE64A80887F8C7AF2AE88232662A9251219FACCABBB90E9F2002EF491A72374186EC6E85BADF0586EB4131D16721C2B225A99F46EEA74B6B62A32234234A89A2C896D305D43F39ACA43E1CA504151121F3B91270375485A7D5AD8BB86A1D9C99EEC9DCFA3944116485AD046A230A01400260885519E10DA181C1DF6E979988016194D81DF10A890003DA17472E31FBCCDDA3F370ED15FE0BC72B77735CF346799593E03059A1243482CC9DC72F5365FDD575DF30D1970CEB51487D238674997B668D14E922DAEEC28EFF3AC2F88585DAB555136A21976CBB10B1C4EF5DB50102B25DBB47EB199DF3FD8198B2E47754F42D7FDD95A64D1E602F186EC1C54FFF83045D19859B149E05E9FEEE1555967A25BBC8513A1C4F6216FCF37F1A9134F0BEEEC1173433C4CDD430686004EAE513C06D7DD798C63169ADEB4C4059515D255C461542D4C6E94C54832861CF52C407F82881967B6B440D7604BF669D480B4FC48CC066CC698E32B8EB3FB2E7ABB9E033DCB430CA6DCCC8387F8DBCC70745D10BD25CB3B0180D6C1DBFC2141F95EC6C71C5277C91EEF890DA31DF3A0F65DB512D4AEBA747B33068014D8695D4631DF2A1FCE17C72D9697DB6B24D253ABCD1C4D9E31EFEDF17DE54123E45878733886D8C80AD41A5C50AFFB4A772ADFB503C548D76C8388C1BEC81275C8D4513A16F131198374CAEBCEE4F14C4730FDFBC8300387A39ACF07931AC5B8DB5602F4CF0DB5B53D311AE26057C48A55C4B1A899108B065FA39D18A484E01E1E29EDBC5ABF361B968FC46F2AC17DBB82F9DEEE8B05A0994A24CCAA1DCDB742B57FF33ACB81ADCECB9D3EA294273E4BEB7B3F3B2975D2AA226CE0111AC803DECE222C7638E64CE08F06ED1C19D52CD91F67A984AE2D159DC743663F0CD5CD958BE2A574875F41BDC8D953000F92C4238D5400DE00432608CE71B4F04274089C7B041800104EC30A5474EEC58DACD46588E4F7A5022F34B26989267B896C8BC5E3A4C4652021EE49D944F34F038827F1FA26B6615DD0B5106F177BA67664DF4672432AC49F421805CD29180988F35F83CD07320786BAA0C9372CA42877D87D7F7C07ED2CC72534CA07BA4BB9DB43A7210A4B7A95BFDEE8D4A549DC9C2F28ACB726BD45933BD658BFB3E4A6E19FA7CD59DA86692B475BA07C535D718EDF476ADBD7D33B2EBBD7C19E1D85070B8840B6010D5094161686DEF325A1C9BC26EF7B1CCBBB267DBB5FFCF3EC4B6363DEF9A3C14188540DA6EEF8BA1E985349C048A65E9D94D0553B2E94FF4E5529EB59856F9E2819ECD2EB8F8823612F706FA7F67C74CD0979F25B40DACE93DFA65704CFE4F4DBF665D0797B3DEEF035558F351B0557E776AC100AFAD94FC8B80E492EF4DD20EEB0A50CE96AAA5022CEB8335DF903A6BA817A38E78944CB312BEEAD4848498764CBB1EBFC44740AF64FBF7B04CB0E56FFE21D24574B2EC2C87E36B919B5F6A3DD84C777FD052C0DFB66B0082679E86335B265F35F8FF5F1DF2255694AD97274A56C83F114CB27593C05EB18160E02BD33D148C2B0232D12B380CF6DF76BA8629EF6552F94A2088B1F5B0A1767646B9B01D603CC6616FDE3F6180EBB9FD5978FD1BFE75DA57E0A33114BC26F405D4258687A6941307EC890AB4D31A75B60399617FF27D7F0B1CDEBDAFCF183B257550EE5D5A75B909F3A7504AEC3E182588A4396B16EC3D290C42B93A1C3AAD703F0C559428DD4D59B1AE0970CAD044D224610472CA5D7D869338B85C1C1C506A98CC86DEB9128066C8928CF238542080311713D4B3DC56A0802663A0A42E4C325F71F6A3FBD8288708D5FC0D7ED1EEC1CE784F9F0A7048ED9CD6179BEAF24666F39F9406D2EDBFA7E2F0C8A8A5D3D1F9947D3075131E8DBFFDCC473C8B523611F5ED175435FC47817D409DC3A5E13CDB42E577D77490A70367D9769DA47156DD484DB57C687FC81047C683C2DE8082F756C8A56687466EF51D7423BB9C3196B78BFF9AD1C3418ABD8F005C5E17907CC701A405900082037D20C75D0CF314E0B132D584946FA6E8FD2FD763A805EA3251F1C50AB7D67A7CE978A6CE1F6253BA235A162630CB81B35DC1B2C573B161D94F3B67E5F837578F87D2F448730B56551D0666103AF9F464966F34E817C44B915A3E7F94864041626A3DDDD4F2C245E794192227BF36E150D4BAF8F091E363C917CEFE94B64A3495870DBC4581E57FF42F36AFD6067AC59D20E0AAF9F889CCDEAF14085D06E70EBF022B7E58F61C38BFC853383A323AEDF1BB05E594F135F5E630121879D5C4AB99B3289108852FD049DBA7C14CFFDF13829EBCC353EA905F66F43B110802533F40FBDFE9833D17575D6B15460CDBB3131E35B2A45855EEDD600ED573E6304624C86562201A7BDEF0E1E992D6E7626AE967EF0A2CE32A183FB25B7C97C6FC38563693FB34451C071F15FC4C42E727540D785268210DABE4759591DE209E441091205FB9F3E32F164B73141341E1FBBF714C48A174EAC5E0C29AEC3912D5820D28911807568B5B710C0E7A3D3B1E5B40193BF93C073585D03132B216B74B4B4AF118FAF978D29E415925CB982F8C74F037B0EF10080C877E5456514FE3D706CD9D47E871E2ADCD68AB458DC0A7DBD51DACFE677F020BA7A19DAA935DF78E7E6EC306299AB419BE37460437F3A7F453D47E8FF929C78112DB05D1D7A6DED7AD9C32BDA436A536E40348A7777FB43D47952362B4043673F8364E1F4543788C7F0AFEE63033F65EBFFA9468B75B9D49B9C966B6D2CF92EEA8EA5824357BC686EA5734E252CE186579B868A85F715CB9EFE10D893E900C4659DE9143A7E8FE419337D067BF188601BF83C3D7FE8F13CCE52D50A03837C50F7ADDDB6B7C66650CE1FD24B177950B930C62B96A27905C293ABAEC1B8866D12DEF40763A31336BE0475C1A3C67BF262A2B8C3F441988DA6258C8B80A6EE7FA66FF7606B0F5FCCCCEC283349360C2C841FBA23F21F7EAAABFB844F77DED962B85014096519707D225C9EAE96C9517C7BA27DBF645BF74659F6BB86B9251AA9FAC096630C13B338583CCAD44896142F0A09E62D3B11F29E59A5E495B9B81931FCEA2CE5CDB2358F542291F91A58984EA3BFBFC3D276E022AB0736B034788046E3F533BA867268D125FF7FC0D9785AFE986C9E335D866666E7A0FCB608B85520429E36D10464A9B522C52367CC289038D97C36D6DF6797048606E594B90358849780618040EEA770F2D6B423C317A2B81C7C74C978D95332296BB371C0E1D755923F83086C199C18A02256930DD0D06B89020C0B05A6BF6AF34327F19A7D7377F058BC76A211DCF20D840716B0F48DDD9ECC75E205F12A5D4F4D0EEEE9A2FBAA5898F2905681ACEBFB9F5125F36F3B3511DAB80580043BD30507FD391D940F0E04BF3D433F48F17A13A5CBA5ADE1E42C077363B1FF4D84AD16896EC9E57305144A7388C61790BECA065D92952E8F1AB078B94C232AEA3FE6059B10C034CF2EAB8F71B261D6DE69198895F82E02665E7F5CD84779D0FC8F3880B70A071D437AD961601D9B535CCBC83BE60C43437B70251E4CEDC025F418781583D8AD88139D9538CDB3C5018988EF449ED02756045F9CBCCFEEF5C5B979894CEFF17E77E7B5C01EEED8208959F0853C829D63F3E57EBBCAEBBE413C77B518F58E16D65D285191C04076A313A44443D3D47B75B191A663432EEAAC430A4FABD908A1322AE1374A3E690BC8697826E1FAE63CD74663BB5870A13FDDB4DFFF89B7EB5640B25F5E1EA62D044683AECF93C2F0433B1C20CF67F5327C4C00B243EF2FDED7723485B5E9C541617F1203175E292C0C5641412FA246E91C2FC2BD20CAE2C4F3CBFF7390ED0109C211666287A5ADB584EA0708F4B542E61BB44B4072B1154EFAF422F9439CD35EA6868D4B4D7F2CA4000FFBF5811B1152A09817F10B74B6196D1262F25B8743791A156FF3738F79B753422B1A1BDE6ECB78A465A55FAB49E0964D41D8B18CF12338325BB37109B6D5ABA70466B83A4314F3A82A412F8BF63FCDC9EE94657B24E97C0527DDF8FE1EF1EA1DE3C4786AF828DC3C1F4FFB5C6B7C17AB5F865FED5A0F81FA5417AE3FABF82A301BA70262E1720E2F692EBCBBA2E6EC949D0F70F1BF641290F52E0F6260121A2FA1B053B134E96B2BEFD40DE55B437D97A98A77260EBDCE87BCE266EF168AC563D64001DA6E1E94E9A7322598241DD3A9F01014529D8DA671E858E8CE6A6F8B3F6312814B74C12730F0603B3A60A2277A2A76D73C04D26FF849C71409CF27D0C637281E3163AFCC37550770172C4CB8083B6FD1B3C33A435559329BBA46EFF073CABCD36B89A3155BEE7D8B8762B3E51A692FB8F6161F0249B4EF2FD7FEE4B134DE44886352C50FFFED6895B97C5FB23FA59F02DF6AEF532F790EB21036549B428DFFEDC9E928E404917AF66730E4204E4415589D1DC0A086C08FCAC911FB47048A4F8BCD7242C1DF62F57AD84B8FD3975512D52280D9C945E7C5FADF0CAC2909AFE29F21B99BA7E8401DA31A7833429133C6E122153E4A5C2B8F91B077C2B32EBB18E444CC063C95DA781E90A948E74A953B817473AC0FD362138DDBA45529BEDBF6B25E2DC73C4C1C9445FA4C597048FB613F013DD86EDFFB1B2FFF3B04C4039FC6269F63221831335C1BE6DFDC95E7531C3A0E55B9920AC0AE273ED151FDFAC5073131CA837C09CDED1A54EC8759533674B91A91A2F2BE30CC0C9AFEDA54F7461A1BB4A24A437ED4B50D6DCF1EC86332F48F49F3BD02B0C9CDBBA23AE000D43CBD66FC329218F66DBCBF93C855AE265E37A26150C9AE1BE77F019E2F0ED19013FC041FDA75BAA41F0801D7CF92101BEC2E97906C03525F87ED3B93C2BDED74AFF476E9EDEE1FA87840FB8437733C2C9EB6019DF8C23C9EB749997132F18CCA5BF3CB6940DA31D47C559FF7AF19DF486615CBC1642ACA883C3D2FF0EF44188A6C3D196B6540A1C5E31D074F6BE38EC26D1D781FA1DF9797B399F1BA02EE6F93DADEE55BBF7FFC2F019D7FAFF0D24A3162ECA1B60F48514982D1627650345738448601FA3CD7A4348168BCB3FF9944859D823C27F21D486382FB4613A2267BDA08FDC40E43B6314BF3E846A790816B854C2310DE352467532E0FEEEA7DABE01912B4A3B51AC230ADA36882CF886EDA2C93F8574B581305E037B85ADE8249B61FAE8A927CD324CF4C82564D4868C832E50F1C201E4AF2F8CE9631567C4E88BBED0247869F263CB6CA6AF140E75E0357BC4B0FC27E60B4908AB282F6B3BBF0B3ED3DF24426AE0C930CA16B3203B8098476C3A8E0F01FC4B0332F7DB886FA4F82F384F8100182F58A243D0AD0593C18A7E5888660FFE0DDA61C561DB11FD8B8DB7E95EF03522EB86291A12C70F81B1CFD74DAB46B07A8E6E07A501B8180043C1DFBDC320946BC211752BDBC390C8251294A26245CEDD3F82E4401DA4ED5F5DB22294491739C6E58334B0057D62DCCD5A42214E1D5E74B5351C8734D4AD00D411E9DB05E4041D5B276AFED3331142EC0E796BDAEBE03B1AAE0C6BAB04F366C1CA6ED83B220C84F0433814A7967098000C604EC4C35AD603260CF6E20DF5582D1C63338F5CC7427026218190400184A0404C249141E18C5785E090B466DBDE9FBEBFD44A08EA4EDDC44DFA23C017ED05FABE8DB915D66B74AC227A8C543FF8C10052BC4B3BCEDCC002AE7B9CC6423A555943D3D79A3ABAEFC015E74454382D1D51441A45047708877CE8FCE8639E323891E6497E6907B42E8CC35B971DCBE96C7022BF1A6483682B51EE7346074C66D83BB39AA14361C89E03A8AAC20743CEC9C35D4501DEC3BAE7E85EA1A838D500A8C932C6869AF04205D8C72C3F892AC2A17140F349484861FA4F810BEB810BB7C08FF8B56DB7BC1F3635BF770707A55D14551566EAD3EE8232EFE01E1F6FFDB2DF44FEDD0D9260F2C5CC3737CBB143BB1FF797B81CAEF2E9B15D2012E0DF3762C46B188640BAB438080E41BAA80D02108EED23A44D8C081D4A740B2D02BF4EEC868BF27DF5E0D1A726BD3359B881CF04CE6983BE459526F26529EE276E2D46FDCCDDD3EEFC4B3A1F2BFEBA7BF5889A85F8AB228862D203997832B348A970EE3DBD5B791F1E311015C2E901CF78C376487F5586D60210E171F88D1622042FC571864233F29B86726DD5F57BC9F49ADB8CF85362FD081608CAF03F44AF7BE5D766B4E372E4F38A113DE5FE6EED31E0F7C6FDCDAE02E202CCD2082206BCB86DA1FDC15C57C63E582BDB5BBDEEC2B472745F6FCE28CAEEF4633F1E89755206AC6638683FB3F41F1623805F714F0F54105F668D941477DFD73AE11E094BE2BB05F90968E86B18D4FF7C65CA294F1BF162DC0EF8E5C7C47D65E2248DB06BB6E66400D8FF1A8BD5B004CD8869E7D61444B479EFEE472209A553052777FD0D77D541BB7E7284215A7A2258BCFA5328B5C3DA254AE2C294E6D34DA1868E2F120311ECFD1AD97BFF964A41E66D84B4DCFE114104D5ADA29A864FCD0F412240F84D435B45933C07D513CE41906514C5D1C42CFF2595329FB252CCCC8F4D573BD0C721BF4132440D7F2AE638BDCF1E7DCAB47F4720C7976D601045B4B8746088190000A49CBA08538E670CE3BC08C3978547A04F6C2123A09CF8BC691B2F497126927F48C4840485BF639A33F6FF97288068E791C71CD8EB5E777A600A30317CD50A07A2C0566D4F49E895007C9E8B88D7E3D43AA1432D26E8CB4CB6284554186DD51207D0767F2ABA0F3BCBE7543276506EBBB2C27CDBD2CF8F14A42F27482F4E0C517FE7EA6D04EE521404AD7E15FA585E22B9487695E6A3835547FC712220E6B2235EE966DE3E8825195188C448E999EC4BD759D67AE56EA181A5E99E636A5D30119B7F27356A18012E2C0A603CC96C7D1DB85747F78AAB1FBF3B9A466609855FB5B6E4CE6DC679D3DF5973F7952B60124800866B7F9D8CA75F8D0E60FCC75F2FBB44E62D8C31F24A328022081CF50314031415C61447D309C1B1340FE92B2D90C4F9D77E41B1F2AE4C5DE0CFC2000A9006D80C71C02400E471DB28B488940C3A027A2881C667FC04CDAC7FE3F4CFFCC027BC443A0C8A845D5D1BC0887AB5C2C623E6529B05DFC2B55867252AF8D03FD402060AC5E0C5492F183FBB7BB7BA5621C8BC1909C5CF8EBB99439C326A3853E3F951C27E083E1503AB3BBAE4FEC8659B130F19FA0E04640E1F42AAD5BBA76E230DAC40BA30F4F85F883D0269AF8B90B1E0307F39793EAD741ED3C0DBDEC3BEE231A821E4BB5E17147BCE48AC8F2E2EBAD18D7BE298B148289D4045AEC60D3B3D51387D7B55C6B4E7F2E4ED7FC223BFC72A62124FE5EBA873E57C269D0F8D8710618CFB4A719E3DA827B224719E573A56A5578F2E4598D2A02736A426411740A4DEAD37E2B8ABF03E13118ECC53496F6B7DFFADE307577A5EB79754C9522F921B38754D8C995DBD4BF47D75B74AA416F9B50AE5071361571F95A71A3060D699A857C531A44A6B2286DB297CF0615E1BC45ACFC08534EF48D9083E1141E22750B3BA8A58CFB008FE5F7E52D314A8193454023293E148E2BDDE64234B3A15DC2EA9FBCF1316A15ED63C4883C3473A92C70E8D8A6E4828616E84A8BA1B801DFDD54C61E6E719D6380903BD5CB26647D47063BF288F4C2836964322A7C84941301D533C110D760FAC6ED3F22D664202BCBD615AF37EE12115449F57E3A3C94C00E9490ECD38AB2BE9D2AD06B30AB1F9478DB72DA1D25E3AD20B47693EB293D0102081D841F9DF27118C5F7BDCE261E996729CA8601373200ECCDBE5E2AF4EA214E7F338E2840E9C1906A05888D37376BA72F94D552A777386B158F00626AB7B2BE2FC530FDFA19117A05E30D79F87F3780B14A544453C1CDD370517CAF2F89E2A541CF8F9590D90384E10CF6999150AA76A3DF8C292AD1ADBBEA5AD8F007CC4477F63A847F376E62213858FA7C7AF105CB9DE170950E630E6A61CCB9C9F3F39FE36AF858A12B3E742829AEE9AFF6EBE60D7740555D21AEAC2FAD4324221610E0EA0FB6031FE60848D0E875716CCF8BED3B748F8A310F8BBD9D9CEC591C0E2147A979AAC8BF6369A221C20B1430091A18DA7B7B714A746DCD5BBF2F0511F66B2E48F29DCFCEFD0263149CFCD75FFFD23846489B234E873F28FBFA724BD0DC75704D5C51E2B2085ECE87196865F7C35675B48717DD5A47ACBC05AB4184E9103457EF3E5F85D59D2F8739A0447057D3682CF06EE254419063A1F5CE0798E3CBDF0ECED06A9BE4CF4F997FB0F6BE74AF8004688F2B850B6CA1AA9E9AC81675A71F598E7276FE77BF5C993F3E7B4436A79E7D6D639E982A736B5905ADE34973D8B1696907A1E917144A55EEFBF747457F43FBBA4BD267AEF48F3AF40FE25740622AFC9C6709B4A7FAD6E162309D24AF05703A6BAF17E5D24CC8B9EF2A2518F84D1046947EA0AAFB936BDAF3A2287E6D7EC09BA0E6F47433AA023BEAA6ED8C540E2ACFB1D89876DA17A8DC790AEB33E1009F56B92B70AEC214813E8E899820E22A487A87C32CE9727B9C7F1C986D995021BE07E628DF45637C6DDF24A7052482D4723C0FD324D6714BBA07D36C07379565AF650C5BB7FBC588409CFE527B744B5363CD5BFA01C245E5F33A152CB1935D4884FA49FC502BE070A8E42EC76FFF63CBAC2C0E3BB8806594A563B28560C8BF878A4930A094733907FB77742D6D19BC008E5DA6E5E34DDB3A8F24EF5793222DD900D4D53F6E4A81B74C93F4311F5FC82551AB63588C8166EFD0A6FE81EAFB0BA1E255366E5DDF28B1309B23D19E314601C918140404BE082ABE1A80E96FE89ECF19BAF40CE6FB1CC37F1DB1C7E6DDD798B404320A7B9A4E395763DE2DD437FC7456BC19642E7E578D03388902E498C3B788364FC943F9895FA8A068B8A4413719D3CB23F06437812B2D7CEC4064C2B7A3372B5ECA7EFF852A7488F0FD925855DE6562DCC9E84DC872F246C84C3992AE191109BF178F23B329D51202FE41671AC7135B5201DF077867B05172B041EE1C8EBDF4D0E0D00F847FAD8CA56972276C23ADB4F4FE45D915450DACF8714FE92D4554FF86C18F373AF02F9F06A1DBCACECEAB226FB2128B4813E590D061B453EE955FF78659344337FE86685206C4AB5B3B2E021FFD7B066EC1A64AC1A36AF6D1C7CAB7BD7C6ED6E54FF1D7E38A687D7BC86435F5485B2E2E4C38C2265DA9E870200F9EBF5F05CAD019E2B84C0A2D749243481AE13D440B05583D172318DB0700EAA1C58A441CB5A4CD61414C0540166B223831242AFA82B0117705114CD132716684117066663D0DB00562C9A18852950E940272E78571EC3ABC5D04E45269880EE117014745260FC0986C3238B9A05B1C598920EE53C0C42D830284E60EC05C507F4D3A0F68BB1239C5E34F92763916A58A05DE4D16416A1721CA49640050A2B208B83F91CF4B2204D82610C0AEF03A24058825805C912A4D51359921759145144155534D144273AD18B5E0C6210A318C52426318B592C6291000910AB58255002C5263609FA0A47DA9717AF83E2E8AA8B907C17F0CEAC935BDD7DE1FA577EAC93FFF4ECFECAFE3593B4B0A5FAF5603131D9988985B1ECA38380DBBA850081FE8FC3D5E86D6B69616078589408B0F3F31F7C6498812810EAAF29A9E2935FC73D3D81465F3B08DE8ED1270B584AEF8E2ABAB68A9E9FE4C655ACB24028609E09AC031AF89BF22134A6DC98E997C7BFC868FC5C2A90D82046750A4F570495A5FA9E7A664951333F4163A6FFE791D46AC9EFADCED792C06CA4F0F048D61166B2162AC1BC628676388E02B52BEAC4240B7E158BE5881A4FD727A6A7F33970DD3FC1DCD9CA28EABB63A09A329AD648AD0623B1970A65F256B1F6A1B536B4EEDBCF018E321AE5A1292465750C83FA4054A1B8C8D74B2AA249723FB785411980D4AAE46360A059A66D35B018E0F2D55A4DE6DB21869C3EE957E848061BF65C2F1A3B05EFF9015F6D37209DFEFB7F206574E63A796AEE0C663CF125F0FD2CED33E72B956DE988D01B6317AD71F0FAE144DBA5D06BCCBA5CA950C0717561A4D3EA69EC67EAF61ACEEC3A2DE93F20FA03074FE40EBE683D109ED26DB1AD4F8CA72BAE8FB2860496F4F6F397FA32668E28FA1F7ACC7DEFD35E0614C5CAF568C6BF39FCCD13FFC8260230399BBE2D17479359730D64D190FF348C6752EB63047A4A2FF999ED48EC5EB50837B8D9D5829E9CF50701C64C4377146E5768398B248EE9D613CA97C3A2BDD6965624D99110B382FCAD3E9A41729E1297FF8A33EB8E59DA155086AF6B42663C72D6D8179FC9DC8319B049EE9F625113059CA9CB787B4FDB43D05F7D69CB5A1E2D8833351DCE0E954E0A9C4210FBF997EB428A4EEABF2977BF8F2DDA097EE6AB187F80C9E31BB9AC6AEC11BEFE7BDEDC579DC1D92C8A4719875DC3A8B93E34964A861C7441639E952F2124CC351E706CFB39E35C7B3495E291F09B958249C3F3B3586AF8FEE5033D8F8A4B366658AA760E74BEA3660296414B50892BE9D136424D2C101556635F3A8EF3F8820AD7CBFD254A3AD84B612029D619A710AAC91FC5155FD7B70C1D79F1619B9B043A39563A73139617B2B4306E0234611B7F671B272E0D71E181B740141C3363E8F2ED0D12B9633CEF2364B82685CC76E92D90FFCEC95E31BAE2215D8E3C4B0D8DBAF7535874452D2D9F10D7F3E777B3A044B9FE017DC4C26DA4D145B1AB280FA6C154266556C32F3437BCA6AD063884F6FF88A1C2B3304F23FAA9C1F0F91552329372A86FD23CFB54F757CEA3583721D6681CA3C545D2F193E81FD628E318DCBD802216CFC6E265DD398E0616C263C930E547592AA32779FC4E1E9E9FBC4AFF9802B39D97BF1494057ED2C0CA7B253CA19964D01284B547E50B7CBBFFD3305BD662BB1E547044CA7905A1F978DFC67F293E3411E23C8CF247F0FB5BF4E3EB8AD447B37F79E07FB655D322CDE5F585A67D082D08FD73DC2C640197CE43750783E1D2751D6F1F2E0C9CA71D72517EA26AD019BFD6CB001F596AF8A89EB2B5A3F5D3D3F6D5ACD9D0B2C39A7645D1C93DD13B54ACEDEE72E85F62208FA403B11D4D36E071C8CE3A785ABCDA21749CD85E66BE879B4CD28D43ADD26E63B571DCD645309EAEAAC3169310939A67C7DEEAEFA58E41053715A894BF78A455339E1963945EAD5C2EC0712592D3CFE9C8D260E2579BDC16FC18BADFF014CA2669C45F438A083F633FFDC64A9AB6E06FF397C30424138DBDA47D799EDAFF48F5D7FAF04C40353FEF96211166669AD125FD515992F40EF77FC3CCE1043CA854553853D03BA0132E2FB7E1EB3A839142AD32EC47A958A3CD20BE506AF99784501883588D74001BDBF84F0CF21F4730F48B57F349530EAAF75578E6AEE1762D476750221670977A0D85DBD8DE1A5DA314B04C8E5823C28B56AE4C56D92767ED160A310710538D4758337D4036B683947623F63D91BF405164723434F5A49A3E0A10EAB9830E35F6FF7B8F48FA9C06EA8AB12BF49FF53F5FB81FDADBDF425A59C892007B22DBC4DC11D57D16F0397F5C50DD0A33193E25B3405B152B38B0B7016E44A6D13722FD7E083C2204E4A16690565D43D613D3515C4A55BCE13D2BCB121EF8C1EBEBF2E2F5C6727B50B3B2D13A9E836D3B6DEC45E6E972CFA2BDE814906377AD0A6B61957CA8441FCDF4240D09F7EFFDF4A036A4A8653305F83CF0129DBD64BC2C268EE2A925A2C0384D21FA1982DE56B3E809C3C5FB71AB4419082BF76F6A9AD193053EEA37BAC3AAD3C9B796BF36D5E3F9F976CB9356884FD400BD9F53E98CE9A50C85C02F10ADAABA7006F2A1BB7210CB8CBA66C5E35E8146665A30E88473934215BE8ABA9981BC5188510E4B89E018D28DEF674CC9335648D7BBB8ACEA7DCFCFAFB62929AC6FA7F6404035E88968E285FF5B6B5A68AACFBC5E51B251DC78EC16C3A42530041A45F0F79048BA9AAE1AF79E4A0A4F57B75037B3DB83AD6EA53CF835B3FC68D0DC6BE99F9DE282D28E3D37F13FD0BC70583BF931263B9EDCBE14A7D4AC704AB0E15879022F1BEE1B1C4ACFF705B4F8B5BA7A51AF656B669965F93C0B78521332AE57E0E34754CAC28D685701CF368CFE3DA31DB70860240B2A7DDCCE3EBB2BFED42D9427C4088CC6D232B990BAD01F9806EA3ADD75A1ACD0D6355C93C59DAEBF20634A347E14B7F397252328E71282A6BBC404AC048BEB7EB882C6EE6E0B6CFF79DEDA6F9E40FDD7A9BE9DB73AEE72B6BF5BC3CF2EC2AA84497B7C6B7C466301D03891C22B00F1ECD693A7DE3296E8F1FF9D0A18CBB86C8C79CE61A097FDABA5D8A35C871D74B59746EE46CF68A13C3F3BB28508BEAE1D3DEBC0F24892F8AE2B921A3B5D7EF8F9E8BAAA1601CCFCD4579A8DE4790671B32DDC9254DB917733BBDAB950C8FC09C5FB9ED05E2A29D20CC843818ABCAA5B3F55354186B9516952E04DFCE46C5D8F67648F5E3B7F10DB21246E20114A3A1FAA106F20534502F1FDC30D4D4843448DF2E2F3880AD6ACEF7AFD78E3035B9D6E94F1743D3293C5D09AAE3F36C72B45AC70DEAFA25D52E9E191E7F22C5CCA8DDFB0438462454C8D852FE8D3B7C448F72694FF2B8F24D87B76B72CD0D272EE3CE4B38763EC277B310C8891F7DD991CB715235CEA9A8570ADD22D7E1CB5D6BB318B7FF1B9220B8A1116564C1A5CC608633F1B98B5B7645405E6D974A3EB2855FFBC99619DC1083E2ECD887F4B9D5C496F6E8D1E2343C1CCF373C75D1AC89D64A6801458488E2CB2405B7E0219F76A0E2812EF329061CB670AC5ABD663F461B48DF74F1CB3B4F1D317B9B74E320802F4612D125E266CBBED0BEC81485848627FDF05902114E128D75C9AABCE0AC7DF8088E69FAD5E78A996A7B2317978573B2EE409FE1D2F173088BF0D42C13D2039A55D9046E87C4434AE5642DF0B7CB784E7E9D457DA028EEEF3F820FFAF22A90257BC887399EB3C7706E343C26226ECED00A9812960E5C0A9E51BA223E92ECF2339D787D3ED041AD67E40CF8630F26ABC2E1B6A369CF370688D92FAB33F58AB08C77D2B4995C140EA52E7537F3ADC14697E072CD3D9A744AAA313FF989F028B9BA905121F53F71B64502AE0FE3D4FB167451FFF6A1566D8509EAF15D6BE97370D666C2E75245D22A314F7DCE045D1737E57FE1BA01A31664F6EC307EE6BD5D12BFB5B4E1EF6ADA1B1F48781F1F10C8F8DFC31C4A4E791FB357A2B567A0128B92AB5E272834EC84CF647EE9BEB2F8D05DBA7C87735EAECE935F8FBB4913EAC0AB692BCE1B15CEF8C640CED5336206D13EDC2BA26EE79660752D5DD229ED05405B465E8FFB500C490D12E607FCB87F4DDDA726435DB833031B75F85F815426196FCABDFEBA4DF7B8AF8304A052DA083FF72FEE1BD4F5F71D6E1C2AA3AD2C6C5845AED0BC71CE30EE1FE26F1C2EB8B4DE42BAB278E149DA390E68FA12B74FBF3C0160B37475837B739B884F9A20DE9FE34173D70EDB550151CEEB54EEB8E2FF5F2783A3C1994CCC056C5D9D22B8A87AF868804C6F7C6D26530B9484700B55C99942C92970E580F9D2356A40BCAA8AA1E577482812281AA426E60B4AB397A660FD1892161ED5A09B5D8B098E60E79E03770023DC3E7C2C27DACF4C28CABEF66A66EE155443F07C4FFE34B3BB29EF0633B70A748A5E973351881689B728E36B9B2F8FC6661ADE5ACA96C12FD08D41E7BE55508CBAE92B1EBB916CE3B32409659EFAFF232F3A51B6F79CABFEEA79E938B9B57E6BA2513D32ABEBA71198A656AE30ADFF617F99736198A94832F1968D2A4DDB657F915E44678C62A2EF6A3A04F8B56E67D0E94A42204E55A2435AD8B334A62591320C0E6DFF38B37639F9DBBCF8259DF7ED102D68E35E7400D8714A5177ED7F0C2D06FE7D37F2A2B802D929C74EFB185B2D122765EE501F6B4AFFAA3B42C82AA7ED7ACEED59ED469B849F3C69B0911FA8B14599E47A18E1A14C4ECC11F7ADAF5FAE8118FAA35359AEF0539D5D8A4C908B976CD13A8E8C10DDEAACA52BA0F45E47642EE7A08D7017C07C372314F3D81FD5EBF49EF77417126D0A57B6E0607ED13FE9AD0B226118BBD8F392EEE78FA37B4DDD09CBE34C16C7EC4F58977F1607BD14C5770A77835447E0F4062D615F6854AAD5AF4F7CD4E9BD658B8D92CD99AB77A00DCBC6EAAA61D0DDF0B7DE73C995AFE4BF7DFCE1C96F69B61054391D03271CE5192D8F16BF8C1D69F36A0380872050DE5AF1695BFF1F68EB0E91DADBE0DD33797EF89ADC61481621D4DAED7846895A1F2966DA457A592E68C51FE177B245B2C9111AA5BACA229BA6658B08E593E49E6B33F31C7D6AC1D9C8580A3C0AE7F87475E90CF227B297707DA6E2E54208168099B1A30608CD44F2A74DA562682FEA2ABA27190363BBA0E6909C9EFD42759624757F9047C7CC2D29EC6E770D4DB9D11C48C44707892CD14597FAC835D9EF5C3233A8A55D240D428525B443B8419A99A60284404E1521E463CB9E8D5485D2F3CD2113E89EA8D140AF86D73300015B101F9BF934A6AADDD35394CFE0240B2E9E8CFA08F6EEE15C74B179949C73CA9B67C8334B7B7EABE6F77380978BF95801191B280B3682178F6499750736FC4C4640FDA58FCF6479EA117DE2983145248E66F92FDD1FF27297ACF305B4C5E6A1AA295B4D501E26653713059421149999991076FE62A9F12CBC4DC0C41D26E19F34B2D21162C30D8C068BA537D3B437D90E428EBFF27E2F4CBD8DD9F8B91CD235563B89FFC06EF935A12794F365779406C193FD11E123335565CE3EEE6C8C1807D3FE5A4D0BECFEDC5E9D8BC06AF9C18DAAEB3233618EB2F42541D47A13EADFE6577C774C295DFDFE7CB575E669BC521A3D0F0186AFC914A7A1400A559E38774B3FE9C584ACDEDF08D80AEE1DBFC0A439DB080FA9890660C9E8E176F99C46A41E1F28217780402EBDD2B34E362689CAFBE3BB5AF8969F9B9C65765E792153F36B86B98236C3C9E973AA2F2709E165B53658224A769D2C3A94ADF9F7697F2298CED3E875B83C25F6797559AB4944D0473BFFAAC8E87176D4AC0F0A43A649E81AEB78A0FD9C56DDE809B4609B17AC1D2B2B57917CA6186FAF54C83748BF6DB1A8DCF055A24848208F7E6BC5282697E31636EFADE63AE2B273A093186DF3D64FB18760B3AA580C28EE08C95F97F2CD4F7CBBC7F4E23BF8F3D7B6DE875906C7027757C68AA8AB108438178CF0171F3291C05774904DE5603225CFF60240DB3F03F71733CFC459B473F274497BFB845E97A1BD1168172716B09E0F2DA710D381E3560027B4EC0D3E0DB4088C13A243EA9FDBAD78A666FDA997F7A6574789D05D0B738E4824D710FCCC5BA5BEEA7E8F08D858BDFFD209D8419E54F43441CDA66DBBA3F3B8B91875AB0B02493CFB976D7B1EC79E16F94B60FC05D264221CBCBAA6D1C367CDC78F133A7EE43D189F2C597E372E0C0EB184825D7AFA350143EFAAA98E05F5E412EDA5E859963DABDAF601676DA6D034395F7FC1894684A032315458A20DFD3962A357B4E9A88257149378F0866DAB04E6EBA0F2A45A0599ABC91DE816C3BE4E2D4786CBFB57396F3C9540A581C309D6F397ECDAED40261AB9752676236C6B0324C4EDC066989092D19401CA303062AAB148D66A4C06AA577BC28ECD3C430AFEE7D72EB05B4F87ADB6F09E35BAF1B57386EBD26ADA870AED23961F28E93C3C2B7B4536540EEDBE5BA9437AACB8D3553E430CFD750AAA5B1DC566D12C2F2D0123FC65D238762F60F35E7AFCE9C0F69490F0DED696308FAEE190B939C97B24EF309FB5E9213BA4B0E0A8790047AC9B7C69DD00AB6AD8597DF69E0B8CC329CAC315D72A67D303153E564438709A87F90E384374BDA4758C838C8D2BC16E08E6501D33EA46E6999E7AB408DDB63D2046A15E219FA48D3A261161991AD2780CB8700A3B044EA691398CA7E1E7C27F62F747CBB643E7576A37758A1CF17409C90865B05BA8C0AAE8691C978ACBF8C94A6706075CACE35BC76315FD67EF556DF7F4FFEE9A40B0A028E00B01C4302A7668557EB8EF3C47237D11009B9ECD39A82082F339EAC7C6322468EB7F2E9DD8FB1D357FAD37278DD6A7EA6F9ED653D4D7945877791B4414B1FFC83008A07528DF021C044D960F30C89E72487ED01BCF2F52A13EEF0DF89E17F461CBF0B9E4C17F1A23480EF87120EF86A456243D4BF2174FD4B730955A23902254286D9C5F227EB1F65552B044DFE68C85FF5960B974340F093A704A115E3CA8861AF41C6F2F2639386DB28F89AC5D1574338DAEFAA2EF26368475FE5B1B0C8D07053E1BBEDBFCE733E35E3C05D3E6C36DB04ADACDF1826524856BEA831D66F6CEA053A1C0B163DFFA3A9BD57EC3373E3556EDD76FEA2398C04D126644BF6AE3B59D02E9ED5A1309BE70592975B3FE7490F4D91602236C3F8544026A10A1202BE86D0E1CF728D52A6C5F812678A12E9B1AEAB592E2945BB52D4A48D67DCE5E99857E014BA9F5E07147CCA51081DFF5EFF9F69D6EF130FDD05A77148E41921347BF65A161DA40C7DD7B46A8699233AA489F8791E4F2AB5A2544F564CDEA75890CFB53E6B8FD18EB1E2E45F6888E9186296100B6B719B9869955D16D93679B94EA3467AEA2BB0E332041FDC16D1B6C1A35A56DE27A11CCCB2F0DE313A36F6AA60E05859AB529C9E12F11DD136ACB3DBEC89A8644168CA0F250B2B6D9D3065B71D18DFCB94CA3670D858F29235D148C05781432021601B82BC322CB23F42FDF554B11E6BCC2B75C636E22057826E9CA47CAFB5831F2560E075A84DE62653219917D51B1DEB4ED419826F0A8B9C523EF3EE642EA7DE66A51841F900831628F7F7ADC2A0224F173A95F8CFD3E503BDCE8F1451717F4F5A34F8614BE41D85EDEC8D684787BDD5168577528C5144381E13200411468F03498023080838010924024D96763C2C940DC90C671CB214B2A4586724E5D3A1E33A1E29649554F4CA3D4D50FEE09171098437416E05AF44168CB06B25A1CCC5B294F0483C5695DCC3E0EB95C555EE3364497EB382448022B917DCEFE2F14A89750D6F6C5296A8B1564D1A36628DBB196F87D5306A72CD41ADAEEBEAF8008B5434C7C3256B8C64E543E5ACDB8E97D7787EAA99BF503B69DBDA51B3270243DF0F7C7F07CF9375FD8D96A4F611A353C31FDD13F6E5A476ACCE3366D45F0E369BD27E5C3E4D31FD30854D0E9C5A3E9DABE5DFA6EB65EA0C50B521D1DE1C8CB8B9043C224CDE2A9E096F8E6597DD3D3D6BDCDF7EAFF3B5C0D2D339FD3836F28426A63496BB2E89C79D2726BDF1E9D52B9AF6ABB1886D9DCB4C4A3A34A695C1172927F0495211C50CBA1CC9751F69014F544E0BCCBB81951FD4B834261B6E981C650CE8A9BF59C7F570B050C6EE9D281FA5C31F8A02BD3F8AB7A38E83661FFE2CAE79D9CC3D24A27975E645D7540863F9AE2DC51B8581AAB701D45B2CBA9217B25C66CF9961978E5FCCFD6B139CF938373FD6C709D99EA375E4AF829ECBE9FA9252CC62C7BA238B447F7750FCDECDF99AE1A61D3CBCFCBC2569BA01F5E6058821A396EF19A50B6F562C893D74622513B653E2244BF5F851BAAA4779312BAC2C7EB1A5C0CDDCCDAA8CB66BF42B39864D531137D91193C59B342EF2719CA9814AB793036FA8A95A1A3B47DB3422022D4BDB39057520D9C374B79ABC2B736E9B88B2B7CD870406EF072C192CE585461AB23E87559FCA7F521D2D85881BC5E358DB2B76ADC0F8607F5B17C555762127638F59E4872BCE403CC5138A1D17960696C71F6529F48B0A51A06781388F41FA4ECA4C8FF9FCD985029BD4045310E179D6DFA294759A71A5223D69689E80FA67B74172E2534658981300EF3ED9DC5FCBBAD26A4C0FD5BE8F3A46B1AF3FD993F508DE18652423102530275B67AA796A9527BF520102805A16168B8480E123B23E0C73EE2E3F946FFD74FDAE5E1E0C289160FE6840988E02FB5F263DDD035F092A37E431F18C38FE1CAB6BCE42A515E975C2A01B0DF5DB89915C09E3EB2268F7A7F53C4B88BB848E394548ECCA348C89F88E7D0D397048F5E57F3AFCE448704740372945DE4FE828FF6093D8D2DAF8B8E533D76EF93DFB6233657ED5DA811D08676D3E536279C5E69445358559019F6308B067247C9E8F51EEA907F52962A2DBA178E36D22CD6209C1A3B40E21DD74212301002267BD50F0035C9677AF9A24863E7D6197C7DEE10B264A9A34DA5F1141E8FAD717B3FBC1ECD114EF3E2E61B1F9AA4DC01855BECFD46601E023BAA06D6CDF1FA6FA1DC430D7F7831DF253A332AA89DFFDF3366B49405E37AE14035D3CEC5518D47F7155BE8F39892B56DAEF7EE8F7C284566651B31B43C8DFE81E44F6080FA2CD96E18CAE1C0023C5D650157598727CBBF5FBDEC45C097DE9C734222FA94566DA760A420055EF2189578F7A9E27E66418A8F163A138881E43CDF8040F52AA37583238E90E95F1FD448AB6B900773448F2D43DE4EC40B249637E6449644D89886522EE8D4ECE9DA355E90DEC8BA7B53919C28F2D95D2DE69A75053C19AB3EDC297228D3D70063CEE70FDE90965BD42643BFA4FC957D5BF1E760AE4D58AF513354E10B8EDDC78935E9C3949E58F75FFF7576384718B1ACC8EF44F4E1794DB70C848A7B00FC8ADD700E904C85D0D4F2FAC7681844B454218A988E4B8D06125971C27CA910EF4AEAD589CBB4F838313F87E92D7131F90641F0008086035960180BC02189C0925847117D81FAD0703E7904A7E8041CC93A38260659B82B1A00DC27AA1F58F774727A4340B0650E3FE4EF8EB9DE30A2B6260F28A3CFC23217048E19A89FCB2B076A00EFB9211250360A9839342D9738A24CAF741A526DD7E6656D45FCA1D01AF08BA109FE9099AC513A69095AEE24EEB562AEA57B4F013D96B163001A48C36408B774FEA288DF0D4AFA0A7D110AF1C18BBEBAD5F09A6D60338351146641357CCC07E036666329E13E59D167491A74C99C64681DF388B02F8986CB3909919A6E0B298067B443CC2EEBED65AC7C3FACB48BBD10F8637D2C599DFB4160DD181E42F081E4E9D2757FF32BE55C0F48EAD2D9511B7FEF86DC9D6FD6EBE26C242440000568AE6413064DAD363C13FABD4B688CD0E4B08B4DD1B12A7D3438F78E2CE99553D10D6E2DB4BF6F0181152823712DD7F437408D0730935D9BB214914A927A91A13886D65C60A4BBB3CA197D073B542F9F05C87180092AFA21DD003D65AF3080065891B0AB46B15DD1FCEDCBA9EBFF48A1523726D5BF6FB21E30C4EF711EDEDD9A8133AA627C28C6CD0698CEEBFA614DEE2E3DB394E74383A7A3DF5C6B1FA8129C18BA0819ABB04A521A3154C327DABE72CE6F63719C723BF13C3195EE9F13BA73AB48C7674D1CAF760D82A6E36513E2A364AAD2AADD79EAE2EC6C855986EC5284830F6FA9909DF5FB7FAE1A48D6696B2C1AC279D3F8FB23DE6ED80808F4649EC46319E407AFA955CB4C9778897AFA21261024F3E2356AD05A8D158CD15A064924B4A5BB7707D6283D7E9D9DC5F04977E3355769BF7F8BB311E91ECF43DCE0EED23308C24017789CDC80D734300E12F1717FD091630800059C63F01EA65D24BBC49F3D76B757DA66C0879A2EC4A82293D7959DE49ABD64E9A3882680D500EFA19454AA0B2AFED8D42B9B409C42FFF1FA05C3F20704F6344EAE7CDE133DFFF495C33D41B5125790942E6AF47712B4C4AEEDABBF17B8663F1521D427D4F302A6DDBAE0EBD0C0CD410949307C1A005DC774301D15AE1FC1CFEB9E07BF61894BFABFDD54ED35FDA51607EA37B19C726031E8E270387AF4DD2EAE454BFDB0120347EA53B2D41420B868E602049067ADA5E6E9F26848FA41FD86AB77388902A5E81344CD0B600FAB6DCA8993161F942F9D287506197F0799CD8D6DFE1A942F84994DCF0B8CE2D092A669AEAB7EFB240D4A9AEC258ACBCBDA9B12D29825D54C1D7AF22A696440BB25EFA28EC05B3CC62CE193E344C1010B7823774AEF234A7DB97E24AA8ADA3F40317EB09170BC08394B204CD94A59D090EE8B04E2EE94D80D3A627201D88B41D1AF5D8AA6B890BDD52A3321E3CB47F774176BB18737AE457BC0448A53C8669A71C65641CF32FC5B0DDEA4363040DC65889C051C1D2F4A704EC6D515EFEAED59DC374658E2C2D40C864F4BF2F322BE8C2B6CE4476CEC6F1E16A72AD1E90770DD5193F5D10CBEADBEE42621175A75B2AF4D67E347D75D1A49EA7D7FF1626F9C5163D98C108C7F26E6753DD69CCDB7984946EF371DC1B13DFF0E9466E50F13A6282F86B0E4A3092768B5C72A3FBB5CA0E458B745EEABA7BE9A8AA03232CC61894987688978E733AF6CC23EADD37426E1BE99BB4635BA494B98FBF85CB00BBA69475C82B160BCC4A44C4ABC9796C240294AEF189587EA9DDC753183C3CE5FF493C4FC7DFE5536EA2317AC8F764F7E7060F90CF267B3076F0D2EEF66E67F4EBE035C6D72CEB1576840B16137787F1E0C5A39D998821CF1C5897F8C11E1AFA32DF622432F9FBBFEC2A7A9FF5F3E1D8BF6BE3C7C481A8E373EE8630758B73B777CAE828D10E9D2E9D107D7FAFBB9FCBA0FB2B79D047FC4BCA5E6AD54F7D7DC46CEA6CA037CE793A3651A3F917C2F4215048BCD8D9C8CB21ACA87FA9BFDF8DBCEA96C0E07D0A644AB5F66C144CFCC2427E08B3CB6C5CD07005357C0FED629B9581375AADA117DFAD881112E47E268D6794AF8C88CBC18921BDB67340EF55E61BB1E0E84242B84E90F5F1CD2213511AA3E515B66E089FCCBBB5E1A2EE9F1414A2937F7B53C4D442205E9AD8FE512BBDF972D0F5A4C1E387CBD96E97A6028526C729EF91303FDF378674ED96560F56094684783FFFA4F4006EF8ECF78BB4ECF92715FF2A28D53FACC425B5BDEAF7F75383A02A3AA65970F6A79B7B0B483A335D58FFF2034DC11E0ED16F15F0FD9DD301BD50D0761F056A3EBACECC9A9F0EBF26E40009897AD14811BB7E633C417D2059FB4B5BD3634B46EABE788CC1FE10FB3E850D42FF6BF53678ABE299EC1BB3E010A13A148B0A292ACBDFE9A5F036D0050DADD6079E196EB1AA5F3756EC1F9D7FF288B9A3BD11F082BEFCF1F0413EAA870403B29D24B5F32BA162267A5A64E71FFFE906970A96ADBB46BACF0C9EDE66EE4288187E2A51FA504AA4DD57A83189FB9A65C5D8A8219E910B19A84E02CD2705377D0FDDC26D514D599F4D307364406D0B86B9DBE93F86A1CED2E514621DBB22D125DB572C4310CCDFBAEF961C9C4DC260907CC822309B0F9B9184563A21089AF6A0F5FE1B31BC6979E531A69BEDD3116AACCEBC77B41E3DB12ABEF9A4DFCD41AFC2BD5A20AF8F3C56C0E3B21A273C69B452935BB8C433107CD49C7EF9CD8E20E31F6B7A51808EF695665D28FAB16F573CE41985C2437BCDF28414E7C5439EB164D39934D789E87CD52FF53FE3020D44CB33AFD76B4666CEAB9EBBB22F3EBD417F51821697500592087B8C922A1DC8D5274FB707CA19493F1F2801A7B49A3878EB3D053B3032E7DBF10730A26402831648FA5DB08128346613A996130B1D591988348E7135BF3BD7F855A5559C2FFAA6827C977BC6128876D8C624A60FD7637AC79A2EA9F10125B6E4F2080F48FBEA91AB66D2B920507A04464FB264FDDD52885FB28DB268D7897F8C5F21F6548F0450482701B854C46D134F54B47B3FF827C135E22FC02563EAD1E9F62042C25D79E6FB4BEEA753D792A51FC128AFF926EEFFA12800BB73B994D846367F905F75316006494E43E63C3604002760054E280480D977AA7CA8F3EA3E4A568A24E91A7477EF60393EBD00D0A452FDC4AED20162A8713B4DD492EC380E8CC0A50D05B60A48AC123CD5105DF39B0EC7F29C7DEBD6EFABE907BF9640FA6740D32E05896C2BAD86523DAE7FDD99B6318C2BD8F8B1D3F02B99E887C957BD4CA2D7E381AF902D61FEDCA193F9BF617C980B5CFFE88F517B67F1125C9E34D9CCF01319A9F165C0343389201F13E76844E83A7EE4D53E7924310B16E9293FC35878661462BDA223CDA7227ADA849996F4FD8B9E1FD932AE92CCEC61D84B2AAB09C7B3610AA8D8C94CD48E236CEF3A68211CC95ED429896660A92D7497B28DC7578AA56C3EBEBF62A92CAC55FB02E4F6947C4772ED0406D158B2477D4E37D145538CDFE138597BC0C78EDCFD75FD8E6ECC0AAD6532F4FDD8530D8972734DB7A61D115AB1B77FABEE9ABEFE11853140A869AC7639EF4B2358147045023D7971309EBB07272D8EFE8DFD2BA672129E31C627DBC932DC4EE90338521F7CE88B1AD43EEE6089E4FACC3F0AFF77746EBFE0E6B4E99CA92EE20400922B4DBBDD2039A07A955F848480DDA370362D791D9EB43F6F6E8B5C1A7D3B50727D5BE135B7A44D742254977D9A2056EB74B9D5F9B89FB68BCFAEB456230A71E05D174930AE48CF781B3F39F6B7B43F274779100499668262330189029FEDF8816A290099344E1AEFFFA94FB23BB5177BB72037359A6784B202E852D751BF966CFC48FFE44B35EA25705E0E0222F355568872728F1BD067785279459B88391A3939F432B27AA0E352E032B76ABA50C35A0A53CCD05D72C229EF7E8D7B7257C015FE50243027B8A1074723F401C440AF8FBF407F82639D25A6CE5266A77E2F77F934EED40DE89F4215ADB70177CC7FF0DD45358A8073CF936A1B448992C2EF578D37F0F720249BF3201832EDE3B1C2667615F0AD564BC2AF9BA77666610667C70988721A9D8D9BAACAD5F44CC89058E0D32943FFEB16D0C7F0010FE329432924EC751D1C89242440DB8ABF91A4305854BB46801E12DC3A95E543816994E3F8D4C2DF018A8ABCE024F5FF3358FA5AEFA786762EBF71C08C3E234A6D08B05950F49D3B258E3B37AA457AD479D74F0141B3879B7C072B3667DFF10D42300BD7F70AB6181F19E0DE443B7E5BF5E947F306C66A4214B06642C7958200C901A871588711719CBB778841CEBD726D8BBED877DB5AE91D009437B08E21036F6245ADAEE625D7F824ABD1504874A229C1FB557310708669251C35BA0954723FC28133E0E1908550549421A2859E400DF9F45F2A2429F90B6D86873F306B2678D17EB6A8A9FA205D10E6C78586D4F53EF4F5C64B1793CA8A221A200379DBFB3F698D8BBB04279746D5CDAEA7239C34434FD439388A6FEBC91F0B0AC47C9517256B17CEB21CAED7D9E15F1D6A536C51EB1FE36EBC44E512E920271D7CDE36A5CF5AA9D03E6B20A040505C31A1783434CBF908985ACEC691DEC3EFA35A97B7D565E0D7D1C0F4C73CE43FEE005AE10BFDDDA57D90EC5D8CE534DE8CB75A6CC595A4866C1472573722001883EE3ABCDF1F22A4374C0C4C396A2BDD8D67C8FFF86A5821F2641C9C8FC64C01EA041FE7B16B5312B23965C6A04CA02D327A84808CAF1DE95A137B730D6BF70410F0115D509C9896C3B8DEF90085FB6DE4244FBF7D35217AACD675A7FEB099DF94466DAE5C34C6547325B263FB9F4C4E95DAC7DA672D7597D0EC7458145264EF1F4D00240E91D053870839FF17887C090D22695BA0F07F1FE153A1A295ABF2E0343AA114AAC1A6B9AB2B2E50F5BB70765D0AC88C07DB6F64EE476C48BEAC55C30AA7CC0F00ACE75283CC2091B8CDF81274DF2A1502E1A4C25A4CEBBFBF33BF2F8C2EE5EE7E1B940B349D617411F63C05A1D391C8CF63999674DE6961AF9C780D3977289904B020701C9461969B076EC9DE1C0D4910C59AF575C31BB8FFBE7B1640AA7D9FC3B96CF0BDFEC2CB85BD0E0862D33CC770573DFE270FE3741DC368CAADDED5603E988BCA044188D9A9F84C09EB4C07FC85999497AAF07D9FF53ACB697FF027251924406CEC31962BD1C04A6C27669879D5B3C4D20B0D3275DC524BE296629031A9688CDCD1031404F1012F2FFE1902CDB34FB8E1EBF521E4B322912CE9ACF3DDE8207306DDDDE5CB0F4B4760F2CE05E72296979EE62B055C791FEA9F8EA837FA95A4F1856C3FC1F11A089209AB45F2EB9DAC69D3E9C9127F94D50A9073259350B7C00FB16545587E3CC4D37E797779B9FFBB41AB6982D54ABFF02B35B62A22B8FC5CEFCE2748DDD62ABC080419BA0C69133764F7BB30E5A2CC884C46DE5EFB028D87D85AF7178DB1B9EF162F5EE48D106C8AA16E672B91139C2A340AB2DA3FD40DD63E1452A881309F57AB171A04E5106688E2E46558A14E7E0FDE72964870F33E0DDEA563DDC5EBED271FD50AB8ABD178589B0CF6779C483ABC4F339C3CAFA756BBFBA480822F9C064E61BD9E021D805AFCAAEC593EB9A9D1A7CF5E21AE6F869E4DD3B89573EFCB81EF591783C5B10C0EB6A45B215679FAB8D7F364FB8C8F4A03291AFA37619DE606E4FC3ADFA7D9B0737A20B62B0D38000084AE41EE3E541969AF73E53235DFCA50C57355A9D448CFFE0B087D315DCE5BF2CD030080CE95122132FA860600004866C72800E208A804B32AA1956115D978F65634924C5F95A63C1A21402BCC1ECC5120805C6E1FEC124DB4E1F8D6A4D69438A8AFCFE93EDB8E8A52E70B8A2F0084B071433D0100F24F89EEE7E7FFFD009034CDEBFF02204430C0560C00A084E9C330D9A76626D2638997B1183DA64EEDB1B3A25555CF2107E62F999C975EBD3E0BB0939C0119A6C717B8682563B10AE9F82171EC07DDF4CB900645509908969A3869E9AB98AEC619D2BF9B559B58621BBCA4D5D19AF016B40528690EFD71168C48C15172CBAF6940E579B0BFA3140B430453C7499F7F46C525323D7769C94DA9E3586FBB5E576537E8726AD72FE641EF5879E4E666150E8E336348F50A093C384654C99BEB4896EF38D4A9081937E39CFAEE67F5AFE1CC1A8E47BA04CB72278D712EF5DC8CB63B8AE861668516B0FF75176CB7F3EC1272C27858C351557FC057B09326B4FD21B2D02E37D4111FAFE2D7C080CB783A36D793C290BFC53D011EC0DFEF4241E20DD80BF5424F8F096D5A0BEE0CD7E2DD0BE9FD7F88C16D944A35808E90E858243FFE020328110D197D9DFC606F42303AF90FC07D2356DB43381121E22642D40D31BF26451D0A4E6AE1D2A56121AD9FD2E40F7F3580686B5865B5AB8E24B0E70EF495B9FC690C21CE15453A22D43D10128CCDCE70968B3904D0D4DBC982BEC9E46C8AD165DAC6C0B286D299F4633804B157B1D882846DBCE8660BDBDC4193D044A9C8259302AC07A5D811E886C024558AA2AA555DF1993BFFBF41598F2730C6780182C94EFC1711BA6938A5F8F1D8970F3C95A0AF01EDF478C5A9760DB7FF384AAEEFF40038CAD3C4B754A53B37561ED4B2632F3AF75BF8621D5D0C3AC4C7B02822E32AC12A324EF8C5CEF491D7AADA7AE71DEAA2917689F484F08D7AEB84FF05610F08E721502FA4F3812CE7499AC4F864CDA3E0A23F5ED65C10C419BBD17AF96BF5CFC6523A51AA8202BA405FAD2243DF0F7C7780E7E9A9A9B8D6B067C420C8012B0C8611DDB06490B4A14A3AFDD38A05CC39058FA85886290C72E0B40BE8809AD04C4EC832B56F3CCCE4F0CD4F683A2FE881064E929B4EF2FED84C5348966768B66C651CC28959E53A9ED9579A2AEC283A6EE412E743DC65ECECAF09993C9E5E55057E75411367FEA2061B4AF857FF461E5E78C3A7B6EA64D47C39E80609BD6A7D316BA0E77ED1335AB9C0AED7112CA9BB3679228DCE0B39381BD0B8B7D1020F8D1FB352EF3BAC672139FE75BA993ADE2D4F930F0E281E5882CB4CC18CF212A69AF240178426A723A6FB0F08A12023AD6C91FCC8C77456384576C8FF2BF076A92B835CA63EAF7B2476E5BF2C896B7810EECCF16EC1C3CCE9FD38B35B4EB7F9FF7A73F4DDC9E6E0815C95B13AAC714131F0D7C555E6C147AA3405B58BBA197236E44C5390373E6A0046CF0AEE294770384C8C3520FB55EF7F74E654492B9BFC2EE29B1B533018C6C76988B828821675245B1B9C60B2FF7C76365BC9D4BEB11B1D34DA997E0F1F566E1B10EF0593ACCBF541E7FC4E5A0728A79B46F109BDB421B22E116CA6AEE529A8CBE90FF1D724998E3953329EBE74F90D690F24021A4DB35069FE28F274B7C0067448A2AD24F05FB50A62DD05B5088DAFC9DFDF8938E088FF41136FCBBFEF2D06E7331FB4C6D3A00019F0B8DDAE00804175C7988F0C0612C13D4FC9CDB730947875982EEF134673F33D5E4279F6803146D13DD4B534CD00E1BA45AF3D773A67FF065F6A5DB7EF564A83C03EFB2C01313A2F4A6EBB8EA33C202D5F30DCC5563221AACB62350E90D375E96382BBC0AC4BA5D333EF6974A583AA39F14304A7BD15915BD8748690CB9193186ECCB3EEBA10A16FA098F37FABF1566F580C6A0D7F835BBAEFB67CB51182CC98D5D67EAB4DAEB6869737532CA5A04480045714BDE80149D785620E684A9AC38F0B63F80F091E36F46DDAC46582F085511AAB93AD8C7B607890F7FF984FA1117BA9E9714AAE1522373C5EB03CA184009D3546D8D481D68630C9A674607538CC7DDA1BBEEDF9C11C6197B9BDAB240535CE256D8DEBCEC5C373A7CEF40E08172AD7649880345FD53AE6A8B4623E079F1B4A9086C82F2E88970A6319DA32E2F1116FF77573B83FBED5CD4E3C77AB8B44191269C855CE523382F518FD3549DB8A35317F982315309E05967A1922016FAD4D5BF1818925A154A599C94295B1DC44D4C609968A8734908E9A1D21CC34C3B43C147FF970D27C9FC823A4012C6F834C7D3C8BBFEE6F56DECA1745CA5F945C076C20418B15EF68100975CCF1512948D335C0EE16CF57ED9657D8656C9CB5B9009C923A42166AA5D7F35C305E432F5DA6E3C1A54965D2F9A060D784FB2DFED7BCAF6F5179CEEBF1C4D91E8E028D95B9046B04E4C3A215C2C3799CE158AB37A815C053F3C068A58FC3CA99BF0F5B122F8B83D34AD9367A7A85D790764350F15239CEFEDA4EE68B6892D93701A048A8DC6992F5CBF2F08A4C43AF6E4080843E1DBF0B5730E6AC5416B602507C11B05DE00D810232ADDF9958A2F5557008911E37799024003035476F64C12ADDD5AE327F199C6A51963799E7F9952334CBFA463D69DABF826021E8DF042E533065A652BD347CB577067461E9E4660802117D86D3E36006907FEE2365CF1D166BA128A0185EFC8CA76DFDA3B4502CAB6F5769040D9C844D9A6E34B0C2DC0C91FB19AA31BBACCB44A6AE61F8A9D97DE7A44F9C085D7DA81ED97646FC1C2C715F66D843C6B836B48756D2398EA5DACAE22C8C46244CFD0DF802677194EEFEA827907440B9527CC3FF35894F141A97FF0B858EED3806CF40C27DABD0D849E16D6BC04685403AD508B5A2641BE9934345BC3C4D8C0F5E2BCB9B482496B8A7FBF7C6EAE9D6175D89916ABF961E7E6D938F9CC2B83147D126E93F1B3348430D56A986BFE0E3005C2123965545303A2006F8458DEC9873EB077C1E1367CCF073845817A7AE4FD96A2FE9A4B0FF673F0E4FA1B541F1F8BCB7603A425DBF8142B705A4791E5674E8C997006E82269C2E468D51E3A72E5024E36209BE7A116DC880B8E1E8100CA499D930F0FA11521F5CCA44E38709924C39E9BAE84362CFD6AFF86F148FEDBF48AA28EECF377854A1A8ABA4454D20F8809DB7FA823FDC6D613DCC26A78CC2B56C6D183AC8DE1F46A149E6C6277CE539ECF60F0C42DF0B10B4E5CBDD05151D321E37ADC5E29887E40B19E54FF135DD28680A07628BC681997A99A392F92DA923EF9ED494F292257068A5277555D2501398F7FDB29F381706EA4F0E2D4BEFD3644001AA60B85294351B8FD2BEF6938EA90741802C7AE9F6EFE156B2FBA1A528D9736F6723F9066B1BBC9133DC6067D87161BB02409664924263EFDD22819DF8DCEDB0CFD9C5BAC9875A5363016B1F8ADB5B81EB556B0649980410BF7E597E8AA1E214FA463BB025D9426C386E8548F67F08C88C3DB70ABBF5F422E130462490756AC90BB31689C25C006B92EBE3B00D5CB1F86E2742AF4FC47E96211BA9094CCFFDA00F40895D1C3614EA406BF9C75A72EEB674DB98E8EEFC577EDB9EE29518523842846856EF497067788670DA68DBBE249D3ECE3B0D29BF32586C100438E9A2F78F46D3456C78063E19DC7460E48016E7EE12AD0C74A590BAFAE2C4460988E7855A7AE3DF7E55109D8C4080B22F5CDDE7DBD7BF6EEAE24C6A371618C25C3099E91438B444ABCF0486178AAA1F35A66782A4013AA0CBD7BBD624CE5E612591690C3840EE6F77A9B1376219C34ADE88A49683E1D999389A76160C2D99890B0A115F73812E70C23E4C4ADF7DC0FF9FA05B90A3E3C838FB0AD33B7DC5ECD27E77D7F5F53FFDEA7E6F6D991BB3AD2347623381CE807C48F8E31F2EA676915B5010A4F0A68255198FAB8BD01322FB41AEAD56D4BA244967FE11FAF5637A59AF50B8259874336C3600736DA394C607D4AC2168EF674B00A9370325219E09D744060327A3D2D8608B27286741993E7DCE2DF84ABAFF754EB9EB04CC67A3D9B060FE6D03E9935CA9F51B84E191D6A24A3DA6F43952A88A4280BE95B2B1A77D275F0C53CE0400715212AFFC0239FD0D18629429487AB2908E3143EC9D85AB942048AF522B1C16A817355D72C0E5569377AF515A9DD5F8708428A063876E369F943CBBE75B4BE08CC6DC2BB36B42660F054F7051576AC6CBE79C02106C7A3DA1A1BFCAD6C14627557114AFB7596DE10D690047B05326BD216EA34E0B0D10DB61EF35A1202A11506EC6C261183448E9A165EAC33E9631BF9CAAB1EA44D0ABEA9DC75A570FDC7370A234D170044EDE687B78FCD3DBFA88750B58E0CE07900B9570A69452AD49EAC7966DF8AD95EBE1FD86CEFDF080D8EDA6AFE84F68F742671720F8D49C6681E190055D83EF5C1786FBE19F4E7B8F37FCC0820D587263C905F126F216F8F9AD4FE5A1A82800B44200A63D02E0D305E0731E91463144DAA78F19B083C1C0EF2D2898623F554AA114F7D729D75D951CF71AEACB69A0FFA3669FDA67E1FCA902FA166C1142558EE6BC0A93337C757F4B8B5387E596CDB6516FDF9E9ECFD02B0FA462222DBFEBAF4B7F59E6811FBD078385B75D0E2011B172B3EC19ECEF3DE5780057B0D83BC08995E9619F2C8350B9D3116816444242E6AAB0E2409E28422C63012D8341BA0C61A75BC522A3737AEEC584CB49477216DB76E76DDC3A62E917903C3945AEACCE54727524A60302DC0B97B50DB91F6A3AC915C2BF30744FC88B5BB372B67775F39F94F058E2E5B97E187D89D1FEDF2DC48BCEFA662814A7DF19E0F9734E7353F88C1490AF06E5F402A1116E48794F8B4510EFBA75D07622C2B1A2D7EB0C27D29051288A2D230DDC7726B6146BAA49666690CF6F242D802411D90ECB9B58FFCF84E041F6382DB2D00AA83102B91AF50EBC9309A44AE32DD8457FB9F0ACDC90D49AA87B1A0F4C7ED95CB4903544EAC0B98470A565D1A77D9067223C01EDF29B956441E2C7946CFF7D62816BD4649CACC0C3419CB3C51111D6763F8E4AC7A941B7A574465255FC05149887AEF3D4367B73121AD2BC4233FF2C5DEED055898E67CACA065D27B077358096A8EB5818660EB870F8C5D2C1778F348CC41D257D88B3EC833BAB4E644019B3B0F9FB0B0FA2B5667D0277A2A9B253F2C91024E617EE782AAC913A660213CEAF125DE2F0A7B50FEFA7762A314E74851FB275105EB7433C4990B45A5C87446646EBDB7673CED3C80007A2311371AEBDF5412ACA7AEDB53E8F1FB91544AB0CB6A1FFF872900A2DA3F364877679CBD03CFDF8175FF964EF9DE97ED0E3C3A459830D5BF257027B288838222E35EAC15920A9D8105BA6C9E2C29FC118A0B5A9046E92AB0000D4F8E1DCB9B7070B7AC1AD64E9C1842BE75F7C041609350BA0A718B229EAB54D4BD63D1009BA174DA5447CBCCB0350B9E76B54E992FA9A5C61D69FCCCC333CCCBEA225683CB5591C9FB63C56A4F97AF9BBDFC9E4CE33D12D3EC3A2708B48A52B34F2759009478A0164C55D2F4B3F30662ABD287858BD2FCE1698E507ADB2F14B82F9123F217E48CD050041D41215D88991E1A58ED3FF1644CAA64561183D27527C265259650D96CBFCB6464449DC5724E73A2BC364618AD617DC686C7F316A322C58F53E82FA3756548E7B95F2D50828C496DB3BDF2E9EB07F3A818A247B335823ED471045F2DFCFFBF862E40FC3C2FD438A819DEDDF74F08B55841C0D932C1F7ADC5F3A552E5AA96CCCA61E00651D44F9F1B13C957F66DFA80FC9C456750487013345069DCF462EA9800D4E1FF1EB772E3F210F50C899C521216DABC1388A010B4E4085B51B98E3D258421E2417DEB2AEBE41CAD75B3E1024BFFB63981913F5716554F8C0F40D3D432C5BE6DBA514032BEACFEB654D9B7684B82890D187C474C28C2E10F24D6D4DCB9122463F87DDB6C151E611FE5D2EA4D52392D69C40C5BD0D456582E3247522D906E69BA72060A5972F4612F05EC8350ABF4FE67C08B36FD5FEB32D89004EED9BCF74D3988A8480EB51C7F1C073A237F96287090734B06F9AE17CF7E3632B0E5638769113BDBDF520AEC7ACFFAC95E73B3468F192E6AF65483D7687FED900F6ED484D59B103561CCD767C0AA7661DC8182B7285286D5FD146B67F56B9AB50B7C26E6EF4B3911B5C8774F3C90FE57B67F90E64F7AF488D0FB7687298412F065B125E7832DB37B538DCA3C72C26C6D574592C9E530D0531FC3587B74A98EA131E0A903EDD83A0FD79E7195BF1EB6F134DD7F5234E3BED1E5F9416178DF4ACBC0582862C04F35630C0B4168CD074EB302B23F3836209DE6DA6C511B9BFA649DC0DAAAC86D5782D4DE9732E88C3D23863BC9200B65C8B37729219E89BFF6EE57376F7CAB64B05C9DB619571038F3C633C423F027BFD26F44CBA10E0F4A654E21522008E9613F0A007FA806EC301DAD204945550CA3125D400077DEEC80FB78D364C3CDBE70C3608D0D68FCEA4B72A009DDFD69B01DCA476258344819C429107453C5487331E81A63D2AAC08560B2A42BE7BB87ACB957ADB3C5BD1013439AC5959D583B6A2C6E1AAB2C24E4A13C65360BD41E80D68BB6A936B7905A4B45A46E87EDF61F5D7077D04E88533A518AE2004393C486B91ED0A85B6A9899F8CFD9A04E86DAE77E83E4CDB55BFAC06BD92905220A7D0941E3DD9C70CB3D821B9782EED336F081C59BC4B444DE469CAF6118AC35C3A2FC90F9E96F011A4EDAA770980C507CDD0FFE11C0C5A593DA4FE1E068C456A8603C07885EB8E0F02A6DF62076FB9347F9A0FB4E43BA8882DA5A14548745171EF09AFEDC75C71B3E981D203A12728831555DCFC78D4FE0C24FF832B2FBF2CA05948F46076463545EC04B56314013C00C6A13068814AE5A82C03D197765CD9C0DADCB4E553E4F262F7D06991030665F84BF8095B83F9733461FCB6153F12C8572A64F4EDEAEC8D31D3D98705B3F8F26A5A1AB7B02BED3BD27589E3A90080A7FD395D6806B1A6D522D68D2A882AF1D4A36308DF508DCF967EE58CB2A70348C9286B2313DABF2701844F1490D3416A86D0D0BA203952644A443A9810C99894204A8FFAFF0876E1A9E26667F0D24220607369BEB98693DCC25DA5CDA3A5BA6EDD1EB1C6134B5E3BE6C7D3DF3327529078DCDCE131535302A08244881C7C2C80B9092DA50C213C469988493D6A002BA521BC24B97323C67FB85C03D85765D4A9F8C5CCE1997E5B99D63BC1C4D51B44424097AF31EC39F7D2DEEC2B7E43184D2B12064445A69C18221CE98725AA69D2938960104393A0FBCA620C6EFCB790672F1E13EF448312C162AB08BA3B23C751F9F65D15798C6B9908B7E4E719C78C870E92903F98CDCC0D37D5B0A3D27B7D7631B951613D65030B0688279BEE7FEE3E5AE7647BC7252455C743614550476A6B40CD6FC460C6322698D8053EA88B3110A25EDF937A57F9308521DC7438A84885B1C98764E40646ACB815949144315D6BD65366DE2124ABBCE9E0FBEFBA20AFAD3B4626941DF268E4567A47FE5B88750239A705D10C344A8F2016B273C9B5F089EF173507E52A63D122D30993B5FC43AB681790159C0535DF00368DC254BDB147A9632A53B1901573E2285E2C9921F8FEC8D78E63BE21EA31B0CACD09C8CE5912AC66B045799340163B8CF9D00591AA8A3700DCCA436B8F01AD9D5DB90E13D82A1AD8FC2B8ECEAA1F0F7A3378047B1DE664220B42EFC7C758D6F16909B670867B20B1EA02FFF50190F48BD1B04D806FF6F67DC17C553A2A71207C5132966D2D7BEBAEA2933904E5E8C075E59419FF4BDD214777BA877C188792945B53871185991087870F23124A148BE8F9E0B5480D210C1BC8FFC900BEE49BE61D47C14C578202E34B61277670D970E35580EB30FFF7CCA5A33ABBFA86A314332081C5643E015672E598DA28196E2926CC74F3B409EF9757EB8BD8E72C95D34D17C3FEB7C8789C2B0C4EF673A22D88F274249506A35F085F2DF4F05DC14E1E9B121BE04070877D9EE538067B4750C0DC335359AE8BB5A8FD695597D64D8E20E2BCAE1C0D60BBD2EBFCF68B24270B4A85E6EA448CBC785DDC4F7B2D3112B483D90CB3FC178297B214833946BF4FB13C180C9C992DEC46518AAC4260DB375F95FB48E7C3470D50FB614A530043980C92EF2D06646764CB3944BA06F51327D4495869F233ABD3E8EA95B70995546C0B87BB6A735B1D22F7F5FD7586831080A28A02898281B50219A162861F32E75395ED55A0C41604C96CD2C0B687B5916624A51D4419805B675EF9184624BA86A31D14F769D4559250A0692508EE330A33CDC73753F1029C67DD8DCD8FC363D3C7F6FC75925C327F4CF5F92BB6D50C940FF8B604611129EA3E1512F7707FC04D99DB33B18149BECC0F863BFD19D75F0D272593A0982A1CAD3077FDDAA71C4516F9E8340440CED43142A31B3FD2AA9932E024CA2C6A5EB36F840722492FA099A6670F534FC95A944AFADCF4878116D2501B1A9DB168C3EBAC804FEDDD0FED4F6861A692B05B4B85EFB7769C519F4B52FCE21E87C5C256C09979F586D2A08895FD8E124C970A2D851F67B72F8D71489A5F8A40613C73A782CA6FFB176E52F549E24FE7A30C1256FA601FC6C8AFDFBB1A153E8C2E18651B26A1EF0FDEBBC4D5E5B15442A486F1159E888B7ADBDC1E6150BAF4AE0E63A2FF736F93DCEE1FE6E83EE201240719ED029A05C34B00374559CE505C50FA16A745B33A8EA4A1C2CB43EB0F8C30F76F71ED757BB26FA840E6656A3D274C2C36417F8CF4C5D7CCD38E4E11DA96EA28BC8488C3F7376D5A31C841A0AD5CFA2DA61E802F241E72B609609742F833B05532CAE368AACAB3F56D5A79EDE654ED4681F567B90B7E1090C1DA9ADDBC198F3BEA999B77800FDB8FC4B29EFDFA1CF6B775B4EF4AD7143CC6AF1B8F1FE905F83FB04182EC2D2F1E07E29F14998EEC26A5F40CE816E21394C36C5EDB76D9765A288FF1DE094FDD61C1434BFEBA58988788F8C892FE114E872D0A9587A854D2F255B38D85B71208AB72DD7F8E3C822691830A0C9309BE85F9F56E5A5CE6054FB7C902E0DD2E0458ED195C54A5358E06DB62438C4B35E9E9469CAFE34184908C7D1C260CF77190D25833DE0E78EB6E6BF90ECE66BB68937E3CCAB7DB88C5E85FD8D1E92527005DB7C7BB5F381292E49447CAD9EB65765917FFC5005F1EE7606983C2F4B1B41CACBE0C319600998D751B45FE1008300E6DEE72C7F63C780F3E1D7F15D575374B7D48CEEBBFFA4F932445BA6A7E50329018266ADE0C4CCEBDA7DF623F3FB5E37FB273FFA35D509D336C427AC5451A5F8A76150E42018A970D240A06D60A64824A13CF1F65B44D4EAE1246E7CD3C24B34B111CAC7B239D249FD3221D04B7AA29708D7BD8F91FFC6468C9B837E3B255F21F2D4BF8439140AE48132AC88E4A546586F4B33826B8AFCFA10B81A8865C4E9060D358C1DF7DEF80FEABFA712BA14A251CDAB924C0FE0E0565B5065D091C7A16FCE5B57F574DED4A96D392E055614091540A33CC8E4EC0FEE79998F439C1A92B7317A9597BCA25220CDFD794DD9D98BE88E825A39149B09D8A7CBF1E40091C485159A7DF28A4D782117B02CAE95F7FEE537C0F09D939B5FB6B1BC81FED04903028088A921D06762837A9362D2E96E077C9B7489C3EF71CBE0425A5C58956BAA89E6CBBFB0B9AC928E032D2C4735CAC3FD43B04BACF331BA0B4155DE329211DF0EFF2AB9A7DAACF1219101C2A736B8B37886300653292163095828FFCDD00D5D635AA25534033EA6075AD0B8475EE6A07B66289EDDDD2C71CE988D5D7BC3B07AEB69C7C4A37305CD8ADCEB950F62BA22DFAB2FD77ED886B558EBA717FB6E7B9F2C3CCBEAF02D4A1EA8D22BAB5DB106BF9D21905D0EEF235354806836F962C1817F0FF8EFB9F6FD6A02404C024AA9484CA3FA09B851489FE07F95DC22CFEF6FA3BC4427CBAC123B2AF9EA11F1CCEBF805B77E78B4D1FBA51F6E07045974D86C160A0BCFC6D94150957DFFC667F9E8E9B922C4AE2138DAA8B07DB8E61CCC33EA73831D0E49CF29D86E843D2992B2D14FFE2B4B0CF99D7AAA633F0BE0BB6AD5EA9399AA90BA23762004CA73D288639DB2D43847B27801323D50584F0C5CA023EC36CF8AA183D2E09EAD7869943ADC5936E3257FEC5D15EE3787C5F8E6F7BAAB57E4661FCE7EBADE1C182F33C5DFA310641AB942F4A304FA72DBA01B3CC1F20EE8F8ABD339E1C72419C977D6A92CCA762F47957EE4F2722C8B1C2C595B8287568394D5F2C86658816C99F197CACE7E62893B50BB4CADD136D4480A0B520F5C618E5B93ABE4442BD50DCF02DC3339373ABB3AC9F5A23D43B3EF4D67A76EE7A03F01D0CB35D1706200F9109FC11671B34F33E69FE7D99D965CA5181E836DC1F46543ADA89F498066B558804FE0570020C005EF7471A3EDF37E0AD0EA9B6A0683F434F1A4E5923390208D0ABF0DEA76863C27E9F2A213959F9971BDD21987AAC635682AD960D43D9B18E042890CB4F1533C27D7A61EA938697032D9036C8123861871BC8DD15306789372A0E2D09B54930A641219F8F3F45D19DDAA5B78D38671C70BB26E64DBAD14F16CD7DB7DC66A005778EB2CCA9AAE1B458FE4972F94D043914B1879A63BFD5E89751C634DDC6778FF1B019B05F025C52BB50C3AC2E63AC685A160C1404235EA0DEF1F82BDAC2FC2EB5C5069BE06EE3BE5D747D0184975222A932DC5521AF1D49AD47F3DE0966E333E1041F5E0C5F952AA5C7C7C11A2A15530E453E0CD47FC0AF2CC25A6402E6FE78CFBA66A0AA4BBDD148E96A6D51C2E595F53FB4593827E58EF8A190589E02377D8320C095B8A5A709294D36C1CE0F2F186795C340ECEF32CF4128E5317912A2EB9F322D20832C8E58EDA2D70329C46195BF55EEA2C3A6A243FBECE35C9AFA832B5FA5FD7D6638501816BE7C58C221D87D2318936F17013910D48AE07494BFD4505B17A8C0072D543149B80F398A67BE0E7E002DC5A1FE792B500280607C4088412E487CC654D218A391F2D031BC7C00CA3C1F9BF803E308EA11BE37BC86C4A89CC967DD5C8B719017453F4EB8533B8BB287BB6F5C205DC5F1CC0BF040B7FB5228F8FD76F8B8274330BD6E9395BCDA9B0791961825ED4D13AFFD0E850EFC3C5098AC4347057E51AE3D2D6528FCAAAA6D2CA1717501B2C5DEBABA9F119F577A4CAEC0FEAF28F64393C850F0552FBEC2FED2FCD40A51A05A827476FEAA7DE3D9ED1FABC4037A111B1DEC2E1DA0A36BEDBD042BF51DB277253536A6729A72F1120F96CF4B90D08F0E017FF7027358FCCA893C4BCFE27B3115F6B23C0F8AD6C75FAA82446C813221110D22D41D713B05400E8EDB06FDD7B0BFA4B4A66424892C85FCE2294240806045EDF1AAEF6F36DB76417CD2EE3E6A450F507725E51D7BD37F317F516421288C5173E2D51682B647CAC797496C7B9763240982BEBB3981984BFC26D079A614CE7D8895232EA1466D6E0EA1CFAA5611B256ABA3EF9B8AC6CDE26C401E6EA1FB7E3C208DB81EFD669DD93BC49FAD0A5F81EA272A6F9DAF4D106C9E7FCC708C7989397BAE9A45E80A101A04D3D437D975C91FC7A74D9CA9DEE888354D989C527370969D33805FB0A5DEA08F0991A625DE490D77F131389129240DA83401C7A64BADB95C8098BA3537A08B2C07C869DA7B676145E2C60C56ABD849E3E74B6A5008195D13A66EFD1343A6BD931AD049F818A1031A3DD250042CF89B3D74E8CAC12E7462800123109F2FC3610F0534FF743708693F2643B16B6994E5CB38A4658F2425D4F9EDDEFCB2F14F1B1948EE4CF764204C1A045255327D9CC8FC7DD2AB1C36F5491096223F3D793E0445BC2E03203C3E04975D3680A64A957A8DDE7E4332FD70860CCEBF2F04E55B86FD87612498A65A354004486D4D5C71291AFEEFA016FB87E15FE3AA1EAEE70AA9673B036611772ED0853FC78D084948F30BF7D59BB1AB67C297F6B85EBC9C5EDE0ACB42CE7150A7A90BEC1510B7280FE1A68561C31F0AA123BEF086CBD4090A12082442C98C4F1B5ADE7145041C06E074C6CD70F6054DAE8B4B6E71294C3C6D46E6840E0BC543C51277C506296E12F42508736DB8D016E46EC46FD7FAD2F5051CAB223F4A6C645A8AF6F9D34CAC821FA8455E53591883C9C9F87D479DACDFD168F654524FE800BBF0A2B6632197143D185C2F38CAAD8372ACF3DDC96C840194FA92358A7C52ED6A55E73CE8C65D9E5479597AF345E3D434B028ACB74F991A5F7E6C1A9CA031B92FC7C0BB4AA6D76643578DDA71F225B3435D2E2D1B213ABE7EA96F7EDB9771A019E88DBFB0FAF30A56C0A3DAF83FF52BA2ECC408522C1E4FADA1096434F7E7B3332E90A57E01F4158BB18B9E6EAE3C4F45F224739187EF97DDDFF314DF1764E0B675C17221C7D3892D73CE99FF6C65D6DC09101A38A280CDE6EDAD02CFDA92E2CB0C0CB8C7CFD1ED2AB5385B21197AE4AE67163271AFA9FD361ABF6C4797C6063365EC82C87DF60C843EEC03A6126E5A189E572AE4742B8FF7447659452AEC8C1DC217488492E1BF78A406C90D4056DC0E8147B2630A4BC17025359D14521573CC78BA3CF25330D0D20FC0E52F01B4E996D5E496ABB492ECA9B6A030808A7381235CDB71BB68306B5B23F5FA48E103AE176CDB1A6E516CE6219994CF4A4CC986AFD504CC0D7E4FB5128E21E5E3AD6F8A9AE0FBCD8BEDDE140305AE46468D98BB7F6D25794BF8C3907DFD3B074BFD268079CBA9E2E29F0D50B6E0AF5FE6B35A3E855FA1A7F771B7BE64204ED319615CE57AD59A6A770FC5DFA625C10E3FC69809F7A8C264258AE920EDC2BEFBEE086866FB847D4BAAE950E15A6E4FF4445D3080E6967CE3679214D05D3CCD660969CD65C8F3A301238ECC126A529E4C1FFB8B7E91655A316C6BBE20F90F4CDDFFD4E7138632807CFA8B8FA4A6A2061595E42DD5989FF59ABE3D7C6FBB1B392CA1BB2DD208A15CD95F2A7AA0800DA0E0914989A9A85308E1B77C225B348C12CC4C96B727E7F8F4857582F1CED7CA9142F9736D98D7EBE85AD7361FDFDF1C11EB2F464915C5A745F3CFAD851E3F291838C43F22F9911E75B2FE1A22B4CCD111EEC8F8068D4B34416AFBFF72C50E63B40968F010CD542804C92B4670408F3C9D8C22F8AB00C1D72D6A57B54A8C57DC4A0AEC021171182A21502FAAB4AE6E2807375D266DC87163A584F0EFD63FA17AF7ED3F4CD17B0EF70F464C44BDF51664E369B3F2266EF4802E6C3BE3B9812C85F0AA01B44688DC66CF8F5E7E2B3B75AB09C6BE37E64690874E47F59D0864EFA286A90BD0D00330507F5BFCC2F7B50BEFCF0A688439B11A864AC351164886F1C55EB11CBBE217697F6B220D78C8312F005E79E121241CB0C35239023EAD90EBB901E4DF780FB367F63C250358006F3613902040F29807FD87C9E7DCD98C9606199C3E3F9E195C866FD32019C58338FC9DE33E09A0DE786D1BFE103BDC4918EFD34301860B945DE7962E395EDA8A03699CBFED496B281848F0C88513B602DCD0D111A31C1072D6A1943ED455860BDE1CF58524221D8CECC2C8ACF9B801B329FA81758A81DF32B3516D11DE0C111306D8B2C27F570F7F1B465B3D0236320724DB01BBD480328282DF5CDE0EA014A11A17B51E1C5CFA546F32792B4AA66E17E6B1851462C55D10432FB199588288F753243A5E5F3A7FCD91E119E6E3E421BFFB16341A9CF18F908C5D70596972225E704AB5A8A5CE7F02E117190CC4FA74D5D95E207831BC03ABCC545B0F9A2D79BFFE1881F4FBFED7C72522D4A41508490341652E178BB2A3AB1D2452BCFA1C0A898561B683485222BF19B082FBF981879D0F03F5A7E90F2D1AD19A77A477BAAF55BDA7D366B082F7EDFE9E3610F7FA1490443595F4323A7A00C0AAEEAE7D1AAD00C74042C091CF6B45EA45BA60A8233078223B0C84AC4CE15ED53DD215AF27748D8F79700759F07B7951AFD78E0A4E38D5AF04470FEDA90C3DB810D18EDBDB974F6C7749FC0770FB5102EA0F2F677038259EC6F8CA909CBA51F14184570DAB49C03B29255D8D4A62B7086B3618AF67C0FE7F0C5434AC16E684041E2F7E22E48950ABD7522274D7E775DA822206B4929275F8E330E22B6B025CE26FD70B405552A5EC8B8BFB05EFA7B97A6FEFB508CCD77D4242456F95CB4F093FCEBAE8E2A4695B7CAD0332ACB9D57881EAC59479D0AE49000999752416D630B0D3AD526DCD6DFF5C9E0F5DBEC5E4978A6D720DF6664A5680B749DBF4111992BA8223864625427F746BE03AB6AF9061F0ED195D6205931FA4ED29E1C2703C6CBF9D009678A75B8AE4C61F96C841B98E29C217B794696F6F07DEADDA750C899ADFDC625B3D8935B73117F50C8799DE603D506D17C9A0E6500CE83B56D2D4ACD9AB0F953EBCE1FD589AE01BC77F955FFDB102CC47FC83F7FDCE3EC30C2D5902F8D18275192FC90981C2EFF131B39F87624EC3345E614D519585A11A415C8C69AC6C1737524A4C8D309E869F8E20817DC090C3C1914F9C7D2D74AA873AA5DF8F41E2F9C7DEB3BCC53C74EBF1856A5A29D1B9047781954D057BF03C64206F1D250508A09E1C7813FD1FFB9EA48AEB1F741F26AB59468A96CEE07801047537189850245593092C4A65DD9B0F535ED46849589478C60EC189F8364054FEBE7EC54DE9818A5B9E272B6EBBCFACA03DFA1C452D5FC24311CD79A549A44671CB1F8EC41723524A21B4019FE46DA9F2C149CFF9AA41E67518D8F05F87CF4948196CEA8D2CDA6B4DA847B45208BB443C4D248433B90A95A74D2D66C4D187B87A89FD45BE12BA318E44F0DF8FD8FABF52CBE2A462D07C851024998EC19CF3B76FB5FCBEA9E84979567794AD629DC254DD359C4CDC2D2ECF64BEC5EB99ACFE27ED6368AF9672C26A94421049B0AE6A83A9AD4A0C702C4D2B002F4022C6637EC014EA62C0A4CEA33EB0BD2EA9EC6BC7138EEE2CC7EB5EB8075BA3704410D764E3BE51AC9AFAC00A21874C644543824994F3441C11D9A8246080EFEC2140612D97B55DC5172809ADAB8F6FBC587699A5116ACCF513F90AE432952A56D5F6BE2A06E52C6AC04D1ABDAD62EDCE461E694CF2D18B49C267F286394D62D14D87ECD109C8C301F774E3BFEA3F9EC8232C8ADA04EA295BFDB36754459A9823D46F81ECD2DB05C6162DB4ED61CE4FE2255FE4BFBFABACD6193ABC25A461019F499A59734DF465D113C91C46814A6E4F4946341FEF5C9FB11B076E8332AF270A8AF625CD5476897A0C2AC109063838AB07FF80D613D6913F6D7BABAD974EE4C554DA4BC9627C05D383398F6B9734F8D9621BDC052A7E42024363FAE4D2FE4B6201D7ED7DBA5CE18853977B54706286C96A70C5F8CE60867C44F6D78066000C486699071C6603AB0C7D5B37DC6B4EACCE0ED3F7C34B32BCDED2D7AE1305B003A107CCFC8C609A4A419642540AE49AC1981338A0781E0B6604806E268EE626F696EED616FFC3DA8F9A56DE0EDE8E3680D04A6B3F02403400BF355F064E73E80BA791B1E3A6AE7B2AD262ED0E4918685A41AB5BC4EE6D22DC967626DCAF0AD27923B5E5007A04BC05BD22FD4B1EBEEA39F6CF2E48EF8E73CBB1B8E48E71C61B4C7EFDBF756277C1BAC00A4C51B35A67C60773403F54A85F0A29E9BFA007C0191A7FAF41F7B629B9B73F59639BBA871DE3754786FD962DA60AEBEE960433BB4C95AB8DE0DCCA9B09D8482203ACA7949A7A2D37450663BA5D023F34542214D667316A359FCAC8CBB9F2F1D74A19272A2C5EDEA42132F0980B001CC8E8B2F06F41C4A5D884BCD5DFC67461D47C1F16BB3181DD49867586DCABB9270C20480AA29D805CBFFE02B8083D3E9284C9A72C9B746D411BB3493A3CB57181076A671440DC84878258DBA5B00A559579FA9BF3381F9679F5E4BFCF5465718C389808DDA086E05C5C75B3296808AAAA81DD876A3208A07201107B400F68405145795FD28B11AC76550A3ED28A00955C63C1E2E1B13ADE957F0F5136A010B1674F4A1790E032A35A6EDD4C2554E23977802649BFCA536AF4FC4A009539B66F2660B445E6D968C1FE367A48A1E657D1F09085C160E013E035AEAAC0AF4DFAEBD6BB17B9534F34F97FD2AFADE36C8DA19D05F1D4023A60D05C07CF7ECA9760D3B96E3694F97ECBBAA0852DB15852BCA16EC95860AC7E5B1768EE3480EF933D3CACA1C5E4C986FCBF207A09F68CB8C75662F54E842AC3750C8D83E5DD0C041A9A1AD8F6CC7185FADF22B61EB83F64EA447DDDAA4BE9C2C29AF42DB51DC791875324045D82F0D0A975A332A30187B9057229D6BDE875E3CA0C4788040251021651742DB3D36A76DD9E8318865E3937B634EB90D203EECC36C14282A781BAD530E1625EC36A30DF9432E96E7582E34FD0E661209C9C6D1724C769D2942CD0527E1F1C967DEB50302ACFAB7288DFEC1D40E3BF31E4B3B965C963FBBBFDA89DF45960A535BABC80B25998B16BFE3FB2E2F0FD0BA27015C122004525A75BFE9B58C0856F31A8C55F26CC67C97A588910183FF80F1FCF6B44DB15A8C5A70101C4C5BC1F22CE5F2CBA86BEB940A692BB9575E6DE2656BE774EF87FBA289E525B99C708FDB18F83C3306F5969480EF97A786CFDD581B3F4CDDC24F8F4D4A1F779F328BA65FA99FDBD8E86FC3BFECDA23C70E0274D8492B2E3551C5B1F9C62D1959780BA94B9D145C31CD52D081F1FDFB9BF811A83C27135803081693409F0FC9788B7B102C5EAFABF76905C7E45261DB2C9E784995D10A200F70E6C881DD95695CECAD8FB97BC876A89C302A0FB2E9F1B6B67297BA3C0016DDCBECB0661FF587DF25B75CE95079A7B76F6C66A1D63D98BAD5AD19F0C8A3ADAD9A9A496DE6D208A6B26CC5268B77279893441209711E1188506DDE6B1B151FC3F64852212BDD7FB55D88D7519820CFB29403F2536FF44FEA02C1896EE0211D74ED6E47C6C82814B4420DB3440CFE136368CB3A51CD8FDB4BD736108723089B47CAA0990B3A34C009E74C896D6D1897908399D30D99DDCFB09488633B51036F4D2DD70D98BF314165586002EF75DECA5F5825BCFA64119FD4A252DBB5A2758F8300804D7CEF43ACBD835145C64EB8B17731B116C8FFE3B6D2F23D184C196B180A2C9CA1D0F546894E0570D8200473642FCDA4D36A7472C615C5451EEF72B374A72EB61216892969DDBDCD82E34100BE92F2B8E202A7CCE516379780FD5CAFF871B55D8E38B898E9780FCB150DCA12E50698003C045258865E4F9A6D8D223ED4C5485A56683B4EFAC332987A46F23AAEA37391D47C89A7549F14D8287E6AF106A0804A82045B82FF7B1F03C21043566E5396664FA1232D05B102CEA3FBFEA66547D5005249BDBEC4CB62205BBDFF1A4C0F1A0B4B80F8C184CBA331447D31375B0587082EC74056CA7211BFC5923A82EF4F324385D59EA838B5B9EF68E5AABF3711C42A26A6319153738BC1BADDC952C3F65200AFB08FB73E2F807DE53E52EFCFB65EA4D2D34B1BCC7E4CC698C7664D30788C7FC996B860F9753B73AB8DF79BD53A95FF7DA865A8D9188EA5D0B98DCBAB5395BA6237CD5A15913F807B4319430EC65E521DAFE2FE9226092BE7FC7D936AAF53D0ED1623961A93B3096DAEAFF2E528B1397251B9830C01F1B607506FD3CAD8C1D187B15146F35236DE72C5832EACFEE032D8DA345AF7B22FD7DE77C08F1AA5AF3D9227F80BC936468407AEE39821CFE85EAD631F841FE1623A6F0CBDD03554A4AF462C4E34A09184554CA8B40486356B9D56FCAD6FD65A2B75AA5E3140FF29B3EA6EAE8C9D175928CA4EAE5ED133A4D799DA071EC0B0316534FCED38EB222DF794FB04C206617BF68428ECA8418B5A67D50F0A4A3275165A2C84AC7BDC0A0939FADBA202B186C65002BEBC641482F15E68FB6C36433684E825A2C0253865DD3314BEC3021D260DBD2D0C412BAF83870042E8F5D32924D486F92B5CF9A59199D4971540DE1C7058BAF9936DA5A906DFDFE98F8BF376189C8145EDDA99A2BBB500ACF0460E4CAA9C12B9D09A49A33D05969015EACA6133907DA6579A852C75019A2B723E094EB8ED11FE7ED800FBA38A5AB1D95EE9DE967A79AC95C19065567386B10556C09AFA3BC37204709A6EC9240943425C2CA4841842216F56FDAB29BB413874FED9847A24BF8E3F9486BC17829F423C4E3458E5B470AF8289ABB9E1222A11FCC2351C28B0A1F773B3D31FF700870D8E784C4B200A524DA313B8AD9DE8714F5AC19D51B1972CFCF5B4B90C34539DA523751F48F779375763B9A8A1B0C9069E30B4A9EFBDFF2DC4DDE7C05BE7DD68329D12747DBFB61A0EE8350FAD551081B582D4BC0400BD0380AE1FD84031AE5AB6BFE9FFC749523E49DB014D74462ACE61B08447BC3B3360CA2AB0B62F490C609AD9823F51316E8051DCBA13F09A96809DC6573295A76BAB1CDECB04471EDF9C3521E35B8BEF259D2EA9626766229121056134E2F9602C2EAEE49A1A562EB161FFF234FFEAD834231F2ECC70EE7A4E989821DB6713A5DF4392C0BE4230A392250BCA0F45E93340C9D9A168C8A27F50DFF1AE900BAACB40058F027037D1D8C087C8DAF699B49B4A887D01267ED6457736C1023A52023F4A28A57625FD061319295EEB9942CFEE453B7CA2465EAFF413490D4919C53A977553F10ADC47E0AE7B12A2DDD1007F66BF4CC970FAD9CAB6C46252747F0AD7F606DD2FD330608B236D647BA98B70E5F24DC60C8D616EF4DDA1843F9F3573E220353E9093EC726E113AFCB31315F2139BC581A469189698A1B3FD817B3CF8DDCB49D57C293F8EAA8989FE551899C407123978AA263677B3940603CB071FF6BE3A17854C24F95621D5472D89454851456468C82F2ECCD335CCA73F3060A7D6F79DE3C4F02DE10F8F6C2B27BF8CB57F20855D77B8DDE5E4A99607C3B84AA4F04A4F3F0D02C4F2497DA8645BA10BB1DA0BF71033789CE3F791ECACE72BB0C5570B26E65367BEEE072B13CE383E9B189D3190D318AAD16AF539E8340DC24E4CA75EED435FAB55F55049DE3B5D7B308DB8CFDEDF0B45D8D486A3452273856FA0D05311EE269C75A087A73BEDF4448F5B92B61802EB9A5F070F2B5944015C0ED15FA39A4A45CC6263D6902CBD963259BCE6E9C833422BBFE0208D9D328BA349F502F27FC78F77A1CBA0290D1BEF552AF63D1A45832CB9523F47B03C096DA7851A39C7FD4C41840BC3B1CCE03334B38E70EE29057C588A487422C8AACFF453B0E64114A3B5AA33F8DBA7D0512A583FA26F947D2CDDF5EDE1B50D7955D6D909E3B043BCD0B691B59A41439A35BB167C906B053DE50BF74C7778B63F0AC98329D0DD6F782E7FB1D3046E25BC57064136DD489AECBD6AE58E2168AC949F3DC45963B4341B5B4D0B89E7D563482A8BB8962070B20479F5812C25ABFBFD69AE7E9FC8569245123ECAD2803AABD335F0A62542DC26617B831B43C60CE93D0335B7BA3D14706B4FDC873202C3C809007F72F540A06EEF6D79E83A303D4A1B7D33A5619BB6BCA9F0C8471B7C342DCE5A03BF22DE2DDC092A990A2CAACF458D00E376FA07CB2C5AACCC546D63F4E10294903F539242CE5C07B8CC9346460F87305750431983B6A88A3C128109088329004EC2E190A6EBF3AEDD1269CF9021CF586B0D60187CDC0E32D00B8F21BE02AC008F67CE8F35105A0053D8F8E3C5F893DAF433C2B006082032B6E026B9F03072702576981A133801775CF9B54C0FB53A02E07F0FFBD55B9889F67D16F65F1DFEFF717311C807CBF23FDFE45EEFC7FCD64564689A45FDBC75EC5BAC793FA28A62E34AF3515945647AD8BDEF376E902DEAAAB8AFE68FEF3AE1C034AA8207271928B13414D2BCACB23FEA9FEDFB3B6E427A69ACCF4175AE95C61218E485CD3FA274B728BD2CB4D30F1379D40D45B30F06AFA90B197C580800191DF9A19684D72CCBBA13D75AE1F90F07F8CE17E219795746DBEAC5B306EDF4E662098236ED891686DC8D00D67190401D258AA5A7F75014DDB6928A84A972BAB0B4EE8F839A6D91427ED0ADFA65CF95280A25B631A50E4B5448A763FD313165FCBEED4A4446E9034C8DBF463D87D17BBA12E08C1CC5423B4818316C05A7634C7277694074780D0A23E02EE8496E9F4EA5F36C223AC1DFCFCE3B7EB7F7FFF6586D36F308175814B406132A7E4AEE8111180291F5FB6C51A9E04F5CD3F39B300578B0CBDFB850B4E1A46264FFB9AA56649BCC02E142C930FA394BD75250A2F6E8E8B8B6971BBFED33EBDB55A716CAE7998ED977F6BC3A04BFDDA53D4B1425AE3B17C4588ACD660E494A7A6BC2936F4752E7A27B7F1106D9CCD2B1681B1945BF42FF0037E18CA8169DCC35109FB8431AD8E891819322DE60B2B3C7165E2D8E2E4955B610E61F4FF6DBCC4CD9A5802003839A4A9297E859D564F83CDE4676352D371FBB358F29F96A48A6D96B4EAAD4AD36F439E5C8A5B35824B7F91CD4CFA6DE39501B0E465DF40066AFDA78BBCE98DA0C0C88AFF13F52E3D26AE8A6D62B5E071D7CF1A31CB5BD5B9D09FFB7B464F76B18B62A4D47444D9AAB028874640B00DCCDA67C15B8751126DDAE60992BA860A02C646DD805D6CD02A2B8B043F6375F6FACAF0C34270D5A4151BACBB07E6B1183C62957DFF9B766490BB862AA5B90F1FA4359A3BD51444E12D5B936964AEFD61FC76236955280A114439E642A36702D03EEC14CF2D0643DDB8E2197B543A42885628EF9CC0DBB02580A2DE09AA25D4737457927181844BCBF5E41424EB1791BE12C3677370FD2F9311DE90F9ABA1828199EF44FA22A5E3D11C0E138B5DE4FF9F72F771723AF97E30AA1072E37625B6FE027D6D85FF3E805D4589A319A0E0D166D066890316AA3650FC79C4D7CEF65D53863A909AF72B3E0D0CE608692BCC7686488A7E7B8D398647E9365A8231B13C5DA990800BD2008DD0F0518F24612FB1D71D0B066524EA6D1A159F57512BF5C3BE8B844F374AE6902ED0AEA2BEFB91696AF3DDAA72E818C97D04E743D88AAF5EF8A2764641E13ECA2400A098F5C58D8808A9657C4C6CADAC3D91D521A1995C311C3D91E4B666D2B82EC589801C88A0CBBD0A7B13E2A512CABDBC60198FA6E36EDD7DC56DA7A084708544EEDFE2B00B4ED1B066AB8032DF9409EDDE2236299C36309F7B99CF23F768F02F7E287F5455F35478C52859E4B2B7FD13A3529C06A655FFD38F0045FE11A3AADB5FDED69EABBF323A008688F97D9BB4A4B775613DF7302012AA444EE94B0A2BC01078715D092C6342A89CB2CAA43B7B2BBD2802ED5E7DBBC6C7D7A89014F8DA1EC864D9263CA1981CF7951E8094C3C92F2E60CCFDEDEF4B07C7CF48D3787D759720D17DD37DE60B4116690BA70F2C63EE02DA9319C71E73BAEB0A613D142085C4256E7EE369716F4CD35B38B75A4DB0E2C477412ABBE20E071187170145B1061205036B150543E9C78D308E2414B5DE296BBB9527A1B050B16BD7451D8C37E0D6A51CBF29EA4848A0C472B09F6074776764C5ACE83B8DF4BD9A15D4D94E9C856FCC7BE953FC88535EAE9FBD9768477A713AE8A32ACB7F5B2540FCAFF88E51F21CEA2CB0BE5F012726C67CDA680879F63F9B3F6742E4513AF049038F5AACA6199B941321BD982A324A959499EAB0AB89F41E099218724ECB0673046B3F7421592C8F7ABA496773DF8B1299CF23796781E13BCA3AD5955D198A228DF2452AF18F66565D1603A5E00A90BE17A72C0B196A3711941C7C99229CA68CD5AB425CB873B5C52F5336ACD7F45B0C78E39027AF0A3D38BFDA1F0A069EAA654C9265CB96459E736A30E9ACD1D884DE1BC9EA4CDEA5A47E28F42543F0826C25FB6AC133A792DC75E28FA9962B396E93535CCCCA6E8D121B231F998A15A561E718BAD8FA2D378560487A35E493D80C49887EAFDCA4EF7CA1F564E0FBC683947ADABA9ACD1140C7CA7885E984D8F745902C832167938A8464FE39D932A89B1EEFD0C4D523676EBA5F530FC779CD2800797CDDB87553A982F87F0CE9997C9233AA70A46E644039BC0C76F64C18FFBE791BA44A08D58B0812BE0470271BE383579FE1C53A51C42B98E856CBDEA5CF7E9F4FA6F749CA7C7302A5B5F95B7DEE40C5A47DEE0752C5A832A6F9AB28E658A0FDB17A19126D3F95415FBA414D9886CF7BD30126DA84487456C1EB0F9963EB914D22BF50EEF470B09C009D617D88841ABEA5FD20B18B31CE4EA9307F98D98770377116042837785C8CAF479B3673F6263D30701BCB7E900B4364185CC1AB0293DE61D4B5D2052230C3F1BE234A7209F2A493E2940222CBD9B7DD887862457FC46B4F765C12F6770F26450D6BBFC30D453348783C6F82F75FAA92AFF2B00ED5840419BFF3B6770524A16889887F34B277A33EA6F261925A98B40A16ADAD9092DA9122B9A98947A47B89EDC51A7F62485A3814F4C46095CDCFFBE0309462D4835AC10F74ACA31BB3C101247B30778DF56B79F7F301F3F6FDFA6C8434F34452D09C0A06FDECFAA3AF6350AE157856C9D98124EB484989EE48073FC59ACCAA4145AC7058622B8192C724E22F332956DFA6BD4CEC3980FA5C85904CD497851386073B0F9F6151200CF8655418438F55949B73EF200CD897856EBAF8ED6EFAE6B0D2E410B12283621E3D8E544BF50741DE4A9382E37D5160933F0401F28F7FBAF28D79839470A982B27D3E5CF6F1C9BC298629A287E4E3D3FD0B79B10A94687B41F53DEBE573BB7B7E1B4B82F98E657B13C1FC980F0EBF53F1DFF8538439E06E28E03276965C9C182ECAF6C09C9EE8826D69A421619D046A2F68FC90ECA6A4795AF98437E5E2D61C5C6EAA5558C0FF3BB7A2EBE52DA415F3C9253803E41AC82B548DBC9D1919F441AEE16EC4C3ACCF993F5531A4126C9399FEF69DF19D1873183A61E9D13D8CC76AA4B47ABEDACE3517065006543FF22DC1FCBE97E03BF02A3CA0737C61C8D1639D27F21A2261AB6784A05C1D2C6CED4A014E24C00EA674D37E924E3780B87183CF43CD79D9857E0881F3B77FEC65385814B05024FF9E6C3C9F9FFC30DD7AA504F3339858E6E83F8EEF1D0AEEB6361870E816A84F3851729564AA59DD1A46A2AED05D1629AB5E9E83522954EC9A6827924197D105F60C885B94FB502AF22B285C8F6CBEE3465A4D274100B127460C8E9A9B70ED6233203E81023C2EC02FEFC2B12841BB085D221062099336C14207E21016CDC14FD91BABF694C026D34ABB9FB04F9BA9CFDD5694253097AF0E4E6AFE7C59EB91A08D791FD7E1D0250F51EE4DAF705906DEB37AF7E4050F5D5C7C45F6DCC2CFF2A130463F7E6AA1D8BAA12402B49EAE842D140D8C3DA72C9B465968C8ECD836FF012935B0860A3FB35628609BC4B3C6304D2528C36A7E5F962518CFB7CEBB233DD8D6766702793AD00B160E710ACBE4EBBF314BD5B9F010DE0F0A9EA6FAF4D22DDC6B0F963FBECD19A533746AE7D3F01346003F06655CD4BDBE8D451EAEBD73E6C4CDBA19933EA1EF275B44AF4ACF7B95AB594B759D274C88408F276738D96E5DA7131529DB6BF37EACDA90B539232EDACD9F46D5940F9F7849F8E6F7CB64388BDDE913FFD9EBC038A082BBB87DD15F98B9BCFE70F9DD06555EAE56D4A3AE00DA2729C1D6DAACA6CE78F79E17020B47392C9D69AA04F8F48FC58EDE6B052A91F390919C9EEA61EE30906EAC2A8EFAF21A9108D240BFEC316369E42F158638371CD0DCC4123520F147BFAD477BBDBDDF281BE88C0253A48758C1175117B3D2CC893DEE4E265EEA19254D22B37F2684A6E742D1D90CE8060D82E58D76A4A11DE8A7AB54817237BB4551A026F00A42D68A0CAD0EEABB839172858D405172B78713FF96AD1D4CB3FA57BA21FDD2289471EDECFFB71912C9F74EAD42160E3DAEFE3C0FDF978D0658ED978E821764712267040DFCDF5F24E9C6020A2D54CDA48B8D9DC718893928B956741145A44C042D353E952CFA7013571EF169B7A9CD7909E17AF1A98279BA3FCF19A8102DD7E9BCD5D940F9B0A703EE6F579D2A1BE39A4911FB2E2F30DF06F4434743ED5D8DE1A055500623C354DDB7040A14BF237F8D7E10EEE0A571FBFD87C25E56705B879AA5519E5DC11E252BB61B3C5E40A99086460F958E493A607576EAEE1712E974D0A9E25DCD1F14790C564DFCD3E7187F7CC1A4BA99131B645E8D40A3925A06A768505199F4BA238678122F14FFDD18EE0FC3B6CE48995BC1F1C32312C0B2997E031260C810461569A32BC10FCF4458614CD7A95F724B62F9BE2AE554F3EBEFF67B7581D9EA3B0FF837633F62435C7E3CA5F74FFA686DFD71B1B2F9C7B18E8DD8780E189552139B6A1488DD98C82500F95073A037CC45198687027A949DC7E0BCD33D83987714795F8AFF28469AE2C3203F056C0FFE7A4FF32253EDABCC3608927A6F766A3D5A7DDD87E618954DF9AEF187A463F35185A44E758BEB12C2DB31195A8A5A8DD6FEE32F4274B7D4AD59A611E01EE9011E15DFD30DDEC892213A8EB58AC42F8404BF407E636D9F4A25FC2D8F3FC158D3547FD8A21C85AA7CD42E0A6139C2ED23F22F739035D2C4F03050B4546E89A89670757801A7125445D69FBFBA62EECD35731329D274FAA320002FCCC29161FDAB46CC2151D6F1D8FD8B0644541B8B72F9620A7142F29B8BA3D082FFDA0B2C5D40CD735BBA1623DD28F774E40D7450A41E8269B47481D1BC8765615CAF66EDE28A475298FBF26125C590E3EF16DE94122151447EE314DBDFF3A63AD5D6A23CF491F10BCD8DBE33FD8A9DBDC1895D6130DE187817584D79017453421E314F479CD3A48DCA9E2A5E4C6C63235FC65C2F022AAF446AA7C69152029B87A5F008BCDFC9FA8A44EFE863173C22C176C6F7B2330AA0164BC0F6DE7F20537415A92DEFE2E23345B602EE5042437EC67A8D85EE416B8AD504774239F98CD0D119BBB21E02FB890068594669264C8986F3328B315DC3F28EEFE4C023C4672A08791BBE6727F3B176A16FB85D6FD49B89234662A2A510EBB015B1542FF2AD65F4E8FFF7E74B0F0993942EDC5350C348DC6BB546021B1B6969B6CFB6C5E9F58A1975E8CE1C7DCF299AD6BA9D3B6622985703A480E93A643168AE93803217B63F6A34F3B0ECE62BD27DCC0BD0750A9E28E9BFCD8BAE1A0EA25275D0173C0E1AF23DD9F4B726435E9DEF24A0D8CE19A2F8248C7C19ADE17B86731F95A912DFAEA229AF097F2393EC29A04B76B57E270C642EF373103E3E9900CD2B1FE7BB2F251BE66426D8C88B22AAF0C894A7398CD366DCB4F2C4D832458D76271E5DCF3F2119F4C7A0382C2A02BDBEA5B1E4FBCF69FC8C9F8DF9DCFCAB4E5D464BA87A0F8AE504E26422DAD28210E88F71FB384009B5B34EEA9DF9199BCA60D468C3F780E70CEB2D51EB7909A5ED5D313377C4DD2BC04574D188B8113765EEFD3A1A7C4527333AC1823F22AFF7D7A836104A869A3E354589CA9B600E8BD12A01BA7194FFF47516C236AC47CE708071889FFC0F0659C767D132AA2E106B2EF0FD09732B9EC055F57D699665C77915090D846E73C50CB40CD0220A8050001169EFBD29EC6CBD12A3A7F63A43F275ACDAF575BD786A88DA8DF678767368669FCE9F4804E2A77C304B6E8A87469670E5881608090CCD7B2CABFE6BE1FA85659D1353AD230500C7DBD95704854311BFA7534FAAAD59FC22228BC8DD77E79188D24981536C3B0264F09EF5E66207B6831C9CD665B991C3E7266777818239BCD24DE96BD00235FAE3EC450F6C0228CB76A22277F1A72601BBFEBF989F8B353B8A7550F22E4FC5D8006D21F4DF47BFB3C5C51DFCF408B07C2719FCB75D95218C650DAB6DB2272894DE324EC63D180C344EF90AA47E28B5B47341BB86B9EAA6844D082E7D46F216D20CD26242FC079B04427338D81CF81DD1AA5BBFBABE297B31AA4B6B61CF55DFB6916F4B4372FDB6E73E8ADD3880ACFD61B6C174C4F53A94400084D8DF92AD2DF54E28108AEFE4551E0401DE155A98E2489AD4F2DA0EF4C39C4B2A024629F5720A8E35E6986DD0E8A18CE800C1DC8BFCCB686CBDD5AB53B5E1A5C84F8D16FEB586544F44539514F334824A8774817DBFD09C8E6764FE5D62DC622ADE70432BFFCE5745E57D04CD3FE37BE710DEAFB9632CA6394E38810170149000C2F89C210AC879858AA7EDA7B2EE3813E01E67705A1AFD6013C57CEB767C24E10A5AA6A7DF0C34CC9C8063486BC921F060E8162D58F46C7EC92998084882E99CE3A4584DA65DAD2086BDFB86FE43FE69A97105AA60A9B6FC39222D38B3765754CDB9C5E176139C846EBEDF8C07007722B006E00C4DC6F7FD21CCC477201365B84A82A96E331841B0B1204746BD044BA856D303DEAF46D33990447BE0FF6C123E45C9B98BF6D3FA9E0F11FC957A82A617CEE3661718AB78C564AF4F36EB62414D7AC9AC540D99095E7D433B03D7398DAE35034926ECA46E322BE13D4192EC5F014EF04DD05825EDE7A44B3BD2DB5006E9FF564D6C1682BAF50013C52A435521C483B71824C1FBFC8A81C703DB9E2A00EC3FBA136A92BD5B77E622D5A930F5E5D5BC53D6ECF74C21AFC07E49124937BA960D64D7627BDD1A6F3E07BE7CAEA47EBDDB62F2DC5990456C75B0D6888212B4C7D363E83E18A8BF6572CCA8061F4669537370929A58A14CE40F343B9093F9FB1A0AD5FDFCFB7CC9E7400AFC65E87047F51F5EA27D3FB341D313DAD0A02DBAF33209CF1DED0EC3FC358DF98C41A0A43E11C22CA810C7024259A27E5939DF9CC6DFECA26B5500579BB1D8A01639090507CD07B75A89E941C220A6593D16D7F765D374FAE27D2DF869709271A5559F70AC92167BB70B8913037D36267E00740840A03800C124449A9A1209E1C208B817AB63EB7FC252B81EE2BD4946B9A6494ED3C6354DAE839BD6FBE2DADE79B01201D039119D52E450C140A1442C35CF248D53029F60B5D2315D519F24B058765A43E9C048925A7B296D7FD80E65A35056CEF9A3AB560135974DEF97DD617072C1FBD175FCE9FF434C3412237605A855B63C00E0FE79B74FD5F37250692CFDA354A3C5D944282110BFC6633A21739BB64A2994D71D28199A6AE475F3F63476A6AA8D4DEB7E7B211A6EF2456EE926CE188571EF2160ABDDF25B0D89FE274FA8864080E22DE5305CE67CFE2FD9D2E0D62E0ABD95BD707560878A9068A69E9C11D4C34FC020BC3FB75112E7C1A2BD131C81956CBFC16456B49FFF04057EBE6C49DD141CBDBBC0DAC727B39BB09E146BEEEA9A1E6E5F8A4A251D08AA0AACF408219C19F0A0ADD0071CCF4AF323C89774AB3EDAF3FF2E95AF9241A1090349ADC20AD45DF48084E48732A40FDD18C63CFE14AC02108D1C2BEF29B561D018832F8CC4C7F0BBF9C419E155938E94CD078C1F221B00D1CC2DB8F07700FA02B16404B00F5126218D160F10BCBC5EC34FD4890DFE8C5A99DADCB1BCBF743B0251FE5A43B98177A0A0A36E37D99FC5B2B6ECDEB69CBBD200E134521D20D2791C161A54C95E98F5F997389FDEA9E27ED7144818BD78424186278724C5503FE89920B6B15FD8F9D8214B6327E5A678A94B87790B8E45DBCBE5A82443A6C60E2C5ADB8EA59DE1D11B9E1376873792FF1EA71D6AA4C28855BC6C64CBB771A9799B82F4DE140A690983FB643000FE2CB84FE1E5EE5CCCFCEC3967BBD279B2587FBC76A589282B5BC7A16E19A720EC5DE70968F9B7A5D4DE89DAF114ECB50C4BF8E6D9FD1C3FE5516B32C524F3ED5CDC385AD798381C44AE3E0F0A2B01240A06161698B1D2E7A4BCDD3AEDF3464416F3527C764D4EC4DB6B02F98D775534703F4919F28A9F86CA975FE1C48C28777CCF2F2919DC503B6C9B30E0A5DAA141013A50D963485EC6E305C6D22DE8861BA87054A7180DC9EDE961C847F9364C6F8FCB5C47E3B53A9249091E9D009C4A34E7DC88DC8044514D480751E163FA4BCEB766576A9EB7B6B88CC8B3473CEC5AEAA66C629E78761C420FE4F40F10A2F92F312E37484112033A3287D94950B5BB2F25AEF5C7E4DBD270E8A5D3D17B27F6AEDF9947571E2EC12A9DEFFACE6BB079F763C8A96CDA068945DA27F7C72BD8B2AA99085A6632F368A9995929ACC09275BB2F90B93E0F4F295D98497D113E327CF72D01C2FCBEDBD0857BAA53E99511FE9F07C4245E8A1A444AB2DAF0FC347F42A63D32EA027D04F805EB5E0AB55A386C77C6D12699514B5FA53896E09A0643FF8A99476AEA65428CAAE2FB1B03412F7D1A2F68B472F2BD65D6DFBE97CF45E893B45A81F2305B230CF51BA810C452BBCEBAC484B327970640C919E41AB907AAAE585011BE9D7950029F8144E64927D6AC0F40BE051CA685F83EF33B78EFD5AFC501F8A11C78BDF2C6998BB4F4917B10C0C3998FF0209D3A03F87E9798C1DEACBE84685224AF75DB40B20D305AF8F4B41C91A39EDA464FEAC20205A8BAA64909DEB8B5AA1D6113658877EDD251B320175C31EAF22D4A815A87FC3435F34442C42545D5F8520B96DB0D1B32C799723247E6FE92A451708448E0F77CDB0E07272D4C528F412E78AAA5348AFE3EE7EB7C4B1099F92424F7BECC1E9088707AC1B3B72CF790EFA3BB4D343275965BD99921CFFD8122DFA16FC990296C35A50C880C5F389D9BEBD8311D636469BD52FB7BB9805A4C19A74E8235EB8AAB1DCF9486144A29733343B47AEE63CFF056CE34BB331B6864196F252A12F16EC87DA3E70417C5B522B70E1BD093F1BDE3F1CCE8C4FBCF07913A8AF49A96FBF26014BBA4208EBAA5F535DA41F2B6C5C44637863FD0FAB1C1237B892A2C4ACD990E722F74B408447BF8B1361AC825A0ADF0250F3056521AA2481963697FCC32D347BFDDAD3EA7C8C12884B06C9BB9A5505694EC07223ADDB6D3C19F0283090D9195F1873698F4286F803C82DC5E59A5C43FCFB757BFE552A3507C336699163A3CDF638F739109A7B21E0000803407FE81BA84FBD29C6015DB5DBB6010D324C515B73EC8CDFE3465862FC593AB6DF10433FDCE611E93605FE7A57BBFA8C8A59125D46E58F1133BB9641A8756CC94A47A1494AC5DD39FFC030E14571EA19DA320E1AC5EA8AC4CAB2EA66C6776B18D75B7D605015FBEC94E444F1BD9371BE9970D038BEA92C4CAEC575126C3843D7309010209E0428173782E4217F2DB5A19347841F084A6558E99B68EAECC4992202B9DCC20067FD6E94F05D3A14C5932B2E34E84B95804BA85848B1F91CB41DD3CE829B3CBED628EA9CDBAE218A2FA43383ED3859885F2E456547277A0CD017B13C45504571C28688AD25B56A1AB770345BE4C74706E985B419EA9A6E489F048C155A7C3EFBB1364AE652EE6520976C92FC8A2D93E8F3C8A8CEED7487110B543B4D73EFA46BE8C62B5BDD2375348B2FB3528479946A52C1C7ED40B7D5DBEAF0648CA3C1A07D90B173C21FFCBA0EF77FAAF9CA333954D047D24A96153A54E96BAA00B1C0358E54AE274BB84E49EE5039858735EDD48C047CBABFFE2EC10492978029C5EA6B57A82423F0A3C3D2FBB0C064C3BE8011071372480A3AA8214996938114B17EFF245047218E59F2D4EC06558A0FCC3B18975C57E42518B97178FABE0CD9C0C8E6FD0BD9DE5196C1A682B14F32EBA22CE35D61D638B8C5B096EFB0FCBB6C514754D815C80B2419BC28F92E09D4C5451AC774131046E81AF4961F8427E60A6DD3DA4A83653ECF20A155B5A9DC0899185C924B10016FC9B786B766A3B9A02370C4356A661A01FBC685BB29A3026AF12455B4FFBEDDEDE8BD62CDEE2F1E3B9E1585CA435F226C4701BC8E644E54DD0DFFBB0A2AC76B9EBF10C24A999B0B0BE54CF10520E454E8768838E1A47867098F3D6203395309E1B660B24B2CABDC89844D3C72428AF51B82A607D496574DCFCE993EEDE4A4520D6A7516399E00C3564D80B0CBE1188A6601A94FEA29A802437584D4CC0AE581A910DB81A076AC02FDCC9F6533D357B60948CF5F74BD585806B7F6F0C4AB75E310C85ABF4B888EEAD02D4283D90FC356BA0F9D232F1A7C920E5485FE954D00FF4C236D09FBF744C03C56B07C9F1C221F3AD58D0752121686C2384AF0E9031EA26701F4368BB01FFB381FD21CB722CD3BDA8BE344D33A817B357C3D641FA28FBFBD520D0C6FC5FD17E2AFE60CE0C8D0847AE7E8DD1517C28CEB4DBE887EC80B43F5409A619326F48B6BD627DFC580BAFFCF87E07DB7B62CA52D6D8BFD3DF189951EAA0CDA21159F8E866B26F400B11A3CFEA99997FB9A7D18E9CCA5B831FE71B0DEDC9A56B0D0137A5D1135EC085A537F102B692164D6D66161D76FCBC55BE8303176A0803C005203B8EABF67CA0D91846264DD24F6D327C08E05EC4E1C4735B5F4A3EA56F47058728E9114E17CCD68E6F4A1B8633A9A26AB71D90F33D66A336AB26BEE44BF5E119454FA0894FC63DA1677C54A78957AE6C0F72B70BEC3FB03A6EEB80026B6EEBCCA1FA379312A52BD78E09715F61863522ECFC9A1091EF44A11ABF675B7D61A918572746E8F300F12635AEC0E170E1FFBC8195245A316015D581321BCF274CFF034E3135E3563D7A9D7139705212F7069B35FC071F4B9EFC0A2FB950577F36C36A067665557E2FAEF14AC0A17D99F2F68DE6424CADF0AF6C189FDDD5BACEA99B45B40BF60FBD4401AFCDA235107396F05D41E9B45997FAF8982306A20E1C473F5FF1202B6AEDA2CE7022B52CC54D3CCF17F2ABECC885B065BFF281B4F431927A76A07B47A0AC8FF61BD6FCC1A55191A30ADE52885A21F73D4F2A2D5D6079858030237BF25F8FDC992D93042ABCA73799BE6E588C7095CC817354396D576CBDF5AF5D23BE4A8F49F214FEDC8920B067089667C9E86D3A56A22EA978F94075C3C5EA868FC51DFE4AA1493564693E5166FA27DCB27EECD8B25AA9BA5B48E73B469D83E1D7D7CEE9E257462A6605D04E08453F99003B40A2EA5EC79EC5C6EEECDFA26D873990A3251D164B7F567E10DB9591990CA4E8BA0E61C8A91C0FA0DFB0A77E39A9F332D5396A502F1BA583A3051E0CF459FAD622BBAB7DCBFA51A92E1030ACC2187050BFBFBEC422F7F03EB377D78721A03B384DD91C0D3A1EFBAF073D46C8F71004183C44260465A064BC26AAFD6BE30DB1EAB09DBDF05CEF30662C251FF6C15B9B0E7458335FFE7297F0F337996BBCB2DF1F6B5E9253B949BBD8139E9B98D51349341CF3E8107D11E1A1D6C167331730FE3AADCE94B9185DC96F684A7813446BC1A60601BD25E1240701A997B58AE16219959CA2E1662D582A1DE335612A40B2CD6BCF78C482897298AAAA7AC14EFF46C234F267602A01C02A7DD90C9D01DA990C307677A8B9B412255FF8C9F631B2167050B2D0B7FA3E040311D832522D5EF9FA4FED4B76882D026705A9DFB8E37F0D0A79E7CF1686289BAA803E428986A684CC034FF9B2480D1879B98E1EFCAEF36C7717DEC436BBA4E298C39A7B4BC7BB859D769E4B82E171DE368B43BB937F0F4D8D983FCFD075B44BDF5914AD33FEF0B85E31156398D2999819F806D74600AC88207935288F4C52C1AE3ABF32030018349CA0559D551BB4B3E9A36017DBDB20C297FD282A6CE654A0847EC98CCCCA9CCCCB6F599045F9234BF02FD1E6E17762141371911049792552222DAF052E32222B729223B99227F952208502C27362020402D0C0D29B0454434D629507CD24101D30029B6C106A9B148990488982E824D251DE8B93388B8BB8825B12752847722C27722A67722E17722957720D37490CE51E5251A0224FA2012470410032D10102170420133D207041003231000217C44E902480C00501C86AB5ACC0778260804CCC80C00501C8C402085C10804C0200810B0290891510B82076826402EC044E8200646203042E0840264180C00501C8A4102070410032290C085C10804C8201810B0290490820704100B2D28B7FC84800007D57452D404975772E78F38F5C9F508E248361CCD28AE8F3183F6B69DA7895FFAC9CEF5C000023E1CA40F904AA1D48098BEE058502D0182098192434D0C900DE023C20F72F6158A928270552F686C5804520A5804C28DAC3C94416E241DB0014390923C01230078245159815E8C8C0F05EF85868072D0D34E1C55AA984F2108A2150040C956090001331886288E880A22310B10241D250EC7C89D866A118C2EB411C2E51F22CE02FA1272C8443916008FFB514BB6661108A2020B25A42F54F6E3DE47850B2030D14258568D6BF86044044B7DE033ACBE3E875EC899120E3FE53DA83F69ECA9EE11FBD58788ABA8D88467E20432A423AC209FC32D0A6FC3A33C14B9CF6183CEE1243DCE29044AE421D5E971792AE43C50C4466ACB81778834276A28563A1ADF6B9F5EE8223CB62DF339251EC4888661F7D1DC071DEDF3F309AD666B6F11F801B0F1C27ADBD90702CBF1BD3948F0285C2798C7ACA2ED56E94A95C85A3B0F421D6630E30F53D312B0F6D0D4E2EAD2A3B3D01E2C6330C54AAB712ECA38E2AAD930E03627E5A93FAA0042D1A6EA55B4E81D483954B190DBA6570DD793388186D3EDE1A890B65EC0D2EF042F3D7551C95EB282DADF361CE095FF20A6D8865A3FFC1016D6BB5984E2B8445381A32E3FFE0BDE68E22FA263F742A597A447B98844FCF047681AD003800F8E14C24A390009D69FBC6EFD56DA2998000C75154B31041B3E31A554BB8EE3E1E9C4505BCCF8A7312509C6661E24E2AC23E811A9FFF0C5A0DF533D4797A0D1A6C8D285485D27F8F8F85AA4F056DBC488B7E53016090DE92200EAFFC5E16281CD09D0C6EF0B433F7A81556D2CC3C1B05C6EE80770706EB1A0C2E4ABECE0D1607A1DED4C576283E48F9D61520F91AE07972C42F43622298DAC9041A6B171EC6388C784A550BB8CCA07F693EDBBBA11A5AA956D104C00907E4998FA0F13D40E807C0F7403C4F1667DB812E5C15FF32FC9489B397C1C61A0BFCF2F832AA3B5238B84B514F76E922A6B0D9816B175062F2095DB2537AB1ED96322742ED4AC318C14756998F762064C6933DDCFEA7229AF341A8ED105E0D6830A14B9A3B532B4A0F7D4546B0BFE72DCADE6CE012AD291E0137C81F5CF8862879712C661DBD77398BCEF3CE1C429AAF3C3E0A6B778DE375DD2E43616D7FC1FE32B49C6A8D2E1CB821C05AE2EBE8FC1CEB60B84C7EAA56273C2C7FC42D351294BF7662BFC48501DE149C810B618737A3D04E0B9972EEFE03CD4005D423650FFC3C23AAB3855340D2C13A6FC149C5FF6C20FCA5D5E58765241C26B8ECE74EB63760D841555C1B0E559C937BC52080315B51A2F6DC56B56206CE2A6B0B84ADA5F12D66CE26D285E4104B3BC12608F9F2AFC2D2102BBECC17D0D38457F7E6E3FDDA98DF11174FFF1C72BFD82625BDF99FBF7309F285AE907067A73B60A3CB40D9A2007D09E7270703C59C8EBC643C5C049FD16F544FBDADE63BF1DEDC3053B9C1E26CD1B276B8F45281685491606836612A6FAF319C31EA0B856F6E13178A61FF9693463AC4753666DCBBC03CFD7D10FA81F03D18CFE34CD729FB674D204C60639925E6E83F65ECD77CAA6588A7A4E1F4E57CB1DACECA82296C76E0DA05741B8B756CD9A526F9E0032DF1939DAEAA08D6F611CEE3514795EF3825EE578A152E6B902D9E8EF243DC27DFEE3A9F053E21BCEE35BCD29FD50F7EF8803BB446035F5138D7205A003507CA357BF16DF646F7F48DB0CF9CC42D7F8A302633ABEDD6C90C6ADBFBDD0B7790C25028BAFAD110A691CD7AA18480520316A0EF580644E9E26179C3F42967A59CC0A06EAADBFC76952AC102AE5EA4CF5321F09E1FCDADF8E7AA4BA071E0197F8C304653A4E191B1F9B927205BF2CA50B8DFF7F79F8C34BAF0933D1D9A962C24C4EA858A7DEAA5C1EF73BECF5220D16D91EA2F9923272FF62F56288117DD86035AB7737098F3FBE0C753CE8C993F5C0B157EE77DFFF99DF3077251D9CD3954A75F321022252C246B1A744976BF8A87EA771CA1DE16C95440B569C0E063892B83D6AB3E6AB9E4639049F38B3989827D89BE6D47ADF398FBD2D120CA325BC32DA111CC11A0621B749F0AF16150C1ACEEA99727085D1FFD88909767874D0B5036773FE20380FEFA29010ECE97491DF4D1CAAA6AF6499645AD46F2D4B6DFACB52B62E0F5A9945DA082F5CC09B9A3419A8AE5BD4B4CF78ACA874A546C0F15FC9F1AF32E9051628F7A52A94E0ED528E3F43CA0DF0019F94D3FD8FEF2B1C753E08DC8B72B7CB98A7DF66934CA3AF6BBECD1B674D72B013C9665191C4C8F6E42A1ED776D8D180C069210B470D0C3509A8D54D078DBC2F8D6E885C8BCB4828B067796837674EFC43E011D0EEAE56F372485DF03688F4439A2966420BAA35D37763C34CFDD437AAFFB3E5B3DC9001B5790FBEE1CCF68AA638E220777E0DE013433F18CF87D128F33DFC88A91FB67320933A59A6FE955675B3CE45D110847DB2C6BCA2B6599A9688356F39149809887AA9980003FB331A9E58604D71717B45E10B53512611C66D9A33BFE54EDF03F5215281BEE01350CED49798B6E1EB0A34D20A7F69DEAD4427B11370D9969E0815F5BF9815D0A00A08BBB86E06EFD72C9A58E17B2CBEB716E60F4B6E836153D98A3E73616CD02DA7EA5709DE95D4F97F758748E0BF6CC62D3F402B36B04C3DCE5A1900E5473319059440CA80CC24B671B8FAFE36B726F698BB4BECB87EDB902FF24D966F0E14403003AF627C61BBF0176579291756E576352F2BDEBDDBB671EE1A4F50673895BB78F14576D6A6F4D3984F4A2590DFA6FF49B1762206680A9E1F17A6207121E89A8138B76A6A8899E5553D69F921418E74126835B31472A0D460EBEAC6B6CB463B8735F9AEDFF304A54869054A81035B875BEE1A25C703A48C2401544FD356FC4D5DF27532080E0E478F207602B2B8C64CA21FA8DA33530160187F73ADC77924609942DBA8EFB6BC1B65B55870CFB0F7F5B03EB6C3A3842B1A50C9BD5EEE625D5A81D5D25E4175BCDCEA11EA2F4BA8FC05D39FE4CBA368D9182CF64A484BE596677EA4B238946AB8D77E133978081F408DBF129A491C48C5C3E0E0C44F8B780AC7B12226B43FB9DD01FF48923B6D24EE6E945FB5B2CC7D0640B79B525EEFE1F1E22FB11F38B8A221778D3E760C2E82B659741813299876E58E184F2FA5EB7747A9D2A11C5EB32306CD0D659463500310F97F7A180D1DED8E5BAD210E9216306D5DF1B6E278F87F77C530CFE3B2190BFBB21180332E07CE0A5FD917A33DAF054E4537726A929E3E5709696C061234EF0FAFED1974E403364EAF8BE4B4CA53E16EBC858D9A57CB23F2471405053233BFDB03E9C248FD7E1FE2E098FDAE1840D19482E0658E43D33CEF9ACB3A1A8A31B68FD089030C40ED1CD5C54AC833C328A6EDDB4E3B667B1689FA37C8D381ECFFE1D9616D2CCF1200FE0DC2FF483E07D281ECBEE7420C194CFFD2722C3654627A903C17408A908EDC744C3234267BE0E123216901D646AF9F9DDE02148A627985DF9DF0F1F05A653FA62216B2A890E946028A6456242D669C6F33EA0A164FAACE09C918C1EAEA707D45EB52E40F071999FE8842641E71F0831B55E36C231DCCA920AD56E0F42BAFAC4FF3CB35802F7F476EAC7FCDABFFC27B5BD5A41E55A7F48FCCBF67B43084769D1EE13C0CEC2C91484BBEFA8B4038A45CE1AA176CD35E2857D08CAFEBD9D517EDDB25FCD4CC915E29C329E40D566C63C22376574A1902C10632901F68C1CC4195E724ECCF3AB9481BFF27C2F92DF64CED64CC63A7C7A3ED605C28916C27C0E14CD19582CADB053FA305EF72EB8733437D2B7964DDE754806CED89190A57883B1C4CEFFA19A46BD2A09440079724156739359DC18D020003D65422787D18E59B643208381AC4B85AE2FCCF84A6B083A64AA3BCA407066C739FE476E417329245A8870FC14D0D36AD31ECD9F79B3209BCEE389F9C8FF4D8CF007A1182DA6650D571A431686791237F412388D0B1B5CFDF27ED79160608A348DAE093AA10359A7E5B110189B3DD2B232B3E5817FAB24B6FEBE6B7A191B901FA96B168CDE269203530E5286D198C9B48BB9F802C7E09EA74FCA382F4ACDB37315D07F125168E1E8279D7BD2143DD446F7D2CAF7913D5563628FA9D410FBA1F6DC188C32B1DB2F24FF4F4E42367AD4926D4D9F138EF2FA99A9FD12084925299B7E778DEB99668ADF4F8648472E21B1F2FA4C0280989E5D542F589F1BC7111205E98B4AC54FB2AF73BDCAD8305894A6C46F3DCA095D20A2F151C83F3628577DDBB34C169998EE9945DD46132ED14D4D3DF8F4C22D4AF5FF25796C247C46F0F6C35F560828ED4F7437A744DB78946C5476A4D8A285524640508134363B7500FE32DF6F5621E755FA1F72CE16AE2E7497837BAE8E5B0B518A567CA3C793CA3DF4FF10D56845BE9DA9A3250EC47D1FAFCA229567F6CBB8785B0C247D6435436B6E06A8AE4912ED0CDD41AA827A63CFB1130778CE3FF048215AD570BCDD9585A347CD0641802532AF064DE584796D9875A4CDFAC86B7E7E271AB851F9BDD8B93B6BAEF4A38A406F8BB1C3F91E511E0F9A51E78F57289C56D8C9FC33A3E01FDA04F4299A45B4F32EE8E0D7330AC33713CCD3540A44E6645D0AC95269AAA970BC6140EBB7FB2A695F4D773D206787C144F008D3B98EC3884010909041E8892AF84F01BDDA3487038A87288507C00114104346E0E213C03360BA3E6ED6366A5E26CE42B8191760C788D11D3C6E6518742BBE7131EB3A41ABD8A3333E204E2AC7037233E22D8B6781EEC929599A65E641EC11B5EE2A7530EA66C8308276145A2084954F83668AC105F9E4D7292B273C59D524A7E1267C8347FF51770637A20ACEAC5B1B0C06D6778CAB9EBDD4FC517E7843A7A8778C2CDE67FE935673AE76C6AAA4F98299B0036404D5BCB4168F0AA95FAD5DC2E7494F216B4BA9E2C932DE1AFBBA0A818570C68E6F8C8478BDE8006EADCCDFC9492D99951659C7040AC10441BBF08B83DE70AEEDD1D2CD56B27FF30CA7C83A66A1A8451343B1D5E2AC50135AF9135F810E1ED2B117E31A668D08BB13DF487D9FD8A5A98F6E4A73726773B85F4068C3892EF09E5E8C4B9C6DD75075B147CECC1C242DC4FEBEDA7F7D91E373F356825A44AFD3CB4EFEDDA42E27A84719D71AE02EBAA67002F0010730708D83A09222AB9440D8DF665A11B8DF27F0F0B51A7B5C45FEE7AB2239A0E0ABC5EBE3C942C2A4E0F674AB46737726AE9564A1CFED56AF889E9142A470554F6ABE73DE7F7F0FFA46DA943BCCEA163C9DBDDBCD0EB35D8DE5F44509CAECAC7E81F9FBD12EBC5642394FF0FAFB57A67F11D9098DF8797BF78744875F1331CA3D6142D746389861D243A2B74EE9237515F3349EB85AEA4389858A8FAC5B6515C42FB69FBCC563B7F3195EBB9984BECF7E64100BFB8F8C21BCA90D63F152477B371F08B7C10D41A606F2E1DB8B97C26731CE2E1C447EC445661AC01BA7DE0F397BEF00A2979C08CF4DC4A029DBA160FAEBA5DDF1C9E1BC778EC2C40974C327C66AA4B915EAE9373F493DC2FB724230B7C0CEE5C56853CED37D6A4FC18F8169EE4A69C6F1B734DF52CC6EBAE4D85CEFDCF7B50694797C918384E8F75F0DEDA41566EB2F6B2D63A8555646A05431DC104E72EAE4F561411F24CEF4FFDA58A7905CB4DE5AD7969110EBD73256346D9D31744B883687520B6A9025CA4045042FDF3D139AB3046D21FE9DF4ECA713330F0E8B3544DE713BD7A8741BBBFDA53B40355D37ECF252A906FDC77DA50C04ED31744D83BBBB4D0CA15F5F2EA89BA4DEDC6F744B072D25248E9956B2B932F2FC01750570B250156EB9F29A9153A5E06995268B21D6BF6CB0F3AED08F4DAB7330193CE4527A70B92E1342FAA000C7060891263B7175FF4FC17315D607A037119BA1DDF6DBD0890443308362040697C50AD16E0C494F9FDF7FDE0A1111EA096B3D37D19AA7E4EA8C76141E77810BF5A9AEB5B8C9A72FF8F3C7B35349E2555177C9DEF36A53C9AE6B7C3A293CB2D9A33B5636AA70DE719020709436E8252E8FB8892816D48AF022E6230082F2884081A4005A782578235810AF0B5204B50206FE9C10C10DD91F67E2F733F807F73B22E21A193209102782FBFC5BF4879ED199796EC0182497CAE697F1AF2D48D1D4C75A86F75DAD0B7F89D681EE789467C0D245612702D12F2E888D47B03C2F2C398650D71B2604F622D794FEBBAA629449D22317CC20DA2B883A1B314A9F228CF59763317A4962BC5445E857A6E31AB458A6BBF0F362F121C04DD5DAE10AA1378581B27351C892E218C28AAA1C1CBEE4C9511AA359A7F1337EE69EFD1EA5B4D8E95DBDA8480FB8FA17E1952515E48B4277B1D2FD09F6422215A8E41259DBBA40C01BCE06F7A177DF012D12E9372B831B5ABD836822FF6B1AAD360998CFA582EF345A1AD858C9C601E2FB8CA5645AC856A246D7C14FDFA7FEED7A5E018B27DBDA297796A69E93E1E5D78313FF0A50B0DA7C062624D598E303A8E0EF71D9D3B4B06F5499FEAE5114628A195E1A2725E00E186D4B6BB163F9104005047CAEDA63E784B89416F73E38477A21ED0A431849F7225DC9D4642FC8FE2520D6F429ED90E6B81AB1EA717DC01323227EF7EAF2FE73E211940863C4FC29CD4817E81E40DC4237D90F87C5AAB809A47BB7E83D1CDC05EA1CDEC7F501A00BC03C69AFF5EA005F8B33BF005F1B76C001C809000A960E16CC344DB9CBAD2874AA2FC69C8392E43578B1CD49EE6DF1F80156841DDA01D8B90FFD1097130020025C3089F2B31217904040D0DDC37C73B3EB4D3F69DC6A519F6A05A842E482934E1877A9DA757B031C0E1DB5C67ECD1A4078A715E34E0BA7A8C593B90ED192A2DE6125B385CE10ECA9BE628BEE105FFEBA705F53056057CCA0590A5770B1522221C8C7996A1F83CAF11095BB70307331AFE05D3482AAA2AAD81D58727DBF4C5B9CA54D06AB8C5550E547D9E42AF1DE44C4896A6C861C1EC00C25E2D943F72FF90C2AA5C5B9F5FF6D8F5D9B16DB66A6D453954EFED23B54190C037F191D0CE45C9A3AE65C4EE19703F0F07D7EBCD4BD7B7C6A9214A0B0EFE51D24C68023299EAF3C8503E329FED10E1C66C13A264E30EF4E7B8E440DFB4109FF8BAFE90AEA64D96ED923D678A12419241E148E4205A3FABB695709DA0416DA38D2A02DC1E7BCB5373823145F7923D97A20083895ACC6EF72D58AFDF6381544A93AC1E7B2CBA0DFCAD3E53348A0A052791056CA816B90AF67672F102CF0EB5C4389B2FF50FECA394A5566EA34E0D9CFA8BFDB911CFD481EBDD50D629D2D802D6416C69012C64BB01DA33A48F31A8D8A3DAA9B48A65B57DD82B98401E7D7A1022B9062BFD8A1782E7AD998C35649CEE02ACBCC259EDF3ECB581535C519999B32E81483E208E8B2CC8C15F9EFC069F8AC95E80B26A8E0ECD2E2D69F9F9FF40057796D9F3B68A90BACDB516C7E1204EAA74203E8443C0978852A7028EE8A4297A5B4AC06E7D6E03EED35C01C87D0C3DF4A8E9D232CF532AABE3314B7BE54FE397C0F62589374AA5B20C97673484E8B5AA128CD40790E5B9EC1129B9D1478A9E112B33807FE111B42616EE6D00F86EF1178AEA5D248EDD1DBAA7397F11FDA77C78F0A6A268E0B6BAC79E941652878C801A9CC0B80EC20D32EA01AA16A494CCE458934AD4665F011962683B4C31504A6BCA26FF074135F44182F2C445DDF120997B8AFDD778129F7235F2012A4FC36C06ED9560C4961D010FA45BC7C1436B915322179462C0146053DD00964DCA7933B8A01E33CD21585630D2E1C72C948BDDC68541D44F71A01786921D709AA9BAFD6D149BFF88BBBFA13B038037C7CFFEA2F7B6AD254E432EFB931F5CFB16CEDC5C6A4815EAFADA7857088387D26840AA8B51EA21AF815178E51BE11E846A9627969566964F735B2B103FEFD0E1F50DD1709099774CD992F53CBF3944B0EC4117CA88AD7833D6518D214440121631E877E724B6C5C038E5289CDEBBACC20C57EE0F8298DFE44E0F65B4F4FF300B113165D98CEF8067E18A49DC2F82BDABB6F6C0FF8A23CFACFFBF76B90ED518F13C2B241563BD1767429B851D39B3F1ADBF9A29A4D3E8678DC6779EAA7878C1B2CA26CD3D795C400DF409DE8810799B42118F5F0B34BE33EAB70AEACCE96F65538800BCF6F56FA67DB58871E08BE8ABDCB62FA946128B1E7F27FF7DB4311FC983DFAB3FF4D65848472C5D8E5B1B30D10BCB98E204785D227A6677DA513EDFDA6D34B33EC397507F25F2408700106FF799220168D82AA418983F3E5FD67A42A9767E68C2F434129BBA05CAA1C88C0ECC9D1A0C7C6168BC4EE9CE8B06681886933A4960F5825F939AA0B4BD433D60591F57924F31F0EF50C83E53B2E29567DA435BDDF34EF4F3444748F2D8A46BB0B14BC5EE2AFAD417B3F36A0023F906D436C2C35BDB4D1C9EAFA10A3148A84FF1578738F5A4B0A281FAEC51173366E2D6585EF6B2DD538E601CCA0F7EDB6296DAFCC98C863DEA2725CFBB6C3FEB8D7FFDDC1406FE1A999FCE99333BFA9397ADE54758C6FB5809E72F321DDD36502D2C0455269A8293D620456B789BD66537F3BE126C891D809C4A4EC34175993CAAE8A58EAF992424103D659BEA1AA0191E0120FC7006A368940D2BE3207CDDBB5F6A3398786FED7172660A240DCDD2DD0DAC55AF67850DDF8C505104770B6335E38A2D0AC5AD637B9CE7BCE37C449885E0D1D9D31F987666EE5D6DF8AC14EE2EE5A34955124DA081420CD4334C7AC89F77F86E1E0C3E18AC136CFE681EE1739D8DB1714F54E1B3D8BDC0CE89760CEE70D55FF0AAE92BB150F3047B941050F9C334D775AEA338CA7326A41DF5C62223864601B5D1BB0FE02D20F47EDF76DFFCB1B4A62F43729E2E0E59BFC614844AF7EC1BE0AF200F2668014E17A64B5D0CEAF38DAA1C8A4E13C8A86FC175DA1CE4AF2F99515B184EFCC06F820884726F87E2831DCAE872A7C3691727A8FDE247805ACC55561D25FDCEB09742F262AC9912D200399AC74806D7906886B9E26EF78C5B078734B654D39DA82FD1249D240D810FC88198E1DD29265B34A47ACD03754ACF407930D451138BB53393CF9CD4351FCCCA9508C16C678BFD72AF52302329E60F0F1F96FDE6DD3F4C4D154F1DE6137068691086A79DF783410E95F91F5F78BC69590605D5BAF30961248956C8A8D200176BCE4261BABF73EDC87A11F02DFA3F03CDE0104AD3D8FCC5599AF34D0E9582EE77AB888ED5E18D7B00F02D2B2588AA6291F4CA1B30357CB37D725C53C4D6F2ACA44EED20666A701A88900EB27DE7ACA78B82BE323B73B3F50235979602F5D61EBDEC42C298A747B7E51CD96283B5B9AFA879396EBA6EE6B1E1FD19E0401399261BEC01BCD1014332C63CAE95A83546A5798FE0ED25C4F83CE063994D52EDE8C152479E05775232628495800F10B77D276027450087443ACD311A76048300D24F482BB4F7039161A9A13AF32DDA2AD9832EAEA7B0DB0FB9FF2EF9A1168CDFC2CCA179463DDA26612FD8DBB493E262CD8B4EBAB25A1AEA6CEADB7F63BDD05B67369880DCFF0E940AB14FC516990A8B1D26E19E03555A09808DCFD5D4C6ECAE18B068B846EB5F776178DED3FE6E12982A1EB68533B6B5C8E7AE4DBF23CDC4B8A764DF0031C6AA3F07C679C81BCF826AEA2017A105FDB018B2813F93709C0A5D170AE5C0127B6DFC632650556A218A9168ABC098A801E837ADD299DB896DB1AED252FF57054C7895407EF2E35CD202CB80BA44CF70464679F47A47D96C7F67D5A6FF05C8BAC759F76978F32AB88948391A3D799DD0E8FE0320E5570A68969925B3E902D663146737041690DB7412A3451D12FD07BE9E4C0FD9BC8F527FF5420CFC1F1F6A4996A06BF9FDAD9AFF559ED9960ED0328C6AEE5A48F5FBE4C31ACCFF6351D687674063C529878729E5D1509D3C03C3D0300F7FA251DDAC0CCD2F9A48C9C984422B8201BA63E6DEDE20D1E4A5CE561D5F27B39B5A6BD6F39249C1A89E9FFB3268283E66CA9133D959379DF06B0CAEECDA412FDDD866C7355FDB7B8E06ECF010CF58C3D61752BC08003BD7D17BA25D17E14D87A939B3DE7721844C77276556AA02E9F6C6DF5DD2300E826F91DC2107D2B0AA21E555AC4F42B1310A43F8230345A029B89DDE64D214B1F9558A388D045BD03072165FBD25297DDC38C3B050A02A78B78DC3178B0D37D49455B3AADDF11CFE9A0A856094046702127DF2DCFE74A9107340CD0BF77D1651EC3E909C601372040707AE158B7DE0B764049A068CA734D8804CE32FA33C38AEF8520E771DEFE6DDD1832EE8A510B0F00D141CBB4215AF5BD4702D254F1C66F17D25E30A309D59C4DA758EFC5DB85D0D320BE1215A3DE59C90E7826C4DF0486E5769E903C1D75563B448FA92D344AC395A64FC1F5E1AD3574F37263E899509238B122BB84AD0777819649A7F1316F7EFF1534B344DD895237959813DD709A0F7F1A4267BDF1D79D47F5FBA28B2E96CA982467826A41A0A9618419EE8EDD79D9FFAF1F438A2CCBF84F94F357EAE87B84BB24CDFC467F1025B117CA585F5F1819E9B3A2518E9621FDEAE8DF5508E2CF56E6F41C3336AD030D68B1E156EA2637ADADEB482C36857CB6C4FCDACAD51A07FD24435EC8760035124BE483EDCBE87107B92BBA5D63F0603168E97F99095B0C0E4A58E69526063368B47250BA7881EA794828FCBE47B64C9196D6995CD8F90AEACE880D01E17B64188EC4DC7911C1025590A1D6CF39A1E1F4D34644CD81878F27DF4538F6611D191059A60ADF098A11C75E6D937478FFC66A18DBE461CC9A2D2D127A54C29E9F1580F9FD99E066033E70FC7B33996B2392E4FB14F8F62441226D003E703BD345C7F337F73C555D7CC13BA4F62C003ED040F8F65C01A40E12F28F46963FE35F561F5032552C187A3998F8C415260E794470373EA0DD88242CB103ED9DBE329BB85679D0427C54AD8E1506F9F43767579A704A7A8C235FB28332FBAA73202141805BFD14BE56FCCA64489A8BEAECF18A38476FA473F5B7BA6CD5A40F3EBAA95A204010FA6BFA726E31902B90390421B21ECCE7D478918ECF0074F7FF059D1D9D1BB2B7DA72BC378482C045382FBA7FD96082E8D36972EDBD200230A1ADC922E0748E99245B8FF850825D8AC4086ED521650F31253625968160FCF6C329EE6973DB1C12830774E250F6F5ECD6FE9EBCD7703472466A1ADA950BECF3EA01E3D38E5649949FD1F4F0B8F0A174E88C4066DD8F92E223F16889871262BB9A2BAC378E488B7D25427CC2929AE7B1143FDFC8104F70D0F7390A6F0CC1989BDE43146DF17D972299C002F7099065E2A05352E186666178FE52E682D2646F7405F3E4BE9EE68D55B4282A120195261F5CAD0B58D94C96E6489194A052152246F31F84C64791E81695B4BD037D6BAFB969285441726EA838E651C73FE24B2FAADE1E7966E7F085E5ECEE1627DF831EDE23ED0D0E9714A108180C06AE12F358A3FF7A912977C56F91CA4B62E720316C81DB16A8381BE0C02DC84171009D1FDF0E0927D19EAF5DD654C8CC1A7FC6B0C68AD32131792E8A80EDBE103915D2F8272B1C44012A1F0664150C46ABE014A50100004079D2559AB084684756F0F80FF233A5AC97B5DBCFB83E308E41D2B2661ACE6E4DCBD0F6B3914973016EB5CC835035466EF4150DAB8D6FAE73C31BD5AA117080F7A52C261BE0022B590FC4E2B3F1B161523FA39FF6A9F744C2E45C1F5B08C8293D817EB49BFEFFB9CC54DACCA192F597BA090D4FA65E542D6CEC094700BF9DCCB72B26418C0E398C5CB18EF6A740804BF5F8B13A144DD5BABCD6B8BCD1FA17F27F082A9016BBABFB5D7C8B783CB9B980C87ECDE8D39A507E0C1AF50D5C3DD35492E51303E312DBA8934F9FA1A90BBA945D905800078001FA758DBA3A5EBB9FC7CA23E14F588914574E33B5A6A75831B551B4FCA84D588042ABDC9718C264000ABD53B3BC9B82FE025336DFBBD52C671C5B0B267478E5982914C110549D1DD98384DDF6FAF7192DA39EEDD46F94AF6C66D2643FCDFDAE6C7198353225E38938789224E804368E150C5642B583B1840D23473BB9BA8B643DD05B9123891907B909BB59BC086D2F2EC917174A1259BE5482E7A74745D62C7E0941412D7C40748B212DD007DAF39DC4483D6104FEB8D4B981225A38160895EFDC4DCB4DB45BF94ECEF528790140904B3B429C17EA84973E1767E8C44833E215D25764C83D8D0877488B7761C2B2C60A56B9BC226F97B487BC1BFC7D3FB8D890EEDE3999B42DBE3CE9B0E9FB2BB78D4B00B68DE3E6738A4E37AD5B7E05C86AE14898947BB85DABC63374C79D42A53B24E33147A0A987AE52C5C3754FE791C5F9CAC0467AB74B304954FA2B935FAB3B1606891B51DA23087A9C61C213707AD9940FC27670365364357ADD86BAA5C850006EB70D02CE499355090C9D12841E58105B11C85B94BF149880A36800810664F90FFA143FC93749BCB32060912EFE47ABC5CB419C0A8BF938F8E880EADBBF74DB3DF9FF9E19A86C47951EC395D042C3089FEC3D1543E0568A0B8B40DCA64133557C11914371A6F66FECEE5F2EF01B141F57AD5F2CDC8762523C7686930078373C9B02AB9C8D963F4C7AC8EBD57BB467A95022FB776E1B278136EC29A27D0ED6D7CD43CFC0C37940B465E20D05679F5EDFC0316FF59656C0E95725C10B4DA15C0C3B6451FB6BEE87EBEF418189AB16312FFF9DA51FE821A4370F12570FBF2C482F56B573A2F2BCC3364D6AFF18CCC100B2EF226D122F7B3245DEEBF682ABDC6096EF998A2A4B990B96CAE25D5476551FDD1548DC2CF2F3C8975FF97532A8AC6558AF91510DC1737855D98195A34468BE7349E50B1B8FC1F9C3F1701359BF50FE47703141CFC99C4DA12B3C6124B6C3FA8422232BE1D1207FA0B24414FC22B78D7585E30EAA8B1EE1C07677223EF496C4DAF094BC455C9FF45717C8679F29C5B293C48A2CD70B23FFB210D0D57056E4E947CCAA38422C9B885BB46A24A691BF03C02FDAD2346B134EAAA36304EC47A9CF5E557DBE35710521ED22EAFDE312D0F8A8F900040D143C30C1E1CE8B2C8F98ABEB4FDF88B68EBBAA99F02897390E2DD3EB563C07007EF0EA9A72B5626FC2B990B38D7FF66317C92B52C784CF550A6FA2C1BC79EA2E370170DF02BEA2A0F75C8DCD82151708E7E6587FE51DA29F1F5E60F8631CFEEA2502DE7BA09DB1A21DA4C79E534E52AA8DC1DCC74BFB0FDDD0BC0291AFBBA82574DA04A3CA9BC8732817C8C648F656D496E766FED0C1AAA0F37CF8F189E1862F7097CA52DA369B3B9C2F25BCD65CD440B404B19F63524E30655BCFB6A221485C3945FE5690FF9F0A42588471DEF656C7C592B929224CC512D2832B2D44E743A33A24918083204038FDF7C1F8D0B5DE8532D635BA962C4467918D6F28707F483100E753AEFEEA4902311D6632FCA7F2079CE66959CBD421043442527DFA13FCB3D689E779B6BDFFBC754148A225CB9C9EE97AD70625A10B67D643E9CB1259EDD0BBE000130BF06E0CD9EFC50ADE47BA8F7485816D83DF25DDC592D1B21531A38376D0DF4C9DE79B59C677A8719AE31A740F026A2FB1BD0047C7D8D1504EFBACAC6757B4BA273F67A624E83E151AA73A8E2F42FCB73C2750348707448BCF7EBB648E9302DC94F16F4D5548C9F70C469877AA81FFDF658A1E9D0AE0B3E01F288B61A685D13D6692A913543623C82A200C48B0025B85B024A127B2C250DBBD5C8EC2E6408F76DD93387713B70E6FEA08317683C23EAA918793F05BEA4C6B49FB48CEB0C21FEE8AF66733BB2F39528886F60B39238B8A4A46CF10A239E35914AB27B1A74840B54F4E7AC4063CD0A7359139347F80805A6FB18714FA9289127705785FDB057D12446CE19F016B5BD4DD08F37FB6F8E58EC03037959B744F4A3C090677419BA3F5A8839E0F1050815EA6C20114B022EFFF0C592A4438100BCBF7C6C9A2759CCA7EB90DBB7700F35D5BF4530C8EE2635B89750FBF3EA86807E2B6BFBE4FD332801C51DE0ADE8FF388F0B1C5E989E1E303452E2E255CD2CA438326BAB40A027CFF9F26164CF7AF6FE17A395C724B5355634D2B5DFE6D1751E259879418906228CD36C11E0B0DD3F9D1058E5FB8B39A2AF3BE86E373C32CCC053F2A51511474F48C448739954C9855665C3D74DB74EB116F9AD016BC98A84803C0EA5E800C1C12019402CEBA014A41743E8F9157266786469CAEF528AC49EED1C0C346FFC1120763500EC5FDE80D580FEBD269D760E9996F5D405D37AF6A697D3351DBC67B53C436C7EE493AFAE214033DC2A3C25F8DF120F55C68F3D50738067EBF01424BCF3EF69CBFA77D21260298E86BB5CDD3B69E0549E6B932674C8BA36A5AD1DDAF013CC3E7FAD2131846FE2F9EC04600696903C6EC947E57608418C65374B1402FD08AC0E833B11FE790CA0FD0BF212DDD244C42576BFDE39695A033991AA4DB44E340731736DC23B3A1D310E883568FE8C33AD25EA438D94F2056CDA3DBBBE157052C0BF47B15A43F58D01B03BD90B1FA8E2C9F095E3E51902068053D8EAB433D4CEECAB2D038EAD5EA7F288BD313D756A08A915C37DF525EDC80F48F262D85787118C6FDEC5813B749336F73B89427D364886777030ABD904901922A8513567325D3D25DCB60A435AFEA2621E9403791DDCD235FCE903D9F8F2273EE6EB3282BE128CC202068126C98F09EF547F763A1FBC60F8AAB4B23EC522EDB5447689EE690CDF69A97D3708024B1FE3DE1DFD4A0668EA14FF8571AEF19050D06D110D48B03C8E5AEA241191CA1E020258E446085A3542CE5C744DD5FED18AC5D189CFD7DFF8350AA58AAAF8EE560DA1372345ECB4C4D064D0D2EAE3D073EEC7CF73A8580E074D1CCE7A0A943F3FC1B4137ACD4BE0C2A72BBB8A6C6BBBF466A11698AA1BFE5764848BA84F7FF545C3042E50025337F87741D10FC322A719C634214B035CBAB8CBB00AADBB6CC129D3DBBDACA975B1B02BABF75C1BDB80682CCF7C27920FD6B583B6FF4B85AA0C8FD2D8EEF1894678D77B37D3AAF17BEBA2A9A1341E705E26A2D89271208D9BBB59A338766FB6A32597EC8E82C4C1FF736C9111E0BAD6B3C8A2402C135D6CC9AF73EF6B3966969CBD4A8F2306C9492BF719429933DDAE2F8F80A43233D7EC2B9FB4B66F3A218AF1A76FAABBF7686F669712D19DA0DFC9CD055149DF004C40F63F0A00F8122AADADECD3E61AFF8F030DF56A04A8BC34ED1B4DF6291BD42564944B11A79DCD172F3DC3B980E559973EA2F8B0F637133CEC2FE61140911B2A30AABDA0E7A421E6137F266213B8358611B75D06C6079EB4D6C92DE665D11B078D0D7267832A0B279CDC7188478C02EA83882A5406FD097BE6E1B742174B144A90600414638F342D22CA37FD9A5035ABAEFF264CE3A9D7F256911E6D9FBA92FF3E08281EA1843698311AA72AFDBA2323B1BC662EC1E73741992AC07612830130439EC9C514DDFB1BA114A3F4D6D33DC328300A3AE6904D98A9FC0AD6646F6B5795ED542A757950BFA4F20CD1F65FAF16BE971C375C40AA0333708080D0C45C88A4A4C63CCACEB394BD04AD99B75D383EF58E6F82AECC128FDB2255A78225FE7563BD9E2438017D93D5899AA59A9425ED3AA426CCB866BE1D2822CFD589455D6671796AE317C9F4C5672421D923A1B522FE962792F0A3341D7D92EB16E81B38527526974BA446E8099589FA0BE3E6BCBD4DD27892EE355064FB654B08D31465308A76649D6883AFDD07DEFDABD05C146F4B15C8FD87C947E5567DBE86CFA7E970BA33F00CD5BBEA04322DA8C6505ECD913D9F038F317CC83050C4387C08EA701E3AA1F0F889957953620CFD2FD1AF1FF9E8DF18F80268627F29DFDA15BFA4AE6DD9C0F933730058C15FF8C9CCCD49CA5736A9E221CE567DBCA6809A71B45241C3ABD5973A2AD2D75D63EA3F25C995844E0736B517597CA9143FA908B2078C7E1D349A91A75D83A8ED48E72F2D1BB62934568D37D6C0FA248A1199191ED217AC489C4A0E7AB179A9F3070A0ABC42915386ACE0BEE7202AF04DC61C95C734B2A1E04A6EE09839C23877D2D7E17D85FC07DAA868398A47750C5D820AB603070C02DFFEF53557D49A17BB6BCB203A1AFAA0D8CE666BDDF00B4D7D8F7A3AC0BC9638B3749ED5B6904C671C78A0D02E4D6C9E3370B4A122DF056EFEEAFC617680A84237FA76279D772690283A5CEE0EFBD13AF2045E6F6E9DD4CADCD82DC066E9EBA85130BC047D0765B29D8EC26C9B08F4D5D756B4CBD5A2595494AE085C340E1B1FBC3995226E0AC54D3248024F302A112F8545FF2B644DFBC73A19F6761DE8F3F46A0A7668000759376BBEACBAA6770FF5D0018BC0A6A6C05569613AC627090E9CB49C7E41105C842CCB95C4F60657DAF7AAF95091B07F9380AFF64651CF0553B063E5416BE59D0D9F1D5B106C3E0E645268BB0D5C1CD7C46FD839B8BE76FC2E2BB38B240E77EA36EE0DE5ACF19D414122087C7A84610B13FA3B6DFF902F2F5116B456DEF301DF4B6413703F9024272DA1CC42B7081D67342C6A44D94F3F206894D204E266DBFBFC85F645C1EEA2F6AAC8B382A3348BA400E00E774D89621C562B1AFCDFCD373127E28458141B599EB5372EF0231EF37B8A1E2FA48ACE7AE81953D69AC24BD608B80CC285A1D1AFC9ADC84EBDAC350BBA1CBA7832C1FCF43C3FC3957DF8A7EF7CE4A63F53DE57BD13F2CF3A2C3FC8B65E0A7B14630A104B87D36B1397BC7C435816E4CF9E0588A478FA1DF58DCA0F453FD4C8713EE9657095E2CE5435BF7D0CB0428557DC42DD3E635D4D2661A0C316F18A100E5B3F4D84C48AEE79759CFB810D8DCD91A47B1DA1B87745FE96868116FE9B44F5E5F92FD8CE8375E883B8B945679C2CC0D7330DAC41ACEE336AB2EF4F2CB40F3E8F16BBD7C035016FC6C1A0F8E973FAB1A0C06120B88BB2DC9A87540E8B805AF41974EED1FA5E6D6BA1EBACDF47841C5F64D1E015DC75E441148A4F0A0F1C9F3A344A5A93B27CEBB111816D484EE35CC888EEE9DBA40C5DDFA22495C2589526C2A2E99BFD7801FAFD37C137302470EE6B451663E5B10ED00966BB259642D0ACC83BBD2A02EE3347DEAFCEFE1B0A2BDCA4D5DC81C5293F569D003A46D078247FAEA457D2DD7F02DFBE3CE058BB9BD85A5C086BF8EAED363037CCBF7FA5800C0C341529A7288895C57980185E81276AC7279AD5B7603086490B0165719A1A69B0FD6691541068B349E6D0D6E815E39742DB0BC73CEFAE5442A149E43CF1629FC81409E206ED020F842BACBDE17C30436E23726504BDD7972DC65079298B3A973C3C95217507AB04E462AD7A221C2DEE0109A8BECC040E5D7CA24ACDCE32534F64C9750F9243581187A0F9DFF7667B9AB3F255413A68A86BF8044CD2688724F1AD57A15B986F9201A452934C388C16FCF57854826BD4805D06127A40F8E0D03A08DC459E928AA5D90D9B7FF2CC2D2582DDBCBB4211768E6C62E8EB1CC5570A9672FE45A0764ACB95D0E43F56CF58BF6B226F9091930AF1DD618D9E9363F216FA088DAEE990637FB51BAEFFAE497247459A4761C1B553E4B1033064D2F0849D223A952FB2ECA54310437DAFF90281C91A66D8C3A3E7DF7E16E0BFA268F25BE5B971F5335781EAAA9437858F58B891343A4FA3205A4103AECFE8C46AAF17C55AB0807A8AF704930EE9F80A706B46BB7C493B8F97DFD959452EA452EAD0E3123380902B8D4944AA18AF2EFBE92FF2C2EF7B2EF172F257224AF49655136D8EDD297FE2F1610ECAFBE04396F1D6B6F1B482578220BDF11FCDB0E6A84153CE9B6B090EF8B2F7817286F82F981C9E0617602B8BB53CC53A63F1AAA6F25746AE449E7224ED3A7282A1259F405645FC6D63F6B893B96EADDC2EED864DCA041C22BCD7B67DD720805615C38A7DEC45BFB5F569A28F8B39B3DD31A7AE42F72D8E78A5976C2D8C793FE8F52B310F8577467A3168677BED5E1CFF7DA911338DB28B12AE40C2F3371DA2F09DD7B3D9061A364644538F85F89386DE7379C3D16A3844AAFBFE6C7FE013F45F569E2C10F00F0D471DA6CA90A00394930B078E730E0EE4CF08EE84678D7E584F97DB5F9190C4E6C3063E43CA658872E7B05E239C61D9C6FD176FA6F51C39662098F347A6409E117D5F3E4F5AB86AA0CB5DF75BA034AE0890A6719AB7B33DD0ED7C71D0B67DA1B0DEAEE3CB168E5741BFE9913DF17A33E74A494697486721B91137C19B98202E88CA28F43D8B1BA8230E8FE620F0219E45FFB6D0C2C17B62B330EF6569ED6F5423C85FBB4D77C798BED0AAE0D4C392EA10C098EB8AA143CEECE6AE1A0832E7FFF617AF1F99E6A91D3FB1E454D212BF16A46A737FC7050798F7CF24F1570ED13CC979F55759BC90D42850B5E4E021E74F63D789D34905CC5E0DFC1816849F02B6F9895D2E88621BD980D997FBBD53DCBDB2C1AA383D4813A3DF8EE21D513B6A3A5B71F41E238749C60AE3DE99C436B739C08F6761C0DF1F5F4DA9B3E6838C552B0324BD0F67FEEE764E435E75B41E027D8EEF6C6D1D7B4D639AE7DB54E1C2D90ADF69D973D832DDE6AC0B6AF822274B1F8096441722770C84C94FB538D9BCAB20B5AF7A039EC3B38A8FFC4B52222EF220B584F8C4923A4B77DF4BABA61F99E89C3CEA771D2F8663B3E18CCA57AB2C9AF9ECD109B321A0401DEB7ED4FA883098A719D6668C077580906DE451514DE3A6865EC6D865D6AF7240391EC3E637745AC41A2CB4931284DE89BE9E06017E2897EE165527549A0468B69E8D0722BF8075A4B2893C98EAA7051EBE63A88F65736A474C343809BCFC0BBF9F4C6F42FFCF57A506D41D32AA4A8AD20189910076F8FD7A2611E595A9A947E4A2885871E0FBD8956E3015C7CA2E72E567D471BB79880261BEA780E37A47CB4C1EC0108ED0429E69D14F7264ADFF696831B2BC8132F02DF0DA057BDBCCD7FE3C48472E396ADDAA9B74182A87DF83EB8CEF33CD27C0B41E9F2E1B0BAD207B1C1F01FE330CE7D464130F82895A031D395D3058995228DC7D47359CBFB1EB2B494A4EDCFAC903540C558B1CBB204EF168AECD31B79CD1F5099F70D148711DDDE7EF715AFD016E5240D44983EB80FBC3160331BBE37D70675E7756C01936E2AD255AEA40F1DA368AE7B901FCD224BD45011E7B4B20D447079DF14E6DDFED7313591FD482CC9CB4632F321DD094B20D427425AB0FCA0A97A4F315E434BEA4EDF92A1A7D948FAC9F31FA8D8818C67CABBFF138107A37CCCBFA1429D3D53716F33C1C0021950EFCA279FE4F23BBA7022D7CF381A9C2FFDF84C78BE611850C2144DFBF9FB2A95FBFA4DBFE1BB3911B21FECC3C5FDC3268D08440A6E11A0541CFA4082FBD90E5D8497EAFE78FEC8B3FC17C50AD0E3FD843D48EB88ACB35FFA6A225761EBE3217D5FA5FCBFDDAD1793524350EEC37533BE195B1875F081EE8B3B6B49A1C60712CE79E22B436EF5596C8E6D179A89B8DB48C9B2C88FF0E29E852C855C4C293F34C67F0602618E6146F0A9CCA056DEAA737A6FC0E5CFB3A269CB1B6F410F46FFA43CCCE732FF7BC3F7DD2D43629A22878BE09886F9CFD706B541FBAC6B1258CC032FEFEB4489F01D48B2BA7FF350E667A428C36093E8ABD698724CCBD63F92DBCD5FAAE910A01D12FC400965E261D4A4AC187629FCF193605108F525385615BAFF1402E0B43B00C0DB33A95E89A75C8140DF80FC48280869983780E6B2EA04E2B32E5ECD6A4B1FF996735CB9A192B869FE5860A4304A6097F58623CBCC6330D04956D94D689D1ED12E5556254B9375A80227002B8D7E9B8AA8BA87B00A959FBD0B840F4DC88048A2EF2528CEEBB447F9303587C1C0EF9064EE4B7648D82EC79A404E46742ED550A3E4F6456D8D151D302355AA1D6420381B111A2E483B33D25835C6565A318EE3EF5311F21C46C1654D6240CAFA574339CF1252F502970160F8CEE6227DA5B3CCA25A70A94AC25A5550DFD8EB7EC533B6E4007EDFA3D8A4697E7184173ADBC3AF49347B5B7AA30C456D15AC3E1B084E80B76B7182043F7185B96FB3AF44D5CD5134AB385BDA98DD869502D292359731074C938EAAE56ED0BF8B1072D0EF7A115D9FBEC2B7D2F0227B4543DE1DDC4533529AE317A8FD4F4E510CD8B79A84555CE0D27F8A5FBC088638C2967A4BFD9B8C818A05320334801151272C8D2BDE475FEE95BF0F8B9826A31A6FF9780E25F6C851B4EC046D04001EBAED08EABD4605633D2A62AC24279B652885DDD1595BADCA2674BF41FDCE901C5B418419D4286F6BA1CA6C28909167ADE5DEB3AAA4BB4AC10FC4993B3FDA9EDC903B8266791840C706DF56258D4A4E9734526E2962FB972E949EBF83AC6E893FD91DFA3332A4FA000000CD827F408A6546C44E893BDA5F7B013788D452560A8BB54EDB9FB46BF77FF1B2A2894B765B1EEAA6AF4E1954BD3CC80A61A43B8CFE39FDE7CF1C8900F234CC65159C1DE1249B34B702CCAEE882F580A5B8843EBC14D75BD6E96ACC29A8C9D250A66FEFFB017D5FF94B743ED9B739427C1291092FF1F73BA3062E7F63663F00C050B989A03239FDE2186E3AE9BCAD8826D9753AA00B67231726E4DF80F070DFC3EA613B2E55E6E021A02D73E92999B59C367DD89CE399FA12641B436D435B4801775DF63447F6BD6743178479576D423F14BE27E3B9B296C97F3B7DB23DB5766A45C54D223240F27BD5E93E012FFFDCAB30B720758B8AB0D00689F015D2F9BFA09EA6A892D9A46A35DDAAB28A7E5E0F637FBF44B4928960E6C62EA01003ABF527380912B28C2DA667122974ABA21AE8122E76FAACC11217B64CE253F007912D6A3AF6CE8ABDE0470AD307FCEEF0B47147015A073A3B5DA2A462470F7C41555D0BE69166400FDFA8F3CF8C37573F8674AC04C1B68A5CDA6EFD90C0CE56CFA73FC4F16214CBD7F100DB8CDE7007D60AF9339174FAE472E11629DC3A562B3EB667EEA7757848DF7639C8E07D17DBA1F5D9B0BA54FE7754A1E2B989FBC25BFAA90A84CBF4A497DA6EBA00F5515CE7AF62D831A1FCEBAEBCC5B63AB0896DC09EA3F583962D1FE5A66F5E1C8864CDE1A19A0F18EDF7E8A2BA002B065E4D17A8393856F51C467BB4FEC20565A0D6FD78C5FCB30FC692CF18DB6F99D34913B05AE5D018D429552D13E9D7203D37DA53A041EC19ABE8DF467D0059EA598974FE369B1849B22605E04455315F306A00131ED05AABCFF47DBBFCB963657915C220DD92E6BF92968E3645D2DA57CE3CE4C1C33E52D80772EA3EEF120C91D1FE7C7FFAD4C048D599550D7780B755F3D8C65E8BFA10F7FB126EBC90C19343D82A2060C38D48DA503D0F5AB2F16EBC45423A217987355676BAF5E6B95F11C35AB38F4B8426B2A8C7806B574AB82DB7B0252648895EFCD3F4579EB1D44AB899CAB05AA56DA66CEC8FDBACB654DDB74E0351277ED29FC81FF6AF679678FF48FE7DC0AB35F84F3DE02DD1EC446A9E9BEA41106FA446D13EBFDE1B6C6E8068C79CA15862E97BC5EC5811F83DB535F817E4104DC6FB052C30D7D41C1A63B20BEE9B25D64535ACB08DB45B0C473160257A9A5CE58307E9D2D9DF5720B953CA579401A46FF243903146350D698F3DB763F6ACB52CB8A91B72A17A439E634A34F1DCC43AE5FA85F2307C1FDF9FB7126C51EDCE4E2B0CAA0D702EF6CD84459242D1199F25A933287116420934240F136044FD9343E12EE3FE579F477CA137F2B5ED3CF0E47F18ABFDBE9F33A99324D198A86B2B1B867D10FAF710202737E081859EBA2D181B946D80DA865F1CF56E5C64C9715052CE44D66EDA257748F0BB7699970F47F32843B1EC49710EF0BC5DD2BAEFD651FC3C1CF0FD0A13AC9014C158B2E926FE68893BB3A00C8DDF3BEE8259395F0AFD705A7529B47CBFAA0DC0DE97A1045F5C87BAD3AF6A4AC4982858F5C18946E6290C866A68F5605242BB23A0C2FAEB505A4EE531FBBAF06BA362FE55B4658A9F786ED1C7040574C7B7AB909D1A3CC1AEC282932D89E085863A35C9B38EE03A704C09CE017390656095B588FFF57B02A97C116D6E578F760202AE560A7A5D8969F8049C9E403A3A1CB49AD12C803E29B02CD0562429F2937DD1F96C6A3533E72D34154FFAC45F6616612B6E8902459A96BF54CC5CA482B09DC019CF19275F791C4B240B727B680D55F1784D467400400079C2411CA03A514056C160847F1692B1D27928AF768579E472DC3A93D5B37F9C7DA7AA56BC3881DDE1999987927102701FEF62F09E1B319E067FE2C7E1F6896152E92EBC7FC64335A280C8D03463698923906907725D4A9DE7F0C978CD1F4BDA8F4CEEE51454EC3FFD50149031D6F83DBE2753FF68101312E98AE5908941B3AB9539CC0F5075C760452987A40BECDFD79BEA5FFAD20176DDFE8F389F7F00CD118AD5E28F1A7A12D772F6860223CD39901D7376DAB8A145ED0C5C7EBCD0CB0AB2827D64F5F59605BAD104AC3E97214E52071AC33444230C44FD26CE7164EC191FE903A4FF1EC27B67AE28139EA2CA8A5EC812960585A3F81C7D58A3DF273B4F50D0E7684B8AB835A9A63E5E975CB07B01E1E4C2C658E347C19A30D249E86559E9F795BC350056254CA2DA58B981065A32EAFBCCFD9352EE9E30883962166CE444F158A5CCEA0AD90148163C65B0D3D555D54B3C51402498E9FA1278ACD368BC60A5577FC4B73FFBF3221B3C5E32712A31AB544FBED02BBABE52220BD5E166BE2C270DF753A2ACA775609A6BEC9C4D9C828A2295258FF9BB83ED65735FACE5B48F544193FDE6AC5D96D0D3F3E3C42DCCB86F9B03111116571C54031D251038A815141E7F56C694A9F94766AC1F2EB3FEBE8F4F458C905BCFE7A93F06A55053DAC018C8ADEC2E50CA269FE72ED310CD8279CAB501E11B9E1E93B6F7B428C5EB03228C959204473221580E7829C163FEE5A076F78BECB3CDDDCF3449127F605D7C3A61BF82BC1B6402069AFAF6C82A7EC8FC0700EFD18D1D9AEBD384AB8DB78A553688125EAA207540FD829D9092FBC53D4D47EF5048E6245802E9CFBED63C53516C686988B2D0CCB15B776B7F9694AE80AF937205F56BDF917B614FEFDC0FB432512D6DA20F98C754E032535023EFD54CDA21F09B8843C24989FED747A5BFE26A8C3CE9EE6ACCF11A4AE34BBF4EF38F61CF86A332F27F21B316A6C82F3A91D01546773680B9F3A5F14239F828AD749C55C873722B9EA5CC73A48E7AA640958709FE5C918893088B07C70F8E9EDFB6C63C571EABF85C7B3E970BA979787D00002FB448215447B90EBD80C5E40739859A12ACD67F48103743BF2AFA088385EE3C188B77E58E668D3EEE4CF530523CCA696434BBFDEBFFDF86A9BEA519748C776360CB0615217BFFF5AD9452D192EAC7B1E1B5721D6113F4313B5D79D82DE3D502FA1B9D87BAAF0273928C0AA46FE0F799EDFF9DBDF85F95AE8F98B2C06F0E79F8B14DF3C9687FDD9FC85826BF41BBD525F85569D3AEE9A1C347AA7E79C8366F8F8026453663E896EAC94A798C092BB154047279810789FFF78794FA45C59095CE2AA9FC166158AED1EC7F1FBC6F632364EFCD43E115B3B478C58A57FD3E000D889EF2E982C8BB12E22FC856A0D12C6388731820D63D88CECEAE3B0C9C92F6F0CF2EFAEEFF47B7FD52EBDBAECCCA7524A4EB45C40348939938492751CAB7A6FCEA76CCE9ADCB10AF7BB71225A18A806295C82A05E0A410E90306007ECFC4127D387FF9CC4F6464750368085826423384D1F308A6772F518E480A36110D008FFF268034AD750FFC1D2E26CF519F928B8FE53081FE030350C4E2962451E57826FC574D03C65302F5290130FB2D135D22D38F9A89B1D343C8C13AE7454C9DCF1A1125AEB7B2E2B33ADC074D9734ADF2A3D9A6B341B3F7937A6A7B757AE940834BD02B82AE39D56D28E60EF42E42FF2673C6D9263D3A6683716E0ECF74D00FA0D0CF2DAAC1F422F314BFD3BC800FFD08F89E8AE7B1DDA3CF62F1448DB03840E32CA0C958A3DE3421C62E5DFDE4646CE9E79A39C911C614F076E06AF96622C142978D576D790126E84660415B905AF120EA7ECEEC39A28714082117EC3B938F3831889B7054CD0BA6A20E04AB9A5CB7CD467D4492E4B28E2C074A863EE1B32A9A99549566553EAF7456909BA0DFE667CBC78FD2813F3D1DFF1A85AB471AEB9F9CC4BBAAAB813F73F450BC0FC9725DF8C7465FCE5A76430C8FDA3E91241424BEF98925E751E003B25876378432E7E8628D07E5FFD53170631358EE89B0DF8A6F050A8046591A18E27B5125EB5329716FF5AAA44BEF2136500C0A2BBA17FCC6F44B272CBA6E87FA03BCC98E6848A0398C88AB44B81F22EFCDB776C348D73F333B1835AD1C5AB4193AB757D1A34BD613FE6344FDF4C7F6AE38B7B5C8F6994F389803070A68F108BD727F6CF3376EFF90ECED488AAB1A19C3909DCC7EBA02FAB5900F0EDE907A7CB97C13729659BC0BE332FCC84FCBE6D980F5D487F1F93F3791D49483EAC2A199C119ACA8D96C582E378DC40E75C1906895666FDFAADED1B7554B94C3EE0D449E5CD837C525073E0079499EEFD93B294908BAED73E07724C41C3052EAD7BA4AFD73CDFA98308DFF3113350F36939F13515BD812513E631612E81D4F082E194400EEA1A79B7D94D54FF90FB5E38377663EF16A903E391DC0948700F586CDC919316352CB00AF14C7EB7DD845C67E26D725173335D99787C14C3A075F7FE39C8FD894BC1C75176E938D0CFF5742EE91AC0F9CC88365970727561F7E35568D43DD8DE14A64B6C02E581BB2AB71ABEF07E532119A479B6E766E5783C37F54EB20A0AF1C5C2E969F44DAE1A4A4E299AC11ED1A3A6418FA91F03EADA95F8F256126CCC47EA744B7A28287D5AAFC7B0AC29E637ED9DBD082AA6AC4DE4008EF00B2834C2DDF25AD276E30EE9DE1E269779E1F8FBEB5F34768FB8515C3DED09A14A53195AF5A18B78070D1D9790DCB2EEBF3C9F40DF42569B211709EFC0F332DC0034181A50ABEDA38B69DDE5CC8FDFFF580767D8883C5136C3A17228B69B6AEED0F01523CE975DEBC68C0D97DAA43CEB11A6BB5E9D8F9AA7750CB5C01A4BDCF3A972AD91FBB9B76F82E7DE8A848AB007DBBD6A2EBF4831CF5BB634AB591537A887A4E100A24BA814B06F40582AA9FFF4DC35C5AC287EF6C41E27B050DFE49E5B6DAAA6040B8E5CE5DC1F7B6CC3ADD39B8B247674ECEB39F7C8D6618CBD4A476A5EEE4666F8D07F5FF3435DEF7C2FD3F4C51843D98D53FAA3B20215D0D91F1EC0CFB1D20CF9D87FECBF021D5D2AD9CC36AE0D45CB3BE20BC26BB0B3C07C01BEC1315CD3239B255BA1FB8430B573982044D7625074CC47006745B7721DC03859472DC00820A5FC7ACE6EB958B99620906FD6597F22C3C1117DD63EA899106E4A7BFAA194E266137738236631D7557C19D7B69E23C70C6AD18863AE25AE0AE74DCAA1B11B2D3D4C68B41BFCDACFF0FCD9488E05F8A564608A83281E5F432AC5D85B993AFFB79A17548126339900800B71B00858001858206017018240FBD204E1E62ABB598577A11F90394134F246C5071719B7F4592E95F538B57133DB3C90A43FA40D8D9E4D59EC5517821D09C1202CA2BB24B65A3F8812E278FA0E32811AD22E065BB5B2BDDDE88B709A289BACDE7BB563F2723FBE2BC042342ACD4B553E1068776D6889A82CE5B4B0098EB5ECA2023C2584CD7E122FDFD97575ECDFA3F3A82EA150B62FB8A2EEFE141AF980D919BD75AD2D3BABF1B6C5D95006FF54E1F9C9EA43D02DFAED3FE09B222F74D37B3B3F197113184D542421F20D59BF37A3D11A65117736038AB8B647E2BADF7CF214F4AF9D125C28CC9D0E4520DD64798D11C9F71B0A73C672EF1D2BA57578062743D5A8E5DAB61D52C1A6D18EAFA521EE4D4777A27760F84182BC4125A076ADA7267EBA2D7C17CA4E0128B3089579849F7F5BA8CE3EB77669BFE28CBD1101B4E196AFAF3D6B7DC05869EBC410908900F997820F5A0E4BF81E3164DA75B0744798F0E759058B4CDDFCF630E9BCBEDB8B0CB32EB40E2DEB7C7D04557EB22B1D826C9B06E16CC1D8487C5055CB166EEF5165042CCE85F05BD3066BF08DA522EA95D42942AC87D0E5FF7ABC1258E27466925713DA79662E46D2B2A911448402BB22E228D4DEC524AC03F32372435154440CA73CABC7DE80A0BBF6B2A0C010060F4A61284AEC7E8FD4DBDFF7E2290F01E5048DE164B04874A837AB0DC6935275B8B9FA2141175045080420F4D21D4E048D4B307EB8565BC3AAC404C9F3B6D5AD8D549EA122C24C7A6D7F6CC49C8D48BBA21E53588A61AE24F3F212D93D50AFEBC928E65BC7F1B295D3351E0930F5B1644EF4F73BBB03ED4025884D49D39E1A13C6F1486550BD06BA0CEB74350B2158CE016DA5349480EC5410CE81C3EFD2E3893F9B1F684E5391252D96624A5D1D282FA5E0EDA99F735928EE366598C10FEF81332B1D32F3FEA879361F200F3206D3E2D7D90D436C6EA3C20E409948019DA723296B43FF758BDBE588E36AE874685837B22042A6DB5629330520A63D304649F5F70CB09321528C75BF33B123D4F42136D94821DA18C2CA1281C6BAD005826DC8F9D2A433BB12C75165A0D06891E464F8F8490906FDBE5D55986463B927B76BA0AE4111D9E06A6B759A8BA6290AF889B5A8F66F1FB59AF9128D106FC93B230D8F31AC91EAA16B62A3586B4AD96DE791F242ECDF1A53F2DE572943884454127F1675D14BBC9FAF3646B48B8DB7F903B85E5DEA059503EB8EA40864548091ADBFA58D3057885D481D66DCDDF05FAC843FFC4F85721CDD3D91D948C21E57190063B36F4305CC5C94EAFD34668604A370EE9D9EA143A3B915E91D5B41ADC79D25D52BBD7C9445099583A49ADB572E84B5FD27F057F482D0F31F0AF3A8D916B9743C6687C9D6AA412C374C126A1F5563DA8FB733BC7D180436EFB2D4693CC22716637FAF03065A243FC18FD8E6C5C342E151C28323FB43E5E1A804766B116C2280C1F87BD8818280B79398A31734BF27F036123B1AD144246E6E8FBED94851A2220B129259322D3E4374501034EB0DCFF2E7836EEED14EFBAD434BB8987450B7C08C693A7826450FB20D272014166C4BC66B73FE14F31F7E134373C5C3C1B2C79045CC64F1E137979F1C8DAAEBBC0F0009ED7933704018EE23E03BF5757D193405588FCF785038D27C18A1318E85125B3EC13B9C2F731AC651340117B165552857F9FCDAB6CD28C1FE4F25CD320CD5B8514A829C5A79F6DEEE115496EA11F05EF339C00F65825FF9FD13CE19264B3221619C9D09111F4AD7DE91EB623D674DEB9114FBF27D300D941A6966F1D86BA26F8712E7657FFF0306E96BD6A0FC13D716682A644698ACDDC1C2036061F0E5A431D2844EBB275E68ADA8F81BD58F96A7A5062718A35CF2B94A5C4FE33BCC8C6A2FC4E6E16D8FFC558B35BB393709AAFB50869936C25FDF91082A605922D4138A0C1D198A2640F37548983D3B30410F736E154A8EFB30FA15BABDDFCE174D40802666F435B3FCA2D43249FC89E44C7BF89011372F7C54FE879CC5B034D02B72E4070A8C04350757A0EA3157DF90856DB4B57C0C6D899669B1A40712BF0FF8118465D605B44A1AC8E1D5292225569695EA6745496BDF617F7C2D7791BB1128FE295736927C53FB9658E975464066EDCE736270862B3C61C6FEA9E14B0BA919C3626A92D86E531AF4345501205B1F795D12E05305A591B380DA9EFDC4CA9F198995F910A1077801131959C8402CCFEF89D7DC2637948F37B1F07670BD7C70F3E3F01E6D52391DF9B39001DB881769A1C6E15706314D39E39554B46D7F3297FADA159928D8B933A9ABD702350F4A37F3DA58C79CCA829397E71923FF7ED153317DBCC5C30E26EDBE56112B2329B748C9C79C11B4A6A374E0E0BD079FDD610B27919CE8D47AB20B6F8F9E1A9CD5C953F6C0ABF20832ACE4E25D12E140C646AA048C8D60BBE44489F6C8BA23C6D7BA99A64A7C3032D33897B66BF3F169C5D424B612ED5B63C4EDA2E2C76BB828C10076DCBF5DBEEDAC1E87B813190B9D720CC05BABF6ABF4B189D36E0BFD963D22B47874240898EF2BE64D4E7FA30D0E3C84E91507CC84C2EA38F0951C0D0305138374C935595279FB79AABD231FEF253BD572444B7FDB4D53E0EDC0032106F4BA327255D03BA4AC8A98C3FBF2AC9582B934A78DE709A9732A3D6C15468A18ED0C6542535CD600D6A70F8B1849D27CC1DED1258AE5B3589C86020044CE3ABD7F0045A75CFC41D2ABDAC92E8D2CEA3A35E03793FC750E6D2F650052024DBD23303CBBA85E71B832C73CF47E19F5C82FEA4FF36A13E0ABBE558AA03B995C18A772749024C17EE690722A3933A797740724750E627B348B47A6B8406C0041F9F74C1382881FC187ACFA59F14E0C647F452DA2CB1620115312182BE77218748D1DB2251912780C7CE329840FF6C5E90C5B70ECA7898E177812503B8A32A526185124FA507059F4EB4D57A41E5177196400C3B75A9327D4C9940A7C09591A58C04375D3E6F51CE731B7D85E1743403DD6CF31011434AB40E33F532B9A5A17275EAC817BE6ABE76B2A23CACB14929020140A882E2EE7A7A1A003379035725C4CE204FA95796470908084BEC62E2C7FE507E77A5D3BAD7EC964A1E7CB569E929DA8EB3256DEA45E0C4EB42684C10883EA033E5F158FF296432CA720B293CDC4499F6321A823A2F8A1960CE04971B05991D82ADD955A08B853329E2D6818478F2B7A9F6D651BB0ABBEB8866FB4A8EDFB9D575F26723EA72CA010EFCBAD18CC5504B9850E739C937F0043AE8D7E6658507D09854B41FF0AF4C0A8662CF3C0538F0E3EC6B2B62F22E137FF75AF2DD5D606E92144562383A77E333BC1D8AC883BACA2A4DAB32318EAA76B7586088E712476868A4FD5DED29481E40FA4FA8C13D3C1B2B76296450990FAE5435F0F5B8463C5DEF327F03E855061282770449356580FA2B501EBDF06D69BE529F14B0EFA008922705D9634287A83E419FE87B274AE11DB7D08F86F759973F1E6BFC5A7AC497D723D7418EA3C81242282EF12D3F42F3E23ABEFA530F796A3C7C10901D646AF96E773E14FD81DCD3BC8438AE812E5DF2D194A21836AD95AB54D326FBB4E729000A465829EE01517C23883C2A56E5F45E85A116463F9C88194D354EDB45305AC4F15447034103AFB9FD8BDE83109E94AB37C6542F778685CBD4E6719161085A4C9C357728DFFE80F78B875DB91987DB787A143D091EA235337B661FDBEC10702DCC45FC620CB6CD87885B2BEDE47846D17194D0A6EC3E146EC52F72CC20C33426EF958766A0D252CB7598549DB78CA3DE8FB498640BDF12D77F193B487BD90CBD1FB180F3932E70B7622AADA49815D16349535DBDF13827101CDCCFF13775B0058E8E37211BCE66C76793ABAD68CC3CD203B2834CBB80E25DBE22C03D357BAA6DB49EF7DFDBFFB744CFC54140FD278657E52AD551840316F573C441D4020E6E6C9197C049C6CA5760EB3BE71A3D435214C410F75EC0FE045E0659574199C675844EC9429E25253DE4F533B5A1F6BA3CA865E6F11833CEE881737908419EC24E9638BEC3C51E0672EB7C7A2C2A88A231133C9A251252697B5FFC88F727EA8C40638CD6E2862991BEABD09E1F0C48B7D450FD15B6738E922474F6B9B002A29E384E8BB4DAE5D46F945783383BFF4AD773887234EE47C5378DF2195374A4742D674818982CFBDE67B264650665A365E4F7710F41ABC3944ECCB338FF8BD9B0DD3B2C3E65187C6E0E2DC0E03EFB1261E670A3AF1076A55A64B36CA760B2F14602F09404A1DE459D1914E33025A000E98EB2988D7686C97A27C39A8791CC4E7F78F3DD7441E81642ACE050BA406D57B4720BBE0F8E6AC1700FB2C004139E90F34AFB762AFC167796691746C31F67B0CB911F64A4E5BEC1FF2865F7A237C026F461D2B5E62289D36B17DD40F12171960FEFB290731C3B2033DBA2F4DDBF6142B86BE36D8D4AC10A9F104F7562B844FCBF8E4DCD95A0C87C0E1B1843D50911D46D5F8D916855B9BD6FBD3C686E244BEAD8FA46529362A3D851580ADB38F53D97405685DBDBB1749219489A53928A498F6AFEFE7FA3E39C9BE76ECD1211EBAEFFD6C951128AE5B3AD485CADBC19200517A8A4ED05CA2AE61BD4CB3923A4CEB8B71FB9CD450EC5F4CEE7FE929A0411E5E50DD50F6854D0CD577B230B39E3351D34C9E3E3588018AAC028AA08261AA84C59D2DC5285F0421315200DD7FC48AF01CF1545EFAFA8FC5F0A4AC005ABC3A0D31F104CE5AEA956275AB7901078C37EC873C8FA82C3934CA36DAADC1545529C627C47FC6D58BF96EA340FA1E860F88EAD6443201447398D0EF4A7ECCCC164616D303DB363041FA89270DA597CD3434F6FC1731F298E750D575E38048D72FC54657670CA656A6457359B78077E41D8054B203CDCBAEEF9C1D9CEB69CE6498583EA0081F3BFBCE5A91D4BE6A84769C4EEA3F87923383AB406AD18885E85912A8686F2085F6AEF3463BB1A833D1E7E6D02B3FD21C3E763E96133D01DCDAC821E881892547AB58ED308754A8A1839FDBED469CF177EEE44101C0EE755F1B5530F87517AA2E37FF99334133039C501C51C423BF0A362EEFB71B784B62E7017A8CFBED6B36792C99D50AA74848058BC2B6D2E21D0D4746E06B4AE405DB0B8303B6E05357A35B7A546DD97536967F25024B133478A8D5011E8BC7D3B40C5E5D97112CDC88354C7B4578D62BFE2C3B6CEE88562F50EF35D5E89B16DA5EB3AC5D60C3397281D1735F39E909DAF06D159887CC2C1E8F65CF8E5B300E2E01A2B34502E06B52F38092A67E736C7749CF87B4621E51C3978F5CFFBFC13AD60728C5074174CF4EDFA038960E1A888D9703A11900B3BA9191F8F9607085CA5778ECC12508C15FDDDFD17279DA5CEF6C19D651FED97140074F2672412A32C4A96A9C84006C6685E6195E949A2E6EF186985A8975219E2ED2DB37B31AD03430E45632559E188351F9482464FCDF8BEBB35719FEA176FD20F24BC87B258BA57B7E1F22CAB98A31C7CB63C50B321BE0F9EFD45F4ACB09B4BD4D317A70EFEBF787F08A587B8482E37C311693A94DBE1A0581CE343D218473301EC840FEA08F420CB92A9AC3295259B65E07AF7A964D7D490562D98B5A2EF6F2163C57E127FAC0FAB350DFCDE23B0C133F39716EE5355D8AE99D779FB022826AD099210F80CB2B233BDEDF0CCF79BAD4041B6DEFF2957FC91C26A3B0226CED06FCE0602F83B47A8CEB92FF5BDD08AA70598D0D50E8D9BC283FA26B03CAC5FB4956241ACEBA551CA11CA93CFBF726769AC8486D3F379568FDD93F02FD46811E867CDC3DA1CE08140949AD227F24B8905AD1E8A50BDF4B4C63375946B66DC568C66EE2AF4789A7D90E3767A132355174D68AAA8E4C2C7AC5627415C5BD0E393FC8043CDC97A43F88AC0FF87497D25C0E3DD4C4402476D288EFB3EBA79B73DE18E9369960C7956FA42815BC67A0B19EFC6505CC5B940E66475CE0788E62CA24E7DB1A05CDDF3543E191DB51336F4A311552104CEED6200302B18C2F7376A8E6E5746A6BD70F02B39EAFE3F88CBB8591C171D074D1CF9C54EF3BC115FC758F1819509C81E5B80C5D6B60991561C7DC300F2D6112A14411BC63D8BA455A73EA0B95C0ADA85009187CEFBF24ADE648B9BAC0180BB62E39B4285111CF880758C17ED2E6E09AC652C65FF8DDD4F270A5007D0A214A2A9967E544DAC72561B3EA624586345C9FE958D11BEF8D82CAC930948675F271845C5DED25CD9C99512668CB408661DE8E1406429CC638A02F48004F175CC883FEBB8BBF2011A3E60EE52C655AC064DBD42636FFA87440AF8072431E43E1CB22F37388C5EE1CD5DD565D605425E2E4552FD949A5386DDC9DC7A8F4A1F9ABF4168EDDAED62042D7617E9CE2A33CCBED6CC53B14629C31F79B43513D5F85D704B0F0D3AD5A0317DBB78EFF2C75B365F3D9C2C0DFB663704D6FAF66C16127A98C80BC26224BD03F61148A23787E45E125F85A3AC1FA16BC81573A9D52181A47F826EB76461272AC44A832401FF78A3FF46D473AE2AF03A1ACEF966D5B37E0380A93F17EE9A48BC5DAAC5B5BDD30489A63012A89DA9621669EBF97FE39AB380671E5341AE65EBC01238DD1A02E87E378F04D90394C8C1DAAE93DCA24A335AADA497B5AC85A7E14A11D07BF734C985C8AEC0F92D7426F130A11E29A18C5B2118C2CF92CB4EC779CCBA869AEA55898C2E0C882474DA35104DA01306D97F52D5FAEDBB5E72286358B5DA6298F85BCD193923DC1FAA127071DAFC9C74BF220D74D170904C695CDEEAEE93287A8B2AF8F3EF6D8F62501FF1C59B21CC5D76FFCAAC0BC91FE000E09AEF3808B962C473E882D02CDFB13B1CD1BAAF468380F0C4EE1DFE4110608FD95444798029BB628E4A12948DE4892F2D059B3B1FF60C43438C9C7CC9AB2F90B5B0465F57FD3DEAFD2A6EA91C5E7058F713B5FE5F321DDF3FD3AD3FA4B47F5238B410847DC098C240548B36AFB382600AF377099F669824686FC4211411216219520FEDC2FB27AF5C459BC39EDCFC910E7EAB1BFC0E26C514586CEF8CBEC51B2AB71EEC8C51443E0C51C7E210AC8BC022032D013B86850037ADE2B69FA12AA6969170EA0267F93294611E8B32A7A29984E9DC48E5C05141193ADCC11A0387B3EF795EAC6AD088EFB3D730E4FC140C8F6B611D1FD0BA292F33C659EC313F201E7AF5DFCA954BFC4802110CC6FF548EDEC373EB43C23CC35FC5DC2AE3BA269FD569B911471DAA3D07AD3FCBEC1473201C9ABE586696C2A2F56B41815D9061A614E24CC5010B97336F5900D2612091AABAAC905E86DA1FECB3397139A6E208C429214D64145080CCE3CFDCFC48EBDB30B2BC4854E8A439421AAA7276D6459F29731B760F3135906231F82AAB318091822AF5A28C51126CA1F72B8B755ED8B040438209CB36D91C008CC96FF8B647CD4506D5ECAD05B0E5927E81A4FAC8F2AB9A721B3FE088B56FE769540D3D8947FF720610B08284AF98E99C617E61B2310391A15623643CF9B66C67237A96EEA4A323D8EB9F645A5D4A98C3BB4F2EF61E2DD184A79C2849BE42E0D9DCF2ADFD82A88CEC8ABF05BF3B905EAEF60A3A289CD79A34E149CB84BC6B1136E558E1B2BB40ADFBF3019CED816406836F1DE3E3C4EBE2D82CE9E67AF5E3357B598B0A892B410030DD20F8BC8BAAF2F2207D6ADC895514F368FA97755063455D0DB3FD186BD989B9D4897B181EF9A703513424F878986535FC6CCAB654F689C3D3550620948AF0BB7ABCB9FD2E167F5C00A390526E9E020274987559A1EF93F4A3BB59365AA2BC338FA11F26946160B6D5521B7E85303F7DC11B320498C3FA26EB3217CD48BA181EDE99D001ACE458D5491BAFA8B62F655347DA618EEC8E0798C618366C6385920B2D5FE3DF3CF36A0937A52EE5281725D5570657C3EEB4D4D703D1914AA8708647FD0634125A3BF7A9AD76407C4ED4126A3DC33C239CC0C265FBB7A3CCA878760B7D8A8D66DE6F8B4EE492833EEF398E3AB5EDEDCFD24293EF5D403DE5B07AD6798725624CFAC5C070557051EC4520EC12D38F81DA94175AA4175CFD232BEBE83D1CED2DCAF3DD95AC4C024898C9728EB475D6DFD04F71C12A2D4EF8EFD078F53505A79307CC785E7176903F39478140F98EBE880170DFBCE47A74C079714E0D7938B94CD6EA4A18ADABE7A9036D2448B8C1F7514D8115D00074D6D73C2A736576AFFFDFDFE59CE7C6B36602210244A8607D35A7BDC678818B9E30DE8CCA7F27FFB94CEB4D2E6B82D79D42EF23554ACDA2204DBE06E3A06452FD22B2EBDECA78AF752907D8E594D8A9DF7ECDF315FA372ED039F08C9E99A4F2BFF94FF5F16927EFEC2BF66510C68BCCB6C5735CC6D9C84218009811BD4342A1E05CA7F8152661664BA7409ECBC70F0AFAA7D74567C2C883D9073EB0209CF784F759C5CCCC3D1E48EC9B93F5FE4530B99B2A1855B67D29542203B4F68E9D51BD62D08400659020C0884E9532D4D03223543C1E4F5A8BB8D4E6188ADBFA948665CA82AE14DE50CD0C20375E5CD46C78BA68A9077916B6B0BB2ADE9E412F175F7ADF27AF1B49C4306F0D00984DC7DDC8242C50FE38FEF433CD7937F1090A391325219A8428B039B8977B91765539883F314070F1BE1FCFF8C5699C74A0DE1D5D0DA42922A801771D0D68C469ADEEB7B7F0018E8CBA4120652F2F9B2DCF8CB72567543BB0A39C7FA5ACB937890FD05024D7E6CBAA4525A4D07ED2BB54E4A7C191B20DD05851F27D8A804DF47F4B4FF2B9444275933FF2619F5D8BB1F9283147EB26BAF8724CDF474026FACEA37A022F4DA0F432EFC6D53852B6122B76AFD7260586B9B98A5A2E2CC39BDF4D2BFC2CD51C53B7D5F423880BC3CDAC57202B2AF307407F526BA280A89E6CBF4DDFD787A722391928A9916ABE6846C4FFF88DE3C776FB67764D13B501597E6BB157FA1B94A95C32E300136BC418F5656C069FE7E13A0CE078AAA6310EBB609C01AEE15361A0FED89C7AB8BE630502D6857CCA7B1C0973241F533AE0B3FA20BD37B6FF2134E18E57AD101E1AC215D32820773BBDBED609F40F6DC995BEA651D4E5620F10CB2126CE193C0F05D6ACE6865FE1195977A0CF294051A2819ADA84368957A71E6AEC87C772B97E6316A8D8D040FF06851D2E4934B631F6F4231AD78F1CF1E11CDF130FB858FCEABF3CE3E99F513244C3AB3CF951F21DB1C366C568D87C39D2DA32197429AB65DCAC6C9685E668C3A7FA7A3EBCA166F3229FF60993FB268487D3A26BEEEB4F9AF744634E6CFB36119972EEC81EACB8BB3C41D96B330235A7EF26156B9A99F28513899E3C0702A0D443011F46E8A07ACFBC7A6B867A3DAB932966E54ED81F56BA0BE7E84829F669E61F2400BB259ED0F608ACCB222241F6BFC1A976027DFAA2672BFF85B1885D8B7BE0FE1DBB85DC8D6AE26B20B37A1B2E560934571E13B0388CBE8D5DF53C2224668D9A8C3827C2A849F8EA4A7DF075F4F884C09368386D9E6E73665E289564E89B2E4E73A286B59C150E8857233FE2BAFBB63E77C758CF8FC8E06339454390104EED193070D070E1ABB62C007073FF9918C2C1E92203FF6E0DAB44D466D081E743B11A5A1E519D469609A61742918A55835A1DEDAAF865171140E9D96831F82FE27B7D49B7EFB559F758D35BA29F434DA5B8F7DF5EA36C3EB1EAED727FCE34983FCF06DDB9B28D7C695A7F8FA2FCFBCE5D25A2AAB7F4E9A0680AD558697241684FB9B87E9319CB9764535DA0A13C6D4CFCF3FF2E3639EDC73526D2AB54385768B17F929A7F17B0EA264915862BF09F6E2CEE742B8B5732DF8392ECB5FB1774D41B19A0259BA1DBAFDC9F1A4BFCD6DE35EAF37FB33A94DA7785B64B0CD977E9BEBB741930F4B080FAF76FB9CE87F6AD08F50B8301EEEB69008078D822165FE3ED9F705F203CD02C5219D1A6A1D97A6B0EC1DB828742671D8C010150AAB6EB56215E40A06C4A7B90611D7D8B2D518600E2FA69BF18890079955C4A26358532308429A0DA5CF377EF90D426C143859D5F1C4C56FAD61097751AA8B8D64274506FC375132C1B8F0D13BF3B9E3E1F2B78278EFF57787439F2720DE38E0DBF55491E3129654A55B2541B6DC10F345694B84F1C43DE1870A9C17EB32F973BB2338549941162C3FD8D9979C44D077F9A32711668B96CEF05F76BDEC21FBFCE12035EC9BDB458C72121B488A76653A30F494EE89889209F119CD864E4B6CB902996B0569B4757D2AE9BFB42A76F4BCD15C4C8047483BE3FD13EED5358E280167CFED4B22C739542E4B8B12746937226D1B62A9E22D55A0AF461A867A7BC23487EE45F0E6B92B078D1340C871D9BC7A4CF64966DD8D250F0B992915D57A00ABF56944DAF7EBEF055E29C81C2E7DE57420969B5B69B9DFF51B10A37467E2B1EF804AFCC6B2C73055A8F02A19BFD6392FECE49DC35A06B947DB70838511F4817A782F627B3977213B0ADCC550D3BF5103DDBF681D5E749F95DD8AED9F47F643A1B4314805C4E46DAB8612AC2CD0F46A86254C9059D7BF76B2F552EAF6F1F5577750A1C40467900BBB91B8E0B274F7B46F51DE1F3A1AE6A9048F6DDAD3195C5A8E08CA25E723C291103A2CD8D5048A70F4A0201E8228EE08DA6FDF66F4E02D0BF6A907FA75CF16568BEBE467C516D1CF9BB4BCA50F2E9EC35B837E8A82FEC2A0278BFF5B4FCF73FD3B73238F7F5BA81687A63A12868D56E41E0F2EB993FF6D40C9CC785533F41ABEB661E37BF1A67BE5089DE2D2F1F4D5C82FEF682C1ACF49626B194D3BB98F06C661D89FF6889EC622483303493E3A00BC5E1F767471034EFF0C89E42757A50665F1C243C94E8770087AB8871DC7C96807446F6AFA7E97CC9CA200EDCAAE92180CBA95337CFE799CABE0A31C3932E0DA948547107F9E48F7A784FFB3758C53FF82EA9AD73E5FA6B2B5252FD2B3F3F32E96130FF7FC5DD4C1437B9E1A85A75F1998D16AE2640ACE4BEDA47CD9303D04C44C91C8480F7B9CF0D69C48F0A034A216D549CDDCBE3A8FD7F5FB367B0C3EBFC4BA9A339476613A28A2379B5565240F7B9A8E4DA9566ED60D00A115A1FB8D41DC0A981D1D6C953AD26F0CC9628F9CBC3B46A1075B15066C295D459A24C8CE8A603D9458A40D0C9D0DF1C6793E264A5CD251C7D2475708C7F3EC12682BD924437E39C75FC66FC192B7F2D44B97F93D10469E8E79266B3E7742C65029EF177A1B6AD780553F2642E1B43690C4BA35B0E9BC68C41AEB8718743885DBEA3B36543487E02A37C28E450822982F09403F589ED41875685B550F7D3EB4E54C75BD06F6E8FB03BD668EA0E998B9DD3BAC6D0A504BE7CF1238F24115D4C32FCFFE96AD687AD75E36E31BE7708DE218C1D470AEE5129F68FC921248B3817B72AB412122FF3C81084339F209CF299E90205997500FB64ADD0204F73D2B39BFAA8FAA773E294F147B0F973AC3F6BFDCB5645614944BC0DAFFB7ABB60F00FBA5F510307847D2DE12315C4AD21DA36458C8E544E3746E1C4C76923C59722BA759E50EEEEA48B6B73D15AE2D9F236A4C40CC6F6966DFEB8669B29E32CF2CB0076AB9631742F4F9BF936AC71AAE4EE1DC5A3AC1B5702D1146705B5A886AAEC900E86CF8D8D86379656CC185F2D6E4A126D657F453AE9EC9782B4D364CD224FA83460E6D3FD21246BA0A8E20C75807867C390E0C9B942AAD2230E82252FC263EFDC20B51450B4B53DC8478D280AFE9675565B47CC1A43E330ADB501FB86F42C063A6C27944DBDA35782F02E2630109FB45B5188FE84AC0E4F208BE2A604016413A62663C4E7D9FEC72EE167E541187E3E45E98A744686153388BD8968B191FCC8187D624C00CA585072B384E0E35FDBC0FAAD6F9A957020354EF69827952FA076E8FEDF0EC568BB4CECC5AD34B140EA8615E7FE1E1F86ECB7FF2434DE3A51C1FBCA52D53309469450280658B770EC89E11706A1A0AB525775EB437D1ED15A046603D53789741A6B43A6A932A7973F0BF809DE183364A98887128C2B26E0D1DCA6CCE9A9F35344BCF9A618144D1FAFE26B8AFD3304E4D1DC1B52922F66F3AEE68F7B1FF1F44CCA15588E6213C4FF270E4B7F4C07EDB6A966B9D2A7E7BCD2B6D9916927B3D8C91F49D924034D558BFEBBBCB54928851C0B77A1C8842DACB3D2EF783355E0330B9380F6B817A5F0F0C91232156D7CCA2992A2E3E5CB6495A19775817AA22C26FDFCA58AF46B5FC3D1A8B8100CC076E691203FD69E1F7E9E93E98A9C356D331164BCE2098BAE92D548E1F6335C72FD4F4DC08EB1CCD69A289688785CE3D9FCA08D3B3A86431B6D5F0B6011EECFDDEAD134B711EDFCCDB60CB1FD1B688BDFC4E3FCB8288342BCC8D54BD1BE00074D3CFB671ABD9D95CFC33D86F6A6BFD5E505F239A8FAAEFAF333D667F1C8525DDF65E6F332AA6AB1BA267F0064565142EFF34736A8B1A264FBE7BF3C2F512948DC900A080DDD293E5040C42293A4FFACCA687F328E3C8B4B0A74A8F8D786227A6D438DDA9367FF9839CF8FF1B23444FA18389081CB9BCB7AF4C862102BC4CDB27048FCFF08F4B33FF5C3250C27D20000389CB6AF85E633D251C428FD8AAA1D9F8C04B78182C7AD07A76102287968A6B1000C6D1E62E9F1C47F1637D6CDE428010E45EC75738DE43ED3FB3C33D5EFC198A034B458518030AABD73025B0F66944D6ABDAB16E7AF88780F1410658A0C7BA16F962A95EDD2551311B9402A2780210E031E6CD8740175237F1B48F91D1272F562DD345DB1876C28874E1FAACDF0DB7E21C8AF3B19EEDFD0A8C30BD1FA6B0B397627980327A3140515BCE2171C853183AFFAC452872600D435EC76A47925C58EE1F8435B6E83D82004762AC61E5F10B7CDB07E68C55D41D8F0EA9A01461F6B6E3613A89E8939AD88F2FF56425AEBF987355E76BA55A48B7EAF7DF0D26447DD3B1520A7E7EC653B7465A023000B615D56B50DF5AC265ACA6DBB5179A6B41561EFF9BF9AAF87BDFCE1ED4BB979A18D4791167DAAB4C09227BD9FC0DCFCCF567C1184528186EA4129CB19EAF1B02EEF34319180B0C614224267B8E75D7A6FF415826D1093897604DBF69E461BE0B2209E1F1706BC2EB95C163EBE0FFA57976A82F3E4CDACE15865FA6F2DC10CF9A5D840CC8C70A1D238D46DC1D813904DF1FC7DDA3699786187C132785BE87994B68CFCB6F61CE352216EACA71282FB2A0D31B4D40EE879F409B96EEBD78DCAB2F9D58F1ED04AFBBFE76D4E9E25CE446BC7C24F9A8FD33EB075AB12BC00EDD0B2518C1E2E5DEC2AD4FBEEDA277FF504DE71E48AEEC31493B8E0A85EDDA84DF1B70342770F399FC0DE9743C5B112F8A8F0CB5EA0FEE2915752817469625CBDC3D178ED9E63DC6F215C8192BF19EE31043DF949AD1498D318B9164F7EBE69867C70BE2A4574CA05FDAFC08D072FC383A3A10AAB819E86AD9361C2D2B83D31A54CDA97314F6FD8CB4625ACA7FC4807B9F0E0FE56CF328386715DF3664F412BBB0121B7E4ADEB4782E5F476B45441A905B1CB38A094F9C81488CC6717AEFF79E6576CA262802ABD9B38F90C346B3A1297DED3080C4C12A4D050CDEF3C7EAD3BC5E206FEACCE6E67911DCA4E120C9CBE9B127D7458E74668DF7B6CC511C6C53ED786F514086DBFD7F689AEDD6C01076246FB2AFC7A0E9B0A60820B3DD921F28C15D5CC03D2D18DC911FE92B251C2A47541CE7F3F04E34A14160682769626CCA642F19BFC5808384B770880FACCF6DDA6D7F188EB1C1557662EB4507393A788945B8274EE76D2DEA986DE7B69C66440B19AABD1B54F4AA16BB5537FFB43C2F97DCD061C811737FB08884A861840D9DF6879C7C14AD836F6ED6427682B1CAAC6906E9FBE4E9C80074A9A32CDCC00732338AE5C60B2A164893B61E579E788D008931EFD275407B3F2B24500B412F123E7D04DEDD2C9D0E3ECBE9601696551E9874874CB83609637FB674704891381138683A091B75D69B4A79581D1CB40A2FDA1D95387D3CA4210740A701BB8BF32F51F3DD2559C5D1CBDC4F683E144E04452287EF3B77B0D9581BC8F09F0F3B13937AD0C04F7155D8213891346237F98FA530D47AFF4DC358C057E3C4D37FEF140D1DA29D9892150FA35BD0C3D9E2C7E1A8EFC61D7ECE277763B5A5988E580818758A59581E2BABECE73A2953FCCD22A949685D2D3C94070DE149A6F61FF6878086433E0F3C3F8DEC532E2CFA5DC837868D7D02D2FBF2EFFF712DCE5D198BAF0E04E8061C01FDF5A9EA7E8DD9FF43741111032F7A807B9FC66835F35295BF2E124EF3FA6FD41788F8F668AD3219FF6F740833BFFFCB9BC6291FF4B7FECF99053CFD3F71896FFE3F07391B4018F6F312312D2B0E59F8DB09783B20FACC13C29627167E38BBB7108F8C89446264EE861AC27E9B30B132594E4033504E80CD6C0922684EA9D545B491A0013F18772DF1D8B2164B5A6B22E107086EEB3C210A3C238B9FAA9573DDC676CCA26544B39A6CA3F6E54A347E2A6BAC8513A5BD7CF0213BDACA9A4811F1D99034EF519E5326522ED549A9D2B67FB13B0F3607EEE4217F77A0E9852981B3463D9146F8AC3595F7663C93295CB7247970721D2D7B8B29F2A469C2DB63DAD2D1FF8D011FA4DBD5579F77A18AA56777512EE77256B4844C1248E591E5E68C6E6DD7CB1F63D7CF80B13B9369D063159A3361222AE7A65F0D580695CAC7E0375F6EABE9582A3D2A7370202A4010178071BDFB780FC275E90EAD16ACA7A162641487BDE58DBF80BE1354C87ECB6CFA6E5B60E0712F93652B44995C9130935D8B8B0E0D9BD086D0552EA77DB2CE2287922BC4EB142087F53B353C9266541D035ED66C0D2AF1A3931910EBEF226C387D5808A87E02D6B2BD67E34527FAB20FD9AEEBE4A0E2BA0792D660F671FB2A3A38A544D01D197219D25F95FE8E3E3FA75E6BDEE2081BBCCBAFF46C61B12BCE566E238EEE67E086C45FF4C481632A1B2A6A57C52474CF63DFDC7061B6CD19AFEC259B97A6A6860A0478865E59BEE185AF1C58B05CDD30A6DFF533A37EAAEBA58FC5C883D47C8E96519BFF7499E3E42342676B27AB691AF833556D4AAC0FDADFE70B39C232C1AEB0FF6BEED8CF443F3507A7F5CA1CC9D3E9798177FAFBCC5809C35E5C10DFF8543508DCB07540FE180576DA2FEC98F4615A0F3E20A45B03D1BAD4F88802F367C7375FA15A16074781EE19EE4CD0E1C0EE68E64BB1F78354E0202A4639DF514864219CAEBBEC94640A149A89A27AEFD26B7D7ECEA9BDBFE5283650761786D2E49F5D08FF8C0785E6216105048E0A2FFB31C8AADB7483366B743E41CEA0223BE7D2834116A8C023A101D4E707D19FCCBF5431861782165B7E6CC39130AA2F5F5880B354267B1E4ED35351760756BE05317C01F6F8498B720173F4ED39C16048807FAF6DE08196798C725B03C887DEBA616B7CA4093183E19CB37207BAF540D98B494D33FBA1AD2035BAC4F4B76EF0F64B6438529983ECE1924898BAE5E87BB7954C9C5F4A3795669AD5245540F5E4E6F2856774BEE2E1793F81C85FE80C9CAB5458D77954877365C2DBA0D599E787BC5E1A00C86C8511A8D2010CEA576119DD10F3EC4E8CAD2EA6F56EC42FDAEED4874BEEF1F93C01258019DF70D455F2E674891E575980B40B44560C6BBFF8D56CF99B0DF8C1B168AF7B915F4C885AAB155BABB4203F553CAA49E815EB98FCD215F71D3E96C5ADD60F919FB738BACCD168742886B59B5889EA17AF83218A83F37311C174C7A43A44B84376EE110F8B32357E50DAC6A860F0474CE1ADF291564B1C6B2BBF0688998DC9517AD93FF18E43B0306D314C4464D151B6FADA24FE6AB5780F2F6FFC159CE4DD05C47853068FE3A20B219769E3013D9E1CFFE9E66AD9B9946756D6A774509D4B61188E81F609FE354172427D47415DA2D905821728BC0A790820D1A1A8FD4B5EF3DC8EE0CD08D18CD83B9BF7F3E5FBF89DF107518CB3C737B02429CF5F7AEA69B09D68A41D1A26FFAF59117E862501BD8452ECCF8E83B077BEFD57D8B12D63F49F57DDA6F22C0586B83F98E7A9ADADD964E3C7B8EC1271C12AE385C96A155EA37AF9BCA1A4F0284FA5C3B353A3D887DE0242034ACC1BED1B42FF5B8092440A84F85CB3E49FB3B94F09F0BC20D1F3CF68D131FBDB73F214313DF802021B67095E7AFCB1F4F349C8A545775A9675537654A383252ED03D7108716948AFCC81EE22448258A35C19DA01ECE9993101E6AFF9BBAA1B0708BE4A91395E457426F51E1CDCBEDB4CE7D86DCBA2DA4720DC97541241F205AFAFAAE9242609E71283719B959B35D500313A5B369E0957FCC0D918619FA9C3E29BA46B41538B1BC86FCA7BC999114A5E9F0597D5E9E95335B589237691DDE5A5DD9DD4307A3E6451C59D543E035CC6F526742DEA1BA603226336132DA0D73100800388AF416953396D297E8E2A35E7DF25230473363C3FE5342CA532B47F7A2D2E8F8A2246D7013D1BD6977511D5B35D9F8F66346C8ED9D074C5942498AB687B799D28E18B7699A46A447ECABB1B7DD8C2D994ABA5F1BE01CC2EC0FFE944DFDE3C226540BCAB402B93B162675DF31425471B05E722B4A986D685B04940CCCEF0E39BD71BFEAA0C4379B9C001BBAE4872AD9F94D0E7FD571B9028B2C41B8826D19122D9A2153EAD1626F9FC16CACF4F838C0BF3E3A99106E10C91765AC74BD318BD997F0FF085FB1804A2DB143255402DF3B68F2434C0B81CB71BB8DBCAB561A23DF9C4B99578DF4843A6AAA56682423E4032235424B574F5331417861581653880D49A222A3678C2F0E2E8B62F7C7A589590BFE1DE4D4A76B7FA51ACF397D38B5F03608DEE2D162B3B9E7230249FA74162BA714A1E86C02B854A5435C85C5E730D2DB05873FEDD86B4A2810DF5A1A05A6F8A354C4F231D35143A84C78BAB99D7A84364D4943A39143208C2CA9680AD18AB19608784CBB68F18BC9C349888EF29031C20B8D4DAF1CFDD0CD6961CB5F59CE0D33347E51AE89B6FF0079DB3B681489137BE5A979CF4AD91506FF3AA32E5DF52A890D3769DDDBB5FA5F7541BDCFC0041EC423D39EA0565041564160ACC6A243465B132EF4FACE0548390073B52CE518D747E5F843496583C7E3162D74CC41DD2252F36F0A524EBE6D854B8935DD96E33AC2C9DD87F70F7F2812286438CA656F8722032799A3FA8F91FCF2F51A44B5BCDEF7307E634521EE2B2202686839E668CA61654EF8957627541CD5593071FD3B8C4B2B82BA6D37DE2D7AE25E436EE8C7C2FB5C3CD6A98950102EDC848D824602AAB7C1CFABC9E28C900801C6232360B44092537E25203BC8D4F2DDC279D90D69DFE38AFD5BF20296542C9FE50D629908AAA5D7B0EDE2AA708EE10639F9C826DD3C476D2AC667CF2E5366041AE04B8E253CE1E2DC0A9BAF04DBB8C72FFC9C073FCDEDDC7E87B31E03A95E17F21AB175D3A73EFBC3461F91B50751994DD1CFD997862BB8F6931776FC3F5755F86E7D7ED50A058F44D4CA3262F4D35110DF0F844CF187961879BAFD9D5DF19A61F18DD99BBE77638122D15B02F5F3E22EB901C2D60DF723B3353FA3AFD88254A94DE4F9E7C72055E8E4BBB05F113D22FF8D812F5A4AB5002DC22F96A2A72CBD6D8B295E24683749F875C9792E155C0593B2B3A06D7C1685C8A01BDF24C95EB9F7FE116A6EF45E4CC7EFFE6281E967EFAC95EC6A8360FD93280E16F25083ADBFCAD61876F9CE78C1370E1C683B9F6FCDCFFADB7FA56DACD73EEC2C67273D7F0A64034E7CE2732FC7AF3F08D04C7987055214746764A2B0F668CA8420A4969BCE8C1550FE016A55ED0254432DB08A3319607BBBD8D35166C44238EC24E3856A2385DDE4136BDF0239F9D1B0E281BA5DAB901DA045B7676B33A412B73B4B42DE668731845B2E6B6737A6C0B06AE427580725D701517260149A972486595CF4625D7F958246341D41E835350690BCF57CFDBD2997E4443C8A814B5D6D99239125BD49F15342A88264AB56A601E309DC684B6C95196093F370F5B4D0645D441FCFE186948B76EA8AA09EA122B1C24A85F9D243BB19079D9CF5F66B7E1DF113B7B0BBC935F4A7CD4A94C160A0E1336687552609DDC8CE42F03C9C8FA6F482C999698CB6EA09734D5ACA91F41CD0C38BFC76A16D92B2CA1E8FD88ACE9A766846E8CFBBB35D75168A5301BC70C35667366076AFCA0CF7C99A79865683308C01406E3475211878931368A39300AA93D67C301E7A3A93013FEC1CF85A62635615928D5F91F1C70218B8DEA0A0E1464F90A3374F213E7BE21382076939A9E202F133A28FA70C1162FCA184BC4BCEA2623A393EFDDEF0CB3029F46408B0BCB43AED3926440193AF733F2BB29D1B86DF2C56D56321E93E49B2CF89FE4946055506B39B92BFE181282764F14FC693D0C21E4CEAD702F206C3E5332EA11AABE415B5D88958B20A62889BD32632B0EFC89409872CD0F7504FC559FA4BDA455AC8E3AD4D7F1E1694E2D4D11C0CACB2ED6A5A5804CD78504064EC77E0C1A753987FE79D74BDE5E817B4793615EB8348D2FD509F1131F83BACDCED1CD2D33603E94AF2AC8E9F910FC18076575F1A58876E72A2A66A0E6D5DBFEB357ACC081889B4431843015A77992C0B006042BAF8AB81DA181D748CFF891D3055FB5345679E15AD9A0A1F02D81C8788A834B6AFC5377FD6DBD89BA44F77A1A1FCC30BB937F07F68DE17873A1888CB82F1597DFCEFF8742A0E96071D21F0BD16DD53EC382B39F24C2E9EC315FB0900784820C492B1029EB724055CD5F29C32E3E8442C52754AF4937F388277BA971781A984C8305E73F85BD6D2D403E94064837FE6D9A9B984D3C58ED285224322DB37A896DA1329F3CAF90D68353D48B027B41D890886865D827F504FB7900E09CAA0E31D67E3C693CA62A522E7989683B623C2848B43E3ECF6B2E914BB01279DE60475E50BD4552F848671A16D2285D8C143CFE3800118112004110EFED1EADBFB03703C85A06FB7D14565B616E6BE8B644526BF2CF99FF0D0301E2169C0BE967C211C309A4BAC7171478F70F886A0A81292663A63166711C4296E55D3F34152D92DD412681AB34060F7D64701A19B28CFB8E5CE15E58ED2324C07FBBBE6DC836F632354052C91059F2B16E8D5F19625B0B31885BAC1901030E847A173CC1685581D59DD02781EC891650D722E0143EF3922D7E26963A338FCC4456468B09396E2C8F9C57F3680E05A048715791C39BDCB0A895DA87B441B099154C9C1A02C6857B1FF89472815838381B8880ED767E2C53EA2885585E165AA3B5D07F9602BD7BBD874815CBC9E820BD4C1A6BEF4FFB34517B7200F086004E02F6B7F821AD3791A0EB8AC6C41B6C3AEABE68045F0DC17DF04B7F7CC0717A0F82FD4AF39C429629F8B63FBC112EBAC5B6F060A3B1E3CF96451CF770E586B01CC6DACFE411E184E5EDB7AEE683B0EE68C3EA037528B77D97633A4D7FCAD682C055E8EAD3BF218ABDD0A8A7E36ED6127536990C164686FA22C0687C489D320129703471CBC37D2F0A9EF86D73B64D4B7C5D3EFE3F0A39F22EEB221C09B4D180F175D00E791BC03EE97BE47531B490E8207523095238082C1E10F3790C4BB94E72D298940AF71B62FD7BB3A5A0B42D0C3288247AFD6939A10BD6442D2B9D594E23049296460753AD7EAB1856F2079B0F65319A2B9BC34AB6CFAD081343174EFF893E3ECD53A90B69F3146D972A36B882A238FBA10715CB1A5C1AFF1A3FFCB2DC1DF4DB3421114185CE1BB6D5D863A22B7F311A0F01C82E82C56AD32EF99433700183A710813780C3C0BC83412A54D8FC471C85E466BDCCFD8B0228D35DA77087F8912C6033FACF101B66AE379C5ABB95B92EFAD9D2DA181B2780B9DF6053FC8B2358687F5B11DBF580389A62229D7343783DC0F19D670801A576D75A949CE50E74DD074F0846EC8507EE032C19916CD56466A48965C7CBFECB82C4B6A1492D29F982A338C527F7B1ED91F60F44C7026F65D6B89EDD15F23D4408317DE26FFBC76813E6DFC7E8E5825A079DE8AD29082FE7E606C107761AC7E602C8184E178ED76811C37E66E3FAA13DBF3B234FBDF5D53E208D578D13100FABF89D9BB161F630730607C0272623B4C052C80F8D5FD3CAF4AB77F6A7E29C07539D6C857803EFEEE9B3E6D418AE21889522AB9C63F0C683F8AC32834DCFB2E0A4CD7C757CCA9897995FEFF23F0ECD285F98673E89089343FE816A0A0D96763CD0D74C9433B95AEB8C4960067D0178DDAE925BEF4250ACBF1874A6D2FE1723A1144603B0FA187C07D92518C8EC4650DFAA92C5499635A08DEAE33685FAC83FF4F6F096D58B2EC690BEFC1CF5539A6E3CC73EF9BE949BEC78B1E021BC7595F8C08F1F8E805429F094F5CEC5A0791903A45CC350C8968E3757AF82A750273F104B4872196DCFC9BE9BAEA3FAAEC1728920E6A96E1A661ACFC1962C8CD874045913BB403FEB50371F3A836F2EFD1D8D7BA477B2885AAEDFDF636F756FA10C99728CBCCD16CA25DB974D35C5247EDF20CA67BE60384F7C757E5CBBE5B23F232CC4425BE674540427C0E1F29976D7DBCF6C46EB54BACFACC55E8EE04E1D5A60EBB8AB71800B25E825B9619CF1CB159AE1E2D423E953DD7F1BA4E52984FE8FD366A4D4071058EDE4EA0AD555BBE659EB752B7DE2384664F36BBE0EC2EA1F8C38E657A1A260EE9CEE8562B1841C49C8A8BB4E01BC2E530B0E55B62D208C82E3A2544FBB0996553114E792862C7327D9A7D5AC8AF34A5FBCD416B27A8B07849D5C264E4D9F2ADB7FCE56B64634E68F665734B5ABFF79EEE6EC488BE89732B1EDAF26D08EE875A438427349D6C6EC97E494760A68AEC58C6A96C38F7F820BFFAF08CB62849DE085326B39210C8966FCB57996828F8A684663F36B7C0C3B0F036AAD9BEDDCFC4D6BACFA11EE7C0D212DFD5DB043D6A158A5A1C7D9A3D9003048C406AAD07F687021B1533B5257CE713335B6770221EE00C767D583EBEA399404DED8956D9F20FC83AF4498E4B52CC4C994B014D48F363FA3F141CA3AEFAF359FDCEBF4601D011094DB82E5F293835461B56E186FD74018F83089F4EE4A9C33B4313EEFD651030835F6E6743737FABD775AEABB6C5E5686118769EC01B575C5E009A08B7B744072E821BE14BBED5D2DF21A0580E77DD1A66A8D3A5277AA869CEC43C65E9460BFBDC667FE90B144D61C3055D41D1D6500C097B5D785D168000E5D6A31EB3CBD58315012F03DB0B8EC20F50493ACFD29EAE06EFBC03E679A6C98144D896F362F8CBEF52853EB7E119C775B8939872F0DD043C911B8044D4D6C2F7BA44F8CF0CDF5570060D2955C321F73964499BA6C37C6B390165DF88D5CF5BC1AA9F9F5D966854CA7220C3A1A0215863A65446771B2491A22C6C23444262729C2F18E9DF6EEB0549E39F2E5A27FD86C65C827FB0A4927748540813D8D2DAA14096D1BF983B9A0B15EFFD201AB81051CF0751E75918BEC9642A42C2CE5E4D30ECA145D2B50642580F0EF69B4E2EFE4A132E0C318AAD4907B428335CAF55B428335C8B1665866BD1A2CC702D5A449E61C090E0D7A694C292154CCCF808D30C3C5E9E3236E9A05A068229E41156797AABA35B91D1966F6C99B94F5A4C2454B7734A6F8297F13F1579E862C732DB1580848AE00F9ABEB256A013225163AFA4C46C736CF90E19AFB398D3532334F7B2B9A54493FF78FE1B202CED05BDD90339009BDF38A9733D98F33714E25C19354F1615367B902638F63A12DEF02677BFCCD9247891112E1A0481BC0B584F283A8738DA235B680DDAD5686A618FD761963FF6963EB2CB04A798A955D4F05713D572DE9882FBFBE5D2FA0EFDFB10B65A26F041808F1A02C95B09F04F5F49A5E2B42663CEDCB04EEF43C07E89E381F1DB6459DFFD408619C720FD5FF8B7A32B5BFC68CE57A156D80586857079AB4672584159889F817AB170876152E7C926C409F25F9397126FD605024A02484700018ED1DE5FA6B104433B8D76BBC975CB2F02BDCC59FC6476899C2636F433D52D5681C858B895D1E7FB87D467F1C293F13A0749EE6886F5658BE962E5FADE53AFA4F4112D7B722C33FDA3AC4AC1DFE9004BF2141CC6F01F361CD0371130ED67B289E34F8E58AB4C8DD4E58D5828BECE77476AB61771CD683CC5927EBA9F4286019333C87B3DE654A96AC3CBE5EDFDF3E3A648D7C6DD1376C51CCFF14693C56F4CCB0792FFABB977D8188E16BFB8417692C6EC1F869D27F56554860B24D3BA5961E3A1E8EC0274A75A2A7C02CD10BA008D5E5F11471D59A964AE9989328853CBDEA62B2247193768B67E94ABE5859D4D2832CFD507247C899B24761BF2E34CD490668FA1A367C2628B9822720435AACC399D0104D97481D356A4DA39E436ACC9351CC0FA61853E103E83EA0B5C37A5A940C2925DE434166E5D68C4F54E8FAF4FC657355AC0C03DB52AD5581D074F693E8AD1DE26C5DC9D27AC095F1F046D4844F1F809C70AF7313B46C8F4E55D8BA5F585F28D824D4E3D4B7499BB8B7E85262F78E672FA9AD978ADE093E56582411060E24F428C76665034AB9DD6CF28D7F90CF3D35941C8C738672C49BA6E5D64460790A23FC8B3DD328C548DF1E2B0D38FA87C0CD89BB346516BBB8CC2E395AC32ADDDC07BBEC036B7D879D2ACF9C69D7FEF598390FE9DB16D64F1B34759D018951005652A395C743A08DA706D92B0C42A888765CF1B9D3B6FEA5B061468D764E0946DEBAEABF8F24C256014F19930984BA63C03BB534571AA6191A969EB77FE758FEA6FB466C059A71A6CCE4827C8FD7C4CCF0E3842F54013559906228CD1EB301048E9AAC9E0075F8ABEE52F2BAB14508D3DD0A7C1161C369664B067C80A7C473BC2C5F8AD76A18F64D9FE62AC53CCFE6884D75A24B7ECF6F372B0748558E48B002B5296D71E508CABECE299F0EC526077395A6EE8E97EAF43536897B14E4C8DBA52E6610572BD2CA4CA11296D63DA1BCAC94DFA3F4E78732F5DE5726B3DBD110D1832144C5657D791523332323D8A31A54392321813581B6B38A4E4F4C008F8AFE20E4772A1223E1FF8AE17C277FCC0B74B74617DEF3663674660899D1AD7002ECB1A089E3178A45F7512044EB830C228694D5AA545716614D46BD52A2D8A33A3A0D62A2D8A33A3A0D62A2D8A33A3A0D62A2D8A33A3A0D62A2D1988E3EC32A8B54A8BE2E232F81584D985F19AEB4214F033F67F3791B2C34633C31031F5F00E2261C1AFF1947A7C50BA09B70C3C3F5915D0FEE27AC6F23A1C17253397A1B7D4F25DBD56BDBE39AE5876B5652A70288681344B3799B50CBBCF326F38BDB22F3EE98906D07CE5654E680DB3C37EFF034A5D2FF7EF49074ADB6E4DD3B8C62708A8348E06C1E05F13F2B1FEDC89E496969E6251320B5DB0A4E58B22F3FB3B753A6A8E015777B3DEC4AA0DB17396A268152D4E624684C68CE7F97373977FBBDA637F6BB467FA2C6C9A39238610189CDC5CA28980F9758B1139A20AB83DDC0F94EC4A6000B946F93DFB4FF87977A4DDAB50C2C004C6594EB8C75EA73A493FC6BDF2A805AFA046F00F484328027E04D440597098C8C2777AFD065674F93806DC947AE943DE10A070CFAC8C4AAFC37BFAC47208A4ADC816D4C9A4801C44CC74FE3F36ED3D265A1A609678F760814F15B9F44A0D8FB43D6E7D2261955E4B3332D8072E6DF03D6ACABFB72B1BAE6E2821771B64B6C0EB5845C8D6F259EC0E9D685CF8DD19CF7EA004983636E6CFA66237B5ED0ADD05BA02A6BCFC10C66DDA6524F4B79844C2366D8FA78D24E5FA44BC5B70CC88E8DD2F87CE7D721BB48135A80628E6A1DB19EF0F61A4C82774ACF2C96003BBA6D880F07828B09349E5AC94F88B4B855D3C86DA09D4964A8626CBE38D1CACF2FC7EC692E33500110C75B42E7F0E82C6202B9DBB986E623A7506C1A7D6717D94A1A78BD25FEFCCF4A977AB75DDBBB3B3A100866E40E920AA2812AB5B6ACAF36071DFDA57CDB43D9371B15A3B3DCF3DB551FFB1B4AE6379A1D71EC5CF331787096C165036E8CE6DFFE1830683E297EFBD8309777877DF088D2A8C3100A59759B969FEB7FF0186309D60AA12346E082CFC8EF35AF0EFD0B2CF908EBAE61541D028B0CCCF05E75334714FB523BEC62ED69327BF5B3659FA08FBF4C95EC49C3DC7FF07ADE267F5EFBBE83BA08907D51C2328BE7FC0F53F1656BBCC112763D1C6DF382B07531D35A38A5BDDA1DD6BEB8700591AC7AEE3EA92172912EC178C7F60862EFA09F0A10E86E16D92E45759DB8D51606452600BC42CA5D3D39A71015143A589D4E01260309EA2073E8DE7374B193843AA7C5C9205A6A808FB88A359BB2060DA0545C839980C5DEBCBD8CEB41FD035D99D5C4322551131F7D557EF8A124D2FBD3F38318FFC4D0D8CCC4CBA37436A9B63BD9EB66FF837B7AD0C34192ED10859C95B623C01C727978CA6BE12BC9BF5DC436FAFB456E239B1FFC3E4959070900C68E0F620AB6030C2012B2B7FA6A7AD5B377B2B8C14C555B91852D6A1B92EBE1CECF6941223EEB56D1D0521B328BBC2E40EC79567B3197E46CFA3243BF9A256D38D32A2381E7C03BAC93958CEAC22F3BC94B82440716E70398E2D4785ACEC043AD969BC5388991A3465717F20BE85A22620887AB6CEF481B24297C67F80016CEEB3595D44C2CF7E5BD53DFE8533A5D5068C9F4B863C24A795662CF0A032417D479A12E835BC94E6AA634EAA3BA3C294B8BC86D28824DF6BC98A817DF7260F1DEF4417D9DFCEDC7407832BA1E012453F304783E3C5DF29A798B7077999ACE76B780D1C210A38B9EA732DCC5A7ED5BC32F5CE94AAE23D3D65509434702246579E8FBAC7B1080A446DDA4B9C0AC158EFD9E3A8DB4EC3F758C3BE02D52DC1CA50A5C8560F395913404B73E7A9D8E2A090E2E82CD3DBFEA6E1A3C7FD714FC88959366B99167202B98FB7C1327B277506B26FDE218631375663FE60285C81AFADACFC77CC0B6EA2F22D3CE96F3BC7381B0401E675D4E1B4439998ABEAE4D93D1E2F4EC7B8D4D29913A9FD050CD960B02EC96005F2AE04C52E5342235E23374E2170FBDFE4CADFE5F8F79304A11F97FC79EA0CF229FCF84045E93A85C2729BBEE009F697228B84CE55EDBAD45439BA473990923F049E807E63EA373F0DF67BFE728E8CB99240E2B3AED7AB885BE9DEA9458AA3FF5AE0A0757F4658CB588CE29FCF85D72924CF7441FD07B867AC25FAB66BA4330030D52EA147D85DAF7F32376D58EDA33314F807703DC71392AFC8D720465F9F3F9BC1DB2249CFF89EEA091446E14252990CA28C99694DC83BC04AF1FA0D4FC59B199F7B592BC760B0D2BD84F8C24A6F6FDC042BFF3041C5A4E8630CA05466046586E66AF12AAD3C554A76C213902AFC4A25975634B1F540D06BCCD1466319351C73BCD8B863DCB191227165933C1ECC25D7E411CE8234236590017BD04BEFB2BC13812F2A529AB04C314A4379FAD525058940EC7619F3A5760AEC195E5EA7A74EA1B42F106EAD16FE9EE193F2864FA04FAFB6F7CD3A98794DCC406D6B7CA518B2C03F4CAFE2ADFE75FB4A4197AD25C2CF78A993C76915EDE51D3C615933BBCF9FBAED7CF1098E54EE8416BD947251D29F7C2E5F5FBBFAB5CFB0CC97666A1CD873B41C7C076A9B17430D17C9B9B29FDE679B6BAC6E92ABBC4411D51C915AFA9F5ED868B61421BD6DEB41EDD75ACEC1E0437305A95DC404F93ACBE006A07C5C6134DC2C447AE228F15C57E53CE3FAFD9C4D52F3210B2BA48C6CBDB881420203976B1933C516D3EB094EDE10A00A79D0552CA60D64A8EF5D0674148CD4DE2D8133DD5CFE911DF6070B7AE098C791773848F1D227A8E7EA20AB60305A7DF0A8362177006C2E2DF864DA6C6B180A486732F12BCBE403041D42442EB7EE139FEC6C1CCCDAABF9358AB70DFAEFB840C93DCC91B7F7DB9BE6DC5627ABDA5282F51E7701FA2C7D45CD2D3B2BE76826EF55A17D11475C037982CEA54934F3778FF9E8D37BFFD781FA1F8FC6AC1D52FE53010EB1BB491969FB46EEC63011FE018997D33A360EEB2292910952C285AE1678B4DD9F689C9FCB08E55EEBFFD3DEB2C0F2CF2B96303E0204659523E9E1394A3788BD4167714DE0F234127B01D1B69C6D6AA5662E286F5BD7D3AA1C5893D0490A79ED668B2CE0824664F529C27C4C903B97CBBE0F201AB99738D16254F68FD9AA87C2C7ACD8519397F9656D728C7C9E9F0B93A3ADF422F7779DAC2EC34A5BAFEAFC5356D716F948A22EECFAA5BC0BA681C58A8450A9FF08053A29DDB5BB7FEB7AA67B3A93C0183087BE9D89BC3247561085F9F3DBE08675EB77DB54543CCB48C78DE9219C95DD733BBF27967F2A48DBD5190AFC1AC385F13E6731044D5ABFFAE43C9D8873CDDA5BB01AE817F7290AA3890D7A102BF6B4E21AA01DEA5A37D3DA61F5B6D394B55563BF9363FD01D419A97A2B20858570DAB2F23054247980C059246E76DB1BBC3D607D8F751BDEA40D844B6A666B593E7CEF66981CFA1A41B9486C490594015D17D54396E8DD6E122105AC8A0CD10C96AA7786601F70B1FDD6392AD0901537DC5B20C298E8349459276679E289C926093385D4500F47B7351288C28B8EAF2724A3B82B48D5A55EAC8DC406A0A876D8BC51A581B64B9945A05B4E70CC62B3BE0EE629CD6E5740F395984661D2DB89BCA4C25886858142FE40B89593EAA2F7C71411B13AB73E0D89494EBA3BB98FE6BD3A7DEDFB6E70E7A8006A952E0026B79A2C29830BB1540D02F3E342EB6829AFEAD017BF20DF9AB57E165056CC3F60893798713E84F415F4A429890511B6C721B22CCAF586F35F70FCF13F323B569D4E4A6FF9963A777BC7C505C53493F37A998F84F40DF9597B630768573AA2DB68A65D694A18E1ACE0D1F34D01F51455206AA4C7065F5CDA0A33F594EA3101D43A62122281849E44958D6F6373CE2A75AC871F24145DB247F22F63D56397A8E8602F96E908A64463BA18113F310A782051BF7100AB317285CB4AC4CF9E7EA428DF29BA48D3C0E8971963136D9FF90DB4937AF5B79389E36E417C443AB7E76DBCE16ABF25D26D4EFDE141FE5FCB5FF8D3058930B12BE4A07C25D5260BA10FE44CD561A565AD6783B9F1EF5B710268C938390D91F99EA7E6CE873B840F01747B466592B95B65A5BC30593222929EA8D085D80BFCEE612570A6754318BEFE03A4C3A4D37FE070F1132AA3B881523901A91B7DF9AC748242F813F4D5934B16A700AD08EB81407AC0350FC9C8C25FEBC8BF5B01EE361AF2F712EDBF33DC782453F0400E9D41B40F2440BF978C42013AE5FF4FD552B66427C319A38EF95D423AAA94F609F4E207524ED6471A52FF923F3625136F886D32B769B45C2648D3813B5D49B1D1A3C825E38A6A2BB05ABF4D8DA85558FA5ACDBE2C69DD96BB21B83B33CED424E4822F05BDB8B7A959EE6016F699EC668DE173C9A465BCC73A044955719501ED64BB7615EC401988348934EAA909BAA531CD22E28EB8B3ACBBCD98592BF66DD2374BEC26C9CA64DFA7FFFBC3479C47516CF7519F8EF9B25FFC6A27908C95D0A1614E21F8D3EE2830F8C885F6116D3300F816E993FE3AA1A8E62FEF855AFC973AF5ED65698E1BFC65DAF0E738E590EF3B3C1DD806523B08A4B86DFB4ED2F8F13CD2AEBD40C5D9F871A5EDFD654F6267FAB5E542914CA5B1EC0C00F83DFEAA41D1D294EBBC8F3C4678C50785D004D23C4E6EC18612938A8E4B031D37747D623C870403D7431ED03EEE94756A2BA782FE81BA5910C871FFB986DC32F90C5BCDC75F5EE7041A15C7346431FAAE63506E15282CC05EB16044BDBB3A11B660119933424B7EB6EA02E93D96C0DA078107F74E78FC2E6FC306A3497FD0578288F36290C5C7CAF3A4B89FBF4E55D34C8A1060824EE8B7ADD8224E572CBE55414147A4036A31E5D0DB17367DA84E5A4BD1480DE382E2F5DFA83D58D96A5A279635B9CA766A3FB115ACF5DD8526A5F99B5B9843FADD448302E4A612EADB46897399E5B30DB093F0886A17DFB528144B9C966DAD7E13BFB1AE47EB5D5B91B0A95B85AAABFF20FFB186245B323DBBA273B5431C8FF18DBD5D2FA9FC64FE64B3BC3FB8D31CEE009094EEA9526D576E6570697BB217772FDB67769B4CA6BFD71B9C129B03CEBE919B1A7FD668EDEC7B0E5013B399E58496FD8F3DC5E3E830D86E48C68C811808B2C172AFA0A7F98F7250AE72F8FFD45B8B53ADDDECDE6BA59AB444DF9903BA40E77BBC102AA25EDB69162232C5C4196325D72EE2316A0F579C95AA7C4F95CC58BDC9D51E7E5FD275D6495A89BC1B1648CC83D5246EB6405D381EBDA1E8E228373F8DB106A782924F29A7179637182702A6B243260079268B7F174CC0FF6999C121AF1050CFD0F5FA2F995A46C790DBA4F0C7F58731868281B8FF381CA402720D01C82A188C561142B0ED952E75BDEF4A42779B8C8A367CC111B9A5DBDA75779FE271DCAA5F2044BFCD45AC41AD7D952CA2316C55B860C42DA80B91C091293EADF64FA9E471EA35045293A788725F6114E3160BA3364B82CA7F8FBCA240018511C0EB5DBE9457F12F7CDF16EAFA4BA612BE0C405EC8F928671EBE675B7B02818452BD08FCFFA326CF23EDB412010F7C5CDE3433BA6A34EF7789F753565A83A7D1EAA0619657FE54DF040A3271D6B01A71E8F1E0E95BED1C472B19027163CDE0A0EF5CFB1DCFD488AF0C16CC497ADEA320B86104F62C2ED6609A06B4ED54C2411A203F1F80AC82C168F521DEAE502DD6702E0A20139F5C4971E37AE3E36406CB7E87409FCCD7C8EB1205C82D3AED974E0E99774373BCA38E2571D1B6A754834C86F42893D5C1A33897ECA9051DDEB04C35D15D232E8CBDCA7C0A4AFB4ABB95E19D72086F81410EE3E8D8374C1616D3EBBB50CF56922C581918EB5A7C67545FED92E677FE4BDCE40D086FD11B83723D40C0E347E07D04BE4803A9027CDAAD87343D825EE14C219CC9E0925202BFB8E0731AD89532C9A4A75AC1E8684E9DAC92857C5EA5DC8085B0645B8A1B26040E24716313FA0042DD38F35E9945043D14450D6EAA5F10CCBD6E82B0518931DEE075816FDCF012512B80DB654F73BD9B5197FA63647086906150173CC26E7FCC9F76606A29736188A6EE35EE0BDF436E162AB54390BE9018FD67D185D2EB375DFF757C4C050ED5284BCC8C6E14C857C8144F3A1C28CB20FF28DF0A738552D85F2AE15F7626E70511968D1E478533997812E7DB2538A14E2CB397B15BCAA74FE49E42A4F4610DB92B498DA2D7E9643F37799CD322753573F94283FA41F1340022C51E1C8441A06B3297788CC5966470075BF5BA52AF506685D72A07952F77290B56BCEF5D53E11D7761E52BB027538B643119AC16AFFD318AD22D78097650D77427394BA98B59281DCF43CA10AC239BD9D14649D626920087B3BA9A923C6E09DF84D4F16B546B85B6E74845522E4B3CD7DB01AD8F0ACD0FBB7B3D66EAC80FA603138A7B1D7ABE4A38407184988C940CB3B5085CD54A7E530AB63C3681D5040AB04FAC5AD460ED9F169B4CA1C9A4F9D4D15FB600E86BDEE20DF7260475B2C05BA3BCE6BF0809D1A0094EDCE5EB10DADC2E2C9872326455DA21424E0C46215F026A89CF0D671C3A167728DC2D96128EE03D5C1596E5C8206544BB4152A2C90006DDA414F3D72BB2FC4998B8E1AC7DA754D11CB2AB7F2572968A1848E56696E98FF233932A2553E3B30386C290B71229FBA72ABA85354AEDC478BFD673B562F279B1306619D8BD0D0CF537E6EB186BD80F063D94AE4B0F93BDC8672032ED0E89D0774815FAFC94F613F476652735479211CB4235A083EB5AAB336A59E04A423F0EDE97E2B124F6B92A6134135ABC51FFAA3D1C7BF1C292168C42D3BB04460BBC677CF425FA01B2834C2DDF49841438D5823E17307EB43E52547DB24DFD07E8B3DE0E7F2F4E8FB9CA4021CDA671DF4C7CC112323608C23F49D23FDD28B21904DD3AA65D1D239F0EB516D768F12E168988FB7FD384E460B574124336E718F4A2E7A51C23841102E8227A4E96F0E095F5602197CE740BDC671EC340D4708BE99037F848783BCA97ED85015C7312ED1CB95FB0B10E7017A6F08C68806778CCAF48DFF06AE3CB5B72CA0BCE74804F7EA7C40F006160B6473D1EAF0E2A420F3ECD8CCE42B285AF07DB8F12740B41D5C087E8345A7441B7E7C9226FBEA6FA89A94A0DFD96E9BE2499700A71F44912ECD9FC0633634E51F8253EE0F9D600C311A280AE7F6E5761BF63AE2E9A48FE709091F6D46B486AD29B509D9229A6F58F838F93021D63F9A3F745329F2A6949FD767FBED5FEE3384BD252AB4989FA995C5AC9A50039B42A08FBC0600A03E15E824FDBCCCE63D3F71E5C7EA4174030EA37E0A277126B75B09CEEB482BBA046AB15BDEF8F6919E56537936E73BD5C1CBA2333F43B05EB821F559118EAD3154140E46665439DA94E37269794C96ADB3BDD1FA6D2DC85826365D375A1877DE613F2397895874347962AA2AFA8180A293373792906F41E2BE9D414C80855D841E117E3D95E4810258013C74C8C82C8C6FD37A3B972CDA3444E6D85B61A0A9B46A594AAD3E67C0A88D33B810C3779935188DB2DBA720D9F5D99205D2D04A7F04706C2FDDD8EEE10A59FFDE1069F5D85D0A524B7326CC3DE5738D91E679300AAE58FCDBD761A6512C5AB449AC3D1589FD0C713C437FBDD8446A766F232CAE2AA2AFDF6B4533B6BF0351250A27D229DE60EC2787E9AF2418613DC1AF313E48546CF53BB21B316ADCB59D548F1D39417F724640C7DB5729A5704FAEA682FC024B01562136B7B521C1737F979C6EF7A0366AC5B521F7E17AF17DC904A12E7A84F35FAA9A0EED3D9A58DFF1B58521312E083EE87FC322B4700546F5042B79AB13002DC550C20A6E80CE9270FF052303C970945157C98922B62C97927A15C2F6A8BA89C374FAFBE3EB97593726029D04830F4CF710A239413D44A827C6037CD259B045B019FBF30053579EE8634CF1124959E43ED17904DF9256B989DC3EFA91BDA5A81D55F0BD8AB4F436BDA610973742FFA769647162DB50BFAF3013B11FA631E870D251CCC3062562AFCEF346F1582AFFC738E42EA4045570CC1FFC95271718AF57C39222F46956DF577246C49AB991BFFC8419002085C10821440E0820064028E2047BE82B4078D2C166FCA413B321BEE65E6FBCDA2E4693F3A25DAB7E223A9E5F452C0F7058D8F22467018440F30A7DB8ACF039293BDA6BFB2E09E4E1A0F881B998CD874FBDE9672E211739432CE9803936B13AD1B7E2FFDE8DBBE7188094F8D98299252E30D62D27D56844F9356EE73C9F564E4288E3493B13A72560C589518B522B8E51A9EA057A023494C21D249032A103A822B4ED8080DCB45E4C3D6FA786CFF839F4AFC28FF5E534CCC9976469B1E504AE8C7C3F7323C974340248F77D51CF1E4CAC139ABE2AB1655E0A67B8A2F0AAEF92EB7491B724BA2D3761C640799D1F21D6D3838E77EF7E9692CC9F79A666CF5642A3F836E24582E2B0BEBF3337C6628176088079E349042770B99524671F017D4A2CAC157C79382870E71FFF419098B076F2F654858E944635E694353DB757CB2651A06A4DB2F5B8A914E5FACAFDA63E3C67019465F1583B0A7621AE12C7C4D2302AEC4BCA48683335F42E8F4F2DCA13D00FB33EFE6BEA50726FAEEE3C0E18CC5F195B16FA3FAA7588A9E46AE1F5A0629B3A002E1F9C7EEE06F82F0C908B7AE9C76963E9CA67F0DE0A0133D35583D8759FB82068C8CC777D9A0A8B0AD6EFC45461291BA170365B88F82EA4479961175164621452DD8150FA0B4477BA19B62B053E611DDD3E8A2ACF351801E88F11E11F138FECF4E40DD9627257354E65A364AC47A308B98226DA3DFF20A87BB0B0297FB9CDAFBE2CC8616B69FBEEE879CA0647F5F03FF2703B29AFD82A27FB6CC114620719293AB7E3AC771B58E5C91C5720FA78AFBFAC35340A0CCE6441E2301D53A81FBEE361DB04ECD66C2FE93A78E4B22CEFDF0A5367851FA35A009A2CD50887DAC1002114F739411F172DADAB444E867AEEA1D5034157BD326BD2D9EC828AC3B1FFAAE82CD399A4DF90ADB1AA21CD2C790992E398A364B92A27CAD8EED902010424A67A76B7B8A6D4FC7FB0AA4C12D0744BA422BDD30F28E2A7CFE6FE72B8C9352FCCD2E7CEEDB6F034252888183C25B8FD68B96A3A211C9E9F735A38BA01DF8E2FF2B86D1FBF89B478716842ABD2D8691A9F13DF82CC10166A66FAECBD230FB8F7FC53D93DF89623D9447FD9FDC8952ED18395054A3EF2CA371E540F99876B2C6509E7C2E0292A040F516267292FC001E450BFA92DFEC5386CD48FE8EE7F36920B81F410D8B56FEA98F97FB16EF3DFE817D0CC7E02B7754B222531E66C1BD5718CB4F0E6CF8D9069BB3CBB90261F47DE72BC6E4B8202C8A4FFC2831F6D6681049E4CC113542B578FB7CCEE5C60F0EADA3043C5EE781CF8F57FD86CD8B8B3392BB3D2CE393BC469B6CD9EFDEDDB44221D6C07A5C6A1AC80E32A3E5BBA9370CBE7ABE44F0C7043B411C47D49741FE971587892B00B6DC4A78EF6241826D789970EBDF9D6A73AEABD8738B720C0E7FEC757BE03E14B31B466130C75204FE28098C75DE7B11599EBE4E0D3BFCDD90D48F07687D314241844830CF8D3CBC56A04540D3E2008C99F83AAED4065E5B3A9BA2BF6CD38EDB0569C0B7821E8B98064E1113F834331C9C66C3448F7A906EA9AF8EAEA044C8F9C6E09483C599704F7DBF0A14E26A5032EF953F59B47EB8A365F05C8112C88294F17957EBB611735191A6CCEF8264F431F280E699D2970196967A3D6014692D48AD269099D4073718EDF102FFD43AB9DAD945539850DC5872E32C3C231C706839AFCFB2609E858799FE9505AEE8E596FE7EC798DD2F7DD92A9B47CB186410A89A65275008B48AA58A366EE9DD556300832C09EE7316D9FAE873DCE2A9AF349874A31CF077B3D48BE349FCAAA35E8ABDF53B3D9040D792D8DCD6E09CD17BBB80DC4F8499A90E897F94282F87D89E793E4701ED54234778B704B1134BAB516E3CD2FB740C58EDCBB3019BD96B826EDD4B7F4C87491F0A1EC1BDF7EBB15E0F2A65BEC77962BA8EDF35FDC57B12FEAF67B0DBAA755B6B27E9547FEEE89E52EDF75E94D5D33B39B7F7F39657D9B69322DD9F1A6EA24DE7FFC415CC1A512F2D2CC4FDD4EB3D4ADF7F5E5C42049103A29468E1D9064FA605F6DB46C24164DECB401376810E892E2CB0ED0F47DC9A1AE1B9CB3D52803CC479AB9BB2F096BF20475DE3BA94F9B14525B38CCFD7966EB0649233DDC38943DA4DE0C5A5E37163D30A3987EF17A9B91AA811C7084EF9D2C5BDEF44B5B8D2903259E16A2D33E10AEC91DBD65C03ADA79B72A97FDBC5E621B8D520A58C549B21F7DE0D38FEB9B56BB7B6F3A6EA70BFFEABC9B4106C4F78721EEFABC175537197EC3E3157C934DBBAFF35C7EF8614BBE445E09A95D70A74D6090F09526EBC65C53F4FCCD75BA2B3BCCDAF4F1A65A7D6FF5DA44BF9AA339136E0BF57CD406B30D16C36D48A213F4BF85E93D39F583DF1ADF8749A895EF7ABEACB14BC8718EE61A250FF73B4C26FA3758E2218E1F18909BD3E13DEA01546AB9A78B90456054216644B426E0248FBEF74F86BA7620E4FA63A6968F973441A26D9CF94E5B7610971E9EC791BD7CA6E586723BEE461A7D45CD4E4DC36C3B53B31EC011BB3CEFE2BDF11BAA79413B6FAF6A9CB06DE18C9EDDEA0202021D6F919039EAFA1E3DFB06EA79AF222FABD761F9184CBB823C8D9270583DFFF55A6750B715104B259827037054DB45A33593760D3DA75F02711CE3C2A0A7567176730FE19082627B07611CF7018E595BB0EF4747971575061595E8B336BC172FE0952EF61D096ED84E2C5CC6E48E98F1BD8E802F503F8CABE9A54608473EB4CDF358C450C551E76E9204F5661EBEDE98CBA726458EF4C8D69EAEAC2F33D81187737C1EFE1AEEF3541F3D7E1D9A04001CC83BCBF1FEC2E9E63C9C4236753DEA4C8C2CEB5172F79248C7CF46F9579A0C4C2289BF8E8F2A461FA87E5D43F306ECF15528BFC0569F790FD811A660E4E6B432584899E8ED3F032D6A82D66DD3893989C166B300E6FA051FF42A35E219747C209A248C1C00FB1B8F215D2D8457C97D880FAB73F0B143AB73F0803F58FB44716F459D704548ABE3B0C2EB446F3A73052EB558ADECFFB5BAA97EA97E12A9CE33DDF696E799F509B9679FCC5132E9EE32FDA8DFEAE1DF7680250F7B5BB12525BE6886FBEE50A90933F9D1766C966F5E864587CCD861FA1E617B0C5BE431B4F6A966940B47F3331BEB8EFFE19A11D61C1B271DAEF1029F20943E023CEB3B0BE49BE3CE49D4F80B8B75A8CB0A22E44021958FCFF4CD2C82CC529B57DBBCB659D2D11F20E8B627ED1B1B327F96FE2A6D902D1A20D083BD13BEDF588BA6F5457C57830A487A3B3A9306E7C2A746384EAE26B6E1149A8D40BC2C5E013E2740E85CE2783A87D9BA4376AB00939AC7F1134B9CD6E383AA0F5DA729B498B524E98F18E82488A0675C9314A4B7C641C09E8ACF2C0E7695A67B2D55993ADE3C22B88B89F1B8CC25C28DE30426ECD37BBB537B13B8334813E348AD213CD04955E76CE2205B26AF7210F6415E80659FA020752F028F62C91480CA1623CAD06CDFC4C820CC9516DBBFA6914A660DE6FCB328AA919D7C7C07E78A2EC1E8CE996EDB3AEB2126B1DBEEE83DEE8FE1D0BF7C2981DEBEC48F78397CE9845B48C302CFCE1D1CF6DD798D3755C4414AD8435A6EDB7810669DCED6F985EE54217060D1483C63A380503F5407FBDE47C9C5495D5F264E42D846D2D9A40F092FC155A22EF020B02B8BF89A5105D2271921FD972C56A58B786B169FCABF910F2B6B137DDF16C6FBD48CA73858AFB9B126D9B8750CC6112753D90962C624065EB45AB0D3CF3CD0232F4434531450C1AA1122D309E5F0CBA69EA77523D1D0405D8E4FBB4BBDCC15B180767A2B00F289BD44956E1AAB9B2614DF09323759F907D850161491A2DAFFCE345BE05895592BC81A29450919919CF1B1A9D11E798BAA5279184B312C2868E9989CCFCD3C7CD15556CBC8B50E4A21C22ED99263AC4418B9FB9BDA1CE0D20A68E94204F1FD1B3268E04244156C5012274CCEB84A8CE91DA58A0AECF35E30D4E0D0552FAF4F4FD1CF0C7653559408EFACAF7050DBA0747C4F429D0CB717DCCC8731728233C2407C4CAF94404604A938D5E60420D48F9FF906B8153945E43C84E2CF85DD3840272D008678A263574030549C3207B1A2226BD5AD28281D69E4D815A306723F4BAFF89CCE3C042F7B1C1E502FAEA29EDB86BE859FC7AF2BBA044CFD9B2721F1E99561A06ACE49F8025D589E6A5CB53D1487BCBFD2700B51B616A0511E9BB17DBDBBAF6A0DDF5BBDC5FF3BB3CC7C30CBD1769B1F151BC2BA82D87BA73E29C089501DDD71C8624B790408DE39C59FEBB1AF8BD3FAE9EF2BFA5BD9CE8E0D381351F567368760EFB80DE8742758C1F48A5F510CCD39E31875B89DAC752A7BAFDDB9B3F226E757855D60BC93DD46C3D5141B7FC706F772CCF4D847BFEDCB1363372C817495DA62D084950A0D3410C3B10EFF91FB30864730BA8CC6EB301569B82F0DF6DFFACFFB0D1E41072BE32FE2B546BB3F64297B8F1EB170DB9807C27E96D36FBB3A0600DAC7345AB7DA9A15C1EF3F7DB31045E9532D3F11D0CE7B94FA7AFE0A5E14770716B65A987B62B607D6A1E224489A3E367DE88E0DE6BD48D05F14BC5B4E52BA27C6EC3111E663E0D91FC2B3B3EAD5ACD8D953A3A3B20B21C29B7D3570B226F762BA182799F1E625D316170C9A6DECA48247422B495F648558890D75E1A753CD7E4C125C56867FCA9CE523AF2FE25F1246DE424C32D8098876A191102B4375712D9A0612E3C8EDFF0F8B643E63590DD1EBF3BF7AA8621EF9E65F095A004127A1C5A6ADE0D8C2F68AA525BEA8D1E6071C90C484217136990E95BAB61397E74819D9DCC4A21CD9C6A4E26BD80A6714B7F3EFF972AA02D486E5BD275945F91292D7ED8BE1DB4D871CE87AA289B8312B612B20AF35A4E4A5DB585708F4075B5B43CA18052EC92A21E5594FA715E73ACC269E83EE546FBCA617DD9DFB68D0BD0FFE237474E47244FF4526922AB1C85AE20F6B04D85CF5C3FAD6271645614B52E70EDC8C865C9BD605B9347C78629F1107D5EE3CCCD51FFBA22382B8D0864C52594396E375FD869807C7FBA5514F80E71730FF000F1FA7F4C00A9DB22F2B23081196789122639E9C81E0894245E9F500FDDC2C83B3E7AADC70E3B3C6EFCF71A6382B3E6C9C323554369B79757CC499A6CC6A709403117C876C8D5D5FA8CF3F243FA96BB1FB437CEB89386DB94D8E34BCEB86643B2C14A886CF52F20BB40150B33D9C4C6A1F8FE515F6306BA793C92722185B6AC0D5E3C244A9C8E8E3DB2DA0A2288309CD1089F2C2502C326D74899DFF99208CF2C8762F1BD5F78C69FE6B9DE29D68C71E50ABE9C8E0D2A59E62B272EB60A2A7F043C34FD4F77AF32A9BE5619DFF3B3A26E0F87D8B551FF880562E04F9E924C0914CB29F27E21285689BF747C12BD013AB8C3F861E50B32C828DC50186D2C38695AD06E520140929FBEA39D86F6C6241E7D1BA685259F8C637EB680744807E0116C4919EF412CFF6BE827C2F74A3C5716C11962AEFBB29185F45CDD6DC1D031A4882FE72260CD9C55F2FD179E68225F300B6D383C09DAEFCDF7C236E9441CA3E5ED27E8A8276701035DCB39A7CD28E68BF917B47C2BBEA532053DD6E5C6B81567FACF306DC1240BC28F4CD471802C12FFF589FCE524FB793919B0D349650554FACCA981BBC8668FB48AB58663741EEAD461AD246B82FF1F02AC84A86B8CF3A44623716140A805425B138F4225BF64791605721CC39F2974A2382F97764153900CFBCC73D7B8D56625D332F152F4CE4D9CC5D39E73532B976D7A5FFE8FCFA549BCC71AC55E06D52AADBB520BF65CA2CDDF1C7FCCC7F544FE5AC1352039A4C569C9682191A5BBBD66A2E9A087AE3E5D785974FC469BEFA43E974EB2B637800D21DD3DEF929E3F654A93D5FAD432D680EC8E8F798640C46D2E9CC25E760A49AB47F524CEA318F8F0ABEB9689170BA28D68BA3989C4E83CA6FBF1002A86211F45CD457D38446D029A7016103E6C2CEE5B31F6AD8F06D76E4B461F62754195172011D2E5863BA72B8A026F7B7C32B37EC1AB0C32108EA8C4BF12E65F8C345CBD6886BA7B2C46A3171E154A5B7CFFFA91FB2AE937495FD30D7A7375C101DCAA8AD285C55227D5F1D11C67E6D9F05E1889F147948257D81CA0829F46721FD834A262138F32EFCEC1ECE6516C70D320A5730BFA043EFFF9F27F156C32EE65A0B3CCF01EF06229E8FE800984D06A1946F29784822CCD2BEC38844F35D7D89E5C6EDED651D24982E7E9C94794ED9F215140AB10DC4D7C0BB17D19CDE8353E85D5936E711B46855CCECE85290C76E06AF97642FFE9DB4AFFEF2D486AF889B8E0FC652181AE6B995EA0F2CBFEFD0F502C391AF414B4E7894132F75D6AE5B26347F12674152B4918BB80FCACA6FC902F5095176FE09F5EA964D922649538498080031B0D46CD1B8A18601BAC9C998716CB605D51DF313420DA2E77576EE9F25C29730DB5653C8A3651FBBFBC52D778014F94924CA416F1168DCEA2C5203202078359824B8E83E5605D92A757837AB6FE5B0DC1F87CE80552D64BAD167C5601F63D76DF6494F5132422B73E882DFFC380E9EEE2ED14E7D20C0503C90607F5FA00122A6E138AB89ACF33CD49C52AA8E0F9541C8C2F0636F375708C6D5F820CB7C90505875F7E6EDC8D77CFCF83F8A201E88333913AEEDEC4D5B0FDED58EF1E7AB9F8B0A8753A1C9AE5C4A3662097DCDEE60AA557040B9081F31CE958CEB58D7F2DF5B6D5BB5DCDF12224113EB73389CC4F13DCFE002195F36E94249BBC3338787FE1D4C68A699EF79A6939332EDF6FB0798820655BBB58323B2E5976C1BA2B962F500BFF38ADA1F54C292281C857FC61C26259F427258ADB0A3EE67A7B0C2753A1FE883DF493E17B159ECBC94C402FAB10AA0271FCECA60E6E888423F1AE586502C91E7A7352521E5C289E00851DB85ABE35FE7A6EB694293861E7CA06B256A3457EAA8028F3AD68C0E97B1B7BCB0B0F95A36596F8FFB2A4083854B16D99301251117387312EBA7AB0382847D09F29D746E0E9FCF59BA055328E8AEED2A8A0EDD4EA64E1FC26681F5AF8F277BF948988D07970787E786AB1F06D77EE517453049CF04ED85C5A636D9CE3B0C680398E364B8D59277DAF48DD181A3D5DEBAA2C0F1C050DF7FA719201C77CE46C029CDBFCBBCE5AB1930488F6892497455DFAF67E55BFAA427F2C7CFFCA79239DB713DBE24BC6ACD7D314E214AA5484BB4B579F0E2F197A3648A6E27323A0A434BA2F80FEBD698CD5B851AA5264798C60105D5541F0AFF2B38C2A10B3D2291C2BF891017C23990B4A9B5E03274F2420F10F38A046B63A8D237177657C14BA99B11AE9E35B8E3F88A4D6958F762BE0652975FA79A89F388435CD510EECD687490B8A9B69B08E2F315487ED538DB680ECE478AF3F10EF852C7687D6146F3603224888E506F16CFEF157BE45269E212C2D70B654801C14A0D2851C11F751CE3A9F840EEA9DAED183D4E83ABC8AD46B2262D8294B393CBE78904EB833B47E05A38101B925BE527893525B5A9535BD28725A875B47C8D94378DA0C845A3410080F92DF835564E976C7A235526ADF12496344DC3B167E3ACDEAE95274482A3C437F68446694CE84AA24BFD26C1A2BE9102AF8E8D092B695E4DEB6E81F4324D271D2F7BD2DE2843FC94F8043FEB0EB98125EBB26F41628DC0AFE75589D6F7DEAC0D72F609426466224E60940FE0AE6748F361E5C64106B5F64B750B2BB1A631CA6C0D4D38632ED132E69E3C4F01CC31283F1542121336E44AABE69C173268118A020D8C2C699C1191040F78DC4EE5BDA7BAC7272F83249C5CF0260B443C75FF3D7C20306C66B9229ED1320B749EE5185B98B698A6437FD04B74924833329EB6E4F4F1E88E8693D869E8ACE588465A2CDFD9209B11F6F188CF454B446CEB1EEB494E0BC0CE4615B6C530ABD29680178C3886A872A98F2F040778BA9135E81128AD360F82D7608079DC5B98477DE17305CA73B3C03B077CB320BE6FC203C545DE05D8069277EA6C1DC3510865452C3561A65553545ADD3876360D2E7043EEBCF7B35BFA30DDA022731D0B25FC3B3271B4D6FA33CE696F6E5E35F131C06ECEE163C2B6ECD76C1178D3D143090C522194BC1618CE94E4C7C3B9281E391DAE9C64610AB2C1FAEA9CF0545CBCD095EE71A37B81174C40306F1742554E20B475DEC3398F35731B981B831F7DBF7C253ADEDDE448A3742DA65B1F1A7137A75F7DFD734C892E651532C4C25B9B7FA5885129614EBC91834F97193D6FA7E7673F45675E9F92380D586F405DD171DA2B9B3CC1FF76E8C29C1E522B67E75B40260FE59E878EFAC137F652915AB5D811888C14B93FBA7D28E7D01CE50A0D9EF33E77C78AB36F866B6BFC8CFA6C9C881A1AEED4ED0FA57624C23F94B2888B2E87D17363DA294A364CD311E8B703F0B70AFB2DC1479B25327208C39C6480F39AF7FEFF940BA553F935C4D6B6119D90181B5752D85D619E1BD4028C40EF284581830DF108CFDA0FA8029AB509B82AB6F519BBE353A32D8E1CEF42EF86AA258BA169AEC1087786C42C8DADF57244EE0A0E42DE71221FA52ACC29119EB2F1225E7D6475F631AF0F2F033840F2F219116539DF568CB7970F2B67895F572C68BB9E20844FCAB1C140D59C4692FB8C948380772FBDF04594156D5D92DC9C45AD048E1E48029948666331EB44D7CF2392E5C2A7B70F4174DC944A6E717A4E1BA5B574E075CE03032DF6A2EDF7514284A44287D303C7992BF6A51F31B67F801ACE88414D40C3A30B95618377110C3F250CF1793E7C6C859BA8BFA0CCA70D7DD659AADC30299E0571832E728AD1B5E17FEF6A4EB82C6A6AF15055A7F3984413117C87648C3F6B25BEA2FDA2A6CD60FC7E4C9B3FF098EA94D7B5B6C52F5E4B2612BAEA8B0638C81721DF2CFC8B68CBE37595351E55D78D9D8535F894A99A7FA79B58F4CA925B99068158B7715B2A16E49753394A2DAC25D651E8652C47C9BB27276415E000FA208ADD2BE1AB23E1A04F9BBA96AF52440D262797916CE2A7146F07816FC82C7E3E017D2CD74792D783C5B6930318681FE6EA4825749F21C33CB0E87E01FDED0712203FAEBC0B376B14C902496F72800E3F838B3A3EDAB83DDDC72ACC16C26204A1A44BADAAD4C9906860CD2D7CF8C8DC22590A3ED7A3C487848086B7BFDFFADFA85322E3DCED5E6E7C279D10566319A8299D883B35EC7E9977B4BAA491313D737BDE950706F696EF068966506739DA12B58A07410BCFFF0244D104BD417A0980B643BA4C17D5F2377F1C10C819636BCA1BEA726143BFBB48E9E6BCDB7872290B09F3215B16481E66EEEE0D981A351CB9E24096D7F642C440CEF4835071C72CD7121BDDF8CFE89E956C7012473A5231625A945D4F4AD0A3DFA74A2C93466FEC926B376F2131A3775A7110FC0FA694149ECD233747A7EA352FDAD36CC208875AED19E2EB296F5094B0C3245BC788104CE363C035714F9FE169AA49D32267875344DFF8C072AA145AA504DADF65A66AA171309D279D9B79AF898E9DD10F798244C24B6440E4174D864E984D5C7FD0151BC1F89ED3FD4580845FDD59BC46816A96BAC10A4776203216F8EFA51B32EDBD1393CA5D32E774E0B28C75E71567DCC332189828FE1294BC03429AA1C78DE50D6E36B068238B8588ADCA186B141B9FD3E3859508AE3BC2B4F3B576F4053F2869C2434AF83E9623D06359B7434A0D105DDA254B594158A426F198997888F9D3333E68B0406A1225C3CC89E945CFA2690FC39EC2A13B4C9DF58D396170D788AED0870CC190B72FCAD42C19A5EC3C980DF8C11FEABDE5FD0DC8BD4A5422238C9871B8E06EDAEB5E479BD17AF0E7C155A8A54EA13CE6B05DAA24AEDF87255BF09CED90EE3385FF9EFFD783A1515881ED36F02CBACC123A1BAA4130D69552C4AD876FAB0F5219C15E8F740A43F5E9F7B49F18DD73F1F84BD02946C6CCA61C661992FCCEDC37A7474CC79AE3591F2627859F6430D27901D3EFE651DE43280780A8A5978BCB9733B53A62BFCC1953409C10BF5CA4A6D80FB9CCC05F16F430B9F4FBF5FAB441BEB8BB89C5F35766E566394952A0E01855D323A8724C874591ED273C3B0C13C3F3D05F876D4FC9A64C1508B0FE7CB507390DF86A73ABB20482E363E2B3EB294A79D1D554DA1E9EB7A0B3401890BB64CFEACDB02F22EF29B850B15A7846796793D1F782522F4CE2D6B33F87D00, afterDelayedMessagesRead=1033542, gasRefunder=0xe64a54E2533Fd126C2E452c5fAb544d80E2E4eb5, prevMessageCount=100466580, newMessageCount=100466852 )
    • TransparentUpgradeableProxy.STATICCALL( )
      • Bridge.DELEGATECALL( )
      • TransparentUpgradeableProxy.86598a56( )
        • Bridge.enqueueSequencerMessage( dataHash=BAD9035AAFCAE00A1C30609A13D0ED0F0F7F27B554FBD9EDFA59D61FCF5F681B, afterDelayedMessagesRead=1033542, prevMessageCount=100466580, newMessageCount=100466852 ) => ( seqMessageIndex=317217, beforeAcc=A1A44381050673C744024BD8F278163A5E75D73B5EDEF704305FF52A7C9EF178, delayedAcc=FB3A15745828BBCD787921E3C9FDDD2C30B1926A51B43C8E1F7F8C54AA15BF85, acc=61C136A4E803375064171C2A78596E2CC42BBA0C9629E8397B24A198AE1E526A )
        • TransparentUpgradeableProxy.7a88b107( )
          • Bridge.submitBatchSpendingReport( sender=0xC1b634853Cb333D3aD8663715b08f41A3Aec47cc, messageDataHash=7A0E4543B2A0079F4A5449C655396EB0E92BA2B5CD77684D736D9F13DE2DF247 ) => ( 1033554 )
          • GasRefunder.onGasSpent( refundee=0xC1b634853Cb333D3aD8663715b08f41A3Aec47cc, gasUsed=207928, calldataSize=98980 ) => ( success=True )
            • ETH 0.05857878032909854 Arbitrum: Batch Submitter.CALL( )
              addSequencerL2BatchFromOrigin[SequencerInbox (ln:154)]
              File 1 of 5: TransparentUpgradeableProxy
              // SPDX-License-Identifier: MIT
              // OpenZeppelin Contracts v4.4.1 (proxy/transparent/TransparentUpgradeableProxy.sol)
              pragma solidity ^0.8.0;
              import "../ERC1967/ERC1967Proxy.sol";
              /**
               * @dev This contract implements a proxy that is upgradeable by an admin.
               *
               * To avoid https://medium.com/nomic-labs-blog/malicious-backdoors-in-ethereum-proxies-62629adf3357[proxy selector
               * clashing], which can potentially be used in an attack, this contract uses the
               * https://blog.openzeppelin.com/the-transparent-proxy-pattern/[transparent proxy pattern]. This pattern implies two
               * things that go hand in hand:
               *
               * 1. If any account other than the admin calls the proxy, the call will be forwarded to the implementation, even if
               * that call matches one of the admin functions exposed by the proxy itself.
               * 2. If the admin calls the proxy, it can access the admin functions, but its calls will never be forwarded to the
               * implementation. If the admin tries to call a function on the implementation it will fail with an error that says
               * "admin cannot fallback to proxy target".
               *
               * These properties mean that the admin account can only be used for admin actions like upgrading the proxy or changing
               * the admin, so it's best if it's a dedicated account that is not used for anything else. This will avoid headaches due
               * to sudden errors when trying to call a function from the proxy implementation.
               *
               * Our recommendation is for the dedicated account to be an instance of the {ProxyAdmin} contract. If set up this way,
               * you should think of the `ProxyAdmin` instance as the real administrative interface of your proxy.
               */
              contract TransparentUpgradeableProxy is ERC1967Proxy {
                  /**
                   * @dev Initializes an upgradeable proxy managed by `_admin`, backed by the implementation at `_logic`, and
                   * optionally initialized with `_data` as explained in {ERC1967Proxy-constructor}.
                   */
                  constructor(
                      address _logic,
                      address admin_,
                      bytes memory _data
                  ) payable ERC1967Proxy(_logic, _data) {
                      assert(_ADMIN_SLOT == bytes32(uint256(keccak256("eip1967.proxy.admin")) - 1));
                      _changeAdmin(admin_);
                  }
                  /**
                   * @dev Modifier used internally that will delegate the call to the implementation unless the sender is the admin.
                   */
                  modifier ifAdmin() {
                      if (msg.sender == _getAdmin()) {
                          _;
                      } else {
                          _fallback();
                      }
                  }
                  /**
                   * @dev Returns the current admin.
                   *
                   * NOTE: Only the admin can call this function. See {ProxyAdmin-getProxyAdmin}.
                   *
                   * TIP: To get this value clients can read directly from the storage slot shown below (specified by EIP1967) using the
                   * https://eth.wiki/json-rpc/API#eth_getstorageat[`eth_getStorageAt`] RPC call.
                   * `0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103`
                   */
                  function admin() external ifAdmin returns (address admin_) {
                      admin_ = _getAdmin();
                  }
                  /**
                   * @dev Returns the current implementation.
                   *
                   * NOTE: Only the admin can call this function. See {ProxyAdmin-getProxyImplementation}.
                   *
                   * TIP: To get this value clients can read directly from the storage slot shown below (specified by EIP1967) using the
                   * https://eth.wiki/json-rpc/API#eth_getstorageat[`eth_getStorageAt`] RPC call.
                   * `0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc`
                   */
                  function implementation() external ifAdmin returns (address implementation_) {
                      implementation_ = _implementation();
                  }
                  /**
                   * @dev Changes the admin of the proxy.
                   *
                   * Emits an {AdminChanged} event.
                   *
                   * NOTE: Only the admin can call this function. See {ProxyAdmin-changeProxyAdmin}.
                   */
                  function changeAdmin(address newAdmin) external virtual ifAdmin {
                      _changeAdmin(newAdmin);
                  }
                  /**
                   * @dev Upgrade the implementation of the proxy.
                   *
                   * NOTE: Only the admin can call this function. See {ProxyAdmin-upgrade}.
                   */
                  function upgradeTo(address newImplementation) external ifAdmin {
                      _upgradeToAndCall(newImplementation, bytes(""), false);
                  }
                  /**
                   * @dev Upgrade the implementation of the proxy, and then call a function from the new implementation as specified
                   * by `data`, which should be an encoded function call. This is useful to initialize new storage variables in the
                   * proxied contract.
                   *
                   * NOTE: Only the admin can call this function. See {ProxyAdmin-upgradeAndCall}.
                   */
                  function upgradeToAndCall(address newImplementation, bytes calldata data) external payable ifAdmin {
                      _upgradeToAndCall(newImplementation, data, true);
                  }
                  /**
                   * @dev Returns the current admin.
                   */
                  function _admin() internal view virtual returns (address) {
                      return _getAdmin();
                  }
                  /**
                   * @dev Makes sure the admin cannot access the fallback function. See {Proxy-_beforeFallback}.
                   */
                  function _beforeFallback() internal virtual override {
                      require(msg.sender != _getAdmin(), "TransparentUpgradeableProxy: admin cannot fallback to proxy target");
                      super._beforeFallback();
                  }
              }
              // SPDX-License-Identifier: MIT
              // OpenZeppelin Contracts v4.4.1 (proxy/ERC1967/ERC1967Proxy.sol)
              pragma solidity ^0.8.0;
              import "../Proxy.sol";
              import "./ERC1967Upgrade.sol";
              /**
               * @dev This contract implements an upgradeable proxy. It is upgradeable because calls are delegated to an
               * implementation address that can be changed. This address is stored in storage in the location specified by
               * https://eips.ethereum.org/EIPS/eip-1967[EIP1967], so that it doesn't conflict with the storage layout of the
               * implementation behind the proxy.
               */
              contract ERC1967Proxy is Proxy, ERC1967Upgrade {
                  /**
                   * @dev Initializes the upgradeable proxy with an initial implementation specified by `_logic`.
                   *
                   * If `_data` is nonempty, it's used as data in a delegate call to `_logic`. This will typically be an encoded
                   * function call, and allows initializating the storage of the proxy like a Solidity constructor.
                   */
                  constructor(address _logic, bytes memory _data) payable {
                      assert(_IMPLEMENTATION_SLOT == bytes32(uint256(keccak256("eip1967.proxy.implementation")) - 1));
                      _upgradeToAndCall(_logic, _data, false);
                  }
                  /**
                   * @dev Returns the current implementation address.
                   */
                  function _implementation() internal view virtual override returns (address impl) {
                      return ERC1967Upgrade._getImplementation();
                  }
              }
              // SPDX-License-Identifier: MIT
              // OpenZeppelin Contracts (last updated v4.5.0) (proxy/Proxy.sol)
              pragma solidity ^0.8.0;
              /**
               * @dev This abstract contract provides a fallback function that delegates all calls to another contract using the EVM
               * instruction `delegatecall`. We refer to the second contract as the _implementation_ behind the proxy, and it has to
               * be specified by overriding the virtual {_implementation} function.
               *
               * Additionally, delegation to the implementation can be triggered manually through the {_fallback} function, or to a
               * different contract through the {_delegate} function.
               *
               * The success and return data of the delegated call will be returned back to the caller of the proxy.
               */
              abstract contract Proxy {
                  /**
                   * @dev Delegates the current call to `implementation`.
                   *
                   * This function does not return to its internal call site, it will return directly to the external caller.
                   */
                  function _delegate(address implementation) internal virtual {
                      assembly {
                          // Copy msg.data. We take full control of memory in this inline assembly
                          // block because it will not return to Solidity code. We overwrite the
                          // Solidity scratch pad at memory position 0.
                          calldatacopy(0, 0, calldatasize())
                          // Call the implementation.
                          // out and outsize are 0 because we don't know the size yet.
                          let result := delegatecall(gas(), implementation, 0, calldatasize(), 0, 0)
                          // Copy the returned data.
                          returndatacopy(0, 0, returndatasize())
                          switch result
                          // delegatecall returns 0 on error.
                          case 0 {
                              revert(0, returndatasize())
                          }
                          default {
                              return(0, returndatasize())
                          }
                      }
                  }
                  /**
                   * @dev This is a virtual function that should be overriden so it returns the address to which the fallback function
                   * and {_fallback} should delegate.
                   */
                  function _implementation() internal view virtual returns (address);
                  /**
                   * @dev Delegates the current call to the address returned by `_implementation()`.
                   *
                   * This function does not return to its internall call site, it will return directly to the external caller.
                   */
                  function _fallback() internal virtual {
                      _beforeFallback();
                      _delegate(_implementation());
                  }
                  /**
                   * @dev Fallback function that delegates calls to the address returned by `_implementation()`. Will run if no other
                   * function in the contract matches the call data.
                   */
                  fallback() external payable virtual {
                      _fallback();
                  }
                  /**
                   * @dev Fallback function that delegates calls to the address returned by `_implementation()`. Will run if call data
                   * is empty.
                   */
                  receive() external payable virtual {
                      _fallback();
                  }
                  /**
                   * @dev Hook that is called before falling back to the implementation. Can happen as part of a manual `_fallback`
                   * call, or as part of the Solidity `fallback` or `receive` functions.
                   *
                   * If overriden should call `super._beforeFallback()`.
                   */
                  function _beforeFallback() internal virtual {}
              }
              // SPDX-License-Identifier: MIT
              // OpenZeppelin Contracts (last updated v4.5.0) (proxy/ERC1967/ERC1967Upgrade.sol)
              pragma solidity ^0.8.2;
              import "../beacon/IBeacon.sol";
              import "../../interfaces/draft-IERC1822.sol";
              import "../../utils/Address.sol";
              import "../../utils/StorageSlot.sol";
              /**
               * @dev This abstract contract provides getters and event emitting update functions for
               * https://eips.ethereum.org/EIPS/eip-1967[EIP1967] slots.
               *
               * _Available since v4.1._
               *
               * @custom:oz-upgrades-unsafe-allow delegatecall
               */
              abstract contract ERC1967Upgrade {
                  // This is the keccak-256 hash of "eip1967.proxy.rollback" subtracted by 1
                  bytes32 private constant _ROLLBACK_SLOT = 0x4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd9143;
                  /**
                   * @dev Storage slot with the address of the current implementation.
                   * This is the keccak-256 hash of "eip1967.proxy.implementation" subtracted by 1, and is
                   * validated in the constructor.
                   */
                  bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;
                  /**
                   * @dev Emitted when the implementation is upgraded.
                   */
                  event Upgraded(address indexed implementation);
                  /**
                   * @dev Returns the current implementation address.
                   */
                  function _getImplementation() internal view returns (address) {
                      return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;
                  }
                  /**
                   * @dev Stores a new address in the EIP1967 implementation slot.
                   */
                  function _setImplementation(address newImplementation) private {
                      require(Address.isContract(newImplementation), "ERC1967: new implementation is not a contract");
                      StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;
                  }
                  /**
                   * @dev Perform implementation upgrade
                   *
                   * Emits an {Upgraded} event.
                   */
                  function _upgradeTo(address newImplementation) internal {
                      _setImplementation(newImplementation);
                      emit Upgraded(newImplementation);
                  }
                  /**
                   * @dev Perform implementation upgrade with additional setup call.
                   *
                   * Emits an {Upgraded} event.
                   */
                  function _upgradeToAndCall(
                      address newImplementation,
                      bytes memory data,
                      bool forceCall
                  ) internal {
                      _upgradeTo(newImplementation);
                      if (data.length > 0 || forceCall) {
                          Address.functionDelegateCall(newImplementation, data);
                      }
                  }
                  /**
                   * @dev Perform implementation upgrade with security checks for UUPS proxies, and additional setup call.
                   *
                   * Emits an {Upgraded} event.
                   */
                  function _upgradeToAndCallUUPS(
                      address newImplementation,
                      bytes memory data,
                      bool forceCall
                  ) internal {
                      // Upgrades from old implementations will perform a rollback test. This test requires the new
                      // implementation to upgrade back to the old, non-ERC1822 compliant, implementation. Removing
                      // this special case will break upgrade paths from old UUPS implementation to new ones.
                      if (StorageSlot.getBooleanSlot(_ROLLBACK_SLOT).value) {
                          _setImplementation(newImplementation);
                      } else {
                          try IERC1822Proxiable(newImplementation).proxiableUUID() returns (bytes32 slot) {
                              require(slot == _IMPLEMENTATION_SLOT, "ERC1967Upgrade: unsupported proxiableUUID");
                          } catch {
                              revert("ERC1967Upgrade: new implementation is not UUPS");
                          }
                          _upgradeToAndCall(newImplementation, data, forceCall);
                      }
                  }
                  /**
                   * @dev Storage slot with the admin of the contract.
                   * This is the keccak-256 hash of "eip1967.proxy.admin" subtracted by 1, and is
                   * validated in the constructor.
                   */
                  bytes32 internal constant _ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;
                  /**
                   * @dev Emitted when the admin account has changed.
                   */
                  event AdminChanged(address previousAdmin, address newAdmin);
                  /**
                   * @dev Returns the current admin.
                   */
                  function _getAdmin() internal view returns (address) {
                      return StorageSlot.getAddressSlot(_ADMIN_SLOT).value;
                  }
                  /**
                   * @dev Stores a new address in the EIP1967 admin slot.
                   */
                  function _setAdmin(address newAdmin) private {
                      require(newAdmin != address(0), "ERC1967: new admin is the zero address");
                      StorageSlot.getAddressSlot(_ADMIN_SLOT).value = newAdmin;
                  }
                  /**
                   * @dev Changes the admin of the proxy.
                   *
                   * Emits an {AdminChanged} event.
                   */
                  function _changeAdmin(address newAdmin) internal {
                      emit AdminChanged(_getAdmin(), newAdmin);
                      _setAdmin(newAdmin);
                  }
                  /**
                   * @dev The storage slot of the UpgradeableBeacon contract which defines the implementation for this proxy.
                   * This is bytes32(uint256(keccak256('eip1967.proxy.beacon')) - 1)) and is validated in the constructor.
                   */
                  bytes32 internal constant _BEACON_SLOT = 0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50;
                  /**
                   * @dev Emitted when the beacon is upgraded.
                   */
                  event BeaconUpgraded(address indexed beacon);
                  /**
                   * @dev Returns the current beacon.
                   */
                  function _getBeacon() internal view returns (address) {
                      return StorageSlot.getAddressSlot(_BEACON_SLOT).value;
                  }
                  /**
                   * @dev Stores a new beacon in the EIP1967 beacon slot.
                   */
                  function _setBeacon(address newBeacon) private {
                      require(Address.isContract(newBeacon), "ERC1967: new beacon is not a contract");
                      require(
                          Address.isContract(IBeacon(newBeacon).implementation()),
                          "ERC1967: beacon implementation is not a contract"
                      );
                      StorageSlot.getAddressSlot(_BEACON_SLOT).value = newBeacon;
                  }
                  /**
                   * @dev Perform beacon upgrade with additional setup call. Note: This upgrades the address of the beacon, it does
                   * not upgrade the implementation contained in the beacon (see {UpgradeableBeacon-_setImplementation} for that).
                   *
                   * Emits a {BeaconUpgraded} event.
                   */
                  function _upgradeBeaconToAndCall(
                      address newBeacon,
                      bytes memory data,
                      bool forceCall
                  ) internal {
                      _setBeacon(newBeacon);
                      emit BeaconUpgraded(newBeacon);
                      if (data.length > 0 || forceCall) {
                          Address.functionDelegateCall(IBeacon(newBeacon).implementation(), data);
                      }
                  }
              }
              // SPDX-License-Identifier: MIT
              // OpenZeppelin Contracts v4.4.1 (proxy/beacon/IBeacon.sol)
              pragma solidity ^0.8.0;
              /**
               * @dev This is the interface that {BeaconProxy} expects of its beacon.
               */
              interface IBeacon {
                  /**
                   * @dev Must return an address that can be used as a delegate call target.
                   *
                   * {BeaconProxy} will check that this address is a contract.
                   */
                  function implementation() external view returns (address);
              }
              // SPDX-License-Identifier: MIT
              // OpenZeppelin Contracts (last updated v4.5.0) (interfaces/draft-IERC1822.sol)
              pragma solidity ^0.8.0;
              /**
               * @dev ERC1822: Universal Upgradeable Proxy Standard (UUPS) documents a method for upgradeability through a simplified
               * proxy whose upgrades are fully controlled by the current implementation.
               */
              interface IERC1822Proxiable {
                  /**
                   * @dev Returns the storage slot that the proxiable contract assumes is being used to store the implementation
                   * address.
                   *
                   * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks
                   * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this
                   * function revert if invoked through a proxy.
                   */
                  function proxiableUUID() external view returns (bytes32);
              }
              // SPDX-License-Identifier: MIT
              // OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol)
              pragma solidity ^0.8.1;
              /**
               * @dev Collection of functions related to the address type
               */
              library Address {
                  /**
                   * @dev Returns true if `account` is a contract.
                   *
                   * [IMPORTANT]
                   * ====
                   * It is unsafe to assume that an address for which this function returns
                   * false is an externally-owned account (EOA) and not a contract.
                   *
                   * Among others, `isContract` will return false for the following
                   * types of addresses:
                   *
                   *  - an externally-owned account
                   *  - a contract in construction
                   *  - an address where a contract will be created
                   *  - an address where a contract lived, but was destroyed
                   * ====
                   *
                   * [IMPORTANT]
                   * ====
                   * You shouldn't rely on `isContract` to protect against flash loan attacks!
                   *
                   * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
                   * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
                   * constructor.
                   * ====
                   */
                  function isContract(address account) internal view returns (bool) {
                      // This method relies on extcodesize/address.code.length, which returns 0
                      // for contracts in construction, since the code is only stored at the end
                      // of the constructor execution.
                      return account.code.length > 0;
                  }
                  /**
                   * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
                   * `recipient`, forwarding all available gas and reverting on errors.
                   *
                   * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
                   * of certain opcodes, possibly making contracts go over the 2300 gas limit
                   * imposed by `transfer`, making them unable to receive funds via
                   * `transfer`. {sendValue} removes this limitation.
                   *
                   * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
                   *
                   * IMPORTANT: because control is transferred to `recipient`, care must be
                   * taken to not create reentrancy vulnerabilities. Consider using
                   * {ReentrancyGuard} or the
                   * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
                   */
                  function sendValue(address payable recipient, uint256 amount) internal {
                      require(address(this).balance >= amount, "Address: insufficient balance");
                      (bool success, ) = recipient.call{value: amount}("");
                      require(success, "Address: unable to send value, recipient may have reverted");
                  }
                  /**
                   * @dev Performs a Solidity function call using a low level `call`. A
                   * plain `call` is an unsafe replacement for a function call: use this
                   * function instead.
                   *
                   * If `target` reverts with a revert reason, it is bubbled up by this
                   * function (like regular Solidity function calls).
                   *
                   * Returns the raw returned data. To convert to the expected return value,
                   * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
                   *
                   * Requirements:
                   *
                   * - `target` must be a contract.
                   * - calling `target` with `data` must not revert.
                   *
                   * _Available since v3.1._
                   */
                  function functionCall(address target, bytes memory data) internal returns (bytes memory) {
                      return functionCall(target, data, "Address: low-level call failed");
                  }
                  /**
                   * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
                   * `errorMessage` as a fallback revert reason when `target` reverts.
                   *
                   * _Available since v3.1._
                   */
                  function functionCall(
                      address target,
                      bytes memory data,
                      string memory errorMessage
                  ) internal returns (bytes memory) {
                      return functionCallWithValue(target, data, 0, errorMessage);
                  }
                  /**
                   * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
                   * but also transferring `value` wei to `target`.
                   *
                   * Requirements:
                   *
                   * - the calling contract must have an ETH balance of at least `value`.
                   * - the called Solidity function must be `payable`.
                   *
                   * _Available since v3.1._
                   */
                  function functionCallWithValue(
                      address target,
                      bytes memory data,
                      uint256 value
                  ) internal returns (bytes memory) {
                      return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
                  }
                  /**
                   * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
                   * with `errorMessage` as a fallback revert reason when `target` reverts.
                   *
                   * _Available since v3.1._
                   */
                  function functionCallWithValue(
                      address target,
                      bytes memory data,
                      uint256 value,
                      string memory errorMessage
                  ) internal returns (bytes memory) {
                      require(address(this).balance >= value, "Address: insufficient balance for call");
                      require(isContract(target), "Address: call to non-contract");
                      (bool success, bytes memory returndata) = target.call{value: value}(data);
                      return verifyCallResult(success, returndata, errorMessage);
                  }
                  /**
                   * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
                   * but performing a static call.
                   *
                   * _Available since v3.3._
                   */
                  function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
                      return functionStaticCall(target, data, "Address: low-level static call failed");
                  }
                  /**
                   * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
                   * but performing a static call.
                   *
                   * _Available since v3.3._
                   */
                  function functionStaticCall(
                      address target,
                      bytes memory data,
                      string memory errorMessage
                  ) internal view returns (bytes memory) {
                      require(isContract(target), "Address: static call to non-contract");
                      (bool success, bytes memory returndata) = target.staticcall(data);
                      return verifyCallResult(success, returndata, errorMessage);
                  }
                  /**
                   * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
                   * but performing a delegate call.
                   *
                   * _Available since v3.4._
                   */
                  function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
                      return functionDelegateCall(target, data, "Address: low-level delegate call failed");
                  }
                  /**
                   * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
                   * but performing a delegate call.
                   *
                   * _Available since v3.4._
                   */
                  function functionDelegateCall(
                      address target,
                      bytes memory data,
                      string memory errorMessage
                  ) internal returns (bytes memory) {
                      require(isContract(target), "Address: delegate call to non-contract");
                      (bool success, bytes memory returndata) = target.delegatecall(data);
                      return verifyCallResult(success, returndata, errorMessage);
                  }
                  /**
                   * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
                   * revert reason using the provided one.
                   *
                   * _Available since v4.3._
                   */
                  function verifyCallResult(
                      bool success,
                      bytes memory returndata,
                      string memory errorMessage
                  ) internal pure returns (bytes memory) {
                      if (success) {
                          return returndata;
                      } else {
                          // Look for revert reason and bubble it up if present
                          if (returndata.length > 0) {
                              // The easiest way to bubble the revert reason is using memory via assembly
                              assembly {
                                  let returndata_size := mload(returndata)
                                  revert(add(32, returndata), returndata_size)
                              }
                          } else {
                              revert(errorMessage);
                          }
                      }
                  }
              }
              // SPDX-License-Identifier: MIT
              // OpenZeppelin Contracts v4.4.1 (utils/StorageSlot.sol)
              pragma solidity ^0.8.0;
              /**
               * @dev Library for reading and writing primitive types to specific storage slots.
               *
               * Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts.
               * This library helps with reading and writing to such slots without the need for inline assembly.
               *
               * The functions in this library return Slot structs that contain a `value` member that can be used to read or write.
               *
               * Example usage to set ERC1967 implementation slot:
               * ```
               * contract ERC1967 {
               *     bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;
               *
               *     function _getImplementation() internal view returns (address) {
               *         return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;
               *     }
               *
               *     function _setImplementation(address newImplementation) internal {
               *         require(Address.isContract(newImplementation), "ERC1967: new implementation is not a contract");
               *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;
               *     }
               * }
               * ```
               *
               * _Available since v4.1 for `address`, `bool`, `bytes32`, and `uint256`._
               */
              library StorageSlot {
                  struct AddressSlot {
                      address value;
                  }
                  struct BooleanSlot {
                      bool value;
                  }
                  struct Bytes32Slot {
                      bytes32 value;
                  }
                  struct Uint256Slot {
                      uint256 value;
                  }
                  /**
                   * @dev Returns an `AddressSlot` with member `value` located at `slot`.
                   */
                  function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) {
                      assembly {
                          r.slot := slot
                      }
                  }
                  /**
                   * @dev Returns an `BooleanSlot` with member `value` located at `slot`.
                   */
                  function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {
                      assembly {
                          r.slot := slot
                      }
                  }
                  /**
                   * @dev Returns an `Bytes32Slot` with member `value` located at `slot`.
                   */
                  function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {
                      assembly {
                          r.slot := slot
                      }
                  }
                  /**
                   * @dev Returns an `Uint256Slot` with member `value` located at `slot`.
                   */
                  function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {
                      assembly {
                          r.slot := slot
                      }
                  }
              }
              

              File 2 of 5: TransparentUpgradeableProxy
              // SPDX-License-Identifier: MIT
              // OpenZeppelin Contracts v4.4.1 (proxy/transparent/TransparentUpgradeableProxy.sol)
              pragma solidity ^0.8.0;
              import "../ERC1967/ERC1967Proxy.sol";
              /**
               * @dev This contract implements a proxy that is upgradeable by an admin.
               *
               * To avoid https://medium.com/nomic-labs-blog/malicious-backdoors-in-ethereum-proxies-62629adf3357[proxy selector
               * clashing], which can potentially be used in an attack, this contract uses the
               * https://blog.openzeppelin.com/the-transparent-proxy-pattern/[transparent proxy pattern]. This pattern implies two
               * things that go hand in hand:
               *
               * 1. If any account other than the admin calls the proxy, the call will be forwarded to the implementation, even if
               * that call matches one of the admin functions exposed by the proxy itself.
               * 2. If the admin calls the proxy, it can access the admin functions, but its calls will never be forwarded to the
               * implementation. If the admin tries to call a function on the implementation it will fail with an error that says
               * "admin cannot fallback to proxy target".
               *
               * These properties mean that the admin account can only be used for admin actions like upgrading the proxy or changing
               * the admin, so it's best if it's a dedicated account that is not used for anything else. This will avoid headaches due
               * to sudden errors when trying to call a function from the proxy implementation.
               *
               * Our recommendation is for the dedicated account to be an instance of the {ProxyAdmin} contract. If set up this way,
               * you should think of the `ProxyAdmin` instance as the real administrative interface of your proxy.
               */
              contract TransparentUpgradeableProxy is ERC1967Proxy {
                  /**
                   * @dev Initializes an upgradeable proxy managed by `_admin`, backed by the implementation at `_logic`, and
                   * optionally initialized with `_data` as explained in {ERC1967Proxy-constructor}.
                   */
                  constructor(
                      address _logic,
                      address admin_,
                      bytes memory _data
                  ) payable ERC1967Proxy(_logic, _data) {
                      assert(_ADMIN_SLOT == bytes32(uint256(keccak256("eip1967.proxy.admin")) - 1));
                      _changeAdmin(admin_);
                  }
                  /**
                   * @dev Modifier used internally that will delegate the call to the implementation unless the sender is the admin.
                   */
                  modifier ifAdmin() {
                      if (msg.sender == _getAdmin()) {
                          _;
                      } else {
                          _fallback();
                      }
                  }
                  /**
                   * @dev Returns the current admin.
                   *
                   * NOTE: Only the admin can call this function. See {ProxyAdmin-getProxyAdmin}.
                   *
                   * TIP: To get this value clients can read directly from the storage slot shown below (specified by EIP1967) using the
                   * https://eth.wiki/json-rpc/API#eth_getstorageat[`eth_getStorageAt`] RPC call.
                   * `0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103`
                   */
                  function admin() external ifAdmin returns (address admin_) {
                      admin_ = _getAdmin();
                  }
                  /**
                   * @dev Returns the current implementation.
                   *
                   * NOTE: Only the admin can call this function. See {ProxyAdmin-getProxyImplementation}.
                   *
                   * TIP: To get this value clients can read directly from the storage slot shown below (specified by EIP1967) using the
                   * https://eth.wiki/json-rpc/API#eth_getstorageat[`eth_getStorageAt`] RPC call.
                   * `0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc`
                   */
                  function implementation() external ifAdmin returns (address implementation_) {
                      implementation_ = _implementation();
                  }
                  /**
                   * @dev Changes the admin of the proxy.
                   *
                   * Emits an {AdminChanged} event.
                   *
                   * NOTE: Only the admin can call this function. See {ProxyAdmin-changeProxyAdmin}.
                   */
                  function changeAdmin(address newAdmin) external virtual ifAdmin {
                      _changeAdmin(newAdmin);
                  }
                  /**
                   * @dev Upgrade the implementation of the proxy.
                   *
                   * NOTE: Only the admin can call this function. See {ProxyAdmin-upgrade}.
                   */
                  function upgradeTo(address newImplementation) external ifAdmin {
                      _upgradeToAndCall(newImplementation, bytes(""), false);
                  }
                  /**
                   * @dev Upgrade the implementation of the proxy, and then call a function from the new implementation as specified
                   * by `data`, which should be an encoded function call. This is useful to initialize new storage variables in the
                   * proxied contract.
                   *
                   * NOTE: Only the admin can call this function. See {ProxyAdmin-upgradeAndCall}.
                   */
                  function upgradeToAndCall(address newImplementation, bytes calldata data) external payable ifAdmin {
                      _upgradeToAndCall(newImplementation, data, true);
                  }
                  /**
                   * @dev Returns the current admin.
                   */
                  function _admin() internal view virtual returns (address) {
                      return _getAdmin();
                  }
                  /**
                   * @dev Makes sure the admin cannot access the fallback function. See {Proxy-_beforeFallback}.
                   */
                  function _beforeFallback() internal virtual override {
                      require(msg.sender != _getAdmin(), "TransparentUpgradeableProxy: admin cannot fallback to proxy target");
                      super._beforeFallback();
                  }
              }
              // SPDX-License-Identifier: MIT
              // OpenZeppelin Contracts v4.4.1 (proxy/ERC1967/ERC1967Proxy.sol)
              pragma solidity ^0.8.0;
              import "../Proxy.sol";
              import "./ERC1967Upgrade.sol";
              /**
               * @dev This contract implements an upgradeable proxy. It is upgradeable because calls are delegated to an
               * implementation address that can be changed. This address is stored in storage in the location specified by
               * https://eips.ethereum.org/EIPS/eip-1967[EIP1967], so that it doesn't conflict with the storage layout of the
               * implementation behind the proxy.
               */
              contract ERC1967Proxy is Proxy, ERC1967Upgrade {
                  /**
                   * @dev Initializes the upgradeable proxy with an initial implementation specified by `_logic`.
                   *
                   * If `_data` is nonempty, it's used as data in a delegate call to `_logic`. This will typically be an encoded
                   * function call, and allows initializating the storage of the proxy like a Solidity constructor.
                   */
                  constructor(address _logic, bytes memory _data) payable {
                      assert(_IMPLEMENTATION_SLOT == bytes32(uint256(keccak256("eip1967.proxy.implementation")) - 1));
                      _upgradeToAndCall(_logic, _data, false);
                  }
                  /**
                   * @dev Returns the current implementation address.
                   */
                  function _implementation() internal view virtual override returns (address impl) {
                      return ERC1967Upgrade._getImplementation();
                  }
              }
              // SPDX-License-Identifier: MIT
              // OpenZeppelin Contracts (last updated v4.5.0) (proxy/Proxy.sol)
              pragma solidity ^0.8.0;
              /**
               * @dev This abstract contract provides a fallback function that delegates all calls to another contract using the EVM
               * instruction `delegatecall`. We refer to the second contract as the _implementation_ behind the proxy, and it has to
               * be specified by overriding the virtual {_implementation} function.
               *
               * Additionally, delegation to the implementation can be triggered manually through the {_fallback} function, or to a
               * different contract through the {_delegate} function.
               *
               * The success and return data of the delegated call will be returned back to the caller of the proxy.
               */
              abstract contract Proxy {
                  /**
                   * @dev Delegates the current call to `implementation`.
                   *
                   * This function does not return to its internal call site, it will return directly to the external caller.
                   */
                  function _delegate(address implementation) internal virtual {
                      assembly {
                          // Copy msg.data. We take full control of memory in this inline assembly
                          // block because it will not return to Solidity code. We overwrite the
                          // Solidity scratch pad at memory position 0.
                          calldatacopy(0, 0, calldatasize())
                          // Call the implementation.
                          // out and outsize are 0 because we don't know the size yet.
                          let result := delegatecall(gas(), implementation, 0, calldatasize(), 0, 0)
                          // Copy the returned data.
                          returndatacopy(0, 0, returndatasize())
                          switch result
                          // delegatecall returns 0 on error.
                          case 0 {
                              revert(0, returndatasize())
                          }
                          default {
                              return(0, returndatasize())
                          }
                      }
                  }
                  /**
                   * @dev This is a virtual function that should be overriden so it returns the address to which the fallback function
                   * and {_fallback} should delegate.
                   */
                  function _implementation() internal view virtual returns (address);
                  /**
                   * @dev Delegates the current call to the address returned by `_implementation()`.
                   *
                   * This function does not return to its internall call site, it will return directly to the external caller.
                   */
                  function _fallback() internal virtual {
                      _beforeFallback();
                      _delegate(_implementation());
                  }
                  /**
                   * @dev Fallback function that delegates calls to the address returned by `_implementation()`. Will run if no other
                   * function in the contract matches the call data.
                   */
                  fallback() external payable virtual {
                      _fallback();
                  }
                  /**
                   * @dev Fallback function that delegates calls to the address returned by `_implementation()`. Will run if call data
                   * is empty.
                   */
                  receive() external payable virtual {
                      _fallback();
                  }
                  /**
                   * @dev Hook that is called before falling back to the implementation. Can happen as part of a manual `_fallback`
                   * call, or as part of the Solidity `fallback` or `receive` functions.
                   *
                   * If overriden should call `super._beforeFallback()`.
                   */
                  function _beforeFallback() internal virtual {}
              }
              // SPDX-License-Identifier: MIT
              // OpenZeppelin Contracts (last updated v4.5.0) (proxy/ERC1967/ERC1967Upgrade.sol)
              pragma solidity ^0.8.2;
              import "../beacon/IBeacon.sol";
              import "../../interfaces/draft-IERC1822.sol";
              import "../../utils/Address.sol";
              import "../../utils/StorageSlot.sol";
              /**
               * @dev This abstract contract provides getters and event emitting update functions for
               * https://eips.ethereum.org/EIPS/eip-1967[EIP1967] slots.
               *
               * _Available since v4.1._
               *
               * @custom:oz-upgrades-unsafe-allow delegatecall
               */
              abstract contract ERC1967Upgrade {
                  // This is the keccak-256 hash of "eip1967.proxy.rollback" subtracted by 1
                  bytes32 private constant _ROLLBACK_SLOT = 0x4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd9143;
                  /**
                   * @dev Storage slot with the address of the current implementation.
                   * This is the keccak-256 hash of "eip1967.proxy.implementation" subtracted by 1, and is
                   * validated in the constructor.
                   */
                  bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;
                  /**
                   * @dev Emitted when the implementation is upgraded.
                   */
                  event Upgraded(address indexed implementation);
                  /**
                   * @dev Returns the current implementation address.
                   */
                  function _getImplementation() internal view returns (address) {
                      return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;
                  }
                  /**
                   * @dev Stores a new address in the EIP1967 implementation slot.
                   */
                  function _setImplementation(address newImplementation) private {
                      require(Address.isContract(newImplementation), "ERC1967: new implementation is not a contract");
                      StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;
                  }
                  /**
                   * @dev Perform implementation upgrade
                   *
                   * Emits an {Upgraded} event.
                   */
                  function _upgradeTo(address newImplementation) internal {
                      _setImplementation(newImplementation);
                      emit Upgraded(newImplementation);
                  }
                  /**
                   * @dev Perform implementation upgrade with additional setup call.
                   *
                   * Emits an {Upgraded} event.
                   */
                  function _upgradeToAndCall(
                      address newImplementation,
                      bytes memory data,
                      bool forceCall
                  ) internal {
                      _upgradeTo(newImplementation);
                      if (data.length > 0 || forceCall) {
                          Address.functionDelegateCall(newImplementation, data);
                      }
                  }
                  /**
                   * @dev Perform implementation upgrade with security checks for UUPS proxies, and additional setup call.
                   *
                   * Emits an {Upgraded} event.
                   */
                  function _upgradeToAndCallUUPS(
                      address newImplementation,
                      bytes memory data,
                      bool forceCall
                  ) internal {
                      // Upgrades from old implementations will perform a rollback test. This test requires the new
                      // implementation to upgrade back to the old, non-ERC1822 compliant, implementation. Removing
                      // this special case will break upgrade paths from old UUPS implementation to new ones.
                      if (StorageSlot.getBooleanSlot(_ROLLBACK_SLOT).value) {
                          _setImplementation(newImplementation);
                      } else {
                          try IERC1822Proxiable(newImplementation).proxiableUUID() returns (bytes32 slot) {
                              require(slot == _IMPLEMENTATION_SLOT, "ERC1967Upgrade: unsupported proxiableUUID");
                          } catch {
                              revert("ERC1967Upgrade: new implementation is not UUPS");
                          }
                          _upgradeToAndCall(newImplementation, data, forceCall);
                      }
                  }
                  /**
                   * @dev Storage slot with the admin of the contract.
                   * This is the keccak-256 hash of "eip1967.proxy.admin" subtracted by 1, and is
                   * validated in the constructor.
                   */
                  bytes32 internal constant _ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;
                  /**
                   * @dev Emitted when the admin account has changed.
                   */
                  event AdminChanged(address previousAdmin, address newAdmin);
                  /**
                   * @dev Returns the current admin.
                   */
                  function _getAdmin() internal view returns (address) {
                      return StorageSlot.getAddressSlot(_ADMIN_SLOT).value;
                  }
                  /**
                   * @dev Stores a new address in the EIP1967 admin slot.
                   */
                  function _setAdmin(address newAdmin) private {
                      require(newAdmin != address(0), "ERC1967: new admin is the zero address");
                      StorageSlot.getAddressSlot(_ADMIN_SLOT).value = newAdmin;
                  }
                  /**
                   * @dev Changes the admin of the proxy.
                   *
                   * Emits an {AdminChanged} event.
                   */
                  function _changeAdmin(address newAdmin) internal {
                      emit AdminChanged(_getAdmin(), newAdmin);
                      _setAdmin(newAdmin);
                  }
                  /**
                   * @dev The storage slot of the UpgradeableBeacon contract which defines the implementation for this proxy.
                   * This is bytes32(uint256(keccak256('eip1967.proxy.beacon')) - 1)) and is validated in the constructor.
                   */
                  bytes32 internal constant _BEACON_SLOT = 0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50;
                  /**
                   * @dev Emitted when the beacon is upgraded.
                   */
                  event BeaconUpgraded(address indexed beacon);
                  /**
                   * @dev Returns the current beacon.
                   */
                  function _getBeacon() internal view returns (address) {
                      return StorageSlot.getAddressSlot(_BEACON_SLOT).value;
                  }
                  /**
                   * @dev Stores a new beacon in the EIP1967 beacon slot.
                   */
                  function _setBeacon(address newBeacon) private {
                      require(Address.isContract(newBeacon), "ERC1967: new beacon is not a contract");
                      require(
                          Address.isContract(IBeacon(newBeacon).implementation()),
                          "ERC1967: beacon implementation is not a contract"
                      );
                      StorageSlot.getAddressSlot(_BEACON_SLOT).value = newBeacon;
                  }
                  /**
                   * @dev Perform beacon upgrade with additional setup call. Note: This upgrades the address of the beacon, it does
                   * not upgrade the implementation contained in the beacon (see {UpgradeableBeacon-_setImplementation} for that).
                   *
                   * Emits a {BeaconUpgraded} event.
                   */
                  function _upgradeBeaconToAndCall(
                      address newBeacon,
                      bytes memory data,
                      bool forceCall
                  ) internal {
                      _setBeacon(newBeacon);
                      emit BeaconUpgraded(newBeacon);
                      if (data.length > 0 || forceCall) {
                          Address.functionDelegateCall(IBeacon(newBeacon).implementation(), data);
                      }
                  }
              }
              // SPDX-License-Identifier: MIT
              // OpenZeppelin Contracts v4.4.1 (proxy/beacon/IBeacon.sol)
              pragma solidity ^0.8.0;
              /**
               * @dev This is the interface that {BeaconProxy} expects of its beacon.
               */
              interface IBeacon {
                  /**
                   * @dev Must return an address that can be used as a delegate call target.
                   *
                   * {BeaconProxy} will check that this address is a contract.
                   */
                  function implementation() external view returns (address);
              }
              // SPDX-License-Identifier: MIT
              // OpenZeppelin Contracts (last updated v4.5.0) (interfaces/draft-IERC1822.sol)
              pragma solidity ^0.8.0;
              /**
               * @dev ERC1822: Universal Upgradeable Proxy Standard (UUPS) documents a method for upgradeability through a simplified
               * proxy whose upgrades are fully controlled by the current implementation.
               */
              interface IERC1822Proxiable {
                  /**
                   * @dev Returns the storage slot that the proxiable contract assumes is being used to store the implementation
                   * address.
                   *
                   * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks
                   * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this
                   * function revert if invoked through a proxy.
                   */
                  function proxiableUUID() external view returns (bytes32);
              }
              // SPDX-License-Identifier: MIT
              // OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol)
              pragma solidity ^0.8.1;
              /**
               * @dev Collection of functions related to the address type
               */
              library Address {
                  /**
                   * @dev Returns true if `account` is a contract.
                   *
                   * [IMPORTANT]
                   * ====
                   * It is unsafe to assume that an address for which this function returns
                   * false is an externally-owned account (EOA) and not a contract.
                   *
                   * Among others, `isContract` will return false for the following
                   * types of addresses:
                   *
                   *  - an externally-owned account
                   *  - a contract in construction
                   *  - an address where a contract will be created
                   *  - an address where a contract lived, but was destroyed
                   * ====
                   *
                   * [IMPORTANT]
                   * ====
                   * You shouldn't rely on `isContract` to protect against flash loan attacks!
                   *
                   * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
                   * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
                   * constructor.
                   * ====
                   */
                  function isContract(address account) internal view returns (bool) {
                      // This method relies on extcodesize/address.code.length, which returns 0
                      // for contracts in construction, since the code is only stored at the end
                      // of the constructor execution.
                      return account.code.length > 0;
                  }
                  /**
                   * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
                   * `recipient`, forwarding all available gas and reverting on errors.
                   *
                   * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
                   * of certain opcodes, possibly making contracts go over the 2300 gas limit
                   * imposed by `transfer`, making them unable to receive funds via
                   * `transfer`. {sendValue} removes this limitation.
                   *
                   * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
                   *
                   * IMPORTANT: because control is transferred to `recipient`, care must be
                   * taken to not create reentrancy vulnerabilities. Consider using
                   * {ReentrancyGuard} or the
                   * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
                   */
                  function sendValue(address payable recipient, uint256 amount) internal {
                      require(address(this).balance >= amount, "Address: insufficient balance");
                      (bool success, ) = recipient.call{value: amount}("");
                      require(success, "Address: unable to send value, recipient may have reverted");
                  }
                  /**
                   * @dev Performs a Solidity function call using a low level `call`. A
                   * plain `call` is an unsafe replacement for a function call: use this
                   * function instead.
                   *
                   * If `target` reverts with a revert reason, it is bubbled up by this
                   * function (like regular Solidity function calls).
                   *
                   * Returns the raw returned data. To convert to the expected return value,
                   * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
                   *
                   * Requirements:
                   *
                   * - `target` must be a contract.
                   * - calling `target` with `data` must not revert.
                   *
                   * _Available since v3.1._
                   */
                  function functionCall(address target, bytes memory data) internal returns (bytes memory) {
                      return functionCall(target, data, "Address: low-level call failed");
                  }
                  /**
                   * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
                   * `errorMessage` as a fallback revert reason when `target` reverts.
                   *
                   * _Available since v3.1._
                   */
                  function functionCall(
                      address target,
                      bytes memory data,
                      string memory errorMessage
                  ) internal returns (bytes memory) {
                      return functionCallWithValue(target, data, 0, errorMessage);
                  }
                  /**
                   * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
                   * but also transferring `value` wei to `target`.
                   *
                   * Requirements:
                   *
                   * - the calling contract must have an ETH balance of at least `value`.
                   * - the called Solidity function must be `payable`.
                   *
                   * _Available since v3.1._
                   */
                  function functionCallWithValue(
                      address target,
                      bytes memory data,
                      uint256 value
                  ) internal returns (bytes memory) {
                      return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
                  }
                  /**
                   * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
                   * with `errorMessage` as a fallback revert reason when `target` reverts.
                   *
                   * _Available since v3.1._
                   */
                  function functionCallWithValue(
                      address target,
                      bytes memory data,
                      uint256 value,
                      string memory errorMessage
                  ) internal returns (bytes memory) {
                      require(address(this).balance >= value, "Address: insufficient balance for call");
                      require(isContract(target), "Address: call to non-contract");
                      (bool success, bytes memory returndata) = target.call{value: value}(data);
                      return verifyCallResult(success, returndata, errorMessage);
                  }
                  /**
                   * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
                   * but performing a static call.
                   *
                   * _Available since v3.3._
                   */
                  function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
                      return functionStaticCall(target, data, "Address: low-level static call failed");
                  }
                  /**
                   * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
                   * but performing a static call.
                   *
                   * _Available since v3.3._
                   */
                  function functionStaticCall(
                      address target,
                      bytes memory data,
                      string memory errorMessage
                  ) internal view returns (bytes memory) {
                      require(isContract(target), "Address: static call to non-contract");
                      (bool success, bytes memory returndata) = target.staticcall(data);
                      return verifyCallResult(success, returndata, errorMessage);
                  }
                  /**
                   * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
                   * but performing a delegate call.
                   *
                   * _Available since v3.4._
                   */
                  function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
                      return functionDelegateCall(target, data, "Address: low-level delegate call failed");
                  }
                  /**
                   * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
                   * but performing a delegate call.
                   *
                   * _Available since v3.4._
                   */
                  function functionDelegateCall(
                      address target,
                      bytes memory data,
                      string memory errorMessage
                  ) internal returns (bytes memory) {
                      require(isContract(target), "Address: delegate call to non-contract");
                      (bool success, bytes memory returndata) = target.delegatecall(data);
                      return verifyCallResult(success, returndata, errorMessage);
                  }
                  /**
                   * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
                   * revert reason using the provided one.
                   *
                   * _Available since v4.3._
                   */
                  function verifyCallResult(
                      bool success,
                      bytes memory returndata,
                      string memory errorMessage
                  ) internal pure returns (bytes memory) {
                      if (success) {
                          return returndata;
                      } else {
                          // Look for revert reason and bubble it up if present
                          if (returndata.length > 0) {
                              // The easiest way to bubble the revert reason is using memory via assembly
                              assembly {
                                  let returndata_size := mload(returndata)
                                  revert(add(32, returndata), returndata_size)
                              }
                          } else {
                              revert(errorMessage);
                          }
                      }
                  }
              }
              // SPDX-License-Identifier: MIT
              // OpenZeppelin Contracts v4.4.1 (utils/StorageSlot.sol)
              pragma solidity ^0.8.0;
              /**
               * @dev Library for reading and writing primitive types to specific storage slots.
               *
               * Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts.
               * This library helps with reading and writing to such slots without the need for inline assembly.
               *
               * The functions in this library return Slot structs that contain a `value` member that can be used to read or write.
               *
               * Example usage to set ERC1967 implementation slot:
               * ```
               * contract ERC1967 {
               *     bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;
               *
               *     function _getImplementation() internal view returns (address) {
               *         return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;
               *     }
               *
               *     function _setImplementation(address newImplementation) internal {
               *         require(Address.isContract(newImplementation), "ERC1967: new implementation is not a contract");
               *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;
               *     }
               * }
               * ```
               *
               * _Available since v4.1 for `address`, `bool`, `bytes32`, and `uint256`._
               */
              library StorageSlot {
                  struct AddressSlot {
                      address value;
                  }
                  struct BooleanSlot {
                      bool value;
                  }
                  struct Bytes32Slot {
                      bytes32 value;
                  }
                  struct Uint256Slot {
                      uint256 value;
                  }
                  /**
                   * @dev Returns an `AddressSlot` with member `value` located at `slot`.
                   */
                  function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) {
                      assembly {
                          r.slot := slot
                      }
                  }
                  /**
                   * @dev Returns an `BooleanSlot` with member `value` located at `slot`.
                   */
                  function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {
                      assembly {
                          r.slot := slot
                      }
                  }
                  /**
                   * @dev Returns an `Bytes32Slot` with member `value` located at `slot`.
                   */
                  function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {
                      assembly {
                          r.slot := slot
                      }
                  }
                  /**
                   * @dev Returns an `Uint256Slot` with member `value` located at `slot`.
                   */
                  function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {
                      assembly {
                          r.slot := slot
                      }
                  }
              }
              

              File 3 of 5: GasRefunder
              // SPDX-License-Identifier: Apache-2.0
              /*
               * Copyright 2021, Offchain Labs, Inc.
               *
               * Licensed under the Apache License, Version 2.0 (the "License");
               * you may not use this file except in compliance with the License.
               * You may obtain a copy of the License at
               *
               *    http://www.apache.org/licenses/LICENSE-2.0
               *
               * Unless required by applicable law or agreed to in writing, software
               * distributed under the License is distributed on an "AS IS" BASIS,
               * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
               * See the License for the specific language governing permissions and
               * limitations under the License.
               */
              pragma solidity ^0.8.7;
              import "./IGasRefunder.sol";
              import "@openzeppelin/contracts-0.8/access/Ownable.sol";
              contract GasRefunder is IGasRefunder, Ownable {
                  mapping(address => bool) public allowedContracts;
                  mapping(address => bool) public allowedRefundees;
                  address public disallower;
                  struct CommonParameters {
                      uint128 maxRefundeeBalance;
                      uint32 extraGasMargin;
                      uint8 calldataCost;
                      uint64 maxGasTip;
                      uint64 maxGasCost;
                      uint32 maxSingleGasUsage;
                  }
                  CommonParameters public commonParams;
                  enum CommonParameterKey {
                      MAX_REFUNDEE_BALANCE,
                      EXTRA_GAS_MARGIN,
                      CALLDATA_COST,
                      MAX_GAS_TIP,
                      MAX_GAS_COST,
                      MAX_SINGLE_GAS_USAGE
                  }
                  enum RefundDenyReason {
                      CONTRACT_NOT_ALLOWED,
                      REFUNDEE_NOT_ALLOWED,
                      REFUNDEE_ABOVE_MAX_BALANCE,
                      OUT_OF_FUNDS
                  }
                  event RefundedGasCosts(
                      address indexed refundee,
                      address indexed contractAddress,
                      bool indexed success,
                      uint256 gas,
                      uint256 gasPrice,
                      uint256 amountPaid
                  );
                  event RefundGasCostsDenied(
                      address indexed refundee,
                      address indexed contractAddress,
                      RefundDenyReason indexed reason,
                      uint256 gas
                  );
                  event Deposited(address sender, uint256 amount);
                  event Withdrawn(address initiator, address destination, uint256 amount);
                  event ContractAllowedSet(address indexed addr, bool indexed allowed);
                  event RefundeeAllowedSet(address indexed addr, bool indexed allowed);
                  event DisallowerSet(address indexed addr);
                  event CommonParameterSet(CommonParameterKey indexed parameter, uint256 value);
                  constructor() Ownable() {
                      commonParams = CommonParameters({
                          maxRefundeeBalance: 0, // no limit
                          extraGasMargin: 4000, // 4k gas
                          calldataCost: 12, // Between 4 for zero bytes and 16 for non-zero bytes
                          maxGasTip: 2 gwei,
                          maxGasCost: 120 gwei,
                          maxSingleGasUsage: 2e6 // 2 million gas
                      });
                  }
                  function setDisallower(address addr) external onlyOwner {
                      disallower = addr;
                      emit DisallowerSet(addr);
                  }
                  function allowContracts(address[] calldata addresses) external onlyOwner {
                      setContractsAllowedImpl(addresses, true);
                  }
                  function disallowContracts(address[] calldata addresses) external {
                      require(msg.sender == owner() || msg.sender == disallower, "NOT_AUTHORIZED");
                      setContractsAllowedImpl(addresses, false);
                  }
                  function setContractsAllowedImpl(address[] calldata addresses, bool allow) internal {
                      for (uint256 i = 0; i < addresses.length; i++) {
                          address addr = addresses[i];
                          allowedContracts[addr] = allow;
                          emit ContractAllowedSet(addr, allow);
                      }
                  }
                  function allowRefundees(address[] calldata addresses) external onlyOwner {
                      setRefundeesAllowedImpl(addresses, true);
                  }
                  function disallowRefundees(address[] calldata addresses) external {
                      require(msg.sender == owner() || msg.sender == disallower, "NOT_AUTHORIZED");
                      setRefundeesAllowedImpl(addresses, false);
                  }
                  function setRefundeesAllowedImpl(address[] calldata addresses, bool allow) internal {
                      for (uint256 i = 0; i < addresses.length; i++) {
                          address addr = addresses[i];
                          allowedRefundees[addr] = allow;
                          emit RefundeeAllowedSet(addr, allow);
                      }
                  }
                  function setMaxRefundeeBalance(uint128 newValue) external onlyOwner {
                      commonParams.maxRefundeeBalance = newValue;
                      emit CommonParameterSet(CommonParameterKey.MAX_REFUNDEE_BALANCE, newValue);
                  }
                  function setExtraGasMargin(uint32 newValue) external onlyOwner {
                      commonParams.extraGasMargin = newValue;
                      emit CommonParameterSet(CommonParameterKey.EXTRA_GAS_MARGIN, newValue);
                  }
                  function setCalldataCost(uint8 newValue) external onlyOwner {
                      commonParams.calldataCost = newValue;
                      emit CommonParameterSet(CommonParameterKey.CALLDATA_COST, newValue);
                  }
                  function setMaxGasTip(uint64 newValue) external onlyOwner {
                      commonParams.maxGasTip = newValue;
                      emit CommonParameterSet(CommonParameterKey.MAX_GAS_TIP, newValue);
                  }
                  function setMaxGasCost(uint64 newValue) external onlyOwner {
                      commonParams.maxGasCost = newValue;
                      emit CommonParameterSet(CommonParameterKey.MAX_GAS_COST, newValue);
                  }
                  function setMaxSingleGasUsage(uint32 newValue) external onlyOwner {
                      commonParams.maxSingleGasUsage = newValue;
                      emit CommonParameterSet(CommonParameterKey.MAX_SINGLE_GAS_USAGE, newValue);
                  }
                  receive() external payable {
                      emit Deposited(msg.sender, msg.value);
                  }
                  function withdraw(address payable destination, uint256 amount) external onlyOwner {
                      // It's expected that destination is an EOA
                      (bool success, ) = destination.call{ value: amount }("");
                      require(success, "WITHDRAW_FAILED");
                      emit Withdrawn(msg.sender, destination, amount);
                  }
                  function onGasSpent(
                      address payable refundee,
                      uint256 gasUsed,
                      uint256 calldataSize
                  ) external override returns (bool success) {
                      uint256 startGasLeft = gasleft();
                      uint256 ownBalance = address(this).balance;
                      if (ownBalance == 0) {
                          emit RefundGasCostsDenied(refundee, msg.sender, RefundDenyReason.OUT_OF_FUNDS, gasUsed);
                          return false;
                      }
                      if (!allowedContracts[msg.sender]) {
                          emit RefundGasCostsDenied(
                              refundee,
                              msg.sender,
                              RefundDenyReason.CONTRACT_NOT_ALLOWED,
                              gasUsed
                          );
                          return false;
                      }
                      if (!allowedRefundees[refundee]) {
                          emit RefundGasCostsDenied(
                              refundee,
                              msg.sender,
                              RefundDenyReason.REFUNDEE_NOT_ALLOWED,
                              gasUsed
                          );
                          return false;
                      }
                      uint256 estGasPrice = block.basefee + commonParams.maxGasTip;
                      if (tx.gasprice < estGasPrice) {
                          estGasPrice = tx.gasprice;
                      }
                      if (commonParams.maxGasCost != 0 && estGasPrice > commonParams.maxGasCost) {
                          estGasPrice = commonParams.maxGasCost;
                      }
                      // Retrieve these variables before measuring gasleft()
                      uint256 refundeeBalance = refundee.balance;
                      uint256 maxRefundeeBalance = commonParams.maxRefundeeBalance;
                      uint256 maxSingleGasUsage = commonParams.maxSingleGasUsage;
                      // Add in a bit of a buffer for the tx costs not measured with gasleft
                      gasUsed +=
                          startGasLeft +
                          commonParams.extraGasMargin +
                          (calldataSize * commonParams.calldataCost);
                      // Split this up into two statements so that gasleft() comes after the storage loads
                      gasUsed -= gasleft();
                      if (maxSingleGasUsage != 0 && gasUsed > maxSingleGasUsage) {
                          gasUsed = maxSingleGasUsage;
                      }
                      uint256 refundAmount = estGasPrice * gasUsed;
                      if (maxRefundeeBalance != 0 && refundeeBalance + refundAmount > maxRefundeeBalance) {
                          if (refundeeBalance > maxRefundeeBalance) {
                              // The refundee is already above their max balance
                              emit RefundGasCostsDenied(
                                  refundee,
                                  msg.sender,
                                  RefundDenyReason.REFUNDEE_ABOVE_MAX_BALANCE,
                                  gasUsed
                              );
                              return false;
                          } else {
                              refundAmount = maxRefundeeBalance - refundeeBalance;
                          }
                      }
                      if (refundAmount > ownBalance) {
                          refundAmount = ownBalance;
                      }
                      // It's expected that refundee is an EOA
                      (success, ) = refundee.call{ value: refundAmount }("");
                      emit RefundedGasCosts(refundee, msg.sender, success, gasUsed, estGasPrice, refundAmount);
                  }
              }
              // SPDX-License-Identifier: Apache-2.0
              /*
               * Copyright 2021, Offchain Labs, Inc.
               *
               * Licensed under the Apache License, Version 2.0 (the "License");
               * you may not use this file except in compliance with the License.
               * You may obtain a copy of the License at
               *
               *    http://www.apache.org/licenses/LICENSE-2.0
               *
               * Unless required by applicable law or agreed to in writing, software
               * distributed under the License is distributed on an "AS IS" BASIS,
               * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
               * See the License for the specific language governing permissions and
               * limitations under the License.
               */
              pragma solidity >=0.6.11 <0.7.0 || >=0.8.7 <0.9.0;
              interface IGasRefunder {
                  function onGasSpent(
                      address payable spender,
                      uint256 gasUsed,
                      uint256 calldataSize
                  ) external returns (bool success);
              }
              // SPDX-License-Identifier: MIT
              // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)
              pragma solidity ^0.8.0;
              import "../utils/Context.sol";
              /**
               * @dev Contract module which provides a basic access control mechanism, where
               * there is an account (an owner) that can be granted exclusive access to
               * specific functions.
               *
               * By default, the owner account will be the one that deploys the contract. This
               * can later be changed with {transferOwnership}.
               *
               * This module is used through inheritance. It will make available the modifier
               * `onlyOwner`, which can be applied to your functions to restrict their use to
               * the owner.
               */
              abstract contract Ownable is Context {
                  address private _owner;
                  event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
                  /**
                   * @dev Initializes the contract setting the deployer as the initial owner.
                   */
                  constructor() {
                      _transferOwnership(_msgSender());
                  }
                  /**
                   * @dev Returns the address of the current owner.
                   */
                  function owner() public view virtual returns (address) {
                      return _owner;
                  }
                  /**
                   * @dev Throws if called by any account other than the owner.
                   */
                  modifier onlyOwner() {
                      require(owner() == _msgSender(), "Ownable: caller is not the owner");
                      _;
                  }
                  /**
                   * @dev Leaves the contract without owner. It will not be possible to call
                   * `onlyOwner` functions anymore. Can only be called by the current owner.
                   *
                   * NOTE: Renouncing ownership will leave the contract without an owner,
                   * thereby removing any functionality that is only available to the owner.
                   */
                  function renounceOwnership() public virtual onlyOwner {
                      _transferOwnership(address(0));
                  }
                  /**
                   * @dev Transfers ownership of the contract to a new account (`newOwner`).
                   * Can only be called by the current owner.
                   */
                  function transferOwnership(address newOwner) public virtual onlyOwner {
                      require(newOwner != address(0), "Ownable: new owner is the zero address");
                      _transferOwnership(newOwner);
                  }
                  /**
                   * @dev Transfers ownership of the contract to a new account (`newOwner`).
                   * Internal function without access restriction.
                   */
                  function _transferOwnership(address newOwner) internal virtual {
                      address oldOwner = _owner;
                      _owner = newOwner;
                      emit OwnershipTransferred(oldOwner, newOwner);
                  }
              }
              // SPDX-License-Identifier: MIT
              // OpenZeppelin Contracts v4.4.1 (utils/Context.sol)
              pragma solidity ^0.8.0;
              /**
               * @dev Provides information about the current execution context, including the
               * sender of the transaction and its data. While these are generally available
               * via msg.sender and msg.data, they should not be accessed in such a direct
               * manner, since when dealing with meta-transactions the account sending and
               * paying for execution may not be the actual sender (as far as an application
               * is concerned).
               *
               * This contract is only required for intermediate, library-like contracts.
               */
              abstract contract Context {
                  function _msgSender() internal view virtual returns (address) {
                      return msg.sender;
                  }
                  function _msgData() internal view virtual returns (bytes calldata) {
                      return msg.data;
                  }
              }
              

              File 4 of 5: SequencerInbox
              // Copyright 2021-2022, Offchain Labs, Inc.
              // For license information, see https://github.com/nitro/blob/master/LICENSE
              // SPDX-License-Identifier: BUSL-1.1
              pragma solidity ^0.8.0;
              import {
                  AlreadyInit,
                  HadZeroInit,
                  NotOrigin,
                  DataTooLarge,
                  NotRollup,
                  DelayedBackwards,
                  DelayedTooFar,
                  ForceIncludeBlockTooSoon,
                  ForceIncludeTimeTooSoon,
                  IncorrectMessagePreimage,
                  NotBatchPoster,
                  BadSequencerNumber,
                  DataNotAuthenticated,
                  AlreadyValidDASKeyset,
                  NoSuchKeyset,
                  NotForked
              } from "../libraries/Error.sol";
              import "./IBridge.sol";
              import "./IInbox.sol";
              import "./ISequencerInbox.sol";
              import "../rollup/IRollupLogic.sol";
              import "./Messages.sol";
              import {L1MessageType_batchPostingReport} from "../libraries/MessageTypes.sol";
              import {GasRefundEnabled, IGasRefunder} from "../libraries/IGasRefunder.sol";
              import "../libraries/DelegateCallAware.sol";
              import {MAX_DATA_SIZE} from "../libraries/Constants.sol";
              /**
               * @title Accepts batches from the sequencer and adds them to the rollup inbox.
               * @notice Contains the inbox accumulator which is the ordering of all data and transactions to be processed by the rollup.
               * As part of submitting a batch the sequencer is also expected to include items enqueued
               * in the delayed inbox (Bridge.sol). If items in the delayed inbox are not included by a
               * sequencer within a time limit they can be force included into the rollup inbox by anyone.
               */
              contract SequencerInbox is DelegateCallAware, GasRefundEnabled, ISequencerInbox {
                  uint256 public totalDelayedMessagesRead;
                  IBridge public bridge;
                  /// @inheritdoc ISequencerInbox
                  uint256 public constant HEADER_LENGTH = 40;
                  /// @inheritdoc ISequencerInbox
                  bytes1 public constant DATA_AUTHENTICATED_FLAG = 0x40;
                  IOwnable public rollup;
                  mapping(address => bool) public isBatchPoster;
                  ISequencerInbox.MaxTimeVariation public maxTimeVariation;
                  mapping(bytes32 => DasKeySetInfo) public dasKeySetInfo;
                  modifier onlyRollupOwner() {
                      if (msg.sender != rollup.owner()) revert NotOwner(msg.sender, address(rollup));
                      _;
                  }
                  uint256 internal immutable deployTimeChainId = block.chainid;
                  function _chainIdChanged() internal view returns (bool) {
                      return deployTimeChainId != block.chainid;
                  }
                  function initialize(
                      IBridge bridge_,
                      ISequencerInbox.MaxTimeVariation calldata maxTimeVariation_
                  ) external onlyDelegated {
                      if (bridge != IBridge(address(0))) revert AlreadyInit();
                      if (bridge_ == IBridge(address(0))) revert HadZeroInit();
                      bridge = bridge_;
                      rollup = bridge_.rollup();
                      maxTimeVariation = maxTimeVariation_;
                  }
                  function getTimeBounds() internal view virtual returns (TimeBounds memory) {
                      TimeBounds memory bounds;
                      if (block.timestamp > maxTimeVariation.delaySeconds) {
                          bounds.minTimestamp = uint64(block.timestamp - maxTimeVariation.delaySeconds);
                      }
                      bounds.maxTimestamp = uint64(block.timestamp + maxTimeVariation.futureSeconds);
                      if (block.number > maxTimeVariation.delayBlocks) {
                          bounds.minBlockNumber = uint64(block.number - maxTimeVariation.delayBlocks);
                      }
                      bounds.maxBlockNumber = uint64(block.number + maxTimeVariation.futureBlocks);
                      return bounds;
                  }
                  /// @inheritdoc ISequencerInbox
                  function removeDelayAfterFork() external {
                      if (!_chainIdChanged()) revert NotForked();
                      maxTimeVariation = ISequencerInbox.MaxTimeVariation({
                          delayBlocks: 1,
                          futureBlocks: 1,
                          delaySeconds: 1,
                          futureSeconds: 1
                      });
                  }
                  /// @inheritdoc ISequencerInbox
                  function forceInclusion(
                      uint256 _totalDelayedMessagesRead,
                      uint8 kind,
                      uint64[2] calldata l1BlockAndTime,
                      uint256 baseFeeL1,
                      address sender,
                      bytes32 messageDataHash
                  ) external {
                      if (_totalDelayedMessagesRead <= totalDelayedMessagesRead) revert DelayedBackwards();
                      bytes32 messageHash = Messages.messageHash(
                          kind,
                          sender,
                          l1BlockAndTime[0],
                          l1BlockAndTime[1],
                          _totalDelayedMessagesRead - 1,
                          baseFeeL1,
                          messageDataHash
                      );
                      // Can only force-include after the Sequencer-only window has expired.
                      if (l1BlockAndTime[0] + maxTimeVariation.delayBlocks >= block.number)
                          revert ForceIncludeBlockTooSoon();
                      if (l1BlockAndTime[1] + maxTimeVariation.delaySeconds >= block.timestamp)
                          revert ForceIncludeTimeTooSoon();
                      // Verify that message hash represents the last message sequence of delayed message to be included
                      bytes32 prevDelayedAcc = 0;
                      if (_totalDelayedMessagesRead > 1) {
                          prevDelayedAcc = bridge.delayedInboxAccs(_totalDelayedMessagesRead - 2);
                      }
                      if (
                          bridge.delayedInboxAccs(_totalDelayedMessagesRead - 1) !=
                          Messages.accumulateInboxMessage(prevDelayedAcc, messageHash)
                      ) revert IncorrectMessagePreimage();
                      (bytes32 dataHash, TimeBounds memory timeBounds) = formEmptyDataHash(
                          _totalDelayedMessagesRead
                      );
                      uint256 __totalDelayedMessagesRead = _totalDelayedMessagesRead;
                      uint256 prevSeqMsgCount = bridge.sequencerReportedSubMessageCount();
                      uint256 newSeqMsgCount = prevSeqMsgCount +
                          _totalDelayedMessagesRead -
                          totalDelayedMessagesRead;
                      (
                          uint256 seqMessageIndex,
                          bytes32 beforeAcc,
                          bytes32 delayedAcc,
                          bytes32 afterAcc
                      ) = addSequencerL2BatchImpl(
                              dataHash,
                              __totalDelayedMessagesRead,
                              0,
                              prevSeqMsgCount,
                              newSeqMsgCount
                          );
                      emit SequencerBatchDelivered(
                          seqMessageIndex,
                          beforeAcc,
                          afterAcc,
                          delayedAcc,
                          totalDelayedMessagesRead,
                          timeBounds,
                          BatchDataLocation.NoData
                      );
                  }
                  /// @dev Deprecated in favor of the variant specifying message counts for consistency
                  function addSequencerL2BatchFromOrigin(
                      uint256 sequenceNumber,
                      bytes calldata data,
                      uint256 afterDelayedMessagesRead,
                      IGasRefunder gasRefunder
                  ) external refundsGas(gasRefunder) {
                      // solhint-disable-next-line avoid-tx-origin
                      if (msg.sender != tx.origin) revert NotOrigin();
                      if (!isBatchPoster[msg.sender]) revert NotBatchPoster();
                      (bytes32 dataHash, TimeBounds memory timeBounds) = formDataHash(
                          data,
                          afterDelayedMessagesRead
                      );
                      (
                          uint256 seqMessageIndex,
                          bytes32 beforeAcc,
                          bytes32 delayedAcc,
                          bytes32 afterAcc
                      ) = addSequencerL2BatchImpl(dataHash, afterDelayedMessagesRead, data.length, 0, 0);
                      if (seqMessageIndex != sequenceNumber)
                          revert BadSequencerNumber(seqMessageIndex, sequenceNumber);
                      emit SequencerBatchDelivered(
                          sequenceNumber,
                          beforeAcc,
                          afterAcc,
                          delayedAcc,
                          totalDelayedMessagesRead,
                          timeBounds,
                          BatchDataLocation.TxInput
                      );
                  }
                  function addSequencerL2BatchFromOrigin(
                      uint256 sequenceNumber,
                      bytes calldata data,
                      uint256 afterDelayedMessagesRead,
                      IGasRefunder gasRefunder,
                      uint256 prevMessageCount,
                      uint256 newMessageCount
                  ) external refundsGas(gasRefunder) {
                      // solhint-disable-next-line avoid-tx-origin
                      if (msg.sender != tx.origin) revert NotOrigin();
                      if (!isBatchPoster[msg.sender]) revert NotBatchPoster();
                      (bytes32 dataHash, TimeBounds memory timeBounds) = formDataHash(
                          data,
                          afterDelayedMessagesRead
                      );
                      // Reformat the stack to prevent "Stack too deep"
                      uint256 sequenceNumber_ = sequenceNumber;
                      TimeBounds memory timeBounds_ = timeBounds;
                      bytes32 dataHash_ = dataHash;
                      uint256 dataLength = data.length;
                      uint256 afterDelayedMessagesRead_ = afterDelayedMessagesRead;
                      uint256 prevMessageCount_ = prevMessageCount;
                      uint256 newMessageCount_ = newMessageCount;
                      (
                          uint256 seqMessageIndex,
                          bytes32 beforeAcc,
                          bytes32 delayedAcc,
                          bytes32 afterAcc
                      ) = addSequencerL2BatchImpl(
                              dataHash_,
                              afterDelayedMessagesRead_,
                              dataLength,
                              prevMessageCount_,
                              newMessageCount_
                          );
                      if (seqMessageIndex != sequenceNumber_ && sequenceNumber_ != ~uint256(0))
                          revert BadSequencerNumber(seqMessageIndex, sequenceNumber_);
                      emit SequencerBatchDelivered(
                          seqMessageIndex,
                          beforeAcc,
                          afterAcc,
                          delayedAcc,
                          totalDelayedMessagesRead,
                          timeBounds_,
                          BatchDataLocation.TxInput
                      );
                  }
                  function addSequencerL2Batch(
                      uint256 sequenceNumber,
                      bytes calldata data,
                      uint256 afterDelayedMessagesRead,
                      IGasRefunder gasRefunder,
                      uint256 prevMessageCount,
                      uint256 newMessageCount
                  ) external override refundsGas(gasRefunder) {
                      if (!isBatchPoster[msg.sender] && msg.sender != address(rollup)) revert NotBatchPoster();
                      (bytes32 dataHash, TimeBounds memory timeBounds) = formDataHash(
                          data,
                          afterDelayedMessagesRead
                      );
                      uint256 seqMessageIndex;
                      {
                          // Reformat the stack to prevent "Stack too deep"
                          uint256 sequenceNumber_ = sequenceNumber;
                          TimeBounds memory timeBounds_ = timeBounds;
                          bytes32 dataHash_ = dataHash;
                          uint256 afterDelayedMessagesRead_ = afterDelayedMessagesRead;
                          uint256 prevMessageCount_ = prevMessageCount;
                          uint256 newMessageCount_ = newMessageCount;
                          // we set the calldata length posted to 0 here since the caller isn't the origin
                          // of the tx, so they might have not paid tx input cost for the calldata
                          bytes32 beforeAcc;
                          bytes32 delayedAcc;
                          bytes32 afterAcc;
                          (seqMessageIndex, beforeAcc, delayedAcc, afterAcc) = addSequencerL2BatchImpl(
                              dataHash_,
                              afterDelayedMessagesRead_,
                              0,
                              prevMessageCount_,
                              newMessageCount_
                          );
                          if (seqMessageIndex != sequenceNumber_ && sequenceNumber_ != ~uint256(0))
                              revert BadSequencerNumber(seqMessageIndex, sequenceNumber_);
                          emit SequencerBatchDelivered(
                              seqMessageIndex,
                              beforeAcc,
                              afterAcc,
                              delayedAcc,
                              totalDelayedMessagesRead,
                              timeBounds_,
                              BatchDataLocation.SeparateBatchEvent
                          );
                      }
                      emit SequencerBatchData(seqMessageIndex, data);
                  }
                  modifier validateBatchData(bytes calldata data) {
                      uint256 fullDataLen = HEADER_LENGTH + data.length;
                      if (fullDataLen > MAX_DATA_SIZE) revert DataTooLarge(fullDataLen, MAX_DATA_SIZE);
                      if (data.length > 0 && (data[0] & DATA_AUTHENTICATED_FLAG) == DATA_AUTHENTICATED_FLAG) {
                          revert DataNotAuthenticated();
                      }
                      // the first byte is used to identify the type of batch data
                      // das batches expect to have the type byte set, followed by the keyset (so they should have at least 33 bytes)
                      if (data.length >= 33 && data[0] & 0x80 != 0) {
                          // we skip the first byte, then read the next 32 bytes for the keyset
                          bytes32 dasKeysetHash = bytes32(data[1:33]);
                          if (!dasKeySetInfo[dasKeysetHash].isValidKeyset) revert NoSuchKeyset(dasKeysetHash);
                      }
                      _;
                  }
                  function packHeader(uint256 afterDelayedMessagesRead)
                      internal
                      view
                      returns (bytes memory, TimeBounds memory)
                  {
                      TimeBounds memory timeBounds = getTimeBounds();
                      bytes memory header = abi.encodePacked(
                          timeBounds.minTimestamp,
                          timeBounds.maxTimestamp,
                          timeBounds.minBlockNumber,
                          timeBounds.maxBlockNumber,
                          uint64(afterDelayedMessagesRead)
                      );
                      // This must always be true from the packed encoding
                      assert(header.length == HEADER_LENGTH);
                      return (header, timeBounds);
                  }
                  function formDataHash(bytes calldata data, uint256 afterDelayedMessagesRead)
                      internal
                      view
                      validateBatchData(data)
                      returns (bytes32, TimeBounds memory)
                  {
                      (bytes memory header, TimeBounds memory timeBounds) = packHeader(afterDelayedMessagesRead);
                      bytes32 dataHash = keccak256(bytes.concat(header, data));
                      return (dataHash, timeBounds);
                  }
                  function formEmptyDataHash(uint256 afterDelayedMessagesRead)
                      internal
                      view
                      returns (bytes32, TimeBounds memory)
                  {
                      (bytes memory header, TimeBounds memory timeBounds) = packHeader(afterDelayedMessagesRead);
                      return (keccak256(header), timeBounds);
                  }
                  function addSequencerL2BatchImpl(
                      bytes32 dataHash,
                      uint256 afterDelayedMessagesRead,
                      uint256 calldataLengthPosted,
                      uint256 prevMessageCount,
                      uint256 newMessageCount
                  )
                      internal
                      returns (
                          uint256 seqMessageIndex,
                          bytes32 beforeAcc,
                          bytes32 delayedAcc,
                          bytes32 acc
                      )
                  {
                      if (afterDelayedMessagesRead < totalDelayedMessagesRead) revert DelayedBackwards();
                      if (afterDelayedMessagesRead > bridge.delayedMessageCount()) revert DelayedTooFar();
                      (seqMessageIndex, beforeAcc, delayedAcc, acc) = bridge.enqueueSequencerMessage(
                          dataHash,
                          afterDelayedMessagesRead,
                          prevMessageCount,
                          newMessageCount
                      );
                      totalDelayedMessagesRead = afterDelayedMessagesRead;
                      if (calldataLengthPosted > 0) {
                          // this msg isn't included in the current sequencer batch, but instead added to
                          // the delayed messages queue that is yet to be included
                          address batchPoster = msg.sender;
                          bytes memory spendingReportMsg = abi.encodePacked(
                              block.timestamp,
                              batchPoster,
                              dataHash,
                              seqMessageIndex,
                              block.basefee
                          );
                          uint256 msgNum = bridge.submitBatchSpendingReport(
                              batchPoster,
                              keccak256(spendingReportMsg)
                          );
                          // this is the same event used by Inbox.sol after including a message to the delayed message accumulator
                          emit InboxMessageDelivered(msgNum, spendingReportMsg);
                      }
                  }
                  function inboxAccs(uint256 index) external view returns (bytes32) {
                      return bridge.sequencerInboxAccs(index);
                  }
                  function batchCount() external view returns (uint256) {
                      return bridge.sequencerMessageCount();
                  }
                  /// @inheritdoc ISequencerInbox
                  function setMaxTimeVariation(ISequencerInbox.MaxTimeVariation memory maxTimeVariation_)
                      external
                      onlyRollupOwner
                  {
                      maxTimeVariation = maxTimeVariation_;
                      emit OwnerFunctionCalled(0);
                  }
                  /// @inheritdoc ISequencerInbox
                  function setIsBatchPoster(address addr, bool isBatchPoster_) external onlyRollupOwner {
                      isBatchPoster[addr] = isBatchPoster_;
                      emit OwnerFunctionCalled(1);
                  }
                  /// @inheritdoc ISequencerInbox
                  function setValidKeyset(bytes calldata keysetBytes) external onlyRollupOwner {
                      uint256 ksWord = uint256(keccak256(bytes.concat(hex"fe", keccak256(keysetBytes))));
                      bytes32 ksHash = bytes32(ksWord ^ (1 << 255));
                      require(keysetBytes.length < 64 * 1024, "keyset is too large");
                      if (dasKeySetInfo[ksHash].isValidKeyset) revert AlreadyValidDASKeyset(ksHash);
                      dasKeySetInfo[ksHash] = DasKeySetInfo({
                          isValidKeyset: true,
                          creationBlock: uint64(block.number)
                      });
                      emit SetValidKeyset(ksHash, keysetBytes);
                      emit OwnerFunctionCalled(2);
                  }
                  /// @inheritdoc ISequencerInbox
                  function invalidateKeysetHash(bytes32 ksHash) external onlyRollupOwner {
                      if (!dasKeySetInfo[ksHash].isValidKeyset) revert NoSuchKeyset(ksHash);
                      // we don't delete the block creation value since its used to fetch the SetValidKeyset
                      // event efficiently. The event provides the hash preimage of the key.
                      // this is still needed when syncing the chain after a keyset is invalidated.
                      dasKeySetInfo[ksHash].isValidKeyset = false;
                      emit InvalidateKeyset(ksHash);
                      emit OwnerFunctionCalled(3);
                  }
                  function isValidKeysetHash(bytes32 ksHash) external view returns (bool) {
                      return dasKeySetInfo[ksHash].isValidKeyset;
                  }
                  /// @inheritdoc ISequencerInbox
                  function getKeysetCreationBlock(bytes32 ksHash) external view returns (uint256) {
                      DasKeySetInfo memory ksInfo = dasKeySetInfo[ksHash];
                      if (ksInfo.creationBlock == 0) revert NoSuchKeyset(ksHash);
                      return uint256(ksInfo.creationBlock);
                  }
              }
              // Copyright 2021-2022, Offchain Labs, Inc.
              // For license information, see https://github.com/nitro/blob/master/LICENSE
              // SPDX-License-Identifier: BUSL-1.1
              pragma solidity ^0.8.4;
              /// @dev Init was already called
              error AlreadyInit();
              /// Init was called with param set to zero that must be nonzero
              error HadZeroInit();
              /// @dev Thrown when non owner tries to access an only-owner function
              /// @param sender The msg.sender who is not the owner
              /// @param owner The owner address
              error NotOwner(address sender, address owner);
              /// @dev Thrown when an address that is not the rollup tries to call an only-rollup function
              /// @param sender The sender who is not the rollup
              /// @param rollup The rollup address authorized to call this function
              error NotRollup(address sender, address rollup);
              /// @dev Thrown when the contract was not called directly from the origin ie msg.sender != tx.origin
              error NotOrigin();
              /// @dev Provided data was too large
              /// @param dataLength The length of the data that is too large
              /// @param maxDataLength The max length the data can be
              error DataTooLarge(uint256 dataLength, uint256 maxDataLength);
              /// @dev The provided is not a contract and was expected to be
              /// @param addr The adddress in question
              error NotContract(address addr);
              /// @dev The merkle proof provided was too long
              /// @param actualLength The length of the merkle proof provided
              /// @param maxProofLength The max length a merkle proof can have
              error MerkleProofTooLong(uint256 actualLength, uint256 maxProofLength);
              /// @dev Thrown when an un-authorized address tries to access an admin function
              /// @param sender The un-authorized sender
              /// @param rollup The rollup, which would be authorized
              /// @param owner The rollup's owner, which would be authorized
              error NotRollupOrOwner(address sender, address rollup, address owner);
              // Bridge Errors
              /// @dev Thrown when an un-authorized address tries to access an only-inbox function
              /// @param sender The un-authorized sender
              error NotDelayedInbox(address sender);
              /// @dev Thrown when an un-authorized address tries to access an only-sequencer-inbox function
              /// @param sender The un-authorized sender
              error NotSequencerInbox(address sender);
              /// @dev Thrown when an un-authorized address tries to access an only-outbox function
              /// @param sender The un-authorized sender
              error NotOutbox(address sender);
              /// @dev the provided outbox address isn't valid
              /// @param outbox address of outbox being set
              error InvalidOutboxSet(address outbox);
              // Inbox Errors
              /// @dev The contract is paused, so cannot be paused
              error AlreadyPaused();
              /// @dev The contract is unpaused, so cannot be unpaused
              error AlreadyUnpaused();
              /// @dev The contract is paused
              error Paused();
              /// @dev msg.value sent to the inbox isn't high enough
              error InsufficientValue(uint256 expected, uint256 actual);
              /// @dev submission cost provided isn't enough to create retryable ticket
              error InsufficientSubmissionCost(uint256 expected, uint256 actual);
              /// @dev address not allowed to interact with the given contract
              error NotAllowedOrigin(address origin);
              /// @dev used to convey retryable tx data in eth calls without requiring a tx trace
              /// this follows a pattern similar to EIP-3668 where reverts surface call information
              error RetryableData(
                  address from,
                  address to,
                  uint256 l2CallValue,
                  uint256 deposit,
                  uint256 maxSubmissionCost,
                  address excessFeeRefundAddress,
                  address callValueRefundAddress,
                  uint256 gasLimit,
                  uint256 maxFeePerGas,
                  bytes data
              );
              /// @dev Thrown when a L1 chainId fork is detected
              error L1Forked();
              /// @dev Thrown when a L1 chainId fork is not detected
              error NotForked();
              // Outbox Errors
              /// @dev The provided proof was too long
              /// @param proofLength The length of the too-long proof
              error ProofTooLong(uint256 proofLength);
              /// @dev The output index was greater than the maximum
              /// @param index The output index
              /// @param maxIndex The max the index could be
              error PathNotMinimal(uint256 index, uint256 maxIndex);
              /// @dev The calculated root does not exist
              /// @param root The calculated root
              error UnknownRoot(bytes32 root);
              /// @dev The record has already been spent
              /// @param index The index of the spent record
              error AlreadySpent(uint256 index);
              /// @dev A call to the bridge failed with no return data
              error BridgeCallFailed();
              // Sequencer Inbox Errors
              /// @dev Thrown when someone attempts to read fewer messages than have already been read
              error DelayedBackwards();
              /// @dev Thrown when someone attempts to read more messages than exist
              error DelayedTooFar();
              /// @dev Force include can only read messages more blocks old than the delay period
              error ForceIncludeBlockTooSoon();
              /// @dev Force include can only read messages more seconds old than the delay period
              error ForceIncludeTimeTooSoon();
              /// @dev The message provided did not match the hash in the delayed inbox
              error IncorrectMessagePreimage();
              /// @dev This can only be called by the batch poster
              error NotBatchPoster();
              /// @dev The sequence number provided to this message was inconsistent with the number of batches already included
              error BadSequencerNumber(uint256 stored, uint256 received);
              /// @dev The sequence message number provided to this message was inconsistent with the previous one
              error BadSequencerMessageNumber(uint256 stored, uint256 received);
              /// @dev The batch data has the inbox authenticated bit set, but the batch data was not authenticated by the inbox
              error DataNotAuthenticated();
              /// @dev Tried to create an already valid Data Availability Service keyset
              error AlreadyValidDASKeyset(bytes32);
              /// @dev Tried to use or invalidate an already invalid Data Availability Service keyset
              error NoSuchKeyset(bytes32);
              // Copyright 2021-2022, Offchain Labs, Inc.
              // For license information, see https://github.com/nitro/blob/master/LICENSE
              // SPDX-License-Identifier: BUSL-1.1
              // solhint-disable-next-line compiler-version
              pragma solidity >=0.6.9 <0.9.0;
              import "./IOwnable.sol";
              interface IBridge {
                  event MessageDelivered(
                      uint256 indexed messageIndex,
                      bytes32 indexed beforeInboxAcc,
                      address inbox,
                      uint8 kind,
                      address sender,
                      bytes32 messageDataHash,
                      uint256 baseFeeL1,
                      uint64 timestamp
                  );
                  event BridgeCallTriggered(
                      address indexed outbox,
                      address indexed to,
                      uint256 value,
                      bytes data
                  );
                  event InboxToggle(address indexed inbox, bool enabled);
                  event OutboxToggle(address indexed outbox, bool enabled);
                  event SequencerInboxUpdated(address newSequencerInbox);
                  function allowedDelayedInboxList(uint256) external returns (address);
                  function allowedOutboxList(uint256) external returns (address);
                  /// @dev Accumulator for delayed inbox messages; tail represents hash of the current state; each element represents the inclusion of a new message.
                  function delayedInboxAccs(uint256) external view returns (bytes32);
                  /// @dev Accumulator for sequencer inbox messages; tail represents hash of the current state; each element represents the inclusion of a new message.
                  function sequencerInboxAccs(uint256) external view returns (bytes32);
                  function rollup() external view returns (IOwnable);
                  function sequencerInbox() external view returns (address);
                  function activeOutbox() external view returns (address);
                  function allowedDelayedInboxes(address inbox) external view returns (bool);
                  function allowedOutboxes(address outbox) external view returns (bool);
                  function sequencerReportedSubMessageCount() external view returns (uint256);
                  /**
                   * @dev Enqueue a message in the delayed inbox accumulator.
                   *      These messages are later sequenced in the SequencerInbox, either
                   *      by the sequencer as part of a normal batch, or by force inclusion.
                   */
                  function enqueueDelayedMessage(
                      uint8 kind,
                      address sender,
                      bytes32 messageDataHash
                  ) external payable returns (uint256);
                  function executeCall(
                      address to,
                      uint256 value,
                      bytes calldata data
                  ) external returns (bool success, bytes memory returnData);
                  function delayedMessageCount() external view returns (uint256);
                  function sequencerMessageCount() external view returns (uint256);
                  // ---------- onlySequencerInbox functions ----------
                  function enqueueSequencerMessage(
                      bytes32 dataHash,
                      uint256 afterDelayedMessagesRead,
                      uint256 prevMessageCount,
                      uint256 newMessageCount
                  )
                      external
                      returns (
                          uint256 seqMessageIndex,
                          bytes32 beforeAcc,
                          bytes32 delayedAcc,
                          bytes32 acc
                      );
                  /**
                   * @dev Allows the sequencer inbox to submit a delayed message of the batchPostingReport type
                   *      This is done through a separate function entrypoint instead of allowing the sequencer inbox
                   *      to call `enqueueDelayedMessage` to avoid the gas overhead of an extra SLOAD in either
                   *      every delayed inbox or every sequencer inbox call.
                   */
                  function submitBatchSpendingReport(address batchPoster, bytes32 dataHash)
                      external
                      returns (uint256 msgNum);
                  // ---------- onlyRollupOrOwner functions ----------
                  function setSequencerInbox(address _sequencerInbox) external;
                  function setDelayedInbox(address inbox, bool enabled) external;
                  function setOutbox(address inbox, bool enabled) external;
                  // ---------- initializer ----------
                  function initialize(IOwnable rollup_) external;
              }
              // Copyright 2021-2022, Offchain Labs, Inc.
              // For license information, see https://github.com/nitro/blob/master/LICENSE
              // SPDX-License-Identifier: BUSL-1.1
              // solhint-disable-next-line compiler-version
              pragma solidity >=0.6.9 <0.9.0;
              import "./IBridge.sol";
              import "./IDelayedMessageProvider.sol";
              import "./ISequencerInbox.sol";
              interface IInbox is IDelayedMessageProvider {
                  function bridge() external view returns (IBridge);
                  function sequencerInbox() external view returns (ISequencerInbox);
                  /**
                   * @notice Send a generic L2 message to the chain
                   * @dev This method is an optimization to avoid having to emit the entirety of the messageData in a log. Instead validators are expected to be able to parse the data from the transaction's input
                   *      This method will be disabled upon L1 fork to prevent replay attacks on L2
                   * @param messageData Data of the message being sent
                   */
                  function sendL2MessageFromOrigin(bytes calldata messageData) external returns (uint256);
                  /**
                   * @notice Send a generic L2 message to the chain
                   * @dev This method can be used to send any type of message that doesn't require L1 validation
                   *      This method will be disabled upon L1 fork to prevent replay attacks on L2
                   * @param messageData Data of the message being sent
                   */
                  function sendL2Message(bytes calldata messageData) external returns (uint256);
                  function sendL1FundedUnsignedTransaction(
                      uint256 gasLimit,
                      uint256 maxFeePerGas,
                      uint256 nonce,
                      address to,
                      bytes calldata data
                  ) external payable returns (uint256);
                  function sendL1FundedContractTransaction(
                      uint256 gasLimit,
                      uint256 maxFeePerGas,
                      address to,
                      bytes calldata data
                  ) external payable returns (uint256);
                  function sendUnsignedTransaction(
                      uint256 gasLimit,
                      uint256 maxFeePerGas,
                      uint256 nonce,
                      address to,
                      uint256 value,
                      bytes calldata data
                  ) external returns (uint256);
                  function sendContractTransaction(
                      uint256 gasLimit,
                      uint256 maxFeePerGas,
                      address to,
                      uint256 value,
                      bytes calldata data
                  ) external returns (uint256);
                  /**
                   * @dev This method can only be called upon L1 fork and will not alias the caller
                   *      This method will revert if not called from origin
                   */
                  function sendL1FundedUnsignedTransactionToFork(
                      uint256 gasLimit,
                      uint256 maxFeePerGas,
                      uint256 nonce,
                      address to,
                      bytes calldata data
                  ) external payable returns (uint256);
                  /**
                   * @dev This method can only be called upon L1 fork and will not alias the caller
                   *      This method will revert if not called from origin
                   */
                  function sendUnsignedTransactionToFork(
                      uint256 gasLimit,
                      uint256 maxFeePerGas,
                      uint256 nonce,
                      address to,
                      uint256 value,
                      bytes calldata data
                  ) external returns (uint256);
                  /**
                   * @notice Send a message to initiate L2 withdrawal
                   * @dev This method can only be called upon L1 fork and will not alias the caller
                   *      This method will revert if not called from origin
                   */
                  function sendWithdrawEthToFork(
                      uint256 gasLimit,
                      uint256 maxFeePerGas,
                      uint256 nonce,
                      uint256 value,
                      address withdrawTo
                  ) external returns (uint256);
                  /**
                   * @notice Get the L1 fee for submitting a retryable
                   * @dev This fee can be paid by funds already in the L2 aliased address or by the current message value
                   * @dev This formula may change in the future, to future proof your code query this method instead of inlining!!
                   * @param dataLength The length of the retryable's calldata, in bytes
                   * @param baseFee The block basefee when the retryable is included in the chain, if 0 current block.basefee will be used
                   */
                  function calculateRetryableSubmissionFee(uint256 dataLength, uint256 baseFee)
                      external
                      view
                      returns (uint256);
                  /**
                   * @notice Deposit eth from L1 to L2 to address of the sender if sender is an EOA, and to its aliased address if the sender is a contract
                   * @dev This does not trigger the fallback function when receiving in the L2 side.
                   *      Look into retryable tickets if you are interested in this functionality.
                   * @dev This function should not be called inside contract constructors
                   */
                  function depositEth() external payable returns (uint256);
                  /**
                   * @notice Put a message in the L2 inbox that can be reexecuted for some fixed amount of time if it reverts
                   * @dev all msg.value will deposited to callValueRefundAddress on L2
                   * @dev Gas limit and maxFeePerGas should not be set to 1 as that is used to trigger the RetryableData error
                   * @param to destination L2 contract address
                   * @param l2CallValue call value for retryable L2 message
                   * @param maxSubmissionCost Max gas deducted from user's L2 balance to cover base submission fee
                   * @param excessFeeRefundAddress gasLimit x maxFeePerGas - execution cost gets credited here on L2 balance
                   * @param callValueRefundAddress l2Callvalue gets credited here on L2 if retryable txn times out or gets cancelled
                   * @param gasLimit Max gas deducted from user's L2 balance to cover L2 execution. Should not be set to 1 (magic value used to trigger the RetryableData error)
                   * @param maxFeePerGas price bid for L2 execution. Should not be set to 1 (magic value used to trigger the RetryableData error)
                   * @param data ABI encoded data of L2 message
                   * @return unique message number of the retryable transaction
                   */
                  function createRetryableTicket(
                      address to,
                      uint256 l2CallValue,
                      uint256 maxSubmissionCost,
                      address excessFeeRefundAddress,
                      address callValueRefundAddress,
                      uint256 gasLimit,
                      uint256 maxFeePerGas,
                      bytes calldata data
                  ) external payable returns (uint256);
                  /**
                   * @notice Put a message in the L2 inbox that can be reexecuted for some fixed amount of time if it reverts
                   * @dev Same as createRetryableTicket, but does not guarantee that submission will succeed by requiring the needed funds
                   * come from the deposit alone, rather than falling back on the user's L2 balance
                   * @dev Advanced usage only (does not rewrite aliases for excessFeeRefundAddress and callValueRefundAddress).
                   * createRetryableTicket method is the recommended standard.
                   * @dev Gas limit and maxFeePerGas should not be set to 1 as that is used to trigger the RetryableData error
                   * @param to destination L2 contract address
                   * @param l2CallValue call value for retryable L2 message
                   * @param maxSubmissionCost Max gas deducted from user's L2 balance to cover base submission fee
                   * @param excessFeeRefundAddress gasLimit x maxFeePerGas - execution cost gets credited here on L2 balance
                   * @param callValueRefundAddress l2Callvalue gets credited here on L2 if retryable txn times out or gets cancelled
                   * @param gasLimit Max gas deducted from user's L2 balance to cover L2 execution. Should not be set to 1 (magic value used to trigger the RetryableData error)
                   * @param maxFeePerGas price bid for L2 execution. Should not be set to 1 (magic value used to trigger the RetryableData error)
                   * @param data ABI encoded data of L2 message
                   * @return unique message number of the retryable transaction
                   */
                  function unsafeCreateRetryableTicket(
                      address to,
                      uint256 l2CallValue,
                      uint256 maxSubmissionCost,
                      address excessFeeRefundAddress,
                      address callValueRefundAddress,
                      uint256 gasLimit,
                      uint256 maxFeePerGas,
                      bytes calldata data
                  ) external payable returns (uint256);
                  // ---------- onlyRollupOrOwner functions ----------
                  /// @notice pauses all inbox functionality
                  function pause() external;
                  /// @notice unpauses all inbox functionality
                  function unpause() external;
                  // ---------- initializer ----------
                  /**
                   * @dev function to be called one time during the inbox upgrade process
                   *      this is used to fix the storage slots
                   */
                  function postUpgradeInit(IBridge _bridge) external;
                  function initialize(IBridge _bridge, ISequencerInbox _sequencerInbox) external;
              }
              // Copyright 2021-2022, Offchain Labs, Inc.
              // For license information, see https://github.com/nitro/blob/master/LICENSE
              // SPDX-License-Identifier: BUSL-1.1
              // solhint-disable-next-line compiler-version
              pragma solidity >=0.6.9 <0.9.0;
              pragma experimental ABIEncoderV2;
              import "../libraries/IGasRefunder.sol";
              import "./IDelayedMessageProvider.sol";
              import "./IBridge.sol";
              interface ISequencerInbox is IDelayedMessageProvider {
                  struct MaxTimeVariation {
                      uint256 delayBlocks;
                      uint256 futureBlocks;
                      uint256 delaySeconds;
                      uint256 futureSeconds;
                  }
                  struct TimeBounds {
                      uint64 minTimestamp;
                      uint64 maxTimestamp;
                      uint64 minBlockNumber;
                      uint64 maxBlockNumber;
                  }
                  enum BatchDataLocation {
                      TxInput,
                      SeparateBatchEvent,
                      NoData
                  }
                  event SequencerBatchDelivered(
                      uint256 indexed batchSequenceNumber,
                      bytes32 indexed beforeAcc,
                      bytes32 indexed afterAcc,
                      bytes32 delayedAcc,
                      uint256 afterDelayedMessagesRead,
                      TimeBounds timeBounds,
                      BatchDataLocation dataLocation
                  );
                  event OwnerFunctionCalled(uint256 indexed id);
                  /// @dev a separate event that emits batch data when this isn't easily accessible in the tx.input
                  event SequencerBatchData(uint256 indexed batchSequenceNumber, bytes data);
                  /// @dev a valid keyset was added
                  event SetValidKeyset(bytes32 indexed keysetHash, bytes keysetBytes);
                  /// @dev a keyset was invalidated
                  event InvalidateKeyset(bytes32 indexed keysetHash);
                  function totalDelayedMessagesRead() external view returns (uint256);
                  function bridge() external view returns (IBridge);
                  /// @dev The size of the batch header
                  // solhint-disable-next-line func-name-mixedcase
                  function HEADER_LENGTH() external view returns (uint256);
                  /// @dev If the first batch data byte after the header has this bit set,
                  ///      the sequencer inbox has authenticated the data. Currently not used.
                  // solhint-disable-next-line func-name-mixedcase
                  function DATA_AUTHENTICATED_FLAG() external view returns (bytes1);
                  function rollup() external view returns (IOwnable);
                  function isBatchPoster(address) external view returns (bool);
                  struct DasKeySetInfo {
                      bool isValidKeyset;
                      uint64 creationBlock;
                  }
                  // https://github.com/ethereum/solidity/issues/11826
                  // function maxTimeVariation() external view returns (MaxTimeVariation calldata);
                  // function dasKeySetInfo(bytes32) external view returns (DasKeySetInfo calldata);
                  /// @notice Remove force inclusion delay after a L1 chainId fork
                  function removeDelayAfterFork() external;
                  /// @notice Force messages from the delayed inbox to be included in the chain
                  ///         Callable by any address, but message can only be force-included after maxTimeVariation.delayBlocks and
                  ///         maxTimeVariation.delaySeconds has elapsed. As part of normal behaviour the sequencer will include these
                  ///         messages so it's only necessary to call this if the sequencer is down, or not including any delayed messages.
                  /// @param _totalDelayedMessagesRead The total number of messages to read up to
                  /// @param kind The kind of the last message to be included
                  /// @param l1BlockAndTime The l1 block and the l1 timestamp of the last message to be included
                  /// @param baseFeeL1 The l1 gas price of the last message to be included
                  /// @param sender The sender of the last message to be included
                  /// @param messageDataHash The messageDataHash of the last message to be included
                  function forceInclusion(
                      uint256 _totalDelayedMessagesRead,
                      uint8 kind,
                      uint64[2] calldata l1BlockAndTime,
                      uint256 baseFeeL1,
                      address sender,
                      bytes32 messageDataHash
                  ) external;
                  function inboxAccs(uint256 index) external view returns (bytes32);
                  function batchCount() external view returns (uint256);
                  function isValidKeysetHash(bytes32 ksHash) external view returns (bool);
                  /// @notice the creation block is intended to still be available after a keyset is deleted
                  function getKeysetCreationBlock(bytes32 ksHash) external view returns (uint256);
                  // ---------- BatchPoster functions ----------
                  function addSequencerL2BatchFromOrigin(
                      uint256 sequenceNumber,
                      bytes calldata data,
                      uint256 afterDelayedMessagesRead,
                      IGasRefunder gasRefunder
                  ) external;
                  function addSequencerL2Batch(
                      uint256 sequenceNumber,
                      bytes calldata data,
                      uint256 afterDelayedMessagesRead,
                      IGasRefunder gasRefunder,
                      uint256 prevMessageCount,
                      uint256 newMessageCount
                  ) external;
                  // ---------- onlyRollupOrOwner functions ----------
                  /**
                   * @notice Set max delay for sequencer inbox
                   * @param maxTimeVariation_ the maximum time variation parameters
                   */
                  function setMaxTimeVariation(MaxTimeVariation memory maxTimeVariation_) external;
                  /**
                   * @notice Updates whether an address is authorized to be a batch poster at the sequencer inbox
                   * @param addr the address
                   * @param isBatchPoster_ if the specified address should be authorized as a batch poster
                   */
                  function setIsBatchPoster(address addr, bool isBatchPoster_) external;
                  /**
                   * @notice Makes Data Availability Service keyset valid
                   * @param keysetBytes bytes of the serialized keyset
                   */
                  function setValidKeyset(bytes calldata keysetBytes) external;
                  /**
                   * @notice Invalidates a Data Availability Service keyset
                   * @param ksHash hash of the keyset
                   */
                  function invalidateKeysetHash(bytes32 ksHash) external;
                  // ---------- initializer ----------
                  function initialize(IBridge bridge_, MaxTimeVariation calldata maxTimeVariation_) external;
              }
              // Copyright 2021-2022, Offchain Labs, Inc.
              // For license information, see https://github.com/nitro/blob/master/LICENSE
              // SPDX-License-Identifier: BUSL-1.1
              pragma solidity ^0.8.0;
              import "./RollupLib.sol";
              import "./IRollupCore.sol";
              import "../bridge/ISequencerInbox.sol";
              import "../bridge/IOutbox.sol";
              import "../bridge/IOwnable.sol";
              interface IRollupUserAbs is IRollupCore, IOwnable {
                  /// @dev the user logic just validated configuration and shouldn't write to state during init
                  /// this allows the admin logic to ensure consistency on parameters.
                  function initialize(address stakeToken) external view;
                  function removeWhitelistAfterFork() external;
                  function removeWhitelistAfterValidatorAfk() external;
                  function isERC20Enabled() external view returns (bool);
                  function rejectNextNode(address stakerAddress) external;
                  function confirmNextNode(bytes32 blockHash, bytes32 sendRoot) external;
                  function stakeOnExistingNode(uint64 nodeNum, bytes32 nodeHash) external;
                  function stakeOnNewNode(
                      RollupLib.Assertion memory assertion,
                      bytes32 expectedNodeHash,
                      uint256 prevNodeInboxMaxCount
                  ) external;
                  function returnOldDeposit(address stakerAddress) external;
                  function reduceDeposit(uint256 target) external;
                  function removeZombie(uint256 zombieNum, uint256 maxNodes) external;
                  function removeOldZombies(uint256 startIndex) external;
                  function requiredStake(
                      uint256 blockNumber,
                      uint64 firstUnresolvedNodeNum,
                      uint64 latestCreatedNode
                  ) external view returns (uint256);
                  function currentRequiredStake() external view returns (uint256);
                  function countStakedZombies(uint64 nodeNum) external view returns (uint256);
                  function countZombiesStakedOnChildren(uint64 nodeNum) external view returns (uint256);
                  function requireUnresolvedExists() external view;
                  function requireUnresolved(uint256 nodeNum) external view;
                  function withdrawStakerFunds() external returns (uint256);
                  function createChallenge(
                      address[2] calldata stakers,
                      uint64[2] calldata nodeNums,
                      MachineStatus[2] calldata machineStatuses,
                      GlobalState[2] calldata globalStates,
                      uint64 numBlocks,
                      bytes32 secondExecutionHash,
                      uint256[2] calldata proposedTimes,
                      bytes32[2] calldata wasmModuleRoots
                  ) external;
              }
              interface IRollupUser is IRollupUserAbs {
                  function newStakeOnExistingNode(uint64 nodeNum, bytes32 nodeHash) external payable;
                  function newStakeOnNewNode(
                      RollupLib.Assertion calldata assertion,
                      bytes32 expectedNodeHash,
                      uint256 prevNodeInboxMaxCount
                  ) external payable;
                  function addToDeposit(address stakerAddress) external payable;
              }
              interface IRollupUserERC20 is IRollupUserAbs {
                  function newStakeOnExistingNode(
                      uint256 tokenAmount,
                      uint64 nodeNum,
                      bytes32 nodeHash
                  ) external;
                  function newStakeOnNewNode(
                      uint256 tokenAmount,
                      RollupLib.Assertion calldata assertion,
                      bytes32 expectedNodeHash,
                      uint256 prevNodeInboxMaxCount
                  ) external;
                  function addToDeposit(address stakerAddress, uint256 tokenAmount) external;
              }
              interface IRollupAdmin {
                  event OwnerFunctionCalled(uint256 indexed id);
                  function initialize(Config calldata config, ContractDependencies calldata connectedContracts)
                      external;
                  /**
                   * @notice Add a contract authorized to put messages into this rollup's inbox
                   * @param _outbox Outbox contract to add
                   */
                  function setOutbox(IOutbox _outbox) external;
                  /**
                   * @notice Disable an old outbox from interacting with the bridge
                   * @param _outbox Outbox contract to remove
                   */
                  function removeOldOutbox(address _outbox) external;
                  /**
                   * @notice Enable or disable an inbox contract
                   * @param _inbox Inbox contract to add or remove
                   * @param _enabled New status of inbox
                   */
                  function setDelayedInbox(address _inbox, bool _enabled) external;
                  /**
                   * @notice Pause interaction with the rollup contract
                   */
                  function pause() external;
                  /**
                   * @notice Resume interaction with the rollup contract
                   */
                  function resume() external;
                  /**
                   * @notice Set the addresses of the validator whitelist
                   * @dev It is expected that both arrays are same length, and validator at
                   * position i corresponds to the value at position i
                   * @param _validator addresses to set in the whitelist
                   * @param _val value to set in the whitelist for corresponding address
                   */
                  function setValidator(address[] memory _validator, bool[] memory _val) external;
                  /**
                   * @notice Set a new owner address for the rollup proxy
                   * @param newOwner address of new rollup owner
                   */
                  function setOwner(address newOwner) external;
                  /**
                   * @notice Set minimum assertion period for the rollup
                   * @param newPeriod new minimum period for assertions
                   */
                  function setMinimumAssertionPeriod(uint256 newPeriod) external;
                  /**
                   * @notice Set number of blocks until a node is considered confirmed
                   * @param newConfirmPeriod new number of blocks until a node is confirmed
                   */
                  function setConfirmPeriodBlocks(uint64 newConfirmPeriod) external;
                  /**
                   * @notice Set number of extra blocks after a challenge
                   * @param newExtraTimeBlocks new number of blocks
                   */
                  function setExtraChallengeTimeBlocks(uint64 newExtraTimeBlocks) external;
                  /**
                   * @notice Set base stake required for an assertion
                   * @param newBaseStake maximum avmgas to be used per block
                   */
                  function setBaseStake(uint256 newBaseStake) external;
                  /**
                   * @notice Set the token used for stake, where address(0) == eth
                   * @dev Before changing the base stake token, you might need to change the
                   * implementation of the Rollup User logic!
                   * @param newStakeToken address of token used for staking
                   */
                  function setStakeToken(address newStakeToken) external;
                  /**
                   * @notice Upgrades the implementation of a beacon controlled by the rollup
                   * @param beacon address of beacon to be upgraded
                   * @param newImplementation new address of implementation
                   */
                  function upgradeBeacon(address beacon, address newImplementation) external;
                  function forceResolveChallenge(address[] memory stackerA, address[] memory stackerB) external;
                  function forceRefundStaker(address[] memory stacker) external;
                  function forceCreateNode(
                      uint64 prevNode,
                      uint256 prevNodeInboxMaxCount,
                      RollupLib.Assertion memory assertion,
                      bytes32 expectedNodeHash
                  ) external;
                  function forceConfirmNode(
                      uint64 nodeNum,
                      bytes32 blockHash,
                      bytes32 sendRoot
                  ) external;
                  function setLoserStakeEscrow(address newLoserStakerEscrow) external;
                  /**
                   * @notice Set the proving WASM module root
                   * @param newWasmModuleRoot new module root
                   */
                  function setWasmModuleRoot(bytes32 newWasmModuleRoot) external;
                  /**
                   * @notice set a new sequencer inbox contract
                   * @param _sequencerInbox new address of sequencer inbox
                   */
                  function setSequencerInbox(address _sequencerInbox) external;
                  /**
                   * @notice set the validatorWhitelistDisabled flag
                   * @param _validatorWhitelistDisabled new value of validatorWhitelistDisabled, i.e. true = disabled
                   */
                  function setValidatorWhitelistDisabled(bool _validatorWhitelistDisabled) external;
              }
              // Copyright 2021-2022, Offchain Labs, Inc.
              // For license information, see https://github.com/nitro/blob/master/LICENSE
              // SPDX-License-Identifier: BUSL-1.1
              pragma solidity ^0.8.0;
              library Messages {
                  function messageHash(
                      uint8 kind,
                      address sender,
                      uint64 blockNumber,
                      uint64 timestamp,
                      uint256 inboxSeqNum,
                      uint256 baseFeeL1,
                      bytes32 messageDataHash
                  ) internal pure returns (bytes32) {
                      return
                          keccak256(
                              abi.encodePacked(
                                  kind,
                                  sender,
                                  blockNumber,
                                  timestamp,
                                  inboxSeqNum,
                                  baseFeeL1,
                                  messageDataHash
                              )
                          );
                  }
                  function accumulateInboxMessage(bytes32 prevAcc, bytes32 message)
                      internal
                      pure
                      returns (bytes32)
                  {
                      return keccak256(abi.encodePacked(prevAcc, message));
                  }
              }
              // Copyright 2021-2022, Offchain Labs, Inc.
              // For license information, see https://github.com/nitro/blob/master/LICENSE
              // SPDX-License-Identifier: BUSL-1.1
              pragma solidity ^0.8.4;
              uint8 constant L2_MSG = 3;
              uint8 constant L1MessageType_L2FundedByL1 = 7;
              uint8 constant L1MessageType_submitRetryableTx = 9;
              uint8 constant L1MessageType_ethDeposit = 12;
              uint8 constant L1MessageType_batchPostingReport = 13;
              uint8 constant L2MessageType_unsignedEOATx = 0;
              uint8 constant L2MessageType_unsignedContractTx = 1;
              uint8 constant ROLLUP_PROTOCOL_EVENT_TYPE = 8;
              uint8 constant INITIALIZATION_MSG_TYPE = 11;
              // Copyright 2021-2022, Offchain Labs, Inc.
              // For license information, see https://github.com/nitro/blob/master/LICENSE
              // SPDX-License-Identifier: BUSL-1.1
              // solhint-disable-next-line compiler-version
              pragma solidity >=0.6.9 <0.9.0;
              interface IGasRefunder {
                  function onGasSpent(
                      address payable spender,
                      uint256 gasUsed,
                      uint256 calldataSize
                  ) external returns (bool success);
              }
              abstract contract GasRefundEnabled {
                  /// @dev this refunds the sender for execution costs of the tx
                  /// calldata costs are only refunded if `msg.sender == tx.origin` to guarantee the value refunded relates to charging
                  /// for the `tx.input`. this avoids a possible attack where you generate large calldata from a contract and get over-refunded
                  modifier refundsGas(IGasRefunder gasRefunder) {
                      uint256 startGasLeft = gasleft();
                      _;
                      if (address(gasRefunder) != address(0)) {
                          uint256 calldataSize;
                          assembly {
                              calldataSize := calldatasize()
                          }
                          uint256 calldataWords = (calldataSize + 31) / 32;
                          // account for the CALLDATACOPY cost of the proxy contract, including the memory expansion cost
                          startGasLeft += calldataWords * 6 + (calldataWords**2) / 512;
                          // if triggered in a contract call, the spender may be overrefunded by appending dummy data to the call
                          // so we check if it is a top level call, which would mean the sender paid calldata as part of tx.input
                          // solhint-disable-next-line avoid-tx-origin
                          if (msg.sender != tx.origin) {
                              // We can't be sure if this calldata came from the top level tx,
                              // so to be safe we tell the gas refunder there was no calldata.
                              calldataSize = 0;
                          }
                          gasRefunder.onGasSpent(payable(msg.sender), startGasLeft - gasleft(), calldataSize);
                      }
                  }
              }
              // Copyright 2021-2022, Offchain Labs, Inc.
              // For license information, see https://github.com/nitro/blob/master/LICENSE
              // SPDX-License-Identifier: BUSL-1.1
              pragma solidity ^0.8.0;
              import {NotOwner} from "./Error.sol";
              /// @dev A stateless contract that allows you to infer if the current call has been delegated or not
              /// Pattern used here is from UUPS implementation by the OpenZeppelin team
              abstract contract DelegateCallAware {
                  address private immutable __self = address(this);
                  /**
                   * @dev Check that the execution is being performed through a delegate call. This allows a function to be
                   * callable on the proxy contract but not on the logic contract.
                   */
                  modifier onlyDelegated() {
                      require(address(this) != __self, "Function must be called through delegatecall");
                      _;
                  }
                  /**
                   * @dev Check that the execution is not being performed through a delegate call. This allows a function to be
                   * callable on the implementing contract but not through proxies.
                   */
                  modifier notDelegated() {
                      require(address(this) == __self, "Function must not be called through delegatecall");
                      _;
                  }
                  /// @dev Check that msg.sender is the current EIP 1967 proxy admin
                  modifier onlyProxyOwner() {
                      // Storage slot with the admin of the proxy contract
                      // This is the keccak-256 hash of "eip1967.proxy.admin" subtracted by 1
                      bytes32 slot = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;
                      address admin;
                      assembly {
                          admin := sload(slot)
                      }
                      if (msg.sender != admin) revert NotOwner(msg.sender, admin);
                      _;
                  }
              }
              // Copyright 2021-2022, Offchain Labs, Inc.
              // For license information, see https://github.com/nitro/blob/master/LICENSE
              // SPDX-License-Identifier: BUSL-1.1
              pragma solidity ^0.8.4;
              // 90% of Geth's 128KB tx size limit, leaving ~13KB for proving
              uint256 constant MAX_DATA_SIZE = 117964;
              uint64 constant NO_CHAL_INDEX = 0;
              // Expected seconds per block in Ethereum PoS
              uint256 constant ETH_POS_BLOCK_TIME = 12;
              // Copyright 2021-2022, Offchain Labs, Inc.
              // For license information, see https://github.com/nitro/blob/master/LICENSE
              // SPDX-License-Identifier: BUSL-1.1
              // solhint-disable-next-line compiler-version
              pragma solidity >=0.4.21 <0.9.0;
              interface IOwnable {
                  function owner() external view returns (address);
              }
              // Copyright 2021-2022, Offchain Labs, Inc.
              // For license information, see https://github.com/nitro/blob/master/LICENSE
              // SPDX-License-Identifier: BUSL-1.1
              // solhint-disable-next-line compiler-version
              pragma solidity >=0.6.9 <0.9.0;
              interface IDelayedMessageProvider {
                  /// @dev event emitted when a inbox message is added to the Bridge's delayed accumulator
                  event InboxMessageDelivered(uint256 indexed messageNum, bytes data);
                  /// @dev event emitted when a inbox message is added to the Bridge's delayed accumulator
                  /// same as InboxMessageDelivered but the batch data is available in tx.input
                  event InboxMessageDeliveredFromOrigin(uint256 indexed messageNum);
              }
              // Copyright 2021-2022, Offchain Labs, Inc.
              // For license information, see https://github.com/nitro/blob/master/LICENSE
              // SPDX-License-Identifier: BUSL-1.1
              pragma solidity ^0.8.0;
              import "../challenge/IChallengeManager.sol";
              import "../challenge/ChallengeLib.sol";
              import "../state/GlobalState.sol";
              import "../bridge/ISequencerInbox.sol";
              import "../bridge/IBridge.sol";
              import "../bridge/IOutbox.sol";
              import "../bridge/IInbox.sol";
              import "./IRollupEventInbox.sol";
              import "./IRollupLogic.sol";
              struct Config {
                  uint64 confirmPeriodBlocks;
                  uint64 extraChallengeTimeBlocks;
                  address stakeToken;
                  uint256 baseStake;
                  bytes32 wasmModuleRoot;
                  address owner;
                  address loserStakeEscrow;
                  uint256 chainId;
                  uint64 genesisBlockNum;
                  ISequencerInbox.MaxTimeVariation sequencerInboxMaxTimeVariation;
              }
              struct ContractDependencies {
                  IBridge bridge;
                  ISequencerInbox sequencerInbox;
                  IInbox inbox;
                  IOutbox outbox;
                  IRollupEventInbox rollupEventInbox;
                  IChallengeManager challengeManager;
                  IRollupAdmin rollupAdminLogic;
                  IRollupUser rollupUserLogic;
                  // misc contracts that are useful when interacting with the rollup
                  address validatorUtils;
                  address validatorWalletCreator;
              }
              library RollupLib {
                  using GlobalStateLib for GlobalState;
                  struct ExecutionState {
                      GlobalState globalState;
                      MachineStatus machineStatus;
                  }
                  function stateHash(ExecutionState calldata execState, uint256 inboxMaxCount)
                      internal
                      pure
                      returns (bytes32)
                  {
                      return
                          keccak256(
                              abi.encodePacked(
                                  execState.globalState.hash(),
                                  inboxMaxCount,
                                  execState.machineStatus
                              )
                          );
                  }
                  /// @dev same as stateHash but expects execState in memory instead of calldata
                  function stateHashMem(ExecutionState memory execState, uint256 inboxMaxCount)
                      internal
                      pure
                      returns (bytes32)
                  {
                      return
                          keccak256(
                              abi.encodePacked(
                                  execState.globalState.hash(),
                                  inboxMaxCount,
                                  execState.machineStatus
                              )
                          );
                  }
                  struct Assertion {
                      ExecutionState beforeState;
                      ExecutionState afterState;
                      uint64 numBlocks;
                  }
                  function executionHash(Assertion memory assertion) internal pure returns (bytes32) {
                      MachineStatus[2] memory statuses;
                      statuses[0] = assertion.beforeState.machineStatus;
                      statuses[1] = assertion.afterState.machineStatus;
                      GlobalState[2] memory globalStates;
                      globalStates[0] = assertion.beforeState.globalState;
                      globalStates[1] = assertion.afterState.globalState;
                      // TODO: benchmark how much this abstraction adds of gas overhead
                      return executionHash(statuses, globalStates, assertion.numBlocks);
                  }
                  function executionHash(
                      MachineStatus[2] memory statuses,
                      GlobalState[2] memory globalStates,
                      uint64 numBlocks
                  ) internal pure returns (bytes32) {
                      bytes32[] memory segments = new bytes32[](2);
                      segments[0] = ChallengeLib.blockStateHash(statuses[0], globalStates[0].hash());
                      segments[1] = ChallengeLib.blockStateHash(statuses[1], globalStates[1].hash());
                      return ChallengeLib.hashChallengeState(0, numBlocks, segments);
                  }
                  function challengeRootHash(
                      bytes32 execution,
                      uint256 proposedTime,
                      bytes32 wasmModuleRoot
                  ) internal pure returns (bytes32) {
                      return keccak256(abi.encodePacked(execution, proposedTime, wasmModuleRoot));
                  }
                  function confirmHash(Assertion memory assertion) internal pure returns (bytes32) {
                      return
                          confirmHash(
                              assertion.afterState.globalState.getBlockHash(),
                              assertion.afterState.globalState.getSendRoot()
                          );
                  }
                  function confirmHash(bytes32 blockHash, bytes32 sendRoot) internal pure returns (bytes32) {
                      return keccak256(abi.encodePacked(blockHash, sendRoot));
                  }
                  function nodeHash(
                      bool hasSibling,
                      bytes32 lastHash,
                      bytes32 assertionExecHash,
                      bytes32 inboxAcc,
                      bytes32 wasmModuleRoot
                  ) internal pure returns (bytes32) {
                      uint8 hasSiblingInt = hasSibling ? 1 : 0;
                      return
                          keccak256(
                              abi.encodePacked(
                                  hasSiblingInt,
                                  lastHash,
                                  assertionExecHash,
                                  inboxAcc,
                                  wasmModuleRoot
                              )
                          );
                  }
              }
              // Copyright 2021-2022, Offchain Labs, Inc.
              // For license information, see https://github.com/nitro/blob/master/LICENSE
              // SPDX-License-Identifier: BUSL-1.1
              pragma solidity ^0.8.0;
              import "./Node.sol";
              import "./RollupLib.sol";
              interface IRollupCore {
                  struct Staker {
                      uint256 amountStaked;
                      uint64 index;
                      uint64 latestStakedNode;
                      // currentChallenge is 0 if staker is not in a challenge
                      uint64 currentChallenge;
                      bool isStaked;
                  }
                  event RollupInitialized(bytes32 machineHash, uint256 chainId);
                  event NodeCreated(
                      uint64 indexed nodeNum,
                      bytes32 indexed parentNodeHash,
                      bytes32 indexed nodeHash,
                      bytes32 executionHash,
                      RollupLib.Assertion assertion,
                      bytes32 afterInboxBatchAcc,
                      bytes32 wasmModuleRoot,
                      uint256 inboxMaxCount
                  );
                  event NodeConfirmed(uint64 indexed nodeNum, bytes32 blockHash, bytes32 sendRoot);
                  event NodeRejected(uint64 indexed nodeNum);
                  event RollupChallengeStarted(
                      uint64 indexed challengeIndex,
                      address asserter,
                      address challenger,
                      uint64 challengedNode
                  );
                  event UserStakeUpdated(address indexed user, uint256 initialBalance, uint256 finalBalance);
                  event UserWithdrawableFundsUpdated(
                      address indexed user,
                      uint256 initialBalance,
                      uint256 finalBalance
                  );
                  function confirmPeriodBlocks() external view returns (uint64);
                  function extraChallengeTimeBlocks() external view returns (uint64);
                  function chainId() external view returns (uint256);
                  function baseStake() external view returns (uint256);
                  function wasmModuleRoot() external view returns (bytes32);
                  function bridge() external view returns (IBridge);
                  function sequencerInbox() external view returns (ISequencerInbox);
                  function outbox() external view returns (IOutbox);
                  function rollupEventInbox() external view returns (IRollupEventInbox);
                  function challengeManager() external view returns (IChallengeManager);
                  function loserStakeEscrow() external view returns (address);
                  function stakeToken() external view returns (address);
                  function minimumAssertionPeriod() external view returns (uint256);
                  function isValidator(address) external view returns (bool);
                  function validatorWhitelistDisabled() external view returns (bool);
                  /**
                   * @notice Get the Node for the given index.
                   */
                  function getNode(uint64 nodeNum) external view returns (Node memory);
                  /**
                   * @notice Check if the specified node has been staked on by the provided staker.
                   * Only accurate at the latest confirmed node and afterwards.
                   */
                  function nodeHasStaker(uint64 nodeNum, address staker) external view returns (bool);
                  /**
                   * @notice Get the address of the staker at the given index
                   * @param stakerNum Index of the staker
                   * @return Address of the staker
                   */
                  function getStakerAddress(uint64 stakerNum) external view returns (address);
                  /**
                   * @notice Check whether the given staker is staked
                   * @param staker Staker address to check
                   * @return True or False for whether the staker was staked
                   */
                  function isStaked(address staker) external view returns (bool);
                  /**
                   * @notice Get the latest staked node of the given staker
                   * @param staker Staker address to lookup
                   * @return Latest node staked of the staker
                   */
                  function latestStakedNode(address staker) external view returns (uint64);
                  /**
                   * @notice Get the current challenge of the given staker
                   * @param staker Staker address to lookup
                   * @return Current challenge of the staker
                   */
                  function currentChallenge(address staker) external view returns (uint64);
                  /**
                   * @notice Get the amount staked of the given staker
                   * @param staker Staker address to lookup
                   * @return Amount staked of the staker
                   */
                  function amountStaked(address staker) external view returns (uint256);
                  /**
                   * @notice Retrieves stored information about a requested staker
                   * @param staker Staker address to retrieve
                   * @return A structure with information about the requested staker
                   */
                  function getStaker(address staker) external view returns (Staker memory);
                  /**
                   * @notice Get the original staker address of the zombie at the given index
                   * @param zombieNum Index of the zombie to lookup
                   * @return Original staker address of the zombie
                   */
                  function zombieAddress(uint256 zombieNum) external view returns (address);
                  /**
                   * @notice Get Latest node that the given zombie at the given index is staked on
                   * @param zombieNum Index of the zombie to lookup
                   * @return Latest node that the given zombie is staked on
                   */
                  function zombieLatestStakedNode(uint256 zombieNum) external view returns (uint64);
                  /// @return Current number of un-removed zombies
                  function zombieCount() external view returns (uint256);
                  function isZombie(address staker) external view returns (bool);
                  /**
                   * @notice Get the amount of funds withdrawable by the given address
                   * @param owner Address to check the funds of
                   * @return Amount of funds withdrawable by owner
                   */
                  function withdrawableFunds(address owner) external view returns (uint256);
                  /**
                   * @return Index of the first unresolved node
                   * @dev If all nodes have been resolved, this will be latestNodeCreated + 1
                   */
                  function firstUnresolvedNode() external view returns (uint64);
                  /// @return Index of the latest confirmed node
                  function latestConfirmed() external view returns (uint64);
                  /// @return Index of the latest rollup node created
                  function latestNodeCreated() external view returns (uint64);
                  /// @return Ethereum block that the most recent stake was created
                  function lastStakeBlock() external view returns (uint64);
                  /// @return Number of active stakers currently staked
                  function stakerCount() external view returns (uint64);
              }
              // Copyright 2021-2022, Offchain Labs, Inc.
              // For license information, see https://github.com/nitro/blob/master/LICENSE
              // SPDX-License-Identifier: BUSL-1.1
              // solhint-disable-next-line compiler-version
              pragma solidity >=0.6.9 <0.9.0;
              import "./IBridge.sol";
              interface IOutbox {
                  event SendRootUpdated(bytes32 indexed outputRoot, bytes32 indexed l2BlockHash);
                  event OutBoxTransactionExecuted(
                      address indexed to,
                      address indexed l2Sender,
                      uint256 indexed zero,
                      uint256 transactionIndex
                  );
                  function rollup() external view returns (address); // the rollup contract
                  function bridge() external view returns (IBridge); // the bridge contract
                  function spent(uint256) external view returns (bytes32); // packed spent bitmap
                  function roots(bytes32) external view returns (bytes32); // maps root hashes => L2 block hash
                  // solhint-disable-next-line func-name-mixedcase
                  function OUTBOX_VERSION() external view returns (uint128); // the outbox version
                  function updateSendRoot(bytes32 sendRoot, bytes32 l2BlockHash) external;
                  /// @notice When l2ToL1Sender returns a nonzero address, the message was originated by an L2 account
                  ///         When the return value is zero, that means this is a system message
                  /// @dev the l2ToL1Sender behaves as the tx.origin, the msg.sender should be validated to protect against reentrancies
                  function l2ToL1Sender() external view returns (address);
                  /// @return l2Block return L2 block when the L2 tx was initiated or 0 if no L2 to L1 transaction is active
                  function l2ToL1Block() external view returns (uint256);
                  /// @return l1Block return L1 block when the L2 tx was initiated or 0 if no L2 to L1 transaction is active
                  function l2ToL1EthBlock() external view returns (uint256);
                  /// @return timestamp return L2 timestamp when the L2 tx was initiated or 0 if no L2 to L1 transaction is active
                  function l2ToL1Timestamp() external view returns (uint256);
                  /// @return outputId returns the unique output identifier of the L2 to L1 tx or 0 if no L2 to L1 transaction is active
                  function l2ToL1OutputId() external view returns (bytes32);
                  /**
                   * @notice Executes a messages in an Outbox entry.
                   * @dev Reverts if dispute period hasn't expired, since the outbox entry
                   *      is only created once the rollup confirms the respective assertion.
                   * @dev it is not possible to execute any L2-to-L1 transaction which contains data
                   *      to a contract address without any code (as enforced by the Bridge contract).
                   * @param proof Merkle proof of message inclusion in send root
                   * @param index Merkle path to message
                   * @param l2Sender sender if original message (i.e., caller of ArbSys.sendTxToL1)
                   * @param to destination address for L1 contract call
                   * @param l2Block l2 block number at which sendTxToL1 call was made
                   * @param l1Block l1 block number at which sendTxToL1 call was made
                   * @param l2Timestamp l2 Timestamp at which sendTxToL1 call was made
                   * @param value wei in L1 message
                   * @param data abi-encoded L1 message data
                   */
                  function executeTransaction(
                      bytes32[] calldata proof,
                      uint256 index,
                      address l2Sender,
                      address to,
                      uint256 l2Block,
                      uint256 l1Block,
                      uint256 l2Timestamp,
                      uint256 value,
                      bytes calldata data
                  ) external;
                  /**
                   *  @dev function used to simulate the result of a particular function call from the outbox
                   *       it is useful for things such as gas estimates. This function includes all costs except for
                   *       proof validation (which can be considered offchain as a somewhat of a fixed cost - it's
                   *       not really a fixed cost, but can be treated as so with a fixed overhead for gas estimation).
                   *       We can't include the cost of proof validation since this is intended to be used to simulate txs
                   *       that are included in yet-to-be confirmed merkle roots. The simulation entrypoint could instead pretend
                   *       to confirm a pending merkle root, but that would be less practical for integrating with tooling.
                   *       It is only possible to trigger it when the msg sender is address zero, which should be impossible
                   *       unless under simulation in an eth_call or eth_estimateGas
                   */
                  function executeTransactionSimulation(
                      uint256 index,
                      address l2Sender,
                      address to,
                      uint256 l2Block,
                      uint256 l1Block,
                      uint256 l2Timestamp,
                      uint256 value,
                      bytes calldata data
                  ) external;
                  /**
                   * @param index Merkle path to message
                   * @return true if the message has been spent
                   */
                  function isSpent(uint256 index) external view returns (bool);
                  function calculateItemHash(
                      address l2Sender,
                      address to,
                      uint256 l2Block,
                      uint256 l1Block,
                      uint256 l2Timestamp,
                      uint256 value,
                      bytes calldata data
                  ) external pure returns (bytes32);
                  function calculateMerkleRoot(
                      bytes32[] memory proof,
                      uint256 path,
                      bytes32 item
                  ) external pure returns (bytes32);
              }
              // Copyright 2021-2022, Offchain Labs, Inc.
              // For license information, see https://github.com/nitro/blob/master/LICENSE
              // SPDX-License-Identifier: BUSL-1.1
              pragma solidity ^0.8.0;
              import "../state/Machine.sol";
              import "../bridge/IBridge.sol";
              import "../bridge/ISequencerInbox.sol";
              import "../osp/IOneStepProofEntry.sol";
              import "./IChallengeResultReceiver.sol";
              import "./ChallengeLib.sol";
              interface IChallengeManager {
                  enum ChallengeTerminationType {
                      TIMEOUT,
                      BLOCK_PROOF,
                      EXECUTION_PROOF,
                      CLEARED
                  }
                  event InitiatedChallenge(
                      uint64 indexed challengeIndex,
                      GlobalState startState,
                      GlobalState endState
                  );
                  event Bisected(
                      uint64 indexed challengeIndex,
                      bytes32 indexed challengeRoot,
                      uint256 challengedSegmentStart,
                      uint256 challengedSegmentLength,
                      bytes32[] chainHashes
                  );
                  event ExecutionChallengeBegun(uint64 indexed challengeIndex, uint256 blockSteps);
                  event OneStepProofCompleted(uint64 indexed challengeIndex);
                  event ChallengeEnded(uint64 indexed challengeIndex, ChallengeTerminationType kind);
                  function initialize(
                      IChallengeResultReceiver resultReceiver_,
                      ISequencerInbox sequencerInbox_,
                      IBridge bridge_,
                      IOneStepProofEntry osp_
                  ) external;
                  function createChallenge(
                      bytes32 wasmModuleRoot_,
                      MachineStatus[2] calldata startAndEndMachineStatuses_,
                      GlobalState[2] calldata startAndEndGlobalStates_,
                      uint64 numBlocks,
                      address asserter_,
                      address challenger_,
                      uint256 asserterTimeLeft_,
                      uint256 challengerTimeLeft_
                  ) external returns (uint64);
                  function challengeInfo(uint64 challengeIndex_)
                      external
                      view
                      returns (ChallengeLib.Challenge memory);
                  function currentResponder(uint64 challengeIndex) external view returns (address);
                  function isTimedOut(uint64 challengeIndex) external view returns (bool);
                  function clearChallenge(uint64 challengeIndex_) external;
                  function timeout(uint64 challengeIndex_) external;
              }
              // Copyright 2021-2022, Offchain Labs, Inc.
              // For license information, see https://github.com/nitro/blob/master/LICENSE
              // SPDX-License-Identifier: BUSL-1.1
              pragma solidity ^0.8.0;
              import "../state/Machine.sol";
              import "../state/GlobalState.sol";
              library ChallengeLib {
                  using MachineLib for Machine;
                  using ChallengeLib for Challenge;
                  /// @dev It's assumed that that uninitialzed challenges have mode NONE
                  enum ChallengeMode {
                      NONE,
                      BLOCK,
                      EXECUTION
                  }
                  struct Participant {
                      address addr;
                      uint256 timeLeft;
                  }
                  struct Challenge {
                      Participant current;
                      Participant next;
                      uint256 lastMoveTimestamp;
                      bytes32 wasmModuleRoot;
                      bytes32 challengeStateHash;
                      uint64 maxInboxMessages;
                      ChallengeMode mode;
                  }
                  struct SegmentSelection {
                      uint256 oldSegmentsStart;
                      uint256 oldSegmentsLength;
                      bytes32[] oldSegments;
                      uint256 challengePosition;
                  }
                  function timeUsedSinceLastMove(Challenge storage challenge) internal view returns (uint256) {
                      return block.timestamp - challenge.lastMoveTimestamp;
                  }
                  function isTimedOut(Challenge storage challenge) internal view returns (bool) {
                      return challenge.timeUsedSinceLastMove() > challenge.current.timeLeft;
                  }
                  function getStartMachineHash(bytes32 globalStateHash, bytes32 wasmModuleRoot)
                      internal
                      pure
                      returns (bytes32)
                  {
                      // Start the value stack with the function call ABI for the entrypoint
                      Value[] memory startingValues = new Value[](3);
                      startingValues[0] = ValueLib.newRefNull();
                      startingValues[1] = ValueLib.newI32(0);
                      startingValues[2] = ValueLib.newI32(0);
                      ValueArray memory valuesArray = ValueArray({inner: startingValues});
                      ValueStack memory values = ValueStack({proved: valuesArray, remainingHash: 0});
                      ValueStack memory internalStack;
                      StackFrameWindow memory frameStack;
                      Machine memory mach = Machine({
                          status: MachineStatus.RUNNING,
                          valueStack: values,
                          internalStack: internalStack,
                          frameStack: frameStack,
                          globalStateHash: globalStateHash,
                          moduleIdx: 0,
                          functionIdx: 0,
                          functionPc: 0,
                          modulesRoot: wasmModuleRoot
                      });
                      return mach.hash();
                  }
                  function getEndMachineHash(MachineStatus status, bytes32 globalStateHash)
                      internal
                      pure
                      returns (bytes32)
                  {
                      if (status == MachineStatus.FINISHED) {
                          return keccak256(abi.encodePacked("Machine finished:", globalStateHash));
                      } else if (status == MachineStatus.ERRORED) {
                          return keccak256(abi.encodePacked("Machine errored:"));
                      } else if (status == MachineStatus.TOO_FAR) {
                          return keccak256(abi.encodePacked("Machine too far:"));
                      } else {
                          revert("BAD_BLOCK_STATUS");
                      }
                  }
                  function extractChallengeSegment(SegmentSelection calldata selection)
                      internal
                      pure
                      returns (uint256 segmentStart, uint256 segmentLength)
                  {
                      uint256 oldChallengeDegree = selection.oldSegments.length - 1;
                      segmentLength = selection.oldSegmentsLength / oldChallengeDegree;
                      // Intentionally done before challengeLength is potentially added to for the final segment
                      segmentStart = selection.oldSegmentsStart + segmentLength * selection.challengePosition;
                      if (selection.challengePosition == selection.oldSegments.length - 2) {
                          segmentLength += selection.oldSegmentsLength % oldChallengeDegree;
                      }
                  }
                  function hashChallengeState(
                      uint256 segmentsStart,
                      uint256 segmentsLength,
                      bytes32[] memory segments
                  ) internal pure returns (bytes32) {
                      return keccak256(abi.encodePacked(segmentsStart, segmentsLength, segments));
                  }
                  function blockStateHash(MachineStatus status, bytes32 globalStateHash)
                      internal
                      pure
                      returns (bytes32)
                  {
                      if (status == MachineStatus.FINISHED) {
                          return keccak256(abi.encodePacked("Block state:", globalStateHash));
                      } else if (status == MachineStatus.ERRORED) {
                          return keccak256(abi.encodePacked("Block state, errored:", globalStateHash));
                      } else if (status == MachineStatus.TOO_FAR) {
                          return keccak256(abi.encodePacked("Block state, too far:"));
                      } else {
                          revert("BAD_BLOCK_STATUS");
                      }
                  }
              }
              // Copyright 2021-2022, Offchain Labs, Inc.
              // For license information, see https://github.com/nitro/blob/master/LICENSE
              // SPDX-License-Identifier: BUSL-1.1
              pragma solidity ^0.8.0;
              struct GlobalState {
                  bytes32[2] bytes32Vals;
                  uint64[2] u64Vals;
              }
              library GlobalStateLib {
                  uint16 internal constant BYTES32_VALS_NUM = 2;
                  uint16 internal constant U64_VALS_NUM = 2;
                  function hash(GlobalState memory state) internal pure returns (bytes32) {
                      return
                          keccak256(
                              abi.encodePacked(
                                  "Global state:",
                                  state.bytes32Vals[0],
                                  state.bytes32Vals[1],
                                  state.u64Vals[0],
                                  state.u64Vals[1]
                              )
                          );
                  }
                  function getBlockHash(GlobalState memory state) internal pure returns (bytes32) {
                      return state.bytes32Vals[0];
                  }
                  function getSendRoot(GlobalState memory state) internal pure returns (bytes32) {
                      return state.bytes32Vals[1];
                  }
                  function getInboxPosition(GlobalState memory state) internal pure returns (uint64) {
                      return state.u64Vals[0];
                  }
                  function getPositionInMessage(GlobalState memory state) internal pure returns (uint64) {
                      return state.u64Vals[1];
                  }
                  function isEmpty(GlobalState calldata state) internal pure returns (bool) {
                      return (state.bytes32Vals[0] == bytes32(0) &&
                          state.bytes32Vals[1] == bytes32(0) &&
                          state.u64Vals[0] == 0 &&
                          state.u64Vals[1] == 0);
                  }
              }
              // Copyright 2021-2022, Offchain Labs, Inc.
              // For license information, see https://github.com/nitro/blob/master/LICENSE
              // SPDX-License-Identifier: BUSL-1.1
              pragma solidity ^0.8.0;
              import "../bridge/IBridge.sol";
              interface IRollupEventInbox {
                  function bridge() external view returns (IBridge);
                  function initialize(IBridge _bridge) external;
                  function rollup() external view returns (address);
                  function rollupInitialized(uint256 chainId) external;
              }
              // Copyright 2021-2022, Offchain Labs, Inc.
              // For license information, see https://github.com/nitro/blob/master/LICENSE
              // SPDX-License-Identifier: BUSL-1.1
              pragma solidity ^0.8.0;
              import "./ValueStack.sol";
              import "./Instructions.sol";
              import "./StackFrame.sol";
              enum MachineStatus {
                  RUNNING,
                  FINISHED,
                  ERRORED,
                  TOO_FAR
              }
              struct Machine {
                  MachineStatus status;
                  ValueStack valueStack;
                  ValueStack internalStack;
                  StackFrameWindow frameStack;
                  bytes32 globalStateHash;
                  uint32 moduleIdx;
                  uint32 functionIdx;
                  uint32 functionPc;
                  bytes32 modulesRoot;
              }
              library MachineLib {
                  using StackFrameLib for StackFrameWindow;
                  using ValueStackLib for ValueStack;
                  function hash(Machine memory mach) internal pure returns (bytes32) {
                      // Warning: the non-running hashes are replicated in Challenge
                      if (mach.status == MachineStatus.RUNNING) {
                          return
                              keccak256(
                                  abi.encodePacked(
                                      "Machine running:",
                                      mach.valueStack.hash(),
                                      mach.internalStack.hash(),
                                      mach.frameStack.hash(),
                                      mach.globalStateHash,
                                      mach.moduleIdx,
                                      mach.functionIdx,
                                      mach.functionPc,
                                      mach.modulesRoot
                                  )
                              );
                      } else if (mach.status == MachineStatus.FINISHED) {
                          return keccak256(abi.encodePacked("Machine finished:", mach.globalStateHash));
                      } else if (mach.status == MachineStatus.ERRORED) {
                          return keccak256(abi.encodePacked("Machine errored:"));
                      } else if (mach.status == MachineStatus.TOO_FAR) {
                          return keccak256(abi.encodePacked("Machine too far:"));
                      } else {
                          revert("BAD_MACH_STATUS");
                      }
                  }
              }
              // Copyright 2021-2022, Offchain Labs, Inc.
              // For license information, see https://github.com/nitro/blob/master/LICENSE
              // SPDX-License-Identifier: BUSL-1.1
              pragma solidity ^0.8.0;
              import "./IOneStepProver.sol";
              library OneStepProofEntryLib {
                  uint256 internal constant MAX_STEPS = 1 << 43;
              }
              interface IOneStepProofEntry {
                  function proveOneStep(
                      ExecutionContext calldata execCtx,
                      uint256 machineStep,
                      bytes32 beforeHash,
                      bytes calldata proof
                  ) external view returns (bytes32 afterHash);
              }
              // Copyright 2021-2022, Offchain Labs, Inc.
              // For license information, see https://github.com/nitro/blob/master/LICENSE
              // SPDX-License-Identifier: BUSL-1.1
              pragma solidity ^0.8.0;
              interface IChallengeResultReceiver {
                  function completeChallenge(
                      uint256 challengeIndex,
                      address winner,
                      address loser
                  ) external;
              }
              // Copyright 2021-2022, Offchain Labs, Inc.
              // For license information, see https://github.com/nitro/blob/master/LICENSE
              // SPDX-License-Identifier: BUSL-1.1
              pragma solidity ^0.8.0;
              import "./Value.sol";
              import "./ValueArray.sol";
              struct ValueStack {
                  ValueArray proved;
                  bytes32 remainingHash;
              }
              library ValueStackLib {
                  using ValueLib for Value;
                  using ValueArrayLib for ValueArray;
                  function hash(ValueStack memory stack) internal pure returns (bytes32 h) {
                      h = stack.remainingHash;
                      uint256 len = stack.proved.length();
                      for (uint256 i = 0; i < len; i++) {
                          h = keccak256(abi.encodePacked("Value stack:", stack.proved.get(i).hash(), h));
                      }
                  }
                  function peek(ValueStack memory stack) internal pure returns (Value memory) {
                      uint256 len = stack.proved.length();
                      return stack.proved.get(len - 1);
                  }
                  function pop(ValueStack memory stack) internal pure returns (Value memory) {
                      return stack.proved.pop();
                  }
                  function push(ValueStack memory stack, Value memory val) internal pure {
                      return stack.proved.push(val);
                  }
              }
              // Copyright 2021-2022, Offchain Labs, Inc.
              // For license information, see https://github.com/nitro/blob/master/LICENSE
              // SPDX-License-Identifier: BUSL-1.1
              pragma solidity ^0.8.0;
              struct Instruction {
                  uint16 opcode;
                  uint256 argumentData;
              }
              library Instructions {
                  uint16 internal constant UNREACHABLE = 0x00;
                  uint16 internal constant NOP = 0x01;
                  uint16 internal constant RETURN = 0x0F;
                  uint16 internal constant CALL = 0x10;
                  uint16 internal constant CALL_INDIRECT = 0x11;
                  uint16 internal constant LOCAL_GET = 0x20;
                  uint16 internal constant LOCAL_SET = 0x21;
                  uint16 internal constant GLOBAL_GET = 0x23;
                  uint16 internal constant GLOBAL_SET = 0x24;
                  uint16 internal constant I32_LOAD = 0x28;
                  uint16 internal constant I64_LOAD = 0x29;
                  uint16 internal constant F32_LOAD = 0x2A;
                  uint16 internal constant F64_LOAD = 0x2B;
                  uint16 internal constant I32_LOAD8_S = 0x2C;
                  uint16 internal constant I32_LOAD8_U = 0x2D;
                  uint16 internal constant I32_LOAD16_S = 0x2E;
                  uint16 internal constant I32_LOAD16_U = 0x2F;
                  uint16 internal constant I64_LOAD8_S = 0x30;
                  uint16 internal constant I64_LOAD8_U = 0x31;
                  uint16 internal constant I64_LOAD16_S = 0x32;
                  uint16 internal constant I64_LOAD16_U = 0x33;
                  uint16 internal constant I64_LOAD32_S = 0x34;
                  uint16 internal constant I64_LOAD32_U = 0x35;
                  uint16 internal constant I32_STORE = 0x36;
                  uint16 internal constant I64_STORE = 0x37;
                  uint16 internal constant F32_STORE = 0x38;
                  uint16 internal constant F64_STORE = 0x39;
                  uint16 internal constant I32_STORE8 = 0x3A;
                  uint16 internal constant I32_STORE16 = 0x3B;
                  uint16 internal constant I64_STORE8 = 0x3C;
                  uint16 internal constant I64_STORE16 = 0x3D;
                  uint16 internal constant I64_STORE32 = 0x3E;
                  uint16 internal constant MEMORY_SIZE = 0x3F;
                  uint16 internal constant MEMORY_GROW = 0x40;
                  uint16 internal constant DROP = 0x1A;
                  uint16 internal constant SELECT = 0x1B;
                  uint16 internal constant I32_CONST = 0x41;
                  uint16 internal constant I64_CONST = 0x42;
                  uint16 internal constant F32_CONST = 0x43;
                  uint16 internal constant F64_CONST = 0x44;
                  uint16 internal constant I32_EQZ = 0x45;
                  uint16 internal constant I32_RELOP_BASE = 0x46;
                  uint16 internal constant IRELOP_EQ = 0;
                  uint16 internal constant IRELOP_NE = 1;
                  uint16 internal constant IRELOP_LT_S = 2;
                  uint16 internal constant IRELOP_LT_U = 3;
                  uint16 internal constant IRELOP_GT_S = 4;
                  uint16 internal constant IRELOP_GT_U = 5;
                  uint16 internal constant IRELOP_LE_S = 6;
                  uint16 internal constant IRELOP_LE_U = 7;
                  uint16 internal constant IRELOP_GE_S = 8;
                  uint16 internal constant IRELOP_GE_U = 9;
                  uint16 internal constant IRELOP_LAST = IRELOP_GE_U;
                  uint16 internal constant I64_EQZ = 0x50;
                  uint16 internal constant I64_RELOP_BASE = 0x51;
                  uint16 internal constant I32_UNOP_BASE = 0x67;
                  uint16 internal constant IUNOP_CLZ = 0;
                  uint16 internal constant IUNOP_CTZ = 1;
                  uint16 internal constant IUNOP_POPCNT = 2;
                  uint16 internal constant IUNOP_LAST = IUNOP_POPCNT;
                  uint16 internal constant I32_ADD = 0x6A;
                  uint16 internal constant I32_SUB = 0x6B;
                  uint16 internal constant I32_MUL = 0x6C;
                  uint16 internal constant I32_DIV_S = 0x6D;
                  uint16 internal constant I32_DIV_U = 0x6E;
                  uint16 internal constant I32_REM_S = 0x6F;
                  uint16 internal constant I32_REM_U = 0x70;
                  uint16 internal constant I32_AND = 0x71;
                  uint16 internal constant I32_OR = 0x72;
                  uint16 internal constant I32_XOR = 0x73;
                  uint16 internal constant I32_SHL = 0x74;
                  uint16 internal constant I32_SHR_S = 0x75;
                  uint16 internal constant I32_SHR_U = 0x76;
                  uint16 internal constant I32_ROTL = 0x77;
                  uint16 internal constant I32_ROTR = 0x78;
                  uint16 internal constant I64_UNOP_BASE = 0x79;
                  uint16 internal constant I64_ADD = 0x7C;
                  uint16 internal constant I64_SUB = 0x7D;
                  uint16 internal constant I64_MUL = 0x7E;
                  uint16 internal constant I64_DIV_S = 0x7F;
                  uint16 internal constant I64_DIV_U = 0x80;
                  uint16 internal constant I64_REM_S = 0x81;
                  uint16 internal constant I64_REM_U = 0x82;
                  uint16 internal constant I64_AND = 0x83;
                  uint16 internal constant I64_OR = 0x84;
                  uint16 internal constant I64_XOR = 0x85;
                  uint16 internal constant I64_SHL = 0x86;
                  uint16 internal constant I64_SHR_S = 0x87;
                  uint16 internal constant I64_SHR_U = 0x88;
                  uint16 internal constant I64_ROTL = 0x89;
                  uint16 internal constant I64_ROTR = 0x8A;
                  uint16 internal constant I32_WRAP_I64 = 0xA7;
                  uint16 internal constant I64_EXTEND_I32_S = 0xAC;
                  uint16 internal constant I64_EXTEND_I32_U = 0xAD;
                  uint16 internal constant I32_REINTERPRET_F32 = 0xBC;
                  uint16 internal constant I64_REINTERPRET_F64 = 0xBD;
                  uint16 internal constant F32_REINTERPRET_I32 = 0xBE;
                  uint16 internal constant F64_REINTERPRET_I64 = 0xBF;
                  uint16 internal constant I32_EXTEND_8S = 0xC0;
                  uint16 internal constant I32_EXTEND_16S = 0xC1;
                  uint16 internal constant I64_EXTEND_8S = 0xC2;
                  uint16 internal constant I64_EXTEND_16S = 0xC3;
                  uint16 internal constant I64_EXTEND_32S = 0xC4;
                  uint16 internal constant INIT_FRAME = 0x8002;
                  uint16 internal constant ARBITRARY_JUMP = 0x8003;
                  uint16 internal constant ARBITRARY_JUMP_IF = 0x8004;
                  uint16 internal constant MOVE_FROM_STACK_TO_INTERNAL = 0x8005;
                  uint16 internal constant MOVE_FROM_INTERNAL_TO_STACK = 0x8006;
                  uint16 internal constant DUP = 0x8008;
                  uint16 internal constant CROSS_MODULE_CALL = 0x8009;
                  uint16 internal constant CALLER_MODULE_INTERNAL_CALL = 0x800A;
                  uint16 internal constant GET_GLOBAL_STATE_BYTES32 = 0x8010;
                  uint16 internal constant SET_GLOBAL_STATE_BYTES32 = 0x8011;
                  uint16 internal constant GET_GLOBAL_STATE_U64 = 0x8012;
                  uint16 internal constant SET_GLOBAL_STATE_U64 = 0x8013;
                  uint16 internal constant READ_PRE_IMAGE = 0x8020;
                  uint16 internal constant READ_INBOX_MESSAGE = 0x8021;
                  uint16 internal constant HALT_AND_SET_FINISHED = 0x8022;
                  uint256 internal constant INBOX_INDEX_SEQUENCER = 0;
                  uint256 internal constant INBOX_INDEX_DELAYED = 1;
                  function hash(Instruction memory inst) internal pure returns (bytes32) {
                      return keccak256(abi.encodePacked("Instruction:", inst.opcode, inst.argumentData));
                  }
              }
              // Copyright 2021-2022, Offchain Labs, Inc.
              // For license information, see https://github.com/nitro/blob/master/LICENSE
              // SPDX-License-Identifier: BUSL-1.1
              pragma solidity ^0.8.0;
              import "./Value.sol";
              struct StackFrame {
                  Value returnPc;
                  bytes32 localsMerkleRoot;
                  uint32 callerModule;
                  uint32 callerModuleInternals;
              }
              struct StackFrameWindow {
                  StackFrame[] proved;
                  bytes32 remainingHash;
              }
              library StackFrameLib {
                  using ValueLib for Value;
                  function hash(StackFrame memory frame) internal pure returns (bytes32) {
                      return
                          keccak256(
                              abi.encodePacked(
                                  "Stack frame:",
                                  frame.returnPc.hash(),
                                  frame.localsMerkleRoot,
                                  frame.callerModule,
                                  frame.callerModuleInternals
                              )
                          );
                  }
                  function hash(StackFrameWindow memory window) internal pure returns (bytes32 h) {
                      h = window.remainingHash;
                      for (uint256 i = 0; i < window.proved.length; i++) {
                          h = keccak256(abi.encodePacked("Stack frame stack:", hash(window.proved[i]), h));
                      }
                  }
                  function peek(StackFrameWindow memory window) internal pure returns (StackFrame memory) {
                      require(window.proved.length == 1, "BAD_WINDOW_LENGTH");
                      return window.proved[0];
                  }
                  function pop(StackFrameWindow memory window) internal pure returns (StackFrame memory frame) {
                      require(window.proved.length == 1, "BAD_WINDOW_LENGTH");
                      frame = window.proved[0];
                      window.proved = new StackFrame[](0);
                  }
                  function push(StackFrameWindow memory window, StackFrame memory frame) internal pure {
                      StackFrame[] memory newProved = new StackFrame[](window.proved.length + 1);
                      for (uint256 i = 0; i < window.proved.length; i++) {
                          newProved[i] = window.proved[i];
                      }
                      newProved[window.proved.length] = frame;
                      window.proved = newProved;
                  }
              }
              // Copyright 2021-2022, Offchain Labs, Inc.
              // For license information, see https://github.com/nitro/blob/master/LICENSE
              // SPDX-License-Identifier: BUSL-1.1
              pragma solidity ^0.8.0;
              enum ValueType {
                  I32,
                  I64,
                  F32,
                  F64,
                  REF_NULL,
                  FUNC_REF,
                  INTERNAL_REF
              }
              struct Value {
                  ValueType valueType;
                  uint256 contents;
              }
              library ValueLib {
                  function hash(Value memory val) internal pure returns (bytes32) {
                      return keccak256(abi.encodePacked("Value:", val.valueType, val.contents));
                  }
                  function maxValueType() internal pure returns (ValueType) {
                      return ValueType.INTERNAL_REF;
                  }
                  function assumeI32(Value memory val) internal pure returns (uint32) {
                      uint256 uintval = uint256(val.contents);
                      require(val.valueType == ValueType.I32, "NOT_I32");
                      require(uintval < (1 << 32), "BAD_I32");
                      return uint32(uintval);
                  }
                  function assumeI64(Value memory val) internal pure returns (uint64) {
                      uint256 uintval = uint256(val.contents);
                      require(val.valueType == ValueType.I64, "NOT_I64");
                      require(uintval < (1 << 64), "BAD_I64");
                      return uint64(uintval);
                  }
                  function newRefNull() internal pure returns (Value memory) {
                      return Value({valueType: ValueType.REF_NULL, contents: 0});
                  }
                  function newI32(uint32 x) internal pure returns (Value memory) {
                      return Value({valueType: ValueType.I32, contents: uint256(x)});
                  }
                  function newI64(uint64 x) internal pure returns (Value memory) {
                      return Value({valueType: ValueType.I64, contents: uint256(x)});
                  }
                  function newBoolean(bool x) internal pure returns (Value memory) {
                      if (x) {
                          return newI32(uint32(1));
                      } else {
                          return newI32(uint32(0));
                      }
                  }
              }
              // Copyright 2021-2022, Offchain Labs, Inc.
              // For license information, see https://github.com/nitro/blob/master/LICENSE
              // SPDX-License-Identifier: BUSL-1.1
              pragma solidity ^0.8.0;
              import "./Value.sol";
              struct ValueArray {
                  Value[] inner;
              }
              library ValueArrayLib {
                  function get(ValueArray memory arr, uint256 index) internal pure returns (Value memory) {
                      return arr.inner[index];
                  }
                  function set(
                      ValueArray memory arr,
                      uint256 index,
                      Value memory val
                  ) internal pure {
                      arr.inner[index] = val;
                  }
                  function length(ValueArray memory arr) internal pure returns (uint256) {
                      return arr.inner.length;
                  }
                  function push(ValueArray memory arr, Value memory val) internal pure {
                      Value[] memory newInner = new Value[](arr.inner.length + 1);
                      for (uint256 i = 0; i < arr.inner.length; i++) {
                          newInner[i] = arr.inner[i];
                      }
                      newInner[arr.inner.length] = val;
                      arr.inner = newInner;
                  }
                  function pop(ValueArray memory arr) internal pure returns (Value memory popped) {
                      popped = arr.inner[arr.inner.length - 1];
                      Value[] memory newInner = new Value[](arr.inner.length - 1);
                      for (uint256 i = 0; i < newInner.length; i++) {
                          newInner[i] = arr.inner[i];
                      }
                      arr.inner = newInner;
                  }
              }
              // Copyright 2021-2022, Offchain Labs, Inc.
              // For license information, see https://github.com/nitro/blob/master/LICENSE
              // SPDX-License-Identifier: BUSL-1.1
              pragma solidity ^0.8.0;
              import "../state/Machine.sol";
              import "../state/Module.sol";
              import "../state/Instructions.sol";
              import "../bridge/ISequencerInbox.sol";
              import "../bridge/IBridge.sol";
              struct ExecutionContext {
                  uint256 maxInboxMessagesRead;
                  IBridge bridge;
              }
              abstract contract IOneStepProver {
                  function executeOneStep(
                      ExecutionContext memory execCtx,
                      Machine calldata mach,
                      Module calldata mod,
                      Instruction calldata instruction,
                      bytes calldata proof
                  ) external view virtual returns (Machine memory result, Module memory resultMod);
              }
              // Copyright 2021-2022, Offchain Labs, Inc.
              // For license information, see https://github.com/nitro/blob/master/LICENSE
              // SPDX-License-Identifier: BUSL-1.1
              pragma solidity ^0.8.0;
              import "./ModuleMemory.sol";
              struct Module {
                  bytes32 globalsMerkleRoot;
                  ModuleMemory moduleMemory;
                  bytes32 tablesMerkleRoot;
                  bytes32 functionsMerkleRoot;
                  uint32 internalsOffset;
              }
              library ModuleLib {
                  using ModuleMemoryLib for ModuleMemory;
                  function hash(Module memory mod) internal pure returns (bytes32) {
                      return
                          keccak256(
                              abi.encodePacked(
                                  "Module:",
                                  mod.globalsMerkleRoot,
                                  mod.moduleMemory.hash(),
                                  mod.tablesMerkleRoot,
                                  mod.functionsMerkleRoot,
                                  mod.internalsOffset
                              )
                          );
                  }
              }
              // Copyright 2021-2022, Offchain Labs, Inc.
              // For license information, see https://github.com/nitro/blob/master/LICENSE
              // SPDX-License-Identifier: BUSL-1.1
              pragma solidity ^0.8.0;
              import "./MerkleProof.sol";
              import "./Deserialize.sol";
              struct ModuleMemory {
                  uint64 size;
                  uint64 maxSize;
                  bytes32 merkleRoot;
              }
              library ModuleMemoryLib {
                  using MerkleProofLib for MerkleProof;
                  function hash(ModuleMemory memory mem) internal pure returns (bytes32) {
                      return keccak256(abi.encodePacked("Memory:", mem.size, mem.maxSize, mem.merkleRoot));
                  }
                  function proveLeaf(
                      ModuleMemory memory mem,
                      uint256 leafIdx,
                      bytes calldata proof,
                      uint256 startOffset
                  )
                      internal
                      pure
                      returns (
                          bytes32 contents,
                          uint256 offset,
                          MerkleProof memory merkle
                      )
                  {
                      offset = startOffset;
                      (contents, offset) = Deserialize.b32(proof, offset);
                      (merkle, offset) = Deserialize.merkleProof(proof, offset);
                      bytes32 recomputedRoot = merkle.computeRootFromMemory(leafIdx, contents);
                      require(recomputedRoot == mem.merkleRoot, "WRONG_MEM_ROOT");
                  }
              }
              // Copyright 2021-2022, Offchain Labs, Inc.
              // For license information, see https://github.com/nitro/blob/master/LICENSE
              // SPDX-License-Identifier: BUSL-1.1
              pragma solidity ^0.8.0;
              import "./Value.sol";
              import "./Instructions.sol";
              import "./Module.sol";
              struct MerkleProof {
                  bytes32[] counterparts;
              }
              library MerkleProofLib {
                  using ModuleLib for Module;
                  using ValueLib for Value;
                  function computeRootFromValue(
                      MerkleProof memory proof,
                      uint256 index,
                      Value memory leaf
                  ) internal pure returns (bytes32) {
                      return computeRootUnsafe(proof, index, leaf.hash(), "Value merkle tree:");
                  }
                  function computeRootFromInstruction(
                      MerkleProof memory proof,
                      uint256 index,
                      Instruction memory inst
                  ) internal pure returns (bytes32) {
                      return computeRootUnsafe(proof, index, Instructions.hash(inst), "Instruction merkle tree:");
                  }
                  function computeRootFromFunction(
                      MerkleProof memory proof,
                      uint256 index,
                      bytes32 codeRoot
                  ) internal pure returns (bytes32) {
                      bytes32 h = keccak256(abi.encodePacked("Function:", codeRoot));
                      return computeRootUnsafe(proof, index, h, "Function merkle tree:");
                  }
                  function computeRootFromMemory(
                      MerkleProof memory proof,
                      uint256 index,
                      bytes32 contents
                  ) internal pure returns (bytes32) {
                      bytes32 h = keccak256(abi.encodePacked("Memory leaf:", contents));
                      return computeRootUnsafe(proof, index, h, "Memory merkle tree:");
                  }
                  function computeRootFromElement(
                      MerkleProof memory proof,
                      uint256 index,
                      bytes32 funcTypeHash,
                      Value memory val
                  ) internal pure returns (bytes32) {
                      bytes32 h = keccak256(abi.encodePacked("Table element:", funcTypeHash, val.hash()));
                      return computeRootUnsafe(proof, index, h, "Table element merkle tree:");
                  }
                  function computeRootFromTable(
                      MerkleProof memory proof,
                      uint256 index,
                      uint8 tableType,
                      uint64 tableSize,
                      bytes32 elementsRoot
                  ) internal pure returns (bytes32) {
                      bytes32 h = keccak256(abi.encodePacked("Table:", tableType, tableSize, elementsRoot));
                      return computeRootUnsafe(proof, index, h, "Table merkle tree:");
                  }
                  function computeRootFromModule(
                      MerkleProof memory proof,
                      uint256 index,
                      Module memory mod
                  ) internal pure returns (bytes32) {
                      return computeRootUnsafe(proof, index, mod.hash(), "Module merkle tree:");
                  }
                  // WARNING: leafHash must be computed in such a way that it cannot be a non-leaf hash.
                  function computeRootUnsafe(
                      MerkleProof memory proof,
                      uint256 index,
                      bytes32 leafHash,
                      string memory prefix
                  ) internal pure returns (bytes32 h) {
                      h = leafHash;
                      for (uint256 layer = 0; layer < proof.counterparts.length; layer++) {
                          if (index & 1 == 0) {
                              h = keccak256(abi.encodePacked(prefix, h, proof.counterparts[layer]));
                          } else {
                              h = keccak256(abi.encodePacked(prefix, proof.counterparts[layer], h));
                          }
                          index >>= 1;
                      }
                  }
              }
              // Copyright 2021-2022, Offchain Labs, Inc.
              // For license information, see https://github.com/nitro/blob/master/LICENSE
              // SPDX-License-Identifier: BUSL-1.1
              pragma solidity ^0.8.0;
              import "./Value.sol";
              import "./ValueStack.sol";
              import "./Machine.sol";
              import "./Instructions.sol";
              import "./StackFrame.sol";
              import "./MerkleProof.sol";
              import "./ModuleMemory.sol";
              import "./Module.sol";
              import "./GlobalState.sol";
              library Deserialize {
                  function u8(bytes calldata proof, uint256 startOffset)
                      internal
                      pure
                      returns (uint8 ret, uint256 offset)
                  {
                      offset = startOffset;
                      ret = uint8(proof[offset]);
                      offset++;
                  }
                  function u16(bytes calldata proof, uint256 startOffset)
                      internal
                      pure
                      returns (uint16 ret, uint256 offset)
                  {
                      offset = startOffset;
                      for (uint256 i = 0; i < 16 / 8; i++) {
                          ret <<= 8;
                          ret |= uint8(proof[offset]);
                          offset++;
                      }
                  }
                  function u32(bytes calldata proof, uint256 startOffset)
                      internal
                      pure
                      returns (uint32 ret, uint256 offset)
                  {
                      offset = startOffset;
                      for (uint256 i = 0; i < 32 / 8; i++) {
                          ret <<= 8;
                          ret |= uint8(proof[offset]);
                          offset++;
                      }
                  }
                  function u64(bytes calldata proof, uint256 startOffset)
                      internal
                      pure
                      returns (uint64 ret, uint256 offset)
                  {
                      offset = startOffset;
                      for (uint256 i = 0; i < 64 / 8; i++) {
                          ret <<= 8;
                          ret |= uint8(proof[offset]);
                          offset++;
                      }
                  }
                  function u256(bytes calldata proof, uint256 startOffset)
                      internal
                      pure
                      returns (uint256 ret, uint256 offset)
                  {
                      offset = startOffset;
                      for (uint256 i = 0; i < 256 / 8; i++) {
                          ret <<= 8;
                          ret |= uint8(proof[offset]);
                          offset++;
                      }
                  }
                  function b32(bytes calldata proof, uint256 startOffset)
                      internal
                      pure
                      returns (bytes32 ret, uint256 offset)
                  {
                      offset = startOffset;
                      uint256 retInt;
                      (retInt, offset) = u256(proof, offset);
                      ret = bytes32(retInt);
                  }
                  function value(bytes calldata proof, uint256 startOffset)
                      internal
                      pure
                      returns (Value memory val, uint256 offset)
                  {
                      offset = startOffset;
                      uint8 typeInt = uint8(proof[offset]);
                      offset++;
                      require(typeInt <= uint8(ValueLib.maxValueType()), "BAD_VALUE_TYPE");
                      uint256 contents;
                      (contents, offset) = u256(proof, offset);
                      val = Value({valueType: ValueType(typeInt), contents: contents});
                  }
                  function valueStack(bytes calldata proof, uint256 startOffset)
                      internal
                      pure
                      returns (ValueStack memory stack, uint256 offset)
                  {
                      offset = startOffset;
                      bytes32 remainingHash;
                      (remainingHash, offset) = b32(proof, offset);
                      uint256 provedLength;
                      (provedLength, offset) = u256(proof, offset);
                      Value[] memory proved = new Value[](provedLength);
                      for (uint256 i = 0; i < proved.length; i++) {
                          (proved[i], offset) = value(proof, offset);
                      }
                      stack = ValueStack({proved: ValueArray(proved), remainingHash: remainingHash});
                  }
                  function instruction(bytes calldata proof, uint256 startOffset)
                      internal
                      pure
                      returns (Instruction memory inst, uint256 offset)
                  {
                      offset = startOffset;
                      uint16 opcode;
                      uint256 data;
                      (opcode, offset) = u16(proof, offset);
                      (data, offset) = u256(proof, offset);
                      inst = Instruction({opcode: opcode, argumentData: data});
                  }
                  function stackFrame(bytes calldata proof, uint256 startOffset)
                      internal
                      pure
                      returns (StackFrame memory window, uint256 offset)
                  {
                      offset = startOffset;
                      Value memory returnPc;
                      bytes32 localsMerkleRoot;
                      uint32 callerModule;
                      uint32 callerModuleInternals;
                      (returnPc, offset) = value(proof, offset);
                      (localsMerkleRoot, offset) = b32(proof, offset);
                      (callerModule, offset) = u32(proof, offset);
                      (callerModuleInternals, offset) = u32(proof, offset);
                      window = StackFrame({
                          returnPc: returnPc,
                          localsMerkleRoot: localsMerkleRoot,
                          callerModule: callerModule,
                          callerModuleInternals: callerModuleInternals
                      });
                  }
                  function stackFrameWindow(bytes calldata proof, uint256 startOffset)
                      internal
                      pure
                      returns (StackFrameWindow memory window, uint256 offset)
                  {
                      offset = startOffset;
                      bytes32 remainingHash;
                      (remainingHash, offset) = b32(proof, offset);
                      StackFrame[] memory proved;
                      if (proof[offset] != 0) {
                          offset++;
                          proved = new StackFrame[](1);
                          (proved[0], offset) = stackFrame(proof, offset);
                      } else {
                          offset++;
                          proved = new StackFrame[](0);
                      }
                      window = StackFrameWindow({proved: proved, remainingHash: remainingHash});
                  }
                  function moduleMemory(bytes calldata proof, uint256 startOffset)
                      internal
                      pure
                      returns (ModuleMemory memory mem, uint256 offset)
                  {
                      offset = startOffset;
                      uint64 size;
                      uint64 maxSize;
                      bytes32 root;
                      (size, offset) = u64(proof, offset);
                      (maxSize, offset) = u64(proof, offset);
                      (root, offset) = b32(proof, offset);
                      mem = ModuleMemory({size: size, maxSize: maxSize, merkleRoot: root});
                  }
                  function module(bytes calldata proof, uint256 startOffset)
                      internal
                      pure
                      returns (Module memory mod, uint256 offset)
                  {
                      offset = startOffset;
                      bytes32 globalsMerkleRoot;
                      ModuleMemory memory mem;
                      bytes32 tablesMerkleRoot;
                      bytes32 functionsMerkleRoot;
                      uint32 internalsOffset;
                      (globalsMerkleRoot, offset) = b32(proof, offset);
                      (mem, offset) = moduleMemory(proof, offset);
                      (tablesMerkleRoot, offset) = b32(proof, offset);
                      (functionsMerkleRoot, offset) = b32(proof, offset);
                      (internalsOffset, offset) = u32(proof, offset);
                      mod = Module({
                          globalsMerkleRoot: globalsMerkleRoot,
                          moduleMemory: mem,
                          tablesMerkleRoot: tablesMerkleRoot,
                          functionsMerkleRoot: functionsMerkleRoot,
                          internalsOffset: internalsOffset
                      });
                  }
                  function globalState(bytes calldata proof, uint256 startOffset)
                      internal
                      pure
                      returns (GlobalState memory state, uint256 offset)
                  {
                      offset = startOffset;
                      // using constant ints for array size requires newer solidity
                      bytes32[2] memory bytes32Vals;
                      uint64[2] memory u64Vals;
                      for (uint8 i = 0; i < GlobalStateLib.BYTES32_VALS_NUM; i++) {
                          (bytes32Vals[i], offset) = b32(proof, offset);
                      }
                      for (uint8 i = 0; i < GlobalStateLib.U64_VALS_NUM; i++) {
                          (u64Vals[i], offset) = u64(proof, offset);
                      }
                      state = GlobalState({bytes32Vals: bytes32Vals, u64Vals: u64Vals});
                  }
                  function machine(bytes calldata proof, uint256 startOffset)
                      internal
                      pure
                      returns (Machine memory mach, uint256 offset)
                  {
                      offset = startOffset;
                      MachineStatus status;
                      {
                          uint8 statusU8;
                          (statusU8, offset) = u8(proof, offset);
                          if (statusU8 == 0) {
                              status = MachineStatus.RUNNING;
                          } else if (statusU8 == 1) {
                              status = MachineStatus.FINISHED;
                          } else if (statusU8 == 2) {
                              status = MachineStatus.ERRORED;
                          } else if (statusU8 == 3) {
                              status = MachineStatus.TOO_FAR;
                          } else {
                              revert("UNKNOWN_MACH_STATUS");
                          }
                      }
                      ValueStack memory values;
                      ValueStack memory internalStack;
                      bytes32 globalStateHash;
                      uint32 moduleIdx;
                      uint32 functionIdx;
                      uint32 functionPc;
                      StackFrameWindow memory frameStack;
                      bytes32 modulesRoot;
                      (values, offset) = valueStack(proof, offset);
                      (internalStack, offset) = valueStack(proof, offset);
                      (frameStack, offset) = stackFrameWindow(proof, offset);
                      (globalStateHash, offset) = b32(proof, offset);
                      (moduleIdx, offset) = u32(proof, offset);
                      (functionIdx, offset) = u32(proof, offset);
                      (functionPc, offset) = u32(proof, offset);
                      (modulesRoot, offset) = b32(proof, offset);
                      mach = Machine({
                          status: status,
                          valueStack: values,
                          internalStack: internalStack,
                          frameStack: frameStack,
                          globalStateHash: globalStateHash,
                          moduleIdx: moduleIdx,
                          functionIdx: functionIdx,
                          functionPc: functionPc,
                          modulesRoot: modulesRoot
                      });
                  }
                  function merkleProof(bytes calldata proof, uint256 startOffset)
                      internal
                      pure
                      returns (MerkleProof memory merkle, uint256 offset)
                  {
                      offset = startOffset;
                      uint8 length;
                      (length, offset) = u8(proof, offset);
                      bytes32[] memory counterparts = new bytes32[](length);
                      for (uint8 i = 0; i < length; i++) {
                          (counterparts[i], offset) = b32(proof, offset);
                      }
                      merkle = MerkleProof(counterparts);
                  }
              }
              // Copyright 2021-2022, Offchain Labs, Inc.
              // For license information, see https://github.com/nitro/blob/master/LICENSE
              // SPDX-License-Identifier: BUSL-1.1
              pragma solidity ^0.8.0;
              struct Node {
                  // Hash of the state of the chain as of this node
                  bytes32 stateHash;
                  // Hash of the data that can be challenged
                  bytes32 challengeHash;
                  // Hash of the data that will be committed if this node is confirmed
                  bytes32 confirmData;
                  // Index of the node previous to this one
                  uint64 prevNum;
                  // Deadline at which this node can be confirmed
                  uint64 deadlineBlock;
                  // Deadline at which a child of this node can be confirmed
                  uint64 noChildConfirmedBeforeBlock;
                  // Number of stakers staked on this node. This includes real stakers and zombies
                  uint64 stakerCount;
                  // Number of stakers staked on a child node. This includes real stakers and zombies
                  uint64 childStakerCount;
                  // This value starts at zero and is set to a value when the first child is created. After that it is constant until the node is destroyed or the owner destroys pending nodes
                  uint64 firstChildBlock;
                  // The number of the latest child of this node to be created
                  uint64 latestChildNumber;
                  // The block number when this node was created
                  uint64 createdAtBlock;
                  // A hash of all the data needed to determine this node's validity, to protect against reorgs
                  bytes32 nodeHash;
              }
              /**
               * @notice Utility functions for Node
               */
              library NodeLib {
                  /**
                   * @notice Initialize a Node
                   * @param _stateHash Initial value of stateHash
                   * @param _challengeHash Initial value of challengeHash
                   * @param _confirmData Initial value of confirmData
                   * @param _prevNum Initial value of prevNum
                   * @param _deadlineBlock Initial value of deadlineBlock
                   * @param _nodeHash Initial value of nodeHash
                   */
                  function createNode(
                      bytes32 _stateHash,
                      bytes32 _challengeHash,
                      bytes32 _confirmData,
                      uint64 _prevNum,
                      uint64 _deadlineBlock,
                      bytes32 _nodeHash
                  ) internal view returns (Node memory) {
                      Node memory node;
                      node.stateHash = _stateHash;
                      node.challengeHash = _challengeHash;
                      node.confirmData = _confirmData;
                      node.prevNum = _prevNum;
                      node.deadlineBlock = _deadlineBlock;
                      node.noChildConfirmedBeforeBlock = _deadlineBlock;
                      node.createdAtBlock = uint64(block.number);
                      node.nodeHash = _nodeHash;
                      return node;
                  }
                  /**
                   * @notice Update child properties
                   * @param number The child number to set
                   */
                  function childCreated(Node storage self, uint64 number) internal {
                      if (self.firstChildBlock == 0) {
                          self.firstChildBlock = uint64(block.number);
                      }
                      self.latestChildNumber = number;
                  }
                  /**
                   * @notice Update the child confirmed deadline
                   * @param deadline The new deadline to set
                   */
                  function newChildConfirmDeadline(Node storage self, uint64 deadline) internal {
                      self.noChildConfirmedBeforeBlock = deadline;
                  }
                  /**
                   * @notice Check whether the current block number has met or passed the node's deadline
                   */
                  function requirePastDeadline(Node memory self) internal view {
                      require(block.number >= self.deadlineBlock, "BEFORE_DEADLINE");
                  }
                  /**
                   * @notice Check whether the current block number has met or passed deadline for children of this node to be confirmed
                   */
                  function requirePastChildConfirmDeadline(Node memory self) internal view {
                      require(block.number >= self.noChildConfirmedBeforeBlock, "CHILD_TOO_RECENT");
                  }
              }
              

              File 5 of 5: Bridge
              // Copyright 2021-2022, Offchain Labs, Inc.
              // For license information, see https://github.com/nitro/blob/master/LICENSE
              // SPDX-License-Identifier: BUSL-1.1
              pragma solidity ^0.8.4;
              import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol";
              import "@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol";
              import {
                  NotContract,
                  NotRollupOrOwner,
                  NotDelayedInbox,
                  NotSequencerInbox,
                  NotOutbox,
                  InvalidOutboxSet,
                  BadSequencerMessageNumber
              } from "../libraries/Error.sol";
              import "./IBridge.sol";
              import "./Messages.sol";
              import "../libraries/DelegateCallAware.sol";
              import {L1MessageType_batchPostingReport} from "../libraries/MessageTypes.sol";
              /**
               * @title Staging ground for incoming and outgoing messages
               * @notice Holds the inbox accumulator for sequenced and delayed messages.
               * It is also the ETH escrow for value sent with these messages.
               * Since the escrow is held here, this contract also contains a list of allowed
               * outboxes that can make calls from here and withdraw this escrow.
               */
              contract Bridge is Initializable, DelegateCallAware, IBridge {
                  using AddressUpgradeable for address;
                  struct InOutInfo {
                      uint256 index;
                      bool allowed;
                  }
                  mapping(address => InOutInfo) private allowedDelayedInboxesMap;
                  mapping(address => InOutInfo) private allowedOutboxesMap;
                  address[] public allowedDelayedInboxList;
                  address[] public allowedOutboxList;
                  address private _activeOutbox;
                  /// @inheritdoc IBridge
                  bytes32[] public delayedInboxAccs;
                  /// @inheritdoc IBridge
                  bytes32[] public sequencerInboxAccs;
                  IOwnable public rollup;
                  address public sequencerInbox;
                  uint256 public override sequencerReportedSubMessageCount;
                  address private constant EMPTY_ACTIVEOUTBOX = address(type(uint160).max);
                  function initialize(IOwnable rollup_) external initializer onlyDelegated {
                      _activeOutbox = EMPTY_ACTIVEOUTBOX;
                      rollup = rollup_;
                  }
                  modifier onlyRollupOrOwner() {
                      if (msg.sender != address(rollup)) {
                          address rollupOwner = rollup.owner();
                          if (msg.sender != rollupOwner) {
                              revert NotRollupOrOwner(msg.sender, address(rollup), rollupOwner);
                          }
                      }
                      _;
                  }
                  /// @dev returns the address of current active Outbox, or zero if no outbox is active
                  function activeOutbox() public view returns (address) {
                      address outbox = _activeOutbox;
                      // address zero is returned if no outbox is set, but the value used in storage
                      // is non-zero to save users some gas (as storage refunds are usually maxed out)
                      // EIP-1153 would help here.
                      // we don't return `EMPTY_ACTIVEOUTBOX` to avoid a breaking change on the current api
                      if (outbox == EMPTY_ACTIVEOUTBOX) return address(0);
                      return outbox;
                  }
                  function allowedDelayedInboxes(address inbox) external view returns (bool) {
                      return allowedDelayedInboxesMap[inbox].allowed;
                  }
                  function allowedOutboxes(address outbox) external view returns (bool) {
                      return allowedOutboxesMap[outbox].allowed;
                  }
                  modifier onlySequencerInbox() {
                      if (msg.sender != sequencerInbox) revert NotSequencerInbox(msg.sender);
                      _;
                  }
                  function enqueueSequencerMessage(
                      bytes32 dataHash,
                      uint256 afterDelayedMessagesRead,
                      uint256 prevMessageCount,
                      uint256 newMessageCount
                  )
                      external
                      onlySequencerInbox
                      returns (
                          uint256 seqMessageIndex,
                          bytes32 beforeAcc,
                          bytes32 delayedAcc,
                          bytes32 acc
                      )
                  {
                      if (
                          sequencerReportedSubMessageCount != prevMessageCount &&
                          prevMessageCount != 0 &&
                          sequencerReportedSubMessageCount != 0
                      ) {
                          revert BadSequencerMessageNumber(sequencerReportedSubMessageCount, prevMessageCount);
                      }
                      sequencerReportedSubMessageCount = newMessageCount;
                      seqMessageIndex = sequencerInboxAccs.length;
                      if (sequencerInboxAccs.length > 0) {
                          beforeAcc = sequencerInboxAccs[sequencerInboxAccs.length - 1];
                      }
                      if (afterDelayedMessagesRead > 0) {
                          delayedAcc = delayedInboxAccs[afterDelayedMessagesRead - 1];
                      }
                      acc = keccak256(abi.encodePacked(beforeAcc, dataHash, delayedAcc));
                      sequencerInboxAccs.push(acc);
                  }
                  /// @inheritdoc IBridge
                  function submitBatchSpendingReport(address sender, bytes32 messageDataHash)
                      external
                      onlySequencerInbox
                      returns (uint256)
                  {
                      return
                          addMessageToDelayedAccumulator(
                              L1MessageType_batchPostingReport,
                              sender,
                              uint64(block.number),
                              uint64(block.timestamp), // solhint-disable-line not-rely-on-time,
                              block.basefee,
                              messageDataHash
                          );
                  }
                  /// @inheritdoc IBridge
                  function enqueueDelayedMessage(
                      uint8 kind,
                      address sender,
                      bytes32 messageDataHash
                  ) external payable returns (uint256) {
                      if (!allowedDelayedInboxesMap[msg.sender].allowed) revert NotDelayedInbox(msg.sender);
                      return
                          addMessageToDelayedAccumulator(
                              kind,
                              sender,
                              uint64(block.number),
                              uint64(block.timestamp), // solhint-disable-line not-rely-on-time
                              block.basefee,
                              messageDataHash
                          );
                  }
                  function addMessageToDelayedAccumulator(
                      uint8 kind,
                      address sender,
                      uint64 blockNumber,
                      uint64 blockTimestamp,
                      uint256 baseFeeL1,
                      bytes32 messageDataHash
                  ) internal returns (uint256) {
                      uint256 count = delayedInboxAccs.length;
                      bytes32 messageHash = Messages.messageHash(
                          kind,
                          sender,
                          blockNumber,
                          blockTimestamp,
                          count,
                          baseFeeL1,
                          messageDataHash
                      );
                      bytes32 prevAcc = 0;
                      if (count > 0) {
                          prevAcc = delayedInboxAccs[count - 1];
                      }
                      delayedInboxAccs.push(Messages.accumulateInboxMessage(prevAcc, messageHash));
                      emit MessageDelivered(
                          count,
                          prevAcc,
                          msg.sender,
                          kind,
                          sender,
                          messageDataHash,
                          baseFeeL1,
                          blockTimestamp
                      );
                      return count;
                  }
                  function executeCall(
                      address to,
                      uint256 value,
                      bytes calldata data
                  ) external returns (bool success, bytes memory returnData) {
                      if (!allowedOutboxesMap[msg.sender].allowed) revert NotOutbox(msg.sender);
                      if (data.length > 0 && !to.isContract()) revert NotContract(to);
                      address prevOutbox = _activeOutbox;
                      _activeOutbox = msg.sender;
                      // We set and reset active outbox around external call so activeOutbox remains valid during call
                      // We use a low level call here since we want to bubble up whether it succeeded or failed to the caller
                      // rather than reverting on failure as well as allow contract and non-contract calls
                      // solhint-disable-next-line avoid-low-level-calls
                      (success, returnData) = to.call{value: value}(data);
                      _activeOutbox = prevOutbox;
                      emit BridgeCallTriggered(msg.sender, to, value, data);
                  }
                  function setSequencerInbox(address _sequencerInbox) external onlyRollupOrOwner {
                      sequencerInbox = _sequencerInbox;
                      emit SequencerInboxUpdated(_sequencerInbox);
                  }
                  function setDelayedInbox(address inbox, bool enabled) external onlyRollupOrOwner {
                      InOutInfo storage info = allowedDelayedInboxesMap[inbox];
                      bool alreadyEnabled = info.allowed;
                      emit InboxToggle(inbox, enabled);
                      if ((alreadyEnabled && enabled) || (!alreadyEnabled && !enabled)) {
                          return;
                      }
                      if (enabled) {
                          allowedDelayedInboxesMap[inbox] = InOutInfo(allowedDelayedInboxList.length, true);
                          allowedDelayedInboxList.push(inbox);
                      } else {
                          allowedDelayedInboxList[info.index] = allowedDelayedInboxList[
                              allowedDelayedInboxList.length - 1
                          ];
                          allowedDelayedInboxesMap[allowedDelayedInboxList[info.index]].index = info.index;
                          allowedDelayedInboxList.pop();
                          delete allowedDelayedInboxesMap[inbox];
                      }
                  }
                  function setOutbox(address outbox, bool enabled) external onlyRollupOrOwner {
                      if (outbox == EMPTY_ACTIVEOUTBOX) revert InvalidOutboxSet(outbox);
                      InOutInfo storage info = allowedOutboxesMap[outbox];
                      bool alreadyEnabled = info.allowed;
                      emit OutboxToggle(outbox, enabled);
                      if ((alreadyEnabled && enabled) || (!alreadyEnabled && !enabled)) {
                          return;
                      }
                      if (enabled) {
                          allowedOutboxesMap[outbox] = InOutInfo(allowedOutboxList.length, true);
                          allowedOutboxList.push(outbox);
                      } else {
                          allowedOutboxList[info.index] = allowedOutboxList[allowedOutboxList.length - 1];
                          allowedOutboxesMap[allowedOutboxList[info.index]].index = info.index;
                          allowedOutboxList.pop();
                          delete allowedOutboxesMap[outbox];
                      }
                  }
                  function setSequencerReportedSubMessageCount(uint256 newMsgCount) external onlyRollupOrOwner {
                      sequencerReportedSubMessageCount = newMsgCount;
                  }
                  function delayedMessageCount() external view override returns (uint256) {
                      return delayedInboxAccs.length;
                  }
                  function sequencerMessageCount() external view returns (uint256) {
                      return sequencerInboxAccs.length;
                  }
                  /// @dev For the classic -> nitro migration. TODO: remove post-migration.
                  function acceptFundsFromOldBridge() external payable {}
              }
              // SPDX-License-Identifier: MIT
              // OpenZeppelin Contracts (last updated v4.5.0) (proxy/utils/Initializable.sol)
              pragma solidity ^0.8.0;
              import "../../utils/AddressUpgradeable.sol";
              /**
               * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed
               * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an
               * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer
               * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.
               *
               * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as
               * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.
               *
               * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure
               * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.
               *
               * [CAUTION]
               * ====
               * Avoid leaving a contract uninitialized.
               *
               * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation
               * contract, which may impact the proxy. To initialize the implementation contract, you can either invoke the
               * initializer manually, or you can include a constructor to automatically mark it as initialized when it is deployed:
               *
               * [.hljs-theme-light.nopadding]
               * ```
               * /// @custom:oz-upgrades-unsafe-allow constructor
               * constructor() initializer {}
               * ```
               * ====
               */
              abstract contract Initializable {
                  /**
                   * @dev Indicates that the contract has been initialized.
                   */
                  bool private _initialized;
                  /**
                   * @dev Indicates that the contract is in the process of being initialized.
                   */
                  bool private _initializing;
                  /**
                   * @dev Modifier to protect an initializer function from being invoked twice.
                   */
                  modifier initializer() {
                      // If the contract is initializing we ignore whether _initialized is set in order to support multiple
                      // inheritance patterns, but we only do this in the context of a constructor, because in other contexts the
                      // contract may have been reentered.
                      require(_initializing ? _isConstructor() : !_initialized, "Initializable: contract is already initialized");
                      bool isTopLevelCall = !_initializing;
                      if (isTopLevelCall) {
                          _initializing = true;
                          _initialized = true;
                      }
                      _;
                      if (isTopLevelCall) {
                          _initializing = false;
                      }
                  }
                  /**
                   * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the
                   * {initializer} modifier, directly or indirectly.
                   */
                  modifier onlyInitializing() {
                      require(_initializing, "Initializable: contract is not initializing");
                      _;
                  }
                  function _isConstructor() private view returns (bool) {
                      return !AddressUpgradeable.isContract(address(this));
                  }
              }
              // SPDX-License-Identifier: MIT
              // OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol)
              pragma solidity ^0.8.1;
              /**
               * @dev Collection of functions related to the address type
               */
              library AddressUpgradeable {
                  /**
                   * @dev Returns true if `account` is a contract.
                   *
                   * [IMPORTANT]
                   * ====
                   * It is unsafe to assume that an address for which this function returns
                   * false is an externally-owned account (EOA) and not a contract.
                   *
                   * Among others, `isContract` will return false for the following
                   * types of addresses:
                   *
                   *  - an externally-owned account
                   *  - a contract in construction
                   *  - an address where a contract will be created
                   *  - an address where a contract lived, but was destroyed
                   * ====
                   *
                   * [IMPORTANT]
                   * ====
                   * You shouldn't rely on `isContract` to protect against flash loan attacks!
                   *
                   * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
                   * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
                   * constructor.
                   * ====
                   */
                  function isContract(address account) internal view returns (bool) {
                      // This method relies on extcodesize/address.code.length, which returns 0
                      // for contracts in construction, since the code is only stored at the end
                      // of the constructor execution.
                      return account.code.length > 0;
                  }
                  /**
                   * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
                   * `recipient`, forwarding all available gas and reverting on errors.
                   *
                   * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
                   * of certain opcodes, possibly making contracts go over the 2300 gas limit
                   * imposed by `transfer`, making them unable to receive funds via
                   * `transfer`. {sendValue} removes this limitation.
                   *
                   * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
                   *
                   * IMPORTANT: because control is transferred to `recipient`, care must be
                   * taken to not create reentrancy vulnerabilities. Consider using
                   * {ReentrancyGuard} or the
                   * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
                   */
                  function sendValue(address payable recipient, uint256 amount) internal {
                      require(address(this).balance >= amount, "Address: insufficient balance");
                      (bool success, ) = recipient.call{value: amount}("");
                      require(success, "Address: unable to send value, recipient may have reverted");
                  }
                  /**
                   * @dev Performs a Solidity function call using a low level `call`. A
                   * plain `call` is an unsafe replacement for a function call: use this
                   * function instead.
                   *
                   * If `target` reverts with a revert reason, it is bubbled up by this
                   * function (like regular Solidity function calls).
                   *
                   * Returns the raw returned data. To convert to the expected return value,
                   * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
                   *
                   * Requirements:
                   *
                   * - `target` must be a contract.
                   * - calling `target` with `data` must not revert.
                   *
                   * _Available since v3.1._
                   */
                  function functionCall(address target, bytes memory data) internal returns (bytes memory) {
                      return functionCall(target, data, "Address: low-level call failed");
                  }
                  /**
                   * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
                   * `errorMessage` as a fallback revert reason when `target` reverts.
                   *
                   * _Available since v3.1._
                   */
                  function functionCall(
                      address target,
                      bytes memory data,
                      string memory errorMessage
                  ) internal returns (bytes memory) {
                      return functionCallWithValue(target, data, 0, errorMessage);
                  }
                  /**
                   * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
                   * but also transferring `value` wei to `target`.
                   *
                   * Requirements:
                   *
                   * - the calling contract must have an ETH balance of at least `value`.
                   * - the called Solidity function must be `payable`.
                   *
                   * _Available since v3.1._
                   */
                  function functionCallWithValue(
                      address target,
                      bytes memory data,
                      uint256 value
                  ) internal returns (bytes memory) {
                      return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
                  }
                  /**
                   * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
                   * with `errorMessage` as a fallback revert reason when `target` reverts.
                   *
                   * _Available since v3.1._
                   */
                  function functionCallWithValue(
                      address target,
                      bytes memory data,
                      uint256 value,
                      string memory errorMessage
                  ) internal returns (bytes memory) {
                      require(address(this).balance >= value, "Address: insufficient balance for call");
                      require(isContract(target), "Address: call to non-contract");
                      (bool success, bytes memory returndata) = target.call{value: value}(data);
                      return verifyCallResult(success, returndata, errorMessage);
                  }
                  /**
                   * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
                   * but performing a static call.
                   *
                   * _Available since v3.3._
                   */
                  function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
                      return functionStaticCall(target, data, "Address: low-level static call failed");
                  }
                  /**
                   * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
                   * but performing a static call.
                   *
                   * _Available since v3.3._
                   */
                  function functionStaticCall(
                      address target,
                      bytes memory data,
                      string memory errorMessage
                  ) internal view returns (bytes memory) {
                      require(isContract(target), "Address: static call to non-contract");
                      (bool success, bytes memory returndata) = target.staticcall(data);
                      return verifyCallResult(success, returndata, errorMessage);
                  }
                  /**
                   * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
                   * revert reason using the provided one.
                   *
                   * _Available since v4.3._
                   */
                  function verifyCallResult(
                      bool success,
                      bytes memory returndata,
                      string memory errorMessage
                  ) internal pure returns (bytes memory) {
                      if (success) {
                          return returndata;
                      } else {
                          // Look for revert reason and bubble it up if present
                          if (returndata.length > 0) {
                              // The easiest way to bubble the revert reason is using memory via assembly
                              assembly {
                                  let returndata_size := mload(returndata)
                                  revert(add(32, returndata), returndata_size)
                              }
                          } else {
                              revert(errorMessage);
                          }
                      }
                  }
              }
              // Copyright 2021-2022, Offchain Labs, Inc.
              // For license information, see https://github.com/nitro/blob/master/LICENSE
              // SPDX-License-Identifier: BUSL-1.1
              pragma solidity ^0.8.4;
              /// @dev Init was already called
              error AlreadyInit();
              /// Init was called with param set to zero that must be nonzero
              error HadZeroInit();
              /// @dev Thrown when non owner tries to access an only-owner function
              /// @param sender The msg.sender who is not the owner
              /// @param owner The owner address
              error NotOwner(address sender, address owner);
              /// @dev Thrown when an address that is not the rollup tries to call an only-rollup function
              /// @param sender The sender who is not the rollup
              /// @param rollup The rollup address authorized to call this function
              error NotRollup(address sender, address rollup);
              /// @dev Thrown when the contract was not called directly from the origin ie msg.sender != tx.origin
              error NotOrigin();
              /// @dev Provided data was too large
              /// @param dataLength The length of the data that is too large
              /// @param maxDataLength The max length the data can be
              error DataTooLarge(uint256 dataLength, uint256 maxDataLength);
              /// @dev The provided is not a contract and was expected to be
              /// @param addr The adddress in question
              error NotContract(address addr);
              /// @dev The merkle proof provided was too long
              /// @param actualLength The length of the merkle proof provided
              /// @param maxProofLength The max length a merkle proof can have
              error MerkleProofTooLong(uint256 actualLength, uint256 maxProofLength);
              /// @dev Thrown when an un-authorized address tries to access an admin function
              /// @param sender The un-authorized sender
              /// @param rollup The rollup, which would be authorized
              /// @param owner The rollup's owner, which would be authorized
              error NotRollupOrOwner(address sender, address rollup, address owner);
              // Bridge Errors
              /// @dev Thrown when an un-authorized address tries to access an only-inbox function
              /// @param sender The un-authorized sender
              error NotDelayedInbox(address sender);
              /// @dev Thrown when an un-authorized address tries to access an only-sequencer-inbox function
              /// @param sender The un-authorized sender
              error NotSequencerInbox(address sender);
              /// @dev Thrown when an un-authorized address tries to access an only-outbox function
              /// @param sender The un-authorized sender
              error NotOutbox(address sender);
              /// @dev the provided outbox address isn't valid
              /// @param outbox address of outbox being set
              error InvalidOutboxSet(address outbox);
              // Inbox Errors
              /// @dev The contract is paused, so cannot be paused
              error AlreadyPaused();
              /// @dev The contract is unpaused, so cannot be unpaused
              error AlreadyUnpaused();
              /// @dev The contract is paused
              error Paused();
              /// @dev msg.value sent to the inbox isn't high enough
              error InsufficientValue(uint256 expected, uint256 actual);
              /// @dev submission cost provided isn't enough to create retryable ticket
              error InsufficientSubmissionCost(uint256 expected, uint256 actual);
              /// @dev address not allowed to interact with the given contract
              error NotAllowedOrigin(address origin);
              /// @dev used to convey retryable tx data in eth calls without requiring a tx trace
              /// this follows a pattern similar to EIP-3668 where reverts surface call information
              error RetryableData(
                  address from,
                  address to,
                  uint256 l2CallValue,
                  uint256 deposit,
                  uint256 maxSubmissionCost,
                  address excessFeeRefundAddress,
                  address callValueRefundAddress,
                  uint256 gasLimit,
                  uint256 maxFeePerGas,
                  bytes data
              );
              // Outbox Errors
              /// @dev The provided proof was too long
              /// @param proofLength The length of the too-long proof
              error ProofTooLong(uint256 proofLength);
              /// @dev The output index was greater than the maximum
              /// @param index The output index
              /// @param maxIndex The max the index could be
              error PathNotMinimal(uint256 index, uint256 maxIndex);
              /// @dev The calculated root does not exist
              /// @param root The calculated root
              error UnknownRoot(bytes32 root);
              /// @dev The record has already been spent
              /// @param index The index of the spent record
              error AlreadySpent(uint256 index);
              /// @dev A call to the bridge failed with no return data
              error BridgeCallFailed();
              // Sequencer Inbox Errors
              /// @dev Thrown when someone attempts to read fewer messages than have already been read
              error DelayedBackwards();
              /// @dev Thrown when someone attempts to read more messages than exist
              error DelayedTooFar();
              /// @dev Force include can only read messages more blocks old than the delay period
              error ForceIncludeBlockTooSoon();
              /// @dev Force include can only read messages more seconds old than the delay period
              error ForceIncludeTimeTooSoon();
              /// @dev The message provided did not match the hash in the delayed inbox
              error IncorrectMessagePreimage();
              /// @dev This can only be called by the batch poster
              error NotBatchPoster();
              /// @dev The sequence number provided to this message was inconsistent with the number of batches already included
              error BadSequencerNumber(uint256 stored, uint256 received);
              /// @dev The sequence message number provided to this message was inconsistent with the previous one
              error BadSequencerMessageNumber(uint256 stored, uint256 received);
              /// @dev The batch data has the inbox authenticated bit set, but the batch data was not authenticated by the inbox
              error DataNotAuthenticated();
              /// @dev Tried to create an already valid Data Availability Service keyset
              error AlreadyValidDASKeyset(bytes32);
              /// @dev Tried to use or invalidate an already invalid Data Availability Service keyset
              error NoSuchKeyset(bytes32);
              // Copyright 2021-2022, Offchain Labs, Inc.
              // For license information, see https://github.com/nitro/blob/master/LICENSE
              // SPDX-License-Identifier: BUSL-1.1
              // solhint-disable-next-line compiler-version
              pragma solidity >=0.6.9 <0.9.0;
              import "./IOwnable.sol";
              interface IBridge {
                  event MessageDelivered(
                      uint256 indexed messageIndex,
                      bytes32 indexed beforeInboxAcc,
                      address inbox,
                      uint8 kind,
                      address sender,
                      bytes32 messageDataHash,
                      uint256 baseFeeL1,
                      uint64 timestamp
                  );
                  event BridgeCallTriggered(
                      address indexed outbox,
                      address indexed to,
                      uint256 value,
                      bytes data
                  );
                  event InboxToggle(address indexed inbox, bool enabled);
                  event OutboxToggle(address indexed outbox, bool enabled);
                  event SequencerInboxUpdated(address newSequencerInbox);
                  function allowedDelayedInboxList(uint256) external returns (address);
                  function allowedOutboxList(uint256) external returns (address);
                  /// @dev Accumulator for delayed inbox messages; tail represents hash of the current state; each element represents the inclusion of a new message.
                  function delayedInboxAccs(uint256) external view returns (bytes32);
                  /// @dev Accumulator for sequencer inbox messages; tail represents hash of the current state; each element represents the inclusion of a new message.
                  function sequencerInboxAccs(uint256) external view returns (bytes32);
                  function rollup() external view returns (IOwnable);
                  function sequencerInbox() external view returns (address);
                  function activeOutbox() external view returns (address);
                  function allowedDelayedInboxes(address inbox) external view returns (bool);
                  function allowedOutboxes(address outbox) external view returns (bool);
                  function sequencerReportedSubMessageCount() external view returns (uint256);
                  /**
                   * @dev Enqueue a message in the delayed inbox accumulator.
                   *      These messages are later sequenced in the SequencerInbox, either
                   *      by the sequencer as part of a normal batch, or by force inclusion.
                   */
                  function enqueueDelayedMessage(
                      uint8 kind,
                      address sender,
                      bytes32 messageDataHash
                  ) external payable returns (uint256);
                  function executeCall(
                      address to,
                      uint256 value,
                      bytes calldata data
                  ) external returns (bool success, bytes memory returnData);
                  function delayedMessageCount() external view returns (uint256);
                  function sequencerMessageCount() external view returns (uint256);
                  // ---------- onlySequencerInbox functions ----------
                  function enqueueSequencerMessage(
                      bytes32 dataHash,
                      uint256 afterDelayedMessagesRead,
                      uint256 prevMessageCount,
                      uint256 newMessageCount
                  )
                      external
                      returns (
                          uint256 seqMessageIndex,
                          bytes32 beforeAcc,
                          bytes32 delayedAcc,
                          bytes32 acc
                      );
                  /**
                   * @dev Allows the sequencer inbox to submit a delayed message of the batchPostingReport type
                   *      This is done through a separate function entrypoint instead of allowing the sequencer inbox
                   *      to call `enqueueDelayedMessage` to avoid the gas overhead of an extra SLOAD in either
                   *      every delayed inbox or every sequencer inbox call.
                   */
                  function submitBatchSpendingReport(address batchPoster, bytes32 dataHash)
                      external
                      returns (uint256 msgNum);
                  // ---------- onlyRollupOrOwner functions ----------
                  function setSequencerInbox(address _sequencerInbox) external;
                  function setDelayedInbox(address inbox, bool enabled) external;
                  function setOutbox(address inbox, bool enabled) external;
                  // ---------- initializer ----------
                  function initialize(IOwnable rollup_) external;
              }
              // Copyright 2021-2022, Offchain Labs, Inc.
              // For license information, see https://github.com/nitro/blob/master/LICENSE
              // SPDX-License-Identifier: BUSL-1.1
              pragma solidity ^0.8.0;
              library Messages {
                  function messageHash(
                      uint8 kind,
                      address sender,
                      uint64 blockNumber,
                      uint64 timestamp,
                      uint256 inboxSeqNum,
                      uint256 baseFeeL1,
                      bytes32 messageDataHash
                  ) internal pure returns (bytes32) {
                      return
                          keccak256(
                              abi.encodePacked(
                                  kind,
                                  sender,
                                  blockNumber,
                                  timestamp,
                                  inboxSeqNum,
                                  baseFeeL1,
                                  messageDataHash
                              )
                          );
                  }
                  function accumulateInboxMessage(bytes32 prevAcc, bytes32 message)
                      internal
                      pure
                      returns (bytes32)
                  {
                      return keccak256(abi.encodePacked(prevAcc, message));
                  }
              }
              // Copyright 2021-2022, Offchain Labs, Inc.
              // For license information, see https://github.com/nitro/blob/master/LICENSE
              // SPDX-License-Identifier: BUSL-1.1
              pragma solidity ^0.8.0;
              import {NotOwner} from "./Error.sol";
              /// @dev A stateless contract that allows you to infer if the current call has been delegated or not
              /// Pattern used here is from UUPS implementation by the OpenZeppelin team
              abstract contract DelegateCallAware {
                  address private immutable __self = address(this);
                  /**
                   * @dev Check that the execution is being performed through a delegate call. This allows a function to be
                   * callable on the proxy contract but not on the logic contract.
                   */
                  modifier onlyDelegated() {
                      require(address(this) != __self, "Function must be called through delegatecall");
                      _;
                  }
                  /**
                   * @dev Check that the execution is not being performed through a delegate call. This allows a function to be
                   * callable on the implementing contract but not through proxies.
                   */
                  modifier notDelegated() {
                      require(address(this) == __self, "Function must not be called through delegatecall");
                      _;
                  }
                  /// @dev Check that msg.sender is the current EIP 1967 proxy admin
                  modifier onlyProxyOwner() {
                      // Storage slot with the admin of the proxy contract
                      // This is the keccak-256 hash of "eip1967.proxy.admin" subtracted by 1
                      bytes32 slot = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;
                      address admin;
                      assembly {
                          admin := sload(slot)
                      }
                      if (msg.sender != admin) revert NotOwner(msg.sender, admin);
                      _;
                  }
              }
              // Copyright 2021-2022, Offchain Labs, Inc.
              // For license information, see https://github.com/nitro/blob/master/LICENSE
              // SPDX-License-Identifier: BUSL-1.1
              pragma solidity ^0.8.4;
              uint8 constant L2_MSG = 3;
              uint8 constant L1MessageType_L2FundedByL1 = 7;
              uint8 constant L1MessageType_submitRetryableTx = 9;
              uint8 constant L1MessageType_ethDeposit = 12;
              uint8 constant L1MessageType_batchPostingReport = 13;
              uint8 constant L2MessageType_unsignedEOATx = 0;
              uint8 constant L2MessageType_unsignedContractTx = 1;
              uint8 constant ROLLUP_PROTOCOL_EVENT_TYPE = 8;
              uint8 constant INITIALIZATION_MSG_TYPE = 11;
              // Copyright 2021-2022, Offchain Labs, Inc.
              // For license information, see https://github.com/nitro/blob/master/LICENSE
              // SPDX-License-Identifier: BUSL-1.1
              // solhint-disable-next-line compiler-version
              pragma solidity >=0.4.21 <0.9.0;
              interface IOwnable {
                  function owner() external view returns (address);
              }