diff --git a/electrumx/lib/tx.py b/electrumx/lib/tx.py index 0feceb4..6e22dd7 100644 --- a/electrumx/lib/tx.py +++ b/electrumx/lib/tx.py @@ -320,26 +320,47 @@ class TxJoinSplit(namedtuple("Tx", "version inputs outputs locktime")): class DeserializerZcash(DeserializerEquihash): def read_tx(self): header = self._read_le_uint32() - overwinterd = ((header >> 31) == 1) - if overwinterd: + overwintered = ((header >> 31) == 1) + if overwintered: version = header & 0x7fffffff - self._read_le_uint32() # versionGroupId + self.cursor += 4 # versionGroupId else: version = header + + is_overwinter_v3 = version == 3 + is_sapling_v4 = version == 4 + base_tx = TxJoinSplit( version, self._read_inputs(), # inputs self._read_outputs(), # outputs self._read_le_uint32() # locktime ) - if base_tx.version >= 3: - self._read_le_uint32() # expiryHeight + + if is_overwinter_v3 or is_sapling_v4: + self.cursor += 4 # expiryHeight + + has_shielded = False + if is_sapling_v4: + self.cursor += 8 # valueBalance + shielded_spend_size = self._read_varint() + self.cursor += shielded_spend_size * 384 # vShieldedSpend + shielded_output_size = self._read_varint() + self.cursor += shielded_output_size * 948 # vShieldedOutput + has_shielded = shielded_spend_size > 0 or shielded_output_size > 0 + if base_tx.version >= 2: joinsplit_size = self._read_varint() if joinsplit_size > 0: - self.cursor += joinsplit_size * 1802 # JSDescription + joinsplit_desc_len = 1506 + (192 if is_sapling_v4 else 296) + # JSDescription + self.cursor += joinsplit_size * joinsplit_desc_len self.cursor += 32 # joinSplitPubKey self.cursor += 64 # joinSplitSig + + if is_sapling_v4 and has_shielded: + self.cursor += 64 # bindingSig + return base_tx diff --git a/tests/blocks/zcash_testnet_283046.json b/tests/blocks/zcash_testnet_283046.json new file mode 100644 index 0000000..5fb169b --- /dev/null +++ b/tests/blocks/zcash_testnet_283046.json @@ -0,0 +1,16 @@ +{ + "hash": "00036319ae4cfea536d543ea410b89277826340af6134b5ae7972a4f7a3de0a6", + "size": 5276, + "height": 283046, + "merkleroot": "888873d6cc24794d835db193072079d07818dd94dc7401faba955b718965c821", + "tx": [ + "d89a3b4ff8c333875a4a6b6cbe7de9e651f3c6007598c5ef108174ac1b626336", + "ba4d2c82b6700d57c0614fe5bd1fb90fe73da10e61dde2f3b3c87209388c419d", + "5be150e493a89448530a3b0cb43a7bf1c134be937bdc6ea8bb4cbaa5c89c8914" + ], + "time": 1535721514, + "nonce": "00008bfa4bc3c42aaf193cbbb47bca9024391021403e1d45f39a01159c82009a", + "bits": "1f101e83", + "previousblockhash": "00028bdd7797c57413d00165953ff6313e9c5f2d194338312e78b8a55ca6aa24", + "block": "0400000024aaa65ca5b8782e313843192d5f9c3e31f63f956501d01374c59777dd8b020021c86589715b95bafa0174dc94dd1878d079200793b15d834d7924ccd67388888e237da776e7b2209e994340db5cb6124351b503e52943ea095df5f2b93385322a40895b831e101f9a00829c15019af3451d3e402110392490ca7bb4bb3c19af2ac4c34bfa8b0000fd4005001e3c11c2a45123afb3e96715d03aa6e3127b0bb225499523d710dc893d3bf2c1f334794cc3fe8d80fe0881e1d7b9d4a386dd47b0d051d5f8e6158755b52d3af9dad1ae974c2b978156a687bd21c62f6ad49ee9040c295406602a6d1cf482a03e7924f12544134135153c3779202b31cbeacfb2c943b7b98b0d795a622f15b14a82948a2db4f2bb0a3d937427af7c2f5d3ff231bf1da5469c3dafc8c8489be3f5803fb923bf27760e7fe52dddafa581af7494c46d72870ab68ff5e0654d312fc37ce17ded3fd9360dccb3b139a4e09e59990f0cb707640849496eaf856acd424107a6377dfea63967abb4425289139395c54e1330d9625075d96c221911e4b2629f62afad84048d3a55a91deea95322b41b4fb165eee79b75a240522496128d0cd6905e93f42dba2efe3b6cf6276be533b068f7f379533a9d16ce622f048a1b1f1feb8c16b83bd9dd52f76d78fe7f7d016740e2bef9c135fe83e1b889f269fdb77433ab4f15c4a9010517ac156246150c923f641e0b3c9702f10784dde19a43e5211992765c5841ab51adaed4177e0f8291eeba12d600d3d803d7cec09e2947cf5c188805a6147490c19c81368291fcb1d971c66cb8d5a612494b7e9d4895e6f9563b7a52a07a22035a037ba03f186a7cac5ba44b699bbcb1fc067c0841a571bda4b623fb24e4fa2db4737304e4caf17bdf6ec0013af28a03ce1c75b98cc6f5acf242b355a41187218b3d98781026c8be15eb0069a5e642554cea1a590ccdfa425a0c62d9ca05596fbf92c511135f32e4e9b018b3f0f624de86dd5d7bfcbdf053072bddda2e45d498b286780f79fa3890b33a7bb120e77e2feaf376c85a7802642db0a6670dd735dd8f1602f5ad37eaa0cdfa780ef91b26598f122a5f17ca8b763a636e622a24c5bc44b04891cfcd5d9228ab5635266a1a3be239e70a1784d905673bee5555c8bd7e08b452d05792f9b328fce2cd198fce244b89e03987bd12a41bd5ec0aeb3f3bd5342765372b49dbe00fb1e3347fea7abb2dde3691b3a32d4afb4ec9528f94d9628797cc3d0e7dfffb33af2d0d219f3188b713b5e4dad11edd407e28f8b8ec4904281fb40840a22e7b9ec0868ade467cd6890cdef721499a63a4401f6e4be95a251644f31d75a9da11ed954ac2840b0b59792db113e63dd7d09179b5a437dac5097bf7b5418ed871448c51f74c186d662a8e993afb0ba909025cb011698bb831035b3fc66ef86bfa947b09dabeb1a3ac63fdb3891524e86630361bceb58c3a2e725a4ae49d6f4d7c1344993d6644c6970bdca50e099e65ae0e89d3389113528bdb1b42d8bcd2923d803fd9ba493452319761c3f42031ccd7c1655055d90d142061b0758a34d6ebaed959c0fa6dafac86be20ed1fe20f26e3312833af5c75479ebe4a2d556b12b0e709ef7351ebcad944952c760a57d76619d5a72f0af94ccd7ed05d1b5b974067b8409cceb7da871e99a9550d793cabf0e03f0bc54a40e1d45fb71fb40eff2e6d0fa7c994c086a5c1afda32c3fcc62854bff62e19871679922ea6cfa2dfffc9d8764d43e162ce3d7ede0e1c56cd625dc92aab124955bdc4c56d15a26f9da23225f5a2e22f4c5c773afcb2dcf4e0dceee183fdab88291b16bea9a952837df075e439759f55cc05b80d440b637a3bfcccf2194daf02581278594676efdbadac0f098ac53299756b6b89357e6f7d0419ad55f6527b0e1763c0c3e3c2737be3e319dade3525aeedefc806683064bafc69c21b545837472abea915f41ab3d7d826bb22e6eedc128736b6928c7b9ffa3366633fbde03546fa3c36f2e9fdc81e0500f1c8a6cdee3b121d11332769bd7db2dae1b19e24e856cfb8fd99ccbcc6953f9d44e1c1eab607f600c42ce171b92f2cc3799fcb030400008085202f89010000000000000000000000000000000000000000000000000000000000000000ffffffff0603a651040113ffffffff0220189b3b000000001976a9148a6c756f01e86875e6b6213d536dbd263266062888ac80b2e60e0000000017a9142a71f51b268f74eb3ee5631090589bbf6239bc0c87000000000000000000000000000000000000000400008085202f89000000000000b8510400000000000000000000000100000000000000001027000000000000b68ee5cc6a137376d3c0ee85f6b79a83e432866f99c703db6217064078cc5f4d5ce93244554705daea62988d0f0da3be49ddcc476e471a2bbc2accd465c0baf402e6d35f8b303e3f8b1231fa399781419d28ef75e02391ba22bfee327c51d66e09489e9658689c1d4620010867d5127d04868580c555a91628aecae28061b2c9add8145b186169af5473b7b3bcad895f697b6ddfe8ae866cd6e4de64bd95d20e54f53097353de0fb55e95cd4e711218cb8371b7dce40610318e4f1741369fd390b3028ba8997c9c26de87586cdc9660446e275b936e8338b8151df4bae86fc6e12d382fbb070f93da7e754c06120662c1cae5c220f42c0844fab2aabd7217efb124c049dd377ff53d462133bf83d391566fea5739069d2e1fdf546b915b4f835b51be43a6e82d4ed73490912e3e12a75e7cee1c193f9f8683b7f61ee0813fe949039d4ab7ab220e88b62a5f8fdaf12b588a63c4007410ca49876e5c27a1b2f9c7470509f02a1c50561f39b5bb82e4ab7af2ccfc59254996f107e9f6357b86c49073cc1f772cf33f72deeb09d66d55a97a757b20b3344d3f3b2951c4f3b79db614111f11f6c73fba9d6c0a3fb6740785197d15b900e95795bc48459f3c068022bcb4d15bc4a37f3a92c42c66035cb3fa9fa467c9cafe0efb4fd4d9a9313f0f0889a16c0287e1cd7f0f1952104de00faf616b5981010bfeba2f89fcb2a4e86d496cd579281e6e0bc3fe395fb2a695c38574a0d755c43fe8a5bb802c9d7524c2f353bf4f885d12b986ab608cca547264f9e00d1f611f9d9d0068e7d78e4ce44e6fb83ae7b25448d40c7949bb07331fe030ff81490346d5896b686a760c6139384dfcbdf2dbe43bff776a228c2418178a8f20b9fb483d60788e3b5126f1fca8f311c4af651efa3595957530f8376c60e945e10af3295d3bc6377d93056ba9135dfe43af5b355bbb9c80f10007a5b77ad6d2db49debd7f4f6733d58c79aa0e41d57fe6b37e65a612f5a6087db37c26819691c44f54a208fc210129b51ecb04aec3c6ffd36037efa69986df75d27d0ff01436999f39e4eef379d2b82ca1a8ea5330b383eb6132a23f1a53ff3e02bc2376509a402d5fb4a19fc5685ab5f829a91bef032573e68df896187baae4f24d88db8ea132237fa90b91c1b1cfd42f09952d2f18cfc9c152c532021a06b9dddc1d757a1fe9cf954081a1ef7fd5df0d9a2567a0e6e523f1bc9820dc05c63dd66d2d0dd12d4aaff4ad8a1fd9aca06dc88f5e4820f03078a0aaa1d09c66ff7e57ee4008202175c78905321fcf6beba47d733dc8b527d07bc37bf16ccbe48a79001df1ff104ec90022ed0f6ea7fcd2868a1c5f1f2f3ded4136eeb7db04a59d61e3ec467d8309754b935ab93270222eabce4a66fd656adaa4fb5b461a7a9bc7b3585d36b44d454b64f357043c6f3493eccb06dab906b5cd04bb7e528f72152ef9c5780a78c3a4595a0b075d93c335fc520c53864da9b651109096c121b21b59eceee1c77b64bcccbf257ce119cb087f4aad5ca370550ba2d36810812c40c5c089a84133ae44edb7b42ab45e24cb1fc7b596de06633150e5bf788bed5425846bd5a675b2058235a548483c3b10b0bd695e332aff865596e42ad4ca4a2237ac2bc2373d2d57516b81c81f4349115bcea3d0c72db84a3118ad37836b0ef60a4b3e3cf73348c549678f252531a28fcb90dc6f33b9dac715850cbfca1b16665b13e6212665e72560210dd6e31a92b0186fb698d44a21f496d7b81c9ca9f27ad3d74e7c13169de2e05b69792f18bd19d4dc4eabf75651dddeffe07d924cbcdf284cc586632b6740deec554cb4b46f1ee9a68c8c480e531233b3f2711063353405b4da84c0059b33c1f052a4672ab39cd95902158b5b0401126faa0fc79fd484714569761e8c374ba144480a16abba522acd20b6c629b07c7e8fc70bb5a5e760bf8dc7917a3cec7be5a95a1e28db54032eea849bb018b48bda820848e531131629e59cd1cf4fac78c074be3b22fcc316b0791bcc481841cc1bdcfb489f92eefc24343a34944bf71aaa9a324978a183551b4c179691794cad00cf96181deed56444e307a64f288deb49646c0cc5dddcd691824644c36845f1bb823874393e4e9d6b3fcb35e2f05f45a9ffd60e36d1937751de7eca464613cf3fc7e18a0906f5ca134392125d7001a5d659065893c22d3cd0128b1b971b311df2c6a339fd97fa27ac8fcd5f1852c31c5dd56bf44f736c822bb970820c5770ec86ac879ebc9d8469d4edca1430591c37264a2a5b669c579a73132c7881e98f5f94082b250e7151251728543bd31a54a6cb36c0506c3758d6447c241e22b79519a77aab153c860a2ab4d783f994779930a1f4d111d0473ab5de7fba0de94e0f585f34c55354de5b00408e86c26002887eb94cc653475079e079d1d064f3b359017b346881c16a76150ca763065df511374af9a358dc059ee8dd7a18581f71d12bde6a8c0e7a249c5bec16534b735d23cf49cc0fa020400008085202f89000000000000ba510400000000000000000000000100000000000000001027000000000000b68ee5cc6a137376d3c0ee85f6b79a83e432866f99c703db6217064078cc5f4d3606859d04a0e71b1ee043cd99c1b35967ed9f853e8764dab4de155943f6b6ba79856451b7efa0f4094806394f70edc46d4db04053b48e21ad34f509b0e5386eea55fb6517af0685a00dfcd503bfafd1506001b1b13b8a99674ca16218a3934d6a47ae0bdf70715d4c367df445b48b5cf11ef449cb616e44aeab19cbfdf1b758ae81632f41503cfeaec680e4a2d066b80558f1184c9c8f37f66d5a8a3576226473d4acc5c021853da749f14ad1be45849e012c96c66103e638e06a081287fa8fa3f065e677bd72f767e5cf83fe2d98bfbe2edc21d5f64b1411ba690536722a0fb7cdd8ede09d7b6878bdd9d41c28152d829c3fdeb77be1e2f3d60787023d8f59a0c1742f52c6e894242fa62e0f20806c8b101e281c0a791eb9b0901f3e3d4c6181d0d35e17f5a0a3afa59739e5a872c8afa34af5656459a463bcecb7ab5f6b312e4d8c76491c35c9db5ab020cf038fb6ec721e08e813bc7f3c5d12a11967d91c13a37b8113ad9844ca15375b7cc7227a1a875eb1db927219c0d5748cae57b5769a4306636846b91236ffd02bba6005b28ca2ee3b7e655c157fa67b8667abe2896865ab8ee6dcdb15d146adfe6d731b7822025c8e4b8a526c9a78c97e441c1a055682c142cf070c971008c9f75114fc4c474a2b4ff3b525a8c427ab105acbcede3d23e6338993d4ea21a446e03fc0e2dc37ceefb5859a9044c6e95d3088a897ce615c498a9f4adbae30843338b241f9774349bd52f234332d2b201683a0f132744e1208fc8adb26a3c65a0f13573de20b71d433c960a23840f1edee60a992c4365100534807c8b40e1797464683b25abfcf69322e3ad0eee9d03b8ec33c24f8d8128f5bb93774f54104cc951451d8a7a40306da1e136b8f0521fcc2c4f61bc7bdd9132560b4ecd612752eea3bcf97e7b4f1ac0a55d6c43fc993e7b370a08d2b2b6f64ecb57ce52ef904dec716b28a6c2349c624f53537b8b56b4a86577edb64b3955081de856ba910e2edf5daaff1fd15abd78bf8c527280feca2d2c821ff06c6b2e15799f9c0f2f51c79cd3435d36f9653ab10f184211d986409a79fd6620cdfa5b918c12c0fe841c972924e1699a17eb990909b47793088928880ec30ce5ecfef74462f8c187af913fa3873f1410e16a455d8fb9c64fa671b6c5a0166ec60d752d7f4a42c5b6fefbb530e0eccc7400272687c389d4b543b7681d3c11411515d70407b0261954f401eb73e9567a36c003d257ec5f11c41a87a9510e7d0ca34629153c3b7f286fb06d311df026ccca6bc432879b1cb0ef0bcec1fbfcd68d09347eeeddb49ff37b1d86ceb1e84c2eafea5173a960763ddfeb90c8c1f8155bc74281bc48ca6ea61335df04406851baa3ac473140627773b6c1fc0f5d7cba570b88e74123bd7001e4c12a34c73fefaa48fc852f826bfafd45a036394b200939e849bfc637ec7161e3383694c3cf5ae1d47911899d3e914337de0c979edd5f3cb15e8f34a95ec5bda063555edc061fe1046f9419769bdf54452d50b02e0c911aba993541d33e3e3e71b2387182fe3d8bacd38f0e51c2e38b5367f59475156bd4f4ff62cd4f7e7cae7508d24bb0a9f9f6a8fa7d7349a71ffc37e28322efe7f8637035e24529fadd47d8b9a4354519ed9e936c1c18f24e180735f8da535ce35666651d336b139b0226457e43b6d61991ab9a8db3a72b2889d6d0f58d4b96e29c6b67a410afb384c8b7279697811d8f0d7b555eaee0807b084ab3584164108f435e40c3ca3c7399157a19c6ea7f22031154dc71ee134daf71b8e2911430c01d6d7e92577b5c97cc552e302a429a443d8ff508ed2b77102b9eac113e031816a2f57662a780b79f606727d61ef330e3c872cadbb10987396dd99baa7216e04914520a148d141108bd03e8babec344294ecf9f1068213206bfdb8ec2d31586c13d2b74b7a188e6389fb06ed83f5b9eb72f37d3c1184dad4e2e9c84eba2bcd910ca4a34ec175eb8de2e9fb7eb52a0ccf91248a0ddfcbf266ca8117dd49acf7c24a0d708bce93cfd2ff2da2e3dae465859841a3777c8a26e469a5aadfeef788cd98588e4cf464bae81b80621e5c967e4184a51b7f2c36f6ed519d763e3462823cd67c78c0888912ab49e5c9ea415b57eb7e60355de6847c7efa283c31a68e42d0df833f8299adbba9997de51cfdba9fb9f07c7eeffdbbd29b5dc6ae406eb0540a20bdbafc5ec04a3e373cd72ee7c2625c601375d4b1762127ed53c6d2ceb79663d5a804c1822427fa659f3e1e47ae25c50d12f34626baab6155efd8bcf29ef5f4585b5ea7c3d19c8dda13da4fb573b9f08850a1b1a641b4c0dc91f44ae7923b65fccc8e45c58738c59a5448f6e5a608628595afe1f93c093327979473271adc5d5817ee5ab8853d200e1a7aabf864dc396a2a92a995659d5eb68e155767e81d0f04beecff6e08901a7141e084022517a1d55511f6a2f00606" +} \ No newline at end of file diff --git a/tests/blocks/zcash_testnet_304290.json b/tests/blocks/zcash_testnet_304290.json new file mode 100644 index 0000000..4a84b07 --- /dev/null +++ b/tests/blocks/zcash_testnet_304290.json @@ -0,0 +1,15 @@ +{ + "hash": "001156b74e55b2de497686814210359dccacc4fd062378eb9f2589192331f92b", + "size": 4003, + "height": 304290, + "merkleroot": "a5a00e24671c56e83c4c3ab3dce220190ba050eb337b0e9c65845b84c5809276", + "tx": [ + "0dc31cacd7fa3d79148e7182650efdaefac811f616b2b5ee3b8637d54fac98d5", + "bc3710f869faf00d8453b2960dd73d2c59d4e56def31ef24287af3c2527acba0" + ], + "time": 1539292375, + "nonce": "0000f309899c840746395e25bd7fd6f992ea9bd4de5426e657dcd76552aa0093", + "bits": "1f1ebb93", + "previousblockhash": "001dcc6713694e27d28354a105154156b1fc3e5b82ffe0f49b964828f1b37100", + "block": "040000000071b3f12848969bf4e0ff825b3efcb156411505a15483d2274e691367cc1d00769280c5845b84659c0e7b33eb50a00b1920e2dcb33a4c3ce8561c67240ea0a5b1ecc5e604c6f589b1fc11175cdaa14fd0299b6d13b1c0079e2ffd89b9a39647d7bcbf5b93bb1e1f9300aa5265d7dc57e62654ded49bea92f9d67fbd255e394607849c8909f30000fd4005005cd7cacf4d66f4aa19a4359d2ff896fd383a48152a991db271e3e771eec2d504f369c449bc2a9a0484105b224efa8a4ba12d5dc2ce0da840fa2a96531dbd356f8bdd29a581218f9445917368b0bed3023c23660460d8b6e790e77f220dd06f2666ef5992b332419824f83c60cc666e6b65df7679e43b8185b1080e901f0c1dedfcf55740fee61f147715cef392ed967e3ddd49c00f882062fd616a63a60cad4d0c69aff9766dc303b4a0a7171df1a593dd97b47e43e18ea3551a53ae05d4e1efbf4e8710c122808f970fc56cf28ff4840c18336ccebca601add1320942a2d7c43ac06edb16491fc07f73d54c2992b4a213e815736b0629f299254b166568de3659afb3745ad3b3b8b7e571865631ae5f1db385e5ffac4923bf0f596470cfbf6eb163f906da187215d244d3c8674d1c74267a469cb154eadca5163d0917113df1b7579d7b79141b7c397addedd8a2c2052be6e33e17bb05ab6041710fa90ec0d296af88850c98245b451254cfad9fa187ccdabf4dbbdd4f4b4616fc937f6c1be86d993e117ce0925104e2734a8e3137f45e16efe25907b841b3d57ad7cb78f6829d002307e64f7d50f542cbe38d91e81859233282a37d85e41e51e9dd61666bf1b74a4318bb2426db2fbdbc27dc097ab97d37829d6708f690e9596e1bc473b5d945ad244a7ef1f7122c8ac425b513a73fe5d95f891bbb3209becb92dde3d0ad39f6a8aab3486fcaa7bf199ff90ccaeb6cf40b9dbaae6ca82ef846308290761b1e4f0d8fef88c3d6f25d086a2671afe5ed169f97bf935c2da90ac0ec5f64ade38624899b7dd5d9d67c1d50b7107ddc89eddcd1ede23e9146011158315ed05782691d140dee182c77d381592b98c37fd7df11b03ca0c210814dd869045bb42dbd318629a153b4777e74d5201be544542a5a7aed3b4b436b61dc872142cf6eef25014992f0104f51f1645d008e462319fa440598607c195a315eb7a41e9d86e7a46c4cd6391db4b71b16df04303489024b530b8423e1af015ccb3ae3ff7da9a1243f079e341d0dbee9587395c3fd4a7949ecf83144090b823b28596eaf60ca84df00d5a0da0acd7b8b01613f6415f56eec7dd7258728724487a63f667e41612e008baee19652474a22ade42477255bc9265f05963e9d84f9b09c4266f97685b250e523adafa78efc5f03057282ff257f3d4851b4f5327b0926c3093c0adc0e7ad8bd175567dce4a3a50f11d0e05980c17371730ee27fe6a6d16234d488c52ea4dad729ae85f4d6dd1704fb5b79112520a8dac7c5075531d69205dbfe60193ec3841451c0c8f1f512fdb6fd4609a25d9828871ae58700a360c7c9d64897c20b6bb16210907988b21e2c3cecbe52b30caec0823a3e2d3872503b7d5c1820fb13ff8c963387319bb6689d743cf2c4e1be352f018826ff0d8d1abeb87ae431732c372d74de710df41ec574e363ec4645c4d95384b2fac96779a99c56e90adf412f0204f081cc30f20ad4f5efe338f77d7c7d10fc98f3b5bb678dde567135daa2e03d4bcf0e7a450adc12d4be5c79374e3654104aaac461835aecfdd82bdec4a8ceec593d62f7e6548abf849a55999c7e880db8787b6d7a5a33d849c4580c64a91937dcae6f6c1c373aee3ce2610f6341823e5d19f7a9a2d2ba252f019bbca2e812c0478e5de47b7b4c8f99edffffb1209ef6feba8371522b9c19aa4b5a5f0b1768bd5c611814610aedd3c620035cb505cb9bd07fbf0930bd6d3c37b7339aaa650237906737e348d5d5ce18a7bb8ebb03117b48dff61683f1532081e0a4d8be03f1f1ddc5249eedd3b4551a6d115e62848153020dd7d03a36a60e4b99198966b6ed753476bc2fd54e25e6e0df41472018fe9dc289c0ce689bf5f3614895f1f527b5d9c6020400008085202f89010000000000000000000000000000000000000000000000000000000000000000ffffffff0603a2a4040103ffffffff0210f19a3b000000001976a914a4f60943699e0939f0d5a6029c4e5d398eb5fdf888ac80b2e60e0000000017a91489169b066f07b60f31ca11628b7964313113687e87000000000000000000000000000000000000000400008085202f89000000000000b6a404001027000000000000012783c73a247606f857b41cc1bdaf4e74669c362b1e7c8fb0068f54ab54bf156cdcc0cb05ce91faf3412053254d13322e3d2065c39ba2ae6eb64896791561035418ba0523eef4bc2c04520f170ae5e6a875ccc389fa471393537f19ed13f531ff4306a367086cd90c67d0640ccaa8b4a32ca7743118105fa03f292d1f01e0ea8882e5cf6d139a6cbcac9ca888ef357bca8503d33199423b6f57a88cbc5dc3a226ba535fde1fa74615dbda11a26b36b724997d6922129926665754b846e187329624138e70d6c9c3a8001430194a6ae895c7443db9c3ab0e122db2c41ef27e1cae1165352f5a665e0e8cd08cd4d4eb18bdd39a848baf6d500eb65d4105cec2ea8e34d16b511d5066daf5d394622644a70a8202a62096f749c8884a7b7ddeda1c1c25b7f49ac187961cb6182f91aaedeab011fcc54e645652c88aa0e11963f2afc823c4851026d5410fa253025f2948e44e439ed4af3c34279b8e0fd1f86913f2d15347ba47d52e279a043f32e188c2242d7779d4ce7d072ef0e5da9a53d9ad44030268bdeb98a85e1a094aded6cfcf4e7d3dc2b9fd5acb278eb5459a506205a831cd5847eaaae3937699a2a9bb76e5abbbde0dbf404ffc1c30023271748b37d91c2d527e00667c591a8e7c362d563f6d3f27681d278b6ceb84eae510ca894daa0517f13638cc0cd1aff20c13ce8ee11b7add11319cccc63791cd9515c6499c32e466db89c7faed6e323688b5eac22d81c6033a4b972428546f6742f45ed5ff8d311c5c6a4c0608394140e048868ef9884f35a8bed165370b52d655340c10742ad00d951532ff8811e45a562cfbd81266322e37c497110ede4ad5716c832970dd2e56c84b2709573b7a8531bdf56b24c3a3be02c92696ae9382a94536c60767bd16574f57a1fb1c5ae7891d951dabab81e49f4b48719d925a4fd9f7c86ea42d02ff8ccbcfa7dadaf0d3973bd3f34aa3c701fd5240970c57a4cdf828d242be24cf2a66e7b1035973b8e960c6f47c1fb12a1c3b6d528791b242762c4490e9c1f10c31c676e4ed90d1c3cf33a0b3f25a62a2be13a80abe6d8e0f3a5461103e6978776d7d762e4e43205a0b10ab50793cbac5773fe95de575ae502d7633c33a424094a281c9b7a5c0362af2fefe61e56246f40270a748755379d7c3aa4de19b298bc58e8e4783ded7e242d78397e65b617e72089a13ca6bd7eb9817760dc6122974f4fe5f4862ced23b63e8d1f928253992f0a8c0ea2763ffd94c072a338af1ac7c4d1871fc01c9c43a6d730c2474525b2bc9ef2c680d6842a13bb13b46c4580a12739ce6fef4a93735efbeb0002cbd5c5bdf4bf0ecb9a5dbe82137a718408769a00c457286f601f6c6391b7e7ec0642fe59617e5ff344d8faf53833c2417beb2dfbdbf7c122ff7148358a060256ba349d2dcb6be6ca62e98d1ceefda45af5afdd8c7adf4e62d94aa1999593accf55374ef4fb0142a29b94fd3303e962466be26b2d6a8502faae9280706f85c07991b71543981c2097f1a3cefaac0fce519d88d8d974be0da1188f41db7d639ce167317cc42db7d031e5bf3211eefb5ef888594d3528676e0a156d61d228ae98dc165a2c15edbbbcde02ccd862eff9c24895a81f31f019f9df9b14a8030d877664f7566f90d96b7daccef283fe66d871ce2c8af9960ae6efbb933c499bcab1fd18b5dd1f0432493bf770459c6b8c7e0e0897ed35085cf438c96afd8b9544f8165f5e2b2f8aa785ba33de6160e4bb2c5b9caf50652147e037db45a8ecd623ab67cfd10c5390e69666747a9b285d8eaa87b3441abcc94fa5c9244389e8b26e20f283b7a9b8e3865704b689443d94eefe522fb6072e6031d8428cb13e11fe7432bc14ba446ba6954ada17a15c9c699a71c8a18c8eb8279601b2910994778de631680c3a883d947f3b0cce68d8e500d7a787b8d04dbcca231069c9db5600adb4b4c3960e2b98aeffbe666b3595038a4585d38701ff9d0737cf1eb91f2e90683de2f41d8235c042fb7b5438b6f6eed1218b8eb57237e10593d330d49d5fe693b17a87d7b01eda59dcdb6dd5a714f56528574405894193f3585690c4ec2124213cfdc37c70d92f3f58a250ae3309f7d3ba137902f6c99ac049b9ee641979656c27f5ce57357a5d30f17963207cda6b83ded6d1d3de4e228a6ac2ed5714900b8c4b797abe72cdf24e35ff85c0aa7b487e12e14850efc401dc5897e2ebe49c898ddd360678ce883ebbb155a7253bd0a7c57f5acce35610d7c929ea1d41ca8958b5e548451ff51468007112b1c65f72bd3933d4e1528090b0e842b677965f665db02511a8c7bf7f93f9853dd456c89661f945bc65b93b8752a546798d3b09040a93555d8a5c5cb7a63dc79e9f4e8479fea07ace9d0dc717874514b14a884906a6440513f7e26fe29f7143f1bfc2637ecde22d9fbc795febdb2a654325f625d595e4e0b629b1b640721181f1bfe1bf19be2513f4f8f29d3e943ff97c6b3c9bcdef16d37dfa188243baddc585d4f7490611b66665ec03f6de2e5e9ea62918722bd20902bd0a6a7da8bbe976be89ec925de50268ca22d9659eb4edb790b1529b90abfe77ff81e601652fa27a3ab6157ed26ec235faa5ad4ef349231af61faaf1fbde3dd19ff219b46f4ebbaa09eaddbe7eef170704a523495d93491f9694f14d50f417c403811a6d8ff8cc3a5716b5c4342c26bae4565de958e8d062dc62a753fe52d4ac3cf7b192b2a10353e04297a3e311b3b7e3e5ce3101481cc656d114c628bbb53f4a665537ba1e81df87845176f63c9726cc6239ce6950875927eb41529fbd9e0426dc702874d41674466e8ca1409df471d6de22553f169f80ad7e86770f86b5ce6a128f133227f58e714eedffcd18c890418539270594da17242d6df728d9759ece3a277e0f674c3299ca1556411e5cf143ce2c2bc2a665c8559db1b2631e0b178b693c777755dc150c09891da7109aa188364295f23f6fcafca60986658e17c675b642b5338851cc5947313c6911e44c5db87c46eb6e520e542b6b1c4d47ed7a41195dacecdaca3f6e0580621dc7874b0309dc70a34db1c61d37d5a0fb5cd68fbb009ed8b1b81f39ba366750a5e2a4438a9008166c541de4f8e27792533aeb2a7a2c4db86216c7d53c4c520eeb18e8673e1b0461bd169355dfef59eb28f883c86f982be501730f732399c4148d2aee30c217a5f75087265f64e8e5d098b64291b4c00395384ca762b1c63e3509b180efc2ae837c83feb213d72103bd80ea928270719f572d75173b18b9810e62ad76585e47181911dcd4f33b2cc37213de985d13401" +} \ No newline at end of file