crc32c.c revision 6b56f3d92d08806ab415e8fd883480f7f9c148e8
1c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)/* 2c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * crc32c.c 3c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * 4c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * August 26, 2011 Darrick J. Wong <djwong at us.ibm.com> 5c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * Reuse Bob Pearson's slice-by-8 implementation for e2fsprogs. 6c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * 7c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * July 20, 2011 Bob Pearson <rpearson at systemfabricworks.com> 8eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch * added slice by 8 algorithm to the existing conventional and 96e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) * slice by 4 algorithms. 101e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) * 11eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch * Oct 15, 2000 Matt Domsch <Matt_Domsch@dell.com> 12c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * Nicer crc32 functions/docs submitted by linux@horizon.com. Thanks! 13c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * Code was from the public domain, copyright abandoned. Code was 14a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) * subsequently included in the kernel, thus was re-licensed under the 15effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch * GNU GPL v2. 16c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * 17d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) * Oct 12, 2000 Matt Domsch <Matt_Domsch@dell.com> 185c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu * Same crc32 function was used in 5 other places in the kernel. 19c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * I made one version, and deleted the others. 2068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) * There are various incantations of crc32(). Some use a seed of 0 or ~0. 21c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * Some xor at the end with ~0. The generic crc32() function takes 226e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) * seed as an argument, and doesn't xor at the end. Then individual 23effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch * users can do whatever they need. 24c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * drivers/net/smc9194.c uses seed ~0, doesn't xor with ~0. 25c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * fs/jffs2 uses seed 0, doesn't xor with ~0. 26c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * fs/partitions/efi.c uses seed ~0, xor's with ~0. 27c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * 28c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * This source code is licensed under the GNU General Public License, 29c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * Version 2. See the file COPYING for more details. 30c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) */ 31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "config.h" 326e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include <stdint.h> 33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include <stdlib.h> 34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include <stdio.h> 35c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#define __force 36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#define min(x, y) ((x) > (y) ? (y) : (x)) 37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#define __ALIGN_KERNEL_MASK(x, mask) (((x) + (mask)) & ~(mask)) 38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#define __ALIGN_KERNEL(x, a) __ALIGN_KERNEL_MASK(x, (typeof(x))(a) - 1) 39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#define ALIGN(x, a) __ALIGN_KERNEL((x), (a)) 40eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#define PTR_ALIGN(p, a) ((typeof(p))ALIGN((unsigned long)(p), (a))) 41eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "crc32c_defs.h" 42c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if CRC_LE_BITS > 8 44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)# define tole(x) (__force uint32_t) __constant_cpu_to_le32(x) 457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#else 466e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)# define tole(x) (x) 476e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#endif 48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 49c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if CRC_BE_BITS > 8 505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)# define tobe(x) (__force uint32_t) __constant_cpu_to_be32(x) 51c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#else 52c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)# define tobe(x) (x) 53c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif 54eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 556e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "crc32c_table.h" 56c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 57c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if CRC_LE_BITS == 32 581e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)/* slice by 4 algorithm */ 597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochstatic uint32_t crc32c_le_body(uint32_t crc, uint8_t const *buf, size_t len) 60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles){ 61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const uint8_t *p8; 62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const uint32_t *p32; 63c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) size_t init_bytes; 64eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch size_t words; 65eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch size_t end_bytes; 66eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch size_t i; 67eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch uint32_t q; 68eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch uint8_t i0, i1, i2, i3; 696e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 706e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) crc = (__force uint32_t) __cpu_to_le32(crc); 71c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) /* unroll loop into 'init_bytes' odd bytes followed by 73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * 'words' aligned 4 byte words followed by 74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * 'end_bytes' odd bytes at the end */ 75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) p8 = buf; 76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) p32 = (uint32_t *)PTR_ALIGN(p8, 4); 77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) init_bytes = min((uintptr_t)p32 - (uintptr_t)p8, len); 78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) words = (len - init_bytes) >> 2; 79eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch end_bytes = (len - init_bytes) & 3; 80eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 81eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch for (i = 0; i < init_bytes; i++) { 82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#ifndef WORDS_BIGENDIAN 83c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) i0 = *p8++ ^ crc; 84c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) crc = t0_le[i0] ^ (crc >> 8); 851e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#else 86c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) i0 = *p8++ ^ (crc >> 24); 87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) crc = t0_le[i0] ^ (crc << 8); 88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif 89c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 91c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) /* using pre-increment below slightly faster */ 92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) p32--; 93c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 94c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) for (i = 0; i < words; i++) { 95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#ifndef WORDS_BIGENDIAN 96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) q = *++p32 ^ crc; 97eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch i3 = q; 98c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) i2 = q >> 8; 99c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) i1 = q >> 16; 100eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch i0 = q >> 24; 101eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch crc = t3_le[i3] ^ t2_le[i2] ^ t1_le[i1] ^ t0_le[i0]; 102eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#else 103eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch q = *++p32 ^ crc; 104eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch i3 = q >> 24; 105cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) i2 = q >> 16; 106cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) i1 = q >> 8; 107cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) i0 = q; 1086e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) crc = t3_le[i3] ^ t2_le[i2] ^ t1_le[i1] ^ t0_le[i0]; 1096e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#endif 1106e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) } 1116e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 112cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) p8 = (uint8_t *)(++p32); 113cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 114cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) for (i = 0; i < end_bytes; i++) { 115cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#ifndef WORDS_BIGENDIAN 116cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) i0 = *p8++ ^ crc; 117cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) crc = t0_le[i0] ^ (crc >> 8); 118cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#else 119cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) i0 = *p8++ ^ (crc >> 24); 120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) crc = t0_le[i0] ^ (crc << 8); 121effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#endif 122effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch } 123effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 124effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch return __le32_to_cpu((__force __le32)crc); 125effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch} 126effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#endif 127effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 128effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#if CRC_BE_BITS == 32 129effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochstatic uint32_t crc32c_be_body(uint32_t crc, uint8_t const *buf, size_t len) 130effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch{ 131effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch const uint8_t *p8; 132effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch const uint32_t *p32; 133effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch size_t init_bytes; 134effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch size_t words; 135effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch size_t end_bytes; 136010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) size_t i; 137010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) uint32_t q; 138010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) uint8_t i0, i1, i2, i3; 139010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 140effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch crc = (__force uint32_t) __cpu_to_be32(crc); 141effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 142effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch p8 = buf; 143effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch p32 = (uint32_t *)PTR_ALIGN(p8, 4); 144effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch init_bytes = min((uintptr_t)p32 - (uintptr_t)p8, len); 145effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch words = (len - init_bytes) >> 2; 146effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch end_bytes = (len - init_bytes) & 3; 147c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 148c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) for (i = 0; i < init_bytes; i++) { 149c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#ifndef WORDS_BIGENDIAN 150c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) i0 = *p8++ ^ crc; 151c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) crc = t0_be[i0] ^ (crc >> 8); 152c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#else 153c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) i0 = *p8++ ^ (crc >> 24); 154c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) crc = t0_be[i0] ^ (crc << 8); 155c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif 156c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 157c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 158c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) p32--; 159c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 160c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) for (i = 0; i < words; i++) { 161eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#ifndef WORDS_BIGENDIAN 162eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch q = *++p32 ^ crc; 163eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch i3 = q; 1645c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu i2 = q >> 8; 165eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch i1 = q >> 16; 166eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch i0 = q >> 24; 167eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch crc = t3_be[i3] ^ t2_be[i2] ^ t1_be[i1] ^ t0_be[i0]; 168eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#else 169eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch q = *++p32 ^ crc; 170eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch i3 = q >> 24; 171eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch i2 = q >> 16; 172eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch i1 = q >> 8; 173eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch i0 = q; 174eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch crc = t3_be[i3] ^ t2_be[i2] ^ t1_be[i1] ^ t0_be[i0]; 175eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#endif 176eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 177eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 178eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch p8 = (uint8_t *)(++p32); 179eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 180eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch for (i = 0; i < end_bytes; i++) { 181eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#ifndef WORDS_BIGENDIAN 182eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch i0 = *p8++ ^ crc; 183eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch crc = t0_be[i0] ^ (crc >> 8); 184eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#else 185eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch i0 = *p8++ ^ (crc >> 24); 186010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) crc = t0_be[i0] ^ (crc << 8); 187eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#endif 188c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1896e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 1906e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) return __be32_to_cpu((__force __be32)crc); 1916e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)} 1926e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#endif 1936e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 1946e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#if CRC_LE_BITS == 64 1956e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)/* slice by 8 algorithm */ 196eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochstatic uint32_t crc32c_le_body(uint32_t crc, uint8_t const *buf, size_t len) 1976e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles){ 1986e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) const uint8_t *p8; 199c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const uint32_t *p32; 2001e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) size_t init_bytes; 201c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) size_t words; 202c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) size_t end_bytes; 203c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) size_t i; 204c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) uint32_t q; 205c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) uint8_t i0, i1, i2, i3; 206c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 207c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) crc = (__force uint32_t) __cpu_to_le32(crc); 208c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 209eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch p8 = buf; 210c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) p32 = (uint32_t *)PTR_ALIGN(p8, 8); 211c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) init_bytes = min((uintptr_t)p32 - (uintptr_t)p8, len); 212c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) words = (len - init_bytes) >> 3; 213c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) end_bytes = (len - init_bytes) & 7; 214c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 215c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) for (i = 0; i < init_bytes; i++) { 216c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#ifndef WORDS_BIGENDIAN 217c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) i0 = *p8++ ^ crc; 218c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) crc = t0_le[i0] ^ (crc >> 8); 219c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#else 220c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) i0 = *p8++ ^ (crc >> 24); 221c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) crc = t0_le[i0] ^ (crc << 8); 222c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif 223c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 224eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 225eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch p32--; 2265c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 227eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch for (i = 0; i < words; i++) { 228eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#ifndef WORDS_BIGENDIAN 229eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch q = *++p32 ^ crc; 2305c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu i3 = q; 231eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch i2 = q >> 8; 232010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) i1 = q >> 16; 233010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) i0 = q >> 24; 234010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) crc = t7_le[i3] ^ t6_le[i2] ^ t5_le[i1] ^ t4_le[i0]; 235010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 236010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) q = *++p32; 237010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) i3 = q; 238010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) i2 = q >> 8; 239010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) i1 = q >> 16; 240010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) i0 = q >> 24; 241010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) crc ^= t3_le[i3] ^ t2_le[i2] ^ t1_le[i1] ^ t0_le[i0]; 242eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#else 243eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch q = *++p32 ^ crc; 244eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch i3 = q >> 24; 245effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch i2 = q >> 16; 246eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch i1 = q >> 8; 2475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) i0 = q; 2485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) crc = t7_le[i3] ^ t6_le[i2] ^ t5_le[i1] ^ t4_le[i0]; 2495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) q = *++p32; 251c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) i3 = q >> 24; 252eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch i2 = q >> 16; 253c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) i1 = q >> 8; 254c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) i0 = q; 255eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch crc ^= t3_le[i3] ^ t2_le[i2] ^ t1_le[i1] ^ t0_le[i0]; 256eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#endif 2575c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } 2585c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 2595c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu p8 = (uint8_t *)(++p32); 2605c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 261eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch for (i = 0; i < end_bytes; i++) { 262effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#ifndef WORDS_BIGENDIAN 263effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch i0 = *p8++ ^ crc; 264effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch crc = t0_le[i0] ^ (crc >> 8); 265effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#else 2666e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) i0 = *p8++ ^ (crc >> 24); 2676e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) crc = t0_le[i0] ^ (crc << 8); 2686e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#endif 2696e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) } 2706e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 2716e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) return __le32_to_cpu(crc); 2727dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 2737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#endif 2747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 2757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#if CRC_BE_BITS == 64 2767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochstatic uint32_t crc32c_be_body(uint32_t crc, uint8_t const *buf, size_t len) 277a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles){ 278a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const uint8_t *p8; 279c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const uint32_t *p32; 280c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) size_t init_bytes; 281c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) size_t words; 282c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) size_t end_bytes; 283c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) size_t i; 284c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) uint32_t q; 285 uint8_t i0, i1, i2, i3; 286 287 crc = (__force uint32_t) __cpu_to_be32(crc); 288 289 p8 = buf; 290 p32 = (uint32_t *)PTR_ALIGN(p8, 8); 291 init_bytes = min((uintptr_t)p32 - (uintptr_t)p8, len); 292 words = (len - init_bytes) >> 3; 293 end_bytes = (len - init_bytes) & 7; 294 295 for (i = 0; i < init_bytes; i++) { 296#ifndef WORDS_BIGENDIAN 297 i0 = *p8++ ^ crc; 298 crc = t0_be[i0] ^ (crc >> 8); 299#else 300 i0 = *p8++ ^ (crc >> 24); 301 crc = t0_be[i0] ^ (crc << 8); 302#endif 303 } 304 305 p32--; 306 307 for (i = 0; i < words; i++) { 308#ifndef WORDS_BIGENDIAN 309 q = *++p32 ^ crc; 310 i3 = q; 311 i2 = q >> 8; 312 i1 = q >> 16; 313 i0 = q >> 24; 314 crc = t7_be[i3] ^ t6_be[i2] ^ t5_be[i1] ^ t4_be[i0]; 315 316 q = *++p32; 317 i3 = q; 318 i2 = q >> 8; 319 i1 = q >> 16; 320 i0 = q >> 24; 321 crc ^= t3_be[i3] ^ t2_be[i2] ^ t1_be[i1] ^ t0_be[i0]; 322#else 323 q = *++p32 ^ crc; 324 i3 = q >> 24; 325 i2 = q >> 16; 326 i1 = q >> 8; 327 i0 = q; 328 crc = t7_be[i3] ^ t6_be[i2] ^ t5_be[i1] ^ t4_be[i0]; 329 330 q = *++p32; 331 i3 = q >> 24; 332 i2 = q >> 16; 333 i1 = q >> 8; 334 i0 = q; 335 crc ^= t3_be[i3] ^ t2_be[i2] ^ t1_be[i1] ^ t0_be[i0]; 336#endif 337 } 338 339 p8 = (uint8_t *)(++p32); 340 341 for (i = 0; i < end_bytes; i++) { 342#ifndef WORDS_BIGENDIAN 343 i0 = *p8++ ^ crc; 344 crc = t0_be[i0] ^ (crc >> 8); 345#else 346 i0 = *p8++ ^ (crc >> 24); 347 crc = t0_be[i0] ^ (crc << 8); 348#endif 349 } 350 351 return __be32_to_cpu(crc); 352} 353#endif 354 355/** 356 * crc32c_le() - Calculate bitwise little-endian CRC32c. 357 * @crc: seed value for computation. ~0 for ext4, sometimes 0 for 358 * other uses, or the previous crc32c value if computing incrementally. 359 * @p: pointer to buffer over which CRC is run 360 * @len: length of buffer @p 361 */ 362uint32_t ext2fs_crc32c_le(uint32_t crc, unsigned char const *p, size_t len) 363{ 364#if CRC_LE_BITS == 1 365 int i; 366 while (len--) { 367 crc ^= *p++; 368 for (i = 0; i < 8; i++) 369 crc = (crc >> 1) ^ ((crc & 1) ? CRCPOLY_LE : 0); 370 } 371# elif CRC_LE_BITS == 2 372 while (len--) { 373 crc ^= *p++; 374 crc = (crc >> 2) ^ t0_le[crc & 0x03]; 375 crc = (crc >> 2) ^ t0_le[crc & 0x03]; 376 crc = (crc >> 2) ^ t0_le[crc & 0x03]; 377 crc = (crc >> 2) ^ t0_le[crc & 0x03]; 378 } 379# elif CRC_LE_BITS == 4 380 while (len--) { 381 crc ^= *p++; 382 crc = (crc >> 4) ^ t0_le[crc & 0x0f]; 383 crc = (crc >> 4) ^ t0_le[crc & 0x0f]; 384 } 385# elif CRC_LE_BITS == 8 386 while (len--) { 387 crc ^= *p++; 388 crc = (crc >> 8) ^ t0_le[crc & 0xff]; 389 } 390# else 391 crc = crc32c_le_body(crc, p, len); 392# endif 393 return crc; 394} 395 396/** 397 * crc32c_be() - Calculate bitwise big-endian CRC32c. 398 * @crc: seed value for computation. ~0 for ext4, sometimes 0 for 399 * other uses, or the previous crc32c value if computing incrementally. 400 * @p: pointer to buffer over which CRC is run 401 * @len: length of buffer @p 402 */ 403uint32_t ext2fs_crc32c_be(uint32_t crc, unsigned char const *p, size_t len) 404{ 405#if CRC_BE_BITS == 1 406 int i; 407 while (len--) { 408 crc ^= *p++ << 24; 409 for (i = 0; i < 8; i++) 410 crc = (crc << 1) ^ 411 ((crc & 0x80000000) ? CRCPOLY_BE : 0); 412 } 413# elif CRC_BE_BITS == 2 414 while (len--) { 415 crc ^= *p++ << 24; 416 crc = (crc << 2) ^ t0_be[crc >> 30]; 417 crc = (crc << 2) ^ t0_be[crc >> 30]; 418 crc = (crc << 2) ^ t0_be[crc >> 30]; 419 crc = (crc << 2) ^ t0_be[crc >> 30]; 420 } 421# elif CRC_BE_BITS == 4 422 while (len--) { 423 crc ^= *p++ << 24; 424 crc = (crc << 4) ^ t0_be[crc >> 28]; 425 crc = (crc << 4) ^ t0_be[crc >> 28]; 426 } 427# elif CRC_BE_BITS == 8 428 while (len--) { 429 crc ^= *p++ << 24; 430 crc = (crc << 8) ^ t0_be[crc >> 24]; 431 } 432# else 433 crc = crc32c_be_body(crc, p, len); 434# endif 435 return crc; 436} 437 438#ifdef UNITTEST 439static uint8_t test_buf[] = { 440 0xd9, 0xd7, 0x6a, 0x13, 0x3a, 0xb1, 0x05, 0x48, 441 0xda, 0xad, 0x14, 0xbd, 0x03, 0x3a, 0x58, 0x5e, 442 0x6e, 0xd1, 0x56, 0xc9, 0x2e, 0xc4, 0xcb, 0x6b, 443 0xe8, 0x77, 0x52, 0x37, 0x4e, 0x0f, 0x55, 0xd2, 444 0x12, 0x65, 0x90, 0xc2, 0x41, 0x49, 0x81, 0x01, 445 0xf5, 0x01, 0xeb, 0x2d, 0x78, 0x74, 0x23, 0x5d, 446 0x84, 0x5c, 0x81, 0x92, 0x21, 0xe9, 0x8d, 0x1d, 447 0x89, 0xf2, 0x4a, 0xac, 0xdd, 0xf9, 0xaf, 0xee, 448 0x44, 0xe7, 0x6e, 0xed, 0xfb, 0xd8, 0x89, 0x0e, 449 0x96, 0x62, 0xcd, 0xa4, 0x4b, 0xa9, 0xe5, 0x45, 450 0xb1, 0x29, 0x9b, 0x0f, 0xfc, 0xbd, 0x83, 0xab, 451 0xa8, 0x54, 0x96, 0x44, 0x2c, 0x7f, 0xbb, 0xe7, 452 0x52, 0x29, 0x08, 0xee, 0x14, 0xc5, 0xc2, 0xec, 453 0x5a, 0xeb, 0x40, 0x40, 0xea, 0xd1, 0x3d, 0x15, 454 0x73, 0xaa, 0x8c, 0x73, 0xfc, 0xf2, 0x2b, 0x49, 455 0x0b, 0x13, 0x96, 0xd9, 0x8e, 0x4b, 0xbc, 0xe0, 456 0xf4, 0xd2, 0xe0, 0x2e, 0x7a, 0xf0, 0x5d, 0x1f, 457 0xd2, 0x92, 0x97, 0xe0, 0xaa, 0x59, 0xab, 0xc9, 458 0x5c, 0xa6, 0x51, 0x1a, 0xe3, 0xd6, 0x06, 0xb9, 459 0xae, 0xb8, 0x76, 0x36, 0x79, 0x37, 0x52, 0xf6, 460 0x34, 0xaf, 0x27, 0x19, 0xe1, 0xc0, 0x2b, 0xdd, 461 0x01, 0x15, 0xcd, 0xce, 0x44, 0xf6, 0x4c, 0x18, 462 0x92, 0x69, 0xbe, 0x8a, 0x76, 0x23, 0x52, 0x13, 463 0x3f, 0xf9, 0xe0, 0xf5, 0x06, 0x28, 0x7c, 0xc7, 464 0xf3, 0x42, 0x0f, 0xdd, 0x40, 0x33, 0xf7, 0x99, 465 0xe2, 0xad, 0x26, 0xd9, 0x53, 0x10, 0x72, 0x0c, 466 0x4e, 0x43, 0x4c, 0x61, 0xfe, 0xd9, 0xc1, 0x16, 467 0xa1, 0x93, 0xca, 0x3c, 0x75, 0x7f, 0x07, 0x7a, 468 0x65, 0xb3, 0x53, 0x2a, 0x52, 0x00, 0xa0, 0x62, 469 0xe0, 0xa3, 0x1f, 0xad, 0xd7, 0xbb, 0xc0, 0x83, 470 0x5d, 0x54, 0x87, 0x5f, 0xc8, 0x2f, 0xc8, 0xbf, 471 0x69, 0x04, 0x91, 0xc8, 0xa6, 0x1d, 0x4d, 0x46, 472 0x91, 0xfc, 0x26, 0xf4, 0x16, 0xd1, 0xa4, 0xbf, 473 0x5c, 0xa2, 0x6c, 0xdd, 0xb4, 0x40, 0xf2, 0x2e, 474 0xa2, 0xad, 0xf7, 0xf4, 0xa5, 0x8a, 0x3e, 0x23, 475 0x64, 0x08, 0xc8, 0xa1, 0xa0, 0xf0, 0x5d, 0x70, 476 0xd2, 0x77, 0xfd, 0xc8, 0x50, 0x83, 0x0f, 0xd6, 477 0x2b, 0xe4, 0x1f, 0x52, 0x34, 0x33, 0x68, 0xfd, 478 0x92, 0xbe, 0x9f, 0x97, 0x6b, 0x8d, 0x81, 0x91, 479 0x0f, 0xef, 0x65, 0xc8, 0x0d, 0x15, 0x01, 0x77, 480 0x58, 0xb2, 0xf4, 0x1b, 0x06, 0x7e, 0xf5, 0xca, 481 0x15, 0x2e, 0x38, 0xd8, 0x81, 0x1c, 0x1c, 0xa0, 482 0xb6, 0x13, 0x6a, 0x2b, 0x71, 0x34, 0x52, 0xd7, 483 0x1d, 0xbd, 0x37, 0x59, 0xbc, 0x86, 0x25, 0x2b, 484 0xa8, 0x93, 0xce, 0x1a, 0x03, 0x16, 0xfe, 0x01, 485 0x57, 0x99, 0x24, 0x25, 0x2c, 0xb3, 0xab, 0x1e, 486 0x2d, 0x65, 0x20, 0x89, 0x17, 0x02, 0x0e, 0x0a, 487 0xf5, 0x1e, 0xc7, 0xff, 0x1f, 0x61, 0xa9, 0x54, 488 0x18, 0xd4, 0xba, 0x50, 0x57, 0x02, 0xa1, 0xab, 489 0x22, 0x2e, 0x07, 0xea, 0xa9, 0xa3, 0x83, 0x4f, 490 0x27, 0xf5, 0xc5, 0xee, 0x3c, 0x3b, 0x10, 0xad, 491 0x32, 0x2b, 0x1c, 0x03, 0xcb, 0xaf, 0x98, 0x83, 492 0x54, 0xc3, 0x68, 0x63, 0xd4, 0xe0, 0x0e, 0x3c, 493 0x1a, 0x4e, 0xc0, 0x81, 0xd0, 0xe8, 0x6a, 0x62, 494 0x6b, 0x3e, 0x6f, 0xc4, 0xc6, 0x33, 0x4e, 0x26, 495 0x21, 0xf5, 0x04, 0xdf, 0xfa, 0xce, 0x45, 0xaf, 496 0xdc, 0x5e, 0x1b, 0xad, 0x93, 0xca, 0xf5, 0xcf, 497 0xd7, 0xee, 0x0c, 0x5c, 0x5e, 0xb4, 0xf0, 0x92, 498 0xd2, 0xf2, 0xf0, 0xa9, 0x1e, 0xab, 0x80, 0x68, 499 0x46, 0xef, 0xcc, 0x26, 0x0c, 0x5c, 0xdd, 0x4e, 500 0x83, 0xb8, 0xb9, 0x53, 0x6e, 0xf8, 0x93, 0x38, 501 0x67, 0xa4, 0x41, 0x87, 0x72, 0xe7, 0x7e, 0x86, 502 0xc9, 0x49, 0x00, 0x33, 0xb1, 0x38, 0x6c, 0x71, 503 0xd7, 0x1d, 0x8e, 0x61, 0x01, 0xb6, 0x57, 0xa9, 504 0xf1, 0xac, 0x15, 0xc2, 0x83, 0x77, 0xca, 0x64, 505 0xca, 0x7b, 0x6c, 0xa1, 0x10, 0x1b, 0x13, 0xd0, 506 0xd3, 0x9e, 0x9e, 0x10, 0x70, 0xc8, 0x1a, 0xbb, 507 0x3f, 0x19, 0x86, 0xab, 0x01, 0x0e, 0xea, 0x34, 508 0x22, 0xea, 0xe2, 0x15, 0xb7, 0xed, 0x21, 0x21, 509 0x75, 0xa5, 0xe7, 0x08, 0xa1, 0x38, 0xe0, 0x91, 510 0x05, 0x60, 0xea, 0xa7, 0x50, 0x27, 0x18, 0x07, 511 0x9d, 0xe0, 0x18, 0x2b, 0xd4, 0x07, 0x59, 0x00, 512 0xe6, 0x45, 0x18, 0x2a, 0x30, 0x6e, 0xf3, 0xb4, 513 0xd0, 0xef, 0xa6, 0x5b, 0x71, 0xa2, 0x5a, 0x3b, 514 0x89, 0x4c, 0xaf, 0x3f, 0xcb, 0x9f, 0x03, 0xfb, 515 0x43, 0x7c, 0x6b, 0xd3, 0x6a, 0xea, 0xce, 0x4a, 516 0x5f, 0x64, 0xb5, 0x62, 0xda, 0x5d, 0x27, 0xb7, 517 0xb8, 0x11, 0xca, 0x33, 0x30, 0xec, 0x70, 0xf0, 518 0x1b, 0x03, 0x50, 0xff, 0x5e, 0xa6, 0x08, 0xde, 519 0x37, 0x70, 0xc0, 0x81, 0x55, 0x60, 0x17, 0xa1, 520 0x85, 0xae, 0x26, 0x44, 0xe4, 0x67, 0x3c, 0x91, 521 0xfd, 0xc4, 0x3d, 0x97, 0x72, 0x23, 0xf3, 0x3c, 522 0x8f, 0xe0, 0xe2, 0xf2, 0x09, 0x96, 0x10, 0x67, 523 0xb5, 0xfe, 0xff, 0x3d, 0x4a, 0xc8, 0x62, 0x11, 524 0xa5, 0x98, 0xc1, 0x2d, 0x40, 0x82, 0x88, 0x8b, 525 0xe5, 0xb0, 0x75, 0xbf, 0x2f, 0xa8, 0x6a, 0x55, 526 0x49, 0x2e, 0x9c, 0x29, 0xd2, 0x7c, 0xbf, 0xf3, 527 0xaa, 0x3a, 0x16, 0x4a, 0xa4, 0x15, 0xf3, 0x48, 528 0xde, 0x38, 0x13, 0x44, 0x26, 0x02, 0xe6, 0xe9, 529 0xa8, 0x24, 0x89, 0xb5, 0x43, 0x95, 0xe4, 0x4c, 530 0xc3, 0xa0, 0xdf, 0xcc, 0x42, 0xf8, 0x8d, 0xb0, 531 0x3b, 0xea, 0x10, 0xb7, 0xe1, 0x40, 0x54, 0xb9, 532 0xa3, 0x2d, 0xfb, 0xb4, 0x91, 0xc0, 0x3e, 0x94, 533 0xf1, 0xa1, 0x3c, 0xbe, 0xef, 0xb8, 0x70, 0x55, 534 0x0a, 0x26, 0x93, 0xbf, 0xe6, 0x21, 0x92, 0x32, 535 0x3c, 0x39, 0x27, 0x6a, 0x23, 0x48, 0x02, 0x35, 536 0x3c, 0xd4, 0xcc, 0x04, 0xc0, 0x4e, 0xa7, 0x02, 537 0x63, 0x37, 0xc2, 0xb8, 0x56, 0x1d, 0x57, 0x57, 538 0x42, 0x04, 0x8d, 0xee, 0xcf, 0x8b, 0xc9, 0xc3, 539 0xba, 0x3b, 0x15, 0xd7, 0xaf, 0xbf, 0x9e, 0xcd, 540 0x44, 0xcf, 0xf0, 0x00, 0xb7, 0x3a, 0xfc, 0xa8, 541 0x12, 0xab, 0x3a, 0x62, 0x01, 0x21, 0x46, 0xe9, 542 0x1e, 0x48, 0x37, 0xfc, 0x13, 0x4d, 0xf6, 0x2a, 543 0x72, 0x40, 0x75, 0x38, 0x71, 0xf2, 0x17, 0x20, 544 0x2c, 0xdd, 0xc0, 0x49, 0xbc, 0x63, 0x33, 0xea, 545 0x06, 0x75, 0x41, 0xe7, 0x5c, 0x1f, 0xfb, 0xf9, 546 0x68, 0x83, 0xc2, 0x5a, 0x4a, 0x1e, 0x61, 0x08, 547 0x57, 0xf3, 0x00, 0xba, 0x77, 0x92, 0x63, 0xa5, 548 0xb7, 0xfe, 0x97, 0x22, 0xda, 0x5e, 0xd3, 0xaf, 549 0xbc, 0x89, 0x0d, 0x4c, 0x37, 0xa9, 0x27, 0x4a, 550 0x7f, 0xdb, 0x81, 0x39, 0x11, 0x86, 0x12, 0xf9, 551 0x10, 0x50, 0xe4, 0xdb, 0x72, 0xf9, 0xae, 0x10, 552 0x7c, 0xed, 0x50, 0x5c, 0x61, 0xeb, 0x42, 0x1e, 553 0xa4, 0xf4, 0xf0, 0xfa, 0x45, 0x4d, 0x95, 0x2b, 554 0xd4, 0x67, 0x4a, 0xe3, 0x8a, 0x15, 0x55, 0x92, 555 0x77, 0x64, 0x8c, 0x51, 0x38, 0xf9, 0x26, 0x3e, 556 0x68, 0xe2, 0xac, 0xbb, 0x64, 0x77, 0xe2, 0x82, 557 0xa4, 0x42, 0x41, 0x38, 0xa0, 0xf0, 0xc9, 0xd8, 558 0x6c, 0xe0, 0xef, 0x4c, 0xda, 0xb4, 0x92, 0xef, 559 0x1b, 0xe3, 0x9b, 0xc1, 0x44, 0x3c, 0xb9, 0xb7, 560 0x39, 0xac, 0x5c, 0x32, 0x39, 0xb4, 0x21, 0x85, 561 0x93, 0xbc, 0xf2, 0x51, 0x43, 0xb7, 0xae, 0x1e, 562 0x61, 0x9c, 0x38, 0x9c, 0xaa, 0xff, 0xde, 0xfc, 563 0xbf, 0x85, 0xef, 0x17, 0x34, 0x36, 0x71, 0x5f, 564 0x04, 0x16, 0xa6, 0x9e, 0xfd, 0x3a, 0x03, 0xd8, 565 0xbf, 0x71, 0x70, 0x20, 0x8f, 0x7c, 0xfb, 0xff, 566 0x61, 0xe0, 0xe2, 0x60, 0xa7, 0xb1, 0xc0, 0xe0, 567 0xd9, 0x3f, 0xdc, 0x8d, 0x4a, 0xa4, 0x52, 0x61, 568 0xaf, 0x9d, 0xdf, 0x8a, 0x0d, 0x41, 0xc0, 0x25, 569 0x68, 0x12, 0x7b, 0xd5, 0xc7, 0xdb, 0x68, 0x70, 570 0x2d, 0x7d, 0x95, 0x12, 0x03, 0x23, 0x0c, 0xe8, 571 0x14, 0x41, 0x11, 0x28, 0xec, 0x9d, 0xd3, 0x28, 572 0x77, 0x7a, 0x3c, 0x93, 0x8e, 0x5c, 0x7e, 0xb3, 573 0x42, 0x9a, 0x18, 0x25, 0x93, 0xc8, 0xea, 0x43, 574 0x1b, 0xbe, 0xd5, 0x27, 0xf1, 0xd4, 0xe0, 0x1e, 575 0xce, 0xc7, 0xc7, 0x2c, 0x25, 0x35, 0x58, 0xb8, 576 0x6c, 0xf3, 0xa2, 0xad, 0xe7, 0x58, 0x49, 0x47, 577 0xf7, 0xca, 0xde, 0x8b, 0x81, 0xb7, 0x75, 0xf4, 578 0x95, 0xa7, 0x5c, 0xc3, 0x2c, 0x0e, 0x1c, 0x52, 579 0x9a, 0xc3, 0x2a, 0x00, 0x21, 0xa7, 0x51, 0x6b, 580 0xf0, 0x05, 0x87, 0x8c, 0x42, 0x1b, 0xc3, 0x2e, 581 0xa3, 0x76, 0x22, 0xd5, 0x7f, 0x56, 0x10, 0xef, 582 0x98, 0x85, 0x65, 0x86, 0x71, 0x87, 0xd2, 0x8c, 583 0xc0, 0x47, 0x20, 0xe8, 0xb5, 0x1c, 0xe3, 0xdd, 584 0x3c, 0x5c, 0x03, 0xbb, 0x0e, 0x97, 0x3b, 0xe1, 585 0x56, 0x9a, 0xd5, 0x0a, 0x63, 0xd5, 0x33, 0xaf, 586 0x36, 0xca, 0xcf, 0x8f, 0x00, 0x28, 0xa3, 0x45, 587 0xb8, 0xcd, 0xde, 0x73, 0xd4, 0xfa, 0x2d, 0x6f, 588 0xdb, 0x93, 0xaa, 0xdd, 0x7f, 0xd2, 0x22, 0x9c, 589 0x96, 0x48, 0x1e, 0xa8, 0x63, 0xbe, 0xbc, 0x0d, 590 0x14, 0x3c, 0x2e, 0x11, 0x1f, 0xd2, 0xf4, 0x57, 591 0xb3, 0x47, 0xf8, 0xa6, 0x1b, 0xc3, 0xa7, 0x95, 592 0x2d, 0xd4, 0xca, 0xb8, 0x0d, 0xfb, 0x06, 0x85, 593 0xda, 0x63, 0xf0, 0x3e, 0x9d, 0x5e, 0xee, 0xce, 594 0xed, 0x74, 0x1d, 0x2c, 0x97, 0x3f, 0x71, 0x95, 595 0x12, 0x03, 0xc5, 0x92, 0x46, 0x84, 0x1b, 0x07, 596 0xe6, 0xb4, 0x1d, 0x3a, 0xf1, 0x89, 0x90, 0x50, 597 0x10, 0x29, 0x34, 0xc0, 0x90, 0xbe, 0x4a, 0xa9, 598 0x0d, 0xb0, 0x7b, 0xfb, 0x35, 0xee, 0x4e, 0x34, 599 0xec, 0x5a, 0x58, 0xbc, 0xb8, 0xda, 0x38, 0x88, 600 0x8c, 0x74, 0x1e, 0xc9, 0xab, 0x78, 0x2e, 0x2a, 601 0x17, 0x8a, 0x43, 0x3d, 0xa1, 0x2a, 0x41, 0xb5, 602 0xd6, 0xe8, 0x5b, 0xc5, 0x4a, 0x1c, 0x3c, 0x9f, 603 0x8d, 0x3a, 0x69, 0x88, 0xf8, 0x80, 0xd2, 0x11, 604 0xfc, 0x7e, 0x80, 0x8e, 0x7f, 0x85, 0x64, 0x9c, 605 0x46, 0x58, 0xc8, 0x48, 0x98, 0x4b, 0xf5, 0x73, 606 0x3f, 0x49, 0xce, 0x53, 0x2c, 0xd5, 0xfc, 0x33, 607 0xf1, 0x6f, 0xd8, 0xe9, 0x2e, 0x70, 0x2e, 0xdc, 608 0xe5, 0x43, 0x80, 0x38, 0xf2, 0x87, 0xed, 0x85, 609 0xe4, 0x3e, 0x45, 0x14, 0x20, 0xcf, 0xa0, 0x61, 610 0x4f, 0xe8, 0xd7, 0x5b, 0xb3, 0x0d, 0x0e, 0x4e, 611 0x4d, 0xce, 0xbe, 0xba, 0xaa, 0x90, 0x09, 0xcb, 612 0x4b, 0x5d, 0x08, 0xff, 0x52, 0xd5, 0x23, 0xbc, 613 0xad, 0x8d, 0xd3, 0x06, 0x4a, 0xa0, 0x51, 0x56, 614 0xa7, 0xd8, 0x33, 0xab, 0xbc, 0xd0, 0xdf, 0x92, 615 0x87, 0x20, 0x2d, 0x7b, 0x5e, 0xfa, 0x30, 0xa7, 616 0x06, 0x06, 0xe5, 0x4f, 0x2c, 0xb5, 0x61, 0xd7, 617 0x54, 0xd3, 0xdf, 0xd0, 0x0a, 0xb0, 0x06, 0xce, 618 0xf6, 0x86, 0xb7, 0x8e, 0xaa, 0x7b, 0x78, 0xd5, 619 0xb9, 0xeb, 0x07, 0xac, 0x5f, 0xc5, 0xd2, 0x8c, 620 0x40, 0xe0, 0x7f, 0x98, 0xd4, 0xe5, 0x4b, 0xca, 621 0xfb, 0x47, 0xef, 0xef, 0xb9, 0x4d, 0x6d, 0x8f, 622 0x82, 0x68, 0x74, 0x84, 0xe0, 0x0a, 0x93, 0x0f, 623 0xb2, 0x01, 0xa9, 0x9f, 0x68, 0x6a, 0xe8, 0xf7, 624 0xfb, 0x0b, 0xde, 0x17, 0xe0, 0x30, 0x38, 0x51, 625 0xbc, 0x07, 0xb8, 0x2c, 0x91, 0x0f, 0xc1, 0x0e, 626 0xa6, 0xf9, 0xf0, 0xd5, 0x48, 0x76, 0x8a, 0xde, 627 0x74, 0xe3, 0x30, 0x65, 0x56, 0xb3, 0x5c, 0xe2, 628 0x89, 0x8d, 0xda, 0x80, 0xad, 0x0f, 0x22, 0xfb, 629 0x24, 0x1d, 0x16, 0xdd, 0x34, 0x4b, 0x90, 0x58, 630 0x4e, 0x0c, 0x13, 0x28, 0xcf, 0x1d, 0xa4, 0xaa, 631 0xb7, 0xf3, 0xb1, 0x66, 0xad, 0x3b, 0xcf, 0x79, 632 0x12, 0x04, 0xd7, 0x79, 0xd9, 0x5f, 0xdf, 0x89, 633 0xb2, 0x5b, 0xa7, 0x9a, 0x26, 0x1e, 0x67, 0x46, 634 0x7c, 0x66, 0x95, 0x67, 0xe6, 0x45, 0x8b, 0x1f, 635 0x65, 0x79, 0x9f, 0x6d, 0x11, 0x81, 0x17, 0x0d, 636 0x11, 0xb0, 0x5c, 0xb4, 0xc7, 0x27, 0x87, 0xab, 637 0x5d, 0x0a, 0x18, 0xae, 0x4e, 0x06, 0xa3, 0x3d, 638 0xc7, 0xb0, 0x22, 0xba, 0x03, 0xa4, 0x0f, 0xe5, 639 0x1c, 0x72, 0x2a, 0x04, 0xce, 0x83, 0xe9, 0xf3, 640 0xd7, 0xc9, 0x67, 0x6c, 0x1e, 0x6b, 0x3c, 0x9b, 641 0x0b, 0x5e, 0x6a, 0xa6, 0x79, 0x0a, 0xf1, 0xbe, 642 0xd7, 0xb4, 0x6f, 0x45, 0x1e, 0xfb, 0x78, 0x97, 643 0xaf, 0x34, 0x76, 0x95, 0x52, 0xf7, 0x3d, 0x5d, 644 0x07, 0x28, 0x57, 0x9c, 0x4a, 0x0f, 0xcf, 0x0b, 645 0x1b, 0xc4, 0xc2, 0x72, 0xd7, 0x72, 0x38, 0x9b, 646 0xea, 0xeb, 0xee, 0xae, 0x34, 0xc8, 0x01, 0xd7, 647 0xa5, 0xe3, 0xce, 0x41, 0xad, 0x02, 0x60, 0x23, 648 0x18, 0x36, 0xba, 0x17, 0xfa, 0xcf, 0xe4, 0xda, 649 0xdc, 0xfc, 0x82, 0xdc, 0x7c, 0x11, 0xf4, 0xb8, 650 0x52, 0x5d, 0xf7, 0x2f, 0xc8, 0xfe, 0x4a, 0xe6, 651 0xb9, 0xaf, 0x4b, 0x17, 0x18, 0x91, 0xc2, 0xfe, 652 0xd7, 0x3a, 0x77, 0x0c, 0xa0, 0x43, 0x9c, 0x6f, 653 0x13, 0x06, 0xbe, 0x6e, 0xe0, 0x1a, 0x3c, 0xf3, 654 0xf5, 0xcc, 0x78, 0xfb, 0x5d, 0xd5, 0xda, 0xb7, 655 0x58, 0xea, 0x86, 0x42, 0x6b, 0x32, 0xff, 0xb2, 656 0xe2, 0xee, 0x03, 0x1f, 0xf4, 0xef, 0xdb, 0x53, 657 0x79, 0xd5, 0x4e, 0xaf, 0x60, 0x8e, 0x02, 0xc2, 658 0xcc, 0x39, 0x97, 0x7b, 0xfd, 0xa1, 0xf8, 0x7a, 659 0x26, 0xe8, 0x55, 0xd6, 0xa4, 0x8b, 0xa0, 0x1b, 660 0x2d, 0x63, 0xaa, 0x73, 0x71, 0x6e, 0xbf, 0x8b, 661 0x3b, 0xe3, 0x1b, 0x0d, 0xbb, 0x2e, 0x44, 0x09, 662 0x64, 0xac, 0xc7, 0x9e, 0xb5, 0xc6, 0x77, 0xb0, 663 0x79, 0xb3, 0xaa, 0xfc, 0x67, 0x57, 0x9a, 0x50, 664 0x81, 0x37, 0x14, 0x7c, 0xd7, 0xa0, 0xd4, 0x6a, 665 0x79, 0x84, 0x51, 0x0e, 0x95, 0x0a, 0x30, 0xa3, 666 0x60, 0x55, 0x48, 0x05, 0x16, 0xae, 0x43, 0x90, 667 0xdc, 0x8e, 0x09, 0xbe, 0x79, 0xf6, 0x90, 0x74, 668 0xf8, 0x20, 0x96, 0x4d, 0xa7, 0xf5, 0x1a, 0x2b, 669 0xc7, 0x15, 0x9d, 0x18, 0xf7, 0x94, 0x87, 0xf7, 670 0xf4, 0xfb, 0x0d, 0x61, 0xb6, 0xd7, 0xbe, 0x10, 671 0x8e, 0x47, 0x3c, 0x10, 0x44, 0x90, 0x52, 0x21, 672 0x83, 0xc0, 0xf5, 0x99, 0xaa, 0xbc, 0xf6, 0x55, 673 0xae, 0xf5, 0xb2, 0xa4, 0xcd, 0x4d, 0xb9, 0x38, 674 0x6c, 0xbc, 0x80, 0xc3, 0xad, 0xf4, 0x46, 0x31, 675 0x01, 0x58, 0x2d, 0x88, 0x57, 0xc3, 0x23, 0xd1, 676 0x64, 0xc9, 0xa3, 0x21, 0x6b, 0x8b, 0x8a, 0x23, 677 0x2c, 0x4f, 0xa9, 0xcd, 0x67, 0xfa, 0x77, 0xad, 678 0xa3, 0x16, 0xa2, 0xe5, 0x19, 0x14, 0x70, 0x41, 679 0x5b, 0xda, 0x14, 0xde, 0xe3, 0xe5, 0xc1, 0x15, 680 0xb4, 0x77, 0xa4, 0x9b, 0xb8, 0xb1, 0x28, 0x51, 681 0x30, 0xb4, 0xf1, 0xf3, 0xf8, 0x6d, 0xd0, 0xc3, 682 0x8c, 0x4c, 0x76, 0xb0, 0x9a, 0xdf, 0xc8, 0xbe, 683 0xf8, 0x4a, 0x61, 0x6e, 0x3e, 0xd6, 0x3c, 0xe8, 684 0xde, 0x56, 0xa0, 0x9c, 0x25, 0xbe, 0xce, 0x93, 685 0x1f, 0x88, 0xfb, 0x9a, 0x1a, 0xe2, 0xff, 0x88, 686 0xad, 0x10, 0xcb, 0x6c, 0xd6, 0xe7, 0x39, 0x0b, 687 0xe5, 0x1a, 0x06, 0x05, 0x64, 0x5b, 0x0a, 0xdf, 688 0x22, 0x58, 0xd7, 0xfb, 0x88, 0x12, 0xdd, 0xb7, 689 0x52, 0x3a, 0xc9, 0xbf, 0x49, 0xdf, 0x8c, 0x87, 690 0x9f, 0x84, 0xb5, 0x0a, 0xf6, 0x00, 0x52, 0xae, 691 0x67, 0x12, 0x1a, 0x8c, 0x71, 0x15, 0xf5, 0xa1, 692 0x13, 0x39, 0xf0, 0x91, 0x7e, 0x88, 0x7c, 0xb3, 693 0x95, 0x50, 0x02, 0xa6, 0x63, 0xb5, 0x64, 0xfb, 694 0x90, 0x87, 0x61, 0xe2, 0x27, 0xaf, 0x11, 0x0c, 695 0x73, 0x83, 0xef, 0xa9, 0x28, 0xfe, 0xc8, 0x85, 696 0x1a, 0x3a, 0xde, 0xf2, 0xe5, 0x25, 0x64, 0x6d, 697 0xaa, 0x41, 0x4c, 0x80, 0x2e, 0x84, 0xff, 0xc1, 698 0xc0, 0x54, 0x0c, 0x29, 0x1b, 0xa3, 0x07, 0x7c, 699 0x33, 0x4c, 0x10, 0xf6, 0x6f, 0x79, 0xdf, 0xd3, 700 0xf0, 0x24, 0x57, 0xf1, 0x60, 0xe1, 0xf0, 0xbd, 701 0xc4, 0x1f, 0xf4, 0x67, 0xd2, 0xd3, 0xcc, 0x6a, 702 0x07, 0x72, 0x44, 0x16, 0x85, 0x46, 0xd0, 0x73, 703 0x87, 0xa9, 0xc7, 0x2f, 0xd1, 0xf5, 0xec, 0xe3, 704 0x28, 0xa3, 0x93, 0x4f, 0xd7, 0x76, 0xc1, 0x3c, 705 0x0d, 0x13, 0x33, 0xcf, 0x5b, 0xbd, 0x6a, 0x52, 706 0x4e, 0xee, 0xc8, 0x5e, 0xa1, 0x58, 0x4a, 0x08, 707 0x81, 0xd9, 0x23, 0xcc, 0xfb, 0x1c, 0xb2, 0xd8, 708 0xa3, 0xe4, 0x53, 0xfe, 0xf4, 0x4b, 0x48, 0xc1, 709 0x20, 0xa4, 0x97, 0xf8, 0x38, 0xa3, 0x69, 0xc1, 710 0x11, 0xf0, 0xa1, 0x3b, 0xa9, 0x9a, 0x12, 0x61, 711 0xe8, 0x8d, 0x99, 0x44, 0x3f, 0x94, 0x72, 0x82, 712 0x19, 0x96, 0x62, 0xb0, 0xa6, 0x64, 0x05, 0x19, 713 0x8f, 0xd6, 0x5d, 0x05, 0xbf, 0x79, 0x9e, 0x9d, 714 0xe4, 0x93, 0x4c, 0xad, 0x61, 0x8c, 0x18, 0xda, 715 0xb6, 0x2e, 0xb3, 0xca, 0x14, 0x4d, 0x53, 0xa4, 716 0x97, 0x27, 0x10, 0x56, 0xa2, 0x67, 0x5a, 0x5a, 717 0x5e, 0x13, 0xc0, 0xdb, 0xa7, 0x9f, 0x45, 0x5b, 718 0xeb, 0x1a, 0x14, 0x0c, 0x8c, 0x38, 0x5e, 0x77, 719 0x9a, 0xec, 0x75, 0x68, 0x93, 0x65, 0x02, 0x9c, 720 0xfb, 0x62, 0x60, 0x49, 0xdd, 0xb2, 0x2a, 0x67, 721 0x86, 0xe3, 0x8a, 0x7d, 0x8c, 0x46, 0x78, 0x81, 722 0x60, 0x69, 0xf2, 0x3f, 0x74, 0x11, 0x35, 0xff, 723 0x77, 0xa3, 0x66, 0x20, 0xfc, 0x98, 0x4a, 0x35, 724 0x7a, 0x52, 0xe4, 0x90, 0x13, 0x80, 0xb9, 0xa6, 725 0x73, 0x7a, 0x7d, 0x66, 0x6e, 0x6b, 0xb6, 0x43, 726 0x10, 0xd5, 0x91, 0x2b, 0x66, 0xdd, 0x89, 0x87, 727 0xe3, 0x8c, 0x58, 0x53, 0x2f, 0x40, 0x74, 0x45, 728 0x1b, 0x77, 0x7a, 0xa4, 0x44, 0x19, 0x78, 0xba, 729 0x87, 0x10, 0x41, 0x31, 0x32, 0x5f, 0x87, 0x68, 730 0xde, 0x43, 0x4a, 0xef, 0x33, 0xb3, 0x11, 0x83, 731 0xa9, 0xc2, 0x6f, 0x8d, 0x34, 0xe2, 0x95, 0x84, 732 0x3a, 0x4f, 0x6f, 0x8c, 0x31, 0x1d, 0xb6, 0xf5, 733 0x95, 0x0d, 0x01, 0x11, 0x20, 0xdf, 0x72, 0xf3, 734 0x3f, 0x9a, 0x33, 0xaa, 0xb1, 0x06, 0x6a, 0x63, 735 0x47, 0x91, 0x01, 0xdf, 0xb3, 0x54, 0x36, 0xfd, 736 0x06, 0x2d, 0xb8, 0x08, 0xe3, 0xd3, 0x65, 0xac, 737 0x66, 0x03, 0xee, 0xa4, 0x63, 0xbd, 0xd4, 0xce, 738 0xbd, 0x79, 0xa7, 0x48, 0x38, 0xc5, 0x7d, 0xb5, 739 0x71, 0x9a, 0x3c, 0x11, 0x7c, 0x6c, 0xe2, 0x54, 740 0x02, 0x5d, 0x42, 0xab, 0x25, 0x93, 0x66, 0x01, 741 0x37, 0x78, 0x35, 0x4a, 0x8c, 0x19, 0x4d, 0x00, 742 0x75, 0x4f, 0xcc, 0xc0, 0x26, 0x82, 0xc1, 0x35, 743 0x8c, 0xc7, 0xc2, 0x59, 0x01, 0x3e, 0x98, 0x22, 744 0x88, 0x9c, 0x90, 0x75, 0x05, 0x33, 0x07, 0xb9, 745 0x39, 0x81, 0x38, 0x58, 0x10, 0x29, 0xcf, 0xc8, 746 0x98, 0xb2, 0x03, 0xd7, 0x5b, 0xb3, 0x18, 0xba, 747 0x34, 0x0c, 0x9f, 0xab, 0xd7, 0xed, 0x29, 0x82, 748 0x41, 0xe0, 0x20, 0x97, 0x57, 0x92, 0xb2, 0xb8, 749 0x10, 0x2d, 0x0b, 0xa2, 0xc5, 0x8f, 0x90, 0x6f, 750 0xed, 0x12, 0x56, 0x25, 0xbe, 0xfd, 0x75, 0xf7, 751 0xb6, 0xf8, 0x40, 0x67, 0x39, 0x11, 0xfa, 0x15, 752 0xae, 0x6a, 0x54, 0x5f, 0x32, 0x2b, 0xf8, 0x48, 753 0x55, 0xbe, 0x86, 0x2f, 0x69, 0x48, 0x5b, 0x5d, 754 0x4d, 0xb7, 0x35, 0xaa, 0xb6, 0x91, 0x88, 0x19, 755 0x96, 0x1c, 0x68, 0xf6, 0x85, 0x9e, 0xb3, 0xb2, 756 0xa3, 0x32, 0xd4, 0x52, 0x70, 0xb7, 0x62, 0xe3, 757 0x14, 0xb6, 0x78, 0x5f, 0x1b, 0x1d, 0x04, 0x9c, 758 0x26, 0x0c, 0x33, 0x94, 0xb1, 0x97, 0x08, 0xdb, 759 0x0b, 0x39, 0x29, 0xd4, 0xbc, 0x6d, 0xdf, 0x02, 760 0xc6, 0x99, 0xab, 0x99, 0x32, 0xe5, 0xce, 0x51, 761 0x4f, 0xae, 0xb8, 0x8b, 0xe0, 0xaf, 0x07, 0xc4, 762 0xf9, 0x41, 0x7c, 0x59, 0xa0, 0xac, 0x74, 0x4d, 763 0x7e, 0x43, 0x77, 0x9c, 0x06, 0x49, 0x79, 0x8a, 764 0x14, 0x73, 0x93, 0xa8, 0x5b, 0x1b, 0x34, 0x29, 765 0x78, 0x04, 0x2f, 0xd7, 0x1f, 0x13, 0x90, 0xe0, 766 0xdd, 0x3b, 0x42, 0x6b, 0x79, 0x6e, 0x52, 0xc7, 767 0x0f, 0x38, 0xda, 0x01, 0x2c, 0x8d, 0xe6, 0x94, 768 0x5d, 0x59, 0x27, 0x1d, 0x10, 0x4e, 0x11, 0x36, 769 0xfb, 0x53, 0x16, 0x05, 0x25, 0xf2, 0x64, 0xd8, 770 0xf9, 0xcd, 0x5c, 0xfe, 0xb4, 0x18, 0x44, 0x80, 771 0x10, 0xbc, 0x3d, 0xf3, 0x1d, 0x5a, 0xf0, 0xc1, 772 0xc3, 0x55, 0xff, 0x41, 0x3e, 0xe3, 0xef, 0x44, 773 0xb2, 0xc0, 0x01, 0x18, 0xa2, 0x49, 0x88, 0x78, 774 0x0d, 0x4c, 0xc8, 0x73, 0xcf, 0x30, 0x85, 0x3a, 775 0x88, 0x90, 0x01, 0xcf, 0x69, 0x53, 0xa3, 0x18, 776 0x3f, 0xd6, 0xe7, 0x94, 0x14, 0xa7, 0xae, 0xcd, 777 0x6f, 0x11, 0x72, 0xfe, 0x2b, 0xb0, 0x81, 0x53, 778 0xea, 0x67, 0xd6, 0xe4, 0xca, 0x42, 0xa0, 0xf9, 779 0xb1, 0xd4, 0xb5, 0x3b, 0xc9, 0xf0, 0x36, 0xc1, 780 0x1c, 0xf4, 0xb1, 0xf6, 0x84, 0xd0, 0x86, 0x6c, 781 0x76, 0x9a, 0x03, 0xc2, 0xb6, 0x2e, 0x9a, 0x46, 782 0xf5, 0x5f, 0x2c, 0x38, 0xac, 0xad, 0x6f, 0x2e, 783 0x7a, 0x18, 0x2d, 0x22, 0x95, 0x5e, 0x5e, 0xc9, 784 0x7a, 0x0a, 0x56, 0xe1, 0xc7, 0x15, 0xfd, 0xbf, 785 0xff, 0xf7, 0x7e, 0x85, 0x20, 0xa9, 0x8a, 0x9c, 786 0xa9, 0x7d, 0xe8, 0xed, 0xfc, 0x7f, 0xbb, 0xf0, 787 0x05, 0x3f, 0xce, 0x4f, 0x4c, 0xee, 0xa4, 0xa0, 788 0xcc, 0x9c, 0x62, 0x1e, 0xd6, 0xd0, 0x30, 0x37, 789 0xb8, 0x98, 0x56, 0x1d, 0xaa, 0xd6, 0x5e, 0x73, 790 0x12, 0xe4, 0x88, 0x82, 0x48, 0x64, 0x06, 0xd7, 791 0x2a, 0x31, 0x50, 0x7b, 0x10, 0x17, 0xb8, 0x4c, 792 0x5a, 0x8d, 0xf1, 0xfc, 0xf1, 0x33, 0x3b, 0x98, 793 0x42, 0x18, 0x5b, 0x35, 0x78, 0xca, 0x8e, 0x41, 794 0x52, 0xae, 0x6d, 0xe1, 0xa2, 0x9d, 0x5b, 0xbd, 795 0xf3, 0x5f, 0x49, 0xc1, 0x27, 0x06, 0xc1, 0xaf, 796 0xc0, 0xa3, 0x9d, 0xf3, 0x1c, 0x8e, 0x90, 0x8a, 797 0xb0, 0x69, 0xb0, 0xc5, 0x11, 0x0c, 0x91, 0x14, 798 0x1f, 0x5e, 0x10, 0xe1, 0x1d, 0x14, 0x30, 0x54, 799 0x1e, 0x17, 0x3d, 0x31, 0x7b, 0xbf, 0x2f, 0x9d, 800 0x6d, 0x63, 0x32, 0xf0, 0x9d, 0x9f, 0x95, 0x3d, 801 0x0b, 0xd2, 0x4d, 0x10, 0xe2, 0x3f, 0x67, 0x69, 802 0x43, 0x9a, 0x4a, 0x2c, 0x54, 0x71, 0xa8, 0xa0, 803 0x9e, 0x9f, 0x10, 0xaf, 0x1b, 0xce, 0x99, 0xe3, 804 0x25, 0x32, 0x10, 0x54, 0x80, 0xfe, 0xda, 0x57, 805 0xd0, 0xb2, 0x92, 0x7f, 0xbb, 0x5f, 0xe7, 0x4d, 806 0x1b, 0x3d, 0x46, 0x4d, 0xe4, 0x4c, 0xd6, 0xaf, 807 0x1a, 0x32, 0x12, 0x40, 0xb8, 0x84, 0x8e, 0xe4, 808 0x80, 0xce, 0x7e, 0xc1, 0x13, 0x8b, 0xb0, 0xb7, 809 0x6f, 0x24, 0xba, 0x85, 0x50, 0x83, 0xc3, 0xcf, 810 0x19, 0xb3, 0xf0, 0xc7, 0xee, 0x68, 0xbe, 0x9e, 811 0x6d, 0xb9, 0xfb, 0xd5, 0x29, 0xce, 0x82, 0xcd, 812 0x69, 0x16, 0x68, 0x6b, 0x6a, 0xf4, 0x02, 0x32, 813 0xce, 0x60, 0x37, 0x0c, 0xb9, 0x38, 0x92, 0x9c, 814 0x42, 0xa9, 0x0b, 0x53, 0x96, 0xfe, 0x39, 0xc1, 815 0x24, 0x65, 0x9b, 0xcd, 0xe7, 0x8d, 0x36, 0x07, 816 0x9f, 0x1d, 0x35, 0x8e, 0xdc, 0x4c, 0xb5, 0x68, 817 0xc5, 0xfd, 0x44, 0x19, 0xf2, 0x6c, 0x59, 0x1c, 818 0xb1, 0x0b, 0x35, 0x48, 0x86, 0x1a, 0x05, 0x22, 819 0x03, 0x0c, 0x0c, 0xa2, 0x92, 0x90, 0x35, 0xfb, 820 0x37, 0x94, 0xc7, 0x15, 0x84, 0xae, 0xe8, 0x05, 821 0xa0, 0xf7, 0x30, 0x11, 0x5c, 0xe4, 0x5d, 0x3e, 822 0x12, 0x54, 0x80, 0x54, 0x6b, 0x09, 0x8c, 0xce, 823 0x80, 0x5e, 0xa7, 0xc8, 0x6a, 0x0c, 0x56, 0xe1, 824 0x18, 0x7d, 0xc9, 0x39, 0xc1, 0xef, 0xe3, 0x25, 825 0xa0, 0x8b, 0x2f, 0x60, 0x3a, 0x43, 0x39, 0xa6, 826 0x28, 0x28, 0x7b, 0x4c, 0x77, 0xd4, 0x49, 0x61, 827 0x46, 0xe9, 0x1b, 0x45, 0xd6, 0xb1, 0x56, 0xe1, 828 0x7d, 0x34, 0xcd, 0x06, 0xb6, 0x67, 0x8d, 0x7d, 829 0x7a, 0xe2, 0xbe, 0x68, 0x35, 0xa6, 0x78, 0xe5, 830 0x47, 0x48, 0xb7, 0xc7, 0xde, 0xcd, 0xc9, 0x05, 831 0xb4, 0xe7, 0x50, 0x48, 0xe1, 0x4b, 0xfe, 0x76, 832 0x77, 0xc6, 0xf7, 0x5f, 0xcb, 0xc2, 0xa8, 0xd7, 833 0xd6, 0x8a, 0xe5, 0x49, 0xd9, 0xca, 0x45, 0xf4, 834 0xda, 0xcd, 0x33, 0xd1, 0x59, 0x2d, 0x9e, 0xc1, 835 0x5c, 0xe6, 0x01, 0x18, 0xb8, 0xf0, 0x5e, 0xb1, 836 0x69, 0x95, 0x2f, 0x02, 0x2a, 0xe7, 0x4a, 0xd7, 837 0xd1, 0xc3, 0xd5, 0x6f, 0x15, 0xc8, 0xdc, 0x29, 838 0xde, 0xb9, 0x3f, 0x8b, 0xa6, 0xbc, 0xdd, 0x25, 839 0x84, 0x35, 0x3c, 0x90, 0x2d, 0xc2, 0x1e, 0x98, 840 0x8a, 0x50, 0x09, 0x77, 0x42, 0xe9, 0x35, 0x8a, 841 0x7c, 0x97, 0xbf, 0xe8, 0xbf, 0x56, 0xd0, 0x8b, 842 0x65, 0xd3, 0xaf, 0x1e, 0x05, 0x94, 0xfa, 0xac, 843 0xa8, 0x2b, 0x28, 0xcb, 0x37, 0x3e, 0xe8, 0xbb, 844 0x66, 0x3a, 0xed, 0xb2, 0x48, 0x10, 0x0f, 0x3a, 845 0x5a, 0xc5, 0xdb, 0x26, 0x0e, 0xaa, 0x5e, 0x69, 846 0x15, 0xd6, 0x81, 0xae, 0xbd, 0xe6, 0x03, 0xf1, 847 0xf6, 0x37, 0xc8, 0xde, 0x70, 0x1f, 0x64, 0xb9, 848 0x5e, 0xbf, 0x2e, 0x4f, 0xb1, 0xea, 0xa0, 0x17, 849 0xe6, 0x7c, 0xf9, 0x2f, 0x1e, 0xd8, 0x58, 0xde, 850 0xa7, 0xf0, 0x46, 0x52, 0x95, 0xdf, 0xa4, 0x96, 851 0xd0, 0xc4, 0x97, 0x2b, 0x95, 0xcd, 0x5e, 0x40, 852 0x23, 0x5c, 0x10, 0xee, 0xba, 0x72, 0x9b, 0xcf, 853 0x0b, 0xe8, 0x18, 0x3a, 0x70, 0xd2, 0x5e, 0x07, 854 0x68, 0x93, 0xef, 0x4a, 0x5b, 0x8d, 0x72, 0x41, 855 0x4e, 0xea, 0x33, 0x6a, 0x0a, 0x5e, 0xfb, 0x02, 856 0x3f, 0xd4, 0xed, 0x5b, 0xe0, 0x42, 0x84, 0xd4, 857 0xaa, 0x85, 0xdc, 0x5b, 0x67, 0xee, 0x71, 0x67, 858 0xba, 0x8e, 0xd2, 0xbe, 0x61, 0xdf, 0x5a, 0x26, 859 0xb9, 0xf0, 0x77, 0x81, 0x53, 0x24, 0x16, 0xcb, 860 0x8c, 0xb8, 0x06, 0x6e, 0x68, 0xda, 0xc8, 0x2d, 861 0x17, 0x54, 0xdb, 0x46, 0xcb, 0xfd, 0x1f, 0x3d, 862 0x94, 0x81, 0x09, 0x4b, 0xfa, 0xb1, 0x46, 0xd9, 863 0x11, 0xa3, 0xb7, 0x31, 0x9c, 0xd2, 0x38, 0xd6, 864 0xba, 0x3d, 0xa3, 0x74, 0xd8, 0xf1, 0x24, 0xe8, 865 0x9c, 0xcb, 0x1d, 0xf9, 0x4a, 0xf7, 0xc8, 0x4b, 866 0xfe, 0x97, 0x7c, 0xa1, 0x02, 0xeb, 0x40, 0xc3, 867 0x89, 0x71, 0x01, 0xcd, 0x33, 0x2a, 0xc2, 0x82, 868 0xce, 0x62, 0x8d, 0x53, 0x7c, 0xdf, 0xce, 0xd7, 869 0xf5, 0xa8, 0x4f, 0xf2, 0xf2, 0x2e, 0xc1, 0xeb, 870 0x97, 0x99, 0x37, 0x3c, 0x53, 0xa6, 0xb4, 0x46, 871 0x05, 0x64, 0x92, 0x87, 0x08, 0x3c, 0x23, 0x4b, 872 0x9d, 0x67, 0x18, 0xf9, 0xe2, 0x0b, 0x1c, 0x39, 873 0xd3, 0x87, 0x70, 0xc0, 0xb9, 0x1e, 0x52, 0x0a, 874 0x0f, 0x48, 0xe2, 0xe7, 0x51, 0x72, 0x94, 0xf7, 875 0xa3, 0xdc, 0xe5, 0x66, 0x33, 0x39, 0x54, 0x06, 876 0x55, 0x93, 0x30, 0xf9, 0x5e, 0x76, 0x8f, 0xe0, 877 0x59, 0x4d, 0x0d, 0xa7, 0xf5, 0xbe, 0xdb, 0x20, 878 0xad, 0x0d, 0x76, 0x88, 0x5f, 0x9c, 0x7c, 0x75, 879 0x2f, 0x2a, 0x0b, 0x79, 0x6e, 0xd3, 0xe2, 0x66, 880 0xf5, 0x4a, 0x2d, 0x87, 0x87, 0x49, 0x84, 0x17, 881 0xa2, 0x62, 0x4c, 0xbb, 0xe4, 0x6e, 0x98, 0x10, 882 0xc9, 0xfb, 0x8a, 0x04, 0x68, 0x8d, 0x22, 0x66, 883 0xad, 0xea, 0x2a, 0xc9, 0x97, 0x2d, 0x3c, 0xbc, 884 0xd0, 0x77, 0x5f, 0xe6, 0xb8, 0x7f, 0xe6, 0xf6, 885 0x39, 0xbf, 0x56, 0x0e, 0x26, 0x6d, 0xc5, 0x3e, 886 0x53, 0x19, 0xd6, 0xb4, 0x57, 0x36, 0xa3, 0xc6, 887 0xd3, 0x3d, 0x66, 0x79, 0x30, 0x5c, 0x14, 0x0c, 888 0x0f, 0x3e, 0x96, 0xae, 0x90, 0x97, 0xab, 0x0d, 889 0x9f, 0xc3, 0xe7, 0x66, 0x3e, 0xe0, 0x31, 0x43, 890 0x4b, 0x01, 0xb3, 0x0e, 0x9e, 0x8c, 0x82, 0x4a, 891 0x8c, 0xc7, 0x79, 0x85, 0xdf, 0x75, 0x0d, 0xb4, 892 0x2b, 0x03, 0x14, 0xef, 0x72, 0x58, 0xfd, 0x64, 893 0xc8, 0xe3, 0x0d, 0x9a, 0x14, 0x6f, 0x76, 0xf9, 894 0x46, 0xd1, 0xd2, 0x81, 0xb3, 0x16, 0x6e, 0xc7, 895 0x76, 0x82, 0xce, 0xf4, 0xee, 0x33, 0x00, 0xe6, 896 0x77, 0xc4, 0xad, 0x4f, 0x06, 0xa7, 0x48, 0x80, 897 0x9e, 0x21, 0x66, 0xca, 0x75, 0x69, 0x57, 0xcb, 898 0xf0, 0x67, 0x6a, 0xaa, 0x8f, 0x88, 0x14, 0xbd, 899 0x65, 0x62, 0xe2, 0xad, 0xcc, 0x22, 0x88, 0x7b, 900 0x94, 0xbd, 0x0e, 0xcd, 0xb6, 0x69, 0xa2, 0xcb, 901 0x7d, 0x57, 0x5c, 0xb4, 0x92, 0x80, 0x13, 0x99, 902 0x84, 0xf3, 0x79, 0x0a, 0x2d, 0x70, 0xa4, 0xe0, 903 0xde, 0xc6, 0x32, 0xb0, 0x8a, 0x62, 0xb5, 0xcf, 904 0xfa, 0x5e, 0x5a, 0x92, 0x32, 0x7d, 0x34, 0x07, 905 0xb5, 0x52, 0x3a, 0xb5, 0x7d, 0x0f, 0xa1, 0xba, 906 0x56, 0xd0, 0x07, 0x76, 0x11, 0xf2, 0xc3, 0x33, 907 0x9d, 0xbd, 0x12, 0x35, 0x5e, 0xf7, 0x05, 0x88, 908 0x76, 0x94, 0xa6, 0xbf, 0xed, 0xb8, 0xa4, 0xa2, 909 0x0c, 0xbe, 0x0f, 0x6a, 0xaf, 0xf3, 0x1b, 0x33, 910 0x4a, 0xb7, 0x68, 0x3f, 0xbe, 0x95, 0x13, 0x97, 911 0x0f, 0x15, 0x17, 0x1b, 0x23, 0xaa, 0x08, 0x78, 912 0xa6, 0x5b, 0x08, 0xa2, 0x9d, 0x03, 0xa8, 0xa7, 913 0x39, 0xdc, 0xbc, 0x9a, 0x85, 0xf5, 0xe5, 0x55, 914 0x59, 0x3c, 0xef, 0xf9, 0x3f, 0x22, 0x8e, 0xf8, 915 0xd8, 0x3e, 0x02, 0x0b, 0xd8, 0x78, 0x4b, 0x15, 916 0x7f, 0xaa, 0x2c, 0xff, 0xbe, 0x77, 0x33, 0xc7, 917 0x6a, 0x12, 0xaa, 0xa4, 0xbe, 0xc0, 0x3b, 0xcb, 918 0x13, 0x9d, 0x9c, 0x5a, 0x9f, 0x8a, 0x57, 0x36, 919 0x4f, 0x02, 0x5a, 0xf8, 0x1d, 0x97, 0x77, 0x43, 920 0xc8, 0xa5, 0xb7, 0x9b, 0x10, 0x98, 0xfd, 0x58, 921 0xbf, 0x42, 0xf6, 0xbf, 0xff, 0x6c, 0x40, 0x18, 922 0x18, 0xdf, 0xac, 0x57, 0x71, 0xea, 0xcc, 0x8e, 923 0xfd, 0xfe, 0x10, 0xfb, 0xb9, 0xfe, 0xbc, 0x9a, 924 0x9c, 0x27, 0xe4, 0x10, 0x15, 0x94, 0x41, 0xa1, 925 0xcc, 0xf6, 0x25, 0x49, 0x4f, 0x96, 0xc1, 0x8c, 926 0x9e, 0x3e, 0x18, 0x29, 0x49, 0x92, 0xe7, 0xfe, 927 0x22, 0xff, 0xed, 0x02, 0x16, 0x90, 0xef, 0xac, 928 0xec, 0x95, 0x1d, 0x5b, 0x94, 0x9c, 0xf6, 0x7c, 929 0x1b, 0x5a, 0x9d, 0xb0, 0x9b, 0x05, 0x36, 0xbf, 930 0xef, 0xec, 0x63, 0x35, 0x40, 0x24, 0x45, 0x40, 931 0x30, 0x1a, 0x9b, 0x90, 0xc3, 0xc2, 0xf7, 0x37, 932 0xfb, 0x08, 0x8e, 0x48, 0x19, 0x48, 0xed, 0xa8, 933 0xa8, 0x04, 0x6f, 0xd0, 0x33, 0xe9, 0xb8, 0x8d, 934 0xe7, 0x1e, 0x5c, 0x47, 0x74, 0xc0, 0x66, 0x30, 935 0x4e, 0xa7, 0x86, 0x73, 0xf1, 0xe5, 0x78, 0xa6, 936 0xe0, 0xc1, 0xda, 0x13, 0x72, 0x07, 0x85, 0x34, 937 0x63, 0x95, 0x49, 0x30, 0x4b, 0x9d, 0x03, 0xf1, 938 0x7a, 0x6b, 0x91, 0xa2, 0x85, 0x41, 0xf9, 0x4a, 939 0xd6, 0xff, 0xff, 0x86, 0xf7, 0xf0, 0xce, 0xb9, 940 0x07, 0xf1, 0x88, 0x04, 0x33, 0xaa, 0xeb, 0x54, 941 0xb2, 0x1c, 0x8e, 0x2e, 0x7b, 0x04, 0xa8, 0xcc, 942 0x2c, 0x7a, 0xb3, 0xad, 0x1a, 0x89, 0x38, 0x89, 943 0xd7, 0x11, 0x3a, 0x8c, 0xcf, 0xe3, 0xc5, 0xba, 944 0xb0, 0xcc, 0xc4, 0xe3, 0x33, 0xf3, 0x18, 0xba, 945 0xec, 0x56, 0xd9, 0x1c, 0x40, 0x70, 0x0d, 0x4e, 946 0x97, 0x01, 0x23, 0xf3, 0x5a, 0xdc, 0xbf, 0x68, 947 0x93, 0xc2, 0x1d, 0x8a, 0x96, 0xb7, 0xac, 0x18, 948 0x6f, 0xf7, 0x84, 0x71, 0x0d, 0x3d, 0xf8, 0xba, 949 0xdf, 0xb6, 0x89, 0x1d, 0x78, 0x19, 0xf2, 0x59, 950 0xe9, 0x15, 0x55, 0x29, 0x73, 0x50, 0x59, 0x14, 951 0x02, 0x21, 0x16, 0x8f, 0x0f, 0xdf, 0xa5, 0xf0, 952}; 953 954static struct crc_test { 955 uint32_t crc; /* random starting crc */ 956 uint32_t start; /* random offset in buf */ 957 uint32_t length; /* random length of test */ 958 uint32_t crc_le; /* expected crc32_le result */ 959 uint32_t crc_be; /* expected crc32_be result */ 960} test[] = { 961 {0xffffffff, 0x00000000, 0x00001000, 0x13934bef, 0x14f3b75f}, 962 {0xfe7328ea, 0x00000763, 0x00000717, 0xed2c0d70, 0x57531214}, 963 {0x4c40684e, 0x00000721, 0x0000011e, 0xd7f46ccc, 0xedf12ec3}, 964 {0x6b487f90, 0x00000264, 0x000007bc, 0x759e9939, 0x9af8e387}, 965 {0x9f5810db, 0x00000afa, 0x00000255, 0x2685197f, 0x716de6ed}, 966 {0xb15c4755, 0x00000d5b, 0x000002a4, 0xd8fadcb5, 0xfc34ae3f}, 967 {0x06518253, 0x00000ffb, 0x00000004, 0xabee2433, 0xfa30ac9e}, 968 {0xd9e71c55, 0x00000a2a, 0x00000259, 0x96682af2, 0xe5907ea3}, 969 {0x0c1ae843, 0x00000ce4, 0x0000031b, 0x7b637c43, 0xe7f71b04}, 970 {0xec3cd517, 0x000002ff, 0x00000566, 0x5d719a77, 0xed16e045}, 971 {0x77828e95, 0x0000067f, 0x0000038f, 0x43ee5b6c, 0x35999927}, 972 {0xec87b4e3, 0x00000d1c, 0x000002e3, 0x2ddd2eee, 0x9452d3f8}, 973 {0x412158bb, 0x00000eee, 0x00000111, 0x67b38ba2, 0x177976d0}, 974 {0x2e52de3e, 0x00000c4a, 0x000003b5, 0xbcc5d61d, 0xf60fee71}, 975 {0x6ddaae8b, 0x00000d99, 0x00000266, 0x8b535544, 0x1dab8596}, 976 {0x049b6cb1, 0x000009c5, 0x000000b0, 0xfc22cabc, 0x47ebc954}, 977 {0x77d4b954, 0x0000028a, 0x000007fa, 0x71d00923, 0x905585ef}, 978 {0x5e192355, 0x00000ac1, 0x000001fa, 0xb966b81a, 0x33c12903}, 979 {0x7d80b71d, 0x00000213, 0x000001e0, 0x2bba371a, 0x5f4bd8d9}, 980 {0x01f6f1e4, 0x000001d6, 0x00000395, 0xb7e8a647, 0x2a7943a1}, 981 {0x1dfabb13, 0x00000e14, 0x000001eb, 0x53917fba, 0x8dee1e5d}, 982 {0xb00a4449, 0x00000bf6, 0x00000409, 0xedecb577, 0x628e087d}, 983 {0x7ecd3981, 0x0000083f, 0x0000016b, 0xefef62b9, 0xda4f94e6}, 984 {0xf8f330d2, 0x000004be, 0x00000757, 0x9357c9f3, 0x8e2d5c2f}, 985 {0x03c38af2, 0x00000d23, 0x000002dc, 0x360fa8c0, 0x6294c0d6}, 986 {0x687bb79b, 0x00000f3d, 0x000000c2, 0x448d3be2, 0x08f48f3a}, 987 {0x6710f550, 0x000009e9, 0x00000603, 0xdbfd1998, 0xc950ac29}, 988 {0x873171d1, 0x00000787, 0x000004d5, 0xab7f1b62, 0xe66896ab}, 989 {0x373b1314, 0x00000f0f, 0x000000f0, 0x184098ab, 0x4038e674}, 990 {0x90fad9cd, 0x00000ead, 0x00000152, 0x23ce52ff, 0x9eff3974}, 991 {0x19676fe7, 0x0000007d, 0x0000070d, 0xf8a76f1e, 0xfbc5c8a9}, 992 {0x89facd45, 0x000005f3, 0x00000473, 0x4331a006, 0xb8f0f0cc}, 993 {0x6f173747, 0x00000fc3, 0x0000003c, 0xb012f08e, 0x5126e378}, 994 {0x4b44a106, 0x0000075a, 0x0000008b, 0xf6f7ac38, 0xf9b1781b}, 995 {0xb620ad06, 0x00000774, 0x0000017e, 0xd34558e6, 0xb175edd3}, 996 {0x976f21e9, 0x000008d7, 0x0000034a, 0xe533aa3a, 0x1e4367b9}, 997 {0x687628c0, 0x000006c5, 0x0000061b, 0x3a840b15, 0xfb5989a0}, 998 {0xe24ac108, 0x00000cd0, 0x0000032f, 0x51010ae8, 0xcdd8f182}, 999 {0x361c44a3, 0x00000304, 0x00000719, 0xfd7bd481, 0x12de540f}, 1000 {0xd93ff95e, 0x00000db7, 0x0000008e, 0xcfbbc304, 0x42eecd5a}, 1001 {0xed752d12, 0x00000883, 0x00000091, 0x65a6c868, 0x9ebfa578}, 1002 {0xb4ff4b54, 0x000003d3, 0x000001c1, 0xf82597e7, 0xa8ad2b19}, 1003 {0x111b520f, 0x00000708, 0x000000eb, 0xc3e109f3, 0x323ace17}, 1004 {0x62c806f2, 0x00000ba3, 0x0000045c, 0x874d3a72, 0xaf1a1360}, 1005 {0x40d97470, 0x000005e1, 0x0000058d, 0x87a9684f, 0x524244a8}, 1006 {0x4312179c, 0x00000056, 0x0000070e, 0x809a00f5, 0xf9e940b0}, 1007 {0x13d5f84c, 0x00000a2d, 0x00000104, 0xf3d27578, 0x5d33341c}, 1008 {0x1f302cb2, 0x00000151, 0x00000014, 0x1e162693, 0x53c3cfc3}, 1009 {0xe491db24, 0x00000600, 0x000006f6, 0x7ff09615, 0xa300ecf7}, 1010 {0xf9a98069, 0x000002ba, 0x000002ad, 0x01af7387, 0x31c0911e}, 1011 {0xe9c477ad, 0x0000015f, 0x00000778, 0x6facf9a0, 0x1993b688}, 1012 {0x353f32b2, 0x0000087c, 0x00000783, 0x6cc964ea, 0x418db561}, 1013 {0x78e1b24f, 0x00000650, 0x000006a8, 0xb3bb7c27, 0xf2aad006}, 1014 {0x61aa400e, 0x00000049, 0x00000254, 0xb8cd1681, 0x79150b15}, 1015 {0xb84b10b0, 0x00000f73, 0x0000008c, 0x406a6450, 0x0c705222}, 1016 {0x9fa99c9c, 0x00000a7c, 0x000004d7, 0xfb3d21b4, 0xe4e789df}, 1017 {0x3fc9ebe3, 0x00000cd9, 0x000000d6, 0x43803f9c, 0x5a152be5}, 1018 {0x529879cd, 0x000002f2, 0x00000595, 0x78b4c6a6, 0xf7236ec4}, 1019 {0x3a933019, 0x00000516, 0x00000266, 0xdcb45436, 0x2c7935f5}, 1020 {0x887b4977, 0x00000227, 0x0000038d, 0xc5f7c3d9, 0x0d6d7df6}, 1021 {0x770745de, 0x000008c6, 0x00000739, 0xf69145e8, 0x47d5efc9}, 1022 {0x28be3b47, 0x00000c46, 0x0000032b, 0x764c028f, 0x1eb70d64}, 1023 {0x5013a050, 0x00000cf6, 0x00000309, 0xea8fe164, 0x186affa4}, 1024 {0x2ec4c9ba, 0x000006e8, 0x0000078d, 0xa35557a9, 0xb41f49ec}, 1025 {0xa9f950c9, 0x00000d33, 0x000002cc, 0x41ea8618, 0xab8dfae3}, 1026 {0x5b520229, 0x000007b2, 0x00000484, 0x44569f1f, 0x607a8052}, 1027 {0xd8dcbbfc, 0x0000002f, 0x0000048c, 0xdb88ab8b, 0xf1c411f1}, 1028 {0x25529792, 0x00000d1d, 0x000002e2, 0x20cda404, 0x32683a2d}, 1029 {0x9f3f6d71, 0x00000238, 0x0000079a, 0x0720443e, 0x4b8ba2ff}, 1030 {0x64121215, 0x000007ff, 0x0000038f, 0x6aacff2c, 0x3b84233b}, 1031 {0xfb6cdde0, 0x00000ef8, 0x00000107, 0xbd43a0f1, 0x926624d0}, 1032 {0x221c9d6f, 0x000007b6, 0x0000014f, 0xb67f834b, 0x2bdedda4}, 1033 {0x030e1de4, 0x00000836, 0x000004b4, 0x0d67d26a, 0x75a73b73}, 1034 {0xb56fa6cf, 0x00000c07, 0x000003f8, 0x60601ac1, 0x10a43f35}, 1035 {0xb55c89f5, 0x0000098e, 0x000001d4, 0x2400efbe, 0x006e28eb}, 1036 {0x5e90b6d5, 0x0000070b, 0x000003ea, 0x3bb5d6ea, 0xb175fa6b}, 1037 {0x2a7045ae, 0x00000961, 0x00000633, 0xfca89e4b, 0x962cd6d2}, 1038 {0x8b374ea9, 0x000006ba, 0x00000780, 0xbce036ed, 0x4dc8279b}, 1039 {0x8bd90bc9, 0x00000562, 0x00000369, 0xcb26a24b, 0x50dee743}, 1040 {0x5b1b1762, 0x000000fd, 0x0000051a, 0x33cdda07, 0xee75ff7b}, 1041 {0xa4153555, 0x0000058f, 0x000005c7, 0xbe50eeca, 0xe73fffcc}, 1042 {0x0be1f931, 0x00000651, 0x00000672, 0x95a25753, 0x4ad6270f}, 1043 {0xb7e78618, 0x00000a7f, 0x000002bb, 0xe06bcc1c, 0x1a35ee59}, 1044 {0x4a9bc41b, 0x00000e51, 0x000001ae, 0x709e8d2c, 0x75080ca8}, 1045 {0xfc359d13, 0x00000440, 0x000002f8, 0x0a58451f, 0x6fa3cfbf}, 1046 {0x5aa48619, 0x000006d1, 0x00000284, 0x928ead83, 0xbd600efc}, 1047 {0xa609afa8, 0x0000053e, 0x00000272, 0xb048c141, 0x184f80bb}, 1048 {0x3f108afb, 0x00000949, 0x00000150, 0x9a6bb5bc, 0x0ea02be1}, 1049 {0x79bec2d3, 0x000008ed, 0x00000712, 0x32692d57, 0x2eb13289}, 1050 {0x9429e067, 0x00000bc3, 0x0000043c, 0x5295ceff, 0x8a9014a7}, 1051 {0xae58b96a, 0x0000082d, 0x000007d2, 0xc2a681ba, 0x6af94089}, 1052 {0x95df24be, 0x00000985, 0x000004c1, 0x3a287765, 0x379fcb42}, 1053 {0x5e94976f, 0x00000596, 0x000004ed, 0xff00c489, 0x991fc1f5}, 1054 {0xf5e5f1de, 0x00000d31, 0x000002ce, 0x35f28e91, 0x543def1a}, 1055 {0xa2c219cf, 0x00000a3c, 0x00000374, 0x707d21eb, 0xa6d28bc1}, 1056 {0xf21b6ceb, 0x00000919, 0x00000135, 0x0847fb8b, 0x224468c2}, 1057 {0xaa988728, 0x00000787, 0x00000771, 0x885aeaa4, 0x814db00b}, 1058 {0xaa5dfaac, 0x000003e5, 0x0000051b, 0x52c48ab7, 0x725bef8a}, 1059 {0x0a053968, 0x00000d2a, 0x000002d5, 0x7a90256d, 0xc53b9402}, 1060 {0x1421dc20, 0x00000eef, 0x00000110, 0x97d6da24, 0x10846935}, 1061 {0xb47c2166, 0x00000a6a, 0x00000209, 0xcfd6cc52, 0x46e2797e}, 1062 {0x77dd1955, 0x000000de, 0x00000266, 0xba74bcaa, 0x4fa3fe9c}, 1063 {0x68a03cc2, 0x0000082f, 0x000007b0, 0x752bd5d8, 0x4f760c63}, 1064 {0x0226b0a3, 0x00000a5f, 0x000005a0, 0x82de4970, 0x8ee1310e}, 1065 {0x637bf3b1, 0x00000d93, 0x0000026c, 0x5c7115cb, 0x9f6a0ced}, 1066 {0x3b120edf, 0x00000c13, 0x000003ec, 0x80d7d20f, 0x241657d5}, 1067 {0xe2456780, 0x000002eb, 0x00000641, 0xc0a5d289, 0x74df96b4}, 1068 {0x9b2e7125, 0x00000c0c, 0x000003f3, 0xcc15f57e, 0x03e290bf}, 1069 {0x153033ef, 0x00000787, 0x000006b6, 0x3cde443b, 0x7bf1d121}, 1070 {0x18458b3f, 0x0000066c, 0x00000561, 0x9a2bd8c6, 0x9d564bef}, 1071 {0x4ff9d4b9, 0x00000c8f, 0x0000033a, 0xd0ee6d6d, 0xee00aa0b}, 1072 {0xdf84b5d9, 0x00000802, 0x0000029a, 0xdab0d74a, 0xd0cb63dc}, 1073 {0x81ee15df, 0x000003ce, 0x00000725, 0x9942e2de, 0xe48fb26b}, 1074 {0x5c768e04, 0x00000afd, 0x00000160, 0x36110831, 0x8dc74483}, 1075 {0xe5e18094, 0x00000b4b, 0x000000a0, 0xffa3e4a7, 0xc0145e1b}, 1076 {0xed7263b6, 0x00000d0d, 0x000002f2, 0xb0006a35, 0x5468ae3a}, 1077 {0x5bfde7d7, 0x000006fb, 0x00000554, 0xa4193b76, 0xb73d34b2}, 1078 {0x67f4a743, 0x00000b85, 0x0000047a, 0xf05c8d8f, 0x4f843e49}, 1079 {0xf13bdf22, 0x00000ff7, 0x00000008, 0x816351eb, 0x41f537f6}, 1080 {0x08ecc608, 0x00000d5d, 0x00000098, 0x90492772, 0xf5172204}, 1081 {0x296f52ba, 0x000004f9, 0x00000788, 0x5e5a4896, 0xe01d5b46}, 1082 {0xbe4624c2, 0x00000427, 0x000004ef, 0xcd267b94, 0x7b9069f4}, 1083 {0x906f7c7c, 0x00000a05, 0x0000003f, 0x03fcfc33, 0x7b6ff563}, 1084 {0x8f7b323e, 0x00000458, 0x000004c7, 0xcd4969c8, 0xd4c22ada}, 1085 {0x88d6593d, 0x00000597, 0x000005b5, 0xf199cd3b, 0x5c3e8ca2}, 1086 {0x978a7768, 0x00000268, 0x000001d3, 0xb28c95bd, 0x49a2cc67}, 1087 {0x857a621e, 0x000007a7, 0x000003a8, 0xf4bf84ab, 0xde26f369}, 1088 {0xb0e121ef, 0x000005be, 0x00000644, 0x28747c14, 0x61d4dc6b}, 1089 {0, 0, 0, 0, 0}, 1090}; 1091 1092static int test_crc32c(void) 1093{ 1094 struct crc_test *t = test; 1095 int failures = 0; 1096 1097 while (t->length) { 1098 uint32_t be, le; 1099 le = ext2fs_crc32c_le(t->crc, test_buf + t->start, t->length); 1100 be = ext2fs_crc32c_be(t->crc, test_buf + t->start, t->length); 1101 if (le != t->crc_le) { 1102 printf("Test %d LE fails, %x != %x\n", 1103 (t - test), le, t->crc_le); 1104 failures++; 1105 } 1106 if (be != t->crc_be) { 1107 printf("Test %d BE fails, %x != %x\n", 1108 (t - test), be, t->crc_be); 1109 failures++; 1110 } 1111 t++; 1112 } 1113 1114 return failures; 1115} 1116 1117int main(int argc, char *argv[]) 1118{ 1119 int ret; 1120 1121 ret = test_crc32c(); 1122 if (!ret) 1123 printf("No failures.\n"); 1124 1125 return ret; 1126} 1127#endif /* UNITTEST */ 1128