ETH Price: $1,860.73 (-8.51%)

Transaction Decoder

Block:
14761719 at May-12-2022 02:56:37 PM +UTC
Transaction Fee:
0.246904679969265474 ETH $459.42
Gas Used:
1,256,403 Gas / 196.517104758 Gwei

Emitted Events:

469 TransparentUpgradeableProxy.0x10e0571aafaf282151fd5b0215b5495521c549509cb0de3a3f8310bd2e344682( 0x10e0571aafaf282151fd5b0215b5495521c549509cb0de3a3f8310bd2e344682, 0x0000000000000000000000000000000000000000000000000000000001783745, 0x83dccd5ba8292dde0d02645d5c888b7432c0dd813fb91cbc9a11c60f46044e14, 000000000000000000000000000000000000000000000000000000000178385a, 86ab5824cb7ac7bf348847c0e31b94c060069732dc1a18c3ce35b7db54f48676, 000000000000000000000000000000000000000000000000000000000000fb92 )
470 GasRefunder.RefundedGasCosts( refundee=[Sender] 0xa4b10ac61e79ea1e150df70b8dda53391928fd14, contractAddress=[Receiver] TransparentUpgradeableProxy, success=True, gas=1524033, gasPrice=196517104758, amountPaid=244698037464474938 )

Account State Difference:

  Address   Before After State Difference Code
0x284c1875...5a4B9438b 460.95758627788683794 Eth460.712888240422363002 Eth0.244698037464474938
0x4c6f947A...C874F95Ef
(Arbitrum: Old Sequencer Inbox)
0xa4b10ac6...91928fD14
(Arbitrum: Sequencer)
2.011396764908798406 Eth
Nonce: 61297
2.00919012240400787 Eth
Nonce: 61298
0.002206642504790536
(Ethermine)
3,500.711254471676437075 Eth3,500.712510874676437075 Eth0.001256403

Execution Trace

TransparentUpgradeableProxy.8a2df18d( )
  • SequencerInbox.addSequencerL2BatchFromOriginWithGasRefunder( transactions=0x038201EA07FF8202C484D7FC3099831A8118943D6BA331E3D9702C5E8A8D254E5D8A285F223ABA010FE70DD2FC00000000000000000000000000000000000000000000000000000000000001400000000000000000000000002F2A2543B76A4166549F7AAB2E75BEF0AEFC5B0F000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000149A960A95D6C9FCBAFE728BC000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008659C918206FEC46E090A4F9D4FB3F7118F4F78D000000000000000000000000000000000005A7189B351C2676E2A427F3500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000038D7EA4C6800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000FF970A61A04B1CA14834A43F5DE4533EBDDB5CC8C3C9521BC30B33C8697F2E7EAD96C2D4D0FB46E841E287E84902B6FCCE3297623E51A3E4F6E0D4A0B83F04BDC7DF14AC083B80642177DEB797858ECC7B5550A5000382040A07FF8295EC85E8D4A51000836ACFC0942F45A77C5024EB546E9E7F445F266C0D3E71E61680C9807539000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000002600000000000000000000000000000000000000000000000000000000000000300000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001C000000000000000000000008C76406B0B69D023AA5BBA5E5AA310070000015E0207080406050900030102000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000A00000000000000000000000000000000000000000000000000000000326CEF8000000000000000000000000000000000000000000000000000000000327E4800000000000000000000000000000000000000000000000000000000003282E777000000000000000000000000000000000000000000000000000000003292F786000000000000000000000000000000000000000000000000000000003292F7860000000000000000000000000000000000000000000000000000000032A967760000000000000000000000000000000000000000000000000000000032A967760000000000000000000000000000000000000000000000000000000032AB0B520000000000000000000000000000000000000000000000000000000032C238BA0000000000000000000000000000000000000000000000000000000032D6EE7B000000000000000000000000000000000000000000000000000000000000000413E3F5B0CBC255180A7135533ED1376B0353FF4299E5382F51D35BEB1FE89E886420CE5F93B75FC6AFFB117F90C97F51ABAC55F7550F97EE0750BD622A3DADDAFCF521A6CB222A6BA464839C035F96332D9A8A1A46DB35409973D24084483F941F66DECD180487F6F00F8AAD7936B299F568C9C7277960D50B34FA9D9098AE51000000000000000000000000000000000000000000000000000000000000000406655752793D32397387F07ABDFE917040CC44B324DA6F6839772ED9E0EDAFF24E1A84DD9B524F35E7953EC4367D04A793EAA9A1286D2AAE6F241A2BD129DE845756FFA7D0D4278822B89EE7A235947A5F92008A103A52637F7AE18A16CEE08702DDA33CA834C7F18C604C85F9578478FE9E0538901B35449F0A606FC196364D1D04BE6FA358D9650465A4B981A1A3A71A803201AD3E303C49F6397EF318B481656EBF98D087F83B10EE67EC4DDAFDB8E93BA73F139905B70DB62F4434E5364700037E07FF82C9568501032EA0B883120A049400000000000B69EC332F49B7C4D2B101F93C3BED806A08C50464541216BAFFFEEC8EA535BB71FBC927831D0595BEEE3B1BD5835E63E2EBFA055B0B5071B31DD84FBB80C5AA7147E5E89084966A7C3BCD215CC850D40D700BD1C0EE62AA16585890209089460EA3F067793AB8CA01038212CB07FF0E84D7FC3099834366B9941111111254FB6C44BAC0BED2854E76F90643097D807C02520000000000000000000000000026271DFDDBD250014F87F0F302C099D5A798BAB100000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000180000000000000000000000000DA10009CBD5D07DD0CECC66161FC93D7C9000DA1000000000000000000000000EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE00000000000000000000000026271DFDDBD250014F87F0F302C099D5A798BAB10000000000000000000000003776AB6A5B106372A5C42D12A9043463C7CADE8500000000000000000000000000000000000000000000001945FCC0F4C92C1FAE00000000000000000000000000000000000000000000000003409327E5CA12A100000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010C00000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000C000000000000000000000000000000000000000000000000000000000000001C0000000000000000000000000000000000000000000000000000000000000044000000000000000000000000000000000000000000000000000000000000009A00000000000000000000000000000000000000000000000000000000000000B800000000000000000000000000000000000000000000000000000000000000E608000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000064EB5625D9000000000000000000000000DA10009CBD5D07DD0CECC66161FC93D7C9000DA1000000000000000000000000BA12222222228D8BA445958A75A0704D566BF2C800000000000000000000000000000000000000000000001945FCC0F4C92C1FAE00000000000000000000000000000000000000000000000000000000800000000000000000000000BA12222222228D8BA445958A75A0704D566BF2C80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000001E452BBBE2900000000000000000000000000000000000000000000000000000000000000E000000000000000000000000026271DFDDBD250014F87F0F302C099D5A798BAB1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000026271DFDDBD250014F87F0F302C099D5A798BAB10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000627E71441533A3278F3F9141D5F820A184EA4B017FCE23820000000000000000000000160000000000000000000000000000000000000000000000000000000000000000000000000000000000000000DA10009CBD5D07DD0CECC66161FC93D7C9000DA1000000000000000000000000FF970A61A04B1CA14834A43F5DE4533EBDDB5CC800000000000000000000000000000000000000000000001945FCC0F4C92C1FAE00000000000000000000000000000000000000000000000000000000000000C0000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000004C4AD0E7B1A00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000460000000000000000000000000FF970A61A04B1CA14834A43F5DE4533EBDDB5CC800000000000000000000000000000001000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000064EB5625D9000000000000000000000000FF970A61A04B1CA14834A43F5DE4533EBDDB5CC8000000000000000000000000BA12222222228D8BA445958A75A0704D566BF2C8000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000BA12222222228D8BA445958A75A0704D566BF2C80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000001E452BBBE2900000000000000000000000000000000000000000000000000000000000000E000000000000000000000000026271DFDDBD250014F87F0F302C099D5A798BAB1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000026271DFDDBD250014F87F0F302C099D5A798BAB10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000627E714464541216BAFFFEEC8EA535BB71FBC927831D05950001000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FF970A61A04B1CA14834A43F5DE4533EBDDB5CC800000000000000000000000082AF49447D8A07E3BD95BD0D56F35241523FBAB1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000C0000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000028000000000000000000000000000000000000000000000000000000000000044800000000000000000000000000000000000000000000000000000000000016400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000014414284AAB0000000000000000000000000000000000000000000000000000000000000080800000000000000000000000000000000000000000000000000000000000000400000000000000000000000082AF49447D8A07E3BD95BD0D56F35241523FBAB1000000000000000000000000000000010000000000000000000000000000000180000000000000000000000082AF49447D8A07E3BD95BD0D56F35241523FBAB10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000242E1A7D4D00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000024432CE0A7C0000000000000000000000000000000000000000000000000000000000000080800000000000000000000000000000000000000000000000000000000000004400000000000000000000000026271DFDDBD250014F87F0F302C099D5A798BAB100000000000000000000000000000000000000000000000000000000000001C000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000A405971224000000000000000000000000EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000100000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004470BDB947000000000000000000000000EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0000000000000000000000000000000000000000000000000348FC139D1EDC840000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000018414284AAB00000000000000000000000000000000000000000000000000000000000000808000000000000000000000000000000000000000000000000000000000000044000000000000000000000000EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE00000000000000000000000000000001000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000064D1660F99000000000000000000000000EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0000000000000000000000001111111254FB6C44BAC0BED2854E76F90643097D00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000E26B99776E1C17B873510344EF7DDE9794EC65F301BEF00F566191C3EA1416FD0732D67141C7B0E164848D4A475AFD148E277B7B54ADAE890699F0B25B558C7C03AFD0BD01038201EA07FF82021384D7FC3099831A80FA943D6BA331E3D9702C5E8A8D254E5D8A285F223ABA010FE70DD2FC0000000000000000000000000000000000000000000000000000000000000140000000000000000000000000F97F4DF75117A78C1A5A0DBB814AF92458539FB400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000015CF0203F30F23B90F41332F98EA000000000000000000000000000000000000000000000000000000000000000010000000000000000000000006A0C919A0AEEACECC0AC5A6FB79EAC060CF7C659000000000000000000000000000000000000005117A503200ECB5ACA16000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000038D7EA4C6800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000F97F4DF75117A78C1A5A0DBB814AF92458539FB4076F6A90A48471F9174F422237758E567660D17FEF2724BC61B9CCF1B76E3E66051DED83B0F373CD6360D7E0B3BF69085C2C6F0F1C62CB215A32509DBB6EB8EA000382040A07FF82B6AC85E8D4A51000836ACFC094EFC5061B7A8AEF31F789F1BA5B3B8256674F2B7180C9807539000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000002600000000000000000000000000000000000000000000000000000000000000300010100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001C00000000000000000000000E193445CE0BAE19053668642A3CB19770000B73F0600070904010302050608000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000A000000000000000000000000000000000000000000000000000000001AA008CB000000000000000000000000000000000000000000000000000000001AA2CBA4000000000000000000000000000000000000000000000000000000001AA2CBA4000000000000000000000000000000000000000000000000000000001AA627D6000000000000000000000000000000000000000000000000000000001AA627D6000000000000000000000000000000000000000000000000000000001AA9A2CE000000000000000000000000000000000000000000000000000000001AABAFD5000000000000000000000000000000000000000000000000000000001AAE97DC000000000000000000000000000000000000000000000000000000001AB3F000000000000000000000000000000000000000000000000000000000001AB99FA30000000000000000000000000000000000000000000000000000000000000004EF598A7044A627B39E95870B7DDA0735C097EA461B2CEDBC69BD46CBDA6B7930C5A11C3604AE4035EEB1F898202BD6B7B8F97F6F5980EB2928F551A6647D25FC08FD750E9286BEEC74759753D48C025E2A034356310EB3867555810CDA1E8020FD733D5EA92CEB978F4B00787A6F51B1B2E271EC046CC01617FDF0E4D8D948A9000000000000000000000000000000000000000000000000000000000000000439CB7B3090E75AC22A5BE4E2AF5F240D540CE1B693F8F02FA76D0DC554875E4D5FD9F1B290384B04522E756C34B073ADFC3C916316C64C18C1ACF7D70674ACA80F0AFDEEE60B133EEC974B0AB54718C6CB891D95208C90BBEC884AC4DB0CB80C605CE3385F073371F650B80CCFB1BE3DD6ED0BA675857DF9A1466FD106B4206503066DACBBDE6E54FFBDC7C0813892D956E02334CB1460E5F503213496A2B4585ACBD226DB288A3C8BF3049A51CC43EC72820F197C2A0E416E4D8FB464C2D1B1010382040A07FF8203BC85E8D4A51000836ACFC0949C65BC9C18F754129BA00C5298B539E69A32102D80C9807539000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000002600000000000000000000000000000000000000000000000000000000000000300010000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001C00000000000000000000000C3087C6270E39B90F7F591EE46657B6D0000015E0206030805070001040209000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000A000000000000000000000000000000000000000000000000000000064E11C645000000000000000000000000000000000000000000000000000000064E11C645000000000000000000000000000000000000000000000000000000065019441A000000000000000000000000000000000000000000000000000000065019441A0000000000000000000000000000000000000000000000000000000653C7A70000000000000000000000000000000000000000000000000000000006541D254000000000000000000000000000000000000000000000000000000006541D25400000000000000000000000000000000000000000000000000000000654EC471800000000000000000000000000000000000000000000000000000006561D9F55000000000000000000000000000000000000000000000000000000065783249A00000000000000000000000000000000000000000000000000000000000000043201DFC4F27916D6938C1C6B32D343492E6612EC39D1CE10B9E3FBD85ADF27CA7AFD1F789C279CAF0E6AFF7B667DAD3D9FE8896F232715341417A951A09206830F95772500D91A5A3FC469D20EFAB2A93B29AF24DD22F077EEF501ABE59CEC9FD0DC96DC3F259D124996E7749CA0506470BD7A2076B8AB43E1E46ADE9680C3B30000000000000000000000000000000000000000000000000000000000000004048F2CAE94B7E327A719080E217ECA70EB6B2B4A7F523A41045430C5B226C0CD52D0702CBD62C2B313BC836711D47582291EC0C0C8530E7DB77157A43063F1C064E0F55E14F2D2A64ECC747791AF2B7EF468FC512843A1BC4EE23A8F986FEA1D7F476F41057E0FF9CE2C3321D5452ABF1457DF0B613F5F11C7B9C8F43FD162716DA621BE9C315C280268DAAC543621AA81944D0460918E611F6142297264C5A406C4D699297B3F0932C5158021980E5A2A4D65FDEEFF3FB7834411A533C6B3F1000381E707FF4884D7FC30998309E53F94AF250E6765B4E206B2048254CDB2152F158912E680B159749C0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000059D7D35850A899C000000000000000000000000000000000000000000000069EB5F19B46A35019C00000000000000000000000000000000000000000000000000000000627D2048BE3154A084FB53AB57DEF22A329CD6CC57928D62FA7D3325F57279D0C4CBB505127F715E71FDADFA1E08069296F436181CFAB6324EA46BF80EBD3706B0109C63010382020A07FF824DC985174876E800831AB3F09468B3465833FB72A70ECDF485E0E4C7BD8665FC45805AE401DC00000000000000000000000000000000000000000000000000000000627D46EC00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000E45023B4DF000000000000000000000000FF970A61A04B1CA14834A43F5DE4533EBDDB5CC800000000000000000000000082AF49447D8A07E3BD95BD0D56F35241523FBAB100000000000000000000000000000000000000000000000000000000000001F4000000000000000000000000565D82C9C9584D21AD8EE5A73B56CE71DACED7E20000000000000000000000000000000000000000000000001BC174ADF3F0800000000000000000000000000000000000000000000000000000000000EBACE2BF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000025F354B8AFCD60371E487B0D9FD88DBEF4B4498C4C196BDC92FB4B97CC7C1525396942E5AE641AFD3B32D8506C67E1740CEA25D98C1B3522BDE8FB810F76E65801036407FF0C84D7FC3099830761FC94535D2FE398D82E682E38275EA0093FD963847A9D0F0F0A862F64A5F988811E51F5A572B88AA12E3ED4E574ECAE7B709CE607DE726DCC31C646E25C7D14BDA5301183A386F8A54AC1BA1CA9CE0C7C75A17E59D73CBB1E00038202A907FF82028184D7FC3099831B1C09949C2F81E68A562DF10F762E38BF62C324E60EA566809F9482080000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001A00000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000002DD30000000000000000000000000000000000000000000000000000000000000A5700000000000000000000000000000000000000000000000000000000000023B70000000000000000000000000000000000000000000000000000000000002715000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000017FFA16F7F06A7E9E22E9EED072A06D0D3C7DB7881A27409625B6301FC187147002D71257C842FFA2320E8368C29373AB6068DE8A5021975AC0BB92B6DB598DE7010382020A07FF824DCA85174876E800831AB3F09468B3465833FB72A70ECDF485E0E4C7BD8665FC45805AE401DC00000000000000000000000000000000000000000000000000000000627D46ED00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000E45023B4DF000000000000000000000000FF970A61A04B1CA14834A43F5DE4533EBDDB5CC800000000000000000000000082AF49447D8A07E3BD95BD0D56F35241523FBAB100000000000000000000000000000000000000000000000000000000000001F4000000000000000000000000565D82C9C9584D21AD8EE5A73B56CE71DACED7E20000000000000000000000000000000000000000000000001BC17596C895900000000000000000000000000000000000000000000000000000000000EBDAAF5C00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000071B52180D5D67BE958028D4C96B01BA26E0483872D1554BABC19C8A887CB6F6D2FEE635831136179260D38FFCA7B8A52FD20FB6CBFBE714C4340A495CC17E5FC00038204AA07FF8227EB85012A05F2008315AE4494BA12222222228D8BA445958A75A0704D566BF2C880945BCEC90000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000003400000000000000000000000007CA545A1EB1FB24A74961CC1A95AC4614C2B70BC00000000000000000000000000000000000000000000000000000000000000000000000000000000000000007CA545A1EB1FB24A74961CC1A95AC4614C2B70BC000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003C00000000000000000000000000000000000000000000000000DE0B6B3A763FFFF0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001206EE86E032173716A41818E6D6D320A752176D69700010000000000000000001C0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008072C700000000000000000000000000000000000000000000000000000000000000A0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000006EE86E032173716A41818E6D6D320A752176D69700010000000000000000001C00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000014A9E94B900000000000000000000000000000000000000000000000000000000000000A000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000300000000000000000000000038C0A5443C7427E65A9BF15AE746A28BB9A052CC000000000000000000000000FF970A61A04B1CA14834A43F5DE4533EBDDB5CC8000000000000000000000000F581571DBCCED3A59AAACBF90448E7B3E1704DCD00000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000081C251000000000000000000000000000000000000000000000000000000014DFE3D6CE55941783AFCC3E7B00187E4179429ACB7CE0603E85408377A317CD774E043B50F4838B157DDC4673AD526E33B2173E2D79EBB63304BEBF4DFFFBEFFFCB68663010382010A07FF8236F385174876E800832DC6C09469844CB44932B489F07D0F6FC42294D357A7B74E80742E9E0F000000000000000000000000FF970A61A04B1CA14834A43F5DE4533EBDDB5CC800000000000000000000000082AF49447D8A07E3BD95BD0D56F35241523FBAB100000000000000000000000000000000000000000000000000000000000001F400000000000000000000000000000000000000000000000053444835EC58000000000000000000000000000000000000000000000000000000000000627D210A9DABC8E2A8F2B80409001EE7C9F3E3E9DD4E8F2AB146170B1044B6AC4528E7D528D8BE9679605031D6D1A2F8EB7554BB8F9221671BD1DB4821B4A24367C2C09500038201A907FF8227D884D7FC3099831E848094E592427A0AECE92DE3EDEE1F18E0157C0586156480C04B8D59000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000A0000000000000000000000000DEDDEC1B0F028F6831765E9212A68F5990BA09E600000000000000000000000000000000000000000000000000000000627D201A0000000000000000000000000000000000000000000000001F08A56340B341040000000000000000000000000000000000000000000000001F08A56340B34104000000000000000000000000000000000000000000000000000000000000004282AF49447D8A07E3BD95BD0D56F35241523FBAB10001F4FF970A61A04B1CA14834A43F5DE4533EBDDB5CC8000BB882AF49447D8A07E3BD95BD0D56F35241523FBAB10000000000000000000000000000000000000000000000000000000000008C7B710ED0A6DBD71B6E40AAE4339DBCF4A694606C4A82B5387DB572960A0C00346712C38E0ABE88E9FB1C0B0316379671B83DC53FF2F6964C523FF0DC813A360003819A07FF82568E85174876E800832DC6C0943648F6E38E8641BF847B3A776DAF6A21AE9A42DD8000000000000000000000000000000000000000000000000037972F950D320A000100010000038D01000A000001000003A2001E01A7C0BEEA0D6EC947EC1F80378793565C4B89C38ABE906341EE005A8C5739813E05CB0F16B8B6561CAE4123DB70B86B0EAE4370D01F41FAF9CD5F2D3C09F252DB1B038201AC07FF82041E84D7FC3099831B43EF943D6BA331E3D9702C5E8A8D254E5D8A285F223ABA8205DD0F332E0382000000000000000000000000000000000000000000000000000000000000010000000000000000000000000082AF49447D8A07E3BD95BD0D56F35241523FBAB1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000365AC4787A5FD25456D12DE3E1700000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000061678F6582F5D5E825FD5100000000000000000000000000000000000000000000000000000000038D7EA4C680000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000082AF49447D8A07E3BD95BD0D56F35241523FBAB1C10B0E58B60E499D3D413FBD248C9EE7920EEAF81508F93CF6A44C8C5C619F642EE8A911B94E99CAC280F4242CEE4EC30F96A69152DF562E7F10A275DBBCD61B010381AA07FF82568F85174876E800832DC6C0943648F6E38E8641BF847B3A776DAF6A21AE9A42DD800000000000000000000000000000000000000000000000002602B92FF5107A00010000C31E54C7A869B9FCBECC14363CF510D1C41FA44301000A000001000003A2001E01286D66E23734998BEBFF021DD5B98755BCAABE1A5CD4FDA70AE4A3B682412728458E183C3D57896C046367E013A8D2B2A5D87F67E44A3153256C85BEAB1811AE1B0381A707FF1284D7FC3099830AACDC94FD086BC7CD5C481DCC9C85EBE478A1C0B69FCBB980095EA7B3000000000000000000000000A867241CDC8D3B0C07C85CC06F25A0CD3B5474D8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE8E8494287DDAB0D58530D028F3CB98CA021E6D2A9162600A84FE5FFABE9679971903A034C28B5BAA735B773E1CCE89EDE9FE3FCE6A2C5D962A080CB7A1A2B63000381A707FF0184D7FC30998309E86A9413780E6D5696DD91454F6D3BBC2616687FEA43D080095EA7B30000000000000000000000006F4E8EBA4D337F874AB57478ACC2CB5BACDC19C9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8D8A50D1FF111C87C66E65DF0E405EF28401CA4AEA49A19E3EF7E671836F4EEF59E69904DF8D1179FC5BC4A8BC6BA0C5E9E8E0F86BEACAD9EEDB71CF4E801A57010381AB07FF8301C6C785174876E800831E8480941A0AD27350CCCD6F7F168E052100B4960EFDB7748017835D1C000000000000000000000000000000000000119B0000192F001E2D1901BC529700000000000000000000000000000000000000000000000000000000627D1FDEE09E3E31DFEA4ACD1F618171AECBDEA5A045A0D73E874DE998C186682114421A75A83432BA7C1805F6CC74B817E7B0BB5440F716123CF4FCF2B1BABE6ECE112B01036607FF82602384D7FC30998307A12094A3A2EF013ECEF058945D1D5DE1BDEE594C381E98190E68743CAECB66C3BFE5C7C2D2E690097298291065850CBEE94FB4201721270C5F6C6A63333F6364F022E391729236F209C9977A3AAB31CCA036CB90107FF02B72010382020A07FF824DCB85174876E800831AB3F09468B3465833FB72A70ECDF485E0E4C7BD8665FC45805AE401DC00000000000000000000000000000000000000000000000000000000627D46F100000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000E45023B4DF000000000000000000000000FF970A61A04B1CA14834A43F5DE4533EBDDB5CC800000000000000000000000082AF49447D8A07E3BD95BD0D56F35241523FBAB100000000000000000000000000000000000000000000000000000000000001F4000000000000000000000000565D82C9C9584D21AD8EE5A73B56CE71DACED7E20000000000000000000000000000000000000000000000001BC1767F9D3AA00000000000000000000000000000000000000000000000000000000000EBFF530B0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007E370495456F1670B73EA828D99FA9F9C26B56FDC68770E7F254C7B5C28D62725F1B8215079A48F01A4AFE819477519A1315D463E49288DECE5E839C1935E604010381E907FF8202C084D7FC30998309878594BED32937D8A5D1421241F52809908F1A17D75BDB80FDE2832F4554482D5553440000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003B9ACA64C6E548AB7DC3F556031541B90BD9D1699C8C32371D16B1BB379F42B90CBA2B3A5825A01C5B83469AC415DFEF6137661A1F8A3B2192BC9B446A4059C01C27773C000382040A07FF82AEF285E8D4A51000836ACFC0943607E46698D218B3A5CAE44BF381475C0A5E2CA780C9807539000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000002600000000000000000000000000000000000000000000000000000000000000300010000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001C00000000000000000000000F6D9397093865A569A3B827FBE021B4E00012DD40105080702010300060904000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000A0000000000000000000000000000000000000000000000000000002D8EFB7B2B0000000000000000000000000000000000000000000000000000002DA7D4F92E0000000000000000000000000000000000000000000000000000002DB1E36C800000000000000000000000000000000000000000000000000000002DB1E36C800000000000000000000000000000000000000000000000000000002DB433E1A60000000000000000000000000000000000000000000000000000002DCC0E08400000000000000000000000000000000000000000000000000000002DD240F2400000000000000000000000000000000000000000000000000000002DD2E847620000000000000000000000000000000000000000000000000000002DE005BA000000000000000000000000000000000000000000000000000000002DE1A8B43800000000000000000000000000000000000000000000000000000000000000040488F23041066C7E581588E7D283B6EB465B7302E56F9EFBA9130791415979DA62AC65BBE4537CF695ABBC20C9C58B438756438BCD274AC2FD7D9BA2773FBDADDB0CC785128981E7BAB85B1F9D8D10CEB7B68C76C21887A189C053934D0CA5370184979C8E305C9996814FC15D68305E3200A35600C39BCAA26FA9A66BCDB34800000000000000000000000000000000000000000000000000000000000000041D88EE537C6F2869D855864833B6F4443F7D1D7E29AA7B10FF90FC32656931A01B08FEEC9DA85DC941720C6E9DF505F4EB4069AB0F28E15DB3A4F45B3E8CC5DC36C5F7E57FE0F684814F1B77865873D2DFA6F7BEA7B35A32304AC8A971C5C6C739ABC1CDE6F52537494E60DCF3D5A7F605631F735438515B6162D7B79ED82418940FC812B70B6401A006EF567E3FD9A71703329133A10141C2347C41B58624A114A8575B877AFE83BC9E0A1656E735B1D5A233ACAE5C82B370CE52FC4DE6A88C000382018A07FF821FD485012A05F200832DC6C094569A11E9C23F6716073AEAE549EC69DE6356F9B380627DD56A000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000CB86000000004861B198080D9C00000D00000238B54A66D75787643005668DBE4B934595F73DB543C76F90396000BA6A1F7E55D4DAB5356C4EEA6FD576543210FFEEDDCCBBAA987C77665569C36CBAF389C338715FA5C16DF39E3DB72A82067A8EF94DC80229C8FDC5906F53642AD97252B86D66F84D969547E9BA9610DA8311B00018EBA25E94CD87892E54EC0688F394B04CA8EBE7432007C2FF273E33965F7D2A1E11C08963C5BDB6BC04B357F90A0DD09AFBCD425859F4FB7B548264DA2F063F248521950705611DABB1000000000000000000000000000000000000000000B30EBDA3AA2F49930D67B928A9E91FD2120AA132ED559CCE1857BC6F5269DE715F4A55965979DFA93629B7F154BC3F5A68BF2B05517B2D5693D125D32B3CEAEA010382024907FF82C34984D7FC3099830D607194E195A15533C01C8CD6B28F09066842486F80F8F28030F6A88900000000000000000000000000000000000000000000000000000000000000A000000000000000000000000000000000000000000000000000000000000000E00000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000001A00000000000000000000000000000000000000000000000000000000000000001000000000000000000000000A7A7E108A88E137FF754306A9501E65C980A65E600000000000000000000000000000000000000000000000000000000000000014254432D5553440000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000002A61F2BF0802170FB744E55B84A1FBAFF7D8AD812109DE4EC776025FB28D5A3893335EA35DE78F53D46DDC317CFB24EB1DD98C7FB24A0B8EAF9C959F0B9F079730D5093ED06010382020A07FF824DCC85174876E800831AB3F09468B3465833FB72A70ECDF485E0E4C7BD8665FC45805AE401DC00000000000000000000000000000000000000000000000000000000627D46F300000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000E45023B4DF000000000000000000000000FF970A61A04B1CA14834A43F5DE4533EBDDB5CC800000000000000000000000082AF49447D8A07E3BD95BD0D56F35241523FBAB100000000000000000000000000000000000000000000000000000000000001F4000000000000000000000000565D82C9C9584D21AD8EE5A73B56CE71DACED7E20000000000000000000000000000000000000000000000001BC1776871DFB00000000000000000000000000000000000000000000000000000000000EC2A12030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003E7F2F896410A6F11AE84531E45F5F76E7A0C63D3FBEEDD7B66104131953D35A04D84CEE8D3ECCA4F86ADBE9673DD0AF05ACB01A7876DB6168F60D267EE15F37000382028A07FF820EE684EE6B2800840393870094BF7FAED477FA1DE18D66B2138DC8D2A9A85E9E4B809699CCB3000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000364A3745F95400000000000000000000000000000000000000000000000000000000000000001A0000000000000000000000000000000000000000000000000000000000000000400000000000000000000000082AF49447D8A07E3BD95BD0D56F35241523FBAB1000000000000000000000000FF970A61A04B1CA14834A43F5DE4533EBDDB5CC8000000000000000000000000FD086BC7CD5C481DCC9C85EBE478A1C0B69FCBB900000000000000000000000082AF49447D8A07E3BD95BD0D56F35241523FBAB10000000000000000000000000000000000000000000000000000000000000003000000000000000000000000C31E54C7A869B9FCBECC14363CF510D1C41FA4430000000000000000000000007F90122BF0700F9E7E1F688FE926940E8839F353000000000000000000000000960EA3E3C7FB317332D990873D354E18D76455900000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000005BA57E51D0428356094C42CAC526AD5F1BB1A6C72A291C736228B4FB3937976F57D5A728869A87CF02EB7861D9DB05CE552850C4EE4A60B450D41BAFEA050E49F000381E907FF822A3184D7FC30998313D620946A186D6D8B87EEA2F14964D9C0F0313DB16D1BA7804E86BA3C000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001CB00F1A00000000000000000000000000000000000000000000000003603EDE68487E50000000000000000000000000000000000000000000000000000000000627D1FF5272818BA0170B44CE6C82D6FF864633988103E57B79C29704E00E5D65FEDC2CF4DFFB6596DF26E11ECCA7F1AC41EE732BA0B54EA3BC52D36A495DA8B9660262C010382016907FF824BBE84D7FC3099831E639C94E592427A0AECE92DE3EDEE1F18E0157C0586156480DB3E2198000000000000000000000000FF970A61A04B1CA14834A43F5DE4533EBDDB5CC800000000000000000000000082AF49447D8A07E3BD95BD0D56F35241523FBAB100000000000000000000000000000000000000000000000000000000000001F4000000000000000000000000D0DB388F32328915654E88DB4241EB45FA6ED55900000000000000000000000000000000000000000000000000000000627D205C00000000000000000000000000000000000000000000000036A872A8DCD1D94000000000000000000000000000000000000000000000000000000001CFE1D5BE00000000000000000000000000000000000000000000000000000000000000000FDD1357527357792E9BC9588619E5D97B4229C4BCEFAF2987EF0B48D0501CEF5C6222D543524A70D4A97BB607E0BC29893B68CD12F2F142B0B623D9A3FED797000382040A07FF82B2CE85E8D4A51000836ACFC0948C4308F7CBD7FB829645853CD188500D7DA8610A80C9807539000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000002600000000000000000000000000000000000000000000000000000000000000300000101000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001C0000000000000000000000017E94DCDE4FCEFCE3FD70621604B01850000015D0405060108030409000702000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000A00000000000000000000000000000000000000000000000000000001085056E1000000000000000000000000000000000000000000000000000000010BEA6050000000000000000000000000000000000000000000000000000000010BEA6050000000000000000000000000000000000000000000000000000000010BEA6050000000000000000000000000000000000000000000000000000000010BEA6050000000000000000000000000000000000000000000000000000000010C582DD5000000000000000000000000000000000000000000000000000000010C582DD5000000000000000000000000000000000000000000000000000000010C5D5CD5000000000000000000000000000000000000000000000000000000010C5D5CD5000000000000000000000000000000000000000000000000000000010C7FDEC100000000000000000000000000000000000000000000000000000000000000040A8B06C4DF90606A9B8C56E1AA8F018E9A77E7284462918CC72A8DC291E3BEC450DED2A88E8F2867F8DE43FFBA588D83166D81D2DC56923A8B8EB477BDAB08E3DD0B78E56704F352B90E9CC9CA29A19889A92FC7C1C397A50009B699B3F4F0EBCDC32B02B17AAFB9A3F33ECE91B93B58CBF3101A4171862F1C4945E8E1318EB700000000000000000000000000000000000000000000000000000000000000043B157257D6D1BC9CA8318C7762F9E7F7B94A3DE4DFA0DCB21ED50ED330409B662A7B999039F4E6B05B306A52262AA5EAC1FDC7A432F568A675D84A9251C7B14F2E3B1D640096E068601F6C5D27FE24B3F674EE69754DB153767EBB680E8ABA9023EAE1EF49932481E10D67CACE91AFC92A1A14E2CE5776F2EEEC646433904C3C8E8D5BFFA24857C515EC822DB9BA01F9010C3931057E983F0F410334ABC5F6F05A9304A03B79F18648699885495BF09FBA74EECD0E66365FA227BDCFB6A4EE32010382016A07FF821CB08501AFF86132832625A0941B02DA8CB0D097EB8D57A175B88C7D8B47997506804A25D94A0000000000000000000000000000000000000000000000007EA283275770800000000000000000000000000000000000000000000000000000000004344D3D7200000000000000000000000000000000000000000000000000000000000000A00000000000000000000000000BD8F40920AEA2920C6BCD2781B3A2F475CA32BE00000000000000000000000000000000000000000000000000000000627D205C0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000FF970A61A04B1CA14834A43F5DE4533EBDDB5CC800000000000000000000000082AF49447D8A07E3BD95BD0D56F35241523FBAB1BAA8993D92F78C257E7DF373AC1DC181A3787CE8D638C9A5A68F51350F0FF92B291190F843A8C1C954BE1BA77D2AC5604E914A10109303581ACC615C76C6950D010382020A07FF824DCD85174876E800831AB3F09468B3465833FB72A70ECDF485E0E4C7BD8665FC45805AE401DC00000000000000000000000000000000000000000000000000000000627D46F400000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000E45023B4DF000000000000000000000000FF970A61A04B1CA14834A43F5DE4533EBDDB5CC800000000000000000000000082AF49447D8A07E3BD95BD0D56F35241523FBAB100000000000000000000000000000000000000000000000000000000000001F4000000000000000000000000565D82C9C9584D21AD8EE5A73B56CE71DACED7E20000000000000000000000000000000000000000000000001BC178514684C00000000000000000000000000000000000000000000000000000000000EC50FFEF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000029728EDF913599C1A67998259300D1CDF953AE39B92DFE0714512A81279F2C211F4A38EEFF126BDF9425A140E4823444D2A07A808C405CB3F952B63B6866227F010382016A07FF82182A85174876E800831AB3F0941B02DA8CB0D097EB8D57A175B88C7D8B47997506808803DBEE0000000000000000000000000000000000000000000000001BC2F1C1FE19B0000000000000000000000000000000000000000000000000DB21A065304A82000000000000000000000000000000000000000000000000000000000000000000A000000000000000000000000097581C75940624FDCD1CE618C4D0F6073CEB9D2200000000000000000000000000000000000000000000000000000000627EA6840000000000000000000000000000000000000000000000000000000000000002000000000000000000000000FEA7A6A0B346362BF88A9E4A88416B77A57D6C2A00000000000000000000000082AF49447D8A07E3BD95BD0D56F35241523FBAB187CF28E99EB2A49E55B380234EBD7995013F8AC13811A5320E370584D823468A290EB900918039E0463A9BAA0B54ADEFFE73CE25A4AE4D97639218D535304089000382028907FF82101984D7FC3099832625A094ED9CA5ECD2068C29A0698460DB9B0372C8F87BD280E84423C300000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000077359400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000000400000000000000000000000082AF49447D8A07E3BD95BD0D56F35241523FBAB1000000000000000000000000FF970A61A04B1CA14834A43F5DE4533EBDDB5CC800000000000000000000000017FC002B466EEC40DAE837FC4BE5C67993DDBD6F00000000000000000000000082AF49447D8A07E3BD95BD0D56F35241523FBAB10000000000000000000000000000000000000000000000000000000000000003000000000000000000000000C31E54C7A869B9FCBECC14363CF510D1C41FA4430000000000000000000000000000000000000000000000000000000000000002000000000000000000000000F07D553B195080F84F582E88ECDD54BAA122B279000000000000000000000000000000000000000000000000000000000000000B000000000000000000000000AEBFDA10B251D650126830B952EE74B4A599F71F000000000000000000000000000000000000000000000000000000000000000171E3D0A69680FA75A25B91757129726BE8D7530131B260840CA89894DFE7C8D54A40E83D226D3AB0D7089F0A6AD9936AD2C1BA1D7195BF78EE2C08B7C6B7EE00010381A707FF6E84D7FC30998308F0A494B94D1959084081C5A11C460012AB522F5A0FD75680441A3E70000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000090980B77BFFA5330C88AE6F64565045C083FBDDC6BC4475A4AB4E059E6E5CDF00F5EF6BF2CE785FB1AFDC2D8D1AAC617B3780D2E043B6BCAA0AA2B8E92083919321CEB3574AEF0C3000382060B07FF2484D7FC3099831DBB40941111111254FB6C44BAC0BED2854E76F90643097D807C02520000000000000000000000000026271DFDDBD250014F87F0F302C099D5A798BAB10000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000018000000000000000000000000082AF49447D8A07E3BD95BD0D56F35241523FBAB10000000000000000000000002F2A2543B76A4166549F7AAB2E75BEF0AEFC5B0F00000000000000000000000026271DFDDBD250014F87F0F302C099D5A798BAB1000000000000000000000000B50B8A508BA420A25FD9CB6CD43962B96AFA1C8F000000000000000000000000000000000000000000000000214E851CB0005EE20000000000000000000000000000000000000000000000000000000000F589A2000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001408000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000064EB5625D900000000000000000000000082AF49447D8A07E3BD95BD0D56F35241523FBAB1000000000000000000000000BA12222222228D8BA445958A75A0704D566BF2C8000000000000000000000000000000000000000000000000214E851CB0005EE200000000000000000000000000000000000000000000000000000000800000000000000000000000BA12222222228D8BA445958A75A0704D566BF2C80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000001E452BBBE2900000000000000000000000000000000000000000000000000000000000000E000000000000000000000000026271DFDDBD250014F87F0F302C099D5A798BAB100000000000000000000000000000000000000000000000000000000000000000000000000000000000000001111111254FB6C44BAC0BED2854E76F90643097D0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000627E715564541216BAFFFEEC8EA535BB71FBC927831D0595000100000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000082AF49447D8A07E3BD95BD0D56F35241523FBAB10000000000000000000000002F2A2543B76A4166549F7AAB2E75BEF0AEFC5B0F000000000000000000000000000000000000000000000000214E851CB0005EE200000000000000000000000000000000000000000000000000000000000000C00000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000E26B9977AE007E336BB94DA99C8F68D54293287D4F6B2F0A23AE700FB82FB3C6FFD6944661D504EEDD596608A524B4BBBA10240266207E261D27C8A6C42065F4A8BB4B5B010382024907FF82C34A84D7FC3099830C8C6F94E195A15533C01C8CD6B28F09066842486F80F8F280CC064C8C00000000000000000000000000000000000000000000000000000000000000A000000000000000000000000000000000000000000000000000000000000000E00000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000001A00000000000000000000000000000000000000000000000000000000000000001000000000000000000000000718B0E7E6E2B40934956B2193D69DB8DD6E5475000000000000000000000000000000000000000000000000000000000000000014554482D55534400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000002E0A6CC51F52C007E2A9EF4F89164EBDC49DACE8092F37770E149CF62E4A63BF722B8C68F45F7E9589334CE41FEE33C7610302202E8783AAA052EEEAF02BC7EC5E869F25D7010382016A07FF820DE68501AFF86132832625A094E592427A0AECE92DE3EDEE1F18E0157C0586156480DB3E2198000000000000000000000000FF970A61A04B1CA14834A43F5DE4533EBDDB5CC800000000000000000000000082AF49447D8A07E3BD95BD0D56F35241523FBAB100000000000000000000000000000000000000000000000000000000000001F4000000000000000000000000E6C13A914132E8B7AA229AB0FC34FCF0BDFFFD1E00000000000000000000000000000000000000000000000000000000627D205E000000000000000000000000000000000000000000000000778EA0DB13FD800000000000000000000000000000000000000000000000000000000003F83A0BDA0000000000000000000000000000000000000000000000000000000000000000EA146754960A1A82257C3030C10271BD24AB028D45AC938CBE0E290F3E37F86F6F7FE30BBD4D7D58E59C6FF836C423D2ADBD1CA56C9506227BF0D27B35A25ACF000382024907FF8207CF84D7FC3099830F8BB394BA12222222228D8BA445958A75A0704D566BF2C88052BBBE2900000000000000000000000000000000000000000000000000000000000000E000000000000000000000000000C84F245AB3F76CBCB6BDA478325402322DFBB6000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000C84F245AB3F76CBCB6BDA478325402322DFBB60000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000059C2FB51E00000000000000000000000000000000000000000000000000000000627D2002996616BDE0CB4974E571F17D31C844DA2BD177F800010000000000000000001800000000000000000000000000000000000000000000000000000000000000000000000000000000000000007D7E4F49A29DDA8B1ECDCF8A8BC85EDCB234E997000000000000000000000000AA846004DC01B532B63FEAA0B7A0CB0990F19ED9000000000000000000000000000000000000000000000000000000006A83EFAD00000000000000000000000000000000000000000000000000000000000000C00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000086D10E96BBF5B4DE1014029A23D566A7ABEAAA7EB39B886C6DCE9F1F74387DD740E5889217F8BF94CA3C24BBBAC94F33AED29F9F9E66F1316E74F64F796E5E500082028A07FF8227D9850BA43B740C830F487794BA1BFD85432905FF4A2E7F516B56B7485DBDC5F680E0E90ACF000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000A0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000218761A6D957D975BE472E0680EA45ADEF03CFB000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000104627DD56A000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000A4394747C500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000024F680640000000000000000000000000000000000000000000000000455B10F9D8BF15C000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FAA7B899261574EBAA9FBFE928D3ED916B8E1CF76847DD37D408B8625A3F3DD27B563CFC2A578AD0D04202308FF8AE3E895FB30433C98CCA09D37D497E80F8C1008201AA07FF82097B85012FFBD300834C4B40942ED6BC5830AD51A0A8FFEDA475DC64E3C35531448036946015000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000E30000000000000F72BFBDA4D6BD80010102030060C31E54C7A869B9FCBECC14363CF510D1C41FA44382AF49447D8A07E3BD95BD0D56F35241523FBAB1FF970A61A04B1CA14834A43F5DE4533EBDDB5CC80000000000000000000000000000000000000000000002E9D9045932E2600000000001F404006C0002000164541216BAFFFEEC8EA535BB71FBC927831D0595000100000000000000000002000000000000003E8412A6590F4C0000000000000000000000000210736F75CEFF970A61A04B1CA14834A43F5DE4533EBDDB5CC882AF49447D8A07E3BD95BD0D56F35241523FBAB1000000000000000000000000000000000000000000000000000000000004F120F1F7959E5A148924002E6907BCAADFF2B9CD1DA36BA332941218E2B96D1CA7D9717CECFC4C68724CEFC67FFEA84A65236EB140403406D4EAB77230B424000382040A07FF82B5DE85E8D4A51000836ACFC094A58474C4F9A3A37DEAE8E6BCFA337E0E9ED699E080C9807539000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000002600000000000000000000000000000000000000000000000000000000000000300010000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001C00000000000000000000000EA4A514465A794F42278C11CABEC5DD70000015C0606030102080500090407000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000A00000000000000000000000000000000000000000000000000000000000771A4000000000000000000000000000000000000000000000000000000000007A32200000000000000000000000000000000000000000000000000000000000977CB000000000000000000000000000000000000000000000000000000000009801000000000000000000000000000000000000000000000000000000000000D9CD800000000000000000000000000000000000000000000000000000000000DD1BD00000000000000000000000000000000000000000000000000000000000DD1BD00000000000000000000000000000000000000000000000000000000000DD1BD0000000000000000000000000000000000000000000000000000000000151FC30000000000000000000000000000000000000000000000000000000000182C47000000000000000000000000000000000000000000000000000000000000000423D3D634D4AC90AFACC84AB9C86D98B477832696652F9B03F14201C91C97BEC58130C2AAEA4202EAAA987307067D6ACF9EC0C43F75527F04B3F2EC7025E7FAAFC80B430C372767311C4D686F6CE9FDA4E012647B1B72C8CED9F70F34BAEA7F683870E964A0F4211F5EAD4FFC5D387186B0C4ECC5BC47D8C0DEE395AB5930F8B200000000000000000000000000000000000000000000000000000000000000041913E290954D2C56EB08DDC76BD90C121C8F0EE0640A3FE097E7CC32449C39880AE3438126CECC98A411F9266E0D7D5CC291517547941A303A8E005CE5B3971535DB6EAD010FDBE28FE8FF37D0265C43E4B23BBB5774072F74FEF98449DF5FA170E5F9AA08EF8C8B75E7BDAAADB3E9331BAEF15201A38D5B79DE3E3048CC0DB00F7B90CDE3AB997B1876A1043B5ED38748E3E0211E3814BBAFA7AE8C7727737730B5F4B734598C5436141DA7F2BAA49B79F08143C4165D3364E6C97579E82BD2010382016907FF82079084FBBB0C18830E2B1A94F8D88D63ED3A2104E664AE8715FC9F80ABBA864D8046BD71F90000000000000000000000001B02DA8CB0D097EB8D57A175B88C7D8B479975060000000000000000000000000000000000000000000000000FEAF66C455F80000000000000000000000000000000000000000000000000000000000087DBFD1C00000000000000000000000000000000000000000000000000000000000000A000000000000000000000000000000000000000000000000000000000627D1FF60000000000000000000000000000000000000000000000000000000000000002000000000000000000000000FD086BC7CD5C481DCC9C85EBE478A1C0B69FCBB900000000000000000000000082AF49447D8A07E3BD95BD0D56F35241523FBAB16199F392654F2D8F59C4139992782B9611C73A8E38D8B21EC353D9A890FE9F333A1B2C121BC0A1AAEE2F7F11E40BF31B998A7B90DE2C0270977311E13A1D729A000382040A07FF82B6BE85E8D4A51000836ACFC094A58474C4F9A3A37DEAE8E6BCFA337E0E9ED699E080C9807539000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000002600000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001C00000000000000000000000EA4A514465A794F42278C11CABEC5DD70000015D0203010602050809040007000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000A000000000000000000000000000000000000000000000000000000000007C8650000000000000000000000000000000000000000000000000000000000094DAC000000000000000000000000000000000000000000000000000000000009763D000000000000000000000000000000000000000000000000000000000009763D00000000000000000000000000000000000000000000000000000000000E3ED900000000000000000000000000000000000000000000000000000000000E3ED900000000000000000000000000000000000000000000000000000000000E3ED9000000000000000000000000000000000000000000000000000000000013C189000000000000000000000000000000000000000000000000000000000018B050000000000000000000000000000000000000000000000000000000000019B32100000000000000000000000000000000000000000000000000000000000000047B9F60CD6B84406D91B419920F048F3C791206D4DA61402FEF3395BF7A8FF57A05B57F4517F7AFB8EB42807273DAA1AE0FBBC96BF0EC1236B2763389F1CC22662DA00922B033A31C350DCAEB430BAFBE6B44D75D57F613567C4D6EA90C2F64EE1A3550EB820B03365C5B9AE3EC3A56EF57E37977F14F55EB1376F1D2EDB50F8E0000000000000000000000000000000000000000000000000000000000000004051D4687DB2685CA438D020BAE445F3E355CF940F37A255F4EC8B1315657545F35F45FA8C6CF392825F3B2E64E9667AE1C41F8FCB6DD231B4288EC0CEEB606BA48B7390C875508558BBB31FDEB5FA7C3E2CD128AFDA8850FACF9835DE6750F53351578ECDA7AB4078015F0537ABB1CA20415E3A6D4207F714B020B7A02BF25C75A9449684C6294AF97B153B8D112C7CF87336CF756BB8472CD70E61B2FD2BBBE44DB470CAFB4EABB683142B10B49657D8D4B9FE0F79B947C4B873B287E318AE6010382040A07FF8295ED85E8D4A51000836ACFC094A58474C4F9A3A37DEAE8E6BCFA337E0E9ED699E080C9807539000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000002600000000000000000000000000000000000000000000000000000000000000300010000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001C00000000000000000000000EA4A514465A794F42278C11CABEC5DD70000015C0606030102080500090407000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000A00000000000000000000000000000000000000000000000000000000000771A4000000000000000000000000000000000000000000000000000000000007A32200000000000000000000000000000000000000000000000000000000000977CB000000000000000000000000000000000000000000000000000000000009801000000000000000000000000000000000000000000000000000000000000D9CD800000000000000000000000000000000000000000000000000000000000DD1BD00000000000000000000000000000000000000000000000000000000000DD1BD00000000000000000000000000000000000000000000000000000000000DD1BD0000000000000000000000000000000000000000000000000000000000151FC30000000000000000000000000000000000000000000000000000000000182C47000000000000000000000000000000000000000000000000000000000000000423D3D634D4AC90AFACC84AB9C86D98B477832696652F9B03F14201C91C97BEC58130C2AAEA4202EAAA987307067D6ACF9EC0C43F75527F04B3F2EC7025E7FAAFC80B430C372767311C4D686F6CE9FDA4E012647B1B72C8CED9F70F34BAEA7F683870E964A0F4211F5EAD4FFC5D387186B0C4ECC5BC47D8C0DEE395AB5930F8B200000000000000000000000000000000000000000000000000000000000000041913E290954D2C56EB08DDC76BD90C121C8F0EE0640A3FE097E7CC32449C39880AE3438126CECC98A411F9266E0D7D5CC291517547941A303A8E005CE5B3971535DB6EAD010FDBE28FE8FF37D0265C43E4B23BBB5774072F74FEF98449DF5FA170E5F9AA08EF8C8B75E7BDAAADB3E9331BAEF15201A38D5B79DE3E3048CC0DB043239762AC30427C7D4ED9B94980C0AE8A1BB6AF888865A99AB512980888C8A92C6DF1C1E22560571106DB1ABF38231C1D0F7592BA69305CE4709178F48DA79F000382040A07FF8295EE85E8D4A51000836ACFC094A58474C4F9A3A37DEAE8E6BCFA337E0E9ED699E080C9807539000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000002600000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001C00000000000000000000000EA4A514465A794F42278C11CABEC5DD70000015D0203010602050809040007000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000A000000000000000000000000000000000000000000000000000000000007C8650000000000000000000000000000000000000000000000000000000000094DAC000000000000000000000000000000000000000000000000000000000009763D000000000000000000000000000000000000000000000000000000000009763D00000000000000000000000000000000000000000000000000000000000E3ED900000000000000000000000000000000000000000000000000000000000E3ED900000000000000000000000000000000000000000000000000000000000E3ED9000000000000000000000000000000000000000000000000000000000013C189000000000000000000000000000000000000000000000000000000000018B050000000000000000000000000000000000000000000000000000000000019B32100000000000000000000000000000000000000000000000000000000000000047B9F60CD6B84406D91B419920F048F3C791206D4DA61402FEF3395BF7A8FF57A05B57F4517F7AFB8EB42807273DAA1AE0FBBC96BF0EC1236B2763389F1CC22662DA00922B033A31C350DCAEB430BAFBE6B44D75D57F613567C4D6EA90C2F64EE1A3550EB820B03365C5B9AE3EC3A56EF57E37977F14F55EB1376F1D2EDB50F8E0000000000000000000000000000000000000000000000000000000000000004051D4687DB2685CA438D020BAE445F3E355CF940F37A255F4EC8B1315657545F35F45FA8C6CF392825F3B2E64E9667AE1C41F8FCB6DD231B4288EC0CEEB606BA48B7390C875508558BBB31FDEB5FA7C3E2CD128AFDA8850FACF9835DE6750F53351578ECDA7AB4078015F0537ABB1CA20415E3A6D4207F714B020B7A02BF25C7F13ED1A4DDADF1DDDFAA502E165477F0200655A252E6C3DB7404FBAAE23097135C995E4C9C0543ED228E13A81244E355522BFCC32A1C2C1AB6B2B26D2E2068A2010382020A07FF824DCE85174876E800831AB3F09468B3465833FB72A70ECDF485E0E4C7BD8665FC45805AE401DC00000000000000000000000000000000000000000000000000000000627D46F800000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000E45023B4DF000000000000000000000000FF970A61A04B1CA14834A43F5DE4533EBDDB5CC800000000000000000000000082AF49447D8A07E3BD95BD0D56F35241523FBAB100000000000000000000000000000000000000000000000000000000000001F4000000000000000000000000565D82C9C9584D21AD8EE5A73B56CE71DACED7E20000000000000000000000000000000000000000000000001BC1793A1B29D00000000000000000000000000000000000000000000000000000000000EC829D97000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000C4F02753D772E1A41ED23ED2C77FA0B6A13FDAB3C5194F09BFFD27169672CE9B40D9FA75AD9F10A321027F50E62553988D94E1F249FD4ADCC0349B76E2893E0A01038202A907FF82083284D7FC309983128FBA9468B3465833FB72A70ECDF485E0E4C7BD8665FC45805AE401DC00000000000000000000000000000000000000000000000000000000627D209F000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000000E404E45AAF000000000000000000000000FF970A61A04B1CA14834A43F5DE4533EBDDB5CC800000000000000000000000082AF49447D8A07E3BD95BD0D56F35241523FBAB100000000000000000000000000000000000000000000000000000000000001F400000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000324B221F80000000000000000000000000000000000000000000000005EA1C3518A4A8AAC000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004449404B7C0000000000000000000000000000000000000000000000005EA1C3518A4A8AAC000000000000000000000000FDE4A6C95020B7F9772F022FFF3D5B9EEC91DF0C00000000000000000000000000000000000000000000000000000000D6FC5BDA5FB8571CDD04B7606BE7C58B90E7931BF91FDA91D1539D9059548BAD3919F2463233924BB626E62771CFCC35C7D6DB5B30222C657830D0320021BD80010382028A07FF820EE784EE6B2800840393870094BF7FAED477FA1DE18D66B2138DC8D2A9A85E9E4B809699CCB3000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000364A3745F95400000000000000000000000000000000000000000000000000000000000000001A0000000000000000000000000000000000000000000000000000000000000000400000000000000000000000082AF49447D8A07E3BD95BD0D56F35241523FBAB1000000000000000000000000FF970A61A04B1CA14834A43F5DE4533EBDDB5CC8000000000000000000000000FD086BC7CD5C481DCC9C85EBE478A1C0B69FCBB900000000000000000000000082AF49447D8A07E3BD95BD0D56F35241523FBAB10000000000000000000000000000000000000000000000000000000000000003000000000000000000000000C31E54C7A869B9FCBECC14363CF510D1C41FA4430000000000000000000000007F90122BF0700F9E7E1F688FE926940E8839F353000000000000000000000000960EA3E3C7FB317332D990873D354E18D764559000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000056AEF4BF9EC856E46A7CD6E4389637950B8F253DF420FDC1DD3E10F8D866F7D1C06388355D227E455B5641BB65D69B3F2A6117518C3630D41914F0480D6B2028A0081A807FF82569085174876E800832DC6C0943648F6E38E8641BF847B3A776DAF6A21AE9A42DD800000000000000000000000000000000000000000000000001D8C2779B8F32500010000C31E54C7A869B9FCBECC14363CF510D1C41FA4430100080100010001CA1C0046D91C80665E6AD35BDA116E17C03A2C352D597C713BF1EFBB147559CB40844E348A1EDAEEEE948995749E75E1DB80C1A578D501B31B9724BFB1DAA12E3298CE1C0381AB07FF8301C6C885174876E800831E8480941A0AD27350CCCD6F7F168E052100B4960EFDB7748017835D1C00000000000000000000000000000000000011AB00001938001E37FB01BD092600000000000000000000000000000000000000000000000000000000627D1FE943F5C65D0094146B4F178836DEE27468073EB3EF5627A8C882CFEB309855BC4C3E26734C02B2DCDBE88056F7B3BE692AF69C881277B4E1909B6B872F8D10235B010381E707FF0284D7FC30998309C1CA946F4E8EBA4D337F874AB57478ACC2CB5BACDC19C980A07ED9750E111C141610151314060906071D130C0509130D16091515130C071B1D07160C0000000000000000000000000000000000000000000000000000000007368A8D00000000000000000000000013780E6D5696DD91454F6D3BBC2616687FEA43D00000000000000000000000000000000000000000000000000000000000F8FE3DDD06299EAFA98DF4784627F3241C0B44BB4BF4428343CCFF231A88BCA59999752DAB2E75337CB9C0B2112D883114BB20B7BD71F6367657BAAFADEF83AEB31358010382020A07FF824DCF85174876E800831AB3F09468B3465833FB72A70ECDF485E0E4C7BD8665FC45805AE401DC00000000000000000000000000000000000000000000000000000000627D46FC00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000E45023B4DF000000000000000000000000FF970A61A04B1CA14834A43F5DE4533EBDDB5CC800000000000000000000000082AF49447D8A07E3BD95BD0D56F35241523FBAB100000000000000000000000000000000000000000000000000000000000001F4000000000000000000000000565D82C9C9584D21AD8EE5A73B56CE71DACED7E20000000000000000000000000000000000000000000000001BC17A22EFCEE00000000000000000000000000000000000000000000000000000000000EC73596300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000079BE8487F861EDD18AA9B78DCDE19D22B827CE289AD2D43BF58FE1F5133356060ECCBF18AF9FED692F4DF186B09944CA0A2323EB5C565C9BECBA578C8B93D9CB010381CA07FF82564785174876E800830FC07E9487A4088BD721F83B6C2E5102E2FA47022CB1C8318011D9444A00000000000000000000000022286E7AD07A25C39117963A21330E3ECE36002E0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000D4266F8F82F7405429EE18559E548979D49160F3B018FBB3E12F9B0892279CE7BE147A33DADDE840999A0B3AAE7E6E1F9786CDA24FE4AD495B0A90F82BE43B5085B39C22FD970775B091BD4FC4F4FADEA5AB252E000382016907FF82019884D7FC3099830FCDE9941B02DA8CB0D097EB8D57A175B88C7D8B479975068018CBAFE500000000000000000000000000000000000000000000009513EA9DE024380000000000000000000000000000000000000000000000000000082A904F2BE945E800000000000000000000000000000000000000000000000000000000000000A000000000000000000000000094B9AED7B24A44E622FAEA76E57AD4D71684BFDA00000000000000000000000000000000000000000000000000000000627D267B000000000000000000000000000000000000000000000000000000000000000200000000000000000000000007E49D5DE43DDA6162FA28D24D5935C15187528300000000000000000000000082AF49447D8A07E3BD95BD0D56F35241523FBAB156C7C07D92031FD0C83F6C8AB6E7B973EF57D82DA940EF8D4723340A518E28925A52229C512F657CB995B66F7C22766FF07975F04C8B719A529A4C9AE6CE01FE000382013207FF82025D84ED9568A8831039E3941B02DA8CB0D097EB8D57A175B88C7D8B479975068801BDF8B5B0146F4800F305D71900000000000000000000000010393C20975CF177A3513071BC110F7962CD67DA00000000000000000000000000000000000000000000000405A2E141AA9BDECA000000000000000000000000000000000000000000000004007CF20CDBAD02CB00000000000000000000000000000000000000000000000001BBBDDDBD478853000000000000000000000000307923A41F1FE2CF876B2CB103E24438B56ABA9100000000000000000000000000000000000000000000000000000000627D267B5F573AB200BD0F6550F1922E63ABC787BAD708B21E5BAFB2BBC13F02F70B26E843142B33EBAD9B16449228EF3FF97B83EB012717E7A56DA0383F4F3EDBEDFA44000382020A07FF824DD085174876E800831AB3F09468B3465833FB72A70ECDF485E0E4C7BD8665FC45805AE401DC00000000000000000000000000000000000000000000000000000000627D46FE00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000E45023B4DF000000000000000000000000FF970A61A04B1CA14834A43F5DE4533EBDDB5CC800000000000000000000000082AF49447D8A07E3BD95BD0D56F35241523FBAB100000000000000000000000000000000000000000000000000000000000001F4000000000000000000000000565D82C9C9584D21AD8EE5A73B56CE71DACED7E20000000000000000000000000000000000000000000000001BC17B0BC473F00000000000000000000000000000000000000000000000000000000000ECB9931F000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000466801D10A07CA768056E7EE5B15D23D3749DA4D1846EA09E19F194FA9FF89C62222786340DBCB70480E6FAEC3B7F27EE98D1B0BC30D968DFC6287EE41C14654000382016A07FF82182B85174876E800831AB3F0941B02DA8CB0D097EB8D57A175B88C7D8B47997506808803DBEE0000000000000000000000000000000000000000000000001BC2F2AAD2BEC0000000000000000000000000000000000000000000000000DB9B5CCCB66C4527C000000000000000000000000000000000000000000000000000000000000000A000000000000000000000000097581C75940624FDCD1CE618C4D0F6073CEB9D2200000000000000000000000000000000000000000000000000000000627EA68E0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000FEA7A6A0B346362BF88A9E4A88416B77A57D6C2A00000000000000000000000082AF49447D8A07E3BD95BD0D56F35241523FBAB1F7833710D15DC536AABAE5356F5E5ACA5D04B6E3D5A2BAD5A0D1005621B60B5C36D352D0C973C065331EF5F83558A24BBB8E9CB7F357EC3257CC4336F0086ED9010382040A07FF82B20D85E8D4A51000836ACFC0943D62E33E97DE1F0CE913DB62D5972722C2A7E4F680C9807539000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000002600000000000000000000000000000000000000000000000000000000000000300010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001C000000000000000000000008E0F2B29E8523A5989D18B3AB350F28A00006E110500040706090201030508000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000A0000000000000000000000000000000000000000000000000000000046BD3F320000000000000000000000000000000000000000000000000000000046BD3F320000000000000000000000000000000000000000000000000000000047056329000000000000000000000000000000000000000000000000000000004709531100000000000000000000000000000000000000000000000000000000470F014400000000000000000000000000000000000000000000000000000000470F799700000000000000000000000000000000000000000000000000000000470F7997000000000000000000000000000000000000000000000000000000004710D5A000000000000000000000000000000000000000000000000000000000475A066000000000000000000000000000000000000000000000000000000000475A0660000000000000000000000000000000000000000000000000000000000000000443D7AD2C41E37E23F6DFC8D0DA849EDB19C9A0B187CC35EEB4139942F0AD591FC34BB527F92E0585D3B6FF235D26386EC6025339C6B326C4797AA08F1F42881DF03D27AF896E2FF52626718103F15FD13E9C15B17C94B942CFCEFD57CABB3FADF3206D2E7BE70778534F766F141FA3738AEC4607843AFD8D011483F5FD5EB3E100000000000000000000000000000000000000000000000000000000000000044E0A1ED973D883FD812F7AB923DFCB6CD763A5383E3A566290FDF0AD49E3B95D139A05FE9CFC430889AF49652374DFB16691F5B21BC1C627E0DBBF0581972AC746E6ADD7AB35118426B995837E8FAC5743A73F3D44D8A17B1700C6BDBC5FBEE87D22ADCDB9E5B77DC97BE5970697FC5CD6995E6EB5C05AD495FED2F91BEF5165437198BA7D8310DAB2DF76183A176DC3687DD72176CB62BCC7E4BA40351AC6593971C6BEE111731C6C9BE992D0427B4C94E592624C575BDF95A616B247658026000382016907FF824BBF84D7FC3099831D0B0B94E592427A0AECE92DE3EDEE1F18E0157C0586156480DB3E2198000000000000000000000000FF970A61A04B1CA14834A43F5DE4533EBDDB5CC800000000000000000000000082AF49447D8A07E3BD95BD0D56F35241523FBAB10000000000000000000000000000000000000000000000000000000000000BB8000000000000000000000000D0DB388F32328915654E88DB4241EB45FA6ED55900000000000000000000000000000000000000000000000000000000627D20670000000000000000000000000000000000000000000000002E1A38624DA87C000000000000000000000000000000000000000000000000000000000187EE2FCC0000000000000000000000000000000000000000000000000000000000000000AAF494F9BD2A27CD422764EF07050123D645C18CC62BB71E817844266BEABD37483CFF369835267777160897F24E31A2ECCC42F4F4C11A3D289725A2D4CC122B000382020A07FF824DD185174876E800831AB3F09468B3465833FB72A70ECDF485E0E4C7BD8665FC45805AE401DC00000000000000000000000000000000000000000000000000000000627D46FF00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000E45023B4DF000000000000000000000000FF970A61A04B1CA14834A43F5DE4533EBDDB5CC800000000000000000000000082AF49447D8A07E3BD95BD0D56F35241523FBAB100000000000000000000000000000000000000000000000000000000000001F4000000000000000000000000565D82C9C9584D21AD8EE5A73B56CE71DACED7E20000000000000000000000000000000000000000000000001BC17BF49919000000000000000000000000000000000000000000000000000000000000ECEA6D6000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000087F4769E9C45F7217384BA3D8EAC63F58D5F39E46F620AD3EABFEE3568D885227FA0B0FA665F56B20A986119B0495BD8C2917C024782F889420FF01A9EB2ACE2000382022A07FF820EE884EE6B2800840393870094BF7FAED477FA1DE18D66B2138DC8D2A9A85E9E4B809699CCB3000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000351FC9B7E8320000000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000000300000000000000000000000082AF49447D8A07E3BD95BD0D56F35241523FBAB1000000000000000000000000FF970A61A04B1CA14834A43F5DE4533EBDDB5CC800000000000000000000000082AF49447D8A07E3BD95BD0D56F35241523FBAB10000000000000000000000000000000000000000000000000000000000000002000000000000000000000000C31E54C7A869B9FCBECC14363CF510D1C41FA44300000000000000000000000064541216BAFFFEEC8EA535BB71FBC927831D05950000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000039F5865E2E4886A64AFA7C0C4929D7555E5E4D0A1F0EB0C3BA821A8D6C6B4CE6B2F95CD2812A1CCD6E49B395F142640FDB1FDE7FF24809BC608CCB4CC198F7D06010381EA07FF8290B685174876E800834C4B40941A0AD27350CCCD6F7F168E052100B4960EFDB774801389A3CC00000000000000000000000000000000000011B100001947001E408801BD668B00000000000000000000000000000000000000000000000000000000627D1FEE00000000000000000000000000000000000000000000000000000000000059AA000000000000000000000000000000000000000000000000000000000000388A0C5FA2F54DA8E983E572A991F5D934DC3B92D2BB4C026D6F616415164EE7D6627AF0FE3650146576BA4E0001A7F11FC0E53A811896E21B78F56E924119A571AE010382014807FF81F284D7FC30998316BF1094A906F338CB21815CBC4BC87ACE9E68C87EF8D8F18030B7000200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000011453F7A416B008052D1B48E68B71332D5B72B1C785B74AB74AE6AC6867D0F28D528F5344CEF219E7ECAC7F20479224F041A5CA3FFD5FAE43F9BAAAFE318DD2A6000382016A07FF821CB18501AFF86132832625A0941B02DA8CB0D097EB8D57A175B88C7D8B47997506804A25D94A0000000000000000000000000000000000000000000000007E09BEE1AA1904000000000000000000000000000000000000000000000000000000000431E4390700000000000000000000000000000000000000000000000000000000000000A00000000000000000000000000BD8F40920AEA2920C6BCD2781B3A2F475CA32BE00000000000000000000000000000000000000000000000000000000627D20680000000000000000000000000000000000000000000000000000000000000002000000000000000000000000FF970A61A04B1CA14834A43F5DE4533EBDDB5CC800000000000000000000000082AF49447D8A07E3BD95BD0D56F35241523FBAB1E66DC2E59AE2CB6CD69E909FC399376427ABB56719D60EC30E3C4350D664703469E3F9409825839720BC01A0E87B0C09E99B9B9A489439F6A80968C6D921C29E000382028A07FF8227DA850BA43B740C830F487794BA1BFD85432905FF4A2E7F516B56B7485DBDC5F680E0E90ACF000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000A0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000218761A6D957D975BE472E0680EA45ADEF03CFB000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000104627DD56A000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000A4394747C5000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000250C592A0000000000000000000000000000000000000000000000000455D72AD9615370000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000636B00DBBB82A71BB0CDE5029AE9DB3F78BE8A46F06A2511A9BCE3773C65B057097E6A32B98CC6EF78F24B0DB052EEC34038348B978C523A0BBCF22B646E5314010382016A07FF82182C85174876E800831AB3F0941B02DA8CB0D097EB8D57A175B88C7D8B47997506808803DBEE0000000000000000000000000000000000000000000000001BC2F393A763D0000000000000000000000000000000000000000000000000DBC2FF5994B2C61A8000000000000000000000000000000000000000000000000000000000000000A000000000000000000000000097581C75940624FDCD1CE618C4D0F6073CEB9D2200000000000000000000000000000000000000000000000000000000627EA6900000000000000000000000000000000000000000000000000000000000000002000000000000000000000000FEA7A6A0B346362BF88A9E4A88416B77A57D6C2A00000000000000000000000082AF49447D8A07E3BD95BD0D56F35241523FBAB13B7F7FCD58978C3C985C7280B77EF145076767D87426672EF0ABB2BB0A458CB23DE63547506A0247FB3764812DB881759C1E8E20EBD897023A57D2E5FF4B907E000382022907FF820BFB84D7FC3099830DF2ED94BA12222222228D8BA445958A75A0704D566BF2C88052BBBE2900000000000000000000000000000000000000000000000000000000000000E000000000000000000000000000DEE1F836998BCC736022F314DF906588D44808000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000DEE1F836998BCC736022F314DF906588D44808000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000027498F6FED2A640000000000000000000000000000000000000000000000000000000000627D206864541216BAFFFEEC8EA535BB71FBC927831D05950001000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FF970A61A04B1CA14834A43F5DE4533EBDDB5CC800000000000000000000000082AF49447D8A07E3BD95BD0D56F35241523FBAB1000000000000000000000000000000000000000000000000000000014D36893E00000000000000000000000000000000000000000000000000000000000000C00000000000000000000000000000000000000000000000000000000000000000C29751E9CCD7B09C1753852DC2BAB1D2396E15D9F84EAD02EAAF0896D34110764B02099BC4B37E972982A0886AD5DC426B86197F2EC90FA7CE75A8A63FF52E59010382020A07FF824DD285174876E800831AB3F09468B3465833FB72A70ECDF485E0E4C7BD8665FC45805AE401DC00000000000000000000000000000000000000000000000000000000627D470100000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000E45023B4DF000000000000000000000000FF970A61A04B1CA14834A43F5DE4533EBDDB5CC800000000000000000000000082AF49447D8A07E3BD95BD0D56F35241523FBAB100000000000000000000000000000000000000000000000000000000000001F4000000000000000000000000565D82C9C9584D21AD8EE5A73B56CE71DACED7E20000000000000000000000000000000000000000000000001BC17CDD6DBE100000000000000000000000000000000000000000000000000000000000ED1E554300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004D3801BA8B7859A90FD38D0B6FE462BC1AEA4FBA591359F2FBD42F028FF8A9A2398F46716749F5BB40205F51C6EF5C7EC050D297108407BE400D065CEE611C5000382040A07FF82B2CF85E8D4A51000836ACFC0949B8DDCF800A7BFCDEBAD6D65514DE59160A2C9CC80C9807539000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000002600000000000000000000000000000000000000000000000000000000000000300000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001C0000000000000000000000017E1DE687DF661FD3F7EEB0D2CD65F500000B7350509040500080706020301000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000A0000000000000000000000000000000000000000000000000000000025F5D4040000000000000000000000000000000000000000000000000000000025F5D4040000000000000000000000000000000000000000000000000000000025F6AA600000000000000000000000000000000000000000000000000000000025F7D9400000000000000000000000000000000000000000000000000000000025FD816900000000000000000000000000000000000000000000000000000000260CB5CE00000000000000000000000000000000000000000000000000000000260CB5CE00000000000000000000000000000000000000000000000000000000260CB5CE00000000000000000000000000000000000000000000000000000000260D279F000000000000000000000000000000000000000000000000000000002661226000000000000000000000000000000000000000000000000000000000000000041BBB9CEE3A4E33FA42612067B7FDC5962F6C01D05A15707541741894BCAB0AAEA1A0AC107C4089EC42522EC9CDB049D34F741BBA658B63666BD411EEC1A9BC4F9A8D6B9FAA7E3E6BE72E91FB054952C7F889B1A98EE27D1A58CD725DF1C15409AE6DD2D4F2AD0DC15A008CB9260A2ACE8369039136619D8507F17BC870AE5CD400000000000000000000000000000000000000000000000000000000000000044FE3B776AD0F3ABCFDAA3D138BC71092CCFBFF8B93031C82C6014FE1772A8E2C02F1E9D494D55364590B2CA694DADD23B7E93B9E2FF703EA61D70464C45F81BE5A222EF41C9550C9E834759412E4D754BC85BF895058328E54379F7005D1C55C728AB47CCD83251D8885D119294CA448F47E365B3688C50BEC7DA4DD73BACB02CAC9808CCDDCC96AEF287E4705F9306AC22E5FEC6738D7C621C559B1839F7B4000D184254CC5F25CBFAF36B3D4A11704424CFF4A070A29EC2506463C81C160ED000381E907FF822A3284D7FC30998313D620946A186D6D8B87EEA2F14964D9C0F0313DB16D1BA7804E86BA3C000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000001FB6E7B280000000000000000000000000000000000000000000000003B8E2DCE46807D0000000000000000000000000000000000000000000000000000000000627D2003F3A69CBD1214D95E9F677A083A2E73DD65705B5EBC3E1A10C5219500C52B54477CD4117571668B90F565966A9D47B3FCDABB71B045DED358FEC5686BC9B9998E000382016907FF824BC084D7FC3099831E645C94E592427A0AECE92DE3EDEE1F18E0157C0586156480DB3E2198000000000000000000000000FF970A61A04B1CA14834A43F5DE4533EBDDB5CC800000000000000000000000082AF49447D8A07E3BD95BD0D56F35241523FBAB100000000000000000000000000000000000000000000000000000000000001F4000000000000000000000000D0DB388F32328915654E88DB4241EB45FA6ED55900000000000000000000000000000000000000000000000000000000627D206C0000000000000000000000000000000000000000000000003F08E7CA3D3D90000000000000000000000000000000000000000000000000000000000218BAB1C500000000000000000000000000000000000000000000000000000000000000004D31C3CE10D69AF44CE366E4B83B9D68B82AF5E06DCB700960D573E4E5C5D17F34AA20A4FD95F96CB2D50F35DFC28FBE6239CA3D52AB2DE1417E181EE808298A000382040A07FF8203D385E8D4A51000836ACFC0942F45A77C5024EB546E9E7F445F266C0D3E71E61680C9807539000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000002600000000000000000000000000000000000000000000000000000000000000300000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001C000000000000000000000008C76406B0B69D023AA5BBA5E5AA310070000015E0307080400030506010209000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000A00000000000000000000000000000000000000000000000000000000326CEF80000000000000000000000000000000000000000000000000000000003282E77700000000000000000000000000000000000000000000000000000000328F9CF60000000000000000000000000000000000000000000000000000000032A967760000000000000000000000000000000000000000000000000000000032AB0B520000000000000000000000000000000000000000000000000000000032C238BA0000000000000000000000000000000000000000000000000000000032C238BA0000000000000000000000000000000000000000000000000000000032C238BA0000000000000000000000000000000000000000000000000000000032D6EE7B00000000000000000000000000000000000000000000000000000000330A19E00000000000000000000000000000000000000000000000000000000000000004CDE3369CACDFBCE129BC361F4893A8BADE78B80727AA1A95D0CEB7736A97B7F7CA90B804D2FB930FB3C5BCC11A9DB7837CE8DDEF7173F62F2AFA44F46E9BC3AEE173E33A7C985D8B12B40B7F68F3589964322293393DBD7BDF8205E580BC4BCC7FAAC90F8EF56680786407E56A281CEB4AE6E9795DD5B36B952C9EF6E2E03FD000000000000000000000000000000000000000000000000000000000000000046C68CAA434A4220EAF8246449D04A429F9A378CAD130B2B72CC9E5848C5B0C064A45FB5CAB7C6F535310045F1761FD9D9665ECCD4D4D39F2077853A6D14B43F27691887D21E40E6572F09B73E04B78D59C4AFF7D18EE965A55D3BF37EB3909F15288898607980B249078017C878D0786530E0D77B83D815378B94B2F61154DC65022287AFAD1176C26DDDE7B308D1DBA1F4FBBA72B928DFE7AA190276CA762D94351DE8D9F2B15BAEF0DB9F5C51BB5081492540117A1C882769A72C99C347E4001038201AA07FF82097C85012FFBD300834C4B40942ED6BC5830AD51A0A8FFEDA475DC64E3C35531448036946015000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000E300000000000029D26072D280AC00010102030060C31E54C7A869B9FCBECC14363CF510D1C41FA44382AF49447D8A07E3BD95BD0D56F35241523FBAB1FF970A61A04B1CA14834A43F5DE4533EBDDB5CC80000000000000000000000000000000000000000000002EA5BAD5AC917C00000000001F404006C0002000164541216BAFFFEEC8EA535BB71FBC927831D0595000100000000000000000002000000000000003E99C7090B855A0000000000000000000000000210D57BD74CFF970A61A04B1CA14834A43F5DE4533EBDDB5CC882AF49447D8A07E3BD95BD0D56F35241523FBAB100000000000000000000000000000000000000000000000000000000008EF8C33D7E81CCCA16B9C88FCB9870CBC3BA4FA2DE27FF7A4618D256FA2F364F2EA803D69442BD4648312EDED803BCCB9B1E8D2C39C97EA922EFAD64963D408101038201AA07FF82066985012FFBD300834C4B40942ED6BC5830AD51A0A8FFEDA475DC64E3C35531448036946015000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000E300000000000029DF833C045AC200010102030060C31E54C7A869B9FCBECC14363CF510D1C41FA44382AF49447D8A07E3BD95BD0D56F35241523FBAB1FF970A61A04B1CA14834A43F5DE4533EBDDB5CC80000000000000000000000000000000000000000000002EA5BAD5AC917C00000000001F404006C0002000164541216BAFFFEEC8EA535BB71FBC927831D0595000100000000000000000002000000000000003E99C7090B855A0000000000000000000000000210D57BD74CFF970A61A04B1CA14834A43F5DE4533EBDDB5CC882AF49447D8A07E3BD95BD0D56F35241523FBAB10000000000000000000000000000000000000000000000000000000000B1C59A8290FAFE61183BD5D585EC709DB70004341FE73C02216EEA9AA6371B831B6242712784D4BED6518332456896F9248A2C04164523C670B99EBDFCA5FD8B010382016A07FF820DE78501AFF86132832625A094E592427A0AECE92DE3EDEE1F18E0157C0586156480DB3E2198000000000000000000000000FF970A61A04B1CA14834A43F5DE4533EBDDB5CC800000000000000000000000082AF49447D8A07E3BD95BD0D56F35241523FBAB100000000000000000000000000000000000000000000000000000000000001F4000000000000000000000000E6C13A914132E8B7AA229AB0FC34FCF0BDFFFD1E00000000000000000000000000000000000000000000000000000000627D206C000000000000000000000000000000000000000000000000773241FE57D4800000000000000000000000000000000000000000000000000000000003F852A2970000000000000000000000000000000000000000000000000000000000000000A956693A880AA1CBB8D1A685E52AF8C20C4E803E384D9FA6775FEDCB4250768D5CB71A93D933822AB5EA47F435FFBAFAEF5C9296BC2471924326E72C20A204CF010381AB07FF8301C6C985174876E800831E8480941A0AD27350CCCD6F7F168E052100B4960EFDB7748017835D1C00000000000000000000000000000000000011B40000194D001E548C01BDD4D000000000000000000000000000000000000000000000000000000000627D1FF4FE1ED9BE4D7858AA632D7FE2BC3C416D1B0537548E7D1D80470BAFDB13DD361F681728BA1F087E2E13A80A388215161F135D425FD9412FAA3EB7515A8097C74F00038201EA07FF8201DC84D7FC3099831C495F943D6BA331E3D9702C5E8A8D254E5D8A285F223ABA010FC9874170000000000000000000000000000000000000000000000000000000000000012000000000000000000000000082AF49447D8A07E3BD95BD0D56F35241523FBAB1000000000000000000000000000000000000000000000000000000003B9ACA000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000F4305225ACA0793DE0E82530B8000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000629E440B0BD91778099DF800000000000000000000000000000000000000000000000000000000038D7EA4C6800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000FF970A61A04B1CA14834A43F5DE4533EBDDB5CC800000000000000000000000082AF49447D8A07E3BD95BD0D56F35241523FBAB17F89A75EB9E1B28CE8AAE4363FAE14BB4B82417051EA5C96B633B6EADA3A05BB31734D2B6AC27D47C04AF9FA4DF22281386FBE61FCD40A26E679DCB5959A8FAA010381E907FF8209E084D7FC30998309876594BED32937D8A5D1421241F52809908F1A17D75BDB80FDE2832F4554482D55534400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000035A4E95A5433C143F078741831E5A7EB60B121BE6CB5BC0CC71DAB4E4636541A9F42675272A94BDC57A0279553474FD21603579DA058EF3CDE3D444E08742AD0B4D62A2C000382010A07FF823FF58502755DEBD0830E764094960EA3E3C7FB317332D990873D354E18D764559080394747C50000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000002B95FD500000000000000000000000000000000000000000000000000000000000261A9550000000000000000000000000000000000000000000000000000000000000001DE148DB1D88073D8A7E2DB345A7C6DC79556C61985E8F6A8F68BA34C40DF4F2B0415487727C2069E6BC7F86037655FF115C3DB7A106B249574FEEFD5A88F0E9D0103820B8C07FF818584D7FC3099832CF732941111111254FB6C44BAC0BED2854E76F90643097D807C02520000000000000000000000000026271DFDDBD250014F87F0F302C099D5A798BAB100000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000180000000000000000000000000DA10009CBD5D07DD0CECC66161FC93D7C9000DA1000000000000000000000000FC5A1A6EB076A2C7AD06ED22C90D7E710E35AD0A000000000000000000000000489EE077994B6658EAFA855C308275EAD8097C4A000000000000000000000000E77884CDDF148DD5F0E9191B33D8DBADDB16DFB5000000000000000000000000000000000000000000000A968163F0A57B40000000000000000000000000000000000000000000000000008BCFDDD8BFF5BF42960000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000980000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000004400000000000000000000000000000000000000000000000000000000000000720800000000000000000000000489EE077994B6658EAFA855C308275EAD8097C4A00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000006493316212000000000000000000000000DA10009CBD5D07DD0CECC66161FC93D7C9000DA100000000000000000000000082AF49447D8A07E3BD95BD0D56F35241523FBAB100000000000000000000000026271DFDDBD250014F87F0F302C099D5A798BAB100000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000022414284AAB0000000000000000000000000000000000000000000000000000000000000080800000000000000000000000000000000000000000000000000000000000004400000000000000000000000082AF49447D8A07E3BD95BD0D56F35241523FBAB1000000000000000000000000000000010000000000000000000000000000000180000000000000000000000080A9AE39310ABF666A87C743D6EBBD0E8C42158E000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000104128ACB0800000000000000000000000026271DFDDBD250014F87F0F302C099D5A798BAB10000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000001000276A400000000000000000000000000000000000000000000000000000000000000A0000000000000000000000000000000000000000000000000000000000000004000000000000000000000000082AF49447D8A07E3BD95BD0D56F35241523FBAB1000000000000000000000000FC5A1A6EB076A2C7AD06ED22C90D7E710E35AD0A0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000024432CE0A7C0000000000000000000000000000000000000000000000000000000000000080800000000000000000000000000000000000000000000000000000000000004400000000000000000000000026271DFDDBD250014F87F0F302C099D5A798BAB100000000000000000000000000000000000000000000000000000000000001C000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000A405971224000000000000000000000000FC5A1A6EB076A2C7AD06ED22C90D7E710E35AD0A000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000100000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004470BDB947000000000000000000000000FC5A1A6EB076A2C7AD06ED22C90D7E710E35AD0A00000000000000000000000000000000000000000000008D39668D5D0CEA90D60000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000018414284AAB00000000000000000000000000000000000000000000000000000000000000808000000000000000000000000000000000000000000000000000000000000044000000000000000000000000FC5A1A6EB076A2C7AD06ED22C90D7E710E35AD0A00000000000000000000000000000001000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000064D1660F99000000000000000000000000FC5A1A6EB076A2C7AD06ED22C90D7E710E35AD0A0000000000000000000000001111111254FB6C44BAC0BED2854E76F90643097D00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000E26B99773A310DE49E459B689D9BB377D5479380AB81C150A9E88060D378BE1A7014EBD431FD4AA3657E1D025F6564A5BBC160FAD7BE7CAFBC16E2E8BA280565B00FCDCB010381EA07FF8290B785174876E800834C4B40941A0AD27350CCCD6F7F168E052100B4960EFDB774801389A3CC00000000000000000000000000000000000011B400001947001E408801BD668B00000000000000000000000000000000000000000000000000000000627D1FF500000000000000000000000000000000000000000000000000000000000059AC000000000000000000000000000000000000000000000000000000000000388B69F7473472F0E582D26724468015CEA2BECD4648AD48CC9FDD3363779C15EDDE36401DE82A94DEF07BE6A61FC7408E1B3815A5BCDA06DEDAB38E39ADEF184543000382016907FF82079184EFBE54A9830E2A1E94F8D88D63ED3A2104E664AE8715FC9F80ABBA864D8046BD71F90000000000000000000000001B02DA8CB0D097EB8D57A175B88C7D8B479975060000000000000000000000000000000000000000000000000B485B314A6480000000000000000000000000000000000000000000000000000000000060A13A1E00000000000000000000000000000000000000000000000000000000000000A000000000000000000000000000000000000000000000000000000000627D20050000000000000000000000000000000000000000000000000000000000000002000000000000000000000000FD086BC7CD5C481DCC9C85EBE478A1C0B69FCBB900000000000000000000000082AF49447D8A07E3BD95BD0D56F35241523FBAB1BB31A64EA4311CF784F1445EE21443C052F067F3E225641D11A3B9006BD84A433DAB96072F57485F5719A628A3504F6E790B0F3CE65E70FC1F169235908F5BFF010382020A07FF824DD385174876E800831AB3F09468B3465833FB72A70ECDF485E0E4C7BD8665FC45805AE401DC00000000000000000000000000000000000000000000000000000000627D470700000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000E45023B4DF000000000000000000000000FF970A61A04B1CA14834A43F5DE4533EBDDB5CC800000000000000000000000082AF49447D8A07E3BD95BD0D56F35241523FBAB100000000000000000000000000000000000000000000000000000000000001F4000000000000000000000000565D82C9C9584D21AD8EE5A73B56CE71DACED7E20000000000000000000000000000000000000000000000001BC17DC64263200000000000000000000000000000000000000000000000000000000000ED2D997700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072319094B549C740BE47019E0C0610AB47E5DD88752EBDC179A27AE5A56FA4D52CDBA08D0F9CC391F1BE2C4D1D758F4021B1F2C88F34B18980A131D5B891FAA0010381B207FF82569185174876E800832DC6C0943648F6E38E8641BF847B3A776DAF6A21AE9A42DD800000000000000000000000000000000000000000000000000E62D9AFBF128180010000C31E54C7A869B9FCBECC14363CF510D1C41FA44301000801000100047FC40000080100010001A2E400420A0611423839EDD4850B9349F8A92A92A4A0C1C33ED88B3810713059718E45077C70CDED7D54A114D7DF0EFA0C3A5F3C9F1105B317EFC19DD3EE6A4CA0E5AB1B0381A207FF82569285174876E800832DC6C0943648F6E38E8641BF847B3A776DAF6A21AE9A42DD8000000000000000000000000000000000000000000000000004523CEE38A993C00100010000038D0100080100010004BDFE0000080100010004803501A743EB08330585F2AAD719B68475D1575AE7F3222720515109A7A0B8223D42474438D09F089B8AFC87E3673B18A111FE3348892710D3A90B6912B6DF2137EB491B0382016A07FF82182D85174876E800831AB3F0941B02DA8CB0D097EB8D57A175B88C7D8B47997506808803DBEE0000000000000000000000000000000000000000000000001BC2F47C7C08E0000000000000000000000000000000000000000000000000DBF04B684995A0000000000000000000000000000000000000000000000000000000000000000000A000000000000000000000000097581C75940624FDCD1CE618C4D0F6073CEB9D2200000000000000000000000000000000000000000000000000000000627EA6980000000000000000000000000000000000000000000000000000000000000002000000000000000000000000FEA7A6A0B346362BF88A9E4A88416B77A57D6C2A00000000000000000000000082AF49447D8A07E3BD95BD0D56F35241523FBAB16C58829AB29A00B0E3D2DF4176E5D80CD2DA19505673BF23544BBDA1F96C0AA96CABC50561CCB9F794462B284E83CEE97E74093271EC46148D1099BCF48B77AB000382020A07FF824DD485174876E800831AB3F09468B3465833FB72A70ECDF485E0E4C7BD8665FC45805AE401DC00000000000000000000000000000000000000000000000000000000627D470800000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000E45023B4DF000000000000000000000000FF970A61A04B1CA14834A43F5DE4533EBDDB5CC800000000000000000000000082AF49447D8A07E3BD95BD0D56F35241523FBAB100000000000000000000000000000000000000000000000000000000000001F4000000000000000000000000565D82C9C9584D21AD8EE5A73B56CE71DACED7E20000000000000000000000000000000000000000000000001BC17EAF1708300000000000000000000000000000000000000000000000000000000000ED0461510000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005758EAC098ABDDEE41B7E6184A71B5D99D115A6F8183379A0D269465312FC6D27939E0C6E9B2162B4BCD5808394D8AEE202FD75C56CF145D437739D0E410891700036C07FF0184D7FC309983079B4E94673184C370BA3B56FA61B69A1811E116443D70168803605EE6AE89C72200350DEF7B65D77AE8A2BA9297B58133C250D935F09F7C3A1ADCD51BC4C5C4081E6D2A2A9D89034A5FE32B2DE14DB487F6EEE5371F3DD8DB786E1B9DF66A5EEE29000382014807FF819384D7FC30998310D5E494ABBC5F99639C9B6BCB58544DDF04EFA6802F4064802D4BA6A700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000005EC9677EB400000000000000000000000000000000000000000000000B0E4953F0065DBE000000000000000000000000004B28B6108345134634231F3E40CC701F225CD3280000000000000000000000000000000000000000000000000000000000000002000000000000000000000000FF970A61A04B1CA14834A43F5DE4533EBDDB5CC800000000000000000000000082AF49447D8A07E3BD95BD0D56F35241523FBAB1D3E2B07D5DD1723337D7DAB7B7B68EF78EC5FFF6BBB5000FCA766E0E08D193A47A888DFFE63BFA2A811CD3554046B97EB6A987DE2E8DAE924A3B1F699E834D31010382020A07FF824DD585174876E800831AB3F09468B3465833FB72A70ECDF485E0E4C7BD8665FC45805AE401DC00000000000000000000000000000000000000000000000000000000627D470B00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000E45023B4DF000000000000000000000000FF970A61A04B1CA14834A43F5DE4533EBDDB5CC800000000000000000000000082AF49447D8A07E3BD95BD0D56F35241523FBAB100000000000000000000000000000000000000000000000000000000000001F4000000000000000000000000565D82C9C9584D21AD8EE5A73B56CE71DACED7E20000000000000000000000000000000000000000000000001BC17F97EBAD400000000000000000000000000000000000000000000000000000000000ED0F110F0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005A6CC48EA43417B2AF3D1A6CEDD33555BA84C48194A39E2BA383F227300ED922665498CF03D65CF7E0B2280FC93DD56AC8764F6F1E52441479F79F88E5E5381C000382010A07FF8214B3850143FA48E58389544094107914E545E057BDD1EDE5D4732E62D6DC4838FE809927C19800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000B199B94607BEC51DDFD59958BFDD56879FEC3A4CD65BAB83324CA819A13B030E64D6748F3A7D82762748A583E9D929EBF35D12275D2BC01FCB9F8F0DAC8C41DC000382010A07FF820AE1850143FA48E58389544094107914E545E057BDD1EDE5D4732E62D6DC4838FE809927C19800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000BC3C7B9892EB7FEBD82DF0A410C0B902D2EC69C7E2793E29A257F739CCE61BB422491A7A1B4E3C54F24CCDB389326FDB28473C7A02973CDF19C6DDAB5BC8A37A010382010A07FF82418D850143FA48E58389544094107914E545E057BDD1EDE5D4732E62D6DC4838FE809927C198000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005E233B844E61BED6E3956926A4CF0AB81FBB578E585FCACF448AC6658B2703F21D33C3E4AB9577C47D2F3D455F468F58D51BA32EB70D67F4566CC950ACC9CB32010382010A07FF820B0C850143FA48E58389544094107914E545E057BDD1EDE5D4732E62D6DC4838FE809927C19800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000697EA565A47F7380F6D4B92AEF3718272D3CCF4D0A2465735B7EC91569C3484B4030AF9A434787B96D4D655C7B68D24BE7D7E00F267FA0FD596D9752204F4511000382040A07FF82B6BF85E8D4A51000836ACFC094942D00008D658DBB40745BBEC89A93C253F9B88280C9807539000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000002600000000000000000000000000000000000000000000000000000000000000300000100010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001C00000000000000000000000C53BF610EB015FA9F4FAB204B58622E60000015E0107000603080205040901000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000A0000000000000000000000000000000000000000000000000000029C2B252236000000000000000000000000000000000000000000000000000002A0FAAFC08C000000000000000000000000000000000000000000000000000002A17A5152AA000000000000000000000000000000000000000000000000000002A21E985CA2000000000000000000000000000000000000000000000000000002A26EB638CF000000000000000000000000000000000000000000000000000002A3E120AA07000000000000000000000000000000000000000000000000000002A41DA5CAA7000000000000000000000000000000000000000000000000000002A4EACCAA7B000000000000000000000000000000000000000000000000000002A4F5EF6900000000000000000000000000000000000000000000000000000002A56E1667E600000000000000000000000000000000000000000000000000000000000000043118752471E2A24D3880E485B1ADFDC0F4237F556F12035D22EF57ABD07561BF83E500BDA056607E3005660AE0696F35B768832E68D61C9310BEB19AEECA35DAA77D60ECB4DDAF665D001B2E42556B4ED0C13EB9BF588BFA924A4492185E6F99F6FB19AC78AF3F40B52AFF84660855678ECAAE199D417AAB4F59E9F5F94FC7370000000000000000000000000000000000000000000000000000000000000004105E1D8CC919F6F74882E39027D23E9B20C3C55FEEB5727B19468F4C69F928090668287561BD6916FCDC9BB929AE79DE0187060E275D3F889CCEB4785593E31A097F4005B58547D779DFD04C615939DA68F8E4DF78A1AD478AF2FFE3656649ED7440DAF5485C8C66FB526435F7B2C8017CECA132DDC82618B27C87819496341EEEB68738A3772C01034EF2363CD2949D5DAEC7ACDA3CE3A913ABC74ACCAF5BEF46681F67E579FB33F9BF879E5A849C57836A7378A787654EA56B8540C9C56A99010382028907FF82101A84D7FC3099832625A094ED9CA5ECD2068C29A0698460DB9B0372C8F87BD280E84423C300000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000165A0BC00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000000400000000000000000000000082AF49447D8A07E3BD95BD0D56F35241523FBAB1000000000000000000000000FF970A61A04B1CA14834A43F5DE4533EBDDB5CC8000000000000000000000000FEA7A6A0B346362BF88A9E4A88416B77A57D6C2A00000000000000000000000082AF49447D8A07E3BD95BD0D56F35241523FBAB10000000000000000000000000000000000000000000000000000000000000003000000000000000000000000C31E54C7A869B9FCBECC14363CF510D1C41FA443000000000000000000000000000000000000000000000000000000000000000200000000000000000000000030DF229CEFA463E991E29D42DB0BAE2E122B2AC7000000000000000000000000000000000000000000000000000000000000000B000000000000000000000000B6DD51D5425861C808FD60827AB6CFBFFE6049590000000000000000000000000000000000000000000000000000000000000001FFF67D44E8C3D2271285360E688ABCDC4DFACF7BBC03C1FA16D7B2B63C7216FF0823A36A4DF08F82DEEDE212CFD22B4A54AEA731920697027C66251DC066D42E010382010A07FF8236F485174876E800832DC6C09469844CB44932B489F07D0F6FC42294D357A7B74E80742E9E0F000000000000000000000000FF970A61A04B1CA14834A43F5DE4533EBDDB5CC800000000000000000000000082AF49447D8A07E3BD95BD0D56F35241523FBAB100000000000000000000000000000000000000000000000000000000000001F400000000000000000000000000000000000000000000000053444835EC58000000000000000000000000000000000000000000000000000000000000627D2128F9810AA681D6A86A5BC3BB7BDC54E6F4DB79053C6ACA4F05BDFB5420EC9070606B79A10B40B57630CBA2DA9C46555CC4FD9085252047D45C20AD4A97B4D2C911010382014807FF7284D7FC3099830F3529941B02DA8CB0D097EB8D57A175B88C7D8B4799750619107FF36AB50000000000000000000000000000000000000000000000009C71C54A4A6B3FF80000000000000000000000000000000000000000000000000000000000000080000000000000000000000000C4B07A842E0068A95C3CD933E229348E6D79427900000000000000000000000000000000000000000000000000000000627D26C5000000000000000000000000000000000000000000000000000000000000000200000000000000000000000082AF49447D8A07E3BD95BD0D56F35241523FBAB100000000000000000000000032EB7902D4134BF98A28B963D26DE779AF92A2128AFA2B7B299F135A98932C0882BAC0B992315E0109CFD2E2797C1FFC2D8292016E46E69EE4DA25A13B541C3A48BC22732442FA32E8DD002125B2F1CB3E9B5A7C000382012907FF82059E84D7FC3099831E848094146C57ABB43A5B457CD8E109D35AC27057A672E28043C8D33B00000000000000000000000082AF49447D8A07E3BD95BD0D56F35241523FBAB1000000000000000000000000FF970A61A04B1CA14834A43F5DE4533EBDDB5CC8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000AD8255C000000000000000000000000000000000000000000000000000000000000186A000000000000000000000000000000000000000000000000000000000627D205CD95359E9EB64E0FCFAFD273D4051D42979BFA30516D93D966408EC55F70A32827A51A6E825E9BC9B780B4D7445C5491853BA7DE5C658F94DD8E6890C88755697000382016A07FF82182E85174876E800831AB3F0941B02DA8CB0D097EB8D57A175B88C7D8B47997506808803DBEE0000000000000000000000000000000000000000000000001BC2F56550ADF0000000000000000000000000000000000000000000000000DC041CAEB8B8E2000000000000000000000000000000000000000000000000000000000000000000A000000000000000000000000097581C75940624FDCD1CE618C4D0F6073CEB9D2200000000000000000000000000000000000000000000000000000000627EA69D0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000FEA7A6A0B346362BF88A9E4A88416B77A57D6C2A00000000000000000000000082AF49447D8A07E3BD95BD0D56F35241523FBAB1DA39A229AD7407EFCE787F487CF4A9890C106F2D9EBFDDEFEE93C6504AB7620438C81490EF99193E083F16F99767360AB89F075954FE065A4F946DC704489B6A00036807FF8266FB84D7FC309983077BAE945A64FAF92FE4201E303E5D9672E3EE2E7B0051A08204780ED2BB11F9D3A7A256C5054F8B355E54E265621B65A7257457C38C30514BC6FAF0696776D526DC272FA8986B084463A148C6D4FA8671CA27FD405CFC9E2A88C5EE000382024907FF82C34B84D7FC3099830C8B1C94E195A15533C01C8CD6B28F09066842486F80F8F280CC064C8C00000000000000000000000000000000000000000000000000000000000000A000000000000000000000000000000000000000000000000000000000000000E00000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000001A00000000000000000000000000000000000000000000000000000000000000001000000000000000000000000EE7170D3A4E299CB391621A9C19D05817B8F678D00000000000000000000000000000000000000000000000000000000000000014554482D55534400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000002E3D1961BC084E9D59506A0F76D676E63F8E53F805E392C6914C438AD5BF2DDBCCB38072493B2BD60AFD73ACA863E10B69926BFEFAAAFDA00CA5DEA3B111D7AD460758A5F2010382028A07FF8227DB850BA43B740C830F487794BA1BFD85432905FF4A2E7F516B56B7485DBDC5F680E0E90ACF000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000A0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000218761A6D957D975BE472E0680EA45ADEF03CFB000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000104627DD56A000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000A4394747C50000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000002512FF5000000000000000000000000000000000000000000000000004544410EB1A3C5C0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005EF89BDDABF11282FE9330EFEEA1E92071B4833ECBF4D2B7AF50D978DEBEFB2B291F80C981290A5495A7A503EFAFE0FA723FBC2DEA7680205836563B498BB50E00038208E907FF820FD384D7FC3099833DB1A4941619DE6B6B20ED217A58D00F37B9D47C7663FECA80CDD1B25D0000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000003C0000000000000000000000000000000000000000000000000000000000000062000000000000000000000000000000000000000000000000000000000000000710A146A9D63CBB02B6A7D5D09CE11D0A4B981BB1A221D12146A9D63CBB02B6A7D5D09CE11D0A4B981BB1A221D1A14FD086BC7CD5C481DCC9C85EBE478A1C0B69FCBB922044920244728FA0130B1C9023A2018ADEA4DEC429A7D47E6FA7041EBD3E5E031DAA20718C19C456466C04C00B41E0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000180000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000411099266E3AA730D2C1381265A6446A486BCF2805002E2A22B525961D104BB318784E3BF22409166F554C826498D1D9E5637A569DD9E83772D54FC338823FFA091B0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000419029267E04C10CA3B989F4E94D0824CDD6AE1D1F7CD67B1F459DBA396DB067E35FB5F18E4EA1CE3CC17D1AA70301B67FCD5610D53C19D74EC8F5C987AE3E3EE51B000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000041DD5923F133C9F0F8AE6BB1C565F876276A18A4CDDED6624E6152544902AC570D42F374992F436787E2457D4EF0B4F5C84FDD9C6443CCC9A23ADE6DC806B27BBD1C0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000411C768BD318CD552AB6C705C694D1B6C0ED23C2E964D609CF84DDD1CE0F6C5DCC6CC76ECD99B5ADC3345B98AB4635FD69AA686EE912FE2F490F2B2E22296EC1EE1C000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000012000000000000000000000000241A100333EEFA2EFC389EC836A6FF619FC1C64400000000000000000000000055F4A1BFC655CF55ED325F2338A1DEE84F754DF200000000000000000000000087AF7619D4D1C70C19083664D0C6E748CC45C3BD00000000000000000000000095016E36ADB4E0151735CED3992A7FA54E16BD08000000000000000000000000954ADC74481634B4D278C459853B4E6CC17AE8D200000000000000000000000098E9D288743839E96A8005A6B51C770BBF7788C00000000000000000000000009A66644084108A1BC23A9CCD50D6D63E53098DB60000000000000000000000009AC5279013EDFEC74C5C2976FC831AD0527402E00000000000000000000000009CD5006E1BFF785DAD5869EFD81A2C42545C9D9B000000000000000000000000A73B339C3FAE27BEDF7CB72D9D000B08FC899609000000000000000000000000BFA2F68BF9AD60DC3CFB1CEF04730EB7FA251424000000000000000000000000C74ACAB8C0A340F585D008CB521D64D2554171A8000000000000000000000000CF12DD34D7597D06FF98F85D2B9483D9D5F7D952000000000000000000000000D10C833F4305E1053A64BC738C550381F48104CA000000000000000000000000F3D912E7FB180ACDEA31A52797D55EE2988AB907000000000000000000000000F4151EEBFA1B9C87DD92C8243A18B1BAEF8C1813000000000000000000000000F5AD7F3782E8A67BFFA297684E27CF9FCC781BE1000000000000000000000000F6E93EB288658DE5E2E982F99D2B378B22959D1500000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000E30A75934B0F612D2000000000000000000000000000000000000000000000000F1E405B08A486ADB000000000000000000000000000000000000000000000007B0B0105083062FC7C0000000000000000000000000000000000000000000000B30C07AEEA53998780000000000000000000000000000000000000000000000058E14D946FBB08DFD0000000000000000000000000000000000000000000000A8DE63952825AE0B730000000000000000000000000000000000000000000001094C62786FB6C23123A00000000000000000000000000000000000000000000006A21A9D9B4028056E00000000000000000000000000000000000000000000000538AC46E67A765525000000000000000000000000000000000000000000000053E60970D46049A4330000000000000000000000000000000000000000000000CB442B15C085F860EC00000000000000000000000000000000000000000000003E0BFC3F76D358DD4000000000000000000000000000000000000000000000000AFBA4702425EECA6900000000000000000000000000000000000000000000007C3A74F699D4154650000000000000000000000000000000000000000000000002FCA8C1A6DCBEE2440000000000000000000000000000000000000000000000005A939E47473A32E600000000000000000000000000000000000000000000000054ADDF6A1F44BB4900000000000000000000000000000000000000000000002E56670E17FF0DF429000074A394D2084C8E5496A5992963132E3D128D387FA8C826E579E9862588C78B892D5FD9D8E26BE2F5154A7E64DE50C9934227218C657D38C57BDC456D94A5C7DC00036407FF0C84D7FC3099830761FC94A4317FC30B4BE4AC73BA3FA0A6DC2A62A47B758B0310FD059CAD953F52FC9896688882E791903C34F0B8E3D8D133B1FFD67A06B0F06E045C1D401E76BAF8E1CA5A1B0A2F438AD10A95DCB08FEDD9F0DD09531FD6AD41010382024907FF8207D084D7FC3099830F8BB394BA12222222228D8BA445958A75A0704D566BF2C88052BBBE2900000000000000000000000000000000000000000000000000000000000000E000000000000000000000000000C84F245AB3F76CBCB6BDA478325402322DFBB6000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000C84F245AB3F76CBCB6BDA478325402322DFBB600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000592A754D100000000000000000000000000000000000000000000000000000000627D201A996616BDE0CB4974E571F17D31C844DA2BD177F800010000000000000000001800000000000000000000000000000000000000000000000000000000000000000000000000000000000000007D7E4F49A29DDA8B1ECDCF8A8BC85EDCB234E997000000000000000000000000AA846004DC01B532B63FEAA0B7A0CB0990F19ED9000000000000000000000000000000000000000000000000000000006B8EA21600000000000000000000000000000000000000000000000000000000000000C0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000002634DC7B2A47875CF127B8C5F59F6554254E721BB87F7635038CC4739BACC15A793D207A1C855B45782E5D8D58EDE446613D46FCF7471E7CF4EB67C664B9D970000382016A07FF821CB28501AFF86132832625A0941B02DA8CB0D097EB8D57A175B88C7D8B47997506804A25D94A0000000000000000000000000000000000000000000000007DC2B0FCCA96FC0000000000000000000000000000000000000000000000000000000004322EDE5B00000000000000000000000000000000000000000000000000000000000000A00000000000000000000000000BD8F40920AEA2920C6BCD2781B3A2F475CA32BE00000000000000000000000000000000000000000000000000000000627D20770000000000000000000000000000000000000000000000000000000000000002000000000000000000000000FF970A61A04B1CA14834A43F5DE4533EBDDB5CC800000000000000000000000082AF49447D8A07E3BD95BD0D56F35241523FBAB144EE6470AFD7A1C2D51E3B7FCBE00B3D32AE84AA43FFD6F0AEE7654056CF595B6D756CD35A82E5B8DEC18B66B1494BB06382691F6309CB151A5531AC0B414EDC010382040A07FF82B2D085E8D4A51000836ACFC0943607E46698D218B3A5CAE44BF381475C0A5E2CA780C9807539000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000002600000000000000000000000000000000000000000000000000000000000000300000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001C00000000000000000000000F6D9397093865A569A3B827FBE021B4E00012DD40205070802010604030009000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000A0000000000000000000000000000000000000000000000000000002D8FCA82AD0000000000000000000000000000000000000000000000000000002DB1E36C800000000000000000000000000000000000000000000000000000002DB1E36C800000000000000000000000000000000000000000000000000000002DBFD776C10000000000000000000000000000000000000000000000000000002DD312A1470000000000000000000000000000000000000000000000000000002DE07F82FA0000000000000000000000000000000000000000000000000000002DE27756400000000000000000000000000000000000000000000000000000002DF07927000000000000000000000000000000000000000000000000000000002DF2FA05800000000000000000000000000000000000000000000000000000002E133906C000000000000000000000000000000000000000000000000000000000000000045552B522CD956798A81BB654361B2444F2FA2FB817B2A4EEE1DDFFDDD364479D5CB652833F395EFEBDA62347D490A5B92D332A2CD93E3AFA1036F0388184884258ED18F83140C2D72FEB6449735147D487AF50C057BE54CE8EBF082A106641DFCE00B989E75206C8B886070321E9165D2A8F36132AC2B785A196D3FC4AA10BA60000000000000000000000000000000000000000000000000000000000000004227DC169832627CDCBC3E4884517DE54D5201D00B0868C77515125E10C2692445FFA4D7CBA9D42B9CC45F8C734EDF80F75461FCC56E5D1BB209411C09D596AC03B129BA7C7D46CB5A17992A093F9B8AFE68F53FDC4139C48F8A968049F1A9072591DE5B8AF7087CC8C6B96F298EBD420A3BBF0937774DACAF3797727EDC448A64AFB8ED4A796AC4B38B4B903D6CAF62556E514C473920F59D2D1C851769C6A24096B4A06A4D06E94C3B606E917725A9710E2A692DD55C2C5FE16CECCE789438101038204AA07FF8227EC85012A05F200831732A594BA12222222228D8BA445958A75A0704D566BF2C880945BCEC90000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000003400000000000000000000000007CA545A1EB1FB24A74961CC1A95AC4614C2B70BC00000000000000000000000000000000000000000000000000000000000000000000000000000000000000007CA545A1EB1FB24A74961CC1A95AC4614C2B70BC000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003C00000000000000000000000000000000000000000000000000DE0B6B3A763FFFF000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000120996616BDE0CB4974E571F17D31C844DA2BD177F8000100000000000000000018000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000002104E8DF6669674400000000000000000000000000000000000000000000000000000000000000A000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000996616BDE0CB4974E571F17D31C844DA2BD177F800010000000000000000001800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000264800000000000000000000000000000000000000000000000000000000000000A00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030000000000000000000000007D7E4F49A29DDA8B1ECDCF8A8BC85EDCB234E99700000000000000000000000082AF49447D8A07E3BD95BD0D56F35241523FBAB1000000000000000000000000AA846004DC01B532B63FEAA0B7A0CB0990F19ED9000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000F55DF1DEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0541B686985FFD8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDB488954991AFF88D522ABABFAE64A955C7A369E69AF49C5305A5F30925AA053D7566C48A6D7F3AF58A427D22C26963F051E8144B74C01948D82AAC41F4A3D9C9C1300036407FF2584D7FC356C8307425C9470E617E7D6B40F89676E46D087376528358355E70511ACA76049E9DCC7830BCE1F91A473BFF571602FE4F14AC13909CF44CF3D08F0EC78E97C480955672A8572644AC0C754D861B74063AC94B724C3AA83B772929AD6000382016A07FF821B228501AFF861328323186094E592427A0AECE92DE3EDEE1F18E0157C0586156480414BF389000000000000000000000000FD086BC7CD5C481DCC9C85EBE478A1C0B69FCBB900000000000000000000000066BA30D5D7C66AFD4ED41C3498EC9E20A03A13680000000000000000000000000000000000000000000000000000000000000BB80000000000000000000000003D11DC9151ADC719D539390FCE7EAF0FABE36C3B00000000000000000000000000000000000000000000000000000000627D2078000000000000000000000000000000000000000000000000000000002FBA168D0000000000000000000000000000000000000000000000056900D33CA7FC0000000000000000000000000000000000000000000000000000000000000000000051DB3EAFE2DE7E4C6B3370E8094D931E56EB655AA427E0CC72F9B0DA47DEDFAB0C28E892399B9708C271562531CC99774E4A7DCF8F6661B3161380F40B86F73F1B0381A707FF0C84D7FC3099830AAD2694FF970A61A04B1CA14834A43F5DE4533EBDDB5CC880095EA7B3000000000000000000000000A867241CDC8D3B0C07C85CC06F25A0CD3B5474D8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAE3659F97CEA56B3F4AE404005632D1E2C2174C0A8C0AF3A72CC0DDC8BE7FB69104450C06172175CADEE544D7E18C7781081FB39AC94DD9B55B870D4C3F0E096000382016907FF824BC184D7FC3099831E3BB894E592427A0AECE92DE3EDEE1F18E0157C0586156480DB3E2198000000000000000000000000FF970A61A04B1CA14834A43F5DE4533EBDDB5CC800000000000000000000000082AF49447D8A07E3BD95BD0D56F35241523FBAB10000000000000000000000000000000000000000000000000000000000000BB8000000000000000000000000D0DB388F32328915654E88DB4241EB45FA6ED55900000000000000000000000000000000000000000000000000000000627D20780000000000000000000000000000000000000000000000002D6FA28CDC7DE80000000000000000000000000000000000000000000000000000000001834DF96E00000000000000000000000000000000000000000000000000000000000000008A25352770D7CC72E3886B90C342F91D2E8018574DD06E3FAA0F9EF5AE27198B07525592E37C4296CCAAADBCCC46DB5D09F741DBDA82E8C65831C8D6606FED74000381AB07FF8301C6CA85174876E800831E8480941A0AD27350CCCD6F7F168E052100B4960EFDB7748017835D1C00000000000000000000000000000000000011B90000194E001E5C8301BE5F4A00000000000000000000000000000000000000000000000000000000627D200158AD078E0AEA4007B75B4825E3335FF7ADAF4228697B1FA8080A7516A318CFC9026EC5613052A8537E994575190B20E9C72094131C48E3479CC202456FEB7F96010381EA07FF8290B885174876E800834C4B40941A0AD27350CCCD6F7F168E052100B4960EFDB774801389A3CC00000000000000000000000000000000000011B90000194E001E5C8301BE367100000000000000000000000000000000000000000000000000000000627D200200000000000000000000000000000000000000000000000000000000000059AA000000000000000000000000000000000000000000000000000000000000388AB704D215C0AC2D8FB898AD001C465BFC78A8206C045D26E257689AD6AB14629E6B960E7B03CF5CB11F623066BF521759EA54BCA45978DF0EF6BC4B94AE035598010382012A07FF82555E85010DFB3CBF83121D59940E0E3D2C5C292161999474247956EF542CABF8DD803D12A85A000000000000000000000000169B69E1C17EE4300C241DCDB43E5193E19D046B00000000000000000000000000000000000000000000000000000002EC2301C63A020003C516BBE8418C8FE1DD4355F8BBDC0C416BA2EDB5421D1A8208C433B6000000000000000000000000000000000000000000000000000000000150C36B00000000000000000000000000000000000000000000000000000002E7D0B38D00000000000000000000000000000000000000000000000000000000628657EA97273BD05AC80EABB97676C3EC7A2DF50F4048835BAE8BD426655B06EB0E0BDD3851AB2C4621B0A1A3A23644F0382F693F55D1CBE5B06AA3B6B9EB78873B1421000382016A07FF820DE88501AFF86132832625A094E592427A0AECE92DE3EDEE1F18E0157C0586156480DB3E2198000000000000000000000000FF970A61A04B1CA14834A43F5DE4533EBDDB5CC800000000000000000000000082AF49447D8A07E3BD95BD0D56F35241523FBAB100000000000000000000000000000000000000000000000000000000000001F4000000000000000000000000E6C13A914132E8B7AA229AB0FC34FCF0BDFFFD1E00000000000000000000000000000000000000000000000000000000627D207D0000000000000000000000000000000000000000000000006FE1FA492332FC0000000000000000000000000000000000000000000000000000000003BB8088F20000000000000000000000000000000000000000000000000000000000000000FE79987502BA57FCB2298C3BD2E23FFE04E4D92F039DDB3AE795C119C6B5A0D669776AE5A75D888AA56CA2B73C0D7B088E6CB7BB076A7F46AFF3D79EF02EB0ED000382040A07FF82A96985E8D4A51000836ACFC094A58474C4F9A3A37DEAE8E6BCFA337E0E9ED699E080C9807539000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000002600000000000000000000000000000000000000000000000000000000000000300000101000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001C00000000000000000000000EA4A514465A794F42278C11CABEC5DD70000015D0506030102050809000407000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000A00000000000000000000000000000000000000000000000000000000000608180000000000000000000000000000000000000000000000000000000000061F2B00000000000000000000000000000000000000000000000000000000000943000000000000000000000000000000000000000000000000000000000000094DAC00000000000000000000000000000000000000000000000000000000000DE4C800000000000000000000000000000000000000000000000000000000000DE4C800000000000000000000000000000000000000000000000000000000000DE4C80000000000000000000000000000000000000000000000000000000000127F190000000000000000000000000000000000000000000000000000000000133421000000000000000000000000000000000000000000000000000000000021544300000000000000000000000000000000000000000000000000000000000000041FD26BF16BF1EA8D6824E62D2713CB3FA684411A7712394761A7EFE7D051A6621A5B41EC445AB86753F005CD68109D598A09DA01CEDEA0A9A1B5763DB6620DC8D51C0CD5A77D0CBB7E7AE945EDA066C76CA634F0B1A4A4DCF2D6956661F51241445BEDCF924E737F449C16A33963B3F730FF712B392AE280C13A0313BB81808B00000000000000000000000000000000000000000000000000000000000000040436A301E78FB01BC969897C8AB68F98E62DFC2EFD0C1B05A259F1484261A5121224754885B752087037D18CE04BF12D8B5B15D17F379DD8A4CBFAC388685FDE77FF7FF61B551C9C9BA49DEB373CB8DCCABCDB4202223CDDF82D85DC83C971506C05DB18C724136C38CD94CBDFAB97DD20A86823C290F7816122EF68FCDC1E64E2F7F81DC0EC3AA36E598BB56D21A43B1089599644E1D37711144B1C3FC27C72391574C47006DE0A1EF444D43E39CB8E2FF640BFB2E9EF1E94A81C07BA8DFB3B010382040A07FF82AB7985E8D4A51000836ACFC094A58474C4F9A3A37DEAE8E6BCFA337E0E9ED699E080C9807539000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000002600000000000000000000000000000000000000000000000000000000000000300000001010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001C00000000000000000000000EA4A514465A794F42278C11CABEC5DD70000015C0103060102050008090407000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000A000000000000000000000000000000000000000000000000000000000007D2200000000000000000000000000000000000000000000000000000000000094B9A0000000000000000000000000000000000000000000000000000000000094B9A0000000000000000000000000000000000000000000000000000000000094BF400000000000000000000000000000000000000000000000000000000000D9CD800000000000000000000000000000000000000000000000000000000000D9CD800000000000000000000000000000000000000000000000000000000000D9CD800000000000000000000000000000000000000000000000000000000000D9CD80000000000000000000000000000000000000000000000000000000000157DB500000000000000000000000000000000000000000000000000000000002410B70000000000000000000000000000000000000000000000000000000000000004B531FF4DAD0DE6BF4F5AF07AE922555C5928D35F27F1664F06660F9377FC14D08B30E51A65E94D1F6EED781232A554DF0EFBAA8679B3F74067DC60790305921A2199324591918634111E7D1A2C012460F204462A379BE0318C0B3B7A0FA5158BCF4CDC843F0772CDEB2DED2C08F15EB99C74552E2E952E06553041E2CF59888D00000000000000000000000000000000000000000000000000000000000000043C62CD844232AB1149CF2017DC18C81B7DA48EFFD67F8FFED1580F2FAD6B51C0474BE0C0DD1F80EB0AFD17FE452250A404BDB883BE91B1812E80D9F9528F7BB607937739729868105D900B19742E050F1AB7B5A36783B7601A9534FD967BBB2A013E304D54EF73A4171C7910FCDA04156416421C57B82DC46026134E44ED83123D051AA025581D549A091D87138C7C1802E95DCD4B4D38CAEB2F79A93D9814DD39C69AC78A85A272899213006C4BB9CCA7ED34996CF85DBDCC3E68F66D02918F010382010707FF7184D7FC3099830A858794BED32937D8A5D1421241F52809908F1A17D75BDB8039C6E45D4554482D55534400000000000000000000000000000000000000000000000000000000000000000000000000FF970A61A04B1CA14834A43F5DE4533EBDDB5CC80000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000001176592E00000000000000000000000000000000000000000000000000000000574FBDE60004C8B2F30D120358B9D86C06F6E77A96FEAD1700A4C7CC4CA90EB50F023C3B251665D1B403EE86B9161A03979920CF87E3C5BE4E57DD910B56E8310AAEC9D8CB4000381A707FF7E84D7FC3099830E4FE194FF970A61A04B1CA14834A43F5DE4533EBDDB5CC880A9059CBB00000000000000000000000093A1443233DB0D9D96E4796E540FCFADAA093AAB000000000000000000000000000000000000000000000000000000172B6740630C184306D340CCD7D50B0DFD9B429DD32051C5E87B28CF4E0725EBDB3317E85E241679BE3395F3E9999760F328BCA61384DE7584378A6B35E5929FC642E54B5B000382028A07FF820EE984EE6B2800840393870094BF7FAED477FA1DE18D66B2138DC8D2A9A85E9E4B809699CCB3000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000364A3745F95400000000000000000000000000000000000000000000000000000000000000001A0000000000000000000000000000000000000000000000000000000000000000400000000000000000000000082AF49447D8A07E3BD95BD0D56F35241523FBAB1000000000000000000000000FF970A61A04B1CA14834A43F5DE4533EBDDB5CC8000000000000000000000000FD086BC7CD5C481DCC9C85EBE478A1C0B69FCBB900000000000000000000000082AF49447D8A07E3BD95BD0D56F35241523FBAB10000000000000000000000000000000000000000000000000000000000000003000000000000000000000000C31E54C7A869B9FCBECC14363CF510D1C41FA4430000000000000000000000007F90122BF0700F9E7E1F688FE926940E8839F353000000000000000000000000960EA3E3C7FB317332D990873D354E18D764559000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000058C1B1186C7C68CBF2888A4F6CD8B76CCDCF26516D693C928EF710C8715032ADB1EECB91DB7E4EC57E8D22957FCEFE2A68CDBD8026A8384A665C6F79A8474199901038201AA07FF82097D85012FFBD300834C4B40942ED6BC5830AD51A0A8FFEDA475DC64E3C35531448036946015000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000E30000000000000F6F2E7E4EB40800010102030060C31E54C7A869B9FCBECC14363CF510D1C41FA44382AF49447D8A07E3BD95BD0D56F35241523FBAB1FF970A61A04B1CA14834A43F5DE4533EBDDB5CC80000000000000000000000000000000000000000000002EB89F70A6901400000000001F404006C0002000164541216BAFFFEEC8EA535BB71FBC927831D0595000100000000000000000002000000000000003E70872304BCCA00000000000000000000000002123397E166FF970A61A04B1CA14834A43F5DE4533EBDDB5CC882AF49447D8A07E3BD95BD0D56F35241523FBAB1000000000000000000000000000000000000000000000000000000000083BD6213C69F511AA87CDE6A8DBD7C6577B834ADFEB7B1C274C92E76FB49C5897942424A1F5DB49F56D13C147868FE2899C5160D09F9172258628E1FBA88F624000381EA07FF8290B985174876E800834C4B40941A0AD27350CCCD6F7F168E052100B4960EFDB774801389A3CC00000000000000000000000000000000000011BF0000194E001E6B5C01BF3DD700000000000000000000000000000000000000000000000000000000627D200A00000000000000000000000000000000000000000000000000000000000059AC000000000000000000000000000000000000000000000000000000000000388BA013FDAF06F20096DEFFCC7A13D0C97BC72EFF98CF4F80E9A128296508499BE97D6089B02D6305A5C8F9332E521ABF6D412B1AE59828734F1EBBC2F578827D97000382024907FF82C34C84D7FC3099830C6B7C94E195A15533C01C8CD6B28F09066842486F80F8F280CC064C8C00000000000000000000000000000000000000000000000000000000000000A000000000000000000000000000000000000000000000000000000000000000E00000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000001A00000000000000000000000000000000000000000000000000000000000000001000000000000000000000000EE7170D3A4E299CB391621A9C19D05817B8F678D00000000000000000000000000000000000000000000000000000000000000014554482D55534400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000002E3D1961BC4BA75532D14FB4C6F06863A773D08604DDEEB18E76CCCE46BC1081371AC717A1743C045A1CC7DEB6A9C474C147BBB8A55E54BA78DE7942EFFB2816CF5904F911000381AB07FF8301C6CB85174876E800831E8480941A0AD27350CCCD6F7F168E052100B4960EFDB7748017835D1C00000000000000000000000000000000000011BF0000194E001E6A8101BE632D00000000000000000000000000000000000000000000000000000000627D200BD7DE484377BA7CAC680FDD8302BAD70B96BF85073029228366ADA0EB6BD6D6044BF8911773F840DDB8751F23AC55DD013E454B8C9E8BE10D33726BF2975A6F8C000382010A07FF823FF68502755DEBD0830E764094960EA3E3C7FB317332D990873D354E18D764559080394747C50000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000002B95FD500000000000000000000000000000000000000000000000000000000000260C75F000000000000000000000000000000000000000000000000000000000000000148CEF21C1CC10A006D3D5AA6E78CAF2855869273C9E95FCC89D0895488AE6E810CF61275359A586D4C41C6B35C89B99FF6048CAC16C06E8121AB98048021DF6C000382040A07FF82AEF385E8D4A51000836ACFC09479DAA21A44D1415306EC17C361E0090BDD4CFCBE80C9807539000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000002600000000000000000000000000000000000000000000000000000000000000300000001010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001C000000000000000000000002A3444C582D73BB7FE00E67ACAAAEF820000A1750308010005040603090702000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000A0000000000000000000000000000000000000000000000000000000007E0D9490000000000000000000000000000000000000000000000000000000007E979EF0000000000000000000000000000000000000000000000000000000007ED6B400000000000000000000000000000000000000000000000000000000007ED6B400000000000000000000000000000000000000000000000000000000007EFE0660000000000000000000000000000000000000000000000000000000007EFE0660000000000000000000000000000000000000000000000000000000007F03A2F0000000000000000000000000000000000000000000000000000000007F03A2F0000000000000000000000000000000000000000000000000000000007F3C77C0000000000000000000000000000000000000000000000000000000007F606B000000000000000000000000000000000000000000000000000000000000000047F8F5BB17B46F8F075705B5AA1FCCC5C996CDA1441CB558082C26F7888344AAB5F68ED81A7EAA8C5B166474326F51C9EC7940812409BC04A8E6BD2544FE69BA5F7439C917A4BCAD3CB43FCFEB535F4E01F7A69947B40BA96DA6B1ABF4B730B824A8FA3173AC063E5BEB6AD43751A7DD7E2E64E7DD43A809A479B255E0F01EDFB00000000000000000000000000000000000000000000000000000000000000043BF3C847ADE1F92A014ECBBD69E9A79A4C7EA025C5B0517AA39F13F34013BBBD1ED816946108025CE7A4A1FF94E8E8E33F55141B791A8C01F027116349CBCC4348FEEA21473BB359194CE98A088C14BB3A3AF2039FE19A1A4EEDB0C3EA06F559543739D3903AC1E4B1C94BFC49D0B345B5D6005D4AA1A2A44AC09EEAA699A17F22BE87C2E40B39FABF922D022B1E02251376A15E7570C5402C3824DD8A523B623BEF7069ADDEE21FA6C45FD49778A0D79B2CF44FEE0E4F465A90675E4DCC92E9010381A607FF82569385174876E800832DC6C0943648F6E38E8641BF847B3A776DAF6A21AE9A42DD8000000000000000000000000000000000000000000000000004F9492A3EF99F000100010000038D01000A0000010002C553001E01000A0000010002A6ED011E012C19E4EB39DF8B06C528D03ADADA3F5596A2C5B8AA11BAEDABAF4D0C51073B587B36C7E6A8518141E3DF83E3F130F06300A26548BC6D35A8ED9A16973AA4F59C1B0382016907FF824BC284D7FC3099831EA13794E592427A0AECE92DE3EDEE1F18E0157C0586156480DB3E2198000000000000000000000000FF970A61A04B1CA14834A43F5DE4533EBDDB5CC800000000000000000000000082AF49447D8A07E3BD95BD0D56F35241523FBAB100000000000000000000000000000000000000000000000000000000000001F4000000000000000000000000D0DB388F32328915654E88DB4241EB45FA6ED55900000000000000000000000000000000000000000000000000000000627D2085000000000000000000000000000000000000000000000000759112758441EC0000000000000000000000000000000000000000000000000000000003EA1344F5000000000000000000000000000000000000000000000000000000000000000044A389C2574A8AC68D564A926B01B3D3C875DA20EDE5BC936CFBCBC9D8C558AC4D4BDA97E9C5C3987CC28DD4CF612742E880C7F6E9E63B86BBE4BD5DDEEE3D30000382020A07FF824DD685174876E800831AB3F09468B3465833FB72A70ECDF485E0E4C7BD8665FC45805AE401DC00000000000000000000000000000000000000000000000000000000627D471E00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000E45023B4DF000000000000000000000000FF970A61A04B1CA14834A43F5DE4533EBDDB5CC800000000000000000000000082AF49447D8A07E3BD95BD0D56F35241523FBAB100000000000000000000000000000000000000000000000000000000000001F4000000000000000000000000565D82C9C9584D21AD8EE5A73B56CE71DACED7E20000000000000000000000000000000000000000000000001BC18080C052500000000000000000000000000000000000000000000000000000000000EDBA4CA4000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000CDB3DF31CFFB978FFDBEDC529417F1C52A364359B59E936D70FCEE47B82BDFE17D9557C3C0C89305A673A45F5CD0A3D022C0DAFEABDA562F677A07B894EF3D63010382014907FF82021484D7FC30998310D1E894ABBC5F99639C9B6BCB58544DDF04EFA6802F4064802D4BA6A7000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000575ECD980000000000000000000000000000000000000000000000000A2575CD805E90000000000000000000000000006A0C919A0AEEACECC0AC5A6FB79EAC060CF7C6590000000000000000000000000000000000000000000000000000000000000002000000000000000000000000FF970A61A04B1CA14834A43F5DE4533EBDDB5CC800000000000000000000000082AF49447D8A07E3BD95BD0D56F35241523FBAB1AB004336D0954571AD130DB939E4EA4AD2A0BE05C6C27D90661A5195CD7C75513BC0AB875C19256AE8319004811400CC4F5E7768DDA7D538A190DF79CCC5E246000382038A07FF8202AD85178411B200837A12009461D730B3AE2788F0C5421383C2F68CECF7D83306802AE5BD54000000000000000000000000000000000000000000000000000000000000002000000000000000000000000082AF49447D8A07E3BD95BD0D56F35241523FBAB1000000000000000000000000FEA7A6A0B346362BF88A9E4A88416B77A57D6C2A00000000000000000000000000000000000000000000000025BF6196BD100000000000000000000000000000C35DADB65012EC5796536BD9864ED8773ABC74C400000000000000000000000000000000000000000000000000000000000000A000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000014000000000000000000000000082AF49447D8A07E3BD95BD0D56F35241523FBAB1000000000000000000000000FF970A61A04B1CA14834A43F5DE4533EBDDB5CC800000000000000000000000000000000000000000000000000000000000001F400000000000000000000000000000000000000000000000000000000000000C0000000000000000000000000E592427A0AECE92DE3EDEE1F18E0157C0586156400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005756E697633000000000000000000000000000000000000000000000000000000000000000000000000000000FF970A61A04B1CA14834A43F5DE4533EBDDB5CC8000000000000000000000000FEA7A6A0B346362BF88A9E4A88416B77A57D6C2A000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000C000000000000000000000000030DF229CEFA463E991E29D42DB0BAE2E122B2AC700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005637572766500000000000000000000000000000000000000000000000000000062F238672446095965E2EB916B00AF435400D4CD150F5CCEBC282D7F0FCBE8571AA89DD2C72F244D4D84A78DD964E17975326B55A5D6968489A72253D0382D2900038202E907FF82012184D7FC30998314DD3C94C36442B4A4522E871399CD717ABDD847AB11FE8880AC9650D8000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000001A00000000000000000000000000000000000000000000000000000000000000084FC6F78650000000000000000000000000000000000000000000000000000000000001C05000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004449404B7C00000000000000000000000000000000000000000000000000D52FE0E57ADAD90000000000000000000000000C10E3A179C8E9552FBBA82950EED6F6161D7004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000064DF2AB5BB000000000000000000000000F97F4DF75117A78C1A5A0DBB814AF92458539FB40000000000000000000000000000000000000000000000008E55F86DBAE5962E0000000000000000000000000C10E3A179C8E9552FBBA82950EED6F6161D7004000000000000000000000000000000000000000000000000000000000B4C6771EBB8F66A3D1993504D6DE3C3C6319750D70ECDF5F8D0BBB0D396122C34D6E6510FF0C27531470341F85C76C65BED58EF3826973506131EADCB01BB0C000382016907FF82079284EFBE54A9830E244994F8D88D63ED3A2104E664AE8715FC9F80ABBA864D8046BD71F90000000000000000000000001B02DA8CB0D097EB8D57A175B88C7D8B479975060000000000000000000000000000000000000000000000000AE86ED5E9750000000000000000000000000000000000000000000000000000000000005DAEFA8000000000000000000000000000000000000000000000000000000000000000A000000000000000000000000000000000000000000000000000000000627D201E0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000FD086BC7CD5C481DCC9C85EBE478A1C0B69FCBB900000000000000000000000082AF49447D8A07E3BD95BD0D56F35241523FBAB166E77AB5D6DAF1900651CC27B0989F193A24D74FD6C5A1318F88E7AB341A9AC316DD1AF5C547D568643528C08D88FB42088BE43264D6007C1E8E35B8D8C0FFA9000382014807FF1385010545C28F830DF1B29488CBF433471A0CD8240D2A12354362988B4593E58099882C8F000000000000000000000000E4B2DFC82977DD2DCE7E8D37895A6A8F50CBB4FB00000000000000000000000000000000000000000000000000000000060DBB390000000000000000000000000000000000000000000000000000000005F5E1000000000000000000000000000000000000000000000000000000000005F69C060000000000000000000000000000000000000000000000000000000005DE9B49000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000627D22545429671BB94160A97BB2436EB9161F765180A3585B17110005737800D4DE8C713F691E50193F4DDCB90C728E327598F7D2251D0931532B2CCC1B127FDBA1FA04000382010A07FF8236F585174876E800832DC6C09469844CB44932B489F07D0F6FC42294D357A7B74E80742E9E0F000000000000000000000000FF970A61A04B1CA14834A43F5DE4533EBDDB5CC800000000000000000000000082AF49447D8A07E3BD95BD0D56F35241523FBAB100000000000000000000000000000000000000000000000000000000000001F400000000000000000000000000000000000000000000000053444835EC58000000000000000000000000000000000000000000000000000000000000627D213C69BEEA161B6C97124FD1BA5C3C1EC3A00ACBDD42F2E915C5F6723FD570D0F97A77A6E91A8A83821DE2635882CDF6C17873A0DA649CA373583C5044972E67C003000382013007FF1A84D7FC3099830B80D594D8C6DD978A3768F7DDFE3A9AAD2C3FD75FA9B6FD880DFFB7A67CB1280900C2D9DCA90000000000000000000000007A76DC4DCCF00C129FC77D4FBCF55DA1050E79B500000000000000000000000082AF49447D8A07E3BD95BD0D56F35241523FBAB10000000000000000000000000000000000000000000000000DFFB7A67CB12809000000000000000000000000000000000000000000000000009627D863971F140000000000000000000000000000000000000000000000000012BC2E62E292AA00000000000000000000000000000000000000000000000000000000627D1FBDB404DD5B3D3348EC5EDBBF8D67F04152CED3135591E144291B7C5B3554601D0810ED9010CF36B8BF38DAE5F23D11302D67EB425113973BA264277CF3056B95F7000382016A07FF821CB38501AFF86132832625A0941B02DA8CB0D097EB8D57A175B88C7D8B47997506804A25D94A0000000000000000000000000000000000000000000000008B7C533F5D73800000000000000000000000000000000000000000000000000000000004AAAA57E900000000000000000000000000000000000000000000000000000000000000A00000000000000000000000000BD8F40920AEA2920C6BCD2781B3A2F475CA32BE00000000000000000000000000000000000000000000000000000000627D208A0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000FF970A61A04B1CA14834A43F5DE4533EBDDB5CC800000000000000000000000082AF49447D8A07E3BD95BD0D56F35241523FBAB180645A0F58879B8FD0DB819CBC3F121CB25F86BCF7C4ACB989250AA08E36AB741C2C7443BAD9C9EF654B330842F5762B9120A670C04C0E31E879E3A44AD49DA201038201CA07FF820112850165A0BC008319AC6C94C0E02AA55D10E38855E13B64A8E1387A04681A00800DDEDD8400000000000000000000000000000000000000000000000000000000000000A000000000000000000000000000000000000000000000000000000000000000E0000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000CD6360000000000000000000000000000000000000000000000000058D15E176280000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000AA8BDB60EE28E7616BFE4867F58BFE4EDF8582710000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000002753D98076E6000000000000000000000000000000000000000000000000000000000000000001F776CA4F3F30E29D96B415EDD8191DB9C73CA533DBE4681413CAD2EBD21062EF651B1B5FC8C3C1F7647B96F5C075BA4C224DF359AF6F693491D64DE958D0ED565B20EDD589BF55E78844D48C2F8397909D0E3501F9F08C2EB73F5686CB8918D0000381A607FF82569485174876E800832DC6C0943648F6E38E8641BF847B3A776DAF6A21AE9A42DD800000000000000000000000000000000000000000000000000460317B85E4D5000100010000038D01000A0000010002C553001E01000A0000010002A6ED011E0160F00A2ADCC840F23D238CAA1B0CBCDED32CD4BAEE229175A40AA04508430D300C13A69D0143A2F956A1E88EF976C02F41D7A7697A6E279623E68C8113ABB6081B0382013207FF82019984D7FC309983104931941B02DA8CB0D097EB8D57A175B88C7D8B4799750688082E65BFF311AE6D00F305D71900000000000000000000000007E49D5DE43DDA6162FA28D24D5935C1518752830000000000000000000000000000000000000000000000958A288C0A53D3E5E3000000000000000000000000000000000000000000000094CABF626150D93D0F0000000000000000000000000000000000000000000000000823ECEBCA2C791200000000000000000000000094B9AED7B24A44E622FAEA76E57AD4D71684BFDA00000000000000000000000000000000000000000000000000000000627D26C5ECF4C287967D7BB4768537FEC4DA8A5C8D144A03AFACDAFF0BB850DC7DA6C06A4D98DA53AEC4C450304211C1E4F311413283C554845157D7CF415860B806128E0103819807FF82569585174876E800832DC6C0943648F6E38E8641BF847B3A776DAF6A21AE9A42DD8000000000000000000000000000000000000000000000000002D6B569DC402D800100010000038D010008020001000203B3007C3AACD5D4DC636097B1B3E361CFECB003310AA51537C85A65D8EA7417E4373E67278547E425925FF2755FE3F44A875B8CCD29A83FE9491474061470ABA018291B0382016A07FF820DE98501AFF86132832625A094E592427A0AECE92DE3EDEE1F18E0157C0586156480DB3E2198000000000000000000000000FF970A61A04B1CA14834A43F5DE4533EBDDB5CC800000000000000000000000082AF49447D8A07E3BD95BD0D56F35241523FBAB100000000000000000000000000000000000000000000000000000000000001F4000000000000000000000000E6C13A914132E8B7AA229AB0FC34FCF0BDFFFD1E00000000000000000000000000000000000000000000000000000000627D208C0000000000000000000000000000000000000000000000008B78C5C0B8AD000000000000000000000000000000000000000000000000000000000004A9A57E850000000000000000000000000000000000000000000000000000000000000000D135269CC6F3702BEF7BC0B8262F57A219C867C2236E8360AB22AC0D8A5048C1193E5DEF3DCF160B96687D7E53BA308B7B1954EF402AF114F5C4D699E9FB19BD000382040A07FF82B6AD85E8D4A51000836ACFC094CF17B68A40F10D3DCEEDD9A092F1DF331CE3D9DA80C9807539000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000002600000000000000000000000000000000000000000000000000000000000000300000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001C00000000000000000000000B647F600403DA7D44F028FB3346710460000015E0402030508070409000601000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000A00000000000000000000000000000000000000000000000000000000B13C2BCE00000000000000000000000000000000000000000000000000000000B1473A2D00000000000000000000000000000000000000000000000000000000B1473A2D00000000000000000000000000000000000000000000000000000000B1473A2D00000000000000000000000000000000000000000000000000000000B14A032400000000000000000000000000000000000000000000000000000000B18FEEC000000000000000000000000000000000000000000000000000000000B1994F7600000000000000000000000000000000000000000000000000000000B1EB7C4000000000000000000000000000000000000000000000000000000000B2CA53F900000000000000000000000000000000000000000000000000000000B348E8F10000000000000000000000000000000000000000000000000000000000000004ADEC572EADA0F0F9EDEB585DCBF666ADAA6C1DF42B4B0A1E81165313DCAE9A6A45B4523247A96DAFB3E63040755CE54535A34C310B043C03F5BC9128DF54299A046C08857A62D577EC6AE732B7B152019D4EADAA55D30E96EE2CBA3930380FA97304D2C2FFE14FC3AF58BB47047EBEC3C21775502A07FB3D5622F545987FDD9A000000000000000000000000000000000000000000000000000000000000000447269F217D09A876F199AE7549218D53E4B84431F477CD501AD40E467CAD12E90133A4F9BB410CF471B7C3B43511A6B2A738FA94CF0D3F3B37E2BBB59B6C727E752F28427E7731356D69C2C1009E807310408BFF3EBD732CB2D1C94C088AC839067EBC100EB0B4CE673DD84EF13F4EE4CC14459CB12AA54892D7A1183A314834E771012B1EB8FC4802FA8CC6FF891C5F08FB22D24B6B3F039D000B925E1A3B0214C95E0077B5E21F9A3A588CBB0AB3EFFD3A1C1AE1013E9C823F16C09989ECA5000382018A07FF821F6285012A05F200832DC6C094569A11E9C23F6716073AEAE549EC69DE6356F9B380627DD56A000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000CB86000000006E14D3A07FE18400000A00000238B54A66D75787643005668DBE4B934595F73DB543C76F90396000BA6A1F7E55D4DAB5356C4EEA6FD576543210FFEEDDCCBBAA987C7766556A0DA9328B89C338715FA5C16DF39E3DB72A82067A8EF94DC80229468B108C104ABE252A4804CAAC6DFB6A21093BC7B32C65160244850C557D472C76CDF183020F3EED88F394B04CA8EBE7432007C2FF273E33965F7D2A1E11C08963C5BDB6BC04B357F90A0DD09AFBCD425859F4FB7B548264DA2F063F248521950705611DABB100000000000000000000000000000000000000000045ED45A0F198CCAB60542CC5E3369210D80433F1C92963EA4498FE0F916B897D0526EA302B2B6BED9E30E9592B26BA326394577F1FB8BFE2677CF81536EC8503010381EA07FF8290BA85174876E800834C4B40941A0AD27350CCCD6F7F168E052100B4960EFDB774801389A3CC00000000000000000000000000000000000011C900001967001E6B1201BF190800000000000000000000000000000000000000000000000000000000627D201500000000000000000000000000000000000000000000000000000000000059AA000000000000000000000000000000000000000000000000000000000000388A2C7D0A5BFEFE522741118C81A6767045826C626A378B75A9DED4C2513F1797A5018794D884EB01BF3E665E1039BAF5FB30D1323CBF3DE156D1659E72817781C9000382016A07FF82182F85174876E800831AB3F0941B02DA8CB0D097EB8D57A175B88C7D8B47997506808803DBEE0000000000000000000000000000000000000000000000001BC2F64E255300000000000000000000000000000000000000000000000000DC947F1D994C0C000000000000000000000000000000000000000000000000000000000000000000A000000000000000000000000097581C75940624FDCD1CE618C4D0F6073CEB9D2200000000000000000000000000000000000000000000000000000000627EA6B60000000000000000000000000000000000000000000000000000000000000002000000000000000000000000FEA7A6A0B346362BF88A9E4A88416B77A57D6C2A00000000000000000000000082AF49447D8A07E3BD95BD0D56F35241523FBAB131A9B846E97D26E8C61864EB89D58CADC129A271840216C96B89A61A578250CC06D589EE22F9D8F7FD56DF5EF0D68B31A890117F88130622156A9B1FFFDCB7A4000382028A07FF8227DC850BA43B740C830F487794BA1BFD85432905FF4A2E7F516B56B7485DBDC5F680E0E90ACF000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000A0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000218761A6D957D975BE472E0680EA45ADEF03CFB000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000104627DD56A000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000A4394747C5000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000253AE4340000000000000000000000000000000000000000000000000455BF763A9113F00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002E4E8B3236AD8092D6613E3359E54D7C0BA5D33654A3FCC9FC66D115B2AD388D44F5F886E937662BE5010259E04F1D48E5DDD8A9C0298C89B31538C42660C0CB01036D07FF82017A84D7FC30998307A33694D2ECA69F59FA551C902BB34CE4E889B3BB635C4A874BBFFC96210C9900DD16E81D92FABF1144028B10678913B354B119D350E38C637F3D4658BD531BDF794FC09F3AB00DB4D30F9019F1D8DC854E572F06E3A26B3123E7A74B9B37EE25000381EA07FF8290BB85174876E800834C4B40941A0AD27350CCCD6F7F168E052100B4960EFDB774801389A3CC00000000000000000000000000000000000011C900001967001E6BE401BF832D00000000000000000000000000000000000000000000000000000000627D201700000000000000000000000000000000000000000000000000000000000059AC000000000000000000000000000000000000000000000000000000000000388BAB680CEF73932954F2D2A9AD28B098942C04C9D47E2A27F3419D16A98ADE89D5081A2C5F9296BBCACC40631D09E02E9B43AA10904EB322A9A795908FD662D2C7000381AB07FF8301C6CC85174876E800831E8480941A0AD27350CCCD6F7F168E052100B4960EFDB7748017835D1C00000000000000000000000000000000000011C900001967001E6D7401BF8C0000000000000000000000000000000000000000000000000000000000627D20172F9256CC23AFBB392C4F40663DCB82961CB906D7425B32DA9A88B770F1ECF73B4475AD703BBF5B901A4C016FBDB20E88387DC085F4381CFB1C64BB08C71EC2F8010382020A07FF824DD785174876E800831AB3F09468B3465833FB72A70ECDF485E0E4C7BD8665FC45805AE401DC00000000000000000000000000000000000000000000000000000000627D472800000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000E45023B4DF000000000000000000000000FF970A61A04B1CA14834A43F5DE4533EBDDB5CC800000000000000000000000082AF49447D8A07E3BD95BD0D56F35241523FBAB100000000000000000000000000000000000000000000000000000000000001F4000000000000000000000000565D82C9C9584D21AD8EE5A73B56CE71DACED7E20000000000000000000000000000000000000000000000001BC1816994F7600000000000000000000000000000000000000000000000000000000000EE0F8ADF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000159F1214E7BCFEDBBA7CC25274BF2CD9793ED4020881230AB62EE306CA101C887D6B6653D1E97DA3DA988A01C997512F6EE5D401613B51D8880283BED6F1CD82010382016A07FF820DEA8501AFF86132832625A094E592427A0AECE92DE3EDEE1F18E0157C0586156480DB3E2198000000000000000000000000FF970A61A04B1CA14834A43F5DE4533EBDDB5CC800000000000000000000000082AF49447D8A07E3BD95BD0D56F35241523FBAB100000000000000000000000000000000000000000000000000000000000001F4000000000000000000000000E6C13A914132E8B7AA229AB0FC34FCF0BDFFFD1E00000000000000000000000000000000000000000000000000000000627D2090000000000000000000000000000000000000000000000000ADE3809CFBA5000000000000000000000000000000000000000000000000000000000005D03373A60000000000000000000000000000000000000000000000000000000000000000C8F27EEDE80F5D83A0BE73F874115C0361AE5ACE37B4B5ED4F31A06C0B6B708F77FCB5A3BF7CFB317433A4772388FE71BAC41F87779AB8F685B142E7FCF2986C000382022A07FF820EEA84EE6B2800840393870094BF7FAED477FA1DE18D66B2138DC8D2A9A85E9E4B809699CCB3000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000351FC9B7E8320000000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000000300000000000000000000000082AF49447D8A07E3BD95BD0D56F35241523FBAB1000000000000000000000000FF970A61A04B1CA14834A43F5DE4533EBDDB5CC800000000000000000000000082AF49447D8A07E3BD95BD0D56F35241523FBAB10000000000000000000000000000000000000000000000000000000000000002000000000000000000000000C31E54C7A869B9FCBECC14363CF510D1C41FA44300000000000000000000000064541216BAFFFEEC8EA535BB71FBC927831D0595000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000003D25CEAC693B10DBAC30F2A800D2552BBFBCCA8111477B87BB6AA6294FAAF44A14ABB5CA687386DADE3CCECA3CF57CB3359BA9E0ED7386C4F0ECA4DA0BC6FC26E000382016907FF824BC384D7FC3099831EA46D94E592427A0AECE92DE3EDEE1F18E0157C0586156480DB3E2198000000000000000000000000FF970A61A04B1CA14834A43F5DE4533EBDDB5CC800000000000000000000000082AF49447D8A07E3BD95BD0D56F35241523FBAB100000000000000000000000000000000000000000000000000000000000001F4000000000000000000000000D0DB388F32328915654E88DB4241EB45FA6ED55900000000000000000000000000000000000000000000000000000000627D20910000000000000000000000000000000000000000000000006A42B872DF930000000000000000000000000000000000000000000000000000000000038C236F640000000000000000000000000000000000000000000000000000000000000000C44E3F772F61AA514D76BD19A4AA9BB7B14AA79458B27748366DF57461C6D5447F1943C1A640208DBA526FA27EC3EBF3D22595CE707AA066C687CF652B6651CE000382022907FF820BFC84D7FC3099830DF2ED94BA12222222228D8BA445958A75A0704D566BF2C88052BBBE2900000000000000000000000000000000000000000000000000000000000000E000000000000000000000000000DEE1F836998BCC736022F314DF906588D44808000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000DEE1F836998BCC736022F314DF906588D4480800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002913BEE77D33A00000000000000000000000000000000000000000000000000000000000627D209164541216BAFFFEEC8EA535BB71FBC927831D05950001000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FF970A61A04B1CA14834A43F5DE4533EBDDB5CC800000000000000000000000082AF49447D8A07E3BD95BD0D56F35241523FBAB1000000000000000000000000000000000000000000000000000000015EC36B7300000000000000000000000000000000000000000000000000000000000000C00000000000000000000000000000000000000000000000000000000000000000C0055D3D61E201566959F1BCCB50456A9CA2D649FB79C97CA9C2C7424646DFDB10EED07225320CE6570F696863DB238D1DDE5DE7D8B89C207F7A32C3325915C1010382040A07FF82B2D185E8D4A51000836ACFC094B61D6E5ECB4188248702F65D59728F607F9E3D2F80C9807539000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000002600000000000000000000000000000000000000000000000000000000000000300010001010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001C00000000000000000000000815FEBAFFB04D8BE4BED76238FDAFC9B000173C70500010807030406050209000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000A0000000000000000000000000000000000000000000000000000000000CD7F1B0000000000000000000000000000000000000000000000000000000000CD7F1B0000000000000000000000000000000000000000000000000000000000CDBF130000000000000000000000000000000000000000000000000000000000CE08E70000000000000000000000000000000000000000000000000000000000CEB33C0000000000000000000000000000000000000000000000000000000000CEB33C0000000000000000000000000000000000000000000000000000000000CEB33C0000000000000000000000000000000000000000000000000000000000CED4090000000000000000000000000000000000000000000000000000000000CED4090000000000000000000000000000000000000000000000000000000000CED40900000000000000000000000000000000000000000000000000000000000000046113C3DF01E93809E1C81BC4E45CE51010DE2306F1E08E0453CB0533F39A2F16C315156488CD6FB63F7ADE725160624D0BDA6E62289A37CC75718952F200050ABE485EEBCE7EC9656E24213827E80EBD8D9A98B819C9D87EFD22A1E212C75A680CE0DD320D3567E39B0693F0B055065A770904C4148E59199B6F06A0CEA01D070000000000000000000000000000000000000000000000000000000000000004670678256F0B5B5FE72C046622179E55353ACA9DB2F755ACFD9CB79CDA50F081773CA3E834B87F35625BED3662253DDF6D496F410E10899995E82452AB883DF73F5E673362EC867BBC053A4F751BE3A1E62D890A1B0DCE4C3D45BA6F29894651193A0EC2A0A8590C763A090D1E9B13B530F93A900EC59D9D02EA6CD5C1ED7AE596EC3D1557C727ED94D2718B120EF1B41EC5BB9EB3FF695CEE62DF703D4D46493AA29E2EE64E1F5934C685D19166FCF9B4975510719E23F264E3B7580D672E3801036A07FF82C9578501032EA0B88311C0849400000000000B69EC332F49B7C4D2B101F93C3BED806A08C60449E147493EB76415EE76316F07F3FF9010E414779C48C5B46CE1A96473AAA8544718227A4936D5FA5D51610AC20F541472C32CA16E41F71C43FBF13571BEFF4E000382020A07FF824DD885174876E800831AB3F09468B3465833FB72A70ECDF485E0E4C7BD8665FC45805AE401DC00000000000000000000000000000000000000000000000000000000627D472A00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000E45023B4DF000000000000000000000000FF970A61A04B1CA14834A43F5DE4533EBDDB5CC800000000000000000000000082AF49447D8A07E3BD95BD0D56F35241523FBAB100000000000000000000000000000000000000000000000000000000000001F4000000000000000000000000565D82C9C9584D21AD8EE5A73B56CE71DACED7E20000000000000000000000000000000000000000000000001BC18252699C700000000000000000000000000000000000000000000000000000000000EE4E228200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000043BA133412468100D4C56067287790C8F4E6F4E9680E3F0CFE437C7FC5B58AAD3749F341ADDD7A946666637472DFF30BE452B73E1F296FA2CD1F68C1358B277F000382040A07FF82B20E85E8D4A51000836ACFC094942D00008D658DBB40745BBEC89A93C253F9B88280C9807539000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000002600000000000000000000000000000000000000000000000000000000000000300010101010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001C00000000000000000000000C53BF610EB015FA9F4FAB204B58622E60000015E0205000608030907010402000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000A000000000000000000000000000000000000000000000000000002A26EB638CF000000000000000000000000000000000000000000000000000002A319F20396000000000000000000000000000000000000000000000000000002A381950476000000000000000000000000000000000000000000000000000002A391874380000000000000000000000000000000000000000000000000000002A391874380000000000000000000000000000000000000000000000000000002A4F5EF6900000000000000000000000000000000000000000000000000000002A565A29CED000000000000000000000000000000000000000000000000000002A56E1667E6000000000000000000000000000000000000000000000000000002A5B7BB0837000000000000000000000000000000000000000000000000000002A65CE974B600000000000000000000000000000000000000000000000000000000000000040FF981C9947EE5EA39123153E06A8D78DC68B294A7FBB962F64F4C41CEEA91121BD5412D7F3F4A934059B9A430E1989D7063364A707F5893BCF867477C4EE27558DDB041B15CA6CADB6B557A131D2BBA32FED22E01C0DD1CD2131133FE15D00B489BB4D356636C61351D6DDD5DBC3E550FF57CF26FED1695EC2A966D8AD1BD6C000000000000000000000000000000000000000000000000000000000000000466F5386FFA375E37D2FA62F784269D6398173CC9E4FDB27D94A7854804508AD303EF404AD1B747CC7073571E9C41F54DA5F81ADA485E4384BB217271771A4EBF1F8D30F03A3C64C752C94790A2DFE434E8708A3508D9EA564D93076CA87E5EB54043C4AD531AC3035A2B542A4141AB4444E64EF00A3AA437D2890BE25112AD9B09039665E7909DEAF3A10896F7A53E8FB44B89027CFD3827C1397FA9A1931F3E0B25A462817F935665ACDBA7DBF369A2BF6B597A0C77577D376D3C41AA9B62D8010381A907FF82025E84D7FC309983082A8694B94D1959084081C5A11C460012AB522F5A0FD75680E2BBB1580000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000269D84CDBD05F9D35C8FBB485478FF0B50F1D1E8AA6A3D0183D3ED021B85BE86A61A33E6626CA3B97788E52C82A83983C55CB9305FBB8E812313837701B31F783852BBE17707923800038201AA07FF82097E85012FFBD300834C4B40942ED6BC5830AD51A0A8FFEDA475DC64E3C35531448036946015000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000E30000000000002A6BB42DE0E14C00010102030060C31E54C7A869B9FCBECC14363CF510D1C41FA44382AF49447D8A07E3BD95BD0D56F35241523FBAB1FF970A61A04B1CA14834A43F5DE4533EBDDB5CC80000000000000000000000000000000000000000000002ECDE44738AB8600000000001F404006C0002000164541216BAFFFEEC8EA535BB71FBC927831D0595000100000000000000000002000000000000003E64243302DA3C00000000000000000000000002129D3D6533FF970A61A04B1CA14834A43F5DE4533EBDDB5CC882AF49447D8A07E3BD95BD0D56F35241523FBAB10000000000000000000000000000000000000000000000000000000000668B351A7F9174CE06CDEDF7C03212567CB4E5300FB2B89D627AE1CE2CD93F9B2E82657144F608556F50A4857B3ABC8552032ADD6CA0A6663D9C594BB53A131401038201AA07FF82066A85012FFBD300834C4B40942ED6BC5830AD51A0A8FFEDA475DC64E3C35531448036946015000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000E300000000000029D6C36D99AD0E00010102030060C31E54C7A869B9FCBECC14363CF510D1C41FA44382AF49447D8A07E3BD95BD0D56F35241523FBAB1FF970A61A04B1CA14834A43F5DE4533EBDDB5CC80000000000000000000000000000000000000000000002ECDE44738AB8800000000001F404006C0002000164541216BAFFFEEC8EA535BB71FBC927831D0595000100000000000000000002000000000000003E64243302DA3E00000000000000000000000002129D3D6533FF970A61A04B1CA14834A43F5DE4533EBDDB5CC882AF49447D8A07E3BD95BD0D56F35241523FBAB10000000000000000000000000000000000000000000000000000000000302F3600AF50189942EADF4E6B6DA4AE61EEBABC841BB5EFDE68B71259A6F42B392746748DAB428A536010AFCEB2B3035BF757E9E2E93C523C8E9F23B89BF5E0010382018907FF820A6E84D7FC30998310BA84941B02DA8CB0D097EB8D57A175B88C7D8B479975068038ED17390000000000000000000000000000000000000000000000084D0804E9C8BCB12700000000000000000000000000000000000000000000000000000001854D668500000000000000000000000000000000000000000000000000000000000000A00000000000000000000000005FB8B9512684D451D4E585A1A0AABFB48A253C6700000000000000000000000000000000000000000000000000000000627D2706000000000000000000000000000000000000000000000000000000000000000300000000000000000000000032EB7902D4134BF98A28B963D26DE779AF92A21200000000000000000000000082AF49447D8A07E3BD95BD0D56F35241523FBAB1000000000000000000000000FF970A61A04B1CA14834A43F5DE4533EBDDB5CC8BBF5B054588108A38EE25E68C3F8CC4EDEC15F8E382D77E59A25AA9DBEB83274333FD199E258E16B8ED0A9005FDF6B554381F11D15D9163589EE5773643ACE41010382023107FF82025584D7FC3099830D26989453BF833A5D6C4DDA888F69C22C88C9F356A416148702AAB1A3B7A2BE008F2E1D18000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000005000000000000000000000000C887FADC6BAAA8CD234D9104A65B37265522B0240000000000000000000000000000000000000000000000000000001270DFFB1E00000000000000000000000000000000000000000000000000000000000000E000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000014C887FADC6BAAA8CD234D9104A65B37265522B0240000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000014C887FADC6BAAA8CD234D9104A65B37265522B0240000000000000000000000003E79BAD4D7E3876DAB01DAEF48D9EDA071E1642253FEAD9CAB4D6583EE9ED2EF1F39A6E4259BD32868449D8080CBF7330C9E2431BB7CECF48FECF2CFB6DDF1C201038201EA07FF820ACB84D7FC3099831A7B0E943D6BA331E3D9702C5E8A8D254E5D8A285F223ABA010FE70DD2FC00000000000000000000000000000000000000000000000000000000000001400000000000000000000000002F2A2543B76A4166549F7AAB2E75BEF0AEFC5B0F0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000363F08F9C47CC709791C3650000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005481484616FD5BCC97DD5BBB4F58DAADF34D099D000000000000000000000000000000000005AA70B5090BCD4B4BB5F2C5980000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000038D7EA4C6800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000FF970A61A04B1CA14834A43F5DE4533EBDDB5CC8EE7DEB33970D2FC40E4ED320EFCAADFBA4123BEE43F8C640A9736CAFC1737C863C5FD6AAEA93A6495884DF5F36A2853BD6C8CF6EF9B0018D560F0FCD0A558BC4010382020807FF1084D7FC30998311725E9468B3465833FB72A70ECDF485E0E4C7BD8665FC4501125AE401DC00000000000000000000000000000000000000000000000000000000627D20E900000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000E404E45AAF00000000000000000000000082AF49447D8A07E3BD95BD0D56F35241523FBAB10000000000000000000000002F2A2543B76A4166549F7AAB2E75BEF0AEFC5B0F00000000000000000000000000000000000000000000000000000000000001F40000000000000000000000001F0F85C19EE2B3D6589F9C86BB876F6904C7D5950000000000000000000000000000000000000000000000000DE0B6B3A76400000000000000000000000000000000000000000000000000000000000000678C0F0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008EF67C4FFA3097FDB174E273BBF22AD7C3DB6CBDDAC0A9B1F7BB44BEC0E7CB415D7456B14699141953FAFEF2C53303B14E2EFBA658EA582898943C56BDF62EF1010381A707FF0B84D7FC30998309E6CF9468F5D998F00BB2460511021741D098C05721D8FF80095EA7B3000000000000000000000000A5A33AB9063395A90CCBEA2D86A62ECCF27B5742FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1B1B2B1D1C7D3E606D8E391F7A8CA965120FD12FE2E9B6E1C44FD86610E139D5316E4B378C4C4D8927847C6942DAAE145C940F014EF4058E2045620F0CBF961E0103819807FF82569685174876E800832DC6C0943648F6E38E8641BF847B3A776DAF6A21AE9A42DD800000000000000000000000000000000000000000000000001BDF388A9F86A1000100010000038D0100080100010001CA1C008B9F7FE1F1D7D35868C6461E944F0C1889C9A1E3A6FE6E1BFF6369554802B4693FD419F925BE4A56F59F1F1C5C90AE7DD342EBE63BBD2A3AAD0FF3AEF6905D821B038202E907FF82C34D84D7FC30998310493294E195A15533C01C8CD6B28F09066842486F80F8F280CC064C8C00000000000000000000000000000000000000000000000000000000000000A00000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000001C0000000000000000000000000000000000000000000000000000000000000022000000000000000000000000000000000000000000000000000000000000000020000000000000000000000008EFE50A4B8C8B64FDC93A5B1712FD735D8223CD50000000000000000000000008EFE50A4B8C8B64FDC93A5B1712FD735D8223CD500000000000000000000000000000000000000000000000000000000000000024554482D555344000000000000000000000000000000000000000000000000004554482D555344000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000FF970A61A04B1CA14834A43F5DE4533EBDDB5CC8000000000000000000000000FF970A61A04B1CA14834A43F5DE4533EBDDB5CC800000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000002E78033A0C0000000000000000000000000000000000000000000000000000002E777CEA4D16BC8A8E91CAC726718BEFDC65A7C49CF0C2FD93C1C4A1AE1BEF7F4AF6C5D8A270B1D769F74EECE9C8929D3AC45E0C20A11D6D1C193F61C097AEC9DE8D2AF31F00038201A907FF8227D984D7FC3099831E848094E592427A0AECE92DE3EDEE1F18E0157C0586156480C04B8D59000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000A0000000000000000000000000DEDDEC1B0F028F6831765E9212A68F5990BA09E600000000000000000000000000000000000000000000000000000000627D2059000000000000000000000000000000000000000000000000201C1B08D6BB69E0000000000000000000000000000000000000000000000000201C1B08D6BB69E0000000000000000000000000000000000000000000000000000000000000004282AF49447D8A07E3BD95BD0D56F35241523FBAB10001F4FF970A61A04B1CA14834A43F5DE4533EBDDB5CC8000BB882AF49447D8A07E3BD95BD0D56F35241523FBAB10000000000000000000000000000000000000000000000000000000000003143951E135694301AE315FB7B4CBD3CBD0EAD729FC63A2F9D38D1BF521A640B282054F6F565161C2EB83A01547713D550DA5B4E9614C47C4C03A1E86A4EC4AE0103819807FF82569785174876E800832DC6C0943648F6E38E8641BF847B3A776DAF6A21AE9A42DD80000000000000000000000000000000000000000000000000201CE4D030968C000100010000038D0100080100010001CA1C00920DCA5461F4A86E73D0E6BC6AF2405AB186B880A0648365C92AE7A94393C6C7621278E025B54D6DAAE7FAD6FA656C60BBF38B18402D82CA8738303218FA43E81C0382016907FF824BC484D7FC3099831D0A0994E592427A0AECE92DE3EDEE1F18E0157C0586156480DB3E2198000000000000000000000000FF970A61A04B1CA14834A43F5DE4533EBDDB5CC800000000000000000000000082AF49447D8A07E3BD95BD0D56F35241523FBAB10000000000000000000000000000000000000000000000000000000000000BB8000000000000000000000000D0DB388F32328915654E88DB4241EB45FA6ED55900000000000000000000000000000000000000000000000000000000627D20950000000000000000000000000000000000000000000000002AF9B54A69BB0C00000000000000000000000000000000000000000000000000000000016F4A0B6800000000000000000000000000000000000000000000000000000000000000006B4381BCD384836BACF15CDC2F469DDA4892D2415BCB0E1141C660CFF1CF03A763FD566A4CA331B1E44D2C3749301810AD41F9B1F65759B811F54F3CF078B51D000382016A07FF821B238501AFF861328323186094E592427A0AECE92DE3EDEE1F18E0157C0586156480414BF389000000000000000000000000FD086BC7CD5C481DCC9C85EBE478A1C0B69FCBB900000000000000000000000066BA30D5D7C66AFD4ED41C3498EC9E20A03A13680000000000000000000000000000000000000000000000000000000000000BB80000000000000000000000003D11DC9151ADC719D539390FCE7EAF0FABE36C3B00000000000000000000000000000000000000000000000000000000627D2095000000000000000000000000000000000000000000000000000000002FD6E46F0000000000000000000000000000000000000000000000056900D33CA7FC000000000000000000000000000000000000000000000000000000000000000000001B335EC0973B647FE9FF2D0A34689786CFC5EA6A509B82E79067F22902E8C47173FB382512DD2682D989693CD18A9F9F0E800E6B7CD198BADD9AEFC6783187691B0382040A07FF82B2D285E8D4A51000836ACFC0943607E46698D218B3A5CAE44BF381475C0A5E2CA780C9807539000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000002600000000000000000000000000000000000000000000000000000000000000300000101010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001C00000000000000000000000F6D9397093865A569A3B827FBE021B4E00012DD40305070802010600030904000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000A0000000000000000000000000000000000000000000000000000002D9D67A6AC0000000000000000000000000000000000000000000000000000002DB1E36C800000000000000000000000000000000000000000000000000000002DB1E36C800000000000000000000000000000000000000000000000000000002DC2ED3A9F0000000000000000000000000000000000000000000000000000002DE33807EE0000000000000000000000000000000000000000000000000000002DF155825A0000000000000000000000000000000000000000000000000000002DF2FA05800000000000000000000000000000000000000000000000000000002E3AEB61400000000000000000000000000000000000000000000000000000002E555306000000000000000000000000000000000000000000000000000000002E5C89564000000000000000000000000000000000000000000000000000000000000000045FB5ADAA0D20CE004AE9DDDC9F55706059FCBC5840D19AD256F989273CA332274CB38692E20F32E29991AE5E211D1FF31BFD1B471ACBC0211DA642311896EBEC70FFFA9AF0BDC3206AA769E3871F6F94307FE93C50503E5F58DF8390024E30979CD34DB0B87499C4FA50163D8E4CE0D7DBE988AC0B34D3FD048FA666DA8025EA000000000000000000000000000000000000000000000000000000000000000417214C5F1FAA7D5DC798958BCAFD80782F60044E107ECEE0EFAA4BFB4483903C730E9C629786F5CE382B05E2D733221152056023EC7774383D4EC21819293230459DB2D6B7B05E3AFE090BA643688871AF272BB80070B96EE7609E1E0F3CB0D102C3FF4B57B0368914D827F4EEA0C31B3893961E1DEE032FB8CBE005A376574ABBF501D2F7C8C47A67F728DB9B73717F23DCC75C37294E4855ADA5221E83B8D2142E60E7C66316888A1A69B0DBDC67440B8B5F065EB060CE2030CEC188C14E54000382020A07FF824DD985174876E800831AB3F09468B3465833FB72A70ECDF485E0E4C7BD8665FC45805AE401DC00000000000000000000000000000000000000000000000000000000627D472E00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000E45023B4DF000000000000000000000000FF970A61A04B1CA14834A43F5DE4533EBDDB5CC800000000000000000000000082AF49447D8A07E3BD95BD0D56F35241523FBAB100000000000000000000000000000000000000000000000000000000000001F4000000000000000000000000565D82C9C9584D21AD8EE5A73B56CE71DACED7E20000000000000000000000000000000000000000000000001BC1833B3E41800000000000000000000000000000000000000000000000000000000000EE3120EB00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000094DC234208D56E8EAD7672CB2431D7B8E40EA217CFEBD4A89CA099756E1508676F8219B704C2E6194C4F31459F6519904DF10966F5EE92A8C7D7092C5BEF0240000382016A07FF8207938501008688AB830E2A1E94F8D88D63ED3A2104E664AE8715FC9F80ABBA864D8046BD71F90000000000000000000000001B02DA8CB0D097EB8D57A175B88C7D8B4799750600000000000000000000000000000000000000000000000011A37FC41585800000000000000000000000000000000000000000000000000000000000980A3DDE00000000000000000000000000000000000000000000000000000000000000A000000000000000000000000000000000000000000000000000000000627D202D0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000FD086BC7CD5C481DCC9C85EBE478A1C0B69FCBB900000000000000000000000082AF49447D8A07E3BD95BD0D56F35241523FBAB117CC6951E8D651ABFB4FC6586EF94EF90370C76AA6068DD3EB8AD86866F900111B54057D2A584FFAEB166CBE90931A499CFBFA797CF59D37F6E075E8A0AE156C000382028907FF82101B84D7FC3099832625A094ED9CA5ECD2068C29A0698460DB9B0372C8F87BD280E84423C30000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000003B9ACA00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000000400000000000000000000000082AF49447D8A07E3BD95BD0D56F35241523FBAB1000000000000000000000000FF970A61A04B1CA14834A43F5DE4533EBDDB5CC800000000000000000000000017FC002B466EEC40DAE837FC4BE5C67993DDBD6F00000000000000000000000082AF49447D8A07E3BD95BD0D56F35241523FBAB10000000000000000000000000000000000000000000000000000000000000003000000000000000000000000C31E54C7A869B9FCBECC14363CF510D1C41FA4430000000000000000000000000000000000000000000000000000000000000002000000000000000000000000F07D553B195080F84F582E88ECDD54BAA122B279000000000000000000000000000000000000000000000000000000000000000B000000000000000000000000AEBFDA10B251D650126830B952EE74B4A599F71F00000000000000000000000000000000000000000000000000000000000000017A7D773A44A78A15FC75E5FE2BD2A6B8FA998AE6559AFF75B05CB79AB68E2278576149FC20EAA24959ACDC3CBAB114F5410C2AEA732481E1359068B9502541F0000382014807FF7384D7FC3099830F3529941B02DA8CB0D097EB8D57A175B88C7D8B4799750619107FF36AB50000000000000000000000000000000000000000000000009C71C54A4A6B3FF80000000000000000000000000000000000000000000000000000000000000080000000000000000000000000C4B07A842E0068A95C3CD933E229348E6D79427900000000000000000000000000000000000000000000000000000000627D26C5000000000000000000000000000000000000000000000000000000000000000200000000000000000000000082AF49447D8A07E3BD95BD0D56F35241523FBAB100000000000000000000000032EB7902D4134BF98A28B963D26DE779AF92A21258EBEAD64824D683B88857B41724B7EEE89F92B275BA22AD05D70057984C04495F0F1EE79E917D21BDB50C798CD496B307263C19371980C45D4F2D1EF7CF22D5000382040A07FF82A96A85E8D4A51000836ACFC0943C6ABDA21358C15601A3175D8DD66D0C572CC90480C9807539000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000002600000000000000000000000000000000000000000000000000000000000000300010100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001C00000000000000000000000B9272C57951E29E59E3027B75D9B26B70002428B0301050200070306090408000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000A00000000000000000000000000000000000000000000000000000001C7AD714000000000000000000000000000000000000000000000000000000001C92CF2C100000000000000000000000000000000000000000000000000000001CA74590100000000000000000000000000000000000000000000000000000001CB3605EA00000000000000000000000000000000000000000000000000000001CB3605EA00000000000000000000000000000000000000000000000000000001CBB1732A00000000000000000000000000000000000000000000000000000001CBB1732A00000000000000000000000000000000000000000000000000000001CDDD559E00000000000000000000000000000000000000000000000000000001CDFFDDBF00000000000000000000000000000000000000000000000000000001D1FD36800000000000000000000000000000000000000000000000000000000000000004B47605FC742D563675CDF890AFF4CEB164B9DC0B4EAD75A2C7790453BFEF109FD2E588C55AC01D6B8F64B1D8C9D73C06FC8F9DBA4A1471F756C62CE41C93066FEC43FD768035546E5F88197966DEA32A4465135B55A3D7A30F27551448280BE7D51D864000934FD46C0EBC182062F5B3FC0DA311A7FA8CA632D6CEEE63CA0814000000000000000000000000000000000000000000000000000000000000000449120F763D74313EF005F980B3DDF849508696CF71E91CF9DC37D1A8A08EA25A7AE63487619CD15BFB00A507AD35395FDD9EF79BB7FF0388CF296BDB52DC57475C482F5680293FF6F568C76DB5C3B351D77712A56BE5CF9B1663B61815B0652D281D5B3C5F41D609C65330DA0BDAD48B6EF1E766FC123B4CC789CC4BCC80003087AB3B20C9DB06B93EDFCBF971F8F37A60A75FF7096C7FB74E964F4A90143FDE72A75F9FB8056CB4159B62C99175AA95B3EE7D4D3F3A26453A3C79C25EEB8F89000382020A07FF824DDA85174876E800831AB3F09468B3465833FB72A70ECDF485E0E4C7BD8665FC45805AE401DC00000000000000000000000000000000000000000000000000000000627D472F00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000E45023B4DF000000000000000000000000FF970A61A04B1CA14834A43F5DE4533EBDDB5CC800000000000000000000000082AF49447D8A07E3BD95BD0D56F35241523FBAB100000000000000000000000000000000000000000000000000000000000001F4000000000000000000000000565D82C9C9584D21AD8EE5A73B56CE71DACED7E20000000000000000000000000000000000000000000000001BC1842412E6900000000000000000000000000000000000000000000000000000000000EE4D2E3E0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000E3716D9123DF2767E8C41A8AF6A1698F49586AAE6A2637472B17985B514532867B22E65F416E1527911CE39556D91492D9B593A794BEF046BB8CD219391BD7201, lengths=[494, 1038, 128, 0, 4815, 0, 494, 0, 1038, 0, 1038, 0, 234, 0, 526, 0, 102, 0, 685, 0, 526, 0, 1198, 0, 270, 0, 429, 0, 157, 432, 0, 173, 0, 170, 170, 0, 174, 0, 104, 0, 526, 0, 236, 0, 1038, 0, 398, 0, 589, 0, 526, 0, 654, 0, 236, 365, 1038, 366, 526, 366, 0, 653, 170, 1551, 589, 366, 0, 1671, 0, 1038, 0, 365, 0, 1038, 0, 1038, 0, 1038, 0, 526, 0, 685, 0, 824, 0, 174, 0, 234, 0, 526, 0, 205, 0, 365, 0, 310, 0, 526, 0, 366, 0, 1038, 0, 365, 0, 526, 0, 558, 0, 237, 332, 366, 654, 366, 557, 526, 1038, 236, 0, 365, 1038, 430, 430, 0, 366, 174, 494, 0, 236, 0, 270, 0, 2960, 0, 237, 0, 365, 0, 526, 0, 181, 0, 165, 0, 366, 0, 526, 0, 110, 0, 332, 0, 526, 270, 270, 270, 270, 0, 1038, 653, 270, 332, 301, 366, 106, 589, 654, 2285, 102, 589, 366, 1038, 1198, 102, 366, 170, 365, 174, 237, 302, 366, 1038, 1038, 0, 267, 170, 0, 654, 430, 0, 237, 589, 174, 270, 1038, 169, 365, 526, 333, 910, 749, 365, 332, 270, 0, 308, 0, 366, 0, 462, 0, 169, 0, 310, 155, 366, 0, 1038, 0, 398, 237, 0, 366, 0, 654, 0, 111, 0, 237, 0, 174, 0, 526, 0, 366, 558, 0, 365, 557, 1038, 108, 526, 1038, 172, 430, 430, 0, 397, 565, 494, 524, 170, 0, 155, 749, 0, 429, 155, 0, 365, 0, 366, 0, 1038, 0, 526, 0, 366, 0, 653, 0, 332, 0, 1038, 0, 526, 0], sectionsMetadata=[24, 14761707, 1652367219, 456754, 0, 160, 14761710, 1652367293, 456754, 0, 93, 14761714, 1652367358, 456754, 0], afterAcc=86AB5824CB7AC7BF348847C0E31B94C060069732DC1A18C3CE35B7DB54F48676, gasRefunder=0x284c1875694058b213866F5F2aD015b5a4B9438b )
    • GasRefunder.onGasSpent( refundee=0xa4b10ac61E79Ea1e150DF70B8dda53391928fD14, gasUsed=241272, calldataSize=105316 ) => ( success=True )
      • ETH 0.244698037464474938 Arbitrum: Sequencer.CALL( )
        addSequencerL2BatchFromOriginWithGasRefunder[SequencerInbox (ln:160)]
        File 1 of 3: TransparentUpgradeableProxy
        // SPDX-License-Identifier: MIT
        pragma solidity >=0.6.0 <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 internall call site, it will return directly to the external caller.
             */
            function _delegate(address implementation) internal virtual {
                // solhint-disable-next-line no-inline-assembly
                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
        pragma solidity >=0.6.0 <0.8.0;
        import "./UpgradeableProxy.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 UpgradeableProxy {
            /**
             * @dev Initializes an upgradeable proxy managed by `_admin`, backed by the implementation at `_logic`, and
             * optionally initialized with `_data` as explained in {UpgradeableProxy-constructor}.
             */
            constructor(address _logic, address admin_, bytes memory _data) public payable UpgradeableProxy(_logic, _data) {
                assert(_ADMIN_SLOT == bytes32(uint256(keccak256("eip1967.proxy.admin")) - 1));
                _setAdmin(admin_);
            }
            /**
             * @dev Emitted when the admin account has changed.
             */
            event AdminChanged(address previousAdmin, address newAdmin);
            /**
             * @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 private constant _ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;
            /**
             * @dev Modifier used internally that will delegate the call to the implementation unless the sender is the admin.
             */
            modifier ifAdmin() {
                if (msg.sender == _admin()) {
                    _;
                } 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_ = _admin();
            }
            /**
             * @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 {
                require(newAdmin != address(0), "TransparentUpgradeableProxy: new admin is the zero address");
                emit AdminChanged(_admin(), newAdmin);
                _setAdmin(newAdmin);
            }
            /**
             * @dev Upgrade the implementation of the proxy.
             *
             * NOTE: Only the admin can call this function. See {ProxyAdmin-upgrade}.
             */
            function upgradeTo(address newImplementation) external virtual ifAdmin {
                _upgradeTo(newImplementation);
            }
            /**
             * @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 virtual ifAdmin {
                _upgradeTo(newImplementation);
                Address.functionDelegateCall(newImplementation, data);
            }
            /**
             * @dev Returns the current admin.
             */
            function _admin() internal view virtual returns (address adm) {
                bytes32 slot = _ADMIN_SLOT;
                // solhint-disable-next-line no-inline-assembly
                assembly {
                    adm := sload(slot)
                }
            }
            /**
             * @dev Stores a new address in the EIP1967 admin slot.
             */
            function _setAdmin(address newAdmin) private {
                bytes32 slot = _ADMIN_SLOT;
                // solhint-disable-next-line no-inline-assembly
                assembly {
                    sstore(slot, newAdmin)
                }
            }
            /**
             * @dev Makes sure the admin cannot access the fallback function. See {Proxy-_beforeFallback}.
             */
            function _beforeFallback() internal virtual override {
                require(msg.sender != _admin(), "TransparentUpgradeableProxy: admin cannot fallback to proxy target");
                super._beforeFallback();
            }
        }
        // SPDX-License-Identifier: MIT
        pragma solidity >=0.6.0 <0.8.0;
        import "./Proxy.sol";
        import "../utils/Address.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.
         *
         * Upgradeability is only provided internally through {_upgradeTo}. For an externally upgradeable proxy see
         * {TransparentUpgradeableProxy}.
         */
        contract UpgradeableProxy is Proxy {
            /**
             * @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) public payable {
                assert(_IMPLEMENTATION_SLOT == bytes32(uint256(keccak256("eip1967.proxy.implementation")) - 1));
                _setImplementation(_logic);
                if(_data.length > 0) {
                    Address.functionDelegateCall(_logic, _data);
                }
            }
            /**
             * @dev Emitted when the implementation is upgraded.
             */
            event Upgraded(address indexed implementation);
            /**
             * @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 private constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;
            /**
             * @dev Returns the current implementation address.
             */
            function _implementation() internal view virtual override returns (address impl) {
                bytes32 slot = _IMPLEMENTATION_SLOT;
                // solhint-disable-next-line no-inline-assembly
                assembly {
                    impl := sload(slot)
                }
            }
            /**
             * @dev Upgrades the proxy to a new implementation.
             *
             * Emits an {Upgraded} event.
             */
            function _upgradeTo(address newImplementation) internal virtual {
                _setImplementation(newImplementation);
                emit Upgraded(newImplementation);
            }
            /**
             * @dev Stores a new address in the EIP1967 implementation slot.
             */
            function _setImplementation(address newImplementation) private {
                require(Address.isContract(newImplementation), "UpgradeableProxy: new implementation is not a contract");
                bytes32 slot = _IMPLEMENTATION_SLOT;
                // solhint-disable-next-line no-inline-assembly
                assembly {
                    sstore(slot, newImplementation)
                }
            }
        }
        // SPDX-License-Identifier: MIT
        pragma solidity >=0.6.2 <0.8.0;
        /**
         * @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
             * ====
             */
            function isContract(address account) internal view returns (bool) {
                // This method relies on extcodesize, which returns 0 for contracts in
                // construction, since the code is only stored at the end of the
                // constructor execution.
                uint256 size;
                // solhint-disable-next-line no-inline-assembly
                assembly { size := extcodesize(account) }
                return size > 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");
                // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
                (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");
                // solhint-disable-next-line avoid-low-level-calls
                (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");
                // solhint-disable-next-line avoid-low-level-calls
                (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");
                // solhint-disable-next-line avoid-low-level-calls
                (bool success, bytes memory returndata) = target.delegatecall(data);
                return _verifyCallResult(success, returndata, errorMessage);
            }
            function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private 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
                        // solhint-disable-next-line no-inline-assembly
                        assembly {
                            let returndata_size := mload(returndata)
                            revert(add(32, returndata), returndata_size)
                        }
                    } else {
                        revert(errorMessage);
                    }
                }
            }
        }
        

        File 2 of 3: 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;
            mapping(address => uint256) public lastContractRefund;
            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,
                ALREADY_REFUNDED_THIS_BLOCK,
                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;
                }
                if (lastContractRefund[msg.sender] == block.number) {
                    // There was already a refund this block, don't refund further
                    emit RefundGasCostsDenied(
                        refundee,
                        msg.sender,
                        RefundDenyReason.ALREADY_REFUNDED_THIS_BLOCK,
                        gasUsed
                    );
                    return false;
                }
                lastContractRefund[msg.sender] = block.number;
                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
        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() {
                _setOwner(_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 {
                _setOwner(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");
                _setOwner(newOwner);
            }
            function _setOwner(address newOwner) private {
                address oldOwner = _owner;
                _owner = newOwner;
                emit OwnershipTransferred(oldOwner, newOwner);
            }
        }
        // SPDX-License-Identifier: MIT
        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 3 of 3: SequencerInbox
        // 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;
        import "./interfaces/ISequencerInbox.sol";
        import "./interfaces/IBridge.sol";
        import "../arch/Marshaling.sol";
        import "../libraries/Cloneable.sol";
        import "../rollup/Rollup.sol";
        import "../validator/IGasRefunder.sol";
        import "./Messages.sol";
        interface OldRollup {
            function sequencerInboxMaxDelayBlocks() external view returns (uint256);
            function sequencerInboxMaxDelaySeconds() external view returns (uint256);
        }
        contract SequencerInbox is ISequencerInbox, Cloneable {
            // Sequencer-Inbox state accumulator
            bytes32[] public override inboxAccs;
            // Number of messages included in the sequencer-inbox; tracked seperately from inboxAccs since multiple messages can be included in a single inboxAcc update (i.e., many messages in a batch, many batches in a single inboxAccs update, etc)
            uint256 public override messageCount;
            // count of messages read from the delayedInbox
            uint256 public totalDelayedMessagesRead;
            IBridge public delayedInbox;
            address private deprecatedSequencer;
            address public rollup;
            mapping(address => bool) public override isSequencer;
            // Window in which only the Sequencer can update the Inbox; this delay is what allows the Sequencer to give receipts with sub-blocktime latency.
            uint256 public override maxDelayBlocks;
            uint256 public override maxDelaySeconds;
            function initialize(
                IBridge _delayedInbox,
                address _sequencer,
                address _rollup
            ) external {
                require(address(delayedInbox) == address(0), "ALREADY_INIT");
                delayedInbox = _delayedInbox;
                isSequencer[_sequencer] = true;
                rollup = _rollup;
                // it is assumed that maxDelayBlocks and maxDelaySeconds are set by the rollup
            }
            function postUpgradeInit() external view {
                // it is assumed the sequencer inbox contract is behind a Proxy controlled by a
                // proxy admin. this function can only be called by the proxy admin contract
                address proxyAdmin = ProxyUtil.getProxyAdmin();
                require(msg.sender == proxyAdmin, "NOT_FROM_ADMIN");
            }
            /// @notice DEPRECATED - use isSequencer instead
            function sequencer() external view override returns (address) {
                return deprecatedSequencer;
            }
            function setIsSequencer(address addr, bool newIsSequencer) external override {
                require(msg.sender == rollup, "ONLY_ROLLUP");
                isSequencer[addr] = newIsSequencer;
                emit IsSequencerUpdated(addr, newIsSequencer);
            }
            function setMaxDelay(uint256 newMaxDelayBlocks, uint256 newMaxDelaySeconds) external override {
                require(msg.sender == rollup, "ONLY_ROLLUP");
                maxDelayBlocks = newMaxDelayBlocks;
                maxDelaySeconds = newMaxDelaySeconds;
                emit MaxDelayUpdated(newMaxDelayBlocks, newMaxDelaySeconds);
            }
            /**
             * @notice Move messages from the delayed inbox into the Sequencer inbox. Callable by any address. Necessary iff Sequencer hasn't included them before delay period expired.
             */
            function forceInclusion(
                uint256 _totalDelayedMessagesRead,
                uint8 kind,
                uint256[2] calldata l1BlockAndTimestamp,
                uint256 inboxSeqNum,
                uint256 gasPriceL1,
                address sender,
                bytes32 messageDataHash,
                bytes32 delayedAcc
            ) external {
                require(_totalDelayedMessagesRead > totalDelayedMessagesRead, "DELAYED_BACKWARDS");
                {
                    bytes32 messageHash = Messages.messageHash(
                        kind,
                        sender,
                        l1BlockAndTimestamp[0],
                        l1BlockAndTimestamp[1],
                        inboxSeqNum,
                        gasPriceL1,
                        messageDataHash
                    );
                    // Can only force-include after the Sequencer-only window has expired.
                    require(l1BlockAndTimestamp[0] + maxDelayBlocks < block.number, "MAX_DELAY_BLOCKS");
                    require(l1BlockAndTimestamp[1] + maxDelaySeconds < block.timestamp, "MAX_DELAY_TIME");
                    // Verify that message hash represents the last message sequence of delayed message to be included
                    bytes32 prevDelayedAcc = 0;
                    if (_totalDelayedMessagesRead > 1) {
                        prevDelayedAcc = delayedInbox.inboxAccs(_totalDelayedMessagesRead - 2);
                    }
                    require(
                        delayedInbox.inboxAccs(_totalDelayedMessagesRead - 1) ==
                            Messages.addMessageToInbox(prevDelayedAcc, messageHash),
                        "DELAYED_ACCUMULATOR"
                    );
                }
                uint256 startNum = messageCount;
                bytes32 beforeAcc = 0;
                if (inboxAccs.length > 0) {
                    beforeAcc = inboxAccs[inboxAccs.length - 1];
                }
                (bytes32 acc, uint256 count) = includeDelayedMessages(
                    beforeAcc,
                    startNum,
                    _totalDelayedMessagesRead,
                    block.number,
                    block.timestamp,
                    delayedAcc
                );
                inboxAccs.push(acc);
                messageCount = count;
                emit DelayedInboxForced(
                    startNum,
                    beforeAcc,
                    count,
                    _totalDelayedMessagesRead,
                    [acc, delayedAcc],
                    inboxAccs.length - 1
                );
            }
            function addSequencerL2BatchFromOrigin(
                bytes calldata transactions,
                uint256[] calldata lengths,
                uint256[] calldata sectionsMetadata,
                bytes32 afterAcc
            ) external {
                // solhint-disable-next-line avoid-tx-origin
                require(msg.sender == tx.origin, "origin only");
                uint256 startNum = messageCount;
                bytes32 beforeAcc = addSequencerL2BatchImpl(
                    transactions,
                    lengths,
                    sectionsMetadata,
                    afterAcc
                );
                emit SequencerBatchDeliveredFromOrigin(
                    startNum,
                    beforeAcc,
                    messageCount,
                    afterAcc,
                    inboxAccs.length - 1
                );
            }
            function addSequencerL2BatchFromOriginWithGasRefunder(
                bytes calldata transactions,
                uint256[] calldata lengths,
                uint256[] calldata sectionsMetadata,
                bytes32 afterAcc,
                IGasRefunder gasRefunder
            ) external {
                // solhint-disable-next-line avoid-tx-origin
                require(msg.sender == tx.origin, "origin only");
                uint256 startGasLeft = gasleft();
                uint256 calldataSize;
                assembly {
                    calldataSize := calldatasize()
                }
                uint256 startNum = messageCount;
                bytes32 beforeAcc = addSequencerL2BatchImpl(
                    transactions,
                    lengths,
                    sectionsMetadata,
                    afterAcc
                );
                emit SequencerBatchDeliveredFromOrigin(
                    startNum,
                    beforeAcc,
                    messageCount,
                    afterAcc,
                    inboxAccs.length - 1
                );
                if (gasRefunder != IGasRefunder(0)) {
                    gasRefunder.onGasSpent(msg.sender, startGasLeft - gasleft(), calldataSize);
                }
            }
            /**
             * @notice Sequencer adds a batch to inbox.
             * @param transactions concatenated bytes of L2 messages
             * @param lengths length of each txn in transctions (for parsing)
             * @param sectionsMetadata Each consists of [numItems, l1BlockNumber, l1Timestamp, newTotalDelayedMessagesRead, newDelayedAcc]
             * @param afterAcc Expected inbox hash after batch is added
             * @dev sectionsMetadata lets the sequencer delineate new l1Block numbers and l1Timestamps within a given batch; this lets the sequencer minimize the number of batches created (and thus amortizing cost) while still giving timely receipts
             */
            function addSequencerL2Batch(
                bytes calldata transactions,
                uint256[] calldata lengths,
                uint256[] calldata sectionsMetadata,
                bytes32 afterAcc
            ) external {
                uint256 startNum = messageCount;
                bytes32 beforeAcc = addSequencerL2BatchImpl(
                    transactions,
                    lengths,
                    sectionsMetadata,
                    afterAcc
                );
                emit SequencerBatchDelivered(
                    startNum,
                    beforeAcc,
                    messageCount,
                    afterAcc,
                    transactions,
                    lengths,
                    sectionsMetadata,
                    inboxAccs.length - 1,
                    msg.sender
                );
            }
            function addSequencerL2BatchImpl(
                bytes memory transactions,
                uint256[] calldata lengths,
                uint256[] calldata sectionsMetadata,
                bytes32 afterAcc
            ) private returns (bytes32 beforeAcc) {
                require(isSequencer[msg.sender], "ONLY_SEQUENCER");
                if (inboxAccs.length > 0) {
                    beforeAcc = inboxAccs[inboxAccs.length - 1];
                }
                uint256 runningCount = messageCount;
                bytes32 runningAcc = beforeAcc;
                uint256 processedItems = 0;
                uint256 dataOffset;
                assembly {
                    dataOffset := add(transactions, 32)
                }
                for (uint256 i = 0; i + 5 <= sectionsMetadata.length; i += 5) {
                    // Each metadata section consists of:
                    // [numItems, l1BlockNumber, l1Timestamp, newTotalDelayedMessagesRead, newDelayedAcc]
                    {
                        uint256 l1BlockNumber = sectionsMetadata[i + 1];
                        require(l1BlockNumber + maxDelayBlocks >= block.number, "BLOCK_TOO_OLD");
                        require(l1BlockNumber <= block.number, "BLOCK_TOO_NEW");
                    }
                    {
                        uint256 l1Timestamp = sectionsMetadata[i + 2];
                        require(l1Timestamp + maxDelaySeconds >= block.timestamp, "TIME_TOO_OLD");
                        require(l1Timestamp <= block.timestamp, "TIME_TOO_NEW");
                    }
                    {
                        bytes32 prefixHash = keccak256(
                            abi.encodePacked(msg.sender, sectionsMetadata[i + 1], sectionsMetadata[i + 2])
                        );
                        uint256 numItems = sectionsMetadata[i];
                        (runningAcc, runningCount, dataOffset) = calcL2Batch(
                            dataOffset,
                            lengths,
                            processedItems,
                            numItems,
                            prefixHash,
                            runningCount,
                            runningAcc
                        );
                        processedItems += numItems;
                    }
                    uint256 newTotalDelayedMessagesRead = sectionsMetadata[i + 3];
                    require(newTotalDelayedMessagesRead >= totalDelayedMessagesRead, "DELAYED_BACKWARDS");
                    require(newTotalDelayedMessagesRead >= 1, "MUST_DELAYED_INIT");
                    require(
                        totalDelayedMessagesRead >= 1 || sectionsMetadata[i] == 0,
                        "MUST_DELAYED_INIT_START"
                    );
                    // Sequencer decides how many messages (if any) to include from the delayed inbox
                    if (newTotalDelayedMessagesRead > totalDelayedMessagesRead) {
                        (runningAcc, runningCount) = includeDelayedMessages(
                            runningAcc,
                            runningCount,
                            newTotalDelayedMessagesRead,
                            sectionsMetadata[i + 1], // block number
                            sectionsMetadata[i + 2], // timestamp
                            bytes32(sectionsMetadata[i + 4]) // delayed accumulator
                        );
                    }
                }
                uint256 startOffset;
                assembly {
                    startOffset := add(transactions, 32)
                }
                require(dataOffset >= startOffset, "OFFSET_OVERFLOW");
                require(dataOffset <= startOffset + transactions.length, "TRANSACTIONS_OVERRUN");
                require(runningCount > messageCount, "EMPTY_BATCH");
                inboxAccs.push(runningAcc);
                messageCount = runningCount;
                require(runningAcc == afterAcc, "AFTER_ACC");
            }
            function calcL2Batch(
                uint256 beforeOffset,
                uint256[] calldata lengths,
                uint256 lengthsOffset,
                uint256 itemCount,
                bytes32 prefixHash,
                uint256 beforeCount,
                bytes32 beforeAcc
            )
                private
                pure
                returns (
                    bytes32 acc,
                    uint256 count,
                    uint256 offset
                )
            {
                offset = beforeOffset;
                count = beforeCount;
                acc = beforeAcc;
                itemCount += lengthsOffset;
                for (uint256 i = lengthsOffset; i < itemCount; i++) {
                    uint256 length = lengths[i];
                    bytes32 messageDataHash;
                    assembly {
                        messageDataHash := keccak256(offset, length)
                    }
                    acc = keccak256(abi.encodePacked(acc, count, prefixHash, messageDataHash));
                    offset += length;
                    count++;
                }
                return (acc, count, offset);
            }
            // Precondition: _totalDelayedMessagesRead > totalDelayedMessagesRead
            function includeDelayedMessages(
                bytes32 acc,
                uint256 count,
                uint256 _totalDelayedMessagesRead,
                uint256 l1BlockNumber,
                uint256 timestamp,
                bytes32 delayedAcc
            ) private returns (bytes32, uint256) {
                require(_totalDelayedMessagesRead <= delayedInbox.messageCount(), "DELAYED_TOO_FAR");
                require(delayedAcc == delayedInbox.inboxAccs(_totalDelayedMessagesRead - 1), "DELAYED_ACC");
                acc = keccak256(
                    abi.encodePacked(
                        "Delayed messages:",
                        acc,
                        count,
                        totalDelayedMessagesRead,
                        _totalDelayedMessagesRead,
                        delayedAcc
                    )
                );
                count += _totalDelayedMessagesRead - totalDelayedMessagesRead;
                bytes memory emptyBytes;
                acc = keccak256(
                    abi.encodePacked(
                        acc,
                        count,
                        keccak256(abi.encodePacked(address(0), l1BlockNumber, timestamp)),
                        keccak256(emptyBytes)
                    )
                );
                count++;
                totalDelayedMessagesRead = _totalDelayedMessagesRead;
                return (acc, count);
            }
            /**
             * @notice Prove message count as of provided inbox state hash
             * @param proof proof data
             * @param offset offset for parsing proof data
             * @param inboxAcc target inbox state hash
             */
            function proveSeqBatchMsgCount(
                bytes calldata proof,
                uint256 offset,
                bytes32 inboxAcc
            ) internal pure returns (uint256, uint256) {
                uint256 endMessageCount;
                bytes32 buildingAcc;
                uint256 seqNum;
                bytes32 messageHeaderHash;
                bytes32 messageDataHash;
                (offset, buildingAcc) = Marshaling.deserializeBytes32(proof, offset);
                (offset, seqNum) = Marshaling.deserializeInt(proof, offset);
                (offset, messageHeaderHash) = Marshaling.deserializeBytes32(proof, offset);
                (offset, messageDataHash) = Marshaling.deserializeBytes32(proof, offset);
                buildingAcc = keccak256(
                    abi.encodePacked(buildingAcc, seqNum, messageHeaderHash, messageDataHash)
                );
                endMessageCount = seqNum + 1;
                require(buildingAcc == inboxAcc, "BATCH_ACC");
                return (offset, endMessageCount);
            }
            /**
             * @notice Show that given messageCount falls inside of some batch and prove/return inboxAcc state. This is used to ensure that the creation of new nodes are replay protected to the state of the inbox, thereby ensuring their validity/invalidy can't be modified upon reorging the inbox contents.
             * @dev (wrapper in leiu of proveBatchContainsSequenceNumber for sementics)
             * @return (message count at end of target batch, inbox hash as of target batch)
             */
            function proveInboxContainsMessage(bytes calldata proof, uint256 _messageCount)
                external
                view
                override
                returns (uint256, bytes32)
            {
                return proveInboxContainsMessageImp(proof, _messageCount);
            }
            // deprecated in favor of proveInboxContainsMessage
            function proveBatchContainsSequenceNumber(bytes calldata proof, uint256 _messageCount)
                external
                view
                returns (uint256, bytes32)
            {
                return proveInboxContainsMessageImp(proof, _messageCount);
            }
            function proveInboxContainsMessageImp(bytes calldata proof, uint256 _messageCount)
                internal
                view
                returns (uint256, bytes32)
            {
                if (_messageCount == 0) {
                    return (0, 0);
                }
                (uint256 offset, uint256 targetInboxStateIndex) = Marshaling.deserializeInt(proof, 0);
                uint256 messageCountAsOfPreviousInboxState = 0;
                if (targetInboxStateIndex > 0) {
                    (offset, messageCountAsOfPreviousInboxState) = proveSeqBatchMsgCount(
                        proof,
                        offset,
                        inboxAccs[targetInboxStateIndex - 1]
                    );
                }
                bytes32 targetInboxState = inboxAccs[targetInboxStateIndex];
                uint256 messageCountAsOfTargetInboxState;
                (offset, messageCountAsOfTargetInboxState) = proveSeqBatchMsgCount(
                    proof,
                    offset,
                    targetInboxState
                );
                require(_messageCount > messageCountAsOfPreviousInboxState, "BATCH_START");
                require(_messageCount <= messageCountAsOfTargetInboxState, "BATCH_END");
                return (messageCountAsOfTargetInboxState, targetInboxState);
            }
            function getInboxAccsLength() external view override returns (uint256) {
                return inboxAccs.length;
            }
        }
        // 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;
        interface ISequencerInbox {
            event SequencerBatchDelivered(
                uint256 indexed firstMessageNum,
                bytes32 indexed beforeAcc,
                uint256 newMessageCount,
                bytes32 afterAcc,
                bytes transactions,
                uint256[] lengths,
                uint256[] sectionsMetadata,
                uint256 seqBatchIndex,
                address sequencer
            );
            event SequencerBatchDeliveredFromOrigin(
                uint256 indexed firstMessageNum,
                bytes32 indexed beforeAcc,
                uint256 newMessageCount,
                bytes32 afterAcc,
                uint256 seqBatchIndex
            );
            event DelayedInboxForced(
                uint256 indexed firstMessageNum,
                bytes32 indexed beforeAcc,
                uint256 newMessageCount,
                uint256 totalDelayedMessagesRead,
                bytes32[2] afterAccAndDelayed,
                uint256 seqBatchIndex
            );
            /// @notice DEPRECATED - look at IsSequencerUpdated for new updates
            // event SequencerAddressUpdated(address newAddress);
            event IsSequencerUpdated(address addr, bool isSequencer);
            event MaxDelayUpdated(uint256 newMaxDelayBlocks, uint256 newMaxDelaySeconds);
            /// @notice DEPRECATED - look at MaxDelayUpdated for new updates
            // event MaxDelayBlocksUpdated(uint256 newValue);
            /// @notice DEPRECATED - look at MaxDelayUpdated for new updates
            // event MaxDelaySecondsUpdated(uint256 newValue);
            function setMaxDelay(uint256 newMaxDelayBlocks, uint256 newMaxDelaySeconds) external;
            function setIsSequencer(address addr, bool isSequencer) external;
            function messageCount() external view returns (uint256);
            function maxDelayBlocks() external view returns (uint256);
            function maxDelaySeconds() external view returns (uint256);
            function inboxAccs(uint256 index) external view returns (bytes32);
            function getInboxAccsLength() external view returns (uint256);
            function proveInboxContainsMessage(bytes calldata proof, uint256 inboxCount)
                external
                view
                returns (uint256, bytes32);
            /// @notice DEPRECATED - use isSequencer instead
            function sequencer() external view returns (address);
            function isSequencer(address seq) external view returns (bool);
        }
        // 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;
        interface IBridge {
            event MessageDelivered(
                uint256 indexed messageIndex,
                bytes32 indexed beforeInboxAcc,
                address inbox,
                uint8 kind,
                address sender,
                bytes32 messageDataHash
            );
            event BridgeCallTriggered(
                address indexed outbox,
                address indexed destAddr,
                uint256 amount,
                bytes data
            );
            event InboxToggle(address indexed inbox, bool enabled);
            event OutboxToggle(address indexed outbox, bool enabled);
            function deliverMessageToInbox(
                uint8 kind,
                address sender,
                bytes32 messageDataHash
            ) external payable returns (uint256);
            function executeCall(
                address destAddr,
                uint256 amount,
                bytes calldata data
            ) external returns (bool success, bytes memory returnData);
            // These are only callable by the admin
            function setInbox(address inbox, bool enabled) external;
            function setOutbox(address inbox, bool enabled) external;
            // View functions
            function activeOutbox() external view returns (address);
            function allowedInboxes(address inbox) external view returns (bool);
            function allowedOutboxes(address outbox) external view returns (bool);
            function inboxAccs(uint256 index) external view returns (bytes32);
            function messageCount() external view returns (uint256);
        }
        // SPDX-License-Identifier: Apache-2.0
        /*
         * Copyright 2019-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;
        import "./Value.sol";
        import "./Hashing.sol";
        import "../libraries/BytesLib.sol";
        library Marshaling {
            using BytesLib for bytes;
            using Value for Value.Data;
            function deserializeHashPreImage(bytes memory data, uint256 startOffset)
                internal
                pure
                returns (uint256 offset, Value.Data memory value)
            {
                require(data.length >= startOffset && data.length - startOffset >= 64, "too short");
                bytes32 hashData;
                uint256 size;
                (offset, hashData) = extractBytes32(data, startOffset);
                (offset, size) = deserializeInt(data, offset);
                return (offset, Value.newTuplePreImage(hashData, size));
            }
            function deserializeInt(bytes memory data, uint256 startOffset)
                internal
                pure
                returns (
                    uint256, // offset
                    uint256 // val
                )
            {
                require(data.length >= startOffset && data.length - startOffset >= 32, "too short");
                return (startOffset + 32, data.toUint(startOffset));
            }
            function deserializeBytes32(bytes memory data, uint256 startOffset)
                internal
                pure
                returns (
                    uint256, // offset
                    bytes32 // val
                )
            {
                require(data.length >= startOffset && data.length - startOffset >= 32, "too short");
                return (startOffset + 32, data.toBytes32(startOffset));
            }
            function deserializeCodePoint(bytes memory data, uint256 startOffset)
                internal
                pure
                returns (
                    uint256, // offset
                    Value.Data memory // val
                )
            {
                uint256 offset = startOffset;
                uint8 immediateType;
                uint8 opCode;
                Value.Data memory immediate;
                bytes32 nextHash;
                (offset, immediateType) = extractUint8(data, offset);
                (offset, opCode) = extractUint8(data, offset);
                if (immediateType == 1) {
                    (offset, immediate) = deserialize(data, offset);
                }
                (offset, nextHash) = extractBytes32(data, offset);
                if (immediateType == 1) {
                    return (offset, Value.newCodePoint(opCode, nextHash, immediate));
                }
                return (offset, Value.newCodePoint(opCode, nextHash));
            }
            function deserializeTuple(
                uint8 memberCount,
                bytes memory data,
                uint256 startOffset
            )
                internal
                pure
                returns (
                    uint256, // offset
                    Value.Data[] memory // val
                )
            {
                uint256 offset = startOffset;
                Value.Data[] memory members = new Value.Data[](memberCount);
                for (uint8 i = 0; i < memberCount; i++) {
                    (offset, members[i]) = deserialize(data, offset);
                }
                return (offset, members);
            }
            function deserialize(bytes memory data, uint256 startOffset)
                internal
                pure
                returns (
                    uint256, // offset
                    Value.Data memory // val
                )
            {
                require(startOffset < data.length, "invalid offset");
                (uint256 offset, uint8 valType) = extractUint8(data, startOffset);
                if (valType == Value.intTypeCode()) {
                    uint256 intVal;
                    (offset, intVal) = deserializeInt(data, offset);
                    return (offset, Value.newInt(intVal));
                } else if (valType == Value.codePointTypeCode()) {
                    return deserializeCodePoint(data, offset);
                } else if (valType == Value.bufferTypeCode()) {
                    bytes32 hashVal;
                    (offset, hashVal) = deserializeBytes32(data, offset);
                    return (offset, Value.newBuffer(hashVal));
                } else if (valType == Value.tuplePreImageTypeCode()) {
                    return deserializeHashPreImage(data, offset);
                } else if (valType >= Value.tupleTypeCode() && valType < Value.valueTypeCode()) {
                    uint8 tupLength = uint8(valType - Value.tupleTypeCode());
                    Value.Data[] memory tupleVal;
                    (offset, tupleVal) = deserializeTuple(tupLength, data, offset);
                    return (offset, Value.newTuple(tupleVal));
                }
                require(false, "invalid typecode");
            }
            function extractUint8(bytes memory data, uint256 startOffset)
                private
                pure
                returns (
                    uint256, // offset
                    uint8 // val
                )
            {
                return (startOffset + 1, uint8(data[startOffset]));
            }
            function extractBytes32(bytes memory data, uint256 startOffset)
                private
                pure
                returns (
                    uint256, // offset
                    bytes32 // val
                )
            {
                return (startOffset + 32, data.toBytes32(startOffset));
            }
        }
        // SPDX-License-Identifier: Apache-2.0
        /*
         * Copyright 2019-2020, 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;
        import "./ICloneable.sol";
        contract Cloneable is ICloneable {
            string private constant NOT_CLONE = "NOT_CLONE";
            bool private isMasterCopy;
            constructor() public {
                isMasterCopy = true;
            }
            function isMaster() external view override returns (bool) {
                return isMasterCopy;
            }
            function safeSelfDestruct(address payable dest) internal {
                require(!isMasterCopy, NOT_CLONE);
                selfdestruct(dest);
            }
        }
        // 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;
        import "@openzeppelin/contracts/utils/Pausable.sol";
        import "@openzeppelin/contracts/proxy/Proxy.sol";
        import "@openzeppelin/contracts/utils/Address.sol";
        import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
        import "./RollupEventBridge.sol";
        import "./RollupCore.sol";
        import "./RollupLib.sol";
        import "./INode.sol";
        import "./INodeFactory.sol";
        import "../challenge/IChallenge.sol";
        import "../challenge/IChallengeFactory.sol";
        import "../bridge/interfaces/IBridge.sol";
        import "../bridge/interfaces/IOutbox.sol";
        import "../bridge/Messages.sol";
        import "../libraries/ProxyUtil.sol";
        import "../libraries/Cloneable.sol";
        import "./facets/IRollupFacets.sol";
        abstract contract RollupBase is Cloneable, RollupCore, Pausable {
            // Rollup Config
            uint256 public confirmPeriodBlocks;
            uint256 public extraChallengeTimeBlocks;
            uint256 public avmGasSpeedLimitPerBlock;
            uint256 public baseStake;
            // Bridge is an IInbox and IOutbox
            IBridge public delayedBridge;
            ISequencerInbox public sequencerBridge;
            IOutbox public outbox;
            RollupEventBridge public rollupEventBridge;
            IChallengeFactory public challengeFactory;
            INodeFactory public nodeFactory;
            address public owner;
            address public stakeToken;
            uint256 public minimumAssertionPeriod;
            uint256 public STORAGE_GAP_1;
            uint256 public STORAGE_GAP_2;
            uint256 public challengeExecutionBisectionDegree;
            address[] internal facets;
            mapping(address => bool) isValidator;
            /// @notice DEPRECATED -- this method is deprecated but still mantained for backward compatibility
            /// @dev this actually returns the avmGasSpeedLimitPerBlock
            /// @return this actually returns the avmGasSpeedLimitPerBlock
            function arbGasSpeedLimitPerBlock() external view returns (uint256) {
                return avmGasSpeedLimitPerBlock;
            }
        }
        contract Rollup is Proxy, RollupBase {
            using Address for address;
            constructor(uint256 _confirmPeriodBlocks) public Cloneable() Pausable() {
                // constructor is used so logic contract can't be init'ed
                confirmPeriodBlocks = _confirmPeriodBlocks;
                require(isInit(), "CONSTRUCTOR_NOT_INIT");
            }
            function isInit() internal view returns (bool) {
                return confirmPeriodBlocks != 0;
            }
            // _rollupParams = [ confirmPeriodBlocks, extraChallengeTimeBlocks, avmGasSpeedLimitPerBlock, baseStake ]
            // connectedContracts = [delayedBridge, sequencerInbox, outbox, rollupEventBridge, challengeFactory, nodeFactory]
            function initialize(
                bytes32 _machineHash,
                uint256[4] calldata _rollupParams,
                address _stakeToken,
                address _owner,
                bytes calldata _extraConfig,
                address[6] calldata connectedContracts,
                address[2] calldata _facets,
                uint256[2] calldata sequencerInboxParams
            ) public {
                require(!isInit(), "ALREADY_INIT");
                // calls initialize method in user facet
                require(_facets[0].isContract(), "FACET_0_NOT_CONTRACT");
                require(_facets[1].isContract(), "FACET_1_NOT_CONTRACT");
                (bool success, ) = _facets[1].delegatecall(
                    abi.encodeWithSelector(IRollupUser.initialize.selector, _stakeToken)
                );
                require(success, "FAIL_INIT_FACET");
                delayedBridge = IBridge(connectedContracts[0]);
                sequencerBridge = ISequencerInbox(connectedContracts[1]);
                outbox = IOutbox(connectedContracts[2]);
                delayedBridge.setOutbox(connectedContracts[2], true);
                rollupEventBridge = RollupEventBridge(connectedContracts[3]);
                delayedBridge.setInbox(connectedContracts[3], true);
                rollupEventBridge.rollupInitialized(
                    _rollupParams[0],
                    _rollupParams[2],
                    _owner,
                    _extraConfig
                );
                challengeFactory = IChallengeFactory(connectedContracts[4]);
                nodeFactory = INodeFactory(connectedContracts[5]);
                INode node = createInitialNode(_machineHash);
                initializeCore(node);
                confirmPeriodBlocks = _rollupParams[0];
                extraChallengeTimeBlocks = _rollupParams[1];
                avmGasSpeedLimitPerBlock = _rollupParams[2];
                baseStake = _rollupParams[3];
                owner = _owner;
                // A little over 15 minutes
                minimumAssertionPeriod = 75;
                challengeExecutionBisectionDegree = 400;
                sequencerBridge.setMaxDelay(sequencerInboxParams[0], sequencerInboxParams[1]);
                // facets[0] == admin, facets[1] == user
                facets = _facets;
                emit RollupCreated(_machineHash);
                require(isInit(), "INITIALIZE_NOT_INIT");
            }
            function postUpgradeInit() external {
                // it is assumed the rollup contract is behind a Proxy controlled by a proxy admin
                // this function can only be called by the proxy admin contract
                address proxyAdmin = ProxyUtil.getProxyAdmin();
                require(msg.sender == proxyAdmin, "NOT_FROM_ADMIN");
                // this upgrade moves the delay blocks and seconds tracking to the sequencer inbox
                // because of that we need to update the admin facet logic to allow the owner to set
                // these values in the sequencer inbox
                STORAGE_GAP_1 = 0;
                STORAGE_GAP_2 = 0;
            }
            function createInitialNode(bytes32 _machineHash) private returns (INode) {
                bytes32 state = RollupLib.stateHash(
                    RollupLib.ExecutionState(
                        0, // total gas used
                        _machineHash,
                        0, // inbox count
                        0, // send count
                        0, // log count
                        0, // send acc
                        0, // log acc
                        block.number, // block proposed
                        1 // Initialization message already in inbox
                    )
                );
                return
                    INode(
                        nodeFactory.createNode(
                            state,
                            0, // challenge hash (not challengeable)
                            0, // confirm data
                            0, // prev node
                            block.number // deadline block (not challengeable)
                        )
                    );
            }
            /**
             * This contract uses a dispatch pattern from EIP-2535: Diamonds
             * together with Open Zeppelin's proxy
             */
            function getFacets() external view returns (address, address) {
                return (getAdminFacet(), getUserFacet());
            }
            function getAdminFacet() public view returns (address) {
                return facets[0];
            }
            function getUserFacet() public view returns (address) {
                return facets[1];
            }
            /**
             * @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 override returns (address) {
                require(msg.data.length >= 4, "NO_FUNC_SIG");
                address rollupOwner = owner;
                // if there is an owner and it is the sender, delegate to admin facet
                address target = rollupOwner != address(0) && rollupOwner == msg.sender
                    ? getAdminFacet()
                    : getUserFacet();
                require(target.isContract(), "TARGET_NOT_CONTRACT");
                return target;
            }
        }
        // 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: Apache-2.0
        /*
         * Copyright 2019-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;
        library Messages {
            function messageHash(
                uint8 kind,
                address sender,
                uint256 blockNumber,
                uint256 timestamp,
                uint256 inboxSeqNum,
                uint256 gasPriceL1,
                bytes32 messageDataHash
            ) internal pure returns (bytes32) {
                return
                    keccak256(
                        abi.encodePacked(
                            kind,
                            sender,
                            blockNumber,
                            timestamp,
                            inboxSeqNum,
                            gasPriceL1,
                            messageDataHash
                        )
                    );
            }
            function addMessageToInbox(bytes32 inbox, bytes32 message) internal pure returns (bytes32) {
                return keccak256(abi.encodePacked(inbox, message));
            }
        }
        // SPDX-License-Identifier: Apache-2.0
        /*
         * Copyright 2019-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;
        library Value {
            uint8 internal constant INT_TYPECODE = 0;
            uint8 internal constant CODE_POINT_TYPECODE = 1;
            uint8 internal constant HASH_PRE_IMAGE_TYPECODE = 2;
            uint8 internal constant TUPLE_TYPECODE = 3;
            uint8 internal constant BUFFER_TYPECODE = TUPLE_TYPECODE + 9;
            // All values received from clients will have type codes less than the VALUE_TYPE_COUNT
            uint8 internal constant VALUE_TYPE_COUNT = TUPLE_TYPECODE + 10;
            // The following types do not show up in the marshalled format and is
            // only used for internal tracking purposes
            uint8 internal constant HASH_ONLY = 100;
            struct CodePoint {
                uint8 opcode;
                bytes32 nextCodePoint;
                Data[] immediate;
            }
            struct Data {
                uint256 intVal;
                CodePoint cpVal;
                Data[] tupleVal;
                bytes32 bufferHash;
                uint8 typeCode;
                uint256 size;
            }
            function tupleTypeCode() internal pure returns (uint8) {
                return TUPLE_TYPECODE;
            }
            function tuplePreImageTypeCode() internal pure returns (uint8) {
                return HASH_PRE_IMAGE_TYPECODE;
            }
            function intTypeCode() internal pure returns (uint8) {
                return INT_TYPECODE;
            }
            function bufferTypeCode() internal pure returns (uint8) {
                return BUFFER_TYPECODE;
            }
            function codePointTypeCode() internal pure returns (uint8) {
                return CODE_POINT_TYPECODE;
            }
            function valueTypeCode() internal pure returns (uint8) {
                return VALUE_TYPE_COUNT;
            }
            function hashOnlyTypeCode() internal pure returns (uint8) {
                return HASH_ONLY;
            }
            function isValidTupleSize(uint256 size) internal pure returns (bool) {
                return size <= 8;
            }
            function typeCodeVal(Data memory val) internal pure returns (Data memory) {
                if (val.typeCode == 2) {
                    // Map HashPreImage to Tuple
                    return newInt(TUPLE_TYPECODE);
                }
                return newInt(val.typeCode);
            }
            function valLength(Data memory val) internal pure returns (uint8) {
                if (val.typeCode == TUPLE_TYPECODE) {
                    return uint8(val.tupleVal.length);
                } else {
                    return 1;
                }
            }
            function isInt(Data memory val) internal pure returns (bool) {
                return val.typeCode == INT_TYPECODE;
            }
            function isInt64(Data memory val) internal pure returns (bool) {
                return val.typeCode == INT_TYPECODE && val.intVal < (1 << 64);
            }
            function isCodePoint(Data memory val) internal pure returns (bool) {
                return val.typeCode == CODE_POINT_TYPECODE;
            }
            function isTuple(Data memory val) internal pure returns (bool) {
                return val.typeCode == TUPLE_TYPECODE;
            }
            function isBuffer(Data memory val) internal pure returns (bool) {
                return val.typeCode == BUFFER_TYPECODE;
            }
            function newEmptyTuple() internal pure returns (Data memory) {
                return newTuple(new Data[](0));
            }
            function newBoolean(bool val) internal pure returns (Data memory) {
                if (val) {
                    return newInt(1);
                } else {
                    return newInt(0);
                }
            }
            function newInt(uint256 _val) internal pure returns (Data memory) {
                return
                    Data(_val, CodePoint(0, 0, new Data[](0)), new Data[](0), 0, INT_TYPECODE, uint256(1));
            }
            function newHashedValue(bytes32 valueHash, uint256 valueSize)
                internal
                pure
                returns (Data memory)
            {
                return
                    Data(
                        uint256(valueHash),
                        CodePoint(0, 0, new Data[](0)),
                        new Data[](0),
                        0,
                        HASH_ONLY,
                        valueSize
                    );
            }
            function newTuple(Data[] memory _val) internal pure returns (Data memory) {
                require(isValidTupleSize(_val.length), "Tuple must have valid size");
                uint256 size = 1;
                for (uint256 i = 0; i < _val.length; i++) {
                    size += _val[i].size;
                }
                return Data(0, CodePoint(0, 0, new Data[](0)), _val, 0, TUPLE_TYPECODE, size);
            }
            function newTuplePreImage(bytes32 preImageHash, uint256 size)
                internal
                pure
                returns (Data memory)
            {
                return
                    Data(
                        uint256(preImageHash),
                        CodePoint(0, 0, new Data[](0)),
                        new Data[](0),
                        0,
                        HASH_PRE_IMAGE_TYPECODE,
                        size
                    );
            }
            function newCodePoint(uint8 opCode, bytes32 nextHash) internal pure returns (Data memory) {
                return newCodePoint(CodePoint(opCode, nextHash, new Data[](0)));
            }
            function newCodePoint(
                uint8 opCode,
                bytes32 nextHash,
                Data memory immediate
            ) internal pure returns (Data memory) {
                Data[] memory imm = new Data[](1);
                imm[0] = immediate;
                return newCodePoint(CodePoint(opCode, nextHash, imm));
            }
            function newCodePoint(CodePoint memory _val) private pure returns (Data memory) {
                return Data(0, _val, new Data[](0), 0, CODE_POINT_TYPECODE, uint256(1));
            }
            function newBuffer(bytes32 bufHash) internal pure returns (Data memory) {
                return
                    Data(
                        uint256(0),
                        CodePoint(0, 0, new Data[](0)),
                        new Data[](0),
                        bufHash,
                        BUFFER_TYPECODE,
                        uint256(1)
                    );
            }
        }
        // SPDX-License-Identifier: Apache-2.0
        /*
         * Copyright 2019-2020, 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;
        import "./Value.sol";
        library Hashing {
            using Hashing for Value.Data;
            using Value for Value.CodePoint;
            function keccak1(bytes32 b) internal pure returns (bytes32) {
                return keccak256(abi.encodePacked(b));
            }
            function keccak2(bytes32 a, bytes32 b) internal pure returns (bytes32) {
                return keccak256(abi.encodePacked(a, b));
            }
            function bytes32FromArray(
                bytes memory arr,
                uint256 offset,
                uint256 arrLength
            ) internal pure returns (uint256) {
                uint256 res = 0;
                for (uint256 i = 0; i < 32; i++) {
                    res = res << 8;
                    bytes1 b = arrLength > offset + i ? arr[offset + i] : bytes1(0);
                    res = res | uint256(uint8(b));
                }
                return res;
            }
            /*
             * !! Note that dataLength must be a power of two !!
             *
             * If you have an arbitrary data length, you can round it up with roundUpToPow2.
             * The boolean return value tells if the data segment data[startOffset..startOffset+dataLength] only included zeroes.
             * If pack is true, the returned value is the merkle hash where trailing zeroes are ignored, that is,
             *   if h is the smallest height for which all data[startOffset+2**h..] are zero, merkle hash of data[startOffset..startOffset+2**h] is returned.
             * If all elements in the data segment are zero (and pack is true), keccak1(bytes32(0)) is returned.
             */
            function merkleRoot(
                bytes memory data,
                uint256 rawDataLength,
                uint256 startOffset,
                uint256 dataLength,
                bool pack
            ) internal pure returns (bytes32, bool) {
                if (dataLength <= 32) {
                    if (startOffset >= rawDataLength) {
                        return (keccak1(bytes32(0)), true);
                    }
                    bytes32 res = keccak1(bytes32(bytes32FromArray(data, startOffset, rawDataLength)));
                    return (res, res == keccak1(bytes32(0)));
                }
                (bytes32 h2, bool zero2) =
                    merkleRoot(data, rawDataLength, startOffset + dataLength / 2, dataLength / 2, false);
                if (zero2 && pack) {
                    return merkleRoot(data, rawDataLength, startOffset, dataLength / 2, pack);
                }
                (bytes32 h1, bool zero1) =
                    merkleRoot(data, rawDataLength, startOffset, dataLength / 2, false);
                return (keccak2(h1, h2), zero1 && zero2);
            }
            function roundUpToPow2(uint256 len) internal pure returns (uint256) {
                if (len <= 1) return 1;
                else return 2 * roundUpToPow2((len + 1) / 2);
            }
            function bytesToBufferHash(
                bytes memory buf,
                uint256 startOffset,
                uint256 length
            ) internal pure returns (bytes32) {
                (bytes32 mhash, ) =
                    merkleRoot(buf, startOffset + length, startOffset, roundUpToPow2(length), true);
                return keccak2(bytes32(uint256(123)), mhash);
            }
            function hashInt(uint256 val) internal pure returns (bytes32) {
                return keccak256(abi.encodePacked(val));
            }
            function hashCodePoint(Value.CodePoint memory cp) internal pure returns (bytes32) {
                assert(cp.immediate.length < 2);
                if (cp.immediate.length == 0) {
                    return
                        keccak256(abi.encodePacked(Value.codePointTypeCode(), cp.opcode, cp.nextCodePoint));
                }
                return
                    keccak256(
                        abi.encodePacked(
                            Value.codePointTypeCode(),
                            cp.opcode,
                            cp.immediate[0].hash(),
                            cp.nextCodePoint
                        )
                    );
            }
            function hashTuplePreImage(bytes32 innerHash, uint256 valueSize)
                internal
                pure
                returns (bytes32)
            {
                return keccak256(abi.encodePacked(uint8(Value.tupleTypeCode()), innerHash, valueSize));
            }
            function hash(Value.Data memory val) internal pure returns (bytes32) {
                if (val.typeCode == Value.intTypeCode()) {
                    return hashInt(val.intVal);
                } else if (val.typeCode == Value.codePointTypeCode()) {
                    return hashCodePoint(val.cpVal);
                } else if (val.typeCode == Value.tuplePreImageTypeCode()) {
                    return hashTuplePreImage(bytes32(val.intVal), val.size);
                } else if (val.typeCode == Value.tupleTypeCode()) {
                    Value.Data memory preImage = getTuplePreImage(val.tupleVal);
                    return preImage.hash();
                } else if (val.typeCode == Value.hashOnlyTypeCode()) {
                    return bytes32(val.intVal);
                } else if (val.typeCode == Value.bufferTypeCode()) {
                    return keccak256(abi.encodePacked(uint256(123), val.bufferHash));
                } else {
                    require(false, "Invalid type code");
                }
            }
            function getTuplePreImage(Value.Data[] memory vals) internal pure returns (Value.Data memory) {
                require(vals.length <= 8, "Invalid tuple length");
                bytes32[] memory hashes = new bytes32[](vals.length);
                uint256 hashCount = hashes.length;
                uint256 size = 1;
                for (uint256 i = 0; i < hashCount; i++) {
                    hashes[i] = vals[i].hash();
                    size += vals[i].size;
                }
                bytes32 firstHash = keccak256(abi.encodePacked(uint8(hashes.length), hashes));
                return Value.newTuplePreImage(firstHash, size);
            }
        }
        // SPDX-License-Identifier: MIT
        /*
         * @title Solidity Bytes Arrays Utils
         * @author Gonçalo Sá <goncalo.sa@consensys.net>
         *
         * @dev Bytes tightly packed arrays utility library for ethereum contracts written in Solidity.
         *      The library lets you concatenate, slice and type cast bytes arrays both in memory and storage.
         */
        pragma solidity ^0.6.11;
        /* solhint-disable no-inline-assembly */
        library BytesLib {
            function toAddress(bytes memory _bytes, uint256 _start) internal pure returns (address) {
                require(_bytes.length >= (_start + 20), "Read out of bounds");
                address tempAddress;
                assembly {
                    tempAddress := div(mload(add(add(_bytes, 0x20), _start)), 0x1000000000000000000000000)
                }
                return tempAddress;
            }
            function toUint8(bytes memory _bytes, uint256 _start) internal pure returns (uint8) {
                require(_bytes.length >= (_start + 1), "Read out of bounds");
                uint8 tempUint;
                assembly {
                    tempUint := mload(add(add(_bytes, 0x1), _start))
                }
                return tempUint;
            }
            function toUint(bytes memory _bytes, uint256 _start) internal pure returns (uint256) {
                require(_bytes.length >= (_start + 32), "Read out of bounds");
                uint256 tempUint;
                assembly {
                    tempUint := mload(add(add(_bytes, 0x20), _start))
                }
                return tempUint;
            }
            function toBytes32(bytes memory _bytes, uint256 _start) internal pure returns (bytes32) {
                require(_bytes.length >= (_start + 32), "Read out of bounds");
                bytes32 tempBytes32;
                assembly {
                    tempBytes32 := mload(add(add(_bytes, 0x20), _start))
                }
                return tempBytes32;
            }
        }
        /* solhint-enable no-inline-assembly */
        // SPDX-License-Identifier: Apache-2.0
        /*
         * Copyright 2019, 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;
        interface ICloneable {
            function isMaster() external view returns (bool);
        }
        // SPDX-License-Identifier: MIT
        pragma solidity >=0.6.0 <0.8.0;
        import "./Context.sol";
        /**
         * @dev Contract module which allows children to implement an emergency stop
         * mechanism that can be triggered by an authorized account.
         *
         * This module is used through inheritance. It will make available the
         * modifiers `whenNotPaused` and `whenPaused`, which can be applied to
         * the functions of your contract. Note that they will not be pausable by
         * simply including this module, only once the modifiers are put in place.
         */
        abstract contract Pausable is Context {
            /**
             * @dev Emitted when the pause is triggered by `account`.
             */
            event Paused(address account);
            /**
             * @dev Emitted when the pause is lifted by `account`.
             */
            event Unpaused(address account);
            bool private _paused;
            /**
             * @dev Initializes the contract in unpaused state.
             */
            constructor () internal {
                _paused = false;
            }
            /**
             * @dev Returns true if the contract is paused, and false otherwise.
             */
            function paused() public view virtual returns (bool) {
                return _paused;
            }
            /**
             * @dev Modifier to make a function callable only when the contract is not paused.
             *
             * Requirements:
             *
             * - The contract must not be paused.
             */
            modifier whenNotPaused() {
                require(!paused(), "Pausable: paused");
                _;
            }
            /**
             * @dev Modifier to make a function callable only when the contract is paused.
             *
             * Requirements:
             *
             * - The contract must be paused.
             */
            modifier whenPaused() {
                require(paused(), "Pausable: not paused");
                _;
            }
            /**
             * @dev Triggers stopped state.
             *
             * Requirements:
             *
             * - The contract must not be paused.
             */
            function _pause() internal virtual whenNotPaused {
                _paused = true;
                emit Paused(_msgSender());
            }
            /**
             * @dev Returns to normal state.
             *
             * Requirements:
             *
             * - The contract must be paused.
             */
            function _unpause() internal virtual whenPaused {
                _paused = false;
                emit Unpaused(_msgSender());
            }
        }
        // SPDX-License-Identifier: MIT
        pragma solidity >=0.6.0 <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 internall call site, it will return directly to the external caller.
             */
            function _delegate(address implementation) internal virtual {
                // solhint-disable-next-line no-inline-assembly
                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
        pragma solidity >=0.6.2 <0.8.0;
        /**
         * @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
             * ====
             */
            function isContract(address account) internal view returns (bool) {
                // This method relies on extcodesize, which returns 0 for contracts in
                // construction, since the code is only stored at the end of the
                // constructor execution.
                uint256 size;
                // solhint-disable-next-line no-inline-assembly
                assembly { size := extcodesize(account) }
                return size > 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");
                // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
                (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");
                // solhint-disable-next-line avoid-low-level-calls
                (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");
                // solhint-disable-next-line avoid-low-level-calls
                (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");
                // solhint-disable-next-line avoid-low-level-calls
                (bool success, bytes memory returndata) = target.delegatecall(data);
                return _verifyCallResult(success, returndata, errorMessage);
            }
            function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private 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
                        // solhint-disable-next-line no-inline-assembly
                        assembly {
                            let returndata_size := mload(returndata)
                            revert(add(32, returndata), returndata_size)
                        }
                    } else {
                        revert(errorMessage);
                    }
                }
            }
        }
        // SPDX-License-Identifier: MIT
        pragma solidity >=0.6.0 <0.8.0;
        /**
         * @dev Interface of the ERC20 standard as defined in the EIP.
         */
        interface IERC20 {
            /**
             * @dev Returns the amount of tokens in existence.
             */
            function totalSupply() external view returns (uint256);
            /**
             * @dev Returns the amount of tokens owned by `account`.
             */
            function balanceOf(address account) external view returns (uint256);
            /**
             * @dev Moves `amount` tokens from the caller's account to `recipient`.
             *
             * Returns a boolean value indicating whether the operation succeeded.
             *
             * Emits a {Transfer} event.
             */
            function transfer(address recipient, uint256 amount) external returns (bool);
            /**
             * @dev Returns the remaining number of tokens that `spender` will be
             * allowed to spend on behalf of `owner` through {transferFrom}. This is
             * zero by default.
             *
             * This value changes when {approve} or {transferFrom} are called.
             */
            function allowance(address owner, address spender) external view returns (uint256);
            /**
             * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
             *
             * Returns a boolean value indicating whether the operation succeeded.
             *
             * IMPORTANT: Beware that changing an allowance with this method brings the risk
             * that someone may use both the old and the new allowance by unfortunate
             * transaction ordering. One possible solution to mitigate this race
             * condition is to first reduce the spender's allowance to 0 and set the
             * desired value afterwards:
             * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
             *
             * Emits an {Approval} event.
             */
            function approve(address spender, uint256 amount) external returns (bool);
            /**
             * @dev Moves `amount` tokens from `sender` to `recipient` using the
             * allowance mechanism. `amount` is then deducted from the caller's
             * allowance.
             *
             * Returns a boolean value indicating whether the operation succeeded.
             *
             * Emits a {Transfer} event.
             */
            function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
            /**
             * @dev Emitted when `value` tokens are moved from one account (`from`) to
             * another (`to`).
             *
             * Note that `value` may be zero.
             */
            event Transfer(address indexed from, address indexed to, uint256 value);
            /**
             * @dev Emitted when the allowance of a `spender` for an `owner` is set by
             * a call to {approve}. `value` is the new allowance.
             */
            event Approval(address indexed owner, address indexed spender, uint256 value);
        }
        // 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;
        import "./Rollup.sol";
        import "./facets/IRollupFacets.sol";
        import "../bridge/interfaces/IBridge.sol";
        import "../bridge/interfaces/IMessageProvider.sol";
        import "./INode.sol";
        import "../libraries/Cloneable.sol";
        contract RollupEventBridge is IMessageProvider, Cloneable {
            uint8 internal constant INITIALIZATION_MSG_TYPE = 11;
            uint8 internal constant ROLLUP_PROTOCOL_EVENT_TYPE = 8;
            uint8 internal constant CREATE_NODE_EVENT = 0;
            uint8 internal constant CONFIRM_NODE_EVENT = 1;
            uint8 internal constant REJECT_NODE_EVENT = 2;
            uint8 internal constant STAKE_CREATED_EVENT = 3;
            IBridge bridge;
            address rollup;
            modifier onlyRollup() {
                require(msg.sender == rollup, "ONLY_ROLLUP");
                _;
            }
            function initialize(address _bridge, address _rollup) external {
                require(rollup == address(0), "ALREADY_INIT");
                bridge = IBridge(_bridge);
                rollup = _rollup;
            }
            function rollupInitialized(
                uint256 confirmPeriodBlocks,
                uint256 avmGasSpeedLimitPerBlock,
                address owner,
                bytes calldata extraConfig
            ) external onlyRollup {
                bytes memory initMsg = abi.encodePacked(
                    keccak256("ChallengePeriodEthBlocks"),
                    confirmPeriodBlocks,
                    keccak256("SpeedLimitPerSecond"),
                    avmGasSpeedLimitPerBlock / 100, // convert avm gas to arbgas
                    keccak256("ChainOwner"),
                    uint256(uint160(bytes20(owner))),
                    extraConfig
                );
                uint256 num = bridge.deliverMessageToInbox(
                    INITIALIZATION_MSG_TYPE,
                    address(0),
                    keccak256(initMsg)
                );
                emit InboxMessageDelivered(num, initMsg);
            }
            function nodeCreated(
                uint256 nodeNum,
                uint256 prev,
                uint256 deadline,
                address asserter
            ) external onlyRollup {
                deliverToBridge(
                    abi.encodePacked(
                        CREATE_NODE_EVENT,
                        nodeNum,
                        prev,
                        block.number,
                        deadline,
                        uint256(uint160(bytes20(asserter)))
                    )
                );
            }
            function nodeConfirmed(uint256 nodeNum) external onlyRollup {
                deliverToBridge(abi.encodePacked(CONFIRM_NODE_EVENT, nodeNum));
            }
            function nodeRejected(uint256 nodeNum) external onlyRollup {
                deliverToBridge(abi.encodePacked(REJECT_NODE_EVENT, nodeNum));
            }
            function stakeCreated(address staker, uint256 nodeNum) external onlyRollup {
                deliverToBridge(
                    abi.encodePacked(
                        STAKE_CREATED_EVENT,
                        uint256(uint160(bytes20(staker))),
                        nodeNum,
                        block.number
                    )
                );
            }
            function deliverToBridge(bytes memory message) private {
                emit InboxMessageDelivered(
                    bridge.deliverMessageToInbox(
                        ROLLUP_PROTOCOL_EVENT_TYPE,
                        msg.sender,
                        keccak256(message)
                    ),
                    message
                );
            }
        }
        // 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;
        import "./INode.sol";
        import "./IRollupCore.sol";
        import "./RollupLib.sol";
        import "./INodeFactory.sol";
        import "./RollupEventBridge.sol";
        import "../bridge/interfaces/ISequencerInbox.sol";
        import "@openzeppelin/contracts/math/SafeMath.sol";
        contract RollupCore is IRollupCore {
            using SafeMath for uint256;
            // Stakers become Zombies after losing a challenge
            struct Zombie {
                address stakerAddress;
                uint256 latestStakedNode;
            }
            struct Staker {
                uint256 index;
                uint256 latestStakedNode;
                uint256 amountStaked;
                // currentChallenge is 0 if staker is not in a challenge
                address currentChallenge;
                bool isStaked;
            }
            uint256 private _latestConfirmed;
            uint256 private _firstUnresolvedNode;
            uint256 private _latestNodeCreated;
            uint256 private _lastStakeBlock;
            mapping(uint256 => INode) private _nodes;
            mapping(uint256 => bytes32) private _nodeHashes;
            address payable[] private _stakerList;
            mapping(address => Staker) public override _stakerMap;
            Zombie[] private _zombies;
            mapping(address => uint256) private _withdrawableFunds;
            /**
             * @notice Get the address of the Node contract for the given node
             * @param nodeNum Index of the node
             * @return Address of the Node contract
             */
            function getNode(uint256 nodeNum) public view override returns (INode) {
                return _nodes[nodeNum];
            }
            /**
             * @notice Get the address of the staker at the given index
             * @param stakerNum Index of the staker
             * @return Address of the staker
             */
            function getStakerAddress(uint256 stakerNum) external view override returns (address) {
                return _stakerList[stakerNum];
            }
            /**
             * @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) public view override returns (bool) {
                return _stakerMap[staker].isStaked;
            }
            /**
             * @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) public view override returns (uint256) {
                return _stakerMap[staker].latestStakedNode;
            }
            /**
             * @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) public view override returns (address) {
                return _stakerMap[staker].currentChallenge;
            }
            /**
             * @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) public view override returns (uint256) {
                return _stakerMap[staker].amountStaked;
            }
            /**
             * @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) public view override returns (address) {
                return _zombies[zombieNum].stakerAddress;
            }
            /**
             * @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) public view override returns (uint256) {
                return _zombies[zombieNum].latestStakedNode;
            }
            /// @return Current number of un-removed zombies
            function zombieCount() public view override returns (uint256) {
                return _zombies.length;
            }
            function isZombie(address staker) public view override returns (bool) {
                for (uint256 i = 0; i < _zombies.length; i++) {
                    if (staker == _zombies[i].stakerAddress) {
                        return true;
                    }
                }
                return false;
            }
            /**
             * @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 override returns (uint256) {
                return _withdrawableFunds[owner];
            }
            /**
             * @return Index of the first unresolved node
             * @dev If all nodes have been resolved, this will be latestNodeCreated + 1
             */
            function firstUnresolvedNode() public view override returns (uint256) {
                return _firstUnresolvedNode;
            }
            /// @return Index of the latest confirmed node
            function latestConfirmed() public view override returns (uint256) {
                return _latestConfirmed;
            }
            /// @return Index of the latest rollup node created
            function latestNodeCreated() public view override returns (uint256) {
                return _latestNodeCreated;
            }
            /// @return Ethereum block that the most recent stake was created
            function lastStakeBlock() external view override returns (uint256) {
                return _lastStakeBlock;
            }
            /// @return Number of active stakers currently staked
            function stakerCount() public view override returns (uint256) {
                return _stakerList.length;
            }
            /**
             * @notice Initialize the core with an initial node
             * @param initialNode Initial node to start the chain with
             */
            function initializeCore(INode initialNode) internal {
                _nodes[0] = initialNode;
                _firstUnresolvedNode = 1;
            }
            /**
             * @notice React to a new node being created by storing it an incrementing the latest node counter
             * @param node Node that was newly created
             * @param nodeHash The hash of said node
             */
            function nodeCreated(INode node, bytes32 nodeHash) internal {
                _latestNodeCreated++;
                _nodes[_latestNodeCreated] = node;
                _nodeHashes[_latestNodeCreated] = nodeHash;
            }
            /// @return Node hash as of this node number
            function getNodeHash(uint256 index) public view override returns (bytes32) {
                return _nodeHashes[index];
            }
            /// @notice Reject the next unresolved node
            function _rejectNextNode() internal {
                destroyNode(_firstUnresolvedNode);
                _firstUnresolvedNode++;
            }
            /// @notice Confirm the next unresolved node
            function confirmNextNode(
                bytes32 beforeSendAcc,
                bytes calldata sendsData,
                uint256[] calldata sendLengths,
                uint256 afterSendCount,
                bytes32 afterLogAcc,
                uint256 afterLogCount,
                IOutbox outbox,
                RollupEventBridge rollupEventBridge
            ) internal {
                confirmNode(
                    _firstUnresolvedNode,
                    beforeSendAcc,
                    sendsData,
                    sendLengths,
                    afterSendCount,
                    afterLogAcc,
                    afterLogCount,
                    outbox,
                    rollupEventBridge
                );
            }
            function confirmNode(
                uint256 nodeNum,
                bytes32 beforeSendAcc,
                bytes calldata sendsData,
                uint256[] calldata sendLengths,
                uint256 afterSendCount,
                bytes32 afterLogAcc,
                uint256 afterLogCount,
                IOutbox outbox,
                RollupEventBridge rollupEventBridge
            ) internal {
                bytes32 afterSendAcc = RollupLib.feedAccumulator(sendsData, sendLengths, beforeSendAcc);
                INode node = getNode(nodeNum);
                // Authenticate data against node's confirm data pre-image
                require(
                    node.confirmData() ==
                        RollupLib.confirmHash(
                            beforeSendAcc,
                            afterSendAcc,
                            afterLogAcc,
                            afterSendCount,
                            afterLogCount
                        ),
                    "CONFIRM_DATA"
                );
                // trusted external call to outbox
                outbox.processOutgoingMessages(sendsData, sendLengths);
                destroyNode(_latestConfirmed);
                _latestConfirmed = nodeNum;
                _firstUnresolvedNode = nodeNum + 1;
                rollupEventBridge.nodeConfirmed(nodeNum);
                emit NodeConfirmed(nodeNum, afterSendAcc, afterSendCount, afterLogAcc, afterLogCount);
            }
            /**
             * @notice Create a new stake at latest confirmed node
             * @param stakerAddress Address of the new staker
             * @param depositAmount Stake amount of the new staker
             */
            function createNewStake(address payable stakerAddress, uint256 depositAmount) internal {
                uint256 stakerIndex = _stakerList.length;
                _stakerList.push(stakerAddress);
                _stakerMap[stakerAddress] = Staker(
                    stakerIndex,
                    _latestConfirmed,
                    depositAmount,
                    address(0), // new staker is not in challenge
                    true
                );
                _lastStakeBlock = block.number;
                emit UserStakeUpdated(stakerAddress, 0, depositAmount);
            }
            /**
             * @notice Check to see whether the two stakers are in the same challenge
             * @param stakerAddress1 Address of the first staker
             * @param stakerAddress2 Address of the second staker
             * @return Address of the challenge that the two stakers are in
             */
            function inChallenge(address stakerAddress1, address stakerAddress2)
                internal
                view
                returns (address)
            {
                Staker storage staker1 = _stakerMap[stakerAddress1];
                Staker storage staker2 = _stakerMap[stakerAddress2];
                address challenge = staker1.currentChallenge;
                require(challenge != address(0), "NO_CHAL");
                require(challenge == staker2.currentChallenge, "DIFF_IN_CHAL");
                return challenge;
            }
            /**
             * @notice Make the given staker as not being in a challenge
             * @param stakerAddress Address of the staker to remove from a challenge
             */
            function clearChallenge(address stakerAddress) internal {
                Staker storage staker = _stakerMap[stakerAddress];
                staker.currentChallenge = address(0);
            }
            /**
             * @notice Mark both the given stakers as engaged in the challenge
             * @param staker1 Address of the first staker
             * @param staker2 Address of the second staker
             * @param challenge Address of the challenge both stakers are now in
             */
            function challengeStarted(
                address staker1,
                address staker2,
                address challenge
            ) internal {
                _stakerMap[staker1].currentChallenge = challenge;
                _stakerMap[staker2].currentChallenge = challenge;
            }
            /**
             * @notice Add to the stake of the given staker by the given amount
             * @param stakerAddress Address of the staker to increase the stake of
             * @param amountAdded Amount of stake to add to the staker
             */
            function increaseStakeBy(address stakerAddress, uint256 amountAdded) internal {
                Staker storage staker = _stakerMap[stakerAddress];
                uint256 initialStaked = staker.amountStaked;
                uint256 finalStaked = initialStaked.add(amountAdded);
                staker.amountStaked = finalStaked;
                emit UserStakeUpdated(stakerAddress, initialStaked, finalStaked);
            }
            /**
             * @notice Reduce the stake of the given staker to the given target
             * @param stakerAddress Address of the staker to reduce the stake of
             * @param target Amount of stake to leave with the staker
             * @return Amount of value released from the stake
             */
            function reduceStakeTo(address stakerAddress, uint256 target) internal returns (uint256) {
                Staker storage staker = _stakerMap[stakerAddress];
                uint256 current = staker.amountStaked;
                require(target <= current, "TOO_LITTLE_STAKE");
                uint256 amountWithdrawn = current.sub(target);
                staker.amountStaked = target;
                increaseWithdrawableFunds(stakerAddress, amountWithdrawn);
                emit UserStakeUpdated(stakerAddress, current, target);
                return amountWithdrawn;
            }
            /**
             * @notice Remove the given staker and turn them into a zombie
             * @param stakerAddress Address of the staker to remove
             */
            function turnIntoZombie(address stakerAddress) internal {
                Staker storage staker = _stakerMap[stakerAddress];
                _zombies.push(Zombie(stakerAddress, staker.latestStakedNode));
                deleteStaker(stakerAddress);
            }
            /**
             * @notice Update the latest staked node of the zombie at the given index
             * @param zombieNum Index of the zombie to move
             * @param latest New latest node the zombie is staked on
             */
            function zombieUpdateLatestStakedNode(uint256 zombieNum, uint256 latest) internal {
                _zombies[zombieNum].latestStakedNode = latest;
            }
            /**
             * @notice Remove the zombie at the given index
             * @param zombieNum Index of the zombie to remove
             */
            function removeZombie(uint256 zombieNum) internal {
                _zombies[zombieNum] = _zombies[_zombies.length - 1];
                _zombies.pop();
            }
            /**
             * @notice Remove the given staker and return their stake
             * @param stakerAddress Address of the staker withdrawing their stake
             */
            function withdrawStaker(address stakerAddress) internal {
                Staker storage staker = _stakerMap[stakerAddress];
                uint256 initialStaked = staker.amountStaked;
                increaseWithdrawableFunds(stakerAddress, initialStaked);
                deleteStaker(stakerAddress);
                emit UserStakeUpdated(stakerAddress, initialStaked, 0);
            }
            /**
             * @notice Advance the given staker to the given node
             * @param stakerAddress Address of the staker adding their stake
             * @param nodeNum Index of the node to stake on
             */
            function stakeOnNode(
                address stakerAddress,
                uint256 nodeNum,
                uint256 confirmPeriodBlocks
            ) internal {
                Staker storage staker = _stakerMap[stakerAddress];
                INode node = _nodes[nodeNum];
                uint256 newStakerCount = node.addStaker(stakerAddress);
                staker.latestStakedNode = nodeNum;
                if (newStakerCount == 1) {
                    INode parent = _nodes[node.prev()];
                    parent.newChildConfirmDeadline(block.number.add(confirmPeriodBlocks));
                }
            }
            /**
             * @notice Clear the withdrawable funds for the given address
             * @param owner Address of the account to remove funds from
             * @return Amount of funds removed from account
             */
            function withdrawFunds(address owner) internal returns (uint256) {
                uint256 amount = _withdrawableFunds[owner];
                _withdrawableFunds[owner] = 0;
                emit UserWithdrawableFundsUpdated(owner, amount, 0);
                return amount;
            }
            /**
             * @notice Increase the withdrawable funds for the given address
             * @param owner Address of the account to add withdrawable funds to
             */
            function increaseWithdrawableFunds(address owner, uint256 amount) internal {
                uint256 initialWithdrawable = _withdrawableFunds[owner];
                uint256 finalWithdrawable = initialWithdrawable.add(amount);
                _withdrawableFunds[owner] = finalWithdrawable;
                emit UserWithdrawableFundsUpdated(owner, initialWithdrawable, finalWithdrawable);
            }
            /**
             * @notice Remove the given staker
             * @param stakerAddress Address of the staker to remove
             */
            function deleteStaker(address stakerAddress) private {
                Staker storage staker = _stakerMap[stakerAddress];
                uint256 stakerIndex = staker.index;
                _stakerList[stakerIndex] = _stakerList[_stakerList.length - 1];
                _stakerMap[_stakerList[stakerIndex]].index = stakerIndex;
                _stakerList.pop();
                delete _stakerMap[stakerAddress];
            }
            /**
             * @notice Destroy the given node and clear out its address
             * @param nodeNum Index of the node to remove
             */
            function destroyNode(uint256 nodeNum) internal {
                _nodes[nodeNum].destroy();
                _nodes[nodeNum] = INode(0);
            }
            function nodeDeadline(
                uint256 avmGasSpeedLimitPerBlock,
                uint256 gasUsed,
                uint256 confirmPeriodBlocks,
                INode prevNode
            ) internal view returns (uint256 deadlineBlock) {
                // Set deadline rounding up to the nearest block
                uint256 checkTime =
                    gasUsed.add(avmGasSpeedLimitPerBlock.sub(1)).div(avmGasSpeedLimitPerBlock);
                deadlineBlock = max(block.number.add(confirmPeriodBlocks), prevNode.deadlineBlock()).add(
                    checkTime
                );
                uint256 olderSibling = prevNode.latestChildNumber();
                if (olderSibling != 0) {
                    deadlineBlock = max(deadlineBlock, getNode(olderSibling).deadlineBlock());
                }
                return deadlineBlock;
            }
            function max(uint256 a, uint256 b) internal pure returns (uint256) {
                return a > b ? a : b;
            }
            struct StakeOnNewNodeFrame {
                uint256 currentInboxSize;
                INode node;
                bytes32 executionHash;
                INode prevNode;
                bytes32 lastHash;
                bool hasSibling;
                uint256 deadlineBlock;
                uint256 gasUsed;
                uint256 sequencerBatchEnd;
                bytes32 sequencerBatchAcc;
            }
            struct CreateNodeDataFrame {
                uint256 prevNode;
                uint256 confirmPeriodBlocks;
                uint256 avmGasSpeedLimitPerBlock;
                ISequencerInbox sequencerInbox;
                RollupEventBridge rollupEventBridge;
                INodeFactory nodeFactory;
            }
            uint8 internal constant MAX_SEND_COUNT = 100;
            function createNewNode(
                RollupLib.Assertion memory assertion,
                bytes32[3][2] calldata assertionBytes32Fields,
                uint256[4][2] calldata assertionIntFields,
                bytes calldata sequencerBatchProof,
                CreateNodeDataFrame memory inputDataFrame,
                bytes32 expectedNodeHash
            ) internal returns (bytes32 newNodeHash) {
                StakeOnNewNodeFrame memory memoryFrame;
                {
                    // validate data
                    memoryFrame.gasUsed = RollupLib.assertionGasUsed(assertion);
                    memoryFrame.prevNode = getNode(inputDataFrame.prevNode);
                    memoryFrame.currentInboxSize = inputDataFrame.sequencerInbox.messageCount();
                    // Make sure the previous state is correct against the node being built on
                    require(
                        RollupLib.stateHash(assertion.beforeState) == memoryFrame.prevNode.stateHash(),
                        "PREV_STATE_HASH"
                    );
                    // Ensure that the assertion doesn't read past the end of the current inbox
                    require(
                        assertion.afterState.inboxCount <= memoryFrame.currentInboxSize,
                        "INBOX_PAST_END"
                    );
                    // Insure inbox tip after assertion is included in a sequencer-inbox batch and return inbox acc; this gives replay protection against the state of the inbox
                    (memoryFrame.sequencerBatchEnd, memoryFrame.sequencerBatchAcc) = inputDataFrame
                        .sequencerInbox
                        .proveInboxContainsMessage(sequencerBatchProof, assertion.afterState.inboxCount);
                }
                {
                    memoryFrame.executionHash = RollupLib.executionHash(assertion);
                    memoryFrame.deadlineBlock = nodeDeadline(
                        inputDataFrame.avmGasSpeedLimitPerBlock,
                        memoryFrame.gasUsed,
                        inputDataFrame.confirmPeriodBlocks,
                        memoryFrame.prevNode
                    );
                    memoryFrame.hasSibling = memoryFrame.prevNode.latestChildNumber() > 0;
                    // here we don't use ternacy operator to remain compatible with slither
                    if (memoryFrame.hasSibling) {
                        memoryFrame.lastHash = getNodeHash(memoryFrame.prevNode.latestChildNumber());
                    } else {
                        memoryFrame.lastHash = getNodeHash(inputDataFrame.prevNode);
                    }
                    memoryFrame.node = INode(
                        inputDataFrame.nodeFactory.createNode(
                            RollupLib.stateHash(assertion.afterState),
                            RollupLib.challengeRoot(assertion, memoryFrame.executionHash, block.number),
                            RollupLib.confirmHash(assertion),
                            inputDataFrame.prevNode,
                            memoryFrame.deadlineBlock
                        )
                    );
                }
                {
                    uint256 nodeNum = latestNodeCreated() + 1;
                    memoryFrame.prevNode.childCreated(nodeNum);
                    newNodeHash = RollupLib.nodeHash(
                        memoryFrame.hasSibling,
                        memoryFrame.lastHash,
                        memoryFrame.executionHash,
                        memoryFrame.sequencerBatchAcc
                    );
                    require(newNodeHash == expectedNodeHash, "UNEXPECTED_NODE_HASH");
                    nodeCreated(memoryFrame.node, newNodeHash);
                    inputDataFrame.rollupEventBridge.nodeCreated(
                        nodeNum,
                        inputDataFrame.prevNode,
                        memoryFrame.deadlineBlock,
                        msg.sender
                    );
                }
                emit NodeCreated(
                    latestNodeCreated(),
                    getNodeHash(inputDataFrame.prevNode),
                    newNodeHash,
                    memoryFrame.executionHash,
                    memoryFrame.currentInboxSize,
                    memoryFrame.sequencerBatchEnd,
                    memoryFrame.sequencerBatchAcc,
                    assertionBytes32Fields,
                    assertionIntFields
                );
                return newNodeHash;
            }
        }
        // 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;
        import "../challenge/ChallengeLib.sol";
        import "./INode.sol";
        import "@openzeppelin/contracts/math/SafeMath.sol";
        library RollupLib {
            using SafeMath for uint256;
            struct Config {
                bytes32 machineHash;
                uint256 confirmPeriodBlocks;
                uint256 extraChallengeTimeBlocks;
                uint256 avmGasSpeedLimitPerBlock;
                uint256 baseStake;
                address stakeToken;
                address owner;
                address sequencer;
                uint256 sequencerDelayBlocks;
                uint256 sequencerDelaySeconds;
                bytes extraConfig;
            }
            struct ExecutionState {
                uint256 gasUsed;
                bytes32 machineHash;
                uint256 inboxCount;
                uint256 sendCount;
                uint256 logCount;
                bytes32 sendAcc;
                bytes32 logAcc;
                uint256 proposedBlock;
                uint256 inboxMaxCount;
            }
            function stateHash(ExecutionState memory execState) internal pure returns (bytes32) {
                return
                    keccak256(
                        abi.encodePacked(
                            execState.gasUsed,
                            execState.machineHash,
                            execState.inboxCount,
                            execState.sendCount,
                            execState.logCount,
                            execState.sendAcc,
                            execState.logAcc,
                            execState.proposedBlock,
                            execState.inboxMaxCount
                        )
                    );
            }
            struct Assertion {
                ExecutionState beforeState;
                ExecutionState afterState;
            }
            function decodeExecutionState(
                bytes32[3] memory bytes32Fields,
                uint256[4] memory intFields,
                uint256 proposedBlock,
                uint256 inboxMaxCount
            ) internal pure returns (ExecutionState memory) {
                return
                    ExecutionState(
                        intFields[0],
                        bytes32Fields[0],
                        intFields[1],
                        intFields[2],
                        intFields[3],
                        bytes32Fields[1],
                        bytes32Fields[2],
                        proposedBlock,
                        inboxMaxCount
                    );
            }
            function decodeAssertion(
                bytes32[3][2] memory bytes32Fields,
                uint256[4][2] memory intFields,
                uint256 beforeProposedBlock,
                uint256 beforeInboxMaxCount,
                uint256 inboxMaxCount
            ) internal view returns (Assertion memory) {
                return
                    Assertion(
                        decodeExecutionState(
                            bytes32Fields[0],
                            intFields[0],
                            beforeProposedBlock,
                            beforeInboxMaxCount
                        ),
                        decodeExecutionState(bytes32Fields[1], intFields[1], block.number, inboxMaxCount)
                    );
            }
            function executionStateChallengeHash(ExecutionState memory state)
                internal
                pure
                returns (bytes32)
            {
                return
                    ChallengeLib.assertionHash(
                        state.gasUsed,
                        ChallengeLib.assertionRestHash(
                            state.inboxCount,
                            state.machineHash,
                            state.sendAcc,
                            state.sendCount,
                            state.logAcc,
                            state.logCount
                        )
                    );
            }
            function executionHash(Assertion memory assertion) internal pure returns (bytes32) {
                return
                    ChallengeLib.bisectionChunkHash(
                        assertion.beforeState.gasUsed,
                        assertion.afterState.gasUsed - assertion.beforeState.gasUsed,
                        RollupLib.executionStateChallengeHash(assertion.beforeState),
                        RollupLib.executionStateChallengeHash(assertion.afterState)
                    );
            }
            function assertionGasUsed(RollupLib.Assertion memory assertion)
                internal
                pure
                returns (uint256)
            {
                return assertion.afterState.gasUsed.sub(assertion.beforeState.gasUsed);
            }
            function challengeRoot(
                Assertion memory assertion,
                bytes32 assertionExecHash,
                uint256 blockProposed
            ) internal pure returns (bytes32) {
                return challengeRootHash(assertionExecHash, blockProposed, assertion.afterState.inboxCount);
            }
            function challengeRootHash(
                bytes32 execution,
                uint256 proposedTime,
                uint256 maxMessageCount
            ) internal pure returns (bytes32) {
                return keccak256(abi.encodePacked(execution, proposedTime, maxMessageCount));
            }
            function confirmHash(Assertion memory assertion) internal pure returns (bytes32) {
                return
                    confirmHash(
                        assertion.beforeState.sendAcc,
                        assertion.afterState.sendAcc,
                        assertion.afterState.logAcc,
                        assertion.afterState.sendCount,
                        assertion.afterState.logCount
                    );
            }
            function confirmHash(
                bytes32 beforeSendAcc,
                bytes32 afterSendAcc,
                bytes32 afterLogAcc,
                uint256 afterSendCount,
                uint256 afterLogCount
            ) internal pure returns (bytes32) {
                return
                    keccak256(
                        abi.encodePacked(
                            beforeSendAcc,
                            afterSendAcc,
                            afterSendCount,
                            afterLogAcc,
                            afterLogCount
                        )
                    );
            }
            function feedAccumulator(
                bytes memory messageData,
                uint256[] memory messageLengths,
                bytes32 beforeAcc
            ) internal pure returns (bytes32) {
                uint256 offset = 0;
                uint256 messageCount = messageLengths.length;
                uint256 dataLength = messageData.length;
                bytes32 messageAcc = beforeAcc;
                for (uint256 i = 0; i < messageCount; i++) {
                    uint256 messageLength = messageLengths[i];
                    require(offset + messageLength <= dataLength, "DATA_OVERRUN");
                    bytes32 messageHash;
                    assembly {
                        messageHash := keccak256(add(messageData, add(offset, 32)), messageLength)
                    }
                    messageAcc = keccak256(abi.encodePacked(messageAcc, messageHash));
                    offset += messageLength;
                }
                require(offset == dataLength, "DATA_LENGTH");
                return messageAcc;
            }
            function nodeHash(
                bool hasSibling,
                bytes32 lastHash,
                bytes32 assertionExecHash,
                bytes32 inboxAcc
            ) internal pure returns (bytes32) {
                uint8 hasSiblingInt = hasSibling ? 1 : 0;
                return keccak256(abi.encodePacked(hasSiblingInt, lastHash, assertionExecHash, inboxAcc));
            }
        }
        // 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;
        interface INode {
            function initialize(
                address _rollup,
                bytes32 _stateHash,
                bytes32 _challengeHash,
                bytes32 _confirmData,
                uint256 _prev,
                uint256 _deadlineBlock
            ) external;
            function destroy() external;
            function addStaker(address staker) external returns (uint256);
            function removeStaker(address staker) external;
            function childCreated(uint256) external;
            function newChildConfirmDeadline(uint256 deadline) external;
            function stateHash() external view returns (bytes32);
            function challengeHash() external view returns (bytes32);
            function confirmData() external view returns (bytes32);
            function prev() external view returns (uint256);
            function deadlineBlock() external view returns (uint256);
            function noChildConfirmedBeforeBlock() external view returns (uint256);
            function stakerCount() external view returns (uint256);
            function stakers(address staker) external view returns (bool);
            function firstChildBlock() external view returns (uint256);
            function latestChildNumber() external view returns (uint256);
            function requirePastDeadline() external view;
            function requirePastChildConfirmDeadline() external view;
        }
        // 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;
        interface INodeFactory {
            function createNode(
                bytes32 _stateHash,
                bytes32 _challengeHash,
                bytes32 _confirmData,
                uint256 _prev,
                uint256 _deadlineBlock
            ) external returns (address);
        }
        // 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;
        import "../bridge/interfaces/IBridge.sol";
        import "../bridge/interfaces/ISequencerInbox.sol";
        import "../arch/IOneStepProof.sol";
        interface IChallenge {
            function initializeChallenge(
                IOneStepProof[] calldata _executors,
                address _resultReceiver,
                bytes32 _executionHash,
                uint256 _maxMessageCount,
                address _asserter,
                address _challenger,
                uint256 _asserterTimeLeft,
                uint256 _challengerTimeLeft,
                ISequencerInbox _sequencerBridge,
                IBridge _delayedBridge
            ) external;
            function currentResponderTimeLeft() external view returns (uint256);
            function lastMoveBlock() external view returns (uint256);
            function timeout() external;
            function asserter() external view returns (address);
            function challenger() external view returns (address);
            function clearChallenge() external;
        }
        // SPDX-License-Identifier: Apache-2.0
        /*
         * Copyright 2019-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;
        import "../bridge/interfaces/IBridge.sol";
        import "../bridge/interfaces/ISequencerInbox.sol";
        interface IChallengeFactory {
            function createChallenge(
                address _resultReceiver,
                bytes32 _executionHash,
                uint256 _maxMessageCount,
                address _asserter,
                address _challenger,
                uint256 _asserterTimeLeft,
                uint256 _challengerTimeLeft,
                ISequencerInbox _sequencerBridge,
                IBridge _delayedBridge
            ) external returns (address);
        }
        // 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;
        interface IOutbox {
            event OutboxEntryCreated(
                uint256 indexed batchNum,
                uint256 outboxEntryIndex,
                bytes32 outputRoot,
                uint256 numInBatch
            );
            event OutBoxTransactionExecuted(
                address indexed destAddr,
                address indexed l2Sender,
                uint256 indexed outboxEntryIndex,
                uint256 transactionIndex
            );
            function l2ToL1Sender() external view returns (address);
            function l2ToL1Block() external view returns (uint256);
            function l2ToL1EthBlock() external view returns (uint256);
            function l2ToL1Timestamp() external view returns (uint256);
            function l2ToL1BatchNum() external view returns (uint256);
            function l2ToL1OutputId() external view returns (bytes32);
            function processOutgoingMessages(bytes calldata sendsData, uint256[] calldata sendLengths)
                external;
            function outboxEntryExists(uint256 batchNum) external view returns (bool);
        }
        // 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;
        library ProxyUtil {
            function getProxyAdmin() internal view returns (address admin) {
                // https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v3.4.0/contracts/proxy/TransparentUpgradeableProxy.sol#L48
                // Storage slot with the admin of the proxy contract.
                // This is the keccak-256 hash of "eip1967.proxy.admin" subtracted by 1, and is
                bytes32 slot = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;
                assembly {
                    admin := sload(slot)
                }
            }
        }
        // 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;
        import "../INode.sol";
        import "../../bridge/interfaces/IOutbox.sol";
        interface IRollupUser {
            function initialize(address _stakeToken) external;
            function completeChallenge(address winningStaker, address losingStaker) external;
            function returnOldDeposit(address stakerAddress) external;
            function requireUnresolved(uint256 nodeNum) external view;
            function requireUnresolvedExists() external view;
            function countStakedZombies(INode node) external view returns (uint256);
        }
        interface IRollupAdmin {
            event OwnerFunctionCalled(uint256 indexed id);
            /**
             * @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 setInbox(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 rollup logic facets called
             * @param newAdminFacet address of logic that owner of rollup calls
             * @param newUserFacet ddress of logic that user of rollup calls
             */
            function setFacets(address newAdminFacet, address newUserFacet) 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
             * @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(uint256 newConfirmPeriod) external;
            /**
             * @notice Set number of extra blocks after a challenge
             * @param newExtraTimeBlocks new number of blocks
             */
            function setExtraChallengeTimeBlocks(uint256 newExtraTimeBlocks) external;
            /**
             * @notice Set speed limit per block
             * @param newAvmGasSpeedLimitPerBlock maximum avmgas to be used per block
             */
            function setAvmGasSpeedLimitPerBlock(uint256 newAvmGasSpeedLimitPerBlock) 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 facet!
             * @param newStakeToken address of token used for staking
             */
            function setStakeToken(address newStakeToken) external;
            /**
             * @notice Set max delay for sequencer inbox
             * @param newSequencerInboxMaxDelayBlocks max number of blocks
             * @param newSequencerInboxMaxDelaySeconds max number of seconds
             */
            function setSequencerInboxMaxDelay(
                uint256 newSequencerInboxMaxDelayBlocks,
                uint256 newSequencerInboxMaxDelaySeconds
            ) external;
            /**
             * @notice Set execution bisection degree
             * @param newChallengeExecutionBisectionDegree execution bisection degree
             */
            function setChallengeExecutionBisectionDegree(uint256 newChallengeExecutionBisectionDegree)
                external;
            /**
             * @notice Updates a whitelist address for its consumers
             * @dev setting the newWhitelist to address(0) disables it for consumers
             * @param whitelist old whitelist to be deprecated
             * @param newWhitelist new whitelist to be used
             * @param targets whitelist consumers to be triggered
             */
            function updateWhitelistConsumers(
                address whitelist,
                address newWhitelist,
                address[] memory targets
            ) external;
            /**
             * @notice Updates a whitelist's entries
             * @dev user at position i will be assigned value i
             * @param whitelist whitelist to be updated
             * @param user users to be updated in the whitelist
             * @param val if user is or not allowed in the whitelist
             */
            function setWhitelistEntries(
                address whitelist,
                address[] memory user,
                bool[] memory val
            ) external;
            /**
             * @notice Updates whether an address is a sequencer at the sequencer inbox
             * @param newSequencer address to be modified
             * @param isSequencer whether this address should be authorized as a sequencer
             */
            function setIsSequencer(address newSequencer, bool isSequencer) 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(
                bytes32 expectedNodeHash,
                bytes32[3][2] calldata assertionBytes32Fields,
                uint256[4][2] calldata assertionIntFields,
                bytes calldata sequencerBatchProof,
                uint256 beforeProposedBlock,
                uint256 beforeInboxMaxCount,
                uint256 prevNode
            ) external;
            function forceConfirmNode(
                uint256 nodeNum,
                bytes32 beforeSendAcc,
                bytes calldata sendsData,
                uint256[] calldata sendLengths,
                uint256 afterSendCount,
                bytes32 afterLogAcc,
                uint256 afterLogCount
            ) external;
        }
        // SPDX-License-Identifier: MIT
        pragma solidity >=0.6.0 <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 GSN 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 payable) {
                return msg.sender;
            }
            function _msgData() internal view virtual returns (bytes memory) {
                this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
                return msg.data;
            }
        }
        // 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;
        interface IMessageProvider {
            event InboxMessageDelivered(uint256 indexed messageNum, bytes data);
            event InboxMessageDeliveredFromOrigin(uint256 indexed messageNum);
        }
        // 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;
        import "./INode.sol";
        interface IRollupCore {
            function _stakerMap(address stakerAddress)
                external
                view
                returns (
                    uint256,
                    uint256,
                    uint256,
                    address,
                    bool
                );
            event RollupCreated(bytes32 machineHash);
            event NodeCreated(
                uint256 indexed nodeNum,
                bytes32 indexed parentNodeHash,
                bytes32 nodeHash,
                bytes32 executionHash,
                uint256 inboxMaxCount,
                uint256 afterInboxBatchEndCount,
                bytes32 afterInboxBatchAcc,
                bytes32[3][2] assertionBytes32Fields,
                uint256[4][2] assertionIntFields
            );
            event NodeConfirmed(
                uint256 indexed nodeNum,
                bytes32 afterSendAcc,
                uint256 afterSendCount,
                bytes32 afterLogAcc,
                uint256 afterLogCount
            );
            event NodeRejected(uint256 indexed nodeNum);
            event RollupChallengeStarted(
                address indexed challengeContract,
                address asserter,
                address challenger,
                uint256 challengedNode
            );
            event UserStakeUpdated(address indexed user, uint256 initialBalance, uint256 finalBalance);
            event UserWithdrawableFundsUpdated(
                address indexed user,
                uint256 initialBalance,
                uint256 finalBalance
            );
            function getNode(uint256 nodeNum) external view returns (INode);
            /**
             * @notice Get the address of the staker at the given index
             * @param stakerNum Index of the staker
             * @return Address of the staker
             */
            function getStakerAddress(uint256 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 (uint256);
            /**
             * @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 (address);
            /**
             * @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 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 (uint256);
            /// @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 (uint256);
            /// @return Index of the latest confirmed node
            function latestConfirmed() external view returns (uint256);
            /// @return Index of the latest rollup node created
            function latestNodeCreated() external view returns (uint256);
            /// @return Ethereum block that the most recent stake was created
            function lastStakeBlock() external view returns (uint256);
            /// @return Number of active stakers currently staked
            function stakerCount() external view returns (uint256);
            /// @return Node hash as of this node number
            function getNodeHash(uint256 index) external view returns (bytes32);
        }
        // SPDX-License-Identifier: MIT
        pragma solidity >=0.6.0 <0.8.0;
        /**
         * @dev Wrappers over Solidity's arithmetic operations with added overflow
         * checks.
         *
         * Arithmetic operations in Solidity wrap on overflow. This can easily result
         * in bugs, because programmers usually assume that an overflow raises an
         * error, which is the standard behavior in high level programming languages.
         * `SafeMath` restores this intuition by reverting the transaction when an
         * operation overflows.
         *
         * Using this library instead of the unchecked operations eliminates an entire
         * class of bugs, so it's recommended to use it always.
         */
        library SafeMath {
            /**
             * @dev Returns the addition of two unsigned integers, with an overflow flag.
             *
             * _Available since v3.4._
             */
            function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
                uint256 c = a + b;
                if (c < a) return (false, 0);
                return (true, c);
            }
            /**
             * @dev Returns the substraction of two unsigned integers, with an overflow flag.
             *
             * _Available since v3.4._
             */
            function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
                if (b > a) return (false, 0);
                return (true, a - b);
            }
            /**
             * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
             *
             * _Available since v3.4._
             */
            function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
                // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
                // benefit is lost if 'b' is also tested.
                // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
                if (a == 0) return (true, 0);
                uint256 c = a * b;
                if (c / a != b) return (false, 0);
                return (true, c);
            }
            /**
             * @dev Returns the division of two unsigned integers, with a division by zero flag.
             *
             * _Available since v3.4._
             */
            function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
                if (b == 0) return (false, 0);
                return (true, a / b);
            }
            /**
             * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
             *
             * _Available since v3.4._
             */
            function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
                if (b == 0) return (false, 0);
                return (true, a % b);
            }
            /**
             * @dev Returns the addition of two unsigned integers, reverting on
             * overflow.
             *
             * Counterpart to Solidity's `+` operator.
             *
             * Requirements:
             *
             * - Addition cannot overflow.
             */
            function add(uint256 a, uint256 b) internal pure returns (uint256) {
                uint256 c = a + b;
                require(c >= a, "SafeMath: addition overflow");
                return c;
            }
            /**
             * @dev Returns the subtraction of two unsigned integers, reverting on
             * overflow (when the result is negative).
             *
             * Counterpart to Solidity's `-` operator.
             *
             * Requirements:
             *
             * - Subtraction cannot overflow.
             */
            function sub(uint256 a, uint256 b) internal pure returns (uint256) {
                require(b <= a, "SafeMath: subtraction overflow");
                return a - b;
            }
            /**
             * @dev Returns the multiplication of two unsigned integers, reverting on
             * overflow.
             *
             * Counterpart to Solidity's `*` operator.
             *
             * Requirements:
             *
             * - Multiplication cannot overflow.
             */
            function mul(uint256 a, uint256 b) internal pure returns (uint256) {
                if (a == 0) return 0;
                uint256 c = a * b;
                require(c / a == b, "SafeMath: multiplication overflow");
                return c;
            }
            /**
             * @dev Returns the integer division of two unsigned integers, reverting on
             * division by zero. The result is rounded towards zero.
             *
             * Counterpart to Solidity's `/` operator. Note: this function uses a
             * `revert` opcode (which leaves remaining gas untouched) while Solidity
             * uses an invalid opcode to revert (consuming all remaining gas).
             *
             * Requirements:
             *
             * - The divisor cannot be zero.
             */
            function div(uint256 a, uint256 b) internal pure returns (uint256) {
                require(b > 0, "SafeMath: division by zero");
                return a / b;
            }
            /**
             * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
             * reverting when dividing by zero.
             *
             * Counterpart to Solidity's `%` operator. This function uses a `revert`
             * opcode (which leaves remaining gas untouched) while Solidity uses an
             * invalid opcode to revert (consuming all remaining gas).
             *
             * Requirements:
             *
             * - The divisor cannot be zero.
             */
            function mod(uint256 a, uint256 b) internal pure returns (uint256) {
                require(b > 0, "SafeMath: modulo by zero");
                return a % b;
            }
            /**
             * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
             * overflow (when the result is negative).
             *
             * CAUTION: This function is deprecated because it requires allocating memory for the error
             * message unnecessarily. For custom revert reasons use {trySub}.
             *
             * Counterpart to Solidity's `-` operator.
             *
             * Requirements:
             *
             * - Subtraction cannot overflow.
             */
            function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
                require(b <= a, errorMessage);
                return a - b;
            }
            /**
             * @dev Returns the integer division of two unsigned integers, reverting with custom message on
             * division by zero. The result is rounded towards zero.
             *
             * CAUTION: This function is deprecated because it requires allocating memory for the error
             * message unnecessarily. For custom revert reasons use {tryDiv}.
             *
             * Counterpart to Solidity's `/` operator. Note: this function uses a
             * `revert` opcode (which leaves remaining gas untouched) while Solidity
             * uses an invalid opcode to revert (consuming all remaining gas).
             *
             * Requirements:
             *
             * - The divisor cannot be zero.
             */
            function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
                require(b > 0, errorMessage);
                return a / b;
            }
            /**
             * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
             * reverting with custom message when dividing by zero.
             *
             * CAUTION: This function is deprecated because it requires allocating memory for the error
             * message unnecessarily. For custom revert reasons use {tryMod}.
             *
             * Counterpart to Solidity's `%` operator. This function uses a `revert`
             * opcode (which leaves remaining gas untouched) while Solidity uses an
             * invalid opcode to revert (consuming all remaining gas).
             *
             * Requirements:
             *
             * - The divisor cannot be zero.
             */
            function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
                require(b > 0, errorMessage);
                return a % b;
            }
        }
        // SPDX-License-Identifier: Apache-2.0
        /*
         * Copyright 2019-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;
        import "../libraries/MerkleLib.sol";
        import "@openzeppelin/contracts/math/SafeMath.sol";
        library ChallengeLib {
            using SafeMath for uint256;
            function firstSegmentSize(uint256 totalCount, uint256 bisectionCount)
                internal
                pure
                returns (uint256)
            {
                return totalCount / bisectionCount + (totalCount % bisectionCount);
            }
            function otherSegmentSize(uint256 totalCount, uint256 bisectionCount)
                internal
                pure
                returns (uint256)
            {
                return totalCount / bisectionCount;
            }
            function bisectionChunkHash(
                uint256 _segmentStart,
                uint256 _segmentLength,
                bytes32 _startHash,
                bytes32 _endHash
            ) internal pure returns (bytes32) {
                return keccak256(abi.encodePacked(_segmentStart, _segmentLength, _startHash, _endHash));
            }
            function assertionHash(uint256 _avmGasUsed, bytes32 _restHash) internal pure returns (bytes32) {
                // Note: make sure this doesn't return Challenge.UNREACHABLE_ASSERTION (currently 0)
                return keccak256(abi.encodePacked(_avmGasUsed, _restHash));
            }
            function assertionRestHash(
                uint256 _totalMessagesRead,
                bytes32 _machineState,
                bytes32 _sendAcc,
                uint256 _sendCount,
                bytes32 _logAcc,
                uint256 _logCount
            ) internal pure returns (bytes32) {
                return
                    keccak256(
                        abi.encodePacked(
                            _totalMessagesRead,
                            _machineState,
                            _sendAcc,
                            _sendCount,
                            _logAcc,
                            _logCount
                        )
                    );
            }
            function updatedBisectionRoot(
                bytes32[] memory _chainHashes,
                uint256 _challengedSegmentStart,
                uint256 _challengedSegmentLength
            ) internal pure returns (bytes32) {
                uint256 bisectionCount = _chainHashes.length - 1;
                bytes32[] memory hashes = new bytes32[](bisectionCount);
                uint256 chunkSize = ChallengeLib.firstSegmentSize(_challengedSegmentLength, bisectionCount);
                uint256 segmentStart = _challengedSegmentStart;
                hashes[0] = ChallengeLib.bisectionChunkHash(
                    segmentStart,
                    chunkSize,
                    _chainHashes[0],
                    _chainHashes[1]
                );
                segmentStart = segmentStart.add(chunkSize);
                chunkSize = ChallengeLib.otherSegmentSize(_challengedSegmentLength, bisectionCount);
                for (uint256 i = 1; i < bisectionCount; i++) {
                    hashes[i] = ChallengeLib.bisectionChunkHash(
                        segmentStart,
                        chunkSize,
                        _chainHashes[i],
                        _chainHashes[i + 1]
                    );
                    segmentStart = segmentStart.add(chunkSize);
                }
                return MerkleLib.generateRoot(hashes);
            }
            function verifySegmentProof(
                bytes32 challengeState,
                bytes32 item,
                bytes32[] calldata _merkleNodes,
                uint256 _merkleRoute
            ) internal pure returns (bool) {
                return challengeState == MerkleLib.calculateRoot(_merkleNodes, _merkleRoute, item);
            }
        }
        // SPDX-License-Identifier: Apache-2.0
        /*
         * Copyright 2019-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;
        library MerkleLib {
            function generateRoot(bytes32[] memory _hashes) internal pure returns (bytes32) {
                bytes32[] memory prevLayer = _hashes;
                while (prevLayer.length > 1) {
                    bytes32[] memory nextLayer = new bytes32[]((prevLayer.length + 1) / 2);
                    for (uint256 i = 0; i < nextLayer.length; i++) {
                        if (2 * i + 1 < prevLayer.length) {
                            nextLayer[i] = keccak256(
                                abi.encodePacked(prevLayer[2 * i], prevLayer[2 * i + 1])
                            );
                        } else {
                            nextLayer[i] = prevLayer[2 * i];
                        }
                    }
                    prevLayer = nextLayer;
                }
                return prevLayer[0];
            }
            function calculateRoot(
                bytes32[] memory nodes,
                uint256 route,
                bytes32 item
            ) internal pure returns (bytes32) {
                uint256 proofItems = nodes.length;
                require(proofItems <= 256);
                bytes32 h = item;
                for (uint256 i = 0; i < proofItems; i++) {
                    if (route % 2 == 0) {
                        h = keccak256(abi.encodePacked(nodes[i], h));
                    } else {
                        h = keccak256(abi.encodePacked(h, nodes[i]));
                    }
                    route /= 2;
                }
                return h;
            }
        }
        // SPDX-License-Identifier: Apache-2.0
        /*
         * Copyright 2020, 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;
        import "../bridge/interfaces/IBridge.sol";
        import "../bridge/interfaces/ISequencerInbox.sol";
        interface IOneStepProof {
            // Bridges is sequencer bridge then delayed bridge
            function executeStep(
                address[2] calldata bridges,
                uint256 initialMessagesRead,
                bytes32[2] calldata accs,
                bytes calldata proof,
                bytes calldata bproof
            )
                external
                view
                returns (
                    uint64 gas,
                    uint256 afterMessagesRead,
                    bytes32[4] memory fields
                );
            function executeStepDebug(
                address[2] calldata bridges,
                uint256 initialMessagesRead,
                bytes32[2] calldata accs,
                bytes calldata proof,
                bytes calldata bproof
            ) external view returns (string memory startMachine, string memory afterMachine);
        }