cdrom_crc/
lib.rs

1//! This module contains functions for calculating CRCs as defined in
2//! the CD-DA and CD-ROM standards.
3//!
4//! The CD standards use [CRCs (cyclic redundancy checks)](https://en.wikipedia.org/wiki/Cyclic_redundancy_check)
5//! as a way to allow a player to check for corruption of low-level metadata.
6//! Since CDs are a physical medium that can suffer from scratches, dust, and other
7//! damage, it's important to be able to know that playback metadata is actually
8//! accurate before trying to read it.
9//!
10//! The CD-DA and CD-ROM standards use two types of CRC functions in different
11//! parts of each sector:
12//!
13//! 1. A 32-bit CRC within the error correction metadata located within each sector.
14//! 2. A 16-bit CRC within the second [subcode](https://en.wikipedia.org/wiki/Compact_Disc_subcode).
15//!
16//! This crate currently only provides the 16-bit CRC.
17//!
18//! This crate incorporates an adaptation of a CRC function from the
19//! [Ruby crc gem](https://rubygems.org/gems/crc) by dearblue.
20
21/*
22 * A CRC calculator for {CRC-16-0x1021 init=0 xor=~0}.
23 *
24 * This code is auto generated by <https://rubygems.org/gems/crc>.
25 *
26 * * License:: Creative Commons License Zero (CC0 / Public Domain)
27 *             See <https://creativecommons.org/publicdomain/zero/1.0/>
28 * * Version:: crc-0.4.1 (powered by ruby 2.5.0p0 (2017-12-25 revision 61468) [x86_64-darwin17])
29 * * Generated at:: 2018-04-30
30 * * Algorithm:: slicing-by-16 (with byte-order free), based Intel's slicing-by-8
31 * * Need available memory:: about 1 MiB
32 *
33 * Translated into Rust with minimal changes.
34 * This is a variant of the CCITT CRC16 routine.
35 * With an initial CRC of 0xFFFF, this produces data suitable for use in
36 * CD-ROM subchannels.
37 */
38
39pub const CRC16_BITSIZE:        usize = 16;
40pub const CRC16_BITMASK:        u16   = 0xFFFFu16;
41pub const CRC16_POLYNOMIAL:     u16   = 0x1021u16;
42pub const CRC16_INITIAL_CRC:    u16   = 0xFFFFu16;
43pub const CRC16_XOR_OUTPUT:     u16   = 0xFFFFu16;
44pub const CRC16_REFLECT_INPUT:  bool  = false;
45pub const CRC16_REFLECT_OUTPUT: bool  = false;
46
47/// Calculates a 16-bit CRC for the supplied data.
48/// This is the form of CRC used by the CD standard's Q subcode data.
49/// `initial_crc` is an initial CRC value which will be updated as
50/// calculations are performed; for Q subcode data, use the value
51/// of the `CRC16_INITIAL_CRC` constant.
52///
53/// # Example
54/// ```
55/// use cdrom_crc::{crc16, CRC16_INITIAL_CRC};
56///
57/// let result = crc16(&[0, 1, 2, 3], CRC16_INITIAL_CRC);
58/// assert_eq!(result, 0x9ECE);
59/// ```
60///
61/// # Notes
62///
63/// This form of CRC is defined in section 22.3.6 of the
64/// [CD-ROM standard](http://www.ecma-international.org/publications/standards/Ecma-130.htm)
65/// (ECMA-130, the “Yellow Book”).
66pub fn crc16(data: &[u8], initial_crc: u16) -> u16
67{
68    static TABLE: [[u16; 256]; 16] = [
69        [
70            0x0000u16, 0x1021u16, 0x2042u16, 0x3063u16, 0x4084u16, 0x50A5u16, 0x60C6u16, 0x70E7u16,
71            0x8108u16, 0x9129u16, 0xA14Au16, 0xB16Bu16, 0xC18Cu16, 0xD1ADu16, 0xE1CEu16, 0xF1EFu16,
72            0x1231u16, 0x0210u16, 0x3273u16, 0x2252u16, 0x52B5u16, 0x4294u16, 0x72F7u16, 0x62D6u16,
73            0x9339u16, 0x8318u16, 0xB37Bu16, 0xA35Au16, 0xD3BDu16, 0xC39Cu16, 0xF3FFu16, 0xE3DEu16,
74            0x2462u16, 0x3443u16, 0x0420u16, 0x1401u16, 0x64E6u16, 0x74C7u16, 0x44A4u16, 0x5485u16,
75            0xA56Au16, 0xB54Bu16, 0x8528u16, 0x9509u16, 0xE5EEu16, 0xF5CFu16, 0xC5ACu16, 0xD58Du16,
76            0x3653u16, 0x2672u16, 0x1611u16, 0x0630u16, 0x76D7u16, 0x66F6u16, 0x5695u16, 0x46B4u16,
77            0xB75Bu16, 0xA77Au16, 0x9719u16, 0x8738u16, 0xF7DFu16, 0xE7FEu16, 0xD79Du16, 0xC7BCu16,
78            0x48C4u16, 0x58E5u16, 0x6886u16, 0x78A7u16, 0x0840u16, 0x1861u16, 0x2802u16, 0x3823u16,
79            0xC9CCu16, 0xD9EDu16, 0xE98Eu16, 0xF9AFu16, 0x8948u16, 0x9969u16, 0xA90Au16, 0xB92Bu16,
80            0x5AF5u16, 0x4AD4u16, 0x7AB7u16, 0x6A96u16, 0x1A71u16, 0x0A50u16, 0x3A33u16, 0x2A12u16,
81            0xDBFDu16, 0xCBDCu16, 0xFBBFu16, 0xEB9Eu16, 0x9B79u16, 0x8B58u16, 0xBB3Bu16, 0xAB1Au16,
82            0x6CA6u16, 0x7C87u16, 0x4CE4u16, 0x5CC5u16, 0x2C22u16, 0x3C03u16, 0x0C60u16, 0x1C41u16,
83            0xEDAEu16, 0xFD8Fu16, 0xCDECu16, 0xDDCDu16, 0xAD2Au16, 0xBD0Bu16, 0x8D68u16, 0x9D49u16,
84            0x7E97u16, 0x6EB6u16, 0x5ED5u16, 0x4EF4u16, 0x3E13u16, 0x2E32u16, 0x1E51u16, 0x0E70u16,
85            0xFF9Fu16, 0xEFBEu16, 0xDFDDu16, 0xCFFCu16, 0xBF1Bu16, 0xAF3Au16, 0x9F59u16, 0x8F78u16,
86            0x9188u16, 0x81A9u16, 0xB1CAu16, 0xA1EBu16, 0xD10Cu16, 0xC12Du16, 0xF14Eu16, 0xE16Fu16,
87            0x1080u16, 0x00A1u16, 0x30C2u16, 0x20E3u16, 0x5004u16, 0x4025u16, 0x7046u16, 0x6067u16,
88            0x83B9u16, 0x9398u16, 0xA3FBu16, 0xB3DAu16, 0xC33Du16, 0xD31Cu16, 0xE37Fu16, 0xF35Eu16,
89            0x02B1u16, 0x1290u16, 0x22F3u16, 0x32D2u16, 0x4235u16, 0x5214u16, 0x6277u16, 0x7256u16,
90            0xB5EAu16, 0xA5CBu16, 0x95A8u16, 0x8589u16, 0xF56Eu16, 0xE54Fu16, 0xD52Cu16, 0xC50Du16,
91            0x34E2u16, 0x24C3u16, 0x14A0u16, 0x0481u16, 0x7466u16, 0x6447u16, 0x5424u16, 0x4405u16,
92            0xA7DBu16, 0xB7FAu16, 0x8799u16, 0x97B8u16, 0xE75Fu16, 0xF77Eu16, 0xC71Du16, 0xD73Cu16,
93            0x26D3u16, 0x36F2u16, 0x0691u16, 0x16B0u16, 0x6657u16, 0x7676u16, 0x4615u16, 0x5634u16,
94            0xD94Cu16, 0xC96Du16, 0xF90Eu16, 0xE92Fu16, 0x99C8u16, 0x89E9u16, 0xB98Au16, 0xA9ABu16,
95            0x5844u16, 0x4865u16, 0x7806u16, 0x6827u16, 0x18C0u16, 0x08E1u16, 0x3882u16, 0x28A3u16,
96            0xCB7Du16, 0xDB5Cu16, 0xEB3Fu16, 0xFB1Eu16, 0x8BF9u16, 0x9BD8u16, 0xABBBu16, 0xBB9Au16,
97            0x4A75u16, 0x5A54u16, 0x6A37u16, 0x7A16u16, 0x0AF1u16, 0x1AD0u16, 0x2AB3u16, 0x3A92u16,
98            0xFD2Eu16, 0xED0Fu16, 0xDD6Cu16, 0xCD4Du16, 0xBDAAu16, 0xAD8Bu16, 0x9DE8u16, 0x8DC9u16,
99            0x7C26u16, 0x6C07u16, 0x5C64u16, 0x4C45u16, 0x3CA2u16, 0x2C83u16, 0x1CE0u16, 0x0CC1u16,
100            0xEF1Fu16, 0xFF3Eu16, 0xCF5Du16, 0xDF7Cu16, 0xAF9Bu16, 0xBFBAu16, 0x8FD9u16, 0x9FF8u16,
101            0x6E17u16, 0x7E36u16, 0x4E55u16, 0x5E74u16, 0x2E93u16, 0x3EB2u16, 0x0ED1u16, 0x1EF0u16
102        ],
103        [
104            0x0000u16, 0x3331u16, 0x6662u16, 0x5553u16, 0xCCC4u16, 0xFFF5u16, 0xAAA6u16, 0x9997u16,
105            0x89A9u16, 0xBA98u16, 0xEFCBu16, 0xDCFAu16, 0x456Du16, 0x765Cu16, 0x230Fu16, 0x103Eu16,
106            0x0373u16, 0x3042u16, 0x6511u16, 0x5620u16, 0xCFB7u16, 0xFC86u16, 0xA9D5u16, 0x9AE4u16,
107            0x8ADAu16, 0xB9EBu16, 0xECB8u16, 0xDF89u16, 0x461Eu16, 0x752Fu16, 0x207Cu16, 0x134Du16,
108            0x06E6u16, 0x35D7u16, 0x6084u16, 0x53B5u16, 0xCA22u16, 0xF913u16, 0xAC40u16, 0x9F71u16,
109            0x8F4Fu16, 0xBC7Eu16, 0xE92Du16, 0xDA1Cu16, 0x438Bu16, 0x70BAu16, 0x25E9u16, 0x16D8u16,
110            0x0595u16, 0x36A4u16, 0x63F7u16, 0x50C6u16, 0xC951u16, 0xFA60u16, 0xAF33u16, 0x9C02u16,
111            0x8C3Cu16, 0xBF0Du16, 0xEA5Eu16, 0xD96Fu16, 0x40F8u16, 0x73C9u16, 0x269Au16, 0x15ABu16,
112            0x0DCCu16, 0x3EFDu16, 0x6BAEu16, 0x589Fu16, 0xC108u16, 0xF239u16, 0xA76Au16, 0x945Bu16,
113            0x8465u16, 0xB754u16, 0xE207u16, 0xD136u16, 0x48A1u16, 0x7B90u16, 0x2EC3u16, 0x1DF2u16,
114            0x0EBFu16, 0x3D8Eu16, 0x68DDu16, 0x5BECu16, 0xC27Bu16, 0xF14Au16, 0xA419u16, 0x9728u16,
115            0x8716u16, 0xB427u16, 0xE174u16, 0xD245u16, 0x4BD2u16, 0x78E3u16, 0x2DB0u16, 0x1E81u16,
116            0x0B2Au16, 0x381Bu16, 0x6D48u16, 0x5E79u16, 0xC7EEu16, 0xF4DFu16, 0xA18Cu16, 0x92BDu16,
117            0x8283u16, 0xB1B2u16, 0xE4E1u16, 0xD7D0u16, 0x4E47u16, 0x7D76u16, 0x2825u16, 0x1B14u16,
118            0x0859u16, 0x3B68u16, 0x6E3Bu16, 0x5D0Au16, 0xC49Du16, 0xF7ACu16, 0xA2FFu16, 0x91CEu16,
119            0x81F0u16, 0xB2C1u16, 0xE792u16, 0xD4A3u16, 0x4D34u16, 0x7E05u16, 0x2B56u16, 0x1867u16,
120            0x1B98u16, 0x28A9u16, 0x7DFAu16, 0x4ECBu16, 0xD75Cu16, 0xE46Du16, 0xB13Eu16, 0x820Fu16,
121            0x9231u16, 0xA100u16, 0xF453u16, 0xC762u16, 0x5EF5u16, 0x6DC4u16, 0x3897u16, 0x0BA6u16,
122            0x18EBu16, 0x2BDAu16, 0x7E89u16, 0x4DB8u16, 0xD42Fu16, 0xE71Eu16, 0xB24Du16, 0x817Cu16,
123            0x9142u16, 0xA273u16, 0xF720u16, 0xC411u16, 0x5D86u16, 0x6EB7u16, 0x3BE4u16, 0x08D5u16,
124            0x1D7Eu16, 0x2E4Fu16, 0x7B1Cu16, 0x482Du16, 0xD1BAu16, 0xE28Bu16, 0xB7D8u16, 0x84E9u16,
125            0x94D7u16, 0xA7E6u16, 0xF2B5u16, 0xC184u16, 0x5813u16, 0x6B22u16, 0x3E71u16, 0x0D40u16,
126            0x1E0Du16, 0x2D3Cu16, 0x786Fu16, 0x4B5Eu16, 0xD2C9u16, 0xE1F8u16, 0xB4ABu16, 0x879Au16,
127            0x97A4u16, 0xA495u16, 0xF1C6u16, 0xC2F7u16, 0x5B60u16, 0x6851u16, 0x3D02u16, 0x0E33u16,
128            0x1654u16, 0x2565u16, 0x7036u16, 0x4307u16, 0xDA90u16, 0xE9A1u16, 0xBCF2u16, 0x8FC3u16,
129            0x9FFDu16, 0xACCCu16, 0xF99Fu16, 0xCAAEu16, 0x5339u16, 0x6008u16, 0x355Bu16, 0x066Au16,
130            0x1527u16, 0x2616u16, 0x7345u16, 0x4074u16, 0xD9E3u16, 0xEAD2u16, 0xBF81u16, 0x8CB0u16,
131            0x9C8Eu16, 0xAFBFu16, 0xFAECu16, 0xC9DDu16, 0x504Au16, 0x637Bu16, 0x3628u16, 0x0519u16,
132            0x10B2u16, 0x2383u16, 0x76D0u16, 0x45E1u16, 0xDC76u16, 0xEF47u16, 0xBA14u16, 0x8925u16,
133            0x991Bu16, 0xAA2Au16, 0xFF79u16, 0xCC48u16, 0x55DFu16, 0x66EEu16, 0x33BDu16, 0x008Cu16,
134            0x13C1u16, 0x20F0u16, 0x75A3u16, 0x4692u16, 0xDF05u16, 0xEC34u16, 0xB967u16, 0x8A56u16,
135            0x9A68u16, 0xA959u16, 0xFC0Au16, 0xCF3Bu16, 0x56ACu16, 0x659Du16, 0x30CEu16, 0x03FFu16
136        ],
137        [
138            0x0000u16, 0x3730u16, 0x6E60u16, 0x5950u16, 0xDCC0u16, 0xEBF0u16, 0xB2A0u16, 0x8590u16,
139            0xA9A1u16, 0x9E91u16, 0xC7C1u16, 0xF0F1u16, 0x7561u16, 0x4251u16, 0x1B01u16, 0x2C31u16,
140            0x4363u16, 0x7453u16, 0x2D03u16, 0x1A33u16, 0x9FA3u16, 0xA893u16, 0xF1C3u16, 0xC6F3u16,
141            0xEAC2u16, 0xDDF2u16, 0x84A2u16, 0xB392u16, 0x3602u16, 0x0132u16, 0x5862u16, 0x6F52u16,
142            0x86C6u16, 0xB1F6u16, 0xE8A6u16, 0xDF96u16, 0x5A06u16, 0x6D36u16, 0x3466u16, 0x0356u16,
143            0x2F67u16, 0x1857u16, 0x4107u16, 0x7637u16, 0xF3A7u16, 0xC497u16, 0x9DC7u16, 0xAAF7u16,
144            0xC5A5u16, 0xF295u16, 0xABC5u16, 0x9CF5u16, 0x1965u16, 0x2E55u16, 0x7705u16, 0x4035u16,
145            0x6C04u16, 0x5B34u16, 0x0264u16, 0x3554u16, 0xB0C4u16, 0x87F4u16, 0xDEA4u16, 0xE994u16,
146            0x1DADu16, 0x2A9Du16, 0x73CDu16, 0x44FDu16, 0xC16Du16, 0xF65Du16, 0xAF0Du16, 0x983Du16,
147            0xB40Cu16, 0x833Cu16, 0xDA6Cu16, 0xED5Cu16, 0x68CCu16, 0x5FFCu16, 0x06ACu16, 0x319Cu16,
148            0x5ECEu16, 0x69FEu16, 0x30AEu16, 0x079Eu16, 0x820Eu16, 0xB53Eu16, 0xEC6Eu16, 0xDB5Eu16,
149            0xF76Fu16, 0xC05Fu16, 0x990Fu16, 0xAE3Fu16, 0x2BAFu16, 0x1C9Fu16, 0x45CFu16, 0x72FFu16,
150            0x9B6Bu16, 0xAC5Bu16, 0xF50Bu16, 0xC23Bu16, 0x47ABu16, 0x709Bu16, 0x29CBu16, 0x1EFBu16,
151            0x32CAu16, 0x05FAu16, 0x5CAAu16, 0x6B9Au16, 0xEE0Au16, 0xD93Au16, 0x806Au16, 0xB75Au16,
152            0xD808u16, 0xEF38u16, 0xB668u16, 0x8158u16, 0x04C8u16, 0x33F8u16, 0x6AA8u16, 0x5D98u16,
153            0x71A9u16, 0x4699u16, 0x1FC9u16, 0x28F9u16, 0xAD69u16, 0x9A59u16, 0xC309u16, 0xF439u16,
154            0x3B5Au16, 0x0C6Au16, 0x553Au16, 0x620Au16, 0xE79Au16, 0xD0AAu16, 0x89FAu16, 0xBECAu16,
155            0x92FBu16, 0xA5CBu16, 0xFC9Bu16, 0xCBABu16, 0x4E3Bu16, 0x790Bu16, 0x205Bu16, 0x176Bu16,
156            0x7839u16, 0x4F09u16, 0x1659u16, 0x2169u16, 0xA4F9u16, 0x93C9u16, 0xCA99u16, 0xFDA9u16,
157            0xD198u16, 0xE6A8u16, 0xBFF8u16, 0x88C8u16, 0x0D58u16, 0x3A68u16, 0x6338u16, 0x5408u16,
158            0xBD9Cu16, 0x8AACu16, 0xD3FCu16, 0xE4CCu16, 0x615Cu16, 0x566Cu16, 0x0F3Cu16, 0x380Cu16,
159            0x143Du16, 0x230Du16, 0x7A5Du16, 0x4D6Du16, 0xC8FDu16, 0xFFCDu16, 0xA69Du16, 0x91ADu16,
160            0xFEFFu16, 0xC9CFu16, 0x909Fu16, 0xA7AFu16, 0x223Fu16, 0x150Fu16, 0x4C5Fu16, 0x7B6Fu16,
161            0x575Eu16, 0x606Eu16, 0x393Eu16, 0x0E0Eu16, 0x8B9Eu16, 0xBCAEu16, 0xE5FEu16, 0xD2CEu16,
162            0x26F7u16, 0x11C7u16, 0x4897u16, 0x7FA7u16, 0xFA37u16, 0xCD07u16, 0x9457u16, 0xA367u16,
163            0x8F56u16, 0xB866u16, 0xE136u16, 0xD606u16, 0x5396u16, 0x64A6u16, 0x3DF6u16, 0x0AC6u16,
164            0x6594u16, 0x52A4u16, 0x0BF4u16, 0x3CC4u16, 0xB954u16, 0x8E64u16, 0xD734u16, 0xE004u16,
165            0xCC35u16, 0xFB05u16, 0xA255u16, 0x9565u16, 0x10F5u16, 0x27C5u16, 0x7E95u16, 0x49A5u16,
166            0xA031u16, 0x9701u16, 0xCE51u16, 0xF961u16, 0x7CF1u16, 0x4BC1u16, 0x1291u16, 0x25A1u16,
167            0x0990u16, 0x3EA0u16, 0x67F0u16, 0x50C0u16, 0xD550u16, 0xE260u16, 0xBB30u16, 0x8C00u16,
168            0xE352u16, 0xD462u16, 0x8D32u16, 0xBA02u16, 0x3F92u16, 0x08A2u16, 0x51F2u16, 0x66C2u16,
169            0x4AF3u16, 0x7DC3u16, 0x2493u16, 0x13A3u16, 0x9633u16, 0xA103u16, 0xF853u16, 0xCF63u16
170        ],
171        [
172            0x0000u16, 0x76B4u16, 0xED68u16, 0x9BDCu16, 0xCAF1u16, 0xBC45u16, 0x2799u16, 0x512Du16,
173            0x85C3u16, 0xF377u16, 0x68ABu16, 0x1E1Fu16, 0x4F32u16, 0x3986u16, 0xA25Au16, 0xD4EEu16,
174            0x1BA7u16, 0x6D13u16, 0xF6CFu16, 0x807Bu16, 0xD156u16, 0xA7E2u16, 0x3C3Eu16, 0x4A8Au16,
175            0x9E64u16, 0xE8D0u16, 0x730Cu16, 0x05B8u16, 0x5495u16, 0x2221u16, 0xB9FDu16, 0xCF49u16,
176            0x374Eu16, 0x41FAu16, 0xDA26u16, 0xAC92u16, 0xFDBFu16, 0x8B0Bu16, 0x10D7u16, 0x6663u16,
177            0xB28Du16, 0xC439u16, 0x5FE5u16, 0x2951u16, 0x787Cu16, 0x0EC8u16, 0x9514u16, 0xE3A0u16,
178            0x2CE9u16, 0x5A5Du16, 0xC181u16, 0xB735u16, 0xE618u16, 0x90ACu16, 0x0B70u16, 0x7DC4u16,
179            0xA92Au16, 0xDF9Eu16, 0x4442u16, 0x32F6u16, 0x63DBu16, 0x156Fu16, 0x8EB3u16, 0xF807u16,
180            0x6E9Cu16, 0x1828u16, 0x83F4u16, 0xF540u16, 0xA46Du16, 0xD2D9u16, 0x4905u16, 0x3FB1u16,
181            0xEB5Fu16, 0x9DEBu16, 0x0637u16, 0x7083u16, 0x21AEu16, 0x571Au16, 0xCCC6u16, 0xBA72u16,
182            0x753Bu16, 0x038Fu16, 0x9853u16, 0xEEE7u16, 0xBFCAu16, 0xC97Eu16, 0x52A2u16, 0x2416u16,
183            0xF0F8u16, 0x864Cu16, 0x1D90u16, 0x6B24u16, 0x3A09u16, 0x4CBDu16, 0xD761u16, 0xA1D5u16,
184            0x59D2u16, 0x2F66u16, 0xB4BAu16, 0xC20Eu16, 0x9323u16, 0xE597u16, 0x7E4Bu16, 0x08FFu16,
185            0xDC11u16, 0xAAA5u16, 0x3179u16, 0x47CDu16, 0x16E0u16, 0x6054u16, 0xFB88u16, 0x8D3Cu16,
186            0x4275u16, 0x34C1u16, 0xAF1Du16, 0xD9A9u16, 0x8884u16, 0xFE30u16, 0x65ECu16, 0x1358u16,
187            0xC7B6u16, 0xB102u16, 0x2ADEu16, 0x5C6Au16, 0x0D47u16, 0x7BF3u16, 0xE02Fu16, 0x969Bu16,
188            0xDD38u16, 0xAB8Cu16, 0x3050u16, 0x46E4u16, 0x17C9u16, 0x617Du16, 0xFAA1u16, 0x8C15u16,
189            0x58FBu16, 0x2E4Fu16, 0xB593u16, 0xC327u16, 0x920Au16, 0xE4BEu16, 0x7F62u16, 0x09D6u16,
190            0xC69Fu16, 0xB02Bu16, 0x2BF7u16, 0x5D43u16, 0x0C6Eu16, 0x7ADAu16, 0xE106u16, 0x97B2u16,
191            0x435Cu16, 0x35E8u16, 0xAE34u16, 0xD880u16, 0x89ADu16, 0xFF19u16, 0x64C5u16, 0x1271u16,
192            0xEA76u16, 0x9CC2u16, 0x071Eu16, 0x71AAu16, 0x2087u16, 0x5633u16, 0xCDEFu16, 0xBB5Bu16,
193            0x6FB5u16, 0x1901u16, 0x82DDu16, 0xF469u16, 0xA544u16, 0xD3F0u16, 0x482Cu16, 0x3E98u16,
194            0xF1D1u16, 0x8765u16, 0x1CB9u16, 0x6A0Du16, 0x3B20u16, 0x4D94u16, 0xD648u16, 0xA0FCu16,
195            0x7412u16, 0x02A6u16, 0x997Au16, 0xEFCEu16, 0xBEE3u16, 0xC857u16, 0x538Bu16, 0x253Fu16,
196            0xB3A4u16, 0xC510u16, 0x5ECCu16, 0x2878u16, 0x7955u16, 0x0FE1u16, 0x943Du16, 0xE289u16,
197            0x3667u16, 0x40D3u16, 0xDB0Fu16, 0xADBBu16, 0xFC96u16, 0x8A22u16, 0x11FEu16, 0x674Au16,
198            0xA803u16, 0xDEB7u16, 0x456Bu16, 0x33DFu16, 0x62F2u16, 0x1446u16, 0x8F9Au16, 0xF92Eu16,
199            0x2DC0u16, 0x5B74u16, 0xC0A8u16, 0xB61Cu16, 0xE731u16, 0x9185u16, 0x0A59u16, 0x7CEDu16,
200            0x84EAu16, 0xF25Eu16, 0x6982u16, 0x1F36u16, 0x4E1Bu16, 0x38AFu16, 0xA373u16, 0xD5C7u16,
201            0x0129u16, 0x779Du16, 0xEC41u16, 0x9AF5u16, 0xCBD8u16, 0xBD6Cu16, 0x26B0u16, 0x5004u16,
202            0x9F4Du16, 0xE9F9u16, 0x7225u16, 0x0491u16, 0x55BCu16, 0x2308u16, 0xB8D4u16, 0xCE60u16,
203            0x1A8Eu16, 0x6C3Au16, 0xF7E6u16, 0x8152u16, 0xD07Fu16, 0xA6CBu16, 0x3D17u16, 0x4BA3u16
204        ],
205        [
206            0x0000u16, 0xAA51u16, 0x4483u16, 0xEED2u16, 0x8906u16, 0x2357u16, 0xCD85u16, 0x67D4u16,
207            0x022Du16, 0xA87Cu16, 0x46AEu16, 0xECFFu16, 0x8B2Bu16, 0x217Au16, 0xCFA8u16, 0x65F9u16,
208            0x045Au16, 0xAE0Bu16, 0x40D9u16, 0xEA88u16, 0x8D5Cu16, 0x270Du16, 0xC9DFu16, 0x638Eu16,
209            0x0677u16, 0xAC26u16, 0x42F4u16, 0xE8A5u16, 0x8F71u16, 0x2520u16, 0xCBF2u16, 0x61A3u16,
210            0x08B4u16, 0xA2E5u16, 0x4C37u16, 0xE666u16, 0x81B2u16, 0x2BE3u16, 0xC531u16, 0x6F60u16,
211            0x0A99u16, 0xA0C8u16, 0x4E1Au16, 0xE44Bu16, 0x839Fu16, 0x29CEu16, 0xC71Cu16, 0x6D4Du16,
212            0x0CEEu16, 0xA6BFu16, 0x486Du16, 0xE23Cu16, 0x85E8u16, 0x2FB9u16, 0xC16Bu16, 0x6B3Au16,
213            0x0EC3u16, 0xA492u16, 0x4A40u16, 0xE011u16, 0x87C5u16, 0x2D94u16, 0xC346u16, 0x6917u16,
214            0x1168u16, 0xBB39u16, 0x55EBu16, 0xFFBAu16, 0x986Eu16, 0x323Fu16, 0xDCEDu16, 0x76BCu16,
215            0x1345u16, 0xB914u16, 0x57C6u16, 0xFD97u16, 0x9A43u16, 0x3012u16, 0xDEC0u16, 0x7491u16,
216            0x1532u16, 0xBF63u16, 0x51B1u16, 0xFBE0u16, 0x9C34u16, 0x3665u16, 0xD8B7u16, 0x72E6u16,
217            0x171Fu16, 0xBD4Eu16, 0x539Cu16, 0xF9CDu16, 0x9E19u16, 0x3448u16, 0xDA9Au16, 0x70CBu16,
218            0x19DCu16, 0xB38Du16, 0x5D5Fu16, 0xF70Eu16, 0x90DAu16, 0x3A8Bu16, 0xD459u16, 0x7E08u16,
219            0x1BF1u16, 0xB1A0u16, 0x5F72u16, 0xF523u16, 0x92F7u16, 0x38A6u16, 0xD674u16, 0x7C25u16,
220            0x1D86u16, 0xB7D7u16, 0x5905u16, 0xF354u16, 0x9480u16, 0x3ED1u16, 0xD003u16, 0x7A52u16,
221            0x1FABu16, 0xB5FAu16, 0x5B28u16, 0xF179u16, 0x96ADu16, 0x3CFCu16, 0xD22Eu16, 0x787Fu16,
222            0x22D0u16, 0x8881u16, 0x6653u16, 0xCC02u16, 0xABD6u16, 0x0187u16, 0xEF55u16, 0x4504u16,
223            0x20FDu16, 0x8AACu16, 0x647Eu16, 0xCE2Fu16, 0xA9FBu16, 0x03AAu16, 0xED78u16, 0x4729u16,
224            0x268Au16, 0x8CDBu16, 0x6209u16, 0xC858u16, 0xAF8Cu16, 0x05DDu16, 0xEB0Fu16, 0x415Eu16,
225            0x24A7u16, 0x8EF6u16, 0x6024u16, 0xCA75u16, 0xADA1u16, 0x07F0u16, 0xE922u16, 0x4373u16,
226            0x2A64u16, 0x8035u16, 0x6EE7u16, 0xC4B6u16, 0xA362u16, 0x0933u16, 0xE7E1u16, 0x4DB0u16,
227            0x2849u16, 0x8218u16, 0x6CCAu16, 0xC69Bu16, 0xA14Fu16, 0x0B1Eu16, 0xE5CCu16, 0x4F9Du16,
228            0x2E3Eu16, 0x846Fu16, 0x6ABDu16, 0xC0ECu16, 0xA738u16, 0x0D69u16, 0xE3BBu16, 0x49EAu16,
229            0x2C13u16, 0x8642u16, 0x6890u16, 0xC2C1u16, 0xA515u16, 0x0F44u16, 0xE196u16, 0x4BC7u16,
230            0x33B8u16, 0x99E9u16, 0x773Bu16, 0xDD6Au16, 0xBABEu16, 0x10EFu16, 0xFE3Du16, 0x546Cu16,
231            0x3195u16, 0x9BC4u16, 0x7516u16, 0xDF47u16, 0xB893u16, 0x12C2u16, 0xFC10u16, 0x5641u16,
232            0x37E2u16, 0x9DB3u16, 0x7361u16, 0xD930u16, 0xBEE4u16, 0x14B5u16, 0xFA67u16, 0x5036u16,
233            0x35CFu16, 0x9F9Eu16, 0x714Cu16, 0xDB1Du16, 0xBCC9u16, 0x1698u16, 0xF84Au16, 0x521Bu16,
234            0x3B0Cu16, 0x915Du16, 0x7F8Fu16, 0xD5DEu16, 0xB20Au16, 0x185Bu16, 0xF689u16, 0x5CD8u16,
235            0x3921u16, 0x9370u16, 0x7DA2u16, 0xD7F3u16, 0xB027u16, 0x1A76u16, 0xF4A4u16, 0x5EF5u16,
236            0x3F56u16, 0x9507u16, 0x7BD5u16, 0xD184u16, 0xB650u16, 0x1C01u16, 0xF2D3u16, 0x5882u16,
237            0x3D7Bu16, 0x972Au16, 0x79F8u16, 0xD3A9u16, 0xB47Du16, 0x1E2Cu16, 0xF0FEu16, 0x5AAFu16
238        ],
239        [
240            0x0000u16, 0x45A0u16, 0x8B40u16, 0xCEE0u16, 0x06A1u16, 0x4301u16, 0x8DE1u16, 0xC841u16,
241            0x0D42u16, 0x48E2u16, 0x8602u16, 0xC3A2u16, 0x0BE3u16, 0x4E43u16, 0x80A3u16, 0xC503u16,
242            0x1A84u16, 0x5F24u16, 0x91C4u16, 0xD464u16, 0x1C25u16, 0x5985u16, 0x9765u16, 0xD2C5u16,
243            0x17C6u16, 0x5266u16, 0x9C86u16, 0xD926u16, 0x1167u16, 0x54C7u16, 0x9A27u16, 0xDF87u16,
244            0x3508u16, 0x70A8u16, 0xBE48u16, 0xFBE8u16, 0x33A9u16, 0x7609u16, 0xB8E9u16, 0xFD49u16,
245            0x384Au16, 0x7DEAu16, 0xB30Au16, 0xF6AAu16, 0x3EEBu16, 0x7B4Bu16, 0xB5ABu16, 0xF00Bu16,
246            0x2F8Cu16, 0x6A2Cu16, 0xA4CCu16, 0xE16Cu16, 0x292Du16, 0x6C8Du16, 0xA26Du16, 0xE7CDu16,
247            0x22CEu16, 0x676Eu16, 0xA98Eu16, 0xEC2Eu16, 0x246Fu16, 0x61CFu16, 0xAF2Fu16, 0xEA8Fu16,
248            0x6A10u16, 0x2FB0u16, 0xE150u16, 0xA4F0u16, 0x6CB1u16, 0x2911u16, 0xE7F1u16, 0xA251u16,
249            0x6752u16, 0x22F2u16, 0xEC12u16, 0xA9B2u16, 0x61F3u16, 0x2453u16, 0xEAB3u16, 0xAF13u16,
250            0x7094u16, 0x3534u16, 0xFBD4u16, 0xBE74u16, 0x7635u16, 0x3395u16, 0xFD75u16, 0xB8D5u16,
251            0x7DD6u16, 0x3876u16, 0xF696u16, 0xB336u16, 0x7B77u16, 0x3ED7u16, 0xF037u16, 0xB597u16,
252            0x5F18u16, 0x1AB8u16, 0xD458u16, 0x91F8u16, 0x59B9u16, 0x1C19u16, 0xD2F9u16, 0x9759u16,
253            0x525Au16, 0x17FAu16, 0xD91Au16, 0x9CBAu16, 0x54FBu16, 0x115Bu16, 0xDFBBu16, 0x9A1Bu16,
254            0x459Cu16, 0x003Cu16, 0xCEDCu16, 0x8B7Cu16, 0x433Du16, 0x069Du16, 0xC87Du16, 0x8DDDu16,
255            0x48DEu16, 0x0D7Eu16, 0xC39Eu16, 0x863Eu16, 0x4E7Fu16, 0x0BDFu16, 0xC53Fu16, 0x809Fu16,
256            0xD420u16, 0x9180u16, 0x5F60u16, 0x1AC0u16, 0xD281u16, 0x9721u16, 0x59C1u16, 0x1C61u16,
257            0xD962u16, 0x9CC2u16, 0x5222u16, 0x1782u16, 0xDFC3u16, 0x9A63u16, 0x5483u16, 0x1123u16,
258            0xCEA4u16, 0x8B04u16, 0x45E4u16, 0x0044u16, 0xC805u16, 0x8DA5u16, 0x4345u16, 0x06E5u16,
259            0xC3E6u16, 0x8646u16, 0x48A6u16, 0x0D06u16, 0xC547u16, 0x80E7u16, 0x4E07u16, 0x0BA7u16,
260            0xE128u16, 0xA488u16, 0x6A68u16, 0x2FC8u16, 0xE789u16, 0xA229u16, 0x6CC9u16, 0x2969u16,
261            0xEC6Au16, 0xA9CAu16, 0x672Au16, 0x228Au16, 0xEACBu16, 0xAF6Bu16, 0x618Bu16, 0x242Bu16,
262            0xFBACu16, 0xBE0Cu16, 0x70ECu16, 0x354Cu16, 0xFD0Du16, 0xB8ADu16, 0x764Du16, 0x33EDu16,
263            0xF6EEu16, 0xB34Eu16, 0x7DAEu16, 0x380Eu16, 0xF04Fu16, 0xB5EFu16, 0x7B0Fu16, 0x3EAFu16,
264            0xBE30u16, 0xFB90u16, 0x3570u16, 0x70D0u16, 0xB891u16, 0xFD31u16, 0x33D1u16, 0x7671u16,
265            0xB372u16, 0xF6D2u16, 0x3832u16, 0x7D92u16, 0xB5D3u16, 0xF073u16, 0x3E93u16, 0x7B33u16,
266            0xA4B4u16, 0xE114u16, 0x2FF4u16, 0x6A54u16, 0xA215u16, 0xE7B5u16, 0x2955u16, 0x6CF5u16,
267            0xA9F6u16, 0xEC56u16, 0x22B6u16, 0x6716u16, 0xAF57u16, 0xEAF7u16, 0x2417u16, 0x61B7u16,
268            0x8B38u16, 0xCE98u16, 0x0078u16, 0x45D8u16, 0x8D99u16, 0xC839u16, 0x06D9u16, 0x4379u16,
269            0x867Au16, 0xC3DAu16, 0x0D3Au16, 0x489Au16, 0x80DBu16, 0xC57Bu16, 0x0B9Bu16, 0x4E3Bu16,
270            0x91BCu16, 0xD41Cu16, 0x1AFCu16, 0x5F5Cu16, 0x971Du16, 0xD2BDu16, 0x1C5Du16, 0x59FDu16,
271            0x9CFEu16, 0xD95Eu16, 0x17BEu16, 0x521Eu16, 0x9A5Fu16, 0xDFFFu16, 0x111Fu16, 0x54BFu16
272        ],
273        [
274            0x0000u16, 0xB861u16, 0x60E3u16, 0xD882u16, 0xC1C6u16, 0x79A7u16, 0xA125u16, 0x1944u16,
275            0x93ADu16, 0x2BCCu16, 0xF34Eu16, 0x4B2Fu16, 0x526Bu16, 0xEA0Au16, 0x3288u16, 0x8AE9u16,
276            0x377Bu16, 0x8F1Au16, 0x5798u16, 0xEFF9u16, 0xF6BDu16, 0x4EDCu16, 0x965Eu16, 0x2E3Fu16,
277            0xA4D6u16, 0x1CB7u16, 0xC435u16, 0x7C54u16, 0x6510u16, 0xDD71u16, 0x05F3u16, 0xBD92u16,
278            0x6EF6u16, 0xD697u16, 0x0E15u16, 0xB674u16, 0xAF30u16, 0x1751u16, 0xCFD3u16, 0x77B2u16,
279            0xFD5Bu16, 0x453Au16, 0x9DB8u16, 0x25D9u16, 0x3C9Du16, 0x84FCu16, 0x5C7Eu16, 0xE41Fu16,
280            0x598Du16, 0xE1ECu16, 0x396Eu16, 0x810Fu16, 0x984Bu16, 0x202Au16, 0xF8A8u16, 0x40C9u16,
281            0xCA20u16, 0x7241u16, 0xAAC3u16, 0x12A2u16, 0x0BE6u16, 0xB387u16, 0x6B05u16, 0xD364u16,
282            0xDDECu16, 0x658Du16, 0xBD0Fu16, 0x056Eu16, 0x1C2Au16, 0xA44Bu16, 0x7CC9u16, 0xC4A8u16,
283            0x4E41u16, 0xF620u16, 0x2EA2u16, 0x96C3u16, 0x8F87u16, 0x37E6u16, 0xEF64u16, 0x5705u16,
284            0xEA97u16, 0x52F6u16, 0x8A74u16, 0x3215u16, 0x2B51u16, 0x9330u16, 0x4BB2u16, 0xF3D3u16,
285            0x793Au16, 0xC15Bu16, 0x19D9u16, 0xA1B8u16, 0xB8FCu16, 0x009Du16, 0xD81Fu16, 0x607Eu16,
286            0xB31Au16, 0x0B7Bu16, 0xD3F9u16, 0x6B98u16, 0x72DCu16, 0xCABDu16, 0x123Fu16, 0xAA5Eu16,
287            0x20B7u16, 0x98D6u16, 0x4054u16, 0xF835u16, 0xE171u16, 0x5910u16, 0x8192u16, 0x39F3u16,
288            0x8461u16, 0x3C00u16, 0xE482u16, 0x5CE3u16, 0x45A7u16, 0xFDC6u16, 0x2544u16, 0x9D25u16,
289            0x17CCu16, 0xAFADu16, 0x772Fu16, 0xCF4Eu16, 0xD60Au16, 0x6E6Bu16, 0xB6E9u16, 0x0E88u16,
290            0xABF9u16, 0x1398u16, 0xCB1Au16, 0x737Bu16, 0x6A3Fu16, 0xD25Eu16, 0x0ADCu16, 0xB2BDu16,
291            0x3854u16, 0x8035u16, 0x58B7u16, 0xE0D6u16, 0xF992u16, 0x41F3u16, 0x9971u16, 0x2110u16,
292            0x9C82u16, 0x24E3u16, 0xFC61u16, 0x4400u16, 0x5D44u16, 0xE525u16, 0x3DA7u16, 0x85C6u16,
293            0x0F2Fu16, 0xB74Eu16, 0x6FCCu16, 0xD7ADu16, 0xCEE9u16, 0x7688u16, 0xAE0Au16, 0x166Bu16,
294            0xC50Fu16, 0x7D6Eu16, 0xA5ECu16, 0x1D8Du16, 0x04C9u16, 0xBCA8u16, 0x642Au16, 0xDC4Bu16,
295            0x56A2u16, 0xEEC3u16, 0x3641u16, 0x8E20u16, 0x9764u16, 0x2F05u16, 0xF787u16, 0x4FE6u16,
296            0xF274u16, 0x4A15u16, 0x9297u16, 0x2AF6u16, 0x33B2u16, 0x8BD3u16, 0x5351u16, 0xEB30u16,
297            0x61D9u16, 0xD9B8u16, 0x013Au16, 0xB95Bu16, 0xA01Fu16, 0x187Eu16, 0xC0FCu16, 0x789Du16,
298            0x7615u16, 0xCE74u16, 0x16F6u16, 0xAE97u16, 0xB7D3u16, 0x0FB2u16, 0xD730u16, 0x6F51u16,
299            0xE5B8u16, 0x5DD9u16, 0x855Bu16, 0x3D3Au16, 0x247Eu16, 0x9C1Fu16, 0x449Du16, 0xFCFCu16,
300            0x416Eu16, 0xF90Fu16, 0x218Du16, 0x99ECu16, 0x80A8u16, 0x38C9u16, 0xE04Bu16, 0x582Au16,
301            0xD2C3u16, 0x6AA2u16, 0xB220u16, 0x0A41u16, 0x1305u16, 0xAB64u16, 0x73E6u16, 0xCB87u16,
302            0x18E3u16, 0xA082u16, 0x7800u16, 0xC061u16, 0xD925u16, 0x6144u16, 0xB9C6u16, 0x01A7u16,
303            0x8B4Eu16, 0x332Fu16, 0xEBADu16, 0x53CCu16, 0x4A88u16, 0xF2E9u16, 0x2A6Bu16, 0x920Au16,
304            0x2F98u16, 0x97F9u16, 0x4F7Bu16, 0xF71Au16, 0xEE5Eu16, 0x563Fu16, 0x8EBDu16, 0x36DCu16,
305            0xBC35u16, 0x0454u16, 0xDCD6u16, 0x64B7u16, 0x7DF3u16, 0xC592u16, 0x1D10u16, 0xA571u16
306        ],
307        [
308            0x0000u16, 0x47D3u16, 0x8FA6u16, 0xC875u16, 0x0F6Du16, 0x48BEu16, 0x80CBu16, 0xC718u16,
309            0x1EDAu16, 0x5909u16, 0x917Cu16, 0xD6AFu16, 0x11B7u16, 0x5664u16, 0x9E11u16, 0xD9C2u16,
310            0x3DB4u16, 0x7A67u16, 0xB212u16, 0xF5C1u16, 0x32D9u16, 0x750Au16, 0xBD7Fu16, 0xFAACu16,
311            0x236Eu16, 0x64BDu16, 0xACC8u16, 0xEB1Bu16, 0x2C03u16, 0x6BD0u16, 0xA3A5u16, 0xE476u16,
312            0x7B68u16, 0x3CBBu16, 0xF4CEu16, 0xB31Du16, 0x7405u16, 0x33D6u16, 0xFBA3u16, 0xBC70u16,
313            0x65B2u16, 0x2261u16, 0xEA14u16, 0xADC7u16, 0x6ADFu16, 0x2D0Cu16, 0xE579u16, 0xA2AAu16,
314            0x46DCu16, 0x010Fu16, 0xC97Au16, 0x8EA9u16, 0x49B1u16, 0x0E62u16, 0xC617u16, 0x81C4u16,
315            0x5806u16, 0x1FD5u16, 0xD7A0u16, 0x9073u16, 0x576Bu16, 0x10B8u16, 0xD8CDu16, 0x9F1Eu16,
316            0xF6D0u16, 0xB103u16, 0x7976u16, 0x3EA5u16, 0xF9BDu16, 0xBE6Eu16, 0x761Bu16, 0x31C8u16,
317            0xE80Au16, 0xAFD9u16, 0x67ACu16, 0x207Fu16, 0xE767u16, 0xA0B4u16, 0x68C1u16, 0x2F12u16,
318            0xCB64u16, 0x8CB7u16, 0x44C2u16, 0x0311u16, 0xC409u16, 0x83DAu16, 0x4BAFu16, 0x0C7Cu16,
319            0xD5BEu16, 0x926Du16, 0x5A18u16, 0x1DCBu16, 0xDAD3u16, 0x9D00u16, 0x5575u16, 0x12A6u16,
320            0x8DB8u16, 0xCA6Bu16, 0x021Eu16, 0x45CDu16, 0x82D5u16, 0xC506u16, 0x0D73u16, 0x4AA0u16,
321            0x9362u16, 0xD4B1u16, 0x1CC4u16, 0x5B17u16, 0x9C0Fu16, 0xDBDCu16, 0x13A9u16, 0x547Au16,
322            0xB00Cu16, 0xF7DFu16, 0x3FAAu16, 0x7879u16, 0xBF61u16, 0xF8B2u16, 0x30C7u16, 0x7714u16,
323            0xAED6u16, 0xE905u16, 0x2170u16, 0x66A3u16, 0xA1BBu16, 0xE668u16, 0x2E1Du16, 0x69CEu16,
324            0xFD81u16, 0xBA52u16, 0x7227u16, 0x35F4u16, 0xF2ECu16, 0xB53Fu16, 0x7D4Au16, 0x3A99u16,
325            0xE35Bu16, 0xA488u16, 0x6CFDu16, 0x2B2Eu16, 0xEC36u16, 0xABE5u16, 0x6390u16, 0x2443u16,
326            0xC035u16, 0x87E6u16, 0x4F93u16, 0x0840u16, 0xCF58u16, 0x888Bu16, 0x40FEu16, 0x072Du16,
327            0xDEEFu16, 0x993Cu16, 0x5149u16, 0x169Au16, 0xD182u16, 0x9651u16, 0x5E24u16, 0x19F7u16,
328            0x86E9u16, 0xC13Au16, 0x094Fu16, 0x4E9Cu16, 0x8984u16, 0xCE57u16, 0x0622u16, 0x41F1u16,
329            0x9833u16, 0xDFE0u16, 0x1795u16, 0x5046u16, 0x975Eu16, 0xD08Du16, 0x18F8u16, 0x5F2Bu16,
330            0xBB5Du16, 0xFC8Eu16, 0x34FBu16, 0x7328u16, 0xB430u16, 0xF3E3u16, 0x3B96u16, 0x7C45u16,
331            0xA587u16, 0xE254u16, 0x2A21u16, 0x6DF2u16, 0xAAEAu16, 0xED39u16, 0x254Cu16, 0x629Fu16,
332            0x0B51u16, 0x4C82u16, 0x84F7u16, 0xC324u16, 0x043Cu16, 0x43EFu16, 0x8B9Au16, 0xCC49u16,
333            0x158Bu16, 0x5258u16, 0x9A2Du16, 0xDDFEu16, 0x1AE6u16, 0x5D35u16, 0x9540u16, 0xD293u16,
334            0x36E5u16, 0x7136u16, 0xB943u16, 0xFE90u16, 0x3988u16, 0x7E5Bu16, 0xB62Eu16, 0xF1FDu16,
335            0x283Fu16, 0x6FECu16, 0xA799u16, 0xE04Au16, 0x2752u16, 0x6081u16, 0xA8F4u16, 0xEF27u16,
336            0x7039u16, 0x37EAu16, 0xFF9Fu16, 0xB84Cu16, 0x7F54u16, 0x3887u16, 0xF0F2u16, 0xB721u16,
337            0x6EE3u16, 0x2930u16, 0xE145u16, 0xA696u16, 0x618Eu16, 0x265Du16, 0xEE28u16, 0xA9FBu16,
338            0x4D8Du16, 0x0A5Eu16, 0xC22Bu16, 0x85F8u16, 0x42E0u16, 0x0533u16, 0xCD46u16, 0x8A95u16,
339            0x5357u16, 0x1484u16, 0xDCF1u16, 0x9B22u16, 0x5C3Au16, 0x1BE9u16, 0xD39Cu16, 0x944Fu16
340        ],
341        [
342            0x0000u16, 0xEB23u16, 0xC667u16, 0x2D44u16, 0x9CEFu16, 0x77CCu16, 0x5A88u16, 0xB1ABu16,
343            0x29FFu16, 0xC2DCu16, 0xEF98u16, 0x04BBu16, 0xB510u16, 0x5E33u16, 0x7377u16, 0x9854u16,
344            0x53FEu16, 0xB8DDu16, 0x9599u16, 0x7EBAu16, 0xCF11u16, 0x2432u16, 0x0976u16, 0xE255u16,
345            0x7A01u16, 0x9122u16, 0xBC66u16, 0x5745u16, 0xE6EEu16, 0x0DCDu16, 0x2089u16, 0xCBAAu16,
346            0xA7FCu16, 0x4CDFu16, 0x619Bu16, 0x8AB8u16, 0x3B13u16, 0xD030u16, 0xFD74u16, 0x1657u16,
347            0x8E03u16, 0x6520u16, 0x4864u16, 0xA347u16, 0x12ECu16, 0xF9CFu16, 0xD48Bu16, 0x3FA8u16,
348            0xF402u16, 0x1F21u16, 0x3265u16, 0xD946u16, 0x68EDu16, 0x83CEu16, 0xAE8Au16, 0x45A9u16,
349            0xDDFDu16, 0x36DEu16, 0x1B9Au16, 0xF0B9u16, 0x4112u16, 0xAA31u16, 0x8775u16, 0x6C56u16,
350            0x5FD9u16, 0xB4FAu16, 0x99BEu16, 0x729Du16, 0xC336u16, 0x2815u16, 0x0551u16, 0xEE72u16,
351            0x7626u16, 0x9D05u16, 0xB041u16, 0x5B62u16, 0xEAC9u16, 0x01EAu16, 0x2CAEu16, 0xC78Du16,
352            0x0C27u16, 0xE704u16, 0xCA40u16, 0x2163u16, 0x90C8u16, 0x7BEBu16, 0x56AFu16, 0xBD8Cu16,
353            0x25D8u16, 0xCEFBu16, 0xE3BFu16, 0x089Cu16, 0xB937u16, 0x5214u16, 0x7F50u16, 0x9473u16,
354            0xF825u16, 0x1306u16, 0x3E42u16, 0xD561u16, 0x64CAu16, 0x8FE9u16, 0xA2ADu16, 0x498Eu16,
355            0xD1DAu16, 0x3AF9u16, 0x17BDu16, 0xFC9Eu16, 0x4D35u16, 0xA616u16, 0x8B52u16, 0x6071u16,
356            0xABDBu16, 0x40F8u16, 0x6DBCu16, 0x869Fu16, 0x3734u16, 0xDC17u16, 0xF153u16, 0x1A70u16,
357            0x8224u16, 0x6907u16, 0x4443u16, 0xAF60u16, 0x1ECBu16, 0xF5E8u16, 0xD8ACu16, 0x338Fu16,
358            0xBFB2u16, 0x5491u16, 0x79D5u16, 0x92F6u16, 0x235Du16, 0xC87Eu16, 0xE53Au16, 0x0E19u16,
359            0x964Du16, 0x7D6Eu16, 0x502Au16, 0xBB09u16, 0x0AA2u16, 0xE181u16, 0xCCC5u16, 0x27E6u16,
360            0xEC4Cu16, 0x076Fu16, 0x2A2Bu16, 0xC108u16, 0x70A3u16, 0x9B80u16, 0xB6C4u16, 0x5DE7u16,
361            0xC5B3u16, 0x2E90u16, 0x03D4u16, 0xE8F7u16, 0x595Cu16, 0xB27Fu16, 0x9F3Bu16, 0x7418u16,
362            0x184Eu16, 0xF36Du16, 0xDE29u16, 0x350Au16, 0x84A1u16, 0x6F82u16, 0x42C6u16, 0xA9E5u16,
363            0x31B1u16, 0xDA92u16, 0xF7D6u16, 0x1CF5u16, 0xAD5Eu16, 0x467Du16, 0x6B39u16, 0x801Au16,
364            0x4BB0u16, 0xA093u16, 0x8DD7u16, 0x66F4u16, 0xD75Fu16, 0x3C7Cu16, 0x1138u16, 0xFA1Bu16,
365            0x624Fu16, 0x896Cu16, 0xA428u16, 0x4F0Bu16, 0xFEA0u16, 0x1583u16, 0x38C7u16, 0xD3E4u16,
366            0xE06Bu16, 0x0B48u16, 0x260Cu16, 0xCD2Fu16, 0x7C84u16, 0x97A7u16, 0xBAE3u16, 0x51C0u16,
367            0xC994u16, 0x22B7u16, 0x0FF3u16, 0xE4D0u16, 0x557Bu16, 0xBE58u16, 0x931Cu16, 0x783Fu16,
368            0xB395u16, 0x58B6u16, 0x75F2u16, 0x9ED1u16, 0x2F7Au16, 0xC459u16, 0xE91Du16, 0x023Eu16,
369            0x9A6Au16, 0x7149u16, 0x5C0Du16, 0xB72Eu16, 0x0685u16, 0xEDA6u16, 0xC0E2u16, 0x2BC1u16,
370            0x4797u16, 0xACB4u16, 0x81F0u16, 0x6AD3u16, 0xDB78u16, 0x305Bu16, 0x1D1Fu16, 0xF63Cu16,
371            0x6E68u16, 0x854Bu16, 0xA80Fu16, 0x432Cu16, 0xF287u16, 0x19A4u16, 0x34E0u16, 0xDFC3u16,
372            0x1469u16, 0xFF4Au16, 0xD20Eu16, 0x392Du16, 0x8886u16, 0x63A5u16, 0x4EE1u16, 0xA5C2u16,
373            0x3D96u16, 0xD6B5u16, 0xFBF1u16, 0x10D2u16, 0xA179u16, 0x4A5Au16, 0x671Eu16, 0x8C3Du16
374        ],
375        [
376            0x0000u16, 0x6F45u16, 0xDE8Au16, 0xB1CFu16, 0xAD35u16, 0xC270u16, 0x73BFu16, 0x1CFAu16,
377            0x4A4Bu16, 0x250Eu16, 0x94C1u16, 0xFB84u16, 0xE77Eu16, 0x883Bu16, 0x39F4u16, 0x56B1u16,
378            0x9496u16, 0xFBD3u16, 0x4A1Cu16, 0x2559u16, 0x39A3u16, 0x56E6u16, 0xE729u16, 0x886Cu16,
379            0xDEDDu16, 0xB198u16, 0x0057u16, 0x6F12u16, 0x73E8u16, 0x1CADu16, 0xAD62u16, 0xC227u16,
380            0x390Du16, 0x5648u16, 0xE787u16, 0x88C2u16, 0x9438u16, 0xFB7Du16, 0x4AB2u16, 0x25F7u16,
381            0x7346u16, 0x1C03u16, 0xADCCu16, 0xC289u16, 0xDE73u16, 0xB136u16, 0x00F9u16, 0x6FBCu16,
382            0xAD9Bu16, 0xC2DEu16, 0x7311u16, 0x1C54u16, 0x00AEu16, 0x6FEBu16, 0xDE24u16, 0xB161u16,
383            0xE7D0u16, 0x8895u16, 0x395Au16, 0x561Fu16, 0x4AE5u16, 0x25A0u16, 0x946Fu16, 0xFB2Au16,
384            0x721Au16, 0x1D5Fu16, 0xAC90u16, 0xC3D5u16, 0xDF2Fu16, 0xB06Au16, 0x01A5u16, 0x6EE0u16,
385            0x3851u16, 0x5714u16, 0xE6DBu16, 0x899Eu16, 0x9564u16, 0xFA21u16, 0x4BEEu16, 0x24ABu16,
386            0xE68Cu16, 0x89C9u16, 0x3806u16, 0x5743u16, 0x4BB9u16, 0x24FCu16, 0x9533u16, 0xFA76u16,
387            0xACC7u16, 0xC382u16, 0x724Du16, 0x1D08u16, 0x01F2u16, 0x6EB7u16, 0xDF78u16, 0xB03Du16,
388            0x4B17u16, 0x2452u16, 0x959Du16, 0xFAD8u16, 0xE622u16, 0x8967u16, 0x38A8u16, 0x57EDu16,
389            0x015Cu16, 0x6E19u16, 0xDFD6u16, 0xB093u16, 0xAC69u16, 0xC32Cu16, 0x72E3u16, 0x1DA6u16,
390            0xDF81u16, 0xB0C4u16, 0x010Bu16, 0x6E4Eu16, 0x72B4u16, 0x1DF1u16, 0xAC3Eu16, 0xC37Bu16,
391            0x95CAu16, 0xFA8Fu16, 0x4B40u16, 0x2405u16, 0x38FFu16, 0x57BAu16, 0xE675u16, 0x8930u16,
392            0xE434u16, 0x8B71u16, 0x3ABEu16, 0x55FBu16, 0x4901u16, 0x2644u16, 0x978Bu16, 0xF8CEu16,
393            0xAE7Fu16, 0xC13Au16, 0x70F5u16, 0x1FB0u16, 0x034Au16, 0x6C0Fu16, 0xDDC0u16, 0xB285u16,
394            0x70A2u16, 0x1FE7u16, 0xAE28u16, 0xC16Du16, 0xDD97u16, 0xB2D2u16, 0x031Du16, 0x6C58u16,
395            0x3AE9u16, 0x55ACu16, 0xE463u16, 0x8B26u16, 0x97DCu16, 0xF899u16, 0x4956u16, 0x2613u16,
396            0xDD39u16, 0xB27Cu16, 0x03B3u16, 0x6CF6u16, 0x700Cu16, 0x1F49u16, 0xAE86u16, 0xC1C3u16,
397            0x9772u16, 0xF837u16, 0x49F8u16, 0x26BDu16, 0x3A47u16, 0x5502u16, 0xE4CDu16, 0x8B88u16,
398            0x49AFu16, 0x26EAu16, 0x9725u16, 0xF860u16, 0xE49Au16, 0x8BDFu16, 0x3A10u16, 0x5555u16,
399            0x03E4u16, 0x6CA1u16, 0xDD6Eu16, 0xB22Bu16, 0xAED1u16, 0xC194u16, 0x705Bu16, 0x1F1Eu16,
400            0x962Eu16, 0xF96Bu16, 0x48A4u16, 0x27E1u16, 0x3B1Bu16, 0x545Eu16, 0xE591u16, 0x8AD4u16,
401            0xDC65u16, 0xB320u16, 0x02EFu16, 0x6DAAu16, 0x7150u16, 0x1E15u16, 0xAFDAu16, 0xC09Fu16,
402            0x02B8u16, 0x6DFDu16, 0xDC32u16, 0xB377u16, 0xAF8Du16, 0xC0C8u16, 0x7107u16, 0x1E42u16,
403            0x48F3u16, 0x27B6u16, 0x9679u16, 0xF93Cu16, 0xE5C6u16, 0x8A83u16, 0x3B4Cu16, 0x5409u16,
404            0xAF23u16, 0xC066u16, 0x71A9u16, 0x1EECu16, 0x0216u16, 0x6D53u16, 0xDC9Cu16, 0xB3D9u16,
405            0xE568u16, 0x8A2Du16, 0x3BE2u16, 0x54A7u16, 0x485Du16, 0x2718u16, 0x96D7u16, 0xF992u16,
406            0x3BB5u16, 0x54F0u16, 0xE53Fu16, 0x8A7Au16, 0x9680u16, 0xF9C5u16, 0x480Au16, 0x274Fu16,
407            0x71FEu16, 0x1EBBu16, 0xAF74u16, 0xC031u16, 0xDCCBu16, 0xB38Eu16, 0x0241u16, 0x6D04u16
408        ],
409        [
410            0x0000u16, 0xD849u16, 0xA0B3u16, 0x78FAu16, 0x5147u16, 0x890Eu16, 0xF1F4u16, 0x29BDu16,
411            0xA28Eu16, 0x7AC7u16, 0x023Du16, 0xDA74u16, 0xF3C9u16, 0x2B80u16, 0x537Au16, 0x8B33u16,
412            0x553Du16, 0x8D74u16, 0xF58Eu16, 0x2DC7u16, 0x047Au16, 0xDC33u16, 0xA4C9u16, 0x7C80u16,
413            0xF7B3u16, 0x2FFAu16, 0x5700u16, 0x8F49u16, 0xA6F4u16, 0x7EBDu16, 0x0647u16, 0xDE0Eu16,
414            0xAA7Au16, 0x7233u16, 0x0AC9u16, 0xD280u16, 0xFB3Du16, 0x2374u16, 0x5B8Eu16, 0x83C7u16,
415            0x08F4u16, 0xD0BDu16, 0xA847u16, 0x700Eu16, 0x59B3u16, 0x81FAu16, 0xF900u16, 0x2149u16,
416            0xFF47u16, 0x270Eu16, 0x5FF4u16, 0x87BDu16, 0xAE00u16, 0x7649u16, 0x0EB3u16, 0xD6FAu16,
417            0x5DC9u16, 0x8580u16, 0xFD7Au16, 0x2533u16, 0x0C8Eu16, 0xD4C7u16, 0xAC3Du16, 0x7474u16,
418            0x44D5u16, 0x9C9Cu16, 0xE466u16, 0x3C2Fu16, 0x1592u16, 0xCDDBu16, 0xB521u16, 0x6D68u16,
419            0xE65Bu16, 0x3E12u16, 0x46E8u16, 0x9EA1u16, 0xB71Cu16, 0x6F55u16, 0x17AFu16, 0xCFE6u16,
420            0x11E8u16, 0xC9A1u16, 0xB15Bu16, 0x6912u16, 0x40AFu16, 0x98E6u16, 0xE01Cu16, 0x3855u16,
421            0xB366u16, 0x6B2Fu16, 0x13D5u16, 0xCB9Cu16, 0xE221u16, 0x3A68u16, 0x4292u16, 0x9ADBu16,
422            0xEEAFu16, 0x36E6u16, 0x4E1Cu16, 0x9655u16, 0xBFE8u16, 0x67A1u16, 0x1F5Bu16, 0xC712u16,
423            0x4C21u16, 0x9468u16, 0xEC92u16, 0x34DBu16, 0x1D66u16, 0xC52Fu16, 0xBDD5u16, 0x659Cu16,
424            0xBB92u16, 0x63DBu16, 0x1B21u16, 0xC368u16, 0xEAD5u16, 0x329Cu16, 0x4A66u16, 0x922Fu16,
425            0x191Cu16, 0xC155u16, 0xB9AFu16, 0x61E6u16, 0x485Bu16, 0x9012u16, 0xE8E8u16, 0x30A1u16,
426            0x89AAu16, 0x51E3u16, 0x2919u16, 0xF150u16, 0xD8EDu16, 0x00A4u16, 0x785Eu16, 0xA017u16,
427            0x2B24u16, 0xF36Du16, 0x8B97u16, 0x53DEu16, 0x7A63u16, 0xA22Au16, 0xDAD0u16, 0x0299u16,
428            0xDC97u16, 0x04DEu16, 0x7C24u16, 0xA46Du16, 0x8DD0u16, 0x5599u16, 0x2D63u16, 0xF52Au16,
429            0x7E19u16, 0xA650u16, 0xDEAAu16, 0x06E3u16, 0x2F5Eu16, 0xF717u16, 0x8FEDu16, 0x57A4u16,
430            0x23D0u16, 0xFB99u16, 0x8363u16, 0x5B2Au16, 0x7297u16, 0xAADEu16, 0xD224u16, 0x0A6Du16,
431            0x815Eu16, 0x5917u16, 0x21EDu16, 0xF9A4u16, 0xD019u16, 0x0850u16, 0x70AAu16, 0xA8E3u16,
432            0x76EDu16, 0xAEA4u16, 0xD65Eu16, 0x0E17u16, 0x27AAu16, 0xFFE3u16, 0x8719u16, 0x5F50u16,
433            0xD463u16, 0x0C2Au16, 0x74D0u16, 0xAC99u16, 0x8524u16, 0x5D6Du16, 0x2597u16, 0xFDDEu16,
434            0xCD7Fu16, 0x1536u16, 0x6DCCu16, 0xB585u16, 0x9C38u16, 0x4471u16, 0x3C8Bu16, 0xE4C2u16,
435            0x6FF1u16, 0xB7B8u16, 0xCF42u16, 0x170Bu16, 0x3EB6u16, 0xE6FFu16, 0x9E05u16, 0x464Cu16,
436            0x9842u16, 0x400Bu16, 0x38F1u16, 0xE0B8u16, 0xC905u16, 0x114Cu16, 0x69B6u16, 0xB1FFu16,
437            0x3ACCu16, 0xE285u16, 0x9A7Fu16, 0x4236u16, 0x6B8Bu16, 0xB3C2u16, 0xCB38u16, 0x1371u16,
438            0x6705u16, 0xBF4Cu16, 0xC7B6u16, 0x1FFFu16, 0x3642u16, 0xEE0Bu16, 0x96F1u16, 0x4EB8u16,
439            0xC58Bu16, 0x1DC2u16, 0x6538u16, 0xBD71u16, 0x94CCu16, 0x4C85u16, 0x347Fu16, 0xEC36u16,
440            0x3238u16, 0xEA71u16, 0x928Bu16, 0x4AC2u16, 0x637Fu16, 0xBB36u16, 0xC3CCu16, 0x1B85u16,
441            0x90B6u16, 0x48FFu16, 0x3005u16, 0xE84Cu16, 0xC1F1u16, 0x19B8u16, 0x6142u16, 0xB90Bu16
442        ],
443        [
444            0x0000u16, 0x0375u16, 0x06EAu16, 0x059Fu16, 0x0DD4u16, 0x0EA1u16, 0x0B3Eu16, 0x084Bu16,
445            0x1BA8u16, 0x18DDu16, 0x1D42u16, 0x1E37u16, 0x167Cu16, 0x1509u16, 0x1096u16, 0x13E3u16,
446            0x3750u16, 0x3425u16, 0x31BAu16, 0x32CFu16, 0x3A84u16, 0x39F1u16, 0x3C6Eu16, 0x3F1Bu16,
447            0x2CF8u16, 0x2F8Du16, 0x2A12u16, 0x2967u16, 0x212Cu16, 0x2259u16, 0x27C6u16, 0x24B3u16,
448            0x6EA0u16, 0x6DD5u16, 0x684Au16, 0x6B3Fu16, 0x6374u16, 0x6001u16, 0x659Eu16, 0x66EBu16,
449            0x7508u16, 0x767Du16, 0x73E2u16, 0x7097u16, 0x78DCu16, 0x7BA9u16, 0x7E36u16, 0x7D43u16,
450            0x59F0u16, 0x5A85u16, 0x5F1Au16, 0x5C6Fu16, 0x5424u16, 0x5751u16, 0x52CEu16, 0x51BBu16,
451            0x4258u16, 0x412Du16, 0x44B2u16, 0x47C7u16, 0x4F8Cu16, 0x4CF9u16, 0x4966u16, 0x4A13u16,
452            0xDD40u16, 0xDE35u16, 0xDBAAu16, 0xD8DFu16, 0xD094u16, 0xD3E1u16, 0xD67Eu16, 0xD50Bu16,
453            0xC6E8u16, 0xC59Du16, 0xC002u16, 0xC377u16, 0xCB3Cu16, 0xC849u16, 0xCDD6u16, 0xCEA3u16,
454            0xEA10u16, 0xE965u16, 0xECFAu16, 0xEF8Fu16, 0xE7C4u16, 0xE4B1u16, 0xE12Eu16, 0xE25Bu16,
455            0xF1B8u16, 0xF2CDu16, 0xF752u16, 0xF427u16, 0xFC6Cu16, 0xFF19u16, 0xFA86u16, 0xF9F3u16,
456            0xB3E0u16, 0xB095u16, 0xB50Au16, 0xB67Fu16, 0xBE34u16, 0xBD41u16, 0xB8DEu16, 0xBBABu16,
457            0xA848u16, 0xAB3Du16, 0xAEA2u16, 0xADD7u16, 0xA59Cu16, 0xA6E9u16, 0xA376u16, 0xA003u16,
458            0x84B0u16, 0x87C5u16, 0x825Au16, 0x812Fu16, 0x8964u16, 0x8A11u16, 0x8F8Eu16, 0x8CFBu16,
459            0x9F18u16, 0x9C6Du16, 0x99F2u16, 0x9A87u16, 0x92CCu16, 0x91B9u16, 0x9426u16, 0x9753u16,
460            0xAAA1u16, 0xA9D4u16, 0xAC4Bu16, 0xAF3Eu16, 0xA775u16, 0xA400u16, 0xA19Fu16, 0xA2EAu16,
461            0xB109u16, 0xB27Cu16, 0xB7E3u16, 0xB496u16, 0xBCDDu16, 0xBFA8u16, 0xBA37u16, 0xB942u16,
462            0x9DF1u16, 0x9E84u16, 0x9B1Bu16, 0x986Eu16, 0x9025u16, 0x9350u16, 0x96CFu16, 0x95BAu16,
463            0x8659u16, 0x852Cu16, 0x80B3u16, 0x83C6u16, 0x8B8Du16, 0x88F8u16, 0x8D67u16, 0x8E12u16,
464            0xC401u16, 0xC774u16, 0xC2EBu16, 0xC19Eu16, 0xC9D5u16, 0xCAA0u16, 0xCF3Fu16, 0xCC4Au16,
465            0xDFA9u16, 0xDCDCu16, 0xD943u16, 0xDA36u16, 0xD27Du16, 0xD108u16, 0xD497u16, 0xD7E2u16,
466            0xF351u16, 0xF024u16, 0xF5BBu16, 0xF6CEu16, 0xFE85u16, 0xFDF0u16, 0xF86Fu16, 0xFB1Au16,
467            0xE8F9u16, 0xEB8Cu16, 0xEE13u16, 0xED66u16, 0xE52Du16, 0xE658u16, 0xE3C7u16, 0xE0B2u16,
468            0x77E1u16, 0x7494u16, 0x710Bu16, 0x727Eu16, 0x7A35u16, 0x7940u16, 0x7CDFu16, 0x7FAAu16,
469            0x6C49u16, 0x6F3Cu16, 0x6AA3u16, 0x69D6u16, 0x619Du16, 0x62E8u16, 0x6777u16, 0x6402u16,
470            0x40B1u16, 0x43C4u16, 0x465Bu16, 0x452Eu16, 0x4D65u16, 0x4E10u16, 0x4B8Fu16, 0x48FAu16,
471            0x5B19u16, 0x586Cu16, 0x5DF3u16, 0x5E86u16, 0x56CDu16, 0x55B8u16, 0x5027u16, 0x5352u16,
472            0x1941u16, 0x1A34u16, 0x1FABu16, 0x1CDEu16, 0x1495u16, 0x17E0u16, 0x127Fu16, 0x110Au16,
473            0x02E9u16, 0x019Cu16, 0x0403u16, 0x0776u16, 0x0F3Du16, 0x0C48u16, 0x09D7u16, 0x0AA2u16,
474            0x2E11u16, 0x2D64u16, 0x28FBu16, 0x2B8Eu16, 0x23C5u16, 0x20B0u16, 0x252Fu16, 0x265Au16,
475            0x35B9u16, 0x36CCu16, 0x3353u16, 0x3026u16, 0x386Du16, 0x3B18u16, 0x3E87u16, 0x3DF2u16
476        ],
477        [
478            0x0000u16, 0x4563u16, 0x8AC6u16, 0xCFA5u16, 0x05ADu16, 0x40CEu16, 0x8F6Bu16, 0xCA08u16,
479            0x0B5Au16, 0x4E39u16, 0x819Cu16, 0xC4FFu16, 0x0EF7u16, 0x4B94u16, 0x8431u16, 0xC152u16,
480            0x16B4u16, 0x53D7u16, 0x9C72u16, 0xD911u16, 0x1319u16, 0x567Au16, 0x99DFu16, 0xDCBCu16,
481            0x1DEEu16, 0x588Du16, 0x9728u16, 0xD24Bu16, 0x1843u16, 0x5D20u16, 0x9285u16, 0xD7E6u16,
482            0x2D68u16, 0x680Bu16, 0xA7AEu16, 0xE2CDu16, 0x28C5u16, 0x6DA6u16, 0xA203u16, 0xE760u16,
483            0x2632u16, 0x6351u16, 0xACF4u16, 0xE997u16, 0x239Fu16, 0x66FCu16, 0xA959u16, 0xEC3Au16,
484            0x3BDCu16, 0x7EBFu16, 0xB11Au16, 0xF479u16, 0x3E71u16, 0x7B12u16, 0xB4B7u16, 0xF1D4u16,
485            0x3086u16, 0x75E5u16, 0xBA40u16, 0xFF23u16, 0x352Bu16, 0x7048u16, 0xBFEDu16, 0xFA8Eu16,
486            0x5AD0u16, 0x1FB3u16, 0xD016u16, 0x9575u16, 0x5F7Du16, 0x1A1Eu16, 0xD5BBu16, 0x90D8u16,
487            0x518Au16, 0x14E9u16, 0xDB4Cu16, 0x9E2Fu16, 0x5427u16, 0x1144u16, 0xDEE1u16, 0x9B82u16,
488            0x4C64u16, 0x0907u16, 0xC6A2u16, 0x83C1u16, 0x49C9u16, 0x0CAAu16, 0xC30Fu16, 0x866Cu16,
489            0x473Eu16, 0x025Du16, 0xCDF8u16, 0x889Bu16, 0x4293u16, 0x07F0u16, 0xC855u16, 0x8D36u16,
490            0x77B8u16, 0x32DBu16, 0xFD7Eu16, 0xB81Du16, 0x7215u16, 0x3776u16, 0xF8D3u16, 0xBDB0u16,
491            0x7CE2u16, 0x3981u16, 0xF624u16, 0xB347u16, 0x794Fu16, 0x3C2Cu16, 0xF389u16, 0xB6EAu16,
492            0x610Cu16, 0x246Fu16, 0xEBCAu16, 0xAEA9u16, 0x64A1u16, 0x21C2u16, 0xEE67u16, 0xAB04u16,
493            0x6A56u16, 0x2F35u16, 0xE090u16, 0xA5F3u16, 0x6FFBu16, 0x2A98u16, 0xE53Du16, 0xA05Eu16,
494            0xB5A0u16, 0xF0C3u16, 0x3F66u16, 0x7A05u16, 0xB00Du16, 0xF56Eu16, 0x3ACBu16, 0x7FA8u16,
495            0xBEFAu16, 0xFB99u16, 0x343Cu16, 0x715Fu16, 0xBB57u16, 0xFE34u16, 0x3191u16, 0x74F2u16,
496            0xA314u16, 0xE677u16, 0x29D2u16, 0x6CB1u16, 0xA6B9u16, 0xE3DAu16, 0x2C7Fu16, 0x691Cu16,
497            0xA84Eu16, 0xED2Du16, 0x2288u16, 0x67EBu16, 0xADE3u16, 0xE880u16, 0x2725u16, 0x6246u16,
498            0x98C8u16, 0xDDABu16, 0x120Eu16, 0x576Du16, 0x9D65u16, 0xD806u16, 0x17A3u16, 0x52C0u16,
499            0x9392u16, 0xD6F1u16, 0x1954u16, 0x5C37u16, 0x963Fu16, 0xD35Cu16, 0x1CF9u16, 0x599Au16,
500            0x8E7Cu16, 0xCB1Fu16, 0x04BAu16, 0x41D9u16, 0x8BD1u16, 0xCEB2u16, 0x0117u16, 0x4474u16,
501            0x8526u16, 0xC045u16, 0x0FE0u16, 0x4A83u16, 0x808Bu16, 0xC5E8u16, 0x0A4Du16, 0x4F2Eu16,
502            0xEF70u16, 0xAA13u16, 0x65B6u16, 0x20D5u16, 0xEADDu16, 0xAFBEu16, 0x601Bu16, 0x2578u16,
503            0xE42Au16, 0xA149u16, 0x6EECu16, 0x2B8Fu16, 0xE187u16, 0xA4E4u16, 0x6B41u16, 0x2E22u16,
504            0xF9C4u16, 0xBCA7u16, 0x7302u16, 0x3661u16, 0xFC69u16, 0xB90Au16, 0x76AFu16, 0x33CCu16,
505            0xF29Eu16, 0xB7FDu16, 0x7858u16, 0x3D3Bu16, 0xF733u16, 0xB250u16, 0x7DF5u16, 0x3896u16,
506            0xC218u16, 0x877Bu16, 0x48DEu16, 0x0DBDu16, 0xC7B5u16, 0x82D6u16, 0x4D73u16, 0x0810u16,
507            0xC942u16, 0x8C21u16, 0x4384u16, 0x06E7u16, 0xCCEFu16, 0x898Cu16, 0x4629u16, 0x034Au16,
508            0xD4ACu16, 0x91CFu16, 0x5E6Au16, 0x1B09u16, 0xD101u16, 0x9462u16, 0x5BC7u16, 0x1EA4u16,
509            0xDFF6u16, 0x9A95u16, 0x5530u16, 0x1053u16, 0xDA5Bu16, 0x9F38u16, 0x509Du16, 0x15FEu16
510        ],
511        [
512            0x0000u16, 0x7B61u16, 0xF6C2u16, 0x8DA3u16, 0xFDA5u16, 0x86C4u16, 0x0B67u16, 0x7006u16,
513            0xEB6Bu16, 0x900Au16, 0x1DA9u16, 0x66C8u16, 0x16CEu16, 0x6DAFu16, 0xE00Cu16, 0x9B6Du16,
514            0xC6F7u16, 0xBD96u16, 0x3035u16, 0x4B54u16, 0x3B52u16, 0x4033u16, 0xCD90u16, 0xB6F1u16,
515            0x2D9Cu16, 0x56FDu16, 0xDB5Eu16, 0xA03Fu16, 0xD039u16, 0xAB58u16, 0x26FBu16, 0x5D9Au16,
516            0x9DCFu16, 0xE6AEu16, 0x6B0Du16, 0x106Cu16, 0x606Au16, 0x1B0Bu16, 0x96A8u16, 0xEDC9u16,
517            0x76A4u16, 0x0DC5u16, 0x8066u16, 0xFB07u16, 0x8B01u16, 0xF060u16, 0x7DC3u16, 0x06A2u16,
518            0x5B38u16, 0x2059u16, 0xADFAu16, 0xD69Bu16, 0xA69Du16, 0xDDFCu16, 0x505Fu16, 0x2B3Eu16,
519            0xB053u16, 0xCB32u16, 0x4691u16, 0x3DF0u16, 0x4DF6u16, 0x3697u16, 0xBB34u16, 0xC055u16,
520            0x2BBFu16, 0x50DEu16, 0xDD7Du16, 0xA61Cu16, 0xD61Au16, 0xAD7Bu16, 0x20D8u16, 0x5BB9u16,
521            0xC0D4u16, 0xBBB5u16, 0x3616u16, 0x4D77u16, 0x3D71u16, 0x4610u16, 0xCBB3u16, 0xB0D2u16,
522            0xED48u16, 0x9629u16, 0x1B8Au16, 0x60EBu16, 0x10EDu16, 0x6B8Cu16, 0xE62Fu16, 0x9D4Eu16,
523            0x0623u16, 0x7D42u16, 0xF0E1u16, 0x8B80u16, 0xFB86u16, 0x80E7u16, 0x0D44u16, 0x7625u16,
524            0xB670u16, 0xCD11u16, 0x40B2u16, 0x3BD3u16, 0x4BD5u16, 0x30B4u16, 0xBD17u16, 0xC676u16,
525            0x5D1Bu16, 0x267Au16, 0xABD9u16, 0xD0B8u16, 0xA0BEu16, 0xDBDFu16, 0x567Cu16, 0x2D1Du16,
526            0x7087u16, 0x0BE6u16, 0x8645u16, 0xFD24u16, 0x8D22u16, 0xF643u16, 0x7BE0u16, 0x0081u16,
527            0x9BECu16, 0xE08Du16, 0x6D2Eu16, 0x164Fu16, 0x6649u16, 0x1D28u16, 0x908Bu16, 0xEBEAu16,
528            0x577Eu16, 0x2C1Fu16, 0xA1BCu16, 0xDADDu16, 0xAADBu16, 0xD1BAu16, 0x5C19u16, 0x2778u16,
529            0xBC15u16, 0xC774u16, 0x4AD7u16, 0x31B6u16, 0x41B0u16, 0x3AD1u16, 0xB772u16, 0xCC13u16,
530            0x9189u16, 0xEAE8u16, 0x674Bu16, 0x1C2Au16, 0x6C2Cu16, 0x174Du16, 0x9AEEu16, 0xE18Fu16,
531            0x7AE2u16, 0x0183u16, 0x8C20u16, 0xF741u16, 0x8747u16, 0xFC26u16, 0x7185u16, 0x0AE4u16,
532            0xCAB1u16, 0xB1D0u16, 0x3C73u16, 0x4712u16, 0x3714u16, 0x4C75u16, 0xC1D6u16, 0xBAB7u16,
533            0x21DAu16, 0x5ABBu16, 0xD718u16, 0xAC79u16, 0xDC7Fu16, 0xA71Eu16, 0x2ABDu16, 0x51DCu16,
534            0x0C46u16, 0x7727u16, 0xFA84u16, 0x81E5u16, 0xF1E3u16, 0x8A82u16, 0x0721u16, 0x7C40u16,
535            0xE72Du16, 0x9C4Cu16, 0x11EFu16, 0x6A8Eu16, 0x1A88u16, 0x61E9u16, 0xEC4Au16, 0x972Bu16,
536            0x7CC1u16, 0x07A0u16, 0x8A03u16, 0xF162u16, 0x8164u16, 0xFA05u16, 0x77A6u16, 0x0CC7u16,
537            0x97AAu16, 0xECCBu16, 0x6168u16, 0x1A09u16, 0x6A0Fu16, 0x116Eu16, 0x9CCDu16, 0xE7ACu16,
538            0xBA36u16, 0xC157u16, 0x4CF4u16, 0x3795u16, 0x4793u16, 0x3CF2u16, 0xB151u16, 0xCA30u16,
539            0x515Du16, 0x2A3Cu16, 0xA79Fu16, 0xDCFEu16, 0xACF8u16, 0xD799u16, 0x5A3Au16, 0x215Bu16,
540            0xE10Eu16, 0x9A6Fu16, 0x17CCu16, 0x6CADu16, 0x1CABu16, 0x67CAu16, 0xEA69u16, 0x9108u16,
541            0x0A65u16, 0x7104u16, 0xFCA7u16, 0x87C6u16, 0xF7C0u16, 0x8CA1u16, 0x0102u16, 0x7A63u16,
542            0x27F9u16, 0x5C98u16, 0xD13Bu16, 0xAA5Au16, 0xDA5Cu16, 0xA13Du16, 0x2C9Eu16, 0x57FFu16,
543            0xCC92u16, 0xB7F3u16, 0x3A50u16, 0x4131u16, 0x3137u16, 0x4A56u16, 0xC7F5u16, 0xBC94u16
544        ],
545        [
546            0x0000u16, 0xAEFCu16, 0x4DD9u16, 0xE325u16, 0x9BB2u16, 0x354Eu16, 0xD66Bu16, 0x7897u16,
547            0x2745u16, 0x89B9u16, 0x6A9Cu16, 0xC460u16, 0xBCF7u16, 0x120Bu16, 0xF12Eu16, 0x5FD2u16,
548            0x4E8Au16, 0xE076u16, 0x0353u16, 0xADAFu16, 0xD538u16, 0x7BC4u16, 0x98E1u16, 0x361Du16,
549            0x69CFu16, 0xC733u16, 0x2416u16, 0x8AEAu16, 0xF27Du16, 0x5C81u16, 0xBFA4u16, 0x1158u16,
550            0x9D14u16, 0x33E8u16, 0xD0CDu16, 0x7E31u16, 0x06A6u16, 0xA85Au16, 0x4B7Fu16, 0xE583u16,
551            0xBA51u16, 0x14ADu16, 0xF788u16, 0x5974u16, 0x21E3u16, 0x8F1Fu16, 0x6C3Au16, 0xC2C6u16,
552            0xD39Eu16, 0x7D62u16, 0x9E47u16, 0x30BBu16, 0x482Cu16, 0xE6D0u16, 0x05F5u16, 0xAB09u16,
553            0xF4DBu16, 0x5A27u16, 0xB902u16, 0x17FEu16, 0x6F69u16, 0xC195u16, 0x22B0u16, 0x8C4Cu16,
554            0x2A09u16, 0x84F5u16, 0x67D0u16, 0xC92Cu16, 0xB1BBu16, 0x1F47u16, 0xFC62u16, 0x529Eu16,
555            0x0D4Cu16, 0xA3B0u16, 0x4095u16, 0xEE69u16, 0x96FEu16, 0x3802u16, 0xDB27u16, 0x75DBu16,
556            0x6483u16, 0xCA7Fu16, 0x295Au16, 0x87A6u16, 0xFF31u16, 0x51CDu16, 0xB2E8u16, 0x1C14u16,
557            0x43C6u16, 0xED3Au16, 0x0E1Fu16, 0xA0E3u16, 0xD874u16, 0x7688u16, 0x95ADu16, 0x3B51u16,
558            0xB71Du16, 0x19E1u16, 0xFAC4u16, 0x5438u16, 0x2CAFu16, 0x8253u16, 0x6176u16, 0xCF8Au16,
559            0x9058u16, 0x3EA4u16, 0xDD81u16, 0x737Du16, 0x0BEAu16, 0xA516u16, 0x4633u16, 0xE8CFu16,
560            0xF997u16, 0x576Bu16, 0xB44Eu16, 0x1AB2u16, 0x6225u16, 0xCCD9u16, 0x2FFCu16, 0x8100u16,
561            0xDED2u16, 0x702Eu16, 0x930Bu16, 0x3DF7u16, 0x4560u16, 0xEB9Cu16, 0x08B9u16, 0xA645u16,
562            0x5412u16, 0xFAEEu16, 0x19CBu16, 0xB737u16, 0xCFA0u16, 0x615Cu16, 0x8279u16, 0x2C85u16,
563            0x7357u16, 0xDDABu16, 0x3E8Eu16, 0x9072u16, 0xE8E5u16, 0x4619u16, 0xA53Cu16, 0x0BC0u16,
564            0x1A98u16, 0xB464u16, 0x5741u16, 0xF9BDu16, 0x812Au16, 0x2FD6u16, 0xCCF3u16, 0x620Fu16,
565            0x3DDDu16, 0x9321u16, 0x7004u16, 0xDEF8u16, 0xA66Fu16, 0x0893u16, 0xEBB6u16, 0x454Au16,
566            0xC906u16, 0x67FAu16, 0x84DFu16, 0x2A23u16, 0x52B4u16, 0xFC48u16, 0x1F6Du16, 0xB191u16,
567            0xEE43u16, 0x40BFu16, 0xA39Au16, 0x0D66u16, 0x75F1u16, 0xDB0Du16, 0x3828u16, 0x96D4u16,
568            0x878Cu16, 0x2970u16, 0xCA55u16, 0x64A9u16, 0x1C3Eu16, 0xB2C2u16, 0x51E7u16, 0xFF1Bu16,
569            0xA0C9u16, 0x0E35u16, 0xED10u16, 0x43ECu16, 0x3B7Bu16, 0x9587u16, 0x76A2u16, 0xD85Eu16,
570            0x7E1Bu16, 0xD0E7u16, 0x33C2u16, 0x9D3Eu16, 0xE5A9u16, 0x4B55u16, 0xA870u16, 0x068Cu16,
571            0x595Eu16, 0xF7A2u16, 0x1487u16, 0xBA7Bu16, 0xC2ECu16, 0x6C10u16, 0x8F35u16, 0x21C9u16,
572            0x3091u16, 0x9E6Du16, 0x7D48u16, 0xD3B4u16, 0xAB23u16, 0x05DFu16, 0xE6FAu16, 0x4806u16,
573            0x17D4u16, 0xB928u16, 0x5A0Du16, 0xF4F1u16, 0x8C66u16, 0x229Au16, 0xC1BFu16, 0x6F43u16,
574            0xE30Fu16, 0x4DF3u16, 0xAED6u16, 0x002Au16, 0x78BDu16, 0xD641u16, 0x3564u16, 0x9B98u16,
575            0xC44Au16, 0x6AB6u16, 0x8993u16, 0x276Fu16, 0x5FF8u16, 0xF104u16, 0x1221u16, 0xBCDDu16,
576            0xAD85u16, 0x0379u16, 0xE05Cu16, 0x4EA0u16, 0x3637u16, 0x98CBu16, 0x7BEEu16, 0xD512u16,
577            0x8AC0u16, 0x243Cu16, 0xC719u16, 0x69E5u16, 0x1172u16, 0xBF8Eu16, 0x5CABu16, 0xF257u16
578        ],
579        [
580            0x0000u16, 0xA824u16, 0x4069u16, 0xE84Du16, 0x80D2u16, 0x28F6u16, 0xC0BBu16, 0x689Fu16,
581            0x1185u16, 0xB9A1u16, 0x51ECu16, 0xF9C8u16, 0x9157u16, 0x3973u16, 0xD13Eu16, 0x791Au16,
582            0x230Au16, 0x8B2Eu16, 0x6363u16, 0xCB47u16, 0xA3D8u16, 0x0BFCu16, 0xE3B1u16, 0x4B95u16,
583            0x328Fu16, 0x9AABu16, 0x72E6u16, 0xDAC2u16, 0xB25Du16, 0x1A79u16, 0xF234u16, 0x5A10u16,
584            0x4614u16, 0xEE30u16, 0x067Du16, 0xAE59u16, 0xC6C6u16, 0x6EE2u16, 0x86AFu16, 0x2E8Bu16,
585            0x5791u16, 0xFFB5u16, 0x17F8u16, 0xBFDCu16, 0xD743u16, 0x7F67u16, 0x972Au16, 0x3F0Eu16,
586            0x651Eu16, 0xCD3Au16, 0x2577u16, 0x8D53u16, 0xE5CCu16, 0x4DE8u16, 0xA5A5u16, 0x0D81u16,
587            0x749Bu16, 0xDCBFu16, 0x34F2u16, 0x9CD6u16, 0xF449u16, 0x5C6Du16, 0xB420u16, 0x1C04u16,
588            0x8C28u16, 0x240Cu16, 0xCC41u16, 0x6465u16, 0x0CFAu16, 0xA4DEu16, 0x4C93u16, 0xE4B7u16,
589            0x9DADu16, 0x3589u16, 0xDDC4u16, 0x75E0u16, 0x1D7Fu16, 0xB55Bu16, 0x5D16u16, 0xF532u16,
590            0xAF22u16, 0x0706u16, 0xEF4Bu16, 0x476Fu16, 0x2FF0u16, 0x87D4u16, 0x6F99u16, 0xC7BDu16,
591            0xBEA7u16, 0x1683u16, 0xFECEu16, 0x56EAu16, 0x3E75u16, 0x9651u16, 0x7E1Cu16, 0xD638u16,
592            0xCA3Cu16, 0x6218u16, 0x8A55u16, 0x2271u16, 0x4AEEu16, 0xE2CAu16, 0x0A87u16, 0xA2A3u16,
593            0xDBB9u16, 0x739Du16, 0x9BD0u16, 0x33F4u16, 0x5B6Bu16, 0xF34Fu16, 0x1B02u16, 0xB326u16,
594            0xE936u16, 0x4112u16, 0xA95Fu16, 0x017Bu16, 0x69E4u16, 0xC1C0u16, 0x298Du16, 0x81A9u16,
595            0xF8B3u16, 0x5097u16, 0xB8DAu16, 0x10FEu16, 0x7861u16, 0xD045u16, 0x3808u16, 0x902Cu16,
596            0x0871u16, 0xA055u16, 0x4818u16, 0xE03Cu16, 0x88A3u16, 0x2087u16, 0xC8CAu16, 0x60EEu16,
597            0x19F4u16, 0xB1D0u16, 0x599Du16, 0xF1B9u16, 0x9926u16, 0x3102u16, 0xD94Fu16, 0x716Bu16,
598            0x2B7Bu16, 0x835Fu16, 0x6B12u16, 0xC336u16, 0xABA9u16, 0x038Du16, 0xEBC0u16, 0x43E4u16,
599            0x3AFEu16, 0x92DAu16, 0x7A97u16, 0xD2B3u16, 0xBA2Cu16, 0x1208u16, 0xFA45u16, 0x5261u16,
600            0x4E65u16, 0xE641u16, 0x0E0Cu16, 0xA628u16, 0xCEB7u16, 0x6693u16, 0x8EDEu16, 0x26FAu16,
601            0x5FE0u16, 0xF7C4u16, 0x1F89u16, 0xB7ADu16, 0xDF32u16, 0x7716u16, 0x9F5Bu16, 0x377Fu16,
602            0x6D6Fu16, 0xC54Bu16, 0x2D06u16, 0x8522u16, 0xEDBDu16, 0x4599u16, 0xADD4u16, 0x05F0u16,
603            0x7CEAu16, 0xD4CEu16, 0x3C83u16, 0x94A7u16, 0xFC38u16, 0x541Cu16, 0xBC51u16, 0x1475u16,
604            0x8459u16, 0x2C7Du16, 0xC430u16, 0x6C14u16, 0x048Bu16, 0xACAFu16, 0x44E2u16, 0xECC6u16,
605            0x95DCu16, 0x3DF8u16, 0xD5B5u16, 0x7D91u16, 0x150Eu16, 0xBD2Au16, 0x5567u16, 0xFD43u16,
606            0xA753u16, 0x0F77u16, 0xE73Au16, 0x4F1Eu16, 0x2781u16, 0x8FA5u16, 0x67E8u16, 0xCFCCu16,
607            0xB6D6u16, 0x1EF2u16, 0xF6BFu16, 0x5E9Bu16, 0x3604u16, 0x9E20u16, 0x766Du16, 0xDE49u16,
608            0xC24Du16, 0x6A69u16, 0x8224u16, 0x2A00u16, 0x429Fu16, 0xEABBu16, 0x02F6u16, 0xAAD2u16,
609            0xD3C8u16, 0x7BECu16, 0x93A1u16, 0x3B85u16, 0x531Au16, 0xFB3Eu16, 0x1373u16, 0xBB57u16,
610            0xE147u16, 0x4963u16, 0xA12Eu16, 0x090Au16, 0x6195u16, 0xC9B1u16, 0x21FCu16, 0x89D8u16,
611            0xF0C2u16, 0x58E6u16, 0xB0ABu16, 0x188Fu16, 0x7010u16, 0xD834u16, 0x3079u16, 0x985Du16
612        ]
613    ];
614
615    let mut s: u16 = ((initial_crc) & CRC16_BITMASK) ^ CRC16_XOR_OUTPUT;
616    for p in data[0..data.len() - data.len() % 16].chunks(16) {
617        s = TABLE[15][(p[ 0] as u16 ^ (s >>  8)) as u8 as usize] ^
618            TABLE[14][(p[ 1] as u16 ^ (s >>  0)) as u8 as usize] ^
619            TABLE[13][p[ 2] as usize                           ] ^
620            TABLE[12][p[ 3] as usize                           ] ^
621            TABLE[11][p[ 4] as usize                           ] ^
622            TABLE[10][p[ 5] as usize                           ] ^
623            TABLE[ 9][p[ 6] as usize                           ] ^
624            TABLE[ 8][p[ 7] as usize                           ] ^
625            TABLE[ 7][p[ 8] as usize                           ] ^
626            TABLE[ 6][p[ 9] as usize                           ] ^
627            TABLE[ 5][p[10] as usize                           ] ^
628            TABLE[ 4][p[11] as usize                           ] ^
629            TABLE[ 3][p[12] as usize                           ] ^
630            TABLE[ 2][p[13] as usize                           ] ^
631            TABLE[ 1][p[14] as usize                           ] ^
632            TABLE[ 0][p[15] as usize                           ];
633    }
634
635    for p in &data[data.len() - data.len() % 16..data.len()] {
636        s = TABLE[0][(*p as u16 ^ (s >>  8)) as usize] ^ (s << 8);
637    }
638
639    return ((s) & CRC16_BITMASK) ^ CRC16_XOR_OUTPUT;
640}
641
642#[cfg(test)]
643mod tests {
644    #[test]
645    fn test_10_byte_q_subcode() {
646        let data = &[0x41, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00];
647        assert_eq!(::crc16(data, 0xFFFF), 0x2832);
648    }
649
650    #[test]
651    fn test_80_byte_data() {
652        let data = vec![0xFF; 80];
653        assert_eq!(::crc16(&data, 0xFFFF), 0x7409);
654    }
655}