From 92e2e0dfaaa7077387e8ffcef6283c204bb3f3a7 Mon Sep 17 00:00:00 2001 From: Ankit Goel Date: Thu, 26 Dec 2024 10:27:25 +0000 Subject: [PATCH] Don't generate tables in the build.rs (do so in advance). --- .github/workflows/rust.yml | 31 + Cargo.toml | 11 +- print-table/Cargo.toml | 10 + src/build.rs => print-table/src/main.rs | 39 +- src/case_folding_data.rs | 1404 +++++++++++++++++++++++ src/lib.rs | 82 +- 6 files changed, 1521 insertions(+), 56 deletions(-) create mode 100644 .github/workflows/rust.yml create mode 100644 print-table/Cargo.toml rename src/build.rs => print-table/src/main.rs (63%) create mode 100644 src/case_folding_data.rs diff --git a/.github/workflows/rust.yml b/.github/workflows/rust.yml new file mode 100644 index 0000000..f6778e0 --- /dev/null +++ b/.github/workflows/rust.yml @@ -0,0 +1,31 @@ +name: Rust + +on: + push: + branches: [ master ] + pull_request: + branches: [ master ] + +env: + CARGO_INCREMENTAL: 0 + CARGO_TERM_COLOR: always + RUST_BACKTRACE: 1 + RUSTFLAGS: -D warnings + RUSTDOCFLAGS: -D warnings + +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Build + run: cargo build --verbose + - name: Run tests + run: cargo test --verbose + + regen: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Verify regenerated files + run: cargo run --package print-table >case_folding_data.rs && diff case_folding_data.rs src/case_folding_data.rs diff --git a/Cargo.toml b/Cargo.toml index c8b70ba..dcf3a85 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -6,10 +6,11 @@ description = "Unicode caseless matching" repository = "https://github.com/unicode-rs/rust-caseless" license = "MIT" -build = "src/build.rs" - -[build-dependencies] -regex = "1.0" - [dependencies] unicode-normalization = "0.1" + +[workspace] +members = [ + ".", + "print-table", +] diff --git a/print-table/Cargo.toml b/print-table/Cargo.toml new file mode 100644 index 0000000..a065057 --- /dev/null +++ b/print-table/Cargo.toml @@ -0,0 +1,10 @@ +[package] +name = "print-table" +version = "0.2.1" +authors = ["Simon Sapin "] +license = "MIT" +publish = false + +[dependencies] +regex = "1" + diff --git a/src/build.rs b/print-table/src/main.rs similarity index 63% rename from src/build.rs rename to print-table/src/main.rs index 80f619a..d054e65 100644 --- a/src/build.rs +++ b/print-table/src/main.rs @@ -1,17 +1,13 @@ extern crate regex; -use std::char; -use std::env; -use std::fs::File; -use std::io::Write; -use std::path::Path; use regex::Regex; +use std::char; // Case folding a single code point can give up to this many code points. const MAX_FOLDED_CODE_POINTS: usize = 3; fn main() { - let mut lines = include_str!("../CaseFolding.txt").lines(); + let mut lines = include_str!("../../CaseFolding.txt").lines(); let first_line = lines.next().unwrap(); let version_regex = Regex::new(r"^# CaseFolding-(\d+)\.(\d+)\.(\d+).txt$").unwrap(); let unicode_version = &version_regex.captures(first_line).unwrap(); @@ -20,16 +16,11 @@ fn main() { unicode_version[2].parse().unwrap(), unicode_version[3].parse().unwrap(), ); - - let dst = Path::new(&env::var("OUT_DIR").unwrap()).join("case_folding_data.rs"); - let f = &mut File::create(&dst).unwrap(); - - macro_rules! w { - ($($args: tt)+) => { (write!(f, $($args)+)).unwrap(); } - }; - - w!("pub const UNICODE_VERSION: (u64, u64, u64) = ({}, {}, {});\n", major, minor, patch); - w!("const CASE_FOLDING_TABLE: &'static [(char, [char; 3])] = &[\n"); + print!( + "pub const UNICODE_VERSION: (u64, u64, u64) = ({}, {}, {});\n", + major, minor, patch + ); + print!("pub const CASE_FOLDING_TABLE: &'static [(char, [char; 3])] = &[\n"); // Entry with C (common case folding) or F (full case folding) status let c_or_f_entry = Regex::new(r"^([0-9A-F]+); [CF]; ([0-9A-F ]+);").unwrap(); @@ -37,25 +28,27 @@ fn main() { for line in lines { if let Some(captures) = c_or_f_entry.captures(line) { let from = &captures[1]; - let to = captures[2].split(' ').map(hex_to_escaped).collect::>(); + let to = captures[2] + .split(' ') + .map(hex_to_escaped) + .collect::>(); assert!(to.len() <= MAX_FOLDED_CODE_POINTS); let blanks = MAX_FOLDED_CODE_POINTS - to.len(); let mut to = to.into_iter(); let first_to = to.next().unwrap(); - w!(" ('{}', ['{}'", hex_to_escaped(from), first_to); + print!(" ('{}', ['{}'", hex_to_escaped(from), first_to); for c in to { - w!(", '{}'", c); + print!(", '{}'", c); } for _ in 0..blanks { - w!(", '\\0'"); + print!(", '\\0'"); } - w!("]),\n"); + print!("]),\n"); } } - w!("];\n"); + print!("];\n"); } - fn hex_to_escaped(hex: &str) -> String { let c = u32::from_str_radix(hex, 16).unwrap(); assert!(c != 0); diff --git a/src/case_folding_data.rs b/src/case_folding_data.rs new file mode 100644 index 0000000..f891ce7 --- /dev/null +++ b/src/case_folding_data.rs @@ -0,0 +1,1404 @@ +pub const UNICODE_VERSION: (u64, u64, u64) = (10, 0, 0); +pub const CASE_FOLDING_TABLE: &'static [(char, [char; 3])] = &[ + ('A', ['a', '\0', '\0']), + ('B', ['b', '\0', '\0']), + ('C', ['c', '\0', '\0']), + ('D', ['d', '\0', '\0']), + ('E', ['e', '\0', '\0']), + ('F', ['f', '\0', '\0']), + ('G', ['g', '\0', '\0']), + ('H', ['h', '\0', '\0']), + ('I', ['i', '\0', '\0']), + ('J', ['j', '\0', '\0']), + ('K', ['k', '\0', '\0']), + ('L', ['l', '\0', '\0']), + ('M', ['m', '\0', '\0']), + ('N', ['n', '\0', '\0']), + ('O', ['o', '\0', '\0']), + ('P', ['p', '\0', '\0']), + ('Q', ['q', '\0', '\0']), + ('R', ['r', '\0', '\0']), + ('S', ['s', '\0', '\0']), + ('T', ['t', '\0', '\0']), + ('U', ['u', '\0', '\0']), + ('V', ['v', '\0', '\0']), + ('W', ['w', '\0', '\0']), + ('X', ['x', '\0', '\0']), + ('Y', ['y', '\0', '\0']), + ('Z', ['z', '\0', '\0']), + ('\u{b5}', ['\u{3bc}', '\0', '\0']), + ('\u{c0}', ['\u{e0}', '\0', '\0']), + ('\u{c1}', ['\u{e1}', '\0', '\0']), + ('\u{c2}', ['\u{e2}', '\0', '\0']), + ('\u{c3}', ['\u{e3}', '\0', '\0']), + ('\u{c4}', ['\u{e4}', '\0', '\0']), + ('\u{c5}', ['\u{e5}', '\0', '\0']), + ('\u{c6}', ['\u{e6}', '\0', '\0']), + ('\u{c7}', ['\u{e7}', '\0', '\0']), + ('\u{c8}', ['\u{e8}', '\0', '\0']), + ('\u{c9}', ['\u{e9}', '\0', '\0']), + ('\u{ca}', ['\u{ea}', '\0', '\0']), + ('\u{cb}', ['\u{eb}', '\0', '\0']), + ('\u{cc}', ['\u{ec}', '\0', '\0']), + ('\u{cd}', ['\u{ed}', '\0', '\0']), + ('\u{ce}', ['\u{ee}', '\0', '\0']), + ('\u{cf}', ['\u{ef}', '\0', '\0']), + ('\u{d0}', ['\u{f0}', '\0', '\0']), + ('\u{d1}', ['\u{f1}', '\0', '\0']), + ('\u{d2}', ['\u{f2}', '\0', '\0']), + ('\u{d3}', ['\u{f3}', '\0', '\0']), + ('\u{d4}', ['\u{f4}', '\0', '\0']), + ('\u{d5}', ['\u{f5}', '\0', '\0']), + ('\u{d6}', ['\u{f6}', '\0', '\0']), + ('\u{d8}', ['\u{f8}', '\0', '\0']), + ('\u{d9}', ['\u{f9}', '\0', '\0']), + ('\u{da}', ['\u{fa}', '\0', '\0']), + ('\u{db}', ['\u{fb}', '\0', '\0']), + ('\u{dc}', ['\u{fc}', '\0', '\0']), + ('\u{dd}', ['\u{fd}', '\0', '\0']), + ('\u{de}', ['\u{fe}', '\0', '\0']), + ('\u{df}', ['s', 's', '\0']), + ('\u{100}', ['\u{101}', '\0', '\0']), + ('\u{102}', ['\u{103}', '\0', '\0']), + ('\u{104}', ['\u{105}', '\0', '\0']), + ('\u{106}', ['\u{107}', '\0', '\0']), + ('\u{108}', ['\u{109}', '\0', '\0']), + ('\u{10a}', ['\u{10b}', '\0', '\0']), + ('\u{10c}', ['\u{10d}', '\0', '\0']), + ('\u{10e}', ['\u{10f}', '\0', '\0']), + ('\u{110}', ['\u{111}', '\0', '\0']), + ('\u{112}', ['\u{113}', '\0', '\0']), + ('\u{114}', ['\u{115}', '\0', '\0']), + ('\u{116}', ['\u{117}', '\0', '\0']), + ('\u{118}', ['\u{119}', '\0', '\0']), + ('\u{11a}', ['\u{11b}', '\0', '\0']), + ('\u{11c}', ['\u{11d}', '\0', '\0']), + ('\u{11e}', ['\u{11f}', '\0', '\0']), + ('\u{120}', ['\u{121}', '\0', '\0']), + ('\u{122}', ['\u{123}', '\0', '\0']), + ('\u{124}', ['\u{125}', '\0', '\0']), + ('\u{126}', ['\u{127}', '\0', '\0']), + ('\u{128}', ['\u{129}', '\0', '\0']), + ('\u{12a}', ['\u{12b}', '\0', '\0']), + ('\u{12c}', ['\u{12d}', '\0', '\0']), + ('\u{12e}', ['\u{12f}', '\0', '\0']), + ('\u{130}', ['i', '\u{307}', '\0']), + ('\u{132}', ['\u{133}', '\0', '\0']), + ('\u{134}', ['\u{135}', '\0', '\0']), + ('\u{136}', ['\u{137}', '\0', '\0']), + ('\u{139}', ['\u{13a}', '\0', '\0']), + ('\u{13b}', ['\u{13c}', '\0', '\0']), + ('\u{13d}', ['\u{13e}', '\0', '\0']), + ('\u{13f}', ['\u{140}', '\0', '\0']), + ('\u{141}', ['\u{142}', '\0', '\0']), + ('\u{143}', ['\u{144}', '\0', '\0']), + ('\u{145}', ['\u{146}', '\0', '\0']), + ('\u{147}', ['\u{148}', '\0', '\0']), + ('\u{149}', ['\u{2bc}', 'n', '\0']), + ('\u{14a}', ['\u{14b}', '\0', '\0']), + ('\u{14c}', ['\u{14d}', '\0', '\0']), + ('\u{14e}', ['\u{14f}', '\0', '\0']), + ('\u{150}', ['\u{151}', '\0', '\0']), + ('\u{152}', ['\u{153}', '\0', '\0']), + ('\u{154}', ['\u{155}', '\0', '\0']), + ('\u{156}', ['\u{157}', '\0', '\0']), + ('\u{158}', ['\u{159}', '\0', '\0']), + ('\u{15a}', ['\u{15b}', '\0', '\0']), + ('\u{15c}', ['\u{15d}', '\0', '\0']), + ('\u{15e}', ['\u{15f}', '\0', '\0']), + ('\u{160}', ['\u{161}', '\0', '\0']), + ('\u{162}', ['\u{163}', '\0', '\0']), + ('\u{164}', ['\u{165}', '\0', '\0']), + ('\u{166}', ['\u{167}', '\0', '\0']), + ('\u{168}', ['\u{169}', '\0', '\0']), + ('\u{16a}', ['\u{16b}', '\0', '\0']), + ('\u{16c}', ['\u{16d}', '\0', '\0']), + ('\u{16e}', ['\u{16f}', '\0', '\0']), + ('\u{170}', ['\u{171}', '\0', '\0']), + ('\u{172}', ['\u{173}', '\0', '\0']), + ('\u{174}', ['\u{175}', '\0', '\0']), + ('\u{176}', ['\u{177}', '\0', '\0']), + ('\u{178}', ['\u{ff}', '\0', '\0']), + ('\u{179}', ['\u{17a}', '\0', '\0']), + ('\u{17b}', ['\u{17c}', '\0', '\0']), + ('\u{17d}', ['\u{17e}', '\0', '\0']), + ('\u{17f}', ['s', '\0', '\0']), + ('\u{181}', ['\u{253}', '\0', '\0']), + ('\u{182}', ['\u{183}', '\0', '\0']), + ('\u{184}', ['\u{185}', '\0', '\0']), + ('\u{186}', ['\u{254}', '\0', '\0']), + ('\u{187}', ['\u{188}', '\0', '\0']), + ('\u{189}', ['\u{256}', '\0', '\0']), + ('\u{18a}', ['\u{257}', '\0', '\0']), + ('\u{18b}', ['\u{18c}', '\0', '\0']), + ('\u{18e}', ['\u{1dd}', '\0', '\0']), + ('\u{18f}', ['\u{259}', '\0', '\0']), + ('\u{190}', ['\u{25b}', '\0', '\0']), + ('\u{191}', ['\u{192}', '\0', '\0']), + ('\u{193}', ['\u{260}', '\0', '\0']), + ('\u{194}', ['\u{263}', '\0', '\0']), + ('\u{196}', ['\u{269}', '\0', '\0']), + ('\u{197}', ['\u{268}', '\0', '\0']), + ('\u{198}', ['\u{199}', '\0', '\0']), + ('\u{19c}', ['\u{26f}', '\0', '\0']), + ('\u{19d}', ['\u{272}', '\0', '\0']), + ('\u{19f}', ['\u{275}', '\0', '\0']), + ('\u{1a0}', ['\u{1a1}', '\0', '\0']), + ('\u{1a2}', ['\u{1a3}', '\0', '\0']), + ('\u{1a4}', ['\u{1a5}', '\0', '\0']), + ('\u{1a6}', ['\u{280}', '\0', '\0']), + ('\u{1a7}', ['\u{1a8}', '\0', '\0']), + ('\u{1a9}', ['\u{283}', '\0', '\0']), + ('\u{1ac}', ['\u{1ad}', '\0', '\0']), + ('\u{1ae}', ['\u{288}', '\0', '\0']), + ('\u{1af}', ['\u{1b0}', '\0', '\0']), + ('\u{1b1}', ['\u{28a}', '\0', '\0']), + ('\u{1b2}', ['\u{28b}', '\0', '\0']), + ('\u{1b3}', ['\u{1b4}', '\0', '\0']), + ('\u{1b5}', ['\u{1b6}', '\0', '\0']), + ('\u{1b7}', ['\u{292}', '\0', '\0']), + ('\u{1b8}', ['\u{1b9}', '\0', '\0']), + ('\u{1bc}', ['\u{1bd}', '\0', '\0']), + ('\u{1c4}', ['\u{1c6}', '\0', '\0']), + ('\u{1c5}', ['\u{1c6}', '\0', '\0']), + ('\u{1c7}', ['\u{1c9}', '\0', '\0']), + ('\u{1c8}', ['\u{1c9}', '\0', '\0']), + ('\u{1ca}', ['\u{1cc}', '\0', '\0']), + ('\u{1cb}', ['\u{1cc}', '\0', '\0']), + ('\u{1cd}', ['\u{1ce}', '\0', '\0']), + ('\u{1cf}', ['\u{1d0}', '\0', '\0']), + ('\u{1d1}', ['\u{1d2}', '\0', '\0']), + ('\u{1d3}', ['\u{1d4}', '\0', '\0']), + ('\u{1d5}', ['\u{1d6}', '\0', '\0']), + ('\u{1d7}', ['\u{1d8}', '\0', '\0']), + ('\u{1d9}', ['\u{1da}', '\0', '\0']), + ('\u{1db}', ['\u{1dc}', '\0', '\0']), + ('\u{1de}', ['\u{1df}', '\0', '\0']), + ('\u{1e0}', ['\u{1e1}', '\0', '\0']), + ('\u{1e2}', ['\u{1e3}', '\0', '\0']), + ('\u{1e4}', ['\u{1e5}', '\0', '\0']), + ('\u{1e6}', ['\u{1e7}', '\0', '\0']), + ('\u{1e8}', ['\u{1e9}', '\0', '\0']), + ('\u{1ea}', ['\u{1eb}', '\0', '\0']), + ('\u{1ec}', ['\u{1ed}', '\0', '\0']), + ('\u{1ee}', ['\u{1ef}', '\0', '\0']), + ('\u{1f0}', ['j', '\u{30c}', '\0']), + ('\u{1f1}', ['\u{1f3}', '\0', '\0']), + ('\u{1f2}', ['\u{1f3}', '\0', '\0']), + ('\u{1f4}', ['\u{1f5}', '\0', '\0']), + ('\u{1f6}', ['\u{195}', '\0', '\0']), + ('\u{1f7}', ['\u{1bf}', '\0', '\0']), + ('\u{1f8}', ['\u{1f9}', '\0', '\0']), + ('\u{1fa}', ['\u{1fb}', '\0', '\0']), + ('\u{1fc}', ['\u{1fd}', '\0', '\0']), + ('\u{1fe}', ['\u{1ff}', '\0', '\0']), + ('\u{200}', ['\u{201}', '\0', '\0']), + ('\u{202}', ['\u{203}', '\0', '\0']), + ('\u{204}', ['\u{205}', '\0', '\0']), + ('\u{206}', ['\u{207}', '\0', '\0']), + ('\u{208}', ['\u{209}', '\0', '\0']), + ('\u{20a}', ['\u{20b}', '\0', '\0']), + ('\u{20c}', ['\u{20d}', '\0', '\0']), + ('\u{20e}', ['\u{20f}', '\0', '\0']), + ('\u{210}', ['\u{211}', '\0', '\0']), + ('\u{212}', ['\u{213}', '\0', '\0']), + ('\u{214}', ['\u{215}', '\0', '\0']), + ('\u{216}', ['\u{217}', '\0', '\0']), + ('\u{218}', ['\u{219}', '\0', '\0']), + ('\u{21a}', ['\u{21b}', '\0', '\0']), + ('\u{21c}', ['\u{21d}', '\0', '\0']), + ('\u{21e}', ['\u{21f}', '\0', '\0']), + ('\u{220}', ['\u{19e}', '\0', '\0']), + ('\u{222}', ['\u{223}', '\0', '\0']), + ('\u{224}', ['\u{225}', '\0', '\0']), + ('\u{226}', ['\u{227}', '\0', '\0']), + ('\u{228}', ['\u{229}', '\0', '\0']), + ('\u{22a}', ['\u{22b}', '\0', '\0']), + ('\u{22c}', ['\u{22d}', '\0', '\0']), + ('\u{22e}', ['\u{22f}', '\0', '\0']), + ('\u{230}', ['\u{231}', '\0', '\0']), + ('\u{232}', ['\u{233}', '\0', '\0']), + ('\u{23a}', ['\u{2c65}', '\0', '\0']), + ('\u{23b}', ['\u{23c}', '\0', '\0']), + ('\u{23d}', ['\u{19a}', '\0', '\0']), + ('\u{23e}', ['\u{2c66}', '\0', '\0']), + ('\u{241}', ['\u{242}', '\0', '\0']), + ('\u{243}', ['\u{180}', '\0', '\0']), + ('\u{244}', ['\u{289}', '\0', '\0']), + ('\u{245}', ['\u{28c}', '\0', '\0']), + ('\u{246}', ['\u{247}', '\0', '\0']), + ('\u{248}', ['\u{249}', '\0', '\0']), + ('\u{24a}', ['\u{24b}', '\0', '\0']), + ('\u{24c}', ['\u{24d}', '\0', '\0']), + ('\u{24e}', ['\u{24f}', '\0', '\0']), + ('\u{345}', ['\u{3b9}', '\0', '\0']), + ('\u{370}', ['\u{371}', '\0', '\0']), + ('\u{372}', ['\u{373}', '\0', '\0']), + ('\u{376}', ['\u{377}', '\0', '\0']), + ('\u{37f}', ['\u{3f3}', '\0', '\0']), + ('\u{386}', ['\u{3ac}', '\0', '\0']), + ('\u{388}', ['\u{3ad}', '\0', '\0']), + ('\u{389}', ['\u{3ae}', '\0', '\0']), + ('\u{38a}', ['\u{3af}', '\0', '\0']), + ('\u{38c}', ['\u{3cc}', '\0', '\0']), + ('\u{38e}', ['\u{3cd}', '\0', '\0']), + ('\u{38f}', ['\u{3ce}', '\0', '\0']), + ('\u{390}', ['\u{3b9}', '\u{308}', '\u{301}']), + ('\u{391}', ['\u{3b1}', '\0', '\0']), + ('\u{392}', ['\u{3b2}', '\0', '\0']), + ('\u{393}', ['\u{3b3}', '\0', '\0']), + ('\u{394}', ['\u{3b4}', '\0', '\0']), + ('\u{395}', ['\u{3b5}', '\0', '\0']), + ('\u{396}', ['\u{3b6}', '\0', '\0']), + ('\u{397}', ['\u{3b7}', '\0', '\0']), + ('\u{398}', ['\u{3b8}', '\0', '\0']), + ('\u{399}', ['\u{3b9}', '\0', '\0']), + ('\u{39a}', ['\u{3ba}', '\0', '\0']), + ('\u{39b}', ['\u{3bb}', '\0', '\0']), + ('\u{39c}', ['\u{3bc}', '\0', '\0']), + ('\u{39d}', ['\u{3bd}', '\0', '\0']), + ('\u{39e}', ['\u{3be}', '\0', '\0']), + ('\u{39f}', ['\u{3bf}', '\0', '\0']), + ('\u{3a0}', ['\u{3c0}', '\0', '\0']), + ('\u{3a1}', ['\u{3c1}', '\0', '\0']), + ('\u{3a3}', ['\u{3c3}', '\0', '\0']), + ('\u{3a4}', ['\u{3c4}', '\0', '\0']), + ('\u{3a5}', ['\u{3c5}', '\0', '\0']), + ('\u{3a6}', ['\u{3c6}', '\0', '\0']), + ('\u{3a7}', ['\u{3c7}', '\0', '\0']), + ('\u{3a8}', ['\u{3c8}', '\0', '\0']), + ('\u{3a9}', ['\u{3c9}', '\0', '\0']), + ('\u{3aa}', ['\u{3ca}', '\0', '\0']), + ('\u{3ab}', ['\u{3cb}', '\0', '\0']), + ('\u{3b0}', ['\u{3c5}', '\u{308}', '\u{301}']), + ('\u{3c2}', ['\u{3c3}', '\0', '\0']), + ('\u{3cf}', ['\u{3d7}', '\0', '\0']), + ('\u{3d0}', ['\u{3b2}', '\0', '\0']), + ('\u{3d1}', ['\u{3b8}', '\0', '\0']), + ('\u{3d5}', ['\u{3c6}', '\0', '\0']), + ('\u{3d6}', ['\u{3c0}', '\0', '\0']), + ('\u{3d8}', ['\u{3d9}', '\0', '\0']), + ('\u{3da}', ['\u{3db}', '\0', '\0']), + ('\u{3dc}', ['\u{3dd}', '\0', '\0']), + ('\u{3de}', ['\u{3df}', '\0', '\0']), + ('\u{3e0}', ['\u{3e1}', '\0', '\0']), + ('\u{3e2}', ['\u{3e3}', '\0', '\0']), + ('\u{3e4}', ['\u{3e5}', '\0', '\0']), + ('\u{3e6}', ['\u{3e7}', '\0', '\0']), + ('\u{3e8}', ['\u{3e9}', '\0', '\0']), + ('\u{3ea}', ['\u{3eb}', '\0', '\0']), + ('\u{3ec}', ['\u{3ed}', '\0', '\0']), + ('\u{3ee}', ['\u{3ef}', '\0', '\0']), + ('\u{3f0}', ['\u{3ba}', '\0', '\0']), + ('\u{3f1}', ['\u{3c1}', '\0', '\0']), + ('\u{3f4}', ['\u{3b8}', '\0', '\0']), + ('\u{3f5}', ['\u{3b5}', '\0', '\0']), + ('\u{3f7}', ['\u{3f8}', '\0', '\0']), + ('\u{3f9}', ['\u{3f2}', '\0', '\0']), + ('\u{3fa}', ['\u{3fb}', '\0', '\0']), + ('\u{3fd}', ['\u{37b}', '\0', '\0']), + ('\u{3fe}', ['\u{37c}', '\0', '\0']), + ('\u{3ff}', ['\u{37d}', '\0', '\0']), + ('\u{400}', ['\u{450}', '\0', '\0']), + ('\u{401}', ['\u{451}', '\0', '\0']), + ('\u{402}', ['\u{452}', '\0', '\0']), + ('\u{403}', ['\u{453}', '\0', '\0']), + ('\u{404}', ['\u{454}', '\0', '\0']), + ('\u{405}', ['\u{455}', '\0', '\0']), + ('\u{406}', ['\u{456}', '\0', '\0']), + ('\u{407}', ['\u{457}', '\0', '\0']), + ('\u{408}', ['\u{458}', '\0', '\0']), + ('\u{409}', ['\u{459}', '\0', '\0']), + ('\u{40a}', ['\u{45a}', '\0', '\0']), + ('\u{40b}', ['\u{45b}', '\0', '\0']), + ('\u{40c}', ['\u{45c}', '\0', '\0']), + ('\u{40d}', ['\u{45d}', '\0', '\0']), + ('\u{40e}', ['\u{45e}', '\0', '\0']), + ('\u{40f}', ['\u{45f}', '\0', '\0']), + ('\u{410}', ['\u{430}', '\0', '\0']), + ('\u{411}', ['\u{431}', '\0', '\0']), + ('\u{412}', ['\u{432}', '\0', '\0']), + ('\u{413}', ['\u{433}', '\0', '\0']), + ('\u{414}', ['\u{434}', '\0', '\0']), + ('\u{415}', ['\u{435}', '\0', '\0']), + ('\u{416}', ['\u{436}', '\0', '\0']), + ('\u{417}', ['\u{437}', '\0', '\0']), + ('\u{418}', ['\u{438}', '\0', '\0']), + ('\u{419}', ['\u{439}', '\0', '\0']), + ('\u{41a}', ['\u{43a}', '\0', '\0']), + ('\u{41b}', ['\u{43b}', '\0', '\0']), + ('\u{41c}', ['\u{43c}', '\0', '\0']), + ('\u{41d}', ['\u{43d}', '\0', '\0']), + ('\u{41e}', ['\u{43e}', '\0', '\0']), + ('\u{41f}', ['\u{43f}', '\0', '\0']), + ('\u{420}', ['\u{440}', '\0', '\0']), + ('\u{421}', ['\u{441}', '\0', '\0']), + ('\u{422}', ['\u{442}', '\0', '\0']), + ('\u{423}', ['\u{443}', '\0', '\0']), + ('\u{424}', ['\u{444}', '\0', '\0']), + ('\u{425}', ['\u{445}', '\0', '\0']), + ('\u{426}', ['\u{446}', '\0', '\0']), + ('\u{427}', ['\u{447}', '\0', '\0']), + ('\u{428}', ['\u{448}', '\0', '\0']), + ('\u{429}', ['\u{449}', '\0', '\0']), + ('\u{42a}', ['\u{44a}', '\0', '\0']), + ('\u{42b}', ['\u{44b}', '\0', '\0']), + ('\u{42c}', ['\u{44c}', '\0', '\0']), + ('\u{42d}', ['\u{44d}', '\0', '\0']), + ('\u{42e}', ['\u{44e}', '\0', '\0']), + ('\u{42f}', ['\u{44f}', '\0', '\0']), + ('\u{460}', ['\u{461}', '\0', '\0']), + ('\u{462}', ['\u{463}', '\0', '\0']), + ('\u{464}', ['\u{465}', '\0', '\0']), + ('\u{466}', ['\u{467}', '\0', '\0']), + ('\u{468}', ['\u{469}', '\0', '\0']), + ('\u{46a}', ['\u{46b}', '\0', '\0']), + ('\u{46c}', ['\u{46d}', '\0', '\0']), + ('\u{46e}', ['\u{46f}', '\0', '\0']), + ('\u{470}', ['\u{471}', '\0', '\0']), + ('\u{472}', ['\u{473}', '\0', '\0']), + ('\u{474}', ['\u{475}', '\0', '\0']), + ('\u{476}', ['\u{477}', '\0', '\0']), + ('\u{478}', ['\u{479}', '\0', '\0']), + ('\u{47a}', ['\u{47b}', '\0', '\0']), + ('\u{47c}', ['\u{47d}', '\0', '\0']), + ('\u{47e}', ['\u{47f}', '\0', '\0']), + ('\u{480}', ['\u{481}', '\0', '\0']), + ('\u{48a}', ['\u{48b}', '\0', '\0']), + ('\u{48c}', ['\u{48d}', '\0', '\0']), + ('\u{48e}', ['\u{48f}', '\0', '\0']), + ('\u{490}', ['\u{491}', '\0', '\0']), + ('\u{492}', ['\u{493}', '\0', '\0']), + ('\u{494}', ['\u{495}', '\0', '\0']), + ('\u{496}', ['\u{497}', '\0', '\0']), + ('\u{498}', ['\u{499}', '\0', '\0']), + ('\u{49a}', ['\u{49b}', '\0', '\0']), + ('\u{49c}', ['\u{49d}', '\0', '\0']), + ('\u{49e}', ['\u{49f}', '\0', '\0']), + ('\u{4a0}', ['\u{4a1}', '\0', '\0']), + ('\u{4a2}', ['\u{4a3}', '\0', '\0']), + ('\u{4a4}', ['\u{4a5}', '\0', '\0']), + ('\u{4a6}', ['\u{4a7}', '\0', '\0']), + ('\u{4a8}', ['\u{4a9}', '\0', '\0']), + ('\u{4aa}', ['\u{4ab}', '\0', '\0']), + ('\u{4ac}', ['\u{4ad}', '\0', '\0']), + ('\u{4ae}', ['\u{4af}', '\0', '\0']), + ('\u{4b0}', ['\u{4b1}', '\0', '\0']), + ('\u{4b2}', ['\u{4b3}', '\0', '\0']), + ('\u{4b4}', ['\u{4b5}', '\0', '\0']), + ('\u{4b6}', ['\u{4b7}', '\0', '\0']), + ('\u{4b8}', ['\u{4b9}', '\0', '\0']), + ('\u{4ba}', ['\u{4bb}', '\0', '\0']), + ('\u{4bc}', ['\u{4bd}', '\0', '\0']), + ('\u{4be}', ['\u{4bf}', '\0', '\0']), + ('\u{4c0}', ['\u{4cf}', '\0', '\0']), + ('\u{4c1}', ['\u{4c2}', '\0', '\0']), + ('\u{4c3}', ['\u{4c4}', '\0', '\0']), + ('\u{4c5}', ['\u{4c6}', '\0', '\0']), + ('\u{4c7}', ['\u{4c8}', '\0', '\0']), + ('\u{4c9}', ['\u{4ca}', '\0', '\0']), + ('\u{4cb}', ['\u{4cc}', '\0', '\0']), + ('\u{4cd}', ['\u{4ce}', '\0', '\0']), + ('\u{4d0}', ['\u{4d1}', '\0', '\0']), + ('\u{4d2}', ['\u{4d3}', '\0', '\0']), + ('\u{4d4}', ['\u{4d5}', '\0', '\0']), + ('\u{4d6}', ['\u{4d7}', '\0', '\0']), + ('\u{4d8}', ['\u{4d9}', '\0', '\0']), + ('\u{4da}', ['\u{4db}', '\0', '\0']), + ('\u{4dc}', ['\u{4dd}', '\0', '\0']), + ('\u{4de}', ['\u{4df}', '\0', '\0']), + ('\u{4e0}', ['\u{4e1}', '\0', '\0']), + ('\u{4e2}', ['\u{4e3}', '\0', '\0']), + ('\u{4e4}', ['\u{4e5}', '\0', '\0']), + ('\u{4e6}', ['\u{4e7}', '\0', '\0']), + ('\u{4e8}', ['\u{4e9}', '\0', '\0']), + ('\u{4ea}', ['\u{4eb}', '\0', '\0']), + ('\u{4ec}', ['\u{4ed}', '\0', '\0']), + ('\u{4ee}', ['\u{4ef}', '\0', '\0']), + ('\u{4f0}', ['\u{4f1}', '\0', '\0']), + ('\u{4f2}', ['\u{4f3}', '\0', '\0']), + ('\u{4f4}', ['\u{4f5}', '\0', '\0']), + ('\u{4f6}', ['\u{4f7}', '\0', '\0']), + ('\u{4f8}', ['\u{4f9}', '\0', '\0']), + ('\u{4fa}', ['\u{4fb}', '\0', '\0']), + ('\u{4fc}', ['\u{4fd}', '\0', '\0']), + ('\u{4fe}', ['\u{4ff}', '\0', '\0']), + ('\u{500}', ['\u{501}', '\0', '\0']), + ('\u{502}', ['\u{503}', '\0', '\0']), + ('\u{504}', ['\u{505}', '\0', '\0']), + ('\u{506}', ['\u{507}', '\0', '\0']), + ('\u{508}', ['\u{509}', '\0', '\0']), + ('\u{50a}', ['\u{50b}', '\0', '\0']), + ('\u{50c}', ['\u{50d}', '\0', '\0']), + ('\u{50e}', ['\u{50f}', '\0', '\0']), + ('\u{510}', ['\u{511}', '\0', '\0']), + ('\u{512}', ['\u{513}', '\0', '\0']), + ('\u{514}', ['\u{515}', '\0', '\0']), + ('\u{516}', ['\u{517}', '\0', '\0']), + ('\u{518}', ['\u{519}', '\0', '\0']), + ('\u{51a}', ['\u{51b}', '\0', '\0']), + ('\u{51c}', ['\u{51d}', '\0', '\0']), + ('\u{51e}', ['\u{51f}', '\0', '\0']), + ('\u{520}', ['\u{521}', '\0', '\0']), + ('\u{522}', ['\u{523}', '\0', '\0']), + ('\u{524}', ['\u{525}', '\0', '\0']), + ('\u{526}', ['\u{527}', '\0', '\0']), + ('\u{528}', ['\u{529}', '\0', '\0']), + ('\u{52a}', ['\u{52b}', '\0', '\0']), + ('\u{52c}', ['\u{52d}', '\0', '\0']), + ('\u{52e}', ['\u{52f}', '\0', '\0']), + ('\u{531}', ['\u{561}', '\0', '\0']), + ('\u{532}', ['\u{562}', '\0', '\0']), + ('\u{533}', ['\u{563}', '\0', '\0']), + ('\u{534}', ['\u{564}', '\0', '\0']), + ('\u{535}', ['\u{565}', '\0', '\0']), + ('\u{536}', ['\u{566}', '\0', '\0']), + ('\u{537}', ['\u{567}', '\0', '\0']), + ('\u{538}', ['\u{568}', '\0', '\0']), + ('\u{539}', ['\u{569}', '\0', '\0']), + ('\u{53a}', ['\u{56a}', '\0', '\0']), + ('\u{53b}', ['\u{56b}', '\0', '\0']), + ('\u{53c}', ['\u{56c}', '\0', '\0']), + ('\u{53d}', ['\u{56d}', '\0', '\0']), + ('\u{53e}', ['\u{56e}', '\0', '\0']), + ('\u{53f}', ['\u{56f}', '\0', '\0']), + ('\u{540}', ['\u{570}', '\0', '\0']), + ('\u{541}', ['\u{571}', '\0', '\0']), + ('\u{542}', ['\u{572}', '\0', '\0']), + ('\u{543}', ['\u{573}', '\0', '\0']), + ('\u{544}', ['\u{574}', '\0', '\0']), + ('\u{545}', ['\u{575}', '\0', '\0']), + ('\u{546}', ['\u{576}', '\0', '\0']), + ('\u{547}', ['\u{577}', '\0', '\0']), + ('\u{548}', ['\u{578}', '\0', '\0']), + ('\u{549}', ['\u{579}', '\0', '\0']), + ('\u{54a}', ['\u{57a}', '\0', '\0']), + ('\u{54b}', ['\u{57b}', '\0', '\0']), + ('\u{54c}', ['\u{57c}', '\0', '\0']), + ('\u{54d}', ['\u{57d}', '\0', '\0']), + ('\u{54e}', ['\u{57e}', '\0', '\0']), + ('\u{54f}', ['\u{57f}', '\0', '\0']), + ('\u{550}', ['\u{580}', '\0', '\0']), + ('\u{551}', ['\u{581}', '\0', '\0']), + ('\u{552}', ['\u{582}', '\0', '\0']), + ('\u{553}', ['\u{583}', '\0', '\0']), + ('\u{554}', ['\u{584}', '\0', '\0']), + ('\u{555}', ['\u{585}', '\0', '\0']), + ('\u{556}', ['\u{586}', '\0', '\0']), + ('\u{587}', ['\u{565}', '\u{582}', '\0']), + ('\u{10a0}', ['\u{2d00}', '\0', '\0']), + ('\u{10a1}', ['\u{2d01}', '\0', '\0']), + ('\u{10a2}', ['\u{2d02}', '\0', '\0']), + ('\u{10a3}', ['\u{2d03}', '\0', '\0']), + ('\u{10a4}', ['\u{2d04}', '\0', '\0']), + ('\u{10a5}', ['\u{2d05}', '\0', '\0']), + ('\u{10a6}', ['\u{2d06}', '\0', '\0']), + ('\u{10a7}', ['\u{2d07}', '\0', '\0']), + ('\u{10a8}', ['\u{2d08}', '\0', '\0']), + ('\u{10a9}', ['\u{2d09}', '\0', '\0']), + ('\u{10aa}', ['\u{2d0a}', '\0', '\0']), + ('\u{10ab}', ['\u{2d0b}', '\0', '\0']), + ('\u{10ac}', ['\u{2d0c}', '\0', '\0']), + ('\u{10ad}', ['\u{2d0d}', '\0', '\0']), + ('\u{10ae}', ['\u{2d0e}', '\0', '\0']), + ('\u{10af}', ['\u{2d0f}', '\0', '\0']), + ('\u{10b0}', ['\u{2d10}', '\0', '\0']), + ('\u{10b1}', ['\u{2d11}', '\0', '\0']), + ('\u{10b2}', ['\u{2d12}', '\0', '\0']), + ('\u{10b3}', ['\u{2d13}', '\0', '\0']), + ('\u{10b4}', ['\u{2d14}', '\0', '\0']), + ('\u{10b5}', ['\u{2d15}', '\0', '\0']), + ('\u{10b6}', ['\u{2d16}', '\0', '\0']), + ('\u{10b7}', ['\u{2d17}', '\0', '\0']), + ('\u{10b8}', ['\u{2d18}', '\0', '\0']), + ('\u{10b9}', ['\u{2d19}', '\0', '\0']), + ('\u{10ba}', ['\u{2d1a}', '\0', '\0']), + ('\u{10bb}', ['\u{2d1b}', '\0', '\0']), + ('\u{10bc}', ['\u{2d1c}', '\0', '\0']), + ('\u{10bd}', ['\u{2d1d}', '\0', '\0']), + ('\u{10be}', ['\u{2d1e}', '\0', '\0']), + ('\u{10bf}', ['\u{2d1f}', '\0', '\0']), + ('\u{10c0}', ['\u{2d20}', '\0', '\0']), + ('\u{10c1}', ['\u{2d21}', '\0', '\0']), + ('\u{10c2}', ['\u{2d22}', '\0', '\0']), + ('\u{10c3}', ['\u{2d23}', '\0', '\0']), + ('\u{10c4}', ['\u{2d24}', '\0', '\0']), + ('\u{10c5}', ['\u{2d25}', '\0', '\0']), + ('\u{10c7}', ['\u{2d27}', '\0', '\0']), + ('\u{10cd}', ['\u{2d2d}', '\0', '\0']), + ('\u{13f8}', ['\u{13f0}', '\0', '\0']), + ('\u{13f9}', ['\u{13f1}', '\0', '\0']), + ('\u{13fa}', ['\u{13f2}', '\0', '\0']), + ('\u{13fb}', ['\u{13f3}', '\0', '\0']), + ('\u{13fc}', ['\u{13f4}', '\0', '\0']), + ('\u{13fd}', ['\u{13f5}', '\0', '\0']), + ('\u{1c80}', ['\u{432}', '\0', '\0']), + ('\u{1c81}', ['\u{434}', '\0', '\0']), + ('\u{1c82}', ['\u{43e}', '\0', '\0']), + ('\u{1c83}', ['\u{441}', '\0', '\0']), + ('\u{1c84}', ['\u{442}', '\0', '\0']), + ('\u{1c85}', ['\u{442}', '\0', '\0']), + ('\u{1c86}', ['\u{44a}', '\0', '\0']), + ('\u{1c87}', ['\u{463}', '\0', '\0']), + ('\u{1c88}', ['\u{a64b}', '\0', '\0']), + ('\u{1e00}', ['\u{1e01}', '\0', '\0']), + ('\u{1e02}', ['\u{1e03}', '\0', '\0']), + ('\u{1e04}', ['\u{1e05}', '\0', '\0']), + ('\u{1e06}', ['\u{1e07}', '\0', '\0']), + ('\u{1e08}', ['\u{1e09}', '\0', '\0']), + ('\u{1e0a}', ['\u{1e0b}', '\0', '\0']), + ('\u{1e0c}', ['\u{1e0d}', '\0', '\0']), + ('\u{1e0e}', ['\u{1e0f}', '\0', '\0']), + ('\u{1e10}', ['\u{1e11}', '\0', '\0']), + ('\u{1e12}', ['\u{1e13}', '\0', '\0']), + ('\u{1e14}', ['\u{1e15}', '\0', '\0']), + ('\u{1e16}', ['\u{1e17}', '\0', '\0']), + ('\u{1e18}', ['\u{1e19}', '\0', '\0']), + ('\u{1e1a}', ['\u{1e1b}', '\0', '\0']), + ('\u{1e1c}', ['\u{1e1d}', '\0', '\0']), + ('\u{1e1e}', ['\u{1e1f}', '\0', '\0']), + ('\u{1e20}', ['\u{1e21}', '\0', '\0']), + ('\u{1e22}', ['\u{1e23}', '\0', '\0']), + ('\u{1e24}', ['\u{1e25}', '\0', '\0']), + ('\u{1e26}', ['\u{1e27}', '\0', '\0']), + ('\u{1e28}', ['\u{1e29}', '\0', '\0']), + ('\u{1e2a}', ['\u{1e2b}', '\0', '\0']), + ('\u{1e2c}', ['\u{1e2d}', '\0', '\0']), + ('\u{1e2e}', ['\u{1e2f}', '\0', '\0']), + ('\u{1e30}', ['\u{1e31}', '\0', '\0']), + ('\u{1e32}', ['\u{1e33}', '\0', '\0']), + ('\u{1e34}', ['\u{1e35}', '\0', '\0']), + ('\u{1e36}', ['\u{1e37}', '\0', '\0']), + ('\u{1e38}', ['\u{1e39}', '\0', '\0']), + ('\u{1e3a}', ['\u{1e3b}', '\0', '\0']), + ('\u{1e3c}', ['\u{1e3d}', '\0', '\0']), + ('\u{1e3e}', ['\u{1e3f}', '\0', '\0']), + ('\u{1e40}', ['\u{1e41}', '\0', '\0']), + ('\u{1e42}', ['\u{1e43}', '\0', '\0']), + ('\u{1e44}', ['\u{1e45}', '\0', '\0']), + ('\u{1e46}', ['\u{1e47}', '\0', '\0']), + ('\u{1e48}', ['\u{1e49}', '\0', '\0']), + ('\u{1e4a}', ['\u{1e4b}', '\0', '\0']), + ('\u{1e4c}', ['\u{1e4d}', '\0', '\0']), + ('\u{1e4e}', ['\u{1e4f}', '\0', '\0']), + ('\u{1e50}', ['\u{1e51}', '\0', '\0']), + ('\u{1e52}', ['\u{1e53}', '\0', '\0']), + ('\u{1e54}', ['\u{1e55}', '\0', '\0']), + ('\u{1e56}', ['\u{1e57}', '\0', '\0']), + ('\u{1e58}', ['\u{1e59}', '\0', '\0']), + ('\u{1e5a}', ['\u{1e5b}', '\0', '\0']), + ('\u{1e5c}', ['\u{1e5d}', '\0', '\0']), + ('\u{1e5e}', ['\u{1e5f}', '\0', '\0']), + ('\u{1e60}', ['\u{1e61}', '\0', '\0']), + ('\u{1e62}', ['\u{1e63}', '\0', '\0']), + ('\u{1e64}', ['\u{1e65}', '\0', '\0']), + ('\u{1e66}', ['\u{1e67}', '\0', '\0']), + ('\u{1e68}', ['\u{1e69}', '\0', '\0']), + ('\u{1e6a}', ['\u{1e6b}', '\0', '\0']), + ('\u{1e6c}', ['\u{1e6d}', '\0', '\0']), + ('\u{1e6e}', ['\u{1e6f}', '\0', '\0']), + ('\u{1e70}', ['\u{1e71}', '\0', '\0']), + ('\u{1e72}', ['\u{1e73}', '\0', '\0']), + ('\u{1e74}', ['\u{1e75}', '\0', '\0']), + ('\u{1e76}', ['\u{1e77}', '\0', '\0']), + ('\u{1e78}', ['\u{1e79}', '\0', '\0']), + ('\u{1e7a}', ['\u{1e7b}', '\0', '\0']), + ('\u{1e7c}', ['\u{1e7d}', '\0', '\0']), + ('\u{1e7e}', ['\u{1e7f}', '\0', '\0']), + ('\u{1e80}', ['\u{1e81}', '\0', '\0']), + ('\u{1e82}', ['\u{1e83}', '\0', '\0']), + ('\u{1e84}', ['\u{1e85}', '\0', '\0']), + ('\u{1e86}', ['\u{1e87}', '\0', '\0']), + ('\u{1e88}', ['\u{1e89}', '\0', '\0']), + ('\u{1e8a}', ['\u{1e8b}', '\0', '\0']), + ('\u{1e8c}', ['\u{1e8d}', '\0', '\0']), + ('\u{1e8e}', ['\u{1e8f}', '\0', '\0']), + ('\u{1e90}', ['\u{1e91}', '\0', '\0']), + ('\u{1e92}', ['\u{1e93}', '\0', '\0']), + ('\u{1e94}', ['\u{1e95}', '\0', '\0']), + ('\u{1e96}', ['h', '\u{331}', '\0']), + ('\u{1e97}', ['t', '\u{308}', '\0']), + ('\u{1e98}', ['w', '\u{30a}', '\0']), + ('\u{1e99}', ['y', '\u{30a}', '\0']), + ('\u{1e9a}', ['a', '\u{2be}', '\0']), + ('\u{1e9b}', ['\u{1e61}', '\0', '\0']), + ('\u{1e9e}', ['s', 's', '\0']), + ('\u{1ea0}', ['\u{1ea1}', '\0', '\0']), + ('\u{1ea2}', ['\u{1ea3}', '\0', '\0']), + ('\u{1ea4}', ['\u{1ea5}', '\0', '\0']), + ('\u{1ea6}', ['\u{1ea7}', '\0', '\0']), + ('\u{1ea8}', ['\u{1ea9}', '\0', '\0']), + ('\u{1eaa}', ['\u{1eab}', '\0', '\0']), + ('\u{1eac}', ['\u{1ead}', '\0', '\0']), + ('\u{1eae}', ['\u{1eaf}', '\0', '\0']), + ('\u{1eb0}', ['\u{1eb1}', '\0', '\0']), + ('\u{1eb2}', ['\u{1eb3}', '\0', '\0']), + ('\u{1eb4}', ['\u{1eb5}', '\0', '\0']), + ('\u{1eb6}', ['\u{1eb7}', '\0', '\0']), + ('\u{1eb8}', ['\u{1eb9}', '\0', '\0']), + ('\u{1eba}', ['\u{1ebb}', '\0', '\0']), + ('\u{1ebc}', ['\u{1ebd}', '\0', '\0']), + ('\u{1ebe}', ['\u{1ebf}', '\0', '\0']), + ('\u{1ec0}', ['\u{1ec1}', '\0', '\0']), + ('\u{1ec2}', ['\u{1ec3}', '\0', '\0']), + ('\u{1ec4}', ['\u{1ec5}', '\0', '\0']), + ('\u{1ec6}', ['\u{1ec7}', '\0', '\0']), + ('\u{1ec8}', ['\u{1ec9}', '\0', '\0']), + ('\u{1eca}', ['\u{1ecb}', '\0', '\0']), + ('\u{1ecc}', ['\u{1ecd}', '\0', '\0']), + ('\u{1ece}', ['\u{1ecf}', '\0', '\0']), + ('\u{1ed0}', ['\u{1ed1}', '\0', '\0']), + ('\u{1ed2}', ['\u{1ed3}', '\0', '\0']), + ('\u{1ed4}', ['\u{1ed5}', '\0', '\0']), + ('\u{1ed6}', ['\u{1ed7}', '\0', '\0']), + ('\u{1ed8}', ['\u{1ed9}', '\0', '\0']), + ('\u{1eda}', ['\u{1edb}', '\0', '\0']), + ('\u{1edc}', ['\u{1edd}', '\0', '\0']), + ('\u{1ede}', ['\u{1edf}', '\0', '\0']), + ('\u{1ee0}', ['\u{1ee1}', '\0', '\0']), + ('\u{1ee2}', ['\u{1ee3}', '\0', '\0']), + ('\u{1ee4}', ['\u{1ee5}', '\0', '\0']), + ('\u{1ee6}', ['\u{1ee7}', '\0', '\0']), + ('\u{1ee8}', ['\u{1ee9}', '\0', '\0']), + ('\u{1eea}', ['\u{1eeb}', '\0', '\0']), + ('\u{1eec}', ['\u{1eed}', '\0', '\0']), + ('\u{1eee}', ['\u{1eef}', '\0', '\0']), + ('\u{1ef0}', ['\u{1ef1}', '\0', '\0']), + ('\u{1ef2}', ['\u{1ef3}', '\0', '\0']), + ('\u{1ef4}', ['\u{1ef5}', '\0', '\0']), + ('\u{1ef6}', ['\u{1ef7}', '\0', '\0']), + ('\u{1ef8}', ['\u{1ef9}', '\0', '\0']), + ('\u{1efa}', ['\u{1efb}', '\0', '\0']), + ('\u{1efc}', ['\u{1efd}', '\0', '\0']), + ('\u{1efe}', ['\u{1eff}', '\0', '\0']), + ('\u{1f08}', ['\u{1f00}', '\0', '\0']), + ('\u{1f09}', ['\u{1f01}', '\0', '\0']), + ('\u{1f0a}', ['\u{1f02}', '\0', '\0']), + ('\u{1f0b}', ['\u{1f03}', '\0', '\0']), + ('\u{1f0c}', ['\u{1f04}', '\0', '\0']), + ('\u{1f0d}', ['\u{1f05}', '\0', '\0']), + ('\u{1f0e}', ['\u{1f06}', '\0', '\0']), + ('\u{1f0f}', ['\u{1f07}', '\0', '\0']), + ('\u{1f18}', ['\u{1f10}', '\0', '\0']), + ('\u{1f19}', ['\u{1f11}', '\0', '\0']), + ('\u{1f1a}', ['\u{1f12}', '\0', '\0']), + ('\u{1f1b}', ['\u{1f13}', '\0', '\0']), + ('\u{1f1c}', ['\u{1f14}', '\0', '\0']), + ('\u{1f1d}', ['\u{1f15}', '\0', '\0']), + ('\u{1f28}', ['\u{1f20}', '\0', '\0']), + ('\u{1f29}', ['\u{1f21}', '\0', '\0']), + ('\u{1f2a}', ['\u{1f22}', '\0', '\0']), + ('\u{1f2b}', ['\u{1f23}', '\0', '\0']), + ('\u{1f2c}', ['\u{1f24}', '\0', '\0']), + ('\u{1f2d}', ['\u{1f25}', '\0', '\0']), + ('\u{1f2e}', ['\u{1f26}', '\0', '\0']), + ('\u{1f2f}', ['\u{1f27}', '\0', '\0']), + ('\u{1f38}', ['\u{1f30}', '\0', '\0']), + ('\u{1f39}', ['\u{1f31}', '\0', '\0']), + ('\u{1f3a}', ['\u{1f32}', '\0', '\0']), + ('\u{1f3b}', ['\u{1f33}', '\0', '\0']), + ('\u{1f3c}', ['\u{1f34}', '\0', '\0']), + ('\u{1f3d}', ['\u{1f35}', '\0', '\0']), + ('\u{1f3e}', ['\u{1f36}', '\0', '\0']), + ('\u{1f3f}', ['\u{1f37}', '\0', '\0']), + ('\u{1f48}', ['\u{1f40}', '\0', '\0']), + ('\u{1f49}', ['\u{1f41}', '\0', '\0']), + ('\u{1f4a}', ['\u{1f42}', '\0', '\0']), + ('\u{1f4b}', ['\u{1f43}', '\0', '\0']), + ('\u{1f4c}', ['\u{1f44}', '\0', '\0']), + ('\u{1f4d}', ['\u{1f45}', '\0', '\0']), + ('\u{1f50}', ['\u{3c5}', '\u{313}', '\0']), + ('\u{1f52}', ['\u{3c5}', '\u{313}', '\u{300}']), + ('\u{1f54}', ['\u{3c5}', '\u{313}', '\u{301}']), + ('\u{1f56}', ['\u{3c5}', '\u{313}', '\u{342}']), + ('\u{1f59}', ['\u{1f51}', '\0', '\0']), + ('\u{1f5b}', ['\u{1f53}', '\0', '\0']), + ('\u{1f5d}', ['\u{1f55}', '\0', '\0']), + ('\u{1f5f}', ['\u{1f57}', '\0', '\0']), + ('\u{1f68}', ['\u{1f60}', '\0', '\0']), + ('\u{1f69}', ['\u{1f61}', '\0', '\0']), + ('\u{1f6a}', ['\u{1f62}', '\0', '\0']), + ('\u{1f6b}', ['\u{1f63}', '\0', '\0']), + ('\u{1f6c}', ['\u{1f64}', '\0', '\0']), + ('\u{1f6d}', ['\u{1f65}', '\0', '\0']), + ('\u{1f6e}', ['\u{1f66}', '\0', '\0']), + ('\u{1f6f}', ['\u{1f67}', '\0', '\0']), + ('\u{1f80}', ['\u{1f00}', '\u{3b9}', '\0']), + ('\u{1f81}', ['\u{1f01}', '\u{3b9}', '\0']), + ('\u{1f82}', ['\u{1f02}', '\u{3b9}', '\0']), + ('\u{1f83}', ['\u{1f03}', '\u{3b9}', '\0']), + ('\u{1f84}', ['\u{1f04}', '\u{3b9}', '\0']), + ('\u{1f85}', ['\u{1f05}', '\u{3b9}', '\0']), + ('\u{1f86}', ['\u{1f06}', '\u{3b9}', '\0']), + ('\u{1f87}', ['\u{1f07}', '\u{3b9}', '\0']), + ('\u{1f88}', ['\u{1f00}', '\u{3b9}', '\0']), + ('\u{1f89}', ['\u{1f01}', '\u{3b9}', '\0']), + ('\u{1f8a}', ['\u{1f02}', '\u{3b9}', '\0']), + ('\u{1f8b}', ['\u{1f03}', '\u{3b9}', '\0']), + ('\u{1f8c}', ['\u{1f04}', '\u{3b9}', '\0']), + ('\u{1f8d}', ['\u{1f05}', '\u{3b9}', '\0']), + ('\u{1f8e}', ['\u{1f06}', '\u{3b9}', '\0']), + ('\u{1f8f}', ['\u{1f07}', '\u{3b9}', '\0']), + ('\u{1f90}', ['\u{1f20}', '\u{3b9}', '\0']), + ('\u{1f91}', ['\u{1f21}', '\u{3b9}', '\0']), + ('\u{1f92}', ['\u{1f22}', '\u{3b9}', '\0']), + ('\u{1f93}', ['\u{1f23}', '\u{3b9}', '\0']), + ('\u{1f94}', ['\u{1f24}', '\u{3b9}', '\0']), + ('\u{1f95}', ['\u{1f25}', '\u{3b9}', '\0']), + ('\u{1f96}', ['\u{1f26}', '\u{3b9}', '\0']), + ('\u{1f97}', ['\u{1f27}', '\u{3b9}', '\0']), + ('\u{1f98}', ['\u{1f20}', '\u{3b9}', '\0']), + ('\u{1f99}', ['\u{1f21}', '\u{3b9}', '\0']), + ('\u{1f9a}', ['\u{1f22}', '\u{3b9}', '\0']), + ('\u{1f9b}', ['\u{1f23}', '\u{3b9}', '\0']), + ('\u{1f9c}', ['\u{1f24}', '\u{3b9}', '\0']), + ('\u{1f9d}', ['\u{1f25}', '\u{3b9}', '\0']), + ('\u{1f9e}', ['\u{1f26}', '\u{3b9}', '\0']), + ('\u{1f9f}', ['\u{1f27}', '\u{3b9}', '\0']), + ('\u{1fa0}', ['\u{1f60}', '\u{3b9}', '\0']), + ('\u{1fa1}', ['\u{1f61}', '\u{3b9}', '\0']), + ('\u{1fa2}', ['\u{1f62}', '\u{3b9}', '\0']), + ('\u{1fa3}', ['\u{1f63}', '\u{3b9}', '\0']), + ('\u{1fa4}', ['\u{1f64}', '\u{3b9}', '\0']), + ('\u{1fa5}', ['\u{1f65}', '\u{3b9}', '\0']), + ('\u{1fa6}', ['\u{1f66}', '\u{3b9}', '\0']), + ('\u{1fa7}', ['\u{1f67}', '\u{3b9}', '\0']), + ('\u{1fa8}', ['\u{1f60}', '\u{3b9}', '\0']), + ('\u{1fa9}', ['\u{1f61}', '\u{3b9}', '\0']), + ('\u{1faa}', ['\u{1f62}', '\u{3b9}', '\0']), + ('\u{1fab}', ['\u{1f63}', '\u{3b9}', '\0']), + ('\u{1fac}', ['\u{1f64}', '\u{3b9}', '\0']), + ('\u{1fad}', ['\u{1f65}', '\u{3b9}', '\0']), + ('\u{1fae}', ['\u{1f66}', '\u{3b9}', '\0']), + ('\u{1faf}', ['\u{1f67}', '\u{3b9}', '\0']), + ('\u{1fb2}', ['\u{1f70}', '\u{3b9}', '\0']), + ('\u{1fb3}', ['\u{3b1}', '\u{3b9}', '\0']), + ('\u{1fb4}', ['\u{3ac}', '\u{3b9}', '\0']), + ('\u{1fb6}', ['\u{3b1}', '\u{342}', '\0']), + ('\u{1fb7}', ['\u{3b1}', '\u{342}', '\u{3b9}']), + ('\u{1fb8}', ['\u{1fb0}', '\0', '\0']), + ('\u{1fb9}', ['\u{1fb1}', '\0', '\0']), + ('\u{1fba}', ['\u{1f70}', '\0', '\0']), + ('\u{1fbb}', ['\u{1f71}', '\0', '\0']), + ('\u{1fbc}', ['\u{3b1}', '\u{3b9}', '\0']), + ('\u{1fbe}', ['\u{3b9}', '\0', '\0']), + ('\u{1fc2}', ['\u{1f74}', '\u{3b9}', '\0']), + ('\u{1fc3}', ['\u{3b7}', '\u{3b9}', '\0']), + ('\u{1fc4}', ['\u{3ae}', '\u{3b9}', '\0']), + ('\u{1fc6}', ['\u{3b7}', '\u{342}', '\0']), + ('\u{1fc7}', ['\u{3b7}', '\u{342}', '\u{3b9}']), + ('\u{1fc8}', ['\u{1f72}', '\0', '\0']), + ('\u{1fc9}', ['\u{1f73}', '\0', '\0']), + ('\u{1fca}', ['\u{1f74}', '\0', '\0']), + ('\u{1fcb}', ['\u{1f75}', '\0', '\0']), + ('\u{1fcc}', ['\u{3b7}', '\u{3b9}', '\0']), + ('\u{1fd2}', ['\u{3b9}', '\u{308}', '\u{300}']), + ('\u{1fd3}', ['\u{3b9}', '\u{308}', '\u{301}']), + ('\u{1fd6}', ['\u{3b9}', '\u{342}', '\0']), + ('\u{1fd7}', ['\u{3b9}', '\u{308}', '\u{342}']), + ('\u{1fd8}', ['\u{1fd0}', '\0', '\0']), + ('\u{1fd9}', ['\u{1fd1}', '\0', '\0']), + ('\u{1fda}', ['\u{1f76}', '\0', '\0']), + ('\u{1fdb}', ['\u{1f77}', '\0', '\0']), + ('\u{1fe2}', ['\u{3c5}', '\u{308}', '\u{300}']), + ('\u{1fe3}', ['\u{3c5}', '\u{308}', '\u{301}']), + ('\u{1fe4}', ['\u{3c1}', '\u{313}', '\0']), + ('\u{1fe6}', ['\u{3c5}', '\u{342}', '\0']), + ('\u{1fe7}', ['\u{3c5}', '\u{308}', '\u{342}']), + ('\u{1fe8}', ['\u{1fe0}', '\0', '\0']), + ('\u{1fe9}', ['\u{1fe1}', '\0', '\0']), + ('\u{1fea}', ['\u{1f7a}', '\0', '\0']), + ('\u{1feb}', ['\u{1f7b}', '\0', '\0']), + ('\u{1fec}', ['\u{1fe5}', '\0', '\0']), + ('\u{1ff2}', ['\u{1f7c}', '\u{3b9}', '\0']), + ('\u{1ff3}', ['\u{3c9}', '\u{3b9}', '\0']), + ('\u{1ff4}', ['\u{3ce}', '\u{3b9}', '\0']), + ('\u{1ff6}', ['\u{3c9}', '\u{342}', '\0']), + ('\u{1ff7}', ['\u{3c9}', '\u{342}', '\u{3b9}']), + ('\u{1ff8}', ['\u{1f78}', '\0', '\0']), + ('\u{1ff9}', ['\u{1f79}', '\0', '\0']), + ('\u{1ffa}', ['\u{1f7c}', '\0', '\0']), + ('\u{1ffb}', ['\u{1f7d}', '\0', '\0']), + ('\u{1ffc}', ['\u{3c9}', '\u{3b9}', '\0']), + ('\u{2126}', ['\u{3c9}', '\0', '\0']), + ('\u{212a}', ['k', '\0', '\0']), + ('\u{212b}', ['\u{e5}', '\0', '\0']), + ('\u{2132}', ['\u{214e}', '\0', '\0']), + ('\u{2160}', ['\u{2170}', '\0', '\0']), + ('\u{2161}', ['\u{2171}', '\0', '\0']), + ('\u{2162}', ['\u{2172}', '\0', '\0']), + ('\u{2163}', ['\u{2173}', '\0', '\0']), + ('\u{2164}', ['\u{2174}', '\0', '\0']), + ('\u{2165}', ['\u{2175}', '\0', '\0']), + ('\u{2166}', ['\u{2176}', '\0', '\0']), + ('\u{2167}', ['\u{2177}', '\0', '\0']), + ('\u{2168}', ['\u{2178}', '\0', '\0']), + ('\u{2169}', ['\u{2179}', '\0', '\0']), + ('\u{216a}', ['\u{217a}', '\0', '\0']), + ('\u{216b}', ['\u{217b}', '\0', '\0']), + ('\u{216c}', ['\u{217c}', '\0', '\0']), + ('\u{216d}', ['\u{217d}', '\0', '\0']), + ('\u{216e}', ['\u{217e}', '\0', '\0']), + ('\u{216f}', ['\u{217f}', '\0', '\0']), + ('\u{2183}', ['\u{2184}', '\0', '\0']), + ('\u{24b6}', ['\u{24d0}', '\0', '\0']), + ('\u{24b7}', ['\u{24d1}', '\0', '\0']), + ('\u{24b8}', ['\u{24d2}', '\0', '\0']), + ('\u{24b9}', ['\u{24d3}', '\0', '\0']), + ('\u{24ba}', ['\u{24d4}', '\0', '\0']), + ('\u{24bb}', ['\u{24d5}', '\0', '\0']), + ('\u{24bc}', ['\u{24d6}', '\0', '\0']), + ('\u{24bd}', ['\u{24d7}', '\0', '\0']), + ('\u{24be}', ['\u{24d8}', '\0', '\0']), + ('\u{24bf}', ['\u{24d9}', '\0', '\0']), + ('\u{24c0}', ['\u{24da}', '\0', '\0']), + ('\u{24c1}', ['\u{24db}', '\0', '\0']), + ('\u{24c2}', ['\u{24dc}', '\0', '\0']), + ('\u{24c3}', ['\u{24dd}', '\0', '\0']), + ('\u{24c4}', ['\u{24de}', '\0', '\0']), + ('\u{24c5}', ['\u{24df}', '\0', '\0']), + ('\u{24c6}', ['\u{24e0}', '\0', '\0']), + ('\u{24c7}', ['\u{24e1}', '\0', '\0']), + ('\u{24c8}', ['\u{24e2}', '\0', '\0']), + ('\u{24c9}', ['\u{24e3}', '\0', '\0']), + ('\u{24ca}', ['\u{24e4}', '\0', '\0']), + ('\u{24cb}', ['\u{24e5}', '\0', '\0']), + ('\u{24cc}', ['\u{24e6}', '\0', '\0']), + ('\u{24cd}', ['\u{24e7}', '\0', '\0']), + ('\u{24ce}', ['\u{24e8}', '\0', '\0']), + ('\u{24cf}', ['\u{24e9}', '\0', '\0']), + ('\u{2c00}', ['\u{2c30}', '\0', '\0']), + ('\u{2c01}', ['\u{2c31}', '\0', '\0']), + ('\u{2c02}', ['\u{2c32}', '\0', '\0']), + ('\u{2c03}', ['\u{2c33}', '\0', '\0']), + ('\u{2c04}', ['\u{2c34}', '\0', '\0']), + ('\u{2c05}', ['\u{2c35}', '\0', '\0']), + ('\u{2c06}', ['\u{2c36}', '\0', '\0']), + ('\u{2c07}', ['\u{2c37}', '\0', '\0']), + ('\u{2c08}', ['\u{2c38}', '\0', '\0']), + ('\u{2c09}', ['\u{2c39}', '\0', '\0']), + ('\u{2c0a}', ['\u{2c3a}', '\0', '\0']), + ('\u{2c0b}', ['\u{2c3b}', '\0', '\0']), + ('\u{2c0c}', ['\u{2c3c}', '\0', '\0']), + ('\u{2c0d}', ['\u{2c3d}', '\0', '\0']), + ('\u{2c0e}', ['\u{2c3e}', '\0', '\0']), + ('\u{2c0f}', ['\u{2c3f}', '\0', '\0']), + ('\u{2c10}', ['\u{2c40}', '\0', '\0']), + ('\u{2c11}', ['\u{2c41}', '\0', '\0']), + ('\u{2c12}', ['\u{2c42}', '\0', '\0']), + ('\u{2c13}', ['\u{2c43}', '\0', '\0']), + ('\u{2c14}', ['\u{2c44}', '\0', '\0']), + ('\u{2c15}', ['\u{2c45}', '\0', '\0']), + ('\u{2c16}', ['\u{2c46}', '\0', '\0']), + ('\u{2c17}', ['\u{2c47}', '\0', '\0']), + ('\u{2c18}', ['\u{2c48}', '\0', '\0']), + ('\u{2c19}', ['\u{2c49}', '\0', '\0']), + ('\u{2c1a}', ['\u{2c4a}', '\0', '\0']), + ('\u{2c1b}', ['\u{2c4b}', '\0', '\0']), + ('\u{2c1c}', ['\u{2c4c}', '\0', '\0']), + ('\u{2c1d}', ['\u{2c4d}', '\0', '\0']), + ('\u{2c1e}', ['\u{2c4e}', '\0', '\0']), + ('\u{2c1f}', ['\u{2c4f}', '\0', '\0']), + ('\u{2c20}', ['\u{2c50}', '\0', '\0']), + ('\u{2c21}', ['\u{2c51}', '\0', '\0']), + ('\u{2c22}', ['\u{2c52}', '\0', '\0']), + ('\u{2c23}', ['\u{2c53}', '\0', '\0']), + ('\u{2c24}', ['\u{2c54}', '\0', '\0']), + ('\u{2c25}', ['\u{2c55}', '\0', '\0']), + ('\u{2c26}', ['\u{2c56}', '\0', '\0']), + ('\u{2c27}', ['\u{2c57}', '\0', '\0']), + ('\u{2c28}', ['\u{2c58}', '\0', '\0']), + ('\u{2c29}', ['\u{2c59}', '\0', '\0']), + ('\u{2c2a}', ['\u{2c5a}', '\0', '\0']), + ('\u{2c2b}', ['\u{2c5b}', '\0', '\0']), + ('\u{2c2c}', ['\u{2c5c}', '\0', '\0']), + ('\u{2c2d}', ['\u{2c5d}', '\0', '\0']), + ('\u{2c2e}', ['\u{2c5e}', '\0', '\0']), + ('\u{2c60}', ['\u{2c61}', '\0', '\0']), + ('\u{2c62}', ['\u{26b}', '\0', '\0']), + ('\u{2c63}', ['\u{1d7d}', '\0', '\0']), + ('\u{2c64}', ['\u{27d}', '\0', '\0']), + ('\u{2c67}', ['\u{2c68}', '\0', '\0']), + ('\u{2c69}', ['\u{2c6a}', '\0', '\0']), + ('\u{2c6b}', ['\u{2c6c}', '\0', '\0']), + ('\u{2c6d}', ['\u{251}', '\0', '\0']), + ('\u{2c6e}', ['\u{271}', '\0', '\0']), + ('\u{2c6f}', ['\u{250}', '\0', '\0']), + ('\u{2c70}', ['\u{252}', '\0', '\0']), + ('\u{2c72}', ['\u{2c73}', '\0', '\0']), + ('\u{2c75}', ['\u{2c76}', '\0', '\0']), + ('\u{2c7e}', ['\u{23f}', '\0', '\0']), + ('\u{2c7f}', ['\u{240}', '\0', '\0']), + ('\u{2c80}', ['\u{2c81}', '\0', '\0']), + ('\u{2c82}', ['\u{2c83}', '\0', '\0']), + ('\u{2c84}', ['\u{2c85}', '\0', '\0']), + ('\u{2c86}', ['\u{2c87}', '\0', '\0']), + ('\u{2c88}', ['\u{2c89}', '\0', '\0']), + ('\u{2c8a}', ['\u{2c8b}', '\0', '\0']), + ('\u{2c8c}', ['\u{2c8d}', '\0', '\0']), + ('\u{2c8e}', ['\u{2c8f}', '\0', '\0']), + ('\u{2c90}', ['\u{2c91}', '\0', '\0']), + ('\u{2c92}', ['\u{2c93}', '\0', '\0']), + ('\u{2c94}', ['\u{2c95}', '\0', '\0']), + ('\u{2c96}', ['\u{2c97}', '\0', '\0']), + ('\u{2c98}', ['\u{2c99}', '\0', '\0']), + ('\u{2c9a}', ['\u{2c9b}', '\0', '\0']), + ('\u{2c9c}', ['\u{2c9d}', '\0', '\0']), + ('\u{2c9e}', ['\u{2c9f}', '\0', '\0']), + ('\u{2ca0}', ['\u{2ca1}', '\0', '\0']), + ('\u{2ca2}', ['\u{2ca3}', '\0', '\0']), + ('\u{2ca4}', ['\u{2ca5}', '\0', '\0']), + ('\u{2ca6}', ['\u{2ca7}', '\0', '\0']), + ('\u{2ca8}', ['\u{2ca9}', '\0', '\0']), + ('\u{2caa}', ['\u{2cab}', '\0', '\0']), + ('\u{2cac}', ['\u{2cad}', '\0', '\0']), + ('\u{2cae}', ['\u{2caf}', '\0', '\0']), + ('\u{2cb0}', ['\u{2cb1}', '\0', '\0']), + ('\u{2cb2}', ['\u{2cb3}', '\0', '\0']), + ('\u{2cb4}', ['\u{2cb5}', '\0', '\0']), + ('\u{2cb6}', ['\u{2cb7}', '\0', '\0']), + ('\u{2cb8}', ['\u{2cb9}', '\0', '\0']), + ('\u{2cba}', ['\u{2cbb}', '\0', '\0']), + ('\u{2cbc}', ['\u{2cbd}', '\0', '\0']), + ('\u{2cbe}', ['\u{2cbf}', '\0', '\0']), + ('\u{2cc0}', ['\u{2cc1}', '\0', '\0']), + ('\u{2cc2}', ['\u{2cc3}', '\0', '\0']), + ('\u{2cc4}', ['\u{2cc5}', '\0', '\0']), + ('\u{2cc6}', ['\u{2cc7}', '\0', '\0']), + ('\u{2cc8}', ['\u{2cc9}', '\0', '\0']), + ('\u{2cca}', ['\u{2ccb}', '\0', '\0']), + ('\u{2ccc}', ['\u{2ccd}', '\0', '\0']), + ('\u{2cce}', ['\u{2ccf}', '\0', '\0']), + ('\u{2cd0}', ['\u{2cd1}', '\0', '\0']), + ('\u{2cd2}', ['\u{2cd3}', '\0', '\0']), + ('\u{2cd4}', ['\u{2cd5}', '\0', '\0']), + ('\u{2cd6}', ['\u{2cd7}', '\0', '\0']), + ('\u{2cd8}', ['\u{2cd9}', '\0', '\0']), + ('\u{2cda}', ['\u{2cdb}', '\0', '\0']), + ('\u{2cdc}', ['\u{2cdd}', '\0', '\0']), + ('\u{2cde}', ['\u{2cdf}', '\0', '\0']), + ('\u{2ce0}', ['\u{2ce1}', '\0', '\0']), + ('\u{2ce2}', ['\u{2ce3}', '\0', '\0']), + ('\u{2ceb}', ['\u{2cec}', '\0', '\0']), + ('\u{2ced}', ['\u{2cee}', '\0', '\0']), + ('\u{2cf2}', ['\u{2cf3}', '\0', '\0']), + ('\u{a640}', ['\u{a641}', '\0', '\0']), + ('\u{a642}', ['\u{a643}', '\0', '\0']), + ('\u{a644}', ['\u{a645}', '\0', '\0']), + ('\u{a646}', ['\u{a647}', '\0', '\0']), + ('\u{a648}', ['\u{a649}', '\0', '\0']), + ('\u{a64a}', ['\u{a64b}', '\0', '\0']), + ('\u{a64c}', ['\u{a64d}', '\0', '\0']), + ('\u{a64e}', ['\u{a64f}', '\0', '\0']), + ('\u{a650}', ['\u{a651}', '\0', '\0']), + ('\u{a652}', ['\u{a653}', '\0', '\0']), + ('\u{a654}', ['\u{a655}', '\0', '\0']), + ('\u{a656}', ['\u{a657}', '\0', '\0']), + ('\u{a658}', ['\u{a659}', '\0', '\0']), + ('\u{a65a}', ['\u{a65b}', '\0', '\0']), + ('\u{a65c}', ['\u{a65d}', '\0', '\0']), + ('\u{a65e}', ['\u{a65f}', '\0', '\0']), + ('\u{a660}', ['\u{a661}', '\0', '\0']), + ('\u{a662}', ['\u{a663}', '\0', '\0']), + ('\u{a664}', ['\u{a665}', '\0', '\0']), + ('\u{a666}', ['\u{a667}', '\0', '\0']), + ('\u{a668}', ['\u{a669}', '\0', '\0']), + ('\u{a66a}', ['\u{a66b}', '\0', '\0']), + ('\u{a66c}', ['\u{a66d}', '\0', '\0']), + ('\u{a680}', ['\u{a681}', '\0', '\0']), + ('\u{a682}', ['\u{a683}', '\0', '\0']), + ('\u{a684}', ['\u{a685}', '\0', '\0']), + ('\u{a686}', ['\u{a687}', '\0', '\0']), + ('\u{a688}', ['\u{a689}', '\0', '\0']), + ('\u{a68a}', ['\u{a68b}', '\0', '\0']), + ('\u{a68c}', ['\u{a68d}', '\0', '\0']), + ('\u{a68e}', ['\u{a68f}', '\0', '\0']), + ('\u{a690}', ['\u{a691}', '\0', '\0']), + ('\u{a692}', ['\u{a693}', '\0', '\0']), + ('\u{a694}', ['\u{a695}', '\0', '\0']), + ('\u{a696}', ['\u{a697}', '\0', '\0']), + ('\u{a698}', ['\u{a699}', '\0', '\0']), + ('\u{a69a}', ['\u{a69b}', '\0', '\0']), + ('\u{a722}', ['\u{a723}', '\0', '\0']), + ('\u{a724}', ['\u{a725}', '\0', '\0']), + ('\u{a726}', ['\u{a727}', '\0', '\0']), + ('\u{a728}', ['\u{a729}', '\0', '\0']), + ('\u{a72a}', ['\u{a72b}', '\0', '\0']), + ('\u{a72c}', ['\u{a72d}', '\0', '\0']), + ('\u{a72e}', ['\u{a72f}', '\0', '\0']), + ('\u{a732}', ['\u{a733}', '\0', '\0']), + ('\u{a734}', ['\u{a735}', '\0', '\0']), + ('\u{a736}', ['\u{a737}', '\0', '\0']), + ('\u{a738}', ['\u{a739}', '\0', '\0']), + ('\u{a73a}', ['\u{a73b}', '\0', '\0']), + ('\u{a73c}', ['\u{a73d}', '\0', '\0']), + ('\u{a73e}', ['\u{a73f}', '\0', '\0']), + ('\u{a740}', ['\u{a741}', '\0', '\0']), + ('\u{a742}', ['\u{a743}', '\0', '\0']), + ('\u{a744}', ['\u{a745}', '\0', '\0']), + ('\u{a746}', ['\u{a747}', '\0', '\0']), + ('\u{a748}', ['\u{a749}', '\0', '\0']), + ('\u{a74a}', ['\u{a74b}', '\0', '\0']), + ('\u{a74c}', ['\u{a74d}', '\0', '\0']), + ('\u{a74e}', ['\u{a74f}', '\0', '\0']), + ('\u{a750}', ['\u{a751}', '\0', '\0']), + ('\u{a752}', ['\u{a753}', '\0', '\0']), + ('\u{a754}', ['\u{a755}', '\0', '\0']), + ('\u{a756}', ['\u{a757}', '\0', '\0']), + ('\u{a758}', ['\u{a759}', '\0', '\0']), + ('\u{a75a}', ['\u{a75b}', '\0', '\0']), + ('\u{a75c}', ['\u{a75d}', '\0', '\0']), + ('\u{a75e}', ['\u{a75f}', '\0', '\0']), + ('\u{a760}', ['\u{a761}', '\0', '\0']), + ('\u{a762}', ['\u{a763}', '\0', '\0']), + ('\u{a764}', ['\u{a765}', '\0', '\0']), + ('\u{a766}', ['\u{a767}', '\0', '\0']), + ('\u{a768}', ['\u{a769}', '\0', '\0']), + ('\u{a76a}', ['\u{a76b}', '\0', '\0']), + ('\u{a76c}', ['\u{a76d}', '\0', '\0']), + ('\u{a76e}', ['\u{a76f}', '\0', '\0']), + ('\u{a779}', ['\u{a77a}', '\0', '\0']), + ('\u{a77b}', ['\u{a77c}', '\0', '\0']), + ('\u{a77d}', ['\u{1d79}', '\0', '\0']), + ('\u{a77e}', ['\u{a77f}', '\0', '\0']), + ('\u{a780}', ['\u{a781}', '\0', '\0']), + ('\u{a782}', ['\u{a783}', '\0', '\0']), + ('\u{a784}', ['\u{a785}', '\0', '\0']), + ('\u{a786}', ['\u{a787}', '\0', '\0']), + ('\u{a78b}', ['\u{a78c}', '\0', '\0']), + ('\u{a78d}', ['\u{265}', '\0', '\0']), + ('\u{a790}', ['\u{a791}', '\0', '\0']), + ('\u{a792}', ['\u{a793}', '\0', '\0']), + ('\u{a796}', ['\u{a797}', '\0', '\0']), + ('\u{a798}', ['\u{a799}', '\0', '\0']), + ('\u{a79a}', ['\u{a79b}', '\0', '\0']), + ('\u{a79c}', ['\u{a79d}', '\0', '\0']), + ('\u{a79e}', ['\u{a79f}', '\0', '\0']), + ('\u{a7a0}', ['\u{a7a1}', '\0', '\0']), + ('\u{a7a2}', ['\u{a7a3}', '\0', '\0']), + ('\u{a7a4}', ['\u{a7a5}', '\0', '\0']), + ('\u{a7a6}', ['\u{a7a7}', '\0', '\0']), + ('\u{a7a8}', ['\u{a7a9}', '\0', '\0']), + ('\u{a7aa}', ['\u{266}', '\0', '\0']), + ('\u{a7ab}', ['\u{25c}', '\0', '\0']), + ('\u{a7ac}', ['\u{261}', '\0', '\0']), + ('\u{a7ad}', ['\u{26c}', '\0', '\0']), + ('\u{a7ae}', ['\u{26a}', '\0', '\0']), + ('\u{a7b0}', ['\u{29e}', '\0', '\0']), + ('\u{a7b1}', ['\u{287}', '\0', '\0']), + ('\u{a7b2}', ['\u{29d}', '\0', '\0']), + ('\u{a7b3}', ['\u{ab53}', '\0', '\0']), + ('\u{a7b4}', ['\u{a7b5}', '\0', '\0']), + ('\u{a7b6}', ['\u{a7b7}', '\0', '\0']), + ('\u{ab70}', ['\u{13a0}', '\0', '\0']), + ('\u{ab71}', ['\u{13a1}', '\0', '\0']), + ('\u{ab72}', ['\u{13a2}', '\0', '\0']), + ('\u{ab73}', ['\u{13a3}', '\0', '\0']), + ('\u{ab74}', ['\u{13a4}', '\0', '\0']), + ('\u{ab75}', ['\u{13a5}', '\0', '\0']), + ('\u{ab76}', ['\u{13a6}', '\0', '\0']), + ('\u{ab77}', ['\u{13a7}', '\0', '\0']), + ('\u{ab78}', ['\u{13a8}', '\0', '\0']), + ('\u{ab79}', ['\u{13a9}', '\0', '\0']), + ('\u{ab7a}', ['\u{13aa}', '\0', '\0']), + ('\u{ab7b}', ['\u{13ab}', '\0', '\0']), + ('\u{ab7c}', ['\u{13ac}', '\0', '\0']), + ('\u{ab7d}', ['\u{13ad}', '\0', '\0']), + ('\u{ab7e}', ['\u{13ae}', '\0', '\0']), + ('\u{ab7f}', ['\u{13af}', '\0', '\0']), + ('\u{ab80}', ['\u{13b0}', '\0', '\0']), + ('\u{ab81}', ['\u{13b1}', '\0', '\0']), + ('\u{ab82}', ['\u{13b2}', '\0', '\0']), + ('\u{ab83}', ['\u{13b3}', '\0', '\0']), + ('\u{ab84}', ['\u{13b4}', '\0', '\0']), + ('\u{ab85}', ['\u{13b5}', '\0', '\0']), + ('\u{ab86}', ['\u{13b6}', '\0', '\0']), + ('\u{ab87}', ['\u{13b7}', '\0', '\0']), + ('\u{ab88}', ['\u{13b8}', '\0', '\0']), + ('\u{ab89}', ['\u{13b9}', '\0', '\0']), + ('\u{ab8a}', ['\u{13ba}', '\0', '\0']), + ('\u{ab8b}', ['\u{13bb}', '\0', '\0']), + ('\u{ab8c}', ['\u{13bc}', '\0', '\0']), + ('\u{ab8d}', ['\u{13bd}', '\0', '\0']), + ('\u{ab8e}', ['\u{13be}', '\0', '\0']), + ('\u{ab8f}', ['\u{13bf}', '\0', '\0']), + ('\u{ab90}', ['\u{13c0}', '\0', '\0']), + ('\u{ab91}', ['\u{13c1}', '\0', '\0']), + ('\u{ab92}', ['\u{13c2}', '\0', '\0']), + ('\u{ab93}', ['\u{13c3}', '\0', '\0']), + ('\u{ab94}', ['\u{13c4}', '\0', '\0']), + ('\u{ab95}', ['\u{13c5}', '\0', '\0']), + ('\u{ab96}', ['\u{13c6}', '\0', '\0']), + ('\u{ab97}', ['\u{13c7}', '\0', '\0']), + ('\u{ab98}', ['\u{13c8}', '\0', '\0']), + ('\u{ab99}', ['\u{13c9}', '\0', '\0']), + ('\u{ab9a}', ['\u{13ca}', '\0', '\0']), + ('\u{ab9b}', ['\u{13cb}', '\0', '\0']), + ('\u{ab9c}', ['\u{13cc}', '\0', '\0']), + ('\u{ab9d}', ['\u{13cd}', '\0', '\0']), + ('\u{ab9e}', ['\u{13ce}', '\0', '\0']), + ('\u{ab9f}', ['\u{13cf}', '\0', '\0']), + ('\u{aba0}', ['\u{13d0}', '\0', '\0']), + ('\u{aba1}', ['\u{13d1}', '\0', '\0']), + ('\u{aba2}', ['\u{13d2}', '\0', '\0']), + ('\u{aba3}', ['\u{13d3}', '\0', '\0']), + ('\u{aba4}', ['\u{13d4}', '\0', '\0']), + ('\u{aba5}', ['\u{13d5}', '\0', '\0']), + ('\u{aba6}', ['\u{13d6}', '\0', '\0']), + ('\u{aba7}', ['\u{13d7}', '\0', '\0']), + ('\u{aba8}', ['\u{13d8}', '\0', '\0']), + ('\u{aba9}', ['\u{13d9}', '\0', '\0']), + ('\u{abaa}', ['\u{13da}', '\0', '\0']), + ('\u{abab}', ['\u{13db}', '\0', '\0']), + ('\u{abac}', ['\u{13dc}', '\0', '\0']), + ('\u{abad}', ['\u{13dd}', '\0', '\0']), + ('\u{abae}', ['\u{13de}', '\0', '\0']), + ('\u{abaf}', ['\u{13df}', '\0', '\0']), + ('\u{abb0}', ['\u{13e0}', '\0', '\0']), + ('\u{abb1}', ['\u{13e1}', '\0', '\0']), + ('\u{abb2}', ['\u{13e2}', '\0', '\0']), + ('\u{abb3}', ['\u{13e3}', '\0', '\0']), + ('\u{abb4}', ['\u{13e4}', '\0', '\0']), + ('\u{abb5}', ['\u{13e5}', '\0', '\0']), + ('\u{abb6}', ['\u{13e6}', '\0', '\0']), + ('\u{abb7}', ['\u{13e7}', '\0', '\0']), + ('\u{abb8}', ['\u{13e8}', '\0', '\0']), + ('\u{abb9}', ['\u{13e9}', '\0', '\0']), + ('\u{abba}', ['\u{13ea}', '\0', '\0']), + ('\u{abbb}', ['\u{13eb}', '\0', '\0']), + ('\u{abbc}', ['\u{13ec}', '\0', '\0']), + ('\u{abbd}', ['\u{13ed}', '\0', '\0']), + ('\u{abbe}', ['\u{13ee}', '\0', '\0']), + ('\u{abbf}', ['\u{13ef}', '\0', '\0']), + ('\u{fb00}', ['f', 'f', '\0']), + ('\u{fb01}', ['f', 'i', '\0']), + ('\u{fb02}', ['f', 'l', '\0']), + ('\u{fb03}', ['f', 'f', 'i']), + ('\u{fb04}', ['f', 'f', 'l']), + ('\u{fb05}', ['s', 't', '\0']), + ('\u{fb06}', ['s', 't', '\0']), + ('\u{fb13}', ['\u{574}', '\u{576}', '\0']), + ('\u{fb14}', ['\u{574}', '\u{565}', '\0']), + ('\u{fb15}', ['\u{574}', '\u{56b}', '\0']), + ('\u{fb16}', ['\u{57e}', '\u{576}', '\0']), + ('\u{fb17}', ['\u{574}', '\u{56d}', '\0']), + ('\u{ff21}', ['\u{ff41}', '\0', '\0']), + ('\u{ff22}', ['\u{ff42}', '\0', '\0']), + ('\u{ff23}', ['\u{ff43}', '\0', '\0']), + ('\u{ff24}', ['\u{ff44}', '\0', '\0']), + ('\u{ff25}', ['\u{ff45}', '\0', '\0']), + ('\u{ff26}', ['\u{ff46}', '\0', '\0']), + ('\u{ff27}', ['\u{ff47}', '\0', '\0']), + ('\u{ff28}', ['\u{ff48}', '\0', '\0']), + ('\u{ff29}', ['\u{ff49}', '\0', '\0']), + ('\u{ff2a}', ['\u{ff4a}', '\0', '\0']), + ('\u{ff2b}', ['\u{ff4b}', '\0', '\0']), + ('\u{ff2c}', ['\u{ff4c}', '\0', '\0']), + ('\u{ff2d}', ['\u{ff4d}', '\0', '\0']), + ('\u{ff2e}', ['\u{ff4e}', '\0', '\0']), + ('\u{ff2f}', ['\u{ff4f}', '\0', '\0']), + ('\u{ff30}', ['\u{ff50}', '\0', '\0']), + ('\u{ff31}', ['\u{ff51}', '\0', '\0']), + ('\u{ff32}', ['\u{ff52}', '\0', '\0']), + ('\u{ff33}', ['\u{ff53}', '\0', '\0']), + ('\u{ff34}', ['\u{ff54}', '\0', '\0']), + ('\u{ff35}', ['\u{ff55}', '\0', '\0']), + ('\u{ff36}', ['\u{ff56}', '\0', '\0']), + ('\u{ff37}', ['\u{ff57}', '\0', '\0']), + ('\u{ff38}', ['\u{ff58}', '\0', '\0']), + ('\u{ff39}', ['\u{ff59}', '\0', '\0']), + ('\u{ff3a}', ['\u{ff5a}', '\0', '\0']), + ('\u{10400}', ['\u{10428}', '\0', '\0']), + ('\u{10401}', ['\u{10429}', '\0', '\0']), + ('\u{10402}', ['\u{1042a}', '\0', '\0']), + ('\u{10403}', ['\u{1042b}', '\0', '\0']), + ('\u{10404}', ['\u{1042c}', '\0', '\0']), + ('\u{10405}', ['\u{1042d}', '\0', '\0']), + ('\u{10406}', ['\u{1042e}', '\0', '\0']), + ('\u{10407}', ['\u{1042f}', '\0', '\0']), + ('\u{10408}', ['\u{10430}', '\0', '\0']), + ('\u{10409}', ['\u{10431}', '\0', '\0']), + ('\u{1040a}', ['\u{10432}', '\0', '\0']), + ('\u{1040b}', ['\u{10433}', '\0', '\0']), + ('\u{1040c}', ['\u{10434}', '\0', '\0']), + ('\u{1040d}', ['\u{10435}', '\0', '\0']), + ('\u{1040e}', ['\u{10436}', '\0', '\0']), + ('\u{1040f}', ['\u{10437}', '\0', '\0']), + ('\u{10410}', ['\u{10438}', '\0', '\0']), + ('\u{10411}', ['\u{10439}', '\0', '\0']), + ('\u{10412}', ['\u{1043a}', '\0', '\0']), + ('\u{10413}', ['\u{1043b}', '\0', '\0']), + ('\u{10414}', ['\u{1043c}', '\0', '\0']), + ('\u{10415}', ['\u{1043d}', '\0', '\0']), + ('\u{10416}', ['\u{1043e}', '\0', '\0']), + ('\u{10417}', ['\u{1043f}', '\0', '\0']), + ('\u{10418}', ['\u{10440}', '\0', '\0']), + ('\u{10419}', ['\u{10441}', '\0', '\0']), + ('\u{1041a}', ['\u{10442}', '\0', '\0']), + ('\u{1041b}', ['\u{10443}', '\0', '\0']), + ('\u{1041c}', ['\u{10444}', '\0', '\0']), + ('\u{1041d}', ['\u{10445}', '\0', '\0']), + ('\u{1041e}', ['\u{10446}', '\0', '\0']), + ('\u{1041f}', ['\u{10447}', '\0', '\0']), + ('\u{10420}', ['\u{10448}', '\0', '\0']), + ('\u{10421}', ['\u{10449}', '\0', '\0']), + ('\u{10422}', ['\u{1044a}', '\0', '\0']), + ('\u{10423}', ['\u{1044b}', '\0', '\0']), + ('\u{10424}', ['\u{1044c}', '\0', '\0']), + ('\u{10425}', ['\u{1044d}', '\0', '\0']), + ('\u{10426}', ['\u{1044e}', '\0', '\0']), + ('\u{10427}', ['\u{1044f}', '\0', '\0']), + ('\u{104b0}', ['\u{104d8}', '\0', '\0']), + ('\u{104b1}', ['\u{104d9}', '\0', '\0']), + ('\u{104b2}', ['\u{104da}', '\0', '\0']), + ('\u{104b3}', ['\u{104db}', '\0', '\0']), + ('\u{104b4}', ['\u{104dc}', '\0', '\0']), + ('\u{104b5}', ['\u{104dd}', '\0', '\0']), + ('\u{104b6}', ['\u{104de}', '\0', '\0']), + ('\u{104b7}', ['\u{104df}', '\0', '\0']), + ('\u{104b8}', ['\u{104e0}', '\0', '\0']), + ('\u{104b9}', ['\u{104e1}', '\0', '\0']), + ('\u{104ba}', ['\u{104e2}', '\0', '\0']), + ('\u{104bb}', ['\u{104e3}', '\0', '\0']), + ('\u{104bc}', ['\u{104e4}', '\0', '\0']), + ('\u{104bd}', ['\u{104e5}', '\0', '\0']), + ('\u{104be}', ['\u{104e6}', '\0', '\0']), + ('\u{104bf}', ['\u{104e7}', '\0', '\0']), + ('\u{104c0}', ['\u{104e8}', '\0', '\0']), + ('\u{104c1}', ['\u{104e9}', '\0', '\0']), + ('\u{104c2}', ['\u{104ea}', '\0', '\0']), + ('\u{104c3}', ['\u{104eb}', '\0', '\0']), + ('\u{104c4}', ['\u{104ec}', '\0', '\0']), + ('\u{104c5}', ['\u{104ed}', '\0', '\0']), + ('\u{104c6}', ['\u{104ee}', '\0', '\0']), + ('\u{104c7}', ['\u{104ef}', '\0', '\0']), + ('\u{104c8}', ['\u{104f0}', '\0', '\0']), + ('\u{104c9}', ['\u{104f1}', '\0', '\0']), + ('\u{104ca}', ['\u{104f2}', '\0', '\0']), + ('\u{104cb}', ['\u{104f3}', '\0', '\0']), + ('\u{104cc}', ['\u{104f4}', '\0', '\0']), + ('\u{104cd}', ['\u{104f5}', '\0', '\0']), + ('\u{104ce}', ['\u{104f6}', '\0', '\0']), + ('\u{104cf}', ['\u{104f7}', '\0', '\0']), + ('\u{104d0}', ['\u{104f8}', '\0', '\0']), + ('\u{104d1}', ['\u{104f9}', '\0', '\0']), + ('\u{104d2}', ['\u{104fa}', '\0', '\0']), + ('\u{104d3}', ['\u{104fb}', '\0', '\0']), + ('\u{10c80}', ['\u{10cc0}', '\0', '\0']), + ('\u{10c81}', ['\u{10cc1}', '\0', '\0']), + ('\u{10c82}', ['\u{10cc2}', '\0', '\0']), + ('\u{10c83}', ['\u{10cc3}', '\0', '\0']), + ('\u{10c84}', ['\u{10cc4}', '\0', '\0']), + ('\u{10c85}', ['\u{10cc5}', '\0', '\0']), + ('\u{10c86}', ['\u{10cc6}', '\0', '\0']), + ('\u{10c87}', ['\u{10cc7}', '\0', '\0']), + ('\u{10c88}', ['\u{10cc8}', '\0', '\0']), + ('\u{10c89}', ['\u{10cc9}', '\0', '\0']), + ('\u{10c8a}', ['\u{10cca}', '\0', '\0']), + ('\u{10c8b}', ['\u{10ccb}', '\0', '\0']), + ('\u{10c8c}', ['\u{10ccc}', '\0', '\0']), + ('\u{10c8d}', ['\u{10ccd}', '\0', '\0']), + ('\u{10c8e}', ['\u{10cce}', '\0', '\0']), + ('\u{10c8f}', ['\u{10ccf}', '\0', '\0']), + ('\u{10c90}', ['\u{10cd0}', '\0', '\0']), + ('\u{10c91}', ['\u{10cd1}', '\0', '\0']), + ('\u{10c92}', ['\u{10cd2}', '\0', '\0']), + ('\u{10c93}', ['\u{10cd3}', '\0', '\0']), + ('\u{10c94}', ['\u{10cd4}', '\0', '\0']), + ('\u{10c95}', ['\u{10cd5}', '\0', '\0']), + ('\u{10c96}', ['\u{10cd6}', '\0', '\0']), + ('\u{10c97}', ['\u{10cd7}', '\0', '\0']), + ('\u{10c98}', ['\u{10cd8}', '\0', '\0']), + ('\u{10c99}', ['\u{10cd9}', '\0', '\0']), + ('\u{10c9a}', ['\u{10cda}', '\0', '\0']), + ('\u{10c9b}', ['\u{10cdb}', '\0', '\0']), + ('\u{10c9c}', ['\u{10cdc}', '\0', '\0']), + ('\u{10c9d}', ['\u{10cdd}', '\0', '\0']), + ('\u{10c9e}', ['\u{10cde}', '\0', '\0']), + ('\u{10c9f}', ['\u{10cdf}', '\0', '\0']), + ('\u{10ca0}', ['\u{10ce0}', '\0', '\0']), + ('\u{10ca1}', ['\u{10ce1}', '\0', '\0']), + ('\u{10ca2}', ['\u{10ce2}', '\0', '\0']), + ('\u{10ca3}', ['\u{10ce3}', '\0', '\0']), + ('\u{10ca4}', ['\u{10ce4}', '\0', '\0']), + ('\u{10ca5}', ['\u{10ce5}', '\0', '\0']), + ('\u{10ca6}', ['\u{10ce6}', '\0', '\0']), + ('\u{10ca7}', ['\u{10ce7}', '\0', '\0']), + ('\u{10ca8}', ['\u{10ce8}', '\0', '\0']), + ('\u{10ca9}', ['\u{10ce9}', '\0', '\0']), + ('\u{10caa}', ['\u{10cea}', '\0', '\0']), + ('\u{10cab}', ['\u{10ceb}', '\0', '\0']), + ('\u{10cac}', ['\u{10cec}', '\0', '\0']), + ('\u{10cad}', ['\u{10ced}', '\0', '\0']), + ('\u{10cae}', ['\u{10cee}', '\0', '\0']), + ('\u{10caf}', ['\u{10cef}', '\0', '\0']), + ('\u{10cb0}', ['\u{10cf0}', '\0', '\0']), + ('\u{10cb1}', ['\u{10cf1}', '\0', '\0']), + ('\u{10cb2}', ['\u{10cf2}', '\0', '\0']), + ('\u{118a0}', ['\u{118c0}', '\0', '\0']), + ('\u{118a1}', ['\u{118c1}', '\0', '\0']), + ('\u{118a2}', ['\u{118c2}', '\0', '\0']), + ('\u{118a3}', ['\u{118c3}', '\0', '\0']), + ('\u{118a4}', ['\u{118c4}', '\0', '\0']), + ('\u{118a5}', ['\u{118c5}', '\0', '\0']), + ('\u{118a6}', ['\u{118c6}', '\0', '\0']), + ('\u{118a7}', ['\u{118c7}', '\0', '\0']), + ('\u{118a8}', ['\u{118c8}', '\0', '\0']), + ('\u{118a9}', ['\u{118c9}', '\0', '\0']), + ('\u{118aa}', ['\u{118ca}', '\0', '\0']), + ('\u{118ab}', ['\u{118cb}', '\0', '\0']), + ('\u{118ac}', ['\u{118cc}', '\0', '\0']), + ('\u{118ad}', ['\u{118cd}', '\0', '\0']), + ('\u{118ae}', ['\u{118ce}', '\0', '\0']), + ('\u{118af}', ['\u{118cf}', '\0', '\0']), + ('\u{118b0}', ['\u{118d0}', '\0', '\0']), + ('\u{118b1}', ['\u{118d1}', '\0', '\0']), + ('\u{118b2}', ['\u{118d2}', '\0', '\0']), + ('\u{118b3}', ['\u{118d3}', '\0', '\0']), + ('\u{118b4}', ['\u{118d4}', '\0', '\0']), + ('\u{118b5}', ['\u{118d5}', '\0', '\0']), + ('\u{118b6}', ['\u{118d6}', '\0', '\0']), + ('\u{118b7}', ['\u{118d7}', '\0', '\0']), + ('\u{118b8}', ['\u{118d8}', '\0', '\0']), + ('\u{118b9}', ['\u{118d9}', '\0', '\0']), + ('\u{118ba}', ['\u{118da}', '\0', '\0']), + ('\u{118bb}', ['\u{118db}', '\0', '\0']), + ('\u{118bc}', ['\u{118dc}', '\0', '\0']), + ('\u{118bd}', ['\u{118dd}', '\0', '\0']), + ('\u{118be}', ['\u{118de}', '\0', '\0']), + ('\u{118bf}', ['\u{118df}', '\0', '\0']), + ('\u{1e900}', ['\u{1e922}', '\0', '\0']), + ('\u{1e901}', ['\u{1e923}', '\0', '\0']), + ('\u{1e902}', ['\u{1e924}', '\0', '\0']), + ('\u{1e903}', ['\u{1e925}', '\0', '\0']), + ('\u{1e904}', ['\u{1e926}', '\0', '\0']), + ('\u{1e905}', ['\u{1e927}', '\0', '\0']), + ('\u{1e906}', ['\u{1e928}', '\0', '\0']), + ('\u{1e907}', ['\u{1e929}', '\0', '\0']), + ('\u{1e908}', ['\u{1e92a}', '\0', '\0']), + ('\u{1e909}', ['\u{1e92b}', '\0', '\0']), + ('\u{1e90a}', ['\u{1e92c}', '\0', '\0']), + ('\u{1e90b}', ['\u{1e92d}', '\0', '\0']), + ('\u{1e90c}', ['\u{1e92e}', '\0', '\0']), + ('\u{1e90d}', ['\u{1e92f}', '\0', '\0']), + ('\u{1e90e}', ['\u{1e930}', '\0', '\0']), + ('\u{1e90f}', ['\u{1e931}', '\0', '\0']), + ('\u{1e910}', ['\u{1e932}', '\0', '\0']), + ('\u{1e911}', ['\u{1e933}', '\0', '\0']), + ('\u{1e912}', ['\u{1e934}', '\0', '\0']), + ('\u{1e913}', ['\u{1e935}', '\0', '\0']), + ('\u{1e914}', ['\u{1e936}', '\0', '\0']), + ('\u{1e915}', ['\u{1e937}', '\0', '\0']), + ('\u{1e916}', ['\u{1e938}', '\0', '\0']), + ('\u{1e917}', ['\u{1e939}', '\0', '\0']), + ('\u{1e918}', ['\u{1e93a}', '\0', '\0']), + ('\u{1e919}', ['\u{1e93b}', '\0', '\0']), + ('\u{1e91a}', ['\u{1e93c}', '\0', '\0']), + ('\u{1e91b}', ['\u{1e93d}', '\0', '\0']), + ('\u{1e91c}', ['\u{1e93e}', '\0', '\0']), + ('\u{1e91d}', ['\u{1e93f}', '\0', '\0']), + ('\u{1e91e}', ['\u{1e940}', '\0', '\0']), + ('\u{1e91f}', ['\u{1e941}', '\0', '\0']), + ('\u{1e920}', ['\u{1e942}', '\0', '\0']), + ('\u{1e921}', ['\u{1e943}', '\0', '\0']), +]; diff --git a/src/lib.rs b/src/lib.rs index 5dba244..6533105 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -2,17 +2,20 @@ use unicode_normalization::UnicodeNormalization; extern crate unicode_normalization; -include!(concat!(env!("OUT_DIR"), "/case_folding_data.rs")); - +mod case_folding_data; +pub use case_folding_data::UNICODE_VERSION; +use case_folding_data::*; pub trait Caseless { - fn default_case_fold(self) -> CaseFold where Self: Sized; - fn default_caseless_match>(self, other: J) -> bool; - fn canonical_caseless_match>(self, other: J) -> bool; - fn compatibility_caseless_match>(self, other: J) -> bool; + fn default_case_fold(self) -> CaseFold + where + Self: Sized; + fn default_caseless_match>(self, other: J) -> bool; + fn canonical_caseless_match>(self, other: J) -> bool; + fn compatibility_caseless_match>(self, other: J) -> bool; } -impl> Caseless for I { +impl> Caseless for I { fn default_case_fold(self) -> CaseFold { CaseFold { chars: self, @@ -20,12 +23,11 @@ impl> Caseless for I { } } - fn default_caseless_match>(self, other: J) -> bool { - iter_eq(self.default_case_fold(), - other.default_case_fold()) + fn default_caseless_match>(self, other: J) -> bool { + iter_eq(self.default_case_fold(), other.default_case_fold()) } - fn canonical_caseless_match>(self, other: J) -> bool { + fn canonical_caseless_match>(self, other: J) -> bool { // FIXME: Inner NFD can be optimized: // "Normalization is not required before case folding, // except for the character U+0345 "combining greek ypogegrammeni" @@ -35,16 +37,28 @@ impl> Caseless for I { // can catch these special cases, thereby avoiding an extra normalization // step for each comparison." // Unicode Standard, section 3.13 Default Case Algorithms - iter_eq(self.nfd().default_case_fold().nfd(), - other.nfd().default_case_fold().nfd()) + iter_eq( + self.nfd().default_case_fold().nfd(), + other.nfd().default_case_fold().nfd(), + ) } - fn compatibility_caseless_match>(self, other: J) -> bool { + fn compatibility_caseless_match>(self, other: J) -> bool { // FIXME: Unclear if the inner NFD can be optimized here like in canonical_caseless_match. - iter_eq(self.nfd().default_case_fold().nfkd().default_case_fold().nfkd(), - other.nfd().default_case_fold().nfkd().default_case_fold().nfkd()) + iter_eq( + self.nfd() + .default_case_fold() + .nfkd() + .default_case_fold() + .nfkd(), + other + .nfd() + .default_case_fold() + .nfkd() + .default_case_fold() + .nfkd(), + ) } - } pub fn default_case_fold_str(s: &str) -> String { @@ -63,12 +77,19 @@ pub fn compatibility_caseless_match_str(a: &str, b: &str) -> bool { a.chars().compatibility_caseless_match(b.chars()) } -fn iter_eq(mut a: L, mut b: R) -> bool where L::Item: PartialEq { +fn iter_eq(mut a: L, mut b: R) -> bool +where + L::Item: PartialEq, +{ loop { match (a.next(), b.next()) { (None, None) => return true, (None, _) | (_, None) => return false, - (Some(x), Some(y)) => if !x.eq(&y) { return false }, + (Some(x), Some(y)) => { + if !x.eq(&y) { + return false; + } + } } } } @@ -78,7 +99,10 @@ pub struct CaseFold { queue: [char; 2], } -impl Iterator for CaseFold where I: Iterator { +impl Iterator for CaseFold +where + I: Iterator, +{ type Item = char; fn next(&mut self) -> Option { @@ -86,18 +110,18 @@ impl Iterator for CaseFold where I: Iterator { if c != '\0' { self.queue[0] = self.queue[1]; self.queue[1] = '\0'; - return Some(c) + return Some(c); } - self.chars.next().map(|c| { - match CASE_FOLDING_TABLE.binary_search_by(|&(x, _)| x.cmp(&c)) { + self.chars.next().map( + |c| match CASE_FOLDING_TABLE.binary_search_by(|&(x, _)| x.cmp(&c)) { Err(_) => c, Ok(i) => { let folded = CASE_FOLDING_TABLE[i].1; self.queue = [folded[1], folded[2]]; folded[0] } - } - }) + }, + ) } fn size_hint(&self) -> (usize, Option) { @@ -109,8 +133,11 @@ impl Iterator for CaseFold where I: Iterator { 2 }; let (low, high) = self.chars.size_hint(); - (low.saturating_add(queue_len), - high.and_then(|h| h.checked_mul(3)).and_then(|h| h.checked_add(queue_len))) + ( + low.saturating_add(queue_len), + high.and_then(|h| h.checked_mul(3)) + .and_then(|h| h.checked_add(queue_len)), + ) } } @@ -126,4 +153,3 @@ mod tests { assert_eq!(default_case_fold_str("straße"), "strasse"); } } -