dsi-bitstream 0.9.2

A Rust implementation of read/write bit streams supporting several types of instantaneous codes
Documentation
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
#![doc(hidden)]
// THIS FILE HAS BEEN GENERATED BY THE SCRIPT gen_code_tables.py
// ~~~~~~~~~~~~~~~~~~~ DO NOT MODIFY ~~~~~~~~~~~~~~~~~~~~~~
// Methods for reading and writing values using precomputed tables for pi codes
use crate::traits::{BE, BitRead, BitWrite, LE};
use num_primitive::PrimitiveNumber;
/// How many bits are needed to read the tables
pub const READ_BITS: usize = 10;
/// Maximum value writable using the table(s)
pub const WRITE_MAX: u64 = 1023;
/// The K of the pi codes for these tables
pub const K: usize = 2;

/// Reads from the decoding table.
///
/// Returns `(len_with_flag, value_or_lambda)` where:
/// - If len_with_flag >= 0: complete code, value_or_lambda is decoded value, len_with_flag is code length
/// - If len_with_flag < 0: partial code (rice decoded), value_or_lambda is lambda, (len_with_flag & 0x7F) is rice code length
/// - If len_with_flag = 0: no valid decoding (rice not decoded)
///
/// The backend position is always advanced by (len_with_flag & 0x7F) bits.
/// Using signed i8 allows testing with `< 0` instead of masking, which is more efficient.
#[inline(always)]
pub fn read_table_le<B: BitRead<LE>>(backend: &mut B) -> (i8, u64) {
    if let Ok(idx) = backend.peek_bits(READ_BITS) {
        let idx: usize = idx.as_to();
        let len_with_flag = READ_LEN_LE[idx];
        let value_or_lambda = READ_LE[idx] as u64;
        backend.skip_bits_after_peek((len_with_flag & 0x7F) as usize);
        (len_with_flag, value_or_lambda)
    } else {
        // Not enough bits available
        (0, 0)
    }
}

/// Reads from the decoding table.
///
/// Returns `(len_with_flag, value_or_lambda)` where:
/// - If len_with_flag >= 0: complete code, value_or_lambda is decoded value, len_with_flag is code length
/// - If len_with_flag < 0: partial code (rice decoded), value_or_lambda is lambda, (len_with_flag & 0x7F) is rice code length
/// - If len_with_flag = 0: no valid decoding (rice not decoded)
///
/// The backend position is always advanced by (len_with_flag & 0x7F) bits.
/// Using signed i8 allows testing with `< 0` instead of masking, which is more efficient.
#[inline(always)]
pub fn read_table_be<B: BitRead<BE>>(backend: &mut B) -> (i8, u64) {
    if let Ok(idx) = backend.peek_bits(READ_BITS) {
        let idx: usize = idx.as_to();
        let len_with_flag = READ_LEN_BE[idx];
        let value_or_lambda = READ_BE[idx] as u64;
        backend.skip_bits_after_peek((len_with_flag & 0x7F) as usize);
        (len_with_flag, value_or_lambda)
    } else {
        // Not enough bits available
        (0, 0)
    }
}

/// Writes a value using an encoding table.
///
/// If the result is `Some` the encoding was successful, and
/// length of the code is returned.
#[inline(always)]
pub fn write_table_le<B: BitWrite<LE>>(backend: &mut B, n: u64) -> Result<Option<usize>, B::Error> {
    // We cannot use .get() here because n is a u64
    if n >= WRITE_LE.len() as u64 {
        return Ok(None);
    }
    let n = n as usize;
    let len = WRITE_LEN_LE[n] as usize;
    backend.write_bits(WRITE_LE[n] as u64, len)?;
    Ok(Some(len))
}

