Repository: Eliah-Lakhin/lady-deirdre (language: rust)

Issue:
Is it possible support more unicode regex rule?
It seems current `#[rule]` or `#[define]` attributes are not support `\p{..}` regex expr, and it's useful when scanning some complex characters combination.

For example, if I want to support unicode but not just ascii identifiers, the rule usually used is `XID_START ~ XID_CONTINUE*`, and  the code maybe looks like:
```rust
#[derive(Token, Debug, Clone, Copy, PartialEq, Eq)]
#[define(XID_START = r"\p{XID_START}")]
#[define(XID_CONTINUE = r"\p{XID_CONTINUE}")]
#[repr(u8)]
pub enum SourceToken {
    EOI = 0,
    Mismatch = 1,

    #[priority(1)]
    #[rule(XID_START XID_CONTINUE*)]
    Ident,
}
```
or maybe ld could provide more common and useful pre-defined operators just like ld already provided `$lower`, `$upper`.
Thanks.
Is it possible support more unicode regex rule?
It seems current `#[rule]` or `#[define]` attributes are not support `\p{..}` regex expr, and it's useful when scanning some complex characters combination.

For example, if I want to support unicode but not just ascii identifiers, the rule usually used is `XID_START ~ XID_CONTINUE*`, and  the code maybe looks like:
```rust
#[derive(Token, Debug, Clone, Copy, PartialEq, Eq)]
#[define(XID_START = r"\p{XID_START}")]
#[define(XID_CONTINUE = r"\p{XID_CONTINUE}")]
#[repr(u8)]
pub enum SourceToken {
    EOI = 0,
    Mismatch = 1,

    #[priority(1)]
    #[rule(XID_START XID_CONTINUE*)]
    Ident,
}
```
or maybe ld could provide more common and useful pre-defined operators just like ld already provided `$lower`, `$upper`.
Thanks.


Discussion / hints:
@chenbaiyu0414 Providing more Unicode properties is possible, but implementing the entire Unicode code property specification would be a challenge, so I would do it more iteratively, based on specific feature requests.

The syntax will be in the form of `$<class>` for consistency with the existing regex syntax.

