]> git.rkrishnan.org Git - tahoe-lafs/tahoe-lafs.git/commitdiff
test_download.py: added 'known-answer-tests', to make sure current code can download...
authorBrian Warner <warner@lothar.com>
Wed, 3 Dec 2008 01:22:08 +0000 (18:22 -0700)
committerBrian Warner <warner@lothar.com>
Wed, 3 Dec 2008 01:22:08 +0000 (18:22 -0700)
src/allmydata/test/test_download.py [new file with mode: 0644]

diff --git a/src/allmydata/test/test_download.py b/src/allmydata/test/test_download.py
new file mode 100644 (file)
index 0000000..6f2e6c2
--- /dev/null
@@ -0,0 +1,114 @@
+
+# system-level upload+download roundtrip test, but using shares created from
+# a previous run. This asserts that the current code is capable of decoding
+# shares from a previous version.
+
+import os
+from twisted.trial import unittest
+from allmydata import uri, storage
+from allmydata.util import base32, fileutil
+from allmydata.immutable import upload
+from allmydata.test.common import SystemTestMixin
+
+plaintext = "This is a moderate-sized file.\n" * 10
+
+# this chunk was generated by create_share(), written to disk, then pasted
+# into this file. These shares were created by 1.2.0-r3247, a version that's
+# probably fairly close to 1.3.0 .
+#--------- BEGIN stored_shares.py --------------
+immutable_uri = "URI:CHK:ye2ysmghj7lpg5ovicm4lvg2pa:semuurrfflv6f6r6j3kfzczs6euhvq2ulodbzjo3ffpszyr7uyrq:3:10:310"
+immutable_shares = {
+ 0: { # client[0]
+  4: base32.a2b("aaaaaaiaaacyeaaaaaaqaaaaaeaaaadiaaaaa2aaaaaciaaaacgaaaaavqaaaagmaaaab3aaaaazniel6dyc2y4selq5g3q3fsmqwl7ez5zu5bnngujv3bbnpzufq3dxcsulgibrvliyxz3ogr4s5nhw33mmlm4srz3ohxynpofjcsrml6lxjw7rrdtf4qcf45jr7c2bi6j6gymjwsv43rvp5iqjqptfq766zwmeuvdnwlgay4maaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacihukhxozmnvny26wmvd6mvaygx5x4wvnslc7e7bgigopq2yjxftxuf343nydrqxevhq4zx6brini7korh2b7mcqe745ulw4tk4hgvgaat55bo7g3oa4mfzfj4hgn7qmkdkh2tuj6qp3aubh7hnc5xe2xbzvjqacvkpun3f6fnyz3dvbyc4fwcvznp6o4wknl6xwnsfer4yghvat336maahr3okegsj5cegqafjbcuvq7kyzzujaaoiow3hxqxbegkewsv7skvaakb6tjqxdjkibbwep3ac5pkwmk2vhvrsbw2pc4knr6davra6wtovdaaajsd53ldwhzhl6okhcusnyoyqraissoydm77lcq4hho4ffd54tmpoaaaae4gg33emvrv63tbnvstumz2mnzhglddn5sgky27obqxeylnom5dqortgezc2mzngeycyy3spfyhi5dfpb2f62dbonudumzshkhaeai6yewbmsmennxwvqql55q5iwfyxc5zmgh45vi4rq5pwsz4ilddoj4xa5dumv4hix3sn5xxix3imfzwqortgi5eqpiupo5sy3k3rv5mzkh4zkbqnp3pznk3ewf6j6cmqm47bvqtolbmnzswkzdfmrpxg2dbojsxgorrhizsy3tvnvpxgzlhnvsw45dthiytumjmonswo3lfnz2f643jpjstumz2gmyteldtnbqxezk7ojxw65c7nbqxg2b2gmzduo5akwyvfabqfrex62uhosj233eqbcjghkjkgccaelcie2i7zet7frzws6tfhiztumzrgawhiyljnrpwg33emvrv64dbojqw24z2ha5dgmjsfuzs2mjqfr2g65dbnrpxg2dbojsxgorshiytalaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadvwozhsop3jvrfbojc2zdg7o257xegzrhec2swrn3betd5kraeu6gaurdmjkcapnmgxibh2pmuotspxcymloyjadpypap6kfwojqxudjfpk2wa"),
+  9: base32.a2b("aaaaaaiaaacyeaaaaaaqaaaaaeaaaadiaaaaa2aaaaaciaaaacgaaaaavqaaaagmaaaab3aaaaazmgpjamkxrlhwlfdjvpzi5hfst2dzbjw7d5rlfznrrznyt5vlhcqnzc2ocjmw6b5yd76pclscxvomntygccwaexqwm65njkijkjq46pq2v762rczmsasnyqmlhagatv3gg72t7inn2leq4pydfb3mxvshvejmo7m3spi53piaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacihukhxozmnvny26wmvd6mvaygx5x4wvnslc7e7bgigopq2yjxfsgfk5w5idl3j6lozxyjkctei6xjrgfaigptt2enmepzja7j5yozmaayrrkxnxka262ps3wn6ckquzchv2mjricbt446rdlbd6kih2podwlaaanv3xibg6ca7t6ywtbzjco3z4m6o24vqqbwygvw6wh25rrex4fwh4aaybvqu3gmlomi3dnf2tum3hoseavpesyia2i2wqgwbmbtrgmotu6oaadirzs2idl54toffh4a2hehvg2e3zoed4dr6pcdpuqpnz2knte7gqqac7gufkkuwa3tktmf7g2lnhpmb4cvzl42pxui7tbyxp2y564vxptm4aaaae4gg33emvrv63tbnvstumz2mnzhglddn5sgky27obqxeylnom5dqortgezc2mzngeycyy3spfyhi5dfpb2f62dbonudumzshkhaeai6yewbmsmennxwvqql55q5iwfyxc5zmgh45vi4rq5pwsz4ilddoj4xa5dumv4hix3sn5xxix3imfzwqortgi5eqpiupo5sy3k3rv5mzkh4zkbqnp3pznk3ewf6j6cmqm47bvqtolbmnzswkzdfmrpxg2dbojsxgorrhizsy3tvnvpxgzlhnvsw45dthiytumjmonswo3lfnz2f643jpjstumz2gmyteldtnbqxezk7ojxw65c7nbqxg2b2gmzduo5akwyvfabqfrex62uhosj233eqbcjghkjkgccaelcie2i7zet7frzws6tfhiztumzrgawhiyljnrpwg33emvrv64dbojqw24z2ha5dgmjsfuzs2mjqfr2g65dbnrpxg2dbojsxgorshiytalaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadvwozhsop3jvrfbojc2zdg7o257xegzrhec2swrn3betd5kraeu6gaurdmjkcapnmgxibh2pmuotspxcymloyjadpypap6kfwojqxudjfpk2wa"),
+    },
+ 1: { # client[1]
+  3: base32.a2b("aaaaaaiaaacyeaaaaaaqaaaaaeaaaadiaaaaa2aaaaaciaaaacgaaaaavqaaaagmaaaab3aaaaazmwbygc64rtlparkjs7mrq5qmt7cygcurakr3vqtundyz4zm5lnibvsgwjh65tqlmf5m42ya55grnmqfhui5m4wtiq7sw74izax6mhtc4f4amjsv64nejtsavtpkiy4tudmrafoq5t4fxxm3lphrfrhz4m6j4q67caqgexapqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacihukhxozmnvny26wmvd6mvaygx5x4wvnslc7e7bgigopq2yjxftvgmgcmhjx7v2k7wt6elymxudbyypcq3zztusnavpv732eayus7iaarz66zcgmrzdtweg4oqgzgc36wxsrkf7xwfcaaqsieirc6ldy3ftyaaateh3wwhmpsox44uofje3q5rbcarfe5qgz76wfbyoo5ykkh3zgy64aajrdvnfky53hd5dhpl7hgzaasaomcgo6fmrjwhw2rixnbsqawddlqaajouzqyjq5g76xjl62pyrpbs6qmhdb4kdphgosjucv6x7piqdcsl5aaa6cpv6nqakhbz7ult4pmwttujfmavcvu7uqtha3xlhug5a4vpuhaiaaaae4gg33emvrv63tbnvstumz2mnzhglddn5sgky27obqxeylnom5dqortgezc2mzngeycyy3spfyhi5dfpb2f62dbonudumzshkhaeai6yewbmsmennxwvqql55q5iwfyxc5zmgh45vi4rq5pwsz4ilddoj4xa5dumv4hix3sn5xxix3imfzwqortgi5eqpiupo5sy3k3rv5mzkh4zkbqnp3pznk3ewf6j6cmqm47bvqtolbmnzswkzdfmrpxg2dbojsxgorrhizsy3tvnvpxgzlhnvsw45dthiytumjmonswo3lfnz2f643jpjstumz2gmyteldtnbqxezk7ojxw65c7nbqxg2b2gmzduo5akwyvfabqfrex62uhosj233eqbcjghkjkgccaelcie2i7zet7frzws6tfhiztumzrgawhiyljnrpwg33emvrv64dbojqw24z2ha5dgmjsfuzs2mjqfr2g65dbnrpxg2dbojsxgorshiytalaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtbf3v6zafhuglsmoqbz2ohhh2v5ulix7stqluqrzuc5mylop3v5kpuut6vfm5g2efnmvunk7khynlrj3mfbtkejprhgxazi2yie6hvjfpk2wa"),
+  8: base32.a2b("aaaaaaiaaacyeaaaaaaqaaaaaeaaaadiaaaaa2aaaaaciaaaacgaaaaavqaaaagmaaaab3aaaaazm4uz4iyzic7t6ktbvjola42pjdturxj55uks5phrbyxo4uqhdk3t5zdn7zkfvbh2mj33bovodak3ou4zbcyyp6mcoro3aqqxszhsgblcc3crznf2zeeofllsgzav5nc4pyh3ocblw3vhs6atocb6j42lovep4dp5zb5epyoqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacihukhxozmnvny26wmvd6mvaygx5x4wvnslc7e7bgigopq2yjxftgufkkuwa3tktmf7g2lnhpmb4cvzl42pxui7tbyxp2y564vxptm4aayrrkxnxka262ps3wn6ckquzchv2mjricbt446rdlbd6kih2podwlaaanv3xibg6ca7t6ywtbzjco3z4m6o24vqqbwygvw6wh25rrex4fwh4aaybvqu3gmlomi3dnf2tum3hoseavpesyia2i2wqgwbmbtrgmotu6oaadirzs2idl54toffh4a2hehvg2e3zoed4dr6pcdpuqpnz2knte7gqqac7gufkkuwa3tktmf7g2lnhpmb4cvzl42pxui7tbyxp2y564vxptm4aaaae4gg33emvrv63tbnvstumz2mnzhglddn5sgky27obqxeylnom5dqortgezc2mzngeycyy3spfyhi5dfpb2f62dbonudumzshkhaeai6yewbmsmennxwvqql55q5iwfyxc5zmgh45vi4rq5pwsz4ilddoj4xa5dumv4hix3sn5xxix3imfzwqortgi5eqpiupo5sy3k3rv5mzkh4zkbqnp3pznk3ewf6j6cmqm47bvqtolbmnzswkzdfmrpxg2dbojsxgorrhizsy3tvnvpxgzlhnvsw45dthiytumjmonswo3lfnz2f643jpjstumz2gmyteldtnbqxezk7ojxw65c7nbqxg2b2gmzduo5akwyvfabqfrex62uhosj233eqbcjghkjkgccaelcie2i7zet7frzws6tfhiztumzrgawhiyljnrpwg33emvrv64dbojqw24z2ha5dgmjsfuzs2mjqfr2g65dbnrpxg2dbojsxgorshiytalaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtbf3v6zafhuglsmoqbz2ohhh2v5ulix7stqluqrzuc5mylop3v5kpuut6vfm5g2efnmvunk7khynlrj3mfbtkejprhgxazi2yie6hvjfpk2wa"),
+    },
+ 2: { # client[2]
+  1: base32.a2b("aaaaaaiaaacyeaaaaaaqaaaaaeaaaadiaaaaa2aaaaaciaaaacgaaaaavqaaaagmaaaab3aaaaazm4looclcc5kqy6qfzzetsrmup5pw2sdecb54uxjhhsvyzin6ibfer76axpoh2vxxgfv34e35r3bfvpnvzqrt72flzskrx323t7ep4l32eir42sbvdswhqqkljxpy2rfa4j7yx4tmxccawhp57odyjzkkaqgcny246hrtdevqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacihukhxozmnvny26wmvd6mvaygx5x4wvnslc7e7bgigopq2yjxft2o45oiypn6bqokxqmpynseggmzoempbkssoyyu6puanxitj7rmcaai5q6234vnzjroot3erj2luheqecq5sikw6w6txbslsdvcphzionsaaehu5z24rq634da4vpay7q3eimmzs4iy6cvfe5rrj47ia3orgt7cyeaaezb65vr3d4tv7hfdrkjg4hmiiqejjhmbwp7vriodtxocsr66jwhxaacmi5ljkwhozy7iz327zzwiaeqdtartxrleknr5wukf3imuafqy24aab7c6gvrnd24kyscutnjiybvzgy24wcrqjszirhldprsfeanr4tnzyaaaae4gg33emvrv63tbnvstumz2mnzhglddn5sgky27obqxeylnom5dqortgezc2mzngeycyy3spfyhi5dfpb2f62dbonudumzshkhaeai6yewbmsmennxwvqql55q5iwfyxc5zmgh45vi4rq5pwsz4ilddoj4xa5dumv4hix3sn5xxix3imfzwqortgi5eqpiupo5sy3k3rv5mzkh4zkbqnp3pznk3ewf6j6cmqm47bvqtolbmnzswkzdfmrpxg2dbojsxgorrhizsy3tvnvpxgzlhnvsw45dthiytumjmonswo3lfnz2f643jpjstumz2gmyteldtnbqxezk7ojxw65c7nbqxg2b2gmzduo5akwyvfabqfrex62uhosj233eqbcjghkjkgccaelcie2i7zet7frzws6tfhiztumzrgawhiyljnrpwg33emvrv64dbojqw24z2ha5dgmjsfuzs2mjqfr2g65dbnrpxg2dbojsxgorshiytalaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabzqye3fh34m6ylyv7auginhhusra6fst3yi5n375nt5vzebwbbule2vxvolhomvqvzaiu2dyykr4da3ogfgvxazpmxe5uv5p2cczfgbjfpk2wa"),
+  6: base32.a2b("aaaaaaiaaacyeaaaaaaqaaaaaeaaaadiaaaaa2aaaaaciaaaacgaaaaavqaaaagmaaaab3aaaaazm2y2oc6kqfofytgus6zm7b3e7jnjy2rsnoucuc5jyhwwehcbxnhdkgxr2h2ref4bkf5ufhhjzanmnnhhvbbwf4fmx7qrodh4mcblrofq3mk3olficr4q3owwisjmuzvznajzf5fdeizjq72vjvwz6yijx5tdcj2nphzthwgaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacihukhxozmnvny26wmvd6mvaygx5x4wvnslc7e7bgigopq2yjxfshy43k3bviz3meybqzoukf4kd53nf5osrx7z4gdhrwvmfzhkzbecaajiyd6vrn6vqtmhx5r5pany722qg4etoi2crh5i2euk3eh7globo4qaateh3wwhmpsox44uofje3q5rbcarfe5qgz76wfbyoo5ykkh3zgy64aahr3okegsj5cegqafjbcuvq7kyzzujaaoiow3hxqxbegkewsv7skvaaky7dtnlmgvdhnqtagdf2rixripxnuxv2kg77hqym6g2vqxe5leeqiac2thalz4fpmumxp7kgrgvvuz4hvrwx4smdym7ibalebngkols6fhuaaaae4gg33emvrv63tbnvstumz2mnzhglddn5sgky27obqxeylnom5dqortgezc2mzngeycyy3spfyhi5dfpb2f62dbonudumzshkhaeai6yewbmsmennxwvqql55q5iwfyxc5zmgh45vi4rq5pwsz4ilddoj4xa5dumv4hix3sn5xxix3imfzwqortgi5eqpiupo5sy3k3rv5mzkh4zkbqnp3pznk3ewf6j6cmqm47bvqtolbmnzswkzdfmrpxg2dbojsxgorrhizsy3tvnvpxgzlhnvsw45dthiytumjmonswo3lfnz2f643jpjstumz2gmyteldtnbqxezk7ojxw65c7nbqxg2b2gmzduo5akwyvfabqfrex62uhosj233eqbcjghkjkgccaelcie2i7zet7frzws6tfhiztumzrgawhiyljnrpwg33emvrv64dbojqw24z2ha5dgmjsfuzs2mjqfr2g65dbnrpxg2dbojsxgorshiytalaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabzqye3fh34m6ylyv7auginhhusra6fst3yi5n375nt5vzebwbbule2vxvolhomvqvzaiu2dyykr4da3ogfgvxazpmxe5uv5p2cczfgbjfpk2wa"),
+    },
+ 3: { # client[3]
+  2: base32.a2b("aaaaaaiaaacyeaaaaaaqaaaaaeaaaadiaaaaa2aaaaaciaaaacgaaaaavqaaaagmaaaab3aaaaazm4db6fxwaqyebrmu337bw22gluncfkblxbevg4citokkylk35mkzhvcbouvqfov54houq3z2cyqap3nnq2lbowhj25qalpjz5byjdrpyo3n5iqjny7h332alowkyvs5vd3wbycwbc27z43ilxwmhkpepmrnq3yi6mxmiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacihukhxozmnvny26wmvd6mvaygx5x4wvnslc7e7bgigopq2yjxfth33eizsheooyq3r2a3eylp226kfix66yuiaccjarcelzmpdmwpaaarz66zcgmrzdtweg4oqgzgc36wxsrkf7xwfcaaqsieirc6ldy3ftyaaexkmymeyotp7luv7nh4ixqzpigdrq6fbxtthje2bk7l7xuibrjf6qaajrdvnfky53hd5dhpl7hgzaasaomcgo6fmrjwhw2rixnbsqawddlqaabgipxnmoy7e5pzzi4ksjxb3ccebckj3ant75mkdq453quupxsnr5yaa6cpv6nqakhbz7ult4pmwttujfmavcvu7uqtha3xlhug5a4vpuhaiaaaae4gg33emvrv63tbnvstumz2mnzhglddn5sgky27obqxeylnom5dqortgezc2mzngeycyy3spfyhi5dfpb2f62dbonudumzshkhaeai6yewbmsmennxwvqql55q5iwfyxc5zmgh45vi4rq5pwsz4ilddoj4xa5dumv4hix3sn5xxix3imfzwqortgi5eqpiupo5sy3k3rv5mzkh4zkbqnp3pznk3ewf6j6cmqm47bvqtolbmnzswkzdfmrpxg2dbojsxgorrhizsy3tvnvpxgzlhnvsw45dthiytumjmonswo3lfnz2f643jpjstumz2gmyteldtnbqxezk7ojxw65c7nbqxg2b2gmzduo5akwyvfabqfrex62uhosj233eqbcjghkjkgccaelcie2i7zet7frzws6tfhiztumzrgawhiyljnrpwg33emvrv64dbojqw24z2ha5dgmjsfuzs2mjqfr2g65dbnrpxg2dbojsxgorshiytalaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabvpjxayjs6a6gsbgtc6alf4btfsknnp2dughizg2mxczvyei43ercpnwkg2elbckugvohnchlib2na6n4vj46wkilwuf34izdqbdp23jfpk2wa"),
+  7: base32.a2b("aaaaaaiaaacyeaaaaaaqaaaaaeaaaadiaaaaa2aaaaaciaaaacgaaaaavqaaaagmaaaab3aaaaazmw432y2xbyxpehrm6avy5xdp4bupvhsrezflvnbrf7d2gv4tfyv2c7mw5xfkoaflhtla3p55ld7i5kgyhlk3n5tjlofy6sbzouerqkzfxdvcmhpbksf7zdjyciiv5ur23f4bpre3jv4wk75yta3hz5r4bgex52d6zz4ykglaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacihukhxozmnvny26wmvd6mvaygx5x4wvnslc7e7bgigopq2yjxfsthalz4fpmumxp7kgrgvvuz4hvrwx4smdym7ibalebngkols6fhuaajiyd6vrn6vqtmhx5r5pany722qg4etoi2crh5i2euk3eh7globo4qaateh3wwhmpsox44uofje3q5rbcarfe5qgz76wfbyoo5ykkh3zgy64aahr3okegsj5cegqafjbcuvq7kyzzujaaoiow3hxqxbegkewsv7skvaaky7dtnlmgvdhnqtagdf2rixripxnuxv2kg77hqym6g2vqxe5leeqiac2thalz4fpmumxp7kgrgvvuz4hvrwx4smdym7ibalebngkols6fhuaaaae4gg33emvrv63tbnvstumz2mnzhglddn5sgky27obqxeylnom5dqortgezc2mzngeycyy3spfyhi5dfpb2f62dbonudumzshkhaeai6yewbmsmennxwvqql55q5iwfyxc5zmgh45vi4rq5pwsz4ilddoj4xa5dumv4hix3sn5xxix3imfzwqortgi5eqpiupo5sy3k3rv5mzkh4zkbqnp3pznk3ewf6j6cmqm47bvqtolbmnzswkzdfmrpxg2dbojsxgorrhizsy3tvnvpxgzlhnvsw45dthiytumjmonswo3lfnz2f643jpjstumz2gmyteldtnbqxezk7ojxw65c7nbqxg2b2gmzduo5akwyvfabqfrex62uhosj233eqbcjghkjkgccaelcie2i7zet7frzws6tfhiztumzrgawhiyljnrpwg33emvrv64dbojqw24z2ha5dgmjsfuzs2mjqfr2g65dbnrpxg2dbojsxgorshiytalaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabvpjxayjs6a6gsbgtc6alf4btfsknnp2dughizg2mxczvyei43ercpnwkg2elbckugvohnchlib2na6n4vj46wkilwuf34izdqbdp23jfpk2wa"),
+    },
+ 4: { # client[4]
+  0: base32.a2b("aaaaaaiaaacyeaaaaaaqaaaaaeaaaadiaaaaa2aaaaaciaaaacgaaaaavqaaaagmaaaab3aaaaazmr6ax5j5zu4cbzbrbkewwiybqrh3a3quqb7g7ijucnyd7gnpj533uao7tber3qvxwy4e5eoorvcrza4zxrx5vvfj23phpvl4u5kdm6dewsz76kehzizg6fj7ij6g2yiepyabade3std5yahnqrgvyarh3mtrubuqr7vizqhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacihukhxozmnvny26wmvd6mvaygx5x4wvnslc7e7bgigopq2yjxftc6gvrnd24kyscutnjiybvzgy24wcrqjszirhldprsfeanr4tnzyaaq6txhlsgd3pqmdsv4dd6dmrbrtglrddykuutwgfht5adn2e2p4laqachmhww7flokmltu6zekos5bzebauhmscvxvxu5yms4q5itz6kdtmqaaezb65vr3d4tv7hfdrkjg4hmiiqejjhmbwp7vriodtxocsr66jwhxaacmi5ljkwhozy7iz327zzwiaeqdtartxrleknr5wukf3imuafqy24aab7c6gvrnd24kyscutnjiybvzgy24wcrqjszirhldprsfeanr4tnzyaaaae4gg33emvrv63tbnvstumz2mnzhglddn5sgky27obqxeylnom5dqortgezc2mzngeycyy3spfyhi5dfpb2f62dbonudumzshkhaeai6yewbmsmennxwvqql55q5iwfyxc5zmgh45vi4rq5pwsz4ilddoj4xa5dumv4hix3sn5xxix3imfzwqortgi5eqpiupo5sy3k3rv5mzkh4zkbqnp3pznk3ewf6j6cmqm47bvqtolbmnzswkzdfmrpxg2dbojsxgorrhizsy3tvnvpxgzlhnvsw45dthiytumjmonswo3lfnz2f643jpjstumz2gmyteldtnbqxezk7ojxw65c7nbqxg2b2gmzduo5akwyvfabqfrex62uhosj233eqbcjghkjkgccaelcie2i7zet7frzws6tfhiztumzrgawhiyljnrpwg33emvrv64dbojqw24z2ha5dgmjsfuzs2mjqfr2g65dbnrpxg2dbojsxgorshiytalaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacdqixmau3cydykhmhyfjeblqbjh6gpstoq2ocybfzpptilivjqlxy2nhddj5kzkovztio3adwgfavjnjf74qbd4w6bfv32hkcmnmgskjfpk2wa"),
+  5: base32.a2b("aaaaaaiaaacyeaaaaaaqaaaaaeaaaadiaaaaa2aaaaaciaaaacgaaaaavqaaaagmaaaab3aaaaaznv7ubsowbjgzwyijzyfhmrn3jcwie7ikmwph5cxdcezxgtnc5ifel5ymjizmz74mbgac7c36xq3dwxabthrqdxysy7sabwu6porqcxbplpjenl2fih3azkg3kthxd6miq2yd3l73xxvvym3rvw4bhuoi3qzhtn6ylmmcohzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacihukhxozmnvny26wmvd6mvaygx5x4wvnslc7e7bgigopq2yjxfqpu2mfy2ksainrd6yaxl2vtcwvj5mmqnwtyxctmpqyfmihvu3viyaady5xfcdje6rcdiacuqrkkypvmm42eqahehlnt3ylqsdfcljk7zfkqacvkpun3f6fnyz3dvbyc4fwcvznp6o4wknl6xwnsfer4yghvat336mabh32c56nw4byylsktyom37ayugupvhit5a7wbicp6o2f3ojvodtktaakb6tjqxdjkibbwep3ac5pkwmk2vhvrsbw2pc4knr6davra6wtovdaaajsd53ldwhzhl6okhcusnyoyqraissoydm77lcq4hho4ffd54tmpoaaaae4gg33emvrv63tbnvstumz2mnzhglddn5sgky27obqxeylnom5dqortgezc2mzngeycyy3spfyhi5dfpb2f62dbonudumzshkhaeai6yewbmsmennxwvqql55q5iwfyxc5zmgh45vi4rq5pwsz4ilddoj4xa5dumv4hix3sn5xxix3imfzwqortgi5eqpiupo5sy3k3rv5mzkh4zkbqnp3pznk3ewf6j6cmqm47bvqtolbmnzswkzdfmrpxg2dbojsxgorrhizsy3tvnvpxgzlhnvsw45dthiytumjmonswo3lfnz2f643jpjstumz2gmyteldtnbqxezk7ojxw65c7nbqxg2b2gmzduo5akwyvfabqfrex62uhosj233eqbcjghkjkgccaelcie2i7zet7frzws6tfhiztumzrgawhiyljnrpwg33emvrv64dbojqw24z2ha5dgmjsfuzs2mjqfr2g65dbnrpxg2dbojsxgorshiytalaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacdqixmau3cydykhmhyfjeblqbjh6gpstoq2ocybfzpptilivjqlxy2nhddj5kzkovztio3adwgfavjnjf74qbd4w6bfv32hkcmnmgskjfpk2wa"),
+    },
+}
+#--------- END stored_shares.py ----------------
+
+class DownloadTest(SystemTestMixin, unittest.TestCase):
+    def test_download(self):
+        self.basedir = self.mktemp()
+        d = self.set_up_nodes()
+
+        # do this to create the shares
+        #d.addCallback(self.create_shares)
+        #return d
+
+        d.addCallback(self.load_shares)
+        d.addCallback(self.download_immutable)
+        return d
+
+    def create_shares(self, ignored=None):
+        u = upload.Data(plaintext, None)
+        d = self.clients[0].upload(u)
+        def _created_immutable(ur):
+            # write the generated shares and URI to a file, which can then be
+            # incorporated into this one next time.
+            f = open("stored_shares.py", "w")
+            f.write('from allmydata.util import base32\n')
+            f.write('immutable_uri = "%s"\n' % ur.uri)
+            f.write('immutable_shares = {\n')
+            si = uri.from_string(ur.uri).get_storage_index()
+            si_dir = storage.storage_index_to_dir(si)
+            for i,c in enumerate(self.clients):
+                sharedir = os.path.join(self.getdir("client%d" % i),
+                                        "storage", "shares", si_dir)
+                shares = {}
+                for fn in os.listdir(sharedir):
+                    shnum = int(fn)
+                    sharedata = open(os.path.join(sharedir, fn), "rb").read()
+                    shares[shnum] = sharedata
+                if shares:
+                    f.write(' %d: { # client[%d]\n' % (i, i))
+                    for shnum in sorted(shares.keys()):
+                        f.write('  %d: base32.a2b("%s"),\n' %
+                                (shnum, base32.b2a(shares[shnum])))
+                    f.write('    },\n')
+            f.write('}\n')
+
+            f.close()
+
+        d.addCallback(_created_immutable)
+        return d
+
+    def load_shares(self, ignored=None):
+        # this uses the data generated by create_shares() to populate the
+        # storage servers with pre-generated shares
+        si = uri.from_string(immutable_uri).get_storage_index()
+        si_dir = storage.storage_index_to_dir(si)
+
+        for clientnum in immutable_shares:
+            shares = immutable_shares[clientnum]
+            for shnum in shares:
+                dn = os.path.join(self.getdir("client%d" % clientnum),
+                                  "storage", "shares", si_dir)
+                fileutil.make_dirs(dn)
+                fn = os.path.join(dn, str(shnum))
+                f = open(fn, "wb")
+                f.write(shares[shnum])
+                f.close()
+
+    def download_immutable(self, ignored=None):
+        n = self.clients[0].create_node_from_uri(immutable_uri)
+        d = n.download_to_data()
+        def _got_data(data):
+            self.failUnlessEqual(data, plaintext)
+        d.addCallback(_got_data)
+        return d
+