mirror of
https://github.com/QuilibriumNetwork/ceremonyclient.git
synced 2026-02-21 10:27:26 +08:00
* v2.1.0 [omit consensus and adjacent] - this commit will be amended with the full release after the file copy is complete * 2.1.0 main node rollup
138 lines
41 KiB
Rust
138 lines
41 KiB
Rust
use rand_core::SeedableRng;
|
|
|
|
use rand_chacha::ChaChaRng;
|
|
|
|
use merlin::Transcript;
|
|
|
|
use bulletproofs::curve_adapter::{CompressedPoint, Point, Scalar};
|
|
use bulletproofs::{BulletproofGens, PedersenGens, RangeProof};
|
|
|
|
use hex;
|
|
|
|
// Tests that proofs generated with v1.0.0 continue to verify in later versions.
|
|
#[test]
|
|
fn deserialize_and_verify() {
|
|
// proofs[i][j] has bitsize n = 8 << i, aggregation size m = 1 << j
|
|
let proofs = [
|
|
[
|
|
b"d0b51e172f6d91da68ad7521c6f1bf659b031584ed8a405a7122dcab63e2574908d1c427010a0f63b6590aada008c9783a56e21e9bf02f2f1aec5f7606719808cf87814b448eb36fc206afb61751806f3a85259390250bec1257fb20e0ad1bad4db1be6b125ab2bec55e0aae6de4fb4b02ff3eae59b9a4395e08f01400e0f21fbda65528869e47819454fca11162ae77e847365eedf7ac84a0c85ec352d08af96b07c75ebdf2e00f345d802a8b90d31f3683de6d1a263e070f0c190c757251afe5a44548089e0c1835e21a28881533d5a71e131a30b0a2b1fe383d1d09537278658945a83655022a920031a20f02f58a9d3f46992b109f02a4bde0d3186029661bf867be8742f829e44fb2313bcf3a7119a225baaa865f11c3a1f444c6192467da21a3f1a096f1fbd9ae1410ce494def3e8f36feffafdc1470f3dc4f7704bd912ce3ba35a2e653c581ee020bbba28029e854eec0d3ceb420537f2017acf6dbc5853f7489748ee4069cadcfa32b4c571df0ee220a4a2be34c17d058c634e97fae7622f058ffd8700c202c3ee6f85f9b3b627a88b1dcef5d3425d98748c4261a8c04bfa478deb8c2f15188836ffe27ee8f64c0c441506682689719d015eeaff3c32089ea7cd66727311342d6ecb4e234ad939204d8e4094e80c41b7d244a7295ec8128e75b276d2a5704c327a31ecf4eaaa5a0df975c2d8f216a6479fee3a78145d0fd6042bfaa03303c749469cb86a3a6dbfe78cc3c38903deb6c1a841bcab9e5de0703ba9a5362f5e12de5ed0aa6658bd2dafda4ad537b98f338e3d9c0dd2be32960c9ae062eeaa7210b2ddb979c21c243749b31a1aef265e77730c99a7d10fe2c1f041c7fa9e45f5c9f5cc6ff9d8ce67c954d0366d2175319d6e3bf0b51af4849e28e0cc187680a91f1fb600fa5995773d4872f5358a87b9206685f3262a17528325da5460d0d344291a3e879dfec07a90152282072f2468bd488b57003431c422c0db2fc00185c3dc226eaf66033ab620645c1ab63a728a5cc83289814c2a7a33db5cc4a7555586de5740b85d7cb17ed0427aab8a231b7ab7e998cf4a6c6228829b2b35972e1603c8266d61e1d053d7644030d97e409af4b9f74d43eb1cf774b46232adcdf7f9ab889c2dcd8aaf594c92efdac01154f811834463a874ace01e3af0a8e18c5bf18".to_vec(),
|
|
b"a40382591c9c36b3c6d1dafd6a4279802c0ac08f402b0343cc3ff31af09b36b678f74a33511996309cdf29d780196e21415a27505906052636852dc631f3f77c93d56c6af0a02b4503003d0651f3b51584880794afde594ac36d20599429a134e78152fc1155a645149339dec81ff6e5e0234b853e78e9552b5090ac7d5e40fb3c57f8496ab6d7c4254365e2696ddd61c6487a1cf99ad24d88afc135e10b47286c8a2f327c970a3f00dcaa804e730eea200c0fff67d787c8b1785f59e87019269a676dcc1a0150277e9d0b7377e610959cb0039e33433e4c06234d08203638f7843ab65336de307f21882858c551df4258c7c1ef104a4b9275ac7c5db27e2532413355541014f182d6bd25f3dc063a3e0857e1fadf1f693ba803d5dc9ea59561828f0ac5f115e964e8b2473f56a469dca775145488ad1a70a44b2cbd4c6e95a166306e4b4d237d172751a3fa7e38cc264f989d2fe615fac5c16d9270b677a2b5934cae2c00de70f0e09abe2da37e1370006f8450ce78aa1ee4dc0bada3150a92cc9bafffaa6ce7356e6b13e0ac03a08722f6c9c9ce78ebe617b38975d724473da2b80698080dd0dafb635d98caaa711a0d0ad8ffc3bee15ca0433ba5cddf490080063e78299dda000ef16edca1a3267a6683da3b619a60d3647410e85986f76b44336104ed3236c31924cdb009c80f334a262112eecdfec33af0f85f276eb71f83e9576199f1cfdb2914678327dc9ccc5d92e9b94840d9bd94d8588838fb24cc1cb99cfdde0bc47b1dc73053fdb131898e51fb0954bf611655abe65d677e6bea7a8c651e1e381d032ba5e270b5f1668ad70e55ab2bd9b17a55065668ff27d22f011c471f4db86bcface4d75a6326be131939e6fae1607564fcab2859ef711c9371e405bb6d64f6cb4023ab6efd3935f59e656974b7d44e3377f4d57ad277db10d2da298f66f03a16b8c33e857956cacdf04f42338cd7f7485326faee5f900d12d855337ac09cc0803f485651f39fc8ee76fc9eb293b2e3fc0e4417506c5ad1f9f0393c28566b069d0f645153f4630144b3b1e63aa4051c362ea683ffa41c18dfc9b7b9468a2c5c0b73026dab406315f4d626cead93c8a9095bee03ab7c4941cf22105631eaaf16e26e308db26397f8de2cac974bfa48afe59593737eb13eef8fb28b8eee609cd37c2b9a509f96399c9376727dd270f785e520b43ed4b265af7f4879f2fd5e391799c0e456eaae18acda22367caf8d03c7b078b448395e53083a0255dccc781e986c5c87e713ec16ccd8403c40394d2d86d9bb0692317c1a82daed62ade382f51fe2894aaa7809540011c64a8cb696577615".to_vec(),
|
|
b"fe71dfefb2287c213aa460d8d1e20065665d27393356a9575711ad6d6bcae6c52f75c3f11079a9b15ea4b2d65e7c1095c8876811279d80f040cd63438fb4e6f4882d0a909b678d07a2a12374171e83f24c26ccdfe2fd1438e581f0309de8b1f8e8da893c7cbe0b54747024187921263524341f500168077384b39935bc29dde37479bdd0ddfb7c0e83385cc498149bfb5c4a276fdeb2abf9c664318edfc09bd352ecef75d6a638e3eac3b2fe65687a93c6961337cd1f5ae311e21c8bb99be2594f0e8bdacf73e28403a61eaaf8b578b7b7ab5769533d7a15641b19e3a66a221d551b2dff66d847b101fbb233f95bf265c6180705627e9317288fc295b4a5d02d06bb1bf4f65555199d9a2f7a632f38bceddc18bbf135cb3ba99ec27a67abb8566606138bfcdfdd0ebb2fed993ae2b3fb640274517c2765835f124e744837e4ef54d848835408ad532b18c6cc91ae3d3e437bcd59ce9f8e5c67f4b9d73a376a15f71b6f24edd48df6e32538606ac8d5161c100f2f23fdaa71b5e3e32c6a8f9ea9bbc7effcc4e53f1ef8a6ee64f58aec54fb5504268d15e4e6b5ab73d1b7304cefab52921305858918d0d4ceca9ae59b7e4244fe06e55ad71a0dc108453c4035e65236a885d3e1f0860ec21b39b4fbfd4d0eb7d5f527897480b88171ca8a5fde8054c561edfc5986e9cc8b928229c5828ef4428e27e7bc583f1e5d29f527ba13e5d53ab78c5fcd019b7bdd7a567f24305022f5c8aa2eb22423c16adcf8785efdbe9c64f82851fd719b6d0aa24c29e732be2e6d43e4c9aaf29b5312f2b2ea6d7d1e1071f08bf37f7dad4e75a99102fbf197bb8cfb6a1635e907e2e990ddddb79d083044eb68c8cc7a8d823031354fdf363890f6447ee6cef0987163521e4ff9347036c9779e81716ec26e7e1ff3f33fa662df51819e71818af9e574826e2d7854abbc314ac2ed3da585d698f838fc12af35fd1b7c99f5948b4d08eae908753785fc878a3aa0aefc4e11e49f388142043c566cb7a5c58476e6dd8628eeab2fa6645ecf8e5437207237bff12e96cffcbe33ad1fa189f1b6164a04ce354eda99500e6d48f7af51c1c18233d3cb0015fa00b7c0fa3f702f65bcd76e1528a4116e3c6e6cdc7da43ce4b5ed6ac61a215d85d60bfc8e1f06bdf8471c8c30810e3478810af23b53174b757c4ccbcc779943f47c918fb559b2847c3bd50b3a6a4b8bd0c36b65421156cf0453d838025cd8a7bf046ee7a61a90a50b4563f5a03faa37ad94eb7c7449d130176a5aa9dbef22055297e4456285e9164e9c3f3b8720b050b712ece4118cbee210113717392c332ba5340b5b99d30ff2137472656f5bbedc23e2dc4aa5f079335ae8f2f036c7ca15130b408d4051f39bfed179100de5e047e129ba46e8e1e21853ee9b60bfc378e03642503c2049777c9f121d77406bc462824dbc2fdd28a99d2ad3982323852d527de9d9aa48151488ba4947141b16a750f12dfa85bebc1d7d24ec2f1f".to_vec(),
|
|
b"00c60ab35362618e16c23c097103d59d146cb8aae68979a6752a0784b1fe0d95f73d7629e941b9597f94eb4c8228768cd26a8bb917067de4fc802f0cdcedb01e36baa2ab1932cfe9e44b792498a29e9dcc1cabd468dcf2f5a5e43f58564cb1b4320497528c852cda953ece3d2fbadef0328351623ae9f99988195fec2998135d78a895c8fbd4a0a774163f4cb61ba744958006de1eab417511ab78928a60139457949fc165836661eeacdc9a7a4f667491ee83affd64f7f4b65c87566597d1efefd76eb5aa2a8370fe1687cc5b627af1a7f9644cd1de9713f311ca5b0f704e23af117fc3e1a5a944214fbbfeb10e2026a42af6d88c4869c0e73dd56bb8ccf8ecd7aa0e2debf09b95cc4438f172666f7dd7f7e0f7a6ebc329621be250a03e1089b62ca7dbd04e938b2f66eb7f771134d438febc15427360715106be796ece9f5b891cb813e2bf232346666ddc1def941373f6b123a45848168b59825e9b9b3f0459abcb5c3b7667504dc1ee82961cfe145210a323a6e474f0c4120a8c30f02cf3216800f89f4cb62a24bd89c9c96865e6708cd28d4a8645d84b797d8d810ae56e1df566b9e37c07a5213caf73ef186e5c6d5e59fd3d2bfc0190b6d7103a304dbb2ed5edc8ab07ca2f7e686ddc5354ab785a160ac46e346a713f5030c7bdc279f83031f3b333a1592ddc8d7ceb14d60585b7bab3f770ac0475c070efdfd1719752d537f7bf6fbc0d0751c2e0fa10d36b867cff293e35536a993b44f7fde6f122aada4c301561bd6f77ead1176a5b62f6697cf0ab1c553a8f07c44b682c19ad93b22aa4729e2dec87394ab899f6ba6128cfe29e5443a90e33c29857dfddf3ebfa33cff9bb5eb440ed60eaf7efb14164d6041304c64fe85e32fa5a63eee7549e100fa07996557c86eb92fc95c06cfc55a111b11c496f101f1a6f2027ac7119ce6080e0fc4e79f3c76db412d51dc1b45f200fb9904386c068c03ff533d967972c24d619c7a63c4a44b0c6816fb656cf64872b27deaf23ccba1f847227960a4b5686a9a78d6408fb427d98dace02e6672310c955cda8710d458e74d5a871193e715e6aef2b469e78285cd7240f77dbb0df78a8f67a391333d84cc4b1407edada68dae7c4653a43b02bae77b5569308a77df102ecb4bbae98dc06d3375523fc87fc9e1df63b4695f800b1117a1d5b66969d0911f32674b42c4d3ad15753daa3b5706a5b96c7ad0edabc1c5b97d5ce3508e33187824d6a7b82361f051da0d4d2e33d5364de9d23863e968641b5ffc34dedc9d32cd792d21c50ed5a7551758c6906f6104ad84442c3c12863bdd335533a267ff99787f2defc4320f95baecafb1d1f54efb1f42fbda84ab7fb4fa630d1f9dae9ac069a5a4fbca75c7a81327ecc0b9253cd8a322d1ee351b6b1251e4a8cae1e1b1180b870bd9d9a237474031ce957ff8366d11bada0a6816b6fe4e5fbc2f86406df2951d5bc3deef06ea0410f11deb93118d58358f0c222fa14b228bde0378a50079a2c0f4b86ec0b9dab1ab73fc184836928c5ae5e4d0b4177f8c00c693664f412c2254799e2700a32bd927411f30d927400f70194df4157150c74e5a8d4a56518dee1bc1d18f03a1a5e9f4c1159d5bec849040e2f0eb94bc1c8b3e3d42d7524ead4a8be5324989c8f34".to_vec(),
|
|
],
|
|
[
|
|
b"9e779efb0c36cfc16a7486cabb450921911ec4db852fd058bec0ce984e362030ce19eb696ff02031bbd8a905d21e3462a635e9dbd5917d0c20f212dc290b687cac10033816ef7b62fae45df4b8248d5dd6c261b176d57d3973f2836d2ec52b9f79376326716463d3cb33fc23fb33bd92ca222f2939dea395ced7acf28d184c806e6ef4f76c3f7f3ec48e6e724b9976d5493350994ff25ca48f34a537300b1007c138a629ddfcf1fc48e17e416159fc75e4ab37e8eb5bda28f225e9c36f75bfe9193e83f00b929b79716887abb2f5f8a7e88b395e9356b52075e8bc2924921fa7c3416548e3c0f71800e2fb0e15f6a3613998ea72ff07da59f20fa6fa0005adb3b55369eebd32814d0584fb3c0a032ec1e98df3dc0e7ac533949e22047892f0e8b993e3055d4fd1f822d4ece2128febfeca0c85cf99a4367e1a065b5b9c4c7abc3a0a59ddc4d2d62c750af90ee0273a31afe442e9a6a3fa1f9c7ea4f0b8949d9261d627f5f1a352d8e6e02a4175c6993c9c2032023c9e33455029b7a11a4e95df4e1992db7056010fce21a482e771ade9455018f4f0a986c9c7820cbd53a2827b54ec9d6ffc7977a16c909b1aaf61a69452d5c747d5b18c64b9a87b9104de054d1aff4b903a67ba9d2c84f6c79e6685c565aad31a1a1b32fc6ed5c13e99f4870e19183bd18ae016653fda99409b403a5dae4f9671b26cfd5c76f16392bf331a8650c3649218136d3b930c79aef77392f825e21f9a1e9a719db18428bec1fdce15601cfc3943015a53fee31269ee57d6249ed8a2159aebbd8903383139368512f2b198eb374ea03b7e249778357c7d6574ccea486cd1f9952bad1e0415df1ff05dcc653b03012b2012c85075bdc0500b624c495f79803d43a68de6ca35c6ba95a10fa4a74e659bf3e77be52f52f4e88a1c49df5ece7cd718bffe806e10dbc8610734a393d9cb749712a3ef98e099e226d0fcaad1135a78cfeb0494d69c3cfc88f727fe24349c9607beb9bad8e793d4d7d0b4cb062f1e1f99e66e6ad62dc2799ba049cc46bdc46d25deffaee5325448c4038e477a8e571ac0441e03ca6224090518d9293c7bfce7a634b9401d78dc3ac161f6475fc6950522dcdf39ed1f70e7bb620b3887dddc8c1b1c98aba5b3e4654563744320cf269d6c78f63016351d417c734ec379ca4878f59f4a0da15ef8bd2c1a4b35679167a7042f3edc9a2b4dc9ce022895bfbec7d1eaf57bc4c807f36783633d9c639ef178ab2de18e6a8fcd4c3c2a12195e36ffaf7fea9b8bc9aee5b97a599abc8eb8c4b43639132d2ea27da59356b9726e0f914c8d9f63d9820c967c573f34fcaec263a17927".to_vec(),
|
|
b"a0c3d463a75f35b100ee1c8a34d59021a272b29d7e2ed3a7641114d89617faf44b0ad61de275d92c910627f5199486c89bd25ab751b02b785c3991545f19e48935dfe009aaa60c925c41e8de2ce52637b5456aa10f28e6bcf1b75ee46847ce48bc057773a7b133ab7ddc5737c736d63056d2f9b13eee2054a5e5e8944a4c38f658ac1926f54a26c6283dc98c750886783d7c58e80dd190a29c5eca4704848831afaf8f4dd033c9d0d231a36658f2c6bfe59fca8a85063e2b70c509eb5d7a727482e21db6b3202671c3fa8f1c3b9214e74d2565e7b67d38e0de7749cfeb1a9e46e8a5fe05f6d28c89178bae570ed1bb9a886a958d27a2c3719e5443499632f30aedbf21891f12e9e08023064fcee2809c30d85dcd6df07d2387b6bd305c94a0125ae0529c40bf286df45bae515a682a364ac8a7e1e44f49d6d0c62f0cf466b52897dccbed97c9c5d4cda25fc58cb04933ab791f66006d363775e79d3d7ff48ce5c62a093a0722cb6f29ac2087e4c485d209181ab898f026425fb93617a9ace73ddfd02d9583af532396e2eecaeffeedb367fa40967f2bc875a9ca1c21f595ac2a137d8a6474de5f274b33b922404d8f44caa45cb8c28db949f2392da431f4dbd0c04172d11e53667747ead5ae4f99de366d551fb6ee63daf9f3652379aab6d4e37cf7d39e9dd9fd6da158979a01f267408d617e26c59f8d7e944fb9103b8269434a905d10f61ec2d30ea4a8b2ffd534fe949085c9e54e6af9baff7544917ff30e7b9399f3e5c48560f8bb502883d68535f828a382a8cd9359bb4b67cbce61f715e1b89109bac2efbef2cb42b9a24862898185065e6063fd57165c75b0eedfda16f8e98a1461914a32d6c409a2279f02504841700d56bdb52617fd4bf4fe26058271933ed3888d407f0a879a0cb85af0c1a17f0a563b6bb4a694c035c2e96e916f5007ae50276d478ad7fbb096577a6280ad66ec3c65cb7ed8aed1ef2ffec9ff6b8e34be24d226b99e9a639c9f9f0c1966a7f635815fbfd3b1a6dd2f758369c3c231b3b65be764ea5e4c61433b233a9adf22caa370b026caeb2373492c522b96afdb266220009a8d5b6aeb827aa76964011091596859ae58afeaa413833be9e981a84a13e6a35505aa9a913eb04763d9b6cc26fee5b90f853d46a21be8a23286c5a92355c88a4e7e17fcc986d18686ea2324fd4ee4f7d065139375f415a0a85c7c0b7cf73042ccdf04de50166ea4affe2d726de2f67b64f39643a50aaf032ed9a2c87cc2a463c55282961d6782d2b3f1b4f615514ddc19c18f2ca9a0bd87977a7e1013e46da7130ee1572f0116fb2982a8700bc4c26bf137c07757ed5df80f04757d2904a79bc4cee409dba5b3f58a83f5240d82516fd2d42a3aa9ba2611a8a0a31919ede0f1403da2c53d3d1ee8e1d73fd153c5cb6390037847c8da5ccc13c8557bd3324988d78e663eb951962f4476dac882f3025f2665631c23cd7aea177a92ef493ede5728af04".to_vec(),
|
|
b"9045ec992acb518d4c2c59e3af622713ef941109a65325415cf1ce7598795194660ef0ae16cdd90402a78879244773c22c1a24abf4d4e1238a986857cba9ee8d2df2714ee119fe97272b155a1adfdb2bff9fec9487d46d54ecdd1f0685d6603b242b1f41de937d2a302cba7731d2cbc78051f75fbaa508236a35d0275fb5451e236b6337a8693ca48c475959e70202ba72cbc5fdbd1756943f23d91ecf9de3237de0a8add75deb04aa4b0cd371b2a5aea2829f54d7c4293b09ac5acaf081be5837a484b64189bedbd63d3a2a4995a067846e201acbaffad852fffd8cd88c684f89e66d49db1f7c2f527e41e026be1a212aea1ee497531b67b09873af7c1ccbd052505af51d7d6bc081e7b84cf6d4ccb65b4b66af8389932d4c3040414c4facab9bad72c79606d3e9449ca272bb4a6b440c32f1cdcf9b9e0323072dedd4ca4f53ae74508f3cfa921b883984aee822ff2fe7310017d05143693843c9b7b672f92813802743450c681d458325769fcb6db2a521b7370098725f84cd8d67a9a07f4c03aa2833cca25f35fe55f9668ec73acad77e0f347ed2d735ba5569ee895d679feec99f401d80dfeca72a512f253239f83a662caf7c44e76517723f4074a67c4a90c46bad82d103287df17fc7ab6966d3a6c0826f36776c59e955d70445b46a1f0494cbe81b62bcdf92c77c44feafdde4bc9623822527578cd6d44db7aea2d56e92b81e824157bf546cb7bcf9b5898a0bbf203e551ad6a9f37f44dde2c0134224b3f346480c7316b1aeed3e9a1e74e8ed5a3b95442259c2cc7eff69801751063dcec38e942b0e56441a40a7b41404ebffbf30170690a1d4b72d534c65c70c86b10f085d9507e4fcec6204d62ae341f0611273273fce9179b920936804f7e1f33b0bc0191f4f8393275aebdd486e27bdf605949237c04811e38247547978857a7d5a9fc9514ebe364b47c956f41b6ff4c8d9c02b805670b8d0bb395eb15ba90707a2c0ce29f24f7c90dba96cc28f388ea2e11164a8ac1473e3fac017d5af56b2bb6b3256a071a96eed218cb551d219d9e36f4ade5f531faa203e4f45aba9fc38796578180460c030f032ca765e9b5a45f9f6467af2e0d55d93f8b7b57f2f1f77d7454c1b5fdecbf98ed24433442d7531b434918edd592d020305f8cb419ae2a2a4f8d508bc6897a8add219f7ea936099782bb6cb4d724eb8c8ce827722bf3b020ab3b07e89a611099fd60fbda61d78cf85ad498790fe0c46e926fce40ba0d617c48a5a104817c0aeb02244d7f0534e4f6c18f39694fbc5d88d544d342a979ccc865896574d874105e4e10b7e74bebd2d592674b4bba99ab3f45ad2e585fb51bf261ec48d0a3d5fc382f758283507dae800a210fa753e796d7dbee309ea36e06232496ba48a46528f302ef91d662a13b7a332e0b5b3e1a4c762839b39d54810d84111749837cba2898191475c9d2450bb5a60e40d02b77dad10d5650edfa6bdfb3e0f0277ceb6bb55e5efaf088ccd9281a07f2e58acb7f44d589f3f661454a4137265d8ccde5eaf065803f613073c6f529784b32fabab3424342caa1b963b617430d68837ae5ec23ecc1d8aad0eac5cdd184f01f2ab80475d33dc583571df247eeae4e9a6bc291382c0b2ef0c23472dadfaa067826b70ad831a".to_vec(),
|
|
b"54eadef9f299abc5a52267fa8d20ebfb6b1e7b602fcda728627626332684ebe6459e1e3b418f009d472f551a4342f407686b34731634fb46ee7d69d579053783c4d29560d1fb79984c3da87caca15745dc0cd5ed51f791afe17fdec9d12bcf73610ab6aad821584dde9bb6fd643e0836fe562d673b975c028fd592a4ac66a63540066f3db27a9be29c872aac00409c7c713484ba46fb50ebfc295ed5c731db6d5233093ac68afe3c325e95689160d2a9ef04227e05771f9717e6745856a4ed38ce17fc31137f984190398a7f3bbfbdea135c46e998e5180fe0ee32a23354f043cb7565eb39ac56ccf0b97e846dfbd0be8dccf7fa1b95c10662d4ea7018185532802a78e4eb1bdca90557420bdd1ef7ebed1194c7387e9b23c82d560cbcbcc96f4a9384afaf31db7e8f07809435ee1690d08f7b62a5d0204e71c180a54ab2a83b0a65083943f1f87c4525fdeb6fb4723522d839f4bbda43cd89b8728a15042f394db915b3f66163bc6a1b6a0790cbec74f5f9034c83fdeebc2e4fb1dd18f1db7d88c942fa9db4470aee45473440a54d333d262bbf6a2eb6d50feda3e820b027709032f09735d291b847246f0bd9e60dd9f2bff4611b754c706dc9724df0703b414262434cac39958465d7b964e591fab2aa59fb87416f608ddfc266060e2a152522cfccee0f5b9c5e0338e0fd440280dfd4f042749dcc886d7265d0e418696e846641b12c8260710d3076fabc5d091d701681db59957afd2a32255f07cc1094e448fd319c1fc5ee7ad8deb11dcc780d75a2e6650e9a755a3ce6ac21bb80ec210b4870db98e86977a011935fe4e1aea90f4bfadbdc5a091b426aab51ff93a39e70410efbb3ee4165d60e7508b1586ba0eb55a2261eb151e2b149e33b0618a6d27ff3a47a931b47ff03423adb3242e7fbc9a00385e4e2394b578d43d9db43240c53064e12d12eb35b3756a2cc2704d50af3c049d3509700696cfd2054e19bc7dbfe5006e98ecabc6e2863cd33d260da08502cc1f65dd809f1ff10e0425ee20475841df0dfb3015164ae71ed8293fd29aef83def63996a49ef2b0df4a9a51b003e5ef66c3d0386bb6cd22e9a5ee9634b38d2949c352a28d331fc42a5f781818ccc9676b8749748bcd36243c18ee7599cf58013b8527c5a85406d403ce0388b0b343c72bac9d6ae44a4137e8dbcf2fd273e3d7c75ec10d69ef09f320dc7546fe00c84f3d7732deb9374c381e59b0640b545bd91776a54f6e5cea8cc2480c8e40a5d4110228b0f7e2d81a8d5b0d1f36627d05a4b6b76504135efb5dfc8502987ea7bc891947d3e270deec0cd4b2010dcd423e31c58d1facd6d95eaf4a9b3b2fa6c5146cac357e8dd37058afd0bc013839d6c615fbfcc45c4054f5a6353cd76359b321209098e47780c0fb10d3d37b34299204f9af7601288460d9ab35c8ba5790e8829b4c367b0bed9b2bee8b513b76dc90c160c9f8375a06141250a0d8ac42689a4f5d71a2c6d7bc923be488725345a4867dfc025a265370ee28cf79743bacca75441b577b35631005d8729918a29ccc64d506d56e4710027fc1bb9fa16e2aa6e8ad9a617c6cfb0dd2ded42ca219fc613ed9d76776d5d545c1bd93739e6d0669e4cd35356bfc9409fe7d29aa1ac0b5d1851ff4361d33565cec57dce161df0f8e290b93e469cea812f25abed5d11bd77f13b509dd2e62edc02b133e8ba1529b24d5b50c5f1c3050cbfd98275b2701542747b080a358f3751be1eadc3517fdeabcb5228a158fd808ca0eeac8de03bdae2a1cca7e25c24fc805f6ac1bc5c5ec0c9b9c72dab09d58426c07c1e".to_vec(),
|
|
],
|
|
[
|
|
b"860f1e455908274d2720d71048b9f56aa125573e150661f073f17b3ae6de7650685556e59d98024c7595d024dba569cebde5efdae9f5be6d6e0772d18c2f35307541ad8eb14262e0f38f6517d9f30c6586ce889cc23709042628a3e3d5aad0a650f39e2a6d4912f8e9cb2a1898a7541c38c4f581c419d5afea78fdf023bd9c3dd17e5b8c6ac1c828fd29ce76af0331a2e87f13518dd9be6e6828faf1b572c4109e722c041205b59f5efc6adf2bd0d3b19fd37fb848108c6b2613f5105d4eb3115706c5a121b7c5f91873323afa6a032b9f676d490fc91e4bdafe2b1b9b69fb94c41bcc76eab69aaaf1f6572a1853775c4297124147bdeed617f2c329fe47efa846630a324e9e9a6e01f59ed37dc2732747683b0f22edc0295d4748d676daadc8a89ece884012cff27bd28cecd6ecae89c79c215853c1f468a9e80d7daa2974bd0c4d38c6e024174bfc299be6474fe41104727dfcc3adbeece15011f8593492947366f4a9482bee0ce35c7c29e315f446497677286a18b5b7dc8571934e72379843462bcc8aa282235af99c87cb6809ab79ea5ff086d297ab0769cc2b7c6c4328f34d92e6e14deb23ba0cd3cefd93014eaf1ffc33bc86e7153dbad6a66fdecee9de8875cd30822b9261d8f92182f33db98875ab66e384ba50a2d8eed676b01502649d6b2fc3a9547b5b80d92f8a2d5964e2da2aadd2d37a7ceeb8ab752f647f268507aeeeb9a7e9442eeff3107e524b9e9db4ac12590fbc0ce63706e6fb8e0dbbf2335c30392d2c55497598da19820f718873b4d7cb17257bda06f910f07951ae1e91b1fc890566ed98376e3ec8906ff7428398c60050acd2fa00234555ba4671ad7017eed2862fb4e06d063bf4cfefa0c32457f523e7370481ff363e28ff649a88e42a162fcaec20a956ab63354381885615ef444045a5d70206b60c81db32447cf474f7db5eb784982f0d6f53a66a6ff52ff940b2cebbfd00eff0d1be585c3c3f3e6367b9b32f1519755d8535f395aae89abb3785e12e1a6271e4c2bef7d92a4d5df958fae79e23468a4c38876bbf351e0888681e0c3791adfca7e0fc234b123607cbea0e71b65264b2e595cf5c5b6bc495af323b5a2daa4ff97f681c524a7d854180ba9185530a9f2993b4ff313e313c8e00698f59e9b1eb615465b252a34d82a2fd081fabd412a80e937289960399e584dc608724f4e3f3cf949e37379aaab161c44b29bfd045e36891af8c8eba9a30d7fa846c5c196477f7b1cf87b680f6ec11c12dbf47aba214adc591f9b100a9bbb85be23ab6b18c38e522f4293a68f2ada69a6604ba98a1b2a93b0ef7e1da7d26d95125d63feded94e8e710ef57d8fbcc6a243756f25db6391c738b69db68fb2bbb00aa3f0ec75446ac20b3099e45f9db53b87ea3ad4e92dd4e048a5ee1051df5f28004f8aaee89718acabd4cc71e2a467f2ce8a22f0a82fd181a6544b6272efead7d59c7457d0eb93f2c7c3108679d6f7104cc3b3e7e02".to_vec(),
|
|
b"44b944eba655cc88d1dc041fdd3fb7a8eac083770032470f6907b9a23c87aa15d441d64521adad42def741b0e59cfc4c6ef32ce685d1bb17f47722875e2bd2a5542938e021d9bc3142c6c365a1342b6c000784615f6bc8de99a11c65a2ff3ef7a5b6fa2a8d0ee4782640b7b1159fecb69e7e3310136e335a59dc1037c4a548895fcfa1216728daf62e27127314d8daecb0d1f22638ad0bf0e29b0a735079a177292c5968d13dc9ad6a3a94b5001e554c502b49dbfe1ed9bea604bc006b98e4606e2928315952a16afca87beb9b99cefcbc8054cb68992d311cd642e5b5d7cfa544a32f1b384b307f7645d2777e106eb6be6ca079e6a0cf52fa14d5d0c31bb59fab66e3e298926ab6209a86b0992f7805a68f836af5eb3023ff6a20b112172eb0059ad9576ec97322d921cabe30b0d1f9dd75cd3cb61fec750e49a79ccf8ef2ee8b0326943c624e740325582776bd753ec9da2b48d95527e122bd91756b0174305537e85f301f9a154288948487cfc139a6fdafbbfcef0a512ff35994b4c1b646fb9de64024ac6f13aa8cfefa64002e6842ac5b79a05a1e02aa94c8358052fc05720c9ae5e1b867cd2d02b5b3a4bc6fbaad021fd9eeb7a7e0211f25912d282474500a43a814fde2bd12a85b2b41c04dbff5ff5dfd93db1cb52d2359cf187eda964caa6df42fb82c8262509ac9aee825bb2a64261dee1c1afa200ed0d9ce30502f8ddb5f542ff4c257005dbc9ad78a42dc8a923ba3da7e08d92c02d8b73471042025dd83e95eb3eca319abae75b92b09e38827bbc2525b5f05c6c28cc205aea70875de8a38c8eaa14eb60456bcd3500e94e8aa8183f34cbd6dde5824bb6e4c82ba0ae74483879b398efe2fc2323c27002af738283617bb4344deaafa417b67a7d6808bfb54da93080f1b75f3ce50f26dd1dcecf90e593c85e28b035d768d6eed4fe8386f8b20e21f21485e8d60e21dd62ed5163dcb1449382b3dc22411147b40055840b321a2f46ff535ded3224820765b3339872615ee2e697c33fd744e2dd9faf51c958f8361ca018876cb73ff35144df1420c05b1d84805f6bb52d9f3e54c4886715fd79b5e00c279c5e274ae7556481445e8ff92491145707150b301b1c41c521c0c70d141861227a74a28834f552af8b64ef66bc15d912b4321319a59299cba2f8d96e5e53585ec29659d217dd8ad1c108320321f60335f16ff436ffca2ef58916bd45e2c36c7056c42e567f1d93da9bab396e8a921c626c30a1586f7d101d87d4699a7920b8e4e25cad0da1f32046dbbed4527c22339cd713621f4d7a1fdceeeed620b68bb5c59e2011399bf0ff647d71ac2159bd6ad9650ae52df7c24cbbc41f325deb56857099be4451ad3df4a06ac803041892e3b7557c0287bb92f12b13a88ac6692a240a5fca71d599345762c67649f6b2c97040f56fa7d380feb13bff0e773aa672284c9eb84f7bc70a917bd834d923da4b7d6f56d85675082de62a075da5dcf8b6e235a636dff9219a669d07548f4007d11db29e23f858b5be527b60fcd6c2683495767ccf7d54ee96d0896266cac5785a1fce516a156f1651225c366380febc0f254e7b22586f184bcf923e133736476962093f3dab94a1108bb621521f87801a8a2e6c6be24ef45b6c73ee35fc1a0133102".to_vec(),
|
|
b"eebdfd697c72b1f251ce4283737f5c1ddd4403f1d27afe4102e59cd38e22fbd21697fc3e0610b555c0948dd518643caeb4a76a3489527fda728bfb438f2c2071710c3b409df636ef5a86156afd8031626dd2d0f3fe8498fc595b6f855b09046e39e43ec9f1032d5cc74b4e24ec2d348cc27ed2f77513a53ffaeec2538612d018ae2ef094ccc8cbbf3467f0bbc4dae69b72f911ffa773345b4fa5e9c6bd7423a98d5c31bdd1347c0240a2704855d1bf3351f0ca3e2af917881b35453ffa7b64927ae14665d32d7ea758d0295fdc96d0f07c4e04a614a8243602adbb45b822eed140d61b34975b68afa309767bedcd8f2b2e0bd998f520ac96fc1c602d95149d293fc962b206d1a060d7fb18c18a980fe4211319814ddf83240f4d46d85e2d89b39aa9bd67d1e160554ddeb44e69ac7867b7526619ee4a249886fbee2f40b9d24640adcd1e452a848a550c224439b1d00bbdf36e5c42f7d8cf80ba802e0728a2df29e9d8011c0de69fb7bff891b5124551bf9967a69a8bd9bebe0ffb5c6d5999f06ab955b770eb1f1a9ee6fb1e20ac20ca509a4f68e80a9521eded46c81b6504f521bca3eddbd2eea2a9753864df332e7fb5e4bcf4f9fe238b5d60d789b26945af8040b872b8b34ca4f13f7955996c97b2cd0a9a834655ddcfaaaee13d7158db6d49389b097dd23426b3ba767ac7bf50e3479e9a2090689ff09ec960309a850a4ee1fedd094644aa19bb98dd2dbd8e2e2db9e053a6f2aaea0699d6eae04c171b1fcaa82651e636e7a0bc37651c9c507105825a427ca5cfcbf57a474496a84964e51934fe4e225fb8b3471d3f2e4c75263380e17a4f7538de74e2ce0be759ae12f4c697fe9ff1238bab0e2e025998ab015df1b3891ae4d22aa6c0c24f0214bd32a77ce1bbdf69d8987b9021dd8cb1f6023bf7f70749b7169c028375110e91e54923000980badfa5b1322593a4a39a30c31c4cde06bbcdf3d7fa6f809d60b571486efd894ba21357fa5062a5457a951d81d6acbceb7a1475a08538277625ccb0bdec7bf4888148e544756f82814f2958b964d13e28898811101c3138eef2a95faad0d367a34b8df746c1640bf55e8bedcaf3c08267c6738764ba0e1d433c68d8b5e3dc2dcb3fda8a88386f930d56153d6be14dd1c435397dd1d57560152593df89598e768d18950e00b094de02beb40c541db66e537bcd7a2e574db7a3b14b8a1fc83b146c28b23a0500865c27dd9d5467152ed7ca009859d3a86174619d062ba1017c1f6d62084959ddd70f36d403950f90514631c2a03b02a6f69d6160ed75b278f7188a514b0ef1262ab7f463912fcae2f46a43c4e8f3880e625cd7cbd5f1953b8a0038b372f20c4c0cd5c1b4ed87c4734b06f81191a287a3c5ccee783f41d4c3743f7b0830d7babd454dedc464637ec7dedba053c4049cea78ba625b825151b0ac6f902ad233b6adab7557629d90ade5ac9b1c672322003d7d20ed5890dde0943509c1a28e25ae6ce609c178f27f11c67d2131140d0e48dfb22ffdfdad96b5b6c8d9bb20a4f937e29d8b9b649659beb1d93ddbd91c8c6c80a4469ea8d65e9b6eb0c9e7b517c2147abda2d56cf8fb3a60fef750590243088d868ab876fc177e4f7a468b956b0da256d68bc2361c4ee0925d6047ac4564c9bde03c1845ecbfa0cc6d0480e3bd3fbbbcb6be0a85fa9cbbd20add4c99d0fa0e45f383633ce8e73072196ce7d0f2ae5904a9a521457745cd225ba2dedabb9c0e806e34a53985e1a7b6b03d764f3f4965e0784d437023440441cddcd31c6de56b13eac82d562e1857388a89f866a936182e".to_vec(),
|
|
b"d46b7406d602ee013c29b2b88eaeb6e6c91d59f39c2973dd20aaa5d7cfd04279acc04feb346d8d48f09b53e15cf556560003eba73c38895cd6a8980158050d291eea7fdd6a5bdd1b072bd034b68ae895d4c036a161a66c50aee5d952f91ca3b4d4c6bbe206d65be6584f27d62b9dec7de22611162707b8f94e067998bb22c615591d71a502fb5330b0795fe59aa95131d96e7f1b3dc159f5c37511d9db1f6ed6700084b24219c3ad0a0948a318f539479b21896bbb4350a811a12d8622433b8805d83d87cbb901f69ca94a2808b9bf15471441018eafac1bc1fa988dc6ed8eb8afaec30319f523d75b24f9c0dd6eda9dad1624fd42ec306613ec6d2d48e6198d020277b84f0fc136d2119d08a2757804b304265be8d29623c98572937b711e82046e4b636aaa6eb015584ecdf8e41735f20f02bfedb0630c590f601eae603b510ffe1895c393575560627e7dc4bef105b7e54131250e82d82ee011633e9e227aab23c3ac1f556a83c8347b2b15ee9b14abb4d5e800357478e75235bd26b0f0cd1f92c9be9c82613848286a54c18466c4e3fbfad09ee12cd9344b456bbf2cf9086a75a7265dd0cf0809ef6f4762a36ff46b5d6044a3d9df388e08d04a772a30c2e4bd33cdb03f3e6b42697c8aa9ee502e7afdcf5a75ffb4fcfedeb69c686cd8994700f37b9f98a4f0095f21f52ff0b51fd49c9615024a1d01161683779e0d3e411ba987259c40c362ac2acbc8433989535e4ae2c786400fec816c5de0dbfb1e291361b0a66bc4e9707f5f04c6713eeaa9aaceab18f0162f7828abe95d78bb6dc33481318e8e4517bfd0826918fd004581fe19e69f77c6fd9c09ebce1aae98ce29101c3190a6497aa97e055f16b85190cf16f2eed1e7807245efe2c9909a4e560fc8c3aeadf13006270e80e965816c2fca8c95666d349cde6768ccebff2683c84b4c75bc8bfdbf987bdde289db98c52813a15b892d22ad7efb7d79ed825f89e0b428af3214b95a6bcf509afb4fe1fc11096142e4dfc20e6aa948dc56e363de2932c8bb6073bbd5fb31bbfefa416ba8e429831491967f294c185f2d5c013e189247d5f76215c8ae9ee4f80fbbb1a4a7edfbbcd4de38c836547b397d12cd55db7d84dddfe3960d7aea69201bb655ac0254212789b93fc8f083b18edbaa509817b66d329fa9c2fdf9cc77ce0c3a65ca30c51600565af965e0950f34bb4189d6fb0b5fe79588e400fcd2df5f25315538b0be89df01d7b85be471e9352cf80059df4c220855f1834febe87ae8993cc465ccedf2eadbf51067941589abfe5c4e18744cd05cb08425410c20bb102ef24fcbcd87c4ae0ff2fb5ac35165c62764e7ca0dbdb0dc412ba4615b48d4fdc49476f223d9e29abf52da80393a976ea1f4f9080b53c59cd8ee20aa4887519427186a4fc0208212767230422077784b054fc432cd11567ead3a2de69f748b3a0827e9a5b6b9af967b5c4ebe8da7751d00815eb7f8db7ddf72783b0e6b36b27a6b8b942eff65b919239d314b2f7347ade9ecfcec63bf4890c08f6dd52653fbe6d12025178bd1d8c21414fd8aa99b9ede152bb01afa5ee1bc2ea1ccf461800a368bc35542fa89ecaef9b6e28699fb68415079201ad64d60276af5dda4700865000103dede2e1338c90fb9323658173a00e05d0bcf32977407e1858dad675dab9d9096fdb6e09af22227c9abc6e17722a565b98642d9d07c1c4e15129efb76ef856b6eec7cfa6226047b2f01affa58d8f8dbcff39576c4036b23d2d3020b44ab94bec4f8e46603aa980c789b0a5bd7fb43648261631e8ad1a6df0965cfe5cd03297ce00d330c80cbd78c4e78e7e35d02454ae3a066cb0b116078aa60f337cdddf30bffb1a6dbf44ec5ae701cd77cf94b163b7669de292c0024a96f577a11ae40ef2c2664b51c11bfb95d08238e148bfaa81c1c41104540f3824c70e611117f76575b0f6332ec42669f369e2e460f2809".to_vec(),
|
|
],
|
|
[
|
|
b"443354a054a8ed23fb9ff94e92856c70634d5639c45871b0496b22b453ae6ca7f338815fd68fe6b456c45ccb5661528f19e98065bf07da509669639be3c28c74c30587f53bba4567dbb64edcad5785087795907ddf9a47e7e0f57023fef344a4d4a0f7d3da11f211192b2225137f9505de552b1cf92221883dc98e79062ef943c3e51e944d0db9d3e5d8fef3603897f0e4391329f0e8203a05f06986ee021f47d5df8ef7484479041ef05e4c17da54c94eabb6296a7338e3999aa5d49bfab44379d55308a82987a58bdfa0da1b84c2fb5d564ef9c97bbacec6da4c8c511ad236087e18bf746b8b000241c7aecdce56f004a0071f3ded68ea7bd15832c76ce81d4366e8831bc44edd0276721f660805b151aa532720653919ab447545e017a13fe5033578a3847c830241ee373550ca3a8227df51385886dae32ac32b4c1ab39843684f3c321a723a3798fcb4d627993d0c69191f3a907a5b93d9211e76d4eb2cf2b3c300b787e9d2888a50fda76e73abd2ce279d8f5090cc4be7a0d273aea0a825d34721e483783ca00a2fe585ee27dffb892d9a1fbcfdb4edab780cc54cbc78fa586ed8d2c12dd96d8c8534a61c304dd60f83a411ed6878ece4cdf8d1ae7ced5a8d58b8a00ff953d8c95642aa0b13551334494eed5e2c568a5700c3da3033782ad45bb402252180cac43bbff52a2c296d95336985d9ba586807c0154d8bfdcd32ce1c20aef47e78ecf9ca64de50c9a6f66c0012f0295043b567d3d23e92751afd99e9c1f2e99fc380305ff3e4ff16c5c86a03a6352addcb2fea19643ad003095a20a4e310008621fb5a17e8fde30d8a8fff0483299c5cd032b1f623529a391f5e257fa67972f2db9a45ea1299ad01402a013def12b038f7d9f08f2c7c83176f9d07693e7c796727600589743fa36ac79d55f4337a79906d6d2d848f9e5d1c61145245a78e7fc92869cac46e9f4ff2c15f5a27485eaa2e23f91f6311e156a0cdfa40ac9838211adf6140cd556f1ec30dd00e9c493d1d18e40242b1ad8e08991b28ba2fdf881ef219ad2525a6a826f17d8793f8f3b194e9de2fce9289dede5a24a66da47b08c11b8571e28097c199fa4abcddfd3e756d4e62399f818e52f5ca404b04ecd398ea6fdd6637b4c670df40251c5345287efcc2457a1b3e68147fc72903a10f21d7c3e5531c3a4a12b1827005e1b6dfc3bbcb4f9797b1ad60dedf54f9426aa9156c11c56c7123f0ec75abbee2011c4ad65d89783d7daeac6438b6f4d20a69cf9471a0f634722bece51269ae854e8cee6617792f413a8e015e4fb56ef7d6def5ef1187bb02db349bbeb2ae519a0a6cc0892546df5340e73fe14c96a39f08ba31ba608b413975301e299a5cca04e6d75f13468f13a987f2d6135bd559f477f54afba87dd7aae3bbbc98666b2a0a72d56d60fb727bf356ab6ece7073aa9e851b0e4c5721dbb0e8858510365286623906a13e99a86dc8290f700b8729c0b6c4750fb7b6dc72468be2c21afc8b815a6c0c0a88da4c149c1b61fde7a3a77b6108f3da51bd37bf5979e343b5bab3c87b197b71a9e8f685542b0c2ef1c3404813abeadc16d8b5d12df1608f2742bdca52114d77517972907f151a473271a887c8c49e088b12197df37fb91a97520efb83446d6d2075f3e722".to_vec(),
|
|
b"2ea4abbbdf312b73be9cc0086820a49aa531aa2f1f701413fb3fd62c5fb97681a20375509d804fe83b8ef71c970b0c00393db869ee56358ec271fc4b30053b372c9b9e0de60e8245f9733dc8302f8a7f31cbb52a457d9d0661acc9d7e518d9d7c2655415edace5db8f0f4bc7ccbaeeb4d6d55468745e5aa34ce6cc6f7a5bdf812e8ac6965cfe6bfd7f4bfd3382ffdd011e581a8336d7215de806edcc2d76c81ce51de0c608dc54e0048acf72ce9d9eeb0c8249f1e70e80d5fc52d4fd4e908073dd23ecfd5e0688348e88f848592e565f3e9ec29a335bb0c46ce57752e229c6e3f161679ac1734491bb706a5ec516c803e42ffa3c12e08d0a65fc47d1305588626706612861cce2d38bc0c8869ce8e7180060f2cd49f183322d52133ef77a38c17e10282cb701b9db38f9cee6c563d5f78ba2e77d075e9d155d1f07bde2f105a99043d257de7c04a559a3ff9af64ec627aa5e5f135b39bba3b6da735ada9ccce01b62afc245efa79070fa00620b8a214c6c956b165168eb9674a86fbd54722f88579e153de44f72197c0f4ceaf2a051899ec48bc9ee8512e3b3a9bb64c3034858afa561bbbc41679cc8001b8e55ff81da696ab8d9d331a06c8429773b4215eb60a00c1ab832260dc5e994d16196e6bd851ca6a34fac7450c19c784194120c2e0aff606472588284a744f5384faa624c2cd5ee166464c6e1237e4f166ddf283394588d21ba8b5d627ff20c128323a723125a6fc6e60b8480804633af7329f98d80a78a4fc6a66773c4a4da087852f0ffc1c4e025e9e08b13cd964c48f408eb6f332284c768a0d8eb495975a0aa7116103bfbf4cb39ef521d60d993b372d51f5deeccf6c385a5f682e7662978f9f94735c71f6a912c56d6c780685f3942bfb054c23e1b0b4b1b325de875dcbf7a425ef31421335dca2a80623517782b5fb26ede5b9cfafd6b62342636ad31aa9956638ccbcabdf4c37244c478e5a6f94e99cd3ca890048124e31d82be6c1cb03646f41e965ab3b731c322aad090d70343d0dd5c503742702ca214322148b3d9f28be570d9e2f7215b613920293dfdf036b63337399459e6336007a9b435ebc5b64024f11c8033ba661939ad5cc0e174ef60112df28c5b5d3dbc637a55fa37bf4f147c8c2d37e8ad987363f862bbe7c51931abe577d410ed7174b74c3de00e7798b1078b799db65f8eacd46812f38fa53b2d55cc88e09ace8a36749b37ded820e1f73af5d0decfe72f33943b3d17151429cf40ecf92ad0e1f77ed86c252bec2a2013cc9d24b13efa98d02c8293170a09780337ee2e2c7fb10376ab9232f0c54e5770e421f3c558aaa3e6b21cf854ce18cd89b796bc349a83f9ee5bd40a70f28db48be2bbf5d703de35b92709a0b0ddf09f3d10b9a57327a359dbfd832eb9e99d0e37f21377029d248d05cb56f003b333252d5f01982abcfc05ffcd6652a4391e94f55fdcdc9aef4729ef4b896ae76f50913f1ed9a2ae465cea47919ce5ae28d3b89ceaf847179c877180d1b524fd656f3d7f4a7719874a3f1d77fdd0b01f03fb6970abbea9020c753528b9805d3002ab795cb683814c1819024c0932b9cc28c5ff91e776ca6a2c7668f06d6f2959830105471e42b7c35490c3fc6072bc72baf73880f00feae7e3e271dcee43010497dcd00c188836b77d81f6273aded4d660e2706f1aad72fdb485760ede1625887b62b1e5e0c894fe319c2abe6a985dfac2b601b4fd41265e964d9d58e68c9e4a351179bbc4b0a83a6c112a23e3cff3b964b6b79c3cc55ea9cddb65457e4c7f2bd879a7f6a1b6351e85a07f8209d00a".to_vec(),
|
|
b"720536873c696b3f801eda69795a9ddfd1e62142499c7b40a0b0346f72fb76e144666dee7cde4d5fc0a245c8998230c27c7ff55a3c4691cb4a42b85e20283e10c4a8d92e0f9bd5d3f23d668dde303d9f530f0d372c3d3399e1775b66073acbba3e8248906f42298c153b21800720d192b8a7752b9eabc92ec00d9a7dfdfcccaba5a8619ffb9704ea5f87c74a7ee60e82d1d3c04039633cc9fce5ce1b273f28d43723e0631ec3114ffc825003fb34a916caab570c1fa21d2e9b63338b1b6126755a208766f030e2fffb8e5ada07d28765e97fb352cad3e73bf316eebc7bf991c65c11024282ea2842c4a3d48c18eb0babcb370b0b5ce7ca84e36f834783d9646a9ee0ba97ece243ac5af0c127bb94e519eb9c01303612f20fdc903a678beda016b533dcd90f5d914c842804f4ec50cc5388fef69f92df490ec4833717c045588a093de07ed1ecb798ff86777816fce21bc5c146d044670b895ccd16ddf3053479d1cc82ba2c662491b8c8d130f86de8ab611e47b303ba25730bc1a2f84fd35e1c3b97f1f08bba1436dcf8b182e4f813cb77a7c0a70ebd8bb54bf6e8f17741f1e889396afa1787708e351ba9f2b9d6c28e5931fcc0727841208af8534c0fd7b8218480494146d64f8316441962b43c1a873f99ca5a46a31d5f2109373c3feaa15f0cce0dca8977176903827b39a9fac29a9737139e0600b34d26ee9545a2b30a4fa0f212f323590cd4fbc8772f48bc2c02aacaf8179c78600ebc18897d3178eec225cdef9e3cb72dc47bfe18aa3596f61c30518e2b27fa2e2ab37ff6699523a4bfc089c9422e4cfccacbd95e117454a3d4e94b524ff0ff63ee818e5a54f128f901e8b43abe2c1005ead6e6e4ae1484e46d003a179d3ec425cf387309f1399d7284f9e77d78dddead3bdbe542f0e33f65d59dc8a3ef18cad2a156b99b4d47d131b5dc49c7c756188b060452ee23a21cc58ca8e8751fa65d6a1aa272581aac843eb708cb5fa93d4ac8bd3256616281d1db2c02a6ced29facebc5100a097a870edd38dcad59fdbad6361d735fbd559808f6a68d06ee8ae09da10659ace80e0cd1470fbe7457da054dade0aebf245d7516408c580511aecb8d9d281e3da7aab0397beaa3aad260c2515899fe93349a0f8e923ef9631228c442cb122fd9edd61a3609c109a4889c1199815530b9844a031281a28d20d24285f91cb6ee01a00061a5c673acc81d89c0168e8262f5685d9392cab533d62480fad4eb63271da46b34d90f54646956fde148597333ab5e306d3b62594b9369b8c5e5483d82e8f58e4921036ae5071f38cd18f89a762e9bbb0b1431607f70e37f8da236ee140cc449e584633919740088e2dedafd9dccdbcd1088d8f703775bacf56c6f3a931b21a3ddff8270ac400124291639bf2214d8710d35f4bc20aead176c792f87986903742d006156ef558e8c227ae5ae1fd97cb9f6ce040c2d7d20629b211387b1bfef290a5565129423bc84ce5a93897cc0291face52ef462a8fb5db4e281ca525799a329c35538fd3dd51df75d932421b77a750484b33b734ec0927fdfdf5c8ec0fdfa8cc5a9afecf03d075886c526cee66daaeccd83173e00f6584ea676c02ed42dbbf73337d1374f5a2ec0b05e422fd9d4302d63ebf735227a25af4291df1e8d15522bc1132fd5561eb62bf7e38745909fd4fd7797aaa40a647c4e44a05e542fd54e611cce2e248430ee0d5a92212d356b9874bbf3db0ecd74c9b036ba7cd9396df0f9e9611a985038b8ed276605959ab7aec4193b17159f12c6c9dae2325c0c44fb5b5446ad856f05acdac55ee27f837bfdcabd28947682f77d0f9d67c65d6ec247ca1b81f6e76ad2ce987aabfca1f1c1d414dd640b6b92ca8b9d0e553653fe75002a09e430b7fad9a75a2b6ce98fa960fa0317b3bf9beb1ce56aeffa4c1e55ffd497830d8193ae2aca5a53a3ee61b75e3da3aba20680e7c62d40e88204".to_vec(),
|
|
b"1af4f7677f4060e1130e08e9504ba2cb2cb79ef764c7965c9a71f3624526010de02f4b43f5ac1b6dc50d6929ba50e7b124cb513f709ceb19ac2a4b369c7c588d1dc15649da07e1fab3c376eccd71412a204f2f286f48e7be1840e98585bcdba62f78db525af08274c4db22ee2bb40a60d67e7067a762d0ee5533c8330c3154882d1fe97632c5a0ad2479e083f0c58d1d0dd2f1df227c57d5e04f32e1cb7d8debaf94d0a76553a7890ef65479d4f9649e1a08bded395e604981ffef3c093ff2d16425e7f4b2a51a4ab1ac310284234bde76b62702d56e5445765bb80eb7e5875c89a2adadd1b943219a470a160d5a1a3ace8fa65bfe6da82f34417e74363f21fff344ea2b76f72e5560a164dfed7df1273f7c5ef8062ca61962ae77b658eb3410d3a406f8696f08c80fbc4b621c4313cb9cee86f0298e59809fc3108db322c181d8b18b3d40cf9e9805b9aefff518790058197c5861ac2b25da7c7cb0ff57d086cdf6b0384a612351dadf74233635e7dc532f78322eebcdb1da327e678209b7204e24dc980167f73ae4df37ecfc3a6151bf9060dabdd04024a8f4d2886b2e4502c289bb82bda1c524a2cc38dcb965461c7f06b1ea573e2f23d4cdab77d16cb65e34f9266c231d390bd762f64b4cf87b4f5cdef952d22b1e0c6d00a56d6dd23f5ce2531c88a120cb6db4e43c90703a52669b2afcd7fb43df1584a980cbc89b08de78c2a701eaeaa128707dd973c584de556f05f47bbf4d9761a90a536d550eee45cf12a5aa6cbd44fb1f3c10296a0288f33cd6797a7f34ecce157d335bd1511746162836b19bee0ce760d42e9be325b47e958b9d85801dfe0f8af77b3925dec1a2255b5eb09ef31da0fe29996f6b882a59a9f6176d804ca5312afe032163ec715572cbec441e2cf6ae88dcb6c12cac4700abd3a6de087a40c0b614bc3aad31cd38088bcb59748a88df608acaff8ac78c4e90e5fe32be5da67ddb296a7f9d83ef50c7a1ac0e5573527bfd6a3a6c35b4a69dc9ce1652b3463cab2a497b3e00363ca1dbbe76917d0da53e36e78c7a89d37a6fc11fe148d672870e882a0d58cffd6231fe77c1a33831f5753b9007411dd71b2ccaa781d740f4ddc2ef30a7508f83c00ad0b54aad538eecfe1f8365a1aac44b57557c5ec93431fd9c2969f1b8c7443592ca1de51cc6e372b6b686912732176b1d4694d0ff83c90656630506c4e045a391b29b47d4033bc703b4bd1d6a11647a15950882f966175bcb17590e34e525cbafdecef3f8c72b3e8fccd5c81ea3dd1efa046ae142a6e835195c78cc9bd5c64f33933a17cb5af6e34355c8bf63d2e28afa6f39a308ccbd8fc838028ab0b09cf82ca4f3a249ce512870160c44678ae47eaeff441e15be65fac1dbf2c92e65426c1c7e654a391fa56b39753fc140f1b07729b8f89eb86395ea73004da6af7c7c9ccb32efaf073009a3140ca4fb2a1888bc15c619e4cf0678e6d0bf96dd8363a6ae9b24ac4addf3cd2d20683b9b989521331073df332ae82749d2d467ba6269d114a8c6576a395940627d5e53d1e8a415fd3f00089ddbd6b72a9728ed67f55a2c3c0702db9ba54a2d51b310fe9bc4f6a54277b4f5ca7bb85a4cd8c1e100406d933df5f5c2d99a88d03756861406395183739ef449ff9c82a82ecd06f85eaff57424ec93d68f64a55caa3c4198498aca839a2bee4144ebc22115d74871f573490303897fdf346f62373e98f19a542418ed4f7ef2bdffece2f48f2d8e8871cd36a1c5726aa1c3ead297b6874a7e16312a334f35c66ad181b2828b3c278c8cf510c820f3acc625e30a73f40018f0e6968e0ba1769e2f25f3958725f0e79bf81ee852240bfdf4b82ab2167fa1dd85a0f054a971a1c6271cad5edd1f585c10a61d2f32f2cea043c695536fef75f8dfbf2765d5a1ce2f40052ebf5cea5efd7773be3a992e4fb14fb5a75d572b53c01e5db47bcef406694488ae4829ec26d9f649e2b6b10e70b9ddfa39f36c500ab391f074a3985fb0ae1ec730cae82ff0c01f394d5c25022ec66a5e87c05a9378f1e1b2705a90691df24bb9f575837cc53b67505dcbdcd14ec19994a47df80c26f88d9e891c93e1312d37233b7280b8c6a5c37c3e200597d759341a5464116606".to_vec(),
|
|
],
|
|
];
|
|
|
|
let vc = [
|
|
CompressedPoint::from_slice(
|
|
&hex::decode("0eca26aefba9cf77a65dd5f77c1524cd8a37b1c67b7f0fc43c54fd531354bc1f6d8943d09c2a592dc910673df46cf96689d4815e9d4477d7")
|
|
.unwrap(),
|
|
),
|
|
CompressedPoint::from_slice(
|
|
&hex::decode("d2afd0ca308dfcfe87943d6f6b93c2b5e1ab5e018db533c94c1ec055dd32c0a92ee3a2d46edbeebaa99c2d3c872d2594f2c9e217273eb166")
|
|
.unwrap(),
|
|
),
|
|
CompressedPoint::from_slice(
|
|
&hex::decode("0c7984308888c15f54372975b205c0ed432b320b5a9dd1ae2e6c09af6d0f49f7ad30cf7ebfa9b1cc4df255e0da1862db4ecbb67e51d17d95")
|
|
.unwrap(),
|
|
),
|
|
CompressedPoint::from_slice(
|
|
&hex::decode("6e9959b543eebedd6702f03821b8fd8564b063cad8b070569f2e14573f2738ef8ce6f8eb46fbd2dd81cae37a1200ec480b7fd01a4506e60d")
|
|
.unwrap(),
|
|
),
|
|
CompressedPoint::from_slice(
|
|
&hex::decode("0e85959126d5167c9062dfae6cf48b228a5c9d8b54731148fcca4dc686a556933b5d2f7cd70f72740dec88b6ba666f20aeb0f59c4ce680d8")
|
|
.unwrap(),
|
|
),
|
|
CompressedPoint::from_slice(
|
|
&hex::decode("e6e242bac342abe54d62f997ccac683c20582e8c45ca8e9eefd05af7cb8dec01c7058329eaf3150bc60414cb5d2f6cbfa6be293193223d20")
|
|
.unwrap(),
|
|
),
|
|
CompressedPoint::from_slice(
|
|
&hex::decode("985019e8601a5b714070d56e035c1a88c0d13766630014ce3fe0ef1355768f479d1276f41c9f7a4be7850b30c493309f97f2582048ce0db9")
|
|
.unwrap(),
|
|
),
|
|
CompressedPoint::from_slice(
|
|
&hex::decode("9c58e420da751bf0781c02a6b6c1d0e1487dd1c2ba34bf0abb22df75bb46c2d393c91aeeebfca9707dbdc9339a806c12c2a54ceeedb42325")
|
|
.unwrap(),
|
|
),
|
|
];
|
|
|
|
let pc_gens = PedersenGens::default();
|
|
let bp_gens = BulletproofGens::new(64, 8);
|
|
|
|
for i in 0..4 {
|
|
for j in 0..4 {
|
|
let (n, m) = (8 << i, 1 << j);
|
|
let proof = RangeProof::from_bytes(&hex::decode(&proofs[i][j]).unwrap())
|
|
.expect("Rangeproof deserialization failed");
|
|
let mut transcript = Transcript::new(b"Deserialize-And-Verify Test");
|
|
assert_eq!(
|
|
proof.verify_multiple(&bp_gens, &pc_gens, &mut transcript, &vc[0..m], n,),
|
|
Ok(())
|
|
);
|
|
}
|
|
}
|
|
}
|
|
|
|
// This function generates test vectors and dumps them to stdout.
|
|
// It can be run by uncommenting the #[test] annotation.
|
|
// We allow(dead_code) to ensure that it continues to compile.
|
|
// #[test]
|
|
#[allow(dead_code)]
|
|
fn generate_test_vectors() {
|
|
let pc_gens = PedersenGens::default();
|
|
let bp_gens = BulletproofGens::new(64, 8);
|
|
|
|
// Use a deterministic RNG for proving, so the test vectors can be
|
|
// generated reproducibly.
|
|
let mut test_rng = ChaChaRng::from_seed([24u8; 32]);
|
|
|
|
let values: Vec<Scalar> = vec![0u64, 1, 2, 3, 4, 5, 6, 7].iter().map(|v| Scalar::from(*v)).collect();
|
|
let blindings = (0..8)
|
|
.map(|_| Scalar::random(&mut test_rng))
|
|
.collect::<Vec<_>>();
|
|
|
|
for n in &[8, 16, 32, 64] {
|
|
for m in &[1, 2, 4, 8] {
|
|
let mut transcript = Transcript::new(b"Deserialize-And-Verify Test");
|
|
let (proof, value_commitments) = RangeProof::prove_multiple(
|
|
&bp_gens,
|
|
&pc_gens,
|
|
&mut transcript,
|
|
&values[0..*m],
|
|
&blindings[0..*m],
|
|
*n,
|
|
)
|
|
.unwrap();
|
|
|
|
println!("n,m = {}, {}", n, m);
|
|
println!("proof = \"{}\"", hex::encode(proof.to_bytes()));
|
|
println!("vc = [");
|
|
for com in &value_commitments {
|
|
println!(" \"{}\"", hex::encode(com.as_bytes()));
|
|
}
|
|
println!("]\n");
|
|
}
|
|
}
|
|
|
|
panic!();
|
|
}
|