From 5ecc80bd2c0e115c80ddb3a982785323e37f7d9d Mon Sep 17 00:00:00 2001 From: Ian Slane Date: Mon, 22 Apr 2024 10:32:50 -0600 Subject: [PATCH] test --- mine-your-first-block/src/main.rs | 33 ++-- output.txt | 319 ------------------------------ 2 files changed, 22 insertions(+), 330 deletions(-) delete mode 100644 output.txt diff --git a/mine-your-first-block/src/main.rs b/mine-your-first-block/src/main.rs index 27c1571..0fd9901 100644 --- a/mine-your-first-block/src/main.rs +++ b/mine-your-first-block/src/main.rs @@ -146,7 +146,7 @@ fn create_coinbase_tx(total_tx_fee: u64, mut witness_root_vec: Vec) -> T let witness_root_hash = get_merkle_root(witness_root_vec); let mut witness_root_hash_bytes = hex::decode(witness_root_hash).unwrap(); - witness_root_hash_bytes.reverse(); // Reverse to match endianness maybe dont need this?? + //witness_root_hash_bytes.reverse(); // Reverse to match endianness maybe dont need this?? let reserved_value = hex::decode(witness_reserved_value).unwrap(); let mut commitment_payload = Vec::new(); @@ -181,15 +181,7 @@ fn construct_block_header(nonce: u32, merkle_root: String) -> BlockHeader { bits: 0x1f00ffff, // Hard coded 'bits' value nonce: 0, }; - // The default block version using a BIP 9 bit field is 0b00100000000000000000000000000000. - // In hex this is 0x20000000 little endian - // let block_version = 0b00100000000000000000000000000000u32.to_le_bytes(); - // let block_version_hex = hex::encode(block_version); - // block_header.version = block_version_hex.parse().unwrap(); - - // I chose to use block height 837122 for my block just becase that was the current block height - // at the time of my project (when i made my coinbase tx fn) - // So I will use the previous block hash of block 837121 + let prev_block_hash = "0000000000000000000205e5b86991b1b0a370fb7e2b7126d32de18e48e556c4"; let decode_prev_block_hash = hex::decode(prev_block_hash).unwrap(); let reversed_prev_block_hash = decode_prev_block_hash.iter().rev().cloned().collect::>(); @@ -1308,6 +1300,22 @@ fn calculate_transaction_weight(tx: &Transaction) -> u64 { fn main() { + + // let filename = "../mempool/0aac26114009989817ba396fbfcdb0ab2f2a51a30df5d134d3294aacb27e8f69.json"; + // let serde_tx = deserialize_tx(filename); + // let serde_wtx = serialized_segwit_wtx(&serde_tx); + // //println!("{}", serde_wtx); + // let wtx_bytes = hex::decode(serde_wtx.clone()).unwrap(); + // let wtxid_be = double_sha256(wtx_bytes); + // let mut wtxid_le = wtxid_be; + // wtxid_le.reverse(); + // let wtxid = hex::encode(wtxid_le); + // // println!(); + // // println!("{}", wtxid); + + + + // Uncomment for the project to mine // Path to the mempool folder let mempool_path = "../mempool"; @@ -1323,7 +1331,7 @@ fn main() { // Initializing block weight let mut block_txs: Vec = Vec::new(); let mut total_weight = 0u64; - let max_block_weight = 4000000u64; + let max_block_weight = 3000000u64; //let max_block_weight = 200000u64; let mut total_fees = 0u64; @@ -1421,6 +1429,9 @@ fn write_block_to_file(serialized_header: &[u8], serialized_cb_tx: &[u8], txs: V append_to_file("../output.txt", &hex::encode(serialized_cb_tx)).unwrap(); for tx in block_txs { append_to_file("../output.txt", &tx.txid).unwrap(); + // if let Some(ref wtxid) = tx.wtxid { + // println!("{}", wtxid); + // } } } diff --git a/output.txt b/output.txt deleted file mode 100644 index d9a7b23..0000000 --- a/output.txt +++ /dev/null @@ -1,319 +0,0 @@ -02000000c456e5488ee12dd326712b7efb70a3b0b19169b8e505020000000000000000007f90f7fe6f82492b9bea43697c087bf6d1c0a7f0e9729ec38ded54e5aa2b56cf750f2066ffff001f04200000 -01000000010000000000000000000000000000000000000000000000000000000000000000ffffffff1a02c60c00536c616e6573756b65534f42496e7465726e32303234ffffffff0120276825000000004341049464205950188c29d377eebca6535e0f3699ce4069ecd77ffebfbd0bcf95e3c134cb7d2742d800a12df41413a09ef87a80516353a2f0a280547bb5512dc03da8ac00000000 -9d4f386472c8f201e3abc8a2d85f3144d99a6ea39e8d999049cf174181b89d10 -741b1fc01c74f96d73f6fb8694d4922858ef73bbb216a9de29e5849fa74ca35b -28834733cc4c819f08c3205f95e1aa3d2579e3f996cacab01c5c71057b8afd7d -2ee3fbda92f7981733d0f75868dcaf71c7b8b3313dfa62ac304570060f911e24 -4ab3cc4296fee78153d60d2884323a84260157db0b83a72309272f109ad9dd32 -0205c30e63e36a248faba5bdbbdde7a4185cb2bd314ae62549578575abb6da72 -c0d67d6cb71d5cd372060a6f508017d0e90167f111a5219a0008cfa5eb37b0fa -6e0ae197a30f26e0de708f95e52ebb957de42ace5c08ab62092454c58e066f51 -cb2930faf9670b24e09be9a5a98e72d1b5cfd0dcecb1b1b5452eb85a1ce80ff4 -bd2e7dfc9c1a42accac2fd14f74bbfcf89a2d61352a077aef349ebcbc98c0be5 -3f67e2aa009e5560a6c6b5341f3a5851cb448322758721e0922ea81a2b474776 -036da43312463ef1dff92d7c894a5362e07ff5b3111d1f166ba4cd91f3b142b7 -5c5aac8345686bd466014ef256a503bc896f4186366fb000daea1f90a4143377 -82bc13847269f69b43bf20f546160f90fa3002f55b62923f8e2c1366a231ac8f -4408e4d4f52837e9504056c8e33b7e921a10c072b520ff810fc938ad1201b652 -ec6a92468759cecaa854e9b0155d4a94e52c897fe96607d592218664d1165a11 -961ace1aeae3f11523890212486fe4e7b7e74bae2d0dbbae6e69d0d26f4824a3 -e3e3efe45babf86d2a23dc93592c1e707963c604615c3eb5b5e9cb7b6f13cca9 -4a930a5f30e9f9d2605df8e9bf446931a9f7535b97c6b5390e30d28c052b180f -379c9c1070725589a0fa9626a59bfab6de21a50e600815be7d6af70edf059f3c -1c8aa90e20d6cedde86efa10e4a8bfb57a9f9e5b3e63fa7b0fade6c5cdb3def4 -0eee63cc7561e6909a0215fe338c2271ea5b09ec726abe605b2bf207266600fa -67b9f087ebe0d5a3ea85f514628d56d55ae5cb0cb8c05c65cc2318d47b00444d -ed51a553f501e5aa5a8bc4610b0630cebcf3f57fd6986db450732e201a7109e4 -5518611b2b9cf3985941d8d9a077967282b719331947da7099f2eb2d43d5892e -730a5e1878cdd0abab7954690f6276ddf548da4f50af29b13d54e9ffe023b9c9 -a57adc7478e44365ac3d9c9d4241c77d55678c5fb579a1cce4e202e44a588113 -32ea519c8a31c99b41507e8830a1007b477fb277aeac7c0e6414d4446d550bc0 -e4db2d84306a2ca488ebe1d8099bc0f5d355571e0643c02eb7030b4afa2aa971 -b5d3c7844be6ba6e3743404617074e8f36022d1cad3984a19f3f86bfa5f5873b -1dd32d989bd71c1bbab157ebc062696cec35fb719d91e82c8754a91e92f57194 -00eb746ab26a55ba6c53d8b3260f4d3cb48919e629ab9f1a8071158d11ab097f -5bfddc04dd473fa5f66d64953db2ec54345bb9243eade72e08185fd90ce4a39e -4c58617ea1249b1c7f7d312d1635134381e78ea58bbe60363f260f71ea00d868 -b53121907425ef5ba688a54f1cf2a36598bd070fdada6d9e96afbfc417f896af -1822438f78a84c1da77efe797fde11fef3bb37e5e4e7adea9ac52f6fde54de1f -23fab74d3f31d8dc74ae91a9bec15339022604ef4afc3f2828e2f49d9263d1dd -a0f788702b89b1d271a1abe2bfc1942dec066072d2d3f730c01a839d000b9929 -4eda2b12862c3aff56323d76a33f0739c655249305ad68a49d73afd8b4ee6a89 -fddb94f850d234d4870150812d16bfc2ae715ff67498c1b33acaa894b6e5a924 -dd1c2b0a7f3da10495990563d4aa0291f7a9678bb34b5c2c248ce03cb9e6b40a -83ed96125a09c6a44132a796bde8b7cfd1b7a2570115afba3b8ee9bb1b5311c7 -d23c777d0f6b79ea799659345844b116cb06f43b5d8b88af330a10cccb374417 -5d557a9146084fb040a3ba3821252516b177bc58cc92ac80e7453e2e48305d34 -270d3702033f5f4175d70ba59c7a048819e2a301b2c462bc376dfb095ce0de0a -30f084abfa05053fa8669ebd1b88a75db76576408a8ec055416a481b92e5920e -a2288459fb85ba2b6c78eafb25d788b1bcf5f0602efdbb61190ddcd5b59aa603 -cd2a8466cb8279dad96eae14ef42b075ea97d520df7b0afecffe0bb7f1728417 -f2acf0f4fa4c8b6c22b94033a45f3ce8160ec9aa1eaecfd86cf9a414525659ba -7f9bc724ff18d6838b0b1a9edf2f3c389039813dba2ea749970889a4777130b4 -dbb9134b15077990e3b4fcee8555428bfc2f078883e6ddb501efcca6a7af9dfe -d6f6f3c416af59cfb6fc6f3bc789cde377667984e0605264f92df509fa2bc575 -a4001d94a9233f037712b7f35de31b84134acf74f411059e9188bc8f2cf3b768 -15f212bc09cf72c5b3c8e882230e9ab9e139045f0a4c828ac97d669c7dae7940 -6f366de696e5e005b051af2478e2fd2b69a5c628b1cb284bbb7f0b3f09fc5764 -01321499b5bac27b175405193197f9c463182e8084176704dff84680390242d3 -e76fc7b7910c28fd8d9e354d8fe60fef8008e34ec617c2ca0ebd58b6c844ab3d -bf895a54b0c2c31d18435ae46b70ee47f1ecd6e2f51f3ee59cd6eef092495488 -c0834ac98980e228860ef954e563f21b749a407594c4c165e27fd2264e6dc8be -53af8b0766e295e36c2a825107fae5e9afebc612c129d6c9b9f49f31088d3f18 -4295326514606b504fa78a0ea8c057c24c714ea57525e87a121d54b49ecc6d26 -298594c4def5a7a4c66864b1ca399b4a8f9789775e2cd933974799da178e1cda -7039f15f6a34f84a97d74fbccf7df103aa4e5df20919c5cbd9239eaa20e7a30c -a8b277ce1965ab563f7d330f59ab57351d10c192b2393cae30e435a4f9ff067b -2bfa9fac19d0840ea40d716f1189e0ed3f025f3a234d857bb7e1f47bed99016a -93cf1f595ac8d95cbb7924e7999268e25fde9125e6e3b2cb547c9b74b121bceb -47034fafc46dd2de661bc712d78026d362e05deb800fac4b8c4770fa5c45d349 -6c4c29a4d9b71a3d86b93a449d92ae04f37cc4f68edefe704e5c99742439df8f -4ff31616cea77b08aafe30723b2c26a998287c132ae2ab6e385051642891e375 -326d0359570720abcbfbd94c8b2420484b6422f597a4100bf247fdbadf6679ef -3ede11a5006c288d12b5b65bbd33d398a764491b4400c8fc3fec83e974c0875e -41671c742a150a339237ee364a18347cc82273d67013b82648ff7c0c029ada9f -651d3d15cd67c720584b591285ee8c59090a0ebd63ecddb25df96deb56c4beb8 -c2d781875f992eac370ce0faa9e606d8d0a53930f3d30e5ebc6edda406597d4e -039dc7156f8d2210a3136e670638ee236f560a84e2ec239db3c6728d5be10ba3 -f968896da3071ad93ce32c5604037321f20d329ed8ee7460e8bc1eb57699cc11 -16eff1df7b6dbbf538c53d2862c848da9693fe29166753ea1f32d25544b6d86b -78916d8645652a97356502ebbec2c258ec461ce55eec41c78a9eb7a7da43db72 -82f7ec6dfbf9bb507d69da194bc0f1c77cfff635f3fc96cd9be3f155907459a7 -046ac6bd6752e9d3496289d761a49b2a4787a33e253401172ff36392d42db73b -11276d9cff6e97e4dc70ed5e45f8361ebb240d5f208a8aad9d807da3094a0d65 -3ce2cd3a62b9e4a55ba93f1ae35c8a1719fee86167e555bbcdb61846801cf5a6 -bc8abf0c2ad8027211595630f6e65eeea97145ebae192fdd5a47c9d5693cc7c0 -1e93897df26f965d16de3666a7e5cea7c5d6a826e4a4465bec67c934ef0df98c -34c7ccfa4e8e20644563b2651eccb64d7bc31d3e8a681bda769e7c17b9bdc881 -e1c6c8650c2e262f08e1f37f1bcb80f9bb1ccd466274360559c345288cb602d5 -392334c51eb432b855b42312f22809650738d052817c386b2d977c3dff73349c -7fa7ebfbfe8d79a68ff506c27ded2f25d329e1edc76b2cf6cab5ae8b23a8fb56 -ff02f7cf451deda817d588a6a427ee12742c9579fb79c2ae523fde28ae12d7c8 -127ae7c479881992556b4db7dcd780b9a8ddf9e66ad6ba036d0fccc90f92ddfc -0d15be900e19b304b3a036428ef9abc5e5ca72666d08f6f67d3b38b41118b695 -801b1656646d2e028fb9fdb67245580b775efe29900c622c1f36d1907ffa43da -4d3af0600554a229bd5e12822640d2a266ec6e73148289d671c5550c04f1c56e -6f7d353fb1c3af2694b54e268e9207ea59d1b699f56fc38fb0b4f410c1b6f36b -dab2352f68395c0974aa2470beca4a662b3b1081285133ce6904f398d6fb1ae8 -2658579ef19fc30c16a573883ac4b0d97b943fe7f4c8d3437fb94c4aeff6240f -921b6972870e18520f1072d0f20d7cc4d477574539865b9e2429d8995bab8bf3 -2d655ed33b7c702bf578a1c9062fac0b947aaca69b96d79106bce6a3682013f2 -70367ddcf0dc8453cdf3e94ee436a6bcbb85460d1281ecc1da3e41276c139082 -b205142a83648a3b042b1ede7da30ba12746a23b11e8d075349b17d6bbcb867d -909884b7d0b8e514ba9f1bc9925cbc0b4f817d5c5570fed07cbe3409bc8fe82c -bf12d1867d278b420660fdeec8fe5a611848e761735faccfb98a49f8a5ec1902 -fc8237f6d970b1366af7a0ebcccf86613a142bf91f3b81e7d3308f1b9535b6da -6a99330b7970acd9c2a19683ff733421003ca4fd9f629d4482463be1beca3277 -abed444fca39349fff2f2b9118ac464a92c2741fe7453ae3e2fc0899fbdb48fd -d384e942183a61829d0c99d84c87475eefcdf6277b72989655007493e4bf021c -897967a478729fd11f19fe5d8301dfb66eb32bb8687c13afd7c13a78f23a5531 -9d43a58596639ed577a208d86eb3ff599972c0db25bd8f37701a5fba55105100 -148d7c0ae548a910ab82eacc32043d423cfc4e63fed29f613fb3a76001b83a45 -2c6c58338eddec9db1d914e214446ea718002e30bb5e7334c444b970277ad264 -1f908190610cf904552c33c5e4c384cb5adf9994e240973824c7316fd1b12528 -905c1f304ace286b3eba316810cd3e54ed43aca9162d8ab1749f15fd6305edcc -39fb5473e9dd678b14535aae8bfe73858d8d3deae4a85f90409fd01e63184e09 -a02920445705cbc5bf6c6aebc4eebb029cee19b84a0443d3fd3bc34d3da35340 -2d8392894196e39908eca31f2948247aea2441db010d4933a80a9b232a7b115a -480689a2cc9c577fc8c23fec07445d68df3e82b5d41ae0e2445270a232114d5a -3e2165c8477f786601591cdb1c222505ebf3c1438e6090888c170607129ef816 -f7a6a7d4f3cca0b9a28de0745d567c0f76a0d197e6e0e9cf038f88d894dbc42e -d766a88a811e504f11a240466641b16f79e22913e36c693b45551203303b8689 -22f1bcb84b2607883f23508a4b014ffe61aba9b5b44396899840207047c630b0 -03aed9b68c1b79deb9672fe6682e6ce3e12041cdf480235dc923c6fcf86fe03a -55cd37e46ccc0186c2ed4992a19f88882e136afb8f2df63a3b488218ad946aa3 -a3be5b6c843f8c9f87e38b02f182017072b3df459a1a7e3f227fbcdeb1373d1b -826028c8ceb00cc8a72262b28ab4697c9ed5100076cc27dc76381c8491c78c10 -2e5dd132f996c9eeca24d4663f937e5e5935b896b1bb696930977cb0ed722e84 -623d128c689a3fb4ad54a8354feed630c7c053eb76a11a5a0280d7d9e65d9c4d -54cd546bda2927cd8af5d9ff7d649ab35e8a5d92f5c3a8708ec336532899ef4d -a6a0d82d9cb5d8e8954090692cdaf9a225bf3000155fcf645c94af63a5969cf1 -b5c00d9c573736609f09ff5ad1b68ccdb90f53eae4a43e26f003cceebba47b3b -d774e878ef009be9b0e4b5f48602559fddea82ad860643969158582a9c418185 -5ae5be014ba43d0054e9e5a8028cef55ef765733fc42c58d91985c4a1a95c980 -a254fa3cf6f2a002fcd7c8d7b7d42b073aceca69e969a5b0467d4d294d8c6ab5 -f23d4a1e8a337443d921b51c34c9de6fe12c20c7b064f3ac11cbef74e9534d73 -1b6dd3b5c41b2d5d99fdb2d0fbf7dcb9f29142f37f79399f585935da05c5de55 -382be757fa40774ff39680eedb1b520833bfbcc779896eae4e2e5bf892451e03 -09c12608e99cb664901294cd6653928418e8c33d334fdcf83eaf5e829d8217d8 -e2cd5463424e7c2ffd6cec1c81621d20bfe1b7741ff1548574ac299b2e65eba1 -c08573554a6e1a3a7c8c41a8a3f5f90a99fc2061af8d515048562a8dc0409c13 -173a85542a577f34d1731310d94a58e0ecbb7538c84ba021c18aa780d651c7f0 -2fd9d204f7986715a302c2735679684960263f8f7b8e805f768acc37d98f347f -a301e110c14e1f6a4e721f9b65259b429230fdfd24218f447107d0a26980af6c -f78c827099a5ebc612c5961ea844a23193229463ee792212a836585e28872856 -12a32fbb6f1d8785290fca81c9479b351fa8df646dfa4072fc91e5cec339de14 -f4886352cc49a8aadaa77022f051c560a0fc461cedf3a429e4fae07346fbf746 -a22cc7f6ae35ae45c24c495aa46ef64d0c2b66a914ce7c21de38569266f3c7e9 -be5f32684f3f249282f0379fbec661e869d96c440498ee9a0061089de0d1694d -4e4b14e0d955bfa053ce4a7c3245ab1253406b480f70247d7a5ba92636d13926 -ba0777fd2d720c9dfd4da24b7eb3f2c658c5f872263d8c52584d6d1d3634ef5e -645def9858a5f318b1a0c6b2dfe362e03ead69aec62d92dec7c4f64a1e0bdf58 -6f4da6f46fe3eacd86f19b981cdab577dc969cc9cd695c3cb9be7539d7604133 -ee1bf839d511d2b0de3b07a837d1175316a7f94ef0528d3f8dc94cca211620db -f25f01f2117268e17ae1d9adf475424c872c49d09723aea986bf5709960cfc94 -41ae8d981e75a54402220564a078d5ffcae1a74650b0a98667e073a3610927b4 -67f75a12b2c2b1cb3f667d22f93253005f739b82e08508c4b7d9f25ea4eeea8b -8664c750ee7d618f862ed441ab6bb3df65fb98f855a4ddb9bb95e1a0dba626b2 -198fe38e4de28af59069a6d6df1543487694e5c7075c7bcab9534394e6d44160 -aa5a705c3925310445303cbaaf57ad76ef3937cd871bf6e350603c4676f8fce6 -3e69b5bde7413bccdfebf6f0062d25d1dae155121945b172324ad520ac0018f6 -7cb537397a8f371c82b503a459cb2efd310d62f1a36d3578e840e0bb59790db8 -aeaa1c3944e465fbc1ee7018797af9fdf568f2a16446d8b9fb6cd6dab0510f1e -512a462521cf2221911e06dd58fe975ff1511460cf4d14d441e9a40b4cc203fe -e88149bef1cf7f539db9266c2329f1469f128823e45fbc33f2ad7210d3a7203b -d6a3a5a8c6fb82d1bfd28c7d4f09549552aabd0c599022985e1cf6612b80c976 -93be193605b4a6decb7cb4312e3d45cbfbebc5869e619a209539bf58eeaae8d6 -6c12f7eafa37dbb95b63b16d3488a39d82b67fffde93d233b7dd99f7064d7fe4 -62602d5306f7404e2d7203ad3d64a0da646e79cbeb6a09f0038eeee65949d60a -b75a67cf8f598b5aacea7fee52d6a5364329398aad09ffa4965e5133d3d753ae -788f0d52e2e9bfc0db0a8ee972fb2b4ad3d89a49a994c78184138adcc6e5c492 -137e59ffe9bc6853e04b50423f5c5307b4dd24122921ac718624360aa1c28233 -30604dde9d5aca8b3afe3085e006be1c315d70726dd5764e7f5a6d633e825a80 -43cdae759e6c10cdad953e07d348814685318b379b2600f79e6b39aa17ab7462 -56f0aa36b51c2971c5e5337de1c9ccbed6570f6a57f81c7ce1d4c1c54bc60ae4 -a30e227f2ec8c79561d8f5e1311225dc8476459106dcb32b1769324b9de23afc -b09e35107e2ba0e49bec515675b144d8870aa7f3e304384ef1356d0aadba40d0 -b73076a77722f691ef78f4198061dddf6572f95eaf2c45b7a724b1808bd307bd -d445ece16d21807ab1d287109a775938ea09418befc20224a918882f7c81a619 -fea9879e7da3c571ce7b413841442c9d2f0ca04984cf23177c9cb9c52f801c58 -b73474d1689027e4e65dd1bd0c6b0ac279101fe5f8a1f03820e11081c0bf2728 -3bccf768043487e4680f108599ddf52a68c60d217a1bab253d4e3026b7221d8e -cfe1b508511f26ede8468852f80f2394b92a109628c01dd414aff5ad2fe629bc -4891006444918b895fd13ec97d4b7d671141e0675b9d64fc751b5b1be7d4c3cd -71531db280f61dab2c5d70bd100850b5b348a2fbaae8d488cec04339d1262b45 -dc5a626c9414c1d79c0071ee763f621e3a9fac9351bb34ac3cec3241fd5c4cc0 -41697ee8c0c57ad63c51c1aae8ef5cc81ddaab3708d95fc45b872ad35c26edfa -7dd522ef376dd0e96306abc1be6e1ec4eec4695fa380f30a7ce452cb358f85dc -d4f0e7ab0e8643b608fe22c68747cdcdede17e1c87753db6df06227377b6aab5 -d54f8f64da628450848655afa5bf68b874909434064a19b5e534cd4790e57ef5 -5982a1b482ecbf33192fd3425c05210bcf500dcbb3df20abbb7f21cc73d18766 -c5f8bc0f398b69700b270a4f8cdc53199f84dafe40f3a09b72e37848aadc2aa1 -df64016f1686c2d2ca0db01cc59e9d2d70c449633199f0c9a9ded4603a22a2f8 -903d757c6a163a3ea489cf28de8c37ff4fb81b7977912a1f86747971752e5ccf -9d3ad5c70154474405171bf4f645225891fb70aaf0a01eb44ea1ee3c509da33f -24712f29874d05505fe4c74320dd51cce66def98b76fb1963b26afc1945b4c82 -de7a0328bcb32ffadfeda9edbe576ec37cd2b8ba64d88f7190f061475f360901 -b6ee205092cca81398420d74124bd62d493d6514240fabeadece7eeedce133d2 -8e5185048cb94ffb141ff86ab57550092d0d9e9ea007786ce95df1b75520c428 -b88e1c041fc748ca4fafcf5f31e00c20467f1130462d9e01604d20d00aa6fe8a -03ebac2aaf222d7332789dbb1423e3869edb30bc3760f6f3669ccfd3cd787677 -4698904a9d5e8e35d1875977a6c75243bc895d6efec907108beb7916aee6fe9c -5b71faa9dfe326cfca20c3e57f1d8570365f88fce2f835e8f7a8ddbf5f6723ea -9f85769c112dad02f50eac20b2c55c2a0d654e6e56d38ca12df576f2992b1329 -afe05592e2aad56bd8e04eae47195187fa54defa5c3d7264cda0733f64e4c3b5 -66785ce5a8d57ad364d8caebea4d44777f6f6d98c9c1deb473f09cdef9048d63 -7046f234639d52b16a8162be089659e1e64b77038537307c09dfdd2e5de2b2b9 -c4fca7284be57bdf4caa683c351f214654c137bacaf7bd0a6cfa966f605a7cee -04b98ccd521cd715ddef40d5d75d46a3c7ce6416be6aa61b8e51fd6374dd9b7b -fa0f5c3c9f7632620c7bf9c19a86dae5d8f8f9ffa96795cdc2bb9acf3f22603a -ebe946365a6135afb1904c3ff84fe5094f8d01a003500ff08dc9cd47e0923ee1 -43c1206686871994f42d1ac390303c9a56406b21568bfe7c8005eb4a1afb21ae -211a931398dcd6dbc471ac35aa741b70563110c01cf56dd68bba9fc79d4cece3 -e2864c178680e26ff4467cf616436942b070fca737d344a6b2adf017319582e4 -a24deb27115094d610054aa97a3913742363fca01df49f71bdb5239ce8b914ab -6d591ee06e1d68699f42802480d586fbd988ab6abd7b911cff06b307a0aa7e69 -6f01dbfedc8ca4c172ec4e3ac7658d6a195dfd6472067ceb2f7846471b7415b8 -4cd600a052071b7332fe6e1128ae57cc26790380e0d608e67e55e0efc0ef0857 -0646948e51998dbf4e7841ae1e7a3ce4cef1654a007b75a66bc04cd8df4befd2 -9d6e346b069c03a3edb7f8405bc461474b6335342d1073c67ec8b2ab83b705f1 -4121ed5ca5f679d69aa4485ee3af3f29a94d3a4b90fd8996f5f271912fb5117d -b8513461e0dca0ec95e8b4db4f9537c57b7b8a593038e0a879d70c44dafa15f1 -8d644475a04da3daeb324a5d3c6a3ba2c4c1ebb36a7b0985581bc249bf480089 -d62329aa2dcada088cd7f7f81f7dd6af8d2d6e507154674e9e0ac0b42c63eeb1 -e00e93dbb808e4912e4fd9c9227f41fcc7ec70e684f30f8fe9a9a1d36c8b0733 -3261ea87aa7e8d461e6f7e8d0b1e6d5418e1ea542ab21472eeb0bc2c997fb01f -461570b1d4894e0eaef5db795ec75726a0305808104be67e3022ac55eac6159c -88877248b629da0df5a8e31fd0d1fbecafe48a3d1fc65eaff141ddd9bdb3361a -21a35f23ef8bb1f20bd309738445653b35794f195464d641b823416e0d220ee6 -b935f6a4cc18eeedefb78d3498ec8b4dc6bb61d038b9df282686d09f8aac7d53 -ce2e97ae718f6c6b5cb537b99b511ab73f5577cb52ace204ed57c5971143b441 -d647901bbe0cfcd4cef8fc87b6925ae88e9f7e501441077a47c7006a93bae1a7 -55e2c2b106554f42fbe3ab601b74fac94d6ea07834df928426233bbf558713b7 -d7d0f5173c2d2cd92f96978b6e462baf37b55e24bc46cf485497e3b5b8c59811 -e5145332793533c93b0d20d5eec0e9003c78458c25eaab02bcd3fdc66ab92ec9 -a79108e6371f378c52bbd930eaa5f594669d31abcf58176ab582bcf0d74ab652 -fb6a93a024fee3c14806ea03c7dc494e53c49806ad9a2d27ed008aa63dfade7c -004947e806c5afa74ea4b64de0bfe63bb7488c2c3e4e5d4d5d6c8403d16de46a -0112433201659d58a096a9db311fa9d23eef66ebf81f8584b9fa29fdb89359c2 -6f27338a30abe4dd888d4df232014612ba94900e9795715a2eb989e1216a9af5 -59e6c30bd72a3104d733fb2d197dc911f020b6e096d461b0da9af0a32c0f33f1 -4a50886835d6d59d07f28d08d650b3a691ecd74fba087c182011bb969e01d01c -c85c0199ac0089d5c701b32e0924a34fc2b9c1bd07ea4d905b9219aaa7adff61 -c5927770b7704c09100a47dfe7601886cfe749e2a0efb751c809fde69a7e6bad -e0e75863a67a6621376fa95bf7518d2df07c03f85226ec80c9d2e751c5af9dcf -0b8afd413460360a6fb5c4c42241d3bc1811c36461b2cc17d23984773e638e70 -43961438ddd1335268fe9cff04aa1615d06ab9239f931006d4ff8d4a9f17bc12 -d9a514de486ddc2e049224b8a121aa8d54009c6468b45ccebb94846aec6c6b40 -57263f0f911031aac557a4b68282433df4c8a4a0b2ed488f83a1da8680942e81 -6c6e704aad88ad3eeb78332fafe378d8feb7174549eb23e2ec2232406e71b447 -1d9e3caa9bcda611782372d0186a69bc20759f65a10e6566cb79a375bd5343de -8336e695305d3d09e868595b7bb0cd2113cc4b5a8fa2a3fb82d0b773c29f9d7c -25280625fb975446ee1bccf778933b3036e146ef59991fbe79d9613b0c9d5839 -ccd7761a162c39d1de08a37039ecfce8336d33e9a4590b348ca0b9f53c2633cd -bc52886407409c20cda9615d316e7bfc1d055bad292fc1b044a9045667651d90 -9f3060a2d77d7d2888f0f236d6d9d1f5a3fe7ca9baea663430829982f3363574 -709948ccee295a472105e289dc342bb69862941bc983d78918a8a426fda65d14 -5fa8ae89ef4c80b697bdaba27f9e5a976c710786d189f318d34c8f7eaea5d1fe -607e8ac9f62647ee9d2bff659c1e08542aa99eec29a2bfc031215d31f37208f5 -63100fb102b1c720155ab64c96583316f4efe2c38b19ee7df75ced9004f4d1fc -09c21ea5589264bc17ae372fea55b526138deacd72fe2c5157a2d4d076a12c20 -d7a2791bd4b91f83b028ea464ccb71471cadeb15432ba0febec6b444b762a7d7 -e46899cd78a3adfcb03bca7f51d588b55c08066f18e0a0a0d462d73afb58b0e9 -bf5c65cee6fa18358d378acbd848197b59caace9fac024a19b5bffd61b82d022 -18e689caf0d26182e5d901db06016671c4b261dc5dc328f85aec98e510c892fc -f338ef264d9e2889cef554c3b0535d2f04d4d63028a5b31326c774b523099a6a -ac13a1b348aa4e1bc8078c31f30874e5030560144a09b7a6c2b0eff4b01ddd6d -0b4f3b254b36c0833b5f7607b452965e33088d672cface855bb3593e9e4d099d -e69f50be8108372585f78c066336d52dc072b7cfac5be6193baaeefaf5916356 -d2c58b18c7f724fc92031de6869dfce8787b6330e4ebc9c01856b977eb6f33c5 -ef7e56e1f462aa32c7879f545e57564d098f026cbd11afec0e836606b2b0e7a9 -58604c09b73911c848baec48dd0df33b106bd30a9874893fd77663b5a63d1fee -e054880c270db5c535f00dbe8c19a7a3303e1a5e4f2e16a00f90bb46b6d5c80a -ee4c7f9350d3afc86a8393067845f7a0121f8e2726caed7add44b7d981289287 -f9e5433b26afe90ec9483f41b8d2213d37cdff6297d285e905bd2c0208558f70 -cb72367ff7618ef29b63b18ae2c2117f4d4ab3f2daae686467510d1433edbec4 -a6e80cb0a5d7df4f4a92459a75c69e9f728d722d5263c8ed786565475064610b -c087efa078a3d8b212ac0407b6a90164469eef361c6fee9c5b56b4540834d61a -b6f569eedce326d450d2c33045aa38049b62b21d6643cb1947d8bfa4a4e74d2d -7ce54050e29c43204e51b0660a21668683024edabcc8e0ccd985d9373a70d3aa -ee80a3b899c5019df6aec80214bca901edf7d6baa83e4e74c7d254bde9f41297 -be65e899c13d0f49ef5d4e6d5de7213078a5dcfb28b096bca4844047bf8f2b56 -ebde966b607e1781e6009096cee041690482c3cbf99c775a1eb06fd31c52914b -7ca9e18c0a42cba9d8988fe314567054e1469d6a22c20e83f53ebd8bb6c21251 -952254b6117063f7d1621155751d0a28e459b73d8151ff3718f74cb4fb4ebfb0 -a0940d6a65a300139490c760e3072104cafe4ddc5bdd601a8577cf34fe56e56b -bbbca5fd79798b0196cb660f427dcc11bfff05376e9d389b2a0b669a8162ffb6 -1081d42e875f218d6f9dd7fa51ace13263d903b99aca50aded9595da6474ebfe -a0b90885689dd8aeea0979ea1ecfc36d8c3a4bc43894e40d3992ccdebf9216f3 -492c8a34b81f3d21ccabad349befc1f7c81dc54b68e3c42e60830d29f1d069e1 -cf3d6b3ddc50fc2db5a91659950979c7bde4cbf0640600e6edab37e4548f33b4 -75030761cb3f55f39727acc17ca9eaad7ccb1f30fe8aac0299d8f24995f38bb7 -e516e6427dcaab45ccc0704c8046b878a11bdc0a86967ee40f01320b161a8d58 -cd12ba33baeb21153b476fc10aa9100f795644e4d378f3151d4424e628d25a08 -0b097e47f264d3ca34718261b92242841ba9d21316c4eb682d54fd48e14d0fcb -837a1b88d7d0a0e2894e75e6276c0496643c2b3f6c56f94187886cc2c8b62cd1 -ffd919f6375d14bc6cc07af141dc2ca2f4d75a421146c2a3c7746a831efdf1ea -1e05deb3e9b1a05c5a29b164b1593ba4a0672b186772bc6524462a81328cbb0e -ff58846e06d32ccbc92dc8055499a5700dbac3278322de87584a5641e14dd84e -4abc8c037943869a505a13b793fe4e09273528ad7d142627641a8bd931e7dcc8 -01dfaef60604db4eedc66e4414d5c9da0014319a2b2b7442dbd2e2f3a6f40dd1 -cd3bec82671635035091e03e9d24dbd6590f8495dc9e190036b70e02756db4a1 -0d0966f323d36b2bde35932698eda6d2b6f236a205c1ab4becba45132062483b -7c00b0a48b98a763b7461ca9add215f32c48a03fb04d87788354eea4938dda3e -755a87bb8f7582daf7b0c95b1dc403d00e8a758319409f0e68345ee2030b9df9 -30848a4d556d513b19459c96244b26d947fc9e09d25c3719a3e40c2f22213aaa -f8388f594f92679931b90fcd0111aa94b6d1a97bc277d543b841dee3d0dcb29c -a9f07d8a8559503751c051bb8ccd8f9a8c73637b6d01a18eb71dc0e997cd1f19 -1d523aefb412d6c1923c4520cf514dd4187bccf78e2b10bcc9432456be782c51 -293e6998f29681dd306c7226d837bee850c75c12eed2b0a95416433b3e4eaace -71af4d6665d594e5892fedea2be709001cb1998ab8363c81c0ab01638690f8ec -4c961e363ec78cf19c98b3fed46508f5643361fccc5682623fc143caf668ae45 -e54edbd3902c01f154112001a51ac5c6b1847bc8e80279abb2f51fc1f827c5e6 -fd36ee59e1ce3b900bba48f18c9f0f0c480c12c4bfc1da1eec771c60d54210bd -4b9a0a7685f4f86ab6dd1a837f082ee7522ec95752908a47245b19bfa040a60e -68bb0c532ce0a655023a8fd4dd061ff26daa53008ce716557c83ec76859a6f1f -62491dd0196237a61927cb70a00e4a920dacbf38ddc00065dade6ea0fd275384 -d3d6e988886bbf08e81e25ecaa89e1e93554973cc1a5a3f72de6b6b6b9fa5aab -ec89c40bf72cc34ecdc6f387b431f9ed0a8f1a5e9b831c908dd7be9e93254733 -59e09faf72796071cef91de471f2b1e50945b798ee76085efc08aad6834b9265