/// Writes a value using an encoding table.
///
/// If the result is `Some` the encoding was successful, and
/// length of the code is returned.
#[inline(always)]
pub fn write_table_be<B: BitWrite<BE>>(backend: &mut B, n: u64) -> Result<Option<usize>, B::Error> {
    // We cannot use .get() here because n is a u64
    if n >= WRITE_BE.len() as u64 {
        return Ok(None);
    }
    let n = n as usize;
    let len = WRITE_LEN_BE[n] as usize;
    backend.write_bits(WRITE_BE[n] as u64, len)?;
    Ok(Some(len))
}
/// Precomputed table for reading pi codes
/// For complete codes: stores the decoded value
/// For partial codes: stores the lambda (length of the following fixed part)
pub const READ_BE: &[u8] = &[
    0, 0, 0, 0, 28, 29, 30, 31, 24, 24, 25, 25, 26, 26, 27, 27, 20, 20, 20, 20, 21, 21, 21, 21, 22,
    22, 22, 22, 23, 23, 23, 23, 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 17, 17, 17, 17, 18,
    18, 18, 18, 18, 18, 18, 18, 19, 19, 19, 19, 19, 19, 19, 19, 12, 12, 12, 12, 12, 12, 12, 12, 12,
    12, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14,
    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15,
    15, 15, 15, 15, 15, 15, 15, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
    8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
    9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11,
    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
    15, 15, 15, 15, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18, 19, 19, 19, 19, 20, 20, 20, 20,
    21, 21, 21, 21, 22, 22, 22, 22, 23, 23, 23, 23, 24, 24, 24, 24, 25, 25, 25, 25, 26, 26, 26, 26,
    27, 27, 27, 27, 28, 28, 28, 28, 29, 29, 29, 29, 30, 30, 30, 30, 31, 31, 32, 32, 33, 33, 34, 34,
    35, 35, 36, 36, 37, 37, 38, 38, 39, 39, 40, 40, 41, 41, 42, 42, 43, 43, 44, 44, 45, 45, 46, 46,
    47, 47, 48, 48, 49, 49, 50, 50, 51, 51, 52, 52, 53, 53, 54, 54, 55, 55, 56, 56, 57, 57, 58, 58,
    59, 59, 60, 60, 61, 61, 62, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78,
    79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101,
    102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120,
    121, 122, 123, 124, 125, 126, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
    5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
    6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8,
    8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10,
    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
    11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13,
    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
    14, 14, 14, 14,
];
/// Precomputed lengths table for reading pi codes
/// Positive (< 0x80): complete code length
/// Negative (>= 0x80 when viewed as u8): (value & 0x7F) is rice code length (bits consumed)
/// Zero: no valid decoding (rice not decoded)
pub const READ_LEN_BE: &[i8] = &[
    0, 0, 0, 0, -118, -118, -118, -118, -119, -119, -119, -119, -119, -119, -119, -119, -120, -120,
    -120, -120, -120, -120, -120, -120, -120, -120, -120, -120, -120, -120, -120, -120, -121, -121,
    -121, -121, -121, -121, -121, -121, -121, -121, -121, -121, -121, -121, -121, -121, -121, -121,
    -121, -121, -121, -121, -121, -121, -121, -121, -121, -121, -121, -121, -121, -121, -122, -122,
    -122, -122, -122, -122, -122, -122, -122, -122, -122, -122, -122, -122, -122, -122, -122, -122,
    -122, -122, -122, -122, -122, -122, -122, -122, -122, -122, -122, -122, -122, -122, -122, -122,
    -122, -122, -122, -122, -122, -122, -122, -122, -122, -122, -122, -122, -122, -122, -122, -122,
    -122, -122, -122, -122, -122, -122, -122, -122, -122, -122, -122, -122, -122, -122, -123, -123,
    -123, -123, -123, -123, -123, -123, -123, -123, -123, -123, -123, -123, -123, -123, -123, -123,
    -123, -123, -123, -123, -123, -123, -123, -123, -123, -123, -123, -123, -123, -123, -123, -123,
    -123, -123, -123, -123, -123, -123, -123, -123, -123, -123, -123, -123, -123, -123, -123, -123,
    -123, -123, -123, -123, -123, -123, -123, -123, -123, -123, -123, -123, -123, -123, -123, -123,
    -123, -123, -123, -123, -123, -123, -123, -123, -123, -123, -123, -123, -123, -123, -123, -123,
    -123, -123, -123, -123, -123, -123, -123, -123, -123, -123, -123, -123, -123, -123, -123, -123,
    -123, -123, -123, -123, -123, -123, -123, -123, -123, -123, -123, -123, -123, -123, -123, -123,
    -123, -123, -123, -123, -123, -123, -123, -123, -123, -123, -123, -123, -123, -123, 8, 8, 8, 8,
    8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
    8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9,
    9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
    9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10,
    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, -124, -124, -124, -124, -124, -124, -124,
    -124, -124, -124, -124, -124, -124, -124, -124, -124, -124, -124, -124, -124, -124, -124, -124,
    -124, -124, -124, -124, -124, -124, -124, -124, -124, -124, -124, -124, -124, -124, -124, -124,
    -124, -124, -124, -124, -124, -124, -124, -124, -124, -124, -124, -124, -124, -124, -124, -124,
    -124, -124, -124, -124, -124, -124, -124, -124, -124, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
    5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
    5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
    5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
    5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
    6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
    6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
    6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
    6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
];
/// Precomputed table for reading pi codes
/// For complete codes: stores the decoded value
/// For partial codes: stores the lambda (length of the following fixed part)
pub const READ_LE: &[u8] = &[
    0, 0, 15, 1, 8, 3, 31, 7, 12, 0, 63, 2, 9, 4, 7, 8, 16, 0, 16, 1, 10, 5, 32, 9, 13, 0, 64, 2,
    11, 6, 7, 10, 20, 0, 17, 1, 8, 3, 33, 11, 14, 0, 65, 2, 9, 4, 7, 12, 17, 0, 18, 1, 10, 5, 34,
    13, 15, 0, 66, 2, 11, 6, 7, 14, 24, 0, 19, 1, 8, 3, 35, 7, 12, 0, 67, 2, 9, 4, 7, 8, 18, 0, 20,
    1, 10, 5, 36, 9, 13, 0, 68, 2, 11, 6, 7, 10, 21, 0, 21, 1, 8, 3, 37, 11, 14, 0, 69, 2, 9, 4, 7,
    12, 19, 0, 22, 1, 10, 5, 38, 13, 15, 0, 70, 2, 11, 6, 7, 14, 28, 0, 23, 1, 8, 3, 39, 7, 12, 0,
    71, 2, 9, 4, 7, 8, 16, 0, 24, 1, 10, 5, 40, 9, 13, 0, 72, 2, 11, 6, 7, 10, 22, 0, 25, 1, 8, 3,
    41, 11, 14, 0, 73, 2, 9, 4, 7, 12, 17, 0, 26, 1, 10, 5, 42, 13, 15, 0, 74, 2, 11, 6, 7, 14, 25,
    0, 27, 1, 8, 3, 43, 7, 12, 0, 75, 2, 9, 4, 7, 8, 18, 0, 28, 1, 10, 5, 44, 9, 13, 0, 76, 2, 11,
    6, 7, 10, 23, 0, 29, 1, 8, 3, 45, 11, 14, 0, 77, 2, 9, 4, 7, 12, 19, 0, 30, 1, 10, 5, 46, 13,
    15, 0, 78, 2, 11, 6, 7, 14, 0, 0, 15, 1, 8, 3, 47, 7, 12, 0, 79, 2, 9, 4, 7, 8, 16, 0, 16, 1,
    10, 5, 48, 9, 13, 0, 80, 2, 11, 6, 7, 10, 20, 0, 17, 1, 8, 3, 49, 11, 14, 0, 81, 2, 9, 4, 7,
    12, 17, 0, 18, 1, 10, 5, 50, 13, 15, 0, 82, 2, 11, 6, 7, 14, 26, 0, 19, 1, 8, 3, 51, 7, 12, 0,
    83, 2, 9, 4, 7, 8, 18, 0, 20, 1, 10, 5, 52, 9, 13, 0, 84, 2, 11, 6, 7, 10, 21, 0, 21, 1, 8, 3,
    53, 11, 14, 0, 85, 2, 9, 4, 7, 12, 19, 0, 22, 1, 10, 5, 54, 13, 15, 0, 86, 2, 11, 6, 7, 14, 29,
    0, 23, 1, 8, 3, 55, 7, 12, 0, 87, 2, 9, 4, 7, 8, 16, 0, 24, 1, 10, 5, 56, 9, 13, 0, 88, 2, 11,
    6, 7, 10, 22, 0, 25, 1, 8, 3, 57, 11, 14, 0, 89, 2, 9, 4, 7, 12, 17, 0, 26, 1, 10, 5, 58, 13,
    15, 0, 90, 2, 11, 6, 7, 14, 27, 0, 27, 1, 8, 3, 59, 7, 12, 0, 91, 2, 9, 4, 7, 8, 18, 0, 28, 1,
    10, 5, 60, 9, 13, 0, 92, 2, 11, 6, 7, 10, 23, 0, 29, 1, 8, 3, 61, 11, 14, 0, 93, 2, 9, 4, 7,
    12, 19, 0, 30, 1, 10, 5, 62, 13, 15, 0, 94, 2, 11, 6, 7, 14, 0, 0, 15, 1, 8, 3, 31, 7, 12, 0,
    95, 2, 9, 4, 7, 8, 16, 0, 16, 1, 10, 5, 32, 9, 13, 0, 96, 2, 11, 6, 7, 10, 20, 0, 17, 1, 8, 3,
    33, 11, 14, 0, 97, 2, 9, 4, 7, 12, 17, 0, 18, 1, 10, 5, 34, 13, 15, 0, 98, 2, 11, 6, 7, 14, 24,
    0, 19, 1, 8, 3, 35, 7, 12, 0, 99, 2, 9, 4, 7, 8, 18, 0, 20, 1, 10, 5, 36, 9, 13, 0, 100, 2, 11,
    6, 7, 10, 21, 0, 21, 1, 8, 3, 37, 11, 14, 0, 101, 2, 9, 4, 7, 12, 19, 0, 22, 1, 10, 5, 38, 13,
    15, 0, 102, 2, 11, 6, 7, 14, 30, 0, 23, 1, 8, 3, 39, 7, 12, 0, 103, 2, 9, 4, 7, 8, 16, 0, 24,
    1, 10, 5, 40, 9, 13, 0, 104, 2, 11, 6, 7, 10, 22, 0, 25, 1, 8, 3, 41, 11, 14, 0, 105, 2, 9, 4,
    7, 12, 17, 0, 26, 1, 10, 5, 42, 13, 15, 0, 106, 2, 11, 6, 7, 14, 25, 0, 27, 1, 8, 3, 43, 7, 12,
    0, 107, 2, 9, 4, 7, 8, 18, 0, 28, 1, 10, 5, 44, 9, 13, 0, 108, 2, 11, 6, 7, 10, 23, 0, 29, 1,
    8, 3, 45, 11, 14, 0, 109, 2, 9, 4, 7, 12, 19, 0, 30, 1, 10, 5, 46, 13, 15, 0, 110, 2, 11, 6, 7,
    14, 0, 0, 15, 1, 8, 3, 47, 7, 12, 0, 111, 2, 9, 4, 7, 8, 16, 0, 16, 1, 10, 5, 48, 9, 13, 0,
    112, 2, 11, 6, 7, 10, 20, 0, 17, 1, 8, 3, 49, 11, 14, 0, 113, 2, 9, 4, 7, 12, 17, 0, 18, 1, 10,
    5, 50, 13, 15, 0, 114, 2, 11, 6, 7, 14, 26, 0, 19, 1, 8, 3, 51, 7, 12, 0, 115, 2, 9, 4, 7, 8,
    18, 0, 20, 1, 10, 5, 52, 9, 13, 0, 116, 2, 11, 6, 7, 10, 21, 0, 21, 1, 8, 3, 53, 11, 14, 0,
    117, 2, 9, 4, 7, 12, 19, 0, 22, 1, 10, 5, 54, 13, 15, 0, 118, 2, 11, 6, 7, 14, 31, 0, 23, 1, 8,
    3, 55, 7, 12, 0, 119, 2, 9, 4, 7, 8, 16, 0, 24, 1, 10, 5, 56, 9, 13, 0, 120, 2, 11, 6, 7, 10,
    22, 0, 25, 1, 8, 3, 57, 11, 14, 0, 121, 2, 9, 4, 7, 12, 17, 0, 26, 1, 10, 5, 58, 13, 15, 0,
    122, 2, 11, 6, 7, 14, 27, 0, 27, 1, 8, 3, 59, 7, 12, 0, 123, 2, 9, 4, 7, 8, 18, 0, 28, 1, 10,
    5, 60, 9, 13, 0, 124, 2, 11, 6, 7, 10, 23, 0, 29, 1, 8, 3, 61, 11, 14, 0, 125, 2, 9, 4, 7, 12,
    19, 0, 30, 1, 10, 5, 62, 13, 15, 0, 126, 2, 11, 6, 7, 14,
];
/// Precomputed lengths table for reading pi codes
/// Positive (< 0x80): complete code length
/// Negative (>= 0x80 when viewed as u8): (value & 0x7F) is rice code length (bits consumed)
/// Zero: no valid decoding (rice not decoded)
pub const READ_LEN_LE: &[i8] = &[
    0, 3, 8, 4, -123, 5, 9, 6, -122, 3, 10, 4, -123, 5, -124, 6, -121, 3, 8, 4, -123, 5, 9, 6,
    -122, 3, 10, 4, -123, 5, -124, 6, -120, 3, 8, 4, -123, 5, 9, 6, -122, 3, 10, 4, -123, 5, -124,
    6, -121, 3, 8, 4, -123, 5, 9, 6, -122, 3, 10, 4, -123, 5, -124, 6, -119, 3, 8, 4, -123, 5, 9,
    6, -122, 3, 10, 4, -123, 5, -124, 6, -121, 3, 8, 4, -123, 5, 9, 6, -122, 3, 10, 4, -123, 5,
    -124, 6, -120, 3, 8, 4, -123, 5, 9, 6, -122, 3, 10, 4, -123, 5, -124, 6, -121, 3, 8, 4, -123,
    5, 9, 6, -122, 3, 10, 4, -123, 5, -124, 6, -118, 3, 8, 4, -123, 5, 9, 6, -122, 3, 10, 4, -123,
    5, -124, 6, -121, 3, 8, 4, -123, 5, 9, 6, -122, 3, 10, 4, -123, 5, -124, 6, -120, 3, 8, 4,
    -123, 5, 9, 6, -122, 3, 10, 4, -123, 5, -124, 6, -121, 3, 8, 4, -123, 5, 9, 6, -122, 3, 10, 4,
    -123, 5, -124, 6, -119, 3, 8, 4, -123, 5, 9, 6, -122, 3, 10, 4, -123, 5, -124, 6, -121, 3, 8,
    4, -123, 5, 9, 6, -122, 3, 10, 4, -123, 5, -124, 6, -120, 3, 8, 4, -123, 5, 9, 6, -122, 3, 10,
    4, -123, 5, -124, 6, -121, 3, 8, 4, -123, 5, 9, 6, -122, 3, 10, 4, -123, 5, -124, 6, 0, 3, 8,
    4, -123, 5, 9, 6, -122, 3, 10, 4, -123, 5, -124, 6, -121, 3, 8, 4, -123, 5, 9, 6, -122, 3, 10,
    4, -123, 5, -124, 6, -120, 3, 8, 4, -123, 5, 9, 6, -122, 3, 10, 4, -123, 5, -124, 6, -121, 3,
    8, 4, -123, 5, 9, 6, -122, 3, 10, 4, -123, 5, -124, 6, -119, 3, 8, 4, -123, 5, 9, 6, -122, 3,
    10, 4, -123, 5, -124, 6, -121, 3, 8, 4, -123, 5, 9, 6, -122, 3, 10, 4, -123, 5, -124, 6, -120,
    3, 8, 4, -123, 5, 9, 6, -122, 3, 10, 4, -123, 5, -124, 6, -121, 3, 8, 4, -123, 5, 9, 6, -122,
    3, 10, 4, -123, 5, -124, 6, -118, 3, 8, 4, -123, 5, 9, 6, -122, 3, 10, 4, -123, 5, -124, 6,
    -121, 3, 8, 4, -123, 5, 9, 6, -122, 3, 10, 4, -123, 5, -124, 6, -120, 3, 8, 4, -123, 5, 9, 6,
    -122, 3, 10, 4, -123, 5, -124, 6, -121, 3, 8, 4, -123, 5, 9, 6, -122, 3, 10, 4, -123, 5, -124,
    6, -119, 3, 8, 4, -123, 5, 9, 6, -122, 3, 10, 4, -123, 5, -124, 6, -121, 3, 8, 4, -123, 5, 9,
    6, -122, 3, 10, 4, -123, 5, -124, 6, -120, 3, 8, 4, -123, 5, 9, 6, -122, 3, 10, 4, -123, 5,
    -124, 6, -121, 3, 8, 4, -123, 5, 9, 6, -122, 3, 10, 4, -123, 5, -124, 6, 0, 3, 8, 4, -123, 5,
    9, 6, -122, 3, 10, 4, -123, 5, -124, 6, -121, 3, 8, 4, -123, 5, 9, 6, -122, 3, 10, 4, -123, 5,
    -124, 6, -120, 3, 8, 4, -123, 5, 9, 6, -122, 3, 10, 4, -123, 5, -124, 6, -121, 3, 8, 4, -123,
    5, 9, 6, -122, 3, 10, 4, -123, 5, -124, 6, -119, 3, 8, 4, -123, 5, 9, 6, -122, 3, 10, 4, -123,
    5, -124, 6, -121, 3, 8, 4, -123, 5, 9, 6, -122, 3, 10, 4, -123, 5, -124, 6, -120, 3, 8, 4,
    -123, 5, 9, 6, -122, 3, 10, 4, -123, 5, -124, 6, -121, 3, 8, 4, -123, 5, 9, 6, -122, 3, 10, 4,
    -123, 5, -124, 6, -118, 3, 8, 4, -123, 5, 9, 6, -122, 3, 10, 4, -123, 5, -124, 6, -121, 3, 8,
    4, -123, 5, 9, 6, -122, 3, 10, 4, -123, 5, -124, 6, -120, 3, 8, 4, -123, 5, 9, 6, -122, 3, 10,
    4, -123, 5, -124, 6, -121, 3, 8, 4, -123, 5, 9, 6, -122, 3, 10, 4, -123, 5, -124, 6, -119, 3,
    8, 4, -123, 5, 9, 6, -122, 3, 10, 4, -123, 5, -124, 6, -121, 3, 8, 4, -123, 5, 9, 6, -122, 3,
    10, 4, -123, 5, -124, 6, -120, 3, 8, 4, -123, 5, 9, 6, -122, 3, 10, 4, -123, 5, -124, 6, -121,
    3, 8, 4, -123, 5, 9, 6, -122, 3, 10, 4, -123, 5, -124, 6, 0, 3, 8, 4, -123, 5, 9, 6, -122, 3,
    10, 4, -123, 5, -124, 6, -121, 3, 8, 4, -123, 5, 9, 6, -122, 3, 10, 4, -123, 5, -124, 6, -120,
    3, 8, 4, -123, 5, 9, 6, -122, 3, 10, 4, -123, 5, -124, 6, -121, 3, 8, 4, -123, 5, 9, 6, -122,
    3, 10, 4, -123, 5, -124, 6, -119, 3, 8, 4, -123, 5, 9, 6, -122, 3, 10, 4, -123, 5, -124, 6,
    -121, 3, 8, 4, -123, 5, 9, 6, -122, 3, 10, 4, -123, 5, -124, 6, -120, 3, 8, 4, -123, 5, 9, 6,
    -122, 3, 10, 4, -123, 5, -124, 6, -121, 3, 8, 4, -123, 5, 9, 6, -122, 3, 10, 4, -123, 5, -124,
    6, -118, 3, 8, 4, -123, 5, 9, 6, -122, 3, 10, 4, -123, 5, -124, 6, -121, 3, 8, 4, -123, 5, 9,
    6, -122, 3, 10, 4, -123, 5, -124, 6, -120, 3, 8, 4, -123, 5, 9, 6, -122, 3, 10, 4, -123, 5,
    -124, 6, -121, 3, 8, 4, -123, 5, 9, 6, -122, 3, 10, 4, -123, 5, -124, 6, -119, 3, 8, 4, -123,
    5, 9, 6, -122, 3, 10, 4, -123, 5, -124, 6, -121, 3, 8, 4, -123, 5, 9, 6, -122, 3, 10, 4, -123,
    5, -124, 6, -120, 3, 8, 4, -123, 5, 9, 6, -122, 3, 10, 4, -123, 5, -124, 6, -121, 3, 8, 4,
    -123, 5, 9, 6, -122, 3, 10, 4, -123, 5, -124, 6,
];
/// Table used to speed up the writing of pi codes
pub const WRITE_BE: &[u16] = &[
    4, 10, 11, 24, 25, 26, 27, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72,
    73, 74, 75, 76, 77, 78, 79, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172,
    173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191,
    384, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, 402,
    403, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, 421,
    422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440,
    441, 442, 443, 444, 445, 446, 447, 896, 897, 898, 899, 900, 901, 902, 903, 904, 905, 906, 907,
    908, 909, 910, 911, 912, 913, 914, 915, 916, 917, 918, 919, 920, 921, 922, 923, 924, 925, 926,
    927, 928, 929, 930, 931, 932, 933, 934, 935, 936, 937, 938, 939, 940, 941, 942, 943, 944, 945,
    946, 947, 948, 949, 950, 951, 952, 953, 954, 955, 956, 957, 958, 959, 960, 961, 962, 963, 964,
    965, 966, 967, 968, 969, 970, 971, 972, 973, 974, 975, 976, 977, 978, 979, 980, 981, 982, 983,
    984, 985, 986, 987, 988, 989, 990, 991, 992, 993, 994, 995, 996, 997, 998, 999, 1000, 1001,
    1002, 1003, 1004, 1005, 1006, 1007, 1008, 1009, 1010, 1011, 1012, 1013, 1014, 1015, 1016, 1017,
    1018, 1019, 1020, 1021, 1022, 1023, 1024, 1025, 1026, 1027, 1028, 1029, 1030, 1031, 1032, 1033,
    1034, 1035, 1036, 1037, 1038, 1039, 1040, 1041, 1042, 1043, 1044, 1045, 1046, 1047, 1048, 1049,
    1050, 1051, 1052, 1053, 1054, 1055, 1056, 1057, 1058, 1059, 1060, 1061, 1062, 1063, 1064, 1065,
    1066, 1067, 1068, 1069, 1070, 1071, 1072, 1073, 1074, 1075, 1076, 1077, 1078, 1079, 1080, 1081,
    1082, 1083, 1084, 1085, 1086, 1087, 1088, 1089, 1090, 1091, 1092, 1093, 1094, 1095, 1096, 1097,
    1098, 1099, 1100, 1101, 1102, 1103, 1104, 1105, 1106, 1107, 1108, 1109, 1110, 1111, 1112, 1113,
    1114, 1115, 1116, 1117, 1118, 1119, 1120, 1121, 1122, 1123, 1124, 1125, 1126, 1127, 1128, 1129,
    1130, 1131, 1132, 1133, 1134, 1135, 1136, 1137, 1138, 1139, 1140, 1141, 1142, 1143, 1144, 1145,
    1146, 1147, 1148, 1149, 1150, 1151, 1152, 1153, 1154, 1155, 1156, 1157, 1158, 1159, 1160, 1161,
    1162, 1163, 1164, 1165, 1166, 1167, 1168, 1169, 1170, 1171, 1172, 1173, 1174, 1175, 1176, 1177,
    1178, 1179, 1180, 1181, 1182, 1183, 1184, 1185, 1186, 1187, 1188, 1189, 1190, 1191, 1192, 1193,
    1194, 1195, 1196, 1197, 1198, 1199, 1200, 1201, 1202, 1203, 1204, 1205, 1206, 1207, 1208, 1209,
    1210, 1211, 1212, 1213, 1214, 1215, 1216, 1217, 1218, 1219, 1220, 1221, 1222, 1223, 1224, 1225,
    1226, 1227, 1228, 1229, 1230, 1231, 1232, 1233, 1234, 1235, 1236, 1237, 1238, 1239, 1240, 1241,
    1242, 1243, 1244, 1245, 1246, 1247, 1248, 1249, 1250, 1251, 1252, 1253, 1254, 1255, 1256, 1257,
    1258, 1259, 1260, 1261, 1262, 1263, 1264, 1265, 1266, 1267, 1268, 1269, 1270, 1271, 1272, 1273,
    1274, 1275, 1276, 1277, 1278, 1279, 2560, 2561, 2562, 2563, 2564, 2565, 2566, 2567, 2568, 2569,
    2570, 2571, 2572, 2573, 2574, 2575, 2576, 2577, 2578, 2579, 2580, 2581, 2582, 2583, 2584, 2585,
    2586, 2587, 2588, 2589, 2590, 2591, 2592, 2593, 2594, 2595, 2596, 2597, 2598, 2599, 2600, 2601,
    2602, 2603, 2604, 2605, 2606, 2607, 2608, 2609, 2610, 2611, 2612, 2613, 2614, 2615, 2616, 2617,
    2618, 2619, 2620, 2621, 2622, 2623, 2624, 2625, 2626, 2627, 2628, 2629, 2630, 2631, 2632, 2633,
    2634, 2635, 2636, 2637, 2638, 2639, 2640, 2641, 2642, 2643, 2644, 2645, 2646, 2647, 2648, 2649,
    2650, 2651, 2652, 2653, 2654, 2655, 2656, 2657, 2658, 2659, 2660, 2661, 2662, 2663, 2664, 2665,
    2666, 2667, 2668, 2669, 2670, 2671, 2672, 2673, 2674, 2675, 2676, 2677, 2678, 2679, 2680, 2681,
    2682, 2683, 2684, 2685, 2686, 2687, 2688, 2689, 2690, 2691, 2692, 2693, 2694, 2695, 2696, 2697,
    2698, 2699, 2700, 2701, 2702, 2703, 2704, 2705, 2706, 2707, 2708, 2709, 2710, 2711, 2712, 2713,
    2714, 2715, 2716, 2717, 2718, 2719, 2720, 2721, 2722, 2723, 2724, 2725, 2726, 2727, 2728, 2729,
    2730, 2731, 2732, 2733, 2734, 2735, 2736, 2737, 2738, 2739, 2740, 2741, 2742, 2743, 2744, 2745,
    2746, 2747, 2748, 2749, 2750, 2751, 2752, 2753, 2754, 2755, 2756, 2757, 2758, 2759, 2760, 2761,
    2762, 2763, 2764, 2765, 2766, 2767, 2768, 2769, 2770, 2771, 2772, 2773, 2774, 2775, 2776, 2777,
    2778, 2779, 2780, 2781, 2782, 2783, 2784, 2785, 2786, 2787, 2788, 2789, 2790, 2791, 2792, 2793,
    2794, 2795, 2796, 2797, 2798, 2799, 2800, 2801, 2802, 2803, 2804, 2805, 2806, 2807, 2808, 2809,
    2810, 2811, 2812, 2813, 2814, 2815, 2816, 2817, 2818, 2819, 2820, 2821, 2822, 2823, 2824, 2825,
    2826, 2827, 2828, 2829, 2830, 2831, 2832, 2833, 2834, 2835, 2836, 2837, 2838, 2839, 2840, 2841,
    2842, 2843, 2844, 2845, 2846, 2847, 2848, 2849, 2850, 2851, 2852, 2853, 2854, 2855, 2856, 2857,
    2858, 2859, 2860, 2861, 2862, 2863, 2864, 2865, 2866, 2867, 2868, 2869, 2870, 2871, 2872, 2873,
    2874, 2875, 2876, 2877, 2878, 2879, 2880, 2881, 2882, 2883, 2884, 2885, 2886, 2887, 2888, 2889,
    2890, 2891, 2892, 2893, 2894, 2895, 2896, 2897, 2898, 2899, 2900, 2901, 2902, 2903, 2904, 2905,
    2906, 2907, 2908, 2909, 2910, 2911, 2912, 2913, 2914, 2915, 2916, 2917, 2918, 2919, 2920, 2921,
    2922, 2923, 2924, 2925, 2926, 2927, 2928, 2929, 2930, 2931, 2932, 2933, 2934, 2935, 2936, 2937,
    2938, 2939, 2940, 2941, 2942, 2943, 2944, 2945, 2946, 2947, 2948, 2949, 2950, 2951, 2952, 2953,
    2954, 2955, 2956, 2957, 2958, 2959, 2960, 2961, 2962, 2963, 2964, 2965, 2966, 2967, 2968, 2969,
    2970, 2971, 2972, 2973, 2974, 2975, 2976, 2977, 2978, 2979, 2980, 2981, 2982, 2983, 2984, 2985,
    2986, 2987, 2988, 2989, 2990, 2991, 2992, 2993, 2994, 2995, 2996, 2997, 2998, 2999, 3000, 3001,
    3002, 3003, 3004, 3005, 3006, 3007, 3008, 3009, 3010, 3011, 3012, 3013, 3014, 3015, 3016, 3017,
    3018, 3019, 3020, 3021, 3022, 3023, 3024, 3025, 3026, 3027, 3028, 3029, 3030, 3031, 3032, 3033,
    3034, 3035, 3036, 3037, 3038, 3039, 3040, 3041, 3042, 3043, 3044, 3045, 3046, 3047, 3048, 3049,
    3050, 3051, 3052, 3053, 3054, 3055, 3056, 3057, 3058, 3059, 3060, 3061, 3062, 3063, 3064, 3065,
    3066, 3067, 3068, 3069, 3070, 3071, 6144,
];
/// Table used to speed up the writing of pi codes
pub const WRITE_LEN_BE: &[u16] = &[
    3, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9,
    9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11,
    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14,
    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
    15,
];
/// Table used to speed up the writing of pi codes
pub const WRITE_LE: &[u16] = &[
    1, 3, 11, 5, 13, 21, 29, 7, 15, 23, 31, 39, 47, 55, 63, 2, 18, 34, 50, 66, 82, 98, 114, 130,
    146, 162, 178, 194, 210, 226, 242, 6, 22, 38, 54, 70, 86, 102, 118, 134, 150, 166, 182, 198,
    214, 230, 246, 262, 278, 294, 310, 326, 342, 358, 374, 390, 406, 422, 438, 454, 470, 486, 502,
    10, 26, 42, 58, 74, 90, 106, 122, 138, 154, 170, 186, 202, 218, 234, 250, 266, 282, 298, 314,
    330, 346, 362, 378, 394, 410, 426, 442, 458, 474, 490, 506, 522, 538, 554, 570, 586, 602, 618,
    634, 650, 666, 682, 698, 714, 730, 746, 762, 778, 794, 810, 826, 842, 858, 874, 890, 906, 922,
    938, 954, 970, 986, 1002, 1018, 14, 30, 46, 62, 78, 94, 110, 126, 142, 158, 174, 190, 206, 222,
    238, 254, 270, 286, 302, 318, 334, 350, 366, 382, 398, 414, 430, 446, 462, 478, 494, 510, 526,
    542, 558, 574, 590, 606, 622, 638, 654, 670, 686, 702, 718, 734, 750, 766, 782, 798, 814, 830,
    846, 862, 878, 894, 910, 926, 942, 958, 974, 990, 1006, 1022, 1038, 1054, 1070, 1086, 1102,
    1118, 1134, 1150, 1166, 1182, 1198, 1214, 1230, 1246, 1262, 1278, 1294, 1310, 1326, 1342, 1358,
    1374, 1390, 1406, 1422, 1438, 1454, 1470, 1486, 1502, 1518, 1534, 1550, 1566, 1582, 1598, 1614,
    1630, 1646, 1662, 1678, 1694, 1710, 1726, 1742, 1758, 1774, 1790, 1806, 1822, 1838, 1854, 1870,
    1886, 1902, 1918, 1934, 1950, 1966, 1982, 1998, 2014, 2030, 2046, 4, 36, 68, 100, 132, 164,
    196, 228, 260, 292, 324, 356, 388, 420, 452, 484, 516, 548, 580, 612, 644, 676, 708, 740, 772,
    804, 836, 868, 900, 932, 964, 996, 1028, 1060, 1092, 1124, 1156, 1188, 1220, 1252, 1284, 1316,
    1348, 1380, 1412, 1444, 1476, 1508, 1540, 1572, 1604, 1636, 1668, 1700, 1732, 1764, 1796, 1828,
    1860, 1892, 1924, 1956, 1988, 2020, 2052, 2084, 2116, 2148, 2180, 2212, 2244, 2276, 2308, 2340,
    2372, 2404, 2436, 2468, 2500, 2532, 2564, 2596, 2628, 2660, 2692, 2724, 2756, 2788, 2820, 2852,
    2884, 2916, 2948, 2980, 3012, 3044, 3076, 3108, 3140, 3172, 3204, 3236, 3268, 3300, 3332, 3364,
    3396, 3428, 3460, 3492, 3524, 3556, 3588, 3620, 3652, 3684, 3716, 3748, 3780, 3812, 3844, 3876,
    3908, 3940, 3972, 4004, 4036, 4068, 4100, 4132, 4164, 4196, 4228, 4260, 4292, 4324, 4356, 4388,
    4420, 4452, 4484, 4516, 4548, 4580, 4612, 4644, 4676, 4708, 4740, 4772, 4804, 4836, 4868, 4900,
    4932, 4964, 4996, 5028, 5060, 5092, 5124, 5156, 5188, 5220, 5252, 5284, 5316, 5348, 5380, 5412,
    5444, 5476, 5508, 5540, 5572, 5604, 5636, 5668, 5700, 5732, 5764, 5796, 5828, 5860, 5892, 5924,
    5956, 5988, 6020, 6052, 6084, 6116, 6148, 6180, 6212, 6244, 6276, 6308, 6340, 6372, 6404, 6436,
    6468, 6500, 6532, 6564, 6596, 6628, 6660, 6692, 6724, 6756, 6788, 6820, 6852, 6884, 6916, 6948,
    6980, 7012, 7044, 7076, 7108, 7140, 7172, 7204, 7236, 7268, 7300, 7332, 7364, 7396, 7428, 7460,
    7492, 7524, 7556, 7588, 7620, 7652, 7684, 7716, 7748, 7780, 7812, 7844, 7876, 7908, 7940, 7972,
    8004, 8036, 8068, 8100, 8132, 8164, 12, 44, 76, 108, 140, 172, 204, 236, 268, 300, 332, 364,
    396, 428, 460, 492, 524, 556, 588, 620, 652, 684, 716, 748, 780, 812, 844, 876, 908, 940, 972,
    1004, 1036, 1068, 1100, 1132, 1164, 1196, 1228, 1260, 1292, 1324, 1356, 1388, 1420, 1452, 1484,
    1516, 1548, 1580, 1612, 1644, 1676, 1708, 1740, 1772, 1804, 1836, 1868, 1900, 1932, 1964, 1996,
    2028, 2060, 2092, 2124, 2156, 2188, 2220, 2252, 2284, 2316, 2348, 2380, 2412, 2444, 2476, 2508,
    2540, 2572, 2604, 2636, 2668, 2700, 2732, 2764, 2796, 2828, 2860, 2892, 2924, 2956, 2988, 3020,
    3052, 3084, 3116, 3148, 3180, 3212, 3244, 3276, 3308, 3340, 3372, 3404, 3436, 3468, 3500, 3532,
    3564, 3596, 3628, 3660, 3692, 3724, 3756, 3788, 3820, 3852, 3884, 3916, 3948, 3980, 4012, 4044,
    4076, 4108, 4140, 4172, 4204, 4236, 4268, 4300, 4332, 4364, 4396, 4428, 4460, 4492, 4524, 4556,
    4588, 4620, 4652, 4684, 4716, 4748, 4780, 4812, 4844, 4876, 4908, 4940, 4972, 5004, 5036, 5068,
    5100, 5132, 5164, 5196, 5228, 5260, 5292, 5324, 5356, 5388, 5420, 5452, 5484, 5516, 5548, 5580,
    5612, 5644, 5676, 5708, 5740, 5772, 5804, 5836, 5868, 5900, 5932, 5964, 5996, 6028, 6060, 6092,
    6124, 6156, 6188, 6220, 6252, 6284, 6316, 6348, 6380, 6412, 6444, 6476, 6508, 6540, 6572, 6604,
    6636, 6668, 6700, 6732, 6764, 6796, 6828, 6860, 6892, 6924, 6956, 6988, 7020, 7052, 7084, 7116,
    7148, 7180, 7212, 7244, 7276, 7308, 7340, 7372, 7404, 7436, 7468, 7500, 7532, 7564, 7596, 7628,
    7660, 7692, 7724, 7756, 7788, 7820, 7852, 7884, 7916, 7948, 7980, 8012, 8044, 8076, 8108, 8140,
    8172, 8204, 8236, 8268, 8300, 8332, 8364, 8396, 8428, 8460, 8492, 8524, 8556, 8588, 8620, 8652,
    8684, 8716, 8748, 8780, 8812, 8844, 8876, 8908, 8940, 8972, 9004, 9036, 9068, 9100, 9132, 9164,
    9196, 9228, 9260, 9292, 9324, 9356, 9388, 9420, 9452, 9484, 9516, 9548, 9580, 9612, 9644, 9676,
    9708, 9740, 9772, 9804, 9836, 9868, 9900, 9932, 9964, 9996, 10028, 10060, 10092, 10124, 10156,
    10188, 10220, 10252, 10284, 10316, 10348, 10380, 10412, 10444, 10476, 10508, 10540, 10572,
    10604, 10636, 10668, 10700, 10732, 10764, 10796, 10828, 10860, 10892, 10924, 10956, 10988,
    11020, 11052, 11084, 11116, 11148, 11180, 11212, 11244, 11276, 11308, 11340, 11372, 11404,
    11436, 11468, 11500, 11532, 11564, 11596, 11628, 11660, 11692, 11724, 11756, 11788, 11820,
    11852, 11884, 11916, 11948, 11980, 12012, 12044, 12076, 12108, 12140, 12172, 12204, 12236,
    12268, 12300, 12332, 12364, 12396, 12428, 12460, 12492, 12524, 12556, 12588, 12620, 12652,
    12684, 12716, 12748, 12780, 12812, 12844, 12876, 12908, 12940, 12972, 13004, 13036, 13068,
    13100, 13132, 13164, 13196, 13228, 13260, 13292, 13324, 13356, 13388, 13420, 13452, 13484,
    13516, 13548, 13580, 13612, 13644, 13676, 13708, 13740, 13772, 13804, 13836, 13868, 13900,
    13932, 13964, 13996, 14028, 14060, 14092, 14124, 14156, 14188, 14220, 14252, 14284, 14316,
    14348, 14380, 14412, 14444, 14476, 14508, 14540, 14572, 14604, 14636, 14668, 14700, 14732,
    14764, 14796, 14828, 14860, 14892, 14924, 14956, 14988, 15020, 15052, 15084, 15116, 15148,
    15180, 15212, 15244, 15276, 15308, 15340, 15372, 15404, 15436, 15468, 15500, 15532, 15564,
    15596, 15628, 15660, 15692, 15724, 15756, 15788, 15820, 15852, 15884, 15916, 15948, 15980,
    16012, 16044, 16076, 16108, 16140, 16172, 16204, 16236, 16268, 16300, 16332, 16364, 20,
];
/// Table used to speed up the writing of pi codes
pub const WRITE_LEN_LE: &[u16] = &[
    3, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9,
    9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11,
    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14,
    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
    15,
];
/// Table used to speed up the skipping of pi codes
pub const LEN: &[u8] = &[
    3, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9,
    9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11,
    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14,
    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
    15,
];
/// Asserts at compile time that `peek_bits` is large enough for these tables.
pub const fn check_read_table(peek_bits: usize) {
    assert!(
        peek_bits >= READ_BITS,
        "BitRead peek word too small for pi code read tables (10 bits required)"
    );
}