1const BRANCH: u16 = 0x8000;
9const TABLE_INDEX_MASK: u16 = 0x7f00;
10const TABLE_WIDTH: usize = 256;
11
12#[rustfmt::skip]
14const ENCODE_TABLE: [(usize, u64); 257] = [
15 (13, 0x1ff8),
16 (23, 0x7fffd8),
17 (28, 0xfffffe2),
18 (28, 0xfffffe3),
19 (28, 0xfffffe4),
20 (28, 0xfffffe5),
21 (28, 0xfffffe6),
22 (28, 0xfffffe7),
23 (28, 0xfffffe8),
24 (24, 0xffffea),
25 (30, 0x3ffffffc),
26 (28, 0xfffffe9),
27 (28, 0xfffffea),
28 (30, 0x3ffffffd),
29 (28, 0xfffffeb),
30 (28, 0xfffffec),
31 (28, 0xfffffed),
32 (28, 0xfffffee),
33 (28, 0xfffffef),
34 (28, 0xffffff0),
35 (28, 0xffffff1),
36 (28, 0xffffff2),
37 (30, 0x3ffffffe),
38 (28, 0xffffff3),
39 (28, 0xffffff4),
40 (28, 0xffffff5),
41 (28, 0xffffff6),
42 (28, 0xffffff7),
43 (28, 0xffffff8),
44 (28, 0xffffff9),
45 (28, 0xffffffa),
46 (28, 0xffffffb),
47 (6, 0x14),
48 (10, 0x3f8),
49 (10, 0x3f9),
50 (12, 0xffa),
51 (13, 0x1ff9),
52 (6, 0x15),
53 (8, 0xf8),
54 (11, 0x7fa),
55 (10, 0x3fa),
56 (10, 0x3fb),
57 (8, 0xf9),
58 (11, 0x7fb),
59 (8, 0xfa),
60 (6, 0x16),
61 (6, 0x17),
62 (6, 0x18),
63 (5, 0x0),
64 (5, 0x1),
65 (5, 0x2),
66 (6, 0x19),
67 (6, 0x1a),
68 (6, 0x1b),
69 (6, 0x1c),
70 (6, 0x1d),
71 (6, 0x1e),
72 (6, 0x1f),
73 (7, 0x5c),
74 (8, 0xfb),
75 (15, 0x7ffc),
76 (6, 0x20),
77 (12, 0xffb),
78 (10, 0x3fc),
79 (13, 0x1ffa),
80 (6, 0x21),
81 (7, 0x5d),
82 (7, 0x5e),
83 (7, 0x5f),
84 (7, 0x60),
85 (7, 0x61),
86 (7, 0x62),
87 (7, 0x63),
88 (7, 0x64),
89 (7, 0x65),
90 (7, 0x66),
91 (7, 0x67),
92 (7, 0x68),
93 (7, 0x69),
94 (7, 0x6a),
95 (7, 0x6b),
96 (7, 0x6c),
97 (7, 0x6d),
98 (7, 0x6e),
99 (7, 0x6f),
100 (7, 0x70),
101 (7, 0x71),
102 (7, 0x72),
103 (8, 0xfc),
104 (7, 0x73),
105 (8, 0xfd),
106 (13, 0x1ffb),
107 (19, 0x7fff0),
108 (13, 0x1ffc),
109 (14, 0x3ffc),
110 (6, 0x22),
111 (15, 0x7ffd),
112 (5, 0x3),
113 (6, 0x23),
114 (5, 0x4),
115 (6, 0x24),
116 (5, 0x5),
117 (6, 0x25),
118 (6, 0x26),
119 (6, 0x27),
120 (5, 0x6),
121 (7, 0x74),
122 (7, 0x75),
123 (6, 0x28),
124 (6, 0x29),
125 (6, 0x2a),
126 (5, 0x7),
127 (6, 0x2b),
128 (7, 0x76),
129 (6, 0x2c),
130 (5, 0x8),
131 (5, 0x9),
132 (6, 0x2d),
133 (7, 0x77),
134 (7, 0x78),
135 (7, 0x79),
136 (7, 0x7a),
137 (7, 0x7b),
138 (15, 0x7ffe),
139 (11, 0x7fc),
140 (14, 0x3ffd),
141 (13, 0x1ffd),
142 (28, 0xffffffc),
143 (20, 0xfffe6),
144 (22, 0x3fffd2),
145 (20, 0xfffe7),
146 (20, 0xfffe8),
147 (22, 0x3fffd3),
148 (22, 0x3fffd4),
149 (22, 0x3fffd5),
150 (23, 0x7fffd9),
151 (22, 0x3fffd6),
152 (23, 0x7fffda),
153 (23, 0x7fffdb),
154 (23, 0x7fffdc),
155 (23, 0x7fffdd),
156 (23, 0x7fffde),
157 (24, 0xffffeb),
158 (23, 0x7fffdf),
159 (24, 0xffffec),
160 (24, 0xffffed),
161 (22, 0x3fffd7),
162 (23, 0x7fffe0),
163 (24, 0xffffee),
164 (23, 0x7fffe1),
165 (23, 0x7fffe2),
166 (23, 0x7fffe3),
167 (23, 0x7fffe4),
168 (21, 0x1fffdc),
169 (22, 0x3fffd8),
170 (23, 0x7fffe5),
171 (22, 0x3fffd9),
172 (23, 0x7fffe6),
173 (23, 0x7fffe7),
174 (24, 0xffffef),
175 (22, 0x3fffda),
176 (21, 0x1fffdd),
177 (20, 0xfffe9),
178 (22, 0x3fffdb),
179 (22, 0x3fffdc),
180 (23, 0x7fffe8),
181 (23, 0x7fffe9),
182 (21, 0x1fffde),
183 (23, 0x7fffea),
184 (22, 0x3fffdd),
185 (22, 0x3fffde),
186 (24, 0xfffff0),
187 (21, 0x1fffdf),
188 (22, 0x3fffdf),
189 (23, 0x7fffeb),
190 (23, 0x7fffec),
191 (21, 0x1fffe0),
192 (21, 0x1fffe1),
193 (22, 0x3fffe0),
194 (21, 0x1fffe2),
195 (23, 0x7fffed),
196 (22, 0x3fffe1),
197 (23, 0x7fffee),
198 (23, 0x7fffef),
199 (20, 0xfffea),
200 (22, 0x3fffe2),
201 (22, 0x3fffe3),
202 (22, 0x3fffe4),
203 (23, 0x7ffff0),
204 (22, 0x3fffe5),
205 (22, 0x3fffe6),
206 (23, 0x7ffff1),
207 (26, 0x3ffffe0),
208 (26, 0x3ffffe1),
209 (20, 0xfffeb),
210 (19, 0x7fff1),
211 (22, 0x3fffe7),
212 (23, 0x7ffff2),
213 (22, 0x3fffe8),
214 (25, 0x1ffffec),
215 (26, 0x3ffffe2),
216 (26, 0x3ffffe3),
217 (26, 0x3ffffe4),
218 (27, 0x7ffffde),
219 (27, 0x7ffffdf),
220 (26, 0x3ffffe5),
221 (24, 0xfffff1),
222 (25, 0x1ffffed),
223 (19, 0x7fff2),
224 (21, 0x1fffe3),
225 (26, 0x3ffffe6),
226 (27, 0x7ffffe0),
227 (27, 0x7ffffe1),
228 (26, 0x3ffffe7),
229 (27, 0x7ffffe2),
230 (24, 0xfffff2),
231 (21, 0x1fffe4),
232 (21, 0x1fffe5),
233 (26, 0x3ffffe8),
234 (26, 0x3ffffe9),
235 (28, 0xffffffd),
236 (27, 0x7ffffe3),
237 (27, 0x7ffffe4),
238 (27, 0x7ffffe5),
239 (20, 0xfffec),
240 (24, 0xfffff3),
241 (20, 0xfffed),
242 (21, 0x1fffe6),
243 (22, 0x3fffe9),
244 (21, 0x1fffe7),
245 (21, 0x1fffe8),
246 (23, 0x7ffff3),
247 (22, 0x3fffea),
248 (22, 0x3fffeb),
249 (25, 0x1ffffee),
250 (25, 0x1ffffef),
251 (24, 0xfffff4),
252 (24, 0xfffff5),
253 (26, 0x3ffffea),
254 (23, 0x7ffff4),
255 (26, 0x3ffffeb),
256 (27, 0x7ffffe6),
257 (26, 0x3ffffec),
258 (26, 0x3ffffed),
259 (27, 0x7ffffe7),
260 (27, 0x7ffffe8),
261 (27, 0x7ffffe9),
262 (27, 0x7ffffea),
263 (27, 0x7ffffeb),
264 (28, 0xffffffe),
265 (27, 0x7ffffec),
266 (27, 0x7ffffed),
267 (27, 0x7ffffee),
268 (27, 0x7ffffef),
269 (27, 0x7fffff0),
270 (26, 0x3ffffee),
271 (30, 0x3fffffff),
272];
273
274#[rustfmt::skip]
276const DECODE_TABLE: [u16; 15 * 256] = [
277 0x0530, 0x0530, 0x0530, 0x0530, 0x0530, 0x0530, 0x0530, 0x0530, 0x0531, 0x0531, 0x0531, 0x0531,
278 0x0531, 0x0531, 0x0531, 0x0531, 0x0532, 0x0532, 0x0532, 0x0532, 0x0532, 0x0532, 0x0532, 0x0532,
279 0x0561, 0x0561, 0x0561, 0x0561, 0x0561, 0x0561, 0x0561, 0x0561, 0x0563, 0x0563, 0x0563, 0x0563,
280 0x0563, 0x0563, 0x0563, 0x0563, 0x0565, 0x0565, 0x0565, 0x0565, 0x0565, 0x0565, 0x0565, 0x0565,
281 0x0569, 0x0569, 0x0569, 0x0569, 0x0569, 0x0569, 0x0569, 0x0569, 0x056f, 0x056f, 0x056f, 0x056f,
282 0x056f, 0x056f, 0x056f, 0x056f, 0x0573, 0x0573, 0x0573, 0x0573, 0x0573, 0x0573, 0x0573, 0x0573,
283 0x0574, 0x0574, 0x0574, 0x0574, 0x0574, 0x0574, 0x0574, 0x0574, 0x0620, 0x0620, 0x0620, 0x0620,
284 0x0625, 0x0625, 0x0625, 0x0625, 0x062d, 0x062d, 0x062d, 0x062d, 0x062e, 0x062e, 0x062e, 0x062e,
285 0x062f, 0x062f, 0x062f, 0x062f, 0x0633, 0x0633, 0x0633, 0x0633, 0x0634, 0x0634, 0x0634, 0x0634,
286 0x0635, 0x0635, 0x0635, 0x0635, 0x0636, 0x0636, 0x0636, 0x0636, 0x0637, 0x0637, 0x0637, 0x0637,
287 0x0638, 0x0638, 0x0638, 0x0638, 0x0639, 0x0639, 0x0639, 0x0639, 0x063d, 0x063d, 0x063d, 0x063d,
288 0x0641, 0x0641, 0x0641, 0x0641, 0x065f, 0x065f, 0x065f, 0x065f, 0x0662, 0x0662, 0x0662, 0x0662,
289 0x0664, 0x0664, 0x0664, 0x0664, 0x0666, 0x0666, 0x0666, 0x0666, 0x0667, 0x0667, 0x0667, 0x0667,
290 0x0668, 0x0668, 0x0668, 0x0668, 0x066c, 0x066c, 0x066c, 0x066c, 0x066d, 0x066d, 0x066d, 0x066d,
291 0x066e, 0x066e, 0x066e, 0x066e, 0x0670, 0x0670, 0x0670, 0x0670, 0x0672, 0x0672, 0x0672, 0x0672,
292 0x0675, 0x0675, 0x0675, 0x0675, 0x073a, 0x073a, 0x0742, 0x0742, 0x0743, 0x0743, 0x0744, 0x0744,
293 0x0745, 0x0745, 0x0746, 0x0746, 0x0747, 0x0747, 0x0748, 0x0748, 0x0749, 0x0749, 0x074a, 0x074a,
294 0x074b, 0x074b, 0x074c, 0x074c, 0x074d, 0x074d, 0x074e, 0x074e, 0x074f, 0x074f, 0x0750, 0x0750,
295 0x0751, 0x0751, 0x0752, 0x0752, 0x0753, 0x0753, 0x0754, 0x0754, 0x0755, 0x0755, 0x0756, 0x0756,
296 0x0757, 0x0757, 0x0759, 0x0759, 0x076a, 0x076a, 0x076b, 0x076b, 0x0771, 0x0771, 0x0776, 0x0776,
297 0x0777, 0x0777, 0x0778, 0x0778, 0x0779, 0x0779, 0x077a, 0x077a, 0x0826, 0x082a, 0x082c, 0x083b,
298 0x0858, 0x085a, 0x8500, 0x8100, 0x023f, 0x023f, 0x023f, 0x023f, 0x023f, 0x023f, 0x023f, 0x023f,
299 0x023f, 0x023f, 0x023f, 0x023f, 0x023f, 0x023f, 0x023f, 0x023f, 0x023f, 0x023f, 0x023f, 0x023f,
300 0x023f, 0x023f, 0x023f, 0x023f, 0x023f, 0x023f, 0x023f, 0x023f, 0x023f, 0x023f, 0x023f, 0x023f,
301 0x023f, 0x023f, 0x023f, 0x023f, 0x023f, 0x023f, 0x023f, 0x023f, 0x023f, 0x023f, 0x023f, 0x023f,
302 0x023f, 0x023f, 0x023f, 0x023f, 0x023f, 0x023f, 0x023f, 0x023f, 0x023f, 0x023f, 0x023f, 0x023f,
303 0x023f, 0x023f, 0x023f, 0x023f, 0x023f, 0x023f, 0x023f, 0x023f, 0x0327, 0x0327, 0x0327, 0x0327,
304 0x0327, 0x0327, 0x0327, 0x0327, 0x0327, 0x0327, 0x0327, 0x0327, 0x0327, 0x0327, 0x0327, 0x0327,
305 0x0327, 0x0327, 0x0327, 0x0327, 0x0327, 0x0327, 0x0327, 0x0327, 0x0327, 0x0327, 0x0327, 0x0327,
306 0x0327, 0x0327, 0x0327, 0x0327, 0x032b, 0x032b, 0x032b, 0x032b, 0x032b, 0x032b, 0x032b, 0x032b,
307 0x032b, 0x032b, 0x032b, 0x032b, 0x032b, 0x032b, 0x032b, 0x032b, 0x032b, 0x032b, 0x032b, 0x032b,
308 0x032b, 0x032b, 0x032b, 0x032b, 0x032b, 0x032b, 0x032b, 0x032b, 0x032b, 0x032b, 0x032b, 0x032b,
309 0x037c, 0x037c, 0x037c, 0x037c, 0x037c, 0x037c, 0x037c, 0x037c, 0x037c, 0x037c, 0x037c, 0x037c,
310 0x037c, 0x037c, 0x037c, 0x037c, 0x037c, 0x037c, 0x037c, 0x037c, 0x037c, 0x037c, 0x037c, 0x037c,
311 0x037c, 0x037c, 0x037c, 0x037c, 0x037c, 0x037c, 0x037c, 0x037c, 0x0423, 0x0423, 0x0423, 0x0423,
312 0x0423, 0x0423, 0x0423, 0x0423, 0x0423, 0x0423, 0x0423, 0x0423, 0x0423, 0x0423, 0x0423, 0x0423,
313 0x043e, 0x043e, 0x043e, 0x043e, 0x043e, 0x043e, 0x043e, 0x043e, 0x043e, 0x043e, 0x043e, 0x043e,
314 0x043e, 0x043e, 0x043e, 0x043e, 0x0500, 0x0500, 0x0500, 0x0500, 0x0500, 0x0500, 0x0500, 0x0500,
315 0x0524, 0x0524, 0x0524, 0x0524, 0x0524, 0x0524, 0x0524, 0x0524, 0x0540, 0x0540, 0x0540, 0x0540,
316 0x0540, 0x0540, 0x0540, 0x0540, 0x055b, 0x055b, 0x055b, 0x055b, 0x055b, 0x055b, 0x055b, 0x055b,
317 0x055d, 0x055d, 0x055d, 0x055d, 0x055d, 0x055d, 0x055d, 0x055d, 0x057e, 0x057e, 0x057e, 0x057e,
318 0x057e, 0x057e, 0x057e, 0x057e, 0x065e, 0x065e, 0x065e, 0x065e, 0x067d, 0x067d, 0x067d, 0x067d,
319 0x073c, 0x073c, 0x0760, 0x0760, 0x077b, 0x077b, 0x8600, 0x8200, 0x05b0, 0x05b0, 0x05b0, 0x05b0,
320 0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x05b1, 0x05b1, 0x05b1, 0x05b1, 0x05b1, 0x05b1, 0x05b1, 0x05b1,
321 0x05b3, 0x05b3, 0x05b3, 0x05b3, 0x05b3, 0x05b3, 0x05b3, 0x05b3, 0x05d1, 0x05d1, 0x05d1, 0x05d1,
322 0x05d1, 0x05d1, 0x05d1, 0x05d1, 0x05d8, 0x05d8, 0x05d8, 0x05d8, 0x05d8, 0x05d8, 0x05d8, 0x05d8,
323 0x05d9, 0x05d9, 0x05d9, 0x05d9, 0x05d9, 0x05d9, 0x05d9, 0x05d9, 0x05e3, 0x05e3, 0x05e3, 0x05e3,
324 0x05e3, 0x05e3, 0x05e3, 0x05e3, 0x05e5, 0x05e5, 0x05e5, 0x05e5, 0x05e5, 0x05e5, 0x05e5, 0x05e5,
325 0x05e6, 0x05e6, 0x05e6, 0x05e6, 0x05e6, 0x05e6, 0x05e6, 0x05e6, 0x0681, 0x0681, 0x0681, 0x0681,
326 0x0684, 0x0684, 0x0684, 0x0684, 0x0685, 0x0685, 0x0685, 0x0685, 0x0686, 0x0686, 0x0686, 0x0686,
327 0x0688, 0x0688, 0x0688, 0x0688, 0x0692, 0x0692, 0x0692, 0x0692, 0x069a, 0x069a, 0x069a, 0x069a,
328 0x069c, 0x069c, 0x069c, 0x069c, 0x06a0, 0x06a0, 0x06a0, 0x06a0, 0x06a3, 0x06a3, 0x06a3, 0x06a3,
329 0x06a4, 0x06a4, 0x06a4, 0x06a4, 0x06a9, 0x06a9, 0x06a9, 0x06a9, 0x06aa, 0x06aa, 0x06aa, 0x06aa,
330 0x06ad, 0x06ad, 0x06ad, 0x06ad, 0x06b2, 0x06b2, 0x06b2, 0x06b2, 0x06b5, 0x06b5, 0x06b5, 0x06b5,
331 0x06b9, 0x06b9, 0x06b9, 0x06b9, 0x06ba, 0x06ba, 0x06ba, 0x06ba, 0x06bb, 0x06bb, 0x06bb, 0x06bb,
332 0x06bd, 0x06bd, 0x06bd, 0x06bd, 0x06be, 0x06be, 0x06be, 0x06be, 0x06c4, 0x06c4, 0x06c4, 0x06c4,
333 0x06c6, 0x06c6, 0x06c6, 0x06c6, 0x06e4, 0x06e4, 0x06e4, 0x06e4, 0x06e8, 0x06e8, 0x06e8, 0x06e8,
334 0x06e9, 0x06e9, 0x06e9, 0x06e9, 0x0701, 0x0701, 0x0787, 0x0787, 0x0789, 0x0789, 0x078a, 0x078a,
335 0x078b, 0x078b, 0x078c, 0x078c, 0x078d, 0x078d, 0x078f, 0x078f, 0x0793, 0x0793, 0x0795, 0x0795,
336 0x0796, 0x0796, 0x0797, 0x0797, 0x0798, 0x0798, 0x079b, 0x079b, 0x079d, 0x079d, 0x079e, 0x079e,
337 0x07a5, 0x07a5, 0x07a6, 0x07a6, 0x07a8, 0x07a8, 0x07ae, 0x07ae, 0x07af, 0x07af, 0x07b4, 0x07b4,
338 0x07b6, 0x07b6, 0x07b7, 0x07b7, 0x07bc, 0x07bc, 0x07bf, 0x07bf, 0x07c5, 0x07c5, 0x07e7, 0x07e7,
339 0x07ef, 0x07ef, 0x0809, 0x088e, 0x0890, 0x0891, 0x0894, 0x089f, 0x08ab, 0x08ce, 0x08d7, 0x08e1,
340 0x08ec, 0x08ed, 0x8800, 0x8d00, 0x8700, 0x8900, 0x8c00, 0x8a00, 0x8b00, 0x8e00, 0x8300, 0x8400,
341 0x03fe, 0x03fe, 0x03fe, 0x03fe, 0x03fe, 0x03fe, 0x03fe, 0x03fe, 0x03fe, 0x03fe, 0x03fe, 0x03fe,
342 0x03fe, 0x03fe, 0x03fe, 0x03fe, 0x03fe, 0x03fe, 0x03fe, 0x03fe, 0x03fe, 0x03fe, 0x03fe, 0x03fe,
343 0x03fe, 0x03fe, 0x03fe, 0x03fe, 0x03fe, 0x03fe, 0x03fe, 0x03fe, 0x0402, 0x0402, 0x0402, 0x0402,
344 0x0402, 0x0402, 0x0402, 0x0402, 0x0402, 0x0402, 0x0402, 0x0402, 0x0402, 0x0402, 0x0402, 0x0402,
345 0x0403, 0x0403, 0x0403, 0x0403, 0x0403, 0x0403, 0x0403, 0x0403, 0x0403, 0x0403, 0x0403, 0x0403,
346 0x0403, 0x0403, 0x0403, 0x0403, 0x0404, 0x0404, 0x0404, 0x0404, 0x0404, 0x0404, 0x0404, 0x0404,
347 0x0404, 0x0404, 0x0404, 0x0404, 0x0404, 0x0404, 0x0404, 0x0404, 0x0405, 0x0405, 0x0405, 0x0405,
348 0x0405, 0x0405, 0x0405, 0x0405, 0x0405, 0x0405, 0x0405, 0x0405, 0x0405, 0x0405, 0x0405, 0x0405,
349 0x0406, 0x0406, 0x0406, 0x0406, 0x0406, 0x0406, 0x0406, 0x0406, 0x0406, 0x0406, 0x0406, 0x0406,
350 0x0406, 0x0406, 0x0406, 0x0406, 0x0407, 0x0407, 0x0407, 0x0407, 0x0407, 0x0407, 0x0407, 0x0407,
351 0x0407, 0x0407, 0x0407, 0x0407, 0x0407, 0x0407, 0x0407, 0x0407, 0x0408, 0x0408, 0x0408, 0x0408,
352 0x0408, 0x0408, 0x0408, 0x0408, 0x0408, 0x0408, 0x0408, 0x0408, 0x0408, 0x0408, 0x0408, 0x0408,
353 0x040b, 0x040b, 0x040b, 0x040b, 0x040b, 0x040b, 0x040b, 0x040b, 0x040b, 0x040b, 0x040b, 0x040b,
354 0x040b, 0x040b, 0x040b, 0x040b, 0x040c, 0x040c, 0x040c, 0x040c, 0x040c, 0x040c, 0x040c, 0x040c,
355 0x040c, 0x040c, 0x040c, 0x040c, 0x040c, 0x040c, 0x040c, 0x040c, 0x040e, 0x040e, 0x040e, 0x040e,
356 0x040e, 0x040e, 0x040e, 0x040e, 0x040e, 0x040e, 0x040e, 0x040e, 0x040e, 0x040e, 0x040e, 0x040e,
357 0x040f, 0x040f, 0x040f, 0x040f, 0x040f, 0x040f, 0x040f, 0x040f, 0x040f, 0x040f, 0x040f, 0x040f,
358 0x040f, 0x040f, 0x040f, 0x040f, 0x0410, 0x0410, 0x0410, 0x0410, 0x0410, 0x0410, 0x0410, 0x0410,
359 0x0410, 0x0410, 0x0410, 0x0410, 0x0410, 0x0410, 0x0410, 0x0410, 0x0411, 0x0411, 0x0411, 0x0411,
360 0x0411, 0x0411, 0x0411, 0x0411, 0x0411, 0x0411, 0x0411, 0x0411, 0x0411, 0x0411, 0x0411, 0x0411,
361 0x0412, 0x0412, 0x0412, 0x0412, 0x0412, 0x0412, 0x0412, 0x0412, 0x0412, 0x0412, 0x0412, 0x0412,
362 0x0412, 0x0412, 0x0412, 0x0412, 0x0413, 0x0413, 0x0413, 0x0413, 0x0413, 0x0413, 0x0413, 0x0413,
363 0x0413, 0x0413, 0x0413, 0x0413, 0x0413, 0x0413, 0x0413, 0x0413, 0x0414, 0x0414, 0x0414, 0x0414,
364 0x0414, 0x0414, 0x0414, 0x0414, 0x0414, 0x0414, 0x0414, 0x0414, 0x0414, 0x0414, 0x0414, 0x0414,
365 0x0415, 0x0415, 0x0415, 0x0415, 0x0415, 0x0415, 0x0415, 0x0415, 0x0415, 0x0415, 0x0415, 0x0415,
366 0x0415, 0x0415, 0x0415, 0x0415, 0x0417, 0x0417, 0x0417, 0x0417, 0x0417, 0x0417, 0x0417, 0x0417,
367 0x0417, 0x0417, 0x0417, 0x0417, 0x0417, 0x0417, 0x0417, 0x0417, 0x0418, 0x0418, 0x0418, 0x0418,
368 0x0418, 0x0418, 0x0418, 0x0418, 0x0418, 0x0418, 0x0418, 0x0418, 0x0418, 0x0418, 0x0418, 0x0418,
369 0x0419, 0x0419, 0x0419, 0x0419, 0x0419, 0x0419, 0x0419, 0x0419, 0x0419, 0x0419, 0x0419, 0x0419,
370 0x0419, 0x0419, 0x0419, 0x0419, 0x041a, 0x041a, 0x041a, 0x041a, 0x041a, 0x041a, 0x041a, 0x041a,
371 0x041a, 0x041a, 0x041a, 0x041a, 0x041a, 0x041a, 0x041a, 0x041a, 0x041b, 0x041b, 0x041b, 0x041b,
372 0x041b, 0x041b, 0x041b, 0x041b, 0x041b, 0x041b, 0x041b, 0x041b, 0x041b, 0x041b, 0x041b, 0x041b,
373 0x041c, 0x041c, 0x041c, 0x041c, 0x041c, 0x041c, 0x041c, 0x041c, 0x041c, 0x041c, 0x041c, 0x041c,
374 0x041c, 0x041c, 0x041c, 0x041c, 0x041d, 0x041d, 0x041d, 0x041d, 0x041d, 0x041d, 0x041d, 0x041d,
375 0x041d, 0x041d, 0x041d, 0x041d, 0x041d, 0x041d, 0x041d, 0x041d, 0x041e, 0x041e, 0x041e, 0x041e,
376 0x041e, 0x041e, 0x041e, 0x041e, 0x041e, 0x041e, 0x041e, 0x041e, 0x041e, 0x041e, 0x041e, 0x041e,
377 0x041f, 0x041f, 0x041f, 0x041f, 0x041f, 0x041f, 0x041f, 0x041f, 0x041f, 0x041f, 0x041f, 0x041f,
378 0x041f, 0x041f, 0x041f, 0x041f, 0x047f, 0x047f, 0x047f, 0x047f, 0x047f, 0x047f, 0x047f, 0x047f,
379 0x047f, 0x047f, 0x047f, 0x047f, 0x047f, 0x047f, 0x047f, 0x047f, 0x04dc, 0x04dc, 0x04dc, 0x04dc,
380 0x04dc, 0x04dc, 0x04dc, 0x04dc, 0x04dc, 0x04dc, 0x04dc, 0x04dc, 0x04dc, 0x04dc, 0x04dc, 0x04dc,
381 0x04f9, 0x04f9, 0x04f9, 0x04f9, 0x04f9, 0x04f9, 0x04f9, 0x04f9, 0x04f9, 0x04f9, 0x04f9, 0x04f9,
382 0x04f9, 0x04f9, 0x04f9, 0x04f9, 0x060a, 0x060a, 0x060a, 0x060a, 0x060d, 0x060d, 0x060d, 0x060d,
383 0x0616, 0x0616, 0x0616, 0x0616, 0x80ff, 0x80ff, 0x80ff, 0x80ff, 0x0221, 0x0221, 0x0221, 0x0221,
384 0x0221, 0x0221, 0x0221, 0x0221, 0x0221, 0x0221, 0x0221, 0x0221, 0x0221, 0x0221, 0x0221, 0x0221,
385 0x0221, 0x0221, 0x0221, 0x0221, 0x0221, 0x0221, 0x0221, 0x0221, 0x0221, 0x0221, 0x0221, 0x0221,
386 0x0221, 0x0221, 0x0221, 0x0221, 0x0221, 0x0221, 0x0221, 0x0221, 0x0221, 0x0221, 0x0221, 0x0221,
387 0x0221, 0x0221, 0x0221, 0x0221, 0x0221, 0x0221, 0x0221, 0x0221, 0x0221, 0x0221, 0x0221, 0x0221,
388 0x0221, 0x0221, 0x0221, 0x0221, 0x0221, 0x0221, 0x0221, 0x0221, 0x0221, 0x0221, 0x0221, 0x0221,
389 0x0222, 0x0222, 0x0222, 0x0222, 0x0222, 0x0222, 0x0222, 0x0222, 0x0222, 0x0222, 0x0222, 0x0222,
390 0x0222, 0x0222, 0x0222, 0x0222, 0x0222, 0x0222, 0x0222, 0x0222, 0x0222, 0x0222, 0x0222, 0x0222,
391 0x0222, 0x0222, 0x0222, 0x0222, 0x0222, 0x0222, 0x0222, 0x0222, 0x0222, 0x0222, 0x0222, 0x0222,
392 0x0222, 0x0222, 0x0222, 0x0222, 0x0222, 0x0222, 0x0222, 0x0222, 0x0222, 0x0222, 0x0222, 0x0222,
393 0x0222, 0x0222, 0x0222, 0x0222, 0x0222, 0x0222, 0x0222, 0x0222, 0x0222, 0x0222, 0x0222, 0x0222,
394 0x0222, 0x0222, 0x0222, 0x0222, 0x0228, 0x0228, 0x0228, 0x0228, 0x0228, 0x0228, 0x0228, 0x0228,
395 0x0228, 0x0228, 0x0228, 0x0228, 0x0228, 0x0228, 0x0228, 0x0228, 0x0228, 0x0228, 0x0228, 0x0228,
396 0x0228, 0x0228, 0x0228, 0x0228, 0x0228, 0x0228, 0x0228, 0x0228, 0x0228, 0x0228, 0x0228, 0x0228,
397 0x0228, 0x0228, 0x0228, 0x0228, 0x0228, 0x0228, 0x0228, 0x0228, 0x0228, 0x0228, 0x0228, 0x0228,
398 0x0228, 0x0228, 0x0228, 0x0228, 0x0228, 0x0228, 0x0228, 0x0228, 0x0228, 0x0228, 0x0228, 0x0228,
399 0x0228, 0x0228, 0x0228, 0x0228, 0x0228, 0x0228, 0x0228, 0x0228, 0x0229, 0x0229, 0x0229, 0x0229,
400 0x0229, 0x0229, 0x0229, 0x0229, 0x0229, 0x0229, 0x0229, 0x0229, 0x0229, 0x0229, 0x0229, 0x0229,
401 0x0229, 0x0229, 0x0229, 0x0229, 0x0229, 0x0229, 0x0229, 0x0229, 0x0229, 0x0229, 0x0229, 0x0229,
402 0x0229, 0x0229, 0x0229, 0x0229, 0x0229, 0x0229, 0x0229, 0x0229, 0x0229, 0x0229, 0x0229, 0x0229,
403 0x0229, 0x0229, 0x0229, 0x0229, 0x0229, 0x0229, 0x0229, 0x0229, 0x0229, 0x0229, 0x0229, 0x0229,
404 0x0229, 0x0229, 0x0229, 0x0229, 0x0229, 0x0229, 0x0229, 0x0229, 0x0229, 0x0229, 0x0229, 0x0229,
405 0x035c, 0x035c, 0x035c, 0x035c, 0x035c, 0x035c, 0x035c, 0x035c, 0x035c, 0x035c, 0x035c, 0x035c,
406 0x035c, 0x035c, 0x035c, 0x035c, 0x035c, 0x035c, 0x035c, 0x035c, 0x035c, 0x035c, 0x035c, 0x035c,
407 0x035c, 0x035c, 0x035c, 0x035c, 0x035c, 0x035c, 0x035c, 0x035c, 0x03c3, 0x03c3, 0x03c3, 0x03c3,
408 0x03c3, 0x03c3, 0x03c3, 0x03c3, 0x03c3, 0x03c3, 0x03c3, 0x03c3, 0x03c3, 0x03c3, 0x03c3, 0x03c3,
409 0x03c3, 0x03c3, 0x03c3, 0x03c3, 0x03c3, 0x03c3, 0x03c3, 0x03c3, 0x03c3, 0x03c3, 0x03c3, 0x03c3,
410 0x03c3, 0x03c3, 0x03c3, 0x03c3, 0x03d0, 0x03d0, 0x03d0, 0x03d0, 0x03d0, 0x03d0, 0x03d0, 0x03d0,
411 0x03d0, 0x03d0, 0x03d0, 0x03d0, 0x03d0, 0x03d0, 0x03d0, 0x03d0, 0x03d0, 0x03d0, 0x03d0, 0x03d0,
412 0x03d0, 0x03d0, 0x03d0, 0x03d0, 0x03d0, 0x03d0, 0x03d0, 0x03d0, 0x03d0, 0x03d0, 0x03d0, 0x03d0,
413 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480,
414 0x0480, 0x0480, 0x0480, 0x0480, 0x0482, 0x0482, 0x0482, 0x0482, 0x0482, 0x0482, 0x0482, 0x0482,
415 0x0482, 0x0482, 0x0482, 0x0482, 0x0482, 0x0482, 0x0482, 0x0482, 0x0483, 0x0483, 0x0483, 0x0483,
416 0x0483, 0x0483, 0x0483, 0x0483, 0x0483, 0x0483, 0x0483, 0x0483, 0x0483, 0x0483, 0x0483, 0x0483,
417 0x04a2, 0x04a2, 0x04a2, 0x04a2, 0x04a2, 0x04a2, 0x04a2, 0x04a2, 0x04a2, 0x04a2, 0x04a2, 0x04a2,
418 0x04a2, 0x04a2, 0x04a2, 0x04a2, 0x04b8, 0x04b8, 0x04b8, 0x04b8, 0x04b8, 0x04b8, 0x04b8, 0x04b8,
419 0x04b8, 0x04b8, 0x04b8, 0x04b8, 0x04b8, 0x04b8, 0x04b8, 0x04b8, 0x04c2, 0x04c2, 0x04c2, 0x04c2,
420 0x04c2, 0x04c2, 0x04c2, 0x04c2, 0x04c2, 0x04c2, 0x04c2, 0x04c2, 0x04c2, 0x04c2, 0x04c2, 0x04c2,
421 0x04e0, 0x04e0, 0x04e0, 0x04e0, 0x04e0, 0x04e0, 0x04e0, 0x04e0, 0x04e0, 0x04e0, 0x04e0, 0x04e0,
422 0x04e0, 0x04e0, 0x04e0, 0x04e0, 0x04e2, 0x04e2, 0x04e2, 0x04e2, 0x04e2, 0x04e2, 0x04e2, 0x04e2,
423 0x04e2, 0x04e2, 0x04e2, 0x04e2, 0x04e2, 0x04e2, 0x04e2, 0x04e2, 0x0599, 0x0599, 0x0599, 0x0599,
424 0x0599, 0x0599, 0x0599, 0x0599, 0x05a1, 0x05a1, 0x05a1, 0x05a1, 0x05a1, 0x05a1, 0x05a1, 0x05a1,
425 0x05a7, 0x05a7, 0x05a7, 0x05a7, 0x05a7, 0x05a7, 0x05a7, 0x05a7, 0x05ac, 0x05ac, 0x05ac, 0x05ac,
426 0x05ac, 0x05ac, 0x05ac, 0x05ac, 0x02c0, 0x02c0, 0x02c0, 0x02c0, 0x02c0, 0x02c0, 0x02c0, 0x02c0,
427 0x02c0, 0x02c0, 0x02c0, 0x02c0, 0x02c0, 0x02c0, 0x02c0, 0x02c0, 0x02c0, 0x02c0, 0x02c0, 0x02c0,
428 0x02c0, 0x02c0, 0x02c0, 0x02c0, 0x02c0, 0x02c0, 0x02c0, 0x02c0, 0x02c0, 0x02c0, 0x02c0, 0x02c0,
429 0x02c0, 0x02c0, 0x02c0, 0x02c0, 0x02c0, 0x02c0, 0x02c0, 0x02c0, 0x02c0, 0x02c0, 0x02c0, 0x02c0,
430 0x02c0, 0x02c0, 0x02c0, 0x02c0, 0x02c0, 0x02c0, 0x02c0, 0x02c0, 0x02c0, 0x02c0, 0x02c0, 0x02c0,
431 0x02c0, 0x02c0, 0x02c0, 0x02c0, 0x02c0, 0x02c0, 0x02c0, 0x02c0, 0x02c1, 0x02c1, 0x02c1, 0x02c1,
432 0x02c1, 0x02c1, 0x02c1, 0x02c1, 0x02c1, 0x02c1, 0x02c1, 0x02c1, 0x02c1, 0x02c1, 0x02c1, 0x02c1,
433 0x02c1, 0x02c1, 0x02c1, 0x02c1, 0x02c1, 0x02c1, 0x02c1, 0x02c1, 0x02c1, 0x02c1, 0x02c1, 0x02c1,
434 0x02c1, 0x02c1, 0x02c1, 0x02c1, 0x02c1, 0x02c1, 0x02c1, 0x02c1, 0x02c1, 0x02c1, 0x02c1, 0x02c1,
435 0x02c1, 0x02c1, 0x02c1, 0x02c1, 0x02c1, 0x02c1, 0x02c1, 0x02c1, 0x02c1, 0x02c1, 0x02c1, 0x02c1,
436 0x02c1, 0x02c1, 0x02c1, 0x02c1, 0x02c1, 0x02c1, 0x02c1, 0x02c1, 0x02c1, 0x02c1, 0x02c1, 0x02c1,
437 0x02c8, 0x02c8, 0x02c8, 0x02c8, 0x02c8, 0x02c8, 0x02c8, 0x02c8, 0x02c8, 0x02c8, 0x02c8, 0x02c8,
438 0x02c8, 0x02c8, 0x02c8, 0x02c8, 0x02c8, 0x02c8, 0x02c8, 0x02c8, 0x02c8, 0x02c8, 0x02c8, 0x02c8,
439 0x02c8, 0x02c8, 0x02c8, 0x02c8, 0x02c8, 0x02c8, 0x02c8, 0x02c8, 0x02c8, 0x02c8, 0x02c8, 0x02c8,
440 0x02c8, 0x02c8, 0x02c8, 0x02c8, 0x02c8, 0x02c8, 0x02c8, 0x02c8, 0x02c8, 0x02c8, 0x02c8, 0x02c8,
441 0x02c8, 0x02c8, 0x02c8, 0x02c8, 0x02c8, 0x02c8, 0x02c8, 0x02c8, 0x02c8, 0x02c8, 0x02c8, 0x02c8,
442 0x02c8, 0x02c8, 0x02c8, 0x02c8, 0x02c9, 0x02c9, 0x02c9, 0x02c9, 0x02c9, 0x02c9, 0x02c9, 0x02c9,
443 0x02c9, 0x02c9, 0x02c9, 0x02c9, 0x02c9, 0x02c9, 0x02c9, 0x02c9, 0x02c9, 0x02c9, 0x02c9, 0x02c9,
444 0x02c9, 0x02c9, 0x02c9, 0x02c9, 0x02c9, 0x02c9, 0x02c9, 0x02c9, 0x02c9, 0x02c9, 0x02c9, 0x02c9,
445 0x02c9, 0x02c9, 0x02c9, 0x02c9, 0x02c9, 0x02c9, 0x02c9, 0x02c9, 0x02c9, 0x02c9, 0x02c9, 0x02c9,
446 0x02c9, 0x02c9, 0x02c9, 0x02c9, 0x02c9, 0x02c9, 0x02c9, 0x02c9, 0x02c9, 0x02c9, 0x02c9, 0x02c9,
447 0x02c9, 0x02c9, 0x02c9, 0x02c9, 0x02c9, 0x02c9, 0x02c9, 0x02c9, 0x01c7, 0x01c7, 0x01c7, 0x01c7,
448 0x01c7, 0x01c7, 0x01c7, 0x01c7, 0x01c7, 0x01c7, 0x01c7, 0x01c7, 0x01c7, 0x01c7, 0x01c7, 0x01c7,
449 0x01c7, 0x01c7, 0x01c7, 0x01c7, 0x01c7, 0x01c7, 0x01c7, 0x01c7, 0x01c7, 0x01c7, 0x01c7, 0x01c7,
450 0x01c7, 0x01c7, 0x01c7, 0x01c7, 0x01c7, 0x01c7, 0x01c7, 0x01c7, 0x01c7, 0x01c7, 0x01c7, 0x01c7,
451 0x01c7, 0x01c7, 0x01c7, 0x01c7, 0x01c7, 0x01c7, 0x01c7, 0x01c7, 0x01c7, 0x01c7, 0x01c7, 0x01c7,
452 0x01c7, 0x01c7, 0x01c7, 0x01c7, 0x01c7, 0x01c7, 0x01c7, 0x01c7, 0x01c7, 0x01c7, 0x01c7, 0x01c7,
453 0x01c7, 0x01c7, 0x01c7, 0x01c7, 0x01c7, 0x01c7, 0x01c7, 0x01c7, 0x01c7, 0x01c7, 0x01c7, 0x01c7,
454 0x01c7, 0x01c7, 0x01c7, 0x01c7, 0x01c7, 0x01c7, 0x01c7, 0x01c7, 0x01c7, 0x01c7, 0x01c7, 0x01c7,
455 0x01c7, 0x01c7, 0x01c7, 0x01c7, 0x01c7, 0x01c7, 0x01c7, 0x01c7, 0x01c7, 0x01c7, 0x01c7, 0x01c7,
456 0x01c7, 0x01c7, 0x01c7, 0x01c7, 0x01c7, 0x01c7, 0x01c7, 0x01c7, 0x01c7, 0x01c7, 0x01c7, 0x01c7,
457 0x01c7, 0x01c7, 0x01c7, 0x01c7, 0x01c7, 0x01c7, 0x01c7, 0x01c7, 0x01c7, 0x01c7, 0x01c7, 0x01c7,
458 0x01c7, 0x01c7, 0x01c7, 0x01c7, 0x01cf, 0x01cf, 0x01cf, 0x01cf, 0x01cf, 0x01cf, 0x01cf, 0x01cf,
459 0x01cf, 0x01cf, 0x01cf, 0x01cf, 0x01cf, 0x01cf, 0x01cf, 0x01cf, 0x01cf, 0x01cf, 0x01cf, 0x01cf,
460 0x01cf, 0x01cf, 0x01cf, 0x01cf, 0x01cf, 0x01cf, 0x01cf, 0x01cf, 0x01cf, 0x01cf, 0x01cf, 0x01cf,
461 0x01cf, 0x01cf, 0x01cf, 0x01cf, 0x01cf, 0x01cf, 0x01cf, 0x01cf, 0x01cf, 0x01cf, 0x01cf, 0x01cf,
462 0x01cf, 0x01cf, 0x01cf, 0x01cf, 0x01cf, 0x01cf, 0x01cf, 0x01cf, 0x01cf, 0x01cf, 0x01cf, 0x01cf,
463 0x01cf, 0x01cf, 0x01cf, 0x01cf, 0x01cf, 0x01cf, 0x01cf, 0x01cf, 0x01cf, 0x01cf, 0x01cf, 0x01cf,
464 0x01cf, 0x01cf, 0x01cf, 0x01cf, 0x01cf, 0x01cf, 0x01cf, 0x01cf, 0x01cf, 0x01cf, 0x01cf, 0x01cf,
465 0x01cf, 0x01cf, 0x01cf, 0x01cf, 0x01cf, 0x01cf, 0x01cf, 0x01cf, 0x01cf, 0x01cf, 0x01cf, 0x01cf,
466 0x01cf, 0x01cf, 0x01cf, 0x01cf, 0x01cf, 0x01cf, 0x01cf, 0x01cf, 0x01cf, 0x01cf, 0x01cf, 0x01cf,
467 0x01cf, 0x01cf, 0x01cf, 0x01cf, 0x01cf, 0x01cf, 0x01cf, 0x01cf, 0x01cf, 0x01cf, 0x01cf, 0x01cf,
468 0x01cf, 0x01cf, 0x01cf, 0x01cf, 0x01cf, 0x01cf, 0x01cf, 0x01cf, 0x01cf, 0x01cf, 0x01cf, 0x01cf,
469 0x02ca, 0x02ca, 0x02ca, 0x02ca, 0x02ca, 0x02ca, 0x02ca, 0x02ca, 0x02ca, 0x02ca, 0x02ca, 0x02ca,
470 0x02ca, 0x02ca, 0x02ca, 0x02ca, 0x02ca, 0x02ca, 0x02ca, 0x02ca, 0x02ca, 0x02ca, 0x02ca, 0x02ca,
471 0x02ca, 0x02ca, 0x02ca, 0x02ca, 0x02ca, 0x02ca, 0x02ca, 0x02ca, 0x02ca, 0x02ca, 0x02ca, 0x02ca,
472 0x02ca, 0x02ca, 0x02ca, 0x02ca, 0x02ca, 0x02ca, 0x02ca, 0x02ca, 0x02ca, 0x02ca, 0x02ca, 0x02ca,
473 0x02ca, 0x02ca, 0x02ca, 0x02ca, 0x02ca, 0x02ca, 0x02ca, 0x02ca, 0x02ca, 0x02ca, 0x02ca, 0x02ca,
474 0x02ca, 0x02ca, 0x02ca, 0x02ca, 0x02cd, 0x02cd, 0x02cd, 0x02cd, 0x02cd, 0x02cd, 0x02cd, 0x02cd,
475 0x02cd, 0x02cd, 0x02cd, 0x02cd, 0x02cd, 0x02cd, 0x02cd, 0x02cd, 0x02cd, 0x02cd, 0x02cd, 0x02cd,
476 0x02cd, 0x02cd, 0x02cd, 0x02cd, 0x02cd, 0x02cd, 0x02cd, 0x02cd, 0x02cd, 0x02cd, 0x02cd, 0x02cd,
477 0x02cd, 0x02cd, 0x02cd, 0x02cd, 0x02cd, 0x02cd, 0x02cd, 0x02cd, 0x02cd, 0x02cd, 0x02cd, 0x02cd,
478 0x02cd, 0x02cd, 0x02cd, 0x02cd, 0x02cd, 0x02cd, 0x02cd, 0x02cd, 0x02cd, 0x02cd, 0x02cd, 0x02cd,
479 0x02cd, 0x02cd, 0x02cd, 0x02cd, 0x02cd, 0x02cd, 0x02cd, 0x02cd, 0x02d2, 0x02d2, 0x02d2, 0x02d2,
480 0x02d2, 0x02d2, 0x02d2, 0x02d2, 0x02d2, 0x02d2, 0x02d2, 0x02d2, 0x02d2, 0x02d2, 0x02d2, 0x02d2,
481 0x02d2, 0x02d2, 0x02d2, 0x02d2, 0x02d2, 0x02d2, 0x02d2, 0x02d2, 0x02d2, 0x02d2, 0x02d2, 0x02d2,
482 0x02d2, 0x02d2, 0x02d2, 0x02d2, 0x02d2, 0x02d2, 0x02d2, 0x02d2, 0x02d2, 0x02d2, 0x02d2, 0x02d2,
483 0x02d2, 0x02d2, 0x02d2, 0x02d2, 0x02d2, 0x02d2, 0x02d2, 0x02d2, 0x02d2, 0x02d2, 0x02d2, 0x02d2,
484 0x02d2, 0x02d2, 0x02d2, 0x02d2, 0x02d2, 0x02d2, 0x02d2, 0x02d2, 0x02d2, 0x02d2, 0x02d2, 0x02d2,
485 0x02d5, 0x02d5, 0x02d5, 0x02d5, 0x02d5, 0x02d5, 0x02d5, 0x02d5, 0x02d5, 0x02d5, 0x02d5, 0x02d5,
486 0x02d5, 0x02d5, 0x02d5, 0x02d5, 0x02d5, 0x02d5, 0x02d5, 0x02d5, 0x02d5, 0x02d5, 0x02d5, 0x02d5,
487 0x02d5, 0x02d5, 0x02d5, 0x02d5, 0x02d5, 0x02d5, 0x02d5, 0x02d5, 0x02d5, 0x02d5, 0x02d5, 0x02d5,
488 0x02d5, 0x02d5, 0x02d5, 0x02d5, 0x02d5, 0x02d5, 0x02d5, 0x02d5, 0x02d5, 0x02d5, 0x02d5, 0x02d5,
489 0x02d5, 0x02d5, 0x02d5, 0x02d5, 0x02d5, 0x02d5, 0x02d5, 0x02d5, 0x02d5, 0x02d5, 0x02d5, 0x02d5,
490 0x02d5, 0x02d5, 0x02d5, 0x02d5, 0x02f2, 0x02f2, 0x02f2, 0x02f2, 0x02f2, 0x02f2, 0x02f2, 0x02f2,
491 0x02f2, 0x02f2, 0x02f2, 0x02f2, 0x02f2, 0x02f2, 0x02f2, 0x02f2, 0x02f2, 0x02f2, 0x02f2, 0x02f2,
492 0x02f2, 0x02f2, 0x02f2, 0x02f2, 0x02f2, 0x02f2, 0x02f2, 0x02f2, 0x02f2, 0x02f2, 0x02f2, 0x02f2,
493 0x02f2, 0x02f2, 0x02f2, 0x02f2, 0x02f2, 0x02f2, 0x02f2, 0x02f2, 0x02f2, 0x02f2, 0x02f2, 0x02f2,
494 0x02f2, 0x02f2, 0x02f2, 0x02f2, 0x02f2, 0x02f2, 0x02f2, 0x02f2, 0x02f2, 0x02f2, 0x02f2, 0x02f2,
495 0x02f2, 0x02f2, 0x02f2, 0x02f2, 0x02f2, 0x02f2, 0x02f2, 0x02f2, 0x02f3, 0x02f3, 0x02f3, 0x02f3,
496 0x02f3, 0x02f3, 0x02f3, 0x02f3, 0x02f3, 0x02f3, 0x02f3, 0x02f3, 0x02f3, 0x02f3, 0x02f3, 0x02f3,
497 0x02f3, 0x02f3, 0x02f3, 0x02f3, 0x02f3, 0x02f3, 0x02f3, 0x02f3, 0x02f3, 0x02f3, 0x02f3, 0x02f3,
498 0x02f3, 0x02f3, 0x02f3, 0x02f3, 0x02f3, 0x02f3, 0x02f3, 0x02f3, 0x02f3, 0x02f3, 0x02f3, 0x02f3,
499 0x02f3, 0x02f3, 0x02f3, 0x02f3, 0x02f3, 0x02f3, 0x02f3, 0x02f3, 0x02f3, 0x02f3, 0x02f3, 0x02f3,
500 0x02f3, 0x02f3, 0x02f3, 0x02f3, 0x02f3, 0x02f3, 0x02f3, 0x02f3, 0x02f3, 0x02f3, 0x02f3, 0x02f3,
501 0x02ff, 0x02ff, 0x02ff, 0x02ff, 0x02ff, 0x02ff, 0x02ff, 0x02ff, 0x02ff, 0x02ff, 0x02ff, 0x02ff,
502 0x02ff, 0x02ff, 0x02ff, 0x02ff, 0x02ff, 0x02ff, 0x02ff, 0x02ff, 0x02ff, 0x02ff, 0x02ff, 0x02ff,
503 0x02ff, 0x02ff, 0x02ff, 0x02ff, 0x02ff, 0x02ff, 0x02ff, 0x02ff, 0x02ff, 0x02ff, 0x02ff, 0x02ff,
504 0x02ff, 0x02ff, 0x02ff, 0x02ff, 0x02ff, 0x02ff, 0x02ff, 0x02ff, 0x02ff, 0x02ff, 0x02ff, 0x02ff,
505 0x02ff, 0x02ff, 0x02ff, 0x02ff, 0x02ff, 0x02ff, 0x02ff, 0x02ff, 0x02ff, 0x02ff, 0x02ff, 0x02ff,
506 0x02ff, 0x02ff, 0x02ff, 0x02ff, 0x03cb, 0x03cb, 0x03cb, 0x03cb, 0x03cb, 0x03cb, 0x03cb, 0x03cb,
507 0x03cb, 0x03cb, 0x03cb, 0x03cb, 0x03cb, 0x03cb, 0x03cb, 0x03cb, 0x03cb, 0x03cb, 0x03cb, 0x03cb,
508 0x03cb, 0x03cb, 0x03cb, 0x03cb, 0x03cb, 0x03cb, 0x03cb, 0x03cb, 0x03cb, 0x03cb, 0x03cb, 0x03cb,
509 0x03cc, 0x03cc, 0x03cc, 0x03cc, 0x03cc, 0x03cc, 0x03cc, 0x03cc, 0x03cc, 0x03cc, 0x03cc, 0x03cc,
510 0x03cc, 0x03cc, 0x03cc, 0x03cc, 0x03cc, 0x03cc, 0x03cc, 0x03cc, 0x03cc, 0x03cc, 0x03cc, 0x03cc,
511 0x03cc, 0x03cc, 0x03cc, 0x03cc, 0x03cc, 0x03cc, 0x03cc, 0x03cc, 0x03d3, 0x03d3, 0x03d3, 0x03d3,
512 0x03d3, 0x03d3, 0x03d3, 0x03d3, 0x03d3, 0x03d3, 0x03d3, 0x03d3, 0x03d3, 0x03d3, 0x03d3, 0x03d3,
513 0x03d3, 0x03d3, 0x03d3, 0x03d3, 0x03d3, 0x03d3, 0x03d3, 0x03d3, 0x03d3, 0x03d3, 0x03d3, 0x03d3,
514 0x03d3, 0x03d3, 0x03d3, 0x03d3, 0x03d4, 0x03d4, 0x03d4, 0x03d4, 0x03d4, 0x03d4, 0x03d4, 0x03d4,
515 0x03d4, 0x03d4, 0x03d4, 0x03d4, 0x03d4, 0x03d4, 0x03d4, 0x03d4, 0x03d4, 0x03d4, 0x03d4, 0x03d4,
516 0x03d4, 0x03d4, 0x03d4, 0x03d4, 0x03d4, 0x03d4, 0x03d4, 0x03d4, 0x03d4, 0x03d4, 0x03d4, 0x03d4,
517 0x03d6, 0x03d6, 0x03d6, 0x03d6, 0x03d6, 0x03d6, 0x03d6, 0x03d6, 0x03d6, 0x03d6, 0x03d6, 0x03d6,
518 0x03d6, 0x03d6, 0x03d6, 0x03d6, 0x03d6, 0x03d6, 0x03d6, 0x03d6, 0x03d6, 0x03d6, 0x03d6, 0x03d6,
519 0x03d6, 0x03d6, 0x03d6, 0x03d6, 0x03d6, 0x03d6, 0x03d6, 0x03d6, 0x03dd, 0x03dd, 0x03dd, 0x03dd,
520 0x03dd, 0x03dd, 0x03dd, 0x03dd, 0x03dd, 0x03dd, 0x03dd, 0x03dd, 0x03dd, 0x03dd, 0x03dd, 0x03dd,
521 0x03dd, 0x03dd, 0x03dd, 0x03dd, 0x03dd, 0x03dd, 0x03dd, 0x03dd, 0x03dd, 0x03dd, 0x03dd, 0x03dd,
522 0x03dd, 0x03dd, 0x03dd, 0x03dd, 0x03de, 0x03de, 0x03de, 0x03de, 0x03de, 0x03de, 0x03de, 0x03de,
523 0x03de, 0x03de, 0x03de, 0x03de, 0x03de, 0x03de, 0x03de, 0x03de, 0x03de, 0x03de, 0x03de, 0x03de,
524 0x03de, 0x03de, 0x03de, 0x03de, 0x03de, 0x03de, 0x03de, 0x03de, 0x03de, 0x03de, 0x03de, 0x03de,
525 0x03df, 0x03df, 0x03df, 0x03df, 0x03df, 0x03df, 0x03df, 0x03df, 0x03df, 0x03df, 0x03df, 0x03df,
526 0x03df, 0x03df, 0x03df, 0x03df, 0x03df, 0x03df, 0x03df, 0x03df, 0x03df, 0x03df, 0x03df, 0x03df,
527 0x03df, 0x03df, 0x03df, 0x03df, 0x03df, 0x03df, 0x03df, 0x03df, 0x03f1, 0x03f1, 0x03f1, 0x03f1,
528 0x03f1, 0x03f1, 0x03f1, 0x03f1, 0x03f1, 0x03f1, 0x03f1, 0x03f1, 0x03f1, 0x03f1, 0x03f1, 0x03f1,
529 0x03f1, 0x03f1, 0x03f1, 0x03f1, 0x03f1, 0x03f1, 0x03f1, 0x03f1, 0x03f1, 0x03f1, 0x03f1, 0x03f1,
530 0x03f1, 0x03f1, 0x03f1, 0x03f1, 0x03f4, 0x03f4, 0x03f4, 0x03f4, 0x03f4, 0x03f4, 0x03f4, 0x03f4,
531 0x03f4, 0x03f4, 0x03f4, 0x03f4, 0x03f4, 0x03f4, 0x03f4, 0x03f4, 0x03f4, 0x03f4, 0x03f4, 0x03f4,
532 0x03f4, 0x03f4, 0x03f4, 0x03f4, 0x03f4, 0x03f4, 0x03f4, 0x03f4, 0x03f4, 0x03f4, 0x03f4, 0x03f4,
533 0x02da, 0x02da, 0x02da, 0x02da, 0x02da, 0x02da, 0x02da, 0x02da, 0x02da, 0x02da, 0x02da, 0x02da,
534 0x02da, 0x02da, 0x02da, 0x02da, 0x02da, 0x02da, 0x02da, 0x02da, 0x02da, 0x02da, 0x02da, 0x02da,
535 0x02da, 0x02da, 0x02da, 0x02da, 0x02da, 0x02da, 0x02da, 0x02da, 0x02da, 0x02da, 0x02da, 0x02da,
536 0x02da, 0x02da, 0x02da, 0x02da, 0x02da, 0x02da, 0x02da, 0x02da, 0x02da, 0x02da, 0x02da, 0x02da,
537 0x02da, 0x02da, 0x02da, 0x02da, 0x02da, 0x02da, 0x02da, 0x02da, 0x02da, 0x02da, 0x02da, 0x02da,
538 0x02da, 0x02da, 0x02da, 0x02da, 0x02db, 0x02db, 0x02db, 0x02db, 0x02db, 0x02db, 0x02db, 0x02db,
539 0x02db, 0x02db, 0x02db, 0x02db, 0x02db, 0x02db, 0x02db, 0x02db, 0x02db, 0x02db, 0x02db, 0x02db,
540 0x02db, 0x02db, 0x02db, 0x02db, 0x02db, 0x02db, 0x02db, 0x02db, 0x02db, 0x02db, 0x02db, 0x02db,
541 0x02db, 0x02db, 0x02db, 0x02db, 0x02db, 0x02db, 0x02db, 0x02db, 0x02db, 0x02db, 0x02db, 0x02db,
542 0x02db, 0x02db, 0x02db, 0x02db, 0x02db, 0x02db, 0x02db, 0x02db, 0x02db, 0x02db, 0x02db, 0x02db,
543 0x02db, 0x02db, 0x02db, 0x02db, 0x02db, 0x02db, 0x02db, 0x02db, 0x02ee, 0x02ee, 0x02ee, 0x02ee,
544 0x02ee, 0x02ee, 0x02ee, 0x02ee, 0x02ee, 0x02ee, 0x02ee, 0x02ee, 0x02ee, 0x02ee, 0x02ee, 0x02ee,
545 0x02ee, 0x02ee, 0x02ee, 0x02ee, 0x02ee, 0x02ee, 0x02ee, 0x02ee, 0x02ee, 0x02ee, 0x02ee, 0x02ee,
546 0x02ee, 0x02ee, 0x02ee, 0x02ee, 0x02ee, 0x02ee, 0x02ee, 0x02ee, 0x02ee, 0x02ee, 0x02ee, 0x02ee,
547 0x02ee, 0x02ee, 0x02ee, 0x02ee, 0x02ee, 0x02ee, 0x02ee, 0x02ee, 0x02ee, 0x02ee, 0x02ee, 0x02ee,
548 0x02ee, 0x02ee, 0x02ee, 0x02ee, 0x02ee, 0x02ee, 0x02ee, 0x02ee, 0x02ee, 0x02ee, 0x02ee, 0x02ee,
549 0x02f0, 0x02f0, 0x02f0, 0x02f0, 0x02f0, 0x02f0, 0x02f0, 0x02f0, 0x02f0, 0x02f0, 0x02f0, 0x02f0,
550 0x02f0, 0x02f0, 0x02f0, 0x02f0, 0x02f0, 0x02f0, 0x02f0, 0x02f0, 0x02f0, 0x02f0, 0x02f0, 0x02f0,
551 0x02f0, 0x02f0, 0x02f0, 0x02f0, 0x02f0, 0x02f0, 0x02f0, 0x02f0, 0x02f0, 0x02f0, 0x02f0, 0x02f0,
552 0x02f0, 0x02f0, 0x02f0, 0x02f0, 0x02f0, 0x02f0, 0x02f0, 0x02f0, 0x02f0, 0x02f0, 0x02f0, 0x02f0,
553 0x02f0, 0x02f0, 0x02f0, 0x02f0, 0x02f0, 0x02f0, 0x02f0, 0x02f0, 0x02f0, 0x02f0, 0x02f0, 0x02f0,
554 0x02f0, 0x02f0, 0x02f0, 0x02f0, 0x01ea, 0x01ea, 0x01ea, 0x01ea, 0x01ea, 0x01ea, 0x01ea, 0x01ea,
555 0x01ea, 0x01ea, 0x01ea, 0x01ea, 0x01ea, 0x01ea, 0x01ea, 0x01ea, 0x01ea, 0x01ea, 0x01ea, 0x01ea,
556 0x01ea, 0x01ea, 0x01ea, 0x01ea, 0x01ea, 0x01ea, 0x01ea, 0x01ea, 0x01ea, 0x01ea, 0x01ea, 0x01ea,
557 0x01ea, 0x01ea, 0x01ea, 0x01ea, 0x01ea, 0x01ea, 0x01ea, 0x01ea, 0x01ea, 0x01ea, 0x01ea, 0x01ea,
558 0x01ea, 0x01ea, 0x01ea, 0x01ea, 0x01ea, 0x01ea, 0x01ea, 0x01ea, 0x01ea, 0x01ea, 0x01ea, 0x01ea,
559 0x01ea, 0x01ea, 0x01ea, 0x01ea, 0x01ea, 0x01ea, 0x01ea, 0x01ea, 0x01ea, 0x01ea, 0x01ea, 0x01ea,
560 0x01ea, 0x01ea, 0x01ea, 0x01ea, 0x01ea, 0x01ea, 0x01ea, 0x01ea, 0x01ea, 0x01ea, 0x01ea, 0x01ea,
561 0x01ea, 0x01ea, 0x01ea, 0x01ea, 0x01ea, 0x01ea, 0x01ea, 0x01ea, 0x01ea, 0x01ea, 0x01ea, 0x01ea,
562 0x01ea, 0x01ea, 0x01ea, 0x01ea, 0x01ea, 0x01ea, 0x01ea, 0x01ea, 0x01ea, 0x01ea, 0x01ea, 0x01ea,
563 0x01ea, 0x01ea, 0x01ea, 0x01ea, 0x01ea, 0x01ea, 0x01ea, 0x01ea, 0x01ea, 0x01ea, 0x01ea, 0x01ea,
564 0x01ea, 0x01ea, 0x01ea, 0x01ea, 0x01ea, 0x01ea, 0x01ea, 0x01ea, 0x01ea, 0x01ea, 0x01ea, 0x01ea,
565 0x01eb, 0x01eb, 0x01eb, 0x01eb, 0x01eb, 0x01eb, 0x01eb, 0x01eb, 0x01eb, 0x01eb, 0x01eb, 0x01eb,
566 0x01eb, 0x01eb, 0x01eb, 0x01eb, 0x01eb, 0x01eb, 0x01eb, 0x01eb, 0x01eb, 0x01eb, 0x01eb, 0x01eb,
567 0x01eb, 0x01eb, 0x01eb, 0x01eb, 0x01eb, 0x01eb, 0x01eb, 0x01eb, 0x01eb, 0x01eb, 0x01eb, 0x01eb,
568 0x01eb, 0x01eb, 0x01eb, 0x01eb, 0x01eb, 0x01eb, 0x01eb, 0x01eb, 0x01eb, 0x01eb, 0x01eb, 0x01eb,
569 0x01eb, 0x01eb, 0x01eb, 0x01eb, 0x01eb, 0x01eb, 0x01eb, 0x01eb, 0x01eb, 0x01eb, 0x01eb, 0x01eb,
570 0x01eb, 0x01eb, 0x01eb, 0x01eb, 0x01eb, 0x01eb, 0x01eb, 0x01eb, 0x01eb, 0x01eb, 0x01eb, 0x01eb,
571 0x01eb, 0x01eb, 0x01eb, 0x01eb, 0x01eb, 0x01eb, 0x01eb, 0x01eb, 0x01eb, 0x01eb, 0x01eb, 0x01eb,
572 0x01eb, 0x01eb, 0x01eb, 0x01eb, 0x01eb, 0x01eb, 0x01eb, 0x01eb, 0x01eb, 0x01eb, 0x01eb, 0x01eb,
573 0x01eb, 0x01eb, 0x01eb, 0x01eb, 0x01eb, 0x01eb, 0x01eb, 0x01eb, 0x01eb, 0x01eb, 0x01eb, 0x01eb,
574 0x01eb, 0x01eb, 0x01eb, 0x01eb, 0x01eb, 0x01eb, 0x01eb, 0x01eb, 0x01eb, 0x01eb, 0x01eb, 0x01eb,
575 0x01eb, 0x01eb, 0x01eb, 0x01eb, 0x01eb, 0x01eb, 0x01eb, 0x01eb, 0x03f5, 0x03f5, 0x03f5, 0x03f5,
576 0x03f5, 0x03f5, 0x03f5, 0x03f5, 0x03f5, 0x03f5, 0x03f5, 0x03f5, 0x03f5, 0x03f5, 0x03f5, 0x03f5,
577 0x03f5, 0x03f5, 0x03f5, 0x03f5, 0x03f5, 0x03f5, 0x03f5, 0x03f5, 0x03f5, 0x03f5, 0x03f5, 0x03f5,
578 0x03f5, 0x03f5, 0x03f5, 0x03f5, 0x03f6, 0x03f6, 0x03f6, 0x03f6, 0x03f6, 0x03f6, 0x03f6, 0x03f6,
579 0x03f6, 0x03f6, 0x03f6, 0x03f6, 0x03f6, 0x03f6, 0x03f6, 0x03f6, 0x03f6, 0x03f6, 0x03f6, 0x03f6,
580 0x03f6, 0x03f6, 0x03f6, 0x03f6, 0x03f6, 0x03f6, 0x03f6, 0x03f6, 0x03f6, 0x03f6, 0x03f6, 0x03f6,
581 0x03f7, 0x03f7, 0x03f7, 0x03f7, 0x03f7, 0x03f7, 0x03f7, 0x03f7, 0x03f7, 0x03f7, 0x03f7, 0x03f7,
582 0x03f7, 0x03f7, 0x03f7, 0x03f7, 0x03f7, 0x03f7, 0x03f7, 0x03f7, 0x03f7, 0x03f7, 0x03f7, 0x03f7,
583 0x03f7, 0x03f7, 0x03f7, 0x03f7, 0x03f7, 0x03f7, 0x03f7, 0x03f7, 0x03f8, 0x03f8, 0x03f8, 0x03f8,
584 0x03f8, 0x03f8, 0x03f8, 0x03f8, 0x03f8, 0x03f8, 0x03f8, 0x03f8, 0x03f8, 0x03f8, 0x03f8, 0x03f8,
585 0x03f8, 0x03f8, 0x03f8, 0x03f8, 0x03f8, 0x03f8, 0x03f8, 0x03f8, 0x03f8, 0x03f8, 0x03f8, 0x03f8,
586 0x03f8, 0x03f8, 0x03f8, 0x03f8, 0x03fa, 0x03fa, 0x03fa, 0x03fa, 0x03fa, 0x03fa, 0x03fa, 0x03fa,
587 0x03fa, 0x03fa, 0x03fa, 0x03fa, 0x03fa, 0x03fa, 0x03fa, 0x03fa, 0x03fa, 0x03fa, 0x03fa, 0x03fa,
588 0x03fa, 0x03fa, 0x03fa, 0x03fa, 0x03fa, 0x03fa, 0x03fa, 0x03fa, 0x03fa, 0x03fa, 0x03fa, 0x03fa,
589 0x03fb, 0x03fb, 0x03fb, 0x03fb, 0x03fb, 0x03fb, 0x03fb, 0x03fb, 0x03fb, 0x03fb, 0x03fb, 0x03fb,
590 0x03fb, 0x03fb, 0x03fb, 0x03fb, 0x03fb, 0x03fb, 0x03fb, 0x03fb, 0x03fb, 0x03fb, 0x03fb, 0x03fb,
591 0x03fb, 0x03fb, 0x03fb, 0x03fb, 0x03fb, 0x03fb, 0x03fb, 0x03fb, 0x03fc, 0x03fc, 0x03fc, 0x03fc,
592 0x03fc, 0x03fc, 0x03fc, 0x03fc, 0x03fc, 0x03fc, 0x03fc, 0x03fc, 0x03fc, 0x03fc, 0x03fc, 0x03fc,
593 0x03fc, 0x03fc, 0x03fc, 0x03fc, 0x03fc, 0x03fc, 0x03fc, 0x03fc, 0x03fc, 0x03fc, 0x03fc, 0x03fc,
594 0x03fc, 0x03fc, 0x03fc, 0x03fc, 0x03fd, 0x03fd, 0x03fd, 0x03fd, 0x03fd, 0x03fd, 0x03fd, 0x03fd,
595 0x03fd, 0x03fd, 0x03fd, 0x03fd, 0x03fd, 0x03fd, 0x03fd, 0x03fd, 0x03fd, 0x03fd, 0x03fd, 0x03fd,
596 0x03fd, 0x03fd, 0x03fd, 0x03fd, 0x03fd, 0x03fd, 0x03fd, 0x03fd, 0x03fd, 0x03fd, 0x03fd, 0x03fd,
597];
598
599#[derive(Debug, Clone, Copy, PartialEq, Eq)]
601pub enum HuffmanError {
602 InvalidCode,
604 InvalidPadding,
606}
607
608pub fn decode(src: &[u8], out: &mut Vec<u8>) -> Result<usize, HuffmanError> {
616 out.reserve(src.len() << 1);
617 let start = out.len();
618
619 let mut table = 0usize;
620 let mut acc = 0u32;
621 let mut bits = 0usize;
622
623 for &byte in src {
624 acc = (acc << 8) | u32::from(byte);
625 bits += 8;
626
627 while bits >= 8 {
628 let index = ((acc >> (bits - 8)) as u8) as usize;
629 let entry = DECODE_TABLE[table * TABLE_WIDTH + index];
630
631 if entry & BRANCH == 0 {
632 out.push(entry as u8);
633 table = 0;
634 bits -= (entry >> 8) as usize;
635 } else {
636 table = ((entry & TABLE_INDEX_MASK) >> 8) as usize;
637 if table == 0 {
638 return Err(HuffmanError::InvalidCode);
639 }
640 bits -= 8;
641 }
642 }
643 }
644
645 while bits > 0 {
648 let padding = (1u32 << bits) - 1;
649 if table == 0 && acc & padding == padding {
650 break;
651 }
652
653 let index = ((acc << (8 - bits)) as u8) as usize;
654 let entry = DECODE_TABLE[table * TABLE_WIDTH + index];
655 if entry & BRANCH != 0 {
656 return Err(HuffmanError::InvalidPadding);
657 }
658
659 let used = (entry >> 8) as usize;
660 if used > bits {
661 return Err(HuffmanError::InvalidPadding);
662 }
663
664 out.push(entry as u8);
665 table = 0;
666 bits -= used;
667 }
668
669 if table != 0 {
670 return Err(HuffmanError::InvalidPadding);
671 }
672 Ok(out.len() - start)
673}
674
675pub fn encode(src: &[u8], out: &mut Vec<u8>) {
678 let mut bits: u64 = 0;
679 let mut bits_left = 40;
680
681 for &b in src {
682 let (nbits, code) = ENCODE_TABLE[usize::from(b)];
683
684 bits |= code << (bits_left - nbits);
685 bits_left -= nbits;
686
687 while bits_left <= 32 {
688 out.push((bits >> 32) as u8);
689
690 bits <<= 8;
691 bits_left += 8;
692 }
693 }
694
695 if bits_left != 40 {
696 bits |= (1 << bits_left) - 1;
698 out.push((bits >> 32) as u8);
699 }
700}
701
702#[cfg(test)]
703mod tests {
704 use super::*;
705
706 fn decoded(src: &[u8]) -> Vec<u8> {
707 let mut out = Vec::new();
708 decode(src, &mut out).expect("decode");
709 out
710 }
711
712 #[test]
713 fn decode_single_byte() {
714 assert_eq!(decoded(&[0b00111111]), b"o");
715 assert_eq!(decoded(&[7]), b"0");
716 }
717
718 #[test]
719 fn multi_char() {
720 assert_eq!(decoded(&[254, 1]), b"!0");
721 assert_eq!(decoded(&[0b01010011, 0b11111000]), b" !");
722 }
723
724 #[test]
725 fn encode_roundtrip_strings() {
726 const DATA: &[&[u8]] = &[
727 b"hello world",
728 b":method",
729 b":authority",
730 b"GET",
731 b"http",
732 b"/images/top/sp2/cmn/logo-ns-130528.png",
733 b"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
734 b"\0\0\0",
735 b"\xFF\xF8",
736 ];
737 for s in DATA {
738 let mut enc = Vec::new();
739 encode(s, &mut enc);
740 assert_eq!(decoded(&enc), *s);
741 }
742 }
743
744 #[test]
745 fn encode_decode_all_octets() {
746 let src: Vec<u8> = (0..=u8::MAX).collect();
747 let mut enc = Vec::new();
748 encode(&src, &mut enc);
749 assert_eq!(decoded(&enc), src);
750 }
751
752 #[test]
753 fn rejects_eos_and_invalid_padding() {
754 let mut out = Vec::new();
755 assert_eq!(decode(&[0xff], &mut out), Err(HuffmanError::InvalidPadding));
757 assert_eq!(decoded(&[7]), b"0");
759 assert_eq!(decode(&[0x00], &mut out), Err(HuffmanError::InvalidPadding));
762 }
763}