ETH Price: $2,669.28 (+7.00%)

Transaction Decoder

Block:
18265537 at Oct-02-2023 09:28:23 PM +UTC
Transaction Fee:
0.027413554702961601 ETH $73.17
Gas Used:
1,842,849 Gas / 14.875638049 Gwei

Emitted Events:

352 TransparentUpgradeableProxy.0x5e3c1311ea442664e8b1611bfabef659120ea7a0a2cfc0667700bebc69cbffe1( 0x5e3c1311ea442664e8b1611bfabef659120ea7a0a2cfc0667700bebc69cbffe1, 0x000000000000000000000000000000000000000000000000000000000010e3e6, 0xe54d0b2ea51b6aab0341bbf57455dbd0a457ede90e0ab48376b60bf0a92c70b3, 0000000000000000000000001c479675ad559dc151f6ec7ed3fbf8cee79582b6, 000000000000000000000000000000000000000000000000000000000000000d, 000000000000000000000000c1b634853cb333d3ad8663715b08f41a3aec47cc, ecc4b38586161034bb286668af1a85b2978b2fca0ddfc51c48ee285d2040defe, 0000000000000000000000000000000000000000000000000000000373ad48a1, 00000000000000000000000000000000000000000000000000000000651b35f7 )
353 TransparentUpgradeableProxy.0xff64905f73a67fb594e0f940a8075a860db489ad991e032f48c81123eb52d60b( 0xff64905f73a67fb594e0f940a8075a860db489ad991e032f48c81123eb52d60b, 0x000000000000000000000000000000000000000000000000000000000010e3e6, 0000000000000000000000000000000000000000000000000000000000000020, 0000000000000000000000000000000000000000000000000000000000000094, 00000000000000000000000000000000000000000000000000000000651b35f7, c1b634853cb333d3ad8663715b08f41a3aec47cc746b5133d7227c892da51ed3, 0131a04926db84b2e802f86ec3d2753781c53579000000000000000000000000, 0000000000000000000000000000000000057ecf000000000000000000000000, 0000000000000000000000000000000373ad48a1000000000000000000000000 )
354 TransparentUpgradeableProxy.0x7394f4a19a13c7b92b5bb71033245305946ef78452f7b4986ac1390b5df4ebd7( 0x7394f4a19a13c7b92b5bb71033245305946ef78452f7b4986ac1390b5df4ebd7, 0x0000000000000000000000000000000000000000000000000000000000057ecf, 0x2901928879a7507422e5dc88bdc281cfb8d30338138243c51ef96a8cc3787f9c, 0xe337770116551314fb622078f648fb961231bf9407c12c060c476a1975ede187, 5535f1083ca235b2e368148c3fede92942afbc5a18f0952432bed2b3c4a8c355, 000000000000000000000000000000000000000000000000000000000010e3d7, 000000000000000000000000000000000000000000000000000000006519e477, 00000000000000000000000000000000000000000000000000000000651b4407, 0000000000000000000000000000000000000000000000000000000001169f41, 000000000000000000000000000000000000000000000000000000000116b5cd, 0000000000000000000000000000000000000000000000000000000000000000 )
355 GasRefunder.RefundedGasCosts( refundee=[Sender] 0xc1b634853cb333d3ad8663715b08f41a3aec47cc, contractAddress=[Receiver] TransparentUpgradeableProxy, success=True, gas=1879913, gasPrice=14875638049, amountPaid=27372911653798303 )

Account State Difference:

  Address   Before After State Difference Code
0.361893390550704468 Eth0.361985533000704468 Eth0.00009214245
0x8315177a...4DBd7ed3a
(Arbitrum: Bridge)
0xC1b63485...A3Aec47cc
(Arbitrum: Batch Submitter)
10.00076237925602468 Eth
Nonce: 308929
10.000721736206861382 Eth
Nonce: 308930
0.000040643049163298
0xe64a54E2...80E2E4eb5 314.34278149173267159 Eth314.315408580078873287 Eth0.027372911653798303

Execution Trace

TransparentUpgradeableProxy.8f111f3c( )
  • SequencerInbox.addSequencerL2BatchFromOrigin( sequenceNumber=360143, data=0x005B4644343210E80E0038EFD58ADA1C6C9BF4A03B714926457E570137C669B78384D8BDB242FC65016F488D7711AB30B6308281C10CDB3C71A7BEEA932A560437710C61E87914DA18445574620EBB5868C378E2C1FFD68101C59681B1CBA0441BB1E29CF7783CEB671E9214CEB2DB3D5039C8DDFBDB2EA01CE41EE41CC53F446EF63F2B4B4F62A5345975918851E98280AC08CAF5C553496EAFCC247AA5E5DD25AF54B7819AD76617D424F78B574A2BD101B2DBDDFFFD3F99ABF2C6CECC9859A3256BBE9990B9FAF79F59EC48A9CF9E6F7FC82864A44221DE6A18159E520374CD0FC0AA452D7191589056978C052D10F33F97A66B363E2CBB8D2DBB127EB8CFF901BA37393D87494A905C7942CF29B64C0EED0B4DDF345AA7B0E42740B3C8F2D129CB47A51FF81DD30006777C5C87D7A243C8C204001BC8AF3733C02E2939E72CDF65DDF034B7DFD1290C717C668239478545D406DB8E10FF3D22EDB8583010BCBB05A1222ADA5FF48315D3260D22057B8A89369FBFAB52ADF68986080EC1F167BC7D1E30C726A41B8218034963A875561C9DA11C0B1C842891D251661CC752EB35EB289DE3ACE1348A4991D30435749A21488E914EE3B41C23734EA3B38614C7536BC78380660E1489734EA308ADA5D82D9C6285C33AAE809E459084E6CE230284F4689067488E5B6AF69C7DE9A43BFFBCFFDEF36BEC13BB9E3AFB34FEE79FC6BE7555AAD5B7BAD114AB1A0025ADA5D659CD191F7F10E2DD10E0FAD77917FFEEAC06AAD0DD0081460304D1900410A08622387324406A25720C1A4DEE82A0140B829CBD31BA0BCD1AE769346BBCFDBCCEB897F15FE33E9F7BBCF7F1BCC7F3E0E3FFDED4BDBB9B324BFFDB8CC5A0028728EFA76AA9166CCD4A677A27146B60310D14AB9BD95B91C8098F1F8BA1663392955249BEF0778096856E43DEC6D06A310348EAAD88F0ADFA267B75A406926629EDB604FFC01F599673A7B787E8F4E03D6D2E2180BAD1EB87CC3D160BCA1FD3AF1042C68D7797385AF87FC6B2FA733155DDB3FBD74CA2440D2AC263C9FC1A32021E6286CF3A1406190286DD9C40F2054154EF20D4E2107BCB5F20BCF4485F0AEF3CE12EAA8F3CFEF981F58F5F12ACE354082A14016004007D00A48F5F373AE55C8619989A5161DA3B0E9D5B6CDFEE8EA023F96B1189D800A2E28F300AB8B9A348FE8FFD8A3F92CAA88EC43BBE49176CE2579E3040BB0400DBD60A40306A4B5059331802F5F805747DE30723E7A852C217AD988C1D764637A2FBD5C22F9085E0380F3703DA0C9A7F42B1810C3B1C291C93A0C875DDFAAF9A4ADE9778C94CB085CB0A42138C6430806D090FB5A745D8B96B906D9A544C5446C88A4E9E84C93DE42FCD2A7211307203E8A03BFD7453A26D5EE8A8B5513F21BEC9C683FB23111BD0B70997A90277B532D20E0E8020D8092C2BA8AC99CDF50D0689D3FD1495DE60753D5BB9F588F83B03F411E3F7EA45D898E1602CC513C20731ED30F2BC5EE60F10E5F0025946AC306B51A43DBCE91C96382EFBBA0197C81F87A96E0C64204E7BF328680E16851FAF3C9069A16F02900FE18D1C6E20339901884F1A72B063B2C66858604A084FE79DAF3F82D100AE81DB9F460A51ADE6CEBCAD60E19026C211EF7AFF1A20FA9F274697FF614C92AE5C6594A19A3B234ABDFE9C38BDBFD905919DF1957ABDAD1D8073C206E8A50E4F4657162D289F17D4682AEA1705B3DF9DDAC7A07EAF2CA42CD0518F2519C0E9973692916C6868E8AA570DAA1E2DF12497359A679E34A82098E23894D86CA35948031E940A0570618B9003BE968E9D9826EDE1D949ABF3D37629CCE62F43D4D0C7865A58BB2C00A32D98915AA8D8497E86D56374D5A748DBD464DB22DBE5639F84EB2399DE58CB20083052A372201A9EE5A080101A84BDBE60B8C0AABCFFE9F046800C41BE245B9180DE81CAEFEE0DDD31C733FA5679FD70FEAE57874FF8E9B8226DCBBF31E877A6E3804E25B435852D6E8657E308ABF64F2100D2F7EA0D7F8435DF82343FE954A752DEA2577D4E15F0D74B95E8D5A461FEEF8EE5F53AE4F8AD233B08915591284FFBE59B446DD8D14622BB9BE8993A1164510C85A3B87875DA10BFB65031B3069E2092819558BD8CB0AA644C3223E58C8AAB663DAE53ED1D643AAAA628A7DAECCF665B37964BFCB56CF6A724DF8421BF0FB68A608C7772DFA4FDBE9B9182B44E2320DC4DA555016777395DF6BB713DC482348ECB42E6A3411A7B4B0F42A84DE1E95527072077E05A09D149940208FD3D9543E57432F220554EEEE5D8B9175154FEB6FF75DAFEDBFF3A8FF0863D42B942CCC20E1695E7A4D984CC7F7ECE8E879E37E50CBB9C42ABC3BE38252E2C1BBF8C5405186ED98356F53C86DE8E65750756A6F7E3B78174CA6BD3B3F4360C38C7F5AA6F3B98A4C4C71FB80F8AE38D66D548E24784BD570EEC7BC76F612623B254480B4F0B187FB4532234EF01125E3051F2DB8D5E6EDFACDA880A4A1414B4B815A3FE496B590E8496F36335FBE6069D4F65825B6CFDC99CFFCAC768432609735D3AF16040F9CA763E280302A786FAE41DD06B87F0664DEC601C16F36500117D91527F7169B171B5EA107BA6063E56C2B4F3AE2EC63C20E46B14DE4D5F0010B813029782229CE0270C2BDCD4789EC7E3A622389180C7ADC4DA15CC30CD2903DCC4AF4A84BFEDF95FB2166059127C327D43BEBB16EA34B973EFF7A79B740E1223A0B09968DA3F1121BF5E3C5434D3503034AC4BCA398F26649DEC1CE779D6A5158BC1A661F0D7DA3A7BCA2CCB18AE93023A6583DE5C110769CAC5DC36097D3A2A44E75A94AB96EFF8E8AB5F42F5DC24DCBA4FBAACB578A15A15F61F6C27EDCEFCE1629DF3C7DCD1669089A2CC6CEA0C1F5803099D341F5A095733026C4443C0B9341E864AE391F8277EF6A56AE9F9D6DB1569BCB290EC981DE4DF39F40C23BAB8B49A4B29DEB00D59314BF9592E1388418F3741E1C211F3ECE110B1FE452301EC49FAC8578B558D173628A97C5BDCAC7C5DB865755148FE3C6CC3E96DB3E8E1C518C5C0F22918CC7929DE3C50CC8581B9453F81F18FE8362EF9615AFE6F150043D9E5DCFFEACA2037D3FC52C7853D45B6266E0392D8AF28D8A28D17EBF009A21DFCE7F5A09D1038B5CD3B53C0C3F347E1B276CEAA5B38BF149A7B391B9B168AC025376E0C1F502E7CB1E82F7CE2DDC244F0A5BDE46D67F8319AFFB6526B3CF9965EDEA6463535AA7E71A400D1543C3CDECDAC73C2D31233F7033370FBBEAE0A70F7224AC3132FBC1254E33F5C7038044E6DBCC6E29E2BF172C3F493A5ACC81A4D44E2F4B870FAB902304737E003FAEFF2EC09748C3943C129A43E96AB0F43B9DAF1F22EF8B3F7E80641C3DF342F2638758C6F75090F3161BF1D8FF9C8581EA2336D5B78C3E862B8471DF0228B39217CA78E0890BD569AC7564BF7575171FEB7897688541A199E5226FFB66413788B9E126018790F9FC12C089C9A1754D6AC1A2043CF11BFB453FCE3D3E76224C2716B74FCF4A7B0FD25AAD29643C36154EC3E6449C44584C182590F93DDFBE44E8BC44DA4B0B8EC82557ACA5F81E3BEC65872003030D206BCB5567837D18C55856FD74782BDA7941BF3C65BBD97AC3D11664C5600C871B2AC76CE296A4D4099B173236AAC9EE937D9CC1A56A63D8A0F8EE09DEADB8F9EC245622A0E16B46546B82F4A39DDCFED4B679A40C1A4A435B163F055E366E754E64E3C85431891EBA41ECBC972359AED7946A02C1204DD4BE2BF85369760E6DB330A7DED1F12CA2C9E0EDF3F568D6BD81B47C641A6A9D08577F7810135DDC2C6A7F889425D428AFB5CF045A2258FA270DA9FC21462672A9B65CF4E6C802143C63BE93C79E9E4327DE045BAA8ACD39EA62F06C4B3D7F34C928C5D75A7708A1F2854DFF812521A53A6CD8E7D6306C892A9862F1B8B1428E33499931D46FE1A51B756A6D75B8AB961B30E240D41A0F06D18422D0BC9E102914140DA214593CC576F94035C29C450C8AD1E09EAD55E4A1B77774B53C22533DD800F20A1E2CB0669907C1D1D9717D4AF59273688097FA55147C2AD0B1F9072010D012C11128CD40E445405D0AEB05AB2CA4FA459BECA05EBB731C45F7C570E72CA25ADA8260180843D9BB2C3D9FF6CB57632E14474ECF174FD98FB2C5D841CCA735451C58A203740C399AF9436714B1252E0FF2019C27F8588F4A2359B829E1C76252AE8296A19DF7670BC520C81991CD742405121837E5FE99242FC678A64E6D7FB4DF17804D1CFEFA37901B7200D9A40928076B0E85DC629F459E568EED710DA43D333CAD35F61C3D7BFBFCC10B99BDCDF0E8B804C145B677EF2C734728322A1664BD5331D901C081CD34C6E40EBCED30FB6811809E41EFA9F5450B4749B4A6A85B77A24FCEDDC8206CFAE89D4B540000B13820BA596A76DA5F739C50CAB1C2097093D844F01961A5C6350FC39F8FFEEA34D3FB262536DFD259800853394D9320802AC0B265B44C4A8D4384155D84011B96F4D891DAB6FAE2D5BE13D7D2D64A85144C7DC44561008E3F4AE549D03B5A3C83B4222B59C4847F5268E157904B41491555EE2F6CA8B9E2696C81E1EC86B8E29F3C51A53251D820720068584E6FE6B1059211C80DABAB9905C825C3D6B11F584C2DD71AD3E9DF4B0939BDE1B7AE3F864D91E54A5C928A415A9C2AC3071DF794CBA551285B0AB9B8DCB2A57FE8620EB17DBB374DD89747C0799C22B0FDE225A34BBE77CF52D0307BFDAB4CC5A0C56F62D3729613FB7DB744BE6E410A2C8C85EFA20A589DC231C638283C509BED4DDE23F4FFE78BEDCC3C776A19827298ECD4E85DC398CCBF06F48A0BE2CB186E31363C09A3C0B4B40C5F99B1CC5D6377A2088FC926F8B2732A4D9B97AA2FC3FB45EA57F6F1B0B865189283A8A0287CD1F5A2246611405F0541806E508ABCAB734B9D3A2BC3C51EABBBC4995F2C05C23A242B671F4DA1D34A442DAB4104571F8AD201BCB59FEE6C24729D1F8D64369291E912EF646A59CD61A63D69761D94A67351782375E077279C2B9D8E0F33E639DC5D4E86F4810B9103622A6D3BF827E689BFC8B227082F3394BC89970C8E0D659E1921A9FF93EEA40DD1A02F29DE3478EB6C15C4F6F5694A6F26E93009CCE31830B169D3D769103C31A5C1DA6967AD768639CBD46909048067E1A6D121842507A036CB5B35763D0CC67C8C8E77DE8A61860A46C68EA6849E98C4CB03E00D4BDA72D248B6D922005AB2BCDB8D8025651F411476788D6FB0C199FA2E99FE9ED20E72731C89CDE35EF5966FA25C794923BC7C052E3C19B642DC389CDD2B413658F3C06A63E14DCADF20A02CBA63F4C14FD41800E7924A6F515A4021CE49A49820029CEDFB99125B4E80C066D2C639025FA0B3C5E1704F287099775E940843EB545A48B5812FB7201BD3E20005051A64825B6B9BCA3E6EDCEA06EED78867A2F78CCBFFA94E1200C0E98418080010DC87C50F89F11F6C8C90B156E56129E1FF46686EFE7259EF658CDB949B3C0FBAE86CDAFA5897476F216BD1C727B589E1A2B8A4DA685ECB730F8F916AFFB8D1DBA50801DCE7F7B0E89A22D85A7CCE5D25FD2BFEAC102C2FA473538DCDC5CF26F6953C1B62400A266044397352134373301C1321B6329A8E0332D26733B8C526250586ACB9FCC53CBB8A701450010B59C0C7C38EB68CCAC66D55CB96330985418902CB5742AC8DA02FD2D7F0511CA52FD0B2BB4215CCE23FD2D7E9802DF6D7EFD01F070BFE5E5EF25C3916B7B4490596E8F85A61B77702C063ACE5663090FA84254DBC1A64AFEC3273BB0A7B59C0A154FBB5117A997D30AC2E1C9F5089765AC33CB55833CABF1C388920AA2175FC331B0033B3C9E72E91FABF54DFF0F176F54A7D79299AE2E2300258FAE9491402B15ED13DFA3942D14CBA37CF3687C9431741E26960A8322C2E6F3CC26412F0F8382229D56AED0EB86A4C13686FD6E71256EF92D47E28B27453B280D02D72455133CD4D5143BDE7429A7A6B1EC37E4A33982B38DD536E98F26A46D6B8F165C3BF500988BCF3115007E028EFC9796056FC87D81F16317F992B6AC7706BFEA6E15B917E9700DE5027298ED0201DDB7400BEEA768086DFE9B89E4A3AA6A6438679519BE4B9037CECE14420105ED6AB888A5FCBEF5DFF8B333FFA3AE0C8B5528BCCB87C9236DFC2374AFE59501694B631FBD0F1EE24EB8370559CF228B3293FEB75FBED7AEE3066EF6B53F62130AEA2A41DB05CCD1A742199B948CB5913626593696C986C026BC993D384D9091028857FD1C695BEA47963BF10570119CE6A51F0B24C4B561EFF986B68F71DA6F0E5A29FB01DA2F5B8F816B43BFFC2B99115D5D88ABFDF6D261680EB3D5F510F0C94CE8C60676826D170898871562888FD6800CC9BEB8537B43C94B28F7C72B809DD68121BFEF202B819B7073FCC919F1EDF2F8798BFAD48A88D4EB5C96FD046218249E8F7F98083CA69BEC4D054439FC0A6559D78936947896C2BAE51DFD914F45983851CB112FA8C2FAC5218453B7F504D1B142959E38AB68E60313DA2F8BFCCF9A91E9D5A99E2F3F7E2EFAB73BB337F4A5A8B1771FEDE140741EDA9F90F48E6D38A491CCEF9ACAA1E2C237001E84393E2C2B8D1B8DF46397CA5C0CEAB49490F5B0986F06760DB1480A3FB9B4CEE8E93DA142268E14E58F7B5CC8BC3DAEF24BDF8D3F081EAFE5842CC4A8C45A5608EA5F60333A0D998DE5265E9BA30F6DDA0FF712F471663757F48DC5F474E704C09600D01344189814FF47A43A42664E8074197D6A2AF0FFB6EED65FF5D183421A219A225A3042AB98AE7E7C62AC7E40F9DDE99107705366B09F92DD94E1EB303C667C221E3B624C5E96CD03DAE944F1321A56EF53D32450D327F2968F26CD7B8EFCBEB15A429EAA37DEA36E1B0B4D8B0E4C40419B5AEE82048684A177EC6B6DF1C2824FC4B66600E6895796C9D3C48C99439C839B95939D9D85C9C89889999593D3C48C53988BCB9C5D58884B848D4B9C4B948334675E74D83375FD04ABB4EB54123F0D351E5FC96636CDB175C9959BF4FD07AC5B48C64782280745879D637A0784D5764C0143CF27E2804C1D44ACF4DAC844786849AA2BCFB2CCECDF6482A683A032561C817913F041200FA28FBEB5D53FFA73A0D9D536C5FE25B852D4B0B3931FB5B8FB6B13C8685509622C2B40DE83BF0574568FC71A54357E69110C942DB738949218B5E35C4E2E07A1A2268C573764FDF3C5202A4CDEA2134B2FED0EBAF7418DEB6ACF53618B1621521C2BF8BD4A14F6EBFA1FE3637C197A3531139B3C9F10B9CF9B55B354033F88E049EDBD16CDE9E19EAC3D8C22218B8D1C925FA8E9C19CA1255F36021D741E9965E4365276376AA92244063E8945374F5B35155191EA1B9328E827F17723A8C93F3B63EC3227D0789DB39EB45BCCD8FCA9DD5A302BF334BD00A86ED2CB7ED6A469CDC67B394FF59A9EFDE66D4AB93CA09C9651DCE0103FBABED70E9E0D312C353111FAF13131923DA5BFE537C96E65BBB802DD5B55C146CC6D617BA29B20DB8DE0802E1879E5651A6E06E4A52B395C3C3CB1EA747FDAD3F50B1DFDAED13992B587418651AA2FA58819EC514832E9F3AECDA4A1AB0D7394BAF19CD6A6313180B3AC53B94B9CD3A12072C056091CA44507E868CFA12090A92C4B10A08241026A120E70FB2C7453F7F2C8AA2AD7D850E61A27EA4187F1EF5F166918BD6CFA3EA18680D10F4FA836BD7CBE0309CF0427611C32EDF49E527167F1ECA339DE133A9706EB7698BF10A3D2C7E2880DF285531A8BB5FD6DEC8443A9F23FD3F45D7ECD0EA4FBF91B90E3154939BE5D72D1A98B89F54C02A842028FDD3609B987D449A6C4ED9A66A7880801605B50F76610B4654F8E29C819B9154F53B440D9694473AED7746103B039EB880DB08C1C9D21A131982E6C32D153F0537404BD5ED06095E0584D5BA1A360C1AAFF962BC392E9FC02863EACCE3D16FFC72BE3C9EDB405290FCBCF49971BF681C7F261F4B151B77D2DCA559F744A888F3FEC8248CC18E8CDCD07A0B22B6C44746D860A05C0B282C5B5D5288ACF4657E7B0B298623F8C008A2887E4763AF6404C9E21E2DE98DC8296168F721D539E0FDDB024C1588CDC9C078513C27FB78649A9A0B286EE5DE07BCBAF942B5F667B53C0F98CDC2347DDA137BED008B1A617A360D92E1B796EE59F0C4478686EBCFAB24D7A6E718764E7663D3FD4AC7F0E8A6AA41FE4A0B68C427B13FE7E33648E138EDAE626803994DC4CC72BBE79E57DFDB933E08355984B2980753988B9BC579682C22A81F5770304DBA7BE138A2F9261A48CEF92179BB5549BB7BB209391103296517457DC3F736EEBA8289B6823F4521FF8F34BBDA359FA9912FC7EACCF7AC05D5C5F36E9B82A46C815454449B0873C234DD9086B7BD7ABF500C28624CEA2A12419C556C9420A83F8EAB92DEB4245CDB5FE030A913C211A0EDCB55B7060B1A623375C12D00F4985E0A016E44AA2139E97030109FBE6D1AEF7B9D780692582B87B6910A7489667B7E95C7E45F24B120E9CF94A8C84F642021E356212B707270627E6359C76443B9894FCE7F395B6B1B36FB434069EC59D66C322158FFB01ED60884418940116D82C63D627257951E8A69BB03B5C7EB298F305183C08C440651824057F690E13F5F592DFDC090099CE5A0350633C7A7DE37D01806B4F627CDA8CD4AA9AF7BD16DE5FBF60AF055218B7B5020384F44DA60753694B80D749B114E9C7C8AF72E40562B81AF0D963717D7DEE8AB78A57E67A91F349A9559E320D02A7068FF1F8AA014963941230E2CA6266A785297BFD6A7CF2F6926496D9458D802F9F72AA4013F915D00706845FD6DF568813BDF882BBF43DFDAD5E6B350A90656F394F1165545FD2B06CD607583FE4EE75A70DD6F94FF68B18DFA169F9DC45136DD67FCFB1655EF5EF55F417EEE236F7381579D73B68C883BCD73F72CF4A38A531BCDA489D8166AFE49A2A794D318891522D8635970CA23E6282178FE805A27476739C9EF08861C25FA7C95D000DCF5CE6F085FDEF0CE39D89C93FB3AF2F6DD05A1C45B21B3D5C790D7308F1C99216D0EAAFAE3AC823788E69AFFB83CBD9FFE7B9C6600BE2D2E75DBDA14F25B2ED1FF1398AC69E079EC0DDAFD12346A3F4565712683479410490990194B78B6644DD5E51DF3BF3DC1F063B8CA6A025FBB81CD00E87C4FB6A4EA70E24747A41AC4559F0D9982F01A07535C341DE62A7DBF3CEE359C519164603933D7B011889A4010EFC4C46DF9078F69033F74D15836C095DAF8E5692EA36A16403D391AB8E5BF2C72A15AE2612D293BBACF93BA4B7E33D9FFC7A48FFB583CF983DA0136C857E1E03053AC0E2E7BEE7FFAE0101F8FFFB13341E061A6A04A3B006F5FD01ED3E040170FD10043607F280BEBF8EBEAF744128DFEF49B7EF93E4EF3DCDEF4F221000C61D50613550350FEA6D006648A0D86BA04DAEEF2352D06E14E8460E08F8FFA3F23B590F44AF06A27703A35C07C9BD0229DE06E10C035A7C4556DDE76601356E989149AF7D03015A780533321BFE7BD11BFB3901FC955AA6FF5489B07AD349B3439D35685CA17F77231FA111CB2CD297C3D4E4CC060AF07607EA340481D07251291277B444F983380CCD6EEAD714C083CB55C3880F4E398A145E5D7E781314F47B9FB9B8214B2C0802460A0A42DEB51D820B976A12F412101072AE2315C0A3AC92532A6C9E17CA791C343D2BDCE3C9CFB92E6282EEED85C3CD6DC54677B10734921B3E9FE777C8305FB0ACE0A92D9801AFC85C8124CC2F762FAE8B47700C03ADC1944C62B4EB154EDD9B6A4ACF8811D49B6CB745A277374E21C3CF31429547A374013C3A2490F6EAA3D8BA02BA68F86471E3775286BDCD8380769828ADA8404D97B9B0FFFA5F6C695B1339435650F5FFB624B180FFB58F127FC8F69020FF5545CC1D7B0B927B7EC4A636B57A713E939C339F8915294A396C221559E92FACCDE8B4AEE4CFA99CD06F079EF97D2D796FDAEB559BC43E30E0FC67D3293961868D9F6B66881832D9AB78333A0A6485CEA296555060E03D4320E01DF96848354715C43C60B95C689296AAAC0FAEF0AB51234392953A6FF2A49C7FB0840278632086E49905CB0EED0CDE1C6EE183A003B5A123CB5AFBB6740293BDEAAAC22371DDC7F2BC3EC0F4813909D6F39EDA4C13197A2E61DACD23C959175ED714FC311FA33DE923AD543B0C5FAE75542B649F736B83041543A0E33C028263D0417981CA775EB38C88BE078B61B49D4A4BDE8B8AE69D015DA0E847337A916DB9AE444B21D26A2D64AE9AE75DC9E8D67353F3A183824F913B4B6EDD908029FC4E2EFD2446DC918775928C4A0BAB8C01AA74D5145C0334A8E0617C7EE65E176985FAF7130F24133386EE6C38A922E903B978DA409144302DD88337A07930434405DB91573432C64F0363BCCA95B7256F161FC9C212E9E8E3B6FB6AE6DFA3BE837C05E7825DAC0A3ACB94596E0994C2E5C7B1B1478527B741BBCA2417641CD72EB092C04C81A614BF7CE2B5D40A56981E13F51C29EFBE6B57EF4B9BC89656B489E098F0A5019404905E7D9EA7BC4E402BB26E6E202B00825D96BF590D2ECDE13BDEF89A3366869EAC401636A4F2CED3CB6E5942F755D7226E61A7D8DA7143B88BBF995CB0627ECFA0D23D86EEAF615971873FAFF439BA6E952DD10A60A9A0006F2F50774D8832A8920656B6D2626192C3AFBFE1267EBA7C43B1E3210D258B86E7354CBE09C589D886530B8F6766743A3922CCA3E5331AAF4E996F4DF328EB1E03E834C3EFFF4094072CA9266E089C370F82ED0DA567FF3019743BDA736ADF96B782983E11C3D3C6E3C10CA88CF1C5C3C4F383F0D6ED2B292BFAF9486709EC3FF64A276CF22DD76F5AD462CA5A9AE4497C59A32D7E24307921682BDA5CED10438BEB98346B8DA3EC8B0B9BB8E07B813A78EECA94BF0EFF2F663994EC3072B5BE744FB5AAB2A2FCE1D7C4123A622938918EA6337EF079EC4D08BAC00C2ABAEA9FB760FF13967810935609FE1D10D205A9F128AC43442609C4553B72FE695E9D03305795D55E1FECDB11EEC236A52805149578824A77BDEF3F659AD0DC86BCF495EA7D1E01E21F08F204AE80030A95715330270D974A60F41A0C416E15FB3B03827279964F333B21CDFDAD9FD110620A5C6E6E9ECBBB59D4C56E1E6DB48C73C5D0BD3D5D612814D0E25D1BD490EBD7A0312B80EC858455A87D6875ABD4E01647A4F9E5DC4D03660858BEE71ECA5E42C00914188497EAE80D9E50959ED51A9C1BB7D180CA011B0CA5B72173AADA349D208F4FCAC4237016450B71EF84D8DE1FCD61BD082E3F379C34DFE1865C04646621DFD2AA7B7475E206D92154B807A669E21BCB4EAEB41E3A1961FE3B93F3884BB2C2471EF4F23FF72A73651633838B238E1F1305FEA88DA94FB6C00A753FC2D9B76603EF89CC178877CBF1FB010C3973829E4977D2641ED1CF70541D069BDB4CC8DDCFB4ACD4D7857FD6B6A3E0DAC15B33C78445927C1014F374150E197C3124208F6C03E5744209F5A48A0645FEEFCF39343B2AEA5A401B45EEC2C067BA9897C8DC484CF9856DE69A032F161D685B5C2D886860A23C5AF8174EA78929684666F8C81CE68D6929492346EF93D1F83B7F63F86B06F82A6646686F9C850413170E9F29FFFF33DF0863742E3F41FC3D67F2FCAF0D90F746CB668538759ECC781C61CA311CAA4B3A4382ED38FFC189A795CCB517F7C6A7839690AFA0423038DA713F116BE5181B90E7D328AEC9FAEE5C8A3CFD10BA7330DA1DE6F52116D046813CD0AE2DCF61F90E4790A57E3372EAECA5D41F9C12E263CD452FEFF4204FA31F30CF989658099CF77F3BEFA33E5E5E9A5AA148A10A6FB3289719DED0D4103186AF84F4755F2FE6F44644459C5DDBEC8EB71289EED0A5761B602AE8FDC2784A7E69CEC8AB20BA6C5EC3270EFEA0EDCE1CF3C42D7690F7E98BDC6E58371CE2891004930F05A385BA0382AFC908A6D81C5C298C45BC18E0CF588752AE6011A2BC1CAD32ED02AB7A56B94ADD41132C060E86DF163C0936F3133319BAC9D57F100B5EC687FCBBC8DD1415E3FDE7A95C42946401B06F1CC83247D86507AD376CC80876B1EFB948FFBF147816EFB7643778A05F1F8AABE470A3C1E1FFA6AB19620978C093FFCC115FF8345659BEFF6157105F12331105C0A6D0710AEB530078CCC5E7D308F017D6A8750D923EFD04E005C5C5BD4D873A1F72B4B7E07A69475C70F9CDE86DA6CE21F1565B5DED79A248C344DAB53ADDFE8575158B550560BFE2586B042E2F8DB254127F853025BED57167A3D5911FD27B4C9B1FF575E9E77304FE51061C02F38CB0C780035CF2FD0C02C4CB37F9029786AB4C14BE6916763FA138E1E85AA214D67AD9DF16446F11E051C522703FA3C1B2019700E08869AE6C63938A6F5E3008E34BC7E82DB73247C6B5C8C798460C4D1A0126608FC5D833E10F1AFA7319420C198621BA2814FD7E60F52483E9E8BECB2F447290CBE1D1710D2E36D216EA2D599BB3E83243A30A16836318F1FCE4E00933DFA10584662949961BD116B553D647C0985B315949342D119029E38124C2CDB1064058F5534E51D4A3D1D0DFC3A02ABAE9DA9D4446DF298817EB18A9D683236373439D22512ED8B6D9EE87282662FF849A44421C81207934ECDECEE72672747B8CB67D88EC3921EA935AE424948BBA05B5847B8607C191E8D19321701C8F685C27D2ED2497F083F04D0A8BA8189A4E5DCD1612897F801EE42B062E80D78216D15D8A3406569073712AA55EF86F9DED8E428CA5E2F1DC92413765613A85F795965C6A597FBF6976A5D00FF90C254E1241E79115CD49E1F6673487A495E28C25700FE39B498CE90D843DD38F88261C3ACF5FB3360863340BDFE3F7E47B31328049E8DFF9E77AC64F67B68C2F7F63EB6D03634BA1D57977076C467051BE555C753B1FE30288460D9327922949E86E643BCD88F351E7A2147C2348F990C6452CBE2D90B4FE8E985845FBF4A0D987103EE0AC580E8F97734A604598124E129D7F3B94212478491EDF140E14BA66F69141CC67CC9589BF4FAF10D9B68E0834C84F88F61656E590377DE89D15CB22D23C7890061EAC51C477534772DE34A71ADBF940BFBD1F6A28650BFD04DAAC3222C3D3B6900C983418DC4C8D252BD81A11717CE27BE8FBAFFD93DEBB054519432436E50DB3926FFCD4B076F2F32052D3B241DD0B3FB30B815CA3B3F09083E03B792575F48E59A744122287342E02875C8D08F98F0107EBD9B0669A11050F380DE5A79E6EFFE24DBC8D0B01E44F35CC6A7A98F1902F01D1CEF20A060BF137B50CD26DC0E1324861D32E40CB521CD25A69EE52595225A15801EF6FB36C06680D38A19638B2973B313D5C5843C57A68E15C52A654C3200BFD239F4FBB62A1AD7EB4B6F0C1257D994D0C0369CBA6D0CAA115EFEE23513DE09E6929AC2081B64263F2C730705AC3559C3DEA50BA64F257C56E56CD8762B6D84FA01B54983F4A6A8D264609E9AAC53186EEC82D74E135F96FE80C6EF7D68EDA3BB3527B8510DF926045FCD70D139E3D5AF4EB36605D6140B7CAB7F727AF405B477435E3E8CA1EAE2B44BAC55827E66C81B611BBC35DC542AD3FC92C457F096987BCA2FA02D2DB6FFA8F24395F5C9D107806BAFD9F5073D111A3B431101445677248E1222712A7390D799EE3599C1353AAEF9C9E415E47DE66D639A4A4485EB8306B3C8CF1D88F45FA983D88780E382C337F6AD4FB7CEE01A451B8D5C061CDA0F47C65DF07EB89A6C61611DABCC89300E3D410EDDDD33AC62766F73C3CA9113B7966D2227865BC0A92C82AF48DD314EC0909D4ADF67C8127AB6B0CE3FDA8B60C3B06F2D8D3E07B4C934726EE21068DE20CB389540CBB13A5E4F67D2EA043589B95C5786F750D892B338A307ED6EAD08C5D34D15AA0E5DE05FFCCFBFDCFDC770FCD79F52A7270C1E732E26009482F78114A69DD0C18C4053C9F5946F3E13E222195268A2DC345B91F69384A6F6AA162D9F5D3D21E1B76A7155927ACA255BFD1E3490DD0AA828980FC26F6E45DD430DA134F5465A6C2684102058CC4EF24FB6A7A59B2B5C79348FF272AFD61F2DE3E32462832834EEDE53086126185913049E027F311A9163B9092664236E2D18D05CA7372EBC24C73C1FA70D86363BAC90A8690BB1C64AC95038A8B4EA28A2AA67C0CAB8839AB17D07C32698F668E339110C2FBB7236784A3A1EF9F582119D5064D1638A2786295CE136A06BC7134E41D2A7551A3F50A19DCD2A4ADCA19CD2A14C7271EDAAA22CD52EBE73B744A84F378AB02643DC7C2F585C2C7FB6098568A482A071CDC5B16943161D9FD8A1593EA650E5BA4748DA32EF88D1B7C6B56218AB2A34056F94CBA5CF91ACC94424D9D34649B3461C684D696F4719F00D560816627CB0A343B95EB7FA79533F055AF7A049D84EB8E9463047D902EF505261A4F5376375D91A62621EEFDCD0FAB99D04F60DEA320498EF9E903CC91D2146A1DA9B9EF35E3DAB0426FDBDE243A6D5E43C4BC9132C122324F7D7EDE12DE2CF7C8494DC0E665A00A1B3B019ABDEADABD1ABB76964FF137F45BC0DC469F4FF1192E4964DE5693BF1218E6113A2E00DAB3187AB105340E7F0781E2B1D24B2C10E180C64CB9293726FF6D1288607A020E260D736D255DA6B8305479D39C9FBC61211C8CB24937BC696B797EFC4DABD0E05F23DA8023ED31E010C15039B83EA566E4E76C72576F1D52EB1815B1CE6B4D67011DD842D2113F145284A0034D5EFD23D47D6C5A546659564C260D4AAD4623C21A5A0B265EDF7FADCE2BF2C6FF3EE01309C72BEE6EB4FFDA214004B475824BF384130E7F88017C00E9351099853F1DB3A7ED97407F0B11065B508B65CD60E35D8536462919CEDA4032639A431BF928F98D24E79075073D5234DFB0478473DB3FDCF90958CF2F89BF7CFF5CC3CAEBFFE00A36A2BDEDF3CF12C5A77D1FAAF7D11E7810A410A614C1F2B3B17197E2CF7358077DBA9C63F269CF755FB8C37F2FFF17AFC79E38607F32FFE13993AB7FEA11AFA8D4257A62942B82A12B161948B07AABB3A6ED63AE167A5F1FD02437DFA4AA377DDAE4CE9D9D0DA106DEE7205EA5BC037DE6935682E85F6822AB89A009F019A4C07169E2629D29392124C086FF06C31D8717FF7A067C8B59E5700492899096BCE28D0FD548AA94316E1F0F4C7273913F2048915E3011103668061CC1C73281CE50D6971A0E16E573B90BDFFB63CFA35F286F7BF9F8A7EF025DDFC5B9FF6BD54F04FFA1FE15C51FAFBAF1FCD0A920A1D7C5A5A3A150D6E8CD05D811A16A637812AD3FBC545EB12A685088366C0E7F2F081CF493230D335DABE4FF514CA02536DD18706A240A21B0D0D42213B6089588029B8E0F38D4188969509E1245DEB14490D64D0B4F94B48FC6F8321705001980DA14E00DF1AF037B29301A03738A6C2BAA8471FDB21CDCFC3B7EFDD865CFF9E14FAE432EC56709F7DC08E979CB0D6EB830FD47F4DFEB3D58781F8FE270C7AB7E41E3430509A59442699D6E871BCF0BF1D14CC68DC73E04418B4CDA8294B2122D11641401FFCA09AAD1ABB189C3142F4E8C4776DB418F79943A0E3548F63A36D189BD1C4D8BE5E31F115198ED2DA2E99EE24B57B9A5088CBCB8584CDA97D1449B4224E52AE935DA9751059311DD5E25AC10DEF687148AA6ABADF002A1C789419366F79417B8F14099A75412D724E466E3C8A64F1067093533AC55E80167199BCEC38C9B9EEF86D6D7575210D0F2686B0DA57B562E5F7F72EE4E785A27FDE579B44AB19EF69BD853F866C17C157C870EF77B3AD3F63FC499CC3997ECFB37A8BEC41941DE4B060393328129B2CC128E29315D9AE6A6B909F551F8D96A7981AB06C121EBA1FF39A8F901E951DCFB3DC2B1370DF7207BD782BF096654E3A71CCE8CC89F1D5C57BF50144134E6B67F0936410B28CB112DDE8A6315B4B0355AA6B647788331F21C1A51E12911C79F2FCB1645A032724B4AFF9645E28DA5640128306D13D56EF1676903524DC80965FC2DD23A64500B794AAADCCE2AA3F65B882214232A03267C207AD3105085324C8F1E9A749AE4F2FC81C2F4932BAF002DAFAD90FABC504373904B21188F140DB48E7B21AD2C1CADA6A42F68621C4CA059885466F8105AD54A64B4669639D432D54B947766A945610927B796456FDDAA66CF73865A535E03AD2B24B187C2FFBA28641D7A26E1EA1A2CE095BAF1FAF6176422B9462FC03659A1D63F025F23269AB6C7F4B5C833D8E648A2210EDADC1360196AF3325985C965C4E16FC22007652CB525BD6182F87F0DEB939F62D1BBA7A18656216F208AF656889B19AFAE359A40D99257C6CC8D12CB9A6A2B68AB207035D4A6601109B74DAF4012B3FF6EC17499653F3EFF1E0ABD255869C1CCDAE0C781855905D64A69EEB18B54A3B2BA96EA4B1319B75EF1231B08CA7B8E2EEC34D6BC6407BEC7743924C5028D7C4796890A571E165BC5F168935109595C514910B1E7A593B098E78824ABEB28F90005100B88B04482D05CB3A48A5EC0AFA268BBA38BDA969050A462B5A7A437716FB79D1A6D799EB344B98422BC81954334593EF65A0724236CB3E96769156F3268C7F71CE5F3B2F57355C854BB7642745023E22D06569E527BA9CAE595C4FD25641D5F0F1E53EBC4E7578D777EA639CCAD07976E6CCD494887610F49ACC113EB2E6CDDEAF1599260D5F86DEBEA4194AC47BAB0B13DF6B79A8B2B9B48A3298FB18042D2523DC6D22335B8D2E886F24EF0142C04824AC669AB935CD8E2D3AA05E7D1793A34671B834B7B367B4B8DD6F6B28409722588936B11DD7CB68EB9DBC16DCC999DA5D6EEDC7983ED29F0CD2439EF707C2DFF409C61F0DE7BF36D3E75ADA9379D779DBD3F1F2021DDFACFB4CBB5B2CFDE3977833B9E51681D37978066EB3C642FA820C2D0320CDE47ADA8310C30EB5374CB73599D1A0D6D381E7C2560EF9BA3B9B0BFCE1AD0532D07A3A8F5F88D127B19187D99C5FB342F637B213C9B3E4A30CF8838C0B188DFB29DCA416A06920B65C376E456A6AC630583AEF2706C9C76538E2665C21ACE3EB53E5BCA18C9F3CD2CC07945B1ACC80641C3B3159A12326B4C7AD69CBA84B3A23A5116AD3CA32ADC309C9BC29AED89ACD5C1103E2D1C9D596034C2A931FA6A80733ED154FFA706E279E782F383C6CF947C71260C54102821A71F8104BEC145EA75B2E13CE25C3DD6990A0B2A922FC434D1EFF8899DBC1ACB4A6645F1782809B49BCB877E688FE89722528B29A50EBE22A04C20AABC4E895AD89E8F70EE52C9A5C00A492D12AF25EBB64B0F5C0B69F15746078AD2E60251682BE8409D539E7DD47A5835A60F572DB56C72C5AA5283477F7FE41209193AE24511A70E05C4E007BBCA1472C9F981AE0D6235035C8401F534C6875DC9732C8BF4F6F3FB332EBA5C128C2834E02AC5BE7D102E8784AA165DD3C99A08022E6E31099DF2A80937B83EC1F5EA65963710FD0DA6387A4A3F01B73D7633D127299EE5973C06CA201863C42AF54AFE84A8D8496AA0AC15A450A9DFDD5C02EEE5EC992B6CE1726E3CAAE460899EF6596EBABADDD1CF38B401B5024860A42C9A1543BFFB42CE5D2F2258EEF1BF4D4D59A4C55821EC3EDAC29E897BACAFFBE55B8FFBC720BB33144FE85D038B73EDA4C1D3006D96B56998E1752F214FACACA74EF862ABC0289D295B0E733084A2C2262DEB5E67A50CE18E667808473101CE9A26C9C0121A8441214D0AF143D650631CD287C242B5E7AD132936021185C9E8C0842ABED0497BE70248D2F0F4B7A6E2F1D39CA44D39B17549CD5D79FCBE7B7D894F59ED4D300D69CFFC92CCADAD1D3BF24171A7DB9F73924560FF2878CEAD1F8AAE29F67F85FD9AF7A01F5E20419688D7BCAB680F08C4D341EDF3201C4BB5A7128C0944AD722E8BFC01D30D82149FE05CC84B8D0901A4FD76BFF6ED82D3FAB77F14EDE735A2B0B8D67633A9C8B061929376FB5AE220C94B2CE52DCA5E9B111F8A5E0B954E19AF811921BCB4225DEC6973E6CB0BAFE8C51C2BC0B3FA351692B0A8AF77AEE8823DB10EF2CC1BB7F74EAB87B637774E309A0F1B5A4D8CC6A78C72438F8D4A69FBF0EEABBBAF8AA0E10DC4F33994CFB7CF5C6162343CEB92F587CFDE1F4267D7ECCCFDD6A03C9BDEEC1BE55DFACCFDDFE8812F299E6BD51614308DA097620F0A1CAE3747A50C77117AF257424858710C548480C856BD7D0C251485774B114DD4C293966985F0C72DA63C07698887049474448026E3027D99F6705B89AD9F418CD38922E9B03E426902E7303EFA9F8E3C94A8EDD53ACC150FAA171D46C14479138BA305A5B50B3497179D0DC75772C82C985B0FE0576C61A5D265DEA22A98BAB5B4529EE7242B663AE908EBD73189314D0BE8088C8036F8A906DCE1D62C1C2B9344F7EC517A2E98728B1D506BD9CF0E093D2108661D20AB4E478D4657F7E05D8E8920B54EEBFA74E76CC5BEF18E0BAC5BCB1C3A1A759501A9D505C5F829097D7FB30D2200EB5C95D056F350747D74BAA80A5C3CEF194247A3411D97061C5F404AD208F31F4049B35AA0131200CF954584C27177354948CBAC0407116475DDB312CB10BC0443CA78EDCE0D568DED8699E9A3241C53217537D7B98F970E28E5CEFB8A277EC14AB7829CA5C042851A5630F627C0DF4390424D2E30F4F66C448D48E4344A10BA86BB4C8361ADAE30209A379E5937A8EFBDC428A112EA5ACE5DEDAEF5384D53970C5DF8464214D0B60323100721F2C78A5AA61223AE17E820932824F3AC66FEFBD675156EDE59795E2C0AF160C2EC129FA08CE8193997A57DE2E056FB19AB2C993498A2519365AD5EABC03ECF222B55F27FDAE472F995F52DF55E5BB31A406BA5079DD4E5A7E9974AA428EC8D7AAFE4E15B0313166E4AB72BF6DB21E801F100F605EA75C7013995F8DC22681DF6391FF6D9107AAFF241D901A6BF57F84E8A9F001D85B87EBE2056D02CC72C01E89C91F8E6AC572F1AF2EDE8859171BDEB1EBA706788309A4218CEE7FB5E292EFAA057403B7EDF8F7880D35AA72E6F281BC27CF51E659BD639AED6CB027B74B3BD89F655B0054984C273AD35B37177A5B263CA40AAAAD9D40B693BE42DBF02AE7802AD495642BE9FE37C4C31722677374676D753FB66BEFBB60718EEE6C18CBA59224E92BA80332697F03C607BFDC6D6D1AA0ABF4DE24C491926BCD9F76513A61EFEC9D6C845FCC329FE78BEBFB0CC4AAD89ED33AE1FD159C98F9902B03FEA0B2F5539F4BAD8B43BFDE2B7D8B5DB3CE0B5D6CA2F585E75A1CDF73CFE1983C6AABFED6F76BB4F8049BC6654167CCDC305F3AAF89F28568609D56C3EE4BF4403F7FEC4FEBA5BF0444866A69D593BD49BF8AB5E6D9B67B3ABF308B41C3677068031FE59872C22BCE9E22530C86688B137D4D9E79460F6A65B9B66524BAA4A2D469BDF68148EDEF7D160F9768DDD2FE933A6AB878B5F7A6F7CADE4DCEE09A8467B3D2280EB429AA06773992F0215FE173BE6E6BFC04B71DFFCE67B8F7FADBDAFABF6C233A2E7FFAEE2F023FFFA6CF1270775BB2EF9C753BAF3B5BDD35D6DE31E72F44BC967ADDC7F61F5DC8F61090257BE9C02B7A311DE0A5F134306F574BE5C94226C165180015A519193566F2A6A7AF2CAF7871C8B204521B0190596A1C02CDE5D0F44A24088A6833C802D5287905675C7C27ABC79A04AA1400E1E4A5A0ED567B281759A37BDF85D628A09B0E489B025D0868052B831484728ED0C67B7172547400061E47784800675A35B463DB7863040D7DC0F0A8D0ACBEB18D6843D85B6845256CBD4B8D9BDA9EC3ED09BE1F4160A6C7E0D6C7D7B380B7B79018E0EEAADCF058E7D74C5A8D02B503E96C91395C96403E7B09B4AC0E17AE8FD0E0FCD8A2C1040C5BEC55B6C15DA6261E3D54EB361CBC165A0DE61A563A4C77573FFEC657D49770931621062E08D668CD9729A46D823A0CDF726A6770902893D5BFAA9AD1ED281CD640A006A73DC283D019F531AE95BD2D3374F07D1A12F4679857DEA710F63F512EA7C02C247CC8D59EE23B7E9DBC0C6ACBE92F0E85709F571C71DF415D0B445E868C490DFB2BB604CF63D003CEDBEF6C2E7EFEBDF8B3F9A7893048BD0E6689B2338A383FAFE8090736A8250BA1EE6F6F5BE6B69F21ABC93B66903B1CEA83E8EB3E495651E93D044D21FBD53718D396A104336F86970C4FA52B97B8D03B64C24C17E40F75A254BE457A466094EB6E2E5109D0AA029EEF4CE99FFF7AB2E482845751323095B2D4B7EE455A8857D7BC0E9573FF3FF8DA04BE9750A875404FA1852A2C5225FF681475C5794176A4BDEC2F9CE7A04576B232BEB3E064EECC51C94436C6115700FB4F68EA1ABDAAB37FDAE34321448A918092D91F3B2134366A4539B356034EC31B005D0D46C90938D25064A066AB719A0EC22DFCB670930B0D23F204B29FB117FE593A6D37E99F956EE409EF5848210A0F4453F10D7CDE69133B3C30ABB40523FF72BE92DE618EC327705B312CCF35EB705ACF3BA9217CDE8986519B9A4D3588FE12406BC3C1BF2B5D6B4438285D1828274A9925E187B56FEC38C677B6205A3575538368B7BC3152B30C6FB6EFEF58950CE73A232D041ECE87AD5EE76EF609B2D81FE8155517D330A6AB9EE5B6D20A12E76AAE06A12728F0819E1E6DAC321677F7F9E1CFC4F81B6A228EA16842871E9D0F9F5817E29E20BC4A13937C781115A878F6CA4B15E81D3B098503ECB27E87BCB54298D2DE298D4902575E184B4196D5B112700E6124B6AE18240415712E024DD47E855F59E018AC8FD42206FE72808A18E1230AB1085E7F74A479DF1411325BD3A2FAD5D2B40E69BF6BAA4C2C5B7D52F0B87E7F63013F25F9EC06421C09EC4859221DD3F6D1696A73709262FBAE245BA4CFBED6831B0889AE28E22182CA16343E10BE386EF52106657022A516814B61627E27ABE27C61A9A8D2396FA5AD4DBB93C3D039200DEB790F0C481B5430F8C742B6465BC1B71192DA378733C018BAA1CC9B358AC5AEC51C96B5AC4A0453037F68FA4EEF8765AE64E5FEF11396E51B631910B225FA06D092120930D76F793D27B3EF27CE33DC23182D70EA4DA51A43DEE63A21ECCFED06627FA47ED633B14153E8EA29963A2A52C7624BA636F2270BD16D23241B459F9EEBD02FD2544CFA9BC1AEC5CE169CE4A217AC2D4F00619518605445F2C3FD8DCDAD20098951377526797C5EE2808444046E9A680CC2A2B68D5779611CDE9D74794DFBCFA8BCF659F74CFE9137F3B51FA86EE56AFFDFB8E4FEDB7DEFCDF53EFF7FD8DEAFF9A3A4F943A871169AEC1CDFA5655E714A60B82DC926F2EE25C116B4477FC2EC169F79A4A7B0A701F3E3BB38BCA28CEA25325AE1EF814AAEB1DEC28BAACB53B9F11A924F5FCDF89F0D5B27D76D72EF8D13C0A1F7B90C3EC4487E2CCCC99C3E04BED933C30E88AE38D5F126AC7BF866FBF3ABFF0E39E4E3823F7F776F1F9D721303FF69F0DB7B8FE9032FBDC6707DB7DDEE69F1DC5E5DA443557C4E0A775A4EDC8CEF87DC66E9F0CC6EC9040F4E3F96A1B1A0DB1FDBB36193B86116F4D03875E2A9506A4AD27F94C242C3A8593D38B3729917D773543D9D0E0C5C7D1E0BDA1C12FCD52E93138266657452127FC03F1E00BAE4889910C133E25662A7572A2D3411D2F22C1F1564C1F187035A35F5D8B4C31D72E23A892BCE2483689194AA40AE3B11A1279FEA5FA32852A9F2713BB88C060461258AB154DC101878376575AE26439A9DB092158F13AF1163B523F519CE8D5D9668096B045AA00B7D0F9ED085FC0497A5B7BCF056A8A117E79ED7438C9F2A2FCAD435A48FA1DC596490E32D8A266DC8AFCB2AF4144C417561ACDEE4BEBF53E8C3D2588BEFCD4C9CB3DEF49A79F002FFAD4A095CB01438CEDF89A3A76021131102254DC07846959600C45881059D5025266F6F3A940606122DD7E816AF7A44A1B187A9D1D2AB2E84E0E496CE7C0A2C164819475E15385A16CA938D4A4824846B345FD6489A10D16E034D647335D48D55888D2BDC4BB80A133ED442C8A5EADD87A89D72C314EE416C7F2180B4167158603605C2010402977BB0FB7B1B96A8009A46A716AA1FB350FE3E3BABC6BE9102525BF3CA4FC469C5A79D178A4EB031DB468CD73C1105BE16D2BB894976A04AA5C366DECBD4092F63E225F299C0BD008183D751CC6A92FFBC298804F901695517A0E7EF346E1476D1C7ACFB5AF7D78ADACA121897F658B1938101542A5B146F764AF18EB27F0DAAAC9ECAB65A41CFDDE3D6F20A192948E41AFFEB03C01C988E816FD229789497D922E2F0DE5CAE54D7303C2F0996AE83FE272E953511CA9ACC805A2114AE1E2F62F6D95203306371D32EEE5EF7A2978B6333A50C4A13CEE23139A725AE9B5A344D0EECE87D85A6B91E1FDCBC9C156C6768AB891C4746E0D9A7696CDDC6A2E4D324ADA400E67E438AD39BBD2C6E02389297BD6999164AE90CC7177CBE744A9CC4166CB01676A52D5B6D360E8409DB6BAF8A3DB6B5DA950AA9D3C4CB719F57748367396AE908F9A1A04C94775F06304B0051201D0E23E8C62DC7AB14424611530A5E34F6EB25DFAEA70F68AAA92ACEC65CBD98ED4F4F4E56AF8A4E657B37EB721509C93333A7A8377A521D99654F706D9253423337C9EE8F7D43427FFBE0FC18DC0A7224795705134044DF6D3AD7521B267CD964966C3DBBF4497202B2CB39588AC7BF89359BB5CB54E96DF36865B2A9A7122D9F8B1591F7011D5D65C55C2369C44D6306971D69B398C6A6B8B68B755B9C165F8878FE26C6E0D4B492F2F9EED5AAD9A06B2756A9D9481941B2ACE5050BEDD4E2C59D45A695F0004751FDD726D6EBC598451BAABF98730EFC0F33330D75A6C55E1114665E61C257F5C07C65F52B25713F867B654B7556C6A4D9D2DB5B22D7EED6756F2CC890DFC6C66FB505906D37C9B55B1260C1E87F9C7C399ED8899C4CCEE90791CA556ED067CAAD3C809F36A5FE6D1728EEA7E661366EE0EA954C1FC60C4932934A2815F31FB8A3AE70346DA10AF8B5F2047908A903CE203A38A0E554ABD22CD4530E210D5CE686A3017D29E150B1839849BFABCE6DCA30A7BD9279D7E02B570B2786752E97D13DD00D8FF6332B2E2B3BC93DD3D97DE77F2F865EF7AEF065FFAFE13CE2B72C98977BFE3BDB4CDB393765260236FD93B5CF637814EABAC4A8128BD7FDE8AC83157740E57B5F0DA6AE892033E51246602FD811DCF25C9C89ADE4D337237185B02B91210D3A2C9E7EE4A754C54AE3E7EE71FFBEE4E10DC2951EDD11CE895187CF480AF1A33CF1461AAEDAF371D31CA9433147267592D7F4CEEE283A43C231D55E2728CE6F5D61272F793044000267C615A2920F71A4520B7256B8AB98FE1DA8C737716A1CC8C3296B0C8D0A3187047989E6377822CFE087269F21E7C926BE06A043F7ED04B3D5ADBE0351295DADF0954864AE004A3172856C85CB4B582075C4A2F1F9531A41EFB3F9245673D5AAB33CB779EDE27CEB987BD4C86BDB480D19B15DB94A60F0569288D5833469F27A92B356A999A72407B52683FD81C6043E56EC97F1074E791B72033958966F8528C7C2FC877FB6458475B196A1C0D39B7709542F911C175A2A0A18C14913FA6F2E7F25BFDF448BEFF6AF93F4BD0CA1BE44FAF2E6FE3BA75B10BE4E5DC8E3B8F2DDBF4647E65E4C79FC12336D8D98CF32B43575442456D1C49D2A7E06A2AF2CF8821A0BC290CD696A06753ECF4C65EE721A96E3C329D2D9CDF80204D80FD85D37EB102856669D2766392A0D3E66C952D3794EF1AD9657377D23B0CDA3DBFB0A3CC62E4B7AA172E4CC29F470E9FE6F4635C108060E3C2612E0E1D6328A4F07F7D0B3221BC0D2AACF828FA0B242EFCA5A3124A55B258CA443DC4B06CDA904F2BF6758CC22BB8432258D8DE8D4671B2CCB2FC1015BED61B7E81A948FA892619AC7BB2B465568B21983309E4C48CA3C36B679D823881FDFBC6469E21E3BF15AC4A57789770664538511AA0AC1BC1B2CC2BB54F624698088F3B68ECD5AAFC45988BD7FDEBF53FF7CD51E538FEA207DAEA2E303FAE37D4972C1EFFC6373CCE3BFCE0C73E12866CFE829937391EF24C2F2F6CCC5AF1DFFD2B069CC0444A33BED3512E691ABF07C6D66F5C5CA88DEB69694F32C52C6F14B21DFFF8E3974F5AB2330103F6A266398F104D0E5413614C99C3AE2FE2D7B786E93C1F8795B8C79FCB1C5F62ACA9497E5C2C2778FCCC1CF60601327E6BE4F8FF53CA668D5F1FE59820E01FFB158F2F75C8E5634F8C7F4EB1D5CDD102C6BF0FA8F3FD86EAA4704342164B027A35899DB04931D0BFD852204F1569728BBE222E1AA0DDA8B1EEE0700B4418970526026D2B4C25D064D404FD5B0C1791EA842B3D850F5D4EA826F5072BDE0F43698ADC1847F12202758A55EC153026945D0E23E5F69265586DA4F7993CE1A4D377433F5B76ED6A496101BC019B22B77377AAD5EB46B4225D023680D91DB53F39B1CADC9CE236C3FCC1A48059E88F9D474697ACA82A815E3766C27350836A46ADB19B77DF69277225FA47D18B6B6DE51BB3F9B40233C74CA313F397F0EBE65CA8AD353D4B35E7D4B8DD68FAB6A8AB30D3DE780C7F60151B09D0DF30C7E631A7CA97ED7AB1A4FBC18A8D5A62F9872EE634797B895BDF5AA46B453B726D2B9D66CB3ACF9525B28DF04A579BE0B266A9058FEDFC112338B3E13D17E49A07489FA64134599DEA002B8A7677245561F2C7F04A014417998D9E9DCC0D726F10EBE8DD96BA4FBD967174CDF0B44A5A406A0534E1DD46404300EDDBA605D04DE71C74AEF26591CF4F1F18C99F5CFBBD2D9F3CE3D5C2FDD357F6917B5F1802CF63EB7F5E6A62DFE291B71ADB9744C9A4BC99718C25DA31D4175FBC92BACC93BE8C2D2127F058B498E8F6F15A5F6CCC7311CF40B519FB95AEA142D2CAB3E7BAA168DE3233D98CBE5C03310C5BC69367F926D7F893D1459C82CCE799405D44CC53B9E746E77AC01FB877FAC40BB64142C0A87DA2A4C555E7B4323DC400130D8FF80BEE9A737B701A60690D478DCCCCEE320951A8C37BB04F57EDD48E4A0BFDB58A65334A36F0F03329D23F9BA0AFFD621F696707E406E82D0EAAEA5AA771D0D5D54FC110EE3646F7904CAA6F06C8C4E6995EEF194249441341130638CB6963C80677164E2A74B399D0E02F80298FB5F9F988AE18756CC9437ABEFCB42E3E04C46DA5E5B26C1C7805BD900315F95420CBE4B608E5E442F9FC563C1D2FA1D730D55B37B5E1E64CC30A9715A6D4EFB2B3469CB18E8C546683D59B4CA9ABBD32374B9A156430217B6B20EEA523263757017FA563F351B10926CB3592696AA9DA9B54B8EEECDBC74B541BED6A916592C6D71B9C180DDF969F9D2D4AB6627A98A7E64A4B5324A7DC1854FF4220FEEF787F702F7F23BBFEF5FFEF0BDD01F7A47625B7AB1D776BBBA9603AEDAE104CC2935A759DF2CEFFCE093E82E561483F48D69B382903BE117277547F1A24EE673EBE959DE2E3CB3A4A99E29563AA9D41660D6E29B2E53CEB23C4337A82D94CC2F8B19FFC0D2F4C18655E796887C6D6457F30939933DBD6D976ADAB82CD2FB215795B6A2A14826849C8524D71ADE288BB2F09754CC710B72DAAC312193E965D0259BC55B4E924D999C88A77C23680B2EBC73D981C47F23C1953903C8B9AF03182E8E64E1EF7E28480AF6C67ED30CDE62E4C830FE2CD06F5F5A0539BDAE7DAE417704399F23505A835007623D9E409002F1EF7D8D6CE7CB46478339CCB66FB0958388C3078D8E4AD928C82D2F16BD08CB8536B811ED003AEAA4ACAC9DE52DAC79C5305EFB1889348D20AA34A32B968F3A36923AA07D23BA69AE2B59BD540D328B8D7A019352110264A2FA1D411EF3BFB1D4024CA4D135E1A98166C32825BFEBD9B812AA7E1CF03BE87DB7DA33B9EA5C61F5C7D9558802F7C75BA034DF584582D29CD012C114B0035CB5E8CFF11B3C613B68CDA137AF8877C797B18D11CEC816C97995CC1AFD29593BB34267CC4AC8079B44EA95AABD28A964C65F4813B679C72DC004D68796C903B60B28EBACEB108597C7364AC40A23E6063DDC5D1333790016EABEDEDAF1ADBECDE8B74DC79F4D9C15127CF7AF7F6EFFD71780D08E3003298BC9412C3E43EFA753519C3E513E1CBF7E37FCB610680E72BCF441EBEA45D9CB8E0C3E6A9C2ACF5FB71CE64CCE87F1186D9B80F5E9D441ABCDA9858E503A8E9A8D67D8A4926883172BB2F7DC97CFFE0ECB9A97EE94BC01F8F205CCF800F31E374F883862871351BBB6AA65EA594E676EF7E7D48AABDECFEF460B23FEE76A6877F76173E5B6D7287872282B0CFE5B224CDEC8A84EEF95534D1B844E479F381ACBE12B7354ACD41FFB72A381D205D8799A460DECDB099A4C8D2BDB2E630868B4981C5EFF2F40A73C63F9E38E3CFF0194EEF3F18F0DA227B8B2273635F59272EE3CB6888326DEBC7BCB80F7118DA88D13892147B61D2EB08AA84B8946F0FB5A3D273776CF5A4B22411238A93EABD9C921D938EE082929367F69C17A3BC2FAB0F22E9E180E351F12CA4357976FF603EEBE65A076DE5B381632AE6E81C10707CD8DFBBC4CDD2775564D18C55133187EFAF62E3EE2FE331A7E3BD8664B46B56CFCD0C96713CC9B60BC4B526D8487B3B222FBF08E732AA05404A2ABACCC9F256A43C42435942425EA9E3DB3C7512ECC3C91654358848AE1A5909A3A719E762D73490B16297D2EBF35AB23EB97AD12B30624091AE025785967E1E6DDB87751C2CC3B6D104EFCA2A54A4B48BBE320595D4B59A0FB6949B06DBEDB6C3A6889F9D0562C4C8097B2F586048EAA44C141D531DBB44993F95A6D7905447B8DB63A7B42B403089D0AF0A0F3717A5CFDE5508FAD6CB37EC304B41FD657B28AC6B179731D5E1183529842E696D67CA562C8C73D6F2EFAB0B5BE3955130B4853AA44629C16A6946296333B01C6AE2935131E93F364B235AFEA2A424E15E734CCDED047D814B0F2D44F6FABB2DA355868489601B3A40B41588360051816C3CB6E8816A364EE6A4D54DC2BD8A1AC76DEBAEAA13611E10EDDB9B43F45E33ABB4B04E75AB80A09014377A9E2B18D6CFDCD96CDC7961B1AD522B1658C51B9C38C7E772D40B0FE3D0F14496E28E0B27B13A5FDF1948FC7B57D8DD87766D3D34EBA2E9C8958C96EC05E0304A2E6C8E17A09B01F6C27E5A35EE7F87227EED80F58C22608CF58873741E090DF64DF37E2E13D0EB9F2D0545BBF2B8D2D7EF3BE35998CCDFD5E9E2195411A2F0B295FADAF0283200BBC146883DEA290261668EF0494947B2CD6ACAF656814EF71D9507AFEA57DC9DDA0EBC6822B49515CCE4A8E6D49DCB2A7772A4ECDC5D1D4CB6B5F3EB67DF039E934E77742A3B4EF4A46E56A2B350A6C8FE3194414D27D28BD5DE8ACE01A8CE11A06386C00561ABBB400DF6A097CADF8392CEBAECDE4CC71DBCE0E4031A2D1806025BC01B1A84305527FFCA6AADA13A0E5BD97869F6D10AAAC962C4898F9E128C50BF63861D4E8E0A2B88B2F085BDB8F76D28C16E5C17812069C486F0B5DC2F5FDA87AA3A09F2999207F147F701A9F63E299F9DDF5E99779E6426C3FB54CAB3C28B42875C480DB3DFDB7B091AF113D32EA375F5ED432E758B4094C24C830C6F03A04D3A0B03D5FD0AADD21984158C0EB5427C81A42B663D0A90A6C5716F77ADAE95A9242973D0C202487D3502FCCF003E05BF65E95B3F768C9E5367573848B8846BD76C28F03BFFD087B8834369A1596F6667030A63B7374746EB2DF136444FCBD6E9781B1707CB4B0BCA50553D8AD9B1914275197725C503149BC2D64F82B42EB06DD73758748CDAAF28F99FF46DE4EC3325BC11D1E0AA4E6CD325F8667073B1215EAFA749B9B4A49FE4F1F80E19956192659F0E5D9407D99279147C6EC52362DA808F569774A623BCAD6DEE4D3B21570D1F3E8B3D6E380EF71E12B8AEFEA8AA47AC8D073C5F641FE60C730CB1FE05CA808F683D92BDD79DE0D79B3FB98314EE298E9337E38F17AB9860DDE40FE1E83EBB6801A4078F19A78DF0FECFF15E543468914EA0BF5D602E0E266C97EE2AF961BB808342DD3AB0FD9810B68470078CE89D152C121A082C0993A0A07D980D04F9F10CA1E331E9664C2F525266EA1ED51382FDB624754FE8C141F3CE0497D436FB68592828FD9F0C781D36A4CDE6D4EBEEA3F5A616FBF4E663FFE49F9DB051159E9A568E973A192C364A4A447AB00796B4AAE9B4391B3D845D11AEA48F0D9727456273627C8ED05D36F392407782F0FE602DDEFDC1139EFDC46F79FEB0CF27AF7DBFFDFBA24F88A11F9545868BDED16031DB8E4C150458C1E8BD20F7D7588FA32213CD9DDF93DBE23C8EB36278DF278111C91A1829F114985A399ABB6892A2134B4BEBFBFEDA95DC79DFD01C3D684B58AFC9DCADEC7EAA846FF43C1BC929F1246CEAE2606B2202A261055DEE0B0048666E06D3649B7C13212396B5134B7C27071B0F955D85F3B709F0D2BFC8F6A80197D894317A45C61DDA231BF84A24C2F9B37F13904C168644A77FA370F69BBF97DA91BB732D486E5686043F616436FE4764A0CC656BE86086A1EE66DDC754A5E956B4539BB6C2D75A7C4698EF57ECAF736609F5DCE728E446EFFC84DD84ED9D02AD8F58660A6FA70402083723F02A6D61C7D0466D267D274D7C07B5B2DB3A945576D7B75172EC589E9BF1179BE4772BE865B2DB49DEFDA7F557F751520B4F471BE502FE3AF57AC0CC1EBCE46098398C12A09526D9BD81D50AB2D0E96E1C5172FD892CE34F29539023B8EF5572DC5C5B1BF11793B576E95EA099A92E9DEFBF0B5630BAA56EC2B4EB677C922B84054617F4C0E5119524C8DB2BC5034EEF77F7B01FADF44DE43C436030B6E9873F6B01A301572771C46BDA655D7E0A895FAC47486F0D7533B203B0841CF6F1261EFE80F11592884A1D5C36781CFC1CCBAA8BC8BF917A28BC2E05F56E47A0F122B4A8FA60A07FB24583BBB3C2381EBC7CD987D80D48FD40EE540F7406C4B2C73367E33B71146C40EBA5BCB6B3A86048219D9D3CBEF0CF66C859FCADB7A328C7687F8645DBE3677256B0E3E0DEF662C512269846670C6F7BEE7BAAFFF0E06043DFD414F3C3EBF8DD56B4A3AF672154DEFD155A04CE2FA01D75E20BAE8C45387DCD3D6B42247FE9ABEB0D8B899422AFFF2055D2A080ED118B1BD6CCECDD986693C8A8A7C21E2077467B0B1D319AD1E0FC5ECDFF95A8A57346744DC2410C6E60A08301EBCBC89869463B06B6990C83A03C8A53EF82B559570822A20EFB16B42AE56120F0BC080BCF21B5FE9F61066F38318F90AB99B849C125A3569606BA02D50C1F903079231EE20202FF2E73B720D01051A45D9F0D796F431C3FD6953CB9204C08702D294C12045B04814B81C0380F0F463B6642DD40891CAC69E05C62C90C3520E6BE77F1ED1D97623030F5EF3C1D7149DD818D16E9FF9F9126D7F31FD68AA611527AA93F954D32624584B55DCF59082CE3F458285B48AC49C6F0FE210AC6E6AE236C22371F9173A3277D4E2496AF4CFA0F41CABC65D28D1F437DBA9555C29B1C41AC19E1CDA2BFBEB7D141558ED2E7D4E22F551ABCA83A5A66D5FED13385C9C1F7883A3F44542442105EAAEF1F9488B32E7922D2AA5C4FCB2686E9B30519E0E88CB398DEBF7F2A8BC60F4004D9B616223C97AD79ADC899B66989B242598493E9EEE6518A77303FA1CD1DC48C82962A7DA317BC745A7EBED998BFA551CFD0FB73443DCA3E0E70E3FCC4FAE9FB477FA32CF419BD81A7D11B5B8DD1AFC5D591C1001F4FC63609D43D287D20D453C0F0C73C228A5AEBAE902CD6AAC7BCC6F8F5570690C087F2CB6E167C646638210DAD97FD51F7959EA62CF1A7C17AF29F9B41C2681C474E805ED2112D392F54503125D7E37B1150E4F4A35CB742E30AAE237A744AB6734E93AA3223C89ADBC463E366EB6CFC3F55FEB3FC5D1B14FC6351F2DD36764DE08B3325B3DCF43E11E7AA7B8E2DBD7A007A5178F94D4E4784C79EFF6DC9F2357E3C2A4F8638236990F95A13842EE62F643ACA27C897BD60C886CDC3F73A7037F0183E341BDA087675D9A9075FC324FE1C13075533CD23E3BA45C7C0711FE821D0CCD798231EF94BB0DCABA82429ACC0F1D5F6920AB560FFD4FEA871318D8AC008BF7E30C00E5B1C9ED7444D8A8F3578755D635388FF68D477513C1BCD2FDAB31E52F052AEAD0E80A875E006F9D7B723B594342168568F6A7C2A55D934DD6917E1E733FF88510BCF19E5B85CCA4DDEFA3F5E3FC4536F5EE98616E402F20029050E83A15BE0A8BB2927661731FA4C45EE131471EE3F0DC26B88E4B33D3440EBB72F51D8F5E5541D9F14323695E88DAC43BD60F7C684423A213C905FBA46BD6A9A2C48C26FFCD2B5204A426CC9D30E7E048230685EF4B370E803DEE5896A261865403C2F832D3DD54461DF8D8AB517743A74171A3EC94D1E7312EA81BEC6172C72777D8E12844607EB63DEE4A07573336577659F85CB4AE3C88BD9D67EF4CAC930C0177FB502EA66E866EA9D38D3E92F38AE167CA0D0E8B1CFA2456F69F1308EBBCD3042018260EA4444BDF125AB4B58C55853E09E13A230B6B3D84BC950A971FDF3FE6D44D14E8683A1AE31DBF781DAC1A27ABDA2BA533B6763CC281964E489A334B2286B8171E92A539B6EFB13591420F76DABA53CC507824B2DE8492AD75D6FF1720B720429C62721450B6731DA2C6233E06E263E220B89FEA6799E1BDFDD2BDD3F49F1D9F69046F573B523BD14A6140E88FEFA2B638C94999615A3E36D033B87094C3F283774C5C25488D3DB55756A67B4D3D8652516958351CC4117C32F1ADDF90028F8C65FA51418FDB39079745AC45FB4B649662FE80EA6B07EA2CC16E490890B51A5D36E61CBC8E0CE5EDC56E064D0C80A0B6EA1ADF1AB4C57593602D4E6686E230F3DD39821EC25EB7BC3A227D80B5E62E41EFF02193A38B4FEFE07527DBDD96C6AA33EFE3BA65F44C5FE392DD245447B6411EB1751711CE0E76FE13F4501128C5DB662BAEAB1231DC5101132AB7F0F70E3E2F846EC579A2F7130D1D5744BA83E91C8EB4B45A98B216CFA1731BEA2EBBE49A970B3C5AA1B1A2FBA69A81EEE4D820451F40075E15DFF78D677DDE74665433F82592035F1179F9F3524D4BA4AC685157AE4ECBD3439B1971D5FFF41E3204E1E7399D9D2CD08E162DFB76B2741763B5A5A162C51B0836ED1EDB9BF62F75BFD8CCD54C5CD9AFF6D89CFDF839B5EDEAD453F3BA8FDCA358A5FF6CA8B14E25986D5FAD8E1A3CA4678DA7F002B4B107F0F159B0B1835C62DA92858E1F5CA55C9234422FB4EE2BD8990B2BBADE412809C02DD005D3474857B331BF053B0246CD3849FB2D666C3C7C50681010DDF2595597D8AD47BF30A2F2903F8A134AD785E040A614A397D7F1197A278C3E2E3DDA3358EEED42EF4BC976AF2CAEDA100D807AB9DF9D6042D6500384391E20DB5B18D2AC94F7BE9E20A050042317FD324BBCFE63E5D54654D7D926FF0B68C9913DF728F33160A77F193A4C6009C2A9F95C1F910FC9B5DD64484A5F7D4CFDF7C0F87CB3E4C67A3CCE950DF5F69A6B1090254139F2F3F480A5EC3E8373F48D330F98E7C443F905F09E3DC1687FF19DB64C70DC5F4FA3F2D3DB116FFAFC3D068187FC145FE3338C82FC888A53AB0C475F9A4BB5DCFC617D0703F57B3EBF88227E904E1CECA9CBEF6EEFF793A62C80F500985B82A84D7BF32B83BD6E72F6144CFC2AF971C225D49018C095766C785F0835417E0DCB51E54342747FCC2D1DE6854689740017681395CCFA1EE518BFE62CDF91A8DDA0FC3178CB7CFF233F6C40E0550DC9EE7144C34206A1A73CCDFA9CE25C6750ECF6D062D5B8288344973FE5678F23C108B73B5E15AF01B49E48B7BFE0429A56F87B6580F753F426D97D7B46C97CB1BD2120F94CC3DA987B2CF44510E4D8D6C92EDA50854B5FEACE4F28E861284B481764017270D3E846A6633D017009CEF9893A6A967FD81312621B86EACDB6BD9A06F9E0552FCF75AE73C3266351203303C96A1B909B4225EC4506DBA1C0C790C59CCF853CD80EF5B135C673876BE22B68335814C9B1A03C984F90A6729A328334BB4FBA12B085E5EB24AEA5EBF634745416E2D532D9D9FD64930C1FF37D504A9058F4C4606FD257958BD31518BDB4F624A9DC3BEF23772FB7DA1D51F0AB47FD14060360C7F8942F0D4B0FC3363B3005B8BA9C88E6A89821541C7A9E1EC5C0E866A492870AE999AA061D4255AC3CFA6835B5638FEC59943C5DD1BA75EB55AD75FEDE9B4090899C75E339C64A63FEEDE360417A1ADE869E11978BD6391A70FFBC86387DBD76987040F3E2550551B9808D6066C226C3220E41CC95740B0EDC851CADF45FBFBB51FE35D11F7E7D5E1320B3D21994F8E02DA6123061A6A3466B2E09B7F44ED4A32F2C2A18D5247381CECCD0A427FA43ABBB899590DF680D8CB4A3D0B70E7F4948F50AC2A418FE0DB8E4B2F2FD52CCA576D885BC6ED6DD763554BE07AC5D6EDBFF3A17F509A2B2952E08CB3A9CDD7376F2964BC09121A91E3E2AAE130D266F5354F57D9D19CB9052AA512BF700D25720020130A59A9B3E1405B9914B129F6737F4BE4AA45272BDA7F30307114130EDA4210101D831A845E9FAD085253A244AC892ECCB9391051F00E7E2DF40F4689E33517F8773881AC808576426A166244855CBD114419B1B3BED2E2AE48E3E35DA748FC4F892F786249108B81B9AF04E0CD44E36D29B4EA2A6AE7F4BEA9FFA147E37E774E396519276309415BA27B1B13040733DAF6E044BABAAFDD272FE8DBC80903FE4013A3CAAFB9E9B3CD9F72F33BECD6D3309894870FB81B323123C3C127F0D46D538D8A8AE6D909C60EEA14A4F488E07F1894929BC6FDD0B1229642983160903F81D10D818425BF53B3FF9FF8D7AA1755C5E66DBD5BF7B25E237D0036E74B36773851141A132C0B74EFAA135411A84325EA02813131136DACFF8E220CA5ACFA1FA75399704247D4C417F84C9DABFA7EDB7B1A5675AB6E6FD1EE22E804D8EBCE40D1C7C277022DCA56EDEE63FE9E51EE0C0EA945367785896C4D568AFBBF88AE3B234014F5E26CFCD499A4E544E131D8D4B901C7099B4BE48C8855AF0EBA8A29FF9B6A282BB0B3F422EF5C4029E2D35930A1A32D9E5CB567FE3FDDF0D96995D49794784107F5AD840A1F4EDF98F96EADDA6B502343870C287F1D7360885EAFD577EE22454AF8481B52310F866BD5CEFB824DEE001BF73FBF9165F29FD2AAB341D4C286E13546E988F55FAAC230112C501AF799478DBA2BC7674CBCDF00EE45E2E2A242FA3745D07091299837DBDD951D60DFE7AFB2862174D641A6DB2D6FBF223EBB49399F2A79E9829AA842573CBFF4DA0E969B44078319DB422B0D154CF6DD94551D7D1C6BA6CBF9443D0BEAB7F30575AB16A4E87044B4A99EF1845D3B18F9A1A6BAF92525323AD94834D7F1D45D7785DC811A241B3036F7735085EE7C8150C04A72CD48F6B3949B55236EB2FBECF6DBD8FBD3EC5EDCAB1B9CB8AF3C9E5B0910284DEDE913D21700C8E6543F749CB4DD9781732625C4C79EC0E173574641C3677379F384F58845FE0938ABAE14F30C2C43C22859ED5C9BF3C538B9CAF3957D71168EDC343E957B4214B623A4CB52624610437FC6E25ED7821C72D192BCA189F5D79165D57B99AAFE6AC2D7626E8643FE75004B60027541888B43F04873AFD8BDC3A57663102B964F309FF97A2B964C050E608D1BDE3A2A6A77FB7E42BDFCE4BE2136B5E133C21E5E9C93E9F2D2695B726F6B22DAF73CE2785B66ACD0DA105D609D726064A0ECCA1F6064A090639035701D53B674FC532B3B10A24001012B90ED1874740895589C962B927E79E6C1028BFD402FF7FF8398406A20314C10F0ABF407FE9F6884BF52BFD0F34535F97E1E6FB997036D4EF9F8CD282BFC48CC3389485BCE09922CC8BCC533338781BC087BB5C4AC782C276D58C330A0B71272A70403CD6E49224C0602886717747A15E6B748C39CA8B26022211535C9672E2F2121D1C6FFDEC0521811B02A4DAE90D815EA9063663D786B72A0304B79ABCAE13DE66328044BAEE99F63FAE9E441DD64B5D2E81742FAADE0339A7125BF5DCC1519ED5DF2F0DE24678BE1E34E3867FD9B37C88B0A7951C01AD90B12E6C6EBE54FA530E1F3AF7B45CBD31A37035A5E164639DCABFE0D064567AE371F123AEBAD46A6F45033646E91ABF2D3C53C4D45697A0DFD785929CCD542157062CCA1837919DFCEE67B38815176F552852031AB0D7D01C06D1E3AF28D98B77F019081A0984EB3668E3EEE98C17219B403EA72A58BD8B12A8067CEB8E1BB368BF84B9713A30BDD3EA74EAFF7F4DF6EBDBDA7895B00533B76C16AE4D675F885B2629DCC122772B2C1AED6D89D47D698227F7B1BCA45D1C69AECF946A42615D118E63CC8A472E7F0333BDCCF7A943E3080A04F5CFB47ABB00405D6691A9F8DF2AB30B8364C03C1A9A3DBCC0D9C1191C27F00E2AF41DAB33CED3F473F3BDB1F4F4EB533BFD4F9DEBA92A1E78D31712FC08BAC1D9D78A46AA061D8F1409B8D3D5BC367356CA82E1CFE8ECCBF00618DFD4AA5D8E3E69E19AF34151C3601CD6D8F5BB8524945C14DFAA9F11FC02ABFF58A7228B3DC74E11D82C50104A605C33C561605E91CC305D6E73526F62385358EF2602C4F64550F95C58C100600571BE55725F869EA8C5252CF71BBBA9BF2EB6347A0526D8311FB2CAAE580BE2B12E8C76E0DC4627A8B56D93F77C355219A82CEBCDDF2E89AFB34632552E096BF782CE9205F13D005371567025603793F83523154D76E31749F357E8D359654BC9938729B67D4FD5605BE3DD37E45484657178FB42B11A51F728A64DBAAD156D7993E5BB528C19614D522680258D6173ECECC790FDFD39A59C1643C7B951BD48B8CC6B2822FE220C94F49B632C96C73A68D1D2FA09C81C408F490C432EEB8622124B1E5D92BEE124B94D649FFD8E3B33827C66C26F43611FD3F04D9410C4248FC1186115E3CEBEF62F31855E587C1C984C307D1DC1B3EFF2E801D9EE75BE8073DBB9EB5698AF7E6CE6807CCBC6A24EA7C83E563BB245ED43AA8DB4230044E301C6D2CEFDB580365C461A77F568615E51A372D418AC0E84316CB6BD06A6855F5DB862E8AACE144B1BA35D2AF58BB244F67559D4846D326B6AF3029C53FF70CA3695FA958139DA89C0023C87DB15D5C427FF729A9BEA1188EF965DF3FDFB2CEE96CFADEDA8750FACA7FBEB26837DDF946B1E93C76F213991E9DB58696C91EB7AF33A931E7F32D91A38CBB48B573DED7F8C0EFADA0B5D3A140988E0154B8D0DFB22AE3E89C92A8DDC934D8780DC6E1BC152F39AE22DB1563850C385FC5F6F371CF9281DF149FF80D8686375442DF0EF36D1AA2C06C24D3E5CA243264F8DCAB0C4E49A30CF9311F5F9AD300BF7B7CA14A0CD726B8454CE1C9998A6F0C188CE74E5DF24D4198EC17A0ECF3ED48391187A5A8FC9462A5CBFD8401B6633E1DFAF89BF6849AF17C5D1D73C5E66A836816BC2A89A682A187D86449D7D58A81261DEBF4273A5DF58FACC66969A89733042300656A091D9A7F8D5E42D769E72C9D31BAA6755CCF42B82E9CC54201F00E12726CEDB09103888424A2318EB5A5B3CCA4B82229DBB77DDB6B3DA3B7F916B03F8259046FA81AF4BF8F7B8192145233ABB348967F983B52AC10FC2E6208D16697451FE882AF37E88818E517DB5BC7E6DF5CCE4AB2550F7613A716A93A2E20A653638A9F65A3A37CD52AB6E512F41602AE3C44ABD48AF60011527FC276027CAAF419D8D5ECAD5C3C8C1CD559E9C951808C2AF5C0227D9A23EC0D7F71CAB07F794584BB83E50B1586659A5DC161E64DC42E6731D4B1F0F90CFE16C2963CAB14191B19457BEE28B8ABD6978859654E07A794BB92029AE75EA7F08FF570D0F8827D16B569F582361FA828AC938C8F165171781302E198138DC8274C1ECBA5543A50F6637FDB7B824BD62BC8AA718660EE80132EB967E924AA4F50FB99BD4071CB49AD8CAC0F0C98ED930C1C60062CB8F3A3C32B79ACA86C3D9FBEC53BBE4001355232901FFEFB00A3985C4FCAA1C68A2CF5A30BDD87F8E02534C511C43EA76EDA4F9EDFE2F6B0A7CBE7F7B9582C36748168AD1766F0535E87E5D997454950C495D1D699A152EE3EB98FFEB619D53C02BC7E7EC9A6BC2ACA38A82D0663CD258A49690A4C5E6C0167D7470DD17945B1696D2120881A00E5F28546D0C5A420C5E9330F9A06AD398CD1ED1C9D644C5B05FE2187A3335551C54CAD2CCD45FF6EA39696D004ADB8B867F03F7DD422EC8027F6945F575256DA45DD413F2A059500C6B12D4D85276D8BB70F76902DDF98C8218DFF9C6B04A19534AD3559EC3D68770C92D04318921DB49E58EB124909A084E7A6C2F86C152D064044C43747BEB160E17C6696B78C01A0C7353F1FDE12122E8857FD684D5B2C3F4A8C3F0A16934772EC411C33466FE1F9FF3F1980E984301230315EFCB075BEC52C176829B012ED6A99F1A68D7559A29425636E1ABD33168634B0BF63AA4CB15F500E3F818CB6F3D33B75FB8B9D5B1FB2922F31F3F8C365E71AB6D42ACE48F1A1C580748D23F1F85739C3528564E459814BC2B328CAA1A3C74CF5D4099D701128B2E6A79ED3254D9523641F52F5B66509624EC3C68ED5A52BF699361CFB20935CD4C89BD8CC7ABD5672A9FF92A800D763D281B6DEEAF54E4BC3274E9F6AAD357AD909491B061CB9741BD7ABF6478E8EFB3D7288B478ED95D685419B7023075AE76B9D62077ECDE3D3A4348513833539C2FC779281CD5241E8F32F5085041E37FB2287504BEF55FBFE60D992B9A459E1AAA1D030DF8A9C39A9CF5970FAB7A0927B8DF59A286F069BB3CBF3E7B2E881C6B5D12B86524C00AA8F651DA2A4E40AA021FA8FAF4ED2802905D6E3A9D87BC21DE3A531E2936DCFA151EB2BFE2195031FBDA9DA3F86D14EC57AFE5F82083757288B7278B92ECC37994674DBE6C711BB30D4E09233A1A488AEB3248AA25E9D8DAE9ACC12442D21A3D6CAB2A115186C6892C10FA8AA5DDE5F23DD3EE52BB9ECD1440EB2E925DBF47C609949C34C7927A8B23747EA14590D3D734988F683CA271A92707A2582EF5C1ED0C3A0F05511DD9B3291299C0F99706A771AE1D4C7515407181DB73FB744B0DDC4CD3FE6E5703A6674DC8E3BB78D29AD265377094588861E31925E6AE2ECAF7FAF4AC7B706BFC4C36D1C19512A3E26A276DFF128BEDDD21651A201033FFA08A06C4F0F3FBE6B7706D8F3CA597D3EEF112AAD14B7CFE50BF20C9DC225A589BE36C36232F898C07CA1B6DD9804464ECDC3B66D8B1CF476DFFA5DEC36656DA9CF61FC88C3EB1E04CE6AF83104EB62B57435D172B0B4FBBE5F9F580F0CE07485C66B6CB4C2EC38EDB3D33E80D62A79D5AA7BC7B9E071FFF2496A8DA070EE815E2D04BBABF5AD74F8D33E624115620058B96939225300EF22D91B4CC516F9285AE2D3FA8F5642A36B08F6046E2F48C7283F7F8920ADAAFB20899B688EA6A6D4DAADFD2859C2BB267F8C05339E7CF5FF4E838A0F1B8ECC593583C0E87622520F69DDA63105FE479D5D61664ECB46CB13E0EE198AC409E9FDE8E86D7E8C1B4A7C35F553ADF1670E69AFCD42AF0A1BFB0C727E681CD8F34FF52C0471E25FCA0DED429032EA751AF4B7E371EF6EEE9101DC8FB5D9D2789563F75440DF6446997DC21D8769F83C57D622291AF5D09B0E11F3A1218EB33851A9DB2C015DFB05B4DE5193ED794A8072045E3118292AD4DCA74397B0D46A1BFA507E975CE7A90ABD108C3443C9BC80CFE7E365C857F0573018B36D08B44D7E2C9ED3DE312540CAAC790DCC9CE4C810A266AEDE1C0B4E80253A80340C40A547F40894E3D992594A58E9CE4A6E148543124E0AF7D407AB6C3C9A1014C230ECE3171AFE1EBEF56A13E4DB7CA96F1F7E7BFF9BC5AB2174A6322F61C42798ED3372DEBB7AC23DAF6BACE9B593DD889D460271565EC04F0FE6E1C3FB0E87D7F8F643B2635F14B9AE5B1CE2CAEC7FF4412197122CB426DBC17A57551623BB0B0D7FA84FD9A6CDFFCB76A91907FDFE9A1E3FC72E246D11249A4C7EE3762A861840EEFB25B647A6C98759E874FDDEABA9BE50211566A8FC24941EAAABCA57C0446AED09FC323B16486A47A7F1E4FF4064347D87FA316CB0F933CE21A83A96B2BE3CD8136E4EE4EC38D2552766A7A1FDEA18FE8AADAE1A01D88784B8B0DCFB69C537EE2535B22E72E3C2119B3435CB6D884CEA4162B3F626DDF67A7E37595BB274D88805740370C9846150A1AEF375BEBBC410570D78E3F8917131E043AFCB8A3634448A4BDD3DC33E7B17F918083D7948B3A8F779C76BFC4DCD7002F366B14D1C5E5BCF5CBBA3FC0C868643E0FB944604BA0278A80E04A5105996667D0C2268B0CCAEE40BFC35A9D2A5359528B363F76324F5DBC139369B44846069BA29A52C2DFD42B0BB96DDE1E2E0F0407E0EE5460A1DC1C37BD33718E0D6F67EC534FE279C63F1A8EAB2EA9CE64893E09BC31D220AFD6A978CE9E8EDD07434AA6DB81E8069E661746FC053323ED3EFF62D9917F82F53B49462121AFEFFFD78304D9CA072487C3EE190AFA0533078780A8185F46867397D65E20B5CF6FC6EEFA3E4252FF7943046CC5CC038C7648E00217565EE23631FFC325B5861544EE64FB37CD19ABBE13DEA7F1C6B071E25317F6367AE3918CF883848D105E7BDBD9D8D2D2E65DF17683AAA15BB8F50EB30571A9322344F38029D6B1B0BA51A1A5CF098D4E3722CD2F984311B00B2FDE7DF9ED9D9EB3DF43D812C9FBA659F1B6ADB386243A7C0D26354A9D196DFED1001109315316C3D3D6734787E8D1F272185F2E782C0391429CC1B5B6D683881E1D839A60011CE08AE15F96FB9A01D66AAD586F83AC3E5BDB2CD29FD22D886C94AF36565E96B71916A25F243A251C4F8DC628C87266BF160667E7D07E534FEAD0B070058A15EEE52264D48A6C93112CEF9F004C2630682ED0564DA331237F4858CE2D9EFA2466820B03C0753F5398940E6BF988946F3B7EEDBE7A75A7BABF8D2A7778B366A78C37B4BC043B8F9298A3314CDC639382CE32765F2A43C5521C4AFE374AC2461BB7E4B3B123C7822044E4D5FA9D847884D20ECDA504F7BFFE55658CD33E5D9718417C7B47CECE62D4951142B1A2E54FB4F6D4011AFAAC938241CC8BDFE6F0F57E394B775136EAC0F0407E88107C86080EA6B536FB086800466337292C88B7DAB4832BC4B14E13ED1E49BF2E3F0778A34C02881B0A9CD2D95E0852CF8FAE76BF4426DF78058390F56553D5263D7AEC59D695AFE1EB6EA5D1E48EE1712724E25756E2D3C659AFE5B1C5BBE8C8B849EE7A5D5FA4CDE6E5820A6C223E475716F43B12B9B40BA3762CDF972295BC72568338B57FF95A5E31B7DFE8507562077D63FDFA6BA87691F2ACEF5C98DCE24B9B5E2C943BE1B0642005397EBAC6BA893EFF341F24A71125329947CEF74519FFF88E0615A70FD3BF34A4E231FBA15D64408E6E85570DEE19489C97330F64CD456FA74FC5FC6917FB70231A8FBE39479D51E160FE1A8FEDFE07E23B51B661675FB8418D500412166E9436D524E63F5C5C581D88FA426B7F183B1924F5918A45B453C9878A490085BA131A7E961C119576CF5290E3C7F4F41E7BD4C32AB17648B4328906BBE4DDA13BECBFEDAB26F50137E2275F95A4494784CBA3298EB0329A14D390708C80E6A7FBD58E5FAC4BE6F300B25DD93B91C0448E3742820E1656D6B59BA40619C58B4771B2304A6031A62182A9A7FC661F08AE027865FF42734D15BEDE893722821BFE16E97CDB6F81B16395048E0B1DB46008C08917F528BE3A7E4B890F3A9F313BC3EBAC212B2FE77C9789A5D07F76319280B4518ECD460046CCEEF43766586BCD17B3A03BD9DB3BE5559176FE92E37A085F25DEBA89F3CB1C233B0EA3FA6B250C9FD5A53227625F16502512DDB04280A51A1D7BE77CC26A19272EFFD7A421F1B7507DFA24CBF7AA3B682A6D7E8C0DD70271854A4CF2C9D792AA2EBCEAA1601A2A81767A3AB03183946899C873C2A0F5763DBAF02A157D1D0417C85AC030BE2E9B7FAD0732C24CF97AD1ACEBA7F45FE3B8FDCF0D6C22867AF4C846B336CFF05134A29100EDC84F369B5F03FEED18D4C080786D57F28F44176E1B907C230BA70FB87AC080147910C1FEF0329D2F734484A23FAD60333A94D71CC4EB7E666052EC9F0660F0D1DE58F1C014C41C490E16CA8353D0185EE2A197CF6427DC7DDB7AAE7DC872C5B0527F1BE4B6E34D1F2B2E635025196C3970EC96B5559920E25F45530ACEFD21F127A896B773075BAAD17447701E09E35B2C36C1D0CA229B85E7FF2DBE7F4307E537DC6E20464A66D1C894047675FD0084DDFF5CDF8FB8113D0DC382EDB6D325E1E7EE8ADCD5FEBB69C5D82D165DA9FE4D05A620FD79E896823F5FB81E8D282678D05CCEE2D21DABFAFEBB88AA29D7BE40B1DDA4D0413DC74BD494E5F73455365D4C89DA127F56504109F949A118227FC9DE1359F36F84F41C30B91C140951C1454F3B979CEF09F8C797B7BC681A2B58C39EB7CD5EC52555720F3D45E74C9050285C56EFBF4A9896734BAF0DCB1FCDF03FDE7062B26B7BFE25A9FA8C8AA38BB7125A28B39D65F15497F3C2339DD707EFB5700084789FD799872270702B6E47A31270F9A93E230B79A2F028CE99C1C8EA75D8432EB0950828DC662044FFADBC1BFBA068D6B9FE26B391A666DFA4662F81C77B64B8AF3DD1BCE5F160E27D67EB60001BBA0A1AA34F3550500DFD9B120E141FFE53B6916CF5D71CB6855AE838BE53E771BE376F203724B2FAF7676E9FC832A34C0CC4C856F2E5B8FCDC70FE2C401CC4D33AA8ED534D79161696E1EA11FD4A5F9DFD00A162B8F4E548EBBDEB0ECD085F10DA8F03128D436F716E29F22D2F23B04FA57E200EF2F67C4B5781EBC979DDD3FAC43E0EB760A41C6A22CE02F80EC74845559B44A59FFF1C2D452CD2DA6FB7C1AF4B513DF09D43531CD64845887A9D820D4EAE23C09DFB2BCEB75DC9CFECF0AA9B664049AFE18BF31593D601B5E45083FFE7F4D4C888DFDD7FC3782ADCFA406D310AA56BDE6EDCEBEE7FC673B981E08BEB2C23E0146D5805F0F084F46225BB6F96AD74E48FF436C56C77ED0FA3126AECD224A5C8F023E9B5AD69003F762482485332FEC35CE62120AA8EAF4F8470A0AD43B745CF3463099D25F6E2B181F08E15398A097B338C8F5BA03424FE671334AAA471C910EA61DEE47AFEC8E64E713E523FA0A37591A33FFE4C0DBC13EA16E101B4CC0E98A42A218487E7D981A92FEDD6BB89521FB8D4D59C5B6CBAD32770FFE01DBC0CEA7E7629563C70152DEA97BE2E729528F071E70D89BCBDCD6EC716FFC1F7D2787E91FA852F1FF6FA6156DFC62FEC005701663C83FA0CD7ADDC7923F2001A61CBBB42CDA19A2E62418DC8E01986063A614BF92C7EBEE77916DFF387AFA5F73E4CED512FB4A1C5CC40060CF008A2EA8BEBD72FB601DDA49B32D68BFE62F7ECDF590E6D29948E5A69FD30A606D9E3F5C41927A4C5784FCB0C3CC55D9D1DF147808C04FC3DB2AD13746A7DE69079F5F13267F5910298A28330E08755D1F63D804FB4F9D6AB32CEA8C8FAE7B93E5128F6DBF2A9750BB543EAAF59BF3B86AA7CC22F40BB005BF2FA1F42F9A97D5EBE0625E930B8B12895443AC8BB63181FC819D26AB62D3543A3E18A25575DC5C253517FA52EC58D09699D86E8E35B58949E97CBF11AF3746E402422A7ED6F054791A7FF25FF5D1F60ECCFB1FDF7664555CC664C52CC7221A9308BDC6EAE1E0D0B8BFC7008D9D3B233E2CE8628F9D5805DDE501D2F5BCC6F8CF3B1538B7F81494DF578C0A0499977A783074DA6808AC6190743094FF7A8A8BA27C553D306A6B246E143B083DEEAA3AC9411C100D8304FACC0B4140678D122718FF36228FB75D3A6BA95BBA62406DC8E56119464C860E7408CC91F5DEF8EFF27742009B0CA3E4B9BBE131CCCBBA91EF386A66A86D9CAFE6B577F49D83D93DE357CD1D04A9E38383229C2693BA1428BB7D29EF958697013A950445BEE5E0041E92605DD1FD7F032240783C4388BD2272B857BDC1D23F549DDEDCCB30B20ABBD5DA6213FBE4F57DA98A20892C85A8D6FD42244B40272FED7AA6EDBC5B0B5BEA3E4C84526C838CFF8E7B1685F6FCEC6BEAF4655CF380C5918D59E0074D81C0A919D173B4A65D5BE178825EFFEAC2319F4975EB1CF68A1777BA6742AF5E1661A819412BBE4A0179FAA5E9DE29E6990F6A1311A2414ECC7F070283A198E9E2B9FAC080D7BF1D5E28B3E85873FE374E1F57910B5774A9C4E1716509DD7B418988E49065409D1000860906497751CFACB4718B77DDA06BF06F8F48EC699387939C4C61B1DB5FB39673E818E52CF1F8CBF0E45E821D113D1F34545139343EC4FE388CAFC0C88E9FA1100E3A576C7B07B30AAA20B26F0FAEEA9F0FA2B50BFF8784FC3F9939D867BC92BFFF978C46AECEECEE825644DF8DC9625FBCF10E5E2AB7E5469513A6603FFECF7FB2E14FC0896DB536A5F8FDD562CFDFA78E38C17A85F51D828CA2F2425F68EC614B313EFEF85C9D39A0FC9B9E1D981E2EB56C0C4C81C4DD71F70ABDECEE7AFE1D58E018A05172F0B4414660826D2D19C48BAE4529CF77AF3F204C6080B1A6CC427EEF321EBD630BA7F72492D3DF50D7568351AE20E559C0F3B3F66AACFC866C26C5B88C7B8E0E927160401748CE28D7135FDA2AB07AD85E6AD365FC9C1AFD2E206B8B9CDFC60FDDD3029F7F551F0A4169CBA888A7BB5BE710F2918881CA53A3DAEF388057CFF7D5179A4B0EFB67D462E70646CABA0EDAD48CF455A18C490EEBEFB9AD355F22E8C5B538B9C892C9C6E7F31ED3AD2C7D6D1F3395816983816508891B9002A6F1E916B9CB00A9CF9435F944F2E2CEEA0B287545E0EBBE4816F68FCC00C1D8A0617FF8F7DB5D102438C9050451030316EC7D2930090BA620C1A01E712BDFBD17FF9D76A013D69E116C4AFA1701E6D3BB1F000F80B0A2ADFFFFABBE63333BF717B845928B3D6AF76DF36336E03D7FC5FD571548C919A1DA7900E48CAB55ECCF4FEBF1D8B7AC17C6CCB7B9B7DDE368B8EDE4909836A90439B8489D71A9E3A481A013AEC420089980B65B08C26BADCEA51488881F17E50A235462D5D708623C03214CDEE5015D5C94A093C8EA9EE7106630B1A329AE09290B8306139EC2AC282C240B9A4B1CC9398BC2AA3E987F488A5AB4D7BE88B2FA35E010AA339FA890D480C10F9DA94415350717C071EEA85C4355C9C1A764FB8C2AA3B8B290E600F2338F5D5C53653E82C274DD2E12B28A41F8166FBCED25E44038E0BC49C2C59456103B02B14F377F0AD61F20034EF9F8D03D5975D9F9846D2FB9C829281804C3113F1A0434DFC4D31915351549290351454D03315549837B520AB2A44655CB7F8E3837D9CBCE5027D4E4A3D00C0B2E3099536147F0C3C1A037A1104633719B8376548FEBE623B6112D2D030D053961314D03657202011636755044263CEE822E9F218D03E304FCDF9D04521093E7DE421A236763697B6759E723EE2873FCAF6FC8799BED681DCDAB1D1527CC253E8EB61E2EAE5AF8D32BCF92D51703167527CC0ED4927E2B40979270CC03B7DDCB10A600FD4657D9911CC4DE493571F50BEC40F59AE9FF23B149A3BAB348AB22F5A63D227374596DCA9C55AD3D5AEB7099BF353A4D1D314F1B5FF809B2028731149677FAA33793D86E77F4C535C32CC5E5EC75DD5F4F08E89B8FE9025BEF4274DDE1FFBE588FDF62E0A303378FE3A6BB1062EC7A361BEB6F1E8FE3F43A9DA7180194D5335B17FC398D585898F8434A3583F2B53ACEA67C8703171DFC7625D3D2B308664FC84B674DACB0EAE55ABB277814D1467F03D47A08F645FCE271274E0C09C54DDA77DD11796C74E1476E30DC7CA3EB0647CB6AEC2C8F0078E2AC8D4F479193FC25C8B05F6AB641F576EAA967DFC4CB80C08054F55EE5B054704C6F5BBE8A3682CC2BE6AB204E71F37C989964399A801553A56BC707C1E539B83958B898D9D95939B9D8C898185918D9C99CCD4C37DF7324C31FF1D55837BBFF275B6E27287B24F9A10146D8EC640AF9DD8AA84D6F294C20E62BF83EAA9B92FF4C860A685BA5D6534652C50A964985446FF489B1C2C68847CE4D7E341CE36AE1CC08BCD1B2EB7BC692E5721DA874F05F9B570740222C23E8A9C229876C270F87F8F77737407FC467CD91F1E0166F92D2E45661B10FD25E678BBB5BD2E973AC397A89E4F49353C1CD0303D47FAD2796153B79DCE09E4EA8F112D44A5E62CA7009A8B8995AE1F83EF010C4B4CD8020A99381F76D4485DEA9A4ECC5CDBD0A2079060B3E4AD5C900C976861A301DBBEC18BA33265CB990330213DE2F943B7F83BBA5374D412810DA0D42CC8FFB857D7755269CE8457C9F418D698A0DD3D70CD3E1E6E7DFF0CC05A480C3C3641667897288555C4C1A8439675BD63212BF01E230359410CF074075E70E05D19F58147CF05830F4A66DCACCBBD073565627AC553FEF0B008CB51726B0AD7BAA2511A829CBF19735E62BC447D5866D44F28493DE4E1EA57800774BB172C50F45B6153DCB6CDE894E30FF247EFE6162FD7B6ED23851551CE7D276B8DFECB384C758DC6027D0D59568B1662902E3783C9F8EDCBA4B692312FF4AA6FECAD0FDA90E17EEAF0D3A21B06B8780544A5697ED0649C7374881CE1B4B8BD281F480E133DD6C1532AB64949091983B01D9032F44F80E9A7B2406193C003A410C3E30E3B72887DB4FB410367C8136D812FCBA0CA3F58F92493E29888EB49156DA565E2CC362B1A66D8B3CE41740DA8066157CA3A0DDB1F05F0D3AD444979F3B83423601F0C40454AC7F8E66524CA7759F18F3372E34B8ADE58C19E6EAE2AEA15995F67515DACD0541804DD43622F059C190025E98F0F6DD0DBA53F79B8E130456CAACCF3C446889AAB0A262A51C0038CC8259BE4C1AA297B1759FBD405164EB6313C32EDDEBDEC4C6258A2A622C84199D1FD0C9D9EF948AE927CAE5FBF79F07A73EAF86E757A7DF2FCCE625D8A366552AF6B67670A877526C77AB3DD11CC7A0012E2A9222744A94B5BEC240B8198A7E4C7E6414FB96E849F272459815F19F2A4E87F34E449512D4395865CA288D1911DEA0B1A54EAA1818FFBF5BBE871D8F2F5AD8D0495AFD527C800DE0D32BD192BD8D2B40A610D55ACA6E294B666A7AD4412F7D5BBDAB9D565A270308688D404AD2CCFC149502B43BA37F306DCF96A9C970FAB3D663D06047BE613D613976F8F630603BFB8063B5F9A63A4464129E6FFABBF726DA1B4F244865FD3BAD3250E9984F196AED7EE93B10F987E6C7917338F434A3550D5FEEC3556F1BC29951F5FABE24E51A6422A85057DF40EE111E694BC8A8A9F37AC1F5DDDA08E0D0C2DC7D5ED42806D5522F82EDD39D9614CC19DEC955ADF487F63205E1AE727F176C1CED167D660717268EA8D4600F384FCCCB83EF4292D84BCA1ECE4E00CC8477041C947E9C2118E8E29E8EF09F73750F996F1C4D30221F25DBB43C5A37EEF49D2F6F093F5F8DEE8C1DCB005BB1FB366A9867DB7E1DBA7A072BD72A559EF0F730DEB6721EEA31206B56BDBB871D7F5911295A234DED45515DDD0DF71BA61006F8A42A44EC8A2E7993D9564FFD9CD097FB29B58E30B90CD2ADEC52F4EFE0D2AD055C059B18B199BBAE5D7B974E7857432D1AFECF38573F084C658C7D433B49921AF6DD18E934205A3DA3CB00661782B974A11D91F6AB7022BF3C33C0D4CE7C49D10F708178128471DEF693BBC1E6A5616066E8CA00591CD9ADBC6DFD3241D14F5FD4639C7F40B30120EC7980ED9362CB8117D43DFDA13893FD45AFBBAC356264D958B1DF8CA5500FD3FD7700290E91C4BDFDFF61B68CA0CCD67C2D99FC665938B4E26EFEB788678AF50754A1677C6D9C0D9273213BC510FD924ED51B65CB58D38F4CCED7BCFCD8B4EEFBB518DB09003EBBC1A87071DB3D3BC76C7E9F6836F2272C4168E5FF1E86054E79289D2D0427C446244F84D321892C02FBE2545ED9D614A10055A957FC860528B9EC8294B3B19B6CFD2A2FCE10A4EA250EF76C29B32CBFD02ED4068AE73A86EFA01AA744B26FF10F2B58397CD7D97BAB0793B7B0C22D08D3CEAF377194200F579814A9937775FA6E24664E1E7C20CFD6E6EC2A7715AF9F2D586CBB3ED946F2EB66B5F1C28C2AD58B60CEE83C8210EE0B00648472EAA739D3B2AC6C9ECF893078AFE00C2B71A35F532EA506D34A05CE3F0F81DF6FD529426DB00468CD328F2CCDF0B9219C57EE6C535641ECC8E61BE6FEC8AF48303CDA553F61623C6C12FB7273FD9F4EA12626C062186EC94A3A55FDF824E92A225FDF773853E472ED9BE9C326208EA8B67A3C8681F1C9EDAD94EC88C8A5612D1043B3E689EDDA0AC4978AEB5BAC914768EFCFDF3897AD0DE8FFA8E7A484D852C340F36AC5D3C6F372F5A09DBECCA99D6ED4AB0EBEB0B604360A5435C33F16C90742A08B7E0BA6E5AF890AD1D1DFBCCBE3E7E5C826EEBA1FABDC3B70FA929C05C3AA5F4588D88CABB4C771B8D2781733050966107B37EB7A2331991FADC6EFB7191325A5E8A29D1C049B071173669D34F89899E70C44C7AB60F6AE24976F789BC95CB2D74AFF3404636F50B6883C4864315E018DE0501A7D384CB615D24FCE9D236E0EFEE55D118E3D51BEE75BA13E238935DDC54066E02614F851899ABA0BDBAB7FCA5DD38213E651D7D3E1B3229D7BCDE23575D4CA1F31D4916E5E2D98940A3E2418F4A9D9A302D1551A99DC8D033A1222A27FC9D937E8A3F9955718EAAD08DD8D03F0372232005D031A388614EC67C70CEB48C89034A1CC9FE34818BC511C07F282C24920091339A8BF3CACA9B36600170B0D04BE378B47E1FEE475728635046C77FB7F2E58EF287B300DA77AE54235637E150E0368FCDD2CF773AF90CA18088C35964505ED0CCDBB0B8BC6DE05D9AA993FF6B9A428D7DC5F1812FCC499E84511A494F6C4E668B25D5984D37074DDB2D60BFDD515AF01BE5B07C25EA731A8049FA70E34822BB639811289444D6B3A85720197BBFD6D38EA2794CD1696980A5C6FE9D684CF2D82E809F85C2EB50CDAF183A682C2DF18B481412BB288050659A582B6CB66E3CBED567857863B8620A54082C4200F28095439CC55C1E51403F7C606DC82611A8107CAD3626F5806DB643A17E9E03324CDF4E99B25DE7DFD6E31B9B2AE87F8D796B9C99DC9B64C5F0A9FFC7A6EA7C4D8FC9C08F2E2CAF3EFC9F56FB1D345C0B0530F248B0B51F8894DD692DC87D8629989B447A231D8565CCBD114B379D4F1FC96A1B7E645009EE8076C18F985233AC798AD0EBBC061F3D8C151D17ED8D2399052D411B137BEF3473E4EA648FB30D9558DDC47544F099A5A64A2C3210E8C9522E459DE319B0DFC6B1309A1C14479620DCCCE8876E24ADFBA30590D5C6A7509C3C9857975AC823177B16452BA3078BBADAF2982E386996F13A1BFBAD93A8F5E6878CBBB60B381FA6CBA9D33D459F3609A7CB0908CBB85DA15A1CC18F230691FB6E1B8661422A1A78B787984709D19D5944EC83DB78F5427789D2CA2FB9B40E1E5766D9B0F60DA3414034CD62148A6DD5C6CEDAF3691CC7FA88715907DC812072D686A9F2ED9908DA0669BB7D52B4192E7E259BA1A68DF10758D0AE2206F13BE6FD747344CDEF1757D7A4300952A0140E3CA67E76934D268CE80A60EE3ABBF7ABDE8E3E598FCAEFDC6D22E925332F99D1DFE1D69C670B7DC34070F991A85874E0127A65B98228371D4718BAE17A2833FDA82A0AC583076FC35F75BA7F8E53AD66C69C5FA0D6C68C9E316A46990F7F45DAF62027CEDC4CED5E6D5FFABE8BB921C91272AE4DEF5D0F5C8D357EA1976DBDF05320090069DC615075DDEC822F2210E6DDB6FB81B87A5F330020401D38231A69021D5F6480B04C2C8F72B31778D102FBFD6F31F6A2FBFFE4D5FE53FFAC9072C7EFBF7C7BBDFDEC75E7F6B7AE7A59B7E764B950763E1D9D07231FA579A071CCB1B486DC46D288E95407088D6E7E8BC9221AD3E663668BE0B0E20AAE913755CBC1FEE8876BCEAD05E77B1889B52251B3331D7527B534F08D384B45A8C9CA0632FD30F52039903563ACD9785D44FCEFB2A1ABA711EA349250841FF75AAF4A07732889DF6993FDF7F7B529D8E10AA9BAD22B463AEA9A34674DD7948D70CC7E96B6EFE617A1BCE0F12B749234477229E12D9D121BA47D17437E74B227407C0B041174AA28E5A145B7AE3FDC37C5288E82138883519BAF51653AFBE42A878AC1CE8671E497AF0363908A00FEF4C344A6616860530F28EA22836C9F0F99A74F581B52A254A2272C5A55EF3367530528C110A9067DEAE473A0A7A09627D07C95DA283DC93412857D33752641A814CB05E95EAC999F41761F5A84877295B2C7D14A3AE4EAED104B8875A900A2779C2641DAB12CF8E6C1CB6013E99C2ECB7687DF7FC457A2B18ECFD6B30BA17F84CE25939132AE1A49D5064458C6A5CB3B38860C4FCF498E65CB058CDA23414F66473DFFA6054F6F51B4D56B2C8F0CD75300CDAFBA03385BC2EC18E6D4FD0EA44E428D727E230AD2E5AB8793E7857D1B04A77615CDC13B972DBD46F52D059F8DC7492EFD5627FC5867F1B7190199480464013B31351C918739B1432FA653A58B3F0ECB904201889ED9D94BA0A639E3CEF2264722E1B91552A49307E06329CA85256D0969B251855DE09F5E3F4F9FD36F22F8B67F078C182FC2CAC4A385D097CEF362F915507312CC2BBC43396CC2D950A86A5D31CDF62F1414CEEFD4C06F9A21902641A57B7EBFD310CC1E318FF509DD41F620A47DB5EBE0D32896E825838F8C6C1BD69AA5E7190696D8DA1B8CF642B2AC76B8E8D98B4642A71B88A6CCBF42EECB91EAE2F7646D4BC9045A6E738642BC7CBED38DD289BDD22CDFA348469B3B3E93D0503DCCD7A1D43F2A61F17861101DDDB09C1C881DA628E88CD5DB7CFBC3EBF127CB2C8DEB25D8451D09BFBA9309FBA26E03DB4DCAEBA540B4F9E68BA48696A3BA5E878A107EB352F45570C12B3369AF92E752E637E6AC62C2653B54E76D35C456C6BBE425DEC07615C0007053021C080078072D15A2A5D5FC1BFE65641EB69C31BDA6E0B8152EC576EFBFAE1EBE939E92AC187869C38E600E38630296A6304931E62715FCB91811337E89D4C9EBAC2E044E579964B8C714E68672C46E9900958E4128B3EAF227CB42317C60AE6DBA214AFD35207E1ED6029A2ADEE145886D7CA7ECB2D8A8B08719B59928C6235F4744859AF699637933086516BAC529BA2001484997C7E41673DAC40C759B9FAB17D79144AFD1AA5676DCF44BB0844838A61D64B5A058695BE899BDF635D148F660E43FDFFE154DFA01294DD1DCAC191DAE473A1B708014EF2942972E9F0E443D5AE86559D08950CEE84587DD119F47D49B3563DD35D68629CDE8D59B5BC48F5A95A9B10ED439D926BAB33FF2C74A85EAAC33A4B6527673C03D2206D8D6CC146175CBDD6D5815557907D5C61C67EE0854CE014A53CFBD9D2E5A92354C9D151FD7A48A5DDC679125B371112A85458CA2A442152B5A3EAE83D574E081D9B984D21AF191872A3ECF36102A557C1900AD5CF7A7BD655939B42368B4A5A5EC595B594DEA176C496B07505EB882D71EED8909833949C9B6CEBC2A15294E92C57AF1CFE7DF27FFA675EC1A8185A45CF4B3CC22CC2D1A836376CB6EAF259D3AAD106AE5E6F926C7D121E17D5E681259B87E786579552A9792FE22CDBCA497C65F889FD22774F53CD21ADBCA85213F3BD6CB19256F96227F358735BB4450A6407A51B797AB4E335166A8BD997EDE559FC79A902655315F1242806B1B65BB186F821F58F54313295657CBE0C7A786D35795224F5C601B6B36014C8D2CE865F0EDCD1A12A397FCA8FEEAA6F6D97C3E4FAC0981BCE5A78F9138FEA989337E9A6A1D190DF69F058728713DDD441D02EB1F74B12603B14517A56CE19527F405FBBCD9AA7196DB316EAD73C5DF9FAC669A676C432DC137F8CC459D1A0F655E3E1A916257412DFDBF5A59363F7363669DA554A7BA8C38A2039F11FE1BEC3DB93085C7D47A46A2DD45AC952CE45342791D1B19ECAC77B1346815678BCD6A583435D20ED4E5ACB84076D92AB15A045F4DF7586E86DCEC7881CB59E72B905BB218065E8B66DA6CA1F35B6B0F5A92AC1B87010062F3B2104AA01FDA2CE8A03FAD87B6F5FC3F3A04212F9CA78454227A18161E4B0511A869F4750A3C16D6BE4D18E401B16C8AD735A531275B9B37CDC0540CF63D80F058B5D852A9FC9C748EDF4002EF29CD9DF6C9022F4FA6BCECFDB4E312C1FDAA44D2A8969B1BA2D56678CF0400E796469E29A50429650964C22F2A306D4F6BA77E8D28B3D31A5AACC799E83366EE6EA4461A5BAC6F99EDEBBCBA8E12B3B3F7823B1C371E9834DF6872C73BCA52DB0E8201D94001E765BB946B5963DA3E1931AD7A1C642938E3877AC293ADD46F864256A2192AF9429CAF9464B1477B884A8A035AB568375D90163CAD917588FD4B23F52114EAF253843058E8AAB7C74D307B25D954B0A527C43A3EE7B458B24B1B77D4719599B3C3AC427E2941AA0632D53B855AE869D5DD05F79C7EE7ACB79554F89D931380A76F5F032EC11EF98150D6C512A6CFCE5F9FE018E3CECE52C73F7D7FD71842D0FD9322BD97C868F40014DBC7AAB0BC2A67B8BD9C2EC1281CA1016AD325F130F7DC36442EB6AE03B01585F73C8A663ABEE1E2869761BBBBBC293EB9AB66BA6C69181B4356D7ECF26B3A7F544973897F5E4C376C31964FBA06DA8B8E76F7CCA271C343C5C816DFB7B40763BD8C7798BE2CF83E1FC9782CE4FAE4EC11E38385C767B49156E65A451369D88F864DB015A25DB37107B763B2ECDD27A0C06369FFB8EECC9FAEAF770EB9CEF41F8332791FD26813153C37ADC51A3B6068F67E1B2CE97BD4A45C1F9E8D85E388D38DE2E07A1692E214BCFD6626892ECD4D19A3D26BDC9EA7422D823912F51896CF8E6428ECB9D9E88A3A201396822D50C389A36A660451D06AE95ECB8DBDF517F10A6EA59BD583193887FD67158D751B554C27CFF871F3E525AF0287760AAF094F0DC87CBCEF0684E4F4A25D59C7E44F31EF5BDFA12DAF65FAE60A753075E7C1BC267DD1459B3940CC39A6A11C1999A6489F0D585DFBD50C9E60313C503961BCB3CF4BD3AC163D9D216B4DC31EF7CF830D9E51CDD65922E555BB2C29230DA11665F52F8C01272C526C6B452954B3ED835C310AA734D797ADCF673A3084E0158865D34A2F53168AB1EED78619592271F329E322B2DA8BB34EDF962C45B034F0DE604CB36CBEEF6AF8BE0DBF47782DC26EC18687F6D5078BA1767DBF7B8DDA080DC05BC3E0E7E8D45EE355CFA807B4B95046E49D57052B1BA0A8E65C98E31C3519603F1349D42EE3EDECF2E555389FD9D2BF6EF7931BF90496E2D1FF14B92ACB3666CDE893377654E3C745DD1442B2812AF92C06D41C8507CC46753EA8F1F2E78A727E01B5F357CC72B0071D653499542EB8F784AA27936AD52328500F2CC305B3C2BAC88B7BB1FA36A1FE1B94AB45281DFC3C09E7D0549B7E5F42A8E857B5E40EE3E3DF95312397CB6FBC40575C75B72A49D13B5DDD56A9F718EE9E620F78225D76E93624B88A899B59D4D4177C315FC71EA2270196D08C9B051EB056BFACB4C0750B53BDB2EE5823C633187F90CA2F1A236997949644E208B50F9489DCBA883E45243FB5B435D1F39EF98B1EFE33A8CDEA30E5DB97A1C042DAE63DEAA8A4E134A9D20CBA710C12E46B8E2A3053EC6CA8A65B3B8F7F4D9116281EF07018C607EFF3FB25F7DD81F3047600A92D9AEDEC03F4525DF460C6F03AD4BD657C35BA7513A669AFB739FED04C3800472D56A0F8A8D2B9A28B3FAEC2B902E1310185DB04ACD05660FAEAA83BAB595DB69447560EBD13DFB98664DE1351F16D2CBB3944C64D605317228A25BB3484551B519196F90846BC2B72249B1FD8B3121DF4881560E34541204C39303493EE48A0C4A09B088892FDDD4A3AEC9CE7C048C9F1560E553C49DA047A804FA395FB04C69216C30E7A1196C58C4C17079F63D36FE9F62F45607AE814D26EB4756A4FB2490F32DC02D2C88A95DF2661171D4CBF28552ABCD1640FF8129E6FEB3765F2A21D4E28E1D6299D6F4019310B6DDB689E2F301343970CCDA3091FAD3B206BD07D9016986E1ABE67640149261A18991FD88B12EA84ABD6DF646E30E449D3641A2D2ED034E2802BC45B5FE999ED617482DFC6D3CB4BAFA5C1948B2606466A4183D07F95A58D7EFA4583D7030C99B2D35172A3DCEA3B5288DB3FC64C38CBAC6C7DBF3C704A8CB383046FA322CADE73FF6421D75792A8053589A003FDD1030771E2238E42E75F4AEF57783BAC6077495A17398975753D1394045E4BBF2291DEA8AEFC9892EEA2D472B56B0E73A2BED8F38E9A76D4EF003D3668349035123DF8A71E3D11C143168231905E84912E6DB117EE5F5A50A3AFA2C8DCCF45DDCEC808FD97ABEAAC5037B918A2DBE9113F54AC36956E2814CD4E2C9F34839206788FD77B15095F5D9FF1494271E51F33B9EB15B7F2D886BB92073F34445C0889EF87EB22C0F250BF6891B59562ED1E1150BB5784D3C68E2BBBA552C526D62A9768B6FCB81937D9FC6F175077C6F1F20C37708FB9A2615F990BBBDC6E9B6CF754FE4C5F2F943CAC7DD46EE6823EC598091EED5DDE480D73C3AD826E6B9AFF644A566F534534577DA27427B70987C4327BA3FD1438FE73ACCA68ECB2945F6B3A2FB21A805E7917F1C31697A19AB4A44E93BD1F90D2CB1FFFF094CCDC35B3E8FF16E19EBDD82BD6B3DA8794BDFC04E24FEDEE4BB30D0FC32DDDEAFA48F779C43A20E63363BFF441C1C2EE3ED74C88A1394BCF98A4DD85C8B9C070BBA56D24A5918BE846D475E06DA7C53FE68925276C0FE521F6A76ADF53E09DC588E7AA6A04754BB8C6EB290854382CA425987CE2AC806334FB7847A16366AFC3D71359992421AA40C6046A8A9498D9C29FFA93A857AD6764A5334195893A78F6A395F6EB6FE631DD8B6B94A06E0C08C2FD15C47CE0B7F86BEE1EA9C772C3CFBB52F9E5795DCF87D377CCB8FE1763E8D71DFA39EDBB4F20208E5BAA21552E92E605D20A65A9A8E02C3649F1EA0B01449607DB4C0A25B87333F1DD43338E503413D05D445F15438D5291438D21BC4AB52E9A05E723E506ABA8F9EB90D2654A18E88DFC375C119CE043E1A6B33F937EB761C68C908637AC78FEE306FCB21F0A88E707708077AE5815EEA31E8AD44A42452E73ADDE7802C56FD5B4E0E63F4BEBBAEF7535BBBA0B3B2D8F4054BC2D9600BDE1519A67DC44B1DADAE853709B630516F96B897A5B3EB030A83FEE0B3352ED4FA53B01746863EEFA81CC5C4D6DE55ACD6B1CEE7ABF309B6A81541610B616D3FB30241510B14F0296CE5CF73063B43DD7DC21ED775BCDE1637FDE916534837B99D29069030555FB84CB091E0774E527FAB225FBA73160EDEB058A9F9D3A9E0B6E7DB8A6F60C86C7AB7A807095273224505D6A5A86AB7379290AA4B4D83525F1CF9C9CC93EE291CC7C9D2CC7DF6C7ECF892C2B37B59615312ED8F1ED9648253AE60DFC8FD15F48D5E1537B54DA3DBED6160A1AECE1787F9ECEFAE3FE8D1A6AE2B6EDB7E8075C850EAC873F766A90F8CA755F6570A655A33CCC69CAA71E830701F213260B1BA067D43F0E8D7C9C2D4D05FD3B4DCD30D322C62E2D2B138B1846AC10B9528C1B246093FA479848EDCC82726B8B3F139F343760ABC33946F536989A9B6F751158C91DA80539CED71251A0668A555F52CCC90AA11433699CCB001782D0AE8D7BD9B4568D5A0F14C0C2E9E0C580CA7F774E3B683970C8CD0ACEBC93AA6D03494EADCDE0BAAE5EBF6D8F06924039AE0C0B9D57C53968D46BFA936FC31686DC4E16EDD6156CB9486B07412B52EAD97612E2BBEE825418F6841CB7D16DB51CCD45D0C145AB482FA3E49F324981835182AF78DF8FBB438C8B56A33FC8E345B6271B8D58B4BF3911B9E286F37A902E5CD602F65235E0C7B4C694A37F3AFC2BE9C148CF8B17D15900B6A2960A54EF2412DF1B091D0C46821F35582438845A46253E0B3DA7108AA32C684E246777808B83314DA213AB67E293812EA8FD4727F5B26E6C694DE65F25072D86A9CD0F7EBC3A6D072E740E85C30A47DEA0BFC46862B7E173719DFF3F7F02D6698082F09DF8B1AAE3B1CD6F8C35943E143A1CC069278CC86BF91942514FE8F881C8A1824144EE139EBCDAA579C93789596E8FEC0C66227570389DA3F9B28928DB9DF4C508AB6F3C4CE5D0826237D4C6777D06EFF28C16CAB455BE94C0365AE896286714D53449E14D0512CCDAE6BC53DC0E657154D5E3D42B55A19A44804895A6C1B792D22B89A3C8128044FCACAAD589FC9D91F29EE8DF4B392497461D4E8B41F10C946D1D0C61F09DD36CA6A94CC45B3D1D6C77188DC6C19B5BEFE044FA24F9E2ED14699CF9EC3D2295F8E198E137DFFC818A3196D0C446BC78D0E5E2E8564A9B7406C811D8B156D7D613101DA3ADE9DA2D0290587FB6D0357F3C88624F20FC72E8C72E41248A2FE0CAB6595CE35B95569C3E31CE9B626E6481550AE9CD954419905ADA9511F29C5C060781F12D0DAB812F6E035F7E8F825085DEF44546D149892182023466C2BA0F8366CF59C766F8EC88D0157D565765EEEB62A329814083DC4F7AA1607B4A8ECF8D15616899F86BF1A179A51DB555C070FCB5656353EC820C631048A823962BB9C3C69132141C09B3CDD193E0FB811D3F313CEF8AC1DBFE7105959B3607F14CF4427C00E8358210FC33824910C6EEE3B58588955250C1A193C082AB28EDDDF83A80DF17CB82A5C09D53AA2E96D89CA1EF121FB065931C73C13FF84EB50B21FB24D21C0CF7C061B371A415454D48EFBB9623635C37C6749C22B5AC2657681B395498D8F8913D6160EFED249CCE81A3DE512694C98DA08B1619B282CC7CA8B58117E87AE48FA745344A2D1BAA7BE0C72D4E4D49F8B49A8F5686758C1222753C749CE9B490A21308184769C24972570CF02E750D14BEE7C2924B98CE4F9AFDEE4F52DA5DEEDE8A46F59CD25CCDD8703670E9E4643AE85CC689B3B2009CBA9E8362E0B4866F91234B4110DC575E5B6945CA951FFACD2BD85D91551EA7CB8619DF5AAE1440B286AAD3D2D0D27666B2654F379F5A90EDDB395D6C8025241E39342E8485725A1AF0B5AA48897551AB14840444A061A339C583C7F4A323D029545CBCB75CACE5EC4F30C4A3979175E81F12948CA9A2310762FA907429C955A91D3A089A2EF760CFF2EF4BBBEE030F8569F6ADDD98D765D6788A49B9DD4CDD0D79C4D1D3C46A4367E1196761B110EE6BCEC906A9937513446DCE376485A554169E330CB425E9CC7C4EDC2757597CBE9E4A7500F38EBC826E9B268E915E056262D354D3C13D7A53FED6DA5B38B450555590BD109F14EF7BAA658460E7878DA18A911AABBBE5D35BE8AA3E19E2B5DFF7170E9544229C5B5B3BB182519BF68191738C599CC2C6BE9A4C9A6C2EC938CF5492F2BB398BB19DC60F10F9D96337149C982B8A7AB640A64D4BC522785A32DCC888FC35FD45BB234DD4A28F9CD6C5A57F2D89991D20367FE5CC4DDF4D89D6AB66B6B3624C39B1587A7F754C1A04D54D101D01E1354F05402860ED26857A6A694619464B82EDA3045BD491CB5F85847070DCF5DB61F960DCA090E3FF40FF7AC5512D20C385F21DA9DA3495697E613F7156B5722918A76281C430BC39D3548966CC19F8512EF93DC3EA811C51A4D042D2ECE75BD25867EBFA7CB25071DF46C052B4924DB12357BF4402D3722BB0D656F215B7274789D136CD858F0C866AB63EF46A24370DE380FB6522B84F14565ACF79791B5DE01B3A1CE3A34E6BDC3E887473BAA83A55D5FB9867197F7FE6CA0A2BB71BA66133912FA79BCFFDA0D5F242330EA48F1F0C8517EE6C07623C3C057F9351A8F17D68452D46337722D1E397F1A63E45D7893A81C98C6E67204DD9334B372D1E9DB6223C652F6E48CBFDBB967FE1A44E8115863E0A833A33A8CE4B209AACA113301499653388687B03C0719354A4483669C10396E56485010AF78AD484E1363BC029CDBED208281A9159328827BB0E9F8C5C29747C924B1C76BDC893D6FE905C390AB32785CEDF06849071C9F9D030A57AB4DB304D007F085B0AECC5E0B4DBBC5BC0D46BE06842DF0E84BD0A1A735887FDBB6D1FE64F8B66A494CB5CAF9C628A3DF3782AB1446DEE4A0F6088C5E8B473F022F18F62654942A980F713F763BDEE0B2BFCD3952E023CC17C3F6A605FD1CDA3682FF3E2F0AF70DC313E575661C91BF4865C863AD999B9514E4FF87BC38165A9A10FFC3C43C8300C843258807E0E3040A8D43F9BBBFABF28FFC7A0C0B9D81C2703087FA029E3D76888696EF66EE2D102C703E4E10DC828C3536A3C23D242A602A0E1CBBFFDAEFF73B5B85BA69948CA0B1EB152CB536E51793EED9A489E468448166488ADE8A66C898614BE1DBD22A3DA625BD84A21C293C4FF1BFC3858F590147C64622C6BA31B8EA9CC23D602C2511FBC816A4AD67CC8DDC945FA3C163C7C9A31D81B1D31E93DCFA618D26626C058F9D7B78F484B1638BB246C39212BD138D461E7B25CA5871AC46236B34789C90473B02E38D11B975AF106E371E9FFA8F6F8EFFD0F8D18FFDF8C99A0727ACA7AA45C5061EE304571A8398B63E0646C5E24DCAD42B8FE23D959D2933BF654FD1075F4AEF68162AD8780751C4A414CD2886C0715C4470740B8A7F2CB342DCFA0EC3A98C147F17B5385D42C51389DA586A832B2E1E3A5F5236BD2C6058AA23C5AB238BFBD0FBB5E2A5C6BB5202C5B605FD77A2F2463E4660E88313E237E15EE6C276EFCF246A60FCC3D493383BD1FE2D86A197F6EF9671A8ED89C738A844D918C6F18CC887A9C941AB8AC377F62651AF6E3B0C4DE5FB1918696D910A82EE1F86A79A91F2C8F0D00B5A207190679AC8CCC5B61999FA63A65FB6449D44AB4806DE386AF8F135FA22FE6E2BE7A0D93D8000208A0E61D9B7A9F72300FCDDCCDE79CF462350147D3782B9BF003F0902AEAD75DCDA4F363942BFEA04013032A6B2E098F46697306AFF27FD75403FDA81AF25F79E7E1613C07948683DE5EBF7E8F0ACF6BE596D277695E1DBF160DB18F8321043E2989B343AC018A1589114CD52FA59C2DC95074A6979A0374280D9C641A53D6C93A8AF6C96DC3EEF08E32B079A1628CA4AB05EA457E78CC93285A7289411C839992187173F82E0AD94EFAFE59F2C36C59547B8334760AC3B721BB8625B0F632545FE963114050D36A3311580BE3B493F32640CE995158DF6D66081D8C752DD0AF8DF802D7BFA50F534A84E73545C49DFEF6B67F1D024E396F170FD187C3F10B77632EE702190E027A547E8DF04CD8A9D774FBAEC49431BA7583B352725FB2CF9A02AAD63FE1CABFC02CA5DB6373666B91B62540F02D685B9C59C3E03237EFFDB4111C955E9B8C7F9DCA5DE94977BECC92DCB63D695BE518A8576375C408EA9F97D90F5E4420468E9F8F07E39B9529322E748068C707CFB2DFC7F0F5F4ECF5B96007BABE52BB11E1A1FDFBC9AA4C03C7100998A4FCD3B8DFFC520F66D07E837F050B390D2F4974AC2900E96C3C4D5209962D3884F51ABDE62CF0088349DFA68CA1192D82721ACA681C672BDF10BF7D7DE30F1699FA00E35A8B178DEF4A60E8A07469461529D569F644B3C404396DE91988B591A9524D6D8165F8F7CF090E70A250CD8ABCAD3058EE724C5CEA0EB88909AFC2CAE847A45E3597F6F01D493CC8A82722E4D6304F4A5862D17DAF954EADA380E9E257A0D1E13E84335471CA4324B840910E6D29ECB586656F03C08BD0F6E1FB3DEFEF05165AF85B75AAC47DB6ED0A94DF68CC4562B66E676BD49146E263A1366DC8F377450CDADBECF0C1D2D9F9CEFB34E9AA8AE052D5B65DAC90EB4ED8D83424C047FC6721601037E18212A7A9D1FE86A3835B73236FAADFF5713B02C70CBD64EAC2434236B16306841F6EB367A0336C24F392031FABD8AE284499A1DE2C072992BF3FC022C8F51C0AC18CD0D775C7D833FAA7A07514F184F1D3E55BD17906CB4250613FD306FB6CDB4275BB016EC41787166209110DEBE4DE2ED368D0D26E187F9A51A09FE6A6C7809248EE0C23334AAF30BFD88310F1BCD1AF55A1BFF641643734718866D11637C0DE6B660EFE9B8005C17FB1E6BBC68EA92D9264BE5246D22C7043339D5252E85286DE495624E8CDA4917575310F7605FACAD685F962F0640E66AA4DAF1DD6CD84C7AEA04A09C24ADFD070C34EB321FEEDE138743D03119714FE7C8F5B258717049225C0C39E52DE154A4A19D6F9A7CE0EDF42946BCB908C97F9D0E0C66D1181C159A02D53BDA95DDB033423117DBBA63D4513188CF7E7C12F269BA30165E766FB787975846AB2928AFE8215F4BFE52CFA56AAB34F7D12DAEA6A1A3FBD442DF9A0D1136F62475896A565A42252923970BDA9C3EB3CFB8405E3B71F660BF2AC98EFA98D638AC947BADA624762134755DA5407E795A0CCDAE09F798A925D1A0F35A378D5139689B5738682C493E6D4AEC6B8E5EA708928EDC90D5FFD1D5BB0370B63286A2A0A269868C70A0D8277D5AB6A2A35BEC32644DF6DACDE56B4C8701A1D7ACF3669E8A90D79DC322E7599EAA9DCF1424C0005BB88095B74424F6B0D6753BD58068BB38616A63E473A252793DE8EF8044AC604307B82B63AD1E625D3E2CA661EB0916B512111229DAD7EA4C849E104687B5F3106C875E209E7A687F151814F29540EF6986AFCA731C7A1D8CFECA62C0DB31E8C9DA64EA045D6CFEC91D04463EE5E0CA90F4C2FE90AC34E9F3D0FFDA5D4B60FE43FB109715A291C042F378D0040535E110EA902616D1A419D2240F1D1AD2E4A70189D4C4BF36C206E2058CC16CB176A02242533ACCE088FCC7831662500B0B210C6991102DF6212DA6D0B9482DA9482DAA6B2369205B80182C153B075A22B4D4C3CC8EA87E3C68E306B54910D8903603D1161AD2E60BDD8CD4568BD466BD3672074A059CC1467174602042DB38CCC6443B7631015D8E80CE5B40A7C7AF1314D4411B04ADABC5CA88A9AD3AB2F0C5C83ADE44C7AC2D472CA0E361266CB28E6678D0D6C5F7146D922000EBAA0D60A2D8F0BE49E9BEAA0A66A57933357A698F5DEEF75C23A880A97D37A81ECA904D2DDBF47B4DA7A7C80232B6D40630C0B724ED7D3C0EEDF3B01546C13DC2C3B5F3AC922DC9AFB7313C46098DCF525A7640E03225AFFBAFF2CF9CA4AB8247B01E4F4F62D5BD757798906548B6DEB08348F66B04223A2B29422D8EE7FB0564A876A0BC01C19BDB90AE376794B1F7E145CF0FC962177E0B862366838EFA37F3DB286898D3B4F6C85A344FE77FFE9A42F179EA50089A68999339DF3B6888C924B33FEAAB7CAE54026693BE68C5B334E1375AF264D5080D0B8CB3EE3C981E466BA65D1BCB6B860A02C477587DE33ABE8FFA0F905BB9F2661300AFB8DBCAF866A7232ED4562A16E93D1E75D51F8BA716CB136E0D481690A7ED380F9A0A815333F3222C4EF8B79035509F76AC59CC24C86A8BB643B663E482207A3557300078500FD0CF89B3F05CBF5772479657337A2EF4FDB1EECEF1785EBA15410B077B21324F3E0C22655C437333FF69934ACDF79D9E1D92A43AE734C0FB43A0A2188CFECFD4D87908911D0684E826544E59F9EDBF9E21AC1D3D4441F72E94C42C924AFB088281A124155D14E17EAB5C95233646D31AA7A0D83828DE06303039A6FFCC03B09958AD4CE63C422FF800CB0F9FD9306ED512AAF3125D57C97EFB9FDCBFA017CFD9F6078CC7C6BCF722CD3D2DBC12D92F40701E82F68F634B7A5037E3BF67367A5930E2A97385C000E25C7D1A4F1AF359657B292155B29B7EB88DF3BAC4DA29F10ACD67B0D86BFB3AC087E974B85310BF987BE744CBAFCD4D8B886683719743533D09967CB3DDD9B0CF0AE4504EA5CE76AE252B446CB34CB8D2F6B7ECC7DF3D6FCB152EFC082FA2397E928B1C06244F5655581E0D0BD221A41BC508123680FBF775FDD27359F161323A3A6A69770610D26C143BD449D07F11919F76D67A7A0F0DFD709EC45391D0C079DDE5B3A7336C075F31C9AEF56E240A2AD82CB4C8EB697F2DE1A8E5504C9F5377512819EEB7D975ED009FA9BB9D94845BFCC643D5BCBF0EC509A0A037D736C886A53740590028F4F0843539BA239EFE66CD4FDAFE1BA7661D9E930E47667A1F8663917763E2DE9A84328860D53DDD1E0470D2993E5C0F955DCF0C6B4A715DE816B82F25E3F03864BAAC4660847078223F385E78A1C8DF60628EAFF90B67448542570CB0645E3BF8C623E5790E302AD01D8AFF20E185FD336C4B8CD5107A69D964C69FC92A74D1C57223F8D0A574035C71FAEC58F4A83EEF51353CC45FCB43B0BC4CF30B2507DAB0EBDA8A8135BFBDB2E4F3EF0D7535F3C43F1023D0463DF8849C5C7D6080FBEB9D858AFBAA9A64B9BBB67675B752A776B9E1CF2E3F4A722C14E29FA491B2003765ABA1E6DF917C550231BCB9D658CF894382D6B9A2FED30D0FF4E1BBC4D8F8365710440D0A0277CCE6B8923446293388C86320721E35EBFC4CE7051DB10E0E9368B970E6AE4BF00DD0978B1406C4FEA035283D8979CDC4E135406BB98A2C1DE31AF1CC1BA2102A0B8C5AE07DBA0734CA525713612362FE3AE3EDAE7267AEF2EAC47DE068C47AC5D92F88771E2CE5B523BCEC3996083F5FC9B8172EF58A183FF23705A612E5FEDC7B05623622C4EAC19C2C2522F99C555029AB5ABF5DFB918BB193C9F019938318087F92C12D4EA0D9FA1AD09CC7D21AB2567FABA0D7FBF32332460964005037DCDF8311C2011B1D136029ABE845E59421EB747CF01A779195E33311C52609F47CFEEB044E3CF6D650CA394C51135143320BE4232A351626F5ED044AD2243C9C22C02A794613AE3F6EDAC18BA08F35484DB50629FDD5BECF0496FFF99E0C2B41287E9983FF5392C48A839EA54B5581F1840BA384583ED85800CC2A01C294F245539F28148BA89D51F4490DDF7C89EBA0A3DC4A53F85AAF92C79BF8AC96A08B3ED9F203953E4F4B585B072874E9F852A2034D38C1CD1DB6AEB0DB18336F7FD88DEBBEFCD683174879A23459CB6B6301F8C778A3771AF5092747D6FBA3A705C70FF4C7325E971BC9AD6E3711AC3962F09626190B3F28D64907C5B5A57764A71DC9E8383F23C10A56294A1A8B19C56782481A0B879D0BF1D6AD41F4ED51BF3E6849CC2056BC3144E7239446F01111646C1093ACE37E5AFED41583C6D242677170E960D5C68247F64EFD4F966273A0E224AACD6B923D4B48F7F9D4FEE225134FDA1C291E16B208CE27F803D609E3A853FAA4434BDBEA0DAD8F72056D401C94A60A7CFF0C4B94C38F1E1D5F991256C19E7D1CDBE3260D071318DAED5494E153F5420F69AFBD17117825C9502A79B33CF81FDCAEE44F3A5E4D0B6E1CF62E7300AD13D89CBEEE18393842E099729982BF65483F0B4A72E97433ACF359CC9F4608469179C7C2E62BBDE364B973E8534C6D38970574C12CD12BF86A2B1D84D29EFB34DB2AD749551270464EF04CB2AA0332BD405297E1227A160658A97A3F26F57E3197C164433F033A41665C79BE6AA121F81A6A367D8BD1CF0FD5593820DB3D4780811B8FC961099609267E83EB0AA0AD0F60D07041D2237DFE47EDCEE15705D62630BDD70CAC9648F257732B6658D207F4D2A4F0C3221786BCDA52C1F4F44A26B6F100C3AFF511FD9DCF0067FD735D86C47D3105DEA111B026E1E996365629AD38B44417C22AC31E25512F4245F755A59EEB0661CB870F6C8C92836C1C7D097F6C4DF97720E558D83CFA8DCB1C398D0E622104E2F4CF3C61550F9634FCE7DEBAD9A00229D5A2BC1E8D8EF03BEF4F42F3EC8A50F67CB08903C7C4E6539042E475DCBB1BDC5F32D2476C7706D0AC52D99DE0E18E174814C413EE66763583183F85DB8018D9DF89F718E5CA47FFE00606DA2C386CF0ADA0BC72149FA2058322AD7F6AE797334101103F6049F71D4F0C8B656F1A60AA458DE9F16E247DFA9FAE70EA65895D7C6A79B84CE04BB9990FC44BCCA5ADD0D4116AA8ED2D1532996FBA6D7AF86ED2BDC5EB93097BC32529E2046BC7A0605AA65487542BC1B6AA3C4591BFCA14C17705330E8B1EE26A796A30FEDDD208DA66B3A925058FB88006C71B23B16CE2C72F8C39A4FEC937A41782C81315BB23F49D5B4896610ECB517E9706C464AC4452900A99570D1C2B6530F3B6F44DE27C276C237E3D80DEB07FB4FE0B9EB4F6014AE0F825EFCB6A7E4FC98895F58F29BCF02C3B835C241A607E60C0FFBB5C7F9AD34FD50468B65364442465A9C38FCFAEB2C5546BFF81AF45C58B50CB96D8BC69EED6A594900C3304C6454BB0C16AE0D41C8602FD615A718EC3F9BA9C0499C923EA37EB776E82E5DFE9F07FCE36E0E6DC3C67E9001A1CDB5F53C7B367BED775AF745DDBEB701447BDC31170FB97D2FC5E7F6B6824E007B39739BE73E868F31FA7FF1479CC7B3D1A61B7F046EDB7F613FB3F0F91107B9EADF0FC4381C88C3821C4FE2A8399B58EE02FD9D56DD357D0FC3B01D02C7B071D34C9D0B351F04354CDA29BD2D6C1D289EA990B06EFB4EA2CA33173D20527F348092513E8D9E8E2E31C13C0FCED71B397C286DBBDBD4A2A1DC60795B60527265BB1727F73C46168F76797A21D553F50910EBC841C0BF539D64E55EB2B6689B8B97EB19BF9AA4928601F361CCD48A9986A7B678FD2F06150AB6BFD4BDFCD442830A3DE9E48FBC7F12B1DC342361D63ABD48582791D0D440684E4C79582036D3EA1C2FD157DDE23442C87A556C6A96AAA0AAD67B1931E0525A0FDD1644275F56A22BC2C84213B091D8291E8421C4C60D2926269A132619536C75C61EAB9EEB7DBBD7EFDA4541040A2D0BABD5E67732B801FA66306C1A60025400B41B80776969412E4A7E0A302BCDF4360E036314880D7C9CDB5FC123E7BA306B799414A713D217FE5FE76DD87587C4D7132826091562F388A73F9A683C15991ECBFDFFBC080AF040B1D191D0E063B0905E7868447B77669203A8EFFF831877B43F9D81B4AB803EA1D9B36C7CBAEBE7FB093BC3321F698E2DE3CDE8858EB58CCDB7B2BDCF788DC40C3C43BA097B62028C7A4D7C2E99CEAB6CB938409E937AE6CDF408FCFA015DAF0FC8559CEC4E34615335DE20FBE6E0CE7896B1E98926A51B7EC7B653B39B2B6B480D5D30477D3E18A5E8761C7614C0B2599706087CDD3CB94BDF23C02F6D7317805B18606B809A0CB6EB664C6E99F3BDEDC344E61FF6529DD7EEA6D4292CF77C363C46C63F9336F21A09D8E3C85C7411AEC81265B8A56E3100935900D4C7A7FEF638DE7D55F34BD1F79303A2C5D717ABA6C10DA44836668919B36D1A53EA783B90B192C19224FC90D948344067D130E1634D2228627401A84AD4D523C4512E4553FC58090CA2794481C347493030B509B49F4DBB4C9E512EC084E266310550AABA9EE0D50530B0C6ED4E6834DC09094181840986C637552C989B0E4D854D285EA73281D27581202F30DE5E7069BEA844A927E11FE3F45365D84C63FDBC3F2F41EC736310CE57A07508344121F6C1B212832D8A31D62C4C97F481D2C721A52D34466FFD1E45BBF99CC9AAD55CA75F7105AAA994534B8BF58FDE6D15744EC6E53D958C4F8A668928A74871F118ABFB0FA452C9E884EB7E9A17693C8D830703E21DFAD93966DE705D131D0B05310C51A7EA324297B3BDE261AC33CB58F5E1C9AF3934C0635D3E294E11BC428356C9557D3CE2371B07F4F357BD5677C2900250B5ECE9E2B98413D35DF6A32B2E06A1559E613BCF529EC12FD3A896E4FDE16C05F2CB3EDCA2B9B37850ADE2ABACE01D7B873FDE15272D5962219CD8BB85BB31469DF318DA721012B2C09FEF8D4E503EEED4D7C674084E641D54637119E5F1EFDCFD59EA04FD1DEECE0D46410B9F5A6FA67E0FF44AA49B27D586C964A211C22CC7E937E1C47BE741E101EB5FEA68D85D61C46719472B1F31D145DC623F15F05AD04640E46097920C4F8A339C6D136E74776AA6BD6A93FFE2AFFD0B1B5EDA126BE2DCE1D0C0C0C04AC8EE91576BBC296F35CA37BA69AA8EE188325A4061FE9CD43B6C534F8E59CABD131215E99F6F2D115C4BB281F71B45D94387B63599F6E528CA038DB572F5BA359317019FB87534705C9275A5894B6F3AFD165FEB87A3C649A492DBBBD8EE0CD7C3242C60E19E41674B7AE0B4CE788C91A67A393FC3348B0F40C83E317C62FD821D9373393DBCC5F0A3C0CADB9F60E52D847D32E530D3729A6EF2A62D5993CFFFD3F689A0D7E5AB741988A1C054956C71B83AA745510CD6836DBCCDDF865732FC0DE9B8FA0FCAC56E0994276CF4A1A1D1D84C60628350BF16A2F65051C788980BF9B16E515595E7ECDEA0DFFE8A81675B68FEDB83D869210DBE54CEDC5C0EFC29FD92AFF815CC5DCD1C1C9EABEF75DFD2B81E22C418BA289364D2D5A01FD06C366E34135E9D644CE1699EE72D11852D69C14DD6CF4483A8B1C56EA17D0A0F717FEE326FFC822ACED3D3DBA3B4DAB6284EB211793738E75432CDE9673EADEE6571F18A03AEFB4C95DC1B7293BBD76B73CE6766CA6C03FB863C10A4D93974FA05DB4D603D088D77EE47A18B52ACCD59A35C0FFFDE94DCB843ED5A2AAD4068EA078F1F17FE3FCFAD0BF3831281F1758B10D277BAE962DA5D25EE6B480368AF8237475498B59A9F1DC22B37A8DAF715F4AC55AA622448DC9637863DDBF409E4A6A80148180606A835615F9BB1FE6AB49FCF280836D7229B33616A1324D9395374C86EDBCFF3534C6274C4A7D1C0B852FDB6C3E1B070F354A9B5523A119B0EE8B63B1D013B23AB4C10298591106D0DA585CDBCC9BE5967EE07A59EAB05CEB3B15E409AC95A703814F058ADB57220A9FB32B33A5E3657EF531AE65F85DCAF68F46CAD482133FFB7528ADF6CBEB0F4B6E3C295ED49646226F6745A4FE776DCE85D4FCB3A4B4DDAA2D9073701F503F2EFB5F10AE7822ACBB3D0AE314168FC2D9E0FD1BB27A4E08DBCC01DEBBD4DF78130D23AF1D6F4396DED4E8DE19095E8B3531FF83F721984284435DFB387F541B2A37640096B763979CA9365010565CDF6333DCFBE6ACF10C37D40F78396624F582EB0E6FD362D430A3AA00AFA44DE43FE6CD1D77A40AA5C2F91173345BA3FD0BD1CE8971064570A8F41C8E7688EE2101F3B662447CBC4C4490051D824DD9D7CF10FE389B48D34070110C7E288ECB8C33A035B37C4F686117AC16D9A46FEC1085019F569192868F6D46D6AB5CC7F9B44F17CF9818C740ED53ABB343372FB3DBB930F70E9A27E6B267A0B33EE2BE468EAFC8EDCDBFA82EBAF4676D4BC737E8DCA2AADCBDA563C59B1FBB62ADA7C2CB1603F0D02A308E11937E262646C8C3B7A01A306248966D272B18C269F2C05F5D2840691E56B25171D7860F88BE0713642F17EC7F7CBDE5D900E4B8FFADCD328CD525D3100F971395B6ED12EC76D38AF154FAD3D8286BA1B4217A9D0240129328C983BA59EBECDC662ED609CABECC8CE27D99A9DD4734ED204B99EDD25EA2559F8B877B590679A3DF675B0FDDB5B3154349FBC68323272A39D711C4933A71C1042135BB80DA21766DE1E6F4890071D80203294EC5799119F0EE2A58F520BC53A26832CF17856BBFBB6EEDDB9586150BC4A62978F5951546F90C95724E7530C841BBCEF983E81F11455179FF62B9A612A39BEDA329B4938633856D04F3D3992533254CC612A712904CC058F26BAA081F6F2C4FFDB53E74F0C8E9B85DF5CB31D2F091985AA726DCDCDC3B22BE3DA49B1F55379350C04E8FFB823C1D1CBFFD0C39BAABE31615D1ECA69DB99A87244AA54A739FD53E096036E64A62A23A75FC47B4A4F7C22FA8BE534D30145D17E6B80B8311CD59926EDA76B069464C6EA757B2BE9313CBEE6BD72D47BCF620ABE46BBF9C07B8277C7E5746647C270C973BDB813273A77DC5BBE779DCC3DC6B3D408EEE1076340560AA2B51383ED6119E6279D5EC0A5E4EAF3319C7232D930B48C1C0FD0F864D426AA257B21974EF5FA95C8130E040594CC55F3134D57FCAF122FA0255B26F2AE8AFC60082E2A944C59A5476A01BA05574EEDB608D21CBC0FFACE50D9FCECF3549B39D8CDB5817D205A284D71BD08A6C27FD95B5FD9A9F255DFBA1751EC75C7AD357EF33D5487787351DCCC8F67E128DF3375293847E08B044D911AB9E009B186C1650B397FD136232981B8CED03EEC71B22502CC318EEB5E92D895AAAC97A9DEE6EF43676AB5B23325DF5FFAC46AAFE4754E77D131A01F5E9DB1C29964EC4AA3E506275B0FC7B80342317046477BB6869FAA7C65533E97EF529853252183DFDCAB77B404FB25DB2ED6EE96C7427D9C8FECD906D02A93D8D7B8A37D88AAB5EE82B844D6FC2358A4CFC8FB01BD0DB5A9DE9E8FEE9D23EF4F80802B40E108CFFF2931C87A6B23DF8B94E874576D039CED351D79BFFF8D47CE060D2693B5BB2FD74EDA7CD04C200F5D7DF049DE0E60AF3086B30B9E12A465A322A22B04F7CDC3129B27CDD5DD38D40800C775BFBDF7F2D1D20C190F314D53E1B59BC013D619AA92C4A4ECA9D874AA91B5C96EC3DFA345E562B58AA8D5BE23C2DB416AC3765A9563EE59A10E0F2B88CFE7AE38AB5A3E43C7EC001E4DF3B3987D13F2D327A72AA957E68088F26DE9D5FE9D808B9D19671DCA869A1B4E3A83B839B654548F01376192B7424E54AB04ED77DC700B3DDA980FF006A00B134704104BC2A07AB0582057F4860828531082899682178FE37579D7F51BA63C0FE70C0A6E46BE4170A405B8C514B31B4C7BEFE4DEC3EC5C95E4E5C38A1A8C745D75D814EB411BE5D3306B1D86C12989F8095A62F959F15547444036E725632868080E11775FF57EA5A9690D871FDED6FF6E883A7FF79FBA75D71D1FBFFEB02F1443A64E786DF5DA13DFB8523B6EA9A0F41640421F7119F1D7C36FD86E98420573ED4B02F827C63F53F210C8B5933BA900069961F5A84104445E2A775B26B3F51CC53A0E11B8728B7063B65FBE4E7FE3173D89F7303CE1FBBFE3DEBEFFEE7F7A36F32FFF17FA8B333F3AEB0B7F9F44B129F7FCE7F5B4281F84DB6AB9F4148B0447188D089FFADAFF81EBF3CB5C95738051A686C81A901314ADFF6CDE08B68523E7DDBF35F4CA53EDEEC42D54F3AAE5DBFD38F5B3788BBED71EB175FEB63371C267B6FFBE0BE4026805F21FB62B81D10A756FA14084F73CC044FFEFFE43A183A059AA7E4A72E3E053481FF840A3E10E8D780874565C7C0659316F9975C3A273B84B74176235ACDBA15296AFCB1C32C909C5A9F6146E9FC6FDB325E7DB5A566FAAB65991343244D5DE0CA7EC9DDA99CE0375B56D2110BDDE4D92FF3168671C38352E9B30E68E8D4C9E69A7938515F9B190FCBB7FCFD9EEA1AB81AEE3DED7D3FFCEBDE7FD0EBC8FEACBCA053A0217A701BE5E386207CD5BAF4D25340738E5D66308DD9716B67394D5B9BAE54857B068C07B55828A4F5BE4CC27A86A5636F0F25B0CAF674B5FD9D97BD73911196720C312B7030F17B1A281B2C5243631D1903706A922E9D0D8516732C0E12CB58454F34B5D7E435CD2D77F24EFFAF8EC55EBC34499A4C4129499C8E52AC40C3CA6D8959A3A66C2566BC33F0D6455B2EA019A129462A3D7C469234A9E66CBF31516AF5EE2385D808C97F99C929A0855163225F2DCF5C0E1685853CF17364E553845904BAC264F516BD99BFA25027191E57855A33AA7C74691B38DA0D7A1CE54C86831CD9B4C5D22CF8952CA1133E8B6595BC84583C937ECD9D4CD0EEAC24F5ACC02697588166710FFEFFDDC8DA406CB46641DBFEB26BB1DBD70D48DA6F42D4F92251E24688C02656926A9D59DE5324AA2889E82CC99787AE3E504EA81B845C860E4F75ECBB9FD418510A25326256BC4C4A7044C962384E612F82A79D74D37347D48A4E224FB55C05F4C46F6CBCEE83A71C31870A32D597DBCBCA209024F0ED04016B0238B60CC154F43A60E768F80A730160B4FC0E2D89B928FFBDF9C54FE603FF94BDEA8E27849142C02CD6F14E3CE5C9D7ABFCDE47B48F486B0F80A544DC5127D3A72082D9D740F1A51EED012A5340A22E9BAF00F83891C038C1CAA5C31D7067DFB9624052ED6BF0BAEAED68F028C5ED76ADDF631303212E0ECCF301747E13E76102B21BD6471041D8E997A29EF68426E225E7D8F00C905CE546A1D090077794E91DFF0ED28D36FB2C2520CA14224AB4149128049A580810795052A90914477FF888A88E0337B81CD7E060AD2D91779E42FD950EA3228B7594309AA20D8D1E35ADC9B8130454BBBC160BA7E807260F1AAC4007D4180EA9792940801ABC7642A19183BA22963850DF1AFAEE69B61D872590AD69BBF66EA3CC170A21D2B0E57A1126184E433B13BC8304460B797A3C6812740EEB7FD6E70CB79EF3A34E8B8C9272ADF3674976EA77F3A80018D06960CFDCF9A73F0FA9037475DDDC49A753739C17CC821AF1995C405FE930366B78CB70E6D6CCEEFE423121532F3C4F77B008A010EBE0B37104F0270674BC226F7FB73959E947BBBC2C13904BCA9AF8ED70939161E99C3A68D226918424CD4742E4490B9D527910C88BF0B0A0C14121F2BE24A0C1E64D1A28910781FC5954D167EA5835D02711DD8975CD99438FB3DDA59742DB519A00EA46FC9CAD568DEEFB6A218920BD813AA94823D91F69C7A00B8C6FA108D0F9C121D005C330E5ED00A48B3B8F037D37E409824F31077E08E468F19E85BA220D8317374F332D9D3A8C52D029F42B0A075FC70E984B8B254DBE3614892FE6BEACCDDC9AD9544A39D2FC0E80FE0D0E82860DC705FA9F808F935832E567CC334C86189EFE4B6168DB007C0478E8DCCEDD14300C86B7C2A4BC203D9D337F2C3F7450736F0BA32B00D5CFE2AEB798AC48B3CF85866D60F8A1BB22863A1848386A4C96E10AD5C5DD53286A62F7757AAA121E90F3633BB8922A1A1BA2F04A8886D271604A776D251FD5CB4C0CA46D1F07C66E4884F1061C07E47D982066C838AA4DEA08E35548442636A8DCA2239DD3C4E02985C97F16D0A4B19622B63AA9D5C7480AE3F17EC78BDE50440A87B5C71FB5FC8C8FD7F4DFF935E5FF86A2977DE176BF3CFEA5635B97BEE68608E0B1D621AC65202D262F3D189FB91F7CF4A1BCB5AB7FAAF6D8D5DF865627532EE07F6E9B1E82B2E685206B1B33B6675B032833342FF5C9F6BAB0556C620DBA5321BAF633099ADAA5E4850ABD85B26E1D3DA6DE1A2D8AC39EC24D45168CE11899D34EDEDDAB1295685F115673CF27A47DBF16BB3E0218679D55441D2F828649EA8C3A357103C98977B0BC77AD08D252F85D504402C3D7411386DCB754A2608254F65898186D54E2991C645996803C36FC9FEED6D206A220331B318C43F1951AF178DAF3EADAA1A252EA3F76D40633CBC7AE71C10FE84E3E1DF21B7A85DDE0C1E4E02F19EF3676B8F993F2CF5EBE926C32F081D9F2F54119ED1CDC276B742AA01D1652AF0F295319227982F8264C04B485BD2023B8AFBD9B99614122D88777B33E3B79DB02A5FF628139962D83A24ECBBB6E7E8821F6946F89EDF140CEEF7394BED90FF4F40F0134FE7BD021431F758C8C12271290D99E3BEDBAC1993B4C8755A6766829F030C611762C77910AD70816CC42CC4BAB178CD59DD281681F3319FED644684475944A05793A0A43F82B923F98CDE27AEAD54EF0F7EAE0FC1CB2D09EC2339EE66EBE467CCA1D931BD2FDEAD24B701A981F78DA9553F72F2770CA8467DC0F4FA375FB0797401D7AA7724F9002C855FFBEEA7D3D1C464BB8621FA21D46AB43B2942C35EFB42D266D8B990FE56DBEDF0560C24DEEBFF1F157274AC034CEEB7C79AADC70B24E9C6DEAB0ADE8FA8EC02B858F60EF684F7326AFA92620FFB693FFBDEE82B1F70D5368AFF1076E997141C554734EA867E567FFB74FDD92A0ED807EBF82740B417345DFD1FA0A0014FABA5B0AC1CA11E56BC67A1F18C0B01E088DCB6BD43F99CA73977F5B5ADAA97B8C961CF971031ECF2CBFE8B9DC01A0FDF2F3340B8BCE241E2C587A146FD669A2CF7541B025E1788A535AB88EB22D6788DB5E627C296C2EFE939CA4A538C94C59DE755CC7BDEC14F3B0769DAE03859897BFB8E1D0200D36853902D8398D82D10B732673A61F01A5B3A303E879D81FE21A908FAE7F0E130A88D421F39FB31CA44F5A6BDD301B4F094689682E32326097820FBE1E53379D7E1EAB91EFD616131F2D91E9061D8ECCFE968C0702D0F832CB41ECC872C1153BD8DDF667BBE20BBFA78084CA17CE92D484482A054EF310BAFB12B61B9E911403CCD99BC786D2473C7CD46E6611C25FF01FAC6186B0A52F00A8F4E09FE531FC61186681D6EC815BEA6455EDA70D46B59D6765D9D283F58C3D01B461D6283B3BAD136137CC77ED0F964D4AA3126D5316FEF1F31B3C15BEE34F09B6434096747C943A64C770205EEAA38376E9546BCD27B683735F1A18D24A195BE51B26E4CF693310248077C4F12333B3EDE617C8FF2C0B3553FBE8F725313BAD5F085BD9F1D5619E8E6A40C19060B885F274FBCD1B079402036960400313404088F601DEE9A995FAAF642E95F03795BFE802E4BFC71CB0AE9234ABB67BD9ED5A2B313E0D6A00A2C37F9D1D174B2C83602E83EEEB5A21FDBBD60D7FAD87A320E12469F37D77869A52BEE48D0A3F9B13106853580A451F8FC9608CD9FECFB8E46C917BD130116F7D3A84963D7CAFDCDC9174D8198EB9ED07978E6651D1E487544AE49C76463EF19596D1C6A808898CB25D3DFC6FD5CB857F8B7F9255FDF17B6128C20CD3BF85D2D7FE18F4E07AB9EA99398F5C817A5FBDA3C8551874EB59F3B0EFFC52B3348D31E40A3B0193968B6315EDDF5E27CE7C7E566B10156085EFF6CC6C5DF124DE697A44C92967405BFBC3F0598FA075BF0D3026D3CC47C8870887AAD72E265D2C63D0E0FFBB201C1B4406EEACDAE8EC3ECBD8C1D1D1C8C3278842A09C1DB69AC519FDEB88B4190EA80B8A8B5555B7C2D40C95BC4CB40A9F8F32BC99D857ADE16BAA1600EE957CB85F040473FFFF40FF4E43E75CE68D35D38BA271B0626CE1D065F3D1BB45952C4EB6BEBF2D27BB50CC049144A52AEA012DD7ADE05FB3F4F98BDB0B8EC3B1F44196CAA220AA85148DFB3CB8BE589A1F19C1D6C6F5BE91A6BA637D5800399C6411C4E55BBD1B232051E8BAA10C266273DDD73C891A83EE3F6DDE8072179ECC70D91935985FFAF1BE1D2C5CEA6BEDC281B1037E33AD3A376E7096C55C78DCCD6D5F83EE3F601BB63473BAA3F1A6C42CC8A00FDFC544AF6B7A036C9A7F5B83EC293143893DB30A58F9E4DC211174CF6B9839965B019BE5A4C8001704FB4753BB5F7F498F17691473C9ACA0A5A066342740FC504B856121A7D14ADAAD08DFD316C4DAAD176A0337AF11D6BF3115BF04A8C28CCD153ED5C5028DF128D3601CA4631C75AF4B052174F8EE2DC4D8CD0675DAC11F81906EDB0F01BEF360BDE2ECA550EAD3A96A987A2AC97A9A8BD36B33A5105E55233F09C726591B0D575923DE45B11E02CCB93F032BE958050B4FD27979CAEB0E4771F180839120E049945E5DC6699A42D26F5F08C2A0F53D3859A7BD4134E99C11F24C95DF59150614B7C51B0F04DE736B50FA04F9014695989C672D4773668FB5D8F92ECBFFCAA7EC769109639B5991A5D609AB053F0FA62F8A37D8477C99CD2C0A21885E6F65225D5F178D2F658BEBA48FDB043085506061B90DBBE79C8264B22A2A5FAB32ADBD589D302F891CF8D7C82F55485AECE612E09236A6BDB958FF12730D984E2CC87411A411EC7148E1124A8FC9F7E694BD7529F1046E7A306FCD38638009670A61C04B32AA10F069ED5EB9A9B8541841AAE35B1A2989693902BA982D718C7105341D40BD71F0BB06214526DC292529B399A3BB6D02B30D092963F29285F1977B121E7A8234DB839BC765167C454AF5FCC6B4E7713F2B2EC1053444083CFE419488DD4C28B9D968DA3322867A43780050BA68FED3EE86B7D1C950E8EC775B544F315D48DCD8A6D893A0F289907215DB2D60D81CAA9A04D3B4BB5271133DAC17872AA6F2C3C9FB2981F032C2BF5117FA9C27801C2A0C9425C4C095F14DBBC23E42C6C9469BC7A1F823A65BFFBC1E5699C3BBB44F331FEEFD113BDFFF074007779CD486F638B0F8C84F4DAB10DAC85D2F09D24E1C0FDF22D28CC846586A20BC48FC481F38070D24FA5AE8142B89220A317E482635E223F49B491AE583393FE3F0DBD4C2E10E10B0B3ACE2CD034E22393055B614F3441A6B7A8566A20E8F3205AB1D224609F9B95D50C7D2EB5FF36DF2A837259E5F7236A359889FE4C313B57240CD0B1923151B8DAD20B0443641097EE017E2EE2C3A30364B53D95BB95EBC17DFF6AB5816C46EFCDDD8D985CAA8A514967A4EC39208C9B77CC5D267A42C988BB640A33979949320FA02802B46CF5B9CA44C06F1D66EB07A7576D70F760DBCD034933799A22C9AD90E8D7A8024D4831C77E50F782F8D405C835F1E4AAB4C3EE8021BA9B9F1B7B52A6186728DED3050EC74A12AC13A05EE41314073717C9572D759B40DE74ABB49DF58A967E1E81E0953CABCA6968007CBD29769077C32D40FB8AB684AD47FDF30E12C97480301A3B3B158347ED3DFD22A3FA05883C5C23F7002FB2CB6EC6DD88207CBB763EBAC014911F0D3D6097AE908206A7EABDDCD9322F4F3CE039C6A97B98736DF61CEB764032185CC177597CAC7A4F467CD7560BBAB82C93CBA821CF37568CB218A0E69F0EEABC5017A4EA72CF76D4FC8A590EB18FEC47DB52F00DABA763BB2BFF439FF7A8FC725FC48C6B04DCA413318F31958D871B3EBF7BE783B3C7F8177F9CB46A45894DAD8096D767D07054EECBFD468237360575279AACD1D5728A24954DF5F61B374A47AC49DBBEB3FE793B8316062D82E6B366A804DCD350CAEF0F7F212C75AB4B6916E42F1F87D9DC51EC67688C4A076FF5B65CFB15FA51CC55F5155318BAB770EF7572FAA45276E324A730784C272D1C2F29E9BFB2E8BFAF3DD1C10B64F4AE54841C6ECB958BD12D3A5F5BC2DDB77F3AED94E5939017E1CC71D7EDFA4DC091A9920EF58D0045C93456FC74CCDFDEDA9F069E6ACBCF0AA4803F535273A504A46E92EF3FEFC3C455D7BEA0111C827F0D46DB3FF9E375F8F205577C533C3F9DAEF574AA86440BA69BA8BC1A4F1911881FAD923ACF07D5DF858C672E0486DD3EE2711B299CD60C1BF613A353B3536E7D78DDDAE63890F36E9911FC493BB5933A901DA7816508A50E6AAD925CF5F5E16B3EA7F47FFDBFC790C073370F6F014F5ADBE948060FEB998A06801B1FDD43873447F3F461F6B95E96C513E0BFD76291FB5D2178924290AA11A9D2041D6832FA26B33EAD06155ACADAEA2F86AFC643A9A03C4A5617AE92562A0102B1A626047A67AE1B3E0F1AC100EE6CE1BD60BBCE40C9050692473BB5DB88C53612CBAB7732333DBFE64538A6D981D7E06B739E3E3F4B5B8DD95549764DBEFB43CFB09DE1E05165FF2697EB336525820B43BA95BC82465C7339324B208AF206937DECE88858D88DF506DD745965509FEDC8526AD33DBC415C6021FCE441326BC978D908A138ED77D431A29C91319E64248D402F86951B6246D228080D7A28664DD6212E818872205A235C543846C970FDAEFA919C7AB728D9E27EC9098B4278906F81DCCEA0006A8CF84DA37528538F705FEACCA66ED38BC4DFAD38E2116A88E5EEDD28DEAE8FC018869F0C3AD63D2D5F3EAC961A0CD03A16CD882A2F47FA6EA1EB924D8D099580E0B973DF2FBFC001136C13158C3E8F3F058B9B5357A538813AC5B0E923F965C488D35BC68BFC8900747FE509A90FE6259D487A7C8A864F864AD633D625557B679F830AE30B034DF7927E0FE116FBFC1F48055D8F6952C72B7732ED3445210083D04BEDCDFA1DD9482A79045AEB9D5831DFADB2E776E054B43FF5C4C05922DF9A56A877A95511E6550A8619B2CFFE0D42EECDB18207D5F929565251E40CAA81144BE16775F23F85E5318521B6D5B0EF4A66BC03418F2565A87C89F014B1FFF33E598D63CF7BEEE079E09C7B0247BBC930FE89A75F689F91808A4441276D7C753B46C6F0608CAE0BEEDA833057AEAC5D23F1EB88FC643899ACE90B3978F5352F0971C6A1286F0351480961FBCC104F674A9E49FE5FE521BDBFF16F3FE6A1A5B934912C59A53932DCFC389EC8B60C502CD38D1EB4B18F95842EE675B89AF4C62FD2F1702B7471006844B118793D3FD00B997E269567D766000CA0FDDA22ED786897A023C6DB8F6C735676FF49401F8246B3600E3D878A6B91EBA2AC1493068B018226499B3CB50364873179EAD86B08EA2A1BECA5771B4ABAC7AFEBE32BB7FA6DD2FBB275B59353A9B7BCFD0EB03AA852D9151D26E2F794C4F9056E87ABA70E914CEC8B8288EAA7031E230EA0ABC051A002BE9C9DBA861D88BE0F18F11971076F1FF0A629B8854D7965D0EE11D06EB1B6E3BF8731A0CC4EDB84454BDD7148E266C5B24B9E863E31E5E16399AEC49B183FC0A9F3A585E1033804CC2ACA46F9C1E898635BFE74BDE3CABD2C64B46104E208399962BD65F4B2F0B9CDA0BAA4B5F00B02C3FFF1FA9DE74C6E46A8F4281C3062B4DC2938C3597A2A40CB17ED7E699A30338E8182F72B09B3000F0506A29A310381B25724AF6B82A72E0624B2E75495C61ED70ADB2F8112A09E22127B1D1BF5B2F3CA74A644A0D9B8E7D738A867D7B0979A1690D5754152BCD31A01D76E0FB0EEF7F8002E4A8EA7CD772FCC87E44E8BCE3D59BB2554ECA4F9665184E4DDFAABA625E2CF867FA5914CDACF514AC0D68F4D65949A8BDB9450B7431F25CB98220F028ABFCE0AE7F3FEFB14B40E7247C8C91C77A749D6877DE80DCBE59BA9799430B78238ED03FD94462B6F2D5CA76DD5E43D211CCF9D2782FB0A2871F12C1056FD9D50CEDB6A09612941C253FE368DFA37A0BE217CDF882AA2B1124C5D394F0010BDFF628E18AAEB508E41378EAB6C1534D0BF94509E6737B155AA3B5B5B63065D45BA7FDE917C6A8BD83A6701DA30D2B6CDBFE3B2C55E738FD8FA83F1ED5B92677E4B874E0093AB52576D98C074EA7220C13326300756B38BB8562D666B65BCA7786D7395D14B8CACCEA2FBB3440D821E15EB45468082B0AFE5179732BB5D1430F225488D71F033B21ED1CFC6F27B16656192CA1B66351DE72FE6490847125DA39B7DFFD8C0074406319BA8BE8BA3301ACA25E5C8DAE0F8EFA21BF06D8E8B1AA11EE4D910E4FBB7FB672ABB663DC8FBB70EB166E7BB78A886397F5DA8F275A740CBE3CB077C8365C4A25362D04EB45A6E5911A297AE5387D9C0A4986D9A45C506E1D50EF94FA409B873F72729C7791D6E9DD3C6B8B19BB24B822B710D0A54DDC1D68D8CEB890E58FB754E9C26AB747FA72AFFFAB9734878E70054080DD6BF307AB4270A3841706F9ACEFD9DFB0889BDF8DFC98163F6D7259BE23B053003DD271E1927FB0B8BC0E5B7ABA21A89ADCA37FF883C83D35B7F2D402A70A852ABBDACC7E60DCCEB79F812805BC3250C61B05A03261144204B404EB21D5A1AE6A3C6AA8A6D0D821FB9BC91102D280317D79F985C5846573DF5FCFA4621B05DBB5B42A438409F0C3B70AB11EC2BCECBFF99BB78978F434A0E2F9B3C8ECD971E97DF9628B3EC1B5CD6D4817D48800284B82CA8CEC852A34C915D4CCEF9A4B80B3CFA2C11EC35286C3E07D4AC5826293385EF63C01724F62092D6C7D41D6346F6C982C34A2AD419C743A4046EBDE45953101FE0461AE4FDC7227F73AC64A8912696760904CE3567EF3ABCF56F9FA924D74FCF5301145B961D4FEA61484A985B24138DCED71B062895BE1CBB742A5D4F3067B9DF57670236A7701BDBF2C452733B1ACE0FDDF9FAF65EC9728A8CBC2465B5B9108E6E92D257D5A2D01ECFD2769D3265CE97AEFE7A5A8D630BBB4D5A7AF1A7F3457C9FE7BC649D35574BFD4C247E1FEB6C1493AC1D63457FBFB8C6BEBDA73E9EB08252DCF009A799398272D81311326638D8ACBD7C23B26AE439D11908FFA21C4C3A8216ABD47B77F0FF8143EDA84FFD1FD735E8E2F8E15F99BE0336D331AA1DCFE44D9CC5F794E1FC06D0763AD9FB637610C7AF25D59E8C7809491BEBB0F9A25DF2C55CEA6218685F78E3174F15F016DC3C4E2736E8EB27EE02102A6514F996F35211770F1E78ACFAE1050C53B15D1B9CD20FB7A1701F136A8B2141A66B544F3AD1F94AB165951D68CCAA14FD91F4E739ACFE1D754AE22BFDB7B6F122859457F4283AC4D9300EFDC7ECD248E045E9C7102A72019DDBF6A52893866B0845F89EFB58B5A09C9D26D8940E68D5914511347813C6F44B6B6EA5256F0C42EDF9146D5B59DAA45FF13FB3C208265E98A5869CB851A22A6E8F4BFF0AE6C7184777561E44DDC1C4612A0DFD17E774AD67DD9F1494B2E7D23C8BE4239FCF1788F3477648950529B5B7E0EF291125813EED1D9F0B8875852BA8F21607049B17E1D51DCEC7F67507B104433997923E32BE96158FA656D36A18D662F4DC8CD79A97FBA95C90C2807D15967D0AC8AFD7D41C9F94AC09F1EF0F075B9FD4964ABB4C8FC074EB09A353A69DB0F11DE0B5C3565B50CDD9EE2F682A86BB44539BCF56C4625DBE3C4833557C360FB59065024B5A5DAC07A0830B9BF854BDCEE42DE929380A22AA6E4951AF753B151841938252E9D1F385380F73F787648B25DA1AF3B8B3D3F0C4C25E6C6163533017581993BE1B29AD5D6F38A2B2582B9088140B9F3A9C11A4482DF2751B634764CE6065D8426407F225154823C1BAFDEC446E7C48DFD66A105E687AA5D3ABCAB136B319B94009D0125015897A50F2F553F0F6DB1F5DF2B715C48907C7A596FDE5913111D34C0DB13FF7DDA0F8A06536D1EF037CD1890E17AB550E57BB70F74226024FB6408286467FD4E2261D95FA8A03D88DA4968A7AE4AFE802DA50CEEB4FBE571A9A9B26C5EDE9AB2180E398779D2C2F1EF3F587EED8988F9F2A5326FCEFFBA55BCDEEC1740BB089C7FA05A09B8910FEE0042A38F0EF854F2149349559D25DFE57F2C4CB852B7D3275E21FEA70376DCC55872B8CDA2A8EA770AE479233AD1EB98B29EDB81AD641285C17F719FE62E8152BC16A3C645C56F14D6693C83B2492F6CF64E8FA05EA4BC7544742012C0EA881FC4CF77C8F1B36A263F7AD1283A2288E957C004C704824B5ABECE0FB1C9D39205876BEB843CACE4402C80B400FF0327F7F581CFBD6C40831B727EC150D708FA988FE74979CE34F7841BBF1028B98706E2341FE378B8BDE4EE76721F023FEE00BE259190EA49031D97853FD746260C5B44980F3A2157D71CBE454E6D9B244C01EDE74AFAD2CF1420F8EC844501EA2EB144A75C136455BDB896ACA9864781FC6B77CCE652F74F623F846F0C1FDCB1B0A3E954B88BD6B538BCC5355D94A34FAEBFDDE2ED54364DEE3A7F439006A8E3E47124D4BD589FA2D97767462A7B9CF1B5F9AB32D7092E62E6EBA4DA13A6AB947C11F215B11C045DDE571E2E381E5DD992B7BFD44FAB61B90A0DCE1F50E0DEB4F89772383AF6D598D3BA10A6BA39B87B5177597D0663E1FEE83BB30BCB5A42B816BB3CEE8AA95A42FAC238D5A88A710CD23BABC557C68E36E95DB48682EF560CEB64C7982D95E62A529014E9260A6F1304E9F08303C6F77AB161DE2F61B7D418D917BAB9130C27FD36A72CB6C9F50B67F4E92117C2C5029CFE9386072A7473F119F41625E0069A7B2DA3EF26FEB1F82A9FF99F3435FF3CCF83AF40E0D4E96459452A2B0BF6823F4548223977075CA0054DFF8E0161AED1B884C8DA3AA0CD13C44A47365884F39B6C523F8EC9D16855D00A5E3AAE22622F5CFB6E80D18116C39B22ABDE3C5E074A369AE30D50954672E82DD5D88E0BE72AC4CE3AA4BCB3CABB025CD787E47B6ADC7F3D922086AB1415F8FAB4A606B21B6A5ADCFEA95DFE13AE7C5402E53A4B4AA0DF170F837C5A55A60BCC6DC49242B00B6E82524C6BD98A5DA8C94337FC3F30AC2D8F3BA064322FD3FF014D3084FE385D988A09581A4797D91E4DC9C559650478BDDEEDCD3BF16741185F9533215255CB38688BB30A61CC7B4D5970BA44095CF52664C8A4954775C019FC5D8DCED1A7E634CEAD15FB87CFB9E6C62C52BAEC8E78198EDFF8C1801DDF53E6D43CCE84B13C6ECDC1B908EE0FEEA20FD55F3B4675EA47DE78959A3AABA43E6D567FE10CB1FF9FE29579E0F081E58D987FFE89BF992633BDD54ED3C62B49D5E52F6A43F3FB28B1D3B5EA6877F762CABC9B6E440F939D20FE1020B80F9E520C1C0E5D310E280BDA826B26D061235AD022CF098D0CE29E5D8CC5DDA1297AAB7E59FCD123F3EE998749F5089A85D64BF487A37F5A44588998A6CB2A1293A606B37D19FCCDF1E377A9DB32DD98ED20C6C26697C1803737720E701D0DCB34432859E4ED6E6D64EE50E24FA0E0B03CCB34E65EE60FB0E0146EEAE9B66CAD1B0E33966993E6CF002D72D5767BB7D31E3C50B431CBF47CBBC58BB3D46D6DACB937A30B2FE422CBF41F5B97355E1E4D62EA86FDBD8C4E5615CB747E9B674EC0AD140770458BA3DB34B61A9E66B644E1585A6182272E8E724464663FEF858CDF304BCCE299EC19042A2951C0E25871CEEE8D5B50C09E232EDCB56E87F11257C1C22FB41E400A41BB1AA91E9F954C89B3CFC480DD0D3C6CF237E8A611479BF7049A6BB2E5CF7688880AB0172608BDB25F9CC882521716B3CF0CD0C30B0E8BBF2158216B9009F35A6A590DAFD463F8BCCE9B3E9B0217B4FA148C1CBA80191F7BC932994A7E4B989923A48E6961E672881863FD45BD31F6E6B3DE46BA5BD7907B0CB8437D3757221E73F99A5C547D2CB6076D31B7233FA07F3688C6BE14330559C795DCF194901E464BABBE02AC06FAD0D84DB74760D238D007BF40AAB52631F6FCC4581F18C07FADFEBBE53656E8A52DC5CF5C3AEE62D65F6C2467A8B7CC8FA6C81F6777F80CB01872C5A60B93FB82FDCA90B79C7796799DA28CE00A3132E1CC5ABA6C2809536C87DC4EC9259F68D7AC0D818D8AE70A06007D732734387C426365366B10F7EB531474E315F7D9BB55E63A4AC4228C21905A80E929A99948F04D3E4DAA68A1604B2D4F717C73F6A829D7CBA65793F68A03AB4C85FE48F975D8887378DD8FD33B99E44E73A73184DA7DC3A09415ABF14B4DC9DA38DDC1F9619B3E73047E4DFA37BD824B2B8DA6E491BFC3B74FA5CF9187EF80073BDFABB99B1133D3D444CB8535DCF7C274915DB87F3CD84CF0AFB7296212C4784B5E895AFE2C75EE434D1883E24C1D1084490B175890912DFDA13927B892D0DBD5F7B0F51BFF4AF3549374FF0DB2154B3C69DFFF82EF42589F652D0D678406ABA351F75A3EE0CD88A2CBCBDDA86AFF32F43F31F6A335D7AD8F5B1F82940C26F7776ECD7E1779E987E173A498308F1FE1021A7E487660E21786960B8C88E38A2E134659DAD3F0FC402E802387653D3C7EEB721892D0B4C136B1FB7CC917A2B38311FE40F6D0B2790CC485383E8FA57567D01F6BB48CA04CA581E12F68ADCBE80F3937D49B2F1BA634952B1EC1058785B77F463CDC817E8B8632D26E7777DA1195D1F754BD56784B8F32BADF84A4431E0DE68125B2E42157E8E3DCBCB33AB070C5542C340DC8910D6DE9B0E6D01B9A8BEFE9100405C312524A624ECCC5D261A1682A10FEBAD6945E26C299518984BA2CB26DDB2682D775389F32FC932362BFBEAAF0EDC0FCF76830BDA05C51158A3AD9FAB6A688EFA6311E49D87E2879AD77E7CC47E30769D33E592648FF37F0769BF2A9398F0F9076D0332C2590E1E5DF41995FA13017FFEFF0E49A64C2C060BA540B464FA49F281665022A0ADF1A00E4898F0E850C7F28D754285F7D3C980B4A1F7FB6C3185002E3710E6D57BE9C98249BF834D65BA0E5CDBCA88A78CD0D029CE04117E8C5DBDE83DFF6354EB500A6DAC037A2AA890FA325A108AFB62DADCC2BA5F1023F5D91F7BAF95BB75306B1CAE3AC5F296D9A274E2F8AE7CEAA202EEE20F71FA5E8AC748F0B2AEC3CA16246C461B128C6FD458526B86FB45299E6CDEF4BB2B572486A9BCFD9E0D74866A40BB47F4A85A4A8F73A9434C17853F02A0832F9EE72116BD6E31B1E36C9C9441724554E182649DED8E47D364F0403C4107848BADB95ADA1E1E5DF61D03995FF63C53E9A7F63DC3D5ADE282B7508E4AEB7ADFC49CC7E5A61211E0FA8522101EB7B8E1D1F67557E88B0E70A1F4CA0F3059A7D87B517AD908FA3C314D0E669198C607E2BC15D0F2F799D2AA920BBD3B0B82AC7887DC42F9608A4D6ADF8DBFF350383365AE545CAF4F0EA7C2CC80CC0997D75B6FE6A65C9F64D49B455AE08A10D789635812B3EC6E2D719EA2A7C2415294EF2CE25921DC139652DA6C220F7DDD3607AB2D2226EECF9174E22B011D621CD815920603BAA1AA6391A77B1DE9B497DDCB7EB57A3EFF015824CFE421DA25875638501A12115531747090DBE0E901667E770AD7C7A9C826CD7C972BFCE9567D2FC121DDB61872A5F59F88448DB0FF73BB67F5B7FA1DE17373BCB475A5615BF0205ECA646788567262C826E376D7E7AED74193043415AB42645D0AAADC1E64C62CBA2401E5BCE20E0C376D39397709FEE74D8812B90FBBDDDF86E49C5037926EB01BB1DD7A73FD398D9FDA937DD12B138E77DBB31D638791324FE9317624A38C1FD9970F3297D85B25724E9BEF619104E96011A82C9593F5B105DB4A3D5AAAFA1F1F3A3E0845A147943EE6BBA5AF199200DC2223BBDDC515EB5A9A6C68B18479314E19AA5383039C3F24F2514F9554F020202E78FC523B0DD9A04392E60C2F1C855BCF0713EA38A6262A0AF384F6504B8DFB1EACDE7FCDA2D8CBC2CE62E55B797BF520D3F9FBD6C7B0B8D99217F8F492B8CEDCCC632911732E045D94D635D49199A75AED707F2C9F86C4C3A9B0E832DA4EBCFF65AF9DAA833259D5F6BAF20FFB3FC7A247AC0D59397013CE9AAD2C3931D0265684EF91D7D6A587797DD4EC64AA728D5064E31FC6FDAB45EADE8B3B942302EA6C26C728364788E8A16A9AAC85185D8683E9468B5CC8D2303441B78551DC801C052309E06A02E4EDCFA42FB86CE910AAAA870866E8B2D13E2482263FB221F5D01BCCD88F7195DB4E763677F2F35323489C36DB29489C1BE4E7C65E46645086B57B2DCB1416E993AA4B69CEF71B9F81405186B7A03B2DD3121C105074315B4B550C3C1684FA8FCF0303C28B0C086BAA40B7FD666F416703B0BAFA0B53A5E995A9D74652B88406460CD1DA0B6ABE1AD2A6B26FF18167087D31EF12537CBBA8A0E64F590871ECDA1915C6E97987C11C336B3E3CA8EFF172E9CDD5B11A9F326024C2EA5E80B653BE2D78740C6A449EB25E8B0FD9257CAC6EED03BE40D82C8EB7DC67DF3DDDBDE6308138BECFF788DA19FF14F5FBFE8A456D927F38A55BBCF65B0386442E53DBB492A8B67268835FEF052BB0BB52D1902DF1FE57655B0043857080BE8E69E3877F826402FD79EA6A1EE72A3DD55DB09D23C130FB13A6B30856567180194C783ED06599CF15056BD680E86927AFE5883EF0D18AD8268C05F7684BF01CF13FC0874CB59B8BB39A320AB4052D5E72A90337C7A959571AFB23CF7D70A046F8B5CA86941C9519838AB2FD65507F623B4B59C2FE0487C92E693537B9D5A05FDB01C72AB33C70202AB9E309760F616DB5A6288239620D891406D5D49939D84400BD30BFEFBE90643DDB2A79CF4A44AAF84D1A60CAD43A93C235AD64DFF4B45D325C70B53D37BE41DFF549D49934FDB3597D4C64E255CDF071962C9EA3B0BC6434D672D4FD9AA5091CFCAA4B106C8D2FC63C0831397B66CDCA5A5C954E196725506E3B40CC3A968F7EFAB6F7C09268063D12F0812AC0B6637CEC2A83F50273CE35DAC8AB674857B5C2F778895213E4C54D043BB84CF31532150B0798411F441FBC50A962023F04B3D58219B9EF91DBDE0CBEAE6D80701B61CA5CE103DB3A4BCDFAC54A8F6B613BA82B7A837D8B2975831E1E6E9B714BA12EC41B43F416D8D563D3AF617E4CBBD55075307674F016542C919AC7544D5EC8790BAB3D7F65BDB03A54581961FD2216D6294A25CD4E0647CE8B19F3CFC06B6D1EAB9D6A8C6D9FF5FB4A7368CFAF9F3FA4AB20C88F047821AB0E55EFFB57AADA398289F2CE64F4086AD59189FBF80600789B98F482E2A0811B61520DE1173DA2FEE132F328DC34AE81DEB2E9EEFFC7F26EB05905D313EB6D5282F04FF97448D36986965DA0A45BB28BE4AAAFFFCAEFE33292802DF0FF2F686AFB80C86A7FE956B3934FD90960FD880C1A27B86ACFE30CDFF3FB6D197B8DD04659024DCE9E68169845AE6A3AA05C773D8A5DAACDC0F71C189418F115587CA92A40E5E9ACE18478D036021E3B9B13A18EFF3DDEF71D1C9F1856597A119BD7FDEDED1C2CCB54CF3EDA1B783E982F6F308F538B6F8BA85F3E0749ADE7C6E8E009B93622472484CF8B24816EC75401D52C5225B78E6664DDC7C54FF6FBACB278A709C4A4239B53E6B202119BC9401677E0E63B290AADEC4CC14322A6D1CFB035A31B4D424051D523DBF783B965001DB4FEA87C38DBF358039E3A2090EC3C3A96D1BD6BE48A87F74C03CBA8041147ED75069F772589EEA1B152370434C94C430A6B1B8FDAF8747A9FE9FD2C14A3A3F87D8E832C3D4A870C0514EDDE66ECCC7DA9072678F442085CD0C372D9D478D8ABC59962AB82D21300B46C7082EBC817E086A45313D324488F13DF8FB4CF3F0C9A8BCEBDB21FEFC5AE80031F542C293FE736055B1E4B02DDAE38F164DEFE89566F1FD382105FF0C5225990391A20004CD2CCC8DF1CCA13BD5E8696F14686782FBF588BA14853407FB4F8EC1D6CAD6D1D8FC938F340436CCBB83D30DB2E44212E400479D04FD58467BE511DC26EEE094CAE592EE313ECF82B08463A547DCA6FBB1BACB0602551556660458114548C6C7D20D03A387FEAEC9B873EEDF26BA5067859B7384D7E2079BDFEF3B8EC76EC408E0F8668C7B77CADCE32319F2D748E9F026679C53DDAB8DC7C5D463431365F034AC1BC2A7C274D1635D50C309FA26DF3EE0EE3EACBD6E3E6F1202CC8CDC3649E80046AC4FA9F627E30FD1E7D3C6EA86AC4EA2B7A79ADFE536EDA73F7D0386B7E3CBF0584A1E844F0C911BD29D4A706470DCED07BD8BFE9518B6F1EF2B367734A9590940263F572321F98C979598958567F37BF989326FF1EF48E473488EF47FD8857E287D3A8C1DF215420D86FCC369EA89CD890E724EE1803930CF58C06D2C7E7D20731F28A10BAF4F5F1AD0052F1A0F70E33E534902438F7A665A2D3CAFE9FBB6C6ED981CE6A09EC51BF4A7071C5F1E046DA180235170040D408230DA85E398EB6B3550777F30D05D940E6414FCA1DB014A9CA0EFC9D1D82A5FB20FF4AD060D41B4C4BABD546EC75A6F178B3868AEB3D998E7B05CF8E0FD4DBB9481826148F8F37B3284B3F0FA7D234628FDC0F9CAE2C467CF892A231F6E4C19BB6621EAC1DC20D9FC7C2B42172F38C5E0A751123CF8EF4076316B8730D6A35FF26ACBEB653FF8218AB9608B258460C81C50A46E98020A1EA2339EA5967FC41D2DB31DAD6724AEEABBE68D4FE2977B8FD9F28701B7BD5EB5EA7047ED85A806DD03C679111699A0A6FB03C545E589567EC80EE1E13D035FF1ED31EBF41870354433AABC1E8F1C731F2DDE69E604BE396CC1AE6D1AD87F1FE926249B8C9C18CF95B58E45327E2266C2797F3289C5B71759049A73FDFFC3C31631217EDA78847F298EB15F8864034AE13F1990BC03D2ECE3DA9AC575C14B88BF134786BD5EEBC25A5DEAAFB292A7F8D7B542ACBFD0E710F8A5D178002A3EBC34449AFFCD687DA3E9216E1684F5D43EB05AB2E989FDA16BB3622BFE7BED90FF7E8E1A816CD240103C78405A65937BB958D9540A331D7CD6D28F7210C8426425F7C1B9B0C95CFD2D97595953FEF11E5241E7AB2DB80A0E1588C89C79D03AF8BE373FAB625F9948AA990BAC013188B69B8956407BA137C292D29E0A1FE4E0C889FDF5372F97DF1D379BF2F78A6CE219D20751C787BC108ABFCB864C8B07499F29D2BFAC8FEF0F57B02C5399C27F0FAA256F52A7E29323C33D3665908CFAF1B1C281948F45398368AFC8F8EBF6C54ABFF5A272E6684D26695109266CA9B054A35CAE084E769CE3DD5EE6D301FD3070D231084AAA13E1549D0ED97179DC50F88B3F129C14F39D759BB2AE041BC3837741E0D4F68AFBEA7906542C48A2B486F46394CCE8F628AC03AA2198C2FC858B008765E3EA5B28EFA5940585C990AD768AF1CD0A300D91C2E8683EDCE4655AC17B5C6565C67326654B129AD88DF7ECAD154400C257E8B8E787F7E06C97BC1F7A0844A5BF93B8213CDC06DBF3FD2B502649D8B1106AC67206AB02870A6D934FC9347D29197EFEA70938443C463B58D5FBC2A7964C426796C311813C3D9C1FBA1B77A5F381D7EDFEBB6E88F10D8D14650D8304761C48F1C8664FA00FDD397950513C8F0282008D33C3584990A3763BEC1FDCFF21DA96D2C4F857C2562F87D840E3F22D49383F9C7A1439ECA9B98843B52F402AD3E028802CD7D7E71F550842DEA09F8DE10747069774AEA5F00ACD985C0D9B896D4A38544AE5247E4167DF89E4F859E96FD2D6C4E522BA6D52F01353CB1DAA6C74B9706BF6395D10D8CE5461F3C7014D708151551ED84D75ABF448F2883EAC45E5BC3CD68F45BC740C06C3289315D24EDA872C0AF61BC0F8FE4C398BFDDA8D8C4A80D77A56FE036304BD72204BE29EFA5AB4ABFAABCAEBBFAFF97F0F7FF9C9B85F670C4680FA07FED84A206C6770869F1F40327B00B81105E8055771E6DD86574881B8C948F447594C0FF16E0FAD688BF49B8C12CEF472B291829AC050AAA133E698E737743423B67D96A556899058CF4CFC165E9773F9EF52E32FF0CE00D78600E0EE6DE558BF79429AE9FED47FA4848F0F75F145CE90644444B610E58FEBF95832805EA3420A739D07DC909C16F1A564C39C9AFB5C933839FC0A3E00BF43831EF601610A9F5925A561C6B8AB28F78ADB87E02774BC71C146FCA8E797AB990F603E147FF058F9D5587D4304429DCE1E300DEEDB79B851B562FCFA8FA4CA6B00AB14E6BC20F99E765F494B57273D75737A05CC385C52B7EDDBF926AB8D9D70F09900760343F9351B1857EE2018D24AFF3DDF80EFE0E27412677AD447E51378EAB6693359CE6C7EB37B43D288C1F96F6183D90C2D363C974D3DF2BD0FC13152C6220A5669BD8713F043C177A5A92532072169D95BC7E17BE4787DAB662B9B71A22312FB8BD9AB7E137250A0BC95749C6F6AB95902F558BAC601B924DF410A210D10B6FD12FE99BA1748C7C99FD8AB5CBF03125BD7E989CF961F660ACE33698EAA48038508B51E8B52C66A5646C5B33CA50AF4B4BD6AE1E5A535EAD15944D79D096015F5E26A74BD0F86A612D8EEDD6951115714C66C3DB0B449168269750CFDE724750690BB9253F52815420CE278FF71057D830A371B1C6BA1AD1FFF3C6A0CE9BDB44AAB835A88D3E7547857FB8714A1C96915BAA5AC585A3A14CB88682E79DF864927F151452FDECC6B7A0D92526A4755E7C0BE82F10C3C55176979166C2DBED25B0DBB4DB1A59E1B3301015BC7862F475A3CD63A780CA5ABFC758B1901C4B3EC73FE0DC588349910E27E32C0F682C43C3628D426867628B29498793852992074E0458C68C8FBCF52D6A9E4A31D4A3DA4917C13F4D210C4D8F98D8C11C04821016E1740D55C029C8789938E20D645F54F55D4621CC4B44233C0D0589D8624428AD376B8726FA2075C7A1E38EF3615BD7F3459EAB2554A933AEBED2E8B9B24E937FA124021B1CEE1445D907D894C7762D9618275174C071F2D89C49717ECCB4FFD8D49CC59E1E6465DF149366E09788A38B5594BD5078755C3BFF553D57D261102C63416A049976E1B6AAA51B8D7B3039245A70EDE6CDE337DBAA919E65F8C7FD1B716A08F750EF7DE48037F946265A2311489986D74D3AAFB1D5AA85769A68875281B3EEB3C2C420CF8CE9FC0B0EEA7A6B5EE9AE9DB71F91173E043BB84EB0DC42324CB4E83EC8A132258A6CFDDFF2916CEE4E4BCB8195DD747CB3AE421FE0DD16633231FA107312A1D17C38E29BB1866317EC983162CFFAD6427F9FE2105477345CBF1024B9A7D159EDFB31B29D4455906C85C3FE408187F7D944BC53C999F32DC4D9844EDB0DF10A243892A0B697072C3B6F5029941CAC00B6E07EEEAD7EA282EE0F01BA799E06E30C285EEBBDBA04AFCC45968D22D553871FC45B5D502C8C8FE4F8AE93833C67DAF3B825B6BB88751838C7B1CCB8F827D0DFA6099F094F9189593F9E9E0855073C142C13697157B5F6565FEF26967EDDF5D56788E12B989AA37EA3858807C92D3F276976650A5FF536E75905E6CFE3BE1AC10DE8C74A1AE0E9E2E95851CA91D93D691D2C03822149192740B7C42A1841DBE8DE0D0A895A4E03023EDAD36DA05CD85D9DDC03BFE2CF904083387E79971DF3378DFAA1D093B98524AF724E259B1C10941EF7283EBD235BA798D9F1350F6D07FB84A240F4CFB9C69C4B249C86D5C850C236ED9A9B2D67E50D6766D2306CCE2E957B74E572D663A4BFA617A00CE4762D5BCA8F1EF3FB74DA0A4227F25D2F963709F2D428FB0848FCAF563F755B4C3B012FB7E1BD46017AB525DE21F95DF76E4058BA46259C9593540AC82AE22E236361F4040B510EC6866FB9D793E56C6935877011C2E05586D55CDCF54EBD182949CB5AE7E6468775AB46EA12900DE6EBCB078771028299FC0F34A9A80083AF527DDE51E27E08F8EAFBE862745D8DAB532FF98E045597E18CCF56A0AE0E3BC81ECBD20CBC062339CA7F68C49CD03839799F18BE93B3856EFEDC670E2EE4ED70E68B074590CBFA717B511197C6B157EB9E11ACDB2DF059CAD9E75E6EA316E862A0750607CD4055CA77A826B96131FEAC157A2B9BE9BAA37724C3D9859CB0DD2A05C74F9F386FBDA3A63049D6115C5421B1BBA9D6297FC186462A2C5589EF57265FE927E38C00977DCFA7B441BDA6F15387A2A5DA40C8EE8CCF70AF55A3AAA31E72730454323D62114135076EFCFB5D12700BF8E14B9422CD864B0F88AC6008B20BD990CB7B35DE612CAF36022F915B910D8D6091C5FA2BC1A06F70AE76A11E79DF1D8B53E08E6F04FECCA9E7A4AB257F4A908A36D538CF66929F615ABDE16D0B82210AFE25C53F52A96EF172CAE7A8349B0549D434F812B2ABD42294AA4A1DA0E939B9B588F0C91CE6D7E8A8BD1834B9B9D994D36D6B7A2A90443D5940E4BF8E9F37090E8AB72FD6EF7DFAC20650F77BDD769D5B0D89C1FE47FBD3C73C42D318E6CEA226D3C1A22225A87A5F8FCCCF2683F6A0DEE2230FC663DD0BCFF9FDD218AA32E9569C287970FF2129E22340961763A73D6EA4B70B3919795116EBEB0AF50762FA9BA1C58F1B9C6D569FB2F21323DEBA09A9CE76AD5B1347EDEAAD8822461F235876CACE114B87087A897E5C36BDA6EBBCDB5C4AB6B99AB3E320894F272A1543887601EBC1AA8432AA330499412F684942B3223131C7FD2EFC0C7E9CD0C70BDDF47B85B5B5BA9D5C5681BD67A263145BBF52A403565B146F1D2C4C4A74C710FE1FC114E16EE4024BB5DDFE6448FE4AFFAFE151070C709F53FFAC205A9F40FAD294371210DA318C65A4D6953A67810695E2CF1F7B961802CC428FCB9DF960550922BAB7F2CC67DEDF0B2DB83BBAC67A4AC346CD94982A49E9CA050F3DBB68C1A618630377B8A6E18BECC881F8F291E629C481F439E482B165AA9CD124B7B52867D5814499CAD344EF2B0B25EF561266E047F6ED4DE6A197C38ABCE75D4EEF3A24C4E6414142D7B649EE1DD648D012E98FF70B06FA363B5DD94AA7806272EF9B7D64A7D84882BA8947E0519B069E79391B80D4EE4BBE083402A719FAD45B451F984A1E51A8D7ADA072984159D2CDD8A529C2A4531B78BD1800B732EE095CC6320952DC81B66F99472E7B050F3A3A1DC7708956034C592D482698482DCDCFBC911D97B8460E03E8214311DEE04B1EA613D2F2767D86A737701D19D825D3C151B5DD06BB81F3732411685BA86B1F71839AB56B9DA496CF0C891C122148123C2B63043BE279968768364D82DA951C1F0B5592AFF8BEAD2E92F62FCA3DC01DBFEB38D696868986F81F06410C9AA17DE3276EF45B748C96D8FE1FCDF3F0CADDA26860E893A1E419ABBA9F4995100AD739C2ADEDE82BC8242CEFF7C7B6964BD0EF6C9D6F0CC7080C7E1676F03B0A241BAB7659636CDC9FC57BB040BABA0D25FB2F4A75E6B52B4D89EBE0CBCA182D20230BDC7AE820A0F60AD46FE9AEC2FB77748C0F41905E736ACF8922688604E3FC81E00E0C7DB76CD5403FDA746E766CF221B0BA1F1C7AF1DA82508052CBDE1D2F6043B12761324BA46D9AA9CA330385C7967E0C64ADBECC565D058DC05F67C20233BD98FFE6A0C6973117DB2BC36D4A61FFD2C15609969CB5FEB16D680C2C8F3F99689F81B4DFE74BE6968CFE30A58E240BCC442795B4BFD38126051F454505CE3366CE0A2553F95C17DAFF396E16A87C827011F5FEC42A47412B8AAE47279FD0FA7371F360FBCE3CAAF12ED17DC989CEBDC1601B6863EDDCB107E054ED7BE8D4CED143B021A77AEBE80082F44D6FC2B8986D780A16C7BB78E63007D18D63305D35613D73F5D4E705CF1935C3E6D2103E52522E76D0FD55E9E7CDCF57D4638B02691BCF8CAC0EF284337EFC80D56C2A416E4DDECFA12741D1444DEC77E49FFAE4EC33F1979822E961798AC002E09C09C077F95369EB3B4C0AE2B962CB339ED0303625EE7FFBC2CAC9DF2AB6C0872D6F050FE183CDEBAC9C73EB1A5C12FCAEA8C73038C04475608820676C6AB6C4C5D7B1E6087989D6496EE55C6EA685F9BDEA8E6E5DAFA406631C86E9D555F6F41D8565834F7BDF32FC4204D473BCD33810B6DEBCD4209BF3E3B390C340115A35B9DA0F61776290F11E64EE51D659702A97787796B014E88597B9758E27EDC49FD8FD68084D8D7BE1FC6A17414081062454A84B44BEC6DED4053FAFACA174D0118E0817C0599933186E2B4B8FFDD03FDC33C899E218572B5E75FF5BF938F9B8D3F86000E41547F6DE7A8F27A7668AFBC83C73D91E501447943F795A4A5E8CE678272E989C149222FD4592B3AFB4BAE911C434CF1D2305E380EC5CC8279F6A8D1C7901DFEE33AA041559D6D40A1CFE990A92E55D876460AFBD9BAC991C10A26615D9316105D71C9C2958244CC6730A8B22048999998962D166D30158DE3F0ADC9A26A0CF79A56917FE1D0142A7DC3D44372937DE12B67B2E77AEE1DA854E22536029EB053DBCE7768200353BB15557B43D32A1732809D1D85C9425EBCBED99F7D29B90DF4F832B9E15DBF6C048266B1CB44897357F34E204B021F364AA4598C73FFF993D82A13E6127BB67E7C19D13EAB3A80F44A4912791463332CFE402A077C9366367A2CAD023C380A2FF25418FE0639999662232D1B70D4950FA541462FB4FD035D43C60335002B811669B110FFF58FD2EC53FD4BAAB4B85AD6B7B8E958F9EB6664C6AEB9C03963E594AA960BB0F7FFE42B83F41E50B21E568768A9938B5AC44F39541FC179E671239BD4A8726CBB07652AA8F5EDC6E9D6E2ABF0550DC2809F18A8CE7F06D82996B9F26FC2F7B7E8BE2D1B2CA7FF36FD082A91AA9E5C8A8B219A57099786CEE89CCCC6E4D5DF1FB0B59A71ABFD84D29F4BD779D595E8B0556D5E8D20301564C415BFD9914718B3AB7B4D645153C200FCEFDECD6D018A72B4F0F8F5A9994D22FD17CCBBA78CD4A6CB925434E8D34B7B8002EF6938DE87FCABA3D0888A26193D7EEF6CF5CA0EFA3786CDC35082B47D2A613B181BA81E750730FB10688DE2B108D958D91B7E19DED6CA71E62C877745CC86600AA140A029BF7E75CA04A9CF7A6C498C6650F764A2F1244A60DDE0FBBFD9E282ED5335C038F3BFE08514B67604894C02137858E5103DC950C7A2D6BC75C0E9FE0EE5D5E42279ECF01065A36DBD9B889272166C9BEE391ADE035F9677E30D45F3B677DEF0E32F701B5C9C84F7DA9D0E24336E394747D7A9ED715044D0725354A052F69F858082073AF96473C540C1C73FEA247522FDD6A039DEA4C2DFF75FAB1B2A271F75CF7C1EC80AF90A22278A0C8740CF6E26352A8335D2208014B8C72AD5F0B760949FD50DF32054EE540E682BABFFB3E75153BC00C7D23EB1C84D6D3BE819D0BF7A5BA2CACAF58D4DB1F512618BCF62DAB33AFCD973B86FEC259E41C8F55319D29FD2B6D491919BFC757DD9D06E1679EE1F679BED78673DD134DBA08C63992D0EEFE58EB040D6ABE58E00EE94B370C9E1DAFF13533EF6E36725FE0E20252187E2B9841FC6067452AF8B8488D3BF2996232DF5E6A9E4021B8476FF646B3604E30FC2FCCEF947AB383440D2BDFC5216A77A57DAFE9C8DEB691A7CCBBE55033EAE916885596FE5B35E1AF3D952ED629954FE4AD36707CCDD62FC4E399F38429C107F09212F8175423CC8C56CDACA2A92C9B320C53ED895B85CFD460F3D9D286D87DE59A848D0F757405BD90017E874FAAC141C9099D1E9ECDF6A4B6D9B9D7141B51332A046CCC03D08657CB7D0BAC4F6AC3745D06B15F0866F4CA81B69C8DB8E1D9256371A1C347EAA2C428084AAEB2E5153E3C8B21F577ADCEDD12A9B2C7A84D57F8D633685FC03E162A7F09E248C8975FB2D080575D0130DEABF5BAF6004E7A314A5516AC991A83457F337EF8850D73C8F1045DA3F01ED2064E44F4581890459106699A52C4F537920E438F7C699D3AB30E4AF66EB4946A3212FFCE8E800F7F236D88186360F6BA35E56A3FAB93FFBD0DB8593E1B12A3D5A5B92C6A9DA228013792020D3FA8713A7F8A3D1665AA5F4CF5F270DDCE282757DB9D0E83B3EA22835CB88DD27E0F1AC0BE094196414DDEE6A03FADB071BAADCB46CFA08962F737C45F055643F8D88024B7D424D42233A752D274D7BC4C7B9122DF9FDBEDD11FE34C076DCAEC6DAF3959B454265F307A2A8A3BA02FE9E8B0B14CD9B01658C9586B24F063FAFE3625556B889CD5B5C8F68E14A6A19ABC45FED15D0A763BD5598155CE53A01B8F1583E97A2E5D262CA3C07EB2E80C314C8AEF3C4A48222C73DD3947307BEA43AF0A273F27DC3A6B022D5E741C55C6B6DA6B541236D0225AC4866BD4744BF5314BE4101B34D1D78840C7CFA47E48058A4953BBFE5D12DA2DCBD34A7CB56F2B4CA59DEB8C7FE7829FE1BF77E9B40E6D0E159EB78098C32D8B88A569C7796852DD752C47BDC5C498D53C720053422A3545924273689E24AF5D1DAD4498320082084E1A8569948623607FC5BF3DA7623BCCC059E0965B566FC11B788CAC0A876BB922A1B79B2402BC60D1212A5637F07692BC43385A460E55ADFE5F35DBD82CBF0388B7DC68A33416427480061EE15BA65C95B12934AAAC8C3182BE1297D620902E5EB7DFB2F8D29247A9B8E361C0051E383A1D3C642604FE22BF1887F118DEE214ED6FBBC1C21D4ABC8C2C140F31418225992D11081299056B155BF20BB95670EFAAA0E911F47FBAAA07FEAC8880633CD2B6A4E3097BA0026C66D4C181C9D98FE6C437DAD5A2463F9813C46BD4A23603DA7E175C5D899D736EF5D5D223C2378A7E0AD142DD708335C00E101398FA4779BDC774167995D6E043C7CE0E91D9BDEE68B6A51B98D35ACE8BA906B3F476DF5F1FB295289AC5F9D4261969FB69781EB2AA5910730F49B09525B22E5C5177E5750F0D551276458DF75B46EC2A37F2F8FF645F4A06F076FBE7C8FA88D477477C3B0CDCA473CAB85C346B94E25B4FB3483699ACEE86E382B7423DD815B965EFE9F58E8A0E2E1435F6BE7E4F2A733E745C0A72D8036012656607368F46FDDCDA1F5D3768D331F212DB4625E73B24797531744A7255DAB8357ADF27C350558D626D89D5FBA0BB68EAF65BBD5729D73DC4CC0AFD68DEC6A96D63C771C0E0A3B1E17633405FD6813059032162F81F77B33B3C7DA6495F8A070BC84CF80062E35C91F67F791E7D0FA570E1A48B51A611CFF3851F07B85C55F6460007A9B6E14B163C2A4AA111627B12CC7EB44F97397BF1E95B107AE832A16737D01FDBA57A47EB2B0BCC92947A3861A5DEBB458FE8DB5C7DD24F6810153108B426204BD88CA22F59A2EAA02424B956C1BDE03479A07DA7866ED8AED58003BB9EAB6A7828435DEF3A58BE73CEF7EBA195C0F4519E9B308D25684CE8F2CBDC3C15358A7B511095B36B4E49D2CA79CCD5BC348B89F9DF419094C043F1C670772B71C8395E3E00FBBD045BAA1463C7B508A6BD07FFD363656DADEF88BF35F1DD3534FF4EC06ADD0EFEB3F22A04B8290F37CF3A7DA6E2AC44CE36BBF37A9833F0E31133F312FB1A5381ED97CBD1DC21F0437F1BDED8704DF65B13ED1C18834BDD1A19CE6A681A3A9A3AD2F061E3747583D231C7B1ABFDF8C6EA1D62EB0DD8CECB401B62C2D012DE47B51D3E0A74E6A8EF91AE7540FECB4A19EB2EFE1FBBEE1B8BFDF456F3DF1F2B6FFE78D681F631D32016339C7EBF667A8545FECB04AC0AD939753AC96A2D5B5F3E1663F9D7F0F8F0CF61105ABC2BC2D2F5C5F28219392A383F94DD035A85D236E75B1217B4FD0E4AD966023B14F61FF8CEC896934F01EE23BF9538B254C7475F749C48C20D6491923101B9B50D23325C688265A636738EA7452283FEB44EE7B38EF2CE8A157DBD6C61930FA93DE5BFC3FF7A021E77D167254AAD1D915D23701E0C80B9D239E8ECF65DCB9611C2CF153566D363D39BBEB7FC8F898BB825EC7E08CFDC174C14044F27089D224DEBA9D1323558E2E3A9A1AD526E84C780D77716374A741C22F1C880C266D6E1ED61BF807B2CE1EC0F8B726E602BD62D3DDFEEF629FF4C92CF48BD5B1222455608E989BD6A2A8E458DAB1C08DC63F194B777DD63D8FE7A8028DF8807CD2F0DFC695EB96A7DE9E14596B69D7BDE8A39A6FEE6C204350ACDDF52E5410788F9C00A1D159E4E33BA5BE733327E51E115D97D899D601D409CA817F9916B60212EE078C43C7C425E369D320C9856FB70661C8189BB35405DB7C8BE4CA2FABAF1B62384521D7C8C40DF3A9287526B220A288A57999C5ECA2820612239407802A9F01189385C4FDF7778D5E8DB8C00CA4C93EA4D5A27E4B808B049E78F10E42CD0C0CF6DDA1D3C201FEDCB9F7B0CE0359A2D68C5E38FE46A2B9413CC11FD03DE3FA755EAD119DE724333096C106C44953C36FA619ED83D9DA2CF369AB6F6293427EAC9070B8813A633C8810C578DC14396701FA25A6CE7DAAD93C3B7A8816BFB15F4AD02C708F0579123B75BC6DCED3A8FFD9251696C4C8E511924B092AF6F3EAC8F2560A72AFA8A82F1C0D7179CFD06568C5686E5632B2540A32DA31BF1D69AA63E170BF5F4846D32A0DF801054CE1AB3E9F8C0F281A6424D18334884643AD3E0811C04D42919C495A01674093190A107F1706B7A34042FFD2F0ECA661A25C6353C9A2AACE758A4446384F148D0E3D5BA04E3A46D379F6A39317C067AFE1C9ABB8CF9A92C9825F0541C6B3A253F48F93F3E362A5022777D92ECC57F3EC087C5CBE14E204CE20364C2BD001AAA0405904D517D0BBC2BC9D4270E4664DC7F64A9C9F60529B98F08FCA5916B0CC372ABB3A503F1BA900C6C35B76656B5A8A545AB9B9371243B72C6C53295CBCE4DB0432C4F58F5725B276082E6B597DFF1BBECB637D96F58AA4B75A8BA071B5C9D0D7383BBFDDB8F76CFCEB1FF03F26CB6A6B20EB0AB33D0429194CEECFCA785E2862483EB0F4BD8050A185B60BB2E4F9B60FFA9929E3EFCCA6ECF2124154C0F9B00243A544144E1842B4DB54051ACE50F3B95893E2D696B6F0C322508C207FBFA7832EDA70AFB9441B07DEB13A484BE468EFAEB4B17FB4A99182BCBF89A4E2F9888C306A324E268BCE922B01156C493302E77B0C97CDF030AF2EAF4122872B1406683886FFD9CF3948AB301687BBA775621AFE0C91DC3CEBAD6F55251AFCD2D0210444022F06D3FA23FB6DB290FE95BC53C97628D8D8D7439ECAE9BB8A5481E77FDF11A857DF480752E0764313B69F6D6C1F9C1AA7DDBEF0F0FED2D1D35D7D4869D304969A84BE00E06B63EFACA37E14F4B113339C16C17FBC44C51FF98496144F53B41AF35094AA2F80A3D41995B4EBFA0767959888ABF1698198C820142E1559C8BC4170BDA426C0D26C63B46F4409BC8F20B1CEF9FD7658D551E4CA359D13DF1F5BD552CBEB611347E861841B31C9F18A12A2B08AF90BE537233695FD5264FBBC08B284C7FEFB51A9F17B1A7B84C4371115553B655865E37F70B70ECAC45706245F576A33F3E7D7A55D18DD58A9648E69EC19CFC404615AFEA97937A2DEA7CEF8CFF508B9F29C4FF6743938031759BAA82F00F8A9EABFF466C63C70F8DFFFD77DAFB575D0452FC3AE926571E7C0444C005DF5396058F79B819FB7FAA7D9700C313CA77043D9D92A7820668FA65B538622246D31533B1EFAD837E6000640A1C1899A16994B0FA26170D1FAC44132B08E4BA1EC8D118EB250169093B53803088C5ED2F8C1B92DB827475E1EE8ABA03A9837AB4EBE23DD91B10B1FF98F63F1F4CFBE41BCB4928640C35E05829110F13DD820D241FD0D8CB9A25E607485FAE73B93ACD2D44C237CBE3ADAC9399D1AA40C70D947AE7A0DB251485199CE267BF98F5D8669845591D7C4859B861D1A5DDAE4B3201E856D802756A585E8110C8647DBE480244A4A3510D0A74F868C04CB155B2C366A0B41C7E1CA38A7BC03B4B1871C920585DA6E6E6688FB2F5B5DD3D908B2E4345D84E51EB69C2E787E867844FF43C340615361B1E8C68F052EFD10C52523DA5DF6253683A3727EFAA5E3E375B599E19E038FA3F796F3A528B49466A1713BFFEDB85B2BFC2E1C1B586D7170876A7C3C434AB5AAA9C1B7528F8C79EE74560410AD824114A72D18A88948AE346C4E030885F4E23DEAA494D39991478F1A797B7E3797B8C85D6894AADE32E00BAC84F440E41251E9858FA35E72A8862425E8CDC57DF69572B4AAFB971D9662AD56F986435F38DC133E5FA9F132A4E6C0D794FAC08063A523563A87312F46D9F6CC4FFE019E5A084750B450547391354E9194361EF9806EDEE73BEA2386629FFC37B23CD257F6F9CFE5DF2418C2DA5653A0A4A48F754AED609E966569812D8232A0E5CE86E76237D4CDE4DDE13C89FFB1E3E0DEEE682B9880A0F18E9258C342F40953D3CA06C84499726343F3609CD56EC8C6D160CC715ECD64A48E960E56A8B308E3B0EFA3B9F3022BA097B260B0F72504E60EA7168CE30D9E3283D548F75C11DA6DA2235FF0371F5E3B4A409B1A381CBC542655B2D9D0E6273618D8521EBB60AA0E9FDE9DF846196F9AF39F4936F27C6C10D899582FD021366A4E03D290FE05D9F74F54D09E73FD707C51B69FAB5C0E453751FFD8BE456D09E652A5CADBECA0BF819CE825FDFA318D5F00BFC4F321D149D0B50B19B83303D1CB4C5E9B32CD24ECC5E3858DD8A6D29BBB55F212B4116BC53BD385AEF1D78CB07F714D5231A6546C2A3AAD242E91FCB53F6E1B606F4FE0046ECE1C136120EA53EE006471C18E7666D57991141EB57E1DD0E377ACE914DAA19375862D38F9D75C3E6A47F00BE0AE4FA155205E6AC7F70531D5D871BE33A894149D4B1A4D69FA01049E1640A33B1929F0EC067E68980316FB98987BD5AAEDAC8EC1A9AAC6785C90767D9DAA89B4D203E28F1D3F62060712E590CAAB4CDCF1AFE1B9C9B0E0AC486C6B8FB7E237ACDAA0DFE110531ECB464C1E677FBE3070B6C963FBC9C35852CF6901F61C79FD3DCF66FFC2DD0DBC3769153EAF5F00A818F103C5F894587DBB755FF0B29FBAB272589EB1828CD952FF15EEAB03E8A9239207C0510B47946940029A078DBDC52987EFDBC11E870A87C485599147E0A7A9BD01FAA4FF560CDEE7AFAABBB1000321B46EA0D7A4A112350725BB74F064AEE03EFD936A1C90C79B69F1089C971225AAE889FA97D3C6237DD9B1C1E381E663F6B221B64BD180FA942F69E89D8349653557F5741D8F619A7C5FED625FD783D0B6E46AFC7FCDA873CF728FBC81909DFCB44B5CBA0E1560A2B777413B60F8C6C7492FAE568E00F37A327B7655B881CC4D2AF56BA2195DA65F234FC0C3305702B6532BABF011368F11598B5E9786C42833258CDC4BFD5A95BEF2652BA06D981FBD4CDBB101FBBB183DEAD4924EB24F7C25F9DD8B1B5BB6B57BF9FC783B7D628F25A887FF8B4B543AC3B47EDB67B9413FD47AEF3CAF8D75BCFFA562BF4AC528A0BCF0FF52E966EBBF6A93E77C806F5F0060F49BD31A38F48F2B9705A606D71F2D56756B682E098304EA48E4E49E12A20D01E17838A6B36A4C03A95C7CCEFDFAD83B6C8EB5756F10A20866613894A5F41461DB9A802EAA11882B6F2377CA1FE538E8A3D41D3CB9596FD666A6220B69E15478F6248AF7DB11C24448E307D0EE64817944DD64F7FFBE9A6CE9A0B39D0FCDB8DB572C6E71AAC4E80D649E010AE65BE7D87D221EB22FF1171C8E15F551E872EA9D2F98282CC4353204745DB29B07D4FC5BB2E7208EC9940CBB738DE06C4DFFA0EC6B493CBE6C553FB0F415098477AD02F2BA7279BB988B7A5173FE1E609FAFCEF4F95CB848A8B0C7257AFBDC00725E15C06962BCB2573C3EB1B6319C6C070B7E4B53008200B09E5DB86FF0C0C56ED5866E701FD9E187752092185B634EC12A1AAC9368FC42E6459616348099FBB7440927A16D445A4B47A53E44D62F30F00BAB86742657E1A1C143F26328F11C493C87615E177F190A311E6E303FFBD4F1EBB22323E5B88175F8A1051D5C5FCD69470442044CBA9BF1EB040606A72AF455C096CABB5D8A5744617166639445C3ED22CE482C3E90F430104A7A166AF9B742C9BB1B69F09D89A497AF1C35E91F2FE8E91F075EEDC18EEF9CA756D5343A359B33D184C66942BA4CD6D971ADD102F093C9821E4F92567638C8A03CEEBED5D13AE1F2D7E690F8298CBE913A8D6BB2D605B0054E89D4BB102FFAC222C88C5230796651FDA9AB5D8FDD49998A8845E53558793FC2B2CACE8F5F116757EC12D1D6E42B1B37525F8232D604E1F7145E1DCBCD30028482F9DF5D0EBFC81FFDFE00FA88C51F75442ABBC1D7C15DC49BF2BFB6B1F17B422CA6B8E43499241B6C21E6DAC1BCCF69C9E006283541C733A4A20F015E516FB4F12042FD9B42FF5B8FE77096BE82D79016A132C7EC7A5D0178C3090FDFB8FF44E024A2FEA33032F0E3BD472F27F3C34457A9AF19671E11BA4D06517EE82F7C9D47E8DF8774AB260D2675832F22A3C1CB7D89052BB8BC88C711C6775BBBF1DC4E15850CB842A60973C4908B193C7ECFD10AD2A64A59256747D943BE5741216D804515BF5DE650AB82C519BCEA8F2B6B7B4A9459F97DB5BA6AC1D858658A6176BA9F557D2E4B040452E1BFAC3440D5426AF446032E801FDE34CF40575FC3EC2A1891569E905D18C21B07AC89DAD5461710AF3BDBBD1EA442AE55167B95E58624D091A76FECE39C791D6C04382EE1EAD5DAC153234311F122779DD02BA5AD44E73B39BE0C79D85C9B851D2DCCB89852BF612E591EB8F137A711967A09AE64057AE64DAECFC819FC2D961343BD42C03CF908B32278BA126E4F350D6D7A9B16AA7858B656C4E4CFCADA83EA9A24607EFB265A94AE6971AB6F74EAADEDD0799144D506E3D20026A8ACE1F6014C11327634CB8E2AA6C81719D9BB74DE16E0745D07D40A478AE1EDA034E320A7694E8E8F9B00B435AE4CA7825D57AC8AE15478B0D3B40564AD99620A464338B417479A7083E33D0CFBDBF49DA17655CC03F3CE10972FB14827F69785670C4634FB3BB9EE3FB620C0E99F91B236FBE6CB2029430C2977677A8B227471BEDB6C5F2E3113F384EFE9720A0D28710329E8F67EB55E44AA8705CB33AC10BBC1A9FD2AEFD3B7FA37B0CB345E0C3CFDED3A5BF7E43321FCD35BFD0A001F5EEF0B360A29EC7B994AAA771231AB5472B843D05B5D6670B43C9C9FF6B8258583FD6086B3102DDE97A81A00A31132E9D3286F5C02501AD47A02E4B96226EBCE028E8F618F30A884A7AEFF7201275C9112774623946A2B29CFCAFEE7A30251FD428B82396000C3463C51FD86332BFFB158A0BCBD24B85EAA21BE6D7E0B21D29C5D37E4F7DAF8E43B37D54F52083F90EE2E5DA73B38EC8AFFE171D1690028E37B2708F4318004A745818096060987283DE0A961E4BBF4469A7F871C71B076DCD9861CD33FC37ED054A474D835B9BD628D5AF8AF581B70540B3218DC62DB86C68B5B179C1F3645C719B8D326833B13FB1E55ABBC5244ED0AFEECB3B56555FE94BA2BB3FFE6974D2B32B2EB44349AAF0DBF4AAAAEA04DACD6C15BE5F2FA90AD47DC6AD9A20F8D46CBDA57187AE628D7A7462B55FB0BEA65D2194F6AF39B9B373AE37E74B072B4D49E480058196C03BE025FEEB938CBCE4D2E6DE23298D8AE19C485C1B44BDB8F7730DDF802276E42AC24EC97E472752367578DEC2AB7564A246B2BD49DA982C755181A027483B2FD4EE57593FF0CF65BF860803FC5B735BF846F6F5CCB6ABBBC9C42F5C9629E555AA54E00632954DFBCF6D7AB96AC6E5EF09555C6BFFF6968AD8BFE80F75778AD96E273001C2A4D0292B7C5338536A84F54FF24017FD28F1477C39643908EB2848B64897634C7E419808BDD0D3E6ECA41A10AE4DE8CBE4EE3B918D5BE7DB5F1515581B4EE601D5CECDA7C41EF103B0556273B27486D6C9BCE71BF7C50FCFD25F67EB37051A8E112A9DF739E04B5889126AA2711A233F29A44750D5F0F77ED0C4E237DC544F0B90903FEF3DABF8532F677439CE3E6A50F6AB9CE2F9B26C2F843782653601293B95C88DBC16A6AC6288B62EC2BCE58DE74D8F7E648183F91172EF2EEF81627DBD61C16B7971B6CE365E714E950BF072DA615626B707C91D39A3FD6CA1600DB64B19C7413FA8171B95A938A98DB127384E7D20A358FB03DA89B6B18E95FCC93463E56022BD98CB330ED0741A56CBC7D46533B8455EC2CE35B2949100F047157593324B55FE35045F35BC571BC514E70B033718AE0ED8D970438A9B050B15ECEE76E0905DC86A4275273EAC86EAA27F22AB87BAB23F99650FCC4A51E8B92842E117104DED4442A0C9B658BDDA87C11DFE8EBE4186A380BF9A4EB2BB3376B04E25E6DD8288E4CE6E8F052FD5D8A1BBBB7ABF1421A12AB5FFB12B441848D0F4100EF19C820CC4EBFE6D97A1112ECFBA8610FE7D6CF1DD133885F14C4BA2914C269EDB41D418BA9695417330F439372491C3FEF1038168547155A8F4D3E5A2D0DB033D39239F8D0ACCE3441187F070398DEB934207675E91C8514FFE79C19C93AFB8ED3EEFE52BFF44753500202906D4AFBF26D54A224F65949B618A192ABAF705564F39073519A779F7208BA5D74C42762376B034AB8451D21C573B5A3E2169DE32727FF12319443EFB46A1136DD29A59158416F9D41CF3063C1EA281C3619812F07B8D1F546FF0DE96D4BE3D40EC5BF9E9CEBEAAE65DA8763DAA61EFEFFF9117442B56066519CA1BD19CB3772EB7BF337FA38E78F584AE45E7BF7489E74E5132C395B298D696B22AD9417D7D2D998BCAD4331BD9E0B0BF30300CD9208991135E3DF55F6BA7234C6A601DAD903A765A538B352965740D7C3D8428387E2F86EBB4FE133B9B1130E663325740A925FB31B6750E611576753884ABC30FD7BCA7CEAB263132A9FC053B78D65C08F92373F4E8A21E4EFF4B18D887A977A62F98D50AD1FCF5704E63C330297B04262B40BCA25CBA1BBE5C14B0C770F7EE37C43A72F9D5A55446C4E1717D1937224FD80568E6E180A782533BAF64127947415E14AA96B022EC60B0BD60366C676B5CC0A5C9F34FBC6069D6975EFD73D5E14ADF8CEBBD4EB9C39462689C52FC2CD0ECDA2ACD9A179CC86CA10DF2164E8CD0AC4BA68F929612DA2EBCE04B08A7A71357E2AA8973FE3A1F72583B5DBF475E562CD19721BB8677E547A0CEC1E8731B45F27C0B0CED9095E62814FC02252627891AB5540FDED0C13853538FA162F17CE8359029CDE0C3CFE8E5F61BFFF84DDC922CC53C7D4B4C69F02C57392537B8182F7F6CE95AF7294E09B38C3BB1BCA2F4C5AEB702D97798B85FD0A3D84F64213F26A44C10186980811B48C22D1702E4BA337FE4D089EC6E2F2A31DA3C149B6B4D28F2A548F31411F4022BA5C189E1E5605E92D91E89D01DFFDF067D5B5E6E4D748F3CFFAF58F31898176B014106423E318F8E1318C2ECB3198F43BAFDF70BE77EA633F7AEAB58D723DC5BC84CC32EAC5D13D5177B208246AD345F40E307513C162FD20B1C4855C76C7ED27FD3BF1E3055CE1C6B8AAF5106FFDFF65312EADA9057E361F553F929A620B9DFA884E35D09B493F29B63235A3F5E30BFCAFE739730EE29D04FC35601AABFBB7CFBC695BD6593B14795F91B06764C607423652F83E7C4438DE01A92A3F4C811B8A3CD9F18D41F05EAD9C5156AB6A2FA9EF471F04AC190C435545C3276AA1349A6FB689B7DB8C3719FF275FC500B01E024CEE6F7A9890D23F91D5F9ACCD84FC27132AFF07665D3B9FA4C074CBA8846DD948DA88BDBDEF74E55DB1392FE0E850E26C7462DDE830E7E8D1E653255B9DD55CB90261F0D95CF2B5DFE8F91559EDE95261B73C08DE9BDB63E14DE27D69CF47DB4AB382DD5409E112C9BAC018F73A6D18CE21DD72ABDCEAAD1F864DAB93EF517B509299290EFAFF131DA8694B67B54660E1A9703FEBA2855D36B786B79C87150E3A78398B3CC50528A0EDA70618EC10BE0F3FE3E09F2F2435A9C0D791B422ECF5DAD841DD4D08F5A64E3709B531182C583D285BDFBA915312D6CCEB4A6F4E823F5D3294A42F2CA109C5C869CEF89951669A2C2629D8F43098AA83C526D268904A0DE3683029191A329BD0BC986EC7831E3671F9ADBD1D7EAE73596070F28C203621E12BA6C310954E02E10B0944C880A656C05B39EDB95391DE699EFE7687F2483491F7085DC9948F908B31B99D05661BBD070AEE3CF1A0BA3B787819F93537364A33CA702F7BF1BAD4BBD16C1DB255D4C630A2F2093C6DF61527BBE32B7AF55F94A21EBF167174056F226276C30725C3F85A28460002597E8EF59A2E5C1E9BF1AC8CB8440C2F5E3F1AC7E18A4DAA3D7DDC258301673498C5C2A75BE69B312D090D0076949E83ABC0A21B76B4FF29FED97B914762044262B1DCFE916E161B05F0DAFB35FC09BD3B16E5A1D2B67AC77F974825E4F3ADA9C32FF647C93D418BE83A4BA155D4ABABF193A6EDA2F230BFF09DF55A89DC06A64884DE1ED8A554201DC6269FEAE1716BEABAEECD17A2DF07552203B4782BE9F9E5D6CE7361E6071B485D4DC792B43CB1C72A7C9CDE5EF3B0E629788295334FC37B6D1188CBF8C6AAAE9C43A51EAB0A6266B1676519E7B2E2FC3ACD94F13550FD21C7178A4DBB66588CF680F5266E29D552AF4EE55AAE07F69F37DD2CAA704E77BFED5F6D1BB795193C95CCE896B6D8FE7384645EF66FF1B52C806B42A8ADB2FFEBEB9F009E36E2C3376D428D9DF8A66C2AD8BFBE675D27CF71ADF863DA00FBC83FABA5C7663B42AE162E9AC3EAC6AE248A095453E026521D0280508FB8BEE9CBBF30B5311D2E778BFCA529BAE087EE59A9A5FCEA6EFB51E9ACBF012689E09C669AA13506299E6C9DA1EBD55E6CE66F9198B804CC21585EF7E9FF3031D633898842A638580EABB68D825EAEF5767CC5DD7AAE3C9742DE436439C29923EEED5EF46316FB59825B8DD235DCBA30BCBF853C8B48A44475F56F28D58477A28E0180F07DEF1EF7FA8E9B5BFF3FC3CBD651FA73F4A93F03834E3029EA4195A3F5CE63FE8192737D04A9FB49591C72CDB56365E44CB3E090ED92ED5E3437B83F2F9B9CF2DFFA83263BDA1067AF6A03E7A5E644AE4F220548A47B961D38D12A8F9FCDA6FB28B93DB6DB62B39699C86655180FFBA6CE2FBAB6B9833A23B5EAACF5C2424C2A2989851D85D20AFBD19E6CC671480B1682728BAE651170862429B384C211DBFF4A5429B316C949BC41127C4CDD86F1D2F3B95FA88F4EF085AA251374CCC0D37F40AE9366F9B11A1F351C6D05E795EC0E9412D4097DFE576544E1EE862C924400B13198655004986F61B5986B96A195D6890E24237F2A703298E8C1B648DEE2FC1920E4F5B719C529578F05B467CCCCA79A3262C7390D1399867F788103C37EBF62F86A1A3C73BA981F7EC5B7832B317689F98313C1A850F2C962E91BA4640519DDB5966718A5B84474C5EBCC18D4BAF8DFE70ECEAACC7F5A8F8AF75559949DF64EED5ADEF4BF540C715EAA27A52E3B1A9364871C1361F3557FC1BEBF416F1875DE9C3B9B66AC9B2BE80D0D0944E2219BAA01CFA2AEA5B7E905BFBFC127196D5EABFE3046401045D5F0EC6F578239709BB82C3627B34A67148EECAE2BABD735A74305387C940A50E973743ED031A6434B50E6C87DDCF19F881809C9A5806735555899C5E5C83837F99AB61F327C57C7FA248CB8901769245BC9FB1461623C2962389A5554443D8994548D13D76AEBAE9260424B7E0830B9BF2BAF6EB7C824FC632F0501F387D98C223279E7F2EAF82D34F3DB85252506625DF538A1E5DA6B52CB14033C3BA1F01E3008EC5A65D7605887634095562F97EA67F8799A2F49390B3E7A775562E1F2580B49D69BD3920FA4BBF583BF40E11E4DB5333E9E8C23EB576B94FF5090D9C5B9FB531C5935638C19667E4B4956B25D2FC466C3BDFF37640BFFD23C3EC5E2FA14844BBC9C90A07631D92E5AB18B95D556FFED7A7D02200C54F3053F7779D3B6A85CDD5D17F7F38CFBE3867204DB1A4224D0B653B1BD9B042F69D2B7E80FC17AC9F9CD2AAE2C4A2A4DF9650F8469E76C0AFB7EF3C23E2669689D3F05A89C5E38542E91CF7110DB5BBEBAE0E4B8BEC572F40AC466A4F524218F81CE51A1841801E57C4FDC13153D8B86AF22851A89B642E6FCB99997B92CAA2E240F11FC45E703CD5F2C96E510039C830E535FDD1D3CC30A4E1A4CF47A927521199BC7AFA69BA659528901986D520679A61C7F3D5385109115CE4398A551530494F6DC8FE8ADF11533014017ED07B1B4861406942BF1E13FE3C0A6E1CA706526616D87A3155D2D049AAB48780D36E5298894A5A81D2B2C955B8FFDAC77B8B0AE53C4F87ED5B1DE568E73A700256C9C347AD25E764B6E4A6C32AB974D57AA12902520FB329773EAEF9FBEE35092463BAA48E00060171976487F50BA12EACB52078C9703D1F8340A2FE598EB6DFE66FFFB72AB68C6424C662CFE452B6AF24F7CEDD3D284A400D24CBF9EB84C9D0F005252EAA93B1B03E617FE5D604F7013D37736BD70E2114C71B1BFE97E5DC567DCC0E60F8C5F433BB5C15BBFBFC3102EE61BEC3C7FD164940B43F5E644D8EC8F87D3027478E3508B5B71CC01E883C36EEB780E303FA61E085642C3F33E077CF9A2BBFA01A13936BFDFB4FA2B7366DE137EEDC3C25D4B0D235C6FBD06E29968471E2605C00109A250F932315919300775446E814A980DFB88F2D5F1C84B9AD653273824F73FC01D0A15991FC3B368DFDADFD3F74001E71CF421577C466DFCF0425ED960A5DF45010A25A0423CE615CA83B81DCA05FC15E100160CA585D20E2669A587122B41BE14489359DB8CB46A095B113A0A890A8C9911572348E8D4F791A57DA93DA4A27029725F1560060F3A13B5461C4F6110739BF4855F229FD6E927A4E94B768AAC03CCF42C7B44CAD58721DA51853B99477BB78417136026FEA305F004010020126E002B2CA3CD8CEDCDD4A1F5A29932CDC841BA143CBA196AE07C78F6B6F9CFA3CAB36917F84F3284D51A37AB463F9E8E2EB54F0BC5D37504EB0DBFF37EFF1CDBCC25CD961CFBD7A758290BBAA8A6EBFBF29AA2A5FD99E45DA06E84E5D180109F979E3FE881F0C0C9A6A90F05C53964BAB65F4813BFCDCD5BA1AD6F722716A9070063F69AB58E9139180C3AE71F9A8AF4F363BB4038C506DE28B32B549C05D7D92A1FA24F03F30A7EFDB0215ECE995BCD5981F31A587E036975856CB8FA23E3158C07B1953EEDBE34202FC28E53E07D900749C4646A90725A57C7D88D6E953B45A94E9E05554738053C60EBC9DEF407F992748EA000A90A519A6A12C55966992C2973FEB156171B64BB80B93CA597EF369AF8D6477BF1DCC3B6114E5E0E4B835568660FED51D883300E5D1B4032ED9B60C807DC73EAC9BD709F3EB918CBF1DCAD10349E7FF07E2C344C2010DA5F8F511287E038E7FFEEE1E14DFEEB3B2E2E0AF07C9F0D5E36F0F1EE945B83E95D0C4F834940F0443B084E641179283645E9275D5A2E035F884327FA172AFC34C78075CA184F28D3456397597F4B924BDB3D8D4A0E73D68F91E6DB4502C0B68A78DE32ED2FF25C06E4C8608A108BCD2067DB31DBEE1CDFBF2A356BE880EBC888B0F189414B8599433C7BB3CB13A5F8C08E0C90A6F7D5AECB9EF16FA321FFE070AA500DC804E370AD4E25E64D6CA64018B4DA135502BE9BFB39FA8F2EABD319E55DF5A9FFB3C9FABD18B200F9342F4CE1423437DBB5D00A96D33E0350FB0CE496ED2DBC9BD42AE01E3AA9C5078B51440E440886947E811EFF2968C416272026D57D9E55C04A27A9CC8B344A5A10339E3B7C36ADD70D7F3DD5D2C04AA908EB2E2DC00515A12893C186DE29C71D8542434686EE5FB0D332FECECA592867DBA3E5D7B52928C877452D4822A18E0239DADDF615DB0202B17FEC4BB75F27D860A8E165DFF083BB7845AAD7FF75E22D099BA6DC3762A849B111027AB2BDAEC1EC30EF6CF3D498EE6FDD51CDD504DFE3A1744FCFE646E72C6218EE02FCB5FD50E0BDE67125AB75C8ADDBB1BA8AED3401ED2DED857F84FDBD68EFB2EC5C285EE8BC8FFB04960701D64380C9FDCD630A1D524857716DCAB6FAF9A5816FDF69A8DBB8C264A2466A1854BB477E592982F501834CB0AB3F7E8E706ED2E1B083153577005CDEFAF6EFEF56D00A9C5C08BC3165FCD8F9D1D966DBB26CD6BEF38A68251AC9CEA1B30B27CDDB30D15006F72D2C00EFE2D6BFAD4E72B63D4E76E375AADE732E76F72B683705953E26E6F88783FDF7D255275DF2E3DF02C60BDC0BABCF2EBA657BA14A0B2DD6D4821A9EE727C83C0134D42AE95D8924D9829CA1D0E5DFA83AACCB5A5A9F1CC89A93CDCF0D7E3BBD7A8BFE7793A062B5267C1A71657DCB3306E87C34BD47260F11E0F42AECAC8B145B3422F58908F92EC01AC0E4FE663CD0367286406968D04E6701014B6D92F47FF082B23BA6E8E9D2DA67EC51E9F5A3F0679365EABAE97716A28D1B50CA7D11BC21CF99E78294840F78164EC00DF00379475244433FEFF3CD60419F05B36E51112C49B84C406AB9859EA3E7EFFD9190C2A3C92AB821798A0F3542D19A6ABB1FB00C8A280891290E757F1549A4BB5447FFEDB8FE2537CF716F3528F62E5C5B69605194879080C827FAC51AE4EBA5FB560C98446C479940CE0DC2CAB0CB5DB553903CF5F233CF68FEBD7BECD4C217D8218D0DF5A853B5498FCA1BB54E66F00421477159A582C4E183421A224821D721BCB03F6AF116CD69A99F5219B8840D5BF74F8F3E0391AEE9645D7E2FFEFC7DECBCB4D940B83FF2D000527542A77C7E956672C3B20DC47D2513809D7715FFFB42EBF30CEB67A069A1D106299DA5C823640A01C09EC720569C8A29C70EC9D58BF5BD154F35EEBF982CA59F1EDEA2565B599916E280FA6A2B149DFE69CF041AB71DE3573221E6742BEF5AB5458A52DB65F4064549B58F3D662EB8325864D515941D432FE8A6A77AF3CCC36E247C2CD1623D421C7FF23B6B99B3F4AF1D27AAFC9E9DBDFB54BAFF295E8360FF6DCD8270E633C79C0320823778BF92BB00A528D727B19879DC2F0AE398359FCF5771786957CA7B85DF95749214502735040B37B623F69FA10629081DBB2B691D338B3F5EF03502B54D6CAE3D11F4087454045F58A7A124BF25672178ADEA7EA98A4530250535178019AADEACC086EACEBE0C1B538874B0EF610FDEEC6FBAF88EA8F746D78ADCDA523B186F61A4140026B32ABB6DF56A1CEE995F58AD7CCE5F6E3F52E599BFE7852FFCDC87A2062C2FE88CDA6B674704EF7F890F5EC4FA41815D6B37CAB034321902EF009C799A3CCFC22BC92C8A527F0FB2CB23322C89A23567A6DE40DC0890CC3E186D96D03F0ED618522E3D4DF44394891EBCDBA34D1E61D6B1E1B4375B76037754F90ED92117D83D87FFC743F2E5D87FBDFD35DB7BB3A4FA42E5C48C853B971EBA6840EFAFE621EC02ED1D5AACA0DEE621DAE7ACA1F0E8D34DDBBE143AAC5180CF774A7A6270FBC7AC7B896DF4B2CA4CBBE29952962398394CF92E724736572025503557469377CE5B03EE9EE020C77B911420525DD41BEF491014C665B5E56744F77217F9BF25B3F58BDCF51362F80F40564CD9AB8FCF3AFE6CECBEE37E74F032FF239A966BED7E5E4487D1AB8751D6E4B9B7E5F52DEF32718AE4C97FDCE6F8B97B5427713470051D6E25F0E236DED83AD4BB917B231BD3FC8299F18CF4271449CF85CE488C223D738F3087F2738A92AC6D90B059000F55EE922775F43379AF51B89554DF877463D9BA914B80008EA66DAED56846A3CF0D8D83636F2F7223CA6CA2247ED7A0C74DDFD3F17606B3DF9C29587EFF358B28BB62074190C3C269B8D1A15858F29D2DDFE3472E01E084AFB42A343AA26DF918344537BA9E3AEFE25F4354555B9E69DD2EAE01A9BC6DBA1EC08769054AF6CFA5047E7037721FBCA4862BAD33A28D6C8D3E5D4445D40B2DC260C4394FDD3005686520839FDEB5AE9C7E341B64F6B302C3BB8AE5218A5078DBFE50CCF46FBE2BDAD4751C38A8D76C5DFF773FA5BE13405F578B5EB3B890208B8515BACA7920C126253E7AB11D1517B17F02C8C668A16E3A48F06A630ABC32953B196F8D5CFB4261FBE1AA0C18B4BB63AAF245E3511C0D17AB9EEED13888EADC7E291FAB1A7C50F929DF604FC7FE4A38FE45B2C89BACC49D2516C39DC57ACBA7FB7A63978BBF6E8B268110E95BB9AE702010B3DA107C9AAB02DDE946420C8E97636B74C2EA512E77D58D6B7F31CFE0B7465F17A1A1950BBA18A18D9749185B3910CB9C0421893B56A13FBEDBA137B56805AAB18D4DF5896946D14D10CA009ECCB1CD856EEAC91D14A6193DBB1FBCFCD3CBCE185AC09C0905C3790FE4755A3BC8F373EDAB96601D9F20DBECEFFD6A3779DF563099B9E4C726638A2C43CD7A03396C5EF65E349EA200D80D6074F6D21D2AAC66C7A61A8C8AA730DE7C897389089E6F9857785104F15E661F2F42D55B381DC4144DE464FE0438FC9CFD0057641E69EE11FF361DD958FA4CB24713062C43ABB2BD8623C7F47B13D15EEE8FF3D11D5959DDFDC0E390761DAFA4F8639AC5AF2CF3D4F67DF50885A80930F87D2143B64BCDFFF9499F74846E6F00C2958EB58FC1761192FE3513919D7F49BF7D1293F4265EB417D261CD87826D988A042D82D3055AFD4F9433FC4DB6C63A1C693E696812CDFFDB3B111134AE3F33199B5B423EE31C892F1B394E08FE0FB2592B56655CCB03C2CABA952FECA6D461C918E7C3842F1786DE7B8E6FE7ADDDD5EB1071AA1807D3DA41CD2BA4C6A8107DEB7041F2A1AE85FA2B4FBE294187E3751A3D6230BA745D47E423D9728115BE9D75EC89612D5FCC4653F1FB2373959CDDCBAAD36ED869A8D0772B3E87B5521C06953FA57A18FC4CA96093CB1A0BF3B521A2B39D99F77BCC1ED3FC663CD4E8E40D3FA676BE9DA928CEA01F3EE47B150A9C88AFB11D4B4CAC20E1974748FB93F4EA29BAAFC8232FCC910EEA1C772C882A16A5AD611BDA31F0D26CDC8B856D99B81E1B187902A7A98ED741FCCE282262097BE08A4EA1E9F53A49FC1231F96457FD5D81257713A28F1FAE32638AE3B93428DB82632A97A7B3E6B16F1026185803D70074850F27573902FAC4D722B8D6E56F260CB125BAE093EB3913486106F6D889C2E856B14171E9B6867C53F7EE85B02845BD659C85974D828F435A19DB8E41EBBD0B686ED5F212BD6361C900E772829A08D730A7C3FF8A5BFA7C6806D8D2E869AD641AC752E28E040D8317C18B0C9325A69DFC32BD59B9BAEDE1FAFB72341D0D34DA17E10C34249FC5662DC9CC64F63FE6C89B7E451D79228B16BBE0C0F4B37C8F11AB445A9EA57D933854A22DAC31CDF02986AA17750FA7C76AFC6DC6BE24DF3FC874459ADB7895CBEE3151AF1D3EB8D20D7C44F123238777A676013128FF6EA3465DE57C1A929B42CC1FDF4FCF23E399B2776ADEF2F66B7F69E09E379F63C8B9F573542C7421C79DDD84918BE35BD036BE3172AEC9C234C138A1922140382191C4A22CFBDCD5FFCC0559EF0762FE00F30CECABAA2046C793B319A25942AA204DD00109F3F7E317608FA826F39A5BE13B9CF17EDE3EB9127789C063E33A121E8ACE9DFF746807DBE2312352934EBB8FA08D0512306B5875ACEB4F6D395EC86B64AD98AAB21EC9BDAE9A0428ECDFA95C0AF678CDB0297F3A16EBE7EAA81A4F4462142D619E204677722A7377541C4086C2777EF114E63AEA476236AAA1CBCC6EBD989B3837F9BC4CB0EB9EF4218E300F3E961513BC290C005203C0AB39B894A514DFF342DDAD5AE2AB3A9F64D3400859ED6CA76B8D27C0F3003C6747650F34EE1F9DF9F9BDEB88C541DAD5D0B42555E4F2B88C9CD68DC5B9CE90D8B6B01F85C345692C40E09FD79A1DE39D538CDFCB258B9E3C7D47F12B4203514832CB2C05325CF3150EE573F2565D49B4EB6434C087A175991E5241F773CF6EF1CABF5F6479AB542E5B501E42C69F66BABC479CF6B2D444DAB0CA1CD00B17E1856EBC6A2AC7C8FB54B5A271EE1B7E19480C5B6BF0EC8A89DE761A2851F4C491FEABE416963D17BAB1F5C1CEBD61070D10A161679F62FCAFC2B3D6D4C5876E42CD00AC3112450FC8619A1BFE0BAE11B1E2FCFC0741A94AB359A69CAECD8D949422D1F5343AD954F279A00B0852D50F8F32E7B3859E4514FF2BA6AACE04FB310B4C7CD473F8355002997CAEF4AA5388CCEDAFD76B7AE306182CA70DA6B29EB92C27C4BF25C8EC8D546783315AFCF5B3C338536380E0DD38617C3038E6BB2A8F3AD54E31025313637BDE04A7C801BC5DA789B801E83F89E148331CEA8C00002BC793C00F604637AA410C4122B4F9C73BF0ABEAD98BE49F6991186A01F5CD8BF31100C45C7DA0B0A198A34E583FFBD39F24BA1924235CCF0E4D49D022212A696492D9A639BB0DF85A2CF402F4D66733C2968C075CFBC126B5F6DD93FC35E83BE4EC419117782494EC5E47F366B43A766EFF36C63C1C88DAED28F45C24EC2C506B7A3105441B1130F6DD5BF9BF882B3EBF6701626832EDACD67516B7D3F7CF1B02A48F038E88010D21F867B3F3B5405216AA95DE9D101050383D83F0A20A35E5EAC93F285E5CD0CBED3FE7048F6721BF9AB9EA578A4B76C9784B838EF4557162EABD3D2ED4A100CCD470A28CFECB3FABCAA2D34EFF2705492F999FF88C5ED9184276A24339F5B7DD09D3CC9D482C67C5D58D02B0268069FAA3CFC3398FD053BA9F88CE7961A70230CC3EC10823DD0DD4DE9DD7B78A626E45DB984B06E2972A77CFCE0FF8B4AEFE9D5C853CE90F7E5BA4AA90AA9B67347ED136008B6D058946C65E049076A0C6BCD1C3F59F8302F308525E9659C6D90E0EBD4C1F7B7188F9C74C9A01ED9FD503C33442E97180E9DA3FA514F0BD8F0BF5E75DB0B38F9AE00A73CFB26806ED8759890DC7B132AE722680EE6179807AEF4258442E7BFCF72666ADA044CBE3A631C409DFA4949ECF28FA0BB271D1943733A73BF2DD5FD4BBF7892E27721FC35054F859AEB193FE72418133A75B360B5C9F0B91FC8F47338E2002EE31D70E99A471A4A81A52E3C41220D7015D6C43FB80C6B6FB1A546C64E2420D1999A0FA99A6F5CB0983140B9DC1DB9694A0847F0F106178EADBFAA31A7862300F96B7013E04BE333E7C81F017C9101F0FFB4742F2F7560FDC0B19E5809A32E65E22EE09B0DA768573006785901D315C5787215B11DF9EEFD15AB425CB0ECE854340E518B6EEC28646C18DD81C6008DD2A469ED00D1289FAAA1D4080BFA921F043D20C90F72C273A3A9BAAEAA938CF31EE5E7EB18A518B04C970D79744CF05BA4FA064E8BBE15A492E89ECEED61080CA7988F797465120A6B989DB18F9489F18D48D9578179D8EFEEA7B8DAB82B1A7ED1FC71D3E53025A9707F830D9E170F2235F8C6F6871F03E0C2D0E701495BAB9C5FB6F012564169B78AA136286CF3DE11F413700E523BD8E9947024D410AC02786ED7BB7354194833487B7429899CE9BE8FBE0F880A748865E0221C20A945BAB478A806030DE5BF58BFC4DFFCFB4235583E471D0CF09FB77041BD5227971A25EB01E13E0843E356A4B535E4A007458FF4FB0DC12D5E7BAF5A4C50DD766D474DD1304ACDBF57BB0F3E764BAF228178426A38604C38555BFD6A87C8A8F933058D8DE13A5E994B3DA69AA484650076D43004B041CC6A4493329F0D47ABFA713F9B77AAD2A5ED40136B658E3CC3F6DE2FD30379D6CC894F314C73D681705887EAFE1E560DF4421ABCDBA2676B7CECD6B1111F24F1D8171590E2EB0B14E1F877D4C5B475B814AB012BFC1BA4B4B703C45023FEBCB5CCE0AD7E210063C98F4BA27E2518361F3E6889C8F94BB27E6E74D265D18657AB6B84C6349EB23054CD9463E30E63CA99ED0CB48EF6796CAD39472D1CF4D9D3523293E1E79C0D9FFC26FB01060120B4765B0F4BF2DBF431625B1107D5BF4C20B56FF4F040E33DC56C834DD667753CB44A6E67602808ACD10E10BC4FD13E73E9216E2194084B130BC177EED4189C35D6E0CC38FC81FDD0305F4253E28FB41602A359B61C04A08C568876A999F9AAA48C6C87826D4FB42D612FF3483FBAD7B3EBC0E517D165133CA620BB6B3CFFE8D64AC396351CA17F67D1AF91B6513434FA4E336A3B89AB51D7C1F04711A39946C1DFFAF98DBF63A370AFA76F341C0650E81B44CE5D06BC5D86B10EE212CC50B8BF20EC03045D8F22EAD092BBB19DFF4A230A1DB7B2B508F7A78DB220A5F2698C903F9F2C479607408DD478059966AFF7B57122C44B1434F29788A3A852CB951453B196FA363CA798D3BE456D4BF7E580216045011F6DEDC19B75DA48778EA626510049B1B4D6E2374F47068782DC1F732B69764028E02A601B0523324BBF9F99F3F7045D31034C2E22F72FA7BADB5E15ED55BC098E6CFBF95268E989CBEABCF835C05A8BA3A40C41067EFC8A1FD62F4B867DC26946E0E67B49E089E3C6ECD340FEECAB69A9E327203EEB10BFB0FB9916DEA0F99512760A0BED56B126519A318403E0543E95396317E820FF53D0660AF89F93FB8BB0F4C2A4A79ABE887A62C29B97B980CB90E826E1FCED3DA739342CEFC0527452887E9434DC50D3E7F378B69BFD7F7AEFAD856FC7DC407AFC29F57E5D2EFBC541B8A6E0777B70448798565445F46ADC4B3BC936F26D204CE2D026FB28FA5752599D0CAA99DB9D3C65C5A12D67630D5055D3071FA1F04F9C5A71B2D64CE503B85DEF70A7A3CECC3FB17A58A459F97F503D7CF52C46D085180C0965E12CAB47059788ADF28655C948D888AAE6F1A608D33AA90EB6DAD95B1F5AE164D9970C718C8F4BCD06CFCB830C7964D1B91B4F09F4F177A690A065B1D4319132EE7DE46190D6D991A66FD041DB8D54017114778D5A778E06DCDD229C8E611E4628F046336B0725AE6D16CE06B70B3F0A10F7AB1F0C1E609EE3F798E933CF38F8250A5C0423776B3F5BE52D9454C5A09C0D3BDA4ADC57D965B4EC4824C88F764C2F52256C2B022DCF05CD02718FB5F894D100498ED74B2DB64E3DDA9DA0DA7162AD765BEFC4903E9E3193F5DB3AB0D604D41AEA3AF6CFD440DB79032FED5A677FBF4FD110D32D628C1F0001649B8AACBFE37206AE93C74657EEDFF929518D9906B2F3F2CDB43A2581071CA5DC7CA93BE6BB21E0409DE052E1E31A1C3C1C13226BDFE5DCF77FE4C3415BB66313BD75050B34C15A3FA0506452193E9452793552BEF7E0F485CBA2835FC331833CEF5A981C8744CC788EAABBCA3C634839858E43C38EB3F3800C2475A1E0C995E3C862B29F72BBB0CD176B715D5DD1989E2A277376362A7B384E3C3A7DD976C881E27E2043E014258253FDB315AB7EA2354E16C2F5786DADA341707CB2B5F26D720320CE46FE50A6A92811FDC16D2F04C708AB24C739FA10A3F5FC16BA807CD854C07A7DD057F288A43C9F64DD38BF700CE0D2E9C43983AF9521EEC111A14EE5F1E32E5A58F04A6E685059916CD632CFB2AAE0DE74DE56384EF44A056CF804012841A1CFEE390B5BCAEAA1DA14C8867902F468A14CB8660B6F905DC7C14841E98F4012AD0F6EEE579EA3FDC084B773F239ECB934D310189AFD2276AD6B21D271C55D3D00E9F0336C8EF4CD4EE46C493CBE09B9374F86322894EF296BC064D30E8398612F1891FBDCD49A5EA3AD2409B3B19C07118B5DFEAC41007AB2189D796D77BD5A6A6F5B7CC94319133A21CE3BC0179C29A42CCF128893E78F628EBC480285037C5775224DAD6E343D99DB552C922BBD5FB1F8B1E8EBF3677CE6E2604C93A63D1DE1B3B15951966758473BECB0F4D80A5CD993FF57FDA7A57610C0DD33B96B7B35AC5D68D315A38AE05A783231FBFB385105E3A2E2A2CB6480A3E893375D7E7208F7D2A73B5F625B0AD01630E9022ABA93466EB5DB29B275A186857FF97FB04F58AEF3959EDF31DAB01767B510A391935F637822EC852AAD8A00391C38F7FF970830032BA8D9F7BB42508D36B443293396B032F7EA5F8DE922F54CA41753F570E799AE06F570039813E9602F0223CCC9F0CE6853B34D667075124D66A3DC61300E55E482C1B6D1BB4687736582C342CA0FDC7A39F9FE5769EFEC31FC5F82CCFDC5577A7CC59CE68676B36917DDFB28B12A0A3F9513BEEB4AF233716FD4BF44AEBF922600CE9EFB39AB847C32B7B96580FD9A688DFD06F3BE32B619EED1CBA7089542D432E12C3D23956631EEAAD9298270EA52FD3DE21CD6B83BE6968D6CEEE00A2DFBD010CC542B25938DA54B767A0DE2164D2A9A02D98DFDBF501DAB8515E286DCF20884C3B2469EAA43423B198A91B55F0BFD20256BB4A8D7296E82D55E46BFB6FB6F8BE8BE50BDDFA61D7E0A50653469AB2BF2DDBF088E68E1697E72FDF143B03C8138213D8DBB4972998C56E04416B8926991CA17D8AB586E67CF3883EA136A0DC01A283F4AEF10EEAE360F73BD891FE5EF470D319E518FF530865DD4C53D125ADCCD2AC57AE89B42EB52521D46D47A2640480CDE6D19CE088A97330246F97DDC4E7736D967685436B6EF85B620FB4E01CA8130401F6574A3E4DD854F7F7B232E105AB15F288DEDABB88359CB9929B64B991BBDE140A64DC9D239F9A909D4B3A8375FE0B00857B84B7E14097D1D1D020DDB7A6073588A83449393F9AAE578DCB3C56BBC7DE0E69F8A52E5381ECAB649A80759D17D65D5AC28723A20DE44C7FE32EE2E964A3EE9F4C4F439F224D6A830A9E617EA9D621822B4AED885556107BB62CAAC1B7EEB30F15AF2121F458384AF68453651217126A4228100C765D1DAFDB218F47C1F74B0345B937AAA4E40BEC78A041C7F45BE6EF2EB95A40491F5C04BCA88087A8A6CDBD71F3911AD6F3E9178B4E6F9B1C0FCDB756589737443611312E11CCCAFBAB1594B07A0A9CAD5B3B1E03C219A3415A764DE11A49D95DB04B38D848AFB289208890345392470603EC99A7D3A5F2C9FEBAB17EAC832EF533CF6FB48C3F5C9221075EB1DA96A642CF005BECEDFD17FAF7422F11F1B9781058FCD353F15E5EC8235B911D9DB06C3677B41D72702B439C124F34AA4B9C3A278429272ED7F6816E324DC04AA50CEB2E69E6FC0AFFE97BB4D59D0E67E1B1489D6EBB2AC67E317DF86F8B78EB02BC8377FD993DDC93843FEB077DAFA548FBBD548ED25811F1435ADFBFEB08E5A20627EE6582DEA634619FAD76B59FB581F23134AA0ED627660167CAAB9E1612CC8945DF03F4069F7EE484EF13977763B3E72231863D75A25B9F1F68EA8A16BF0D32B998F3D267DDEA89C72797D114F8499FFD7E8E3F8BDD9C2256604D6D2ACF48B27CAD2CAE9A157C0562D1E5D104225CC7BF643D48606D9F08E2CB09DC67E30B43D4F503B2CA27201F0596EC378BD14E6C3AC491DBA097968089CF052385C9D477095FF25C6387D27A02FCD7C0FE3D6868546F4B8F869F1518CFBBB6B3074083307283579252B0E5E4316C8AE078A228B1B91555716098C0A309CAA886BB1F931975072BAA8BECC63FC8DCC6311192C358FCC6E78D4BB2EA0086A72A39ADE1868CF3252A0E2DDA787F46C8A693438E12B0AE3DB822151805275F035C8E7062AB7548C607C81CBAA9A2279831C184CFECBCBE22F5A382AA5B96CFC108F2DF483CE15C6EDD03C97FCAFCDDCB0AE634FD2367AE997A4C409E3A792937FFC5F735F834911F82F2D49EF708A6B40B08A7E485D9F9EE9C55A4789DB4CC9232F988261314123646D77ECE68F7D2D79C86958E2CCA927F6AA1510C3EF8B0213828B8A3E106AF9E1BC78A108FF5D914F1E00E6D2B0743CB2112E530A0F36826B68E809548C67FE7FFCA1B28FCF7049D77AEFD6411D2527E477F4D1B6C41C890F8A68E0E7D028F002433D06AA04815A9F0988E3EF27E3E9ED8796113AFF17C5E8066BF449A4972FBA0C88F11708CD926EF0CA7540DF910DF25C29569EF46A7A3CE6C9AD835008694F390CE2659AF469D3F721B5112FF1140C3E058415E818AEF93A30DD28CF2E438C833A444EADBED55AAA8A7F29BF5E78BCA8FE1CAD2387AC464C715851BCC6E2E7B5A3D313AD49C0AD36487DFED523A15171179CFAE6C6D7A768744146D13917EFD71E911CCDAF0DFB6682139858050134BB8535DD8BBD321AB6644606DF8F143BB68D146851DE4F462499434D7F700E1A85F4036ABB659A0E47902D3EEED52477B0F23CB476D522803B7A74275A26FB07A0F23479A92A3E57D560E7EE7D207FAAC29D8F3C28694AF3BF4B2A0BDDF3C879DE8D8228E232353A331A7F278FDE6E214EFA452A7AA334E7A2C5EEF6FCEAC3FA8FF144A700D7F1A0F7D8DBF7576E0F3D7C1B297650DE4BA2EDB3FA3EAFAF5198B216D4E77748BB57B3D81ED1BD3E564B4AF4F0A0F666B710C2EA955D04AB8108143AA579DC44404FC47303F8191A9ADB0A88672B61E73E0E2511817A6434383817E42C96631089A5745CB13565AE5A5D5EC351A97E40B2147558188A20EAE3CB05F4A326505FD528401797B779123E7322F851BCE7654EDD4A1B66B4B1CF88E1DB4E4293F692F5D6A725CCFBD839A7D99FEC01EF4CFE402B9D8406EBF1E4171D2BC3B1C700F0F384EDB8043872E4ADD0CA9ECABBC5DC46AA698ECBE2D91DAE40A8EE0E589E603D1E4B32EF35FC00D8EA365F0356F9B5D84099319CB947603F42A6FF9CD76DE404C4438654B5E8581FA62F307BF8DCD3EA62E5D61D3549A69721AA5A9FDC9BA51D7DE3A6E76D4C5FF7402984E14510EFFD4A6B37D60C77177AEDE45FEBA3BE9A8FBDB2B45C6DD9AFB957BE163F1432DA7D1F322250C4C72E57DC3DC28216DD95EE1A62513F3FFAB0D83E3482AF32574A5BC21CDBF36E6EEEB10ECF7B161E84FB5E767B857F691AF687D1C53D09199A13026B0D0C83082E127FF52C476CA22A567B470F68AF43F425C13079A535F1B46D9E7F2E26452F9520F2BA1A2167504D5E644FCED364C06EB28E0755EDB81F6365B4E87BAF029EBE9A48BFF8403BD05C2C9E672AD2A5125E9F5AFFE919B749DF227956FCFB81D2A65A519A59F99AE52938A152667BC6467B530EFA07CD62DC5CEADEFC2B9BD04E58CF33D161859287FAAA2DD066A0E0C0A344E4889FAB87264BD84BC9485040657315A567E576E97E560A017328628080B846E941EED8ED268865D6F2556F1AC6734127744E2B93DFE7C615654FD7339D31FFD1280C1D9C7BE2C0FF73CFDAB8A676335E3A4BC0631B7CF3D279F8F1A2811FD69F3CF9F2F6FE56E108631C3E4997FF4D8F69AD82303EF8456DF930CBE0173CAC46E84250A49CD7482AB0E1AD6143DC0060B9A5E3477BA33E6909461C096DD79E5CF27698586F7B3FF838460B4EF667F865BB68762A92802B4D0F7FF1724134876A7FFF95CF767889F67B910C5655C457A60A2C0D1DF70771A6F9F99FFF53C3CB458A26E75549544C59C7FCDAB60963E825AC7C3C70D416A9192830D5C81B30379D99491EDA963C3DB24ABF33D779014C9C67CEC28B86B12B13E65DCF1B55DCCD054AA619374002970B797417F7C4A3D46498CB851D209FBB350046A8EBCE490BDE239F4B1DCDA45459912733DF58F549ADE63CE3CED00554335D2BB636A5ACCAEF924D4AFA7BF23B4DCD2CD51B566677EAD2310FC4E25B27EBCF882673AF039D08A25FEFF190CF41BCE1DA359CF3B422F1D2D913DE922A06E0EF007B80AE8ED1D6EDCBCEB128F7FC087F06F5E6718114AB5250A0A292C8A973731E4D6DA130129B4A5F3A88A781DB1C25B254B19786F6BB8D837528C6510962DA5BF3A6D579A36243F7803CC17BFF56DB1EC0831D4A69DEFBB5BDFE740461DFDBB064FCDF04B19B428B1D574A8CBA6A6788F18C04EF2D7873AE8EBADAEDE57BBC799DE146A3E868D50EF0F83EFB75B4E8E5F4EEF2EE01A415F00D038BBFBF7CAB398DBD0A468F3F7A97ABE3BD84618CBB68FB7C984A53CB4D8AB0DE03C179951A8832C44A207D7D6536D397E69B6AB9EFC9B38A5B2FD5074F28B71AFD27844794A906F3AFC8C638AA07FB1835F742AEE602A1A256B1FD74B5BAEFD3EA1D2FE400C0CE41378EAB6E141963EF006246818DAEF7D9BA7E9BF52A66E48D2A78FF756DAAA4C2111F7A661744FFD3BD36E29BA0687E83FBA9C3409AE08B4334AD66BE02F81CD69CBD92D40E34597ED81079BD97AF2251C98E961D71F36CA9E24410E63CA6227C4FAD056135EA151FC88FD3756AF9075147F8878F1D25873498C181EEB74C3F0F9C6D589502BB0085351AB132CD7C8AD364FFF6C3C16BA0FF71A8FB416D175683DF10D6015F5E26A741593B92AD20CD8A4DD83C6761DA2FB451AC5EB010EA60C76B3688793B656BC8627F8C364FEA490F6C79266BB83B79D51B65E6269A453287E5D58AAAC50C23196254EAFF5F24DE82392FA9A03AC7C5D3D557EF09A08FF7716C9EF928E27665D08ED4ACEC624C1D7D4CE474D848B89BCAFCB8E82D945F349DC9973F5D689BDA25098B659185F7D43D33986C8A0D75575EBFA0A6EF57793808F5C2AE133737DF51D01FAFE00164094CEA6D298E0BAB9B5EA6E22EB34DF0ADD2BC1B2C85B5756CDA734AE1F2C2C998A4DA93AEC9E50B61F17F496B56ECD705AE7BB6AF56175FB9062357F9FBD70B0D8FCEEC97CAA3E35EB0FFA852A72B82CA2A96C6D3A931A9907AD08CEFECB198F91D99255DCD01A206658CA6527C9053D3FE3A9EB48E2CD388D77B671D916DE6AC888C0B9F8042F5141AF815F6AF3B2688BD6EC9D2A722D95D8B1A4B35F3AA3D4393727B630DDEFF15ACC45D6E3619057DAFF15556DF643A70BEE810D6A7233F40577F40D1881D5C5930EBB2862A5050E9B0AC0A936F6BFDEC77D6A4E131F84651C4DA6E485091C9771E27289A1BA34B04D481E43974CC02499F384DB2382BF737F0D87BBCA29ABE6FB9F0C92307E4F783C32C4460EAA7E30447FE5185BAB2A213300DCEAE3B407A9DE37BB487D55C3FBE458254886C1CFFD92D9674DA32C3567D9AD3452DBB208EAF463393DAF58610856C72FD144F39BF8D6E1F85A4AD6C9DF2CE419C4720F8F3ABE09BECB71186CBE86BA8206565FD3E927FFDB38EE5042A55A26EE2946E8C83B0F0C9600C33A105DD761E3D386637E5C3CD1C38A25FCE017049B0DEA258FFB597E891C06C1ABA2BED9C3F21F73E79F1FE6707C65FBB0BE3F856DEBB61B950710F93D352D65EE6D36A85D7ED051B0CFED05D8FBD616C4EBBCFCE18D87594E4C4E2B749A0CA258552530BA4B5404C530B4FDAB66F89F830B67F6AD4B33391A19CE885C89F4D1932F763CEE18B095A1738C894BC36D971D2F79F9E7E89B0B10F12888A476542DB148647DB7A825C876CF7250CF05BE2E65CC50483DAE4AE6B483412078F2B83E04B026100A88EC33B904DCC984850D8C1B26043A53FFF5900EEE4FD4BDA4D911EE202896620194173D6340C1B05F6FCE54BE3A0B0E5480406BD9D38781E4DF6ADFD173B0B21565F097060B952846A9239C0D6DD1B7427A743C287275A49C4E79BA33C3C7D8D38D3F5E2102619723EE79E098F486E5BDF28CC860BF136EFAD5DCFBCA61FB506B3FF3C64D8A811953B30E105C379113A884E5A46BA189A1D4181E3B8727F218DCBCB8E89D79B783C0434EFC0C01B5023560650B81759796E0DA7EAE31E5FBE7309AE4135D7AE90DA8D15228E7BE85BB52961DADDCF9293E4C82F5B6188B2E6314C3482D8356E883B2BFA9B85B4DE58F491B81FE5EFC041A96EF569FDB653F00A708A7CE2A09BC8816CAFDBFC390BAF28BC8DFC3FD24C0FB3A2206779037D0386C805EF24F8EC9F3BCA94A6C627AEDF043D48938697CA2AD0EB8BC37D168EC7EF18EE14D610F66CEE912DAB8DFB31B0A16441BADE97FA9575C76BED44E083C6B0F9B190268AA38BF0DD7957D4F475BC8A4C1326246A1BFBEE9B195E4A569C40EE7A29F835F184B06EC9D2A403DFD378508AE2661800B6F7DD3DD4C89409E5195B919EEFC3EEE84BFC261B5F701DF1F43B4F8FF5E1E00DBD037E54F8BB56927FFFE79F625F55EE660BC65DF9DDF66E54C4FFCB8F7D264ED60461713123A5327D281FFD08DB106BF1A03AE63EDE0A240244ABFED76547CAC4F0B7FC0F55427933963E33C5DDAA67EFA74D82F8DA5027BBD825EFBB9D6813D3106DB7581D6747AC38B10EA0CABF13E73541D4F2F3365B6B729A5D1DAB4A94FA3A7610752D4A634DF8CE6C7781E4680CF4FFD3440C2B9028DFDBCDF1347E13855F0AA79E3E09A55D54E85F36BDC01DC240B7621E8C3FC174A5B80D7FD23E95DE91F5467C4340DA6969F401070EA2E5A74DDB0CF9DA7CE9B744D7899DD340001F25802A912931B45594D187E31A8F6A3B508F63361A836B2F8493575B677C13416D569AE487C2E1784DFA072480F4ED5902FAE2D844B8EF4FA29A2966AE11BE0EAF21ECBE4E52356FA417A0E5790D4C4202A25E598C8E5E207E1AAB7660518D8A71D8157FF666A6C35E5E91C0BE1ADC984A559E3FA601DE35333F1112F3BB743A6A75DDD23314E2C6CAF0B365D976D9ABC872043D065E939A01FF51420AE3E43FE21A66FE3528D38C510CCAF3590285F6A9C7AFB27B34BEBC1A10BA74B8A239C41E9B53949538A28F048DE14384C488CFAF45398628B7A9CE599F14177BE6B75277E720B67F8B9F1E185EF6CA1D898AF1B1F54DA241E3C7D9E0696090968F51263F508358D349882A03C07503A3641F46196162DB51734977D60C04CE6F0E01D6BC30AA5DF61D3FCB670FBE9EACA254EC5C1A50B65365E90C56B20006F7ACBBDBD19E4C6914C465C68457FD27348E51AB28081D9B9DDB8715FA5EF6F87CA4E0D8A0EE27BF624BF33764419CA8F7B18BE3A9774597E32DACC88239CA838BC7EF394864ACB3A1C30A027CFAF3DCEDE720088C0058D10778F17C5DB31F7492BB822F381A57E9DE4CECE1BECBA338CFAAF338899DB684877D75792BB0817A2EBBAECDA8D1CF841BAFE686EC1C4C73296A032811D61C596C9390F2F7B528105611BD25CCAD77FABE024FFDEF207F8D12FB3D20A892BA06B9C5CBE77FE4F9F8D3DF8BFD53166F9450F395D1B1ACDEA1D9EBBE32B1EB8F211E9F9ABC2801F70B5FFDB26FA8DA67E7B4A541885B9AEE8B3B7155490F5975CAEAF75AC7993E1D1FD82807CEB5640881BF0E70807E77FBFEDFCAEA247197321F3CE50360D63AB5E1266E7F565FC86E08DA51F9010CDE2628A00E15321218E177EF72835EC80600D0E5F4FDED8015AF5598F43ED638F1540E91D2125EA349D00FF6473AC861C2DF8CF1AE5FFE8DBB42CF5AAEFA6E30C337B3BE4F3069A0ED847A96B123EF9792E1A89C1F0A8B8BA937BA240C6840276397839276CEEDF1FD91178C66E875FE8A5BA218DB380792C435A868C1895C27A4BCD2B6CA3F0A6F6E0C45E39C7F84FC21E2748EC822E4D4C6F41BEC2E58C3D6E8115BA5053B6D59815AF537141B3633AD0574CE868FCDE94BF6A1D7A46A298785965D20C551942F0A30F91CA2EF2AE7D373CD7E4BF2BC2D796E15D72B57DE3A2EC8A557A9201C17DF4ECAAFADA8D0BEFABF714182E37FB80E67DB35FA850D588509B0CE91E2C6A773E6E596376D758EC5857437DDFCD88F974D0F179EB81B5F21A6D9CD73EE421603A1C6DD93A1677514CC53C737F961AA2A3399F1F5C50F2630F87395BFFF99CEC51910FF215C409A2003F58FE9D43C67BBF141897CB3E9168C6DBF861F6869FF0A35EE883B07D016DF53C453737D0626EC52BA51A2AC2EBD0CCBF35FD741E2749B931942BD069484DE3E146162972CC55B3D0AFA0AEC064DDD5B595B9EDFB5E2913FD82D81899513A62CE9BE1B3B183C36ECEB16EF44E179E69B72BEFE8F670D645FEC98A9E04A02AC193162797589622E6A27743D7C3D1BF0807557E25D332D5866B0E5D767084A819B5A5768220E0C1902F5DF3DA3F4F686AED7542F5715770EA16C87E38BB3C64E608EDFC9407D3D98B5760570108525F5EA3C9F5061C7EF0AEDBA54F9F6217F12ECDAE394D0B87F2DDD20585D4F67F243A015BBD770536EC0381F1CC3D5E38BB3A3F03CBBE7257A73C68FA74527B3DCB7D8E15B4DE8E6A329F5E7BB4F8051059CD1218CEFFCC6F78C99FAD3838CA9630D64329C4072259A42F3514047C3E550775A067186C467EC669DE247E08C02FEAB482753A93430B19B6283D8C6D9FD279FC8F0007F2093C75DBA88EDD8C47C2762D7EFF8E89F03A4796F790C17F2DD118BEC0E3C56B4567B6F684159AB2A0196D323688018FF8ADC9CCFD274860124D746AD91ED89CFDFE33096249D0D63AB2DE1ABEC57D5C7B9CBEC86AA9078516F0B4612AF528CAB1EA67220443B57A82359E1671914C131CE9493CF8B63AD85A2D0D57841193563F1052A58FC5C6CE5A945B6FA7ED82FFD6B73A34F70CCDE769FDBB129AC7B088AECDA8DDA4C9C14AD3E372BAB34BCE58E6A245FA9456AC88A216D446585B5D45F1D5F899C48F538322E5F1AF37932406F7AFBDCCB0F276F99C03413B488A35A37323A99CEB0FCEB9568F0284E262B646EFD9EE118FE980535DDBAA239F938BFC02C5C7053E4E9F44E3182ECF164425BFD90E275106BDCC24BA91E4C9F74432A3526F4DF235AE1F3F9099ECDC21A693ACFDEE75A7041C66FFC0FD80F359F4B9BAA366014D07F1E5F00FE66081173F6215C244AACA47F9B43438FA6D53CC769257C4F60571E87E5C40619083D289A2399582670CC307E01915987FCD76B7C940C96675E91475DFFE1794FE00D0D205BA80E009DE2649520422A11AEE73F93F12D82F5217F753E4395CC440F24B8C6CF64731B5A9894F22E7D0F5138722C00DA140484D3803E6124F9A1C35DEFF1A95182CB6326203E72437208CAFF56890D1441CB2D721AE702025A75244060C8282B396B53924C3E49B4227947F43E45AF442393ADFE3D0D12CEE4D1C73C9570B069906E4242FBA2FCAAF3FFE88B6718AD16CB7EE13E7B06430039C24E9561AB75BD7CD993FC154E4C37E73521B95761FA6A00358F6ADE2AE8C19ED20E79E281DF4E38413D33EA0064727988B7B738631860F16503D3E516594746C5A9D8F2C11401001DDB45455D7366BAEF70558789385D3118405691F19D7E8A1C8B9DCBCF855A384CD5E5E56D40679C8752F673B3E8EE13C7D9BF28ED7A600F722D93BEE13F760F62BB8109AF964D68ABF967DBEC4B78BCC256C159C359E5C59FC57CED473BD5284ACD931D2FFB784FB3B0E6927F404F5D98FA17A59ED2C2294B87E3396F6810189F30AF1BE61013D70A7582A1771DC95144A0894FF876A489C6868EE8B7D45DB80C2CD7BEAC8CB590BD260080E1E1F3CC9EA4F30669D83DB7BE93C7FADF9A06F94581999B4F78FF0C0C4F6F7D95CFE8C471039E57A6CFAC47DE54AE969B739E4542425CC86FEE0E58A35835ED4297CF4B11E332D84BA25B2EB0388CAF33DF2695479DAB0FBF54B1979EFA3D518C11F0656CA44C844BBB0243557CC5B6BFBA1C17B0BAC9511779F729832546F45B4EACD4C9D99A0C8CF6FD4929A3F87AB9BC3759DAE900F414A06D3BF039DE356B45E0C38A379F7DD81227C08FECCF7A6D31A88A5131275963DCE6E684DA68B52BE995E880BF066F85AC5C8239A684A9E74CF50CD438F5A3712FA3B1890741EC3CA4A5E5937E8032903194081FFCC7B0C3980798AEF04846EB53C1FA851114175C3825169845B60A6EB20CE6AAF217FDD2AFC02BDDB70C01475B9FD209BAFC38F79611257D3669B3051EFD737BF18E218150E6DA2FEA2FB712EB419FF938A09697C3ED901FC137672905F07EEA02C29BF638C245F309DD4E6B9CEACF756CEFC4C149A084CED70197B8462DAA411A84DF6190901797151BB8C75B8D252526EFB35D1E089AD07BF7E3492BAEF15B751CEB3AF58AB551092CE2CA84798599C9B444B1C3BF982AC6180B4EEF7E71AA793C0EC224D877DC5F7A6CCDE8D40DA08F3286ABE4A723374866C15FC9790F294B03772EA45C8AB097415F0EAA25CEC864AB99B831129C10B3959325ACA2A88B563E4C91DF295CF1AB45407F5364DDDE15E974BDBE5E5F913EF3572C1C29C53F74BBC93EAEF91779EEA1EA536734F391A6872FCB39075B9352A950B39980C0670FF89537824C10AAB20DFEBD87873B67BE1B5922B525DF8E55F50D43AAAA9E500CAF49CC58396689E17B75EE76BDE8FE3FFFFFF4459E837F43682E8F99AD193016F479A0241981F29E5ABA875A15EF2EC59E1F42C2D9863F72F53DA0E9DC45687712D318EC04CF294E6F814A0723E6FC3FB797199A8F3C01A69F1B2B0F43F968FC7573F574AA5465991DDD5C27C908561ED4A9399FD57C6256DA7A0D6E29F079DD31B30F37CEA078D6F9FD97523818000C3B3907F4B796F0A4396DCF9958FF69FA5DF4E82E1B28A68ECE2F90BA22CB0B08A02BE2FF38E9A0ABF7967893E13CF25716E31661A60118FEE33BD2F897448C3529E2A81DD8BE243784FA66BB5C34D55BCCD2C11E33090489408F226CD1B3B454A668E23C9EF9B1A39E554B37E37407E1975E0EFC794E64EE4DF1C20E87F89BAD914FA04112FD395B8A016BE044F5FABDE9D6EA2DD78D58F7065C2812B0C02D15887607CEB6BD4DE34E7166ACF165929DDA2FD7FC93F7E8ECB732B4F4099F902DE5FF7FFBDC51732DF48910874E8449A04A17EE008F5E0ABC2B2CA0AA12CDB0F57FEAB08AB0405D5EECF3885ED042641FCA2C37CC0E35EADCD4E83D4AFA4E34F037E70A0A679817C024F9B8DC9ACBDA8E0B1E51E0E0A09C0D3C46789C62646A0840FC536B0303A9F8F9E3FCF75FFF04EEDEF1E36E7EF8E61233A1CF78870813935B83DBECC3E5E151D95B8DB3E112D097DCBAEBE3DADFAE9177DCB0F3E8DBCBD9B4662FDCBEE1F2DDE04BB2796A0E48059D6A89816174F56FA9807CD6111162F54D06AEAD2E56A5A5B44625C7BB5A2A2E3805D44D7A1B5F303C02AEAC5D5F899D0976895413E31765CAC38E8C4E15369E6EFF1376EAFCA69A4FE5145C7FB70112EB5DE73A86050A710B39BF3F5CFB5BE95511D3BDE1E5E140EDD3F8F97A48E4C3E9CDE93A24BB75F003D52B27719DB9EE0713B467E479A1FA9B7FE320CF924AC90523C55CB49AB0C5DA4904A8CEB205BED4335E1708FA92C5D31672421186A9D56742C8E37E23F93D55C67B2D8A401464E55D3F25737CC2291D7D25EFB5ADF77EC6094D91990EF943E82BC5A9CC8BDF046DFC1A2D4C66FBDE87F66F22B889FF83643BBBA226B6FD0161051F78D59C3A3A1E337BEFD51C8E78DA1C9DE46B6CB61A59BC0239654A47E44CABCE47D81CB060FCD09E02E90BADA195ADC6BD79CCFB432F114744A670A888BC108803D54228BF5760D9502288B12CAA6D4C3F86D7613A2269A5376F6B1A2F67372FEAC13F7486EDE1B7750F21DE51DE4F37F526FC9E44DAB12E63A702A3A862CF88E65A8AE0022021A47DC26A85D305491C42A45A364E4B5FD491A69BB22D28B3D5135289A255B4224BE960BC884719C382A150F17E9FA2A122551C1F8A442966BDEFEF65D876CC31435B3D540E7E45370E2D68D57E0FF783FD8A24CDE60E2BC82186032D7647BF5468A29EAD02067821C44E3DA7313AA7A6BB3A24381D4092DE51D18858F8EC0E9E27749BCED7FF48FB9D1F12EF1111EFF9C77B78EF4280E6D3AD29CAFDE15D9B3E384A880A41BB7759B5B220344886FB3F43C44F062E676026E0A1D8E89A0F5CEEAB6DD6D853AD373872DA6A28B23219047CF7E9B5F147BADBFF06E76863F086190E5DFAB3A2936778CE858B9CC4A7E09D708C1ADC917591EACFC826D4BAB6681CDF9DC0AB64FF9036E9AE6B149250FB35E66BB4A751DE5DB260DA7163FBD4DE0EDB7B33E4C110C4F2B74D75DEF708CCE08B7189812F23AD0E52F6D432D5A864E9EB13BBA6C851ACC2B947D3E295A2D12347647BB4D0B8FE409CF0C1DC1F40FADBA058DAEFDD07BAC3BEE12CD747BDDB84C79DF42F3C313DD0DCE0A988755A56D107B558321664DB9E27EA985C91641085AE4AB9C79616BED161C4E5D3846C661DAA0EF1DE79365DB261CCD84BF3D26443947314BD17C5A0BBA25568F13E5F8A04EE50E215F9CC752A4AA2FDC97615F8374EA5EB2E6051C939574A2AEFBEE06846066CB6562747C197FE2D3CD143C37D34B55A685D9AFF7D17184970CC73F7E0D02CE8FE691C8C4CA05100F0B1E410DD5E8A4294DDD467A5F7DB03671829D2A53FB75AA321C3FB2032D238A52275387F3A03F39C7B5493F1D7FD40706E8C75BC2D4AAE596356994334C5BD7110D23E81913A3BB158CDA3A63E2169B73037007930B71B6EA9D22C8E96019830ED81618F53E33448CDA2E2C2D2F47BFE586DAE281E22AE787E643558098363FDDE268F04C470501BF9437D83C19B86FC0C190B76B3664FBC080ECE30F2B84AC87D52639D3FA6B7728ADAAEEEF93C9F447244B823FBB7E3056B8002A282118F334B401F49C6ACC4DE58706D1A446C97FE2D011DCB38F69B4AA3EABE3966D07DD988D1C358E50204D876584A72DC648FF840B924D61539BBF2A86AA7A4F58B2797CA8BDA049EC0303AEE158EA87CA7E710D67B25AB414A7BE23C58CEA46769C20B8F359D11346B18001F05CAC946E2E096BE80EFDBF2CE57867AC1BC0E9D147E269F5825160D6E769E4F619F90D4E12A55DA1DD3FE2BE38D846B2B7E46369D6C8A67BE28D709A580CD6CF73FD2603D52295C6F655BDE1800EDF6907D54A657DFA88578BBD9FA252604C6F95D47DCDFCB563E5D27D32D269ACCAB61F3ABCB76AE63BAB5573151515B03FF10D87C134091FB0F68BCF4463AE8C37CA6F6A106CB131B7810BAC8700D3BF037567C14C9062ADB8F5241CB93DA04C164A664E1DBF86EDB4BA91F93856F82347FF53884AB1CD9D1192D44D275FE69FCE27CCC8D81F3362B2DE0922102F1EDFCC1EC190120701CC1F67AEE1DBE34ACDA7F786D28CCD2E0AB22249B40104B100DCDC6FF61A556E9EFB6D4F63E7A485CB71611C153FBB5B991B56945DD8ECF8CA876901F89884D6F37E89D3EB995CF6FB877E18AD9F926BDAC6EAFF4655E3DF264694D87FA67F019EA1F45AB5FED1E53BF6FBE3864C1A32F0A44D6B4F2F71B14BEF2CDFDA11B1B3ED60128318149A02F72E95A6DCE0EC7F287B036635489EF21B249543CE8481EE358644ABCEFA3CF65E99E01A4A3255DEBD4A34DE0A125A07368C9AB13E1B08C0747AC8AB9A4FB5704B9AAD5ACADC4C030301A3C5CF68AF4013FD9529F145F58869977C6674A1C19BC33BC0A732B3A609333E8EFAA7C21BCDE2984730A2A42CC042253AA8FCEA4508203CEAA8BE4EDFFB91E950C5CED4FBC041988C427793FB415F196836EA2406A3DA0EF112319F0CECBBC4FF9C3BFDF5DD6AFC73B3CB5D751BED8CA6945ED22FCF19665182C6EF4365DB5481F0274ABF9B03CA8956C14DF2699728DD72A1D0583F52AE465530505B9826C0F7F4E4988EF65971D8181EF531B82659E2F83F7B1C0A462CE30AC499428EBB609764E0B6D428CDD4FFC2CF3A8DC277AC140D02109D72C925355C0F9FF7E828830BCC09931B2FD0BF280ACCA4A85C3FF944AB9E9A104E7EE504CAA6E0C455147F4FDFEAE668D0C6DC4DE88DCFBB011A93095F8EF79A445DBF59A5568C976064B12A4EDE2C3DEDAE0AE72ED4CB21DF777598D72431A021504D3B9B7D25FF2ADDE63E74C1514A0E26E31ED2556757ED14E23CFBAA58DF6F4C7B0A0B2F171C6182F882C37E3693B6BEBA6A599C8C13033209EF9CE00F86507A38B3F115384921BF2D8779F5D6290787D3FD6DAFCFE9D3C7FE24952DA49AAE14697BE4022197BAF0BEB20B1CFC348D3A0B17CFF0AEF91C3F5732285725590E3DEA12510DCE87B6EF19D41871A0084B0E0090BF1874320CA9F004A928369E66D85340A916AE352453648FD9D6A8FD04055C807EA527077203F2DCECEDBF68EC5AA37246B916A3B9D46DFC0F677179440F63D8E1CC12A197BB41353A3D0DF542054AB791312D6F3D1CD29A4FCBCFA45699D1FE27C4450E056E4AFCB5E087A4815B31388C4BDB290EE4175654F935695C7150F0AFCF5FFF6A1FF0D26E11794D3DCB3E38DE2BAE97AEB141782F58FF7AB65F83BD5897ACD84DDD6D87C82C774CDB0F03BE5B63BDBCDFB478C2D8901E839C6A7F8AA38A62EBF2994EFE4758B6B77F8AF690E9CAC242603D0498DCDF99051E5D65114325BF71C58E7CD01D2508FABD767D73E188B5658482C49CE833AD531FE07A71F682A062ACD804E7C3D120CB1FE5B82A28FBFA943054FF4C56E911FC42D77360CD6CB5AF29F1AE643C4D9571CED06644F4C70EE5539DE0D2A75F78B26DAEC75190C3C5F7424C923B17409F184253A1B4F592F9B737CA03A244889AA67273AFB93E7C490819E2CC4808D53AF25070F21E6354249040566C05CE7A857F89DB1A30CCF164C578BA309F6198ACE9B83ADF4519B7975B50CF47D4A129B8AAF3F66ED4552AFA14ECEE43F47F305DAFC2F326105015E1F7D01F2A1745300450720082AF2F0068E9891017CF36FB0B81C473FF2643ED535923D838C6DCA282B77F41E909F1280E70D14016BA9AC2F520141889132884D8AD673E7C69F423C7BC6301D3D53B1FCC3BE7C786FF6C7C12FDC4B2A1226568DA4C3D2941C01586FCEF7B8797C1B7A599B7FE082BC1375ECCC1A507BDF97F8EE1EDC97BB3A4F459D41CC45DD446B4472F041DD2CFA0D618F1C5C25F2A7CCEADE3CD120CB0B5818F81E534CB3004923C901312FC849B25CBF2B18E1475B06C733A7284A458AD86C947A895B6041CD0C53356A03042779BE205B4730D5D639F88ED74636D1D569EA63C01E6C0B352494290DC92F1C3EB86DF72A27B57506EFC048F6F4E61AE83281B56981C3AE816278ECE717F23005BF456A6B491FE4F339E97F84F25D458A0FE460FF1B0AFD8FAEDD83AE04F9FA14690E41741D82EC25F3900C4CAC3D388B7A4AC1C613915561DC269C6E61B240D56CBD273CD0806B4731CE4EAC94A0D96E181E03FD3286B495C99B159736F657D582AC8A10FA021EC6E60B6F889468EC8F815C259CA9E7276008F7AE4C508DC85C4AA3C2068513BCB57804C670AE8885F5AD55DD8B2E5478D9EA5AD54D79CE5665F48136C55485C918DEF97631D89D584D5A0DA5CDE3BF984F13B2559688D6A86ED883A320DD5CD9602C6B372CD00E476FA4C6C8133EDC0CACCAE3F0646DB565E001B85C738420C1C746ED163215CA4FF7B3FEEB7F1038E068265177B74D92A4CA0EB46C07C18E975109418CBFDF7ADDF623B5017737603E89DEDB476553794B09270E4955351932E597DA2C243565591582321AC03CA896E35EE8EB95B02137924A53C2365BEE2DCD3A76FFE68F53C6A71D71689E152ACE3E7D41CE98545E312531EFC94A503183D357FC13C865B6EB3D277FE84B9F01CFB8992DD144D6EF9B212BD90EF40AD82B7C4118515DDB60DA8F71FA88C630621D77C84158BF392BB3808A7412B56EF23FDE1D0A508DD1D5E9AEA3E7FB368FD69EB513E6BCD5DC70A0A048B8A44AFDB8B38628FD1FC1F8CA1E36A06C367B6E37EBC402F8967962E81CF77E76861160AD0FFC03EAA5CEAF7FFBD5D49D84570D51F298F833666A7DFCDC3C8CA0C27D7EF0B313A57FEC3ECC6A0FEFBCF48450EFF5E6FDF4BB8C547795F7B18BE3AF61FADB6F567B391FC4C35F893C6A6C2291B21FF48D5D03162608FC84CA062D334D77A6E53821A7E9AD140A154B5E5AE60B89C7E67611C60C99665BF5CBB1549EEE5A38A2D77C4CEA5AFE81E1E87C96694987F5822691FFE9F56BAED0B635AD84FD443DCA3D9BCFDF4AB2F25EA461C0D591E5E2E954BD6D008AFE94AD4D070DA4ED43AB41648791BBB645E4ADD93BEF89488900AAAE82A0F173F94D4439DE247035D9B6C19974340BBD6252FB5BC2EBF4CF4388C19B5F38EBDC16255592613F2BB7BE2B30E0E6A59C1055405134F14DD4D14B3A56758F371C5F5F7146E48175FDC6285F85912CB32447201771C2408F177E9D85EBBEB591CDCC56DAACDC0819362BE37A7DF070F25FA7EEA5BA7B0130A7657218A9E9E355EF2B65A7C07F719BE48050FC6E04AFAA2A3163A9C8AE3F5A295623C12F2D9AC3726A248B8CE1DB4EA9C02E74BFC4835E975E74922190919A30E57C4B5592D8DA4401CF8FA7F24825C53190CC41CBEFDD83C9A07F593B65D5CC25EE93FC4C7DC4BCEBEA5D9E2A3E0D16616A10FD8AAD2B5423B993614D44DBF9EC8E319B37DA23BCF18F2BF0C474737236DF859817FB7E2D95FE562E7A486ABA0CD0BA0007442DB1BF002F62654BE29FBB69986238E884D008B6A34B06F63617D09F596BB604D295D4FDB57462014AAC34E3E67B631E294B8DC165D504F6F60B1585F726D1E26AE73BC560D09552776DED26E53703A482650BC1473E33F738EA7AC28835423E29D5A87FE7B7FEC381F393E17865C5CA0436B695B9AC5778F57682C3F46F490097CF486EC7520D8649B95FD3BF5BF23E3038A5F0C55BDD7EDABD6E1C5FF91F3B559FDBA8126F2C85C97150030A6D86F28DF4495605D8894D90E47FDFE69893DB8B0ED5D29DABAE24EEAAC28F32C217F741E920F4DE0EAD6265F0B56F5E92CA97B6112CA61D7B76475CB5523F342FA853733361487426298CEACECF2B68A75E8A39EFA41F555688E135BE0650EBD1000A34162609164747449EB25EE4A697192D1B8A6CD3812C392342FAAADE02D4FD0BD9649CFB7B165077BBB40D7CFEAE1966B3DD9A6B3D7B088C2161F8502DD24F1460E5A0E880869C3AA3DF6370662CE1DC6676E21BFFDD3600A11157147B243D8FA99FC51C8B79D4387CB5C4F57E6896A382ED5A99AF79C4DC87EAF7C20381E8BB3077BB0B14DF49D2A732069F269DE94FC9A4E8795FAA658EDA791ED7ABD455E497AC8914398C20AD39832BBEAC681E1976708F71FF0A0880A6B13D28EF316BF839A0B9BC53F994932E15529E9D4DE428FBBAA85843A4B649F6FB09C66F994FB0DE944AAE94D0D4B057548CF7EACE8583C8682502998EC9C47CD719EDA594AD8C5D494C12C851C8CF3DC73FF17DADE09F0B0826FF684356D118D52CE7BEF6C9A6B40640F72964A8F4B8FD6CA65D693B49DE17FB08105BDC5A1307FD7950C0E782F2C31BCC5BA6F8735ACBA7249120BDDF9307A8227EB5AF8AF0BCB17D55C2427FF3F9ABC38EB27E0D94425065D114A9387273F10D62E50036DEC94B57CD51EF07671AF58C9B8A031D2D0205C22F6D7699D4DBFFB9FD1439EBC8A0B11546F8C254E18CC16696972589A1603093E76355B628B36DD7B53465A5939681AB6F8A85E349815C4972C44914C67163AB9499ED1B25B45B391AFB6AE4EDA0F3807F0309C1B025FC30AC1AF0C8E78954ADC7D6B66696D5A7A4C9776FDEE029F09B41875C63D7D82350C0E933B58F9C7F05B5782311D1C6F0532C3508F2E15C7593DD493AAEF37FC2579813186A59CAA829074A2B657ADFE1CFDCFE710A9B3D397809A84466655049D19814F1DF7FC7FE781D0F064C587E2DC17C251E3FE671B867FEBBEEA81424597087520B48F6E21F43CBF65DBE0D4B1D96A1DDB0E8FA2A3C04B4D9EC4665C67D5648C00ED4B1363CE0FBDAF43E594482B4FCBEDB791C2A93F65BF9D8FF202D57A316D91A7FE39FE924DEF9C3C5B8756F7FC1BE3C1E7CEABC38948DE451CABF1219DFA053E9CD3B9829210735CF7762FA4B44893135E9DFA239D7FD3FA9F73CA916C63777C22D0F1AF3EF83F59AD3F198D1D35C5B30127BC415BEB26F460BCA1208FF4E15AF028D56BD6C1C64F3FDE69C7F5AA76371C7ABD6E28AF4D1E1E12D51F12C2F650BAFEBC9D2EAD1B421B9AA8D52FBDFDC3A9D628341C791E1B6CF149DA04E408EBC10FE7E108D3DA30A7D9709E6FCCB94B856AB6D4492904BBD5288EA314D00F267E8AFFE9951D47499206AC47DA0858C556B29D3D4BA1E768FD3C5B01ED4670659F0D6683FDD8CD8A8874FC8948561F8DC64D0F154F84BAA8CDCAF1B3CA2BCCA1C48A088FCFE725FF850914FDBC595D751FDD63A1DC3A375A0FCB9FA86C70A25A68677C0DFBC1B1BBDAEE6D30A9A8E043ABDA670ADD64FE79AC88E772764956CBB5158B01BF274A3BD34B588EA70EA0E464EEDFDF17344A1EF4ED88E4CE2A5CA48A4DB2E64285D9FE4A2676027F9B08689ADF44386EC02E2B8B6C16F5CCAD48BADD23E3C044456B9D450AE5828B8262FA888DD4D05778AC3A4B14D631496454D4F296DE96D05238446D105FDA4A77129103AB07CB38EB30597BC239AC4B4A43B5EC2CF707666392A1811D2E4C8C0E842F963C1E0502397440E6856F873AABB70D03F124328211D6486FB3E2EEA01EA910E252EA8EA192EDEBF828CBC1A564C7A1F5F11CD5C2F6F4FD7D6EE0F83EA24DD5BC31B65D1112A68FBA1B363F884DA2B91CD02C2FD07420D3844C633E2BBB10901756CBC1B074B83A8C085460509D1C5F1D84C3AA22D59784ACB8EE73F4486DF04F84A54EF29BE5E85F94ABF589B7C46BF919D6C3F3377D6AB10866622A31190BC8BC21BD7F8957F1AC611F57745B003C6E4A2FF24BDBE6C336D70B37995BB3FFD465A664537AE12EB3ADA1D50836995F9F42A07811B329BD08DCE7AF726E61661336F8FD3BCEAB1896CE27E4515EA79E0AE9833B4937F1E7F9B4F0758FFFF7A8E3A15A68BEDBF84398A03B6063BEB075F69B330D0A35E3492F980E4EC8D4997DFD5F74C8183AD67FCC82DDCE3418AFFFE211BA7D4124EA749ED18E351E7774D708843E323D5EBCCEB5EA526354D7AF6780CA0157EEFAF8D5532E7C335965FB50D83DD64C80B20AE1260379F8E0A6114CA0BDA544C5CA712D42DF4139DE6BABFFDF17DC68F2A4CD52B65BC7AA2F6934E38C1D251B6608D602FF61EB71873E07148B2DAA76878FCE7637979F0687C3D9F6C61831129AD2F38515B0A83AD8E3F84630390A1EAD28443AB4494FFD0BD6E9020916867E19B5F5F397416BFB3389D6D65E6B4421232DF7A4D53DB81FE5679C3C51661DAA03C26109C8796BF6AFDFD6C9EABC30FECDD34D593E6B79AAFC7C4D5CFFB130187EB3128522C06505D54BF89C919893CD0FEA2A30C0DCFFBE89FC98D5F2CFB328A7687D70E6FE5320C95505816C39479F7F97640D6755F6FB6A40A04C43E32285B05D002FC3724890A92A5E69D3010174FA3F98F88C10E0818902BF761A42F4D7A5C5D59E2FC48A305D257F981DF8093B8DBC2C4F8FE0D7DF531D3A9DDDB5A713B07458A62BBCF529ADA25C851EE76B97916952CB59A65D8ECCD29BD44587D1CDCC1E0B978D0CF80355072E88DF9EBA05C59BE5C88CB55CFDE1ED25B5CC9E022D96134154BC3E6FAB907AA1454158807074561C2CEC998C2FC9DFAF617314A20F340E9363F8CFEA5911718DA814FF95946C74224FD4A8607E5FAD15A43CAAF658FC39FB2DB308F0A3191106B53E1AD849421A1A311F41199B5177B67114659E2A38431223CFB2CCAA2F108397E8241277ED93A9F6970DA51C3C63BB8D45BC3453D91D19B60C37A232898FA2CAC0FCB930F62E77E3054886BB7428B71B7172DA78A0D7ABF045E22F9B2BFAACDF91E927887535CCE5A50BB5122852DF90D029D18C0E3FAE3460F3DCA58AD456FFFA8C30CB419EC00A273F11BF15AC3F29B7437BB5C47B5B301C66B3B956F537DA10D95FE41683F600CA057104E9608F263BFC7959E4A5835983D2A6F750928B2FE137AA007E949ADA50E80C5F6A2263919F5EEC544CA8F2F7036D5BC8EE0075CB3436117B31A92469EBE4D9F31382A05C23D7ACABB9B86E3542A2B1FAB83AAA9CB4CFF7E1CCECB4AC5FAA6F08AEF9518F112DFD6542ACA81DAE832E40CF95BC0DD085E6361EBDC7E4A19CE1460242734EDA1CC96CDDB9017D26C6149580F95F9D17656A841C5047EE905C567E0359E58F6D5404F57061E91FE7F331DBAC62F015EE600C662F7A3DEFCE220D04B73F95571309D4D5CAE2BDE5DB46F82E1872B0C12A7056448E8DA906C090DBD787590F98FF76C655D0CFB3525FC7891E55925FAAE7D8C7C8D5331C1FB28D09C8316423171BACDB8B2AC07FC97BF1D3135F8104CB8054DDCD92A17F3ADA06AF37F0F9406446B9CF22CAB5ECBE50A2AE96309FD9695D5EC681257A741DE37A19AE82085954FD0DDD4135D47DDB31FD949798606341FD29D8C293594891102EE84EB95FB4E2B7951B47846BD957A86331BFF0D77F0BEE58DFD6CAB52ED2554B82274EA1B70A6DA74976E1F6945BCBA62ADCC89E4A1D6DC36485230F73A76C6BEBD7BE7E0EA61175648EABA99540D778EB238C3D2FAD651BEC33651D560BC39CB3C2783F5B20AAA203498953201191D7625824CEB75ACBF6077050C6306B6AE78091B382FF8F3B9C5ACCD734F1763CE87CBBDBCA64EAEFEC4C8B618541BE58F60C2832468839D0FB675224C263257C9C45463B9BE7C56A357879DB3B4B1D34ED534D5FB409221F7F53F2BCE722E7358617EB4821365F13FF502A8642A186B341B24A2ADA70D1574FF5A1BD2FCDB899F918059C0202F12AA87C7A5795F2E9FEBD2FCA0FF06090A9ABDB4B1F893F72E8BE7A2ABDB56834812137A3E67B6FB0DAEA8605ABA385CA62EB402E07F7606BAEF7905C9091E30803B1B8E1F0F3E955CCAB0D3650ECA9AAEFE13000865573D3D8E1484C7840DC124C7099C557AF348C86DC10AAFF1633710CBEB09B18149BA554FFE298008CBCA897FE7D75EB59369B19C8D1A15C37B09F958ECDF3A53E7232797FE6A6693AF16F06BC84DAC9B87A736474EAB2FD93CA25476F3D3EC3EAC758314B3D4DE71A3EC7BACABE81A37CF1871A2413ED6BEC1734FC6C315CCEBD79BE65C11C5DD9E1D3A3C3DD8ECCC2D3BAC250E7079B5E82AFC99BF9CDBE8FBE04E4E1E56B22E4F1AC0F534FB3E472E4F7208937BD5111AFBBB35D2F78AC34616A070F62876F9FABA3427BA2E25CDC62A1A09CD70132F2ED0C998EF620CA72A25D25C01B343EC85E3BDD598B11BAC051BD66E1711D6B9B614FF54CAB9A351CFA32A76E07CB04A50729097655C692E7CAB568D76901389F7CAD05D7C8CD2AE12F94DD9F77FF9B209C1ED1DE296A4916E7A6EE3B99D02F7292A1E955392176E04CA023179E30A57415E7B3F85149F617D68C69EBA82C3AD7E2EB2F5EDC4EB827CCE80B68F1C0F366D15C843FBB566B9F24559AC1E00EC012760B789B01D8D743CE4CF088E5D71D2CF2045A240CA47ACB109BD21CBD027F9E3873B9D890B2B11F8F83165259CA5FE3934AC3722ACB937123A19DCF3FE8CF2D34F2A613A255B166026118E94546E600E5FDA37D124BABB6F97800E39A6D4FF3153E30A3E7F1F2D06D5412D97F31F97FD2314907F9511958288AE7DDF435AF277794B395780DDA46A59202C36D38F8F460E8501B48B52259AE54DFE19B85FA6B954B0D5F2C30EFBBAAAA07FA474BF92467CB10B63E872E60223C29A0365C94C1A2202B1A67B9772D101FB564F9CB3E37F63BE0F5DE57E3D4D60618A22A492816D6BF47BD4697B24C281AEB0DD98574E15AA174E868A25C929638D6DF497E2A7BDA70BBDED7FB29C052DD0CECD873DA5DDD00F4D7F18C02937C6275269B719995325CC5B33FD157E30170B4C875702D2EF74E3BE4FF416D4A458C25231A9A81F2AEC0FC3EB66704E17A9DBF6A5975FC00E5515A2129B2BBEFBA946A19F7D045F36CAECEF0B5BC9C26073C831B099A6140EF437EF204416F7397DE773E7512EC840F0F4770EDF0CFB80B0F61078A006F52DB5BEC0262DFFDA512B3382D513AB748FC33976B40D2C17F5682FDB5755E240810A4BB6BBBF1134850AB7449013CBE51D102551C04EF0E04E120100E342090281ACE38D4FAFBBA7317E5F32315FB5EE1DDA6F2257C2B5DB734C69F22952711E5F6DAF2BBF468AE4C48D2C8DFD0EA7E33A27DB8374E3A8798336C87827027BD789818C96365D55614FB6D52C1D9A93D1776B31004065773EBE1D5D35E7AC298508F3EDBA4E9CC9F7DE0F6BB435AD173586B945E2940AADCAC2E7FB6C53459DF536B881D11C4CCFDF9B8C0C9B32CA38A5BB815F37BC189F8CA2895BB665AAB54DA6899AFF02E1305CACC73761FAEDCED2348B7C82689F8FD5E076C86105FECAC1B09517465D73AD189A437FE220C34DE283BF9907EABE3F3704698E1E9BAC7C3AB6A41D9472BD31DAB45F2D25205A9E2319CB6FC68E1CE74F3C2D21825B2EACAB12857AA64152F654B430D1B5F71A023516F065D33D2D3C22C0F391E3623F3F1C70C0772D1C2D3D586F334E127C5C9B79DD7E8CDEB73C75EAF6D68C43C0BCBC57F55B069736881F7001BA96991F5D33AA91D4A49008E02C67E5220B6CED54B88C176C3C647AF6E6DDB8E4DA6584B55230A98D0B140C91565F6C0C782190FFEC8999D8010970EC77E41E0FDC195C8BADFD1E3B6F87F767153480D14684B8BDDA20FF9EE1C223E40CDBAF5C8FC55E4A0ABED58C4987DDAB16160E9AA6000812C11485CC85350637DFCA320E94798159A858FA7A4EC6F6AD0FE135AA538789BC394FCFA059DB7BE488B09193F52F06E2FF699786A8DFF36569B716E4AA3FD883045E67F07FBB5D088403D3EE34ADADD07DB70F6D72934F17D4EE28FCC86CA6EC1A6BD8F1A284F1B61482BDEF79051BE5D516C99134D0C55F41206CA5F64622BEC35AE215BD3B75203039F856FD55C5D0ECADF094BCC41A33E7CE84849EEF9819BF627D0E60594A4553420E9ECCE6FA119FCA3C792AB2D372E5DD3E669FFD2901B975870767A7A03F8E26690D06BBF65838FE93990C6EF34BE0D2DE15D94E341A9F09A93D5AE86E53CEEC676F6D67D432709CA17D2978E75B6E017FC1F944AB6178EB6DCA63548BF509AA27FC123834F10DB4F67C8BCE6C246BC2F4F953B7836CBE5A69555E317EA22EC6DAF24C97050112B2A5DE9E844B0F82A488811A6BD6B620FF52ECA37A6628BB26754A7D75CFB31DEE6678B8F55B19E82B32F510E2CC03DACD95BFF70BDA966DB866299892701AD826E2F0D5B62D7A89FD1CB9A2EEEF7BF23A4F87772CD31EFF1548A5F71FAF9564A5364E7CA8A133A48D2A2B8A3E95BBAF3BAF6DA7759E4E8AB390A5C571F67BE81EDDBCCF7A1043C6B1AC52D38741EA19CE6AA1BD987D45321B738BFB8CCCC759F890FC5899EB14BDA9ABF28CCE254461BF1499D47050B8D63C037A3F3ABBEE91FE428F38F1E03B1964065630AA5B06CFAD81EAD569E3C5E36473BD540D6C320AB5DF7AEE004456E7678D19A8E9B620B3D03731364C7E15F6709F685A9FB23A53B66D994B47F75A94D8C8869C586C617617FF0F1C7E031AE07E977304417AF62223EE8FD3554D5DF28277BFAB114B4DB4E2AA40C095FD6CE6E18A48705E63F45DB43DCB21FE42FDF36920F83C90710CEA57929E7F6B28C6FB2FEDC15CE7D6E919C9D4C3C74ABC96598654FEAC435AD49750F12FECD7EF5071BD5C6AB135F7B83C6EA2949C2FDE3DB43AE125AEEF39A7B6F40B6285ACBDDF794F6D444C89F65656E4FC96B1EA6729ECF45FE35F3B1DE95F62BC58DE0E78103CB2F1CC92A922163DF3AE24FC1599A222A339073C22A79C6A451C39FED07FE4790364CCDA90353A6D98B3C16D949D3BE5446C9BC0641656B35BBFF19C4FBC6C73A17ACFC2D651921BAA6240FB35D8085C2FA56D20147508DFD4BF9B52B991B941A760D9C0E046F02C53075BB0BDDE3D0CF19B725F7FC25251B14EC487A6677C50B1724DA15588F7371586FB9F54E720254C3C529D5E6468D4C61A64E257FFF40EF3E30002271999CC2771E6C9BFCE9FF7D179C62E181CA96CDE7F7DD6513756F19F66731E0A15F65BEB3D2B0E0F4EDBF8578B186945A2118A01AC14BF19AD663CB7584EC9E34CCE4417D1E809F161CB0830FA4E107B126448E6C919B4593825E8D2F2965A9A9381F169BA125F9003C50D04CE5E1443FDB816C9DF9F71D96D423749DF3C88DE449D5C806F9E47CC07A8C17D19FA09804AEDB11F109BEA91341F81F2F7611C0AC8372B18190BAA8C35E46BFA1B47EA3883758DA39CFF3A90EDD7E1B23FBE3E93513DCBE21FE5F7E99FFA76795FE085E641C4118841532AD56F3F45A6CC2AA3A1DA4BFED59F39702EC2B3D46FF6BDA8146F8F822EE19629579C2ACFF5750D386D87B52BC48111AEA5355F44B639CDBBFCD73744C046E437FB6ECC026CC38FF19D6AFF6B62CE537F4DA9ED7F1B5FD9FFA018EFFD747987C3FF57EDFCD0B6A181309D9BA8FDD21E9ACD647A8D73AF4204131A7F1C96F2ADE1069B8A04D210C50E5E7D9AE5943342FA616D9E0B99AB373BA9F9C1DCC8CA3EE04FCBF8A8E094004FC5FDAB1B2C531B60ADDB28295AAE15F33F254221F6106CFB19C1676A66E6672E38A0683E7896199A9EAA9EE455CECEF41912DB38EBCB44CDCD86AA3AD54F7A12D0A7F60AF864BB83530B1C8342332134C3F5223E2CA159EDFC45018DE8EAF8BFA1534AB8DE940F6C258F24BD9E5F26954EE7A066D2119AAD139C974427904342E0583BA808F2ADD6FA15BA97B0D37FA131746D19655514C1D580314AB9C25016FCCDBC1EC52EB0106C1F455912514A4CADB37C12A47CBF52940E5F4FEE619ED3B0765BC2A7504CF821BB632C1477EE96116E4D39CCF3839FAF2F52B577B7F741B977BCCB9FB3F82E24B774A8643E1D59175D4E5F41F86DA43B0F642DCD089AB5ED86E24FD91809AE82D0071CB1D46C6DFC5225A452AC12EA3D5237D8E51E5F611E0CAC864D8DB1DF941E679954BED27717DE55E80CDB4E530C0C01AA2428818874C0FF5541643C49F331AA150BEEC94064EF0908A39E0BE5A7BAAEAB5FCBB59C989D24E8C6AE2CA867002096DC1908885007A2A4393AC0180708FB61B63CAA17485E9206090D8796B7369892B8BAFCAD0E81C3C539CEDECA82AEA13E1C198EF1AFE5442B1B0AE4771B96161C17F206B50F690D4E151254641608011304BC730A4EA225B503947DC2E2EFEA36AC1FD390AF1B829AC3085A0E592209F65D43032BA96F702B883A560AD04760C5C8B373F8C5CF894BE5265C8754F81CB0E791C1E06B7CB4ADA0E4100823789BF8F6D531B02003F4F6022DD5F7BE9C122676924545BA574CC1FFAA35755180F77D8A7707652069048942428F07CA237A5B9B2ECAAE95EB79077473B12BF9545A1C075C87555675DE49220706AEF9C48465EF4F375E729EDCECDF5B757F4ED20497DBFDF8CA09325179C1E23C0572542E1A4B33797525029AB8083C689ED67A58EBF20E3B305303A3F097878D876A1C03E2A1A5E2036DF30CD145F918C06B4BD95EEDFAAA3134640C9CB99137E42C74BE58FA7B6675DFB75F17EEEFD4D474FD1C5BFBC51394D3D628ED84B90B466DCE003AC16BD138F0E8B234F379E76CCBCBE16AAAEF602338C2B0C02BD37DACF5BCD1C969F72D2EDEC0A6E7C70423623FFEFF4D77B4354B1A34E9F9C00E607E5E8891CDF6D3EDE3C6143021F329195E54B068A2C11042B719A5A4855D5759424BBBFACE6E594FFD5ADAC89B5268225A3CF40C52849819980398001DAB6115FA3A15A236FB47E9CFAE247F0EB30D0D7C90CFD6D2C89A9AC1136A864010D5D492B122CBD656BF350EE2A5E96319110EC58FB68CD1BBF1FE4875E1C35B7A504E337C2354C49B08A895BD582F7170D8EF6EFFBF1F2C91C0DA5B6DF3AFAD6B46A038224490D73AB9B2471725E0025832F4F4EAF43BE14CE37BBEAC31476D85AFD1F3C54B47670BFDD661528F58376382252774607117AF7296A053676C2C1CE896318FABEFC9A15B1AEC914D779340AD279FB477BAF0D8BAECF7551F9049EBA6D7C9C0F731C24B9C1BC72EDE92B7748137ACA8F65E7235A8A876D980F728EBF496005E76FB4E35858C69BAA92ACE976DC9A4E017BE2433A356E81CD396A90D45A15A545C495CA7FD42ED292AAC864B791EF6C9B65C68EE11952D78133FB27EBC17965A07A038FD1F47179FA91525AA4D3A09CBAF547C5E1D4AFACA42FD736025440B8D96B58845DE6F9FE0C1F908F6D709950837E27F0925E1C682DA2EBD0FE911C00B08A7A7135BA3AEC8BA2E8859E1763FE6E9C1D7518AD15C36131C643FA159FA1BCC1FE3347761A45B524FD1891B92BC3314128DAB7719C8E047B4F74C4937A8B259B7AD7BCEE19A7D790882A810A7C2B194CD3B1A683E69501CDB61151C61A26A6242DFEB55C3661CF6BA018221FF62DC7D5A6366F71732DC2B29DFC6E9AD3AAFBAA9B3736E5926AD97E0DE739CA2445F14D96B8447243DB1489817383592F264D62F8197EC65E05FC55BF4ECB5BB92AEE0EA580577327E00CC8D4907E5DE80F5DC9857446867CFAC14ECC411D3158E084D14EE2AA9E0E472556FDAD8CA5DCA2DB3FF12CE911DFD599F3B4C8953E788FD9F13063FD1FAA319FC96D2862CCF7BF38A8F275B84D327662836668C097852FA320603FCB39236FCC6EE3F8B698ACBEBA38E4111EF30ABF07EC6491A3C6FB37C4FD7609A713E9C1A3B2202816CA6E9F18B97FB1C317BC7E70D5EC576C736BBBF8B977D02C326FD80D1DD1E522860166E51F27EA0CD6D7DC62F9541B11D6A8BF8B645240515DE017FCF195513F7FA00074AFCD599A7DCE07E0C47A7212031BC413BA8F190AEF27E38BE32AD441F03990ED10723D3083BF1C448A2BF96659745557C734FEC6150A0338C7642686DD5C2E46AA11839E19E5DED7BFC71227A08292C291464432223618000701DFAC6CD50CD8FDE1DF4E37D90EFBB8697276B4E2593FB9F17D97606A43943E80EEADFB0911096FB9B01EF883BCDC85D7F3A08D05B9DFC1302D650C23A4AA425E29118C8CF99672CDCF1961AAA1076ED5855B93EA2E0C28622AAC0510A21D4A333D889BA369A415FA21FCE46C25AFB126472E524EF8095355C0F423B25F530DE5ABBA27650492EFDC782CEF5E900B00434031331871B926B0664B3D6583B75EE2E23667B98856DCC11E07188EFEC1079CFC62A34123094A80C13BB2C66F5F2F4202FD4FF331DEEFE3E5BF6359814CB05C95751E5FB10BABD36D399F7384F05487FE5C36D3352F83AA7FB9A6A848D34FF411CCC8C87DBFA5080D1342FC09C4FAC00DD8A4FC6403989207E217256EBB9E3C583923E81700B51565961CCD11D0447143F7FDD4AE0EA3267996A4A141EE4CF583091A9C7EA27F2A59C4FB99B177639FECA09D63373BD3544A3A318AAB64153BA1DC4A4438E433853954B8135DD041489D3AEF219D85A5555B8ECD191DC3B54739178FC0986657486CD360C89795E4CFBF5BE84153CC303F45A03F8FF5E0FA1918646D737C8091F2C3E211A2DC7209C5EDCB04CB947627835C6032B3B7958F70BB73FB0A65A7C292A694B5203B57F3D83A6AE30B05E8795A0C68D597D3E8CA3536FF28D569F619F6578E7F86F6A8EEB2437FD60165AB75008B5FE0BA2DFF895F24FEC0C6294A86A48F84BCB486ACF6E5B1D06122F5672D33D33036ED873A81733E4DCACB9377C77522C690763A9052BEA1A4382CD5834F57A6125A1D9E396AB60D997E4D4650F066B2362A7B065CF9EDB5138F67A9BA51896BA94E0CB50DBD1511E23BFD5B8ECC90124ACE0B81C66E56FB375894FD4B359452CFCCADE6542D00FFB8149646B4C548AD59DD60C7201930D028834857ACD21C783DF94941AC6FF5A832CF68BF01, afterDelayedMessagesRead=1106903, gasRefunder=0xe64a54E2533Fd126C2E452c5fAb544d80E2E4eb5, prevMessageCount=114681392, newMessageCount=114681682 )
    • TransparentUpgradeableProxy.STATICCALL( )
      • Bridge.DELEGATECALL( )
      • TransparentUpgradeableProxy.86598a56( )
        • Bridge.enqueueSequencerMessage( dataHash=746B5133D7227C892DA51ED30131A04926DB84B2E802F86EC3D2753781C53579, afterDelayedMessagesRead=1106903, prevMessageCount=114681392, newMessageCount=114681682 ) => ( seqMessageIndex=360143, beforeAcc=2901928879A7507422E5DC88BDC281CFB8D30338138243C51EF96A8CC3787F9C, delayedAcc=5535F1083CA235B2E368148C3FEDE92942AFBC5A18F0952432BED2B3C4A8C355, acc=E337770116551314FB622078F648FB961231BF9407C12C060C476A1975EDE187 )
        • TransparentUpgradeableProxy.7a88b107( )
          • Bridge.submitBatchSpendingReport( sender=0xC1b634853Cb333D3aD8663715b08f41A3Aec47cc, messageDataHash=ECC4B38586161034BB286668AF1A85B2978B2FCA0DDFC51C48EE285D2040DEFE ) => ( 1106918 )
          • GasRefunder.onGasSpent( refundee=0xC1b634853Cb333D3aD8663715b08f41A3Aec47cc, gasUsed=208395, calldataSize=99332 ) => ( success=True )
            • ETH 0.027372911653798303 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);
              }