From c71fde7b8d2d85dc1b8352090743c99ad787b4dd Mon Sep 17 00:00:00 2001 Message-Id: From: Mark Wooding Date: Sun, 16 Jul 2000 12:28:00 +0000 Subject: [PATCH] Test equipment for the 64-bit arithmetic in `bits.h'. Organization: Straylight/Edgeware From: mdw --- bits-testgen.c | 109 +++++++++++++ bits.c | 112 ++++++++++++++ bits.test | 403 +++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 624 insertions(+) create mode 100644 bits-testgen.c create mode 100644 bits.c create mode 100644 bits.test diff --git a/bits-testgen.c b/bits-testgen.c new file mode 100644 index 0000000..7f48291 --- /dev/null +++ b/bits-testgen.c @@ -0,0 +1,109 @@ +/* + * Generate random test vectors for 64-bit operations. + * + * As an independent reference, we use the Catacomb multiprecision integer + * library. + */ + +#include + +#include +#include +#include + +static mp *m64; +static grand *r; + +#define NVEC 64 + +static mp *mp_rol(mp *d, mp *x, unsigned s) +{ + mp *l = mp_lsl(MP_NEW, x, s); + mp *r = mp_lsr(MP_NEW, x, 64 - s); + d = mp_add(d, l, r); + mp_drop(l); + mp_drop(r); + return (d); +} + +static mp *mp_ror(mp *d, mp *x, unsigned s) +{ + mp *l = mp_lsl(MP_NEW, x, 64 - s); + mp *r = mp_lsr(MP_NEW, x, s); + d = mp_add(d, l, r); + mp_drop(l); + mp_drop(r); + return (d); +} + +static void putmp(mp *x) +{ + octet buf[8]; + unsigned i; + fputc(' ', stdout); + mp_storeb(x, buf, sizeof(buf)); + for (i = 0; i < sizeof(buf); i++) + printf("%02x", buf[i]); +} + +#define GEN_SHIFT(op) \ + \ +static void gen_##op(void) \ +{ \ + unsigned i; \ + fputs("\n" #op "64 {\n", stdout); \ + for (i = 0; i < NVEC; i++) { \ + mp *x = mprand_range(MP_NEW, m64, r, 0); \ + unsigned s = r->ops->range(r, 70), ss = s & 63; \ + mp *y = mp_##op(MP_NEW, x, ss); \ + mp_div(0, &y, y, m64); \ + \ + fputs(" ", stdout); \ + putmp(x); printf(" %2u", s); putmp(y); \ + fputs(";\n", stdout); \ + mp_drop(x); mp_drop(y); \ + } \ + fputs("}\n", stdout); \ +} + +#define GEN_ARITH(op) \ + \ +static void gen_##op(void) \ +{ \ + unsigned i; \ + fputs("\n" #op "64 {\n", stdout); \ + for (i = 0; i < NVEC; i++) { \ + mp *x = mprand_range(MP_NEW, m64, r, 0); \ + mp *y = mprand_range(MP_NEW, m64, r, 0); \ + mp *z = mp_##op(MP_NEW, x, y); \ + mp_div(0, &z, z, m64); \ + \ + fputs(" ", stdout); \ + putmp(x); putmp(y); putmp(z); \ + fputs(";\n", stdout); \ + mp_drop(x); mp_drop(y); mp_drop(z); \ + } \ + fputs("}\n", stdout); \ +} + +GEN_SHIFT(lsl) +GEN_SHIFT(lsr) +GEN_SHIFT(rol) +GEN_SHIFT(ror) +GEN_ARITH(add) +GEN_ARITH(sub) + +int main(void) +{ + m64 = mp_lsl(MP_NEW, MP_ONE, 64); + r = fibrand_create(0); + fputs("# Test vectors for 64-bit operations [generated]\n", stdout); + + gen_lsl(); + gen_lsr(); + gen_rol(); + gen_ror(); + gen_add(); + gen_sub(); + return (0); +} diff --git a/bits.c b/bits.c new file mode 100644 index 0000000..7ecebe6 --- /dev/null +++ b/bits.c @@ -0,0 +1,112 @@ +/* -*-c-*- + * + * $Id: bits.c,v 1.1 2000/07/16 12:28:00 mdw Exp $ + * + * Test rig for bits header + * + * (c) 2000 Straylight/Edgeware + */ + +/*----- Licensing notice --------------------------------------------------* + * + * This file is part of the mLib utilities library. + * + * mLib is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License as + * published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version. + * + * mLib is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with mLib; if not, write to the Free + * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, + * MA 02111-1307, USA. + */ + +/*----- Revision history --------------------------------------------------* + * + * $Log: bits.c,v $ + * Revision 1.1 2000/07/16 12:28:00 mdw + * Test equipment for the 64-bit arithmetic in `bits.h'. + * + */ + +/*----- Header files ------------------------------------------------------*/ + +#include "bits.h" +#include "testrig.h" + +/*----- Main code ---------------------------------------------------------*/ + +#define TSHIFT(OP) \ + \ +static int t##OP(dstr *v) \ +{ \ + kludge64 x, xx, y; \ + unsigned s = *(unsigned *)v[1].buf; \ + int ok = 1; \ + \ + LOAD64_(x, v[0].buf); \ + LOAD64_(xx, v[2].buf); \ + y = x; \ + OP##64_(y, y, s); \ + if (CMP64(y, !=, xx)) { \ + ok = 0; \ + fprintf(stderr, \ + "\nbad: %08x:%08x " #OP " %u != %08x:%08x [%08x:%08x]\n", \ + HI64(x), LO64(x), s, HI64(y), LO64(y), HI64(xx), LO64(xx)); \ + } \ + return (ok); \ +} + +#define TARITH(OP) \ + \ +static int t##OP(dstr *v) \ +{ \ + kludge64 x, y, xx, yy; \ + int ok = 1; \ + \ + LOAD64_(x, v[0].buf); \ + LOAD64_(y, v[1].buf); \ + LOAD64_(xx, v[2].buf); \ + yy = x; \ + OP##64(yy, yy, y); \ + if (CMP64(yy, !=, xx)) { \ + ok = 0; \ + fprintf(stderr, \ + "\nbad: %08x:%08x " #OP " %08x:%08x != %08x:%08x " \ + "[%08x:%08x]\n", \ + HI64(x), LO64(x), HI64(y), LO64(y), \ + HI64(yy), LO64(yy), HI64(xx), LO64(xx)); \ + } \ + return (ok); \ +} + +TSHIFT(LSL) +TSHIFT(LSR) +TSHIFT(ROL) +TSHIFT(ROR) +TARITH(ADD) +TARITH(SUB) + +static test_chunk tests[] = { + { "lsl64", tLSL, { &type_hex, &type_int, &type_hex, 0 } }, + { "lsr64", tLSR, { &type_hex, &type_int, &type_hex, 0 } }, + { "rol64", tROL, { &type_hex, &type_int, &type_hex, 0 } }, + { "ror64", tROR, { &type_hex, &type_int, &type_hex, 0 } }, + { "add64", tADD, { &type_hex, &type_hex, &type_hex, 0 } }, + { "sub64", tSUB, { &type_hex, &type_hex, &type_hex, 0 } }, + { 0, 0, { 0 } } +}; + +int main(int argc, char *argv[]) +{ + test_run(argc, argv, tests, "bits.test"); + return (0); +} + +/*----- That's all, folks -------------------------------------------------*/ diff --git a/bits.test b/bits.test new file mode 100644 index 0000000..5b1272e --- /dev/null +++ b/bits.test @@ -0,0 +1,403 @@ +# Test vectors for 64-bit operations [generated] + +lsl64 { + e4bef260d7bcda16 49 b42c000000000000; + d348b7551195e770 16 b7551195e7700000; + 7dd1dff7dac5c994 1 fba3bfefb58b9328; + d0c6eb14ad568f86 63 0000000000000000; + dc9268eeee533285 59 2800000000000000; + 810c9b689daaa906 8 0c9b689daaa90600; + 4b6003062365b0a5 19 18311b2d85280000; + c76c160f11896c47 42 25b11c0000000000; + 6ecfa14a7130c9f1 53 3e20000000000000; + 0634c9519848a877 50 a1dc000000000000; + bf79192a5b50ade5 41 a15bca0000000000; + 739a3d1f337f2954 36 37f2954000000000; + 0d27a4ba23408540 17 497446810a800000; + 36512061f7080cc0 54 3000000000000000; + 591d8fa21f2dd883 61 6000000000000000; + cde8e160ad10997a 34 b44265e800000000; + 5c6d62c9269029df 6 1b58b249a40a77c0; + 57acc87638f50804 39 7a84020000000000; + d9ff61cdbda3b3e9 10 fd8736f68ecfa400; + 31ebfedd4705e505 22 b751c17941400000; + 35dceaa7b1cc49ae 4 5dceaa7b1cc49ae0; + c38201a894476b3f 49 d67e000000000000; + 752eb9529533966f 28 29533966f0000000; + 3eb621b7f65b0009 33 ecb6001200000000; + 0ef2f9b2fc5fa450 11 97cd97e2fd228000; + 9b542cde52ebfda1 23 6f2975fed0800000; + cc520f215eb57bb3 20 f215eb57bb300000; + ebbbb18ac6c95a97 47 ad4b800000000000; + 30370c33d090c542 16 0c33d090c5420000; + d6b3ad54efc9a383 61 6000000000000000; + b93bf4f2aad2605f 58 7c00000000000000; + b03fb648e27fff63 53 ec60000000000000; + 58fe2b69ac26afa3 9 fc56d3584d5f4600; + 29b94586306fed54 8 b94586306fed5400; + 8f28523c03d4de16 10 a148f00f53785800; + 7846b710ee72807a 21 e21dce500f400000; + bfb474fd71d891f2 69 f68e9fae3b123e40; + 5d1563259f9eb53b 67 e8ab192cfcf5a9d8; + a629c54d57dd2d42 41 ba5a840000000000; + 00df9fcbaca48b77 22 f2eb2922ddc00000; + 89196d1ebba10b04 17 da3d774216080000; + 9fc2712a199e533f 14 9c4a866794cfc000; + 6308cdec3f768281 59 0800000000000000; + a9b9a222bd689aef 36 d689aef000000000; + 306ceb0c6b08ac8b 5 0d9d618d61159160; + 260c571b4a42bb8f 16 571b4a42bb8f0000; + 3bfa6a5cfb0bad7d 24 5cfb0bad7d000000; + 4ade49cb3b6f5fe8 58 a000000000000000; + 31115c037ba323fe 41 4647fc0000000000; + 151784873f0eb5b6 54 6d80000000000000; + 6794c18b5337685a 67 3ca60c5a99bb42d0; + 65b9aca338527ef1 51 f788000000000000; + c063c46f88de9fd4 62 0000000000000000; + d7b97e23e6eabdff 25 47cdd57bfe000000; + 211499268878dbf3 21 24d10f1b7e600000; + ad89d4b9b12012e4 16 d4b9b12012e40000; + f46795630e7952d2 62 8000000000000000; + 2d7100b8b649377d 37 c926efa000000000; + f083455b663e4ee1 21 ab6cc7c9dc200000; + 3c8f2aebfa921451 19 575fd490a2880000; + af5813b70d30ce2f 51 7178000000000000; + 6ef315d079839180 37 3072300000000000; + 8da3aefc5f8584b7 56 b700000000000000; + 17669c0f16e39815 46 e605400000000000; +} + +lsr64 { + cfce3ed1ecdf3d26 37 00000000067e71f6; + 16cb16c2e815f422 55 000000000000002d; + c8e30308be3c31e6 35 00000000191c6061; + c0b7cadcb658b970 4 0c0b7cadcb658b97; + 79a684b5aefa69a4 63 0000000000000000; + 147ed12ca986981a 7 0028fda259530d30; + 98ad0abef8bc4fcb 64 98ad0abef8bc4fcb; + 7e98ef1f0446b42f 62 0000000000000001; + d44b6d00f06dc188 60 000000000000000d; + a784e0c6f21195a3 47 0000000000014f09; + ae985511265febd1 30 00000002ba615444; + 4720eef9eb1c8dd0 12 0004720eef9eb1c8; + 51f284649016ed00 1 28f94232480b7680; + 31854bc78bf43966 26 0000000c6152f1e2; + fa9138ddc3990844 47 000000000001f522; + fe95e81c2533e31c 12 000fe95e81c2533e; + 9851bc2810d858cb 31 0000000130a37850; + 24d126b807e6daa0 26 000000093449ae01; + f9099c5ffb824173 40 0000000000f9099c; + 4c04226f30cbb7f0 10 001301089bcc32ed; + 73a8cd1901073147 50 0000000000001cea; + 7456f3ff669c732b 18 00001d15bcffd9a7; + 8f48af65f7cc9e3f 13 00047a457b2fbe64; + 1721b730374ffc9b 54 000000000000005c; + f56ccbb2f294b387 34 000000003d5b32ec; + 69f6a9f2c0945ffd 64 69f6a9f2c0945ffd; + 03cc0cae9ce021a5 60 0000000000000000; + 4ffa91544485f1a1 57 0000000000000027; + 2b9b8f0911e32d65 44 000000000002b9b8; + 70a18cbfe6effd1f 6 01c28632ff9bbff4; + 8554acf1270485b2 32 000000008554acf1; + c1c4c967c0a458cb 31 00000001838992cf; + dd409b687fa3a682 38 000000000375026d; + 0aa3a4c84cef64f6 62 0000000000000000; + 3bf8f957f4b03cf4 35 00000000077f1f2a; + 957f9a3e8128f874 18 0000255fe68fa04a; + 687b7bb8deb9bd20 50 0000000000001a1e; + e04c091d205cdad9 65 7026048e902e6d6c; + 9b1abf91b0851e5c 53 00000000000004d8; + ac84513995870116 21 000005642289ccac; + 8a15dde524af3e2b 25 000000450aeef292; + 46541a42c2ecccb4 52 0000000000000465; + bad397abfaf529ee 32 00000000bad397ab; + 9a05c7efedef3401 1 4d02e3f7f6f79a00; + 51d2a90bbf7f1bfc 11 000a3a552177efe3; + b0ef5746ea8fdccc 29 00000005877aba37; + e33f7e8a5718fd25 38 00000000038cfdfa; + 07c8e7d715a92add 3 00f91cfae2b5255b; + d1f5c054b2d98351 2 347d70152cb660d4; + ec590294a319b980 49 000000000000762c; + a9f891bc5ba5afab 12 000a9f891bc5ba5a; + 122d12d7ff3c4112 30 0000000048b44b5f; + d17d4569eaff59a3 34 00000000345f515a; + 58d5d5589bfe0797 43 00000000000b1aba; + 1a957eb6d6699e6b 29 00000000d4abf5b6; + 725cb2dac07ecde9 54 00000000000001c9; + ac46fee6dda7abc8 2 2b11bfb9b769eaf2; + daac90cfe22d2f1f 47 000000000001b559; + cc42fa8b669ed3bb 48 000000000000cc42; + a9cf44bbc8c6254d 61 0000000000000005; + 98bd94e66eb4563d 34 00000000262f6539; + 51881e99027b8ab9 20 0000051881e99027; + ccf860b000974076 48 000000000000ccf8; + 836c5f87b9546093 28 0000000836c5f87b; +} + +rol64 { + 288c69d80ea12ff4 3 44634ec075097fa1; + 069b8a2e86041c1b 48 1c1b069b8a2e8604; + 14e9ca2186ddf1f6 56 f614e9ca2186ddf1; + aa7e740da967828e 62 aa9f9d036a59e0a3; + b35b15ffaa6c3680 66 cd6c57fea9b0da02; + 45563a308ba60076 63 22ab1d1845d3003b; + 23bd2abf1261b089 20 abf1261b08923bd2; + 3a9c2835076a23fa 8 9c2835076a23fa3a; + dd67771cc667a833 48 a833dd67771cc667; + 170b66283e4f834a 34 f93e0d285c2d98a0; + 8f302c3973accd56 5 e605872e7599aad1; + 4e33958b8c2e2352 60 24e33958b8c2e235; + e4fa8fec816ac861 47 6430f27d47f640b5; + 3779f09e7a10fc02 64 3779f09e7a10fc02; + 8afa3080ee119a52 6 be8c203b846694a2; + 17e4f2b94b0820ca 29 2961041942fc9e57; + a8cffeea7c486315 30 9f1218c56a33ffba; + c875fba578c8ec48 53 89190ebf74af191d; + 8a92142b5b0677da 35 d833bed45490a15a; + 73117b45bcfff5d5 43 ffaeab988bda2de7; + fde2893232a9f81d 51 c0efef144991954f; + 7ffae475f6b94a43 1 fff5c8ebed729486; + 3d380d2f9aaafe2d 46 bf8b4f4e034be6aa; + c0095c8808847689 18 72202211da270025; + 50ba8095ffab1eaa 63 285d404affd58f55; + fd22ac1976063e11 23 0cbb031f08fe9156; + 1f813e28a1397a79 41 72f4f23f027c5142; + d7f4220c785fe426 16 220c785fe426d7f4; + e80f678d40414784 38 1051e13a03d9e350; + feeffdc2eb44dc8c 59 67f77fee175a26e4; + 8f444f7f4e0c8939 53 2731e889efe9c191; + 4dc23a7bb40e7e00 68 dc23a7bb40e7e004; + 150686d2301b43a1 14 a1b48c06d0e84541; + e81d7f5cedaa49e2 57 c5d03afeb9db5493; + bf47970e560475cf 25 1cac08eb9f7e8f2e; + 877de69146acc3ab 53 7570efbcd228d598; + 556b7aa776945948 39 4a2ca42ab5bd53bb; + 834df2196c92ec17 61 f069be432d925d82; + deee0d52d9539726 27 96ca9cb936f7706a; + 0391b3f9d10c39b0 43 61cd801c8d9fce88; + f08ce7cee4758a38 50 28e3c2339f3b91d6; + 43e97dedfbe61e73 48 1e7343e97dedfbe6; + cd09c2b9a80f34c0 55 606684e15cd4079a; + 1c2481b11fc76bfa 12 481b11fc76bfa1c2; + 710a9e544e0c536c 21 ca89c18a6d8e2153; + 40f9ad5b04140d98 34 1050366103e6b56c; + e08485290a4d87d1 49 0fa3c1090a52149b; + 398a1458c2c6b61d 35 1635b0e9cc50a2c6; + 1cccada8c1a0a9aa 28 8c1a0a9aa1cccada; + 4e3c3554f8fb1ef6 29 9f1f63dec9c786aa; + c270295dfc0ca655 1 84e052bbf8194cab; + bdb75359f91cb9d9 57 b37b6ea6b3f23973; + 6b7de74fc9a9b371 6 df79d3f26a6cdc5a; + 6c0b396179d31f06 61 cd81672c2f3a63e0; + 5982cbc0d7cb2384 52 3845982cbc0d7cb2; + ae8f4ae480cda98a 30 20336a62aba3d2b9; + 2bacf6f9fd3f8213 20 6f9fd3f82132bacf; + 3f3df6c2b3fac7cb 17 ed8567f58f967e7b; + 523d4723f9180132 17 8e47f2300264a47a; + 553236651c96788d 60 d553236651c96788; + 92ee53b3f3ebd66d 13 ca767e7d7acdb25d; + cedbe88e245de25b 0 cedbe88e245de25b; + b70f8601562d90a9 52 0a9b70f8601562d9; + d034a867642d25d5 44 d25d5d034a867642; +} + +ror64 { + fa5c47f16f64b837 12 837fa5c47f16f64b; + 26214211a1c696ba 52 14211a1c696ba262; + 10abb433922a22d9 13 16c8855da19c9151; + 1519165eb9d85197 36 eb9d851971519165; + c34ac0d5ae7be8db 14 a36f0d2b0356b9ef; + 4ffed2cf6b1372a5 7 4a9ffda59ed626e5; + b54fd9d70c70e117 12 117b54fd9d70c70e; + ae71b3a56f0e7d83 69 1d738d9d2b7873ec; + 9cc783443d64f2ed 9 76ce63c1a21eb279; + b96856beca34fd65 21 a7eb2dcb42b5f651; + f86b799e2a168116 13 08b7c35bccf150b4; + 055f0fd3001da597 9 cb82af87e9800ed2; + 6d465b7b1419ea51 58 5196dec5067a945b; + 8f938f6daafbd656 26 bef595a3e4e3db6a; + 09898eaa96ffc3d1 29 b7fe1e884c4c7554; + 1e4e34c94b8bfae6 69 30f271a64a5c5fd7; + ecd75a66d88eedb9 60 cd75a66d88eedb9e; + e07669845ebb7a24 51 cd308bd76f449c0e; + 13d099f47166edf5 59 7a133e8e2cddbea2; + e88fbf433a7ff212 21 ff9097447dfa19d3; + 79e79771f6eee728 7 50f3cf2ee3edddce; + 78ef2b800d7b969d 51 e57001af72d3af1d; + 80ffc1ba78c70dda 0 80ffc1ba78c70dda; + a2a25e771702fb19 30 5c0bec668a8979dc; + fc8a959cb8e75079 49 4ace5c73a83cfe45; + 8ccc8c54f31b450e 57 66462a798da28746; + e9002926ad0284c7 46 a49ab40a131fa400; + cb0f58a1e34c8b15 63 961eb143c699162b; + 0c1b627235a2cb84 42 9c8d68b2e10306d8; + 86c251f5b70be236 66 a1b0947d6dc2f88d; + 7265264e0da72efe 65 3932932706d3977f; + e6c932a17eab511e 5 f73649950bf55a88; + e4ba463c663035a6 1 725d231e33181ad3; + 7a899e4279d54d03 15 9a06f5133c84f3aa; + f3e961dcfd40088d 19 0111be7d2c3b9fa8; + 4088e4097efb0368 41 04bf7d81b4204472; + f431ee6988cf2a0e 21 795077a18f734c46; + b3de79c4f86c9e4f 56 de79c4f86c9e4fb3; + 339d6d907eab7707 51 adb20fd56ee0e673; + ff5ba1ae93d16225 56 5ba1ae93d16225ff; + de5747bc1addf574 29 d6efaba6f2ba3de0; + 720a320fe14fd29c 10 a71c828c83f853f4; + 314fe2079c0a2535 2 4c53f881e702894d; + 6112d6e3d33dcf7c 43 dc7a67b9ef8c225a; + 7d130323794e3da8 65 3e898191bca71ed4; + f69703a9caf02d2a 44 3a9caf02d2af6970; + ac71e554a6850d55 47 caa94d0a1aab58e3; + 8c7ae6994fc8528b 58 1eb9a653f214a2e3; + 374fc43581d2f72a 0 374fc43581d2f72a; + 4a2404a059f7f99c 69 e251202502cfbfcc; + a0c879d6d4455b38 57 643ceb6a22ad9c50; + e757b3e7a1d07585 50 ecf9e8741d6179d5; + 7ea9c7c9cf54f3bc 37 4e7aa79de3f54e3e; + 238ab56d738e02ab 62 8e2ad5b5ce380aac; + 477cd726d6f3ebcd 42 c9b5bcfaf351df35; + eab50906642a7de6 0 eab50906642a7de6; + 47060e7be3632ed9 48 0e7be3632ed94706; + bb42f45a8733b2cd 48 f45a8733b2cdbb42; + d1d905cfdb299830 49 82e7ed94cc1868ec; + bcdb686a0c897031 11 06379b6d0d41912e; + a5b8fa687ec3bad8 57 dc7d343f61dd6c52; + c2ad361f1e226e78 41 0f8f11373c61569b; + d35f86c639733c5c 46 1b18e5ccf1734d7e; + ed8aaebabb7e0f24 54 2abaeaedf83c93b6; +} + +add64 { + 9710b7bca91b612e 7fc5cc09f7f62f66 16d683c6a1119094; + 23fcd2dec5de24d2 f2c839839c1b0631 16c50c6261f92b03; + 687dbc68d9f07fd4 cb4f8cde8de201ec 33cd494767d281c0; + 80332bbded4883de 0b58b54bdd13c17e 8b8be109ca5c455c; + 92b0ded3caeb5e57 21df10bc6186265e b48fef902c7184b5; + ea45907de6cb822f ef953aea358a03e0 d9dacb681c55860f; + e2e1b9511bd332c8 67f123377a8f0256 4ad2dc889662351e; + dcc73ae1b3c6cd3f 4e3cb24284cfed17 2b03ed243896ba56; + 1d64d492d39ea749 93a25b072945d83f b1072f99fce47f88; + 3e66b0a6689cf096 003a8fca80e322a4 3ea14070e980133a; + bf050c1220450433 b6b6d8a2d820cf27 75bbe4b4f865d35a; + 4b9d47f636845dac 7bb3e75f3a18fb8e c7512f55709d593a; + 3416867fcd0ee78d 9236beec76d55ed5 c64d456c43e44662; + 10f91d07a037791a 6e83c4bf2fb5b205 7f7ce1c6cfed2b1f; + 92c172a5cbc19456 5c1bea6079f3867e eedd5d0645b51ad4; + d663cb3884b2a0a8 825df752423f3179 58c1c28ac6f1d221; + eb89eca385f20ddc f1f23564672e370f dd7c2207ed2044eb; + 37d400a31e8aac1d 6ce10df73c5ee478 a4b50e9a5ae99095; + b63d91024780e974 a2a0e7a36f84ab12 58de78a5b7059486; + b627e7d01b38a84a e738721ed80fd0d7 9d6059eef3487921; + 9fa658abb5a440d3 128719b541a9451c b22d7260f74d85ef; + d18e4c61d93d1f8f 5357442776739632 24e590894fb0b5c1; + 3bf7d02cec050936 cec07591ada46227 0ab845be99a96b5d; + 1d1519eedde0df37 30fe8c22ebd77705 4e13a611c9b8563c; + 7b7e32ae88f45a34 ba3037235e19a394 35ae69d1e70dfdc8; + 4d26ce47317d8087 4456b4cfc5555e92 917d8316f6d2df19; + 3e7b2ebc829b2d05 ea617b0ca9531bcd 28dca9c92bee48d2; + 6040d39040e632d5 643ccb6428630304 c47d9ef4694935d9; + caf679e914eaddc0 f8843ce6a427b99a c37ab6cfb912975a; + c266de31c0916523 eefe4b58cc034b9f b165298a8c94b0c2; + 9f04678c2a9da898 9324cd3087a65101 322934bcb243f999; + 6796f9c4881d89e1 e62221e47e57badd 4db91ba9067544be; + 8d490c2f320ff8fb 42761bd439f3e96d cfbf28036c03e268; + ed1d5b2169912af1 e2c533c52ba3e8c7 cfe28ee6953513b8; + 23a089e231480aa6 484fb34bd522397f 6bf03d2e066a4425; + 2cb8ecf4f64e3298 fe73be257a753b38 2b2cab1a70c36dd0; + 0bc23f94a079bde2 98d813655dafa15b a49a52f9fe295f3d; + 419d15c41a5153cc d0e8c8702db2ba11 1285de3448040ddd; + 7589678d4f7b8fcf 4818c411f15f4523 bda22b9f40dad4f2; + 903874f9a532ee46 6ae753a2340af7b9 fb1fc89bd93de5ff; + 9632fc5ae71ae18b de751ab6b6761ca1 74a817119d90fe2c; + 34a9935e466e11c1 072f32a59c313dba 3bd8c603e29f4f7b; + b646ae909a096697 a7b0556463ff1126 5df703f4fe0877bd; + c43263391424d027 d0787e804d8f1dcc 94aae1b961b3edf3; + c897a8a484313243 041b5302ccd501b5 ccb2fba7510633f8; + bd03d5cb5c90d1fd 7d2be187a787032c 3a2fb7530417d529; + ed900764ee4ce1d3 042c084f7d8c0c48 f1bc0fb46bd8ee1b; + 7d6f1eabd0fd1ec2 88f26734d5c8d92d 066185e0a6c5f7ef; + 873a8fe113090d40 ea4d28ff49f10ff5 7187b8e05cfa1d35; + adc258e091abd31b dd1735158f987659 8ad98df621444974; + acc6602da063aae0 2a199d3a4f37a5f0 d6dffd67ef9b50d0; + d216d2053a83b5d3 488ab0d2df631b28 1aa182d819e6d0fb; + cdfcf9fdd0f37de9 67179aeae82fe000 351494e8b9235de9; + 428b297b553230a6 17fa0c1a233c9ebc 5a853595786ecf62; + 4cba45b20543c540 1b9dbce078b87a15 685802927dfc3f55; + acf03897b95a3f37 9f6c5a5f2ae44a7d 4c5c92f6e43e89b4; + e9ba43a39089de20 70d0544b5151db0a 5a8a97eee1dbb92a; + e9769e8f2fc12c7f 9fab269a0056284a 8921c529301754c9; + 7ffd4113a1cf43b5 bdce2d86dead83f5 3dcb6e9a807cc7aa; + 56e9106bedf908db f1119f9700260ea9 47fab002ee1f1784; + 9cc7232184d21715 ee8ca42e75614739 8b53c74ffa335e4e; + 007f234fbcd86b0a f641a0449b6d9b0f f6c0c39458460619; + d1cb4a57a4d6f987 b0ade90aa1d81c4f 8279336246af15d6; + 7b3734be301da3e2 e692629db57311f4 61c9975be590b5d6; +} + +sub64 { + f3a1573f9e0553a2 96265e4326fa532d 5d7af8fc770b0075; + 36863e5b4bc6c99a 3d4eb23cacdf6e42 f9378c1e9ee75b58; + 8ca13187eba15329 ba31582b3793b05f d26fd95cb40da2ca; + 5e9f80c5814b91f4 c581c7b16c46b484 991db9141504dd70; + 9c6d19eebaf12468 a3be9943307fa4ef f8ae80ab8a717f79; + 5ef8e7e50b703dc0 0e74227c9351366e 5084c568781f0752; + e98e1e24b48aa989 b8d0f10471ae5428 30bd2d2042dc5561; + 012fbe4f5cb2dab2 3e574842cc0b3774 c2d8760c90a7a33e; + 0dcfa63b0db1716c 916a26fc2e198f8d 7c657f3edf97e1df; + 3ab5995598949778 16c5816270ef3fbe 23f017f327a557ba; + a22f484ddc12ec8f dbd6ebdfbafb21fc c6585c6e2117ca93; + 427dbee5f95b53a0 cb6d7c128b79f465 771042d36de15f3b; + 95f4b0ba518dd614 140f20d40224baac 81e58fe64f691b68; + 602da83cb254a7e0 052c63c1f3f00f30 5b01447abe6498b0; + c944a1789133bb80 f07dc123f2ca7e20 d8c6e0549e693d60; + 3988e4bfea6d561a aea542db544a1437 8ae3a1e4962341e3; + 5d52f7265c7a8d2f feef99b9dba89eb4 5e635d6c80d1ee7b; + f71d8eb5affe900d 6e4cf74e52b6c86d 88d097675d47c7a0; + 81143082735c6473 6a5da3d2e8cbb860 16b68caf8a90ac13; + bbaf08bf9315fba1 46714bfd2c8312fb 753dbcc26692e8a6; + 44dfe84615ddb93f 360161f2efb1fc39 0ede8653262bbd06; + b6ad97427dcaa043 ee7f3a5c11fd01b9 c82e5ce66bcd9e8a; + 20aa6004f84bcba8 a1c33beb40877191 7ee72419b7c45a17; + b355dce9ffd6fd63 192e4c2c9a2752bf 9a2790bd65afaaa4; + a3f63408d3b27df5 44ed5537bfb0162f 5f08ded1140267c6; + edbad1b2c36ceec1 407475b8e05fcb5e ad465bf9e30d2363; + 6c7205f21804c3b7 51dc9a3aed7667c6 1a956bb72a8e5bf1; + 2c8355ff66b91eef 115cf118eef301f2 1b2664e677c61cfd; + 3fda303878f79871 dba62d93a7da7027 643402a4d11d284a; + fe5a6506e4e1439d 6cc9d332ab03510d 919091d439ddf290; + c7d35dc526b5b778 00f53d34b5d55fca c6de209070e057ae; + fbeadd81456bbe6b db015be40bfbda65 20e9819d396fe406; + 83b32fc4d0a9dc2d 68b134919d79de52 1b01fb33332ffddb; + d7d2ce372a8a386a 18d09e19612f3d10 bf02301dc95afb5a; + 569863bbd3ad4290 05058b934eb213aa 5192d82884fb2ee6; + 7de4e26cd4ceff74 353b5e7621d67ee3 48a983f6b2f88091; + fb2584e1e12d071c 13ec9e9d8df16478 e738e644533ba2a4; + 74776ee19eb0a867 1ae63292af9ac5ff 59913c4eef15e268; + a00ad546e4424276 71d3eb06dd35f064 2e36ea40070c5212; + 6faabf49e029cd11 92f72ee0136f6237 dcb39069ccba6ada; + 7451ac5e45b31f52 5dfa0fffa3a02cbc 16579c5ea212f296; + 28b379377d47b693 40b6860a580392ea e7fcf32d254423a9; + 14124aeb050d5180 280f3ee47335af18 ec030c0691d7a268; + 6dcc543e48b8c731 116207607f2dc83b 5c6a4cddc98afef6; + 119be8284f3ab482 60886e4d3bf414f4 b11379db13469f8e; + d3933f1226ff1eec b27749f2665a9537 211bf51fc0a489b5; + 0aa8c06832398b5a ae3761254ce7df3f 5c715f42e551ac1b; + ec77f57d5fd5445c 4f92c1f9a7aba24b 9ce53383b829a211; + 161f7a1e51aaeb95 e5114c8d4ea8a927 310e2d910302426e; + 7fb15362b3874faa 8effe14cba2dccf0 f0b17215f95982ba; + 113a1f9ea45754f5 a4021910a37b39a1 6d38068e00dc1b54; + a1d04c460edcbb25 7f8968a082fd4cab 2246e3a58bdf6e7a; + 08222c8c03df281f 1a9cdb9c716eac55 ed8550ef92707bca; + 2b93376b49e45f76 3ba7e1412f9995d5 efeb562a1a4ac9a1; + c8123ef89b66074e 1fc86dc716a338f3 a849d13184c2ce5b; + 8137bbc1617fa73a eeb502e2eacd8d74 9282b8de76b219c6; + 1f41366f5ed56596 e29c26887b8c874a 3ca50fe6e348de4c; + 5eb2dfcb6c5d8548 cb7d9dd25d4785d4 933541f90f15ff74; + 14fcc3420b38dd59 285a12872a6e980a eca2b0bae0ca454f; + 947c88bb4377e961 73edd403e194b4e1 208eb4b761e33480; + 5e882077d57df101 3f0ef48633b6ba72 1f792bf1a1c7368f; + 1cf5907723679665 90fdd70388faada6 8bf7b9739a6ce8bf; + 97c732422deb93de d096546a685a24b1 c730ddd7c5916f2d; + 5fe682cd1dd314b8 126cf98764248650 4d798945b9ae8e68; +} -- [mdw]