--- /dev/null
+ Copyright (C) 2014-2025 Mark Adler
+
+ This software is provided 'as-is', without any express or implied warranty.
+ In no event will the authors be held liable for any damages arising from the
+ use of this software.
+
+ Permission is granted to anyone to use this software for any purpose,
+ including commercial applications, and to alter it and redistribute it
+ freely, subject to the following restrictions:
+
+ 1. The origin of this software must not be misrepresented; you must not claim
+ that you wrote the original software. If you use this software in a
+ product, an acknowledgment in the product documentation would be
+ appreciated but is not required.
+ 2. Altered source versions must be plainly marked as such, and must not be
+ misrepresented as being the original software.
+ 3. This notice may not be removed or altered from any source distribution.
+
+ Mark Adler
+ madler@alumni.caltech.edu
--- /dev/null
+#include "crc32iscsi.h"
+
+uint32_t crc32iscsi_bit(uint32_t crc, void const *mem, size_t len) {
+ uint8_t const *data = mem;
+ if (data == NULL)
+ return 0;
+ crc = ~crc;
+ for (size_t i = 0; i < len; i++) {
+ crc ^= data[i];
+ for (unsigned k = 0; k < 8; k++) {
+ crc = crc & 1 ? (crc >> 1) ^ 0x82f63b78 : crc >> 1;
+ }
+ }
+ crc = ~crc;
+ return crc;
+}
+
+uint32_t crc32iscsi_rem(uint32_t crc, unsigned val, unsigned bits) {
+ crc = ~crc;
+ val &= (1U << bits) - 1;
+ crc ^= val;
+ for (unsigned i = 0; i < bits; i++) {
+ crc = crc & 1 ? (crc >> 1) ^ 0x82f63b78 : crc >> 1;
+ }
+ crc = ~crc;
+ return crc;
+}
+
+#define table_byte table_word[0]
+
+static uint32_t const table_word[][256] = {
+ {0x527d5351, 0xa016d052, 0xb34623a6, 0x412da0a5, 0x95e7c44e, 0x678c474d,
+ 0x74dcb4b9, 0x86b737ba, 0xd8a40b9e, 0x2acf889d, 0x399f7b69, 0xcbf4f86a,
+ 0x1f3e9c81, 0xed551f82, 0xfe05ec76, 0x0c6e6f75, 0x4223943e, 0xb048173d,
+ 0xa318e4c9, 0x517367ca, 0x85b90321, 0x77d28022, 0x648273d6, 0x96e9f0d5,
+ 0xc8faccf1, 0x3a914ff2, 0x29c1bc06, 0xdbaa3f05, 0x0f605bee, 0xfd0bd8ed,
+ 0xee5b2b19, 0x1c30a81a, 0x72c0dd8f, 0x80ab5e8c, 0x93fbad78, 0x61902e7b,
+ 0xb55a4a90, 0x4731c993, 0x54613a67, 0xa60ab964, 0xf8198540, 0x0a720643,
+ 0x1922f5b7, 0xeb4976b4, 0x3f83125f, 0xcde8915c, 0xdeb862a8, 0x2cd3e1ab,
+ 0x629e1ae0, 0x90f599e3, 0x83a56a17, 0x71cee914, 0xa5048dff, 0x576f0efc,
+ 0x443ffd08, 0xb6547e0b, 0xe847422f, 0x1a2cc12c, 0x097c32d8, 0xfb17b1db,
+ 0x2fddd530, 0xddb65633, 0xcee6a5c7, 0x3c8d26c4, 0x13064eed, 0xe16dcdee,
+ 0xf23d3e1a, 0x0056bd19, 0xd49cd9f2, 0x26f75af1, 0x35a7a905, 0xc7cc2a06,
+ 0x99df1622, 0x6bb49521, 0x78e466d5, 0x8a8fe5d6, 0x5e45813d, 0xac2e023e,
+ 0xbf7ef1ca, 0x4d1572c9, 0x03588982, 0xf1330a81, 0xe263f975, 0x10087a76,
+ 0xc4c21e9d, 0x36a99d9e, 0x25f96e6a, 0xd792ed69, 0x8981d14d, 0x7bea524e,
+ 0x68baa1ba, 0x9ad122b9, 0x4e1b4652, 0xbc70c551, 0xaf2036a5, 0x5d4bb5a6,
+ 0x33bbc033, 0xc1d04330, 0xd280b0c4, 0x20eb33c7, 0xf421572c, 0x064ad42f,
+ 0x151a27db, 0xe771a4d8, 0xb96298fc, 0x4b091bff, 0x5859e80b, 0xaa326b08,
+ 0x7ef80fe3, 0x8c938ce0, 0x9fc37f14, 0x6da8fc17, 0x23e5075c, 0xd18e845f,
+ 0xc2de77ab, 0x30b5f4a8, 0xe47f9043, 0x16141340, 0x0544e0b4, 0xf72f63b7,
+ 0xa93c5f93, 0x5b57dc90, 0x48072f64, 0xba6cac67, 0x6ea6c88c, 0x9ccd4b8f,
+ 0x8f9db87b, 0x7df63b78, 0xd08b6829, 0x22e0eb2a, 0x31b018de, 0xc3db9bdd,
+ 0x1711ff36, 0xe57a7c35, 0xf62a8fc1, 0x04410cc2, 0x5a5230e6, 0xa839b3e5,
+ 0xbb694011, 0x4902c312, 0x9dc8a7f9, 0x6fa324fa, 0x7cf3d70e, 0x8e98540d,
+ 0xc0d5af46, 0x32be2c45, 0x21eedfb1, 0xd3855cb2, 0x074f3859, 0xf524bb5a,
+ 0xe67448ae, 0x141fcbad, 0x4a0cf789, 0xb867748a, 0xab37877e, 0x595c047d,
+ 0x8d966096, 0x7ffde395, 0x6cad1061, 0x9ec69362, 0xf036e6f7, 0x025d65f4,
+ 0x110d9600, 0xe3661503, 0x37ac71e8, 0xc5c7f2eb, 0xd697011f, 0x24fc821c,
+ 0x7aefbe38, 0x88843d3b, 0x9bd4cecf, 0x69bf4dcc, 0xbd752927, 0x4f1eaa24,
+ 0x5c4e59d0, 0xae25dad3, 0xe0682198, 0x1203a29b, 0x0153516f, 0xf338d26c,
+ 0x27f2b687, 0xd5993584, 0xc6c9c670, 0x34a24573, 0x6ab17957, 0x98dafa54,
+ 0x8b8a09a0, 0x79e18aa3, 0xad2bee48, 0x5f406d4b, 0x4c109ebf, 0xbe7b1dbc,
+ 0x91f07595, 0x639bf696, 0x70cb0562, 0x82a08661, 0x566ae28a, 0xa4016189,
+ 0xb751927d, 0x453a117e, 0x1b292d5a, 0xe942ae59, 0xfa125dad, 0x0879deae,
+ 0xdcb3ba45, 0x2ed83946, 0x3d88cab2, 0xcfe349b1, 0x81aeb2fa, 0x73c531f9,
+ 0x6095c20d, 0x92fe410e, 0x463425e5, 0xb45fa6e6, 0xa70f5512, 0x5564d611,
+ 0x0b77ea35, 0xf91c6936, 0xea4c9ac2, 0x182719c1, 0xcced7d2a, 0x3e86fe29,
+ 0x2dd60ddd, 0xdfbd8ede, 0xb14dfb4b, 0x43267848, 0x50768bbc, 0xa21d08bf,
+ 0x76d76c54, 0x84bcef57, 0x97ec1ca3, 0x65879fa0, 0x3b94a384, 0xc9ff2087,
+ 0xdaafd373, 0x28c45070, 0xfc0e349b, 0x0e65b798, 0x1d35446c, 0xef5ec76f,
+ 0xa1133c24, 0x5378bf27, 0x40284cd3, 0xb243cfd0, 0x6689ab3b, 0x94e22838,
+ 0x87b2dbcc, 0x75d958cf, 0x2bca64eb, 0xd9a1e7e8, 0xcaf1141c, 0x389a971f,
+ 0xec50f3f4, 0x1e3b70f7, 0x0d6b8303, 0xff000000},
+ {0xa31c2483, 0xb0bebcf4, 0x8459146d, 0x97fb8c1a, 0xed96455f, 0xfe34dd28,
+ 0xcad375b1, 0xd971edc6, 0x3e08e73b, 0x2daa7f4c, 0x194dd7d5, 0x0aef4fa2,
+ 0x708286e7, 0x63201e90, 0x57c7b609, 0x44652e7e, 0x9cd9d502, 0x8f7b4d75,
+ 0xbb9ce5ec, 0xa83e7d9b, 0xd253b4de, 0xc1f12ca9, 0xf5168430, 0xe6b41c47,
+ 0x01cd16ba, 0x126f8ecd, 0x26882654, 0x352abe23, 0x4f477766, 0x5ce5ef11,
+ 0x68024788, 0x7ba0dfff, 0xdc97c781, 0xcf355ff6, 0xfbd2f76f, 0xe8706f18,
+ 0x921da65d, 0x81bf3e2a, 0xb55896b3, 0xa6fa0ec4, 0x41830439, 0x52219c4e,
+ 0x66c634d7, 0x7564aca0, 0x0f0965e5, 0x1cabfd92, 0x284c550b, 0x3beecd7c,
+ 0xe3523600, 0xf0f0ae77, 0xc41706ee, 0xd7b59e99, 0xadd857dc, 0xbe7acfab,
+ 0x8a9d6732, 0x993fff45, 0x7e46f5b8, 0x6de46dcf, 0x5903c556, 0x4aa15d21,
+ 0x30cc9464, 0x236e0c13, 0x1789a48a, 0x042b3cfd, 0x5c0be287, 0x4fa97af0,
+ 0x7b4ed269, 0x68ec4a1e, 0x1281835b, 0x01231b2c, 0x35c4b3b5, 0x26662bc2,
+ 0xc11f213f, 0xd2bdb948, 0xe65a11d1, 0xf5f889a6, 0x8f9540e3, 0x9c37d894,
+ 0xa8d0700d, 0xbb72e87a, 0x63ce1306, 0x706c8b71, 0x448b23e8, 0x5729bb9f,
+ 0x2d4472da, 0x3ee6eaad, 0x0a014234, 0x19a3da43, 0xfedad0be, 0xed7848c9,
+ 0xd99fe050, 0xca3d7827, 0xb050b162, 0xa3f22915, 0x9715818c, 0x84b719fb,
+ 0x23800185, 0x302299f2, 0x04c5316b, 0x1767a91c, 0x6d0a6059, 0x7ea8f82e,
+ 0x4a4f50b7, 0x59edc8c0, 0xbe94c23d, 0xad365a4a, 0x99d1f2d3, 0x8a736aa4,
+ 0xf01ea3e1, 0xe3bc3b96, 0xd75b930f, 0xc4f90b78, 0x1c45f004, 0x0fe76873,
+ 0x3b00c0ea, 0x28a2589d, 0x52cf91d8, 0x416d09af, 0x758aa136, 0x66283941,
+ 0x815133bc, 0x92f3abcb, 0xa6140352, 0xb5b69b25, 0xcfdb5260, 0xdc79ca17,
+ 0xe89e628e, 0xfb3cfaf9, 0x58dfde7a, 0x4b7d460d, 0x7f9aee94, 0x6c3876e3,
+ 0x1655bfa6, 0x05f727d1, 0x31108f48, 0x22b2173f, 0xc5cb1dc2, 0xd66985b5,
+ 0xe28e2d2c, 0xf12cb55b, 0x8b417c1e, 0x98e3e469, 0xac044cf0, 0xbfa6d487,
+ 0x671a2ffb, 0x74b8b78c, 0x405f1f15, 0x53fd8762, 0x29904e27, 0x3a32d650,
+ 0x0ed57ec9, 0x1d77e6be, 0xfa0eec43, 0xe9ac7434, 0xdd4bdcad, 0xcee944da,
+ 0xb4848d9f, 0xa72615e8, 0x93c1bd71, 0x80632506, 0x27543d78, 0x34f6a50f,
+ 0x00110d96, 0x13b395e1, 0x69de5ca4, 0x7a7cc4d3, 0x4e9b6c4a, 0x5d39f43d,
+ 0xba40fec0, 0xa9e266b7, 0x9d05ce2e, 0x8ea75659, 0xf4ca9f1c, 0xe768076b,
+ 0xd38faff2, 0xc02d3785, 0x1891ccf9, 0x0b33548e, 0x3fd4fc17, 0x2c766460,
+ 0x561bad25, 0x45b93552, 0x715e9dcb, 0x62fc05bc, 0x85850f41, 0x96279736,
+ 0xa2c03faf, 0xb162a7d8, 0xcb0f6e9d, 0xd8adf6ea, 0xec4a5e73, 0xffe8c604,
+ 0xa7c8187e, 0xb46a8009, 0x808d2890, 0x932fb0e7, 0xe94279a2, 0xfae0e1d5,
+ 0xce07494c, 0xdda5d13b, 0x3adcdbc6, 0x297e43b1, 0x1d99eb28, 0x0e3b735f,
+ 0x7456ba1a, 0x67f4226d, 0x53138af4, 0x40b11283, 0x980de9ff, 0x8baf7188,
+ 0xbf48d911, 0xacea4166, 0xd6878823, 0xc5251054, 0xf1c2b8cd, 0xe26020ba,
+ 0x05192a47, 0x16bbb230, 0x225c1aa9, 0x31fe82de, 0x4b934b9b, 0x5831d3ec,
+ 0x6cd67b75, 0x7f74e302, 0xd843fb7c, 0xcbe1630b, 0xff06cb92, 0xeca453e5,
+ 0x96c99aa0, 0x856b02d7, 0xb18caa4e, 0xa22e3239, 0x455738c4, 0x56f5a0b3,
+ 0x6212082a, 0x71b0905d, 0x0bdd5918, 0x187fc16f, 0x2c9869f6, 0x3f3af181,
+ 0xe7860afd, 0xf424928a, 0xc0c33a13, 0xd361a264, 0xa90c6b21, 0xbaaef356,
+ 0x8e495bcf, 0x9debc3b8, 0x7a92c945, 0x69305132, 0x5dd7f9ab, 0x4e7561dc,
+ 0x3418a899, 0x27ba30ee, 0x135d9877, 0x00ff0000},
+ {0x9105d4a8, 0x344446d6, 0xde6a86a5, 0x7b2b14db, 0x0fdb70b2, 0xaa9ae2cc,
+ 0x40b422bf, 0xe5f5b0c1, 0xa954ea6d, 0x0c157813, 0xe63bb860, 0x437a2a1e,
+ 0x378a4e77, 0x92cbdc09, 0x78e51c7a, 0xdda48e04, 0xe1a7a922, 0x44e63b5c,
+ 0xaec8fb2f, 0x0b896951, 0x7f790d38, 0xda389f46, 0x30165f35, 0x9557cd4b,
+ 0xd9f697e7, 0x7cb70599, 0x9699c5ea, 0x33d85794, 0x472833fd, 0xe269a183,
+ 0x084761f0, 0xad06f38e, 0x70412fbc, 0xd500bdc2, 0x3f2e7db1, 0x9a6fefcf,
+ 0xee9f8ba6, 0x4bde19d8, 0xa1f0d9ab, 0x04b14bd5, 0x48101179, 0xed518307,
+ 0x077f4374, 0xa23ed10a, 0xd6ceb563, 0x738f271d, 0x99a1e76e, 0x3ce07510,
+ 0x00e35236, 0xa5a2c048, 0x4f8c003b, 0xeacd9245, 0x9e3df62c, 0x3b7c6452,
+ 0xd152a421, 0x7413365f, 0x38b26cf3, 0x9df3fe8d, 0x77dd3efe, 0xd29cac80,
+ 0xa66cc8e9, 0x032d5a97, 0xe9039ae4, 0x4c42089a, 0x56605471, 0xf321c60f,
+ 0x190f067c, 0xbc4e9402, 0xc8bef06b, 0x6dff6215, 0x87d1a266, 0x22903018,
+ 0x6e316ab4, 0xcb70f8ca, 0x215e38b9, 0x841faac7, 0xf0efceae, 0x55ae5cd0,
+ 0xbf809ca3, 0x1ac10edd, 0x26c229fb, 0x8383bb85, 0x69ad7bf6, 0xccece988,
+ 0xb81c8de1, 0x1d5d1f9f, 0xf773dfec, 0x52324d92, 0x1e93173e, 0xbbd28540,
+ 0x51fc4533, 0xf4bdd74d, 0x804db324, 0x250c215a, 0xcf22e129, 0x6a637357,
+ 0xb724af65, 0x12653d1b, 0xf84bfd68, 0x5d0a6f16, 0x29fa0b7f, 0x8cbb9901,
+ 0x66955972, 0xc3d4cb0c, 0x8f7591a0, 0x2a3403de, 0xc01ac3ad, 0x655b51d3,
+ 0x11ab35ba, 0xb4eaa7c4, 0x5ec467b7, 0xfb85f5c9, 0xc786d2ef, 0x62c74091,
+ 0x88e980e2, 0x2da8129c, 0x595876f5, 0xfc19e48b, 0x163724f8, 0xb376b686,
+ 0xffd7ec2a, 0x5a967e54, 0xb0b8be27, 0x15f92c59, 0x61094830, 0xc448da4e,
+ 0x2e661a3d, 0x8b278843, 0x1a22a3eb, 0xbf633195, 0x554df1e6, 0xf00c6398,
+ 0x84fc07f1, 0x21bd958f, 0xcb9355fc, 0x6ed2c782, 0x22739d2e, 0x87320f50,
+ 0x6d1ccf23, 0xc85d5d5d, 0xbcad3934, 0x19ecab4a, 0xf3c26b39, 0x5683f947,
+ 0x6a80de61, 0xcfc14c1f, 0x25ef8c6c, 0x80ae1e12, 0xf45e7a7b, 0x511fe805,
+ 0xbb312876, 0x1e70ba08, 0x52d1e0a4, 0xf79072da, 0x1dbeb2a9, 0xb8ff20d7,
+ 0xcc0f44be, 0x694ed6c0, 0x836016b3, 0x262184cd, 0xfb6658ff, 0x5e27ca81,
+ 0xb4090af2, 0x1148988c, 0x65b8fce5, 0xc0f96e9b, 0x2ad7aee8, 0x8f963c96,
+ 0xc337663a, 0x6676f444, 0x8c583437, 0x2919a649, 0x5de9c220, 0xf8a8505e,
+ 0x1286902d, 0xb7c70253, 0x8bc42575, 0x2e85b70b, 0xc4ab7778, 0x61eae506,
+ 0x151a816f, 0xb05b1311, 0x5a75d362, 0xff34411c, 0xb3951bb0, 0x16d489ce,
+ 0xfcfa49bd, 0x59bbdbc3, 0x2d4bbfaa, 0x880a2dd4, 0x6224eda7, 0xc7657fd9,
+ 0xdd472332, 0x7806b14c, 0x9228713f, 0x3769e341, 0x43998728, 0xe6d81556,
+ 0x0cf6d525, 0xa9b7475b, 0xe5161df7, 0x40578f89, 0xaa794ffa, 0x0f38dd84,
+ 0x7bc8b9ed, 0xde892b93, 0x34a7ebe0, 0x91e6799e, 0xade55eb8, 0x08a4ccc6,
+ 0xe28a0cb5, 0x47cb9ecb, 0x333bfaa2, 0x967a68dc, 0x7c54a8af, 0xd9153ad1,
+ 0x95b4607d, 0x30f5f203, 0xdadb3270, 0x7f9aa00e, 0x0b6ac467, 0xae2b5619,
+ 0x4405966a, 0xe1440414, 0x3c03d826, 0x99424a58, 0x736c8a2b, 0xd62d1855,
+ 0xa2dd7c3c, 0x079cee42, 0xedb22e31, 0x48f3bc4f, 0x0452e6e3, 0xa113749d,
+ 0x4b3db4ee, 0xee7c2690, 0x9a8c42f9, 0x3fcdd087, 0xd5e310f4, 0x70a2828a,
+ 0x4ca1a5ac, 0xe9e037d2, 0x03cef7a1, 0xa68f65df, 0xd27f01b6, 0x773e93c8,
+ 0x9d1053bb, 0x3851c1c5, 0x74f09b69, 0xd1b10917, 0x3b9fc964, 0x9ede5b1a,
+ 0xea2e3f73, 0x4f6fad0d, 0xa5416d7e, 0x0000ff00},
+ {0x2803e8bd, 0xf5464205, 0x9764cb3c, 0x4a216184, 0x5321d94e, 0x8e6473f6,
+ 0xec46facf, 0x31035077, 0xde478b5b, 0x030221e3, 0x6120a8da, 0xbc650262,
+ 0xa565baa8, 0x78201010, 0x1a029929, 0xc7473391, 0xc1675980, 0x1c22f338,
+ 0x7e007a01, 0xa345d0b9, 0xba456873, 0x6700c2cb, 0x05224bf2, 0xd867e14a,
+ 0x37233a66, 0xea6690de, 0x884419e7, 0x5501b35f, 0x4c010b95, 0x9144a12d,
+ 0xf3662814, 0x2e2382ac, 0xff26fc36, 0x2263568e, 0x4041dfb7, 0x9d04750f,
+ 0x8404cdc5, 0x5941677d, 0x3b63ee44, 0xe62644fc, 0x09629fd0, 0xd4273568,
+ 0xb605bc51, 0x6b4016e9, 0x7240ae23, 0xaf05049b, 0xcd278da2, 0x1062271a,
+ 0x16424d0b, 0xcb07e7b3, 0xa9256e8a, 0x7460c432, 0x6d607cf8, 0xb025d640,
+ 0xd2075f79, 0x0f42f5c1, 0xe0062eed, 0x3d438455, 0x5f610d6c, 0x8224a7d4,
+ 0x9b241f1e, 0x4661b5a6, 0x24433c9f, 0xf9069627, 0x83a5b75a, 0x5ee01de2,
+ 0x3cc294db, 0xe1873e63, 0xf88786a9, 0x25c22c11, 0x47e0a528, 0x9aa50f90,
+ 0x75e1d4bc, 0xa8a47e04, 0xca86f73d, 0x17c35d85, 0x0ec3e54f, 0xd3864ff7,
+ 0xb1a4c6ce, 0x6ce16c76, 0x6ac10667, 0xb784acdf, 0xd5a625e6, 0x08e38f5e,
+ 0x11e33794, 0xcca69d2c, 0xae841415, 0x73c1bead, 0x9c856581, 0x41c0cf39,
+ 0x23e24600, 0xfea7ecb8, 0xe7a75472, 0x3ae2feca, 0x58c077f3, 0x8585dd4b,
+ 0x5480a3d1, 0x89c50969, 0xebe78050, 0x36a22ae8, 0x2fa29222, 0xf2e7389a,
+ 0x90c5b1a3, 0x4d801b1b, 0xa2c4c037, 0x7f816a8f, 0x1da3e3b6, 0xc0e6490e,
+ 0xd9e6f1c4, 0x04a35b7c, 0x6681d245, 0xbbc478fd, 0xbde412ec, 0x60a1b854,
+ 0x0283316d, 0xdfc69bd5, 0xc6c6231f, 0x1b8389a7, 0x79a1009e, 0xa4e4aa26,
+ 0x4ba0710a, 0x96e5dbb2, 0xf4c7528b, 0x2982f833, 0x308240f9, 0xedc7ea41,
+ 0x8fe56378, 0x52a0c9c0, 0x7aa32182, 0xa7e68b3a, 0xc5c40203, 0x1881a8bb,
+ 0x01811071, 0xdcc4bac9, 0xbee633f0, 0x63a39948, 0x8ce74264, 0x51a2e8dc,
+ 0x338061e5, 0xeec5cb5d, 0xf7c57397, 0x2a80d92f, 0x48a25016, 0x95e7faae,
+ 0x93c790bf, 0x4e823a07, 0x2ca0b33e, 0xf1e51986, 0xe8e5a14c, 0x35a00bf4,
+ 0x578282cd, 0x8ac72875, 0x6583f359, 0xb8c659e1, 0xdae4d0d8, 0x07a17a60,
+ 0x1ea1c2aa, 0xc3e46812, 0xa1c6e12b, 0x7c834b93, 0xad863509, 0x70c39fb1,
+ 0x12e11688, 0xcfa4bc30, 0xd6a404fa, 0x0be1ae42, 0x69c3277b, 0xb4868dc3,
+ 0x5bc256ef, 0x8687fc57, 0xe4a5756e, 0x39e0dfd6, 0x20e0671c, 0xfda5cda4,
+ 0x9f87449d, 0x42c2ee25, 0x44e28434, 0x99a72e8c, 0xfb85a7b5, 0x26c00d0d,
+ 0x3fc0b5c7, 0xe2851f7f, 0x80a79646, 0x5de23cfe, 0xb2a6e7d2, 0x6fe34d6a,
+ 0x0dc1c453, 0xd0846eeb, 0xc984d621, 0x14c17c99, 0x76e3f5a0, 0xaba65f18,
+ 0xd1057e65, 0x0c40d4dd, 0x6e625de4, 0xb327f75c, 0xaa274f96, 0x7762e52e,
+ 0x15406c17, 0xc805c6af, 0x27411d83, 0xfa04b73b, 0x98263e02, 0x456394ba,
+ 0x5c632c70, 0x812686c8, 0xe3040ff1, 0x3e41a549, 0x3861cf58, 0xe52465e0,
+ 0x8706ecd9, 0x5a434661, 0x4343feab, 0x9e065413, 0xfc24dd2a, 0x21617792,
+ 0xce25acbe, 0x13600606, 0x71428f3f, 0xac072587, 0xb5079d4d, 0x684237f5,
+ 0x0a60becc, 0xd7251474, 0x06206aee, 0xdb65c056, 0xb947496f, 0x6402e3d7,
+ 0x7d025b1d, 0xa047f1a5, 0xc265789c, 0x1f20d224, 0xf0640908, 0x2d21a3b0,
+ 0x4f032a89, 0x92468031, 0x8b4638fb, 0x56039243, 0x34211b7a, 0xe964b1c2,
+ 0xef44dbd3, 0x3201716b, 0x5023f852, 0x8d6652ea, 0x9466ea20, 0x49234098,
+ 0x2b01c9a1, 0xf6446319, 0x1900b835, 0xc445128d, 0xa6679bb4, 0x7b22310c,
+ 0x622289c6, 0xbf67237e, 0xdd45aa47, 0x000000ff},
+ {0x0d153df2, 0x3504525e, 0x7d37e2aa, 0x45268d06, 0xed508342, 0xd541ecee,
+ 0x9d725c1a, 0xa56333b6, 0xc8723663, 0xf06359cf, 0xb850e93b, 0x80418697,
+ 0x283788d3, 0x1026e77f, 0x5815578b, 0x60043827, 0x82375c21, 0xba26338d,
+ 0xf2158379, 0xca04ecd5, 0x6272e291, 0x5a638d3d, 0x12503dc9, 0x2a415265,
+ 0x475057b0, 0x7f41381c, 0x377288e8, 0x0f63e744, 0xa715e900, 0x9f0486ac,
+ 0xd7373658, 0xef2659f4, 0x16bd88a5, 0x2eace709, 0x669f57fd, 0x5e8e3851,
+ 0xf6f83615, 0xcee959b9, 0x86dae94d, 0xbecb86e1, 0xd3da8334, 0xebcbec98,
+ 0xa3f85c6c, 0x9be933c0, 0x339f3d84, 0x0b8e5228, 0x43bde2dc, 0x7bac8d70,
+ 0x999fe976, 0xa18e86da, 0xe9bd362e, 0xd1ac5982, 0x79da57c6, 0x41cb386a,
+ 0x09f8889e, 0x31e9e732, 0x5cf8e2e7, 0x64e98d4b, 0x2cda3dbf, 0x14cb5213,
+ 0xbcbd5c57, 0x84ac33fb, 0xcc9f830f, 0xf48eeca3, 0x3a44575c, 0x025538f0,
+ 0x4a668804, 0x7277e7a8, 0xda01e9ec, 0xe2108640, 0xaa2336b4, 0x92325918,
+ 0xff235ccd, 0xc7323361, 0x8f018395, 0xb710ec39, 0x1f66e27d, 0x27778dd1,
+ 0x6f443d25, 0x57555289, 0xb566368f, 0x8d775923, 0xc544e9d7, 0xfd55867b,
+ 0x5523883f, 0x6d32e793, 0x25015767, 0x1d1038cb, 0x70013d1e, 0x481052b2,
+ 0x0023e246, 0x38328dea, 0x904483ae, 0xa855ec02, 0xe0665cf6, 0xd877335a,
+ 0x21ece20b, 0x19fd8da7, 0x51ce3d53, 0x69df52ff, 0xc1a95cbb, 0xf9b83317,
+ 0xb18b83e3, 0x899aec4f, 0xe48be99a, 0xdc9a8636, 0x94a936c2, 0xacb8596e,
+ 0x04ce572a, 0x3cdf3886, 0x74ec8872, 0x4cfde7de, 0xaece83d8, 0x96dfec74,
+ 0xdeec5c80, 0xe6fd332c, 0x4e8b3d68, 0x769a52c4, 0x3ea9e230, 0x06b88d9c,
+ 0x6ba98849, 0x53b8e7e5, 0x1b8b5711, 0x239a38bd, 0x8bec36f9, 0xb3fd5955,
+ 0xfbcee9a1, 0xc3df860d, 0x63b7e8ae, 0x5ba68702, 0x139537f6, 0x2b84585a,
+ 0x83f2561e, 0xbbe339b2, 0xf3d08946, 0xcbc1e6ea, 0xa6d0e33f, 0x9ec18c93,
+ 0xd6f23c67, 0xeee353cb, 0x46955d8f, 0x7e843223, 0x36b782d7, 0x0ea6ed7b,
+ 0xec95897d, 0xd484e6d1, 0x9cb75625, 0xa4a63989, 0x0cd037cd, 0x34c15861,
+ 0x7cf2e895, 0x44e38739, 0x29f282ec, 0x11e3ed40, 0x59d05db4, 0x61c13218,
+ 0xc9b73c5c, 0xf1a653f0, 0xb995e304, 0x81848ca8, 0x781f5df9, 0x400e3255,
+ 0x083d82a1, 0x302ced0d, 0x985ae349, 0xa04b8ce5, 0xe8783c11, 0xd06953bd,
+ 0xbd785668, 0x856939c4, 0xcd5a8930, 0xf54be69c, 0x5d3de8d8, 0x652c8774,
+ 0x2d1f3780, 0x150e582c, 0xf73d3c2a, 0xcf2c5386, 0x871fe372, 0xbf0e8cde,
+ 0x1778829a, 0x2f69ed36, 0x675a5dc2, 0x5f4b326e, 0x325a37bb, 0x0a4b5817,
+ 0x4278e8e3, 0x7a69874f, 0xd21f890b, 0xea0ee6a7, 0xa23d5653, 0x9a2c39ff,
+ 0x54e68200, 0x6cf7edac, 0x24c45d58, 0x1cd532f4, 0xb4a33cb0, 0x8cb2531c,
+ 0xc481e3e8, 0xfc908c44, 0x91818991, 0xa990e63d, 0xe1a356c9, 0xd9b23965,
+ 0x71c43721, 0x49d5588d, 0x01e6e879, 0x39f787d5, 0xdbc4e3d3, 0xe3d58c7f,
+ 0xabe63c8b, 0x93f75327, 0x3b815d63, 0x039032cf, 0x4ba3823b, 0x73b2ed97,
+ 0x1ea3e842, 0x26b287ee, 0x6e81371a, 0x569058b6, 0xfee656f2, 0xc6f7395e,
+ 0x8ec489aa, 0xb6d5e606, 0x4f4e3757, 0x775f58fb, 0x3f6ce80f, 0x077d87a3,
+ 0xaf0b89e7, 0x971ae64b, 0xdf2956bf, 0xe7383913, 0x8a293cc6, 0xb238536a,
+ 0xfa0be39e, 0xc21a8c32, 0x6a6c8276, 0x527dedda, 0x1a4e5d2e, 0x225f3282,
+ 0xc06c5684, 0xf87d3928, 0xb04e89dc, 0x885fe670, 0x2029e834, 0x18388798,
+ 0x500b376c, 0x681a58c0, 0x050b5d15, 0x3d1a32b9, 0x7529824d, 0x4d38ede1,
+ 0xe54ee3a5, 0xdd5f8c09, 0x956c3cfd, 0xad7d5351},
+ {0x12580abf, 0xfd6861a6, 0xc9d4aa7c, 0x26e4c165, 0xa0ad3dc8, 0x4f9d56d1,
+ 0x7b219d0b, 0x9411f612, 0x725e12a0, 0x9d6e79b9, 0xa9d2b263, 0x46e2d97a,
+ 0xc0ab25d7, 0x2f9b4ece, 0x1b278514, 0xf417ee0d, 0xd2543a81, 0x3d645198,
+ 0x09d89a42, 0xe6e8f15b, 0x60a10df6, 0x8f9166ef, 0xbb2dad35, 0x541dc62c,
+ 0xb252229e, 0x5d624987, 0x69de825d, 0x86eee944, 0x00a715e9, 0xef977ef0,
+ 0xdb2bb52a, 0x341bde33, 0x97ac1c32, 0x789c772b, 0x4c20bcf1, 0xa310d7e8,
+ 0x25592b45, 0xca69405c, 0xfed58b86, 0x11e5e09f, 0xf7aa042d, 0x189a6f34,
+ 0x2c26a4ee, 0xc316cff7, 0x455f335a, 0xaa6f5843, 0x9ed39399, 0x71e3f880,
+ 0x57a02c0c, 0xb8904715, 0x8c2c8ccf, 0x631ce7d6, 0xe5551b7b, 0x0a657062,
+ 0x3ed9bbb8, 0xd1e9d0a1, 0x37a63413, 0xd8965f0a, 0xec2a94d0, 0x031affc9,
+ 0x85530364, 0x6a63687d, 0x5edfa3a7, 0xb1efc8be, 0x1c5c5154, 0xf36c3a4d,
+ 0xc7d0f197, 0x28e09a8e, 0xaea96623, 0x41990d3a, 0x7525c6e0, 0x9a15adf9,
+ 0x7c5a494b, 0x936a2252, 0xa7d6e988, 0x48e68291, 0xceaf7e3c, 0x219f1525,
+ 0x1523deff, 0xfa13b5e6, 0xdc50616a, 0x33600a73, 0x07dcc1a9, 0xe8ecaab0,
+ 0x6ea5561d, 0x81953d04, 0xb529f6de, 0x5a199dc7, 0xbc567975, 0x5366126c,
+ 0x67dad9b6, 0x88eab2af, 0x0ea34e02, 0xe193251b, 0xd52feec1, 0x3a1f85d8,
+ 0x99a847d9, 0x76982cc0, 0x4224e71a, 0xad148c03, 0x2b5d70ae, 0xc46d1bb7,
+ 0xf0d1d06d, 0x1fe1bb74, 0xf9ae5fc6, 0x169e34df, 0x2222ff05, 0xcd12941c,
+ 0x4b5b68b1, 0xa46b03a8, 0x90d7c872, 0x7fe7a36b, 0x59a477e7, 0xb6941cfe,
+ 0x8228d724, 0x6d18bc3d, 0xeb514090, 0x04612b89, 0x30dde053, 0xdfed8b4a,
+ 0x39a26ff8, 0xd69204e1, 0xe22ecf3b, 0x0d1ea422, 0x8b57588f, 0x64673396,
+ 0x50dbf84c, 0xbfeb9355, 0x0e50bd69, 0xe160d670, 0xd5dc1daa, 0x3aec76b3,
+ 0xbca58a1e, 0x5395e107, 0x67292add, 0x881941c4, 0x6e56a576, 0x8166ce6f,
+ 0xb5da05b5, 0x5aea6eac, 0xdca39201, 0x3393f918, 0x072f32c2, 0xe81f59db,
+ 0xce5c8d57, 0x216ce64e, 0x15d02d94, 0xfae0468d, 0x7ca9ba20, 0x9399d139,
+ 0xa7251ae3, 0x481571fa, 0xae5a9548, 0x416afe51, 0x75d6358b, 0x9ae65e92,
+ 0x1cafa23f, 0xf39fc926, 0xc72302fc, 0x281369e5, 0x8ba4abe4, 0x6494c0fd,
+ 0x50280b27, 0xbf18603e, 0x39519c93, 0xd661f78a, 0xe2dd3c50, 0x0ded5749,
+ 0xeba2b3fb, 0x0492d8e2, 0x302e1338, 0xdf1e7821, 0x5957848c, 0xb667ef95,
+ 0x82db244f, 0x6deb4f56, 0x4ba89bda, 0xa498f0c3, 0x90243b19, 0x7f145000,
+ 0xf95dacad, 0x166dc7b4, 0x22d10c6e, 0xcde16777, 0x2bae83c5, 0xc49ee8dc,
+ 0xf0222306, 0x1f12481f, 0x995bb4b2, 0x766bdfab, 0x42d71471, 0xade77f68,
+ 0x0054e682, 0xef648d9b, 0xdbd84641, 0x34e82d58, 0xb2a1d1f5, 0x5d91baec,
+ 0x692d7136, 0x861d1a2f, 0x6052fe9d, 0x8f629584, 0xbbde5e5e, 0x54ee3547,
+ 0xd2a7c9ea, 0x3d97a2f3, 0x092b6929, 0xe61b0230, 0xc058d6bc, 0x2f68bda5,
+ 0x1bd4767f, 0xf4e41d66, 0x72ade1cb, 0x9d9d8ad2, 0xa9214108, 0x46112a11,
+ 0xa05ecea3, 0x4f6ea5ba, 0x7bd26e60, 0x94e20579, 0x12abf9d4, 0xfd9b92cd,
+ 0xc9275917, 0x2617320e, 0x85a0f00f, 0x6a909b16, 0x5e2c50cc, 0xb11c3bd5,
+ 0x3755c778, 0xd865ac61, 0xecd967bb, 0x03e90ca2, 0xe5a6e810, 0x0a968309,
+ 0x3e2a48d3, 0xd11a23ca, 0x5753df67, 0xb863b47e, 0x8cdf7fa4, 0x63ef14bd,
+ 0x45acc031, 0xaa9cab28, 0x9e2060f2, 0x71100beb, 0xf759f746, 0x18699c5f,
+ 0x2cd55785, 0xc3e53c9c, 0x25aad82e, 0xca9ab337, 0xfe2678ed, 0x111613f4,
+ 0x975fef59, 0x786f8440, 0x4cd34f9a, 0xa3e32483},
+ {0xec1416e7, 0x84173a2f, 0x3c124f77, 0x541163bf, 0x49f4d336, 0x21f7fffe,
+ 0x99f28aa6, 0xf1f1a66e, 0xa239ebb4, 0xca3ac77c, 0x723fb224, 0x1a3c9eec,
+ 0x07d92e65, 0x6fda02ad, 0xd7df77f5, 0xbfdc5b3d, 0x704fec41, 0x184cc089,
+ 0xa049b5d1, 0xc84a9919, 0xd5af2990, 0xbdac0558, 0x05a97000, 0x6daa5cc8,
+ 0x3e621112, 0x56613dda, 0xee644882, 0x8667644a, 0x9b82d4c3, 0xf381f80b,
+ 0x4b848d53, 0x2387a19b, 0xd14f955a, 0xb94cb992, 0x0149ccca, 0x694ae002,
+ 0x74af508b, 0x1cac7c43, 0xa4a9091b, 0xccaa25d3, 0x9f626809, 0xf76144c1,
+ 0x4f643199, 0x27671d51, 0x3a82add8, 0x52818110, 0xea84f448, 0x8287d880,
+ 0x4d146ffc, 0x25174334, 0x9d12366c, 0xf5111aa4, 0xe8f4aa2d, 0x80f786e5,
+ 0x38f2f3bd, 0x50f1df75, 0x033992af, 0x6b3abe67, 0xd33fcb3f, 0xbb3ce7f7,
+ 0xa6d9577e, 0xceda7bb6, 0x76df0eee, 0x1edc2226, 0x96a3119d, 0xfea03d55,
+ 0x46a5480d, 0x2ea664c5, 0x3343d44c, 0x5b40f884, 0xe3458ddc, 0x8b46a114,
+ 0xd88eecce, 0xb08dc006, 0x0888b55e, 0x608b9996, 0x7d6e291f, 0x156d05d7,
+ 0xad68708f, 0xc56b5c47, 0x0af8eb3b, 0x62fbc7f3, 0xdafeb2ab, 0xb2fd9e63,
+ 0xaf182eea, 0xc71b0222, 0x7f1e777a, 0x171d5bb2, 0x44d51668, 0x2cd63aa0,
+ 0x94d34ff8, 0xfcd06330, 0xe135d3b9, 0x8936ff71, 0x31338a29, 0x5930a6e1,
+ 0xabf89220, 0xc3fbbee8, 0x7bfecbb0, 0x13fde778, 0x0e1857f1, 0x661b7b39,
+ 0xde1e0e61, 0xb61d22a9, 0xe5d56f73, 0x8dd643bb, 0x35d336e3, 0x5dd01a2b,
+ 0x4035aaa2, 0x2836866a, 0x9033f332, 0xf830dffa, 0x37a36886, 0x5fa0444e,
+ 0xe7a53116, 0x8fa61dde, 0x9243ad57, 0xfa40819f, 0x4245f4c7, 0x2a46d80f,
+ 0x798e95d5, 0x118db91d, 0xa988cc45, 0xc18be08d, 0xdc6e5004, 0xb46d7ccc,
+ 0x0c680994, 0x646b255c, 0x197a1813, 0x717934db, 0xc97c4183, 0xa17f6d4b,
+ 0xbc9addc2, 0xd499f10a, 0x6c9c8452, 0x049fa89a, 0x5757e540, 0x3f54c988,
+ 0x8751bcd0, 0xef529018, 0xf2b72091, 0x9ab40c59, 0x22b17901, 0x4ab255c9,
+ 0x8521e2b5, 0xed22ce7d, 0x5527bb25, 0x3d2497ed, 0x20c12764, 0x48c20bac,
+ 0xf0c77ef4, 0x98c4523c, 0xcb0c1fe6, 0xa30f332e, 0x1b0a4676, 0x73096abe,
+ 0x6eecda37, 0x06eff6ff, 0xbeea83a7, 0xd6e9af6f, 0x24219bae, 0x4c22b766,
+ 0xf427c23e, 0x9c24eef6, 0x81c15e7f, 0xe9c272b7, 0x51c707ef, 0x39c42b27,
+ 0x6a0c66fd, 0x020f4a35, 0xba0a3f6d, 0xd20913a5, 0xcfeca32c, 0xa7ef8fe4,
+ 0x1feafabc, 0x77e9d674, 0xb87a6108, 0xd0794dc0, 0x687c3898, 0x007f1450,
+ 0x1d9aa4d9, 0x75998811, 0xcd9cfd49, 0xa59fd181, 0xf6579c5b, 0x9e54b093,
+ 0x2651c5cb, 0x4e52e903, 0x53b7598a, 0x3bb47542, 0x83b1001a, 0xebb22cd2,
+ 0x63cd1f69, 0x0bce33a1, 0xb3cb46f9, 0xdbc86a31, 0xc62ddab8, 0xae2ef670,
+ 0x162b8328, 0x7e28afe0, 0x2de0e23a, 0x45e3cef2, 0xfde6bbaa, 0x95e59762,
+ 0x880027eb, 0xe0030b23, 0x58067e7b, 0x300552b3, 0xff96e5cf, 0x9795c907,
+ 0x2f90bc5f, 0x47939097, 0x5a76201e, 0x32750cd6, 0x8a70798e, 0xe2735546,
+ 0xb1bb189c, 0xd9b83454, 0x61bd410c, 0x09be6dc4, 0x145bdd4d, 0x7c58f185,
+ 0xc45d84dd, 0xac5ea815, 0x5e969cd4, 0x3695b01c, 0x8e90c544, 0xe693e98c,
+ 0xfb765905, 0x937575cd, 0x2b700095, 0x43732c5d, 0x10bb6187, 0x78b84d4f,
+ 0xc0bd3817, 0xa8be14df, 0xb55ba456, 0xdd58889e, 0x655dfdc6, 0x0d5ed10e,
+ 0xc2cd6672, 0xaace4aba, 0x12cb3fe2, 0x7ac8132a, 0x672da3a3, 0x0f2e8f6b,
+ 0xb72bfa33, 0xdf28d6fb, 0x8ce09b21, 0xe4e3b7e9, 0x5ce6c2b1, 0x34e5ee79,
+ 0x29005ef0, 0x41037238, 0xf9060760, 0x91052ba8},
+ {0x3716d8e7, 0x7e2aa5c0, 0xa56e22a9, 0xec525f8e, 0x160b5a8a, 0x5f3727ad,
+ 0x8473a0c4, 0xcd4fdde3, 0x752ddc3d, 0x3c11a11a, 0xe7552673, 0xae695b54,
+ 0x54305e50, 0x1d0c2377, 0xc648a41e, 0x8f74d939, 0xb360d153, 0xfa5cac74,
+ 0x21182b1d, 0x6824563a, 0x927d533e, 0xdb412e19, 0x0005a970, 0x4939d457,
+ 0xf15bd589, 0xb867a8ae, 0x63232fc7, 0x2a1f52e0, 0xd04657e4, 0x997a2ac3,
+ 0x423eadaa, 0x0b02d08d, 0x3a16bd7e, 0x732ac059, 0xa86e4730, 0xe1523a17,
+ 0x1b0b3f13, 0x52374234, 0x8973c55d, 0xc04fb87a, 0x782db9a4, 0x3111c483,
+ 0xea5543ea, 0xa3693ecd, 0x59303bc9, 0x100c46ee, 0xcb48c187, 0x8274bca0,
+ 0xbe60b4ca, 0xf75cc9ed, 0x2c184e84, 0x652433a3, 0x9f7d36a7, 0xd6414b80,
+ 0x0d05cce9, 0x4439b1ce, 0xfc5bb010, 0xb567cd37, 0x6e234a5e, 0x271f3779,
+ 0xdd46327d, 0x947a4f5a, 0x4f3ec833, 0x0602b514, 0x2d1613d5, 0x642a6ef2,
+ 0xbf6ee99b, 0xf65294bc, 0x0c0b91b8, 0x4537ec9f, 0x9e736bf6, 0xd74f16d1,
+ 0x6f2d170f, 0x26116a28, 0xfd55ed41, 0xb4699066, 0x4e309562, 0x070ce845,
+ 0xdc486f2c, 0x9574120b, 0xa9601a61, 0xe05c6746, 0x3b18e02f, 0x72249d08,
+ 0x887d980c, 0xc141e52b, 0x1a056242, 0x53391f65, 0xeb5b1ebb, 0xa267639c,
+ 0x7923e4f5, 0x301f99d2, 0xca469cd6, 0x837ae1f1, 0x583e6698, 0x11021bbf,
+ 0x2016764c, 0x692a0b6b, 0xb26e8c02, 0xfb52f125, 0x010bf421, 0x48378906,
+ 0x93730e6f, 0xda4f7348, 0x622d7296, 0x2b110fb1, 0xf05588d8, 0xb969f5ff,
+ 0x4330f0fb, 0x0a0c8ddc, 0xd1480ab5, 0x98747792, 0xa4607ff8, 0xed5c02df,
+ 0x361885b6, 0x7f24f891, 0x857dfd95, 0xcc4180b2, 0x170507db, 0x5e397afc,
+ 0xe65b7b22, 0xaf670605, 0x7423816c, 0x3d1ffc4b, 0xc746f94f, 0x8e7a8468,
+ 0x553e0301, 0x1c027e26, 0x03174e83, 0x4a2b33a4, 0x916fb4cd, 0xd853c9ea,
+ 0x220accee, 0x6b36b1c9, 0xb07236a0, 0xf94e4b87, 0x412c4a59, 0x0810377e,
+ 0xd354b017, 0x9a68cd30, 0x6031c834, 0x290db513, 0xf249327a, 0xbb754f5d,
+ 0x87614737, 0xce5d3a10, 0x1519bd79, 0x5c25c05e, 0xa67cc55a, 0xef40b87d,
+ 0x34043f14, 0x7d384233, 0xc55a43ed, 0x8c663eca, 0x5722b9a3, 0x1e1ec484,
+ 0xe447c180, 0xad7bbca7, 0x763f3bce, 0x3f0346e9, 0x0e172b1a, 0x472b563d,
+ 0x9c6fd154, 0xd553ac73, 0x2f0aa977, 0x6636d450, 0xbd725339, 0xf44e2e1e,
+ 0x4c2c2fc0, 0x051052e7, 0xde54d58e, 0x9768a8a9, 0x6d31adad, 0x240dd08a,
+ 0xff4957e3, 0xb6752ac4, 0x8a6122ae, 0xc35d5f89, 0x1819d8e0, 0x5125a5c7,
+ 0xab7ca0c3, 0xe240dde4, 0x39045a8d, 0x703827aa, 0xc85a2674, 0x81665b53,
+ 0x5a22dc3a, 0x131ea11d, 0xe947a419, 0xa07bd93e, 0x7b3f5e57, 0x32032370,
+ 0x191785b1, 0x502bf896, 0x8b6f7fff, 0xc25302d8, 0x380a07dc, 0x71367afb,
+ 0xaa72fd92, 0xe34e80b5, 0x5b2c816b, 0x1210fc4c, 0xc9547b25, 0x80680602,
+ 0x7a310306, 0x330d7e21, 0xe849f948, 0xa175846f, 0x9d618c05, 0xd45df122,
+ 0x0f19764b, 0x46250b6c, 0xbc7c0e68, 0xf540734f, 0x2e04f426, 0x67388901,
+ 0xdf5a88df, 0x9666f5f8, 0x4d227291, 0x041e0fb6, 0xfe470ab2, 0xb77b7795,
+ 0x6c3ff0fc, 0x25038ddb, 0x1417e028, 0x5d2b9d0f, 0x866f1a66, 0xcf536741,
+ 0x350a6245, 0x7c361f62, 0xa772980b, 0xee4ee52c, 0x562ce4f2, 0x1f1099d5,
+ 0xc4541ebc, 0x8d68639b, 0x7731669f, 0x3e0d1bb8, 0xe5499cd1, 0xac75e1f6,
+ 0x9061e99c, 0xd95d94bb, 0x021913d2, 0x4b256ef5, 0xb17c6bf1, 0xf84016d6,
+ 0x230491bf, 0x6a38ec98, 0xd25aed46, 0x9b669061, 0x40221708, 0x091e6a2f,
+ 0xf3476f2b, 0xba7b120c, 0x613f9565, 0x2803e842}
+};
+
+uint32_t crc32iscsi_byte(uint32_t crc, void const *mem, size_t len) {
+ uint8_t const *data = mem;
+ if (data == NULL)
+ return 0;
+ for (size_t i = 0; i < len; i++) {
+ crc = (crc >> 8) ^
+ table_byte[(crc ^ data[i]) & 0xff];
+ }
+ return crc;
+}
+
+// This code assumes that integers are stored little-endian.
+
+uint32_t crc32iscsi_word(uint32_t crc, void const *mem, size_t len) {
+ uint8_t const *data = mem;
+ if (data == NULL)
+ return 0;
+ while (len && ((ptrdiff_t)data & 0x7)) {
+ len--;
+ crc = (crc >> 8) ^
+ table_byte[(crc ^ *data++) & 0xff];
+ }
+ size_t n = len >> 3;
+ for (size_t i = 0; i < n; i++) {
+ uint64_t word = crc ^ ((uint64_t const *)data)[i];
+ crc = table_word[7][word & 0xff] ^
+ table_word[6][(word >> 8) & 0xff] ^
+ table_word[5][(word >> 16) & 0xff] ^
+ table_word[4][(word >> 24) & 0xff] ^
+ table_word[3][(word >> 32) & 0xff] ^
+ table_word[2][(word >> 40) & 0xff] ^
+ table_word[1][(word >> 48) & 0xff] ^
+ table_word[0][word >> 56];
+ }
+ data += n << 3;
+ len &= 7;
+ while (len) {
+ len--;
+ crc = (crc >> 8) ^
+ table_byte[(crc ^ *data++) & 0xff];
+ }
+ return crc;
+}
+
+static uint32_t multmodp(uint32_t a, uint32_t b) {
+ uint32_t prod = 0;
+ for (;;) {
+ if (a & 0x80000000) {
+ prod ^= b;
+ if ((a & 0x7fffffff) == 0)
+ break;
+ }
+ a <<= 1;
+ b = b & 1 ? (b >> 1) ^ 0x82f63b78 : b >> 1;
+ }
+ return prod;
+}
+
+static uint32_t const table_comb[] = {
+ 0x40000000, 0x20000000, 0x08000000, 0x00800000, 0x00008000, 0x82f63b78,
+ 0x6ea2d55c, 0x18b8ea18, 0x510ac59a, 0xb82be955, 0xb8fdb1e7, 0x88e56f72,
+ 0x74c360a4, 0xe4172b16, 0x0d65762a, 0x35d73a62, 0x28461564, 0xbf455269,
+ 0xe2ea32dc, 0xfe7740e6, 0xf946610b, 0x3c204f8f, 0x538586e3, 0x59726915,
+ 0x734d5309, 0xbc1ac763, 0x7d0722cc, 0xd289cabe, 0xe94ca9bc, 0x05b74f3f,
+ 0xa51e1f42
+};
+
+static uint32_t x8nmodp(uintmax_t n) {
+ uint32_t xp = 0x80000000;
+ int k = 3;
+ for (;;) {
+ if (n & 1)
+ xp = multmodp(table_comb[k], xp);
+ n >>= 1;
+ if (n == 0)
+ break;
+ if (++k == 31)
+ k = 0;
+ }
+ return xp;
+}
+
+uint32_t crc32iscsi_comb(uint32_t crc1, uint32_t crc2,
+ uintmax_t len2) {
+ return multmodp(x8nmodp(len2), crc1) ^ crc2;
+}
--- /dev/null
+// The _bit, _byte, and _word routines return the CRC of the len
+// bytes at mem, applied to the previous CRC value, crc. If mem is
+// NULL, then the other arguments are ignored, and the initial CRC,
+// i.e. the CRC of zero bytes, is returned. Those routines will all
+// return the same result, differing only in speed and code
+// complexity. The _rem routine returns the CRC of the remaining
+// bits in the last byte, for when the number of bits in the
+// message is not a multiple of eight. The low bits bits of the low
+// byte of val are applied to crc. bits must be in 0..8.
+
+#include <stddef.h>
+#include <stdint.h>
+
+// Compute the CRC a bit at a time.
+uint32_t crc32iscsi_bit(uint32_t crc, void const *mem, size_t len);
+
+// Compute the CRC of the low bits bits in val.
+uint32_t crc32iscsi_rem(uint32_t crc, unsigned val, unsigned bits);
+
+// Compute the CRC a byte at a time.
+uint32_t crc32iscsi_byte(uint32_t crc, void const *mem, size_t len);
+
+// Compute the CRC a word at a time.
+uint32_t crc32iscsi_word(uint32_t crc, void const *mem, size_t len);
+
+// Compute the combination of two CRCs.
+uint32_t crc32iscsi_comb(uint32_t crc1, uint32_t crc2, uintmax_t len2);
--- /dev/null
+#include "crc32iso_hdlc.h"
+
+uint32_t crc32iso_hdlc_bit(uint32_t crc, void const *mem, size_t len) {
+ uint8_t const *data = mem;
+ if (data == NULL)
+ return 0;
+ crc = ~crc;
+ for (size_t i = 0; i < len; i++) {
+ crc ^= data[i];
+ for (unsigned k = 0; k < 8; k++) {
+ crc = crc & 1 ? (crc >> 1) ^ 0xedb88320 : crc >> 1;
+ }
+ }
+ crc = ~crc;
+ return crc;
+}
+
+uint32_t crc32iso_hdlc_rem(uint32_t crc, unsigned val, unsigned bits) {
+ crc = ~crc;
+ val &= (1U << bits) - 1;
+ crc ^= val;
+ for (unsigned i = 0; i < bits; i++) {
+ crc = crc & 1 ? (crc >> 1) ^ 0xedb88320 : crc >> 1;
+ }
+ crc = ~crc;
+ return crc;
+}
+
+#define table_byte table_word[0]
+
+static uint32_t const table_word[][256] = {
+ {0xd202ef8d, 0xa505df1b, 0x3c0c8ea1, 0x4b0bbe37, 0xd56f2b94, 0xa2681b02,
+ 0x3b614ab8, 0x4c667a2e, 0xdcd967bf, 0xabde5729, 0x32d70693, 0x45d03605,
+ 0xdbb4a3a6, 0xacb39330, 0x35bac28a, 0x42bdf21c, 0xcfb5ffe9, 0xb8b2cf7f,
+ 0x21bb9ec5, 0x56bcae53, 0xc8d83bf0, 0xbfdf0b66, 0x26d65adc, 0x51d16a4a,
+ 0xc16e77db, 0xb669474d, 0x2f6016f7, 0x58672661, 0xc603b3c2, 0xb1048354,
+ 0x280dd2ee, 0x5f0ae278, 0xe96ccf45, 0x9e6bffd3, 0x0762ae69, 0x70659eff,
+ 0xee010b5c, 0x99063bca, 0x000f6a70, 0x77085ae6, 0xe7b74777, 0x90b077e1,
+ 0x09b9265b, 0x7ebe16cd, 0xe0da836e, 0x97ddb3f8, 0x0ed4e242, 0x79d3d2d4,
+ 0xf4dbdf21, 0x83dcefb7, 0x1ad5be0d, 0x6dd28e9b, 0xf3b61b38, 0x84b12bae,
+ 0x1db87a14, 0x6abf4a82, 0xfa005713, 0x8d076785, 0x140e363f, 0x630906a9,
+ 0xfd6d930a, 0x8a6aa39c, 0x1363f226, 0x6464c2b0, 0xa4deae1d, 0xd3d99e8b,
+ 0x4ad0cf31, 0x3dd7ffa7, 0xa3b36a04, 0xd4b45a92, 0x4dbd0b28, 0x3aba3bbe,
+ 0xaa05262f, 0xdd0216b9, 0x440b4703, 0x330c7795, 0xad68e236, 0xda6fd2a0,
+ 0x4366831a, 0x3461b38c, 0xb969be79, 0xce6e8eef, 0x5767df55, 0x2060efc3,
+ 0xbe047a60, 0xc9034af6, 0x500a1b4c, 0x270d2bda, 0xb7b2364b, 0xc0b506dd,
+ 0x59bc5767, 0x2ebb67f1, 0xb0dff252, 0xc7d8c2c4, 0x5ed1937e, 0x29d6a3e8,
+ 0x9fb08ed5, 0xe8b7be43, 0x71beeff9, 0x06b9df6f, 0x98dd4acc, 0xefda7a5a,
+ 0x76d32be0, 0x01d41b76, 0x916b06e7, 0xe66c3671, 0x7f6567cb, 0x0862575d,
+ 0x9606c2fe, 0xe101f268, 0x7808a3d2, 0x0f0f9344, 0x82079eb1, 0xf500ae27,
+ 0x6c09ff9d, 0x1b0ecf0b, 0x856a5aa8, 0xf26d6a3e, 0x6b643b84, 0x1c630b12,
+ 0x8cdc1683, 0xfbdb2615, 0x62d277af, 0x15d54739, 0x8bb1d29a, 0xfcb6e20c,
+ 0x65bfb3b6, 0x12b88320, 0x3fba6cad, 0x48bd5c3b, 0xd1b40d81, 0xa6b33d17,
+ 0x38d7a8b4, 0x4fd09822, 0xd6d9c998, 0xa1def90e, 0x3161e49f, 0x4666d409,
+ 0xdf6f85b3, 0xa868b525, 0x360c2086, 0x410b1010, 0xd80241aa, 0xaf05713c,
+ 0x220d7cc9, 0x550a4c5f, 0xcc031de5, 0xbb042d73, 0x2560b8d0, 0x52678846,
+ 0xcb6ed9fc, 0xbc69e96a, 0x2cd6f4fb, 0x5bd1c46d, 0xc2d895d7, 0xb5dfa541,
+ 0x2bbb30e2, 0x5cbc0074, 0xc5b551ce, 0xb2b26158, 0x04d44c65, 0x73d37cf3,
+ 0xeada2d49, 0x9ddd1ddf, 0x03b9887c, 0x74beb8ea, 0xedb7e950, 0x9ab0d9c6,
+ 0x0a0fc457, 0x7d08f4c1, 0xe401a57b, 0x930695ed, 0x0d62004e, 0x7a6530d8,
+ 0xe36c6162, 0x946b51f4, 0x19635c01, 0x6e646c97, 0xf76d3d2d, 0x806a0dbb,
+ 0x1e0e9818, 0x6909a88e, 0xf000f934, 0x8707c9a2, 0x17b8d433, 0x60bfe4a5,
+ 0xf9b6b51f, 0x8eb18589, 0x10d5102a, 0x67d220bc, 0xfedb7106, 0x89dc4190,
+ 0x49662d3d, 0x3e611dab, 0xa7684c11, 0xd06f7c87, 0x4e0be924, 0x390cd9b2,
+ 0xa0058808, 0xd702b89e, 0x47bda50f, 0x30ba9599, 0xa9b3c423, 0xdeb4f4b5,
+ 0x40d06116, 0x37d75180, 0xaede003a, 0xd9d930ac, 0x54d13d59, 0x23d60dcf,
+ 0xbadf5c75, 0xcdd86ce3, 0x53bcf940, 0x24bbc9d6, 0xbdb2986c, 0xcab5a8fa,
+ 0x5a0ab56b, 0x2d0d85fd, 0xb404d447, 0xc303e4d1, 0x5d677172, 0x2a6041e4,
+ 0xb369105e, 0xc46e20c8, 0x72080df5, 0x050f3d63, 0x9c066cd9, 0xeb015c4f,
+ 0x7565c9ec, 0x0262f97a, 0x9b6ba8c0, 0xec6c9856, 0x7cd385c7, 0x0bd4b551,
+ 0x92dde4eb, 0xe5dad47d, 0x7bbe41de, 0x0cb97148, 0x95b020f2, 0xe2b71064,
+ 0x6fbf1d91, 0x18b82d07, 0x81b17cbd, 0xf6b64c2b, 0x68d2d988, 0x1fd5e91e,
+ 0x86dcb8a4, 0xf1db8832, 0x616495a3, 0x1663a535, 0x8f6af48f, 0xf86dc419,
+ 0x660951ba, 0x110e612c, 0x88073096, 0xff000000},
+ {0x93dbfd72, 0x8ac0cc33, 0xa1ed9ff0, 0xb8f6aeb1, 0xf7b73876, 0xeeac0937,
+ 0xc5815af4, 0xdc9a6bb5, 0x5b02777a, 0x4219463b, 0x693415f8, 0x702f24b9,
+ 0x3f6eb27e, 0x2675833f, 0x0d58d0fc, 0x1443e1bd, 0xd919ef23, 0xc002de62,
+ 0xeb2f8da1, 0xf234bce0, 0xbd752a27, 0xa46e1b66, 0x8f4348a5, 0x965879e4,
+ 0x11c0652b, 0x08db546a, 0x23f607a9, 0x3aed36e8, 0x75aca02f, 0x6cb7916e,
+ 0x479ac2ad, 0x5e81f3ec, 0x065fd9d0, 0x1f44e891, 0x3469bb52, 0x2d728a13,
+ 0x62331cd4, 0x7b282d95, 0x50057e56, 0x491e4f17, 0xce8653d8, 0xd79d6299,
+ 0xfcb0315a, 0xe5ab001b, 0xaaea96dc, 0xb3f1a79d, 0x98dcf45e, 0x81c7c51f,
+ 0x4c9dcb81, 0x5586fac0, 0x7eaba903, 0x67b09842, 0x28f10e85, 0x31ea3fc4,
+ 0x1ac76c07, 0x03dc5d46, 0x84444189, 0x9d5f70c8, 0xb672230b, 0xaf69124a,
+ 0xe028848d, 0xf933b5cc, 0xd21ee60f, 0xcb05d74e, 0x63a2b277, 0x7ab98336,
+ 0x5194d0f5, 0x488fe1b4, 0x07ce7773, 0x1ed54632, 0x35f815f1, 0x2ce324b0,
+ 0xab7b387f, 0xb260093e, 0x994d5afd, 0x80566bbc, 0xcf17fd7b, 0xd60ccc3a,
+ 0xfd219ff9, 0xe43aaeb8, 0x2960a026, 0x307b9167, 0x1b56c2a4, 0x024df3e5,
+ 0x4d0c6522, 0x54175463, 0x7f3a07a0, 0x662136e1, 0xe1b92a2e, 0xf8a21b6f,
+ 0xd38f48ac, 0xca9479ed, 0x85d5ef2a, 0x9ccede6b, 0xb7e38da8, 0xaef8bce9,
+ 0xf62696d5, 0xef3da794, 0xc410f457, 0xdd0bc516, 0x924a53d1, 0x8b516290,
+ 0xa07c3153, 0xb9670012, 0x3eff1cdd, 0x27e42d9c, 0x0cc97e5f, 0x15d24f1e,
+ 0x5a93d9d9, 0x4388e898, 0x68a5bb5b, 0x71be8a1a, 0xbce48484, 0xa5ffb5c5,
+ 0x8ed2e606, 0x97c9d747, 0xd8884180, 0xc19370c1, 0xeabe2302, 0xf3a51243,
+ 0x743d0e8c, 0x6d263fcd, 0x460b6c0e, 0x5f105d4f, 0x1051cb88, 0x094afac9,
+ 0x2267a90a, 0x3b7c984b, 0xa8586539, 0xb1435478, 0x9a6e07bb, 0x837536fa,
+ 0xcc34a03d, 0xd52f917c, 0xfe02c2bf, 0xe719f3fe, 0x6081ef31, 0x799ade70,
+ 0x52b78db3, 0x4bacbcf2, 0x04ed2a35, 0x1df61b74, 0x36db48b7, 0x2fc079f6,
+ 0xe29a7768, 0xfb814629, 0xd0ac15ea, 0xc9b724ab, 0x86f6b26c, 0x9fed832d,
+ 0xb4c0d0ee, 0xaddbe1af, 0x2a43fd60, 0x3358cc21, 0x18759fe2, 0x016eaea3,
+ 0x4e2f3864, 0x57340925, 0x7c195ae6, 0x65026ba7, 0x3ddc419b, 0x24c770da,
+ 0x0fea2319, 0x16f11258, 0x59b0849f, 0x40abb5de, 0x6b86e61d, 0x729dd75c,
+ 0xf505cb93, 0xec1efad2, 0xc733a911, 0xde289850, 0x91690e97, 0x88723fd6,
+ 0xa35f6c15, 0xba445d54, 0x771e53ca, 0x6e05628b, 0x45283148, 0x5c330009,
+ 0x137296ce, 0x0a69a78f, 0x2144f44c, 0x385fc50d, 0xbfc7d9c2, 0xa6dce883,
+ 0x8df1bb40, 0x94ea8a01, 0xdbab1cc6, 0xc2b02d87, 0xe99d7e44, 0xf0864f05,
+ 0x58212a3c, 0x413a1b7d, 0x6a1748be, 0x730c79ff, 0x3c4def38, 0x2556de79,
+ 0x0e7b8dba, 0x1760bcfb, 0x90f8a034, 0x89e39175, 0xa2cec2b6, 0xbbd5f3f7,
+ 0xf4946530, 0xed8f5471, 0xc6a207b2, 0xdfb936f3, 0x12e3386d, 0x0bf8092c,
+ 0x20d55aef, 0x39ce6bae, 0x768ffd69, 0x6f94cc28, 0x44b99feb, 0x5da2aeaa,
+ 0xda3ab265, 0xc3218324, 0xe80cd0e7, 0xf117e1a6, 0xbe567761, 0xa74d4620,
+ 0x8c6015e3, 0x957b24a2, 0xcda50e9e, 0xd4be3fdf, 0xff936c1c, 0xe6885d5d,
+ 0xa9c9cb9a, 0xb0d2fadb, 0x9bffa918, 0x82e49859, 0x057c8496, 0x1c67b5d7,
+ 0x374ae614, 0x2e51d755, 0x61104192, 0x780b70d3, 0x53262310, 0x4a3d1251,
+ 0x87671ccf, 0x9e7c2d8e, 0xb5517e4d, 0xac4a4f0c, 0xe30bd9cb, 0xfa10e88a,
+ 0xd13dbb49, 0xc8268a08, 0x4fbe96c7, 0x56a5a786, 0x7d88f445, 0x6493c504,
+ 0x2bd253c3, 0x32c96282, 0x19e43141, 0x00ff0000},
+ {0xbe98cbed, 0xbf5aa1da, 0xbd1c1f83, 0xbcde75b4, 0xb9916331, 0xb8530906,
+ 0xba15b75f, 0xbbd7dd68, 0xb08b9a55, 0xb149f062, 0xb30f4e3b, 0xb2cd240c,
+ 0xb7823289, 0xb64058be, 0xb406e6e7, 0xb5c48cd0, 0xa2be689d, 0xa37c02aa,
+ 0xa13abcf3, 0xa0f8d6c4, 0xa5b7c041, 0xa475aa76, 0xa633142f, 0xa7f17e18,
+ 0xacad3925, 0xad6f5312, 0xaf29ed4b, 0xaeeb877c, 0xaba491f9, 0xaa66fbce,
+ 0xa8204597, 0xa9e22fa0, 0x86d58d0d, 0x8717e73a, 0x85515963, 0x84933354,
+ 0x81dc25d1, 0x801e4fe6, 0x8258f1bf, 0x839a9b88, 0x88c6dcb5, 0x8904b682,
+ 0x8b4208db, 0x8a8062ec, 0x8fcf7469, 0x8e0d1e5e, 0x8c4ba007, 0x8d89ca30,
+ 0x9af32e7d, 0x9b31444a, 0x9977fa13, 0x98b59024, 0x9dfa86a1, 0x9c38ec96,
+ 0x9e7e52cf, 0x9fbc38f8, 0x94e07fc5, 0x952215f2, 0x9764abab, 0x96a6c19c,
+ 0x93e9d719, 0x922bbd2e, 0x906d0377, 0x91af6940, 0xce02462d, 0xcfc02c1a,
+ 0xcd869243, 0xcc44f874, 0xc90beef1, 0xc8c984c6, 0xca8f3a9f, 0xcb4d50a8,
+ 0xc0111795, 0xc1d37da2, 0xc395c3fb, 0xc257a9cc, 0xc718bf49, 0xc6dad57e,
+ 0xc49c6b27, 0xc55e0110, 0xd224e55d, 0xd3e68f6a, 0xd1a03133, 0xd0625b04,
+ 0xd52d4d81, 0xd4ef27b6, 0xd6a999ef, 0xd76bf3d8, 0xdc37b4e5, 0xddf5ded2,
+ 0xdfb3608b, 0xde710abc, 0xdb3e1c39, 0xdafc760e, 0xd8bac857, 0xd978a260,
+ 0xf64f00cd, 0xf78d6afa, 0xf5cbd4a3, 0xf409be94, 0xf146a811, 0xf084c226,
+ 0xf2c27c7f, 0xf3001648, 0xf85c5175, 0xf99e3b42, 0xfbd8851b, 0xfa1aef2c,
+ 0xff55f9a9, 0xfe97939e, 0xfcd12dc7, 0xfd1347f0, 0xea69a3bd, 0xebabc98a,
+ 0xe9ed77d3, 0xe82f1de4, 0xed600b61, 0xeca26156, 0xeee4df0f, 0xef26b538,
+ 0xe47af205, 0xe5b89832, 0xe7fe266b, 0xe63c4c5c, 0xe3735ad9, 0xe2b130ee,
+ 0xe0f78eb7, 0xe135e480, 0x5fadd06d, 0x5e6fba5a, 0x5c290403, 0x5deb6e34,
+ 0x58a478b1, 0x59661286, 0x5b20acdf, 0x5ae2c6e8, 0x51be81d5, 0x507cebe2,
+ 0x523a55bb, 0x53f83f8c, 0x56b72909, 0x5775433e, 0x5533fd67, 0x54f19750,
+ 0x438b731d, 0x4249192a, 0x400fa773, 0x41cdcd44, 0x4482dbc1, 0x4540b1f6,
+ 0x47060faf, 0x46c46598, 0x4d9822a5, 0x4c5a4892, 0x4e1cf6cb, 0x4fde9cfc,
+ 0x4a918a79, 0x4b53e04e, 0x49155e17, 0x48d73420, 0x67e0968d, 0x6622fcba,
+ 0x646442e3, 0x65a628d4, 0x60e93e51, 0x612b5466, 0x636dea3f, 0x62af8008,
+ 0x69f3c735, 0x6831ad02, 0x6a77135b, 0x6bb5796c, 0x6efa6fe9, 0x6f3805de,
+ 0x6d7ebb87, 0x6cbcd1b0, 0x7bc635fd, 0x7a045fca, 0x7842e193, 0x79808ba4,
+ 0x7ccf9d21, 0x7d0df716, 0x7f4b494f, 0x7e892378, 0x75d56445, 0x74170e72,
+ 0x7651b02b, 0x7793da1c, 0x72dccc99, 0x731ea6ae, 0x715818f7, 0x709a72c0,
+ 0x2f375dad, 0x2ef5379a, 0x2cb389c3, 0x2d71e3f4, 0x283ef571, 0x29fc9f46,
+ 0x2bba211f, 0x2a784b28, 0x21240c15, 0x20e66622, 0x22a0d87b, 0x2362b24c,
+ 0x262da4c9, 0x27efcefe, 0x25a970a7, 0x246b1a90, 0x3311fedd, 0x32d394ea,
+ 0x30952ab3, 0x31574084, 0x34185601, 0x35da3c36, 0x379c826f, 0x365ee858,
+ 0x3d02af65, 0x3cc0c552, 0x3e867b0b, 0x3f44113c, 0x3a0b07b9, 0x3bc96d8e,
+ 0x398fd3d7, 0x384db9e0, 0x177a1b4d, 0x16b8717a, 0x14fecf23, 0x153ca514,
+ 0x1073b391, 0x11b1d9a6, 0x13f767ff, 0x12350dc8, 0x19694af5, 0x18ab20c2,
+ 0x1aed9e9b, 0x1b2ff4ac, 0x1e60e229, 0x1fa2881e, 0x1de43647, 0x1c265c70,
+ 0x0b5cb83d, 0x0a9ed20a, 0x08d86c53, 0x091a0664, 0x0c5510e1, 0x0d977ad6,
+ 0x0fd1c48f, 0x0e13aeb8, 0x054fe985, 0x048d83b2, 0x06cb3deb, 0x070957dc,
+ 0x02464159, 0x03842b6e, 0x01c29537, 0x0000ff00},
+ {0xde05060e, 0x66b9616b, 0x740cce85, 0xccb0a9e0, 0x51679159, 0xe9dbf63c,
+ 0xfb6e59d2, 0x43d23eb7, 0x1bb12ee1, 0xa30d4984, 0xb1b8e66a, 0x0904810f,
+ 0x94d3b9b6, 0x2c6fded3, 0x3eda713d, 0x86661658, 0x8e1c5191, 0x36a036f4,
+ 0x2415991a, 0x9ca9fe7f, 0x017ec6c6, 0xb9c2a1a3, 0xab770e4d, 0x13cb6928,
+ 0x4ba8797e, 0xf3141e1b, 0xe1a1b1f5, 0x591dd690, 0xc4caee29, 0x7c76894c,
+ 0x6ec326a2, 0xd67f41c7, 0x7e37a930, 0xc68bce55, 0xd43e61bb, 0x6c8206de,
+ 0xf1553e67, 0x49e95902, 0x5b5cf6ec, 0xe3e09189, 0xbb8381df, 0x033fe6ba,
+ 0x118a4954, 0xa9362e31, 0x34e11688, 0x8c5d71ed, 0x9ee8de03, 0x2654b966,
+ 0x2e2efeaf, 0x969299ca, 0x84273624, 0x3c9b5141, 0xa14c69f8, 0x19f00e9d,
+ 0x0b45a173, 0xb3f9c616, 0xeb9ad640, 0x5326b125, 0x41931ecb, 0xf92f79ae,
+ 0x64f84117, 0xdc442672, 0xcef1899c, 0x764deef9, 0x45115e33, 0xfdad3956,
+ 0xef1896b8, 0x57a4f1dd, 0xca73c964, 0x72cfae01, 0x607a01ef, 0xd8c6668a,
+ 0x80a576dc, 0x381911b9, 0x2aacbe57, 0x9210d932, 0x0fc7e18b, 0xb77b86ee,
+ 0xa5ce2900, 0x1d724e65, 0x150809ac, 0xadb46ec9, 0xbf01c127, 0x07bda642,
+ 0x9a6a9efb, 0x22d6f99e, 0x30635670, 0x88df3115, 0xd0bc2143, 0x68004626,
+ 0x7ab5e9c8, 0xc2098ead, 0x5fdeb614, 0xe762d171, 0xf5d77e9f, 0x4d6b19fa,
+ 0xe523f10d, 0x5d9f9668, 0x4f2a3986, 0xf7965ee3, 0x6a41665a, 0xd2fd013f,
+ 0xc048aed1, 0x78f4c9b4, 0x2097d9e2, 0x982bbe87, 0x8a9e1169, 0x3222760c,
+ 0xaff54eb5, 0x174929d0, 0x05fc863e, 0xbd40e15b, 0xb53aa692, 0x0d86c1f7,
+ 0x1f336e19, 0xa78f097c, 0x3a5831c5, 0x82e456a0, 0x9051f94e, 0x28ed9e2b,
+ 0x708e8e7d, 0xc832e918, 0xda8746f6, 0x623b2193, 0xffec192a, 0x47507e4f,
+ 0x55e5d1a1, 0xed59b6c4, 0x335cb035, 0x8be0d750, 0x995578be, 0x21e91fdb,
+ 0xbc3e2762, 0x04824007, 0x1637efe9, 0xae8b888c, 0xf6e898da, 0x4e54ffbf,
+ 0x5ce15051, 0xe45d3734, 0x798a0f8d, 0xc13668e8, 0xd383c706, 0x6b3fa063,
+ 0x6345e7aa, 0xdbf980cf, 0xc94c2f21, 0x71f04844, 0xec2770fd, 0x549b1798,
+ 0x462eb876, 0xfe92df13, 0xa6f1cf45, 0x1e4da820, 0x0cf807ce, 0xb44460ab,
+ 0x29935812, 0x912f3f77, 0x839a9099, 0x3b26f7fc, 0x936e1f0b, 0x2bd2786e,
+ 0x3967d780, 0x81dbb0e5, 0x1c0c885c, 0xa4b0ef39, 0xb60540d7, 0x0eb927b2,
+ 0x56da37e4, 0xee665081, 0xfcd3ff6f, 0x446f980a, 0xd9b8a0b3, 0x6104c7d6,
+ 0x73b16838, 0xcb0d0f5d, 0xc3774894, 0x7bcb2ff1, 0x697e801f, 0xd1c2e77a,
+ 0x4c15dfc3, 0xf4a9b8a6, 0xe61c1748, 0x5ea0702d, 0x06c3607b, 0xbe7f071e,
+ 0xaccaa8f0, 0x1476cf95, 0x89a1f72c, 0x311d9049, 0x23a83fa7, 0x9b1458c2,
+ 0xa848e808, 0x10f48f6d, 0x02412083, 0xbafd47e6, 0x272a7f5f, 0x9f96183a,
+ 0x8d23b7d4, 0x359fd0b1, 0x6dfcc0e7, 0xd540a782, 0xc7f5086c, 0x7f496f09,
+ 0xe29e57b0, 0x5a2230d5, 0x48979f3b, 0xf02bf85e, 0xf851bf97, 0x40edd8f2,
+ 0x5258771c, 0xeae41079, 0x773328c0, 0xcf8f4fa5, 0xdd3ae04b, 0x6586872e,
+ 0x3de59778, 0x8559f01d, 0x97ec5ff3, 0x2f503896, 0xb287002f, 0x0a3b674a,
+ 0x188ec8a4, 0xa032afc1, 0x087a4736, 0xb0c62053, 0xa2738fbd, 0x1acfe8d8,
+ 0x8718d061, 0x3fa4b704, 0x2d1118ea, 0x95ad7f8f, 0xcdce6fd9, 0x757208bc,
+ 0x67c7a752, 0xdf7bc037, 0x42acf88e, 0xfa109feb, 0xe8a53005, 0x50195760,
+ 0x586310a9, 0xe0df77cc, 0xf26ad822, 0x4ad6bf47, 0xd70187fe, 0x6fbde09b,
+ 0x7d084f75, 0xc5b42810, 0x9dd73846, 0x256b5f23, 0x37def0cd, 0x8f6297a8,
+ 0x12b5af11, 0xaa09c874, 0xb8bc679a, 0x000000ff},
+ {0xe7662801, 0xda0601b1, 0x9da67b61, 0xa0c652d1, 0x12e68ec1, 0x2f86a771,
+ 0x6826dda1, 0x5546f411, 0xd71663c0, 0xea764a70, 0xadd630a0, 0x90b61910,
+ 0x2296c500, 0x1ff6ecb0, 0x58569660, 0x6536bfd0, 0x8786bf83, 0xbae69633,
+ 0xfd46ece3, 0xc026c553, 0x72061943, 0x4f6630f3, 0x08c64a23, 0x35a66393,
+ 0xb7f6f442, 0x8a96ddf2, 0xcd36a722, 0xf0568e92, 0x42765282, 0x7f167b32,
+ 0x38b601e2, 0x05d62852, 0x26a70705, 0x1bc72eb5, 0x5c675465, 0x61077dd5,
+ 0xd327a1c5, 0xee478875, 0xa9e7f2a5, 0x9487db15, 0x16d74cc4, 0x2bb76574,
+ 0x6c171fa4, 0x51773614, 0xe357ea04, 0xde37c3b4, 0x9997b964, 0xa4f790d4,
+ 0x46479087, 0x7b27b937, 0x3c87c3e7, 0x01e7ea57, 0xb3c73647, 0x8ea71ff7,
+ 0xc9076527, 0xf4674c97, 0x7637db46, 0x4b57f2f6, 0x0cf78826, 0x3197a196,
+ 0x83b77d86, 0xbed75436, 0xf9772ee6, 0xc4170756, 0xbf957048, 0x82f559f8,
+ 0xc5552328, 0xf8350a98, 0x4a15d688, 0x7775ff38, 0x30d585e8, 0x0db5ac58,
+ 0x8fe53b89, 0xb2851239, 0xf52568e9, 0xc8454159, 0x7a659d49, 0x4705b4f9,
+ 0x00a5ce29, 0x3dc5e799, 0xdf75e7ca, 0xe215ce7a, 0xa5b5b4aa, 0x98d59d1a,
+ 0x2af5410a, 0x179568ba, 0x5035126a, 0x6d553bda, 0xef05ac0b, 0xd26585bb,
+ 0x95c5ff6b, 0xa8a5d6db, 0x1a850acb, 0x27e5237b, 0x604559ab, 0x5d25701b,
+ 0x7e545f4c, 0x433476fc, 0x04940c2c, 0x39f4259c, 0x8bd4f98c, 0xb6b4d03c,
+ 0xf114aaec, 0xcc74835c, 0x4e24148d, 0x73443d3d, 0x34e447ed, 0x09846e5d,
+ 0xbba4b24d, 0x86c49bfd, 0xc164e12d, 0xfc04c89d, 0x1eb4c8ce, 0x23d4e17e,
+ 0x64749bae, 0x5914b21e, 0xeb346e0e, 0xd65447be, 0x91f43d6e, 0xac9414de,
+ 0x2ec4830f, 0x13a4aabf, 0x5404d06f, 0x6964f9df, 0xdb4425cf, 0xe6240c7f,
+ 0xa18476af, 0x9ce45f1f, 0x56809893, 0x6be0b123, 0x2c40cbf3, 0x1120e243,
+ 0xa3003e53, 0x9e6017e3, 0xd9c06d33, 0xe4a04483, 0x66f0d352, 0x5b90fae2,
+ 0x1c308032, 0x2150a982, 0x93707592, 0xae105c22, 0xe9b026f2, 0xd4d00f42,
+ 0x36600f11, 0x0b0026a1, 0x4ca05c71, 0x71c075c1, 0xc3e0a9d1, 0xfe808061,
+ 0xb920fab1, 0x8440d301, 0x061044d0, 0x3b706d60, 0x7cd017b0, 0x41b03e00,
+ 0xf390e210, 0xcef0cba0, 0x8950b170, 0xb43098c0, 0x9741b797, 0xaa219e27,
+ 0xed81e4f7, 0xd0e1cd47, 0x62c11157, 0x5fa138e7, 0x18014237, 0x25616b87,
+ 0xa731fc56, 0x9a51d5e6, 0xddf1af36, 0xe0918686, 0x52b15a96, 0x6fd17326,
+ 0x287109f6, 0x15112046, 0xf7a12015, 0xcac109a5, 0x8d617375, 0xb0015ac5,
+ 0x022186d5, 0x3f41af65, 0x78e1d5b5, 0x4581fc05, 0xc7d16bd4, 0xfab14264,
+ 0xbd1138b4, 0x80711104, 0x3251cd14, 0x0f31e4a4, 0x48919e74, 0x75f1b7c4,
+ 0x0e73c0da, 0x3313e96a, 0x74b393ba, 0x49d3ba0a, 0xfbf3661a, 0xc6934faa,
+ 0x8133357a, 0xbc531cca, 0x3e038b1b, 0x0363a2ab, 0x44c3d87b, 0x79a3f1cb,
+ 0xcb832ddb, 0xf6e3046b, 0xb1437ebb, 0x8c23570b, 0x6e935758, 0x53f37ee8,
+ 0x14530438, 0x29332d88, 0x9b13f198, 0xa673d828, 0xe1d3a2f8, 0xdcb38b48,
+ 0x5ee31c99, 0x63833529, 0x24234ff9, 0x19436649, 0xab63ba59, 0x960393e9,
+ 0xd1a3e939, 0xecc3c089, 0xcfb2efde, 0xf2d2c66e, 0xb572bcbe, 0x8812950e,
+ 0x3a32491e, 0x075260ae, 0x40f21a7e, 0x7d9233ce, 0xffc2a41f, 0xc2a28daf,
+ 0x8502f77f, 0xb862decf, 0x0a4202df, 0x37222b6f, 0x708251bf, 0x4de2780f,
+ 0xaf52785c, 0x923251ec, 0xd5922b3c, 0xe8f2028c, 0x5ad2de9c, 0x67b2f72c,
+ 0x20128dfc, 0x1d72a44c, 0x9f22339d, 0xa2421a2d, 0xe5e260fd, 0xd882494d,
+ 0x6aa2955d, 0x57c2bced, 0x1062c63d, 0x2d02ef8d},
+ {0x77e056be, 0xbcbc851b, 0x3a28f7b5, 0xf1742410, 0xec7114a8, 0x272dc70d,
+ 0xa1b9b5a3, 0x6ae56606, 0x9bb3d4d3, 0x50ef0776, 0xd67b75d8, 0x1d27a67d,
+ 0x002296c5, 0xcb7e4560, 0x4dea37ce, 0x86b6e46b, 0x74365425, 0xbf6a8780,
+ 0x39fef52e, 0xf2a2268b, 0xefa71633, 0x24fbc596, 0xa26fb738, 0x6933649d,
+ 0x9865d648, 0x533905ed, 0xd5ad7743, 0x1ef1a4e6, 0x03f4945e, 0xc8a847fb,
+ 0x4e3c3555, 0x8560e6f0, 0x704c5388, 0xbb10802d, 0x3d84f283, 0xf6d82126,
+ 0xebdd119e, 0x2081c23b, 0xa615b095, 0x6d496330, 0x9c1fd1e5, 0x57430240,
+ 0xd1d770ee, 0x1a8ba34b, 0x078e93f3, 0xccd24056, 0x4a4632f8, 0x811ae15d,
+ 0x739a5113, 0xb8c682b6, 0x3e52f018, 0xf50e23bd, 0xe80b1305, 0x2357c0a0,
+ 0xa5c3b20e, 0x6e9f61ab, 0x9fc9d37e, 0x549500db, 0xd2017275, 0x195da1d0,
+ 0x04589168, 0xcf0442cd, 0x49903063, 0x82cce3c6, 0x78b85cd2, 0xb3e48f77,
+ 0x3570fdd9, 0xfe2c2e7c, 0xe3291ec4, 0x2875cd61, 0xaee1bfcf, 0x65bd6c6a,
+ 0x94ebdebf, 0x5fb70d1a, 0xd9237fb4, 0x127fac11, 0x0f7a9ca9, 0xc4264f0c,
+ 0x42b23da2, 0x89eeee07, 0x7b6e5e49, 0xb0328dec, 0x36a6ff42, 0xfdfa2ce7,
+ 0xe0ff1c5f, 0x2ba3cffa, 0xad37bd54, 0x666b6ef1, 0x973ddc24, 0x5c610f81,
+ 0xdaf57d2f, 0x11a9ae8a, 0x0cac9e32, 0xc7f04d97, 0x41643f39, 0x8a38ec9c,
+ 0x7f1459e4, 0xb4488a41, 0x32dcf8ef, 0xf9802b4a, 0xe4851bf2, 0x2fd9c857,
+ 0xa94dbaf9, 0x6211695c, 0x9347db89, 0x581b082c, 0xde8f7a82, 0x15d3a927,
+ 0x08d6999f, 0xc38a4a3a, 0x451e3894, 0x8e42eb31, 0x7cc25b7f, 0xb79e88da,
+ 0x310afa74, 0xfa5629d1, 0xe7531969, 0x2c0fcacc, 0xaa9bb862, 0x61c76bc7,
+ 0x9091d912, 0x5bcd0ab7, 0xdd597819, 0x1605abbc, 0x0b009b04, 0xc05c48a1,
+ 0x46c83a0f, 0x8d94e9aa, 0x69504266, 0xa20c91c3, 0x2498e36d, 0xefc430c8,
+ 0xf2c10070, 0x399dd3d5, 0xbf09a17b, 0x745572de, 0x8503c00b, 0x4e5f13ae,
+ 0xc8cb6100, 0x0397b2a5, 0x1e92821d, 0xd5ce51b8, 0x535a2316, 0x9806f0b3,
+ 0x6a8640fd, 0xa1da9358, 0x274ee1f6, 0xec123253, 0xf11702eb, 0x3a4bd14e,
+ 0xbcdfa3e0, 0x77837045, 0x86d5c290, 0x4d891135, 0xcb1d639b, 0x0041b03e,
+ 0x1d448086, 0xd6185323, 0x508c218d, 0x9bd0f228, 0x6efc4750, 0xa5a094f5,
+ 0x2334e65b, 0xe86835fe, 0xf56d0546, 0x3e31d6e3, 0xb8a5a44d, 0x73f977e8,
+ 0x82afc53d, 0x49f31698, 0xcf676436, 0x043bb793, 0x193e872b, 0xd262548e,
+ 0x54f62620, 0x9faaf585, 0x6d2a45cb, 0xa676966e, 0x20e2e4c0, 0xebbe3765,
+ 0xf6bb07dd, 0x3de7d478, 0xbb73a6d6, 0x702f7573, 0x8179c7a6, 0x4a251403,
+ 0xccb166ad, 0x07edb508, 0x1ae885b0, 0xd1b45615, 0x572024bb, 0x9c7cf71e,
+ 0x6608480a, 0xad549baf, 0x2bc0e901, 0xe09c3aa4, 0xfd990a1c, 0x36c5d9b9,
+ 0xb051ab17, 0x7b0d78b2, 0x8a5bca67, 0x410719c2, 0xc7936b6c, 0x0ccfb8c9,
+ 0x11ca8871, 0xda965bd4, 0x5c02297a, 0x975efadf, 0x65de4a91, 0xae829934,
+ 0x2816eb9a, 0xe34a383f, 0xfe4f0887, 0x3513db22, 0xb387a98c, 0x78db7a29,
+ 0x898dc8fc, 0x42d11b59, 0xc44569f7, 0x0f19ba52, 0x121c8aea, 0xd940594f,
+ 0x5fd42be1, 0x9488f844, 0x61a44d3c, 0xaaf89e99, 0x2c6cec37, 0xe7303f92,
+ 0xfa350f2a, 0x3169dc8f, 0xb7fdae21, 0x7ca17d84, 0x8df7cf51, 0x46ab1cf4,
+ 0xc03f6e5a, 0x0b63bdff, 0x16668d47, 0xdd3a5ee2, 0x5bae2c4c, 0x90f2ffe9,
+ 0x62724fa7, 0xa92e9c02, 0x2fbaeeac, 0xe4e63d09, 0xf9e30db1, 0x32bfde14,
+ 0xb42bacba, 0x7f777f1f, 0x8e21cdca, 0x457d1e6f, 0xc3e96cc1, 0x08b5bf64,
+ 0x15b08fdc, 0xdeec5c79, 0x58782ed7, 0x9324fd72},
+ {0x2cae7edd, 0x8ad97569, 0xbb316ff4, 0x1d466440, 0xd8e15ace, 0x7e96517a,
+ 0x4f7e4be7, 0xe9094053, 0x1f4130ba, 0xb9363b0e, 0x88de2193, 0x2ea92a27,
+ 0xeb0e14a9, 0x4d791f1d, 0x7c910580, 0xdae60e34, 0x4b70e213, 0xed07e9a7,
+ 0xdceff33a, 0x7a98f88e, 0xbf3fc600, 0x1948cdb4, 0x28a0d729, 0x8ed7dc9d,
+ 0x789fac74, 0xdee8a7c0, 0xef00bd5d, 0x4977b6e9, 0x8cd08867, 0x2aa783d3,
+ 0x1b4f994e, 0xbd3892fa, 0xe3134741, 0x45644cf5, 0x748c5668, 0xd2fb5ddc,
+ 0x175c6352, 0xb12b68e6, 0x80c3727b, 0x26b479cf, 0xd0fc0926, 0x768b0292,
+ 0x4763180f, 0xe11413bb, 0x24b32d35, 0x82c42681, 0xb32c3c1c, 0x155b37a8,
+ 0x84cddb8f, 0x22bad03b, 0x1352caa6, 0xb525c112, 0x7082ff9c, 0xd6f5f428,
+ 0xe71deeb5, 0x416ae501, 0xb72295e8, 0x11559e5c, 0x20bd84c1, 0x86ca8f75,
+ 0x436db1fb, 0xe51aba4f, 0xd4f2a0d2, 0x7285ab66, 0x68a50ba4, 0xced20010,
+ 0xff3a1a8d, 0x594d1139, 0x9cea2fb7, 0x3a9d2403, 0x0b753e9e, 0xad02352a,
+ 0x5b4a45c3, 0xfd3d4e77, 0xccd554ea, 0x6aa25f5e, 0xaf0561d0, 0x09726a64,
+ 0x389a70f9, 0x9eed7b4d, 0x0f7b976a, 0xa90c9cde, 0x98e48643, 0x3e938df7,
+ 0xfb34b379, 0x5d43b8cd, 0x6caba250, 0xcadca9e4, 0x3c94d90d, 0x9ae3d2b9,
+ 0xab0bc824, 0x0d7cc390, 0xc8dbfd1e, 0x6eacf6aa, 0x5f44ec37, 0xf933e783,
+ 0xa7183238, 0x016f398c, 0x30872311, 0x96f028a5, 0x5357162b, 0xf5201d9f,
+ 0xc4c80702, 0x62bf0cb6, 0x94f77c5f, 0x328077eb, 0x03686d76, 0xa51f66c2,
+ 0x60b8584c, 0xc6cf53f8, 0xf7274965, 0x515042d1, 0xc0c6aef6, 0x66b1a542,
+ 0x5759bfdf, 0xf12eb46b, 0x34898ae5, 0x92fe8151, 0xa3169bcc, 0x05619078,
+ 0xf329e091, 0x555eeb25, 0x64b6f1b8, 0xc2c1fa0c, 0x0766c482, 0xa111cf36,
+ 0x90f9d5ab, 0x368ede1f, 0xa4b8942f, 0x02cf9f9b, 0x33278506, 0x95508eb2,
+ 0x50f7b03c, 0xf680bb88, 0xc768a115, 0x611faaa1, 0x9757da48, 0x3120d1fc,
+ 0x00c8cb61, 0xa6bfc0d5, 0x6318fe5b, 0xc56ff5ef, 0xf487ef72, 0x52f0e4c6,
+ 0xc36608e1, 0x65110355, 0x54f919c8, 0xf28e127c, 0x37292cf2, 0x915e2746,
+ 0xa0b63ddb, 0x06c1366f, 0xf0894686, 0x56fe4d32, 0x671657af, 0xc1615c1b,
+ 0x04c66295, 0xa2b16921, 0x935973bc, 0x352e7808, 0x6b05adb3, 0xcd72a607,
+ 0xfc9abc9a, 0x5aedb72e, 0x9f4a89a0, 0x393d8214, 0x08d59889, 0xaea2933d,
+ 0x58eae3d4, 0xfe9de860, 0xcf75f2fd, 0x6902f949, 0xaca5c7c7, 0x0ad2cc73,
+ 0x3b3ad6ee, 0x9d4ddd5a, 0x0cdb317d, 0xaaac3ac9, 0x9b442054, 0x3d332be0,
+ 0xf894156e, 0x5ee31eda, 0x6f0b0447, 0xc97c0ff3, 0x3f347f1a, 0x994374ae,
+ 0xa8ab6e33, 0x0edc6587, 0xcb7b5b09, 0x6d0c50bd, 0x5ce44a20, 0xfa934194,
+ 0xe0b3e156, 0x46c4eae2, 0x772cf07f, 0xd15bfbcb, 0x14fcc545, 0xb28bcef1,
+ 0x8363d46c, 0x2514dfd8, 0xd35caf31, 0x752ba485, 0x44c3be18, 0xe2b4b5ac,
+ 0x27138b22, 0x81648096, 0xb08c9a0b, 0x16fb91bf, 0x876d7d98, 0x211a762c,
+ 0x10f26cb1, 0xb6856705, 0x7322598b, 0xd555523f, 0xe4bd48a2, 0x42ca4316,
+ 0xb48233ff, 0x12f5384b, 0x231d22d6, 0x856a2962, 0x40cd17ec, 0xe6ba1c58,
+ 0xd75206c5, 0x71250d71, 0x2f0ed8ca, 0x8979d37e, 0xb891c9e3, 0x1ee6c257,
+ 0xdb41fcd9, 0x7d36f76d, 0x4cdeedf0, 0xeaa9e644, 0x1ce196ad, 0xba969d19,
+ 0x8b7e8784, 0x2d098c30, 0xe8aeb2be, 0x4ed9b90a, 0x7f31a397, 0xd946a823,
+ 0x48d04404, 0xeea74fb0, 0xdf4f552d, 0x79385e99, 0xbc9f6017, 0x1ae86ba3,
+ 0x2b00713e, 0x8d777a8a, 0x7b3f0a63, 0xdd4801d7, 0xeca01b4a, 0x4ad710fe,
+ 0x8f702e70, 0x290725c4, 0x18ef3f59, 0xbe9834ed},
+ {0xf84e0017, 0x34e40089, 0xba6b076a, 0x76c107f4, 0x7c040eed, 0xb0ae0e73,
+ 0x3e210990, 0xf28b090e, 0x2bab1ba2, 0xe7011b3c, 0x698e1cdf, 0xa5241c41,
+ 0xafe11558, 0x634b15c6, 0xedc41225, 0x216e12bb, 0x84f5313c, 0x485f31a2,
+ 0xc6d03641, 0x0a7a36df, 0x00bf3fc6, 0xcc153f58, 0x429a38bb, 0x8e303825,
+ 0x57102a89, 0x9bba2a17, 0x15352df4, 0xd99f2d6a, 0xd35a2473, 0x1ff024ed,
+ 0x917f230e, 0x5dd52390, 0x01386241, 0xcd9262df, 0x431d653c, 0x8fb765a2,
+ 0x85726cbb, 0x49d86c25, 0xc7576bc6, 0x0bfd6b58, 0xd2dd79f4, 0x1e77796a,
+ 0x90f87e89, 0x5c527e17, 0x5697770e, 0x9a3d7790, 0x14b27073, 0xd81870ed,
+ 0x7d83536a, 0xb12953f4, 0x3fa65417, 0xf30c5489, 0xf9c95d90, 0x35635d0e,
+ 0xbbec5aed, 0x77465a73, 0xae6648df, 0x62cc4841, 0xec434fa2, 0x20e94f3c,
+ 0x2a2c4625, 0xe68646bb, 0x68094158, 0xa4a341c6, 0xd1d3c2fa, 0x1d79c264,
+ 0x93f6c587, 0x5f5cc519, 0x5599cc00, 0x9933cc9e, 0x17bccb7d, 0xdb16cbe3,
+ 0x0236d94f, 0xce9cd9d1, 0x4013de32, 0x8cb9deac, 0x867cd7b5, 0x4ad6d72b,
+ 0xc459d0c8, 0x08f3d056, 0xad68f3d1, 0x61c2f34f, 0xef4df4ac, 0x23e7f432,
+ 0x2922fd2b, 0xe588fdb5, 0x6b07fa56, 0xa7adfac8, 0x7e8de864, 0xb227e8fa,
+ 0x3ca8ef19, 0xf002ef87, 0xfac7e69e, 0x366de600, 0xb8e2e1e3, 0x7448e17d,
+ 0x28a5a0ac, 0xe40fa032, 0x6a80a7d1, 0xa62aa74f, 0xacefae56, 0x6045aec8,
+ 0xeecaa92b, 0x2260a9b5, 0xfb40bb19, 0x37eabb87, 0xb965bc64, 0x75cfbcfa,
+ 0x7f0ab5e3, 0xb3a0b57d, 0x3d2fb29e, 0xf185b200, 0x541e9187, 0x98b49119,
+ 0x163b96fa, 0xda919664, 0xd0549f7d, 0x1cfe9fe3, 0x92719800, 0x5edb989e,
+ 0x87fb8a32, 0x4b518aac, 0xc5de8d4f, 0x09748dd1, 0x03b184c8, 0xcf1b8456,
+ 0x419483b5, 0x8d3e832b, 0xab7585cd, 0x67df8553, 0xe95082b0, 0x25fa822e,
+ 0x2f3f8b37, 0xe3958ba9, 0x6d1a8c4a, 0xa1b08cd4, 0x78909e78, 0xb43a9ee6,
+ 0x3ab59905, 0xf61f999b, 0xfcda9082, 0x3070901c, 0xbeff97ff, 0x72559761,
+ 0xd7ceb4e6, 0x1b64b478, 0x95ebb39b, 0x5941b305, 0x5384ba1c, 0x9f2eba82,
+ 0x11a1bd61, 0xdd0bbdff, 0x042baf53, 0xc881afcd, 0x460ea82e, 0x8aa4a8b0,
+ 0x8061a1a9, 0x4ccba137, 0xc244a6d4, 0x0eeea64a, 0x5203e79b, 0x9ea9e705,
+ 0x1026e0e6, 0xdc8ce078, 0xd649e961, 0x1ae3e9ff, 0x946cee1c, 0x58c6ee82,
+ 0x81e6fc2e, 0x4d4cfcb0, 0xc3c3fb53, 0x0f69fbcd, 0x05acf2d4, 0xc906f24a,
+ 0x4789f5a9, 0x8b23f537, 0x2eb8d6b0, 0xe212d62e, 0x6c9dd1cd, 0xa037d153,
+ 0xaaf2d84a, 0x6658d8d4, 0xe8d7df37, 0x247ddfa9, 0xfd5dcd05, 0x31f7cd9b,
+ 0xbf78ca78, 0x73d2cae6, 0x7917c3ff, 0xb5bdc361, 0x3b32c482, 0xf798c41c,
+ 0x82e84720, 0x4e4247be, 0xc0cd405d, 0x0c6740c3, 0x06a249da, 0xca084944,
+ 0x44874ea7, 0x882d4e39, 0x510d5c95, 0x9da75c0b, 0x13285be8, 0xdf825b76,
+ 0xd547526f, 0x19ed52f1, 0x97625512, 0x5bc8558c, 0xfe53760b, 0x32f97695,
+ 0xbc767176, 0x70dc71e8, 0x7a1978f1, 0xb6b3786f, 0x383c7f8c, 0xf4967f12,
+ 0x2db66dbe, 0xe11c6d20, 0x6f936ac3, 0xa3396a5d, 0xa9fc6344, 0x655663da,
+ 0xebd96439, 0x277364a7, 0x7b9e2576, 0xb73425e8, 0x39bb220b, 0xf5112295,
+ 0xffd42b8c, 0x337e2b12, 0xbdf12cf1, 0x715b2c6f, 0xa87b3ec3, 0x64d13e5d,
+ 0xea5e39be, 0x26f43920, 0x2c313039, 0xe09b30a7, 0x6e143744, 0xa2be37da,
+ 0x0725145d, 0xcb8f14c3, 0x45001320, 0x89aa13be, 0x836f1aa7, 0x4fc51a39,
+ 0xc14a1dda, 0x0de01d44, 0xd4c00fe8, 0x186a0f76, 0x96e50895, 0x5a4f080b,
+ 0x508a0112, 0x9c20018c, 0x12af066f, 0xde0506f1}
+};
+
+uint32_t crc32iso_hdlc_byte(uint32_t crc, void const *mem, size_t len) {
+ uint8_t const *data = mem;
+ if (data == NULL)
+ return 0;
+ for (size_t i = 0; i < len; i++) {
+ crc = (crc >> 8) ^
+ table_byte[(crc ^ data[i]) & 0xff];
+ }
+ return crc;
+}
+
+// This code assumes that integers are stored little-endian.
+
+uint32_t crc32iso_hdlc_word(uint32_t crc, void const *mem, size_t len) {
+ uint8_t const *data = mem;
+ if (data == NULL)
+ return 0;
+ while (len && ((ptrdiff_t)data & 0x7)) {
+ len--;
+ crc = (crc >> 8) ^
+ table_byte[(crc ^ *data++) & 0xff];
+ }
+ size_t n = len >> 3;
+ for (size_t i = 0; i < n; i++) {
+ uint64_t word = crc ^ ((uint64_t const *)data)[i];
+ crc = table_word[7][word & 0xff] ^
+ table_word[6][(word >> 8) & 0xff] ^
+ table_word[5][(word >> 16) & 0xff] ^
+ table_word[4][(word >> 24) & 0xff] ^
+ table_word[3][(word >> 32) & 0xff] ^
+ table_word[2][(word >> 40) & 0xff] ^
+ table_word[1][(word >> 48) & 0xff] ^
+ table_word[0][word >> 56];
+ }
+ data += n << 3;
+ len &= 7;
+ while (len) {
+ len--;
+ crc = (crc >> 8) ^
+ table_byte[(crc ^ *data++) & 0xff];
+ }
+ return crc;
+}
+
+static uint32_t multmodp(uint32_t a, uint32_t b) {
+ uint32_t prod = 0;
+ for (;;) {
+ if (a & 0x80000000) {
+ prod ^= b;
+ if ((a & 0x7fffffff) == 0)
+ break;
+ }
+ a <<= 1;
+ b = b & 1 ? (b >> 1) ^ 0xedb88320 : b >> 1;
+ }
+ return prod;
+}
+
+static uint32_t const table_comb[] = {
+ 0x40000000, 0x20000000, 0x08000000, 0x00800000, 0x00008000, 0xedb88320,
+ 0xb1e6b092, 0xa06a2517, 0xed627dae, 0x88d14467, 0xd7bbfe6a, 0xec447f11,
+ 0x8e7ea170, 0x6427800e, 0x4d47bae0, 0x09fe548f, 0x83852d0f, 0x30362f1a,
+ 0x7b5a9cc3, 0x31fec169, 0x9fec022a, 0x6c8dedc4, 0x15d6874d, 0x5fde7a4e,
+ 0xbad90e37, 0x2e4e5eef, 0x4eaba214, 0xa8a472c0, 0x429a969e, 0x148d302a,
+ 0xc40ba6d0, 0xc4e22c3c
+};
+
+static uint32_t x8nmodp(uintmax_t n) {
+ uint32_t xp = 0x80000000;
+ int k = 3;
+ for (;;) {
+ if (n & 1)
+ xp = multmodp(table_comb[k], xp);
+ n >>= 1;
+ if (n == 0)
+ break;
+ if (++k == 32)
+ k = 0;
+ }
+ return xp;
+}
+
+uint32_t crc32iso_hdlc_comb(uint32_t crc1, uint32_t crc2,
+ uintmax_t len2) {
+ return multmodp(x8nmodp(len2), crc1) ^ crc2;
+}
--- /dev/null
+// The _bit, _byte, and _word routines return the CRC of the len
+// bytes at mem, applied to the previous CRC value, crc. If mem is
+// NULL, then the other arguments are ignored, and the initial CRC,
+// i.e. the CRC of zero bytes, is returned. Those routines will all
+// return the same result, differing only in speed and code
+// complexity. The _rem routine returns the CRC of the remaining
+// bits in the last byte, for when the number of bits in the
+// message is not a multiple of eight. The low bits bits of the low
+// byte of val are applied to crc. bits must be in 0..8.
+
+#include <stddef.h>
+#include <stdint.h>
+
+// Compute the CRC a bit at a time.
+uint32_t crc32iso_hdlc_bit(uint32_t crc, void const *mem, size_t len);
+
+// Compute the CRC of the low bits bits in val.
+uint32_t crc32iso_hdlc_rem(uint32_t crc, unsigned val, unsigned bits);
+
+// Compute the CRC a byte at a time.
+uint32_t crc32iso_hdlc_byte(uint32_t crc, void const *mem, size_t len);
+
+// Compute the CRC a word at a time.
+uint32_t crc32iso_hdlc_word(uint32_t crc, void const *mem, size_t len);
+
+// Compute the combination of two CRCs.
+uint32_t crc32iso_hdlc_comb(uint32_t crc1, uint32_t crc2, uintmax_t len2);
--- /dev/null
+#include "crc64nvme.h"
+
+uint64_t crc64nvme_bit(uint64_t crc, void const *mem, size_t len) {
+ uint8_t const *data = mem;
+ if (data == NULL)
+ return 0;
+ crc = ~crc;
+ for (size_t i = 0; i < len; i++) {
+ crc ^= data[i];
+ for (unsigned k = 0; k < 8; k++) {
+ crc = crc & 1 ? (crc >> 1) ^ 0x9a6c9329ac4bc9b5 : crc >> 1;
+ }
+ }
+ crc = ~crc;
+ return crc;
+}
+
+uint64_t crc64nvme_rem(uint64_t crc, unsigned val, unsigned bits) {
+ crc = ~crc;
+ val &= (1U << bits) - 1;
+ crc ^= val;
+ for (unsigned i = 0; i < bits; i++) {
+ crc = crc & 1 ? (crc >> 1) ^ 0x9a6c9329ac4bc9b5 : crc >> 1;
+ }
+ crc = ~crc;
+ return crc;
+}
+
+#define table_byte table_word[0]
+
+static uint64_t const table_word[][256] = {
+ {0xd5da5047efec8728, 0xaab4a08fdfd90e51, 0x2b07b1d78f8795da, 0x5469411fbfb21ca3,
+ 0x1cb8b53477ad31a7, 0x63d645fc4798b8de, 0xe26554a417c62355, 0x9d0ba46c27f3aa2c,
+ 0x73c6bcf387f8795d, 0x0ca84c3bb7cdf024, 0x8d1b5d63e7936baf, 0xf275adabd7a6e2d6,
+ 0xbaa459801fb9cfd2, 0xc5caa9482f8c46ab, 0x4479b8107fd2dd20, 0x3b1748d84fe75459,
+ 0xad3aaf7c6752e8a9, 0xd2545fb4576761d0, 0x53e74eec0739fa5b, 0x2c89be24370c7322,
+ 0x64584a0fff135e26, 0x1b36bac7cf26d75f, 0x9a85ab9f9f784cd4, 0xe5eb5b57af4dc5ad,
+ 0x0b2643c80f4616dc, 0x7448b3003f739fa5, 0xf5fba2586f2d042e, 0x8a9552905f188d57,
+ 0xc244a6bb9707a053, 0xbd2a5673a732292a, 0x3c99472bf76cb2a1, 0x43f7b7e3c7593bd8,
+ 0x241bae30fe90582a, 0x5b755ef8cea5d153, 0xdac64fa09efb4ad8, 0xa5a8bf68aecec3a1,
+ 0xed794b4366d1eea5, 0x9217bb8b56e467dc, 0x13a4aad306bafc57, 0x6cca5a1b368f752e,
+ 0x820742849684a65f, 0xfd69b24ca6b12f26, 0x7cdaa314f6efb4ad, 0x03b453dcc6da3dd4,
+ 0x4b65a7f70ec510d0, 0x340b573f3ef099a9, 0xb5b846676eae0222, 0xcad6b6af5e9b8b5b,
+ 0x5cfb510b762e37ab, 0x2395a1c3461bbed2, 0xa226b09b16452559, 0xdd4840532670ac20,
+ 0x9599b478ee6f8124, 0xeaf744b0de5a085d, 0x6b4455e88e0493d6, 0x142aa520be311aaf,
+ 0xfae7bdbf1e3ac9de, 0x85894d772e0f40a7, 0x043a5c2f7e51db2c, 0x7b54ace74e645255,
+ 0x338558cc867b7f51, 0x4ceba804b64ef628, 0xcd58b95ce6106da3, 0xb2364994d625e4da,
+ 0x02808afa9582aa47, 0x7dee7a32a5b7233e, 0xfc5d6b6af5e9b8b5, 0x83339ba2c5dc31cc,
+ 0xcbe26f890dc31cc8, 0xb48c9f413df695b1, 0x353f8e196da80e3a, 0x4a517ed15d9d8743,
+ 0xa49c664efd965432, 0xdbf29686cda3dd4b, 0x5a4187de9dfd46c0, 0x252f7716adc8cfb9,
+ 0x6dfe833d65d7e2bd, 0x129073f555e26bc4, 0x932362ad05bcf04f, 0xec4d926535897936,
+ 0x7a6075c11d3cc5c6, 0x050e85092d094cbf, 0x84bd94517d57d734, 0xfbd364994d625e4d,
+ 0xb30290b2857d7349, 0xcc6c607ab548fa30, 0x4ddf7122e51661bb, 0x32b181ead523e8c2,
+ 0xdc7c997575283bb3, 0xa31269bd451db2ca, 0x22a178e515432941, 0x5dcf882d2576a038,
+ 0x151e7c06ed698d3c, 0x6a708ccedd5c0445, 0xebc39d968d029fce, 0x94ad6d5ebd3716b7,
+ 0xf341748d84fe7545, 0x8c2f8445b4cbfc3c, 0x0d9c951de49567b7, 0x72f265d5d4a0eece,
+ 0x3a2391fe1cbfc3ca, 0x454d61362c8a4ab3, 0xc4fe706e7cd4d138, 0xbb9080a64ce15841,
+ 0x555d9839ecea8b30, 0x2a3368f1dcdf0249, 0xab8079a98c8199c2, 0xd4ee8961bcb410bb,
+ 0x9c3f7d4a74ab3dbf, 0xe3518d82449eb4c6, 0x62e29cda14c02f4d, 0x1d8c6c1224f5a634,
+ 0x8ba18bb60c401ac4, 0xf4cf7b7e3c7593bd, 0x757c6a266c2b0836, 0x0a129aee5c1e814f,
+ 0x42c36ec59401ac4b, 0x3dad9e0da4342532, 0xbc1e8f55f46abeb9, 0xc3707f9dc45f37c0,
+ 0x2dbd67026454e4b1, 0x52d397ca54616dc8, 0xd3608692043ff643, 0xac0e765a340a7f3a,
+ 0xe4df8271fc15523e, 0x9bb172b9cc20db47, 0x1a0263e19c7e40cc, 0x656c9329ac4bc9b5,
+ 0x4fb6c36e43a74e9d, 0x30d833a67392c7e4, 0xb16b22fe23cc5c6f, 0xce05d23613f9d516,
+ 0x86d4261ddbe6f812, 0xf9bad6d5ebd3716b, 0x7809c78dbb8deae0, 0x076737458bb86399,
+ 0xe9aa2fda2bb3b0e8, 0x96c4df121b863991, 0x1777ce4a4bd8a21a, 0x68193e827bed2b63,
+ 0x20c8caa9b3f20667, 0x5fa63a6183c78f1e, 0xde152b39d3991495, 0xa17bdbf1e3ac9dec,
+ 0x37563c55cb19211c, 0x4838cc9dfb2ca865, 0xc98bddc5ab7233ee, 0xb6e52d0d9b47ba97,
+ 0xfe34d92653589793, 0x815a29ee636d1eea, 0x00e938b633338561, 0x7f87c87e03060c18,
+ 0x914ad0e1a30ddf69, 0xee24202993385610, 0x6f973171c366cd9b, 0x10f9c1b9f35344e2,
+ 0x582835923b4c69e6, 0x2746c55a0b79e09f, 0xa6f5d4025b277b14, 0xd99b24ca6b12f26d,
+ 0xbe773d1952db919f, 0xc119cdd162ee18e6, 0x40aadc8932b0836d, 0x3fc42c4102850a14,
+ 0x7715d86aca9a2710, 0x087b28a2faafae69, 0x89c839faaaf135e2, 0xf6a6c9329ac4bc9b,
+ 0x186bd1ad3acf6fea, 0x670521650afae693, 0xe6b6303d5aa47d18, 0x99d8c0f56a91f461,
+ 0xd10934dea28ed965, 0xae67c41692bb501c, 0x2fd4d54ec2e5cb97, 0x50ba2586f2d042ee,
+ 0xc697c222da65fe1e, 0xb9f932eaea507767, 0x384a23b2ba0eecec, 0x4724d37a8a3b6595,
+ 0x0ff5275142244891, 0x709bd7997211c1e8, 0xf128c6c1224f5a63, 0x8e463609127ad31a,
+ 0x608b2e96b271006b, 0x1fe5de5e82448912, 0x9e56cf06d21a1299, 0xe1383fcee22f9be0,
+ 0xa9e9cbe52a30b6e4, 0xd6873b2d1a053f9d, 0x57342a754a5ba416, 0x285adabd7a6e2d6f,
+ 0x98ec19d339c963f2, 0xe782e91b09fcea8b, 0x6631f84359a27100, 0x195f088b6997f879,
+ 0x518efca0a188d57d, 0x2ee00c6891bd5c04, 0xaf531d30c1e3c78f, 0xd03dedf8f1d64ef6,
+ 0x3ef0f56751dd9d87, 0x419e05af61e814fe, 0xc02d14f731b68f75, 0xbf43e43f0183060c,
+ 0xf7921014c99c2b08, 0x88fce0dcf9a9a271, 0x094ff184a9f739fa, 0x7621014c99c2b083,
+ 0xe00ce6e8b1770c73, 0x9f6216208142850a, 0x1ed10778d11c1e81, 0x61bff7b0e12997f8,
+ 0x296e039b2936bafc, 0x5600f35319033385, 0xd7b3e20b495da80e, 0xa8dd12c379682177,
+ 0x46100a5cd963f206, 0x397efa94e9567b7f, 0xb8cdebccb908e0f4, 0xc7a31b04893d698d,
+ 0x8f72ef2f41224489, 0xf01c1fe77117cdf0, 0x71af0ebf2149567b, 0x0ec1fe77117cdf02,
+ 0x692de7a428b5bcf0, 0x1643176c18803589, 0x97f0063448deae02, 0xe89ef6fc78eb277b,
+ 0xa04f02d7b0f40a7f, 0xdf21f21f80c18306, 0x5e92e347d09f188d, 0x21fc138fe0aa91f4,
+ 0xcf310b1040a14285, 0xb05ffbd87094cbfc, 0x31ecea8020ca5077, 0x4e821a4810ffd90e,
+ 0x0653ee63d8e0f40a, 0x793d1eabe8d57d73, 0xf88e0ff3b88be6f8, 0x87e0ff3b88be6f81,
+ 0x11cd189fa00bd371, 0x6ea3e857903e5a08, 0xef10f90fc060c183, 0x907e09c7f05548fa,
+ 0xd8affdec384a65fe, 0xa7c10d24087fec87, 0x26721c7c5821770c, 0x591cecb46814fe75,
+ 0xb7d1f42bc81f2d04, 0xc8bf04e3f82aa47d, 0x490c15bba8743ff6, 0x3662e5739841b68f,
+ 0x7eb31158505e9b8b, 0x01dde190606b12f2, 0x806ef0c830358979, 0xff00000000000000},
+ {0x5708c8933e87cdf0, 0xd07e61ee4d3a1299, 0x6d3cbc3a816be049, 0xea4a1547f2d63f20,
+ 0x236021c0415f9682, 0xa41688bd32e249eb, 0x19545569feb3bb3b, 0x9e22fc148d0e6452,
+ 0xbfd91a35c1377b14, 0x38afb348b28aa47d, 0x85ed6e9c7edb56ad, 0x029bc7e10d6689c4,
+ 0xcbb1f366beef2066, 0x4cc75a1bcd52ff0f, 0xf18587cf01030ddf, 0x76f32eb272bed2b6,
+ 0xb2724b8d99713353, 0x3504e2f0eaccec3a, 0x88463f24269d1eea, 0x0f3096595520c183,
+ 0xc61aa2dee6a96821, 0x416c0ba39514b748, 0xfc2ed67759454598, 0x7b587f0a2af89af1,
+ 0x5aa3992b66c185b7, 0xddd53056157c5ade, 0x6097ed82d92da80e, 0xe7e144ffaa907767,
+ 0x2ecb70781919dec5, 0xa9bdd9056aa401ac, 0x14ff04d1a6f5f37c, 0x9389adacd5482c15,
+ 0xa924e8fd29fda3dd, 0x2e5241805a407cb4, 0x93109c5496118e64, 0x14663529e5ac510d,
+ 0xdd4c01ae5625f8af, 0x5a3aa8d3259827c6, 0xe7787507e9c9d516, 0x600edc7a9a740a7f,
+ 0x41f53a5bd64d1539, 0xc6839326a5f0ca50, 0x7bc14ef269a13880, 0xfcb7e78f1a1ce7e9,
+ 0x359dd308a9954e4b, 0xb2eb7a75da289122, 0x0fa9a7a1167963f2, 0x88df0edc65c4bc9b,
+ 0x4c5e6be38e0b5d7e, 0xcb28c29efdb68217, 0x766a1f4a31e770c7, 0xf11cb637425aafae,
+ 0x383682b0f1d3060c, 0xbf402bcd826ed965, 0x0202f6194e3f2bb5, 0x85745f643d82f4dc,
+ 0xa48fb94571bbeb9a, 0x23f91038020634f3, 0x9ebbcdecce57c623, 0x19cd6491bdea194a,
+ 0xd0e750160e63b0e8, 0x5791f96b7dde6f81, 0xead324bfb18f9d51, 0x6da58dc2c2324238,
+ 0x9f89ae1c48e482c1, 0x18ff07613b595da8, 0xa5bddab5f708af78, 0x22cb73c884b57011,
+ 0xebe1474f373cd9b3, 0x6c97ee32448106da, 0xd1d533e688d0f40a, 0x56a39a9bfb6d2b63,
+ 0x77587cbab7543425, 0xf02ed5c7c4e9eb4c, 0x4d6c081308b8199c, 0xca1aa16e7b05c6f5,
+ 0x033095e9c88c6f57, 0x84463c94bb31b03e, 0x3904e140776042ee, 0xbe72483d04dd9d87,
+ 0x7af32d02ef127c62, 0xfd85847f9cafa30b, 0x40c759ab50fe51db, 0xc7b1f0d623438eb2,
+ 0x0e9bc45190ca2710, 0x89ed6d2ce377f879, 0x34afb0f82f260aa9, 0xb3d919855c9bd5c0,
+ 0x9222ffa410a2ca86, 0x155456d9631f15ef, 0xa8168b0daf4ee73f, 0x2f602270dcf33856,
+ 0xe64a16f76f7a91f4, 0x613cbf8a1cc74e9d, 0xdc7e625ed096bc4d, 0x5b08cb23a32b6324,
+ 0x61a58e725f9eecec, 0xe6d3270f2c233385, 0x5b91fadbe072c155, 0xdce753a693cf1e3c,
+ 0x15cd67212046b79e, 0x92bbce5c53fb68f7, 0x2ff913889faa9a27, 0xa88fbaf5ec17454e,
+ 0x89745cd4a02e5a08, 0x0e02f5a9d3938561, 0xb340287d1fc277b1, 0x343681006c7fa8d8,
+ 0xfd1cb587dff6017a, 0x7a6a1cfaac4bde13, 0xc728c12e601a2cc3, 0x405e685313a7f3aa,
+ 0x84df0d6cf868124f, 0x03a9a4118bd5cd26, 0xbeeb79c547843ff6, 0x399dd0b83439e09f,
+ 0xf0b7e43f87b0493d, 0x77c14d42f40d9654, 0xca839096385c6484, 0x4df539eb4be1bbed,
+ 0x6c0edfca07d8a4ab, 0xeb7876b774657bc2, 0x563aab63b8348912, 0xd14c021ecb89567b,
+ 0x186636997800ffd9, 0x9f109fe40bbd20b0, 0x22524230c7ecd260, 0xa524eb4db4510d09,
+ 0xf2d323de8ad6c0f9, 0x75a58aa3f96b1f90, 0xc8e75777353aed40, 0x4f91fe0a46873229,
+ 0x86bbca8df50e9b8b, 0x01cd63f086b344e2, 0xbc8fbe244ae2b632, 0x3bf91759395f695b,
+ 0x1a02f1787566761d, 0x9d74580506dba974, 0x203685d1ca8a5ba4, 0xa7402cacb93784cd,
+ 0x6e6a182b0abe2d6f, 0xe91cb1567903f206, 0x545e6c82b55200d6, 0xd328c5ffc6efdfbf,
+ 0x17a9a0c02d203e5a, 0x90df09bd5e9de133, 0x2d9dd46992cc13e3, 0xaaeb7d14e171cc8a,
+ 0x63c1499352f86528, 0xe4b7e0ee2145ba41, 0x59f53d3aed144891, 0xde8394479ea997f8,
+ 0xff787266d29088be, 0x780edb1ba12d57d7, 0xc54c06cf6d7ca507, 0x423aafb21ec17a6e,
+ 0x8b109b35ad48d3cc, 0x0c663248def50ca5, 0xb124ef9c12a4fe75, 0x365246e16119211c,
+ 0x0cff03b09dacaed4, 0x8b89aacdee1171bd, 0x36cb77192240836d, 0xb1bdde6451fd5c04,
+ 0x7897eae3e274f5a6, 0xffe1439e91c92acf, 0x42a39e4a5d98d81f, 0xc5d537372e250776,
+ 0xe42ed116621c1830, 0x6358786b11a1c759, 0xde1aa5bfddf03589, 0x596c0cc2ae4deae0,
+ 0x904638451dc44342, 0x173091386e799c2b, 0xaa724ceca2286efb, 0x2d04e591d195b192,
+ 0xe98580ae3a5a5077, 0x6ef329d349e78f1e, 0xd3b1f40785b67dce, 0x54c75d7af60ba2a7,
+ 0x9ded69fd45820b05, 0x1a9bc080363fd46c, 0xa7d91d54fa6e26bc, 0x20afb42989d3f9d5,
+ 0x01545208c5eae693, 0x8622fb75b65739fa, 0x3b6026a17a06cb2a, 0xbc168fdc09bb1443,
+ 0x753cbb5bba32bde1, 0xf24a1226c98f6288, 0x4f08cff205de9058, 0xc87e668f76634f31,
+ 0x3a524551fcb58fc8, 0xbd24ec2c8f0850a1, 0x006631f84359a271, 0x8710988530e47d18,
+ 0x4e3aac02836dd4ba, 0xc94c057ff0d00bd3, 0x740ed8ab3c81f903, 0xf37871d64f3c266a,
+ 0xd28397f70305392c, 0x55f53e8a70b8e645, 0xe8b7e35ebce91495, 0x6fc14a23cf54cbfc,
+ 0xa6eb7ea47cdd625e, 0x219dd7d90f60bd37, 0x9cdf0a0dc3314fe7, 0x1ba9a370b08c908e,
+ 0xdf28c64f5b43716b, 0x585e6f3228feae02, 0xe51cb2e6e4af5cd2, 0x626a1b9b971283bb,
+ 0xab402f1c249b2a19, 0x2c3686615726f570, 0x91745bb59b7707a0, 0x1602f2c8e8cad8c9,
+ 0x37f914e9a4f3c78f, 0xb08fbd94d74e18e6, 0x0dcd60401b1fea36, 0x8abbc93d68a2355f,
+ 0x4391fdbadb2b9cfd, 0xc4e754c7a8964394, 0x79a5891364c7b144, 0xfed3206e177a6e2d,
+ 0xc47e653febcfe1e5, 0x4308cc4298723e8c, 0xfe4a11965423cc5c, 0x793cb8eb279e1335,
+ 0xb0168c6c9417ba97, 0x37602511e7aa65fe, 0x8a22f8c52bfb972e, 0x0d5451b858464847,
+ 0x2cafb799147f5701, 0xabd91ee467c28868, 0x169bc330ab937ab8, 0x91ed6a4dd82ea5d1,
+ 0x58c75eca6ba70c73, 0xdfb1f7b7181ad31a, 0x62f32a63d44b21ca, 0xe585831ea7f6fea3,
+ 0x2104e6214c391f46, 0xa6724f5c3f84c02f, 0x1b309288f3d532ff, 0x9c463bf58068ed96,
+ 0x556c0f7233e14434, 0xd21aa60f405c9b5d, 0x6f587bdb8c0d698d, 0xe82ed2a6ffb0b6e4,
+ 0xc9d53487b389a9a2, 0x4ea39dfac03476cb, 0xf3e1402e0c65841b, 0x7497e9537fd85b72,
+ 0xbdbdddd4cc51f2d0, 0x3acb74a9bfec2db9, 0x8789a97d73bddf69, 0x00ff000000000000},
+ {0xc4404010dcd9d394, 0x3b2e0e0f9299eb2a, 0x0e45fa7d18ce3183, 0xf12bb462568e093d,
+ 0x649212980c6184d1, 0x9bfc5c874221bc6f, 0xae97a8f5c87666c6, 0x51f9e6ea86365e78,
+ 0xb13dc352253eee75, 0x4e538d4d6b7ed6cb, 0x7b38793fe1290c62, 0x84563720af6934dc,
+ 0x11ef91daf586b930, 0xee81dfc5bbc6818e, 0xdbea2bb731915b27, 0x248465a87fd16399,
+ 0x2ebb46952f17a856, 0xd1d5088a615790e8, 0xe4befcf8eb004a41, 0x1bd0b2e7a54072ff,
+ 0x8e69141dffafff13, 0x71075a02b1efc7ad, 0x446cae703bb81d04, 0xbb02e06f75f825ba,
+ 0x5bc6c5d7d6f095b7, 0xa4a88bc898b0ad09, 0x91c37fba12e777a0, 0x6ead31a55ca74f1e,
+ 0xfb14975f0648c2f2, 0x047ad9404808fa4c, 0x31112d32c25f20e5, 0xce7f632d8c1f185b,
+ 0x256f6b4863d2b77b, 0xda0125572d928fc5, 0xef6ad125a7c5556c, 0x10049f3ae9856dd2,
+ 0x85bd39c0b36ae03e, 0x7ad377dffd2ad880, 0x4fb883ad777d0229, 0xb0d6cdb2393d3a97,
+ 0x5012e80a9a358a9a, 0xaf7ca615d475b224, 0x9a1752675e22688d, 0x65791c7810625033,
+ 0xf0c0ba824a8ddddf, 0x0faef49d04cde561, 0x3ac500ef8e9a3fc8, 0xc5ab4ef0c0da0776,
+ 0xcf946dcd901cccb9, 0x30fa23d2de5cf407, 0x0591d7a0540b2eae, 0xfaff99bf1a4b1610,
+ 0x6f463f4540a49bfc, 0x9028715a0ee4a342, 0xa543852884b379eb, 0x5a2dcb37caf34155,
+ 0xbae9ee8f69fbf158, 0x4587a09027bbc9e6, 0x70ec54e2adec134f, 0x8f821afde3ac2bf1,
+ 0x1a3bbc07b943a61d, 0xe555f218f7039ea3, 0xd03e066a7d54440a, 0x2f50487533147cb4,
+ 0x32c730f2fa588921, 0xcda97eedb418b19f, 0xf8c28a9f3e4f6b36, 0x07acc480700f5388,
+ 0x9215627a2ae0de64, 0x6d7b2c6564a0e6da, 0x5810d817eef73c73, 0xa77e9608a0b704cd,
+ 0x47bab3b003bfb4c0, 0xb8d4fdaf4dff8c7e, 0x8dbf09ddc7a856d7, 0x72d147c289e86e69,
+ 0xe768e138d307e385, 0x1806af279d47db3b, 0x2d6d5b5517100192, 0xd203154a5950392c,
+ 0xd83c36770996f2e3, 0x2752786847d6ca5d, 0x12398c1acd8110f4, 0xed57c20583c1284a,
+ 0x78ee64ffd92ea5a6, 0x87802ae0976e9d18, 0xb2ebde921d3947b1, 0x4d85908d53797f0f,
+ 0xad41b535f071cf02, 0x522ffb2abe31f7bc, 0x67440f5834662d15, 0x982a41477a2615ab,
+ 0x0d93e7bd20c99847, 0xf2fda9a26e89a0f9, 0xc7965dd0e4de7a50, 0x38f813cfaa9e42ee,
+ 0xd3e81baa4553edce, 0x2c8655b50b13d570, 0x19eda1c781440fd9, 0xe683efd8cf043767,
+ 0x733a492295ebba8b, 0x8c54073ddbab8235, 0xb93ff34f51fc589c, 0x4651bd501fbc6022,
+ 0xa69598e8bcb4d02f, 0x59fbd6f7f2f4e891, 0x6c90228578a33238, 0x93fe6c9a36e30a86,
+ 0x0647ca606c0c876a, 0xf929847f224cbfd4, 0xcc42700da81b657d, 0x332c3e12e65b5dc3,
+ 0x39131d2fb69d960c, 0xc67d5330f8ddaeb2, 0xf316a742728a741b, 0x0c78e95d3cca4ca5,
+ 0x99c14fa76625c149, 0x66af01b82865f9f7, 0x53c4f5caa232235e, 0xacaabbd5ec721be0,
+ 0x4c6e9e6d4f7aabed, 0xb300d072013a9353, 0x866b24008b6d49fa, 0x79056a1fc52d7144,
+ 0xecbccce59fc2fca8, 0x13d282fad182c416, 0x26b976885bd51ebf, 0xd9d7389715952601,
+ 0x1d978787c94cf595, 0xe2f9c998870ccd2b, 0xd7923dea0d5b1782, 0x28fc73f5431b2f3c,
+ 0xbd45d50f19f4a2d0, 0x422b9b1057b49a6e, 0x77406f62dde340c7, 0x882e217d93a37879,
+ 0x68ea04c530abc874, 0x97844ada7eebf0ca, 0xa2efbea8f4bc2a63, 0x5d81f0b7bafc12dd,
+ 0xc838564de0139f31, 0x37561852ae53a78f, 0x023dec2024047d26, 0xfd53a23f6a444598,
+ 0xf76c81023a828e57, 0x0802cf1d74c2b6e9, 0x3d693b6ffe956c40, 0xc2077570b0d554fe,
+ 0x57bed38aea3ad912, 0xa8d09d95a47ae1ac, 0x9dbb69e72e2d3b05, 0x62d527f8606d03bb,
+ 0x82110240c365b3b6, 0x7d7f4c5f8d258b08, 0x4814b82d077251a1, 0xb77af6324932691f,
+ 0x22c350c813dde4f3, 0xddad1ed75d9ddc4d, 0xe8c6eaa5d7ca06e4, 0x17a8a4ba998a3e5a,
+ 0xfcb8acdf7647917a, 0x03d6e2c03807a9c4, 0x36bd16b2b250736d, 0xc9d358adfc104bd3,
+ 0x5c6afe57a6ffc63f, 0xa304b048e8bffe81, 0x966f443a62e82428, 0x69010a252ca81c96,
+ 0x89c52f9d8fa0ac9b, 0x76ab6182c1e09425, 0x43c095f04bb74e8c, 0xbcaedbef05f77632,
+ 0x29177d155f18fbde, 0xd679330a1158c360, 0xe312c7789b0f19c9, 0x1c7c8967d54f2177,
+ 0x1643aa5a8589eab8, 0xe92de445cbc9d206, 0xdc461037419e08af, 0x23285e280fde3011,
+ 0xb691f8d25531bdfd, 0x49ffb6cd1b718543, 0x7c9442bf91265fea, 0x83fa0ca0df666754,
+ 0x633e29187c6ed759, 0x9c506707322eefe7, 0xa93b9375b879354e, 0x5655dd6af6390df0,
+ 0xc3ec7b90acd6801c, 0x3c82358fe296b8a2, 0x09e9c1fd68c1620b, 0xf6878fe226815ab5,
+ 0xeb10f765efcdaf20, 0x147eb97aa18d979e, 0x21154d082bda4d37, 0xde7b0317659a7589,
+ 0x4bc2a5ed3f75f865, 0xb4acebf27135c0db, 0x81c71f80fb621a72, 0x7ea9519fb52222cc,
+ 0x9e6d7427162a92c1, 0x61033a38586aaa7f, 0x5468ce4ad23d70d6, 0xab0680559c7d4868,
+ 0x3ebf26afc692c584, 0xc1d168b088d2fd3a, 0xf4ba9cc202852793, 0x0bd4d2dd4cc51f2d,
+ 0x01ebf1e01c03d4e2, 0xfe85bfff5243ec5c, 0xcbee4b8dd81436f5, 0x3480059296540e4b,
+ 0xa139a368ccbb83a7, 0x5e57ed7782fbbb19, 0x6b3c190508ac61b0, 0x9452571a46ec590e,
+ 0x749672a2e5e4e903, 0x8bf83cbdaba4d1bd, 0xbe93c8cf21f30b14, 0x41fd86d06fb333aa,
+ 0xd444202a355cbe46, 0x2b2a6e357b1c86f8, 0x1e419a47f14b5c51, 0xe12fd458bf0b64ef,
+ 0x0a3fdc3d50c6cbcf, 0xf55192221e86f371, 0xc03a665094d129d8, 0x3f54284fda911166,
+ 0xaaed8eb5807e9c8a, 0x5583c0aace3ea434, 0x60e834d844697e9d, 0x9f867ac70a294623,
+ 0x7f425f7fa921f62e, 0x802c1160e761ce90, 0xb547e5126d361439, 0x4a29ab0d23762c87,
+ 0xdf900df77999a16b, 0x20fe43e837d999d5, 0x1595b79abd8e437c, 0xeafbf985f3ce7bc2,
+ 0xe0c4dab8a308b00d, 0x1faa94a7ed4888b3, 0x2ac160d5671f521a, 0xd5af2eca295f6aa4,
+ 0x4016883073b0e748, 0xbf78c62f3df0dff6, 0x8a13325db7a7055f, 0x757d7c42f9e73de1,
+ 0x95b959fa5aef8dec, 0x6ad717e514afb552, 0x5fbce3979ef86ffb, 0xa0d2ad88d0b85745,
+ 0x356b0b728a57daa9, 0xca05456dc417e217, 0xff6eb11f4e4038be, 0x0000ff0000000000},
+ {0x2b2ac921ac68c968, 0xa93bdd5d1691aa6e, 0x1bd1c78b810d9c0f, 0x99c0d3f73bf4ff09,
+ 0x4adcd475f6a263a6, 0xc8cdc0094c5b00a0, 0x7a27dadfdbc736c1, 0xf836cea3613e55c7,
+ 0xe8c6f38919fd9cf4, 0x6ad7e7f5a304fff2, 0xd83dfd233498c993, 0x5a2ce95f8e61aa95,
+ 0x8930eedd4337363a, 0x0b21faa1f9ce553c, 0xb9cbe0776e52635d, 0x3bdaf40bd4ab005b,
+ 0x982b9a239fd5f13b, 0x1a3a8e5f252c923d, 0xa8d09489b2b0a45c, 0x2ac180f50849c75a,
+ 0xf9dd8777c51f5bf5, 0x7bcc930b7fe638f3, 0xc92689dde87a0e92, 0x4b379da152836d94,
+ 0x5bc7a08b2a40a4a7, 0xd9d6b4f790b9c7a1, 0x6b3cae210725f1c0, 0xe92dba5dbddc92c6,
+ 0x3a31bddf708a0e69, 0xb820a9a3ca736d6f, 0x0acab3755def5b0e, 0x88dba709e7163808,
+ 0x79f1497693852aa5, 0xfbe05d0a297c49a3, 0x490a47dcbee07fc2, 0xcb1b53a004191cc4,
+ 0x18075422c94f806b, 0x9a16405e73b6e36d, 0x28fc5a88e42ad50c, 0xaaed4ef45ed3b60a,
+ 0xba1d73de26107f39, 0x380c67a29ce91c3f, 0x8ae67d740b752a5e, 0x08f76908b18c4958,
+ 0xdbeb6e8a7cdad5f7, 0x59fa7af6c623b6f1, 0xeb10602051bf8090, 0x6901745ceb46e396,
+ 0xcaf01a74a03812f6, 0x48e10e081ac171f0, 0xfa0b14de8d5d4791, 0x781a00a237a42497,
+ 0xab060720faf2b838, 0x2917135c400bdb3e, 0x9bfd098ad797ed5f, 0x19ec1df66d6e8e59,
+ 0x091c20dc15ad476a, 0x8b0d34a0af54246c, 0x39e72e7638c8120d, 0xbbf63a0a8231710b,
+ 0x68ea3d884f67eda4, 0xeafb29f4f59e8ea2, 0x581133226202b8c3, 0xda00275ed8fbdbc5,
+ 0x8e9dc98fd3b30ef2, 0x0c8cddf3694a6df4, 0xbe66c725fed65b95, 0x3c77d359442f3893,
+ 0xef6bd4db8979a43c, 0x6d7ac0a73380c73a, 0xdf90da71a41cf15b, 0x5d81ce0d1ee5925d,
+ 0x4d71f32766265b6e, 0xcf60e75bdcdf3868, 0x7d8afd8d4b430e09, 0xff9be9f1f1ba6d0f,
+ 0x2c87ee733cecf1a0, 0xae96fa0f861592a6, 0x1c7ce0d91189a4c7, 0x9e6df4a5ab70c7c1,
+ 0x3d9c9a8de00e36a1, 0xbf8d8ef15af755a7, 0x0d679427cd6b63c6, 0x8f76805b779200c0,
+ 0x5c6a87d9bac49c6f, 0xde7b93a5003dff69, 0x6c91897397a1c908, 0xee809d0f2d58aa0e,
+ 0xfe70a025559b633d, 0x7c61b459ef62003b, 0xce8bae8f78fe365a, 0x4c9abaf3c207555c,
+ 0x9f86bd710f51c9f3, 0x1d97a90db5a8aaf5, 0xaf7db3db22349c94, 0x2d6ca7a798cdff92,
+ 0xdc4649d8ec5eed3f, 0x5e575da456a78e39, 0xecbd4772c13bb858, 0x6eac530e7bc2db5e,
+ 0xbdb0548cb69447f1, 0x3fa140f00c6d24f7, 0x8d4b5a269bf11296, 0x0f5a4e5a21087190,
+ 0x1faa737059cbb8a3, 0x9dbb670ce332dba5, 0x2f517dda74aeedc4, 0xad4069a6ce578ec2,
+ 0x7e5c6e240301126d, 0xfc4d7a58b9f8716b, 0x4ea7608e2e64470a, 0xccb674f2949d240c,
+ 0x6f471adadfe3d56c, 0xed560ea6651ab66a, 0x5fbc1470f286800b, 0xddad000c487fe30d,
+ 0x0eb1078e85297fa2, 0x8ca013f23fd01ca4, 0x3e4a0924a84c2ac5, 0xbc5b1d5812b549c3,
+ 0xacab20726a7680f0, 0x2eba340ed08fe3f6, 0x9c502ed84713d597, 0x1e413aa4fdeab691,
+ 0xcd5d3d2630bc2a3e, 0x4f4c295a8a454938, 0xfda6338c1dd97f59, 0x7fb727f0a7201c5f,
+ 0x549dee2e0b48d537, 0xd68cfa52b1b1b631, 0x6466e084262d8050, 0xe677f4f89cd4e356,
+ 0x356bf37a51827ff9, 0xb77ae706eb7b1cff, 0x0590fdd07ce72a9e, 0x8781e9acc61e4998,
+ 0x9771d486bedd80ab, 0x1560c0fa0424e3ad, 0xa78ada2c93b8d5cc, 0x259bce502941b6ca,
+ 0xf687c9d2e4172a65, 0x7496ddae5eee4963, 0xc67cc778c9727f02, 0x446dd304738b1c04,
+ 0xe79cbd2c38f5ed64, 0x658da950820c8e62, 0xd767b3861590b803, 0x5576a7faaf69db05,
+ 0x866aa078623f47aa, 0x047bb404d8c624ac, 0xb691aed24f5a12cd, 0x3480baaef5a371cb,
+ 0x247087848d60b8f8, 0xa66193f83799dbfe, 0x148b892ea005ed9f, 0x969a9d521afc8e99,
+ 0x45869ad0d7aa1236, 0xc7978eac6d537130, 0x757d947afacf4751, 0xf76c800640362457,
+ 0x06466e7934a536fa, 0x84577a058e5c55fc, 0x36bd60d319c0639d, 0xb4ac74afa339009b,
+ 0x67b0732d6e6f9c34, 0xe5a16751d496ff32, 0x574b7d87430ac953, 0xd55a69fbf9f3aa55,
+ 0xc5aa54d181306366, 0x47bb40ad3bc90060, 0xf5515a7bac553601, 0x77404e0716ac5507,
+ 0xa45c4985dbfac9a8, 0x264d5df96103aaae, 0x94a7472ff69f9ccf, 0x16b653534c66ffc9,
+ 0xb5473d7b07180ea9, 0x37562907bde16daf, 0x85bc33d12a7d5bce, 0x07ad27ad908438c8,
+ 0xd4b1202f5dd2a467, 0x56a03453e72bc761, 0xe44a2e8570b7f100, 0x665b3af9ca4e9206,
+ 0x76ab07d3b28d5b35, 0xf4ba13af08743833, 0x465009799fe80e52, 0xc4411d0525116d54,
+ 0x175d1a87e847f1fb, 0x954c0efb52be92fd, 0x27a6142dc522a49c, 0xa5b700517fdbc79a,
+ 0xf12aee80749312ad, 0x733bfafcce6a71ab, 0xc1d1e02a59f647ca, 0x43c0f456e30f24cc,
+ 0x90dcf3d42e59b863, 0x12cde7a894a0db65, 0xa027fd7e033ced04, 0x2236e902b9c58e02,
+ 0x32c6d428c1064731, 0xb0d7c0547bff2437, 0x023dda82ec631256, 0x802ccefe569a7150,
+ 0x5330c97c9bccedff, 0xd121dd0021358ef9, 0x63cbc7d6b6a9b898, 0xe1dad3aa0c50db9e,
+ 0x422bbd82472e2afe, 0xc03aa9fefdd749f8, 0x72d0b3286a4b7f99, 0xf0c1a754d0b21c9f,
+ 0x23dda0d61de48030, 0xa1ccb4aaa71de336, 0x1326ae7c3081d557, 0x9137ba008a78b651,
+ 0x81c7872af2bb7f62, 0x03d6935648421c64, 0xb13c8980dfde2a05, 0x332d9dfc65274903,
+ 0xe0319a7ea871d5ac, 0x62208e021288b6aa, 0xd0ca94d4851480cb, 0x52db80a83fede3cd,
+ 0xa3f16ed74b7ef160, 0x21e07aabf1879266, 0x930a607d661ba407, 0x111b7401dce2c701,
+ 0xc207738311b45bae, 0x401667ffab4d38a8, 0xf2fc7d293cd10ec9, 0x70ed695586286dcf,
+ 0x601d547ffeeba4fc, 0xe20c40034412c7fa, 0x50e65ad5d38ef19b, 0xd2f74ea96977929d,
+ 0x01eb492ba4210e32, 0x83fa5d571ed86d34, 0x3110478189445b55, 0xb30153fd33bd3853,
+ 0x10f03dd578c3c933, 0x92e129a9c23aaa35, 0x200b337f55a69c54, 0xa21a2703ef5fff52,
+ 0x71062081220963fd, 0xf31734fd98f000fb, 0x41fd2e2b0f6c369a, 0xc3ec3a57b595559c,
+ 0xd31c077dcd569caf, 0x510d130177afffa9, 0xe3e709d7e033c9c8, 0x61f61dab5acaaace,
+ 0xb2ea1a29979c3661, 0x30fb0e552d655567, 0x82111483baf96306, 0x000000ff00000000},
+ {0x80ace2b722aa64d1, 0xb791f740a63a39cf, 0xeed6c9582b8adeed, 0xd9ebdcafaf1a83f3,
+ 0x5c58b56930eb10a9, 0x6b65a09eb47b4db7, 0x32229e8639cbaa95, 0x051f8b71bd5bf78b,
+ 0x0d9d6b585ebf1f4a, 0x3aa07eafda2f4254, 0x63e740b7579fa576, 0x54da5540d30ff868,
+ 0xd1693c864cfe6b32, 0xe6542971c86e362c, 0xbf13176945ded10e, 0x882e029ec14e8c10,
+ 0xae16d73a8217008c, 0x992bc2cd06875d92, 0xc06cfcd58b37bab0, 0xf751e9220fa7e7ae,
+ 0x72e280e4905674f4, 0x45df951314c629ea, 0x1c98ab0b9976cec8, 0x2ba5befc1de693d6,
+ 0x23275ed5fe027b17, 0x141a4b227a922609, 0x4d5d753af722c12b, 0x7a6060cd73b29c35,
+ 0xffd3090bec430f6f, 0xc8ee1cfc68d35271, 0x91a922e4e563b553, 0xa694371361f3e84d,
+ 0xddd889ac63d0ac6b, 0xeae59c5be740f175, 0xb3a2a2436af01657, 0x849fb7b4ee604b49,
+ 0x012cde727191d813, 0x3611cb85f501850d, 0x6f56f59d78b1622f, 0x586be06afc213f31,
+ 0x50e900431fc5d7f0, 0x67d415b49b558aee, 0x3e932bac16e56dcc, 0x09ae3e5b927530d2,
+ 0x8c1d579d0d84a388, 0xbb20426a8914fe96, 0xe2677c7204a419b4, 0xd55a6985803444aa,
+ 0xf362bc21c36dc836, 0xc45fa9d647fd9528, 0x9d1897ceca4d720a, 0xaa2582394edd2f14,
+ 0x2f96ebffd12cbc4e, 0x18abfe0855bce150, 0x41ecc010d80c0672, 0x76d1d5e75c9c5b6c,
+ 0x7e5335cebf78b3ad, 0x496e20393be8eeb3, 0x10291e21b6580991, 0x27140bd632c8548f,
+ 0xa2a76210ad39c7d5, 0x959a77e729a99acb, 0xccdd49ffa4197de9, 0xfbe05c08208920f7,
+ 0x3a443481a05ff5a5, 0x0d79217624cfa8bb, 0x543e1f6ea97f4f99, 0x63030a992def1287,
+ 0xe6b0635fb21e81dd, 0xd18d76a8368edcc3, 0x88ca48b0bb3e3be1, 0xbff75d473fae66ff,
+ 0xb775bd6edc4a8e3e, 0x8048a89958dad320, 0xd90f9681d56a3402, 0xee32837651fa691c,
+ 0x6b81eab0ce0bfa46, 0x5cbcff474a9ba758, 0x05fbc15fc72b407a, 0x32c6d4a843bb1d64,
+ 0x14fe010c00e291f8, 0x23c314fb8472cce6, 0x7a842ae309c22bc4, 0x4db93f148d5276da,
+ 0xc80a56d212a3e580, 0xff3743259633b89e, 0xa6707d3d1b835fbc, 0x914d68ca9f1302a2,
+ 0x99cf88e37cf7ea63, 0xaef29d14f867b77d, 0xf7b5a30c75d7505f, 0xc088b6fbf1470d41,
+ 0x453bdf3d6eb69e1b, 0x7206cacaea26c305, 0x2b41f4d267962427, 0x1c7ce125e3067939,
+ 0x67305f9ae1253d1f, 0x500d4a6d65b56001, 0x094a7475e8058723, 0x3e7761826c95da3d,
+ 0xbbc40844f3644967, 0x8cf91db377f41479, 0xd5be23abfa44f35b, 0xe283365c7ed4ae45,
+ 0xea01d6759d304684, 0xdd3cc38219a01b9a, 0x847bfd9a9410fcb8, 0xb346e86d1080a1a6,
+ 0x36f581ab8f7132fc, 0x01c8945c0be16fe2, 0x588faa44865188c0, 0x6fb2bfb302c1d5de,
+ 0x498a6a1741985942, 0x7eb77fe0c508045c, 0x27f041f848b8e37e, 0x10cd540fcc28be60,
+ 0x957e3dc953d92d3a, 0xa243283ed7497024, 0xfb0416265af99706, 0xcc3903d1de69ca18,
+ 0xc4bbe3f83d8d22d9, 0xf386f60fb91d7fc7, 0xaac1c81734ad98e5, 0x9dfcdde0b03dc5fb,
+ 0x184fb4262fcc56a1, 0x2f72a1d1ab5c0bbf, 0x76359fc926ecec9d, 0x41088a3ea27cb183,
+ 0xc1a468897fd6d552, 0xf6997d7efb46884c, 0xafde436676f66f6e, 0x98e35691f2663270,
+ 0x1d503f576d97a12a, 0x2a6d2aa0e907fc34, 0x732a14b864b71b16, 0x4417014fe0274608,
+ 0x4c95e16603c3aec9, 0x7ba8f4918753f3d7, 0x22efca890ae314f5, 0x15d2df7e8e7349eb,
+ 0x9061b6b81182dab1, 0xa75ca34f951287af, 0xfe1b9d5718a2608d, 0xc92688a09c323d93,
+ 0xef1e5d04df6bb10f, 0xd82348f35bfbec11, 0x816476ebd64b0b33, 0xb659631c52db562d,
+ 0x33ea0adacd2ac577, 0x04d71f2d49ba9869, 0x5d902135c40a7f4b, 0x6aad34c2409a2255,
+ 0x622fd4eba37eca94, 0x5512c11c27ee978a, 0x0c55ff04aa5e70a8, 0x3b68eaf32ece2db6,
+ 0xbedb8335b13fbeec, 0x89e696c235afe3f2, 0xd0a1a8dab81f04d0, 0xe79cbd2d3c8f59ce,
+ 0x9cd003923eac1de8, 0xabed1665ba3c40f6, 0xf2aa287d378ca7d4, 0xc5973d8ab31cfaca,
+ 0x4024544c2ced6990, 0x771941bba87d348e, 0x2e5e7fa325cdd3ac, 0x19636a54a15d8eb2,
+ 0x11e18a7d42b96673, 0x26dc9f8ac6293b6d, 0x7f9ba1924b99dc4f, 0x48a6b465cf098151,
+ 0xcd15dda350f8120b, 0xfa28c854d4684f15, 0xa36ff64c59d8a837, 0x9452e3bbdd48f529,
+ 0xb26a361f9e1179b5, 0x855723e81a8124ab, 0xdc101df09731c389, 0xeb2d080713a19e97,
+ 0x6e9e61c18c500dcd, 0x59a3743608c050d3, 0x00e44a2e8570b7f1, 0x37d95fd901e0eaef,
+ 0x3f5bbff0e204022e, 0x0866aa0766945f30, 0x5121941feb24b812, 0x661c81e86fb4e50c,
+ 0xe3afe82ef0457656, 0xd492fdd974d52b48, 0x8dd5c3c1f965cc6a, 0xbae8d6367df59174,
+ 0x7b4cbebffd234426, 0x4c71ab4879b31938, 0x15369550f403fe1a, 0x220b80a77093a304,
+ 0xa7b8e961ef62305e, 0x9085fc966bf26d40, 0xc9c2c28ee6428a62, 0xfeffd77962d2d77c,
+ 0xf67d375081363fbd, 0xc14022a705a662a3, 0x98071cbf88168581, 0xaf3a09480c86d89f,
+ 0x2a89608e93774bc5, 0x1db4757917e716db, 0x44f34b619a57f1f9, 0x73ce5e961ec7ace7,
+ 0x55f68b325d9e207b, 0x62cb9ec5d90e7d65, 0x3b8ca0dd54be9a47, 0x0cb1b52ad02ec759,
+ 0x8902dcec4fdf5403, 0xbe3fc91bcb4f091d, 0xe778f70346ffee3f, 0xd045e2f4c26fb321,
+ 0xd8c702dd218b5be0, 0xeffa172aa51b06fe, 0xb6bd293228abe1dc, 0x81803cc5ac3bbcc2,
+ 0x0433550333ca2f98, 0x330e40f4b75a7286, 0x6a497eec3aea95a4, 0x5d746b1bbe7ac8ba,
+ 0x2638d5a4bc598c9c, 0x1105c05338c9d182, 0x4842fe4bb57936a0, 0x7f7febbc31e96bbe,
+ 0xfacc827aae18f8e4, 0xcdf1978d2a88a5fa, 0x94b6a995a73842d8, 0xa38bbc6223a81fc6,
+ 0xab095c4bc04cf707, 0x9c3449bc44dcaa19, 0xc57377a4c96c4d3b, 0xf24e62534dfc1025,
+ 0x77fd0b95d20d837f, 0x40c01e62569dde61, 0x1987207adb2d3943, 0x2eba358d5fbd645d,
+ 0x0882e0291ce4e8c1, 0x3fbff5de9874b5df, 0x66f8cbc615c452fd, 0x51c5de3191540fe3,
+ 0xd476b7f70ea59cb9, 0xe34ba2008a35c1a7, 0xba0c9c1807852685, 0x8d3189ef83157b9b,
+ 0x85b369c660f1935a, 0xb28e7c31e461ce44, 0xebc9422969d12966, 0xdcf457deed417478,
+ 0x59473e1872b0e722, 0x6e7a2beff620ba3c, 0x373d15f77b905d1e, 0x00000000ff000000},
+ {0x4a38ea85d98ca846, 0xa34cc0fc36880d92, 0xac0998255f127085, 0x457db25cb016d551,
+ 0xb28329978c268aab, 0x5bf703ee63222f7f, 0x54b25b370ab85268, 0xbdc6714ee5bcf7bc,
+ 0x8f964af22a4f7ef7, 0x66e2608bc54bdb23, 0x69a73852acd1a634, 0x80d3122b43d503e0,
+ 0x772d89e07fe55c1a, 0x9e59a39990e1f9ce, 0x911cfb40f97b84d9, 0x7868d139167f210d,
+ 0xf5bc8c39669c964f, 0x1cc8a6408998339b, 0x138dfe99e0024e8c, 0xfaf9d4e00f06eb58,
+ 0x0d074f2b3336b4a2, 0xe4736552dc321176, 0xeb363d8bb5a86c61, 0x024217f25aacc9b5,
+ 0x30122c4e955f40fe, 0xd96606377a5be52a, 0xd6235eee13c1983d, 0x3f577497fcc53de9,
+ 0xc8a9ef5cc0f56213, 0x21ddc5252ff1c7c7, 0x2e989dfc466bbad0, 0xc7ecb785a96f1f04,
+ 0x01e901afff3b473f, 0xe89d2bd6103fe2eb, 0xe7d8730f79a59ffc, 0x0eac597696a13a28,
+ 0xf952c2bdaa9165d2, 0x1026e8c44595c006, 0x1f63b01d2c0fbd11, 0xf6179a64c30b18c5,
+ 0xc447a1d80cf8918e, 0x2d338ba1e3fc345a, 0x2276d3788a66494d, 0xcb02f9016562ec99,
+ 0x3cfc62ca5952b363, 0xd58848b3b65616b7, 0xdacd106adfcc6ba0, 0x33b93a1330c8ce74,
+ 0xbe6d6713402b7936, 0x57194d6aaf2fdce2, 0x585c15b3c6b5a1f5, 0xb1283fca29b10421,
+ 0x46d6a40115815bdb, 0xafa28e78fa85fe0f, 0xa0e7d6a1931f8318, 0x4993fcd87c1b26cc,
+ 0x7bc3c764b3e8af87, 0x92b7ed1d5cec0a53, 0x9df2b5c435767744, 0x74869fbdda72d290,
+ 0x83780476e6428d6a, 0x6a0c2e0f094628be, 0x654976d660dc55a9, 0x8c3d5caf8fd8f07d,
+ 0xdd9b3cd194e376b4, 0x34ef16a87be7d360, 0x3baa4e71127dae77, 0xd2de6408fd790ba3,
+ 0x2520ffc3c1495459, 0xcc54d5ba2e4df18d, 0xc3118d6347d78c9a, 0x2a65a71aa8d3294e,
+ 0x18359ca66720a005, 0xf141b6df882405d1, 0xfe04ee06e1be78c6, 0x1770c47f0ebadd12,
+ 0xe08e5fb4328a82e8, 0x09fa75cddd8e273c, 0x06bf2d14b4145a2b, 0xefcb076d5b10ffff,
+ 0x621f5a6d2bf348bd, 0x8b6b7014c4f7ed69, 0x842e28cdad6d907e, 0x6d5a02b4426935aa,
+ 0x9aa4997f7e596a50, 0x73d0b306915dcf84, 0x7c95ebdff8c7b293, 0x95e1c1a617c31747,
+ 0xa7b1fa1ad8309e0c, 0x4ec5d06337343bd8, 0x418088ba5eae46cf, 0xa8f4a2c3b1aae31b,
+ 0x5f0a39088d9abce1, 0xb67e1371629e1935, 0xb93b4ba80b046422, 0x504f61d1e400c1f6,
+ 0x964ad7fbb25499cd, 0x7f3efd825d503c19, 0x707ba55b34ca410e, 0x990f8f22dbcee4da,
+ 0x6ef114e9e7febb20, 0x87853e9008fa1ef4, 0x88c06649616063e3, 0x61b44c308e64c637,
+ 0x53e4778c41974f7c, 0xba905df5ae93eaa8, 0xb5d5052cc70997bf, 0x5ca12f55280d326b,
+ 0xab5fb49e143d6d91, 0x422b9ee7fb39c845, 0x4d6ec63e92a3b552, 0xa41aec477da71086,
+ 0x29ceb1470d44a7c4, 0xc0ba9b3ee2400210, 0xcfffc3e78bda7f07, 0x268be99e64dedad3,
+ 0xd175725558ee8529, 0x3801582cb7ea20fd, 0x374400f5de705dea, 0xde302a8c3174f83e,
+ 0xec601130fe877175, 0x05143b491183d4a1, 0x0a5163907819a9b6, 0xe32549e9971d0c62,
+ 0x14dbd222ab2d5398, 0xfdaff85b4429f64c, 0xf2eaa0822db38b5b, 0x1b9e8afbc2b72e8f,
+ 0x51a6607e1bc486c9, 0xb8d24a07f4c0231d, 0xb79712de9d5a5e0a, 0x5ee338a7725efbde,
+ 0xa91da36c4e6ea424, 0x40698915a16a01f0, 0x4f2cd1ccc8f07ce7, 0xa658fbb527f4d933,
+ 0x9408c009e8075078, 0x7d7cea700703f5ac, 0x7239b2a96e9988bb, 0x9b4d98d0819d2d6f,
+ 0x6cb3031bbdad7295, 0x85c7296252a9d741, 0x8a8271bb3b33aa56, 0x63f65bc2d4370f82,
+ 0xee2206c2a4d4b8c0, 0x07562cbb4bd01d14, 0x08137462224a6003, 0xe1675e1bcd4ec5d7,
+ 0x1699c5d0f17e9a2d, 0xffedefa91e7a3ff9, 0xf0a8b77077e042ee, 0x19dc9d0998e4e73a,
+ 0x2b8ca6b557176e71, 0xc2f88cccb813cba5, 0xcdbdd415d189b6b2, 0x24c9fe6c3e8d1366,
+ 0xd33765a702bd4c9c, 0x3a434fdeedb9e948, 0x350617078423945f, 0xdc723d7e6b27318b,
+ 0x1a778b543d7369b0, 0xf303a12dd277cc64, 0xfc46f9f4bbedb173, 0x1532d38d54e914a7,
+ 0xe2cc484668d94b5d, 0x0bb8623f87ddee89, 0x04fd3ae6ee47939e, 0xed89109f0143364a,
+ 0xdfd92b23ceb0bf01, 0x36ad015a21b41ad5, 0x39e85983482e67c2, 0xd09c73faa72ac216,
+ 0x2762e8319b1a9dec, 0xce16c248741e3838, 0xc1539a911d84452f, 0x2827b0e8f280e0fb,
+ 0xa5f3ede8826357b9, 0x4c87c7916d67f26d, 0x43c29f4804fd8f7a, 0xaab6b531ebf92aae,
+ 0x5d482efad7c97554, 0xb43c048338cdd080, 0xbb795c5a5157ad97, 0x520d7623be530843,
+ 0x605d4d9f71a08108, 0x892967e69ea424dc, 0x866c3f3ff73e59cb, 0x6f181546183afc1f,
+ 0x98e68e8d240aa3e5, 0x7192a4f4cb0e0631, 0x7ed7fc2da2947b26, 0x97a3d6544d90def2,
+ 0xc605b62a56ab583b, 0x2f719c53b9affdef, 0x2034c48ad03580f8, 0xc940eef33f31252c,
+ 0x3ebe753803017ad6, 0xd7ca5f41ec05df02, 0xd88f0798859fa215, 0x31fb2de16a9b07c1,
+ 0x03ab165da5688e8a, 0xeadf3c244a6c2b5e, 0xe59a64fd23f65649, 0x0cee4e84ccf2f39d,
+ 0xfb10d54ff0c2ac67, 0x1264ff361fc609b3, 0x1d21a7ef765c74a4, 0xf4558d969958d170,
+ 0x7981d096e9bb6632, 0x90f5faef06bfc3e6, 0x9fb0a2366f25bef1, 0x76c4884f80211b25,
+ 0x813a1384bc1144df, 0x684e39fd5315e10b, 0x670b61243a8f9c1c, 0x8e7f4b5dd58b39c8,
+ 0xbc2f70e11a78b083, 0x555b5a98f57c1557, 0x5a1e02419ce66840, 0xb36a283873e2cd94,
+ 0x4494b3f34fd2926e, 0xade0998aa0d637ba, 0xa2a5c153c94c4aad, 0x4bd1eb2a2648ef79,
+ 0x8dd45d00701cb742, 0x64a077799f181296, 0x6be52fa0f6826f81, 0x829105d91986ca55,
+ 0x756f9e1225b695af, 0x9c1bb46bcab2307b, 0x935eecb2a3284d6c, 0x7a2ac6cb4c2ce8b8,
+ 0x487afd7783df61f3, 0xa10ed70e6cdbc427, 0xae4b8fd70541b930, 0x473fa5aeea451ce4,
+ 0xb0c13e65d675431e, 0x59b5141c3971e6ca, 0x56f04cc550eb9bdd, 0xbf8466bcbfef3e09,
+ 0x32503bbccf0c894b, 0xdb2411c520082c9f, 0xd461491c49925188, 0x3d156365a696f45c,
+ 0xcaebf8ae9aa6aba6, 0x239fd2d775a20e72, 0x2cda8a0e1c387365, 0xc5aea077f33cd6b1,
+ 0xf7fe9bcb3ccf5ffa, 0x1e8ab1b2d3cbfa2e, 0x11cfe96bba518739, 0xf8bbc312555522ed,
+ 0x0f4558d969657d17, 0xe63172a08661d8c3, 0xe9742a79effba5d4, 0x0000000000ff0000},
+ {0xe0afe6b4079d05ba, 0x1cf2c142b8a83ccb, 0x2ccc8f0a2160e433, 0xd091a8fc9e55dd42,
+ 0x4cb0139b12f155c3, 0xb0ed346dadc46cb2, 0x80d37a25340cb44a, 0x7c8e5dd38b398d3b,
+ 0x8c492ab975d23623, 0x70140d4fcae70f52, 0x402a4307532fd7aa, 0xbc7764f1ec1aeedb,
+ 0x2056df9660be665a, 0xdc0bf860df8b5f2b, 0xec35b628464387d3, 0x106891def976bea2,
+ 0x39627eaee3036288, 0xc53f59585c365bf9, 0xf5011710c5fe8301, 0x095c30e67acbba70,
+ 0x957d8b81f66f32f1, 0x6920ac77495a0b80, 0x591ee23fd092d378, 0xa543c5c96fa7ea09,
+ 0x5584b2a3914c5111, 0xa9d995552e796860, 0x99e7db1db7b1b098, 0x65bafceb088489e9,
+ 0xf99b478c84200168, 0x05c6607a3b153819, 0x35f82e32a2dde0e1, 0xc9a509c41de8d990,
+ 0x67edf0d2963658b5, 0x9bb0d724290361c4, 0xab8e996cb0cbb93c, 0x57d3be9a0ffe804d,
+ 0xcbf205fd835a08cc, 0x37af220b3c6f31bd, 0x07916c43a5a7e945, 0xfbcc4bb51a92d034,
+ 0x0b0b3cdfe4796b2c, 0xf7561b295b4c525d, 0xc7685561c2848aa5, 0x3b3572977db1b3d4,
+ 0xa714c9f0f1153b55, 0x5b49ee064e200224, 0x6b77a04ed7e8dadc, 0x972a87b868dde3ad,
+ 0xbe2068c872a83f87, 0x427d4f3ecd9d06f6, 0x724301765455de0e, 0x8e1e2680eb60e77f,
+ 0x123f9de767c46ffe, 0xee62ba11d8f1568f, 0xde5cf45941398e77, 0x2201d3affe0cb706,
+ 0xd2c6a4c500e70c1e, 0x2e9b8333bfd2356f, 0x1ea5cd7b261aed97, 0xe2f8ea8d992fd4e6,
+ 0x7ed951ea158b5c67, 0x8284761caabe6516, 0xb2ba38543376bdee, 0x4ee71fa28c43849f,
+ 0xdaf2ec2a7c5c2ccf, 0x26afcbdcc36915be, 0x169185945aa1cd46, 0xeacca262e594f437,
+ 0x76ed190569307cb6, 0x8ab03ef3d60545c7, 0xba8e70bb4fcd9d3f, 0x46d3574df0f8a44e,
+ 0xb61420270e131f56, 0x4a4907d1b1262627, 0x7a77499928eefedf, 0x862a6e6f97dbc7ae,
+ 0x1a0bd5081b7f4f2f, 0xe656f2fea44a765e, 0xd668bcb63d82aea6, 0x2a359b4082b797d7,
+ 0x033f743098c24bfd, 0xff6253c627f7728c, 0xcf5c1d8ebe3faa74, 0x33013a78010a9305,
+ 0xaf20811f8dae1b84, 0x537da6e9329b22f5, 0x6343e8a1ab53fa0d, 0x9f1ecf571466c37c,
+ 0x6fd9b83dea8d7864, 0x93849fcb55b84115, 0xa3bad183cc7099ed, 0x5fe7f6757345a09c,
+ 0xc3c64d12ffe1281d, 0x3f9b6ae440d4116c, 0x0fa524acd91cc994, 0xf3f8035a6629f0e5,
+ 0x5db0fa4cedf771c0, 0xa1edddba52c248b1, 0x91d393f2cb0a9049, 0x6d8eb404743fa938,
+ 0xf1af0f63f89b21b9, 0x0df2289547ae18c8, 0x3dcc66ddde66c030, 0xc191412b6153f941,
+ 0x315636419fb84259, 0xcd0b11b7208d7b28, 0xfd355fffb945a3d0, 0x0168780906709aa1,
+ 0x9d49c36e8ad41220, 0x6114e49835e12b51, 0x512aaad0ac29f3a9, 0xad778d26131ccad8,
+ 0x847d6256096916f2, 0x782045a0b65c2f83, 0x481e0be82f94f77b, 0xb4432c1e90a1ce0a,
+ 0x286297791c05468b, 0xd43fb08fa3307ffa, 0xe401fec73af8a702, 0x185cd93185cd9e73,
+ 0xe89bae5b7b26256b, 0x14c689adc4131c1a, 0x24f8c7e55ddbc4e2, 0xd8a5e013e2eefd93,
+ 0x44845b746e4a7512, 0xb8d97c82d17f4c63, 0x88e732ca48b7949b, 0x74ba153cf782adea,
+ 0x9415f388f01f5750, 0x6848d47e4f2a6e21, 0x58769a36d6e2b6d9, 0xa42bbdc069d78fa8,
+ 0x380a06a7e5730729, 0xc45721515a463e58, 0xf4696f19c38ee6a0, 0x083448ef7cbbdfd1,
+ 0xf8f33f85825064c9, 0x04ae18733d655db8, 0x3490563ba4ad8540, 0xc8cd71cd1b98bc31,
+ 0x54eccaaa973c34b0, 0xa8b1ed5c28090dc1, 0x988fa314b1c1d539, 0x64d284e20ef4ec48,
+ 0x4dd86b9214813062, 0xb1854c64abb40913, 0x81bb022c327cd1eb, 0x7de625da8d49e89a,
+ 0xe1c79ebd01ed601b, 0x1d9ab94bbed8596a, 0x2da4f70327108192, 0xd1f9d0f59825b8e3,
+ 0x213ea79f66ce03fb, 0xdd638069d9fb3a8a, 0xed5dce214033e272, 0x1100e9d7ff06db03,
+ 0x8d2152b073a25382, 0x717c7546cc976af3, 0x41423b0e555fb20b, 0xbd1f1cf8ea6a8b7a,
+ 0x1357e5ee61b40a5f, 0xef0ac218de81332e, 0xdf348c504749ebd6, 0x2369aba6f87cd2a7,
+ 0xbf4810c174d85a26, 0x43153737cbed6357, 0x732b797f5225bbaf, 0x8f765e89ed1082de,
+ 0x7fb129e313fb39c6, 0x83ec0e15acce00b7, 0xb3d2405d3506d84f, 0x4f8f67ab8a33e13e,
+ 0xd3aedccc069769bf, 0x2ff3fb3ab9a250ce, 0x1fcdb572206a8836, 0xe39092849f5fb147,
+ 0xca9a7df4852a6d6d, 0x36c75a023a1f541c, 0x06f9144aa3d78ce4, 0xfaa433bc1ce2b595,
+ 0x668588db90463d14, 0x9ad8af2d2f730465, 0xaae6e165b6bbdc9d, 0x56bbc693098ee5ec,
+ 0xa67cb1f9f7655ef4, 0x5a21960f48506785, 0x6a1fd847d198bf7d, 0x9642ffb16ead860c,
+ 0x0a6344d6e2090e8d, 0xf63e63205d3c37fc, 0xc6002d68c4f4ef04, 0x3a5d0a9e7bc1d675,
+ 0xae48f9168bde7e25, 0x5215dee034eb4754, 0x622b90a8ad239fac, 0x9e76b75e1216a6dd,
+ 0x02570c399eb22e5c, 0xfe0a2bcf2187172d, 0xce346587b84fcfd5, 0x32694271077af6a4,
+ 0xc2ae351bf9914dbc, 0x3ef312ed46a474cd, 0x0ecd5ca5df6cac35, 0xf2907b5360599544,
+ 0x6eb1c034ecfd1dc5, 0x92ece7c253c824b4, 0xa2d2a98aca00fc4c, 0x5e8f8e7c7535c53d,
+ 0x7785610c6f401917, 0x8bd846fad0752066, 0xbbe608b249bdf89e, 0x47bb2f44f688c1ef,
+ 0xdb9a94237a2c496e, 0x27c7b3d5c519701f, 0x17f9fd9d5cd1a8e7, 0xeba4da6be3e49196,
+ 0x1b63ad011d0f2a8e, 0xe73e8af7a23a13ff, 0xd700c4bf3bf2cb07, 0x2b5de34984c7f276,
+ 0xb77c582e08637af7, 0x4b217fd8b7564386, 0x7b1f31902e9e9b7e, 0x8742166691aba20f,
+ 0x290aef701a75232a, 0xd557c886a5401a5b, 0xe56986ce3c88c2a3, 0x1934a13883bdfbd2,
+ 0x85151a5f0f197353, 0x79483da9b02c4a22, 0x497673e129e492da, 0xb52b541796d1abab,
+ 0x45ec237d683a10b3, 0xb9b1048bd70f29c2, 0x898f4ac34ec7f13a, 0x75d26d35f1f2c84b,
+ 0xe9f3d6527d5640ca, 0x15aef1a4c26379bb, 0x2590bfec5baba143, 0xd9cd981ae49e9832,
+ 0xf0c7776afeeb4418, 0x0c9a509c41de7d69, 0x3ca41ed4d816a591, 0xc0f9392267239ce0,
+ 0x5cd88245eb871461, 0xa085a5b354b22d10, 0x90bbebfbcd7af5e8, 0x6ce6cc0d724fcc99,
+ 0x9c21bb678ca47781, 0x607c9c9133914ef0, 0x5042d2d9aa599608, 0xac1ff52f156caf79,
+ 0x303e4e4899c827f8, 0xcc6369be26fd1e89, 0xfc5d27f6bf35c671, 0x000000000000ff00},
+ {0x4b6c30a789f108b4, 0x6a8546b9acd72918, 0x08bedc9bc3bd4bec, 0x2957aa85e69b6a40,
+ 0xccc9e8df1d698e04, 0xed209ec1384fafa8, 0x8f1b04e35725cd5c, 0xaef272fd7203ecf0,
+ 0x70fea605f85796bf, 0x5117d01bdd71b713, 0x332c4a39b21bd5e7, 0x12c53c27973df44b,
+ 0xf75b7e7d6ccf100f, 0xd6b2086349e931a3, 0xb489924126835357, 0x9560e45f03a572fb,
+ 0x3c491de36abc34a2, 0x1da06bfd4f9a150e, 0x7f9bf1df20f077fa, 0x5e7287c105d65656,
+ 0xbbecc59bfe24b212, 0x9a05b385db0293be, 0xf83e29a7b468f14a, 0xd9d75fb9914ed0e6,
+ 0x07db8b411b1aaaa9, 0x2632fd5f3e3c8b05, 0x4409677d5156e9f1, 0x65e011637470c85d,
+ 0x807e53398f822c19, 0xa1972527aaa40db5, 0xc3acbf05c5ce6f41, 0xe245c91be0e84eed,
+ 0xa5266a2e4f6b7098, 0x84cf1c306a4d5134, 0xe6f48612052733c0, 0xc71df00c2001126c,
+ 0x2283b256dbf3f628, 0x036ac448fed5d784, 0x61515e6a91bfb570, 0x40b82874b49994dc,
+ 0x9eb4fc8c3ecdee93, 0xbf5d8a921bebcf3f, 0xdd6610b07481adcb, 0xfc8f66ae51a78c67,
+ 0x191124f4aa556823, 0x38f852ea8f73498f, 0x5ac3c8c8e0192b7b, 0x7b2abed6c53f0ad7,
+ 0xd203476aac264c8e, 0xf3ea317489006d22, 0x91d1ab56e66a0fd6, 0xb038dd48c34c2e7a,
+ 0x55a69f1238beca3e, 0x744fe90c1d98eb92, 0x1674732e72f28966, 0x379d053057d4a8ca,
+ 0xe991d1c8dd80d285, 0xc878a7d6f8a6f329, 0xaa433df497cc91dd, 0x8baa4beab2eab071,
+ 0x6e3409b049185435, 0x4fdd7fae6c3e7599, 0x2de6e58c0354176d, 0x0c0f9392267236c1,
+ 0xa321a3e75c526b87, 0x82c8d5f979744a2b, 0xe0f34fdb161e28df, 0xc11a39c533380973,
+ 0x24847b9fc8caed37, 0x056d0d81edeccc9b, 0x675697a38286ae6f, 0x46bfe1bda7a08fc3,
+ 0x98b335452df4f58c, 0xb95a435b08d2d420, 0xdb61d97967b8b6d4, 0xfa88af67429e9778,
+ 0x1f16ed3db96c733c, 0x3eff9b239c4a5290, 0x5cc40101f3203064, 0x7d2d771fd60611c8,
+ 0xd4048ea3bf1f5791, 0xf5edf8bd9a39763d, 0x97d6629ff55314c9, 0xb63f1481d0753565,
+ 0x53a156db2b87d121, 0x724820c50ea1f08d, 0x1073bae761cb9279, 0x319accf944edb3d5,
+ 0xef961801ceb9c99a, 0xce7f6e1feb9fe836, 0xac44f43d84f58ac2, 0x8dad8223a1d3ab6e,
+ 0x6833c0795a214f2a, 0x49dab6677f076e86, 0x2be12c45106d0c72, 0x0a085a5b354b2dde,
+ 0x4d6bf96e9ac813ab, 0x6c828f70bfee3207, 0x0eb91552d08450f3, 0x2f50634cf5a2715f,
+ 0xcace21160e50951b, 0xeb2757082b76b4b7, 0x891ccd2a441cd643, 0xa8f5bb34613af7ef,
+ 0x76f96fcceb6e8da0, 0x571019d2ce48ac0c, 0x352b83f0a122cef8, 0x14c2f5ee8404ef54,
+ 0xf15cb7b47ff60b10, 0xd0b5c1aa5ad02abc, 0xb28e5b8835ba4848, 0x93672d96109c69e4,
+ 0x3a4ed42a79852fbd, 0x1ba7a2345ca30e11, 0x799c381633c96ce5, 0x58754e0816ef4d49,
+ 0xbdeb0c52ed1da90d, 0x9c027a4cc83b88a1, 0xfe39e06ea751ea55, 0xdfd096708277cbf9,
+ 0x01dc42880823b1b6, 0x203534962d05901a, 0x420eaeb4426ff2ee, 0x63e7d8aa6749d342,
+ 0x86799af09cbb3706, 0xa790eceeb99d16aa, 0xc5ab76ccd6f7745e, 0xe44200d2f3d155f2,
+ 0xaf2e30757a205db9, 0x8ec7466b5f067c15, 0xecfcdc49306c1ee1, 0xcd15aa57154a3f4d,
+ 0x288be80deeb8db09, 0x09629e13cb9efaa5, 0x6b590431a4f49851, 0x4ab0722f81d2b9fd,
+ 0x94bca6d70b86c3b2, 0xb555d0c92ea0e21e, 0xd76e4aeb41ca80ea, 0xf6873cf564eca146,
+ 0x13197eaf9f1e4502, 0x32f008b1ba3864ae, 0x50cb9293d552065a, 0x7122e48df07427f6,
+ 0xd80b1d31996d61af, 0xf9e26b2fbc4b4003, 0x9bd9f10dd32122f7, 0xba308713f607035b,
+ 0x5faec5490df5e71f, 0x7e47b35728d3c6b3, 0x1c7c297547b9a447, 0x3d955f6b629f85eb,
+ 0xe3998b93e8cbffa4, 0xc270fd8dcdedde08, 0xa04b67afa287bcfc, 0x81a211b187a19d50,
+ 0x643c53eb7c537914, 0x45d525f5597558b8, 0x27eebfd7361f3a4c, 0x0607c9c913391be0,
+ 0x41646afcbcba2595, 0x608d1ce2999c0439, 0x02b686c0f6f666cd, 0x235ff0ded3d04761,
+ 0xc6c1b2842822a325, 0xe728c49a0d048289, 0x85135eb8626ee07d, 0xa4fa28a64748c1d1,
+ 0x7af6fc5ecd1cbb9e, 0x5b1f8a40e83a9a32, 0x392410628750f8c6, 0x18cd667ca276d96a,
+ 0xfd53242659843d2e, 0xdcba52387ca21c82, 0xbe81c81a13c87e76, 0x9f68be0436ee5fda,
+ 0x364147b85ff71983, 0x17a831a67ad1382f, 0x7593ab8415bb5adb, 0x547add9a309d7b77,
+ 0xb1e49fc0cb6f9f33, 0x900de9deee49be9f, 0xf23673fc8123dc6b, 0xd3df05e2a405fdc7,
+ 0x0dd3d11a2e518788, 0x2c3aa7040b77a624, 0x4e013d26641dc4d0, 0x6fe84b38413be57c,
+ 0x8a760962bac90138, 0xab9f7f7c9fef2094, 0xc9a4e55ef0854260, 0xe84d9340d5a363cc,
+ 0x4763a335af833e8a, 0x668ad52b8aa51f26, 0x04b14f09e5cf7dd2, 0x25583917c0e95c7e,
+ 0xc0c67b4d3b1bb83a, 0xe12f0d531e3d9996, 0x831497717157fb62, 0xa2fde16f5471dace,
+ 0x7cf13597de25a081, 0x5d184389fb03812d, 0x3f23d9ab9469e3d9, 0x1ecaafb5b14fc275,
+ 0xfb54edef4abd2631, 0xdabd9bf16f9b079d, 0xb88601d300f16569, 0x996f77cd25d744c5,
+ 0x30468e714cce029c, 0x11aff86f69e82330, 0x7394624d068241c4, 0x527d145323a46068,
+ 0xb7e35609d856842c, 0x960a2017fd70a580, 0xf431ba35921ac774, 0xd5d8cc2bb73ce6d8,
+ 0x0bd418d33d689c97, 0x2a3d6ecd184ebd3b, 0x4806f4ef7724dfcf, 0x69ef82f15202fe63,
+ 0x8c71c0aba9f01a27, 0xad98b6b58cd63b8b, 0xcfa32c97e3bc597f, 0xee4a5a89c69a78d3,
+ 0xa929f9bc691946a6, 0x88c08fa24c3f670a, 0xeafb1580235505fe, 0xcb12639e06732452,
+ 0x2e8c21c4fd81c016, 0x0f6557dad8a7e1ba, 0x6d5ecdf8b7cd834e, 0x4cb7bbe692eba2e2,
+ 0x92bb6f1e18bfd8ad, 0xb35219003d99f901, 0xd169832252f39bf5, 0xf080f53c77d5ba59,
+ 0x151eb7668c275e1d, 0x34f7c178a9017fb1, 0x56cc5b5ac66b1d45, 0x77252d44e34d3ce9,
+ 0xde0cd4f88a547ab0, 0xffe5a2e6af725b1c, 0x9dde38c4c01839e8, 0xbc374edae53e1844,
+ 0x59a90c801eccfc00, 0x78407a9e3beaddac, 0x1a7be0bc5480bf58, 0x3b9296a271a69ef4,
+ 0xe59e425afbf2e4bb, 0xc4773444ded4c517, 0xa64cae66b1bea7e3, 0x87a5d8789498864f,
+ 0x623b9a226f6a620b, 0x43d2ec3c4a4c43a7, 0x21e9761e25262153, 0x00000000000000ff}
+};
+
+uint64_t crc64nvme_byte(uint64_t crc, void const *mem, size_t len) {
+ uint8_t const *data = mem;
+ if (data == NULL)
+ return 0;
+ for (size_t i = 0; i < len; i++) {
+ crc = (crc >> 8) ^
+ table_byte[(crc ^ data[i]) & 0xff];
+ }
+ return crc;
+}
+
+// This code assumes that integers are stored little-endian.
+
+uint64_t crc64nvme_word(uint64_t crc, void const *mem, size_t len) {
+ uint8_t const *data = mem;
+ if (data == NULL)
+ return 0;
+ while (len && ((ptrdiff_t)data & 0x7)) {
+ len--;
+ crc = (crc >> 8) ^
+ table_byte[(crc ^ *data++) & 0xff];
+ }
+ size_t n = len >> 3;
+ for (size_t i = 0; i < n; i++) {
+ uint64_t word = crc ^ ((uint64_t const *)data)[i];
+ crc = table_word[7][word & 0xff] ^
+ table_word[6][(word >> 8) & 0xff] ^
+ table_word[5][(word >> 16) & 0xff] ^
+ table_word[4][(word >> 24) & 0xff] ^
+ table_word[3][(word >> 32) & 0xff] ^
+ table_word[2][(word >> 40) & 0xff] ^
+ table_word[1][(word >> 48) & 0xff] ^
+ table_word[0][word >> 56];
+ }
+ data += n << 3;
+ len &= 7;
+ while (len) {
+ len--;
+ crc = (crc >> 8) ^
+ table_byte[(crc ^ *data++) & 0xff];
+ }
+ return crc;
+}
+
+static uint64_t multmodp(uint64_t a, uint64_t b) {
+ uint64_t prod = 0;
+ for (;;) {
+ if (a & 0x8000000000000000) {
+ prod ^= b;
+ if ((a & 0x7fffffffffffffff) == 0)
+ break;
+ }
+ a <<= 1;
+ b = b & 1 ? (b >> 1) ^ 0x9a6c9329ac4bc9b5 : b >> 1;
+ }
+ return prod;
+}
+
+static uint64_t const table_comb[] = {
+ 0x4000000000000000, 0x2000000000000000, 0x0800000000000000, 0x0080000000000000,
+ 0x0000800000000000, 0x0000000080000000, 0x9a6c9329ac4bc9b5, 0x10f4bb0f129310d6,
+ 0x70f05dcea2ebd226, 0x311211205672822d, 0x2fc297db0f46c96e, 0xca4d536fabf7da84,
+ 0xfb4cdc3b379ee6ed, 0xea261148df25140a, 0x59ccb2c07aa6c9b4, 0x20b3674a839af27a,
+ 0x2d8e1986da94d583, 0x42cdf4c20337635d, 0x1d78724bf0f26839, 0xb96c84e0afb34bd5,
+ 0x5d2e1fcd2df0a3ea, 0xcd9506572332be42, 0x23bda2427f7d690f, 0x347a953232374f07,
+ 0x1c2a807ac2a8ceea, 0x9b92ad0e14fe1460, 0x2574114889f670b2, 0x4a84a6c45e3bf520,
+ 0x915bbac21cd1c7ff, 0xb0290ec579f291f5, 0xcf2548505c624e6e, 0xb154f27bf08a8207,
+ 0xce4e92344baf7d35, 0x51da8d7e057c5eb3, 0x9fb10823f5be15df, 0x73b825b3ff1f71cf,
+ 0x5db436c5406ebb74, 0xfa7ed8f3ec3f2bca, 0xc4d58efdc61b9ef6, 0xa7e39e61e855bd45,
+ 0x97ad46f9dd1bf2f1, 0x1a0abb01f853ee6b, 0x3f0827c3348f8215, 0x4eb68c4506134607,
+ 0x4a46f6de5df34e0a, 0x2d855d6a1c57a8dd, 0x8688da58e1115812, 0x5232f417fc7c7300,
+ 0xa4080fb2e767d8da, 0xd515a7e17693e562, 0x1181f7c862e94226, 0x9e23cd058204ca91,
+ 0x9b8992c57a0aed82, 0xb2c0afb84609b6ff, 0x2f7160553a5ea018, 0x3cd378b5c99f2722,
+ 0x814054ad61a3b058, 0xbf766189fce806d8, 0x85a5e898ac49f86f, 0x34830d11bc84f346,
+ 0x9644d95b173c8c1c, 0x150401ac9ac759b1, 0xebe1f7f46fb00eba, 0x8ee4ce0c2e2bd662
+};
+
+static uint64_t x8nmodp(uintmax_t n) {
+ uint64_t xp = 0x8000000000000000;
+ int k = 3;
+ for (;;) {
+ if (n & 1)
+ xp = multmodp(table_comb[k], xp);
+ n >>= 1;
+ if (n == 0)
+ break;
+ if (++k == 64)
+ k = 0;
+ }
+ return xp;
+}
+
+uint64_t crc64nvme_comb(uint64_t crc1, uint64_t crc2,
+ uintmax_t len2) {
+ return multmodp(x8nmodp(len2), crc1) ^ crc2;
+}
--- /dev/null
+// The _bit, _byte, and _word routines return the CRC of the len
+// bytes at mem, applied to the previous CRC value, crc. If mem is
+// NULL, then the other arguments are ignored, and the initial CRC,
+// i.e. the CRC of zero bytes, is returned. Those routines will all
+// return the same result, differing only in speed and code
+// complexity. The _rem routine returns the CRC of the remaining
+// bits in the last byte, for when the number of bits in the
+// message is not a multiple of eight. The low bits bits of the low
+// byte of val are applied to crc. bits must be in 0..8.
+
+#include <stddef.h>
+#include <stdint.h>
+
+// Compute the CRC a bit at a time.
+uint64_t crc64nvme_bit(uint64_t crc, void const *mem, size_t len);
+
+// Compute the CRC of the low bits bits in val.
+uint64_t crc64nvme_rem(uint64_t crc, unsigned val, unsigned bits);
+
+// Compute the CRC a byte at a time.
+uint64_t crc64nvme_byte(uint64_t crc, void const *mem, size_t len);
+
+// Compute the CRC a word at a time.
+uint64_t crc64nvme_word(uint64_t crc, void const *mem, size_t len);
+
+// Compute the combination of two CRCs.
+uint64_t crc64nvme_comb(uint64_t crc1, uint64_t crc2, uintmax_t len2);