My question to you: Do you need this feature specifically for "XID_START"/"XID_CONTINUE" (e.g., as defined in [Rust documentation](https://doc.rust-lang.org/reference/identifiers.html)), or did you have other specific classes in mind?
@Eliah-Lakhin Currently I just need `XID_START` and `XID_CONTINUE`. However, I suggest that you might consider providing a set of predefined rules, just like pest does, and you can add more as users come up with additional feature requests.

And [Pest Builtin Rules](https://pest.rs/book/grammars/built-ins.html) might offer some reference for you.
@chenbaiyu0414 Providing more Unicode properties is possible, but implementing the entire Unicode code property specification would be a challenge, so I would do it more iteratively, based on specific feature requests.

The syntax will be in the form of `$<class>` for consistency with the existing regex syntax.

My question to you: Do you need this feature specifically for "XID_START"/"XID_CONTINUE" (e.g., as defined in [Rust documentation](https://doc.rust-lang.org/reference/identifiers.html)), or did you have other specific classes in mind?
@Eliah-Lakhin Currently I just need `XID_START` and `XID_CONTINUE`. However, I suggest that you might consider providing a set of predefined rules, just like pest does, and you can add more as users come up with additional feature requests.

And [Pest Builtin Rules](https://pest.rs/book/grammars/built-ins.html) might offer some reference for you.

Fix patch:
diff --git a/work/crates/derive/src/lib.rs b/work/crates/derive/src/lib.rs
index ed10c32..3188cf3 100644
--- a/work/crates/derive/src/lib.rs
+++ b/work/crates/derive/src/lib.rs
@@ -64,15 +64,13 @@
 //!
 //! Copyright (c) 2024 Ilya Lakhin (Илья Александрович Лахин). All rights reserved.
 
+extern crate core;
+extern crate proc_macro;
 #[macro_use]
 extern crate quote;
-
 #[macro_use]
 extern crate syn;
 
-extern crate core;
-extern crate proc_macro;
-
 use std::str::FromStr;
 
 use proc_macro2::TokenStream;
@@ -295,20 +293,22 @@ mod utils;
 ///    The inverted version of the previous operator that matches any character
 ///    outside of the specified set.
 ///
-///  - Uppercase character: `$upper`. Match any Unicode uppercase character
-///    as specified in the [char::is_uppercase] function.
+///  - Any Unicode uppercase character: `$upper`.
+///
+///  - Any Unicode lowercase character: `$lower`.
+///
+///  - Any Unicode numeric character: `$num`.
+///
+///  - Any Unicode whitespace character: `$space`.
 ///
-///  - Lowercase character: `$lower`. Match any Unicode lowercase character
-///    as specified in the [char::is_lowercase] function.
+///  - Any Unicode alphabetic character: `$alpha`.
 ///
-///  - Numeric character: `$num`. Match any Unicode numeric character
-///    as specified in the [char::is_numeric] function.
+///  - Any Unicode identifier's start character: `$xid_start`.
 ///
-///  - Whitespace character: `$span`. Match any Unicode whitespace character
-///    as specified in the [char::is_whitespace] function.
+///  - Any Unicode identifier's continuation character: `$xid_continue`.
 ///
-///  - Alphabetic character: `$alpha`. Match any Unicode alphabetic character
-///    as specified in the [char::is_alphabetic] function.
+///  - A class of the character property combinations: `${alpha | num | space}`.
+///    The property names can be any combination of the names listed above.
 ///
 ///  - A concatenation of the rules: `<expr1> & <expr2>` or just `<expr1> <expr2>`.
 ///    Matches `<expr1>`, then matches `<expr2>`. The concatenation expression
diff --git a/work/crates/derive/src/token/automata.rs b/work/crates/derive/src/token/automata.rs
index 2b2539d..0bdc786 100644
--- a/work/crates/derive/src/token/automata.rs
+++ b/work/crates/derive/src/token/automata.rs
@@ -34,6 +34,7 @@
 
 use std::fmt::{Display, Formatter};
 
+use proc_macro2::Span;
 use syn::Result;
 
 use crate::{
@@ -165,12 +166,78 @@ impl AutomataImpl for TokenAutomata {
 
         Ok(products)
     }
+
+    fn check_property_conflicts(&self, span: Span) -> Result<()> {
+        for (_, outgoing) in self.transitions().view() {
+            let mut other = false;
+            let mut props = Vec::new();
+
+            for (through, to) in outgoing {
+                let Terminal::Class(class) = through else {
+                    continue;
+                };
+
+                match class {
+                    Class::Char(_) => continue,
+                    Class::Props(through) => {
+                        props.push((through, to));
+                    }
+                    Class::Other => {
+                        other = true;
+                    }
+                }
+
+                if other {
+                    if let Some((through, _)) = props.first() {
+                        return Err(error!(
+                            span,
+                            "Char properties choice ambiguity.\n\
+                            Choice branching in form of \"{through} | .\" or \
+                            \"{through} | ^[...]\" is forbidden.",
+                        ));
+                    }
+                }
+
+                if props.len() > 1 {
+                    let (first_props, first_state) = &props[0];
+                    let (second_props, second_state) = &props[1];
+
+                    return match first_state == second_state {
+                        true => {
+                            let union = first_props.union(**second_props);
+
+                            Err(error!(
+                                span,
+                                "Char properties choice ambiguity.\n\
+                                Choice branching in form of \"{first_props} | \
+                                {second_props}\" is forbidden.\n\
+                                Consider introducing union property class \
+                                instead: {union}.",
+                            ))
+                        }
+
+                        false => Err(error!(
+                            span,
+                            "Char properties choice ambiguity.\n\
+                            Choice branching between two distinct property \
+                            classes ({first_props} and {second_props}) \
+                            is forbidden.",
+                        )),
+                    };
+                }
+            }
+        }
+
+        Ok(())
+    }
 }
 
 pub(super) trait AutomataImpl {
     fn merge(&mut self, scope: &mut Scope, variants: &Variants) -> Result<()>;
 
     fn filter_out(&mut self, variants: &Variants) -> Result<ProductMap>;
+
+    fn check_property_conflicts(&self, span: Span) -> Result<()>;
 }
 
 pub(super) struct Scope {
diff --git a/work/crates/derive/src/token/chars.rs b/work/crates/derive/src/token/chars.rs
index 7c7825e..0614315 100644
--- a/work/crates/derive/src/token/chars.rs
+++ b/work/crates/derive/src/token/chars.rs
@@ -44,7 +44,10 @@ use syn::{
 };
 
 use crate::{
-    token::regex::{Operand, Operator, Regex},
+    token::{
+        regex::{Operand, Operator, Regex},
+        ucd::{Char, CharProperties},
+    },
     utils::{error, PredictableCollection, Set, SetImpl},
 };
 
@@ -62,49 +65,36 @@ impl Parse for CharSet {
             let _ = input.parse::<Token![$]>()?;
             let lookahead = input.lookahead1();
 
-            if lookahead.peek(char_kw::alpha) {
-                return Ok(Self {
-                    span: input.parse::<char_kw::alpha>()?.span,
-                    classes: Set::new([Class::Upper, Class::Lower]),
-                });
-            }
+            let mut props = CharProperties::new();
 
-            if lookahead.peek(char_kw::alphanum) {
-                return Ok(Self {
-                    span: input.parse::<char_kw::alphanum>()?.span,
-                    classes: Set::new([Class::Upper, Class::Lower, Class::Num]),
-                });
-            }
+            if lookahead.peek(syn::token::Brace) {
+                let content;
+                braced!(content in input);
 
-            if lookahead.peek(char_kw::upper) {
-                return Ok(Self {
-                    span: input.parse::<char_kw::upper>()?.span,
-                    classes: Set::new([Class::Upper]),
-                });
-            }
+                let span = content.span();
 
-            if lookahead.peek(char_kw::lower) {
-                return Ok(Self {
-                    span: input.parse::<char_kw::lower>()?.span,
-                    classes: Set::new([Class::Lower]),
-                });
-            }
+                let components =
+                    Punctuated::<CharProp, Token![|]>::parse_separated_nonempty(&content)?;
 
-            if lookahead.peek(char_kw::num) {
-                return Ok(Self {
-                    span: input.parse::<char_kw::num>()?.span,
-                    classes: Set::new([Class::Num]),
-                });
-            }
+                for prop in components {
+                    prop.append_to(&mut props);
+                }
 
-            if lookahead.peek(char_kw::space) {
                 return Ok(Self {
-                    span: input.parse::<char_kw::space>()?.span,
-                    classes: Set::new([Class::Space]),
+                    span,
+                    classes: Set::new([Class::Props(props)]),
                 });
             }
 
-            return Err(lookahead.error());
+            let prop = CharProp::lookahead(input, lookahead)?;
+            let span = prop.span();
+
+            prop.append_to(&mut props);
+
+            return Ok(Self {
+                span,
+                classes: Set::new([Class::Props(props)]),
+            });
         }
 
         if lookahead.peek(syn::LitChar) {
@@ -156,28 +146,6 @@ impl CharSet {
         if lookahead.peek(Token![$]) {
             return true;
         }
-        // if lookahead.peek(char_kw::alpha) {
-        // }
-        //
-        // if lookahead.peek(char_kw::alphanum) {
-        //     return true;
-        // }
-        //
-        // if lookahead.peek(char_kw::upper) {
-        //     return true;
-        // }
-        //
-        // if lookahead.peek(char_kw::lower) {
-        //     return true;
-        // }
-        //
-        // if lookahead.peek(char_kw::num) {
-        //     return true;
-        // }
-        //
-        // if lookahead.peek(char_kw::space) {
-        //     return true;
-        // }
 
         if lookahead.peek(syn::LitChar) {
             return true;
@@ -186,7 +154,7 @@ impl CharSet {
         false
     }
 
-    pub(super) fn parse_brackets(input: ParseStream) -> Result<Self> {
+    pub(super) fn parse_brackets(input: ParseStream, exclusion: bool) -> Result<Self> {
         let content;
         bracketed!(content in input);
 
@@ -194,6 +162,23 @@ impl CharSet {
 
         let components = Punctuated::<Self, Token![,]>::parse_separated_nonempty(&content)?;
 
+        if exclusion {
+            for component in &components {
+                for class in &component.classes {
+                    let Class::Props(_) = &class else {
+                        continue;
+                    };
+
+                    if !exclusion {
+                        return Err(error!(
+                            component.span,
+                            "Property classes in the exclusion syntax are forbidden.",
+                        ));
+                    }
+                }
+            }
+        }
+
         Ok(components.into_iter().fold(
             Self {
                 span,
@@ -230,10 +215,7 @@ impl CharSet {
 #[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Debug)]
 pub(super) enum Class {
     Char(char),
-    Upper,
-    Lower,
-    Num,
-    Space,
+    Props(CharProperties),
     Other,
 }
 
@@ -242,10 +224,7 @@ impl Display for Class {
     fn fmt(&self, formatter: &mut Formatter<'_>) -> std::fmt::Result {
         match self {
             Self::Char(ch) => formatter.write_fmt(format_args!("{:?}", ch)),
-            Self::Upper => formatter.write_str("$Upper"),
-            Self::Lower => formatter.write_str("$Lower"),
-            Self::Num => formatter.write_str("$Num"),
-            Self::Space => formatter.write_str("$Space"),
+            Self::Props(props) => Display::fmt(props, formatter),
             Self::Other => formatter.write_str("_"),
         }
     }
@@ -256,20 +235,104 @@ impl Class {
     pub(super) fn includes(&self, ch: &char) -> bool {
         match self {
             Self::Char(this) => this == ch,
-            Self::Upper => ch.is_uppercase(),
-            Self::Lower => ch.is_lowercase(),
-            Self::Num => ch.is_numeric(),
-            Self::Space => ch.is_whitespace(),
+            Self::Props(props) => ch.has_properties(props),
             Self::Other => true,
         }
     }
 }
 
+enum CharProp {
+    Alpha(Span),
+    Lower(Span),
+    Num(Span),
+    Space(Span),
+    Upper(Span),
+    XidContinue(Span),
+    XidStart(Span),
+}
+
+impl Parse for CharProp {
+    fn parse(input: ParseStream) -> Result<Self> {
+        let lookahead = input.lookahead1();
+
+        Self::lookahead(input, lookahead)
+    }
+}
+
+impl CharProp {
+    #[inline(always)]
+    fn lookahead(input: ParseStream, lookahead: Lookahead1) -> Result<Self> {
+        if lookahead.peek(char_kw::alpha) {
+            let span = input.parse::<char_kw::alpha>()?.span;
+            return Ok(Self::Alpha(span));
+        }
+
+        if lookahead.peek(char_kw::lower) {
+            let span = input.parse::<char_kw::lower>()?.span;
+            return Ok(Self::Lower(span));
+        }
+
+        if lookahead.peek(char_kw::num) {
+            let span = input.parse::<char_kw::num>()?.span;
+            return Ok(Self::Num(span));
+        }
+
+        if lookahead.peek(char_kw::space) {
+            let span = input.parse::<char_kw::space>()?.span;
+            return Ok(Self::Space(span));
+        }
+
+        if lookahead.peek(char_kw::upper) {
+            let span = input.parse::<char_kw::upper>()?.span;
+            return Ok(Self::Upper(span));
+        }
+
+        if lookahead.peek(char_kw::xid_continue) {
+            let span = input.parse::<char_kw::xid_continue>()?.span;
+            return Ok(Self::XidContinue(span));
+        }
+
+        if lookahead.peek(char_kw::xid_start) {
+            let span = input.parse::<char_kw::xid_start>()?.span;
+            return Ok(Self::XidStart(span));
+        }
+
+        Err(lookahead.error())
+    }
+
+    #[inline(always)]
+    fn append_to(self, props: &mut CharProperties) {
+        match self {
+            Self::Alpha(_) => props.alpha = true,
+            Self::Lower(_) => props.lower = true,
+            Self::Num(_) => props.num = true,
+            Self::Space(_) => props.space = true,
+            Self::Upper(_) => props.upper = true,
+            Self::XidContinue(_) => props.xid_continue = true,
+            Self::XidStart(_) => props.xid_start = true,
+        }
+    }
+
+    #[inline(always)]
+    fn span(&self) -> Span {
+        match self {
+            Self::Alpha(span) => *span,
+            Self::Lower(span) => *span,
+            Self::Num(span) => *span,
+            Self::Space(span) => *span,
+            Self::Upper(span) => *span,
+            Self::XidContinue(span) => *span,
+            Self::XidStart(span) => *span,
+        }
+    }
+}
+
 mod char_kw {
     syn::custom_keyword!(alpha);
-    syn::custom_keyword!(alphanum);
-    syn::custom_keyword!(upper);
     syn::custom_keyword!(lower);
     syn::custom_keyword!(num);
     syn::custom_keyword!(space);
+    syn::custom_keyword!(upper);
+    syn::custom_keyword!(xid_continue);
+    syn::custom_keyword!(xid_start);
 }
diff --git a/work/crates/derive/src/token/input.rs b/work/crates/derive/src/token/input.rs
index 306cb11..0f56765 100644
--- a/work/crates/derive/src/token/input.rs
+++ b/work/crates/derive/src/token/input.rs
@@ -403,6 +403,8 @@ impl TryFrom<DeriveInput> for TokenInput {
 
         automata.merge(&mut scope, &variants)?;
 
+        automata.check_property_conflicts(ident.span())?;
+
         scope.set_strategy(opt.into_strategy());
         scope.optimize(&mut automata);
 
diff --git a/work/crates/derive/src/token/mod.rs b/work/crates/derive/src/token/mod.rs
index e36cf89..01f7844 100644
--- a/work/crates/derive/src/token/mod.rs
+++ b/work/crates/derive/src/token/mod.rs
@@ -38,6 +38,8 @@ mod input;
 mod opt;
 mod output;
 mod regex;
+#[path = "../../../main/src/lexis/ucd.rs"]
+mod ucd;
 mod variant;
 
 pub use crate::token::input::TokenInput;
diff --git a/work/crates/derive/src/token/output.rs b/work/crates/derive/src/token/output.rs
index a932b26..5213d97 100644
--- a/work/crates/derive/src/token/output.rs
+++ b/work/crates/derive/src/token/output.rs
@@ -43,7 +43,7 @@ use quote::ToTokens;
 use syn::{spanned::Spanned, LitByte, LitStr};
 
 use crate::{
-    token::{automata::Terminal, chars::Class, TokenInput},
+    token::{automata::Terminal, chars::Class, ucd::CharProperties, TokenInput},
     utils::{
         expect_some,
         null,
@@ -67,12 +67,7 @@ pub(super) struct Output<'a> {
     from: State,
     ascii: BTreeMap<State, Set<u8>>,
     unicode: BTreeMap<State, Set<char>>,
-    upper: Option<State>,
-    lower: Option<State>,
-    num: Option<State>,
-    space: Option<State>,
-    alphabetic: Option<State>,
-    alphanumeric: Option<State>,
+    properties: Option<(CharProperties, State)>,
     other: Option<State>,
 }
 
@@ -88,12 +83,7 @@ impl<'a> Output<'a> {
             from: 0,
             ascii: BTreeMap::new(),
             unicode: BTreeMap::new(),
-            upper: None,
-            lower: None,
-            num: None,
-            space: None,
-            alphabetic: None,
-            alphanumeric: None,
+            properties: None,
             other: None,
         };
 
@@ -144,14 +134,12 @@ impl<'a> Output<'a> {
                     _ => Self::pattern(set),
                 };
 
-                let handle = self.handle(to, false);
+                let handle = self.handle(to, false, false);
 
                 quote!(#pattern => #handle)
             })
             .collect::<Vec<_>>();
 
-        self.merge_classes();
-
         let fallback = self.fallback();
 
         let from = self.from;
@@ -198,7 +186,7 @@ impl<'a> Output<'a> {
                     statements.push(quote!(unsafe {
                         #core::lexis::LexisSession::consume(session)
                     }));
-                    statements.append(self.handle(to, true));
+                    statements.append(self.handle(to, true, false));
                 }
             }
 
@@ -213,7 +201,7 @@ impl<'a> Output<'a> {
             .into_iter()
             .map(|(to, set)| {
                 let pattern = Self::pattern(set);
-                let handle = self.handle(to, true);
+                let handle = self.handle(to, true, true);
 
                 quote!(#pattern => #handle)
             })
@@ -230,52 +218,18 @@ impl<'a> Output<'a> {
             ))
         }
 
-        if let Some(to) = self.upper {
-            let mut handle = self.handle(to, true);
-            handle.surround = true;
-
-            statements.push_branching(quote!(if char::is_uppercase(ch) #handle));
-        }
-
-        if let Some(to) = self.lower {
-            let mut handle = self.handle(to, true);
+        if let Some((properties, to)) = self.properties {
+            let matcher = Self::properties_matcher(Span::call_site(), properties);
+            let mut handle = self.handle(to, true, true);
             handle.surround = true;
 
-            statements.push_branching(quote!(if char::is_lowercase(ch) #handle));
-        }
-
-        if let Some(to) = self.alphabetic {
-            let mut handle = self.handle(to, true);
-            handle.surround = true;
-
-            statements.push_branching(quote!(if char::is_alphabetic(ch) #handle));
-        }
-
-        if let Some(to) = self.num {
-            let mut handle = self.handle(to, true);
-            handle.surround = true;
-
-            statements.push_branching(quote!(if char::is_numeric(ch) #handle));
-        }
-
-        if let Some(to) = self.alphanumeric {
-            let mut handle = self.handle(to, true);
-            handle.surround = true;
-
-            statements.push_branching(quote!(if char::is_alphanumeric(ch) #handle));
-        }
-
-        if let Some(to) = self.space {
-            let mut handle = self.handle(to, true);
-            handle.surround = true;
-
-            statements.push_branching(quote!(if char::is_whitespace(ch) #handle));
+            statements.push_branching(quote!(if #matcher #handle));
         }
 
         match self.other {
             None => statements.push(quote!(break)),
             Some(to) => {
-                let handle = self.handle(to, true);
+                let handle = self.handle(to, true, false);
                 statements.append(handle);
             }
         }
@@ -283,25 +237,6 @@ impl<'a> Output<'a> {
         statements
     }
 
-    fn merge_classes(&mut self) {
-        if self.upper.is_some() && self.upper == self.lower {
-            self.alphabetic = self.upper;
-            self.upper = None;
-            self.lower = None;
-        }
-
-        if self.alphabetic.is_some() && self.alphabetic == self.num {
-            self.alphanumeric = self.alphabetic;
-            self.alphabetic = None;
-            self.num = None;
-        }
-
-        if self.other.is_some() && self.other == self.space && self.other == self.alphanumeric {
-            self.space = None;
-            self.alphanumeric = None;
-        }
-    }
-
     fn requires_char(&self) -> bool {
         if self.buffering {
             return true;
@@ -311,34 +246,14 @@ impl<'a> Output<'a> {
             return true;
         }
 
-        if self.upper.is_some() {
-            return true;
-        }
-
-        if self.lower.is_some() {
-            return true;
-        }
-
-        if self.num.is_some() {
-            return true;
-        }
-
-        if self.space.is_some() {
-            return true;
-        }
-
-        if self.alphabetic.is_some() {
-            return true;
-        }
-
-        if self.alphanumeric.is_some() {
+        if self.properties.is_some() {
             return true;
         }
 
         false
     }
 
-    fn handle(&mut self, to: State, unicode: bool) -> Statements {
+    fn handle(&mut self, to: State, unicode: bool, force_continue: bool) -> Statements {
         let mut statements = Statements::default();
 
         if let Some(index) = self.input.products.get(&to) {
@@ -404,6 +319,10 @@ impl<'a> Output<'a> {
 
                     statements.push(quote!(state = #to))
                 }
+
+                if force_continue {
+                    statements.push(quote!(continue));
+                }
             }
         };
 
@@ -417,24 +336,9 @@ impl<'a> Output<'a> {
                 false => self.insert_unicode(*ch, to),
             },
 
-            Class::Upper => {
-                self.upper = Some(to);
-                self.insert_ascii_class(Class::Upper, to);
-            }
-
-            Class::Lower => {
-                self.lower = Some(to);
-                self.insert_ascii_class(Class::Lower, to);
-            }
-
-            Class::Num => {
-                self.num = Some(to);
-                self.insert_ascii_class(Class::Num, to);
-            }
-
-            Class::Space => {
-                self.space = Some(to);
-                self.insert_ascii_class(Class::Space, to);
+            Class::Props(props) => {
+                self.properties = Some((*props, to));
+                self.insert_ascii_class(Class::Props(*props), to);
             }
 
             Class::Other => {
@@ -486,12 +390,7 @@ impl<'a> Output<'a> {
     fn reset(&mut self) {
         self.ascii.clear();
         self.unicode.clear();
-        self.upper = None;
-        self.lower = None;
-        self.num = None;
-        self.space = None;
-        self.alphabetic = None;
-        self.alphanumeric = None;
+        self.properties = None;
         self.other = None;
     }
 
@@ -553,6 +452,60 @@ impl<'a> Output<'a> {
 
         quote!(#( #groups )|*)
     }
+
+    fn properties_matcher(span: Span, properties: CharProperties) -> TokenStream {
+        let core = span.face_core();
+
+        let mut setters = Vec::new();
+        let mut single = None;
+
+        if properties.alpha {
+            setters.push(quote_spanned!(span=> props.alpha = true;));
+            single = Some(quote_spanned!(span=> #core::lexis::Char::is_alpha(ch)));
+        }
+
+        if properties.lower {
+            setters.push(quote_spanned!(span=> props.lower = true;));
+            single = Some(quote_spanned!(span=> #core::lexis::Char::is_lower(ch)));
+        }
+
+        if properties.num {
+            setters.push(quote_spanned!(span=> props.num = true;));
+            single = Some(quote_spanned!(span=> #core::lexis::Char::is_num(ch)));
+        }
+
+        if properties.space {
+            setters.push(quote_spanned!(span=> props.space = true;));
+            single = Some(quote_spanned!(span=> #core::lexis::Char::is_space(ch)));
+        }
+
+        if properties.upper {
+            setters.push(quote_spanned!(span=> props.upper = true;));
+            single = Some(quote_spanned!(span=> #core::lexis::Char::is_upper(ch)));
+        }
+
+        if properties.xid_continue {
+            setters.push(quote_spanned!(span=> props.xid_continue = true;));
+            single = Some(quote_spanned!(span=> #core::lexis::Char::is_xid_continue(ch)));
+        }
+
+        if properties.xid_start {
+            setters.push(quote_spanned!(span=> props.xid_start = true;));
+            single = Some(quote_spanned!(span=> #core::lexis::Char::is_xid_start(ch)));
+        }
+
+        if setters.len() == 1 {
+            return expect_some!(single, "Missing single matcher.",);
+        }
+
+        quote_spanned! (span=> #core::lexis::Char::has_properties(&const {
+            let mut props = #core::lexis::CharProperties::new();
+
+            #( #setters )*
+
+            props
+        }))
+    }
 }
 
 trait Continuous {
diff --git a/work/crates/derive/src/token/regex.rs b/work/crates/derive/src/token/regex.rs
index 9f123a3..1c98ee5 100644
--- a/work/crates/derive/src/token/regex.rs
+++ b/work/crates/derive/src/token/regex.rs
@@ -127,35 +127,14 @@ impl RegexImpl for Regex {
             Self::Operand(Operand::Exclusion(set)) => {
                 let mut alphabet = alphabet.clone();
 
-                let mut upper = true;
-                let mut lower = true;
-                let mut num = true;
-                let mut space = true;
-
                 for exclusion in &set.classes {
                     match exclusion {
                         Class::Char(ch) => {
                             let _ = alphabet.remove(ch);
                         }
 
-                        Class::Upper => {
-                            alphabet.retain(|ch| !Class::Upper.includes(ch));
-                            upper = false;
-                        }
-
-                        Class::Lower => {
-                            alphabet.retain(|ch| !Class::Lower.includes(ch));
-                            lower = false;
-                        }
-
-                        Class::Num => {
-                            alphabet.retain(|ch| !Class::Num.includes(ch));
-                            num = false;
-                        }
-
-                        Class::Space => {
-                            alphabet.retain(|ch| !Class::Space.includes(ch));
-                            space = false;
+                        Class::Props(_) => {
+                            system_panic!("Exclusion contains Property class.");
                         }
 
                         Class::Other => {
@@ -164,36 +143,14 @@ impl RegexImpl for Regex {
                     }
                 }
 
-                let mut generics = Vec::with_capacity(4);
+                let regex = alphabet.into_iter().map(|ch| Class::Char(ch)).fold(
+                    Self::Operand(Operand::Class(set.span, Class::Other)),
+                    |left, right| {
+                        let right = Self::Operand(Operand::Class(set.span, right));
 
-                if upper {
-                    generics.push(Class::Upper);
-                }
-
-                if lower {
-                    generics.push(Class::Lower);
-                }
-
-                if num {
-                    generics.push(Class::Num);
-                }
-
-                if space {
-                    generics.push(Class::Space);
-                }
-
-                let regex = alphabet
-                    .into_iter()
-                    .map(|ch| Class::Char(ch))
-                    .chain(generics)
-                    .fold(
-                        Self::Operand(Operand::Class(set.span, Class::Other)),
-                        |left, right| {
-                            let right = Self::Operand(Operand::Class(set.span, right));
-
-                            Self::Binary(Box::new(left), Operator::Union, Box::new(right))
-                        },
-                    );
+                        Self::Binary(Box::new(left), Operator::Union, Box::new(right))
+                    },
+                );
 
                 *self = regex;
             }
@@ -218,10 +175,9 @@ impl RegexImpl for Regex {
 
                 match class {
                     Class::Char(_) => (),
-                    Class::Upper => *self = expand_class(*span, Class::Upper, alphabet),
-                    Class::Lower => *self = expand_class(*span, Class::Lower, alphabet),
-                    Class::Num => *self = expand_class(*span, Class::Num, alphabet),
-                    Class::Space => *self = expand_class(*span, Class::Space, alphabet),
+                    Class::Props(props) => {
+                        *self = expand_class(*span, Class::Props(*props), alphabet)
+                    }
                     Class::Other => system_panic!("Explicit Other class."),
                 }
             }
@@ -562,7 +518,7 @@ impl ExpressionOperand<Operator> for Operand {
         }
 
         if lookahead.peek(syn::token::Bracket) {
-            let set = CharSet::parse_brackets(input)?;
+            let set = CharSet::parse_brackets(input, false)?;
 
             let expr = expect_some!(set.into_expr(), "Empty CharSet.",);
 
@@ -571,7 +527,7 @@ impl ExpressionOperand<Operator> for Operand {
 
         if lookahead.peek(Token![^]) {
             let _ = input.parse::<Token![^]>()?;
-            let set = CharSet::parse_brackets(input)?;
+            let set = CharSet::parse_brackets(input, true)?;
 
             return Ok(Regex::Operand(Operand::Exclusion(set)));
         }
diff --git a/work/crates/main/src/lexis/mod.rs b/work/crates/main/src/lexis/mod.rs
index 166e4b4..0505ab6 100644
--- a/work/crates/main/src/lexis/mod.rs
+++ b/work/crates/main/src/lexis/mod.rs
@@ -43,6 +43,7 @@ mod session;
 mod site;
 mod span;
 mod token;
+mod ucd;
 
 pub(crate) const CHUNK_SIZE: Length = 5;
 
@@ -59,4 +60,5 @@ pub use crate::lexis::{
     site::{ByteIndex, Length, Site, SiteRef, ToSite, NIL_SITE_REF},
     span::{PositionSpan, SiteRefSpan, SiteSpan, ToSpan},
     token::{Token, TokenCount, TokenRef, NIL_TOKEN_REF},
+    ucd::{Char, CharProperties},
 };
diff --git a/work/crates/main/src/lexis/ucd.rs b/work/crates/main/src/lexis/ucd.rs
new file mode 100644
index 0000000..1e2ef16
--- /dev/null
+++ b/work/crates/main/src/lexis/ucd.rs
@@ -0,0 +1,2331 @@
+////////////////////////////////////////////////////////////////////////////////
+// This file is a part of the "Lady Deirdre" work,                            //
+// a compiler front-end foundation technology.                                //
+//                                                                            //
+// This work is proprietary software with source-available code.              //
+//                                                                            //
+// To copy, use, distribute, and contribute to this work, you must agree to   //
+// the terms of the General License Agreement:                                //
+//                                                                            //
+// https://github.com/Eliah-Lakhin/lady-deirdre/blob/master/EULA.md.          //
+//                                                                            //
+// The agreement grants you a Commercial-Limited License that gives you       //
+// the right to use my work in non-commercial and limited commercial products //
+// with a total gross revenue cap. To remove this commercial limit for one of //
+// your products, you must acquire an Unrestricted Commercial License.        //
+//                                                                            //
+// If you contribute to the source code, documentation, or related materials  //
+// of this work, you must assign these changes to me. Contributions are       //
+// governed by the "Derivative Work" section of the General License           //
+// Agreement.                                                                 //
+//                                                                            //
+// Copying the work in parts is strictly forbidden, except as permitted under //
+// the terms of the General License Agreement.                                //
+//                                                                            //
+// If you do not or cannot agree to the terms of this Agreement,              //
+// do not use this work.                                                      //
+//                                                                            //
+// This work is provided "as is" without any warranties, express or implied,  //
+// except to the extent that such disclaimers are held to be legally invalid. //
+//                                                                            //
+// Copyright (c) 2024 Ilya Lakhin (Илья Александрович Лахин).                 //
+// All rights reserved.                                                       //
+////////////////////////////////////////////////////////////////////////////////
+
+//////////////////////////////////////////////////////////////////////////////////
+// A part of this file's source code has been generated based on the data files //
+// from the Unicode Character Database (UCD).                                   //
+//                                                                              //
+// The Unicode, Inc grants me with a license to their data files under the      //
+// following terms:                                                             //
+//                                                                              //
+//   UNICODE LICENSE V3                                                         //
+//                                                                              //
+//   COPYRIGHT AND PERMISSION NOTICE                                            //
+//                                                                              //
+//   Copyright © 1991-2024 Unicode, Inc.                                        //
+//                                                                              //
+//   NOTICE TO USER: Carefully read the following legal agreement. BY           //
+//   DOWNLOADING, INSTALLING, COPYING OR OTHERWISE USING DATA FILES, AND/OR     //
+//   SOFTWARE, YOU UNEQUIVOCALLY ACCEPT, AND AGREE TO BE BOUND BY, ALL OF THE   //
+//   TERMS AND CONDITIONS OF THIS AGREEMENT. IF YOU DO NOT AGREE, DO NOT        //
+//   DOWNLOAD, INSTALL, COPY, DISTRIBUTE OR USE THE DATA FILES OR SOFTWARE.     //
+//                                                                              //
+//   Permission is hereby granted, free of charge, to any person obtaining a    //
+//   copy of data files and any associated documentation (the "Data Files") or  //
+//   software and any associated documentation (the "Software") to deal in the  //
+//   Data Files or Software without restriction, including without limitation   //
+//   the rights to use, copy, modify, merge, publish, distribute, and/or sell   //
+//   copies of the Data Files or Software, and to permit persons to whom the    //
+//   Data Files or Software are furnished to do so, provided that either (a)    //
+//   this copyright and permission notice appear with all copies of the Data    //
+//   Files or Software, or (b) this copyright and permission notice appear in   //
+//   associated Documentation.                                                  //
+//                                                                              //
+//   THE DATA FILES AND SOFTWARE ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY  //
+//   KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF   //
+//   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF   //
+//   THIRD PARTY RIGHTS.                                                        //
+//                                                                              //
+//   IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS NOTICE  //
+//   BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, //
+//   OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,     //
+//   WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,     //
+//   ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THE DATA    //
+//   FILES OR SOFTWARE.                                                         //
+//                                                                              //
+//   Except as contained in this notice, the name of a copyright holder shall   //
+//   not be used in advertising or otherwise to promote the sale, use or other  //
+//   dealings in these Data Files or Software without prior written             //
+//   authorization of the copyright holder.                                     //
+//                                                                              //
+// Kindly be advised that the terms governing the distribution of my work are   //
+// distinct from those pertaining to the UCD data files.                        //
+//////////////////////////////////////////////////////////////////////////////////
+
+// This file is generated by "crates/ucd". Do not edit manually.
+
+/// A configuration for Unicode character properties.
+///
+/// This configuration specifies [character properties](https://en.wikipedia.org/wiki/Unicode_character_property)
+/// of the [char] type.
+///
+/// Using the [Char::has_properties] function, you can check
+/// if a character has specified properties:
+/// `assert!('a'.has_properties(&CharProperties::new().with_lower()))`.
+///
+/// The configuration is inclusive, meaning that that if a character
+/// has at least one of the configured property, has_properties
+/// returns true: `assert!('a'.has_properties(&CharProperties::new().with_alpha().with_num()))`.
+///
+/// By default, this object does not have any configured properties.
+/// Therefore, the has_properties function returns false:
+/// `assert!(!'b'.has_properties(&CharProperties::new()))`.
+///
+/// **Note**: This object is not stabilized yet. New members may be
+/// added in future minor versions of Lady Deirdre. The exact behavior
+/// of already included properties may change over time too to better
+/// match the recent updates in the [Unicode Character Database](https://www.unicode.org/ucd/).
+#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Debug, Hash)]
+#[non_exhaustive]
+pub struct CharProperties {
+    /// Includes `Alphabetic` character property.
+    pub alpha: bool,
+
+    /// Includes `Lowercase` character property.
+    pub lower: bool,
+
+    /// Includes `N`, `Nd`, `Nl`, `No` character properties.
+    pub num: bool,
+
+    /// Includes `White_Space` character property.
+    pub space: bool,
+
+    /// Includes `Uppercase` character property.
+    pub upper: bool,
+
+    /// Includes `XID_Continue` character property.
+    pub xid_continue: bool,
+
+    /// Includes `XID_Start` character property.
+    pub xid_start: bool,
+}
+
+impl std::fmt::Display for CharProperties {
+    #[inline(always)]
+    fn fmt(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        formatter.write_str("$")?;
+
+        let mut props = Vec::new();
+
+        if self.alpha {
+            props.push("alpha");
+        }
+
+        if self.lower {
+            props.push("lower");
+        }
+
+        if self.num {
+            props.push("num");
+        }
+
+        if self.space {
+            props.push("space");
+        }
+
+        if self.upper {
+            props.push("upper");
+        }
+
+        if self.xid_continue {
+            props.push("xid_continue");
+        }
+
+        if self.xid_start {
+            props.push("xid_start");
+        }
+
+        if props.len() == 1 {
+            formatter.write_str(props[0])?;
+            return Ok(());
+        }
+
+        formatter.write_str("{")?;
+
+        let mut first = true;
+
+        for prop in props {
+            match first {
+                true => first = false,
+                false => formatter.write_str(" | ")?,
+            }
+
+            formatter.write_str(prop)?;
+        }
+
+        formatter.write_str("}")?;
+
+        Ok(())
+    }
+}
+
+impl Default for CharProperties {
+    #[inline(always)]
+    fn default() -> Self {
+        Self::new()
+    }
+}
+
+impl CharProperties {
+    /// Returns a new instance with all configuration properties
+    /// set to false.
+    #[inline(always)]
+    pub const fn new() -> Self {
+        Self {
+            alpha: false,
+            lower: false,
+            num: false,
+            space: false,
+            upper: false,
+            xid_continue: false,
+            xid_start: false,
+        }
+    }
+
+    /// Includes `Alphabetic` character property.
+    #[inline(always)]
+    pub const fn with_alpha(mut self) -> Self {
+        self.alpha = true;
+
+        self
+    }
+
+    /// Includes `Lowercase` character property.
+    #[inline(always)]
+    pub const fn with_lower(mut self) -> Self {
+        self.lower = true;
+
+        self
+    }
+
+    /// Includes `N`, `Nd`, `Nl`, `No` character properties.
+    #[inline(always)]
+    pub const fn with_num(mut self) -> Self {
+        self.num = true;
+
+        self
+    }
+
+    /// Includes `White_Space` character property.
+    #[inline(always)]
+    pub const fn with_space(mut self) -> Self {
+        self.space = true;
+
+        self
+    }
+
+    /// Includes `Uppercase` character property.
+    #[inline(always)]
+    pub const fn with_upper(mut self) -> Self {
+        self.upper = true;
+
+        self
+    }
+
+    /// Includes `XID_Continue` character property.
+    #[inline(always)]
+    pub const fn with_xid_continue(mut self) -> Self {
+        self.xid_continue = true;
+
+        self
+    }
+
+    /// Includes `XID_Start` character property.
+    #[inline(always)]
+    pub const fn with_xid_start(mut self) -> Self {
+        self.xid_start = true;
+
+        self
+    }
+
+    /// Creates a union of two property configurations.
+    ///
+    /// The resulting configuration includes a property if at least one of
+    /// two specified configuration objects includes this property.
+    #[inline(always)]
+    pub const fn union(mut self, other: Self) -> Self {
+        self.alpha = self.alpha || other.alpha;
+        self.lower = self.lower || other.lower;
+        self.num = self.num || other.num;
+        self.space = self.space || other.space;
+        self.upper = self.upper || other.upper;
+        self.xid_continue = self.xid_continue || other.xid_continue;
+        self.xid_start = self.xid_start || other.xid_start;
+
+        self
+    }
+
+    /// Creates an intersection of two property configurations.
+    ///
+    /// The resulting configuration includes a property if both specified
+    /// configuration objects include this property.
+    #[inline(always)]
+    pub const fn intersect(mut self, other: Self) -> Self {
+        self.alpha = self.alpha && other.alpha;
+        self.lower = self.lower && other.lower;
+        self.num = self.num && other.num;
+        self.space = self.space && other.space;
+        self.upper = self.upper && other.upper;
+        self.xid_continue = self.xid_continue && other.xid_continue;
+        self.xid_start = self.xid_start && other.xid_start;
+
+        self
+    }
+}
+
+/// An extension trait that provides functions to reveal a character's
+/// Unicode properties.
+///
+/// **Note**: This interface is not stabilized yet. New members may be
+/// added in future minor versions of Lady Deirdre. The exact behavior
+/// of already included functions may change over time too to better
+/// match the recent updates in the [Unicode Character Database](https://www.unicode.org/ucd/).
+pub trait Char {
+    /// Returns true if the character has `Alphabetic` property.
+    fn is_alpha(self) -> bool;
+
+    /// Returns true if the character has `Lowercase` property.
+    fn is_lower(self) -> bool;
+
+    /// Returns true if the character has `N`, `Nd`, `Nl`, `No` properties.
+    fn is_num(self) -> bool;
+
+    /// Returns true if the character has `White_Space` property.
+    fn is_space(self) -> bool;
+
+    /// Returns true if the character has `Uppercase` property.
+    fn is_upper(self) -> bool;
+
+    /// Returns true if the character has `XID_Continue` property.
+    fn is_xid_continue(self) -> bool;
+
+    /// Returns true if the character has `XID_Start` property.
+    fn is_xid_start(self) -> bool;
+
+    /// Returns true if the character has at least one of the specified
+    /// properties. See [CharProperties] for details.
+    fn has_properties(self, props: &CharProperties) -> bool;
+}
+
+impl Char for char {
+    #[inline(always)]
+    fn is_alpha(self) -> bool {
+        ALPHABETIC_TABLE.lookup(self as usize)
+    }
+
+    #[inline(always)]
+    fn is_lower(self) -> bool {
+        LOWERCASE_TABLE.lookup(self as usize)
+    }
+
+    #[inline(always)]
+    fn is_num(self) -> bool {
+        NUM_TABLE.lookup(self as usize)
+    }
+
+    #[inline(always)]
+    fn is_space(self) -> bool {
+        WHITE_SPACE_TABLE.lookup(self as usize)
+    }
+
+    #[inline(always)]
+    fn is_upper(self) -> bool {
+        UPPERCASE_TABLE.lookup(self as usize)
+    }
+
+    #[inline(always)]
+    fn is_xid_continue(self) -> bool {
+        XID_CONTINUE_TABLE.lookup(self as usize)
+    }
+
+    #[inline(always)]
+    fn is_xid_start(self) -> bool {
+        XID_START_TABLE.lookup(self as usize)
+    }
+
+    fn has_properties(self, props: &CharProperties) -> bool {
+        if props.alpha && self.is_alpha() {
+            return true;
+        }
+
+        if props.lower && self.is_lower() {
+            return true;
+        }
+
+        if props.num && self.is_num() {
+            return true;
+        }
+
+        if props.space && self.is_space() {
+            return true;
+        }
+
+        if props.upper && self.is_upper() {
+            return true;
+        }
+
+        if props.xid_continue && self.is_xid_continue() {
+            return true;
+        }
+
+        if props.xid_start && self.is_xid_start() {
+            return true;
+        }
+
+        false
+    }
+}
+
+struct UCDTrie {
+    r1: [u64; 32],
+    r2: [u8; 992],
+    r3: &'static [u64],
+    r4: [u8; 256],
+    r5: &'static [u8],
+    r6: &'static [u64],
+}
+
+impl UCDTrie {
+    #[inline(always)]
+    fn lookup(&self, code_point: usize) -> bool {
+        if code_point < 0x800 {
+            return Self::check_chunk(self.r1[code_point >> 6], code_point);
+        }
+
+        if code_point < 0x10000 {
+            let child = self.r2[(code_point >> 6) - 0x20];
+
+            return Self::check_chunk(self.r3[child as usize], code_point);
+        }
+
+        let child = self.r4[(code_point >> 12) - 0x10];
+        let leaf = self.r5[((child as usize) << 6) + ((code_point >> 6) & 0x3f)];
+
+        Self::check_chunk(self.r6[leaf as usize], code_point)
+    }
+
+    #[inline(always)]
+    fn check_chunk(chunk: u64, code_point: usize) -> bool {
+        ((chunk >> (code_point & 63)) & 1) != 0
+    }
+}
+
+#[rustfmt::skip]
+static ALPHABETIC_TABLE: UCDTrie = UCDTrie {
+    r1: [
+        0x0000000000000000, 0x07FFFFFE07FFFFFE, 0x0420040000000000, 0xFF7FFFFFFF7FFFFF,
+        0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF,
+        0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0x0000501F0003FFC3,
+        0x0000000000000000, 0xBCDF000000000020, 0xFFFFFFFBFFFFD740, 0xFFBFFFFFFFFFFFFF,
+        0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFC03, 0xFFFFFFFFFFFFFFFF,
+        0xFFFEFFFFFFFFFFFF, 0xFFFFFFFF027FFFFF, 0xBFFF0000000001FF, 0x000787FFFFFF00B6,
+        0xFFFFFFFF07FF0000, 0xFFFFC000FEFFFFFF, 0xFFFFFFFFFFFFFFFF, 0x9C00E1FE1FEFFFFF,
+        0xFFFFFFFFFFFF0000, 0xFFFFFFFFFFFFE000, 0x0003FFFFFFFFFFFF, 0x043007FFFFFFFC00,
+    ],
+    r2: [
+        0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009,
+        0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F, 0x0010, 0x0011, 0x0012, 0x0013,
+        0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D,
+        0x001E, 0x001F, 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0024, 0x0024, 0x0024,
+        0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x0024,
+        0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x002D, 0x002E, 0x002F,
+        0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039,
+        0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F, 0x0040, 0x0041, 0x0042, 0x0043,
+        0x0044, 0x0045, 0x0046, 0x0047, 0x0024, 0x0024, 0x0024, 0x0048, 0x0024, 0x0024,
+        0x0024, 0x0024, 0x0049, 0x004A, 0x004B, 0x004C, 0x001F, 0x004D, 0x004E, 0x001F,
+        0x004F, 0x0050, 0x0051, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F,
+        0x001F, 0x001F, 0x001F, 0x001F, 0x0052, 0x0053, 0x001F, 0x001F, 0x001F, 0x001F,
+        0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F,
+        0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F,
+        0x001F, 0x001F, 0x001F, 0x001F, 0x0024, 0x0024, 0x0024, 0x0054, 0x0055, 0x0056,
+        0x0057, 0x0058, 0x0059, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F,
+        0x005A, 0x002C, 0x005B, 0x005C, 0x005D, 0x0024, 0x005E, 0x005F, 0x001F, 0x001F,
+        0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x0024, 0x0024, 0x0024, 0x0024,
+        0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024,
+        0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024,
+        0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024,
+        0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024,
+        0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024,
+        0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024,
+        0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024,
+        0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024,
+        0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024,
+        0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x001F,
+        0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024,
+        0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024,
+        0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024,
+        0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024,
+        0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024,
+        0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024,
+        0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024,
+        0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024,
+        0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024,
+        0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024,
+        0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024,
+        0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024,
+        0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024,
+        0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024,
+        0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024,
+        0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024,
+        0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024,
+        0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024,
+        0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024,
+        0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024,
+        0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024,
+        0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024,
+        0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024,
+        0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024,
+        0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024,
+        0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024,
+        0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024,
+        0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024,
+        0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024,
+        0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024,
+        0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024,
+        0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024,
+        0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024,
+        0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024,
+        0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0060, 0x0061, 0x0024, 0x0024,
+        0x0024, 0x0024, 0x0062, 0x0063, 0x0024, 0x0064, 0x0065, 0x0024, 0x0066, 0x0067,
+        0x0068, 0x0069, 0x0024, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x0044, 0x006F,
+        0x0070, 0x0071, 0x0072, 0x0073, 0x0024, 0x0074, 0x0024, 0x0024, 0x0024, 0x0024,
+        0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024,
+        0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024,
+        0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024,
+        0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024,
+        0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024,
+        0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024,
+        0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024,
+        0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024,
+        0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024,
+        0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024,
+        0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024,
+        0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024,
+        0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024,
+        0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024,
+        0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024,
+        0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024,
+        0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024,
+        0x0075, 0x0076, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F,
+        0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F,
+        0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F,
+        0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F,
+        0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F,
+        0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F,
+        0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F,
+        0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F,
+        0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F,
+        0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F,
+        0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F,
+        0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F,
+        0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F,
+        0x001F, 0x001F, 0x001F, 0x001F, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0077,
+        0x0024, 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x0024, 0x0024, 0x0024, 0x0024,
+        0x007D, 0x0021, 0x007E, 0x007F, 0x001F, 0x0080, 0x0024, 0x0081, 0x0082, 0x0083,
+        0x0070, 0x0084,
+    ],
+    r3: &[
+        0x00001FFFFCFFFFFF, 0xFFFF07FF01FFFFFF, 0xFFFFFFFF00007EFF, 0xFFFF03F8FFF003FF,
+        0xEFFFFFFFFFFFFFFF, 0xFFFE000FFFE1DFFF, 0xE3C5FDFFFFF99FEF, 0x1003000FB080599F,
+        0xC36DFDFFFFF987EE, 0x003F00005E021987, 0xE3EDFDFFFFFBBFEE, 0x1E00000F00011BBF,
+        0xE3EDFDFFFFF99FEE, 0x0002000FB0C0199F, 0xC3FFC718D63DC7EC, 0x0000000000811DC7,
+        0xE3FFFDFFFFFDDFFF, 0x0000000F27601DDF, 0xE3EFFDFFFFFDDFEF, 0x000E000F60601DDF,
+        0xE7FFFFFFFFFDDFFF, 0xFC00000F80F05DDF, 0x2FFBFFFFFC7FFFEE, 0x000C0000FF5F807F,
+        0x07FFFFFFFFFFFFFE, 0x000000000000207F, 0x3BFFFFAFFFFFF7D6, 0x00000000F000205F,
+        0x0000000000000001, 0xFFFE1FFFFFFFFEFF, 0x1FFFFFFFFEFFFF0F, 0x0000000000000000,
+        0xF97FFFFFFFFFFFFF, 0xFFFFFFFFFFFF0000, 0xFFFFFFFF3C00FFFF, 0xF7FFFFFFFFFF20BF,
+        0xFFFFFFFFFFFFFFFF, 0xFFFFFFFF3D7F3DFF, 0x7F3DFFFFFFFF3DFF, 0xFFFFFFFFFF7FFF3D,
+        0xFFFFFFFFFF3DFFFF, 0x0000000007FFFFFF, 0xFFFFFFFF0000FFFF, 0x3F3FFFFFFFFFFFFF,
+        0xFFFFFFFFFFFFFFFE, 0xFFFF9FFFFFFFFFFF, 0xFFFFFFFF07FFFFFE, 0x01FFC7FFFFFFFFFF,
+        0x000FFFFF800FFFFF, 0x000DDFFF000FFFFF, 0xFFCFFFFFFFFFFFFF, 0x00000000108001FF,
+        0xFFFFFFFF00000000, 0x01FFFFFFFFFFFFFF, 0xFFFF07FFFFFFFFFF, 0x003FFFFFFFFFFFFF,
+        0x01FF0FFF7FFFFFFF, 0x001F3FFFFFFF0000, 0xFFFF0FFFFFFFFFFF, 0x00000000000003FF,
+        0xFFFFFFFF0FFFFFFF, 0x001FFFFE7FFFFFFF, 0x8000008000000000, 0x0000000000007001,
+        0xFFEFFFFFFFFFFFFF, 0x0000000000001FEF, 0xFC00F3FFFFFFFFFF, 0x0003FFBFFFFFFFFF,
+        0x007FFFFFFFFFFFFF, 0x3FFFFFFFFC00E000, 0xE7FFFFFFFFFF01FF, 0x046FDE0000000000,
+        0x001FFF8000000000, 0xFFFFFFFF3F3FFFFF, 0x3FFFFFFFAAFF3F3F, 0x5FDFFFFFFFFFFFFF,
+        0x1FDC1FFF0FCF1FDC, 0x8002000000000000, 0x000000001FFF0000, 0xF3FFBD503E2FFC84,
+        0xFFFFFFFF000043E0, 0x00000000000001FF, 0xFFC0000000000000, 0x000003FFFFFFFFFF,
+        0x000C781FFFFFFFFF, 0xFFFF20BFFFFFFFFF, 0x000080FFFFFFFFFF, 0x7F7F7F7F007FFFFF,
+        0xFFFFFFFF7F7F7F7F, 0x0000800000000000, 0x1F3E03FE000000E0, 0xFFFFFFFEE07FFFFF,
+        0xF7FFFFFFFFFFFFFF, 0xFFFEFFFFFFFFFFE0, 0xFFFFFFFF00007FFF, 0xFFFF000000000000,
+        0x0000000000001FFF, 0x3FFFFFFFFFFF0000, 0x00000C00FFFF1FFF, 0x8FF07FFFFFFFFFFF,
+        0x0000FFFFFFFFFFFF, 0xFFFFFFFCFF800000, 0xFFFFFFFFFFFFF9FF, 0xFFFC000003EB07FF,
+        0x000000FFFFFFFFBF, 0x000FFFFFFFFFFFFF, 0xE8FC00000000002F, 0xFFFF07FFFFFFFC00,
+        0x1FFFFFFF0007FFFF, 0xFFF7FFFFFFFFFFFF, 0x7C00FFFF00008000, 0xFC7FFFFF00003FFF,
+        0x7FFFFFFFFFFFFFFF, 0x003CFFFF38000005, 0xFFFF7F7F007E7E7E, 0xFFFF03FFF7FFFFFF,
+        0x000007FFFFFFFFFF, 0xFFFF000FFFFFFFFF, 0x0FFFFFFFFFFFF87F, 0xFFFF3FFFFFFFFFFF,
+        0x0000000003FFFFFF, 0x5F7FFDFFE0F8007F, 0xFFFFFFFFFFFFFFDB, 0x0003FFFFFFFFFFFF,
+        0xFFFFFFFFFFF80000, 0x3FFFFFFFFFFFFFFF, 0xFFFFFFFFFFFCFFFF, 0x0FFF0000000000FF,
+        0xFFDF000000000000, 0x1FFFFFFFFFFFFFFF, 0x07FFFFFE00000000, 0xFFFFFFC007FFFFFE,
+        0x000000001CFCFCFC,
+    ],
+    r4: [
+        0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0005,
+        0x0009, 0x000A, 0x0005, 0x000B, 0x000C, 0x000D, 0x0007, 0x0007, 0x0007, 0x0007,
+        0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x000E, 0x000F, 0x0010, 0x0007,
+        0x0011, 0x0012, 0x0007, 0x0013, 0x0014, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005,
+        0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005,
+        0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005,
+        0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005,
+        0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005,
+        0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005,
+        0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005,
+        0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005,
+        0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005,
+        0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005,
+        0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005,
+        0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005,
+        0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005,
+        0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005,
+        0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005,
+        0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005,
+        0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005,
+        0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005,
+        0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005,
+        0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005,
+        0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005,
+        0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005,
+        0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005,
+    ],
+    r5: &[
+        0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0006, 0x0007, 0x0008, 0x0009, 0x000A, 0x000B, 0x0002, 0x0002, 0x000C, 0x000D,
+        0x000E, 0x000F, 0x0010, 0x0004, 0x0002, 0x0002, 0x0002, 0x0002, 0x0011, 0x0012,
+        0x0013, 0x0004, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0004, 0x0019, 0x0004,
+        0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 0x001F, 0x0020, 0x0004, 0x0002, 0x0021,
+        0x0022, 0x0022, 0x0023, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0024, 0x0004,
+        0x0025, 0x0026, 0x0027, 0x0028, 0x0002, 0x0029, 0x002A, 0x002B, 0x0022, 0x002C,
+        0x0002, 0x002D, 0x002E, 0x002F, 0x0030, 0x0031, 0x0032, 0x0033, 0x0004, 0x0004,
+        0x0002, 0x0034, 0x0002, 0x0035, 0x0004, 0x0004, 0x0036, 0x0037, 0x0038, 0x0039,
+        0x003A, 0x0004, 0x003B, 0x003C, 0x0004, 0x0004, 0x002A, 0x0004, 0x003D, 0x003E,
+        0x003F, 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x002A, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0046, 0x0047, 0x0048, 0x0004, 0x0049, 0x004A, 0x004B, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x004C, 0x004D, 0x004E, 0x004F, 0x0004, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0050, 0x0004, 0x0002, 0x0051, 0x0002, 0x0002, 0x0002, 0x0052,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0044, 0x0053, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0054, 0x0055,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x003C, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0002, 0x0002, 0x002A, 0x0056, 0x0038, 0x0057, 0x0054, 0x0058,
+        0x0059, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0002, 0x0004, 0x0004, 0x0002, 0x005A, 0x005B, 0x005C, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0002, 0x005D, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0002, 0x005E, 0x0021, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x005F,
+        0x0002, 0x0002, 0x0002, 0x0002, 0x0060, 0x0061, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x0062, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0002, 0x0063,
+        0x0064, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0002, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0070, 0x0004, 0x0004, 0x0004, 0x0071, 0x0072,
+        0x0073, 0x0004, 0x0074, 0x0075, 0x0004, 0x0004, 0x0004, 0x0004, 0x0057, 0x0076,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0077, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0078,
+        0x0002, 0x0002, 0x0002, 0x0079, 0x0002, 0x007A, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x007B, 0x007C, 0x007D, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x007E, 0x007F, 0x0080, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0002, 0x0081, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0082, 0x0002,
+        0x0002, 0x0002, 0x000A, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0083, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0084, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0085, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0085, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0086,
+        0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0002, 0x0002, 0x0054, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004,
+    ],
+    r6: &[
+        0xB7FFFF7FFFFFEFFF, 0x000000003FFF3FFF, 0xFFFFFFFFFFFFFFFF, 0x07FFFFFFFFFFFFFF,
+        0x0000000000000000, 0x001FFFFFFFFFFFFF, 0xFFFFFFFF1FFFFFFF, 0x000000000001FFFF,
+        0xFFFFE000FFFFFFFF, 0x07FFFFFFFFFF07FF, 0xFFFFFFFF3FFFFFFF, 0x00000000003EFF0F,
+        0xFFFF00003FFFFFFF, 0x0FFFFFFFFF0FFFFF, 0xFFFF00FFFFFFFFFF, 0xF7FF000FFFFFFFFF,
+        0x1BFBFFFBFFB7F7FF, 0x007FFFFFFFFFFFFF, 0x000000FF003FFFFF, 0x07FDFFFFFFFFFFBF,
+        0x91BFFFFFFFFFFD3F, 0x007FFFFF003FFFFF, 0x000000007FFFFFFF, 0x0037FFFF00000000,
+        0x03FFFFFF003FFFFF, 0xC0FFFFFFFFFFFFFF, 0x003FFFFFFEEFF06F, 0x1FFFFFFF00000000,
+        0x000000001FFFFFFF, 0x0000001FFFFFFEFF, 0x003FFFFFFFFFFFFF, 0x0007FFFF003FFFFF,
+        0x000000000003FFFF, 0x00000000000001FF, 0x0007FFFFFFFFFFFF, 0x000000FFFFFFFFFF,
+        0x00031BFFFFFFFFFF, 0xFFFF00801FFFFFFF, 0xFFFF00000000003F, 0xFFFF000000000003,
+        0x007FFFFF0000001F, 0x003E00000000003F, 0x01FFFFFFFFFFFFFF, 0x000001FFFFFF0004,
+        0x0047FFFFFFFF00F0, 0x000000001400C01E, 0xC09FFFFFFFFBFFFF, 0x0000000000000003,
+        0xFFFF01FFBFFFBD7F, 0x000001FFFFFFFFFF, 0xE3EDFDFFFFF99FEF, 0x0000000FE081199F,
+        0x00000003800007BB, 0x00000000000000B3, 0x7F3FFFFFFFFFFFFF, 0x000000003F000000,
+        0x7FFFFFFFFFFFFFFF, 0x0000000000000011, 0x013FFFFFFFFFFFFF, 0x000007FFE7FFFFFF,
+        0x000000000000007F, 0xFFFFFFFF00000000, 0x80000000FFFFFFFF, 0x99BFFFFFFF6FF27F,
+        0x0000000000000007, 0xFFFFFCFF00000000, 0x0000001AFCFFFFFF, 0x7FE7FFFFFFFFFFFF,
+        0xFFFFFFFFFFFF0000, 0xFFFF000020FFFFFF, 0x7F7FFFFFFFFFFDFF, 0xFFFC000000000001,
+        0x007FFEFFFFFCFFFF, 0xB47FFFFFFFFFFB7F, 0xFFFFFDBF000000CB, 0x00000000017B7FFF,
+        0x007FFFFF00000000, 0xC7FFFFFFFFFDFFFF, 0x0000000000000001, 0x0001000000000000,
+        0x0000000003FFFFFF, 0x00007FFFFFFFFFFF, 0x000000000000000F, 0x0001FFFFFFFFFFFF,
+        0x0000FFFFFFFFFFFF, 0x000000000000007E, 0xFFFF00007FFFFFFF, 0x00003FFFFFFF0000,
+        0xE0FFFFF80000000F, 0x000000000000FFFF, 0xFFFFFFFFFFFF87FF, 0x00000000FFFF80FF,
+        0x0003000B00000000, 0x00FFFFFFFFFFFFFF, 0x00000000003FFFFF, 0x6FEF000000000000,
+        0x00040007FFFFFFFF, 0xFFFF00F000270000, 0x0FFFFFFFFFFFFFFF, 0x1FFF07FFFFFFFFFF,
+        0x0000000043FF01FF, 0xFFFFFFFFFFDFFFFF, 0xEBFFDE64DFFFFFFF, 0xFFFFFFFFFFFFFFEF,
+        0x7BFFFFFFDFDFE7BF, 0xFFFFFFFFFFFDFC5F, 0xFFFFFF3FFFFFFFFF, 0xF7FFFFFFF7FFFFFD,
+        0xFFDFFFFFFFDFFFFF, 0xFFFF7FFFFFFF7FFF, 0xFFFFFDFFFFFFFDFF, 0x0000000000000FF7,
+        0x000007E07FFFFFFF, 0xFFFF07DBF9FFFF7F, 0x00003FFFFFFFFFFF, 0x0000000000008000,
+        0x3F801FFFFFFFFFFF, 0x0000000000004000, 0x00000FFFFFFFFFFF, 0x00000FFFFFFF0000,
+        0x7FFF6F7F00000000, 0x000000000000001F, 0x000000000000088F, 0x0AF7FE96FFFFFFEF,
+        0x5EF7F796AA96EA84, 0x0FFFFBEE0FFFFBFF, 0xFFFF000000000000, 0xFFFF03FFFFFF03FF,
+        0x00000000000003FF, 0x00000000FFFFFFFF, 0x03FFFFFFFFFFFFFF, 0xFFFF0003FFFFFFFF,
+        0xFFFF0001FFFFFFFF, 0x000000003FFFFFFF, 0xFFFFFFFFFFFF07FF,
+    ],
+};
+
+#[rustfmt::skip]
+static LOWERCASE_TABLE: UCDTrie = UCDTrie {
+    r1: [
+        0x0000000000000000, 0x07FFFFFE00000000, 0x0420040000000000, 0xFF7FFFFF80000000,
+        0x55AAAAAAAAAAAAAA, 0xD4AAAAAAAAAAAB55, 0xE6512D2A4E243129, 0xAA29AAAAB5555240,
+        0x93FAAAAAAAAAAAAA, 0xFFFFFFFFFFFFAA85, 0x01FFFFFFFFEFFFFF, 0x0000001F00000003,
+        0x0000000000000000, 0x3C8A000000000020, 0xFFFFF00000010000, 0x192FAAAAAAE37FFF,
+        0xFFFF000000000000, 0xAAAAAAAAFFFFFFFF, 0xAAAAAAAAAAAAA802, 0xAAAAAAAAAAAAD554,
+        0x0000AAAAAAAAAAAA, 0xFFFFFFFF00000000, 0x00000000000001FF, 0x0000000000000000,
+        0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000,
+        0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000,
+    ],
+    r2: [
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0002, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0003, 0x0000, 0x0004, 0x0004, 0x0004, 0x0000, 0x0005, 0x0005,
+        0x0006, 0x0005, 0x0007, 0x0008, 0x0009, 0x000A, 0x0000, 0x000B, 0x000C, 0x0000,
+        0x000D, 0x000E, 0x000F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0010, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0011, 0x0012, 0x0005, 0x0013, 0x0014, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0015, 0x0016, 0x0000, 0x0017, 0x0018, 0x0019, 0x001A,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0011, 0x001B, 0x0004, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x001C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x001D,
+        0x0000, 0x0000,
+    ],
+    r3: &[
+        0x0000000000000000, 0xF7FFFFFFFFFF0000, 0x3F00000000000000, 0x00000000000001FF,
+        0xFFFFFFFFFFFFFFFF, 0xAAAAAAAAAAAAAAAA, 0xAAAAAAAABFEAAAAA, 0x00FF00FF003F00FF,
+        0x3FFF00FF00FF003F, 0x40DF00FF00FF00FF, 0x00DC00FF00CF00DC, 0x8002000000000000,
+        0x000000001FFF0000, 0x321080000008C400, 0xFFFF0000000043C0, 0x0000000000000010,
+        0x000003FFFFFF0000, 0xFFFF000000000000, 0x3FDA1562FFFFFFFF, 0x0008501AAAAAAAAA,
+        0x000020BFFFFFFFFF, 0x00002AAAAAAAAAAA, 0x000000003AAAAAAA, 0xAAABAAA800000000,
+        0x95FFAAAAAAAAAAAA, 0xAAA082AAAABA50AA, 0x075C000002AA050A, 0xFFFF03FFF7FFFFFF,
+        0x0000000000F8007F, 0x0000000007FFFFFE,
+    ],
+    r4: [
+        0x0000, 0x0001, 0x0002, 0x0002, 0x0002, 0x0002, 0x0003, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0002, 0x0004, 0x0005, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
+    ],
+    r5: &[
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0002, 0x0000, 0x0003,
+        0x0000, 0x0000, 0x0004, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0005, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0006, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0007,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0008,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F, 0x0010,
+        0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0019, 0x0000, 0x0000, 0x0000,
+        0x001A, 0x001B, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x001C, 0x001D, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000,
+    ],
+    r6: &[
+        0x0000000000000000, 0xFFFFFF0000000000, 0x000000000000FFFF, 0x0FFFFFFFFF000000,
+        0x1BFBFFFBFF800000, 0x07FDFFFFFFFFFFB9, 0x0007FFFFFFFFFFFF, 0x00000000FFFFFFFF,
+        0xFFFFFFFF00000000, 0x000FFFFFFC000000, 0x000000FFFFDFC000, 0xEBC000000FFFFFFC,
+        0xFFFFFC000000FFEF, 0x00FFFFFFC000000F, 0x00000FFFFFFC0000, 0xFC000000FFFFFFC0,
+        0xFFFFC000000FFFFF, 0x0FFFFFFC000000FF, 0x0000FFFFFFC00000, 0x0000003FFFFFFC00,
+        0xF0000003F7FFFFFC, 0xFFC000000FDFFFFF, 0xFFFF0000003F7FFF, 0xFFFFFC000000FDFF,
+        0x0000000000000BF7, 0x000007E07FFFFBFF, 0xFFFF000000000000, 0x00003FFFFFFFFFFF,
+        0xFFFFFFFC00000000, 0x000000000000000F,
+    ],
+};
+
+#[rustfmt::skip]
+static NUM_TABLE: UCDTrie = UCDTrie {
+    r1: [
+        0x03FF000000000000, 0x0000000000000000, 0x720C000000000000, 0x0000000000000000,
+        0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000,
+        0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000,
+        0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000,
+        0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000,
+        0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000,
+        0x0000000000000000, 0x000003FF00000000, 0x0000000000000000, 0x03FF000000000000,
+        0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x00000000000003FF,
+    ],
+    r2: [
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0002, 0x0000, 0x0001,
+        0x0000, 0x0001, 0x0000, 0x0003, 0x0000, 0x0004, 0x0000, 0x0005, 0x0000, 0x0001,
+        0x0000, 0x0006, 0x0000, 0x0001, 0x0000, 0x0007, 0x0000, 0x0007, 0x0008, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0009, 0x0007, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x000A, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x000B,
+        0x0000, 0x0000, 0x0000, 0x000C, 0x0007, 0x0000, 0x0000, 0x0000, 0x0000, 0x000D,
+        0x0000, 0x000E, 0x0000, 0x0000, 0x000F, 0x0000, 0x0000, 0x0007, 0x0010, 0x0000,
+        0x0000, 0x000F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0011, 0x0009, 0x0000,
+        0x0000, 0x0012, 0x0013, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0014, 0x0015, 0x0016, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0017, 0x0018, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0019, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x001A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x001B, 0x0000, 0x001C, 0x001D,
+        0x001E, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x001C, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x001F, 0x0000, 0x0000, 0x0007, 0x0009, 0x0000, 0x0000, 0x0020, 0x0000, 0x0007,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0010, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0007, 0x0000,
+        0x0000, 0x0000,
+    ],
+    r3: &[
+        0x0000000000000000, 0x0000FFC000000000, 0x03F0FFC000000000, 0x00FCFFC000000000,
+        0x0007FFC000000000, 0x7F00FFC000000000, 0x01FFFFC07F000000, 0x0000000003FF0000,
+        0x000FFFFF00000000, 0x00000000000003FF, 0x1FFFFE0000000000, 0x0001C00000000000,
+        0x03FF03FF00000000, 0x000000000000FFC0, 0x0000000007FF0000, 0x0000000003FF03FF,
+        0x03FF000000000000, 0x03F1000000000000, 0xFFFFFFFFFFFF0000, 0x00000000000003E7,
+        0xFFFFFFFF00000000, 0x000000000FFFFFFF, 0xFFFFFC0000000000, 0xFFC0000000000000,
+        0x00000000000FFFFF, 0x2000000000000000, 0x070003FE00000080, 0x00000000003C0000,
+        0x000003FF00000000, 0x00000000FFFEFF00, 0xFFFE0000000003FF, 0x003F000000000000,
+        0x03FF000003FF0000,
+    ],
+    r4: [
+        0x0000, 0x0001, 0x0002, 0x0003, 0x0003, 0x0003, 0x0004, 0x0003, 0x0003, 0x0003,
+        0x0003, 0x0003, 0x0003, 0x0005, 0x0006, 0x0007, 0x0003, 0x0003, 0x0003, 0x0003,
+        0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003,
+        0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003,
+        0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003,
+        0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003,
+        0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003,
+        0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003,
+        0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003,
+        0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003,
+        0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003,
+        0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003,
+        0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003,
+        0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003,
+        0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003,
+        0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003,
+        0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003,
+        0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003,
+        0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003,
+        0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003,
+        0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003,
+        0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003,
+        0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003,
+        0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003,
+        0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003,
+        0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003,
+    ],
+    r5: &[
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0002, 0x0003, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0004, 0x0005, 0x0006, 0x0000, 0x0007, 0x0000, 0x0000, 0x0008, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0009, 0x000A, 0x000B, 0x000C, 0x0000, 0x000D, 0x000E,
+        0x0000, 0x000F, 0x0010, 0x0011, 0x0000, 0x0012, 0x0013, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0014, 0x0015, 0x0000, 0x0000, 0x0000, 0x0000, 0x0016, 0x0000, 0x0000,
+        0x0017, 0x0018, 0x0000, 0x0019, 0x0000, 0x001A, 0x0000, 0x0015, 0x001B, 0x0000,
+        0x0000, 0x001C, 0x0000, 0x0000, 0x0000, 0x0015, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x001D, 0x0000, 0x001D, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x001D,
+        0x0000, 0x001E, 0x001F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0020,
+        0x0000, 0x001D, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0021, 0x0000, 0x0000, 0x0000, 0x001D, 0x0008, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x001D, 0x0000, 0x0022, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0023, 0x0024, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0008, 0x0000, 0x001E,
+        0x0000, 0x0025, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0026, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0027, 0x0000, 0x0028, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0029, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x001E,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0015, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0015, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x002A,
+        0x0000, 0x001D, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x002B, 0x002C, 0x0000, 0x002D, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x002E, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0015, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000,
+    ],
+    r6: &[
+        0x0000000000000000, 0x000FFFFFFFFFFF80, 0x01FFFFFFFFFFFFFF, 0x0000000000000C00,
+        0x0FFFFFFE00000000, 0x0000000F00000000, 0x0000000000000402, 0x00000000003E0000,
+        0x000003FF00000000, 0xFE000000FF000000, 0x0000FF8000000000, 0xF800000000000000,
+        0x000000000FC00000, 0x3000000000000000, 0xFFFFFFFFFFFCFFFF, 0x60000000000001FF,
+        0x00000000E0000000, 0x0000F80000000000, 0xFF000000FF000000, 0x0000FE0000000000,
+        0xFC00000000000000, 0x03FF000000000000, 0x7FFFFFFF00000000, 0x0000007FE0000000,
+        0x00000000001E0000, 0x0000000000000FE0, 0x0000FFFFFFFC0000, 0xFFC0000000000000,
+        0x001FFFFE03FF0000, 0x0000000003FF0000, 0x00000000000003FF, 0x0FFF000000000000,
+        0x0007FFFF00000000, 0x00001FFFFFFF0000, 0x00000000001FFFFF, 0xFFFFFFFFFFFFFFFF,
+        0x00007FFFFFFFFFFF, 0x00000003FBFF0000, 0x00000000007FFFFF, 0x000FFFFF000FFFFF,
+        0x01FFFFFF00000000, 0xFFFFFFFFFFFFC000, 0x000000000000FF80, 0xFFFE000000000000,
+        0x001EEFFFFFFFFFFF, 0x3FFFBFFFFFFFFFFE, 0x0000000000001FFF,
+    ],
+};
+
+#[rustfmt::skip]
+static WHITE_SPACE_TABLE: UCDTrie = UCDTrie {
+    r1: [
+        0x0000000100003E00, 0x0000000000000000, 0x0000000100000020, 0x0000000000000000,
+        0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000,
+        0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000,
+        0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000,
+        0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000,
+        0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000,
+        0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000,
+        0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000,
+    ],
+    r2: [
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0002, 0x0003, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000,
+    ],
+    r3: &[
+        0x0000000000000000, 0x0000000000000001, 0x00008300000007FF, 0x0000000080000000,
+    ],
+    r4: [
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    ],
+    r5: &[
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000,
+    ],
+    r6: &[
+        0x0000000000000000,
+    ],
+};
+
+#[rustfmt::skip]
+static UPPERCASE_TABLE: UCDTrie = UCDTrie {
+    r1: [
+        0x0000000000000000, 0x0000000007FFFFFE, 0x0000000000000000, 0x000000007F7FFFFF,
+        0xAA55555555555555, 0x2B555555555554AA, 0x11AED2D5B1DBCED6, 0x55D255554AAAA490,
+        0x6C05555555555555, 0x000000000000557A, 0x0000000000000000, 0x0000000000000000,
+        0x0000000000000000, 0x8045000000000000, 0x00000FFBFFFED740, 0xE6905555551C8000,
+        0x0000FFFFFFFFFFFF, 0x5555555500000000, 0x5555555555555401, 0x5555555555552AAB,
+        0xFFFE555555555555, 0x00000000007FFFFF, 0x0000000000000000, 0x0000000000000000,
+        0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000,
+        0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000,
+    ],
+    r2: [
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0002, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0003, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0004, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0005, 0x0005,
+        0x0006, 0x0005, 0x0007, 0x0008, 0x0009, 0x000A, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x000B, 0x000C, 0x000D, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x000E, 0x000F, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0010, 0x0011, 0x0005, 0x0012, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0013, 0x0014, 0x0000, 0x0015, 0x0016, 0x0017, 0x0018,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0019, 0x0000,
+        0x0000, 0x0000,
+    ],
+    r3: &[
+        0x0000000000000000, 0xFFFFFFFF00000000, 0x00000000000020BF, 0x003FFFFFFFFFFFFF,
+        0xE7FFFFFFFFFF0000, 0x5555555555555555, 0x5555555540155555, 0xFF00FF003F00FF00,
+        0x0000FF00AA003F00, 0x0F00000000000000, 0x0F001F000F000F00, 0xC00F3D503E273884,
+        0x0000FFFF00000020, 0x0000000000000008, 0xFFC0000000000000, 0x000000000000FFFF,
+        0x0000FFFFFFFFFFFF, 0xC025EA9D00000000, 0x0004280555555555, 0x0000155555555555,
+        0x0000000005555555, 0x5554555400000000, 0x6A00555555555555, 0x555F7D5555452855,
+        0x00200000014102F5, 0x07FFFFFE00000000,
+    ],
+    r4: [
+        0x0000, 0x0001, 0x0002, 0x0002, 0x0002, 0x0002, 0x0003, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0002, 0x0004, 0x0005, 0x0006, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
+    ],
+    r5: &[
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0002, 0x0003,
+        0x0000, 0x0004, 0x0005, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0006, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0007, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0008,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F, 0x0010,
+        0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0019, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0002, 0x001A,
+        0x001B, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    ],
+    r6: &[
+        0x0000000000000000, 0x000000FFFFFFFFFF, 0xFFFF000000000000, 0x00000000000FFFFF,
+        0xF7FF000000000000, 0x000000000037F7FF, 0x0007FFFFFFFFFFFF, 0xFFFFFFFF00000000,
+        0x00000000FFFFFFFF, 0xFFF0000003FFFFFF, 0xFFFFFF0000003FFF, 0x003FDE64D0000003,
+        0x000003FFFFFF0000, 0x7B0000001FDFE7B0, 0xFFFFF0000001FC5F, 0x03FFFFFF0000003F,
+        0x00003FFFFFF00000, 0xF0000003FFFFFF00, 0xFFFF0000003FFFFF, 0xFFFFFF00000003FF,
+        0x07FFFFFC00000001, 0x001FFFFFF0000000, 0x00007FFFFFC00000, 0x000001FFFFFF0000,
+        0x0000000000000400, 0x00000003FFFFFFFF, 0xFFFF03FFFFFF03FF, 0x00000000000003FF,
+    ],
+};
+
+#[rustfmt::skip]
+static XID_CONTINUE_TABLE: UCDTrie = UCDTrie {
+    r1: [
+        0x03FF000000000000, 0x07FFFFFE87FFFFFE, 0x04A0040000000000, 0xFF7FFFFFFF7FFFFF,
+        0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF,
+        0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0x0000501F0003FFC3,
+        0xFFFFFFFFFFFFFFFF, 0xB8DFFFFFFFFFFFFF, 0xFFFFFFFBFFFFD7C0, 0xFFBFFFFFFFFFFFFF,
+        0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFCFB, 0xFFFFFFFFFFFFFFFF,
+        0xFFFEFFFFFFFFFFFF, 0xFFFFFFFF027FFFFF, 0xBFFFFFFFFFFE01FF, 0x000787FFFFFF00B6,
+        0xFFFFFFFF07FF0000, 0xFFFFC3FFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0x9FFFFDFF9FEFFFFF,
+        0xFFFFFFFFFFFF0000, 0xFFFFFFFFFFFFE7FF, 0x0003FFFFFFFFFFFF, 0x243FFFFFFFFFFFFF,
+    ],
+    r2: [
+        0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009,
+        0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F, 0x0010, 0x0011, 0x0012, 0x0013,
+        0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D,
+        0x001E, 0x001F, 0x0004, 0x0020, 0x0021, 0x0022, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002A, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x002B, 0x002C, 0x002D,
+        0x002E, 0x002F, 0x0004, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036,
+        0x0037, 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x0004, 0x003D, 0x0004, 0x003E,
+        0x003F, 0x0040, 0x0041, 0x0042, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004A,
+        0x004B, 0x004C, 0x004D, 0x004E, 0x004E, 0x004E, 0x004E, 0x004E, 0x004E, 0x004E,
+        0x004E, 0x004E, 0x004E, 0x004E, 0x004E, 0x004E, 0x004E, 0x004E, 0x004E, 0x004E,
+        0x004E, 0x004E, 0x004E, 0x004E, 0x004E, 0x004E, 0x004E, 0x004E, 0x004E, 0x004E,
+        0x004E, 0x004E, 0x004E, 0x004E, 0x004E, 0x004E, 0x004E, 0x004E, 0x004E, 0x004E,
+        0x004E, 0x004E, 0x004E, 0x004E, 0x0004, 0x0004, 0x0004, 0x004F, 0x0050, 0x0051,
+        0x0052, 0x0053, 0x004E, 0x004E, 0x004E, 0x004E, 0x004E, 0x004E, 0x004E, 0x004E,
+        0x0054, 0x002A, 0x0055, 0x0004, 0x0056, 0x0004, 0x0057, 0x0058, 0x004E, 0x004E,
+        0x004E, 0x004E, 0x004E, 0x004E, 0x004E, 0x004E, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x004E,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0059, 0x005A, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x005B, 0x005C, 0x0004, 0x005D, 0x005E, 0x0004, 0x005F, 0x0060,
+        0x0061, 0x003E, 0x0004, 0x0062, 0x0063, 0x0064, 0x0004, 0x0065, 0x0066, 0x0067,
+        0x0004, 0x0068, 0x0069, 0x006A, 0x0004, 0x006B, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x006C, 0x006D, 0x004E, 0x004E, 0x004E, 0x004E, 0x004E, 0x004E, 0x004E, 0x004E,
+        0x004E, 0x004E, 0x004E, 0x004E, 0x004E, 0x004E, 0x004E, 0x004E, 0x004E, 0x004E,
+        0x004E, 0x004E, 0x004E, 0x004E, 0x004E, 0x004E, 0x004E, 0x004E, 0x004E, 0x004E,
+        0x004E, 0x004E, 0x004E, 0x004E, 0x004E, 0x004E, 0x004E, 0x004E, 0x004E, 0x004E,
+        0x004E, 0x004E, 0x004E, 0x004E, 0x004E, 0x004E, 0x004E, 0x004E, 0x004E, 0x004E,
+        0x004E, 0x004E, 0x004E, 0x004E, 0x004E, 0x004E, 0x004E, 0x004E, 0x004E, 0x004E,
+        0x004E, 0x004E, 0x004E, 0x004E, 0x004E, 0x004E, 0x004E, 0x004E, 0x004E, 0x004E,
+        0x004E, 0x004E, 0x004E, 0x004E, 0x004E, 0x004E, 0x004E, 0x004E, 0x004E, 0x004E,
+        0x004E, 0x004E, 0x004E, 0x004E, 0x004E, 0x004E, 0x004E, 0x004E, 0x004E, 0x004E,
+        0x004E, 0x004E, 0x004E, 0x004E, 0x004E, 0x004E, 0x004E, 0x004E, 0x004E, 0x004E,
+        0x004E, 0x004E, 0x004E, 0x004E, 0x004E, 0x004E, 0x004E, 0x004E, 0x004E, 0x004E,
+        0x004E, 0x004E, 0x004E, 0x004E, 0x004E, 0x004E, 0x004E, 0x004E, 0x004E, 0x004E,
+        0x004E, 0x004E, 0x004E, 0x004E, 0x004E, 0x004E, 0x004E, 0x004E, 0x004E, 0x004E,
+        0x004E, 0x004E, 0x004E, 0x004E, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0063,
+        0x0004, 0x006E, 0x006F, 0x0070, 0x005D, 0x0071, 0x0004, 0x0072, 0x0004, 0x0004,
+        0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0004, 0x0079, 0x007A, 0x007B,
+        0x007C, 0x007D,
+    ],
+    r3: &[
+        0x00003FFFFFFFFFFF, 0xFFFF07FF0FFFFFFF, 0xFFFFFFFFFF007EFF, 0xFFFFFFFBFFFFFFFF,
+        0xFFFFFFFFFFFFFFFF, 0xFFFEFFCFFFFFFFFF, 0xF3C5FDFFFFF99FEF, 0x5003FFCFB080799F,
+        0xD36DFDFFFFF987EE, 0x003FFFC05E023987, 0xF3EDFDFFFFFBBFEE, 0xFE00FFCF00013BBF,
+        0xF3EDFDFFFFF99FEE, 0x0002FFCFB0E0399F, 0xC3FFC718D63DC7EC, 0x0000FFC000813DC7,
+        0xF3FFFDFFFFFDDFFF, 0x0000FFCF27603DDF, 0xF3EFFDFFFFFDDFEF, 0x000EFFCF60603DDF,
+        0xFFFFFFFFFFFDDFFF, 0xFC00FFCF80F07DDF, 0x2FFBFFFFFC7FFFEE, 0x000CFFC0FF5F847F,
+        0x07FFFFFFFFFFFFFE, 0x0000000003FF7FFF, 0x3FFFFFAFFFFFF7D6, 0x00000000F3FF7F5F,
+        0xC2A003FF03000001, 0xFFFE1FFFFFFFFEFF, 0x1FFFFFFFFEFFFFDF, 0x0000000000000040,
+        0xFFFFFFFFFFFF03FF, 0xFFFFFFFF3FFFFFFF, 0xF7FFFFFFFFFF20BF, 0xFFFFFFFF3D7F3DFF,
+        0x7F3DFFFFFFFF3DFF, 0xFFFFFFFFFF7FFF3D, 0xFFFFFFFFFF3DFFFF, 0x0003FE00E7FFFFFF,
+        0xFFFFFFFF0000FFFF, 0x3F3FFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFE, 0xFFFF9FFFFFFFFFFF,
+        0xFFFFFFFF07FFFFFE, 0x01FFC7FFFFFFFFFF, 0x001FFFFF803FFFFF, 0x000DDFFF000FFFFF,
+        0x000003FF308FFFFF, 0xFFFFFFFF03FFB800, 0x01FFFFFFFFFFFFFF, 0xFFFF07FFFFFFFFFF,
+        0x003FFFFFFFFFFFFF, 0x0FFF0FFF7FFFFFFF, 0x001F3FFFFFFFFFC0, 0xFFFF0FFFFFFFFFFF,
+        0x0000000007FF03FF, 0xFFFFFFFF0FFFFFFF, 0x9FFFFFFF7FFFFFFF, 0xBFFF008003FF03FF,
+        0x0000000000007FFF, 0x000FF80003FF1FFF, 0x000FFFFFFFFFFFFF, 0x00FFFFFFFFFFFFFF,
+        0x3FFFFFFFFFFFE3FF, 0xE7FFFFFFFFFF01FF, 0x07FFFFFFFFF70000, 0xFFFFFFFF3F3FFFFF,
+        0x3FFFFFFFAAFF3F3F, 0x5FDFFFFFFFFFFFFF, 0x1FDC1FFF0FCF1FDC, 0x8000000000003000,
+        0x8002000000100001, 0x000000001FFF0000, 0x0001FFE21FFF0000, 0xF3FFFD503F2FFC84,
+        0xFFFFFFFF000043E0, 0x00000000000001FF, 0x0000000000000000, 0x000FF81FFFFFFFFF,
+        0xFFFF20BFFFFFFFFF, 0x800080FFFFFFFFFF, 0x7F7F7F7F007FFFFF, 0xFFFFFFFF7F7F7F7F,
+        0x1F3EFFFE000000E0, 0xFFFFFFFEE67FFFFF, 0xFFFEFFFFFFFFFFE0, 0xFFFFFFFF00007FFF,
+        0xFFFF000000000000, 0x0000000000001FFF, 0x3FFFFFFFFFFF0000, 0x00000FFFFFFF1FFF,
+        0xBFF0FFFFFFFFFFFF, 0x0003FFFFFFFFFFFF, 0xFFFFFFFCFF800000, 0xFFFFFFFFFFFFF9FF,
+        0xFFFC000003EB07FF, 0x000010FFFFFFFFFF, 0xE8FFFFFF03FF003F, 0xFFFF3FFFFFFFFFFF,
+        0x1FFFFFFF000FFFFF, 0x7FFFFFFF03FF8001, 0x007FFFFFFFFFFFFF, 0xFC7FFFFF03FF3FFF,
+        0x007CFFFF38000007, 0xFFFF7F7F007E7E7E, 0xFFFF03FFF7FFFFFF, 0x03FF37FFFFFFFFFF,
+        0xFFFF000FFFFFFFFF, 0x0FFFFFFFFFFFF87F, 0x0000000003FFFFFF, 0x5F7FFDFFE0F8007F,
+        0xFFFFFFFFFFFFFFDB, 0xFFFFFFFFFFF80000, 0xFFFFFFF03FFFFFFF, 0x3FFFFFFFFFFFFFFF,
+        0xFFFFFFFFFFFF0000, 0xFFFFFFFFFFFCFFFF, 0x03FF0000000000FF, 0x0018FFFF0000FFFF,
+        0xAA8A00000000E000, 0x1FFFFFFFFFFFFFFF, 0x87FFFFFE03FF0000, 0xFFFFFFE007FFFFFE,
+        0x7FFFFFFFFFFFFFFF, 0x000000001CFCFCFC,
+    ],
+    r4: [
+        0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0005,
+        0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x0007, 0x0007, 0x0007, 0x0007,
+        0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x000F, 0x0010, 0x0011, 0x0007,
+        0x0012, 0x0013, 0x0007, 0x0014, 0x0015, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005,
+        0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005,
+        0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005,
+        0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005,
+        0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005,
+        0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005,
+        0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005,
+        0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005,
+        0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005,
+        0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005,
+        0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005,
+        0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005,
+        0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005,
+        0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005,
+        0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005,
+        0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005,
+        0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005,
+        0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0016, 0x0005,
+        0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005,
+        0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005,
+        0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005,
+        0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005,
+        0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005,
+    ],
+    r5: &[
+        0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0004, 0x0006, 0x0004, 0x0004,
+        0x0007, 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x0002, 0x0002, 0x000D, 0x000E,
+        0x000F, 0x0010, 0x0011, 0x0004, 0x0002, 0x0002, 0x0002, 0x0002, 0x0012, 0x0013,
+        0x0014, 0x0004, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x0004, 0x001A, 0x0004,
+        0x001B, 0x001C, 0x001D, 0x001E, 0x001F, 0x0020, 0x0021, 0x0004, 0x0002, 0x0022,
+        0x0023, 0x0023, 0x0024, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0025, 0x0026,
+        0x0027, 0x0028, 0x0029, 0x002A, 0x0002, 0x002B, 0x0003, 0x002C, 0x002D, 0x002E,
+        0x0002, 0x002F, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0004, 0x0004,
+        0x0002, 0x0036, 0x0002, 0x0037, 0x0004, 0x0004, 0x0038, 0x0039, 0x0002, 0x003A,
+        0x003B, 0x003C, 0x003D, 0x003E, 0x0004, 0x0004, 0x0003, 0x0004, 0x003F, 0x0040,
+        0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x003B, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0048, 0x0049, 0x004A, 0x0004, 0x004B, 0x004C, 0x004D, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x004E, 0x004F, 0x0050, 0x0051, 0x0004, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0052, 0x0004, 0x0002, 0x0053, 0x0002, 0x0002, 0x0002, 0x0054,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0055, 0x0056, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0057, 0x0058,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x003E, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0002, 0x0002, 0x003B, 0x0059, 0x0045, 0x005A, 0x0012, 0x005B,
+        0x005C, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0002, 0x0004, 0x0004, 0x0002, 0x005D, 0x005E, 0x005F, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0002, 0x0060, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0002, 0x0058, 0x0022, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0061,
+        0x0002, 0x0002, 0x0002, 0x0002, 0x0062, 0x0063, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x0064, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0002, 0x0065,
+        0x0066, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0067, 0x003E, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0068, 0x0069, 0x0004, 0x0004, 0x006A, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0002, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F,
+        0x0002, 0x0002, 0x0002, 0x0002, 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0076, 0x0077,
+        0x0078, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0079, 0x0004,
+        0x0004, 0x0004, 0x007A, 0x007B, 0x007C, 0x0004, 0x007D, 0x007E, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x007F, 0x0080, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0081, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0082, 0x0002, 0x0002, 0x0002, 0x0083, 0x0002, 0x0084,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0085, 0x0086,
+        0x0087, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0088, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0089, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0080, 0x0002, 0x0002, 0x0002, 0x000B, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x008A, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x008B,
+        0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x008C,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x008C, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0002, 0x008D, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0057, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0002, 0x0002, 0x0002, 0x0057, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004,
+    ],
+    r6: &[
+        0xB7FFFF7FFFFFEFFF, 0x000000003FFF3FFF, 0xFFFFFFFFFFFFFFFF, 0x07FFFFFFFFFFFFFF,
+        0x0000000000000000, 0x001FFFFFFFFFFFFF, 0x2000000000000000, 0xFFFFFFFF1FFFFFFF,
+        0x000000010001FFFF, 0xFFFFE000FFFFFFFF, 0x07FFFFFFFFFF07FF, 0xFFFFFFFF3FFFFFFF,
+        0x00000000003EFF0F, 0xFFFF03FF3FFFFFFF, 0x0FFFFFFFFF0FFFFF, 0xFFFF00FFFFFFFFFF,
+        0xF7FF000FFFFFFFFF, 0x1BFBFFFBFFB7F7FF, 0x007FFFFFFFFFFFFF, 0x000000FF003FFFFF,
+        0x07FDFFFFFFFFFFBF, 0x91BFFFFFFFFFFD3F, 0x007FFFFF003FFFFF, 0x000000007FFFFFFF,
+        0x0037FFFF00000000, 0x03FFFFFF003FFFFF, 0xC0FFFFFFFFFFFFFF, 0x873FFFFFFEEFF06F,
+        0x1FFFFFFF00000000, 0x000000001FFFFFFF, 0x0000007FFFFFFEFF, 0x003FFFFFFFFFFFFF,
+        0x0007FFFF003FFFFF, 0x000000000003FFFF, 0x00000000000001FF, 0x0007FFFFFFFFFFFF,
+        0x03FF00FFFFFFFFFF, 0x00031BFFFFFFFFFF, 0xE000000000000000, 0xFFFF00801FFFFFFF,
+        0xFFFF00000001FFFF, 0xFFFF00000000003F, 0x007FFFFF0000001F, 0x803FFFC00000007F,
+        0x03FF01FFFFFF0004, 0xFFDFFFFFFFFFFFFF, 0x004FFFFFFFFF00F0, 0x0000000017FFDE1F,
+        0xC0FFFFFFFFFBFFFF, 0x0000000000000003, 0xFFFF01FFBFFFBD7F, 0x03FF07FFFFFFFFFF,
+        0xFBEDFDFFFFF99FEF, 0x001F1FCFE081399F, 0x00000003C3FF07FF, 0x0000000003FF00BF,
+        0xFF3FFFFFFFFFFFFF, 0x000000003F000001, 0x0000000003FF0011, 0x01FFFFFFFFFFFFFF,
+        0x00000000000003FF, 0x03FF0FFFE7FFFFFF, 0x000000000000007F, 0xFFFFFFFF00000000,
+        0x800003FFFFFFFFFF, 0xF9BFFFFFFF6FF27F, 0x0000000003FF000F, 0xFFFFFCFF00000000,
+        0x0000001BFCFFFFFF, 0x7FFFFFFFFFFFFFFF, 0xFFFFFFFFFFFF0080, 0xFFFF000023FFFFFF,
+        0xFF7FFFFFFFFFFDFF, 0xFFFC000003FF0001, 0x007FFEFFFFFCFFFF, 0xB47FFFFFFFFFFB7F,
+        0xFFFFFDBF03FF00FF, 0x000003FF01FB7FFF, 0x007FFFFF00000000, 0xC7FFFFFFFFFDFFFF,
+        0x0000000003FF0007, 0x0001000000000000, 0x0000000003FFFFFF, 0x00007FFFFFFFFFFF,
+        0x000000000000000F, 0xFFFFFFFFFFFF0000, 0x0001FFFFFFFFFFFF, 0x0000FFFFFFFFFFFF,
+        0x00000000003FFFFF, 0xFFFF03FF7FFFFFFF, 0x001F3FFFFFFF03FF, 0xE0FFFFF803FF000F,
+        0x000000000000FFFF, 0xFFFFFFFFFFFF87FF, 0x00000000FFFF80FF, 0x0003001B00000000,
+        0x00FFFFFFFFFFFFFF, 0x6FEF000000000000, 0x00040007FFFFFFFF, 0xFFFF00F000270000,
+        0x0FFFFFFFFFFFFFFF, 0x1FFF07FFFFFFFFFF, 0x0000000063FF01FF, 0xFFFF3FFFFFFFFFFF,
+        0xF807E3E000000000, 0x00003C0000000FE7, 0x000000000000001C, 0xFFFFFFFFFFDFFFFF,
+        0xEBFFDE64DFFFFFFF, 0xFFFFFFFFFFFFFFEF, 0x7BFFFFFFDFDFE7BF, 0xFFFFFFFFFFFDFC5F,
+        0xFFFFFF3FFFFFFFFF, 0xF7FFFFFFF7FFFFFD, 0xFFDFFFFFFFDFFFFF, 0xFFFF7FFFFFFF7FFF,
+        0xFFFFFDFFFFFFFDFF, 0xFFFFFFFFFFFFCFF7, 0xF87FFFFFFFFFFFFF, 0x00201FFFFFFFFFFF,
+        0x0000FFFEF8000010, 0x000007E07FFFFFFF, 0xFFFF07DBF9FFFF7F, 0x00003FFFFFFFFFFF,
+        0x0000000000008000, 0x3FFF1FFFFFFFFFFF, 0x00000000000043FF, 0x00007FFFFFFF0000,
+        0x03FFFFFFFFFFFFFF, 0x03FFFFFFFFFF0000, 0x7FFF6F7F00000000, 0x00000000007F001F,
+        0x0000000003FF0FFF, 0x0AF7FE96FFFFFFEF, 0x5EF7F796AA96EA84, 0x0FFFFBEE0FFFFBFF,
+        0x03FF000000000000, 0x00000000FFFFFFFF, 0xFFFF0003FFFFFFFF, 0xFFFF0001FFFFFFFF,
+        0x000000003FFFFFFF, 0xFFFFFFFFFFFF07FF,
+    ],
+};
+
+#[rustfmt::skip]
+static XID_START_TABLE: UCDTrie = UCDTrie {
+    r1: [
+        0x0000000000000000, 0x07FFFFFE07FFFFFE, 0x0420040000000000, 0xFF7FFFFFFF7FFFFF,
+        0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF,
+        0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0x0000501F0003FFC3,
+        0x0000000000000000, 0xB8DF000000000000, 0xFFFFFFFBFFFFD740, 0xFFBFFFFFFFFFFFFF,
+        0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFC03, 0xFFFFFFFFFFFFFFFF,
+        0xFFFEFFFFFFFFFFFF, 0xFFFFFFFF027FFFFF, 0x00000000000001FF, 0x000787FFFFFF0000,
+        0xFFFFFFFF00000000, 0xFFFEC000000007FF, 0xFFFFFFFFFFFFFFFF, 0x9C00C060002FFFFF,
+        0x0000FFFFFFFD0000, 0xFFFFFFFFFFFFE000, 0x0002003FFFFFFFFF, 0x043007FFFFFFFC00,
+    ],
+    r2: [
+        0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009,
+        0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F, 0x0010, 0x0011, 0x0012, 0x0013,
+        0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0017, 0x0019, 0x001A, 0x001B, 0x001C,
+        0x001D, 0x001E, 0x001F, 0x0020, 0x0021, 0x0022, 0x0023, 0x0023, 0x0023, 0x0023,
+        0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002A, 0x002B, 0x0023,
+        0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x002C, 0x002D, 0x002E,
+        0x002F, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038,
+        0x0039, 0x0003, 0x003A, 0x003B, 0x003C, 0x001E, 0x003D, 0x003E, 0x003F, 0x0040,
+        0x0041, 0x0042, 0x0043, 0x0044, 0x0023, 0x0023, 0x0023, 0x001E, 0x0023, 0x0023,
+        0x0023, 0x0023, 0x0045, 0x0046, 0x0047, 0x0048, 0x001E, 0x0049, 0x004A, 0x001E,
+        0x004B, 0x004C, 0x004D, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E,
+        0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E,
+        0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E,
+        0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E,
+        0x001E, 0x001E, 0x001E, 0x001E, 0x0023, 0x0023, 0x0023, 0x004E, 0x004F, 0x0050,
+        0x0051, 0x0052, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E,
+        0x0053, 0x002B, 0x0054, 0x0055, 0x0056, 0x0023, 0x0057, 0x0058, 0x001E, 0x001E,
+        0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x0023, 0x0023, 0x0023, 0x0023,
+        0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023,
+        0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023,
+        0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023,
+        0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023,
+        0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023,
+        0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023,
+        0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023,
+        0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023,
+        0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023,
+        0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x001E,
+        0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023,
+        0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023,
+        0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023,
+        0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023,
+        0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023,
+        0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023,
+        0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023,
+        0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023,
+        0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023,
+        0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023,
+        0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023,
+        0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023,
+        0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023,
+        0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023,
+        0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023,
+        0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023,
+        0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023,
+        0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023,
+        0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023,
+        0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023,
+        0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023,
+        0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023,
+        0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023,
+        0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023,
+        0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023,
+        0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023,
+        0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023,
+        0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023,
+        0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023,
+        0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023,
+        0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023,
+        0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023,
+        0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023,
+        0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023,
+        0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0059, 0x005A, 0x0023, 0x0023,
+        0x0023, 0x0023, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F, 0x0023, 0x0060, 0x0061,
+        0x0062, 0x0031, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006A,
+        0x006B, 0x006C, 0x006D, 0x006E, 0x0023, 0x006F, 0x0023, 0x0023, 0x0023, 0x0023,
+        0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023,
+        0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023,
+        0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023,
+        0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023,
+        0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023,
+        0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023,
+        0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023,
+        0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023,
+        0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023,
+        0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023,
+        0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023,
+        0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023,
+        0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023,
+        0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023,
+        0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023,
+        0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023,
+        0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023,
+        0x0070, 0x0071, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E,
+        0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E,
+        0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E,
+        0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E,
+        0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E,
+        0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E,
+        0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E,
+        0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E,
+        0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E,
+        0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E,
+        0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E,
+        0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E,
+        0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E,
+        0x001E, 0x001E, 0x001E, 0x001E, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0072,
+        0x0023, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0023, 0x0078, 0x0023, 0x0023,
+        0x0079, 0x007A, 0x007B, 0x007C, 0x001E, 0x007D, 0x0023, 0x007E, 0x007F, 0x0080,
+        0x0081, 0x0082,
+    ],
+    r3: &[
+        0x00000110043FFFFF, 0xFFFF07FF01FFFFFF, 0xFFFFFFFF00007EFF, 0x00000000000003FF,
+        0x23FFFFFFFFFFFFF0, 0xFFFE0003FF010000, 0x23C5FDFFFFF99FE1, 0x10030003B0004000,
+        0x036DFDFFFFF987E0, 0x001C00005E000000, 0x23EDFDFFFFFBBFE0, 0x0200000300010000,
+        0x23EDFDFFFFF99FE0, 0x00020003B0000000, 0x03FFC718D63DC7E8, 0x0000000000010000,
+        0x23FFFDFFFFFDDFE0, 0x0000000327000000, 0x23EFFDFFFFFDDFE1, 0x0006000360000000,
+        0x27FFFFFFFFFDDFF0, 0xFC00000380704000, 0x2FFBFFFFFC7FFFE0, 0x000000000000007F,
+        0x0005FFFFFFFFFFFE, 0x2005FFAFFFFFF7D6, 0x00000000F000005F, 0x0000000000000001,
+        0x00001FFFFFFFFEFF, 0x0000000000001F00, 0x0000000000000000, 0x800007FFFFFFFFFF,
+        0xFFE1C0623C3F0000, 0xFFFFFFFF00004003, 0xF7FFFFFFFFFF20BF, 0xFFFFFFFFFFFFFFFF,
+        0xFFFFFFFF3D7F3DFF, 0x7F3DFFFFFFFF3DFF, 0xFFFFFFFFFF7FFF3D, 0xFFFFFFFFFF3DFFFF,
+        0x0000000007FFFFFF, 0xFFFFFFFF0000FFFF, 0x3F3FFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFE,
+        0xFFFF9FFFFFFFFFFF, 0xFFFFFFFF07FFFFFE, 0x01FFC7FFFFFFFFFF, 0x0003FFFF8003FFFF,
+        0x0001DFFF0003FFFF, 0x000FFFFFFFFFFFFF, 0x0000000010800000, 0xFFFFFFFF00000000,
+        0x01FFFFFFFFFFFFFF, 0xFFFF05FFFFFFFFFF, 0x003FFFFFFFFFFFFF, 0x000000007FFFFFFF,
+        0x001F3FFFFFFF0000, 0xFFFF0FFFFFFFFFFF, 0xFFFFFFFF007FFFFF, 0x00000000001FFFFF,
+        0x0000008000000000, 0x000FFFFFFFFFFFE0, 0x0000000000001FE0, 0xFC00C001FFFFFFF8,
+        0x0000003FFFFFFFFF, 0x0000000FFFFFFFFF, 0x3FFFFFFFFC00E000, 0xE7FFFFFFFFFF01FF,
+        0x046FDE0000000000, 0xFFFFFFFF3F3FFFFF, 0x3FFFFFFFAAFF3F3F, 0x5FDFFFFFFFFFFFFF,
+        0x1FDC1FFF0FCF1FDC, 0x8002000000000000, 0x000000001FFF0000, 0xF3FFFD503F2FFC84,
+        0xFFFFFFFF000043E0, 0x00000000000001FF, 0x000C781FFFFFFFFF, 0xFFFF20BFFFFFFFFF,
+        0x000080FFFFFFFFFF, 0x7F7F7F7F007FFFFF, 0x000000007F7F7F7F, 0x1F3E03FE000000E0,
+        0xFFFFFFFEE07FFFFF, 0xF7FFFFFFFFFFFFFF, 0xFFFEFFFFFFFFFFE0, 0xFFFFFFFF00007FFF,
+        0xFFFF000000000000, 0x0000000000001FFF, 0x3FFFFFFFFFFF0000, 0x00000C00FFFF1FFF,
+        0x80007FFFFFFFFFFF, 0xFFFFFFFF3FFFFFFF, 0x0000FFFFFFFFFFFF, 0xFFFFFFFCFF800000,
+        0xFFFFFFFFFFFFF9FF, 0xFFFC000003EB07FF, 0x00000007FFFFF7BB, 0x000FFFFFFFFFFFFC,
+        0x68FC000000000000, 0xFFFF003FFFFFFC00, 0x1FFFFFFF0000007F, 0x0007FFFFFFFFFFF0,
+        0x7C00FFDF00008000, 0x000001FFFFFFFFFF, 0xC47FFFFF00000FF7, 0x3E62FFFFFFFFFFFF,
+        0x001C07FF38000005, 0xFFFF7F7F007E7E7E, 0xFFFF03FFF7FFFFFF, 0x00000007FFFFFFFF,
+        0xFFFF000FFFFFFFFF, 0x0FFFFFFFFFFFF87F, 0xFFFF3FFFFFFFFFFF, 0x0000000003FFFFFF,
+        0x5F7FFDFFA0F8007F, 0xFFFFFFFFFFFFFFDB, 0x0003FFFFFFFFFFFF, 0xFFFFFFFFFFF80000,
+        0xFFFFFFF03FFFFFFF, 0x3FFFFFFFFFFFFFFF, 0xFFFFFFFFFFFF0000, 0xFFFFFFFFFFFCFFFF,
+        0x03FF0000000000FF, 0xAA8A000000000000, 0x1FFFFFFFFFFFFFFF, 0x07FFFFFE00000000,
+        0xFFFFFFC007FFFFFE, 0x7FFFFFFF3FFFFFFF, 0x000000001CFCFCFC,
+    ],
+    r4: [
+        0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0005,
+        0x0009, 0x000A, 0x0005, 0x000B, 0x000C, 0x0005, 0x0007, 0x0007, 0x0007, 0x0007,
+        0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x000D, 0x000E, 0x000F, 0x0007,
+        0x0010, 0x0011, 0x0007, 0x0012, 0x0013, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005,
+        0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005,
+        0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005,
+        0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005,
+        0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005,
+        0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005,
+        0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005,
+        0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005,
+        0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005,
+        0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005,
+        0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005,
+        0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005,
+        0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005,
+        0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005,
+        0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005,
+        0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005,
+        0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005,
+        0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005,
+        0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005,
+        0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005,
+        0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005,
+        0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005,
+        0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005,
+    ],
+    r5: &[
+        0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0006, 0x0007, 0x0008, 0x0009, 0x000A, 0x000B, 0x0002, 0x0002, 0x000C, 0x000D,
+        0x000E, 0x000F, 0x0010, 0x0004, 0x0002, 0x0002, 0x0002, 0x0002, 0x0011, 0x0012,
+        0x0013, 0x0004, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0004, 0x0019, 0x0004,
+        0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 0x001F, 0x0020, 0x0004, 0x0002, 0x0021,
+        0x0022, 0x0022, 0x0023, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0024, 0x0004,
+        0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E,
+        0x002F, 0x0030, 0x0031, 0x0032, 0x0033, 0x0016, 0x0034, 0x0035, 0x0004, 0x0004,
+        0x0005, 0x0036, 0x0037, 0x0038, 0x0004, 0x0004, 0x0039, 0x003A, 0x0037, 0x003B,
+        0x003C, 0x0004, 0x003D, 0x003E, 0x0004, 0x0004, 0x003F, 0x0004, 0x0040, 0x0041,
+        0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x004A, 0x004B, 0x004C, 0x0004, 0x004D, 0x004E, 0x004F, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0050, 0x0051, 0x0004, 0x0052, 0x0004, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0053, 0x0004, 0x0002, 0x0039, 0x0002, 0x0002, 0x0002, 0x0054,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0055, 0x0056, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0037, 0x0057,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x003E, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0002, 0x0002, 0x0049, 0x0058, 0x0059, 0x005A, 0x0037, 0x005B,
+        0x004C, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0002, 0x0004, 0x0004, 0x0002, 0x005C, 0x005D, 0x005E, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0002, 0x005F, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0002, 0x0060, 0x0021, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0061,
+        0x0002, 0x0002, 0x0002, 0x0002, 0x0062, 0x0063, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x0064, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0002, 0x0065,
+        0x0066, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0002, 0x0067, 0x0068, 0x0069, 0x006A, 0x006B, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x006C, 0x006D, 0x006E, 0x006F, 0x0070, 0x0071, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0072, 0x0004, 0x0004, 0x0004, 0x0073, 0x0074,
+        0x0004, 0x0004, 0x0075, 0x0076, 0x0004, 0x0004, 0x0004, 0x0004, 0x005A, 0x003F,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0077, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0078,
+        0x0002, 0x0002, 0x0002, 0x0079, 0x0002, 0x007A, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x007B, 0x007C, 0x007D, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x007E,
+        0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0002, 0x0002, 0x007F, 0x0002, 0x0002, 0x0002, 0x000A, 0x0002,
+        0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0080, 0x0002,
+        0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x0081, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x0082, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0082, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0083, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
+        0x0037, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+        0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
+    ],
+    r6: &[
+        0xB7FFFF7FFFFFEFFF, 0x000000003FFF3FFF, 0xFFFFFFFFFFFFFFFF, 0x07FFFFFFFFFFFFFF,
+        0x0000000000000000, 0x001FFFFFFFFFFFFF, 0xFFFFFFFF1FFFFFFF, 0x000000000001FFFF,
+        0xFFFFE000FFFFFFFF, 0x003FFFFFFFFF07FF, 0xFFFFFFFF3FFFFFFF, 0x00000000003EFF0F,
+        0xFFFF00003FFFFFFF, 0x0FFFFFFFFF0FFFFF, 0xFFFF00FFFFFFFFFF, 0xF7FF000FFFFFFFFF,
+        0x1BFBFFFBFFB7F7FF, 0x007FFFFFFFFFFFFF, 0x000000FF003FFFFF, 0x07FDFFFFFFFFFFBF,
+        0x91BFFFFFFFFFFD3F, 0x007FFFFF003FFFFF, 0x000000007FFFFFFF, 0x0037FFFF00000000,
+        0x03FFFFFF003FFFFF, 0xC0FFFFFFFFFFFFFF, 0x003FFFFFFEEF0001, 0x1FFFFFFF00000000,
+        0x000000001FFFFFFF, 0x0000001FFFFFFEFF, 0x003FFFFFFFFFFFFF, 0x0007FFFF003FFFFF,
+        0x000000000003FFFF, 0x00000000000001FF, 0x0007FFFFFFFFFFFF, 0x0000000FFFFFFFFF,
+        0x000303FFFFFFFFFF, 0xFFFF00801FFFFFFF, 0xFFFF00000000003F, 0xFFFF000000000003,
+        0x007FFFFF0000001F, 0x00FFFFFFFFFFFFF8, 0x0026000000000000, 0x0000FFFFFFFFFFF8,
+        0x000001FFFFFF0000, 0x0000007FFFFFFFF8, 0x0047FFFFFFFF0090, 0x0007FFFFFFFFFFF8,
+        0x000000001400001E, 0x80000FFFFFFBFFFF, 0x0000000000000001, 0xFFFF01FFBFFFBD7F,
+        0x23EDFDFFFFF99FE0, 0x00000003E0010000, 0x0000000380000780, 0x0000FFFFFFFFFFFF,
+        0x00000000000000B0, 0x00007FFFFFFFFFFF, 0x000000000F000000, 0x0000000000000010,
+        0x010007FFFFFFFFFF, 0x0000000007FFFFFF, 0x000000000000007F, 0x00000FFFFFFFFFFF,
+        0xFFFFFFFF00000000, 0x80000000FFFFFFFF, 0x8000FFFFFF6FF27F, 0x0000000000000002,
+        0xFFFFFCFF00000000, 0x0000000A0001FFFF, 0x0407FFFFFFFFF801, 0xFFFFFFFFF0010000,
+        0xFFFF0000200003FF, 0x01FFFFFFFFFFFFFF, 0x00007FFFFFFFFDFF, 0xFFFC000000000001,
+        0x000000000000FFFF, 0x0001FFFFFFFFFB7F, 0xFFFFFDBF00000040, 0x00000000010003FF,
+        0x0007FFFF00000000, 0x000FFFFFFFFDFFF4, 0x0001000000000000, 0x0000000003FFFFFF,
+        0x000000000000000F, 0xFFFFFFFFFFFF0000, 0x0001FFFFFFFFFFFF, 0x000000000000007E,
+        0xFFFF00007FFFFFFF, 0x7FFFFFFFFFFFFFFF, 0x00003FFFFFFF0000, 0xE0FFFFF80000000F,
+        0x00000000000107FF, 0x00000000FFF80000, 0x0000000B00000000, 0x00FFFFFFFFFFFFFF,
+        0x00000000003FFFFF, 0x6FEF000000000000, 0x00040007FFFFFFFF, 0xFFFF00F000270000,
+        0x0FFFFFFFFFFFFFFF, 0x1FFF07FFFFFFFFFF, 0x0000000003FF01FF, 0xFFFFFFFFFFDFFFFF,
+        0xEBFFDE64DFFFFFFF, 0xFFFFFFFFFFFFFFEF, 0x7BFFFFFFDFDFE7BF, 0xFFFFFFFFFFFDFC5F,
+        0xFFFFFF3FFFFFFFFF, 0xF7FFFFFFF7FFFFFD, 0xFFDFFFFFFFDFFFFF, 0xFFFF7FFFFFFF7FFF,
+        0xFFFFFDFFFFFFFDFF, 0x0000000000000FF7, 0x000007E07FFFFFFF, 0xFFFF000000000000,
+        0x00003FFFFFFFFFFF, 0x3F801FFFFFFFFFFF, 0x0000000000004000, 0x00000FFFFFFF0000,
+        0x7FFF6F7F00000000, 0x000000000000001F, 0x000000000000080F, 0x0AF7FE96FFFFFFEF,
+        0x5EF7F796AA96EA84, 0x0FFFFBEE0FFFFBFF, 0x00000000FFFFFFFF, 0x03FFFFFFFFFFFFFF,
+        0xFFFF0003FFFFFFFF, 0xFFFF0001FFFFFFFF, 0x000000003FFFFFFF, 0xFFFFFFFFFFFF07FF,
+    ],
+};
+
+#[cfg(test)]
+mod tests {
+    use super::Char;
+
+    #[test]
+    fn test_char_properties() {
+        for ch in '\0'..'\u{10ffff}' {
+            match ch.is_whitespace() {
+                true => assert!(ch.is_space()),
+                false => assert!(!ch.is_space()),
+            }
+
+            match ch.is_numeric() {
+                true => assert!(ch.is_num()),
+                false => assert!(!ch.is_num()),
+            }
+
+            match ch.is_uppercase() {
+                true => assert!(ch.is_upper()),
+                false => assert!(!ch.is_upper()),
+            }
+
+            match ch.is_lowercase() {
+                true => assert!(ch.is_lower()),
+                false => assert!(!ch.is_lower()),
+            }
+        }
+    }
+}
diff --git a/work/crates/ucd/Cargo.toml b/work/crates/ucd/Cargo.toml
new file mode 100644
index 0000000..e6e8210
--- /dev/null
+++ b/work/crates/ucd/Cargo.toml
@@ -0,0 +1,57 @@
+################################################################################
+# This file is a part of the "Lady Deirdre" work,                              #
+# a compiler front-end foundation technology.                                  #
+#                                                                              #
+# This work is proprietary software with source-available code.                #
+#                                                                              #
+# To copy, use, distribute, and contribute to this work, you must agree to     #
+# the terms of the General License Agreement:                                  #
+#                                                                              #
+# https://github.com/Eliah-Lakhin/lady-deirdre/blob/master/EULA.md.            #
+#                                                                              #
+# The agreement grants you a Commercial-Limited License that gives you         #
+# the right to use my work in non-commercial and limited commercial products   #
+# with a total gross revenue cap. To remove this commercial limit for one of   #
+# your products, you must acquire an Unrestricted Commercial License.          #
+#                                                                              #
+# If you contribute to the source code, documentation, or related materials    #
+# of this work, you must assign these changes to me. Contributions are         #
+# governed by the "Derivative Work" section of the General License             #
+# Agreement.                                                                   #
+#                                                                              #
+# Copying the work in parts is strictly forbidden, except as permitted under   #
+# the terms of the General License Agreement.                                  #
+#                                                                              #
+# If you do not or cannot agree to the terms of this Agreement,                #
+# do not use this work.                                                        #
+#                                                                              #
+# This work is provided "as is" without any warranties, express or implied,    #
+# except to the extent that such disclaimers are held to be legally invalid.   #
+#                                                                              #
+# Copyright (c) 2024 Ilya Lakhin (Илья Александрович Лахин).                   #
+# All rights reserved.                                                         #
+################################################################################
+
+[package]
+name = "lady-deirdre-ucd-generator"
+version = "0.0.0"
+authors = ["Ilya Lakhin (Илья Александрович Лахин) <eliah.lakhin@gmail.com>"]
+edition = "2021"
+description = "Compiler front-end foundation technology. UCD generator crate."
+keywords = ["parsing", "parser", "incremental", "compiler", "editor"]
+categories = ["compilers", "data-structures", "no-std", "parsing", "text-editors"]
+license-file = "../../../EULA.md"
+documentation = "https://docs.rs/lady-deirdre"
+repository = "https://github.com/Eliah-Lakhin/lady-deirdre"
+rust-version = "1.79"
+publish = false
+autobins = true
+autoexamples = false
+autotests = false
+autobenches = false
+
+[dependencies.ahash]
+version = "0.8"
+
+[dependencies.ucd-parse]
+version = "0.1"
\ No newline at end of file
diff --git a/work/crates/ucd/run.sh b/work/crates/ucd/run.sh
new file mode 100755
index 0000000..b46e3ee
--- /dev/null
+++ b/work/crates/ucd/run.sh
@@ -0,0 +1,39 @@
+#!/usr/bin/env bash
+
+################################################################################
+# This file is a part of the "Lady Deirdre" work,                              #
+# a compiler front-end foundation technology.                                  #
+#                                                                              #
+# This work is proprietary software with source-available code.                #
+#                                                                              #
+# To copy, use, distribute, and contribute to this work, you must agree to     #
+# the terms of the General License Agreement:                                  #
+#                                                                              #
+# https://github.com/Eliah-Lakhin/lady-deirdre/blob/master/EULA.md.            #
+#                                                                              #
+# The agreement grants you a Commercial-Limited License that gives you         #
+# the right to use my work in non-commercial and limited commercial products   #
+# with a total gross revenue cap. To remove this commercial limit for one of   #
+# your products, you must acquire an Unrestricted Commercial License.          #
+#                                                                              #
+# If you contribute to the source code, documentation, or related materials    #
+# of this work, you must assign these changes to me. Contributions are         #
+# governed by the "Derivative Work" section of the General License             #
+# Agreement.                                                                   #
+#                                                                              #
+# Copying the work in parts is strictly forbidden, except as permitted under   #
+# the terms of the General License Agreement.                                  #
+#                                                                              #
+# If you do not or cannot agree to the terms of this Agreement,                #
+# do not use this work.                                                        #
+#                                                                              #
+# This work is provided "as is" without any warranties, express or implied,    #
+# except to the extent that such disclaimers are held to be legally invalid.   #
+#                                                                              #
+# Copyright (c) 2024 Ilya Lakhin (Илья Александрович Лахин).                   #
+# All rights reserved.                                                         #
+################################################################################
+
+rm -rf downloads
+rm -f ucd_gen.txt
+cargo run -- download && cargo run -- generate
diff --git a/work/crates/ucd/src/download.rs b/work/crates/ucd/src/download.rs
new file mode 100644
index 0000000..9b9843f
--- /dev/null
+++ b/work/crates/ucd/src/download.rs
@@ -0,0 +1,89 @@
+////////////////////////////////////////////////////////////////////////////////
+// This file is a part of the "Lady Deirdre" work,                            //
+// a compiler front-end foundation technology.                                //
+//                                                                            //
+// This work is proprietary software with source-available code.              //
+//                                                                            //
+// To copy, use, distribute, and contribute to this work, you must agree to   //
+// the terms of the General License Agreement:                                //
+//                                                                            //
+// https://github.com/Eliah-Lakhin/lady-deirdre/blob/master/EULA.md.          //
+//                                                                            //
+// The agreement grants you a Commercial-Limited License that gives you       //
+// the right to use my work in non-commercial and limited commercial products //
+// with a total gross revenue cap. To remove this commercial limit for one of //
+// your products, you must acquire an Unrestricted Commercial License.        //
+//                                                                            //
+// If you contribute to the source code, documentation, or related materials  //
+// of this work, you must assign these changes to me. Contributions are       //
+// governed by the "Derivative Work" section of the General License           //
+// Agreement.                                                                 //
+//                                                                            //
+// Copying the work in parts is strictly forbidden, except as permitted under //
+// the terms of the General License Agreement.                                //
+//                                                                            //
+// If you do not or cannot agree to the terms of this Agreement,              //
+// do not use this work.                                                      //
+//                                                                            //
+// This work is provided "as is" without any warranties, express or implied,  //
+// except to the extent that such disclaimers are held to be legally invalid. //
+//                                                                            //
+// Copyright (c) 2024 Ilya Lakhin (Илья Александрович Лахин).                 //
+// All rights reserved.                                                       //
+////////////////////////////////////////////////////////////////////////////////
+
+use std::{
+    fs::{create_dir_all, write},
+    path::Path,
+    process::{exit, Command},
+};
+
+use crate::{UCD_DOWNLOADS_DIR, UCD_RESOURCES, UCD_URL};
+
+pub(super) fn download() {
+    println!("Downloading UCD data...");
+
+    let downloads_dir = Path::new(UCD_DOWNLOADS_DIR);
+
+    if downloads_dir.exists() {
+        eprintln!(
+            "Downloads dir {downloads_dir:?} already exists. Delete this directory manually.",
+        );
+        exit(1);
+    }
+
+    if let Err(error) = create_dir_all(downloads_dir) {
+        eprintln!("Failed to created downloads dir {downloads_dir:?}: {error}");
+        exit(1);
+    }
+
+    println!("Downloads dir {downloads_dir:?} created.");
+
+    for resource in UCD_RESOURCES {
+        let url = UCD_URL.to_owned() + resource;
+
+        let output = match Command::new("curl").arg(&url).output() {
+            Ok(output) => output,
+
+            Err(error) => {
+                eprintln!("Curl failed to fetch {url:?}: {error}",);
+                exit(1);
+            }
+        };
+
+        let file_name = downloads_dir.join(resource);
+
+        match write(file_name.as_path(), output.stdout) {
+            Ok(()) => {
+                println!("Remote file {url} saved to {file_name:?}.");
+            }
+
+            Err(error) => {
+                eprintln!("Field to save remote file {url} to {file_name:?}: {error}");
+                exit(1);
+            }
+        };
+    }
+
+    println!("UCD data downloading finished.");
+}
diff --git a/work/crates/ucd/src/generate.rs b/work/crates/ucd/src/generate.rs
new file mode 100644
index 0000000..64b74a5
--- /dev/null
+++ b/work/crates/ucd/src/generate.rs
@@ -0,0 +1,653 @@
+////////////////////////////////////////////////////////////////////////////////
+// This file is a part of the "Lady Deirdre" work,                            //
+// a compiler front-end foundation technology.                                //
+//                                                                            //
+// This work is proprietary software with source-available code.              //
+//                                                                            //
+// To copy, use, distribute, and contribute to this work, you must agree to   //
+// the terms of the General License Agreement:                                //
+//                                                                            //
+// https://github.com/Eliah-Lakhin/lady-deirdre/blob/master/EULA.md.          //
+//                                                                            //
+// The agreement grants you a Commercial-Limited License that gives you       //
+// the right to use my work in non-commercial and limited commercial products //
+// with a total gross revenue cap. To remove this commercial limit for one of //
+// your products, you must acquire an Unrestricted Commercial License.        //
+//                                                                            //
+// If you contribute to the source code, documentation, or related materials  //
+// of this work, you must assign these changes to me. Contributions are       //
+// governed by the "Derivative Work" section of the General License           //
+// Agreement.                                                                 //
+//                                                                            //
+// Copying the work in parts is strictly forbidden, except as permitted under //
+// the terms of the General License Agreement.                                //
+//                                                                            //
+// If you do not or cannot agree to the terms of this Agreement,              //
+// do not use this work.                                                      //
+//                                                                            //
+// This work is provided "as is" without any warranties, express or implied,  //
+// except to the extent that such disclaimers are held to be legally invalid. //
+//                                                                            //
+// Copyright (c) 2024 Ilya Lakhin (Илья Александрович Лахин).                 //
+// All rights reserved.                                                       //
+////////////////////////////////////////////////////////////////////////////////
+
+////////////////////////////////////////////////////////////////////////////////////////////////////////
+// A part of this file's source code is an adaptation of the code from the "Rust" work.               //
+//                                                                                                    //
+// The original work available here:                                                                  //
+// https://github.com/raphlinus/rust/blob/cfaf66c94e29a38cd3264b4a55c85b90213543d9/src/etc/unicode.py //
+//                                                                                                    //
+// The authors of the original work grant me with a license to their work under the following terms:  //
+//                                                                                                    //
+//   Permission is hereby granted, free of charge, to any                                             //
+//   person obtaining a copy of this software and associated                                          //
+//   documentation files (the "Software"), to deal in the                                             //
+//   Software without restriction, including without                                                  //
+//   limitation the rights to use, copy, modify, merge,                                               //
+//   publish, distribute, sublicense, and/or sell copies of                                           //
+//   the Software, and to permit persons to whom the Software                                         //
+//   is furnished to do so, subject to the following                                                  //
+//   conditions:                                                                                      //
+//                                                                                                    //
+//   The above copyright notice and this permission notice                                            //
+//   shall be included in all copies or substantial portions                                          //
+//   of the Software.                                                                                 //
+//                                                                                                    //
+//   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF                                            //
+//   ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED                                          //
+//   TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A                                              //
+//   PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT                                              //
+//   SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY                                         //
+//   CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION                                          //
+//   OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR                                          //
+//   IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER                                              //
+//   DEALINGS IN THE SOFTWARE.                                                                        //
+//                                                                                                    //
+// Kindly be advised that the terms governing the distribution of my work are                         //
+// distinct from those pertaining to the original work.                                               //
+////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+use std::{fs::write, path::PathBuf, process::exit};
+
+use ahash::{AHashMap, AHashSet};
+
+use crate::{parse::parse_raw_data, PropDesc, GENERATED_FILE};
+
+const TOTAL: usize = 0x110000;
+const CHUNK: usize = 64;
+
+pub(super) fn generate() {
+    let input = parse_raw_data();
+
+    println!("Starting UCD module generation...");
+
+    let output = Emitter::generate(input);
+
+    let path = PathBuf::from(GENERATED_FILE);
+
+    match write(&path, output) {
+        Ok(()) => {
+            println!("Generated module saved to file {path:?}.");
+        }
+        Err(error) => {
+            eprintln!("Field to save generated module to {path:?}: {error}");
+            exit(1);
+        }
+    }
+
+    println!("UCD module generation finished.");
+}
+
+struct Emitter {
+    output: String,
+    line_length: usize,
+}
+
+impl Emitter {
+    fn generate(input: Vec<(&'static PropDesc, AHashSet<u32>)>) -> String {
+        let mut emitter = Self {
+            output: String::new(),
+            line_length: 0,
+        };
+
+        emitter.emit_notice();
+        emitter.emit_char_properties_object(&input);
+        emitter.emit_char_trait(&input);
+        emitter.emit_trie_type();
+
+        for (prop, code_points) in &input {
+            emitter.emit_table(*prop, code_points);
+        }
+
+        emitter.emit_tests();
+
+        emitter.output
+    }
+
+    fn emit_notice(&mut self) {
+        self.write_ln(r#"// This file is generated by "crates/ucd". Do not edit manually."#);
+        self.blank_ln();
+    }
+
+    fn emit_char_properties_object(&mut self, input: &[(&'static PropDesc, AHashSet<u32>)]) {
+        self.write_ln("/// A configuration for Unicode character properties.");
+        self.write_ln("///");
+        self.write_ln("/// This configuration specifies [character properties](https://en.wikipedia.org/wiki/Unicode_character_property)");
+        self.write_ln("/// of the [char] type.");
+        self.write_ln("///");
+        self.write_ln("/// Using the [Char::has_properties] function, you can check");
+        self.write_ln("/// if a character has specified properties:");
+        self.write_ln("/// `assert!('a'.has_properties(&CharProperties::new().with_lower()))`.");
+        self.write_ln("///");
+        self.write_ln("/// The configuration is inclusive, meaning that that if a character");
+        self.write_ln("/// has at least one of the configured property, has_properties");
+        self.write("/// returns true: ");
+        self.write_ln(
+            "`assert!('a'.has_properties(&CharProperties::new().with_alpha().with_num()))`.",
+        );
+        self.write_ln("///");
+        self.write_ln("/// By default, this object does not have any configured properties.");
+        self.write_ln("/// Therefore, the has_properties function returns false: ");
+        self.write_ln("/// `assert!(!'b'.has_properties(&CharProperties::new()))`.");
+        self.write_ln("///");
+        self.write_ln("/// **Note**: This object is not stabilized yet. New members may be");
+        self.write_ln("/// added in future minor versions of Lady Deirdre. The exact behavior");
+        self.write_ln("/// of already included properties may change over time too to better");
+        self.write("/// match the recent updates in ");
+        self.write_ln("the [Unicode Character Database](https://www.unicode.org/ucd/).");
+        self.write_ln("#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Debug, Hash)]");
+        self.write_ln("#[non_exhaustive]");
+        self.write_ln("pub struct CharProperties {");
+
+        let mut first = true;
+
+        for (prop, _) in input {
+            match first {
+                true => first = false,
+                false => self.blank_ln(),
+            }
+
+            self.write("    /// Includes ");
+
+            let mut first = true;
+
+            for prop in prop.raw_names {
+                match first {
+                    true => first = false,
+                    false => self.write(", "),
+                }
+
+                self.write("`");
+                self.write(prop);
+                self.write("`");
+            }
+
+            match prop.raw_names.len() > 1 {
+                true => self.write_ln(" character properties."),
+                false => self.write_ln(" character property."),
+            }
+
+            self.write("    pub ");
+            self.write(prop.field_name);
+            self.write_ln(": bool,");
+        }
+
+        self.write_ln("}");
+        self.blank_ln();
+
+        self.write_ln("impl std::fmt::Display for CharProperties {");
+        self.write_ln("    #[inline(always)]");
+        self.write("    fn fmt(&self, formatter: &mut std::fmt::Formatter<'_>)");
+        self.write_ln(" -> std::fmt::Result {");
+        self.write_ln("        formatter.write_str(\"$\")?;");
+        self.blank_ln();
+        self.write_ln("        let mut props = Vec::new();");
+
+        for (prop, _) in input {
+            self.blank_ln();
+            self.write("        if self.");
+            self.write(prop.field_name);
+            self.write_ln(" {");
+            self.write("            props.push(\"");
+            self.write(prop.field_name);
+            self.write_ln("\");");
+            self.write_ln("        }");
+        }
+
+        self.blank_ln();
+        self.write_ln("        if props.len() == 1 {");
+        self.write_ln("            formatter.write_str(props[0])?;");
+        self.write_ln("            return Ok(());");
+        self.write_ln("        }");
+        self.blank_ln();
+        self.write_ln("        formatter.write_str(\"{\")?;");
+        self.blank_ln();
+        self.write_ln("        let mut first = true;");
+        self.blank_ln();
+        self.write_ln("        for prop in props {");
+        self.write_ln("            match first {");
+        self.write_ln("                true => first = false,");
+        self.write_ln("                false => formatter.write_str(\" | \")?,");
+        self.write_ln("            }");
+        self.blank_ln();
+        self.write_ln("            formatter.write_str(prop)?;");
+        self.write_ln("        }");
+        self.blank_ln();
+        self.write_ln("        formatter.write_str(\"}\")?;");
+        self.blank_ln();
+        self.write_ln("        Ok(())");
+        self.write_ln("    }");
+        self.write_ln("}");
+        self.blank_ln();
+
+        self.write_ln("impl Default for CharProperties {");
+        self.write_ln("    #[inline(always)]");
+        self.write_ln("    fn default() -> Self {");
+        self.write_ln("        Self::new()");
+        self.write_ln("    }");
+        self.write_ln("}");
+        self.blank_ln();
+
+        self.write_ln("impl CharProperties {");
+
+        self.write_ln("    /// Returns a new instance with all configuration properties");
+        self.write_ln("    /// set to false.");
+        self.write_ln("    #[inline(always)]");
+        self.write_ln("    pub const fn new() -> Self {");
+        self.write_ln("        Self {");
+
+        for (prop, _) in input {
+            self.write("            ");
+            self.write(prop.field_name);
+            self.write_ln(": false,");
+        }
+
+        self.write_ln("        }");
+        self.write_ln("    }");
+
+        for (prop, _) in input {
+            self.blank_ln();
+
+            self.write("    /// Includes ");
+
+            let mut first = true;
+
+            for prop in prop.raw_names {
+                match first {
+                    true => first = false,
+                    false => self.write(", "),
+                }
+
+                self.write("`");
+                self.write(prop);
+                self.write("`");
+            }
+
+            match prop.raw_names.len() > 1 {
+                true => self.write_ln(" character properties."),
+                false => self.write_ln(" character property."),
+            }
+
+            self.write_ln("    #[inline(always)]");
+            self.write("    pub const fn with_");
+            self.write(prop.field_name);
+            self.write_ln("(mut self) -> Self {");
+            self.write("        self.");
+            self.write(prop.field_name);
+            self.write_ln(" = true;");
+            self.blank_ln();
+            self.write_ln("        self");
+            self.write_ln("    }");
+        }
+
+        self.blank_ln();
+        self.write_ln("    /// Creates a union of two property configurations.");
+        self.write_ln("    ///");
+        self.write_ln("    /// The resulting configuration includes a property if at least one of");
+        self.write_ln("    /// two specified configuration objects includes this property.");
+        self.write_ln("    #[inline(always)]");
+        self.write_ln("    pub const fn union(mut self, other: Self) -> Self {");
+
+        for (prop, _) in input {
+            self.write("        self.");
+            self.write(prop.field_name);
+            self.write(" = self.");
+            self.write(prop.field_name);
+            self.write(" || other.");
+            self.write(prop.field_name);
+            self.write_ln(";");
+        }
+
+        self.blank_ln();
+        self.write_ln("        self");
+        self.write_ln("    }");
+
+        self.blank_ln();
+        self.write_ln("    /// Creates an intersection of two property configurations.");
+        self.write_ln("    ///");
+        self.write_ln("    /// The resulting configuration includes a property if both specified");
+        self.write_ln("    /// configuration objects include this property.");
+        self.write_ln("    #[inline(always)]");
+        self.write_ln("    pub const fn intersect(mut self, other: Self) -> Self {");
+
+        for (prop, _) in input {
+            self.write("        self.");
+            self.write(prop.field_name);
+            self.write(" = self.");
+            self.write(prop.field_name);
+            self.write(" && other.");
+            self.write(prop.field_name);
+            self.write_ln(";");
+        }
+
+        self.blank_ln();
+        self.write_ln("        self");
+        self.write_ln("    }");
+
+        self.write_ln("}");
+        self.blank_ln();
+    }
+
+    fn emit_char_trait(&mut self, input: &[(&'static PropDesc, AHashSet<u32>)]) {
+        self.write_ln("/// An extension trait that provides functions to reveal a character's");
+        self.write_ln("/// Unicode properties.");
+        self.write_ln("///");
+        self.write_ln("/// **Note**: This interface is not stabilized yet. New members may be");
+        self.write_ln("/// added in future minor versions of Lady Deirdre. The exact behavior");
+        self.write_ln("/// of already included functions may change over time too to better");
+        self.write("/// match the recent updates in ");
+        self.write_ln("the [Unicode Character Database](https://www.unicode.org/ucd/).");
+        self.write_ln("pub trait Char {");
+
+        let mut first = true;
+
+        for (prop, _) in input {
+            match first {
+                true => first = false,
+                false => self.blank_ln(),
+            }
+
+            self.write("    /// Returns true if the character has ");
+
+            let mut first = true;
+
+            for prop in prop.raw_names {
+                match first {
+                    true => first = false,
+                    false => self.write(", "),
+                }
+
+                self.write("`");
+                self.write(prop);
+                self.write("`");
+            }
+
+            match prop.raw_names.len() > 1 {
+                true => self.write_ln(" properties."),
+                false => self.write_ln(" property."),
+            }
+
+            self.write("    fn is_");
+            self.write(prop.field_name);
+            self.write_ln("(self) -> bool;");
+        }
+
+        self.blank_ln();
+        self.write_ln("    /// Returns true if the character has at least one of the specified");
+        self.write_ln("    /// properties. See [CharProperties] for details.");
+        self.write_ln("    fn has_properties(self, props: &CharProperties) -> bool;");
+
+        self.write_ln("}");
+        self.blank_ln();
+
+        self.write_ln("impl Char for char {");
+
+        first = true;
+
+        for (prop, _) in input {
+            match first {
+                true => first = false,
+                false => self.blank_ln(),
+            }
+
+            self.write_ln("    #[inline(always)]");
+            self.write("    fn is_");
+            self.write(prop.field_name);
+            self.write_ln("(self) -> bool {");
+            self.write("        ");
+            self.write(prop.table_name);
+            self.write_ln(".lookup(self as usize)");
+            self.write_ln("    }");
+        }
+
+        self.blank_ln();
+        self.write_ln("    fn has_properties(self, props: &CharProperties) -> bool {");
+
+        first = true;
+
+        for (prop, _) in input {
+            match first {
+                true => first = false,
+                false => self.blank_ln(),
+            }
+
+            self.write("        if props.");
+            self.write(prop.field_name);
+            self.write(" && self.is_");
+            self.write(prop.field_name);
+            self.write_ln("() {");
+            self.write_ln("            return true;");
+            self.write_ln("        }");
+        }
+
+        self.blank_ln();
+        self.write_ln("        false");
+        self.write_ln("    }");
+        self.write_ln("}");
+        self.blank_ln();
+    }
+
+    fn emit_trie_type(&mut self) {
+        self.write_ln("struct UCDTrie {");
+        self.write_ln("    r1: [u64; 32],");
+        self.write_ln("    r2: [u8; 992],");
+        self.write_ln("    r3: &'static [u64],");
+        self.write_ln("    r4: [u8; 256],");
+        self.write_ln("    r5: &'static [u8],");
+        self.write_ln("    r6: &'static [u64],");
+        self.write_ln("}");
+        self.write_ln("");
+        self.write_ln("impl UCDTrie {");
+        self.write_ln("    #[inline(always)]");
+        self.write_ln("    fn lookup(&self, code_point: usize) -> bool {");
+        self.write_ln("        if code_point < 0x800 {");
+        self.write("            ");
+        self.write_ln("return Self::check_chunk(self.r1[code_point >> 6], code_point);");
+        self.write_ln("        }");
+        self.write_ln("");
+        self.write_ln("        if code_point < 0x10000 {");
+        self.write_ln("            let child = self.r2[(code_point >> 6) - 0x20];");
+        self.write_ln("");
+        self.write_ln("            return Self::check_chunk(self.r3[child as usize], code_point);");
+        self.write_ln("        }");
+        self.write_ln("");
+        self.write_ln("        let child = self.r4[(code_point >> 12) - 0x10];");
+        self.write("        ");
+        self.write_ln("let leaf = self.r5[((child as usize) << 6) + ((code_point >> 6) & 0x3f)];");
+        self.write_ln("");
+        self.write_ln("        Self::check_chunk(self.r6[leaf as usize], code_point)");
+        self.write_ln("    }");
+        self.write_ln("");
+        self.write_ln("    #[inline(always)]");
+        self.write_ln("    fn check_chunk(chunk: u64, code_point: usize) -> bool {");
+        self.write_ln("        ((chunk >> (code_point & 63)) & 1) != 0");
+        self.write_ln("    }");
+        self.write_ln("}");
+        self.blank_ln();
+    }
+
+    fn emit_table(&mut self, prop: &'static PropDesc, code_points: &AHashSet<u32>) {
+        let mut chunks = Vec::new();
+
+        for chunk_index in 0..TOTAL / CHUNK {
+            let mut chunk = 0u64;
+
+            for bit in 0..64 {
+                let code_point =
+                    <u32>::try_from(chunk_index * 64 + bit).expect("Invalid code point.");
+
+                if !code_points.contains(&code_point) {
+                    continue;
+                }
+
+                chunk |= 1 << bit;
+            }
+
+            chunks.push(chunk);
+        }
+
+        let r1 = &chunks[0..(0x800 / CHUNK)];
+        assert_eq!(r1.len(), 32);
+
+        let (r2, r3) = Self::compute_trie(&chunks[0x800 / CHUNK..0x10000 / CHUNK], 64 / CHUNK);
+        assert_eq!(r2.len(), 992);
+
+        let (mid, r6) = Self::compute_trie(&chunks[0x10000 / CHUNK..0x110000 / CHUNK], 64 / CHUNK);
+        let (r4, r5) = Self::compute_trie(&mid, 64);
+
+        self.write_ln("#[rustfmt::skip]");
+        self.write_ln(&format!("static {}: UCDTrie = UCDTrie {{", prop.table_name));
+
+        self.write("    r1: ");
+        self.write_chunk_array(r1, true);
+        self.write_ln(",");
+
+        self.write("    r2: ");
+        self.write_chunk_array(&r2, false);
+        self.write_ln(",");
+
+        self.write("    r3: &");
+        self.write_chunk_array(&r3, true);
+        self.write_ln(",");
+
+        self.write("    r4: ");
+        self.write_chunk_array(&r4, false);
+        self.write_ln(",");
+
+        self.write("    r5: &");
+        self.write_chunk_array(&r5, false);
+        self.write_ln(",");
+
+        self.write("    r6: &");
+        self.write_chunk_array(&r6, true);
+        self.write_ln(",");
+
+        self.write_ln("};");
+        self.blank_ln();
+    }
+
+    fn emit_tests(&mut self) {
+        self.write_ln("#[cfg(test)]");
+        self.write_ln("mod tests {");
+        self.write_ln("    use super::Char;");
+        self.blank_ln();
+        self.write_ln("    #[test]");
+        self.write_ln("    fn test_char_properties() {");
+        self.write_ln("        for ch in '\\0'..'\\u{10ffff}' {");
+        self.write_ln("            match ch.is_whitespace() {");
+        self.write_ln("                true => assert!(ch.is_space()),");
+        self.write_ln("                false => assert!(!ch.is_space()),");
+        self.write_ln("            }");
+        self.blank_ln();
+        self.write_ln("            match ch.is_numeric() {");
+        self.write_ln("                true => assert!(ch.is_num()),");
+        self.write_ln("                false => assert!(!ch.is_num()),");
+        self.write_ln("            }");
+        self.blank_ln();
+        self.write_ln("            match ch.is_uppercase() {");
+        self.write_ln("                true => assert!(ch.is_upper()),");
+        self.write_ln("                false => assert!(!ch.is_upper()),");
+        self.write_ln("            }");
+        self.blank_ln();
+        self.write_ln("            match ch.is_lowercase() {");
+        self.write_ln("                true => assert!(ch.is_lower()),");
+        self.write_ln("                false => assert!(!ch.is_lower()),");
+        self.write_ln("            }");
+        self.write_ln("        }");
+        self.write_ln("    }");
+        self.write_ln("}");
+        self.blank_ln();
+    }
+
+    fn write_chunk_array(&mut self, chunks: &[u64], is_leaf: bool) {
+        let digits = match is_leaf {
+            true => 16,
+            false => 4,
+        };
+
+        self.write_ln("[");
+
+        self.write("        ");
+
+        for chunk in chunks {
+            if !is_leaf {
+                assert!(*chunk <= u8::MAX as u64);
+            }
+
+            match self.line_length >= 80 {
+                true => {
+                    self.blank_ln();
+                    self.write("        ");
+                }
+
+                false => {
+                    if self.line_length > 8 {
+                        self.write(" ");
+                    }
+                }
+            }
+
+            self.write("0x");
+            self.write(&format!("{chunk:0digits$x},").to_ascii_uppercase());
+        }
+
+        self.blank_ln();
+        self.write("    ]");
+    }
+
+    fn write(&mut self, string: &str) {
+        self.output.push_str(&string);
+        self.line_length += string.len();
+    }
+
+    fn write_ln(&mut self, string: &str) {
+        self.output.push_str(string);
+        self.blank_ln();
+    }
+
+    fn blank_ln(&mut self) {
+        self.output.push('\n');
+        self.line_length = 0;
+    }
+
+    fn compute_trie(chunks: &[u64], chunk_size: usize) -> (Vec<u64>, Vec<u64>) {
+        let mut root = Vec::new();
+        let mut child = Vec::new();
+        let mut map = AHashMap::new();
+
+        for chunk_index in 0..chunks.len() / chunk_size {
+            let slice = &chunks[chunk_index * chunk_size..(chunk_index + 1) * chunk_size];
+            let map_len = map.len() as u64;
+
+            let index = map.entry(slice).or_insert_with(|| {
+                child.extend(slice);
+                map_len
+            });
+
+            root.push(*index)
+        }
+
+        (root, child)
+    }
+}
diff --git a/work/crates/ucd/src/main.rs b/work/crates/ucd/src/main.rs
new file mode 100644
index 0000000..1b19f54
--- /dev/null
+++ b/work/crates/ucd/src/main.rs
@@ -0,0 +1,123 @@
+////////////////////////////////////////////////////////////////////////////////
+// This file is a part of the "Lady Deirdre" work,                            //
+// a compiler front-end foundation technology.                                //
+//                                                                            //
+// This work is proprietary software with source-available code.              //
+//                                                                            //
+// To copy, use, distribute, and contribute to this work, you must agree to   //
+// the terms of the General License Agreement:                                //
+//                                                                            //
+// https://github.com/Eliah-Lakhin/lady-deirdre/blob/master/EULA.md.          //
+//                                                                            //
+// The agreement grants you a Commercial-Limited License that gives you       //
+// the right to use my work in non-commercial and limited commercial products //
+// with a total gross revenue cap. To remove this commercial limit for one of //
+// your products, you must acquire an Unrestricted Commercial License.        //
+//                                                                            //
+// If you contribute to the source code, documentation, or related materials  //
+// of this work, you must assign these changes to me. Contributions are       //
+// governed by the "Derivative Work" section of the General License           //
+// Agreement.                                                                 //
+//                                                                            //
+// Copying the work in parts is strictly forbidden, except as permitted under //
+// the terms of the General License Agreement.                                //
+//                                                                            //
+// If you do not or cannot agree to the terms of this Agreement,              //
+// do not use this work.                                                      //
+//                                                                            //
+// This work is provided "as is" without any warranties, express or implied,  //
+// except to the extent that such disclaimers are held to be legally invalid. //
+//                                                                            //
+// Copyright (c) 2024 Ilya Lakhin (Илья Александрович Лахин).                 //
+// All rights reserved.                                                       //
+////////////////////////////////////////////////////////////////////////////////
+
+//TODO check warnings regularly
+#![allow(warnings)]
+
+mod download;
+mod generate;
+mod parse;
+
+use std::{env::args, process::exit};
+
+static UCD_DOWNLOADS_DIR: &str = "downloads";
+
+static UCD_URL: &str = "https://www.unicode.org/Public/UCD/latest/ucd/";
+
+static UCD_RESOURCES: &[&str] = &[
+    "DerivedCoreProperties.txt",
+    "PropList.txt",
+    "UnicodeData.txt",
+    "SpecialCasing.txt",
+];
+
+static GENERATED_FILE: &str = "ucd_gen.txt";
+
+static RAW_PROPERTIES: &[PropDesc] = &[
+    PropDesc {
+        raw_names: &["Alphabetic"],
+        table_name: "ALPHABETIC_TABLE",
+        field_name: "alpha",
+    },
+    PropDesc {
+        raw_names: &["Lowercase"],
+        table_name: "LOWERCASE_TABLE",
+        field_name: "lower",
+    },
+    PropDesc {
+        raw_names: &["Uppercase"],
+        table_name: "UPPERCASE_TABLE",
+        field_name: "upper",
+    },
+    PropDesc {
+        raw_names: &["White_Space"],
+        table_name: "WHITE_SPACE_TABLE",
+        field_name: "space",
+    },
+    PropDesc {
+        raw_names: &["N", "Nd", "Nl", "No"],
+        table_name: "NUM_TABLE",
+        field_name: "num",
+    },
+    PropDesc {
+        raw_names: &["XID_Start"],
+        table_name: "XID_START_TABLE",
+        field_name: "xid_start",
+    },
+    PropDesc {
+        raw_names: &["XID_Continue"],
+        table_name: "XID_CONTINUE_TABLE",
+        field_name: "xid_continue",
+    },
+];
+
+#[derive(PartialEq, Eq, Hash)]
+struct PropDesc {
+    raw_names: &'static [&'static str],
+    table_name: &'static str,
+    field_name: &'static str,
+}
+
+fn main() {
+    let mut arg = match args().skip(1).next() {
+        Some(arg) => arg,
+
+        None => {
+            eprintln!("Missing command. Available commands are: \"download\", \"generate\"");
+            exit(1);
+        }
+    };
+
+    match arg.as_str() {
+        "download" => download::download(),
+        "generate" => generate::generate(),
+
+        other => {
+            eprintln!(
+                "Unknown command {other}. Available commands are: \"download\", \"generate\"",
+            );
+            exit(1);
+        }
+    }
+}
diff --git a/work/crates/ucd/src/parse.rs b/work/crates/ucd/src/parse.rs
new file mode 100644
index 0000000..faca0a2
--- /dev/null
+++ b/work/crates/ucd/src/parse.rs
@@ -0,0 +1,130 @@
+////////////////////////////////////////////////////////////////////////////////
+// This file is a part of the "Lady Deirdre" work,                            //
+// a compiler front-end foundation technology.                                //
+//                                                                            //
+// This work is proprietary software with source-available code.              //
+//                                                                            //
+// To copy, use, distribute, and contribute to this work, you must agree to   //
+// the terms of the General License Agreement:                                //
+//                                                                            //
+// https://github.com/Eliah-Lakhin/lady-deirdre/blob/master/EULA.md.          //
+//                                                                            //
+// The agreement grants you a Commercial-Limited License that gives you       //
+// the right to use my work in non-commercial and limited commercial products //
+// with a total gross revenue cap. To remove this commercial limit for one of //
+// your products, you must acquire an Unrestricted Commercial License.        //
+//                                                                            //
+// If you contribute to the source code, documentation, or related materials  //
+// of this work, you must assign these changes to me. Contributions are       //
+// governed by the "Derivative Work" section of the General License           //
+// Agreement.                                                                 //
+//                                                                            //
+// Copying the work in parts is strictly forbidden, except as permitted under //
+// the terms of the General License Agreement.                                //
+//                                                                            //
+// If you do not or cannot agree to the terms of this Agreement,              //
+// do not use this work.                                                      //
+//                                                                            //
+// This work is provided "as is" without any warranties, express or implied,  //
+// except to the extent that such disclaimers are held to be legally invalid. //
+//                                                                            //
+// Copyright (c) 2024 Ilya Lakhin (Илья Александрович Лахин).                 //
+// All rights reserved.                                                       //
+////////////////////////////////////////////////////////////////////////////////
+
+use std::process::exit;
+
+use ahash::{AHashMap, AHashSet};
+use ucd_parse::{parse, UnicodeDataExpander};
+
+use crate::{PropDesc, RAW_PROPERTIES, UCD_DOWNLOADS_DIR};
+
+pub(super) fn parse_raw_data() -> Vec<(&'static PropDesc, AHashSet<u32>)> {
+    println!("Parsing raw UCD data...");
+
+    let mut data = AHashMap::new();
+
+    let raw_core_properties = match parse::<_, ucd_parse::CoreProperty>(&UCD_DOWNLOADS_DIR) {
+        Ok(props) => {
+            println!("Raw Core Properties parsed.");
+            props
+        }
+        Err(error) => {
+            eprintln!("Core Properties parse error: {error}");
+            exit(1);
+        }
+    };
+
+    for raw in raw_core_properties {
+        let Some(desc) = RAW_PROPERTIES
+            .iter()
+            .find(|desc| desc.raw_names.contains(&raw.property.as_str()))
+        else {
+            continue;
+        };
+
+        let code_points = data.entry(desc).or_insert_with(AHashSet::new);
+
+        for code_point in raw.codepoints {
+            let _ = code_points.insert(code_point.value());
+        }
+    }
+
+    let raw_properties = match parse::<_, ucd_parse::Property>(&UCD_DOWNLOADS_DIR) {
+        Ok(props) => {
+            println!("Raw Properties parsed.");
+            props
+        }
+        Err(error) => {
+            eprintln!("Properties parse error: {error}");
+            exit(1);
+        }
+    };
+
+    for raw in raw_properties {
+        let Some(desc) = RAW_PROPERTIES
+            .iter()
+            .find(|desc| desc.raw_names.contains(&raw.property.as_str()))
+        else {
+            continue;
+        };
+
+        let code_points = data.entry(desc).or_insert_with(AHashSet::new);
+
+        for code_point in raw.codepoints {
+            let _ = code_points.insert(code_point.value());
+        }
+    }
+
+    let raw_unicode_data = match parse::<_, ucd_parse::UnicodeData>(&UCD_DOWNLOADS_DIR) {
+        Ok(props) => {
+            println!("Unicode Data parsed.");
+            props
+        }
+        Err(error) => {
+            eprintln!("Unicode Data parse error: {error}");
+            exit(1);
+        }
+    };
+
+    for raw in UnicodeDataExpander::new(raw_unicode_data) {
+        let Some(desc) = RAW_PROPERTIES
+            .iter()
+            .find(|desc| desc.raw_names.contains(&raw.general_category.as_str()))
+        else {
+            continue;
+        };
+
+        let code_points = data.entry(desc).or_insert_with(AHashSet::new);
+
+        let _ = code_points.insert(raw.codepoint.value());
+    }
+
+    println!("Raw UCD data parsing finished.");
+
+    let mut sorted = data.into_iter().collect::<Vec<_>>();
+
+    sorted.sort_by_key(|(prop, _)| prop.field_name);
+
+    sorted
+}


Test patch: