aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorJose Hugo De la cruz Romero <jhugodc@gmail.com>2018-11-09 01:39:48 +0800
committerJose Hugo De la cruz Romero <jhugodc@gmail.com>2018-11-15 00:12:55 +0800
commit47058293ddf5a8221c704f7546cb2ad552c15df9 (patch)
treec32c6d7e85145ed9fbb7233d1172752c061dd562 /src
parentb251481890bb9b5a38882c628666bb367a93285e (diff)
downloadtangerine-tests-47058293ddf5a8221c704f7546cb2ad552c15df9.tar
tangerine-tests-47058293ddf5a8221c704f7546cb2ad552c15df9.tar.gz
tangerine-tests-47058293ddf5a8221c704f7546cb2ad552c15df9.tar.bz2
tangerine-tests-47058293ddf5a8221c704f7546cb2ad552c15df9.tar.lz
tangerine-tests-47058293ddf5a8221c704f7546cb2ad552c15df9.tar.xz
tangerine-tests-47058293ddf5a8221c704f7546cb2ad552c15df9.tar.zst
tangerine-tests-47058293ddf5a8221c704f7546cb2ad552c15df9.zip
EXTCODEHASH tests
Diffstat (limited to 'src')
-rw-r--r--src/GeneralStateTestsFiller/stExtCodeHash/extCodeHashAccountWithoutCodeFiller.yml78
-rw-r--r--src/GeneralStateTestsFiller/stExtCodeHash/extCodeHashMaxCodeSizeFiller.yml78
-rw-r--r--src/GeneralStateTestsFiller/stExtCodeHash/extCodeHashNonExistingAccountFiller.yml74
-rw-r--r--src/GeneralStateTestsFiller/stExtCodeHash/extCodeHashPrecompilesFiller.yml160
4 files changed, 390 insertions, 0 deletions
diff --git a/src/GeneralStateTestsFiller/stExtCodeHash/extCodeHashAccountWithoutCodeFiller.yml b/src/GeneralStateTestsFiller/stExtCodeHash/extCodeHashAccountWithoutCodeFiller.yml
new file mode 100644
index 000000000..52b607556
--- /dev/null
+++ b/src/GeneralStateTestsFiller/stExtCodeHash/extCodeHashAccountWithoutCodeFiller.yml
@@ -0,0 +1,78 @@
+# EXTCODEHASH to an account without code
+---
+extCodeHashAccountWithoutCode:
+ env:
+ currentCoinbase: 2adc25665018aa1fe0e6bc666dac8fc2697ff9ba
+ currentDifficulty: '0x20000'
+ currentGasLimit: "1000000"
+ currentNumber: "1"
+ currentTimestamp: "1000"
+ previousHash: 5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6
+ pre:
+ 095e7baea6a6c7c4c2dfeb977efac326af552d87:
+ balance: '1000000000000000000'
+ code: |
+ {
+ (CALL 150000 0xdeadbeef00000000000000000000000000000000 0 0 0 0 32)
+ (RETURNDATACOPY 0 0 32)
+ [[0]] (MLOAD 0)
+ (CALL 150000 0xaeadbeef00000000000000000000000000000000 0 0 0 0 32)
+ (RETURNDATACOPY 0 0 32)
+ [[1]] (MLOAD 0)
+ }
+ nonce: '0'
+ storage: {}
+ deadbeef00000000000000000000000000000000:
+ balance: '1000000000000000000'
+ code: |
+ {
+ (MSTORE 0 (EXTCODEHASH 0xdeadbeef00000000000000000000000000000001))
+ (RETURN 0 32)
+ }
+ nonce: '0'
+ storage: {}
+ aeadbeef00000000000000000000000000000000:
+ balance: '1000000000000000000'
+ code: |
+ {
+ (MSTORE 0 (EXTCODESIZE 0xdeadbeef00000000000000000000000000000001))
+ (RETURN 0 32)
+ }
+ nonce: '0'
+ storage: {}
+ # account without code
+ deadbeef00000000000000000000000000000001:
+ balance: '1000000000000000000'
+ code: ''
+ nonce: '0'
+ storage: {}
+ a94f5374fce5edbc8e2a8697c15331677e6ebf0b:
+ balance: '1000000000000000000'
+ code: '0x00'
+ nonce: '0'
+ storage: {}
+ expect:
+ - indexes:
+ data: !!int -1
+ gas: !!int -1
+ value: !!int -1
+ network:
+ - '>Byzantium'
+ result:
+ 095e7baea6a6c7c4c2dfeb977efac326af552d87:
+ balance: '1000000000000000001'
+ storage: {
+ 0: '0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470',
+ 1: '0'
+ }
+ transaction:
+ data:
+ - ''
+ gasLimit:
+ - '400000'
+ gasPrice: '1'
+ nonce: '0'
+ secretKey: 45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8
+ to: 095e7baea6a6c7c4c2dfeb977efac326af552d87
+ value:
+ - '1'
diff --git a/src/GeneralStateTestsFiller/stExtCodeHash/extCodeHashMaxCodeSizeFiller.yml b/src/GeneralStateTestsFiller/stExtCodeHash/extCodeHashMaxCodeSizeFiller.yml
new file mode 100644
index 000000000..bfa4017c6
--- /dev/null
+++ b/src/GeneralStateTestsFiller/stExtCodeHash/extCodeHashMaxCodeSizeFiller.yml
@@ -0,0 +1,78 @@
+# EXTCODEHASH to an account with codesize = MAXCODESIZE - 1
+---
+extCodeHashMaxCodeSize:
+ env:
+ currentCoinbase: 2adc25665018aa1fe0e6bc666dac8fc2697ff9ba
+ currentDifficulty: '0x20000'
+ currentGasLimit: "1000000"
+ currentNumber: "1"
+ currentTimestamp: "1000"
+ previousHash: 5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6
+ pre:
+ 095e7baea6a6c7c4c2dfeb977efac326af552d87:
+ balance: '1000000000000000000'
+ code: |
+ {
+ (CALL 150000 0xaaaaaaaa00000000000000000000000000000001 0 0 0 0 32)
+ (RETURNDATACOPY 0 0 32)
+ [[0]] (MLOAD 0)
+ (CALL 150000 0xbbbbbbbb00000000000000000000000000000001 0 0 0 0 32)
+ (RETURNDATACOPY 0 0 32)
+ [[1]] (MLOAD 0)
+ }
+ nonce: '0'
+ storage: {}
+ aaaaaaaa00000000000000000000000000000001:
+ balance: '1000000000000000000'
+ code: |
+ {
+ (MSTORE 0 (EXTCODEHASH 0xcccccccc00000000000000000000000000000001))
+ (RETURN 0 32)
+ }
+ nonce: '0'
+ storage: {}
+ bbbbbbbb00000000000000000000000000000001:
+ balance: '1000000000000000000'
+ code: |
+ {
+ (MSTORE 0 (EXTCODESIZE 0xcccccccc00000000000000000000000000000001))
+ (RETURN 0 32)
+ }
+ nonce: '0'
+ storage: {}
+ # account with random bytecode with code size = MAXCODESIZE - 1 = 24575
+ cccccccc00000000000000000000000000000001:
+ balance: '1000000000000000000'
+ code: '0xe113a2c07114fc07c399c04fb6849e7301a4a35a7bd3221ae16e1a81fa9d5a04a112cff08de3cf0a5a93b2a335ed76b2ec26540d669bab1457d1870d68c65f02a94051b239c6ca48b7960442a9ebfb8d612fabec149985b90ed0c9f4bc736c5a0d038089fef9d6047ca70fb6ffab6d9bfd4287bea22ba58dd1dd30516b83da7f2d54f2f32b98951215839ae4a21f574d69fbe848f1443e28c72755ba6ceb8431553e7d9d49d125616122e9fa7c8aa59f291cfa19d7acf835198c7f14572beb5aafe06700f0247268a8d105c24d7f3d98fa90700e76256d498d7557009a309026391afbee6e86da108ac8a78559103c72bbd91a7a6001b30158e697a97b523bf49b9db100d7a36b5b2a44442cf8e442b31f92f4026630ebd511bd341e59be195fc0c763f2f46ee384949daae1ab2311cc326f98135c5e670dc32ea5a212f8a8b41ff396dbd4d192595d764af84b377776fa76b7d34ae4abf2fa584c59f1af00c1015806b9b275092ed77b8804a0f2054f12cd8f80573fd0288724f07abd4d04682a0b63c33379459a49f5feccf38540afec56d67a0a80b864c73ef4809af1002d34b09944bbcde80078be755784da76319405fb8eca5d48572c56a5a790f87f04492ba7e7dfda472ec7d5215d1e9c74bc4817d9a925868a136ae4d69a66f7140f203450a201c2e2edaec4edc10af2b0ce61931247725f7354bf1eba1d6f26d4ab4f958db4afe79f59ccbe2985584f8a49c895c6e84a0882b7d00726ea49ce52022c16aa0391192eea998422dbe7d66f0a41e2209ac95b00a90d52f9e3d98a0dfc9afd5d928b8db4c447522c9197facdb836d3967b9b775a28726538acd6ef12f1b3ae8102a5527b90ce104578d5e3507ac48456c3dcb5db78b32d588c6f6f8a4037aa0bf364beb506782c8171698c08efd4c29596b968e24bf815d502dad856344edd9dd481288a01228d68e406163aabbdcbd990803cf40b750347cb0462c7f5b2642d5344257daba23b4f8ed36722817dab5e23e9134129aaf602104cb188a13cb19109e85427f2e60b82f2ad2accb6c7652a6a675189b5ea35e6c3019e740c828e55706529965cbacfa985736e8517587d67c696f627c97fa34bb69f68a3fab6e58ca475a2ede0fb7dc7b7a02d7eb19c9786293ea900465de629683e351750fb375cc1d7b267ac93360cea29943bfd95c4c1764ae1626fd11fb33f3fd3188ed81f08347791e4b22c2a98de62c0a97dbbf705b4a64c1272c69d88378ca960af3097183acaf7d89518a0b860976ba80b9d134e100729ecb0580681549e7a99f6da638674fef9656c74becde90df76b8de7c996543a5f58dee99d6e50a432c6532d83900c4c89c7e6b645ff2b174c624841116e718d47e7a294729e00b33169f2c0cfcac6cc5d57ddcb8f6be93aad862557cd5ea3a366dc65443376750549e1add646a4719d8f84ea7f6716fac617b9b9a972c5ef47abc6c3c8c6267a97d164bc70c32865651f732965dedec114d5255e927fd8d48755d4e9f24545158374dd844cce228558d3f68dfe0fabcba67f79b96bb571f14d7d9cd29b993ef40637d0ac3083948dee0603ad720ff1e36ed84f7ee8afead6e6c7b842f9cdf62de37dbbcf8be174793bb75b8035c1b0392d1457838f6898cf7c14d9ca2ce77f733a4f3284c1528150e92a75cdb97b4fa3b78d7d4f408059e0df5a0c5f40706cc1b615393bf301b7cded942757be61cc5c1c476835070dacec15a189c4aa7e0c11bafd7178cd425073fac1eb4849a3591118cbeda69e31c62c3483981532bc3af7d3b779b4ba6fd2c6934ec8bf34bc39504159b2977f934d5df4856aff35958b0314cdf494f313f9985ece0c9ac6e2f50777230092db621dcec5deaa56a82c5cb29055b07d13b9a520b7d39784eafa00695c8cbdd973389655c4524ec1ead886316dc8d4ebe4ab6da3f022b25e27d9f0a41598227c60347d7fab6c3c0544522e84388db09efba364fa2295b362a99943eaea5561c7639359420fc8925913bc2444c7cec3f65f52a5d2db6d9a195c6a047b39c77bd293d2d87717eec29fe6f3d56f7292113cd63289a09b76b131b744187f5679d3fc4175a7e8efa22a7a13f6a3a7ad7b911143c20f9571ad41ccd69e90f6b33a646b3c08f8971fdabd81fd812d2f2cd00bdd33213243b19e6a365ef59bb102796ffd8bee86a6d058128ecc5612cb31a128ed24a259930982180f08be2fdf4d5fb591e73d2968dc8ca697dd78f028900f95e15d0c6787f5631c9433604e8d6e47af8125adaf7872e5586ac7b15ecfc2076b3e0ebb743dfdd8b8a79ef50c524900e44d6bd53db07bf14ee2365a5e5dd53916ccd28de79126168f2df12bc0640919562aa354a957eb7e2547d202a8f8d428f488e28fbc29505818d3e3768f1e38475c8f809c535438987a075665c1a88aa33f80ef2268374984b0dfeae6fd7f80a0f9fa8f26ee443077352548098b7693b022ea87b41174a15256a268e0bba90bd39cf8aca845ca632f74ed34a96720016cc55aac7157d34f581c0e57a0f0b439de95ca3f03c18d647939eb2db3a487cdae10144a884c9aafc68e18e36ed7b828d7c1677b13b2f6defe63eb346a7c224b881322c7ce4844aef2f00b7384e1f25d894a64d120bb603a613fe5c9d0836dd153069f48fd91466312c3feaedf496fac2ca3bac3e6a4509b082f6ff2c7e6587b3609d67e45e01051c751ce535b62cab82347fa83dfb6e4768147c54c6e8cbcc0183207f54926ee808214c1833581286313c3b9922df987a953e7a86798bd3e44eb0c7867f04b7360e366c612c66083a9f043f6b1d1adc30ace82bd63503109af7dfa29de7f35ceaa87bebea438eb86a71eb4ed828c47e1f1c65d36e02f6a7aefacadbf7b8a7af7b6389b5f6ce48bef187e37261eaa328e3594ec02c6afb88e7f2cd7fa551158bd682e43f89c6ae47c800f41356b6b37aab47336c76211c6243e582b31a0eb3c5ea162670393d9c6670ad95c3a3ec73fbe5ea2b9e8a35581b01a12c2435da87768e1009193ea1164a8fd01ae5b72626d8398ddf1c63372875bc7b0ed8a4be26889a062c1447d5c3e980ec71dc45b6a00b928a510759ad683a83f91d4954e9179fb9f490b2292305c4413e083daa27122d47a7193ab2192a13d8f08d4b7ccbcfb771ecba8cfa335d917922130c310a83b2dac0c42bba3a7afa36a00ff740680fc015834328e24eb6cbd4ab2ffd5963a5034984209ad47d49d73c193be47e07d99ce8b091ced96415e00adbb1b7c59e7a8667e891944523824c521ba10c9e400bddda4f00e5f2523f1271ec03ecd053966968c6645969cdae390442d8c9209b78b84702cfb0fddcc20f3254b08cc5e94fed4cf9e8804d84b2472b1a5d6e04a492aecf474c3e3e20160f507ec7c7a0fc4762a569742cd138589aa6e0ead8b178ba1b7805d983655a7b0e9cc67b9b684248c0afba12bc10a058ecab9cb0b269eea93860cceef850addc3bcb9c97cbb8a45dd41a6bd8a8fdb5d70e8816669fde4ed52e2df93c1612f30cb1c83e20d3e42bcdc764912ad448f9784c97285f282006272ede7f594d0fcdb8c3711d1eb97c345cd28112892fcd050bdda2a2ca2479d405f2b659bb0cc92959760086cea9539795f86d811f67a7f8a2afb8fe884cff4da28aee5469d1b393018e9bd664f99294f946af4dd1f94925310faf1e4ef46f9eb5572176b84d703f765b7cd248962c46c3ba42778c4e82a6f55adaf1de2e6195f92bb2196cc3d292166cc73bbf06e54b0c69e91e5f2d9e560981213db8deaacf777b7256142892db62f757dbeb605ad5b6f5ceeddf6735e51b886899159666178774a45ffb6f76261160dfe939847d932a54125fc4da832714cade3c48acf5a745f1f1addc6e02e25b821ed10c2f5bc9af24f340fa111bd7d78d912d883c35e44766b19a934f38d803f3bcd9bca2cbb46b89359b03bcf597f86e9a0d942a2159d8c705e2a6792381c0449d2db94310d882a4134d678c53cedd8e96d630a40d6459620b80bd3fbf34e07d5efdd952d25915ed93dcc85cdb55e35856bedea24a6b9b254c4bdbaae8a920365c5fdadbc0b7c215cdab54e09d67d7d2239b697e7ba271324cf5f3e4ba4d531cad3ae5d4101f1b469ca689e93160b73f7f6e2ec9effc4a2204b4403f01f173380b992aa1034a8fb07de5f8a2fdc9339a32f056cb664e05cc480530eaf9b8ac3314813d4f986900f859517775ac1fc2d599317a6353bf25eded422bc2abea5053e5a5bdb5755ba3584544f5638f1e11723616144787b07c6dc461923c736ed7a4f84901f6981a3099cfdc3cce9acb5d801bfeccd368da7e0bbba32c1942d22531dda445d2a615cc07af2c0d8cd2a8353547cd7fde52dabcc7141344f5234e240eca4998b23725e09339b850fb479cad40006e96ab62f93bf2e122abc88960a57b74887831bebc7a891084f2e6ecd45dad21c8c74d8464e401b110dc9d41a1a68f73bcea4ad4ef4f771e3f1ce0a1fa8c69149dfa743fdade7a4a843cf889a01ea2b88f49af5e41cf55192a303a6336f281ee7fa34b80278719922fcea1c0981465ff4436060ced679cf8154b8168b4084e36cfad0bba8250561cb17646cc5e9fd6ed168c74abddc98d7021beea2ebdb1fae475940ab46efe24cf050f477dfa5712400b9600a2e92271b87242f338c465dabfc1adcf3924908e32f35cca66cd3aa42040d364fc178ad5b7d88d5724ba0f8a281f0e35ff1a85abf13fddb055e59f5b9196c12a33b3d03d16bd221260af85ceab8fe4d161ffb4f81ab1364f5a953d6bc66b3a14aaa60e8df4dadb8672ad10b254b48674f6429779598db1440838c17ac04762caf77c50c3447ff88a9d0dcfcea3303c707a49b8e63a43869fe4bde4e7d344882a2acb2867801958654b0f2dba664a4e3cece3828363bde746edbcad070b227d65d9452bcf37e72f05a52e833be271415940f3fff2ec40de2d27f647067f1be866006d5ec747c82ce4a10d92fedd5f351fab451de9d3c88442ed42d0013d5b181bb3b0bed093fdea56d364046b3b5a145f474324a816a26046f25b4e7d6a50684829eb8908b0872362c84fb9d857ebda13071de076428b7967529c107e86c0eda0d2c8df7dc7ebb83f571d9d5b225b592fff4d081faf1df25f3c9ed32901aaf6d82d95f57dc0f07067e2feb8bfd26ad6536f70427777e44fa35a72c7feb845c53746f2a07c1dc94900f40742f5c3e999df67c359e05bf6bed84b1ee60a0a5fd76a8b25fffda90adc72c05a55cb2abefba4f5f04c21935a6d69c3b9e3446554026fb90ee949e6c6d841812b492d53b3a41ccc4def139e76e31f64b7fb2f419ff0c69a1fdd153de52b0dd6f8096542d898a1217ecdaa817907eb49825f576e32a300a131e63381a3f8c76505707e153fd80b8f3b56c435cb546472ff2e62761d91650f0e387d9beb04e767b21eaf32da5f4212464f65505981f2b39014f9d08d83c0d235f04b1fcea21499491f94eb6db2b96e36e02e9b86f35449c1417d20f1f6145ca945971badf9afa8da0517ff89064a112b71e97e99f9dafa881bf1a2f583ed6806a9929425cc8387c6f0a55f3be5dc3bee0b871003e8be40b557dd0476000271a2df15ed7a2810209b9aeb4cdd1b5a109564302c16f25e04d1818b5d4f1e5f7b4cf808934703543e9a97ad902d0143e7bf4118b01357dda2c08dfb7fd74676f265d7d5d43d5494cb062a02e27123370272fdd9ce95e6a0e2abe052079dfbf8c9f4e09c556066d31f72a4e9abf1810fad5d8a1649319ec497c37f3c1fb679a085fdfb1dac3eaae2289a053479abb9cdaeec637967eeb2fbf26bf955f5c1ef4c00db9f18f3a5c2fc1c3106b270b68e19cad90cd7fb3ad2ff3af408aecff3a03012cd53f11cae960949c853b6bb40bd55345e866695dff4fae7ebbd45bb3b07cbc4b660130bd95c1e68e18b0579618d040c07091f363ecd4db2bf1db1e987ca74c76438f70574546a55e47d94b9208ea86eae829f918dc9dc7c5fe3905d3f0b2410aefa76f14049c9c22a50e6f8c318fbe0a4ee92e353f3bf59ecc48309467fe59b67c1ed15645b0d08ebc696e1595e80fd286bd7e278979acaff3462e0c4ce86c6f2daee8ed7e26a885947df756d66735a950caedff791b67f3c19dc648e68e1cc6fa6d9cbfdbbb056352ee234d6310bd73a45fa448cc7516bd152885d057c9341319df677faa3bb3c9a6a43be87a8f797ddd1f8e83b727a76c5245e7a52f45c326a61986d36e2d9a51a5515095a2e84b7b6b4191f7583290cee3b65a65b979ba7ddb575d1807adc9befccf874abc51470a93d967fffc47dde12cd0687be68fc3c6ceed69309cde16f640df28b579ed0810b457414e0bea2a352860f06985044ca2ca446d6494056083408fd9fe6eb5cd0368e5eadafab61c301228eb734ef0040736a2d859d89f03ffbc8872660f32a9c3db6b9589157c6d77935bc1243f89c1c6f10c324b57cdb2c5958bce298dc9ee7a0cdefe821bfc5c78e6bae8d39fde6f152a1b96ada11b96b24d8e66ebc7d8d7863f5cee8644be311c9f77b34deb4523429f7b5dd7412383cffa797ea22c1dea42f167e47cc975aeac2b24dad6efbbe815bbbe337bdb5903552be5a16f6994788ea773aab0061a51ef000ac29418b1a7777e95c859f4f09dc7f0c65e2ba304e20c91b7e3da6d8689066ace278e328e842d481074510c7c3ee8f227a43690c73b818631882c014213264ef11f145c9deea94787bb3e7398a01e4959dae4a73e39926b7c6e0591424f172967109bd94ec41fc0d7e19bd2dd36427d7810a5332ee2e10eddc413bd80203480a7c29f869d54629882e7e0da358af7a4e5baf8c13b1e699e81e7c72ccebd95ec2c92f0ebd450afb61849bc291ecf2fb732f20ae1ab02ef1b274d2748df141a7d10fa54a7b567e45e5574f61e128851f718ced61e06fc8620cbe583f31430927d2ae342b928d1d19beda1df2ad3328bbc56ea23dcfff834afd270b764f8f43af1ba84a6f31c84afaabffd163eb8073103d15f0653b8310093a7373bdb7ce6c3448ae53ec1ee082eb9da9f2b557d402aa4653a38e0fac8da7c3c376e883627330dad1beb394056d2858a30ab2dc7921d6d567b0aafcd2c4055701e45aea1642232326de3095b2dbbb79d970f01cba2ab030508f97d0f8694531202c0f78b9f083ce8f70c2294b004736ca3397bc2b7747353081a5c2761852608027388769c102f818a62948a393940dea7276a03e8ad47489f3e41533f97003aab93d093938753d7afcd496b07554e18288a46b37c2b185584e01a207a8a16477d3698a07cebd4fc9498bd3aedb46f60f16b09728bd7be9095407e1a155903120381d87fe74b09599c5adc7aee6da7af9a0ef72aec82be3feb2179b454fc2bd22f49badfaf3e83163758fd4a75676e10fdfba6585ac47311fda8259502a766d2cf49b52566219a89b0f0647253ab98ed8a2c703a5b014502e79af2236c22c7ec1b97e5dc8ca2e45164cd85261458d4c211c560469f4acdfaa47ec8ad90ba2aea84d0b40e97904ff7672b26583dd3ddda71189ad7573d015351cb289ef81581f635853bc4ad99442dfcc94da3c9e4c4a5865cd1cbc3a5ecc5ee33e5d5854053950a8a6d4d9b6023a6a60e9a59ee7b473c613ca87c79952af7828504e3a40affed03fb2dc6a813781732cb3a0cc5f3649abbf9ca140cf5f75760b4f77315a484878724df4af82c3952c533612bf385362f760aaedc4e9dad9da920b914dfc31532fd3ec2fac52e0e2116272f2f12f6ae1225d14b57092d9da8d7d895084b47a60abf05f119fc3af0ef7babc806f4735bed963d3334f7c5cfe6daf853aecdd6703c08dd65a963acdc863bfb38b7d27c0cb17d845d6ec4129ca2c133da69866ca2bea461a4a300709aee49c7c9f3579b092cd505bf4a039a0f572043b03db69c8235087a22c250b1b97a125c9f97091740932396b9c1514a018ada719cfd1c0201f7aeefe54d9258c3862001988b9c7c0a3179c0952db069f66262dd3774bc7db3b5c5855e15724c10172cf540564d75bcf484e0b74c3b9289483b87cbd2d952491bfccb97a2cc9ecc8f63f7fa261dc3d12520b68212de8f3bbe863875b487b6aa61383799368589308f654c3d760ba9ce3796bdd15ace90c90d9f297e0d33153a27985da6ac10cb41a3f982fd508406e2f8da62bbcd1f476320be4562105ec0710008d07a24dabf2dca492a0cbcc3aacc2293ca0758d75d4bf6a79b74d9399e342e9781349d498c5aa6074e1ebc5a5a419fc1f171b483638b4e1d0b59b44e90fb96751b5e3f4d84fe715bf2658968b124eff06b356f212ab592e9787551d7643da839dca996007a3625dd2dd8d433d7cefa754d51cb5d45f7e711373f4f6003ca044a6e47bcccb257dc1a624113ef682471f23557c5fc83e23e50fb703a45b460d2da66a5beea36c02b1fd8c591dd7a168fea8da459735a90fb0362b6464dafbff25cbf91e3db1d3ba7dff4468915ac2b644139dbdbef8ef101dbd986e8259b2443ca8cf542c048a834579fb94d1f2b2bfd595f5b2689f7572ec4dff285d81bd3a2946c74a506549b1cf2bb9b931447cde893a6af4a95858c40fcb24179647bfbbf0a891b4450285ac24ba576a908d7b253435bc576519be014e99257988e1f787c289b4c653db2dff800973f6f6fc0dfcc368e4e625c62c1c0c842359a6fbab04dad343eb1d9c6a5e1317629d6d06a2f2560478d5c778d7b753a3fcda414af84ee9c401fc91c47b275600815fdb7a5d340141c64efa3e05f3241c81734a8010028abf7f4cc624ef75de107e280b105ca887489a87ecf1ff70a9c5d85553b5c44d930e5f626ecd452c555cfb05d7c1e126a4a5a0a63378c7bc176fcb48cc92cde1f41033793252aefc31fec19f71bc824e4444aa2317901296cc5f641381874f92445d9734cb94148ccc22eb98975978ee1cd31415a8f6a751222ef8e3571d672c80be815e343fbd73fc79d06456bab47a2970674843f98450dacb3925842d574d20fd7c5aa51dc476ad666e093b49d6221b536f75f41f91974c634110ab990306f67264649d0a61b899461f4bd663e63fe17cf41f0f5efd8c67cf9662d85f6ed7cebca0a77c2a7edd0eb73c08740ed3fdbdf3395610cbb4476871982c2fafc1d0d498dca9332f5c78c82d073485d69e8bf4bed786867f6daba115b22294788992403c76b032819983e66ae4a63cbb8b6a854c78a4878f959065ee3acca4ef2b658863ab51bd85dfdd6067c7bc822513a23908993b71e798d78ad28c635c43b671887c1336c708bd5106584c33235f7b621db713be060efbb0c387ef6272e2da54c2a64b3f730688077debc0f182872c5d381de1a302e4b44f929de8596694de264565bc9423e158c3f5cfea3bd5b2b84b4d8dac44885f4da5cac8a1a52977f5b9a264b4cae67d38b449c661a84af4123d4ae92b0fb323a8ba914aba43e11df2ebdd87e7aded82381d3ce0ba1b78ae0196b96264ef5499ddc483468e97a954b42fa657d5e3f892db910006cf898d1560b9ab5f8152b947137c20e10720c1648e0e1260ef228e12dfd9a892cd11f26493ca8faa4dca70b1c1b55c5b2ed3286f89dcec31cc78643544e9ff69760e46c882dbb0059ba95386a995e1e73f9a79f7caf949be659a58ccc5da3c05103fe777cf3f064a47174355926159a591783a793c52b2caa2828b787b581e04234b2d05c18b0776643f839da0e5ff8732fb6fe6d72e2c74c32efc21eab4bd4e827df70a96c04ab6f4c7dfd8e2cd7b3c900cdd4d8d181ee465514602fd3e6846d3bc769f706fa648eb892fae4f90d9cf90cf535faeb00b54bf4383ef42d94923ef9b33185b0129c77f060f8715e818d6ee849049abdbd2d5bfc98a8faa73510bd3b480e03eb0433cf41dfa84e777b5b6ac3ae7c5e63fc74b22319f670592b90338533c92af93d5302ed7d8e52843da4342baf070a8521e148c734e8bae1245052ec97baf04fb46bbc5ef44ea5885e2a85369d601d3c838ab75c480392a2757535ba9a23971ef6ef725b1e04d309b32003fcf3bcd0a814e6876dc681f248c77d1f2a06459e909993b5805f258e16fa5a06e19ae4c494379e1cab3b893390715af0fdd638d36d471ac52453f7f0d470b1c86f6d622f10493025470d193372c083853c32d6fa276b40b8fbb76c05d442f14c51f4635cdf259c3a795ba78cdecdf13eed2bae15010edf14e5e825bb2ece3f4df2b0b1021725c525fbf53cf31205ed2bac079a5b2a9224dba3b81bd5f9175df155eb0fc7bd8a8142c7beb3c590ba399e0a649877f4a5319f2afe3ae7a622ce86a5113c2090f9feb9debd45ec3483ab2358fb1e91762427c82c2c0e3b948f029d786fd5c843d0b443cb971c7010480c2e9644335f3aa2bd5ca417584d70e868bcc8ee36d280ac500b12fd699db74478335d0777b164c4ef23e3791985456fe2bc569df88815bb20e62a988c82ebb91357fcc1080fa885c40291307eeb5fa912561dcb8045d03711d2f6877a479b21625339217c96fd8d7c216e6cb2e3e7ba61a6318cf95efe4a1ea0fa9993896ce51ae2b46c5e37ece0b721643833f261fe00650f5ec57761ea05acff22317f1b1439f7fb05daa2fadff63fbb0e8c5a38ae019ccd234ab3687ecad9df5e2d715fc28fc15a7389f199bf61a8be7f3b76a4108ba135988bb73013af7322c691314a760e3fb2018e46149bb8696af5e83ba58902bfbf180387f70061876d679f3bc88aae2c8cf8eef3669a9e8f97a10f28c7a3aad3c4583616fecd9130c369c7d92322237fa9e693aca58ec04059698005e652b4193d6142b4ba047d33a7689e7e993d562fb3d058eb4f06e30865b60259aebb10e1478a439e21ea470962832e947c692ac1b8c7f1ae5b6b27f3ff8cc3f468ebf086e359521652b81f8dc587ba6cb0ccba9c1a39ea1d138ed5bdddc6e0d2e5d45d6dd73d3c3ab4bf72d2c324528aff77fa83d40326f13524a5bda783734243ffe90f18beb2f1184b02c872845bc6f461c495352e6da26f0a72e896832119afa8357c9242e67f6bc92088f9b8b639f0a8ef00ed3db7bb57167f52375cdc61d724e8c398d9b980b4326803c8cff59aac036bd88c12264d0f8df53d9685db13765c98d8fa123bd691f0f7f0324ba0bb8fbbd660f39497073c9cad9a55a17f768fcd2137236a84078bcd36ca074a9b405e41673c4e93e45021c1bb93d6458340a3359fe8d3c0c31747759462b2f101128fc2196e67d4c6b1f75ba0861f92a68b9b2f912cc0fe7b9f7e4abdc030e3b3407a2a745caf85ea560602e3d34c0d49c1bb28da5ac65e473c9d83dbe1960a6a0c18ec1aba47a9cfb5bd690aa52a441a1d520765429e9ba2be8e0c4131db9b18e39653a8375ef468d1d95002d3bd34cdbec33cadafb484ee6366343a38b5635aa915cf00266830687f807fb1febe4ce9edd42cb4960b6798ed82dd08e40e13897381a9b7a2d98fedae2ac94b157c498e5a173a792f26f9005ffeaf7db25b767599b31a058a74d75a188aa8c104ad706d3302749834f87574880abfcf4a1f13d4d167f33e14eeaf773ddb182940a5853f5dbb5cabd794ed02c646575241013f5d3b78188d2bb1b537387fec546784a4072652ef74a35440d1a3313ae2ce3615b248a21bd4f5b895b9790a90aee14395a03abbff33ab7dde0045008cc900e05f3f2623c793b22ca673c34e09891c8dc0b3693bbd794bad3536ef698d29a7521e00e9f92fa86485dfc339229b4e5eb0a04abb3e92157aebcc06a06fcc034d358b658d093b6457f39062d2a9bab83a06f9f37c16ca72c66bc267ac21c88a9b29d85367f6f3432a5fe75b39a1e34f169ff7ffb63fefb51ea6d2eef27218a7fbc959f5d1445996c540ffba6f0066f08211aaddd06e2db31d06cd55080afe8ac5851638b8625fc5dcfb4a045da16069903cb3e3587f5745bc6003e338d1d7eac258b8675c1be8ac4f12f58514b834c5462263641a14d603c64586afc468cdb6e97a881d552e0f3c73a9e6d5e31f79eaf0ab8bb0b09c29c39e5652b913553caba3d14cad1eb3d9fbf1a5e56ebda3784756b096f79e3e485389031dac902e53878fc5bf5480c9894f276f1b75b6d19ed40501c10a909e399aa4249f7b6062bd8a6f564752613a61f3282d35bae090656ed29669644947c41f1adafc15def7b780a423d24d9e692a2bd17c0c1250578f684dd672df781285706851c70b98a7518cd5e6e7b4e9823a52e2e0670f56d73de8a1fd7c04b5f42623d640f9be479afcea8bfe3b952650665eddc8c9211fce55b93bf4375586c96e44ed3fd6c45cbf015e9dd08da3c124eb542ace6aca9cd32ceeab9cb2a6949a8ac3e858b3fa222c5bd050256e627c1e61c752b0db05f17fb182f8149a20f15becc5b03221d10b292645f1fddcab6fe21f91c0b6f27109ea839a1dea23db0f76b4c98b2e26997a143569e1bf00baf5274331010d4bfa5d873a3e1480bcc1108a534d4c8412a4009eff91b9fdf103e6fc878df4a8d76a908576dfd577185344fd9aec3014eeffae7a98301fa6155511dd493dadaedc35b30943b90a017d4678745331e253a226bda47185daccc9bf4c004bd0a5f28eb45c4f286436aa6aad2389ea6246dc4472d2c289015fdb5bd4c5b059f50060502c215b8668da3d5c271b1f550e15933b3764861015c76008f3f1a9e15e0fb4779d3f15bb4933290339b51c1be5162c7fafcd0f686d230a7dcff20421a0bbb17789a72d683ac71362ce46d0536d12c8433757a44941a6f132503ece0d2d1147eb459326d48e5f9e081668a2220e60b8c73b1353e0e98231eb7d82b37bbb6e667f4c9c48cbd35916b1c374000762a8b5b41ff7481583fcfc06719119b8876b5b42d8501da5c2537ed20e29f14a6dbf28083def6f32e8ae85d0e5ca08e2897bacbcc69534dd7a5dc56eb506583055d1210443f33963cdaef573fe0d4b6035935f7fa08aba6830ab25b0d6f81fbdbfe5bcd79d4277c5d3c3fb6788f2b45dc729b7374c1368a6a5b63c09035fa890317912ab93c964711c3835a695288c8110c9858bb3897af098ced569aa72022fb25448254d79e8644e2c5d1fb565ec17d728fd5e4a6855f9a4122441d7ac74c820ba50cc41d42061d2a86bd50682c6c074563725aa8caa23df8c065032daf835100b0b887ebef72655488c0d6b223531cd0462fbbd2eb089d03b2015763c2bc24ae7a7ddf86b4643876c23185e86d45554f195ddb1592e1090d921e1daf069deb5f215b3f46170fc95dcdf24ff213adad6b2641bc84d9306d51c8b500597394ac73876a53398497fd2d20e15174e3bf4964cea57852e54505febef5612413655172e1c0eb18fbad3a21014200932381141fdd976c4aa198628fe87226201fb2b04826a8f84d54c53718351e9c496a98cf6e3e3b5885110e7a22b14b7ee47bb27e2508acb3e924167aa952acfbe6621bd4a183e618c896ae4242a5f2131a89a9a836f50f7f7d60c2c1a23f69fce2e8e7189d79fc24478f8a0a565fa0244b504f9f6300324e086e269b90f8c62ee3b322336ae86e0ea12e6f8e7cf5bc115a984cf8f9db1b4ae6aa14d4232e77cb47df8a83c4829a463ab3397515c17192e3d1dfcdaa4d5a6c19a38c759b2db34cd619711943e55acf4b242d2d058cfe57a9f85a89931aba805087be03cde557f5aa2faf2b747928f24de84085b7bfd90ed387b27cfdea7726036bb7a9e99047132859bf672777348bb453cefca54c9d20b279a360e49b8ed8e42d464a14252e92bb603784f3333d230bfec505ada392a2640e837adecf9a1b6b51629d747c508fb91138047943ea3295bef9e267f9cfd7b44bb917a7cc0b3f8c55a81cd5bf0877368a9c068f27aadb2e8827816952fac61504016df1b59e07ea7a97ac351ebff2d3acc35f3a35f08daff69346b29bfafa9539c83f3e3d53e4ef511b7cf403f55f7eaa7f42692349e86333065069dd837d61654878a8f050579ada6ad0f6f144d5bc9b6e81b2f381be150715b517d301a3f5eb05fa5a2e67d15bd78e7156b052c46199d699eac4f1a50a9e64497677fd3f23d1bf988d5cd7b4a24edd5ae192038cbabd0beda37f3dfcd428e40c8d32c94923f8a725e2836fa40b35df4f1540f792ab0d880a1f7f63dc0157ec8c07d86d3cca417f5815753939a5c76556b6fc966c56cfb9af6e47cc3803bc8fb243ae1410475b2fcca4a7342fbd5cb76d2840685cb4d86536822722b26cede048f111b6e2e02fe368f8dbf43cda36d778feb6f4087045ac5ac91313174c5312882f162793631d91a1fa3ddc1953b8242bedc4f84b819b2d843c1a7c9f87694a708938e13ec6a81beb0d2b06e3d499baf1cf5a053ac14819625d988f3416d5aa8859d00e7a85001549f772de2c5ac8dae501cc78b7b3d6ea680dfe2e50bf52080a47ba9ec195b0640005e2edc4f2c7bcb89b497c612b5073a008d1eb70abd9d911b3e577d009326c5178d118fea8eaec0ac423b83da5d22b29f09ec2d915a556e431325235c7895f17e12fb14a53eb20b5a6cc4cd0d62e49865db85a696b40788820ff1d939f03caee21717123cb178567befa163c906a98d9d878f8aa7f010c82cca9f01bc79486f9ec9a6cf528236d7bdde26e42a7f5a57d8e77091721ba34410ac7ace78dab6b3d54ecf3435e578eb7b08131c5930c3f3b4830eea3e7dcd35df13a15584e74d96c0cb0d092b0d504ba361549805c7799c8aeb11384965ceff9fc2259c244015bcc172655ef9528b024935027e384a3df383faf14a65d47e2c849b0788f560f85bb77a12686da384af9f597ef2c23beabf97f9abc95c0aaf1dd79c40c0577008ee7c45449e808811d7c2d3dba5ee39639c4e799e7b38902c06b4454495d64075c7e309b1b7332bb181ceedd6f6043dabf6a055ef7e1cf35747e08c2fe6521dc5c7373904341359bddcb0ba4e8d3bac0ce60a79753bc1b963e21f17f6825ff97565804fbe6a9479f27356f2b5a5cf9f2683f12891b2b3b841fd6e5163a9f7eda105625ae23d0f26dfaf8699f9f6cef66c0e9d6aa78a841e85397196f61f3da9b396c83a6f91c2dbc53c7729b18c93f218d9a5bde5eab27978b74a6d459faf25ed423fe42c010bd9ef88e1d50c68ca5684b1309d242ebab9f67bb2adb188e6262aea316d6581ebf0acf79c89cf42fd34f4a1db0c8b28c48538492f89f49b5595e66b319eb025c526ecbbf00b0c0894978b5d4fc644ae309231e940ebfa4022954e8f8c3908f2f0f7fc4bd1ea4eaa3b82a28ab730a5ad4f4dbac538f32b6a0b16792d80d56f2d9e23a65b6ad7f1a887fd70626cdc4ba265dc7445f5daf8627603aa5843a33bb571594926ea541d0df608405eae457f2d4a4624da2e3f9c14839ddff76c02b83bb100e6db65e5a9a93c315bc67e003158123a40c7e3d9aa8ad90b8f4995852e11c6e7d198c12f397be301ae2f43268dcdc5eb7cdac5ac97e614484d094eee2ec07b3599e36bd890f3a8862b89921aaa8575f9ef267f8434f7c159a9cda52846eeb0bae9f852417c6a0daf6158125a26ba8ecb7c52cde60271774b372f6655ec4dcf7a72cdac275c1d54b511deb34af06d08e5c208ddbe48a308d4f20604a07a3a17396ed849b48fad777fd123d36f7ba8beb0397ce52599ffbf8adc30ffed3cc960c8012e256868415fe1553fe48f3f040dfc439567f784b46049b2229db6987e39e4409983b79320c6a3115f30ac1f23afe560013957464b00afe408e9895806ddacd1ba33f47ace46446d03e777d0820e454661179e84e545f073f13c1ad224725946d7014dc9848f88f54f505210bbffcbab45b5b262eceb406b75713d41d4365067136a5a6e2fc90efd2126915b671967fdf9063daa694d79519a12bb21ede009cfa0c60576881cecb9fe9626fceabecfd1d79218bcc982b06d91b751cf25b1a1ec81fc784df59d741b398d753d6e966eaf5a2b49ba4ad7dc5114b6e521f7bdf5bc457ffffbb3de59711e22ede2ead741b509490ca95e4d7fdc15fc15d9810edecfe939e60c19beedd3dd835cbf8f853bef245393834107d7a3ff4c8a9980789a7508d02beff4fcb984758ebbd8a3b06426b64ab11a5117a87ffc5eedc758418d34b906e0b27703d0cb42a701882c68d8a69ebe866c1176809df67c554874e99e4fe1d4431d345be5cf8e26931237c5ca072a1a17767ac82072617c47d9aab1a2d43e20878eead6d145ac558f54dff6544176444c8ce92e168d5f9731174b581195c51b37ab006888902fd0441c12383a9fc79f55daadd41a618f923c048c576ae47e88148d1295c5e76e34906e5857d05ad256f17d949d0513ef2a9f064281e63c9288a6e67690065d76ea4074354c47b6318cc0db170e25968b61b5a42885d826070f50d90c040bfda79ef02e123e3c63d5a35227da02bd253af81ede613cb3ca4851517b86ba2e3d055ec2b3a89656907eeaf29dd2061908142018a0b32296edf23115b18a2df5613686a5ffdc37df40f4f943a04b749af16e9fd126edaec9c4dab12ae3be308c68f88dea64771eb0fed2a10c272bb23ea27b6322be8b661f54e6ecbae5d9d6594fab46d2a09e371a51baeb536193edc0d21ccf6c6d5dd301038446b757f9d4858dbfa37bed59ce1ce14742571d38fe1a73e9d3a56a4e8b8ab4dedeee5cb1bc634df1bd233be2f77de3fe90f652465e13d3bcb244dec82d66c74a9eb8335158d34e26900970beeeaade115b4d5d73c2c8dff1fa4b1e0381dfb16c15ccb25285180c4830b8b1da9c56d83585ba06d6ef598603ac8631a585902854b3dc316eb3c798bc8ec5a76d23ec4536fed624e9b7a41eacc613bc7fb08f8ae5fb0d65bef849446c0e3648f023243c8eb9bc50a1eed96a3aed799616872428371f8a5269725396dbc83505b11a3d26fb35dd59d58e3f1a920ab3c57fd817eaf5e62fe36c1a72f9af27f0a744c41e48b19c9a04eb71da2dc6e8f3b1aeae2c0474bc8112c769f3c4c130b269fdc875b8e4ab10032f7f024ffa87d26d92896296de28a4398bf4ef34110a6ff5190efe05e0dfd0eeb4729b34e620d14c81e4d5e4314527fbaa0f6199a9ff20eede9cd557878925c9171bd8c3876a3e4f38f64c9e8c338da34c836fb75a82f102e8ee09d0341f4df0725b2b705a9bb2ab7fb827532bd522f4b9f50b98ec011446c67578b7d3b59f18d23745f2f3c7a362eb50d05f9f361c1eb2735dd39e13005f4c489ebf58d7632d78a81de4a4af476fd1dba6498f6ea2da6ccf8bae11fd9b36dc099df269dc97fd65dd0432d9469185df0f172e58317cfd47abaf892cadac2f5d2a7f28eb337bb9179148ce1b8984a3fa7c3ed3d923adee5127e920ce3a1df386a9ff1c5985be9d78bf372a315ab542f0e1b042250495ef16e5a3bb3e2d4f39300b842ffa92be6cf8dd08ba076ee0aadfb5af46c7e556bb896b202fa421b4f170090bea127628ca6803e239665222f5bd9c92947a9071102143efab4c1dbda59dfca0fec6d937e194b5514880f641fc34eeaed6b42ba9438b16def4f20869afe6bfeee5b376ec45044fd499d4f34d0a1ca0c18e68ee71b7ae9688c0f427bd2f81b3811ba4b8d65687fbd59970160ee0fe284efea036405d484e9b3fce088315dcb008737e22544e854f3fa4f5668b4492beec3cce04f959614ded6d314c4464a9516c4c83648d6c1c39e26de2c943a516cf2987398be539511f12a2a83ba186bf6528d3f3a3f14df1d06b783238086aa0a57ea0d28f9b1126efd64adeb4bb25a846b455a7da3b1779ad03b4c75f602ecf60bc730bcdbd65132afec1de490acc654ad98a8d47cb954ea802d23eb7a4509762d1ffaac42711be34eac6061fd55b9894889a0bf029711fc73aea00eb2466c6b3731c232fa65c2833a15e52419716ccff7f2711bd8e9e3a6587965280ffe34eafbf769e28b6ffcd0343132a41546fc2c44357b4c601d3844a304b3e01a9abc08bc935126e5fc00a9739517b2776aa0a38a77d25a24b471028fe64696ee64b4760084f8c5df23f43d7f03cc7c0c674c83e70108c86f73adc56ecb14112192633acdae325c46dca7f5cc96d728c700613c0c44ebf9ec3947e57b41274e3b6f0eef349b429e5879874ab02070e66a5435b68a414d514b2ca4e70d82ab0074222efd44d0abb375b9b778d59814754615e09a395e8d320dd1389ed3363b96fec6c8f437ce942c2a694a1df2c0934eb248117e3d15675c4ade6c4cf6d14ff2208724c106f5a0b99dd3338aee5b1d284b93234c57eed8a43c2c6cf528a7413e548aee042bdcb20f21208b61857c8fc61b894e4e18a3b684dbdbc0636b9bc442a9eebc0bdc7e240243b06a0c7a1813b9db49be42a1176623962be0e8dcbec551afbbd158b0fc0c6f7cab2b8e4f0bf5fa8d6244431a7b8a9d1e58055b268ac2d5755c3bed7764031b87b44cd6492d6bfbf5bdce57187fb659536a036fee66638b6aecdda75cc74d0f7f150319a4ad8184cf0487eb69484471278f10dbb9b15458f79e03ce08ca5e3a208b5747850c492abc05ca1a132404db2e9d00d3515aefb39cdd53391ddba74cb46152ce79c7a415a9be4bb29e7f438a9913d1b631cd743dc6ae772a733734f9a4f31147d355f1a0656afb36dd919d6d8caafb0087e092e73624f3c2e27ef23471c241580e5326c5a85deeab7c1703710025d2351dfd7fe384aade99085e7dd458a8d5672a5c834f7f6c8af69064d4f36600605670916c3a66327bddc1112b04ca19acca18fd07a66a366c3fde6617839a4ac7a5c22ab1498a82c9e6ce82e7c065a6eeac51b6c78c27bc1f81dd587dbb3fe28e9fd49aff9e29cef1f82e01ad8c67c791b50a6a29f64fb5a48d631156127d33b3ad63aff8a5d05b047ea74d25050f8b65ae088421956ff50845fbaf6cd3f9322ab44514a5aa9a26d584acb552033dc0b78de89631b1e93fc60c698901b0e8a834c33001173209a357314a0ea8ac5c0871778cab4842166adbe96d263967ac00223158e137fa8a95047565f00473f4803b194b708342189e3d2f2eed808a21f8bee6c77a155748108f383cf28c5004e925fe39b8cc8e936a604f8d615f96ed5196ade870b8266af8177f4e9b8039df11bf290971358051c4d8698a25769852b50fde06597a3809720df0067c4e552c2257d02788fa2570cf8e3faa11f4463515fee5f1a6225c8bd908aae4513ce22becd0fa162700252a733b753046833ee94ceb1ee541eeba51c5feb7f8629919fbf990ffc9b980387ef8d67ab854bedaf605423d0e08071ce3f75d4b0c6b924f77270d1ef8253617754005d324eb1400a290a27a7042517fe7e8fb4ddc8f54ffa5ca7b2a4e15eea32c7769ca00aadd7f8e4d17f7c1547922d08b9731ee806ffec33bfadbba076eacbc85f899d4acba5f8bc3cbb529ea59404c4740dcb6f99912d0e957a2099d408d13d7183831453ef889e022f973020d2ed9c3d5dda59671dd58d6aa25659e94c47b306098b4cfe707a2592d367727c047d478f7817bc082c175b6ca71e8633cb7a822b8f24f03dfffb92af7cdaebc1c8e96e5f9b9de69f94d1e6ea459fafe28e376c02eb88401ab36dd9d4da28fd04bf31eda2da4ee8f7d93bc62994a2850e846e79156fd40e3762f38d7e03fe43b282128c074f6c7433dc0f8d2523d817866d5a1c2a6291ac37c1ec6b2684c0f0c2bc33f78022f296d1de84cdc1e415a31e3128eb30fd4c85d5a01e1abfaf0a8db912db9bd2340001386c9477cb5a0a464986c45dff1c8df31dd5f1ca351cf146d6f4e47da22f6380b16b73fe23200a5bd6705f2184a38da50f2acce953d88ca37f6794f5e9ad03e564469007ebc58c582e48420fc3cd46b58a47476855ae0e8ec1db1c3a6d6f9158bbde7737989a14bcaf5a0dee0bf45afb6c9461d6472f0c1f9852d0e73ae5db9175046b90aaf2f504ec4e48b8d03a99ffb4020d07e8c16aa8b89de1a1a50e34c9927004de55fe969c4393be9b1790077af20b8bd05810ee1e0c7d42ae6baebc3195dddd58320e9ffbc1b731d0d08a0f50975399626c7e8673a1730d60c05b55b860c40a5513be4abe7b687187e1300237766677afd00065efdfccb6db3e7d5b964fd135d96cf374fbb9d043d844d921caefec5dece881ebb87508f1acc2001699ad40ad771a2b474825caf5538ce8be5303c51528a812ee12b8ccc77204019225ef05b21f466e7fb4983c1d64e2b9fc8db4d309e5add6a2bf8d409bb46afa0568ec52efc84cfae207c8519679d37ca858249cf14283d288bb130b1d40f1ce2fe0ba6b500032b7601a405e946a1913d5a9d7c45531107ffd7b4f17a03c7f6d96e1bd05b6ff27deed4d33a5077733d0496bb37100d4f2264e3f662e2f0beac9a31ddacb8ea6bf3fbd5de5b6cd9f3028d46a2bc11b17b00c4ddc135fc99a3677e22b273ffc1b00aafa51dc0a84c2aa6eedbf166a6c020076272ede13cde0f6fab604d10be97878bf3a9986fb275e4cfeb203ee0096a9dec83cc1d8865de58352f7b4acbd302d1f178eb4c2f6d788fc3ed009b6ed1ad63b905309791a6a8276615dcaffe9353d457f20f5ace433f944eb99d4551bc6a60af1cbc79f5796ae6a3d0e834f0c29be9331bbe7822c1bd183137d75d5459e6c8c0f24900a41aac61e57a9829e8256134f4927e0014cc990e3ab34925368efdacdb6b9ff27fe6e539bab93d72691bbcc6cdcad06c1b8e1018110b62a58c7c103a57b169c9bc5585f002b7936ea14d908b5a94b2e4f3e088c1ca99b7f6ba7197c07db3d1e26d7b3bcaf122ac9447e787b0609bfdf7c66799a88048a34d95b54cbd59eeee329491766fbdd4804cf2b7f5550a35ab620455ea3978d4b4bc0dc4284950eb74667dc203c1c1757568825a95dfc1213a270e707640967a5b08d74c15a00a8380155831aaf4b6b582b630ca24f5ed9eb01e1a9d0ed1fded19699e4d0690264f40c2451a482f861d5f0ffcd290fa9edb8fa8dd0a39c42c12d6babd6f576f3885c37ba46d2dbea93ee82e401c9fbd5db28da7b77eeced6e52981f9aa8b815d0f5b043b8ec6245c50727e213180e36f3c57a74294a891acf3cca5aa146c9281c170864172c25a9873f00847fa511e91d0a34ee57b84e2bf065f710e377e8ec3a1dbdc022ab97c9cdcf26070fab4fde6cbe7dd253b899a895c3d3573341dbff2d4f68015f0ebc3dfb9fe35a6a2df9d7b6a3f4938637c99366fdeac58fba53f2c4f7479a576006ccce9e1ee3752a34589acf85766e97cf03c00a799031f0baf71d261a4944b401ec62b5452d7bc8856c6eed555e2ee4908abe899007cf80a6b82034a6ec686aabfb019290237fbd2634c0d59a8c7a719860af6714572c832a6e17311e088a525c00bd4e8ed5cc0f5b794126741c3098d7254b349dd322146df5cbc4f194774cb1e744debd9ae14a050a69d729a69b25029301e2215087bcab9fa9e2c95a38d1b5c4350dae49322bacd84fa94c8f3649d258424e314d993f704e3d6c4825809c1e0979f1a58682cca4d89558dd83a1c63ca0ce88abbb5dbcf07454135be726e0d2e5603bf59090352fa5e957f4191a18f0a53543ac5a43f0b19999b3a09d73920dfe919bf4bea1b504cd5ae100bea3a3938e01ffe483c86429cc100dd6eab4324e604ceb74c51e8e12133ba5913ce8c3b13984bc709a636821de11a83386f8a9f4e7e053707186fd397f2475c335e9d2c910d25c613646b3003462d876740288163e05007af7badf753ab52ad066a2b9ce9a2ea81aecb88fea81f83ad0bc03082cd99cf109e6d6bb042704ad6a0d51fb70b3bf033a2bccf60c787f845230624987e95016654fc6b7ef229d03f14c10857c48aa3d3b19a552333e713f1659bef9f4ba23803e3827e73aacc62d3043cbb31d632d8fa91920efb0f739b3dd0e5db3911fdc9fbc4afcdb6c983471a4f15a77f52386c2951c493ddd5a59f21258a83713e6b2e3bb6f8aca70a6d07aaaf8037bc809c1e4b878772441e4247ad62080db7c6f3347fa195aae936ed8e1d2d0f710bfa6b0df3def34e0e90b14bf246c8892fb00541c485765877d2b45c9ed3c3cdff5655aa2ec3aac2f726a9b6b32ba36df357349b7faa939eaeed5c5dfc78627e4eb35aa14e952b610d1dcdacf8af17ec755fd9e1e6e7995ad22875b75c3a45272cce782fe0ca45892b409217b112c7079714d96cb0846f2876d19e70464bddec5e4ed8fca4e604591f6195e9dff2c254b5cba5311072f7c2904ee7e3714e4f75729918d2ee21d7e8e630d7125ec09aea5aadb60f1b02fd1718c88bacaf4c5f67a9df39a7ad56c060145546eba29c9f21c9ee700cb92d6559f13504928f3c2dda3dccd8822c156b04b18aecf7b2d2eaa5657236baf307a0a12c98136e749dd506c1e0c32cdaca08a64f0329cb79da734fcf1360bf579018841fbac6eeb523e351713b6679f74011b43f5d0901d915df5f21806fdc89b00a958f903da1ee1a690867aee8de4a43e6a3152cb9c8d3610a1235b2ddbaa9f2981d712ac87599ed3f8ea754336899484c9faa177385be7067c2a73b17736440c80e9415c374c6ffc2a75a6ca98a964abd47f6e5277502e04dee3c36f16da779a27309a78b1d5ba12486aeccb9bc0b2f1b83706f0d0be77518f3b7a6955079bccdcc6818406d1e345e11340a520f00a45ae48866d56ccc1a84c4352b00058992181059a6a7c553209cdf6eb7687dbb210eba3594b24d4d63d96f67e22cd7f1620b8619f4f8ddf429d71801545a31ebaf784523d01246621b1d96babfec07cfb89f212e7dc7b7afa45999559f3a810f3fb678e46c2542c663b10700c0b3b878212c7fcc7d69ab4615f0ced6714ff1237ef9c0e0be58f17db50d9c9d7ca5a4f28679edf266543cfbc640eb68e501f11881be88894a045608e91c3f2bcb0da0a8bc8954dd51c9f013b92ea752864c10643fd13f928b4929b43cfb9abaa0dd946f8b0c80b204480d701d2bdb2d64c3b9b65fbd7cfa963437ff9e96f612892c99c04d3aa6a34097e87bf5a3f3b58995941c8d0b7fb1cabf4f652ec30ced9b4037cdea90fd9cc787c46bed2690c59b7524a194e8fc416cdcd8d01ee0f31ec4d97e8c4db25def0ed25d216ece24d3b524302193c50f819c77ee9f29780b6486f852bcd2e4df55c2346fae048a5fd45b5ef968be1fc93874a1cbe1df9385c20f640ab258bac0d34246cd90e365bdb898b83659b98dcb324b33edac307cf79bf66a244fb4cc23982738588a70fdd58561723c10e3066e1726975607937f49ed41c4d4957bdea924a060af2c919988fb08f1c5812dcaf89392aa5fa01a89e0a0b273016461c6d7d5d1bceb65147b6823fb1fb231a804d314f9b461146c94f6987966ec2d6ae18d3de4c37cafd73ce43db8f9df06d38b8796c5de43e8fb21258cc84e7bb247e7544c717fa1adb7bcdcd7f8cb617cdc0050f857c333679a6d1e8f885fc3f79f0e5a9ef6a77e4d0e06e24e040ecbdfacbada5d4ad902a07d2b7d5b96b74ec438d9862e6408b90ea4f2b4de7a948a9413243c24a174fd15cc377b22f6c9353873b26284ad1eac1a9a09ce7ad175e47c21f82ca655a3e5282d992fa808208d1e8809244a5c733b03ce63dffddc48b17143922d02ef4f9e350f14f2af85a01f87649b85b62cdf71ea7304bb5ebe3041c1b80dc2a0093000530fbe7a80a1644c25b1407ad3d4a765053f43478c08f812dec54707a1715ff9b759a797d17bcbb147ed4dc0af06bcaecf25b22b76d6d08b8ce439790f81880dd1fa74ef5edbfce2ef8a8b0ae8a4cec6c33ec5be04e177dc93ad3d919178fe170e86141356e60b824d806eb4b659fa38e988e97aab3394cd5a01095d0ae2e5839098ac6f9091ca55217c5a1491156bb615ba5f967414ad465859f14641621bcf6ed20e12cd7fcfed6b7f7fef566138af51e2f9f72bdb8ddd6c148976c739ef5cbed7d1600a877f8f31f8a5ae0ad8319d68095102b59115fa6a169a24882860b3ef5994053cf3bf50979b578790093ab6543fe93bfa0ad4ee9085ac379b5087ef155ea93c8140bf792ce062a69d32b91e10a40614a2043b5c95a9bdb57f34de727f24617b800d410af0b885b963c068df03d31fc8e7bc01063a21a9286d9a92c1bc0540521b22a8387ee04b4226b2bcafbefeeb8892e3e0b14011ab7578acd2311b7405dcecca207cbd3b3754cef05ba796e3df47b77be1ff8e3fcd4900325010e2438464393605dded202d61cfdea7fec9f25dc615c51ec1398c80955631037d01eeb530d31e8858c78d22d28d1459412b24b752b3e38afa542eafbe6259fbc21f62330fe22a5cac9d5a9c1c2c20fb679edb15d2da71e07dfb802b937215ff025c4bfd9022d463cf722722fba725ce11dac4096fcd7f33b594543bcdc64517f6920a8569fa5b6086593da948893045f2b751e42f5b3ac244d19aacd21840f66ae135f8aeeeb3610ec80d1e4b096a1bd31809aed5edca69f46a6dd1a1457e2214647d5b055903e058343a13de25df8ed0f5a28c06f04026f01760043bb7b65596c120ac7f760202c142389d84d731a1ad85f170f920927141e3637625851883f8058f4f68d7d6da8171f993ba2a7cc9e4ca0e7b3c474afa46f89d4bb6085f9f75d44c111f31b653a263d49041e923637bb9d4652f5b0b15b70a314c480b8ef74d6f2dea01e6e8c1dd30c989920cef4b5346eec2611ccd01e831cd5881cf915041c601387463c41af1419910c9adceb37c655cc055d1457c6121ab60e89ff5a6447e70519ebd0722d79d1daa21e362073a4d92548701adc822f35dffe04492a2a532550db0b332dd172c32fbcd73d068d521d2a5f10767bdf6910b5dd39a13ab6a7a00fdcc34a424f51ae742b9780682e7c7ad5e4a8a1065f40fbdb8b44176e3f9b2d90187d81bfa3013b7ef8b1d2f77b633ec4410006b727333d5199761ae8247854fa2db0524e815fc8b2fd3ffd8d8371731d1f71b982e3c147fc6dd6f653ca0232e342b1e236367915ed8cf90f8f6346167c42ffd2558b4a5abf6f3810316a9dc5c3de18432b468178cb72a8d30aec2ec860f5635b5472daf3b51e0c62245ca8ed903515a37d596ca0e1f183cea12038c59d3539d089e8c74c2cf6ec110ccf2a88b7b682c2d894d2c6e222a1a01bd8849003a99b89f36186f7213da3ce0ab4ba991b7a08b99fa68d8398859ea510e6f2e80e6c4ee082c480fbd1a29dc5ba6f34238c4c0f3910d7badf21c3682b2386a4a810661c886a6f6ff7c9fecb783fbf7ecdabb45efdbf0bf1a714ecca989d8b4f92e4437341d174d3f7250888f7cdd28355eed94011e8b34a68ea456dd062ab53eb0da5e358aafca1438c220b59aadc98370377bf174ba7a56d4620a2f470b056f7f6a65101ef3b1622af863380d624ba096c6032580c3a724502a5d3a4311d73da2904ecfa93d1dc216e6d8c3fcb6d97c498455d8b85a50ea851a6046acf720fee65bf9ee2c3df10eee085113c98397ff7d053f9cf9625f8a59d8570faed1e2eb0fef98dd7494e875b76f6cbddd32d1bad13772ea3abcb01c02e3d6de5cbe89bdfe604079fcbd4377623c0c5179a83f5325713e924e0ec89ac364c8c10a26db7918a6ff526954e41ee67ebfed8394e19de7fdfc8f8865fafb78399a6e9906c646736e879c52c0da8ac7fa629905d0b146a2e01ce3e1f5bfc386bf2badab37b91d308412f80fd075901f53e48d0642ebb2cc2373cdbd60b21325e8f6ce5a9f23bb52729fab42a3624924096c4f76f7b70b18bfe5a70a6a2115ddf436e0c38b975459e5abf7eecc1afb28dbcccf7b72c983cc3023821007b59fd5040487f6bec89786af78fa721a0bae618acd7b6d44f7fc01cbd4559e44484e00abb434ad98ccd0ec55d56a511d3084ecff7128d40692faee86328f8267e46551d2fb303e6f58724deba67e1b1382108d423ecb292cb5bfad681e4242e39c5caf31456406a3cf9b82c3936cb27c168f3f3a3422ff549fe76a92702b35c9f1d35e33652e4f8c47236311f544f86a86835825e3f7723133a6e757e091b085e4fdc4cfaf646b7d1a1087a427ab9c54e11095fbe19fbe12b29e7ae7ebdf95b527f7a85319195414b6a6f4630be40053a0d031faaf6faa1d5bac016108c6a210c8fe401d31a6c4497ac6b255a3d38dc6f1e4405e3003ff14b6c8477eb26ee382dbadc03fee9c59b51b1f9264eeae0a30d209c3137938ce2c5058119089d21ce168cecf8fdbdea4f02e0fa84af8809fad4c85d6c26478736ee95a4f4f10a4237cbdaa6214ba9ecaa17e6fb35234d439e8a9eee04aec573a4f4267426fd33b66151f88328b7c63f0fea61110b062d9daed2b7dbc466d5c40f96b41c737fea4703490674f7267ce431de3abd8e4b7ea9ebf66be2f9f724822b48e906e264b03c7aec3d2adaf7512c8d8c1e058ed07c7ce59a1dc94d6aa75c6ab2bf3dd22a46bb40dd667ee092301b64238b46bd11f7af0dcb722d39115987b59d1a7c3eec0cafb42ce9f5b3dc8c37c7fbded084023afa2e2a52e3886a69fa39a7a934776671b0432a37c9c6d08ea6239705b7f2879af888283b1c2fffe348c9d1b0b82ea970c19632d74f4c9a0760459fdc01833bf394a430156fed53ada339f7e39c4db52c56dde748a8f5aa3d594433c24722fc656ad29b3069ec80cc8431e2d718fe93c1fd63ab8876c1f63b9fbf7fb17930b0fb07da9ea2f376ca3257d9d93789d74d3ef9b862fdf1a7ee4806e5cf205eeef19571a1b1a4663f2a12ae6a1f986307b257467d72da77ee3119a3c20327b1b09296baa9c1e075c28cdd0a28aba029acbb663339a85dcebab45a2fce5408a9375fadd6869bd2301879c26b7f7c4b91dca0824c8ce077b56e9735ec65af0f25e7bcd365e64e8569041326fe746d1b9dad9af62fdd2d096912f7319955471c2de0166f54f4bfc07c2d5178eb1af13b77dee60240ab2f7fb85087bbcee5f2bf042d587eb7cf88e44762336c352b48e439fd1feccf291bdb656716fbe16df014db238628fcd0cfa9dbf3b2fa15e5f30df7bdf912b3ab62be3fbc9d0b06a49635b2b780b37b01aff20223cd6a37e3d14784e85ad5665b4598f13d6a8913e5514f92d5c30e86b7441a348048ab638647c25e936613fbbe5473f3a67479456c731b2bcfd6b5ce0f6fe9e6526924e191ed6067231709880a136d2ed2c17b208becbfb0225b83e960efb2857796892ed376de8f1918a9562e2d95624fa4a9cab4919a91cc08eae3e0fba2922ac3a601f956fda1466c76e946d8a49be1b7e576feb47d778a78296e8895b67bf24ce0fba02b7ae881ce74cb31f557611b704c70d3e1ffc3038c2cc0c2af7513cbd73a1c9742e0cbff769e46be7ec48f599197ca1d1db4caaf4cdda10f531eca52b31d6cd7e267587bb0da5c6458f9fff29f48c32b74c36ff9a3084f0145c569f56729eccae78b8429615197c5f0480e1c1034221cbc86b0a73c246e63d3bb555686b63ee7a2c03df770ef08f4d0fe1530b55299db5c46911ce20b3eff3f56bae0a12b646c7a2c612b457c52e96a081d78eb7bcc14a8d99b46c2f3848226ebce4548dca772af890b62754c275aeeafe969a547014a470560e7fc83ee8aa7ecd7bbde4ab9f36f100bb24f072f5316e1499266bc245a0fdb4ccd0298719ea7e5a4e8e42e61478ac457783d7eea1bb52870dbf05f933777cfe4162533d8e3a73672b8d037d31ff68fef4ac883829ba6cc9ddc4eeb8d81fb3c8b6f3d6dfdc253b12789fd8a5a0f44e0cdd5f99a2511fde56e0206c13cc814a0d18cad2c0ec015ef743b8aed3b4663f5fbf8cfbf351c64e543950b7d1d43db242f46d3dadf9c82fd633042e83413b8d2d71bf4a3d369573cc8a66c440b2372b9768301977901e6f6c99fe09100c7676c95a28ea50a8d1525394a9970699e283ce5e8c2bfa96b31737e4ab9b7c178a3451ae94457c6a5ec1891c10d2e620b4d0e474bff426f88ea7055d89ca2041084263d56d138600ab8ee255b3c05562283a784bd5a775891a6c900705c67e9ee4ac1574c1aaa7bd18ed603736f4d4bf15a55b28b9d5674a564f9b5ccff3410d0c7acefe6cb877a8f9730c28fec4b9b2c302ffd32eedfe6ba91880ce38ecd4a22d954826c0526f2b2d67083f14bb04917769c5d50d1d1176e03d1adb4d2ad3beadac6892705cc7f94559810c2c3fbfda03b2d591a971ff718a1654be70593b8b213d09177bb0f836f1e3b8752d5497a7197135ab264217bbaaecd959bd11a01089fe98770c0f1a14e1aec64d1fcc13c297ceb7bca397e6815262243ad60f0447b84f6ec5847a824cb1280f91039d77535d5840dd276a735adc385f18234e64d230d0343d16f6a5bcaff1dd2a56236530af66ab0700ccae90cfcffc6f03e675e013c8fa1994a6e5ab1eb7cc5f82dde8ae3d42230552b8a05b6519416ce2fc09aa9c12291e3884947dc08d1067b88a5851ab2092384f462ab21696a0f090831325d9fe2a23c69e4c2a4f0bd7e08f70a049b1108d5838717e3e7c01eee0785487432ff724da3ae8cfa091f26b29f23dcecd2410e6f4ebe4ff2d4e387d021762a59939d9517ed28224022c0eba83fbf03839215887749543ed8d05f052f7dee36b6ed9a11e4712096d8e6efcc5924e691cfbd50db66b5fb8d46fc44eef22f46b47db1aeda6659fbe609ca5d7b9d121df0cba906d263154cd7d43475334b0086cefdc2c8d8bce2cb0ab27d180995960a5453c9f9155b59a44a0cb1df4a7626d027cd1f9499416e7ec7763aa368a0601fe4b214813a6ed7c4b96fbc66fa3a5f4f13ddfe534b91070ab39a5d2ad812e24188a18d5015f6e9e5c6348bd081434dfafc1e622c1ae828c9ec446ac6ff2efdc2f05d0a3c4b9200ddcebcad5256c0e7a42b004e88e59f78b68586f4d93d43a49d6bff4e5b9bcae18b46ec65b5eb364e8757b1ed23f5a4b9f8c3e047e521f8960838ab010a087f190c1dd4c8dddd252d236a3d4f2dff9ee97689f6c66133f0dc7c5b88d2cebd9422de49cf20bd6f5a857de9179a6cd08236162deb5724a9fff7da7d93af2dcc6e5591c7071572a63a101bf1d7193c9237a4f05b9a9a52b1077b42ed7c8220bae47ddfbc146eb693175090379d54b0cf1f4b53bd19e849c9341707e49d5610916a128a4a4b225afa1cf15ebf78b38b9932ddbe1873b647a810da95ac8f6d833d3f1f9c4c53aa54bd57a4b34ce6b272648e0ed3ec042e323b4a51adb99df552f3dd68bad7dc8019599e85bb27eab9ae1bd9e578d90d4b6ad2488af5e2a3fc88f7b586863f628da5f815a8d79cb88377f233f47f0bc3eaa3e8a1803f91867d7e50ddc8128630cbce77814c18d19d467ea5dd7a81e8f866ff9555322b15f931fcfbaa95b5c4f89ee1d8b95d93f518ebed2a1f86d72725a2d7df10b3248be9105af0441e16c4991d172f1b730f07cd370ddcb3185b758cb8649b2c70d22f7ea8ee5e6ee7fbae9ee7ed34e6852fb0f6814058db6301c3242a131951eab052b1cf0dff15e5ce511cadc8af9e58d5244565d87603b61f522160b0f966e9df7e15af2d1cc43fbd8343e119dd44e314cb0d00e578ddfc705fdee256c310d1f6ada6d5129e2f908cc3e47f1a23f67d2ae12561fb136559249a4018870db802761a5f8fde975b6e3030506facbf9ef9ac876fea0d40bd3ae885578cc94afd576084642fb9a1e401b8b79820dfa5f95cb2e443c6faa77254041bb141fea56f7ddee5d169a906e21a20af366c1ca84fb0513c49b2ce061e84e5d809ae664b9a465ef2f516e1c0b14e42c6236e03cf4359a05578740cb4a2d00599502dab04b544b000c067f2369bf18dbc96f21aa284a5fa4f09ce1a999e69438b6debb7093a477f0e3d08c9fda2616b36e3b81e1fed27954e56a69bf1c1595f5871bd58cf483961252e530c148165c06baa450a80a485fc40c4df3c6996191fb70e29fe12e893a5ca523402a896ffab0cd79c3edeabad65a531e457cb86b0a23071b5386938a0f78261f4efaf0e26c746683d066011777ab6558568d46c665e4e70ecee9e37c8696fef6f8e9b50585c1d8c42881753ca80bf96cfc8e3306f85de727e054e524e6bb687b3cc1c12f71223860eaf104cc1375a17fade20de110bd71979e4caa0539571e9bce5f956a5973751f7fac149a925bea1b7cf0d5e029c2f403fca2b2385c257a39193bff3d6810c737f2b2c6b4ea03dd50ab7b3817b217660fe0085e0b302755d7780cc6b4980e18a0f115566ca2198b957cf629f0e7312d72de9d9aa846a2ce7599d155f9386c0a5b1bd0317a403f50aa0cdfad4e3a6f8028e22c83a7e4c067da319efa294af0dc5c55d00de288ddf4a9480936e3a47311868e34d1386ef1b28d789ab6eea99b2cd1fc2acac6aff60d83a77c09e4c8f6058d7012761d1932f79237b143567238e88e590085630879b4ffe8a84d6ce8288507794d957043f9235646d98ec5e6ed3ddf10d93f7b7a754eb6c870ff73eff7b11849cc7103fe158754818410105ba6744ca67cda4569d9ec02bbba77b359e0c3618a0ef5f45736bcb43deb5b3fb1a2116694ec1e8df8d45c9944d963a394a9b8d675c6960085c66b3759b506cd7ea81a2787c90e8d9e128a7829cd6712f4415e160719f0d4832544bad4882a72aa11fa61cd53f17726eca5506a49aa227ca387d9b1719bde561c709c305d1d715a346c719c6caab53d83ab6efa486ce840f887d179bbb4a12ce1b9114dd2495dce9e2637224d06df61407b2a1cd2d6c46b2c8e0cb57d06c2bbd6eca59a157bc30e28dc32df463c75fe068706019a9222f4fca37dbdd80e7492eab904c0787912886085209b0f61f6e287d0b019f225dbc3ff67160a8bff922493c89db5cd30eb99f241ea6b2fb4b93cec04ae364058ef2d4db11e64d4779d2dec6cdc75abc8c0fbe7b3029f57984889e6f8e135d88e5b04139ab816c0240b0350476f4c2c6e9d47286641b1fc68d49bdbb60b331dcbecd1bcfc5e60ef33511d3734b0552d47a7fade443becfab95004bc4ffe62d761e8af274dc573d8fb9c7125cce816ccea2739107287d9b082cca5b3e4d174dd1b989031d4840bac27bad70a536c008b69264075cde62b634031414be67d8a1f33d7971040c80fe4c3ef12f39fe652e337ea151061e51eb459988846fa5f1d5107bc76f7bc86d1652b81847e38afed6ec9499af4aa43f675f9e09b61851cde0743812fc9c9cff1fbb8e67b362d5aebe3949f0c9afa0aade64c8e6eed1720ce2ff5be5661c2e5aba3b29f916a4265c5d5aa18b7aa3333f205eaf073792cae2aba9106fc179666cb7aa4c50838411f23c4b6a7aca12f1372152f38b94cf898ee9a6495d9276f05a08246a61b7550643853fd54dabe1196119019effa79004739a03493f494badc052d38b9a2235416d0aaf24f32ac6e4fc4ea89d7718123ff245794bbfabd71e2a00a140f450747236e684fe69a6e0d8ddea6cc1bb66d99a453ac5fbd533675e5dc443a8b9743979a01dd1c5d74e1fe1a23749408e433df58d91cde21fce6196fa81e58a80b0483a01f9e0dc443e450f3bb1bc55928404190a4d84176ff725ead1610ba20db45a3bb4cdd78be2fcc0a811a838fec4e32fe6e3814181fcf67670d1c643155b0d4bc600ff16594ddce54001e688865b0c26447753e383a2bb10425d8da483d0a364ec7255814bba4a99cd50b9722f88456deb405a1e8d926a1ea1d6e28f52f35ce28e3caf8149ca11c7a7e6ec174a049aa41d40b917d445933176e453569ce749e8e0d85b7c5485da5a9ea74e883a33c9063943b436626072ca81074fe56cbdb098af5de203bd5783f7c738fab3d459d8967ed7222ee33088496709f7349b68720d530773c9613970cb7eda03cda59878ab8df058295b415f505cff603422ab446725fb6a17b3b1cedcfe34eca6de8272c50bf331d96f6f9f2c35724a5f13aaf8ccd27ce42a987eefe380e994baf014d90f046989bba8cecee6d9c4d0086370e6df18749a9e1b5cb19eceb1d9136aaf758e93e99cd8b19a87748e59b719e3b3005b1ec3a5a290005148bd704cf1751e5e624a96409128b54515b24e049f15712a07d80f0c1cbff64eb94dbe997a678d18508ebced38b14529a26587d5974693c126c6af7ad36d3f20556a741df4dda1c24444a7d02490deabedcb409699bb3b381f27f30d953f28f232dc17accdf2b2e2c060373d4d2dfb23ba4f799efcf5bce3e85365fea749848452dc77218b97bb0df642d55e1effce5c925c52b135b3555cfbdd86e293c33f90d50705813a07da24007a4b77d17c49aecebbade03bbec67072e55d39666ac8a9f52abe636630c5f0d15a0ae042da150360002fc3fe7fc73345ed41aa68f9ad14f0c7e3263d7e6bd66ea4104cc88d49395705d17418296c99bdf68cfae94fe96cd45ff088fc6c6ec95dc77a817c540bef514e0f06dac9fab797c0fba9e47a6b1aa66d5961816ec1a390ab65c73e4671935632cf71912d1fac64544f207044d44d1d39d6ab734ef793fb04be8464cd20dc8b26365377fff89d437b196bbb134fc8052ebefcfcce2e8d2320cc60f5ece4bff91b0606fd34d2e761a63386658e1683f95705d929f7b99f70fd6d6be8333a224eb02287020c93c9948387bcc9f0cc6a4b26e7c4827f4c070541e710ff158e574488d2261ac716222306de941e03bf98a01b7d3873f493ef1ab25d3740b58fa15f29cb9ba64c037d95489cf92da28b5552663b26d5fcfbdd95a27db3f43428199211678dfc5f5dab3f3d6e55f5d6e5f298ee3678c9b2fa987371ac1a1d2801d36589d1024b77cbd440e212924773f1ceb370a5a5ccdbe5fe8040c740b49570754011d43ee695bc99741dee4d6976a4cf829c50d5ca9f4488a4c156cd1a926cbb3378f51ee6cd4628c54a5b05577075423d56200d427966b0484fafddb9de29679f0c8488fbef782b9f35780f07a5a82585abd0a8b5eaf2562310c36a8edbb41aaf02510f409d014d177d9a72f5d22352db43b3d4146e4a2b4fce540b02d4995f7a9b9592d64f710e9cae676a3a105c23681cd6c54becef5ae85d03f391e2e253b33d486d4961efac2fed3d4f4e6d41062fd8473d3bbeb80c5fd2bdcf268455afab0224ab5b767114e57a6ed3bbef6641af4f55965030fec6f261de4c49a8f901ae8763ccc31df751cd2589a20385b6fe8c3306bb5893456ea8fd919f45083a34c4e45e43c626e526d978063c94150314fead17ef3ec083e63ffb838f3c382e797ab58686e649ec3c7431b043eb93bb66491e08a5f172d45f67bde4cb0d6b2eaf264a8130628eb03e2d7299b6d1386c34826c94081cccab0d41e73a43f67bbd9930e8f038b063ac1b451e3b48b33f78bc97c8865acaaae01e6d24d417d412e0db38532c0f1dd7bfe740d9b1df1412367891a49036d33fd3a004cb010745930aab64909ca314a5394a9772bcf6a18db9cebef54092c3aca54643f675aad8369eaa4dcdf19ce1b9444d637ce6b90dd3b834113eaae746ff51c5fa4ab8bad4d0d364467f788601505662a7b99c7ec595e6ac78ebfbb4eea7b2649a9d752bc12b3e8024ef1d095f325eb37f3f8aed8e294e95d019cb17bf94e7ba39f4dd3e6761dc21ff26fabcbe3789235c14af588b3f3e21bb1e9cf1f68c41c4b0eda197154e8bea1f5c22860422c369fd70de621cb78745e6e488f5957f2ea5538a15a0fdc089ab20bbaa859b75aa465e88d0a24a3065a09fade04f0c6ae894038aa29c678d000f99f6c652a56469735a6b3c17d56e0b0b68452bda52bc4426a4ab47a4f69e9f3f88614f1101e7fd19decfe32c52cccfda02bb764abc90c642c4cff0ed1f82cc9309764b9dc17d909e860e3cb0f5c76d45a26e5c7a7261ab55ac89f07b599867a81c82bff5705f1e5ca0ca91a7ac7f3c654a53a23aad031ce73993020ed0066e795b8e756c8f1c5a6b8387b9213dd139014383ef6c067b32ebd43eb57c5f1391e6ddeface22e5441458b0d7ec252a4bb8a00d2c3f9f65c40c22eb0dbba8a2b0d59b60b123d9c04d69ab3b947d2c0cbcff5a3107dcae77767c13f4f4b18e9bf98ea489c59e4e72d91aa46f7ab4530e7855f115a7b30615f08481f1efbc324c24b8a7efa2d135ebfd9c549df3dcd33ce9a3b22aa005752e7091c40a38e9d63c17c98ebd22e09e2eaa5fe84b08ec25695077a635210a6024ad191727b5bd97726ce028529fa8e50879f083419e7fbfc8d721b2d26d1339de713ad1db3d02f7195d4e811e8c50068b405d39a5c8f6292d5bb22b70f56ef64b45856f652f9f25dea4e4369fd7fdc0419622054746d8dab5698b7f5a507e14af2a850d8ad4d497e70e7d9da5befd9b59969745007d5dc5a76b35c732940bf6021a2e2219cddc4d96ee8447ae658b0371a838044ae1bf8f49707356946241120a6c22d191b6b66600cd533f4ca3aa021b72e118d9255e5e014052223c07251e7749e46409a206242641fb60bc8fb6c3f857d66c01f8cd8f25180af3301f2338bb89b9b68c384dd36d7e2e67599b204efba184cae98d32b8a5805b7fbcaab9ba8a89754fcb9af196b9e6a2cb595e9b584f305b4b6648b7aea7a47cb2def51e2d358e490ec1e73bb3a2ed9cbfa62e27af1f98a088b0cb6180cc38b5e355d599211e29be2045ac70fe4b470ef17f85620893a152c4c17f4dbec6e59bac860504297d9fe46937fa0c2d518b83eea6e7ce4d3e97d0e3d39ccded57ab0915c0176e003b014086391907f8595c951b3eab20db'
+ nonce: '0'
+ storage: {}
+ a94f5374fce5edbc8e2a8697c15331677e6ebf0b:
+ balance: '1000000000000000000'
+ code: '0x00'
+ nonce: '0'
+ storage: {}
+ expect:
+ - indexes:
+ data: !!int -1
+ gas: !!int -1
+ value: !!int -1
+ network:
+ - '>Byzantium'
+ result:
+ 095e7baea6a6c7c4c2dfeb977efac326af552d87:
+ balance: '1000000000000000001'
+ storage: {
+ 0: '0xb157aebf65d6a7e95d50740ed1029e7e599233e72550fe17741a5f893117836d',
+ 1: '24575'
+ }
+ transaction:
+ data:
+ - ''
+ gasLimit:
+ - '400000'
+ gasPrice: '1'
+ nonce: '0'
+ secretKey: 45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8
+ to: 095e7baea6a6c7c4c2dfeb977efac326af552d87
+ value:
+ - '1'
diff --git a/src/GeneralStateTestsFiller/stExtCodeHash/extCodeHashNonExistingAccountFiller.yml b/src/GeneralStateTestsFiller/stExtCodeHash/extCodeHashNonExistingAccountFiller.yml
new file mode 100644
index 000000000..2648295cb
--- /dev/null
+++ b/src/GeneralStateTestsFiller/stExtCodeHash/extCodeHashNonExistingAccountFiller.yml
@@ -0,0 +1,74 @@
+# EXTCODEHASH to a not existing account must be 0
+---
+extCodeHashNonExistingAccount:
+ env:
+ currentCoinbase: 2adc25665018aa1fe0e6bc666dac8fc2697ff9ba
+ currentDifficulty: '0x20000'
+ currentGasLimit: "1000000"
+ currentNumber: "1"
+ currentTimestamp: "1000"
+ previousHash: 5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6
+ pre:
+ 095e7baea6a6c7c4c2dfeb977efac326af552d87:
+ balance: '1000000000000000000'
+ code: |
+ {
+ (CALL 150000 0xdeadbeef00000000000000000000000000000000 0 0 0 0 32)
+ (RETURNDATACOPY 0 0 32)
+ [[0]] (MLOAD 0)
+ (CALL 150000 0xaeadbeef00000000000000000000000000000000 0 0 0 0 32)
+ (RETURNDATACOPY 0 0 32)
+ [[1]] (MLOAD 0)
+ }
+ nonce: '0'
+ storage: {}
+ deadbeef00000000000000000000000000000000:
+ balance: '1000000000000000000'
+ code: |
+ {
+ (MSTORE 0 (EXTCODEHASH 0xdeadbeef00000000000000000000000000000001))
+ (RETURN 0 32)
+ }
+ nonce: '0'
+ storage: {}
+ aeadbeef00000000000000000000000000000000:
+ balance: '1000000000000000000'
+ code: |
+ {
+ (MSTORE 0 (EXTCODESIZE 0xdeadbeef00000000000000000000000000000001))
+ (RETURN 0 32)
+ }
+ nonce: '0'
+ storage: {}
+ a94f5374fce5edbc8e2a8697c15331677e6ebf0b:
+ balance: '1000000000000000000'
+ code: '0x00'
+ nonce: '0'
+ storage: {}
+ expect:
+ - indexes:
+ data: !!int -1
+ gas: !!int -1
+ value: !!int -1
+ network:
+ - '>Byzantium'
+ result:
+ 095e7baea6a6c7c4c2dfeb977efac326af552d87:
+ balance: '1000000000000000001'
+ storage: {
+ 0: '0',
+ 1: '0'
+ }
+ deadbeef00000000000000000000000000000001:
+ shouldnotexist: '1'
+ transaction:
+ data:
+ - ''
+ gasLimit:
+ - '400000'
+ gasPrice: '1'
+ nonce: '0'
+ secretKey: 45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8
+ to: 095e7baea6a6c7c4c2dfeb977efac326af552d87
+ value:
+ - '1'
diff --git a/src/GeneralStateTestsFiller/stExtCodeHash/extCodeHashPrecompilesFiller.yml b/src/GeneralStateTestsFiller/stExtCodeHash/extCodeHashPrecompilesFiller.yml
new file mode 100644
index 000000000..ae8099d54
--- /dev/null
+++ b/src/GeneralStateTestsFiller/stExtCodeHash/extCodeHashPrecompilesFiller.yml
@@ -0,0 +1,160 @@
+# EXTCODEHASH of precompiles addresses
+---
+extCodeHashPrecompiles:
+ env:
+ currentCoinbase: 2adc25665018aa1fe0e6bc666dac8fc2697ff9ba
+ currentDifficulty: '0x20000'
+ currentGasLimit: "1000000"
+ currentNumber: "1"
+ currentTimestamp: "1000"
+ previousHash: 5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6
+ pre:
+ 095e7baea6a6c7c4c2dfeb977efac326af552d87:
+ balance: '1000000000000000000'
+ code: |
+ {
+ (CALL 150000 0xaaaaaaaa00000000000000000000000000000001 0 0 0 0 32)
+ (RETURNDATACOPY 0 0 32)
+ [[0]] (MLOAD 0)
+ (CALL 150000 0xaaaaaaaa00000000000000000000000000000002 0 0 0 0 32)
+ (RETURNDATACOPY 0 0 32)
+ [[1]] (MLOAD 0)
+ (CALL 150000 0xaaaaaaaa00000000000000000000000000000003 0 0 0 0 32)
+ (RETURNDATACOPY 0 0 32)
+ [[2]] (MLOAD 0)
+ (CALL 150000 0xaaaaaaaa00000000000000000000000000000004 0 0 0 0 32)
+ (RETURNDATACOPY 0 0 32)
+ [[3]] (MLOAD 0)
+ (CALL 150000 0xaaaaaaaa00000000000000000000000000000005 0 0 0 0 32)
+ (RETURNDATACOPY 0 0 32)
+ [[4]] (MLOAD 0)
+ (CALL 150000 0xaaaaaaaa00000000000000000000000000000006 0 0 0 0 32)
+ (RETURNDATACOPY 0 0 32)
+ [[5]] (MLOAD 0)
+ (CALL 150000 0xaaaaaaaa00000000000000000000000000000007 0 0 0 0 32)
+ (RETURNDATACOPY 0 0 32)
+ [[6]] (MLOAD 0)
+ (CALL 150000 0xaaaaaaaa00000000000000000000000000000008 0 0 0 0 32)
+ (RETURNDATACOPY 0 0 32)
+ [[7]] (MLOAD 0)
+ }
+ nonce: '0'
+ storage: { # initialize storage values to 0x01
+ 0: "0x01",
+ 1: "0x01",
+ 2: "0x01",
+ 3: "0x01",
+ 4: "0x01",
+ 5: "0x01",
+ 6: "0x01",
+ 7: "0x01"
+ }
+ aaaaaaaa00000000000000000000000000000001:
+ balance: '1000000000000000000'
+ code: |
+ {
+ (MSTORE 0 (EXTCODEHASH 0x0000000000000000000000000000000000000001))
+ (RETURN 0 32)
+ }
+ nonce: '0'
+ storage: {}
+ aaaaaaaa00000000000000000000000000000002:
+ balance: '1000000000000000000'
+ code: |
+ {
+ (MSTORE 0 (EXTCODESIZE 0x0000000000000000000000000000000000000002))
+ (RETURN 0 32)
+ }
+ nonce: '0'
+ storage: {}
+ # account with random bytecode with code size = MAXCODESIZE - 1 = 24575
+ aaaaaaaa00000000000000000000000000000003:
+ balance: '1000000000000000000'
+ code: |
+ {
+ (MSTORE 0 (EXTCODESIZE 0x0000000000000000000000000000000000000003))
+ (RETURN 0 32)
+ }
+ nonce: '0'
+ storage: {}
+ aaaaaaaa00000000000000000000000000000004:
+ balance: '1000000000000000000'
+ code: |
+ {
+ (MSTORE 0 (EXTCODESIZE 0x0000000000000000000000000000000000000004))
+ (RETURN 0 32)
+ }
+ nonce: '0'
+ storage: {}
+ aaaaaaaa00000000000000000000000000000005:
+ balance: '1000000000000000000'
+ code: |
+ {
+ (MSTORE 0 (EXTCODESIZE 0x0000000000000000000000000000000000000005))
+ (RETURN 0 32)
+ }
+ nonce: '0'
+ storage: {}
+ aaaaaaaa00000000000000000000000000000006:
+ balance: '1000000000000000000'
+ code: |
+ {
+ (MSTORE 0 (EXTCODESIZE 0x0000000000000000000000000000000000000006))
+ (RETURN 0 32)
+ }
+ nonce: '0'
+ storage: {}
+ aaaaaaaa00000000000000000000000000000007:
+ balance: '1000000000000000000'
+ code: |
+ {
+ (MSTORE 0 (EXTCODESIZE 0x0000000000000000000000000000000000000007))
+ (RETURN 0 32)
+ }
+ nonce: '0'
+ storage: {}
+ aaaaaaaa00000000000000000000000000000008:
+ balance: '1000000000000000000'
+ code: |
+ {
+ (MSTORE 0 (EXTCODESIZE 0x0000000000000000000000000000000000000008))
+ (RETURN 0 32)
+ }
+ nonce: '0'
+ storage: {}
+ a94f5374fce5edbc8e2a8697c15331677e6ebf0b:
+ balance: '1000000000000000000'
+ code: '0x00'
+ nonce: '0'
+ storage: {}
+ expect:
+ - indexes:
+ data: !!int -1
+ gas: !!int -1
+ value: !!int -1
+ network:
+ - '>Byzantium'
+ result:
+ 095e7baea6a6c7c4c2dfeb977efac326af552d87:
+ balance: '1000000000000000001'
+ storage: { # codehash of precompiles must be 0
+ 0: '0',
+ 1: '0',
+ 2: '0',
+ 3: '0',
+ 4: '0',
+ 5: '0',
+ 6: '0',
+ 7: '0'
+ }
+ transaction:
+ data:
+ - ''
+ gasLimit:
+ - '400000'
+ gasPrice: '1'
+ nonce: '0'
+ secretKey: 45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8
+ to: 095e7baea6a6c7c4c2dfeb977efac326af552d87
+ value:
+ - '1'