1#![no_std]
147#![cfg_attr(docsrs, feature(doc_cfg))]
148
149#[cfg(feature = "alloc")]
150extern crate alloc;
151#[cfg(feature = "std")]
152extern crate std;
153
154#[cfg(feature = "alloc")]
155use alloc::borrow::{Cow, ToOwned};
156#[cfg(feature = "alloc")]
157use alloc::string::String;
158#[cfg(feature = "alloc")]
159use alloc::vec;
160#[cfg(feature = "alloc")]
161use alloc::vec::Vec;
162use core::convert::TryInto;
163use core::debug_assert as safety_assert;
164
165macro_rules! check {
166 ($e: expr, $c: expr) => {
167 if !$c {
168 return Err($e);
169 }
170 };
171}
172
173trait Static<T: Copy>: Copy {
174 fn val(self) -> T;
175}
176
177macro_rules! define {
178 ($name: ident: $type: ty = $val: expr) => {
179 #[derive(Copy, Clone)]
180 struct $name;
181 impl Static<$type> for $name {
182 fn val(self) -> $type {
183 $val
184 }
185 }
186 };
187}
188
189define!(Bf: bool = false);
190define!(Bt: bool = true);
191define!(N1: usize = 1);
192define!(N2: usize = 2);
193define!(N3: usize = 3);
194define!(N4: usize = 4);
195define!(N5: usize = 5);
196define!(N6: usize = 6);
197
198#[derive(Copy, Clone)]
199struct On;
200
201impl<T: Copy> Static<Option<T>> for On {
202 fn val(self) -> Option<T> {
203 None
204 }
205}
206
207#[derive(Copy, Clone)]
208struct Os<T>(T);
209
210impl<T: Copy> Static<Option<T>> for Os<T> {
211 fn val(self) -> Option<T> {
212 Some(self.0)
213 }
214}
215
216macro_rules! dispatch {
217 (let $var: ident: bool = $val: expr; $($body: tt)*) => {
218 if $val {
219 let $var = Bt; dispatch!($($body)*)
220 } else {
221 let $var = Bf; dispatch!($($body)*)
222 }
223 };
224 (let $var: ident: usize = $val: expr; $($body: tt)*) => {
225 match $val {
226 1 => { let $var = N1; dispatch!($($body)*) },
227 2 => { let $var = N2; dispatch!($($body)*) },
228 3 => { let $var = N3; dispatch!($($body)*) },
229 4 => { let $var = N4; dispatch!($($body)*) },
230 5 => { let $var = N5; dispatch!($($body)*) },
231 6 => { let $var = N6; dispatch!($($body)*) },
232 _ => panic!(),
233 }
234 };
235 (let $var: ident: Option<$type: ty> = $val: expr; $($body: tt)*) => {
236 match $val {
237 None => { let $var = On; dispatch!($($body)*) },
238 Some(x) => { let $var = Os(x); dispatch!($($body)*) },
239 }
240 };
241 ($body: expr) => { $body };
242}
243
244fn chunk_unchecked<T>(x: &[T], n: usize, i: usize) -> &[T] {
245 safety_assert!((i + 1) * n <= x.len());
246 unsafe { core::slice::from_raw_parts(x.as_ptr().add(n * i), n) }
248}
249
250fn chunk_mut_unchecked<T>(x: &mut [T], n: usize, i: usize) -> &mut [T] {
251 safety_assert!((i + 1) * n <= x.len());
252 unsafe { core::slice::from_raw_parts_mut(x.as_mut_ptr().add(n * i), n) }
254}
255
256fn div_ceil(x: usize, m: usize) -> usize {
257 (x + m - 1) / m
258}
259
260fn floor(x: usize, m: usize) -> usize {
261 x / m * m
262}
263
264#[inline]
265fn vectorize<F: FnMut(usize)>(n: usize, bs: usize, mut f: F) {
266 for k in 0 .. n / bs {
267 for i in k * bs .. (k + 1) * bs {
268 f(i);
269 }
270 }
271 for i in floor(n, bs) .. n {
272 f(i);
273 }
274}
275
276#[derive(Debug, Copy, Clone, PartialEq, Eq)]
278pub enum DecodeKind {
279 Length,
281
282 Symbol,
284
285 Trailing,
287
288 Padding,
290}
291
292impl core::fmt::Display for DecodeKind {
293 fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
294 let description = match self {
295 DecodeKind::Length => "invalid length",
296 DecodeKind::Symbol => "invalid symbol",
297 DecodeKind::Trailing => "non-zero trailing bits",
298 DecodeKind::Padding => "invalid padding length",
299 };
300 write!(f, "{}", description)
301 }
302}
303
304#[derive(Debug, Copy, Clone, PartialEq, Eq)]
306pub struct DecodeError {
307 pub position: usize,
311
312 pub kind: DecodeKind,
314}
315
316#[cfg(feature = "std")]
317impl std::error::Error for DecodeError {}
318
319impl core::fmt::Display for DecodeError {
320 fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
321 write!(f, "{} at {}", self.kind, self.position)
322 }
323}
324
325#[derive(Debug, Copy, Clone, PartialEq, Eq)]
327pub struct DecodePartial {
328 pub read: usize,
332
333 pub written: usize,
337
338 pub error: DecodeError,
340}
341
342const INVALID: u8 = 128;
343const IGNORE: u8 = 129;
344const PADDING: u8 = 130;
345
346fn order(msb: bool, n: usize, i: usize) -> usize {
347 if msb {
348 n - 1 - i
349 } else {
350 i
351 }
352}
353
354#[inline]
355fn enc(bit: usize) -> usize {
356 match bit {
357 1 | 2 | 4 => 1,
358 3 | 6 => 3,
359 5 => 5,
360 _ => unreachable!(),
361 }
362}
363
364#[inline]
365fn dec(bit: usize) -> usize {
366 enc(bit) * 8 / bit
367}
368
369fn encode_len<B: Static<usize>>(bit: B, len: usize) -> usize {
370 div_ceil(8 * len, bit.val())
371}
372
373fn encode_block<B: Static<usize>, M: Static<bool>>(
374 bit: B, msb: M, symbols: &[u8; 256], input: &[u8], output: &mut [u8],
375) {
376 debug_assert!(input.len() <= enc(bit.val()));
377 debug_assert_eq!(output.len(), encode_len(bit, input.len()));
378 let bit = bit.val();
379 let msb = msb.val();
380 let mut x = 0u64;
381 for (i, input) in input.iter().enumerate() {
382 x |= u64::from(*input) << (8 * order(msb, enc(bit), i));
383 }
384 for (i, output) in output.iter_mut().enumerate() {
385 let y = x >> (bit * order(msb, dec(bit), i));
386 *output = symbols[(y & 0xff) as usize];
387 }
388}
389
390fn encode_mut<B: Static<usize>, M: Static<bool>>(
391 bit: B, msb: M, symbols: &[u8; 256], input: &[u8], output: &mut [u8],
392) {
393 debug_assert_eq!(output.len(), encode_len(bit, input.len()));
394 let enc = enc(bit.val());
395 let dec = dec(bit.val());
396 let n = input.len() / enc;
397 let bs = match bit.val() {
398 5 => 2,
399 6 => 4,
400 _ => 1,
401 };
402 vectorize(n, bs, |i| {
403 let input = chunk_unchecked(input, enc, i);
404 let output = chunk_mut_unchecked(output, dec, i);
405 encode_block(bit, msb, symbols, input, output);
406 });
407 encode_block(bit, msb, symbols, &input[enc * n ..], &mut output[dec * n ..]);
408}
409
410fn decode_block<B: Static<usize>, M: Static<bool>>(
413 bit: B, msb: M, values: &[u8; 256], input: &[u8], output: &mut [u8],
414) -> Result<(), usize> {
415 debug_assert!(output.len() <= enc(bit.val()));
416 debug_assert_eq!(input.len(), encode_len(bit, output.len()));
417 let bit = bit.val();
418 let msb = msb.val();
419 let mut x = 0u64;
420 for j in 0 .. input.len() {
421 let y = values[input[j] as usize];
422 check!(j, y < 1 << bit);
423 x |= u64::from(y) << (bit * order(msb, dec(bit), j));
424 }
425 for (j, output) in output.iter_mut().enumerate() {
426 *output = ((x >> (8 * order(msb, enc(bit), j))) & 0xff) as u8;
427 }
428 Ok(())
429}
430
431fn decode_mut<B: Static<usize>, M: Static<bool>>(
435 bit: B, msb: M, values: &[u8; 256], input: &[u8], output: &mut [u8],
436) -> Result<(), usize> {
437 debug_assert_eq!(input.len(), encode_len(bit, output.len()));
438 let enc = enc(bit.val());
439 let dec = dec(bit.val());
440 let n = input.len() / dec;
441 for i in 0 .. n {
442 let input = chunk_unchecked(input, dec, i);
443 let output = chunk_mut_unchecked(output, enc, i);
444 decode_block(bit, msb, values, input, output).map_err(|e| dec * i + e)?;
445 }
446 decode_block(bit, msb, values, &input[dec * n ..], &mut output[enc * n ..])
447 .map_err(|e| dec * n + e)
448}
449
450fn check_trail<B: Static<usize>, M: Static<bool>>(
452 bit: B, msb: M, ctb: bool, values: &[u8; 256], input: &[u8],
453) -> Result<(), ()> {
454 if 8 % bit.val() == 0 || !ctb {
455 return Ok(());
456 }
457 let trail = bit.val() * input.len() % 8;
458 if trail == 0 {
459 return Ok(());
460 }
461 let mut mask = (1 << trail) - 1;
462 if !msb.val() {
463 mask <<= bit.val() - trail;
464 }
465 check!((), values[input[input.len() - 1] as usize] & mask == 0);
466 Ok(())
467}
468
469fn check_pad<B: Static<usize>>(bit: B, values: &[u8; 256], input: &[u8]) -> Result<usize, usize> {
472 let bit = bit.val();
473 debug_assert_eq!(input.len(), dec(bit));
474 let is_pad = |x: &&u8| values[**x as usize] == PADDING;
475 let count = input.iter().rev().take_while(is_pad).count();
476 let len = input.len() - count;
477 check!(len, len > 0 && bit * len % 8 < bit);
478 Ok(len)
479}
480
481fn encode_base_len<B: Static<usize>>(bit: B, len: usize) -> usize {
482 encode_len(bit, len)
483}
484
485fn encode_base<B: Static<usize>, M: Static<bool>>(
486 bit: B, msb: M, symbols: &[u8; 256], input: &[u8], output: &mut [u8],
487) {
488 debug_assert_eq!(output.len(), encode_base_len(bit, input.len()));
489 encode_mut(bit, msb, symbols, input, output);
490}
491
492fn encode_pad_len<B: Static<usize>, P: Static<Option<u8>>>(bit: B, pad: P, len: usize) -> usize {
493 match pad.val() {
494 None => encode_base_len(bit, len),
495 Some(_) => div_ceil(len, enc(bit.val())) * dec(bit.val()),
496 }
497}
498
499fn encode_pad<B: Static<usize>, M: Static<bool>, P: Static<Option<u8>>>(
500 bit: B, msb: M, symbols: &[u8; 256], spad: P, input: &[u8], output: &mut [u8],
501) {
502 let pad = match spad.val() {
503 None => return encode_base(bit, msb, symbols, input, output),
504 Some(pad) => pad,
505 };
506 debug_assert_eq!(output.len(), encode_pad_len(bit, spad, input.len()));
507 let olen = encode_base_len(bit, input.len());
508 encode_base(bit, msb, symbols, input, &mut output[.. olen]);
509 for output in output.iter_mut().skip(olen) {
510 *output = pad;
511 }
512}
513
514fn encode_wrap_len<
515 'a,
516 B: Static<usize>,
517 P: Static<Option<u8>>,
518 W: Static<Option<(usize, &'a [u8])>>,
519>(
520 bit: B, pad: P, wrap: W, ilen: usize,
521) -> usize {
522 let olen = encode_pad_len(bit, pad, ilen);
523 match wrap.val() {
524 None => olen,
525 Some((col, end)) => olen + end.len() * div_ceil(olen, col),
526 }
527}
528
529fn encode_wrap_mut<
530 'a,
531 B: Static<usize>,
532 M: Static<bool>,
533 P: Static<Option<u8>>,
534 W: Static<Option<(usize, &'a [u8])>>,
535>(
536 bit: B, msb: M, symbols: &[u8; 256], pad: P, wrap: W, input: &[u8], output: &mut [u8],
537) {
538 let (col, end) = match wrap.val() {
539 None => return encode_pad(bit, msb, symbols, pad, input, output),
540 Some((col, end)) => (col, end),
541 };
542 debug_assert_eq!(output.len(), encode_wrap_len(bit, pad, wrap, input.len()));
543 debug_assert_eq!(col % dec(bit.val()), 0);
544 let col = col / dec(bit.val());
545 let enc = col * enc(bit.val());
546 let dec = col * dec(bit.val()) + end.len();
547 let olen = dec - end.len();
548 let n = input.len() / enc;
549 for i in 0 .. n {
550 let input = chunk_unchecked(input, enc, i);
551 let output = chunk_mut_unchecked(output, dec, i);
552 encode_base(bit, msb, symbols, input, &mut output[.. olen]);
553 output[olen ..].copy_from_slice(end);
554 }
555 if input.len() > enc * n {
556 let olen = dec * n + encode_pad_len(bit, pad, input.len() - enc * n);
557 encode_pad(bit, msb, symbols, pad, &input[enc * n ..], &mut output[dec * n .. olen]);
558 output[olen ..].copy_from_slice(end);
559 }
560}
561
562fn decode_wrap_len<B: Static<usize>, P: Static<bool>>(
564 bit: B, pad: P, len: usize,
565) -> (usize, usize) {
566 let bit = bit.val();
567 if pad.val() {
568 (floor(len, dec(bit)), len / dec(bit) * enc(bit))
569 } else {
570 let trail = bit * len % 8;
571 (len - trail / bit, bit * len / 8)
572 }
573}
574
575fn decode_pad_len<B: Static<usize>, P: Static<bool>>(
578 bit: B, pad: P, len: usize,
579) -> Result<usize, DecodeError> {
580 let (ilen, olen) = decode_wrap_len(bit, pad, len);
581 check!(DecodeError { position: ilen, kind: DecodeKind::Length }, ilen == len);
582 Ok(olen)
583}
584
585fn decode_base_len<B: Static<usize>>(bit: B, len: usize) -> Result<usize, DecodeError> {
588 decode_pad_len(bit, Bf, len)
589}
590
591fn decode_base_mut<B: Static<usize>, M: Static<bool>>(
595 bit: B, msb: M, ctb: bool, values: &[u8; 256], input: &[u8], output: &mut [u8],
596) -> Result<usize, DecodePartial> {
597 debug_assert_eq!(Ok(output.len()), decode_base_len(bit, input.len()));
598 let fail = |pos, kind| DecodePartial {
599 read: pos / dec(bit.val()) * dec(bit.val()),
600 written: pos / dec(bit.val()) * enc(bit.val()),
601 error: DecodeError { position: pos, kind },
602 };
603 decode_mut(bit, msb, values, input, output).map_err(|pos| fail(pos, DecodeKind::Symbol))?;
604 check_trail(bit, msb, ctb, values, input)
605 .map_err(|()| fail(input.len() - 1, DecodeKind::Trailing))?;
606 Ok(output.len())
607}
608
609fn decode_pad_mut<B: Static<usize>, M: Static<bool>, P: Static<bool>>(
615 bit: B, msb: M, ctb: bool, values: &[u8; 256], pad: P, input: &[u8], output: &mut [u8],
616) -> Result<usize, DecodePartial> {
617 if !pad.val() {
618 return decode_base_mut(bit, msb, ctb, values, input, output);
619 }
620 debug_assert_eq!(Ok(output.len()), decode_pad_len(bit, pad, input.len()));
621 let enc = enc(bit.val());
622 let dec = dec(bit.val());
623 let mut inpos = 0;
624 let mut outpos = 0;
625 let mut outend = output.len();
626 while inpos < input.len() {
627 match decode_base_mut(
628 bit,
629 msb,
630 ctb,
631 values,
632 &input[inpos ..],
633 &mut output[outpos .. outend],
634 ) {
635 Ok(written) => {
636 if cfg!(debug_assertions) {
637 inpos = input.len();
638 }
639 outpos += written;
640 break;
641 }
642 Err(partial) => {
643 inpos += partial.read;
644 outpos += partial.written;
645 }
646 }
647 let inlen =
648 check_pad(bit, values, &input[inpos .. inpos + dec]).map_err(|pos| DecodePartial {
649 read: inpos,
650 written: outpos,
651 error: DecodeError { position: inpos + pos, kind: DecodeKind::Padding },
652 })?;
653 let outlen = decode_base_len(bit, inlen).unwrap();
654 let written = decode_base_mut(
655 bit,
656 msb,
657 ctb,
658 values,
659 &input[inpos .. inpos + inlen],
660 &mut output[outpos .. outpos + outlen],
661 )
662 .map_err(|partial| {
663 debug_assert_eq!(partial.read, 0);
664 debug_assert_eq!(partial.written, 0);
665 DecodePartial {
666 read: inpos,
667 written: outpos,
668 error: DecodeError {
669 position: inpos + partial.error.position,
670 kind: partial.error.kind,
671 },
672 }
673 })?;
674 debug_assert_eq!(written, outlen);
675 inpos += dec;
676 outpos += outlen;
677 outend -= enc - outlen;
678 }
679 debug_assert_eq!(inpos, input.len());
680 debug_assert_eq!(outpos, outend);
681 Ok(outend)
682}
683
684fn skip_ignore(values: &[u8; 256], input: &[u8], mut inpos: usize) -> usize {
685 while inpos < input.len() && values[input[inpos] as usize] == IGNORE {
686 inpos += 1;
687 }
688 inpos
689}
690
691fn decode_wrap_block<B: Static<usize>, M: Static<bool>, P: Static<bool>>(
698 bit: B, msb: M, ctb: bool, values: &[u8; 256], pad: P, input: &[u8], output: &mut [u8],
699) -> Result<(usize, usize), DecodeError> {
700 let dec = dec(bit.val());
701 let mut buf = [0u8; 8];
702 let mut shift = [0usize; 8];
703 let mut bufpos = 0;
704 let mut inpos = 0;
705 while bufpos < dec {
706 inpos = skip_ignore(values, input, inpos);
707 if inpos == input.len() {
708 break;
709 }
710 shift[bufpos] = inpos;
711 buf[bufpos] = input[inpos];
712 bufpos += 1;
713 inpos += 1;
714 }
715 let olen = decode_pad_len(bit, pad, bufpos).map_err(|mut e| {
716 e.position = shift[e.position];
717 e
718 })?;
719 let written = decode_pad_mut(bit, msb, ctb, values, pad, &buf[.. bufpos], &mut output[.. olen])
720 .map_err(|partial| {
721 debug_assert_eq!(partial.read, 0);
722 debug_assert_eq!(partial.written, 0);
723 DecodeError { position: shift[partial.error.position], kind: partial.error.kind }
724 })?;
725 Ok((inpos, written))
726}
727
728#[allow(clippy::too_many_arguments)]
735fn decode_wrap_mut<B: Static<usize>, M: Static<bool>, P: Static<bool>, I: Static<bool>>(
736 bit: B, msb: M, ctb: bool, values: &[u8; 256], pad: P, has_ignore: I, input: &[u8],
737 output: &mut [u8],
738) -> Result<usize, DecodePartial> {
739 if !has_ignore.val() {
740 return decode_pad_mut(bit, msb, ctb, values, pad, input, output);
741 }
742 debug_assert_eq!(output.len(), decode_wrap_len(bit, pad, input.len()).1);
743 let mut inpos = 0;
744 let mut outpos = 0;
745 while inpos < input.len() {
746 let (inlen, outlen) = decode_wrap_len(bit, pad, input.len() - inpos);
747 match decode_pad_mut(
748 bit,
749 msb,
750 ctb,
751 values,
752 pad,
753 &input[inpos .. inpos + inlen],
754 &mut output[outpos .. outpos + outlen],
755 ) {
756 Ok(written) => {
757 inpos += inlen;
758 outpos += written;
759 break;
760 }
761 Err(partial) => {
762 inpos += partial.read;
763 outpos += partial.written;
764 }
765 }
766 let (ipos, opos) =
767 decode_wrap_block(bit, msb, ctb, values, pad, &input[inpos ..], &mut output[outpos ..])
768 .map_err(|mut error| {
769 error.position += inpos;
770 DecodePartial { read: inpos, written: outpos, error }
771 })?;
772 inpos += ipos;
773 outpos += opos;
774 }
775 let inpos = skip_ignore(values, input, inpos);
776 if inpos == input.len() {
777 Ok(outpos)
778 } else {
779 Err(DecodePartial {
780 read: inpos,
781 written: outpos,
782 error: DecodeError { position: inpos, kind: DecodeKind::Length },
783 })
784 }
785}
786
787#[derive(Debug, Copy, Clone, PartialEq, Eq)]
813#[cfg(feature = "alloc")]
814pub enum BitOrder {
815 MostSignificantFirst,
824
825 LeastSignificantFirst,
839}
840#[cfg(feature = "alloc")]
841use crate::BitOrder::*;
842
843#[derive(Debug, Copy, Clone, PartialEq, Eq)]
849pub enum Character {
850 Symbol {
852 value: usize,
854 },
855
856 Padding,
858
859 Ignored,
861
862 Invalid,
864}
865
866impl Character {
867 pub fn is_symbol(self) -> Option<usize> {
871 match self {
872 Character::Symbol { value } => Some(value),
873 _ => None,
874 }
875 }
876
877 pub fn is_padding(self) -> bool {
879 matches!(self, Character::Padding)
880 }
881
882 pub fn is_ignored(self) -> bool {
884 matches!(self, Character::Ignored)
885 }
886
887 pub fn is_invalid(self) -> bool {
889 matches!(self, Character::Invalid)
890 }
891}
892
893#[doc(hidden)]
894#[cfg(feature = "alloc")]
895pub type InternalEncoding = Cow<'static, [u8]>;
896
897#[doc(hidden)]
898#[cfg(not(feature = "alloc"))]
899pub type InternalEncoding = &'static [u8];
900
901#[derive(Debug, Clone, PartialEq, Eq)]
924#[repr(transparent)]
925pub struct Encoding(#[doc(hidden)] pub InternalEncoding);
926
927#[derive(Debug, Clone)]
934#[cfg(feature = "alloc")]
935pub struct Translate {
936 pub from: String,
938
939 pub to: String,
941}
942
943#[derive(Debug, Clone)]
947#[cfg(feature = "alloc")]
948pub struct Wrap {
949 pub width: usize,
959
960 pub separator: String,
964}
965
966#[derive(Debug, Clone)]
1203#[cfg(feature = "alloc")]
1204pub struct Specification {
1205 pub symbols: String,
1210
1211 pub bit_order: BitOrder,
1215
1216 pub check_trailing_bits: bool,
1221
1222 pub padding: Option<char>,
1227
1228 pub ignore: String,
1233
1234 pub wrap: Wrap,
1239
1240 pub translate: Translate,
1247}
1248
1249#[cfg(feature = "alloc")]
1250impl Default for Specification {
1251 fn default() -> Self {
1252 Self::new()
1253 }
1254}
1255
1256impl Encoding {
1257 fn sym(&self) -> &[u8; 256] {
1258 self.0[0 .. 256].try_into().unwrap()
1259 }
1260
1261 fn val(&self) -> &[u8; 256] {
1262 self.0[256 .. 512].try_into().unwrap()
1263 }
1264
1265 fn pad(&self) -> Option<u8> {
1266 if self.0[512] < 128 {
1267 Some(self.0[512])
1268 } else {
1269 None
1270 }
1271 }
1272
1273 fn ctb(&self) -> bool {
1274 self.0[513] & 0x10 != 0
1275 }
1276
1277 fn msb(&self) -> bool {
1278 self.0[513] & 0x8 != 0
1279 }
1280
1281 fn bit(&self) -> usize {
1282 (self.0[513] & 0x7) as usize
1283 }
1284
1285 fn block_len(&self) -> (usize, usize) {
1287 let bit = self.bit();
1288 match self.wrap() {
1289 Some((col, end)) => (col / dec(bit) * enc(bit), col + end.len()),
1290 None => (enc(bit), dec(bit)),
1291 }
1292 }
1293
1294 fn wrap(&self) -> Option<(usize, &[u8])> {
1295 if self.0.len() <= 515 {
1296 return None;
1297 }
1298 Some((self.0[514] as usize, &self.0[515 ..]))
1299 }
1300
1301 fn has_ignore(&self) -> bool {
1302 self.0.len() >= 515
1303 }
1304
1305 #[must_use]
1327 pub fn encode_len(&self, len: usize) -> usize {
1328 assert!(len <= usize::MAX / 512);
1329 dispatch! {
1330 let bit: usize = self.bit();
1331 let pad: Option<u8> = self.pad();
1332 let wrap: Option<(usize, &[u8])> = self.wrap();
1333 encode_wrap_len(bit, pad, wrap, len)
1334 }
1335 }
1336
1337 #[must_use]
1343 pub fn encode_align(&self) -> usize {
1344 let bit = self.bit();
1345 match self.wrap() {
1346 None => enc(bit),
1347 Some((col, _)) => col * bit / 8,
1348 }
1349 }
1350
1351 #[allow(clippy::cognitive_complexity)]
1371 pub fn encode_mut(&self, input: &[u8], output: &mut [u8]) {
1372 assert_eq!(output.len(), self.encode_len(input.len()));
1373 dispatch! {
1374 let bit: usize = self.bit();
1375 let msb: bool = self.msb();
1376 let pad: Option<u8> = self.pad();
1377 let wrap: Option<(usize, &[u8])> = self.wrap();
1378 encode_wrap_mut(bit, msb, self.sym(), pad, wrap, input, output)
1379 }
1380 }
1381
1382 pub fn encode_mut_str<'a>(&self, input: &[u8], output: &'a mut [u8]) -> &'a str {
1404 self.encode_mut(input, output);
1405 safety_assert!(output.is_ascii());
1406 unsafe { core::str::from_utf8_unchecked(output) }
1408 }
1409
1410 #[cfg(feature = "alloc")]
1423 pub fn encode_append(&self, input: &[u8], output: &mut String) {
1424 let output = unsafe { output.as_mut_vec() };
1426 let output_len = output.len();
1427 output.resize(output_len + self.encode_len(input.len()), 0u8);
1428 self.encode_mut(input, &mut output[output_len ..]);
1429 safety_assert!(output[output_len ..].is_ascii());
1430 }
1431
1432 #[cfg(feature = "alloc")]
1436 pub fn new_encoder<'a>(&'a self, output: &'a mut String) -> Encoder<'a> {
1437 Encoder::new(self, output)
1438 }
1439
1440 pub fn encode_write(
1449 &self, input: &[u8], output: &mut impl core::fmt::Write,
1450 ) -> core::fmt::Result {
1451 self.encode_write_buffer(input, output, &mut [0; 1024])
1452 }
1453
1454 pub fn encode_write_buffer(
1464 &self, input: &[u8], output: &mut impl core::fmt::Write, buffer: &mut [u8],
1465 ) -> core::fmt::Result {
1466 assert!(510 <= buffer.len());
1467 let (enc, dec) = self.block_len();
1468 for input in input.chunks(buffer.len() / dec * enc) {
1469 let buffer = &mut buffer[.. self.encode_len(input.len())];
1470 self.encode_mut(input, buffer);
1471 safety_assert!(buffer.is_ascii());
1472 output.write_str(unsafe { core::str::from_utf8_unchecked(buffer) })?;
1474 }
1475 Ok(())
1476 }
1477
1478 #[must_use]
1490 pub fn encode_display<'a>(&'a self, input: &'a [u8]) -> Display<'a> {
1491 Display { encoding: self, input }
1492 }
1493
1494 #[cfg(feature = "alloc")]
1503 #[must_use]
1504 pub fn encode(&self, input: &[u8]) -> String {
1505 let mut output = vec![0u8; self.encode_len(input.len())];
1506 self.encode_mut(input, &mut output);
1507 safety_assert!(output.is_ascii());
1508 unsafe { String::from_utf8_unchecked(output) }
1510 }
1511
1512 pub fn decode_len(&self, len: usize) -> Result<usize, DecodeError> {
1547 assert!(len <= usize::MAX / 8);
1548 let (ilen, olen) = dispatch! {
1549 let bit: usize = self.bit();
1550 let pad: bool = self.pad().is_some();
1551 decode_wrap_len(bit, pad, len)
1552 };
1553 check!(
1554 DecodeError { position: ilen, kind: DecodeKind::Length },
1555 self.has_ignore() || len == ilen
1556 );
1557 Ok(olen)
1558 }
1559
1560 #[allow(clippy::cognitive_complexity)]
1598 pub fn decode_mut(&self, input: &[u8], output: &mut [u8]) -> Result<usize, DecodePartial> {
1599 assert_eq!(Ok(output.len()), self.decode_len(input.len()));
1600 dispatch! {
1601 let bit: usize = self.bit();
1602 let msb: bool = self.msb();
1603 let pad: bool = self.pad().is_some();
1604 let has_ignore: bool = self.has_ignore();
1605 decode_wrap_mut(bit, msb, self.ctb(), self.val(), pad, has_ignore,
1606 input, output)
1607 }
1608 }
1609
1610 #[cfg(feature = "alloc")]
1640 pub fn decode(&self, input: &[u8]) -> Result<Vec<u8>, DecodeError> {
1641 let mut output = vec![0u8; self.decode_len(input.len())?];
1642 let len = self.decode_mut(input, &mut output).map_err(|partial| partial.error)?;
1643 output.truncate(len);
1644 Ok(output)
1645 }
1646
1647 #[must_use]
1649 pub fn bit_width(&self) -> usize {
1650 self.bit()
1651 }
1652
1653 pub fn interpret_byte(&self, byte: u8) -> Character {
1655 match self.val()[byte as usize] {
1656 INVALID => Character::Invalid,
1657 IGNORE => Character::Ignored,
1658 PADDING => Character::Padding,
1659 value => Character::Symbol { value: value as usize },
1660 }
1661 }
1662
1663 #[must_use]
1672 pub fn is_canonical(&self) -> bool {
1673 if !self.ctb() {
1674 return false;
1675 }
1676 let bit = self.bit();
1677 let sym = self.sym();
1678 let val = self.val();
1679 for i in 0 .. 256 {
1680 if val[i] == INVALID {
1681 continue;
1682 }
1683 if val[i] >= 1 << bit {
1684 return false;
1685 }
1686 if sym[val[i] as usize] as usize != i {
1687 return false;
1688 }
1689 }
1690 true
1691 }
1692
1693 #[allow(clippy::missing_panics_doc)] #[cfg(feature = "alloc")]
1696 #[must_use]
1697 pub fn specification(&self) -> Specification {
1698 let mut specification = Specification::new();
1699 specification
1700 .symbols
1701 .push_str(core::str::from_utf8(&self.sym()[0 .. 1 << self.bit()]).unwrap());
1702 specification.bit_order =
1703 if self.msb() { MostSignificantFirst } else { LeastSignificantFirst };
1704 specification.check_trailing_bits = self.ctb();
1705 if let Some(pad) = self.pad() {
1706 specification.padding = Some(pad as char);
1707 }
1708 for i in 0 .. 128u8 {
1709 if self.val()[i as usize] != IGNORE {
1710 continue;
1711 }
1712 specification.ignore.push(i as char);
1713 }
1714 if let Some((col, end)) = self.wrap() {
1715 specification.wrap.width = col;
1716 specification.wrap.separator = core::str::from_utf8(end).unwrap().to_owned();
1717 }
1718 for i in 0 .. 128u8 {
1719 let canonical = if self.val()[i as usize] < 1 << self.bit() {
1720 self.sym()[self.val()[i as usize] as usize]
1721 } else if self.val()[i as usize] == PADDING {
1722 self.pad().unwrap()
1723 } else {
1724 continue;
1725 };
1726 if i == canonical {
1727 continue;
1728 }
1729 specification.translate.from.push(i as char);
1730 specification.translate.to.push(canonical as char);
1731 }
1732 specification
1733 }
1734
1735 #[doc(hidden)]
1736 #[must_use]
1737 pub const fn internal_new(implementation: &'static [u8]) -> Encoding {
1738 #[cfg(feature = "alloc")]
1739 let encoding = Encoding(Cow::Borrowed(implementation));
1740 #[cfg(not(feature = "alloc"))]
1741 let encoding = Encoding(implementation);
1742 encoding
1743 }
1744
1745 #[doc(hidden)]
1746 #[must_use]
1747 pub fn internal_implementation(&self) -> &[u8] {
1748 &self.0
1749 }
1750}
1751
1752#[derive(Debug)]
1773#[cfg(feature = "alloc")]
1774pub struct Encoder<'a> {
1775 encoding: &'a Encoding,
1776 output: &'a mut String,
1777 buffer: [u8; 255],
1778 length: u8,
1779}
1780
1781#[cfg(feature = "alloc")]
1782impl Drop for Encoder<'_> {
1783 fn drop(&mut self) {
1784 self.encoding.encode_append(&self.buffer[.. self.length as usize], self.output);
1785 }
1786}
1787
1788#[cfg(feature = "alloc")]
1789impl<'a> Encoder<'a> {
1790 fn new(encoding: &'a Encoding, output: &'a mut String) -> Self {
1791 Encoder { encoding, output, buffer: [0; 255], length: 0 }
1792 }
1793
1794 pub fn append(&mut self, mut input: &[u8]) {
1796 #[allow(clippy::cast_possible_truncation)] let max = self.encoding.block_len().0 as u8;
1798 if self.length != 0 {
1799 let len = self.length;
1800 #[allow(clippy::cast_possible_truncation)] let add = core::cmp::min((max - len) as usize, input.len()) as u8;
1802 self.buffer[len as usize ..][.. add as usize].copy_from_slice(&input[.. add as usize]);
1803 self.length += add;
1804 input = &input[add as usize ..];
1805 if self.length != max {
1806 debug_assert!(self.length < max);
1807 debug_assert!(input.is_empty());
1808 return;
1809 }
1810 self.encoding.encode_append(&self.buffer[.. max as usize], self.output);
1811 self.length = 0;
1812 }
1813 let len = floor(input.len(), max as usize);
1814 self.encoding.encode_append(&input[.. len], self.output);
1815 input = &input[len ..];
1816 #[allow(clippy::cast_possible_truncation)] let len = input.len() as u8;
1818 self.buffer[.. len as usize].copy_from_slice(input);
1819 self.length = len;
1820 }
1821
1822 pub fn finalize(self) {}
1827}
1828
1829#[derive(Debug)]
1831pub struct Display<'a> {
1832 encoding: &'a Encoding,
1833 input: &'a [u8],
1834}
1835
1836impl core::fmt::Display for Display<'_> {
1837 fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
1838 self.encoding.encode_write(self.input, f)
1839 }
1840}
1841
1842#[derive(Debug, Copy, Clone)]
1843#[cfg(feature = "alloc")]
1844enum SpecificationErrorImpl {
1845 BadSize,
1846 NotAscii,
1847 Duplicate(u8),
1848 ExtraPadding,
1849 WrapLength,
1850 WrapWidth(u8),
1851 FromTo,
1852 Undefined(u8),
1853}
1854#[cfg(feature = "alloc")]
1855use crate::SpecificationErrorImpl::*;
1856
1857#[derive(Debug, Copy, Clone)]
1859#[cfg(feature = "alloc")]
1860pub struct SpecificationError(SpecificationErrorImpl);
1861
1862#[cfg(feature = "alloc")]
1863impl core::fmt::Display for SpecificationError {
1864 fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
1865 match self.0 {
1866 BadSize => write!(f, "invalid number of symbols"),
1867 NotAscii => write!(f, "non-ascii character"),
1868 Duplicate(c) => write!(f, "{:?} has conflicting definitions", c as char),
1869 ExtraPadding => write!(f, "unnecessary padding"),
1870 WrapLength => write!(f, "invalid wrap width or separator length"),
1871 WrapWidth(x) => write!(f, "wrap width not a multiple of {}", x),
1872 FromTo => write!(f, "translate from/to length mismatch"),
1873 Undefined(c) => write!(f, "{:?} is undefined", c as char),
1874 }
1875 }
1876}
1877
1878#[cfg(feature = "std")]
1879impl std::error::Error for SpecificationError {
1880 fn description(&self) -> &str {
1881 match self.0 {
1882 BadSize => "invalid number of symbols",
1883 NotAscii => "non-ascii character",
1884 Duplicate(_) => "conflicting definitions",
1885 ExtraPadding => "unnecessary padding",
1886 WrapLength => "invalid wrap width or separator length",
1887 WrapWidth(_) => "wrap width not a multiple",
1888 FromTo => "translate from/to length mismatch",
1889 Undefined(_) => "undefined character",
1890 }
1891 }
1892}
1893
1894#[cfg(feature = "alloc")]
1895impl Specification {
1896 #[must_use]
1898 pub fn new() -> Specification {
1899 Specification {
1900 symbols: String::new(),
1901 bit_order: MostSignificantFirst,
1902 check_trailing_bits: true,
1903 padding: None,
1904 ignore: String::new(),
1905 wrap: Wrap { width: 0, separator: String::new() },
1906 translate: Translate { from: String::new(), to: String::new() },
1907 }
1908 }
1909
1910 pub fn encoding(&self) -> Result<Encoding, SpecificationError> {
1916 let symbols = self.symbols.as_bytes();
1917 let bit: u8 = match symbols.len() {
1918 2 => 1,
1919 4 => 2,
1920 8 => 3,
1921 16 => 4,
1922 32 => 5,
1923 64 => 6,
1924 _ => return Err(SpecificationError(BadSize)),
1925 };
1926 let mut values = [INVALID; 128];
1927 let set = |v: &mut [u8; 128], i: u8, x: u8| {
1928 check!(SpecificationError(NotAscii), i < 128);
1929 if v[i as usize] == x {
1930 return Ok(());
1931 }
1932 check!(SpecificationError(Duplicate(i)), v[i as usize] == INVALID);
1933 v[i as usize] = x;
1934 Ok(())
1935 };
1936 for (v, symbols) in symbols.iter().enumerate() {
1937 #[allow(clippy::cast_possible_truncation)] set(&mut values, *symbols, v as u8)?;
1939 }
1940 let msb = self.bit_order == MostSignificantFirst;
1941 let ctb = self.check_trailing_bits || 8 % bit == 0;
1942 let pad = match self.padding {
1943 None => None,
1944 Some(pad) => {
1945 check!(SpecificationError(ExtraPadding), 8 % bit != 0);
1946 check!(SpecificationError(NotAscii), pad.len_utf8() == 1);
1947 set(&mut values, pad as u8, PADDING)?;
1948 Some(pad as u8)
1949 }
1950 };
1951 for i in self.ignore.bytes() {
1952 set(&mut values, i, IGNORE)?;
1953 }
1954 let wrap = if self.wrap.separator.is_empty() || self.wrap.width == 0 {
1955 None
1956 } else {
1957 let col = self.wrap.width;
1958 let end = self.wrap.separator.as_bytes();
1959 check!(SpecificationError(WrapLength), col < 256 && end.len() < 256);
1960 #[allow(clippy::cast_possible_truncation)] let col = col as u8;
1962 #[allow(clippy::cast_possible_truncation)] let dec = dec(bit as usize) as u8;
1964 check!(SpecificationError(WrapWidth(dec)), col % dec == 0);
1965 for &i in end {
1966 set(&mut values, i, IGNORE)?;
1967 }
1968 Some((col, end))
1969 };
1970 let from = self.translate.from.as_bytes();
1971 let to = self.translate.to.as_bytes();
1972 check!(SpecificationError(FromTo), from.len() == to.len());
1973 for i in 0 .. from.len() {
1974 check!(SpecificationError(NotAscii), to[i] < 128);
1975 let v = values[to[i] as usize];
1976 check!(SpecificationError(Undefined(to[i])), v != INVALID);
1977 set(&mut values, from[i], v)?;
1978 }
1979 let mut encoding = Vec::new();
1980 for _ in 0 .. 256 / symbols.len() {
1981 encoding.extend_from_slice(symbols);
1982 }
1983 encoding.extend_from_slice(&values);
1984 encoding.extend_from_slice(&[INVALID; 128]);
1985 match pad {
1986 None => encoding.push(INVALID),
1987 Some(pad) => encoding.push(pad),
1988 }
1989 encoding.push(bit);
1990 if msb {
1991 encoding[513] |= 0x08;
1992 }
1993 if ctb {
1994 encoding[513] |= 0x10;
1995 }
1996 if let Some((col, end)) = wrap {
1997 encoding.push(col);
1998 encoding.extend_from_slice(end);
1999 } else if values.contains(&IGNORE) {
2000 encoding.push(0);
2001 }
2002 Ok(Encoding(Cow::Owned(encoding)))
2003 }
2004}
2005
2006pub const HEXLOWER: Encoding = Encoding::internal_new(HEXLOWER_IMPL);
2026const HEXLOWER_IMPL: &[u8] = &[
2027 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 97, 98, 99, 100, 101, 102, 48, 49, 50, 51, 52, 53, 54,
2028 55, 56, 57, 97, 98, 99, 100, 101, 102, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 97, 98, 99, 100,
2029 101, 102, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 97, 98, 99, 100, 101, 102, 48, 49, 50, 51,
2030 52, 53, 54, 55, 56, 57, 97, 98, 99, 100, 101, 102, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 97,
2031 98, 99, 100, 101, 102, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 97, 98, 99, 100, 101, 102, 48,
2032 49, 50, 51, 52, 53, 54, 55, 56, 57, 97, 98, 99, 100, 101, 102, 48, 49, 50, 51, 52, 53, 54, 55,
2033 56, 57, 97, 98, 99, 100, 101, 102, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 97, 98, 99, 100,
2034 101, 102, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 97, 98, 99, 100, 101, 102, 48, 49, 50, 51,
2035 52, 53, 54, 55, 56, 57, 97, 98, 99, 100, 101, 102, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 97,
2036 98, 99, 100, 101, 102, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 97, 98, 99, 100, 101, 102, 48,
2037 49, 50, 51, 52, 53, 54, 55, 56, 57, 97, 98, 99, 100, 101, 102, 48, 49, 50, 51, 52, 53, 54, 55,
2038 56, 57, 97, 98, 99, 100, 101, 102, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2039 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2040 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 0, 1, 2,
2041 3, 4, 5, 6, 7, 8, 9, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2042 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2043 128, 128, 128, 128, 128, 10, 11, 12, 13, 14, 15, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2044 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2045 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2046 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2047 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2048 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2049 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2050 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2051 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 28,
2052];
2053
2054pub const HEXLOWER_PERMISSIVE: Encoding = Encoding::internal_new(HEXLOWER_PERMISSIVE_IMPL);
2083const HEXLOWER_PERMISSIVE_IMPL: &[u8] = &[
2084 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 97, 98, 99, 100, 101, 102, 48, 49, 50, 51, 52, 53, 54,
2085 55, 56, 57, 97, 98, 99, 100, 101, 102, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 97, 98, 99, 100,
2086 101, 102, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 97, 98, 99, 100, 101, 102, 48, 49, 50, 51,
2087 52, 53, 54, 55, 56, 57, 97, 98, 99, 100, 101, 102, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 97,
2088 98, 99, 100, 101, 102, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 97, 98, 99, 100, 101, 102, 48,
2089 49, 50, 51, 52, 53, 54, 55, 56, 57, 97, 98, 99, 100, 101, 102, 48, 49, 50, 51, 52, 53, 54, 55,
2090 56, 57, 97, 98, 99, 100, 101, 102, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 97, 98, 99, 100,
2091 101, 102, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 97, 98, 99, 100, 101, 102, 48, 49, 50, 51,
2092 52, 53, 54, 55, 56, 57, 97, 98, 99, 100, 101, 102, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 97,
2093 98, 99, 100, 101, 102, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 97, 98, 99, 100, 101, 102, 48,
2094 49, 50, 51, 52, 53, 54, 55, 56, 57, 97, 98, 99, 100, 101, 102, 48, 49, 50, 51, 52, 53, 54, 55,
2095 56, 57, 97, 98, 99, 100, 101, 102, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2096 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2097 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 0, 1, 2,
2098 3, 4, 5, 6, 7, 8, 9, 128, 128, 128, 128, 128, 128, 128, 10, 11, 12, 13, 14, 15, 128, 128, 128,
2099 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2100 128, 128, 128, 128, 10, 11, 12, 13, 14, 15, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2101 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2102 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2103 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2104 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2105 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2106 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2107 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2108 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 28,
2109];
2110
2111pub const HEXUPPER: Encoding = Encoding::internal_new(HEXUPPER_IMPL);
2135const HEXUPPER_IMPL: &[u8] = &[
2136 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70, 48, 49, 50, 51, 52, 53, 54, 55,
2137 56, 57, 65, 66, 67, 68, 69, 70, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70,
2138 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70, 48, 49, 50, 51, 52, 53, 54, 55,
2139 56, 57, 65, 66, 67, 68, 69, 70, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70,
2140 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70, 48, 49, 50, 51, 52, 53, 54, 55,
2141 56, 57, 65, 66, 67, 68, 69, 70, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70,
2142 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70, 48, 49, 50, 51, 52, 53, 54, 55,
2143 56, 57, 65, 66, 67, 68, 69, 70, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70,
2144 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70, 48, 49, 50, 51, 52, 53, 54, 55,
2145 56, 57, 65, 66, 67, 68, 69, 70, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70,
2146 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70, 128, 128, 128, 128, 128, 128,
2147 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2148 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2149 128, 128, 128, 128, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 128, 128, 128, 128, 128, 128, 128, 10, 11,
2150 12, 13, 14, 15, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2151 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2152 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2153 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2154 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2155 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2156 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2157 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2158 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2159 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 28,
2160];
2161
2162pub const HEXUPPER_PERMISSIVE: Encoding = Encoding::internal_new(HEXUPPER_PERMISSIVE_IMPL);
2184const HEXUPPER_PERMISSIVE_IMPL: &[u8] = &[
2185 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70, 48, 49, 50, 51, 52, 53, 54, 55,
2186 56, 57, 65, 66, 67, 68, 69, 70, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70,
2187 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70, 48, 49, 50, 51, 52, 53, 54, 55,
2188 56, 57, 65, 66, 67, 68, 69, 70, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70,
2189 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70, 48, 49, 50, 51, 52, 53, 54, 55,
2190 56, 57, 65, 66, 67, 68, 69, 70, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70,
2191 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70, 48, 49, 50, 51, 52, 53, 54, 55,
2192 56, 57, 65, 66, 67, 68, 69, 70, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70,
2193 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70, 48, 49, 50, 51, 52, 53, 54, 55,
2194 56, 57, 65, 66, 67, 68, 69, 70, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70,
2195 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70, 128, 128, 128, 128, 128, 128,
2196 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2197 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2198 128, 128, 128, 128, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 128, 128, 128, 128, 128, 128, 128, 10, 11,
2199 12, 13, 14, 15, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2200 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 10, 11, 12, 13, 14, 15, 128, 128, 128, 128,
2201 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2202 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2203 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2204 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2205 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2206 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2207 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2208 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 28,
2209];
2210
2211pub const BASE32: Encoding = Encoding::internal_new(BASE32_IMPL);
2227const BASE32_IMPL: &[u8] = &[
2228 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88,
2229 89, 90, 50, 51, 52, 53, 54, 55, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80,
2230 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 50, 51, 52, 53, 54, 55, 65, 66, 67, 68, 69, 70, 71, 72,
2231 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 50, 51, 52, 53, 54, 55,
2232 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88,
2233 89, 90, 50, 51, 52, 53, 54, 55, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80,
2234 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 50, 51, 52, 53, 54, 55, 65, 66, 67, 68, 69, 70, 71, 72,
2235 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 50, 51, 52, 53, 54, 55,
2236 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88,
2237 89, 90, 50, 51, 52, 53, 54, 55, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80,
2238 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 50, 51, 52, 53, 54, 55, 128, 128, 128, 128, 128, 128,
2239 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2240 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2241 128, 128, 128, 128, 128, 128, 26, 27, 28, 29, 30, 31, 128, 128, 128, 128, 128, 130, 128, 128,
2242 128, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
2243 25, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2244 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2245 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2246 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2247 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2248 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2249 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2250 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2251 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 61, 29,
2252];
2253
2254pub const BASE32_NOPAD: Encoding = Encoding::internal_new(BASE32_NOPAD_IMPL);
2265const BASE32_NOPAD_IMPL: &[u8] = &[
2266 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88,
2267 89, 90, 50, 51, 52, 53, 54, 55, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80,
2268 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 50, 51, 52, 53, 54, 55, 65, 66, 67, 68, 69, 70, 71, 72,
2269 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 50, 51, 52, 53, 54, 55,
2270 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88,
2271 89, 90, 50, 51, 52, 53, 54, 55, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80,
2272 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 50, 51, 52, 53, 54, 55, 65, 66, 67, 68, 69, 70, 71, 72,
2273 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 50, 51, 52, 53, 54, 55,
2274 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88,
2275 89, 90, 50, 51, 52, 53, 54, 55, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80,
2276 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 50, 51, 52, 53, 54, 55, 128, 128, 128, 128, 128, 128,
2277 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2278 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2279 128, 128, 128, 128, 128, 128, 26, 27, 28, 29, 30, 31, 128, 128, 128, 128, 128, 128, 128, 128,
2280 128, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
2281 25, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2282 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2283 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2284 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2285 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2286 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2287 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2288 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2289 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 29,
2290];
2291
2292pub const BASE32_NOPAD_NOCASE: Encoding = Encoding::internal_new(BASE32_NOPAD_NOCASE_IMPL);
2305const BASE32_NOPAD_NOCASE_IMPL: &[u8] = &[
2306 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88,
2307 89, 90, 50, 51, 52, 53, 54, 55, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80,
2308 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 50, 51, 52, 53, 54, 55, 65, 66, 67, 68, 69, 70, 71, 72,
2309 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 50, 51, 52, 53, 54, 55,
2310 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88,
2311 89, 90, 50, 51, 52, 53, 54, 55, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80,
2312 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 50, 51, 52, 53, 54, 55, 65, 66, 67, 68, 69, 70, 71, 72,
2313 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 50, 51, 52, 53, 54, 55,
2314 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88,
2315 89, 90, 50, 51, 52, 53, 54, 55, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80,
2316 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 50, 51, 52, 53, 54, 55, 128, 128, 128, 128, 128, 128,
2317 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2318 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2319 128, 128, 128, 128, 128, 128, 26, 27, 28, 29, 30, 31, 128, 128, 128, 128, 128, 128, 128, 128,
2320 128, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
2321 25, 128, 128, 128, 128, 128, 128, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17,
2322 18, 19, 20, 21, 22, 23, 24, 25, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2323 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2324 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2325 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2326 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2327 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2328 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2329 128, 128, 128, 128, 128, 128, 128, 128, 29,
2330];
2331
2332pub const BASE32_NOPAD_VISUAL: Encoding = Encoding::internal_new(BASE32_NOPAD_VISUAL_IMPL);
2345const BASE32_NOPAD_VISUAL_IMPL: &[u8] = &[
2346 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88,
2347 89, 90, 50, 51, 52, 53, 54, 55, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80,
2348 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 50, 51, 52, 53, 54, 55, 65, 66, 67, 68, 69, 70, 71, 72,
2349 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 50, 51, 52, 53, 54, 55,
2350 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88,
2351 89, 90, 50, 51, 52, 53, 54, 55, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80,
2352 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 50, 51, 52, 53, 54, 55, 65, 66, 67, 68, 69, 70, 71, 72,
2353 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 50, 51, 52, 53, 54, 55,
2354 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88,
2355 89, 90, 50, 51, 52, 53, 54, 55, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80,
2356 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 50, 51, 52, 53, 54, 55, 128, 128, 128, 128, 128, 128,
2357 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2358 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2359 128, 128, 128, 128, 14, 8, 26, 27, 28, 29, 30, 31, 1, 128, 128, 128, 128, 128, 128, 128, 128,
2360 0, 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,
2361 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 8, 128,
2362 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2363 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2364 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2365 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2366 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2367 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2368 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2369 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 29,
2370];
2371
2372pub const BASE32HEX: Encoding = Encoding::internal_new(BASE32HEX_IMPL);
2388const BASE32HEX_IMPL: &[u8] = &[
2389 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78,
2390 79, 80, 81, 82, 83, 84, 85, 86, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70,
2391 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 48, 49, 50, 51, 52, 53, 54, 55,
2392 56, 57, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86,
2393 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78,
2394 79, 80, 81, 82, 83, 84, 85, 86, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70,
2395 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 48, 49, 50, 51, 52, 53, 54, 55,
2396 56, 57, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86,
2397 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78,
2398 79, 80, 81, 82, 83, 84, 85, 86, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70,
2399 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 128, 128, 128, 128, 128, 128,
2400 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2401 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2402 128, 128, 128, 128, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 128, 128, 128, 130, 128, 128, 128, 10, 11,
2403 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 128, 128, 128,
2404 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2405 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2406 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2407 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2408 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2409 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2410 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2411 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2412 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 61, 29,
2413];
2414
2415pub const BASE32HEX_NOPAD: Encoding = Encoding::internal_new(BASE32HEX_NOPAD_IMPL);
2426const BASE32HEX_NOPAD_IMPL: &[u8] = &[
2427 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78,
2428 79, 80, 81, 82, 83, 84, 85, 86, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70,
2429 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 48, 49, 50, 51, 52, 53, 54, 55,
2430 56, 57, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86,
2431 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78,
2432 79, 80, 81, 82, 83, 84, 85, 86, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70,
2433 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 48, 49, 50, 51, 52, 53, 54, 55,
2434 56, 57, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86,
2435 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78,
2436 79, 80, 81, 82, 83, 84, 85, 86, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70,
2437 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 128, 128, 128, 128, 128, 128,
2438 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2439 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2440 128, 128, 128, 128, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 128, 128, 128, 128, 128, 128, 128, 10, 11,
2441 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 128, 128, 128,
2442 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2443 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2444 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2445 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2446 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2447 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2448 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2449 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2450 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 29,
2451];
2452
2453pub const BASE32_DNSSEC: Encoding = Encoding::internal_new(BASE32_DNSSEC_IMPL);
2474const BASE32_DNSSEC_IMPL: &[u8] = &[
2475 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107,
2476 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57,
2477 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115,
2478 116, 117, 118, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 97, 98, 99, 100, 101, 102, 103, 104,
2479 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 48, 49, 50, 51, 52, 53,
2480 54, 55, 56, 57, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112,
2481 113, 114, 115, 116, 117, 118, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 97, 98, 99, 100, 101,
2482 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 48, 49,
2483 50, 51, 52, 53, 54, 55, 56, 57, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109,
2484 110, 111, 112, 113, 114, 115, 116, 117, 118, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 97, 98,
2485 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117,
2486 118, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106,
2487 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 128, 128, 128, 128, 128, 128, 128,
2488 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2489 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2490 128, 128, 128, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 128, 128, 128, 128, 128, 128, 128, 10, 11, 12, 13,
2491 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 128, 128, 128, 128,
2492 128, 128, 128, 128, 128, 128, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
2493 26, 27, 28, 29, 30, 31, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2494 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2495 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2496 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2497 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2498 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2499 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2500 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 29,
2501];
2502
2503#[allow(clippy::doc_markdown)]
2504pub const BASE32_DNSCURVE: Encoding = Encoding::internal_new(BASE32_DNSCURVE_IMPL);
2522const BASE32_DNSCURVE_IMPL: &[u8] = &[
2523 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 98, 99, 100, 102, 103, 104, 106, 107, 108, 109, 110,
2524 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57,
2525 98, 99, 100, 102, 103, 104, 106, 107, 108, 109, 110, 112, 113, 114, 115, 116, 117, 118, 119,
2526 120, 121, 122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 98, 99, 100, 102, 103, 104, 106, 107,
2527 108, 109, 110, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 48, 49, 50, 51, 52, 53,
2528 54, 55, 56, 57, 98, 99, 100, 102, 103, 104, 106, 107, 108, 109, 110, 112, 113, 114, 115, 116,
2529 117, 118, 119, 120, 121, 122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 98, 99, 100, 102, 103,
2530 104, 106, 107, 108, 109, 110, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 48, 49,
2531 50, 51, 52, 53, 54, 55, 56, 57, 98, 99, 100, 102, 103, 104, 106, 107, 108, 109, 110, 112, 113,
2532 114, 115, 116, 117, 118, 119, 120, 121, 122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 98, 99,
2533 100, 102, 103, 104, 106, 107, 108, 109, 110, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121,
2534 122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 98, 99, 100, 102, 103, 104, 106, 107, 108, 109,
2535 110, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 128, 128, 128, 128, 128, 128, 128,
2536 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2537 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2538 128, 128, 128, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 128, 128, 128, 128, 128, 128, 128, 128, 10, 11,
2539 12, 128, 13, 14, 15, 128, 16, 17, 18, 19, 20, 128, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
2540 128, 128, 128, 128, 128, 128, 128, 10, 11, 12, 128, 13, 14, 15, 128, 16, 17, 18, 19, 20, 128,
2541 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2542 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2543 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2544 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2545 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2546 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2547 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2548 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 21,
2549];
2550
2551pub const BASE64: Encoding = Encoding::internal_new(BASE64_IMPL);
2567const BASE64_IMPL: &[u8] = &[
2568 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88,
2569 89, 90, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114,
2570 115, 116, 117, 118, 119, 120, 121, 122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 43, 47, 65, 66,
2571 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90,
2572 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115,
2573 116, 117, 118, 119, 120, 121, 122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 43, 47, 65, 66, 67,
2574 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 97,
2575 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116,
2576 117, 118, 119, 120, 121, 122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 43, 47, 65, 66, 67, 68,
2577 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 97, 98,
2578 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117,
2579 118, 119, 120, 121, 122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 43, 47, 128, 128, 128, 128,
2580 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2581 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2582 128, 62, 128, 128, 128, 63, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 128, 128, 128, 130, 128,
2583 128, 128, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23,
2584 24, 25, 128, 128, 128, 128, 128, 128, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39,
2585 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2586 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2587 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2588 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2589 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2590 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2591 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2592 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 61, 30,
2593];
2594
2595pub const BASE64_NOPAD: Encoding = Encoding::internal_new(BASE64_NOPAD_IMPL);
2606const BASE64_NOPAD_IMPL: &[u8] = &[
2607 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88,
2608 89, 90, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114,
2609 115, 116, 117, 118, 119, 120, 121, 122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 43, 47, 65, 66,
2610 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90,
2611 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115,
2612 116, 117, 118, 119, 120, 121, 122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 43, 47, 65, 66, 67,
2613 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 97,
2614 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116,
2615 117, 118, 119, 120, 121, 122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 43, 47, 65, 66, 67, 68,
2616 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 97, 98,
2617 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117,
2618 118, 119, 120, 121, 122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 43, 47, 128, 128, 128, 128,
2619 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2620 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2621 128, 62, 128, 128, 128, 63, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 128, 128, 128, 128, 128,
2622 128, 128, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23,
2623 24, 25, 128, 128, 128, 128, 128, 128, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39,
2624 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2625 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2626 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2627 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2628 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2629 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2630 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2631 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 30,
2632];
2633
2634pub const BASE64_MIME: Encoding = Encoding::internal_new(BASE64_MIME_IMPL);
2653const BASE64_MIME_IMPL: &[u8] = &[
2654 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88,
2655 89, 90, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114,
2656 115, 116, 117, 118, 119, 120, 121, 122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 43, 47, 65, 66,
2657 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90,
2658 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115,
2659 116, 117, 118, 119, 120, 121, 122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 43, 47, 65, 66, 67,
2660 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 97,
2661 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116,
2662 117, 118, 119, 120, 121, 122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 43, 47, 65, 66, 67, 68,
2663 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 97, 98,
2664 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117,
2665 118, 119, 120, 121, 122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 43, 47, 128, 128, 128, 128,
2666 128, 128, 128, 128, 128, 128, 129, 128, 128, 129, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2667 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2668 128, 62, 128, 128, 128, 63, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 128, 128, 128, 130, 128,
2669 128, 128, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23,
2670 24, 25, 128, 128, 128, 128, 128, 128, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39,
2671 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2672 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2673 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2674 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2675 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2676 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2677 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2678 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 61, 30, 76, 13, 10,
2679];
2680
2681pub const BASE64_MIME_PERMISSIVE: Encoding = Encoding::internal_new(BASE64_MIME_PERMISSIVE_IMPL);
2701const BASE64_MIME_PERMISSIVE_IMPL: &[u8] = &[
2702 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88,
2703 89, 90, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114,
2704 115, 116, 117, 118, 119, 120, 121, 122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 43, 47, 65, 66,
2705 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90,
2706 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115,
2707 116, 117, 118, 119, 120, 121, 122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 43, 47, 65, 66, 67,
2708 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 97,
2709 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116,
2710 117, 118, 119, 120, 121, 122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 43, 47, 65, 66, 67, 68,
2711 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 97, 98,
2712 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117,
2713 118, 119, 120, 121, 122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 43, 47, 128, 128, 128, 128,
2714 128, 128, 128, 128, 128, 128, 129, 128, 128, 129, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2715 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2716 128, 62, 128, 128, 128, 63, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 128, 128, 128, 130, 128,
2717 128, 128, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23,
2718 24, 25, 128, 128, 128, 128, 128, 128, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39,
2719 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2720 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2721 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2722 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2723 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2724 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2725 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2726 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 61, 14, 76, 13, 10,
2727];
2728
2729pub const BASE64URL: Encoding = Encoding::internal_new(BASE64URL_IMPL);
2745const BASE64URL_IMPL: &[u8] = &[
2746 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88,
2747 89, 90, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114,
2748 115, 116, 117, 118, 119, 120, 121, 122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 45, 95, 65, 66,
2749 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90,
2750 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115,
2751 116, 117, 118, 119, 120, 121, 122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 45, 95, 65, 66, 67,
2752 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 97,
2753 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116,
2754 117, 118, 119, 120, 121, 122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 45, 95, 65, 66, 67, 68,
2755 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 97, 98,
2756 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117,
2757 118, 119, 120, 121, 122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 45, 95, 128, 128, 128, 128,
2758 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2759 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2760 128, 128, 128, 62, 128, 128, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 128, 128, 128, 130, 128,
2761 128, 128, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23,
2762 24, 25, 128, 128, 128, 128, 63, 128, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39,
2763 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2764 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2765 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2766 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2767 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2768 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2769 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2770 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 61, 30,
2771];
2772
2773pub const BASE64URL_NOPAD: Encoding = Encoding::internal_new(BASE64URL_NOPAD_IMPL);
2784const BASE64URL_NOPAD_IMPL: &[u8] = &[
2785 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88,
2786 89, 90, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114,
2787 115, 116, 117, 118, 119, 120, 121, 122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 45, 95, 65, 66,
2788 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90,
2789 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115,
2790 116, 117, 118, 119, 120, 121, 122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 45, 95, 65, 66, 67,
2791 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 97,
2792 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116,
2793 117, 118, 119, 120, 121, 122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 45, 95, 65, 66, 67, 68,
2794 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 97, 98,
2795 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117,
2796 118, 119, 120, 121, 122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 45, 95, 128, 128, 128, 128,
2797 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2798 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2799 128, 128, 128, 62, 128, 128, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 128, 128, 128, 128, 128,
2800 128, 128, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23,
2801 24, 25, 128, 128, 128, 128, 63, 128, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39,
2802 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2803 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2804 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2805 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2806 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2807 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2808 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2809 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 30,
2810];