From 7855bbf9f6987afd37fd1d665ffe43cca0923a49 Mon Sep 17 00:00:00 2001 From: Marcus Holland-Moritz Date: Mon, 18 Nov 2024 00:47:02 +0100 Subject: [PATCH] feat: support case-insensitive lookups (fixes gh #232) --- .maintainer-scripts/unicode-case-fold.pl | 38 + CMakeLists.txt | 1 + cmake/libdwarfs.cmake | 1 + doc/dwarfs.md | 11 + .../dwarfs/internal/unicode_case_folding.h | 32 + include/dwarfs/reader/metadata_options.h | 1 + src/internal/unicode_case_folding.cpp | 3027 +++++++++++++++++ src/reader/internal/metadata_v2.cpp | 137 +- test/dwarfs_test.cpp | 181 + test/tools_test.cpp | 11 + test/unicode_test.cpp | 111 + tools/src/dwarfs_main.cpp | 4 + vcpkg.json | 1 + 13 files changed, 3545 insertions(+), 11 deletions(-) create mode 100755 .maintainer-scripts/unicode-case-fold.pl create mode 100644 include/dwarfs/internal/unicode_case_folding.h create mode 100644 src/internal/unicode_case_folding.cpp create mode 100644 test/unicode_test.cpp diff --git a/.maintainer-scripts/unicode-case-fold.pl b/.maintainer-scripts/unicode-case-fold.pl new file mode 100755 index 000000000..d4b7198bd --- /dev/null +++ b/.maintainer-scripts/unicode-case-fold.pl @@ -0,0 +1,38 @@ +#!/usr/bin/perl -w +use strict; +use warnings; + +# Input data: https://www.unicode.org/Public/UCD/latest/ucd/CaseFolding.txt + +my %map; + +while (<>) { + chomp; + next if /^(#|\s*$)/; + my($char, $status, $fold, $comment) = split /\s*;\s*/; + if ($status =~ /^[CS]$/) { + $comment =~ s/^#\s*//; + # print " case 0x$char: return 0x$fold; // [$status] $comment\n"; + $map{hex($char)} = hex($fold); + } +} + +my @valid_code_points = (0..0xD7FF, 0xE000..0x10FFFF); + +sub cp_to_str { + my $cp = shift; + my $fmt = $cp < 0x10000 ? "\\u%04X" : "\\U%08X"; + return sprintf $fmt, $cp; +} + +while (@valid_code_points) { + my @cps = splice @valid_code_points, 0, 256; + my $orig; + my $folded; + for my $cp (@cps) { + my $fold = $map{$cp} // $cp; + $orig .= cp_to_str($cp); + $folded .= cp_to_str($fold); + } + print " {u8\"$orig\"sv, u8\"$folded\"sv},\n" if $orig ne $folded; +} diff --git a/CMakeLists.txt b/CMakeLists.txt index 51b6b4f39..456cdd6c2 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -450,6 +450,7 @@ if(WITH_TESTS) pcmaudio_categorizer_test speedometer_test terminal_test + unicode_test utils_test file_utils_test worker_group_test diff --git a/cmake/libdwarfs.cmake b/cmake/libdwarfs.cmake index 9907dff04..36ebb0c60 100644 --- a/cmake/libdwarfs.cmake +++ b/cmake/libdwarfs.cmake @@ -49,6 +49,7 @@ add_library( src/internal/fs_section.cpp src/internal/glob_to_regex.cpp src/internal/string_table.cpp + src/internal/unicode_case_folding.cpp src/internal/wcwidth.c src/internal/worker_group.cpp diff --git a/doc/dwarfs.md b/doc/dwarfs.md index 698ba111e..69f5136e3 100644 --- a/doc/dwarfs.md +++ b/doc/dwarfs.md @@ -104,6 +104,17 @@ options: overlays and want the file system to reflect its read-only state, you can set this option. +- `-o case_insensitive`: + Perform case-insensitive lookups in the mounted file system, + i.e. an entry orignally named `ReadMe.txt` can be accessed as + `readme.txt`, `README.TXT`, or `rEaDmE.tXt`. This works across + all platforms. When mounting a file system with many files, this + may be slightly slower and consume slightly more memory as case- + insensitive lookup requires an additional mapping table that is + built on-demand. Note that this is not supported if the file + system contains directories with entries that only differ in + case. + - `-o (no_)cache_image`: By default, `dwarfs` tries to ensure that the compressed file system image will not be cached by the kernel (i.e. the default diff --git a/include/dwarfs/internal/unicode_case_folding.h b/include/dwarfs/internal/unicode_case_folding.h new file mode 100644 index 000000000..c91b1373b --- /dev/null +++ b/include/dwarfs/internal/unicode_case_folding.h @@ -0,0 +1,32 @@ +/* vim:set ts=2 sw=2 sts=2 et: */ +/** + * \author Marcus Holland-Moritz (github@mhxnet.de) + * \copyright Copyright (c) Marcus Holland-Moritz + * + * This file is part of dwarfs. + * + * dwarfs is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * dwarfs is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with dwarfs. If not, see . + */ + +#pragma once + +#include +#include + +namespace dwarfs::internal { + +std::string utf8_case_fold(std::string_view in); +std::string utf8_case_fold_unchecked(std::string_view in); + +} // namespace dwarfs::internal diff --git a/include/dwarfs/reader/metadata_options.h b/include/dwarfs/reader/metadata_options.h index 5bb42fd9a..e8e629b45 100644 --- a/include/dwarfs/reader/metadata_options.h +++ b/include/dwarfs/reader/metadata_options.h @@ -32,6 +32,7 @@ struct metadata_options { bool enable_nlink{false}; bool readonly{false}; bool check_consistency{false}; + bool case_insensitive_lookup{false}; size_t block_size{512}; std::optional fs_uid{}; std::optional fs_gid{}; diff --git a/src/internal/unicode_case_folding.cpp b/src/internal/unicode_case_folding.cpp new file mode 100644 index 000000000..3e607c1d1 --- /dev/null +++ b/src/internal/unicode_case_folding.cpp @@ -0,0 +1,3027 @@ +/* vim:set ts=2 sw=2 sts=2 et: */ +/** + * \author Marcus Holland-Moritz (github@mhxnet.de) + * \copyright Copyright (c) Marcus Holland-Moritz + * + * This file is part of dwarfs. + * + * dwarfs is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * dwarfs is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with dwarfs. If not, see . + */ + +#if __has_include() +#include +#else +#include +#endif + +#include + +namespace dwarfs::internal { + +namespace { + +char32_t case_fold_char_slow(char32_t in) { + switch (in) { + case 0x00B5: + return 0x03BC; // [C] MICRO SIGN + case 0x00C0: + return 0x00E0; // [C] LATIN CAPITAL LETTER A WITH GRAVE + case 0x00C1: + return 0x00E1; // [C] LATIN CAPITAL LETTER A WITH ACUTE + case 0x00C2: + return 0x00E2; // [C] LATIN CAPITAL LETTER A WITH CIRCUMFLEX + case 0x00C3: + return 0x00E3; // [C] LATIN CAPITAL LETTER A WITH TILDE + case 0x00C4: + return 0x00E4; // [C] LATIN CAPITAL LETTER A WITH DIAERESIS + case 0x00C5: + return 0x00E5; // [C] LATIN CAPITAL LETTER A WITH RING ABOVE + case 0x00C6: + return 0x00E6; // [C] LATIN CAPITAL LETTER AE + case 0x00C7: + return 0x00E7; // [C] LATIN CAPITAL LETTER C WITH CEDILLA + case 0x00C8: + return 0x00E8; // [C] LATIN CAPITAL LETTER E WITH GRAVE + case 0x00C9: + return 0x00E9; // [C] LATIN CAPITAL LETTER E WITH ACUTE + case 0x00CA: + return 0x00EA; // [C] LATIN CAPITAL LETTER E WITH CIRCUMFLEX + case 0x00CB: + return 0x00EB; // [C] LATIN CAPITAL LETTER E WITH DIAERESIS + case 0x00CC: + return 0x00EC; // [C] LATIN CAPITAL LETTER I WITH GRAVE + case 0x00CD: + return 0x00ED; // [C] LATIN CAPITAL LETTER I WITH ACUTE + case 0x00CE: + return 0x00EE; // [C] LATIN CAPITAL LETTER I WITH CIRCUMFLEX + case 0x00CF: + return 0x00EF; // [C] LATIN CAPITAL LETTER I WITH DIAERESIS + case 0x00D0: + return 0x00F0; // [C] LATIN CAPITAL LETTER ETH + case 0x00D1: + return 0x00F1; // [C] LATIN CAPITAL LETTER N WITH TILDE + case 0x00D2: + return 0x00F2; // [C] LATIN CAPITAL LETTER O WITH GRAVE + case 0x00D3: + return 0x00F3; // [C] LATIN CAPITAL LETTER O WITH ACUTE + case 0x00D4: + return 0x00F4; // [C] LATIN CAPITAL LETTER O WITH CIRCUMFLEX + case 0x00D5: + return 0x00F5; // [C] LATIN CAPITAL LETTER O WITH TILDE + case 0x00D6: + return 0x00F6; // [C] LATIN CAPITAL LETTER O WITH DIAERESIS + case 0x00D8: + return 0x00F8; // [C] LATIN CAPITAL LETTER O WITH STROKE + case 0x00D9: + return 0x00F9; // [C] LATIN CAPITAL LETTER U WITH GRAVE + case 0x00DA: + return 0x00FA; // [C] LATIN CAPITAL LETTER U WITH ACUTE + case 0x00DB: + return 0x00FB; // [C] LATIN CAPITAL LETTER U WITH CIRCUMFLEX + case 0x00DC: + return 0x00FC; // [C] LATIN CAPITAL LETTER U WITH DIAERESIS + case 0x00DD: + return 0x00FD; // [C] LATIN CAPITAL LETTER Y WITH ACUTE + case 0x00DE: + return 0x00FE; // [C] LATIN CAPITAL LETTER THORN + case 0x0100: + return 0x0101; // [C] LATIN CAPITAL LETTER A WITH MACRON + case 0x0102: + return 0x0103; // [C] LATIN CAPITAL LETTER A WITH BREVE + case 0x0104: + return 0x0105; // [C] LATIN CAPITAL LETTER A WITH OGONEK + case 0x0106: + return 0x0107; // [C] LATIN CAPITAL LETTER C WITH ACUTE + case 0x0108: + return 0x0109; // [C] LATIN CAPITAL LETTER C WITH CIRCUMFLEX + case 0x010A: + return 0x010B; // [C] LATIN CAPITAL LETTER C WITH DOT ABOVE + case 0x010C: + return 0x010D; // [C] LATIN CAPITAL LETTER C WITH CARON + case 0x010E: + return 0x010F; // [C] LATIN CAPITAL LETTER D WITH CARON + case 0x0110: + return 0x0111; // [C] LATIN CAPITAL LETTER D WITH STROKE + case 0x0112: + return 0x0113; // [C] LATIN CAPITAL LETTER E WITH MACRON + case 0x0114: + return 0x0115; // [C] LATIN CAPITAL LETTER E WITH BREVE + case 0x0116: + return 0x0117; // [C] LATIN CAPITAL LETTER E WITH DOT ABOVE + case 0x0118: + return 0x0119; // [C] LATIN CAPITAL LETTER E WITH OGONEK + case 0x011A: + return 0x011B; // [C] LATIN CAPITAL LETTER E WITH CARON + case 0x011C: + return 0x011D; // [C] LATIN CAPITAL LETTER G WITH CIRCUMFLEX + case 0x011E: + return 0x011F; // [C] LATIN CAPITAL LETTER G WITH BREVE + case 0x0120: + return 0x0121; // [C] LATIN CAPITAL LETTER G WITH DOT ABOVE + case 0x0122: + return 0x0123; // [C] LATIN CAPITAL LETTER G WITH CEDILLA + case 0x0124: + return 0x0125; // [C] LATIN CAPITAL LETTER H WITH CIRCUMFLEX + case 0x0126: + return 0x0127; // [C] LATIN CAPITAL LETTER H WITH STROKE + case 0x0128: + return 0x0129; // [C] LATIN CAPITAL LETTER I WITH TILDE + case 0x012A: + return 0x012B; // [C] LATIN CAPITAL LETTER I WITH MACRON + case 0x012C: + return 0x012D; // [C] LATIN CAPITAL LETTER I WITH BREVE + case 0x012E: + return 0x012F; // [C] LATIN CAPITAL LETTER I WITH OGONEK + case 0x0132: + return 0x0133; // [C] LATIN CAPITAL LIGATURE IJ + case 0x0134: + return 0x0135; // [C] LATIN CAPITAL LETTER J WITH CIRCUMFLEX + case 0x0136: + return 0x0137; // [C] LATIN CAPITAL LETTER K WITH CEDILLA + case 0x0139: + return 0x013A; // [C] LATIN CAPITAL LETTER L WITH ACUTE + case 0x013B: + return 0x013C; // [C] LATIN CAPITAL LETTER L WITH CEDILLA + case 0x013D: + return 0x013E; // [C] LATIN CAPITAL LETTER L WITH CARON + case 0x013F: + return 0x0140; // [C] LATIN CAPITAL LETTER L WITH MIDDLE DOT + case 0x0141: + return 0x0142; // [C] LATIN CAPITAL LETTER L WITH STROKE + case 0x0143: + return 0x0144; // [C] LATIN CAPITAL LETTER N WITH ACUTE + case 0x0145: + return 0x0146; // [C] LATIN CAPITAL LETTER N WITH CEDILLA + case 0x0147: + return 0x0148; // [C] LATIN CAPITAL LETTER N WITH CARON + case 0x014A: + return 0x014B; // [C] LATIN CAPITAL LETTER ENG + case 0x014C: + return 0x014D; // [C] LATIN CAPITAL LETTER O WITH MACRON + case 0x014E: + return 0x014F; // [C] LATIN CAPITAL LETTER O WITH BREVE + case 0x0150: + return 0x0151; // [C] LATIN CAPITAL LETTER O WITH DOUBLE ACUTE + case 0x0152: + return 0x0153; // [C] LATIN CAPITAL LIGATURE OE + case 0x0154: + return 0x0155; // [C] LATIN CAPITAL LETTER R WITH ACUTE + case 0x0156: + return 0x0157; // [C] LATIN CAPITAL LETTER R WITH CEDILLA + case 0x0158: + return 0x0159; // [C] LATIN CAPITAL LETTER R WITH CARON + case 0x015A: + return 0x015B; // [C] LATIN CAPITAL LETTER S WITH ACUTE + case 0x015C: + return 0x015D; // [C] LATIN CAPITAL LETTER S WITH CIRCUMFLEX + case 0x015E: + return 0x015F; // [C] LATIN CAPITAL LETTER S WITH CEDILLA + case 0x0160: + return 0x0161; // [C] LATIN CAPITAL LETTER S WITH CARON + case 0x0162: + return 0x0163; // [C] LATIN CAPITAL LETTER T WITH CEDILLA + case 0x0164: + return 0x0165; // [C] LATIN CAPITAL LETTER T WITH CARON + case 0x0166: + return 0x0167; // [C] LATIN CAPITAL LETTER T WITH STROKE + case 0x0168: + return 0x0169; // [C] LATIN CAPITAL LETTER U WITH TILDE + case 0x016A: + return 0x016B; // [C] LATIN CAPITAL LETTER U WITH MACRON + case 0x016C: + return 0x016D; // [C] LATIN CAPITAL LETTER U WITH BREVE + case 0x016E: + return 0x016F; // [C] LATIN CAPITAL LETTER U WITH RING ABOVE + case 0x0170: + return 0x0171; // [C] LATIN CAPITAL LETTER U WITH DOUBLE ACUTE + case 0x0172: + return 0x0173; // [C] LATIN CAPITAL LETTER U WITH OGONEK + case 0x0174: + return 0x0175; // [C] LATIN CAPITAL LETTER W WITH CIRCUMFLEX + case 0x0176: + return 0x0177; // [C] LATIN CAPITAL LETTER Y WITH CIRCUMFLEX + case 0x0178: + return 0x00FF; // [C] LATIN CAPITAL LETTER Y WITH DIAERESIS + case 0x0179: + return 0x017A; // [C] LATIN CAPITAL LETTER Z WITH ACUTE + case 0x017B: + return 0x017C; // [C] LATIN CAPITAL LETTER Z WITH DOT ABOVE + case 0x017D: + return 0x017E; // [C] LATIN CAPITAL LETTER Z WITH CARON + case 0x017F: + return 0x0073; // [C] LATIN SMALL LETTER LONG S + case 0x0181: + return 0x0253; // [C] LATIN CAPITAL LETTER B WITH HOOK + case 0x0182: + return 0x0183; // [C] LATIN CAPITAL LETTER B WITH TOPBAR + case 0x0184: + return 0x0185; // [C] LATIN CAPITAL LETTER TONE SIX + case 0x0186: + return 0x0254; // [C] LATIN CAPITAL LETTER OPEN O + case 0x0187: + return 0x0188; // [C] LATIN CAPITAL LETTER C WITH HOOK + case 0x0189: + return 0x0256; // [C] LATIN CAPITAL LETTER AFRICAN D + case 0x018A: + return 0x0257; // [C] LATIN CAPITAL LETTER D WITH HOOK + case 0x018B: + return 0x018C; // [C] LATIN CAPITAL LETTER D WITH TOPBAR + case 0x018E: + return 0x01DD; // [C] LATIN CAPITAL LETTER REVERSED E + case 0x018F: + return 0x0259; // [C] LATIN CAPITAL LETTER SCHWA + case 0x0190: + return 0x025B; // [C] LATIN CAPITAL LETTER OPEN E + case 0x0191: + return 0x0192; // [C] LATIN CAPITAL LETTER F WITH HOOK + case 0x0193: + return 0x0260; // [C] LATIN CAPITAL LETTER G WITH HOOK + case 0x0194: + return 0x0263; // [C] LATIN CAPITAL LETTER GAMMA + case 0x0196: + return 0x0269; // [C] LATIN CAPITAL LETTER IOTA + case 0x0197: + return 0x0268; // [C] LATIN CAPITAL LETTER I WITH STROKE + case 0x0198: + return 0x0199; // [C] LATIN CAPITAL LETTER K WITH HOOK + case 0x019C: + return 0x026F; // [C] LATIN CAPITAL LETTER TURNED M + case 0x019D: + return 0x0272; // [C] LATIN CAPITAL LETTER N WITH LEFT HOOK + case 0x019F: + return 0x0275; // [C] LATIN CAPITAL LETTER O WITH MIDDLE TILDE + case 0x01A0: + return 0x01A1; // [C] LATIN CAPITAL LETTER O WITH HORN + case 0x01A2: + return 0x01A3; // [C] LATIN CAPITAL LETTER OI + case 0x01A4: + return 0x01A5; // [C] LATIN CAPITAL LETTER P WITH HOOK + case 0x01A6: + return 0x0280; // [C] LATIN LETTER YR + case 0x01A7: + return 0x01A8; // [C] LATIN CAPITAL LETTER TONE TWO + case 0x01A9: + return 0x0283; // [C] LATIN CAPITAL LETTER ESH + case 0x01AC: + return 0x01AD; // [C] LATIN CAPITAL LETTER T WITH HOOK + case 0x01AE: + return 0x0288; // [C] LATIN CAPITAL LETTER T WITH RETROFLEX HOOK + case 0x01AF: + return 0x01B0; // [C] LATIN CAPITAL LETTER U WITH HORN + case 0x01B1: + return 0x028A; // [C] LATIN CAPITAL LETTER UPSILON + case 0x01B2: + return 0x028B; // [C] LATIN CAPITAL LETTER V WITH HOOK + case 0x01B3: + return 0x01B4; // [C] LATIN CAPITAL LETTER Y WITH HOOK + case 0x01B5: + return 0x01B6; // [C] LATIN CAPITAL LETTER Z WITH STROKE + case 0x01B7: + return 0x0292; // [C] LATIN CAPITAL LETTER EZH + case 0x01B8: + return 0x01B9; // [C] LATIN CAPITAL LETTER EZH REVERSED + case 0x01BC: + return 0x01BD; // [C] LATIN CAPITAL LETTER TONE FIVE + case 0x01C4: + return 0x01C6; // [C] LATIN CAPITAL LETTER DZ WITH CARON + case 0x01C5: + return 0x01C6; // [C] LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON + case 0x01C7: + return 0x01C9; // [C] LATIN CAPITAL LETTER LJ + case 0x01C8: + return 0x01C9; // [C] LATIN CAPITAL LETTER L WITH SMALL LETTER J + case 0x01CA: + return 0x01CC; // [C] LATIN CAPITAL LETTER NJ + case 0x01CB: + return 0x01CC; // [C] LATIN CAPITAL LETTER N WITH SMALL LETTER J + case 0x01CD: + return 0x01CE; // [C] LATIN CAPITAL LETTER A WITH CARON + case 0x01CF: + return 0x01D0; // [C] LATIN CAPITAL LETTER I WITH CARON + case 0x01D1: + return 0x01D2; // [C] LATIN CAPITAL LETTER O WITH CARON + case 0x01D3: + return 0x01D4; // [C] LATIN CAPITAL LETTER U WITH CARON + case 0x01D5: + return 0x01D6; // [C] LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON + case 0x01D7: + return 0x01D8; // [C] LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE + case 0x01D9: + return 0x01DA; // [C] LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON + case 0x01DB: + return 0x01DC; // [C] LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE + case 0x01DE: + return 0x01DF; // [C] LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON + case 0x01E0: + return 0x01E1; // [C] LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON + case 0x01E2: + return 0x01E3; // [C] LATIN CAPITAL LETTER AE WITH MACRON + case 0x01E4: + return 0x01E5; // [C] LATIN CAPITAL LETTER G WITH STROKE + case 0x01E6: + return 0x01E7; // [C] LATIN CAPITAL LETTER G WITH CARON + case 0x01E8: + return 0x01E9; // [C] LATIN CAPITAL LETTER K WITH CARON + case 0x01EA: + return 0x01EB; // [C] LATIN CAPITAL LETTER O WITH OGONEK + case 0x01EC: + return 0x01ED; // [C] LATIN CAPITAL LETTER O WITH OGONEK AND MACRON + case 0x01EE: + return 0x01EF; // [C] LATIN CAPITAL LETTER EZH WITH CARON + case 0x01F1: + return 0x01F3; // [C] LATIN CAPITAL LETTER DZ + case 0x01F2: + return 0x01F3; // [C] LATIN CAPITAL LETTER D WITH SMALL LETTER Z + case 0x01F4: + return 0x01F5; // [C] LATIN CAPITAL LETTER G WITH ACUTE + case 0x01F6: + return 0x0195; // [C] LATIN CAPITAL LETTER HWAIR + case 0x01F7: + return 0x01BF; // [C] LATIN CAPITAL LETTER WYNN + case 0x01F8: + return 0x01F9; // [C] LATIN CAPITAL LETTER N WITH GRAVE + case 0x01FA: + return 0x01FB; // [C] LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE + case 0x01FC: + return 0x01FD; // [C] LATIN CAPITAL LETTER AE WITH ACUTE + case 0x01FE: + return 0x01FF; // [C] LATIN CAPITAL LETTER O WITH STROKE AND ACUTE + case 0x0200: + return 0x0201; // [C] LATIN CAPITAL LETTER A WITH DOUBLE GRAVE + case 0x0202: + return 0x0203; // [C] LATIN CAPITAL LETTER A WITH INVERTED BREVE + case 0x0204: + return 0x0205; // [C] LATIN CAPITAL LETTER E WITH DOUBLE GRAVE + case 0x0206: + return 0x0207; // [C] LATIN CAPITAL LETTER E WITH INVERTED BREVE + case 0x0208: + return 0x0209; // [C] LATIN CAPITAL LETTER I WITH DOUBLE GRAVE + case 0x020A: + return 0x020B; // [C] LATIN CAPITAL LETTER I WITH INVERTED BREVE + case 0x020C: + return 0x020D; // [C] LATIN CAPITAL LETTER O WITH DOUBLE GRAVE + case 0x020E: + return 0x020F; // [C] LATIN CAPITAL LETTER O WITH INVERTED BREVE + case 0x0210: + return 0x0211; // [C] LATIN CAPITAL LETTER R WITH DOUBLE GRAVE + case 0x0212: + return 0x0213; // [C] LATIN CAPITAL LETTER R WITH INVERTED BREVE + case 0x0214: + return 0x0215; // [C] LATIN CAPITAL LETTER U WITH DOUBLE GRAVE + case 0x0216: + return 0x0217; // [C] LATIN CAPITAL LETTER U WITH INVERTED BREVE + case 0x0218: + return 0x0219; // [C] LATIN CAPITAL LETTER S WITH COMMA BELOW + case 0x021A: + return 0x021B; // [C] LATIN CAPITAL LETTER T WITH COMMA BELOW + case 0x021C: + return 0x021D; // [C] LATIN CAPITAL LETTER YOGH + case 0x021E: + return 0x021F; // [C] LATIN CAPITAL LETTER H WITH CARON + case 0x0220: + return 0x019E; // [C] LATIN CAPITAL LETTER N WITH LONG RIGHT LEG + case 0x0222: + return 0x0223; // [C] LATIN CAPITAL LETTER OU + case 0x0224: + return 0x0225; // [C] LATIN CAPITAL LETTER Z WITH HOOK + case 0x0226: + return 0x0227; // [C] LATIN CAPITAL LETTER A WITH DOT ABOVE + case 0x0228: + return 0x0229; // [C] LATIN CAPITAL LETTER E WITH CEDILLA + case 0x022A: + return 0x022B; // [C] LATIN CAPITAL LETTER O WITH DIAERESIS AND MACRON + case 0x022C: + return 0x022D; // [C] LATIN CAPITAL LETTER O WITH TILDE AND MACRON + case 0x022E: + return 0x022F; // [C] LATIN CAPITAL LETTER O WITH DOT ABOVE + case 0x0230: + return 0x0231; // [C] LATIN CAPITAL LETTER O WITH DOT ABOVE AND MACRON + case 0x0232: + return 0x0233; // [C] LATIN CAPITAL LETTER Y WITH MACRON + case 0x023A: + return 0x2C65; // [C] LATIN CAPITAL LETTER A WITH STROKE + case 0x023B: + return 0x023C; // [C] LATIN CAPITAL LETTER C WITH STROKE + case 0x023D: + return 0x019A; // [C] LATIN CAPITAL LETTER L WITH BAR + case 0x023E: + return 0x2C66; // [C] LATIN CAPITAL LETTER T WITH DIAGONAL STROKE + case 0x0241: + return 0x0242; // [C] LATIN CAPITAL LETTER GLOTTAL STOP + case 0x0243: + return 0x0180; // [C] LATIN CAPITAL LETTER B WITH STROKE + case 0x0244: + return 0x0289; // [C] LATIN CAPITAL LETTER U BAR + case 0x0245: + return 0x028C; // [C] LATIN CAPITAL LETTER TURNED V + case 0x0246: + return 0x0247; // [C] LATIN CAPITAL LETTER E WITH STROKE + case 0x0248: + return 0x0249; // [C] LATIN CAPITAL LETTER J WITH STROKE + case 0x024A: + return 0x024B; // [C] LATIN CAPITAL LETTER SMALL Q WITH HOOK TAIL + case 0x024C: + return 0x024D; // [C] LATIN CAPITAL LETTER R WITH STROKE + case 0x024E: + return 0x024F; // [C] LATIN CAPITAL LETTER Y WITH STROKE + case 0x0345: + return 0x03B9; // [C] COMBINING GREEK YPOGEGRAMMENI + case 0x0370: + return 0x0371; // [C] GREEK CAPITAL LETTER HETA + case 0x0372: + return 0x0373; // [C] GREEK CAPITAL LETTER ARCHAIC SAMPI + case 0x0376: + return 0x0377; // [C] GREEK CAPITAL LETTER PAMPHYLIAN DIGAMMA + case 0x037F: + return 0x03F3; // [C] GREEK CAPITAL LETTER YOT + case 0x0386: + return 0x03AC; // [C] GREEK CAPITAL LETTER ALPHA WITH TONOS + case 0x0388: + return 0x03AD; // [C] GREEK CAPITAL LETTER EPSILON WITH TONOS + case 0x0389: + return 0x03AE; // [C] GREEK CAPITAL LETTER ETA WITH TONOS + case 0x038A: + return 0x03AF; // [C] GREEK CAPITAL LETTER IOTA WITH TONOS + case 0x038C: + return 0x03CC; // [C] GREEK CAPITAL LETTER OMICRON WITH TONOS + case 0x038E: + return 0x03CD; // [C] GREEK CAPITAL LETTER UPSILON WITH TONOS + case 0x038F: + return 0x03CE; // [C] GREEK CAPITAL LETTER OMEGA WITH TONOS + case 0x0391: + return 0x03B1; // [C] GREEK CAPITAL LETTER ALPHA + case 0x0392: + return 0x03B2; // [C] GREEK CAPITAL LETTER BETA + case 0x0393: + return 0x03B3; // [C] GREEK CAPITAL LETTER GAMMA + case 0x0394: + return 0x03B4; // [C] GREEK CAPITAL LETTER DELTA + case 0x0395: + return 0x03B5; // [C] GREEK CAPITAL LETTER EPSILON + case 0x0396: + return 0x03B6; // [C] GREEK CAPITAL LETTER ZETA + case 0x0397: + return 0x03B7; // [C] GREEK CAPITAL LETTER ETA + case 0x0398: + return 0x03B8; // [C] GREEK CAPITAL LETTER THETA + case 0x0399: + return 0x03B9; // [C] GREEK CAPITAL LETTER IOTA + case 0x039A: + return 0x03BA; // [C] GREEK CAPITAL LETTER KAPPA + case 0x039B: + return 0x03BB; // [C] GREEK CAPITAL LETTER LAMDA + case 0x039C: + return 0x03BC; // [C] GREEK CAPITAL LETTER MU + case 0x039D: + return 0x03BD; // [C] GREEK CAPITAL LETTER NU + case 0x039E: + return 0x03BE; // [C] GREEK CAPITAL LETTER XI + case 0x039F: + return 0x03BF; // [C] GREEK CAPITAL LETTER OMICRON + case 0x03A0: + return 0x03C0; // [C] GREEK CAPITAL LETTER PI + case 0x03A1: + return 0x03C1; // [C] GREEK CAPITAL LETTER RHO + case 0x03A3: + return 0x03C3; // [C] GREEK CAPITAL LETTER SIGMA + case 0x03A4: + return 0x03C4; // [C] GREEK CAPITAL LETTER TAU + case 0x03A5: + return 0x03C5; // [C] GREEK CAPITAL LETTER UPSILON + case 0x03A6: + return 0x03C6; // [C] GREEK CAPITAL LETTER PHI + case 0x03A7: + return 0x03C7; // [C] GREEK CAPITAL LETTER CHI + case 0x03A8: + return 0x03C8; // [C] GREEK CAPITAL LETTER PSI + case 0x03A9: + return 0x03C9; // [C] GREEK CAPITAL LETTER OMEGA + case 0x03AA: + return 0x03CA; // [C] GREEK CAPITAL LETTER IOTA WITH DIALYTIKA + case 0x03AB: + return 0x03CB; // [C] GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA + case 0x03C2: + return 0x03C3; // [C] GREEK SMALL LETTER FINAL SIGMA + case 0x03CF: + return 0x03D7; // [C] GREEK CAPITAL KAI SYMBOL + case 0x03D0: + return 0x03B2; // [C] GREEK BETA SYMBOL + case 0x03D1: + return 0x03B8; // [C] GREEK THETA SYMBOL + case 0x03D5: + return 0x03C6; // [C] GREEK PHI SYMBOL + case 0x03D6: + return 0x03C0; // [C] GREEK PI SYMBOL + case 0x03D8: + return 0x03D9; // [C] GREEK LETTER ARCHAIC KOPPA + case 0x03DA: + return 0x03DB; // [C] GREEK LETTER STIGMA + case 0x03DC: + return 0x03DD; // [C] GREEK LETTER DIGAMMA + case 0x03DE: + return 0x03DF; // [C] GREEK LETTER KOPPA + case 0x03E0: + return 0x03E1; // [C] GREEK LETTER SAMPI + case 0x03E2: + return 0x03E3; // [C] COPTIC CAPITAL LETTER SHEI + case 0x03E4: + return 0x03E5; // [C] COPTIC CAPITAL LETTER FEI + case 0x03E6: + return 0x03E7; // [C] COPTIC CAPITAL LETTER KHEI + case 0x03E8: + return 0x03E9; // [C] COPTIC CAPITAL LETTER HORI + case 0x03EA: + return 0x03EB; // [C] COPTIC CAPITAL LETTER GANGIA + case 0x03EC: + return 0x03ED; // [C] COPTIC CAPITAL LETTER SHIMA + case 0x03EE: + return 0x03EF; // [C] COPTIC CAPITAL LETTER DEI + case 0x03F0: + return 0x03BA; // [C] GREEK KAPPA SYMBOL + case 0x03F1: + return 0x03C1; // [C] GREEK RHO SYMBOL + case 0x03F4: + return 0x03B8; // [C] GREEK CAPITAL THETA SYMBOL + case 0x03F5: + return 0x03B5; // [C] GREEK LUNATE EPSILON SYMBOL + case 0x03F7: + return 0x03F8; // [C] GREEK CAPITAL LETTER SHO + case 0x03F9: + return 0x03F2; // [C] GREEK CAPITAL LUNATE SIGMA SYMBOL + case 0x03FA: + return 0x03FB; // [C] GREEK CAPITAL LETTER SAN + case 0x03FD: + return 0x037B; // [C] GREEK CAPITAL REVERSED LUNATE SIGMA SYMBOL + case 0x03FE: + return 0x037C; // [C] GREEK CAPITAL DOTTED LUNATE SIGMA SYMBOL + case 0x03FF: + return 0x037D; // [C] GREEK CAPITAL REVERSED DOTTED LUNATE SIGMA SYMBOL + case 0x0400: + return 0x0450; // [C] CYRILLIC CAPITAL LETTER IE WITH GRAVE + case 0x0401: + return 0x0451; // [C] CYRILLIC CAPITAL LETTER IO + case 0x0402: + return 0x0452; // [C] CYRILLIC CAPITAL LETTER DJE + case 0x0403: + return 0x0453; // [C] CYRILLIC CAPITAL LETTER GJE + case 0x0404: + return 0x0454; // [C] CYRILLIC CAPITAL LETTER UKRAINIAN IE + case 0x0405: + return 0x0455; // [C] CYRILLIC CAPITAL LETTER DZE + case 0x0406: + return 0x0456; // [C] CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I + case 0x0407: + return 0x0457; // [C] CYRILLIC CAPITAL LETTER YI + case 0x0408: + return 0x0458; // [C] CYRILLIC CAPITAL LETTER JE + case 0x0409: + return 0x0459; // [C] CYRILLIC CAPITAL LETTER LJE + case 0x040A: + return 0x045A; // [C] CYRILLIC CAPITAL LETTER NJE + case 0x040B: + return 0x045B; // [C] CYRILLIC CAPITAL LETTER TSHE + case 0x040C: + return 0x045C; // [C] CYRILLIC CAPITAL LETTER KJE + case 0x040D: + return 0x045D; // [C] CYRILLIC CAPITAL LETTER I WITH GRAVE + case 0x040E: + return 0x045E; // [C] CYRILLIC CAPITAL LETTER SHORT U + case 0x040F: + return 0x045F; // [C] CYRILLIC CAPITAL LETTER DZHE + case 0x0410: + return 0x0430; // [C] CYRILLIC CAPITAL LETTER A + case 0x0411: + return 0x0431; // [C] CYRILLIC CAPITAL LETTER BE + case 0x0412: + return 0x0432; // [C] CYRILLIC CAPITAL LETTER VE + case 0x0413: + return 0x0433; // [C] CYRILLIC CAPITAL LETTER GHE + case 0x0414: + return 0x0434; // [C] CYRILLIC CAPITAL LETTER DE + case 0x0415: + return 0x0435; // [C] CYRILLIC CAPITAL LETTER IE + case 0x0416: + return 0x0436; // [C] CYRILLIC CAPITAL LETTER ZHE + case 0x0417: + return 0x0437; // [C] CYRILLIC CAPITAL LETTER ZE + case 0x0418: + return 0x0438; // [C] CYRILLIC CAPITAL LETTER I + case 0x0419: + return 0x0439; // [C] CYRILLIC CAPITAL LETTER SHORT I + case 0x041A: + return 0x043A; // [C] CYRILLIC CAPITAL LETTER KA + case 0x041B: + return 0x043B; // [C] CYRILLIC CAPITAL LETTER EL + case 0x041C: + return 0x043C; // [C] CYRILLIC CAPITAL LETTER EM + case 0x041D: + return 0x043D; // [C] CYRILLIC CAPITAL LETTER EN + case 0x041E: + return 0x043E; // [C] CYRILLIC CAPITAL LETTER O + case 0x041F: + return 0x043F; // [C] CYRILLIC CAPITAL LETTER PE + case 0x0420: + return 0x0440; // [C] CYRILLIC CAPITAL LETTER ER + case 0x0421: + return 0x0441; // [C] CYRILLIC CAPITAL LETTER ES + case 0x0422: + return 0x0442; // [C] CYRILLIC CAPITAL LETTER TE + case 0x0423: + return 0x0443; // [C] CYRILLIC CAPITAL LETTER U + case 0x0424: + return 0x0444; // [C] CYRILLIC CAPITAL LETTER EF + case 0x0425: + return 0x0445; // [C] CYRILLIC CAPITAL LETTER HA + case 0x0426: + return 0x0446; // [C] CYRILLIC CAPITAL LETTER TSE + case 0x0427: + return 0x0447; // [C] CYRILLIC CAPITAL LETTER CHE + case 0x0428: + return 0x0448; // [C] CYRILLIC CAPITAL LETTER SHA + case 0x0429: + return 0x0449; // [C] CYRILLIC CAPITAL LETTER SHCHA + case 0x042A: + return 0x044A; // [C] CYRILLIC CAPITAL LETTER HARD SIGN + case 0x042B: + return 0x044B; // [C] CYRILLIC CAPITAL LETTER YERU + case 0x042C: + return 0x044C; // [C] CYRILLIC CAPITAL LETTER SOFT SIGN + case 0x042D: + return 0x044D; // [C] CYRILLIC CAPITAL LETTER E + case 0x042E: + return 0x044E; // [C] CYRILLIC CAPITAL LETTER YU + case 0x042F: + return 0x044F; // [C] CYRILLIC CAPITAL LETTER YA + case 0x0460: + return 0x0461; // [C] CYRILLIC CAPITAL LETTER OMEGA + case 0x0462: + return 0x0463; // [C] CYRILLIC CAPITAL LETTER YAT + case 0x0464: + return 0x0465; // [C] CYRILLIC CAPITAL LETTER IOTIFIED E + case 0x0466: + return 0x0467; // [C] CYRILLIC CAPITAL LETTER LITTLE YUS + case 0x0468: + return 0x0469; // [C] CYRILLIC CAPITAL LETTER IOTIFIED LITTLE YUS + case 0x046A: + return 0x046B; // [C] CYRILLIC CAPITAL LETTER BIG YUS + case 0x046C: + return 0x046D; // [C] CYRILLIC CAPITAL LETTER IOTIFIED BIG YUS + case 0x046E: + return 0x046F; // [C] CYRILLIC CAPITAL LETTER KSI + case 0x0470: + return 0x0471; // [C] CYRILLIC CAPITAL LETTER PSI + case 0x0472: + return 0x0473; // [C] CYRILLIC CAPITAL LETTER FITA + case 0x0474: + return 0x0475; // [C] CYRILLIC CAPITAL LETTER IZHITSA + case 0x0476: + return 0x0477; // [C] CYRILLIC CAPITAL LETTER IZHITSA WITH DOUBLE GRAVE + // ACCENT + case 0x0478: + return 0x0479; // [C] CYRILLIC CAPITAL LETTER UK + case 0x047A: + return 0x047B; // [C] CYRILLIC CAPITAL LETTER ROUND OMEGA + case 0x047C: + return 0x047D; // [C] CYRILLIC CAPITAL LETTER OMEGA WITH TITLO + case 0x047E: + return 0x047F; // [C] CYRILLIC CAPITAL LETTER OT + case 0x0480: + return 0x0481; // [C] CYRILLIC CAPITAL LETTER KOPPA + case 0x048A: + return 0x048B; // [C] CYRILLIC CAPITAL LETTER SHORT I WITH TAIL + case 0x048C: + return 0x048D; // [C] CYRILLIC CAPITAL LETTER SEMISOFT SIGN + case 0x048E: + return 0x048F; // [C] CYRILLIC CAPITAL LETTER ER WITH TICK + case 0x0490: + return 0x0491; // [C] CYRILLIC CAPITAL LETTER GHE WITH UPTURN + case 0x0492: + return 0x0493; // [C] CYRILLIC CAPITAL LETTER GHE WITH STROKE + case 0x0494: + return 0x0495; // [C] CYRILLIC CAPITAL LETTER GHE WITH MIDDLE HOOK + case 0x0496: + return 0x0497; // [C] CYRILLIC CAPITAL LETTER ZHE WITH DESCENDER + case 0x0498: + return 0x0499; // [C] CYRILLIC CAPITAL LETTER ZE WITH DESCENDER + case 0x049A: + return 0x049B; // [C] CYRILLIC CAPITAL LETTER KA WITH DESCENDER + case 0x049C: + return 0x049D; // [C] CYRILLIC CAPITAL LETTER KA WITH VERTICAL STROKE + case 0x049E: + return 0x049F; // [C] CYRILLIC CAPITAL LETTER KA WITH STROKE + case 0x04A0: + return 0x04A1; // [C] CYRILLIC CAPITAL LETTER BASHKIR KA + case 0x04A2: + return 0x04A3; // [C] CYRILLIC CAPITAL LETTER EN WITH DESCENDER + case 0x04A4: + return 0x04A5; // [C] CYRILLIC CAPITAL LIGATURE EN GHE + case 0x04A6: + return 0x04A7; // [C] CYRILLIC CAPITAL LETTER PE WITH MIDDLE HOOK + case 0x04A8: + return 0x04A9; // [C] CYRILLIC CAPITAL LETTER ABKHASIAN HA + case 0x04AA: + return 0x04AB; // [C] CYRILLIC CAPITAL LETTER ES WITH DESCENDER + case 0x04AC: + return 0x04AD; // [C] CYRILLIC CAPITAL LETTER TE WITH DESCENDER + case 0x04AE: + return 0x04AF; // [C] CYRILLIC CAPITAL LETTER STRAIGHT U + case 0x04B0: + return 0x04B1; // [C] CYRILLIC CAPITAL LETTER STRAIGHT U WITH STROKE + case 0x04B2: + return 0x04B3; // [C] CYRILLIC CAPITAL LETTER HA WITH DESCENDER + case 0x04B4: + return 0x04B5; // [C] CYRILLIC CAPITAL LIGATURE TE TSE + case 0x04B6: + return 0x04B7; // [C] CYRILLIC CAPITAL LETTER CHE WITH DESCENDER + case 0x04B8: + return 0x04B9; // [C] CYRILLIC CAPITAL LETTER CHE WITH VERTICAL STROKE + case 0x04BA: + return 0x04BB; // [C] CYRILLIC CAPITAL LETTER SHHA + case 0x04BC: + return 0x04BD; // [C] CYRILLIC CAPITAL LETTER ABKHASIAN CHE + case 0x04BE: + return 0x04BF; // [C] CYRILLIC CAPITAL LETTER ABKHASIAN CHE WITH DESCENDER + case 0x04C0: + return 0x04CF; // [C] CYRILLIC LETTER PALOCHKA + case 0x04C1: + return 0x04C2; // [C] CYRILLIC CAPITAL LETTER ZHE WITH BREVE + case 0x04C3: + return 0x04C4; // [C] CYRILLIC CAPITAL LETTER KA WITH HOOK + case 0x04C5: + return 0x04C6; // [C] CYRILLIC CAPITAL LETTER EL WITH TAIL + case 0x04C7: + return 0x04C8; // [C] CYRILLIC CAPITAL LETTER EN WITH HOOK + case 0x04C9: + return 0x04CA; // [C] CYRILLIC CAPITAL LETTER EN WITH TAIL + case 0x04CB: + return 0x04CC; // [C] CYRILLIC CAPITAL LETTER KHAKASSIAN CHE + case 0x04CD: + return 0x04CE; // [C] CYRILLIC CAPITAL LETTER EM WITH TAIL + case 0x04D0: + return 0x04D1; // [C] CYRILLIC CAPITAL LETTER A WITH BREVE + case 0x04D2: + return 0x04D3; // [C] CYRILLIC CAPITAL LETTER A WITH DIAERESIS + case 0x04D4: + return 0x04D5; // [C] CYRILLIC CAPITAL LIGATURE A IE + case 0x04D6: + return 0x04D7; // [C] CYRILLIC CAPITAL LETTER IE WITH BREVE + case 0x04D8: + return 0x04D9; // [C] CYRILLIC CAPITAL LETTER SCHWA + case 0x04DA: + return 0x04DB; // [C] CYRILLIC CAPITAL LETTER SCHWA WITH DIAERESIS + case 0x04DC: + return 0x04DD; // [C] CYRILLIC CAPITAL LETTER ZHE WITH DIAERESIS + case 0x04DE: + return 0x04DF; // [C] CYRILLIC CAPITAL LETTER ZE WITH DIAERESIS + case 0x04E0: + return 0x04E1; // [C] CYRILLIC CAPITAL LETTER ABKHASIAN DZE + case 0x04E2: + return 0x04E3; // [C] CYRILLIC CAPITAL LETTER I WITH MACRON + case 0x04E4: + return 0x04E5; // [C] CYRILLIC CAPITAL LETTER I WITH DIAERESIS + case 0x04E6: + return 0x04E7; // [C] CYRILLIC CAPITAL LETTER O WITH DIAERESIS + case 0x04E8: + return 0x04E9; // [C] CYRILLIC CAPITAL LETTER BARRED O + case 0x04EA: + return 0x04EB; // [C] CYRILLIC CAPITAL LETTER BARRED O WITH DIAERESIS + case 0x04EC: + return 0x04ED; // [C] CYRILLIC CAPITAL LETTER E WITH DIAERESIS + case 0x04EE: + return 0x04EF; // [C] CYRILLIC CAPITAL LETTER U WITH MACRON + case 0x04F0: + return 0x04F1; // [C] CYRILLIC CAPITAL LETTER U WITH DIAERESIS + case 0x04F2: + return 0x04F3; // [C] CYRILLIC CAPITAL LETTER U WITH DOUBLE ACUTE + case 0x04F4: + return 0x04F5; // [C] CYRILLIC CAPITAL LETTER CHE WITH DIAERESIS + case 0x04F6: + return 0x04F7; // [C] CYRILLIC CAPITAL LETTER GHE WITH DESCENDER + case 0x04F8: + return 0x04F9; // [C] CYRILLIC CAPITAL LETTER YERU WITH DIAERESIS + case 0x04FA: + return 0x04FB; // [C] CYRILLIC CAPITAL LETTER GHE WITH STROKE AND HOOK + case 0x04FC: + return 0x04FD; // [C] CYRILLIC CAPITAL LETTER HA WITH HOOK + case 0x04FE: + return 0x04FF; // [C] CYRILLIC CAPITAL LETTER HA WITH STROKE + case 0x0500: + return 0x0501; // [C] CYRILLIC CAPITAL LETTER KOMI DE + case 0x0502: + return 0x0503; // [C] CYRILLIC CAPITAL LETTER KOMI DJE + case 0x0504: + return 0x0505; // [C] CYRILLIC CAPITAL LETTER KOMI ZJE + case 0x0506: + return 0x0507; // [C] CYRILLIC CAPITAL LETTER KOMI DZJE + case 0x0508: + return 0x0509; // [C] CYRILLIC CAPITAL LETTER KOMI LJE + case 0x050A: + return 0x050B; // [C] CYRILLIC CAPITAL LETTER KOMI NJE + case 0x050C: + return 0x050D; // [C] CYRILLIC CAPITAL LETTER KOMI SJE + case 0x050E: + return 0x050F; // [C] CYRILLIC CAPITAL LETTER KOMI TJE + case 0x0510: + return 0x0511; // [C] CYRILLIC CAPITAL LETTER REVERSED ZE + case 0x0512: + return 0x0513; // [C] CYRILLIC CAPITAL LETTER EL WITH HOOK + case 0x0514: + return 0x0515; // [C] CYRILLIC CAPITAL LETTER LHA + case 0x0516: + return 0x0517; // [C] CYRILLIC CAPITAL LETTER RHA + case 0x0518: + return 0x0519; // [C] CYRILLIC CAPITAL LETTER YAE + case 0x051A: + return 0x051B; // [C] CYRILLIC CAPITAL LETTER QA + case 0x051C: + return 0x051D; // [C] CYRILLIC CAPITAL LETTER WE + case 0x051E: + return 0x051F; // [C] CYRILLIC CAPITAL LETTER ALEUT KA + case 0x0520: + return 0x0521; // [C] CYRILLIC CAPITAL LETTER EL WITH MIDDLE HOOK + case 0x0522: + return 0x0523; // [C] CYRILLIC CAPITAL LETTER EN WITH MIDDLE HOOK + case 0x0524: + return 0x0525; // [C] CYRILLIC CAPITAL LETTER PE WITH DESCENDER + case 0x0526: + return 0x0527; // [C] CYRILLIC CAPITAL LETTER SHHA WITH DESCENDER + case 0x0528: + return 0x0529; // [C] CYRILLIC CAPITAL LETTER EN WITH LEFT HOOK + case 0x052A: + return 0x052B; // [C] CYRILLIC CAPITAL LETTER DZZHE + case 0x052C: + return 0x052D; // [C] CYRILLIC CAPITAL LETTER DCHE + case 0x052E: + return 0x052F; // [C] CYRILLIC CAPITAL LETTER EL WITH DESCENDER + case 0x0531: + return 0x0561; // [C] ARMENIAN CAPITAL LETTER AYB + case 0x0532: + return 0x0562; // [C] ARMENIAN CAPITAL LETTER BEN + case 0x0533: + return 0x0563; // [C] ARMENIAN CAPITAL LETTER GIM + case 0x0534: + return 0x0564; // [C] ARMENIAN CAPITAL LETTER DA + case 0x0535: + return 0x0565; // [C] ARMENIAN CAPITAL LETTER ECH + case 0x0536: + return 0x0566; // [C] ARMENIAN CAPITAL LETTER ZA + case 0x0537: + return 0x0567; // [C] ARMENIAN CAPITAL LETTER EH + case 0x0538: + return 0x0568; // [C] ARMENIAN CAPITAL LETTER ET + case 0x0539: + return 0x0569; // [C] ARMENIAN CAPITAL LETTER TO + case 0x053A: + return 0x056A; // [C] ARMENIAN CAPITAL LETTER ZHE + case 0x053B: + return 0x056B; // [C] ARMENIAN CAPITAL LETTER INI + case 0x053C: + return 0x056C; // [C] ARMENIAN CAPITAL LETTER LIWN + case 0x053D: + return 0x056D; // [C] ARMENIAN CAPITAL LETTER XEH + case 0x053E: + return 0x056E; // [C] ARMENIAN CAPITAL LETTER CA + case 0x053F: + return 0x056F; // [C] ARMENIAN CAPITAL LETTER KEN + case 0x0540: + return 0x0570; // [C] ARMENIAN CAPITAL LETTER HO + case 0x0541: + return 0x0571; // [C] ARMENIAN CAPITAL LETTER JA + case 0x0542: + return 0x0572; // [C] ARMENIAN CAPITAL LETTER GHAD + case 0x0543: + return 0x0573; // [C] ARMENIAN CAPITAL LETTER CHEH + case 0x0544: + return 0x0574; // [C] ARMENIAN CAPITAL LETTER MEN + case 0x0545: + return 0x0575; // [C] ARMENIAN CAPITAL LETTER YI + case 0x0546: + return 0x0576; // [C] ARMENIAN CAPITAL LETTER NOW + case 0x0547: + return 0x0577; // [C] ARMENIAN CAPITAL LETTER SHA + case 0x0548: + return 0x0578; // [C] ARMENIAN CAPITAL LETTER VO + case 0x0549: + return 0x0579; // [C] ARMENIAN CAPITAL LETTER CHA + case 0x054A: + return 0x057A; // [C] ARMENIAN CAPITAL LETTER PEH + case 0x054B: + return 0x057B; // [C] ARMENIAN CAPITAL LETTER JHEH + case 0x054C: + return 0x057C; // [C] ARMENIAN CAPITAL LETTER RA + case 0x054D: + return 0x057D; // [C] ARMENIAN CAPITAL LETTER SEH + case 0x054E: + return 0x057E; // [C] ARMENIAN CAPITAL LETTER VEW + case 0x054F: + return 0x057F; // [C] ARMENIAN CAPITAL LETTER TIWN + case 0x0550: + return 0x0580; // [C] ARMENIAN CAPITAL LETTER REH + case 0x0551: + return 0x0581; // [C] ARMENIAN CAPITAL LETTER CO + case 0x0552: + return 0x0582; // [C] ARMENIAN CAPITAL LETTER YIWN + case 0x0553: + return 0x0583; // [C] ARMENIAN CAPITAL LETTER PIWR + case 0x0554: + return 0x0584; // [C] ARMENIAN CAPITAL LETTER KEH + case 0x0555: + return 0x0585; // [C] ARMENIAN CAPITAL LETTER OH + case 0x0556: + return 0x0586; // [C] ARMENIAN CAPITAL LETTER FEH + case 0x10A0: + return 0x2D00; // [C] GEORGIAN CAPITAL LETTER AN + case 0x10A1: + return 0x2D01; // [C] GEORGIAN CAPITAL LETTER BAN + case 0x10A2: + return 0x2D02; // [C] GEORGIAN CAPITAL LETTER GAN + case 0x10A3: + return 0x2D03; // [C] GEORGIAN CAPITAL LETTER DON + case 0x10A4: + return 0x2D04; // [C] GEORGIAN CAPITAL LETTER EN + case 0x10A5: + return 0x2D05; // [C] GEORGIAN CAPITAL LETTER VIN + case 0x10A6: + return 0x2D06; // [C] GEORGIAN CAPITAL LETTER ZEN + case 0x10A7: + return 0x2D07; // [C] GEORGIAN CAPITAL LETTER TAN + case 0x10A8: + return 0x2D08; // [C] GEORGIAN CAPITAL LETTER IN + case 0x10A9: + return 0x2D09; // [C] GEORGIAN CAPITAL LETTER KAN + case 0x10AA: + return 0x2D0A; // [C] GEORGIAN CAPITAL LETTER LAS + case 0x10AB: + return 0x2D0B; // [C] GEORGIAN CAPITAL LETTER MAN + case 0x10AC: + return 0x2D0C; // [C] GEORGIAN CAPITAL LETTER NAR + case 0x10AD: + return 0x2D0D; // [C] GEORGIAN CAPITAL LETTER ON + case 0x10AE: + return 0x2D0E; // [C] GEORGIAN CAPITAL LETTER PAR + case 0x10AF: + return 0x2D0F; // [C] GEORGIAN CAPITAL LETTER ZHAR + case 0x10B0: + return 0x2D10; // [C] GEORGIAN CAPITAL LETTER RAE + case 0x10B1: + return 0x2D11; // [C] GEORGIAN CAPITAL LETTER SAN + case 0x10B2: + return 0x2D12; // [C] GEORGIAN CAPITAL LETTER TAR + case 0x10B3: + return 0x2D13; // [C] GEORGIAN CAPITAL LETTER UN + case 0x10B4: + return 0x2D14; // [C] GEORGIAN CAPITAL LETTER PHAR + case 0x10B5: + return 0x2D15; // [C] GEORGIAN CAPITAL LETTER KHAR + case 0x10B6: + return 0x2D16; // [C] GEORGIAN CAPITAL LETTER GHAN + case 0x10B7: + return 0x2D17; // [C] GEORGIAN CAPITAL LETTER QAR + case 0x10B8: + return 0x2D18; // [C] GEORGIAN CAPITAL LETTER SHIN + case 0x10B9: + return 0x2D19; // [C] GEORGIAN CAPITAL LETTER CHIN + case 0x10BA: + return 0x2D1A; // [C] GEORGIAN CAPITAL LETTER CAN + case 0x10BB: + return 0x2D1B; // [C] GEORGIAN CAPITAL LETTER JIL + case 0x10BC: + return 0x2D1C; // [C] GEORGIAN CAPITAL LETTER CIL + case 0x10BD: + return 0x2D1D; // [C] GEORGIAN CAPITAL LETTER CHAR + case 0x10BE: + return 0x2D1E; // [C] GEORGIAN CAPITAL LETTER XAN + case 0x10BF: + return 0x2D1F; // [C] GEORGIAN CAPITAL LETTER JHAN + case 0x10C0: + return 0x2D20; // [C] GEORGIAN CAPITAL LETTER HAE + case 0x10C1: + return 0x2D21; // [C] GEORGIAN CAPITAL LETTER HE + case 0x10C2: + return 0x2D22; // [C] GEORGIAN CAPITAL LETTER HIE + case 0x10C3: + return 0x2D23; // [C] GEORGIAN CAPITAL LETTER WE + case 0x10C4: + return 0x2D24; // [C] GEORGIAN CAPITAL LETTER HAR + case 0x10C5: + return 0x2D25; // [C] GEORGIAN CAPITAL LETTER HOE + case 0x10C7: + return 0x2D27; // [C] GEORGIAN CAPITAL LETTER YN + case 0x10CD: + return 0x2D2D; // [C] GEORGIAN CAPITAL LETTER AEN + case 0x13F8: + return 0x13F0; // [C] CHEROKEE SMALL LETTER YE + case 0x13F9: + return 0x13F1; // [C] CHEROKEE SMALL LETTER YI + case 0x13FA: + return 0x13F2; // [C] CHEROKEE SMALL LETTER YO + case 0x13FB: + return 0x13F3; // [C] CHEROKEE SMALL LETTER YU + case 0x13FC: + return 0x13F4; // [C] CHEROKEE SMALL LETTER YV + case 0x13FD: + return 0x13F5; // [C] CHEROKEE SMALL LETTER MV + case 0x1C80: + return 0x0432; // [C] CYRILLIC SMALL LETTER ROUNDED VE + case 0x1C81: + return 0x0434; // [C] CYRILLIC SMALL LETTER LONG-LEGGED DE + case 0x1C82: + return 0x043E; // [C] CYRILLIC SMALL LETTER NARROW O + case 0x1C83: + return 0x0441; // [C] CYRILLIC SMALL LETTER WIDE ES + case 0x1C84: + return 0x0442; // [C] CYRILLIC SMALL LETTER TALL TE + case 0x1C85: + return 0x0442; // [C] CYRILLIC SMALL LETTER THREE-LEGGED TE + case 0x1C86: + return 0x044A; // [C] CYRILLIC SMALL LETTER TALL HARD SIGN + case 0x1C87: + return 0x0463; // [C] CYRILLIC SMALL LETTER TALL YAT + case 0x1C88: + return 0xA64B; // [C] CYRILLIC SMALL LETTER UNBLENDED UK + case 0x1C89: + return 0x1C8A; // [C] CYRILLIC CAPITAL LETTER TJE + case 0x1C90: + return 0x10D0; // [C] GEORGIAN MTAVRULI CAPITAL LETTER AN + case 0x1C91: + return 0x10D1; // [C] GEORGIAN MTAVRULI CAPITAL LETTER BAN + case 0x1C92: + return 0x10D2; // [C] GEORGIAN MTAVRULI CAPITAL LETTER GAN + case 0x1C93: + return 0x10D3; // [C] GEORGIAN MTAVRULI CAPITAL LETTER DON + case 0x1C94: + return 0x10D4; // [C] GEORGIAN MTAVRULI CAPITAL LETTER EN + case 0x1C95: + return 0x10D5; // [C] GEORGIAN MTAVRULI CAPITAL LETTER VIN + case 0x1C96: + return 0x10D6; // [C] GEORGIAN MTAVRULI CAPITAL LETTER ZEN + case 0x1C97: + return 0x10D7; // [C] GEORGIAN MTAVRULI CAPITAL LETTER TAN + case 0x1C98: + return 0x10D8; // [C] GEORGIAN MTAVRULI CAPITAL LETTER IN + case 0x1C99: + return 0x10D9; // [C] GEORGIAN MTAVRULI CAPITAL LETTER KAN + case 0x1C9A: + return 0x10DA; // [C] GEORGIAN MTAVRULI CAPITAL LETTER LAS + case 0x1C9B: + return 0x10DB; // [C] GEORGIAN MTAVRULI CAPITAL LETTER MAN + case 0x1C9C: + return 0x10DC; // [C] GEORGIAN MTAVRULI CAPITAL LETTER NAR + case 0x1C9D: + return 0x10DD; // [C] GEORGIAN MTAVRULI CAPITAL LETTER ON + case 0x1C9E: + return 0x10DE; // [C] GEORGIAN MTAVRULI CAPITAL LETTER PAR + case 0x1C9F: + return 0x10DF; // [C] GEORGIAN MTAVRULI CAPITAL LETTER ZHAR + case 0x1CA0: + return 0x10E0; // [C] GEORGIAN MTAVRULI CAPITAL LETTER RAE + case 0x1CA1: + return 0x10E1; // [C] GEORGIAN MTAVRULI CAPITAL LETTER SAN + case 0x1CA2: + return 0x10E2; // [C] GEORGIAN MTAVRULI CAPITAL LETTER TAR + case 0x1CA3: + return 0x10E3; // [C] GEORGIAN MTAVRULI CAPITAL LETTER UN + case 0x1CA4: + return 0x10E4; // [C] GEORGIAN MTAVRULI CAPITAL LETTER PHAR + case 0x1CA5: + return 0x10E5; // [C] GEORGIAN MTAVRULI CAPITAL LETTER KHAR + case 0x1CA6: + return 0x10E6; // [C] GEORGIAN MTAVRULI CAPITAL LETTER GHAN + case 0x1CA7: + return 0x10E7; // [C] GEORGIAN MTAVRULI CAPITAL LETTER QAR + case 0x1CA8: + return 0x10E8; // [C] GEORGIAN MTAVRULI CAPITAL LETTER SHIN + case 0x1CA9: + return 0x10E9; // [C] GEORGIAN MTAVRULI CAPITAL LETTER CHIN + case 0x1CAA: + return 0x10EA; // [C] GEORGIAN MTAVRULI CAPITAL LETTER CAN + case 0x1CAB: + return 0x10EB; // [C] GEORGIAN MTAVRULI CAPITAL LETTER JIL + case 0x1CAC: + return 0x10EC; // [C] GEORGIAN MTAVRULI CAPITAL LETTER CIL + case 0x1CAD: + return 0x10ED; // [C] GEORGIAN MTAVRULI CAPITAL LETTER CHAR + case 0x1CAE: + return 0x10EE; // [C] GEORGIAN MTAVRULI CAPITAL LETTER XAN + case 0x1CAF: + return 0x10EF; // [C] GEORGIAN MTAVRULI CAPITAL LETTER JHAN + case 0x1CB0: + return 0x10F0; // [C] GEORGIAN MTAVRULI CAPITAL LETTER HAE + case 0x1CB1: + return 0x10F1; // [C] GEORGIAN MTAVRULI CAPITAL LETTER HE + case 0x1CB2: + return 0x10F2; // [C] GEORGIAN MTAVRULI CAPITAL LETTER HIE + case 0x1CB3: + return 0x10F3; // [C] GEORGIAN MTAVRULI CAPITAL LETTER WE + case 0x1CB4: + return 0x10F4; // [C] GEORGIAN MTAVRULI CAPITAL LETTER HAR + case 0x1CB5: + return 0x10F5; // [C] GEORGIAN MTAVRULI CAPITAL LETTER HOE + case 0x1CB6: + return 0x10F6; // [C] GEORGIAN MTAVRULI CAPITAL LETTER FI + case 0x1CB7: + return 0x10F7; // [C] GEORGIAN MTAVRULI CAPITAL LETTER YN + case 0x1CB8: + return 0x10F8; // [C] GEORGIAN MTAVRULI CAPITAL LETTER ELIFI + case 0x1CB9: + return 0x10F9; // [C] GEORGIAN MTAVRULI CAPITAL LETTER TURNED GAN + case 0x1CBA: + return 0x10FA; // [C] GEORGIAN MTAVRULI CAPITAL LETTER AIN + case 0x1CBD: + return 0x10FD; // [C] GEORGIAN MTAVRULI CAPITAL LETTER AEN + case 0x1CBE: + return 0x10FE; // [C] GEORGIAN MTAVRULI CAPITAL LETTER HARD SIGN + case 0x1CBF: + return 0x10FF; // [C] GEORGIAN MTAVRULI CAPITAL LETTER LABIAL SIGN + case 0x1E00: + return 0x1E01; // [C] LATIN CAPITAL LETTER A WITH RING BELOW + case 0x1E02: + return 0x1E03; // [C] LATIN CAPITAL LETTER B WITH DOT ABOVE + case 0x1E04: + return 0x1E05; // [C] LATIN CAPITAL LETTER B WITH DOT BELOW + case 0x1E06: + return 0x1E07; // [C] LATIN CAPITAL LETTER B WITH LINE BELOW + case 0x1E08: + return 0x1E09; // [C] LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE + case 0x1E0A: + return 0x1E0B; // [C] LATIN CAPITAL LETTER D WITH DOT ABOVE + case 0x1E0C: + return 0x1E0D; // [C] LATIN CAPITAL LETTER D WITH DOT BELOW + case 0x1E0E: + return 0x1E0F; // [C] LATIN CAPITAL LETTER D WITH LINE BELOW + case 0x1E10: + return 0x1E11; // [C] LATIN CAPITAL LETTER D WITH CEDILLA + case 0x1E12: + return 0x1E13; // [C] LATIN CAPITAL LETTER D WITH CIRCUMFLEX BELOW + case 0x1E14: + return 0x1E15; // [C] LATIN CAPITAL LETTER E WITH MACRON AND GRAVE + case 0x1E16: + return 0x1E17; // [C] LATIN CAPITAL LETTER E WITH MACRON AND ACUTE + case 0x1E18: + return 0x1E19; // [C] LATIN CAPITAL LETTER E WITH CIRCUMFLEX BELOW + case 0x1E1A: + return 0x1E1B; // [C] LATIN CAPITAL LETTER E WITH TILDE BELOW + case 0x1E1C: + return 0x1E1D; // [C] LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE + case 0x1E1E: + return 0x1E1F; // [C] LATIN CAPITAL LETTER F WITH DOT ABOVE + case 0x1E20: + return 0x1E21; // [C] LATIN CAPITAL LETTER G WITH MACRON + case 0x1E22: + return 0x1E23; // [C] LATIN CAPITAL LETTER H WITH DOT ABOVE + case 0x1E24: + return 0x1E25; // [C] LATIN CAPITAL LETTER H WITH DOT BELOW + case 0x1E26: + return 0x1E27; // [C] LATIN CAPITAL LETTER H WITH DIAERESIS + case 0x1E28: + return 0x1E29; // [C] LATIN CAPITAL LETTER H WITH CEDILLA + case 0x1E2A: + return 0x1E2B; // [C] LATIN CAPITAL LETTER H WITH BREVE BELOW + case 0x1E2C: + return 0x1E2D; // [C] LATIN CAPITAL LETTER I WITH TILDE BELOW + case 0x1E2E: + return 0x1E2F; // [C] LATIN CAPITAL LETTER I WITH DIAERESIS AND ACUTE + case 0x1E30: + return 0x1E31; // [C] LATIN CAPITAL LETTER K WITH ACUTE + case 0x1E32: + return 0x1E33; // [C] LATIN CAPITAL LETTER K WITH DOT BELOW + case 0x1E34: + return 0x1E35; // [C] LATIN CAPITAL LETTER K WITH LINE BELOW + case 0x1E36: + return 0x1E37; // [C] LATIN CAPITAL LETTER L WITH DOT BELOW + case 0x1E38: + return 0x1E39; // [C] LATIN CAPITAL LETTER L WITH DOT BELOW AND MACRON + case 0x1E3A: + return 0x1E3B; // [C] LATIN CAPITAL LETTER L WITH LINE BELOW + case 0x1E3C: + return 0x1E3D; // [C] LATIN CAPITAL LETTER L WITH CIRCUMFLEX BELOW + case 0x1E3E: + return 0x1E3F; // [C] LATIN CAPITAL LETTER M WITH ACUTE + case 0x1E40: + return 0x1E41; // [C] LATIN CAPITAL LETTER M WITH DOT ABOVE + case 0x1E42: + return 0x1E43; // [C] LATIN CAPITAL LETTER M WITH DOT BELOW + case 0x1E44: + return 0x1E45; // [C] LATIN CAPITAL LETTER N WITH DOT ABOVE + case 0x1E46: + return 0x1E47; // [C] LATIN CAPITAL LETTER N WITH DOT BELOW + case 0x1E48: + return 0x1E49; // [C] LATIN CAPITAL LETTER N WITH LINE BELOW + case 0x1E4A: + return 0x1E4B; // [C] LATIN CAPITAL LETTER N WITH CIRCUMFLEX BELOW + case 0x1E4C: + return 0x1E4D; // [C] LATIN CAPITAL LETTER O WITH TILDE AND ACUTE + case 0x1E4E: + return 0x1E4F; // [C] LATIN CAPITAL LETTER O WITH TILDE AND DIAERESIS + case 0x1E50: + return 0x1E51; // [C] LATIN CAPITAL LETTER O WITH MACRON AND GRAVE + case 0x1E52: + return 0x1E53; // [C] LATIN CAPITAL LETTER O WITH MACRON AND ACUTE + case 0x1E54: + return 0x1E55; // [C] LATIN CAPITAL LETTER P WITH ACUTE + case 0x1E56: + return 0x1E57; // [C] LATIN CAPITAL LETTER P WITH DOT ABOVE + case 0x1E58: + return 0x1E59; // [C] LATIN CAPITAL LETTER R WITH DOT ABOVE + case 0x1E5A: + return 0x1E5B; // [C] LATIN CAPITAL LETTER R WITH DOT BELOW + case 0x1E5C: + return 0x1E5D; // [C] LATIN CAPITAL LETTER R WITH DOT BELOW AND MACRON + case 0x1E5E: + return 0x1E5F; // [C] LATIN CAPITAL LETTER R WITH LINE BELOW + case 0x1E60: + return 0x1E61; // [C] LATIN CAPITAL LETTER S WITH DOT ABOVE + case 0x1E62: + return 0x1E63; // [C] LATIN CAPITAL LETTER S WITH DOT BELOW + case 0x1E64: + return 0x1E65; // [C] LATIN CAPITAL LETTER S WITH ACUTE AND DOT ABOVE + case 0x1E66: + return 0x1E67; // [C] LATIN CAPITAL LETTER S WITH CARON AND DOT ABOVE + case 0x1E68: + return 0x1E69; // [C] LATIN CAPITAL LETTER S WITH DOT BELOW AND DOT ABOVE + case 0x1E6A: + return 0x1E6B; // [C] LATIN CAPITAL LETTER T WITH DOT ABOVE + case 0x1E6C: + return 0x1E6D; // [C] LATIN CAPITAL LETTER T WITH DOT BELOW + case 0x1E6E: + return 0x1E6F; // [C] LATIN CAPITAL LETTER T WITH LINE BELOW + case 0x1E70: + return 0x1E71; // [C] LATIN CAPITAL LETTER T WITH CIRCUMFLEX BELOW + case 0x1E72: + return 0x1E73; // [C] LATIN CAPITAL LETTER U WITH DIAERESIS BELOW + case 0x1E74: + return 0x1E75; // [C] LATIN CAPITAL LETTER U WITH TILDE BELOW + case 0x1E76: + return 0x1E77; // [C] LATIN CAPITAL LETTER U WITH CIRCUMFLEX BELOW + case 0x1E78: + return 0x1E79; // [C] LATIN CAPITAL LETTER U WITH TILDE AND ACUTE + case 0x1E7A: + return 0x1E7B; // [C] LATIN CAPITAL LETTER U WITH MACRON AND DIAERESIS + case 0x1E7C: + return 0x1E7D; // [C] LATIN CAPITAL LETTER V WITH TILDE + case 0x1E7E: + return 0x1E7F; // [C] LATIN CAPITAL LETTER V WITH DOT BELOW + case 0x1E80: + return 0x1E81; // [C] LATIN CAPITAL LETTER W WITH GRAVE + case 0x1E82: + return 0x1E83; // [C] LATIN CAPITAL LETTER W WITH ACUTE + case 0x1E84: + return 0x1E85; // [C] LATIN CAPITAL LETTER W WITH DIAERESIS + case 0x1E86: + return 0x1E87; // [C] LATIN CAPITAL LETTER W WITH DOT ABOVE + case 0x1E88: + return 0x1E89; // [C] LATIN CAPITAL LETTER W WITH DOT BELOW + case 0x1E8A: + return 0x1E8B; // [C] LATIN CAPITAL LETTER X WITH DOT ABOVE + case 0x1E8C: + return 0x1E8D; // [C] LATIN CAPITAL LETTER X WITH DIAERESIS + case 0x1E8E: + return 0x1E8F; // [C] LATIN CAPITAL LETTER Y WITH DOT ABOVE + case 0x1E90: + return 0x1E91; // [C] LATIN CAPITAL LETTER Z WITH CIRCUMFLEX + case 0x1E92: + return 0x1E93; // [C] LATIN CAPITAL LETTER Z WITH DOT BELOW + case 0x1E94: + return 0x1E95; // [C] LATIN CAPITAL LETTER Z WITH LINE BELOW + case 0x1E9B: + return 0x1E61; // [C] LATIN SMALL LETTER LONG S WITH DOT ABOVE + case 0x1E9E: + return 0x00DF; // [S] LATIN CAPITAL LETTER SHARP S + case 0x1EA0: + return 0x1EA1; // [C] LATIN CAPITAL LETTER A WITH DOT BELOW + case 0x1EA2: + return 0x1EA3; // [C] LATIN CAPITAL LETTER A WITH HOOK ABOVE + case 0x1EA4: + return 0x1EA5; // [C] LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE + case 0x1EA6: + return 0x1EA7; // [C] LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE + case 0x1EA8: + return 0x1EA9; // [C] LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE + case 0x1EAA: + return 0x1EAB; // [C] LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE + case 0x1EAC: + return 0x1EAD; // [C] LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW + case 0x1EAE: + return 0x1EAF; // [C] LATIN CAPITAL LETTER A WITH BREVE AND ACUTE + case 0x1EB0: + return 0x1EB1; // [C] LATIN CAPITAL LETTER A WITH BREVE AND GRAVE + case 0x1EB2: + return 0x1EB3; // [C] LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE + case 0x1EB4: + return 0x1EB5; // [C] LATIN CAPITAL LETTER A WITH BREVE AND TILDE + case 0x1EB6: + return 0x1EB7; // [C] LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW + case 0x1EB8: + return 0x1EB9; // [C] LATIN CAPITAL LETTER E WITH DOT BELOW + case 0x1EBA: + return 0x1EBB; // [C] LATIN CAPITAL LETTER E WITH HOOK ABOVE + case 0x1EBC: + return 0x1EBD; // [C] LATIN CAPITAL LETTER E WITH TILDE + case 0x1EBE: + return 0x1EBF; // [C] LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE + case 0x1EC0: + return 0x1EC1; // [C] LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE + case 0x1EC2: + return 0x1EC3; // [C] LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE + case 0x1EC4: + return 0x1EC5; // [C] LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE + case 0x1EC6: + return 0x1EC7; // [C] LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW + case 0x1EC8: + return 0x1EC9; // [C] LATIN CAPITAL LETTER I WITH HOOK ABOVE + case 0x1ECA: + return 0x1ECB; // [C] LATIN CAPITAL LETTER I WITH DOT BELOW + case 0x1ECC: + return 0x1ECD; // [C] LATIN CAPITAL LETTER O WITH DOT BELOW + case 0x1ECE: + return 0x1ECF; // [C] LATIN CAPITAL LETTER O WITH HOOK ABOVE + case 0x1ED0: + return 0x1ED1; // [C] LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE + case 0x1ED2: + return 0x1ED3; // [C] LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE + case 0x1ED4: + return 0x1ED5; // [C] LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE + case 0x1ED6: + return 0x1ED7; // [C] LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE + case 0x1ED8: + return 0x1ED9; // [C] LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW + case 0x1EDA: + return 0x1EDB; // [C] LATIN CAPITAL LETTER O WITH HORN AND ACUTE + case 0x1EDC: + return 0x1EDD; // [C] LATIN CAPITAL LETTER O WITH HORN AND GRAVE + case 0x1EDE: + return 0x1EDF; // [C] LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE + case 0x1EE0: + return 0x1EE1; // [C] LATIN CAPITAL LETTER O WITH HORN AND TILDE + case 0x1EE2: + return 0x1EE3; // [C] LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW + case 0x1EE4: + return 0x1EE5; // [C] LATIN CAPITAL LETTER U WITH DOT BELOW + case 0x1EE6: + return 0x1EE7; // [C] LATIN CAPITAL LETTER U WITH HOOK ABOVE + case 0x1EE8: + return 0x1EE9; // [C] LATIN CAPITAL LETTER U WITH HORN AND ACUTE + case 0x1EEA: + return 0x1EEB; // [C] LATIN CAPITAL LETTER U WITH HORN AND GRAVE + case 0x1EEC: + return 0x1EED; // [C] LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE + case 0x1EEE: + return 0x1EEF; // [C] LATIN CAPITAL LETTER U WITH HORN AND TILDE + case 0x1EF0: + return 0x1EF1; // [C] LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW + case 0x1EF2: + return 0x1EF3; // [C] LATIN CAPITAL LETTER Y WITH GRAVE + case 0x1EF4: + return 0x1EF5; // [C] LATIN CAPITAL LETTER Y WITH DOT BELOW + case 0x1EF6: + return 0x1EF7; // [C] LATIN CAPITAL LETTER Y WITH HOOK ABOVE + case 0x1EF8: + return 0x1EF9; // [C] LATIN CAPITAL LETTER Y WITH TILDE + case 0x1EFA: + return 0x1EFB; // [C] LATIN CAPITAL LETTER MIDDLE-WELSH LL + case 0x1EFC: + return 0x1EFD; // [C] LATIN CAPITAL LETTER MIDDLE-WELSH V + case 0x1EFE: + return 0x1EFF; // [C] LATIN CAPITAL LETTER Y WITH LOOP + case 0x1F08: + return 0x1F00; // [C] GREEK CAPITAL LETTER ALPHA WITH PSILI + case 0x1F09: + return 0x1F01; // [C] GREEK CAPITAL LETTER ALPHA WITH DASIA + case 0x1F0A: + return 0x1F02; // [C] GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA + case 0x1F0B: + return 0x1F03; // [C] GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA + case 0x1F0C: + return 0x1F04; // [C] GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA + case 0x1F0D: + return 0x1F05; // [C] GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA + case 0x1F0E: + return 0x1F06; // [C] GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI + case 0x1F0F: + return 0x1F07; // [C] GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI + case 0x1F18: + return 0x1F10; // [C] GREEK CAPITAL LETTER EPSILON WITH PSILI + case 0x1F19: + return 0x1F11; // [C] GREEK CAPITAL LETTER EPSILON WITH DASIA + case 0x1F1A: + return 0x1F12; // [C] GREEK CAPITAL LETTER EPSILON WITH PSILI AND VARIA + case 0x1F1B: + return 0x1F13; // [C] GREEK CAPITAL LETTER EPSILON WITH DASIA AND VARIA + case 0x1F1C: + return 0x1F14; // [C] GREEK CAPITAL LETTER EPSILON WITH PSILI AND OXIA + case 0x1F1D: + return 0x1F15; // [C] GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA + case 0x1F28: + return 0x1F20; // [C] GREEK CAPITAL LETTER ETA WITH PSILI + case 0x1F29: + return 0x1F21; // [C] GREEK CAPITAL LETTER ETA WITH DASIA + case 0x1F2A: + return 0x1F22; // [C] GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA + case 0x1F2B: + return 0x1F23; // [C] GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA + case 0x1F2C: + return 0x1F24; // [C] GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA + case 0x1F2D: + return 0x1F25; // [C] GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA + case 0x1F2E: + return 0x1F26; // [C] GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI + case 0x1F2F: + return 0x1F27; // [C] GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI + case 0x1F38: + return 0x1F30; // [C] GREEK CAPITAL LETTER IOTA WITH PSILI + case 0x1F39: + return 0x1F31; // [C] GREEK CAPITAL LETTER IOTA WITH DASIA + case 0x1F3A: + return 0x1F32; // [C] GREEK CAPITAL LETTER IOTA WITH PSILI AND VARIA + case 0x1F3B: + return 0x1F33; // [C] GREEK CAPITAL LETTER IOTA WITH DASIA AND VARIA + case 0x1F3C: + return 0x1F34; // [C] GREEK CAPITAL LETTER IOTA WITH PSILI AND OXIA + case 0x1F3D: + return 0x1F35; // [C] GREEK CAPITAL LETTER IOTA WITH DASIA AND OXIA + case 0x1F3E: + return 0x1F36; // [C] GREEK CAPITAL LETTER IOTA WITH PSILI AND PERISPOMENI + case 0x1F3F: + return 0x1F37; // [C] GREEK CAPITAL LETTER IOTA WITH DASIA AND PERISPOMENI + case 0x1F48: + return 0x1F40; // [C] GREEK CAPITAL LETTER OMICRON WITH PSILI + case 0x1F49: + return 0x1F41; // [C] GREEK CAPITAL LETTER OMICRON WITH DASIA + case 0x1F4A: + return 0x1F42; // [C] GREEK CAPITAL LETTER OMICRON WITH PSILI AND VARIA + case 0x1F4B: + return 0x1F43; // [C] GREEK CAPITAL LETTER OMICRON WITH DASIA AND VARIA + case 0x1F4C: + return 0x1F44; // [C] GREEK CAPITAL LETTER OMICRON WITH PSILI AND OXIA + case 0x1F4D: + return 0x1F45; // [C] GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA + case 0x1F59: + return 0x1F51; // [C] GREEK CAPITAL LETTER UPSILON WITH DASIA + case 0x1F5B: + return 0x1F53; // [C] GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA + case 0x1F5D: + return 0x1F55; // [C] GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA + case 0x1F5F: + return 0x1F57; // [C] GREEK CAPITAL LETTER UPSILON WITH DASIA AND + // PERISPOMENI + case 0x1F68: + return 0x1F60; // [C] GREEK CAPITAL LETTER OMEGA WITH PSILI + case 0x1F69: + return 0x1F61; // [C] GREEK CAPITAL LETTER OMEGA WITH DASIA + case 0x1F6A: + return 0x1F62; // [C] GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA + case 0x1F6B: + return 0x1F63; // [C] GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA + case 0x1F6C: + return 0x1F64; // [C] GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA + case 0x1F6D: + return 0x1F65; // [C] GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA + case 0x1F6E: + return 0x1F66; // [C] GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI + case 0x1F6F: + return 0x1F67; // [C] GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI + case 0x1F88: + return 0x1F80; // [S] GREEK CAPITAL LETTER ALPHA WITH PSILI AND + // PROSGEGRAMMENI + case 0x1F89: + return 0x1F81; // [S] GREEK CAPITAL LETTER ALPHA WITH DASIA AND + // PROSGEGRAMMENI + case 0x1F8A: + return 0x1F82; // [S] GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND + // PROSGEGRAMMENI + case 0x1F8B: + return 0x1F83; // [S] GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND + // PROSGEGRAMMENI + case 0x1F8C: + return 0x1F84; // [S] GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND + // PROSGEGRAMMENI + case 0x1F8D: + return 0x1F85; // [S] GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND + // PROSGEGRAMMENI + case 0x1F8E: + return 0x1F86; // [S] GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI + // AND PROSGEGRAMMENI + case 0x1F8F: + return 0x1F87; // [S] GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI + // AND PROSGEGRAMMENI + case 0x1F98: + return 0x1F90; // [S] GREEK CAPITAL LETTER ETA WITH PSILI AND PROSGEGRAMMENI + case 0x1F99: + return 0x1F91; // [S] GREEK CAPITAL LETTER ETA WITH DASIA AND PROSGEGRAMMENI + case 0x1F9A: + return 0x1F92; // [S] GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND + // PROSGEGRAMMENI + case 0x1F9B: + return 0x1F93; // [S] GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND + // PROSGEGRAMMENI + case 0x1F9C: + return 0x1F94; // [S] GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND + // PROSGEGRAMMENI + case 0x1F9D: + return 0x1F95; // [S] GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND + // PROSGEGRAMMENI + case 0x1F9E: + return 0x1F96; // [S] GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI + // AND PROSGEGRAMMENI + case 0x1F9F: + return 0x1F97; // [S] GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI + // AND PROSGEGRAMMENI + case 0x1FA8: + return 0x1FA0; // [S] GREEK CAPITAL LETTER OMEGA WITH PSILI AND + // PROSGEGRAMMENI + case 0x1FA9: + return 0x1FA1; // [S] GREEK CAPITAL LETTER OMEGA WITH DASIA AND + // PROSGEGRAMMENI + case 0x1FAA: + return 0x1FA2; // [S] GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND + // PROSGEGRAMMENI + case 0x1FAB: + return 0x1FA3; // [S] GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND + // PROSGEGRAMMENI + case 0x1FAC: + return 0x1FA4; // [S] GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND + // PROSGEGRAMMENI + case 0x1FAD: + return 0x1FA5; // [S] GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND + // PROSGEGRAMMENI + case 0x1FAE: + return 0x1FA6; // [S] GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI + // AND PROSGEGRAMMENI + case 0x1FAF: + return 0x1FA7; // [S] GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI + // AND PROSGEGRAMMENI + case 0x1FB8: + return 0x1FB0; // [C] GREEK CAPITAL LETTER ALPHA WITH VRACHY + case 0x1FB9: + return 0x1FB1; // [C] GREEK CAPITAL LETTER ALPHA WITH MACRON + case 0x1FBA: + return 0x1F70; // [C] GREEK CAPITAL LETTER ALPHA WITH VARIA + case 0x1FBB: + return 0x1F71; // [C] GREEK CAPITAL LETTER ALPHA WITH OXIA + case 0x1FBC: + return 0x1FB3; // [S] GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI + case 0x1FBE: + return 0x03B9; // [C] GREEK PROSGEGRAMMENI + case 0x1FC8: + return 0x1F72; // [C] GREEK CAPITAL LETTER EPSILON WITH VARIA + case 0x1FC9: + return 0x1F73; // [C] GREEK CAPITAL LETTER EPSILON WITH OXIA + case 0x1FCA: + return 0x1F74; // [C] GREEK CAPITAL LETTER ETA WITH VARIA + case 0x1FCB: + return 0x1F75; // [C] GREEK CAPITAL LETTER ETA WITH OXIA + case 0x1FCC: + return 0x1FC3; // [S] GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI + case 0x1FD3: + return 0x0390; // [S] GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA + case 0x1FD8: + return 0x1FD0; // [C] GREEK CAPITAL LETTER IOTA WITH VRACHY + case 0x1FD9: + return 0x1FD1; // [C] GREEK CAPITAL LETTER IOTA WITH MACRON + case 0x1FDA: + return 0x1F76; // [C] GREEK CAPITAL LETTER IOTA WITH VARIA + case 0x1FDB: + return 0x1F77; // [C] GREEK CAPITAL LETTER IOTA WITH OXIA + case 0x1FE3: + return 0x03B0; // [S] GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND OXIA + case 0x1FE8: + return 0x1FE0; // [C] GREEK CAPITAL LETTER UPSILON WITH VRACHY + case 0x1FE9: + return 0x1FE1; // [C] GREEK CAPITAL LETTER UPSILON WITH MACRON + case 0x1FEA: + return 0x1F7A; // [C] GREEK CAPITAL LETTER UPSILON WITH VARIA + case 0x1FEB: + return 0x1F7B; // [C] GREEK CAPITAL LETTER UPSILON WITH OXIA + case 0x1FEC: + return 0x1FE5; // [C] GREEK CAPITAL LETTER RHO WITH DASIA + case 0x1FF8: + return 0x1F78; // [C] GREEK CAPITAL LETTER OMICRON WITH VARIA + case 0x1FF9: + return 0x1F79; // [C] GREEK CAPITAL LETTER OMICRON WITH OXIA + case 0x1FFA: + return 0x1F7C; // [C] GREEK CAPITAL LETTER OMEGA WITH VARIA + case 0x1FFB: + return 0x1F7D; // [C] GREEK CAPITAL LETTER OMEGA WITH OXIA + case 0x1FFC: + return 0x1FF3; // [S] GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI + case 0x2126: + return 0x03C9; // [C] OHM SIGN + case 0x212A: + return 0x006B; // [C] KELVIN SIGN + case 0x212B: + return 0x00E5; // [C] ANGSTROM SIGN + case 0x2132: + return 0x214E; // [C] TURNED CAPITAL F + case 0x2160: + return 0x2170; // [C] ROMAN NUMERAL ONE + case 0x2161: + return 0x2171; // [C] ROMAN NUMERAL TWO + case 0x2162: + return 0x2172; // [C] ROMAN NUMERAL THREE + case 0x2163: + return 0x2173; // [C] ROMAN NUMERAL FOUR + case 0x2164: + return 0x2174; // [C] ROMAN NUMERAL FIVE + case 0x2165: + return 0x2175; // [C] ROMAN NUMERAL SIX + case 0x2166: + return 0x2176; // [C] ROMAN NUMERAL SEVEN + case 0x2167: + return 0x2177; // [C] ROMAN NUMERAL EIGHT + case 0x2168: + return 0x2178; // [C] ROMAN NUMERAL NINE + case 0x2169: + return 0x2179; // [C] ROMAN NUMERAL TEN + case 0x216A: + return 0x217A; // [C] ROMAN NUMERAL ELEVEN + case 0x216B: + return 0x217B; // [C] ROMAN NUMERAL TWELVE + case 0x216C: + return 0x217C; // [C] ROMAN NUMERAL FIFTY + case 0x216D: + return 0x217D; // [C] ROMAN NUMERAL ONE HUNDRED + case 0x216E: + return 0x217E; // [C] ROMAN NUMERAL FIVE HUNDRED + case 0x216F: + return 0x217F; // [C] ROMAN NUMERAL ONE THOUSAND + case 0x2183: + return 0x2184; // [C] ROMAN NUMERAL REVERSED ONE HUNDRED + case 0x24B6: + return 0x24D0; // [C] CIRCLED LATIN CAPITAL LETTER A + case 0x24B7: + return 0x24D1; // [C] CIRCLED LATIN CAPITAL LETTER B + case 0x24B8: + return 0x24D2; // [C] CIRCLED LATIN CAPITAL LETTER C + case 0x24B9: + return 0x24D3; // [C] CIRCLED LATIN CAPITAL LETTER D + case 0x24BA: + return 0x24D4; // [C] CIRCLED LATIN CAPITAL LETTER E + case 0x24BB: + return 0x24D5; // [C] CIRCLED LATIN CAPITAL LETTER F + case 0x24BC: + return 0x24D6; // [C] CIRCLED LATIN CAPITAL LETTER G + case 0x24BD: + return 0x24D7; // [C] CIRCLED LATIN CAPITAL LETTER H + case 0x24BE: + return 0x24D8; // [C] CIRCLED LATIN CAPITAL LETTER I + case 0x24BF: + return 0x24D9; // [C] CIRCLED LATIN CAPITAL LETTER J + case 0x24C0: + return 0x24DA; // [C] CIRCLED LATIN CAPITAL LETTER K + case 0x24C1: + return 0x24DB; // [C] CIRCLED LATIN CAPITAL LETTER L + case 0x24C2: + return 0x24DC; // [C] CIRCLED LATIN CAPITAL LETTER M + case 0x24C3: + return 0x24DD; // [C] CIRCLED LATIN CAPITAL LETTER N + case 0x24C4: + return 0x24DE; // [C] CIRCLED LATIN CAPITAL LETTER O + case 0x24C5: + return 0x24DF; // [C] CIRCLED LATIN CAPITAL LETTER P + case 0x24C6: + return 0x24E0; // [C] CIRCLED LATIN CAPITAL LETTER Q + case 0x24C7: + return 0x24E1; // [C] CIRCLED LATIN CAPITAL LETTER R + case 0x24C8: + return 0x24E2; // [C] CIRCLED LATIN CAPITAL LETTER S + case 0x24C9: + return 0x24E3; // [C] CIRCLED LATIN CAPITAL LETTER T + case 0x24CA: + return 0x24E4; // [C] CIRCLED LATIN CAPITAL LETTER U + case 0x24CB: + return 0x24E5; // [C] CIRCLED LATIN CAPITAL LETTER V + case 0x24CC: + return 0x24E6; // [C] CIRCLED LATIN CAPITAL LETTER W + case 0x24CD: + return 0x24E7; // [C] CIRCLED LATIN CAPITAL LETTER X + case 0x24CE: + return 0x24E8; // [C] CIRCLED LATIN CAPITAL LETTER Y + case 0x24CF: + return 0x24E9; // [C] CIRCLED LATIN CAPITAL LETTER Z + case 0x2C00: + return 0x2C30; // [C] GLAGOLITIC CAPITAL LETTER AZU + case 0x2C01: + return 0x2C31; // [C] GLAGOLITIC CAPITAL LETTER BUKY + case 0x2C02: + return 0x2C32; // [C] GLAGOLITIC CAPITAL LETTER VEDE + case 0x2C03: + return 0x2C33; // [C] GLAGOLITIC CAPITAL LETTER GLAGOLI + case 0x2C04: + return 0x2C34; // [C] GLAGOLITIC CAPITAL LETTER DOBRO + case 0x2C05: + return 0x2C35; // [C] GLAGOLITIC CAPITAL LETTER YESTU + case 0x2C06: + return 0x2C36; // [C] GLAGOLITIC CAPITAL LETTER ZHIVETE + case 0x2C07: + return 0x2C37; // [C] GLAGOLITIC CAPITAL LETTER DZELO + case 0x2C08: + return 0x2C38; // [C] GLAGOLITIC CAPITAL LETTER ZEMLJA + case 0x2C09: + return 0x2C39; // [C] GLAGOLITIC CAPITAL LETTER IZHE + case 0x2C0A: + return 0x2C3A; // [C] GLAGOLITIC CAPITAL LETTER INITIAL IZHE + case 0x2C0B: + return 0x2C3B; // [C] GLAGOLITIC CAPITAL LETTER I + case 0x2C0C: + return 0x2C3C; // [C] GLAGOLITIC CAPITAL LETTER DJERVI + case 0x2C0D: + return 0x2C3D; // [C] GLAGOLITIC CAPITAL LETTER KAKO + case 0x2C0E: + return 0x2C3E; // [C] GLAGOLITIC CAPITAL LETTER LJUDIJE + case 0x2C0F: + return 0x2C3F; // [C] GLAGOLITIC CAPITAL LETTER MYSLITE + case 0x2C10: + return 0x2C40; // [C] GLAGOLITIC CAPITAL LETTER NASHI + case 0x2C11: + return 0x2C41; // [C] GLAGOLITIC CAPITAL LETTER ONU + case 0x2C12: + return 0x2C42; // [C] GLAGOLITIC CAPITAL LETTER POKOJI + case 0x2C13: + return 0x2C43; // [C] GLAGOLITIC CAPITAL LETTER RITSI + case 0x2C14: + return 0x2C44; // [C] GLAGOLITIC CAPITAL LETTER SLOVO + case 0x2C15: + return 0x2C45; // [C] GLAGOLITIC CAPITAL LETTER TVRIDO + case 0x2C16: + return 0x2C46; // [C] GLAGOLITIC CAPITAL LETTER UKU + case 0x2C17: + return 0x2C47; // [C] GLAGOLITIC CAPITAL LETTER FRITU + case 0x2C18: + return 0x2C48; // [C] GLAGOLITIC CAPITAL LETTER HERU + case 0x2C19: + return 0x2C49; // [C] GLAGOLITIC CAPITAL LETTER OTU + case 0x2C1A: + return 0x2C4A; // [C] GLAGOLITIC CAPITAL LETTER PE + case 0x2C1B: + return 0x2C4B; // [C] GLAGOLITIC CAPITAL LETTER SHTA + case 0x2C1C: + return 0x2C4C; // [C] GLAGOLITIC CAPITAL LETTER TSI + case 0x2C1D: + return 0x2C4D; // [C] GLAGOLITIC CAPITAL LETTER CHRIVI + case 0x2C1E: + return 0x2C4E; // [C] GLAGOLITIC CAPITAL LETTER SHA + case 0x2C1F: + return 0x2C4F; // [C] GLAGOLITIC CAPITAL LETTER YERU + case 0x2C20: + return 0x2C50; // [C] GLAGOLITIC CAPITAL LETTER YERI + case 0x2C21: + return 0x2C51; // [C] GLAGOLITIC CAPITAL LETTER YATI + case 0x2C22: + return 0x2C52; // [C] GLAGOLITIC CAPITAL LETTER SPIDERY HA + case 0x2C23: + return 0x2C53; // [C] GLAGOLITIC CAPITAL LETTER YU + case 0x2C24: + return 0x2C54; // [C] GLAGOLITIC CAPITAL LETTER SMALL YUS + case 0x2C25: + return 0x2C55; // [C] GLAGOLITIC CAPITAL LETTER SMALL YUS WITH TAIL + case 0x2C26: + return 0x2C56; // [C] GLAGOLITIC CAPITAL LETTER YO + case 0x2C27: + return 0x2C57; // [C] GLAGOLITIC CAPITAL LETTER IOTATED SMALL YUS + case 0x2C28: + return 0x2C58; // [C] GLAGOLITIC CAPITAL LETTER BIG YUS + case 0x2C29: + return 0x2C59; // [C] GLAGOLITIC CAPITAL LETTER IOTATED BIG YUS + case 0x2C2A: + return 0x2C5A; // [C] GLAGOLITIC CAPITAL LETTER FITA + case 0x2C2B: + return 0x2C5B; // [C] GLAGOLITIC CAPITAL LETTER IZHITSA + case 0x2C2C: + return 0x2C5C; // [C] GLAGOLITIC CAPITAL LETTER SHTAPIC + case 0x2C2D: + return 0x2C5D; // [C] GLAGOLITIC CAPITAL LETTER TROKUTASTI A + case 0x2C2E: + return 0x2C5E; // [C] GLAGOLITIC CAPITAL LETTER LATINATE MYSLITE + case 0x2C2F: + return 0x2C5F; // [C] GLAGOLITIC CAPITAL LETTER CAUDATE CHRIVI + case 0x2C60: + return 0x2C61; // [C] LATIN CAPITAL LETTER L WITH DOUBLE BAR + case 0x2C62: + return 0x026B; // [C] LATIN CAPITAL LETTER L WITH MIDDLE TILDE + case 0x2C63: + return 0x1D7D; // [C] LATIN CAPITAL LETTER P WITH STROKE + case 0x2C64: + return 0x027D; // [C] LATIN CAPITAL LETTER R WITH TAIL + case 0x2C67: + return 0x2C68; // [C] LATIN CAPITAL LETTER H WITH DESCENDER + case 0x2C69: + return 0x2C6A; // [C] LATIN CAPITAL LETTER K WITH DESCENDER + case 0x2C6B: + return 0x2C6C; // [C] LATIN CAPITAL LETTER Z WITH DESCENDER + case 0x2C6D: + return 0x0251; // [C] LATIN CAPITAL LETTER ALPHA + case 0x2C6E: + return 0x0271; // [C] LATIN CAPITAL LETTER M WITH HOOK + case 0x2C6F: + return 0x0250; // [C] LATIN CAPITAL LETTER TURNED A + case 0x2C70: + return 0x0252; // [C] LATIN CAPITAL LETTER TURNED ALPHA + case 0x2C72: + return 0x2C73; // [C] LATIN CAPITAL LETTER W WITH HOOK + case 0x2C75: + return 0x2C76; // [C] LATIN CAPITAL LETTER HALF H + case 0x2C7E: + return 0x023F; // [C] LATIN CAPITAL LETTER S WITH SWASH TAIL + case 0x2C7F: + return 0x0240; // [C] LATIN CAPITAL LETTER Z WITH SWASH TAIL + case 0x2C80: + return 0x2C81; // [C] COPTIC CAPITAL LETTER ALFA + case 0x2C82: + return 0x2C83; // [C] COPTIC CAPITAL LETTER VIDA + case 0x2C84: + return 0x2C85; // [C] COPTIC CAPITAL LETTER GAMMA + case 0x2C86: + return 0x2C87; // [C] COPTIC CAPITAL LETTER DALDA + case 0x2C88: + return 0x2C89; // [C] COPTIC CAPITAL LETTER EIE + case 0x2C8A: + return 0x2C8B; // [C] COPTIC CAPITAL LETTER SOU + case 0x2C8C: + return 0x2C8D; // [C] COPTIC CAPITAL LETTER ZATA + case 0x2C8E: + return 0x2C8F; // [C] COPTIC CAPITAL LETTER HATE + case 0x2C90: + return 0x2C91; // [C] COPTIC CAPITAL LETTER THETHE + case 0x2C92: + return 0x2C93; // [C] COPTIC CAPITAL LETTER IAUDA + case 0x2C94: + return 0x2C95; // [C] COPTIC CAPITAL LETTER KAPA + case 0x2C96: + return 0x2C97; // [C] COPTIC CAPITAL LETTER LAULA + case 0x2C98: + return 0x2C99; // [C] COPTIC CAPITAL LETTER MI + case 0x2C9A: + return 0x2C9B; // [C] COPTIC CAPITAL LETTER NI + case 0x2C9C: + return 0x2C9D; // [C] COPTIC CAPITAL LETTER KSI + case 0x2C9E: + return 0x2C9F; // [C] COPTIC CAPITAL LETTER O + case 0x2CA0: + return 0x2CA1; // [C] COPTIC CAPITAL LETTER PI + case 0x2CA2: + return 0x2CA3; // [C] COPTIC CAPITAL LETTER RO + case 0x2CA4: + return 0x2CA5; // [C] COPTIC CAPITAL LETTER SIMA + case 0x2CA6: + return 0x2CA7; // [C] COPTIC CAPITAL LETTER TAU + case 0x2CA8: + return 0x2CA9; // [C] COPTIC CAPITAL LETTER UA + case 0x2CAA: + return 0x2CAB; // [C] COPTIC CAPITAL LETTER FI + case 0x2CAC: + return 0x2CAD; // [C] COPTIC CAPITAL LETTER KHI + case 0x2CAE: + return 0x2CAF; // [C] COPTIC CAPITAL LETTER PSI + case 0x2CB0: + return 0x2CB1; // [C] COPTIC CAPITAL LETTER OOU + case 0x2CB2: + return 0x2CB3; // [C] COPTIC CAPITAL LETTER DIALECT-P ALEF + case 0x2CB4: + return 0x2CB5; // [C] COPTIC CAPITAL LETTER OLD COPTIC AIN + case 0x2CB6: + return 0x2CB7; // [C] COPTIC CAPITAL LETTER CRYPTOGRAMMIC EIE + case 0x2CB8: + return 0x2CB9; // [C] COPTIC CAPITAL LETTER DIALECT-P KAPA + case 0x2CBA: + return 0x2CBB; // [C] COPTIC CAPITAL LETTER DIALECT-P NI + case 0x2CBC: + return 0x2CBD; // [C] COPTIC CAPITAL LETTER CRYPTOGRAMMIC NI + case 0x2CBE: + return 0x2CBF; // [C] COPTIC CAPITAL LETTER OLD COPTIC OOU + case 0x2CC0: + return 0x2CC1; // [C] COPTIC CAPITAL LETTER SAMPI + case 0x2CC2: + return 0x2CC3; // [C] COPTIC CAPITAL LETTER CROSSED SHEI + case 0x2CC4: + return 0x2CC5; // [C] COPTIC CAPITAL LETTER OLD COPTIC SHEI + case 0x2CC6: + return 0x2CC7; // [C] COPTIC CAPITAL LETTER OLD COPTIC ESH + case 0x2CC8: + return 0x2CC9; // [C] COPTIC CAPITAL LETTER AKHMIMIC KHEI + case 0x2CCA: + return 0x2CCB; // [C] COPTIC CAPITAL LETTER DIALECT-P HORI + case 0x2CCC: + return 0x2CCD; // [C] COPTIC CAPITAL LETTER OLD COPTIC HORI + case 0x2CCE: + return 0x2CCF; // [C] COPTIC CAPITAL LETTER OLD COPTIC HA + case 0x2CD0: + return 0x2CD1; // [C] COPTIC CAPITAL LETTER L-SHAPED HA + case 0x2CD2: + return 0x2CD3; // [C] COPTIC CAPITAL LETTER OLD COPTIC HEI + case 0x2CD4: + return 0x2CD5; // [C] COPTIC CAPITAL LETTER OLD COPTIC HAT + case 0x2CD6: + return 0x2CD7; // [C] COPTIC CAPITAL LETTER OLD COPTIC GANGIA + case 0x2CD8: + return 0x2CD9; // [C] COPTIC CAPITAL LETTER OLD COPTIC DJA + case 0x2CDA: + return 0x2CDB; // [C] COPTIC CAPITAL LETTER OLD COPTIC SHIMA + case 0x2CDC: + return 0x2CDD; // [C] COPTIC CAPITAL LETTER OLD NUBIAN SHIMA + case 0x2CDE: + return 0x2CDF; // [C] COPTIC CAPITAL LETTER OLD NUBIAN NGI + case 0x2CE0: + return 0x2CE1; // [C] COPTIC CAPITAL LETTER OLD NUBIAN NYI + case 0x2CE2: + return 0x2CE3; // [C] COPTIC CAPITAL LETTER OLD NUBIAN WAU + case 0x2CEB: + return 0x2CEC; // [C] COPTIC CAPITAL LETTER CRYPTOGRAMMIC SHEI + case 0x2CED: + return 0x2CEE; // [C] COPTIC CAPITAL LETTER CRYPTOGRAMMIC GANGIA + case 0x2CF2: + return 0x2CF3; // [C] COPTIC CAPITAL LETTER BOHAIRIC KHEI + case 0xA640: + return 0xA641; // [C] CYRILLIC CAPITAL LETTER ZEMLYA + case 0xA642: + return 0xA643; // [C] CYRILLIC CAPITAL LETTER DZELO + case 0xA644: + return 0xA645; // [C] CYRILLIC CAPITAL LETTER REVERSED DZE + case 0xA646: + return 0xA647; // [C] CYRILLIC CAPITAL LETTER IOTA + case 0xA648: + return 0xA649; // [C] CYRILLIC CAPITAL LETTER DJERV + case 0xA64A: + return 0xA64B; // [C] CYRILLIC CAPITAL LETTER MONOGRAPH UK + case 0xA64C: + return 0xA64D; // [C] CYRILLIC CAPITAL LETTER BROAD OMEGA + case 0xA64E: + return 0xA64F; // [C] CYRILLIC CAPITAL LETTER NEUTRAL YER + case 0xA650: + return 0xA651; // [C] CYRILLIC CAPITAL LETTER YERU WITH BACK YER + case 0xA652: + return 0xA653; // [C] CYRILLIC CAPITAL LETTER IOTIFIED YAT + case 0xA654: + return 0xA655; // [C] CYRILLIC CAPITAL LETTER REVERSED YU + case 0xA656: + return 0xA657; // [C] CYRILLIC CAPITAL LETTER IOTIFIED A + case 0xA658: + return 0xA659; // [C] CYRILLIC CAPITAL LETTER CLOSED LITTLE YUS + case 0xA65A: + return 0xA65B; // [C] CYRILLIC CAPITAL LETTER BLENDED YUS + case 0xA65C: + return 0xA65D; // [C] CYRILLIC CAPITAL LETTER IOTIFIED CLOSED LITTLE YUS + case 0xA65E: + return 0xA65F; // [C] CYRILLIC CAPITAL LETTER YN + case 0xA660: + return 0xA661; // [C] CYRILLIC CAPITAL LETTER REVERSED TSE + case 0xA662: + return 0xA663; // [C] CYRILLIC CAPITAL LETTER SOFT DE + case 0xA664: + return 0xA665; // [C] CYRILLIC CAPITAL LETTER SOFT EL + case 0xA666: + return 0xA667; // [C] CYRILLIC CAPITAL LETTER SOFT EM + case 0xA668: + return 0xA669; // [C] CYRILLIC CAPITAL LETTER MONOCULAR O + case 0xA66A: + return 0xA66B; // [C] CYRILLIC CAPITAL LETTER BINOCULAR O + case 0xA66C: + return 0xA66D; // [C] CYRILLIC CAPITAL LETTER DOUBLE MONOCULAR O + case 0xA680: + return 0xA681; // [C] CYRILLIC CAPITAL LETTER DWE + case 0xA682: + return 0xA683; // [C] CYRILLIC CAPITAL LETTER DZWE + case 0xA684: + return 0xA685; // [C] CYRILLIC CAPITAL LETTER ZHWE + case 0xA686: + return 0xA687; // [C] CYRILLIC CAPITAL LETTER CCHE + case 0xA688: + return 0xA689; // [C] CYRILLIC CAPITAL LETTER DZZE + case 0xA68A: + return 0xA68B; // [C] CYRILLIC CAPITAL LETTER TE WITH MIDDLE HOOK + case 0xA68C: + return 0xA68D; // [C] CYRILLIC CAPITAL LETTER TWE + case 0xA68E: + return 0xA68F; // [C] CYRILLIC CAPITAL LETTER TSWE + case 0xA690: + return 0xA691; // [C] CYRILLIC CAPITAL LETTER TSSE + case 0xA692: + return 0xA693; // [C] CYRILLIC CAPITAL LETTER TCHE + case 0xA694: + return 0xA695; // [C] CYRILLIC CAPITAL LETTER HWE + case 0xA696: + return 0xA697; // [C] CYRILLIC CAPITAL LETTER SHWE + case 0xA698: + return 0xA699; // [C] CYRILLIC CAPITAL LETTER DOUBLE O + case 0xA69A: + return 0xA69B; // [C] CYRILLIC CAPITAL LETTER CROSSED O + case 0xA722: + return 0xA723; // [C] LATIN CAPITAL LETTER EGYPTOLOGICAL ALEF + case 0xA724: + return 0xA725; // [C] LATIN CAPITAL LETTER EGYPTOLOGICAL AIN + case 0xA726: + return 0xA727; // [C] LATIN CAPITAL LETTER HENG + case 0xA728: + return 0xA729; // [C] LATIN CAPITAL LETTER TZ + case 0xA72A: + return 0xA72B; // [C] LATIN CAPITAL LETTER TRESILLO + case 0xA72C: + return 0xA72D; // [C] LATIN CAPITAL LETTER CUATRILLO + case 0xA72E: + return 0xA72F; // [C] LATIN CAPITAL LETTER CUATRILLO WITH COMMA + case 0xA732: + return 0xA733; // [C] LATIN CAPITAL LETTER AA + case 0xA734: + return 0xA735; // [C] LATIN CAPITAL LETTER AO + case 0xA736: + return 0xA737; // [C] LATIN CAPITAL LETTER AU + case 0xA738: + return 0xA739; // [C] LATIN CAPITAL LETTER AV + case 0xA73A: + return 0xA73B; // [C] LATIN CAPITAL LETTER AV WITH HORIZONTAL BAR + case 0xA73C: + return 0xA73D; // [C] LATIN CAPITAL LETTER AY + case 0xA73E: + return 0xA73F; // [C] LATIN CAPITAL LETTER REVERSED C WITH DOT + case 0xA740: + return 0xA741; // [C] LATIN CAPITAL LETTER K WITH STROKE + case 0xA742: + return 0xA743; // [C] LATIN CAPITAL LETTER K WITH DIAGONAL STROKE + case 0xA744: + return 0xA745; // [C] LATIN CAPITAL LETTER K WITH STROKE AND DIAGONAL STROKE + case 0xA746: + return 0xA747; // [C] LATIN CAPITAL LETTER BROKEN L + case 0xA748: + return 0xA749; // [C] LATIN CAPITAL LETTER L WITH HIGH STROKE + case 0xA74A: + return 0xA74B; // [C] LATIN CAPITAL LETTER O WITH LONG STROKE OVERLAY + case 0xA74C: + return 0xA74D; // [C] LATIN CAPITAL LETTER O WITH LOOP + case 0xA74E: + return 0xA74F; // [C] LATIN CAPITAL LETTER OO + case 0xA750: + return 0xA751; // [C] LATIN CAPITAL LETTER P WITH STROKE THROUGH DESCENDER + case 0xA752: + return 0xA753; // [C] LATIN CAPITAL LETTER P WITH FLOURISH + case 0xA754: + return 0xA755; // [C] LATIN CAPITAL LETTER P WITH SQUIRREL TAIL + case 0xA756: + return 0xA757; // [C] LATIN CAPITAL LETTER Q WITH STROKE THROUGH DESCENDER + case 0xA758: + return 0xA759; // [C] LATIN CAPITAL LETTER Q WITH DIAGONAL STROKE + case 0xA75A: + return 0xA75B; // [C] LATIN CAPITAL LETTER R ROTUNDA + case 0xA75C: + return 0xA75D; // [C] LATIN CAPITAL LETTER RUM ROTUNDA + case 0xA75E: + return 0xA75F; // [C] LATIN CAPITAL LETTER V WITH DIAGONAL STROKE + case 0xA760: + return 0xA761; // [C] LATIN CAPITAL LETTER VY + case 0xA762: + return 0xA763; // [C] LATIN CAPITAL LETTER VISIGOTHIC Z + case 0xA764: + return 0xA765; // [C] LATIN CAPITAL LETTER THORN WITH STROKE + case 0xA766: + return 0xA767; // [C] LATIN CAPITAL LETTER THORN WITH STROKE THROUGH + // DESCENDER + case 0xA768: + return 0xA769; // [C] LATIN CAPITAL LETTER VEND + case 0xA76A: + return 0xA76B; // [C] LATIN CAPITAL LETTER ET + case 0xA76C: + return 0xA76D; // [C] LATIN CAPITAL LETTER IS + case 0xA76E: + return 0xA76F; // [C] LATIN CAPITAL LETTER CON + case 0xA779: + return 0xA77A; // [C] LATIN CAPITAL LETTER INSULAR D + case 0xA77B: + return 0xA77C; // [C] LATIN CAPITAL LETTER INSULAR F + case 0xA77D: + return 0x1D79; // [C] LATIN CAPITAL LETTER INSULAR G + case 0xA77E: + return 0xA77F; // [C] LATIN CAPITAL LETTER TURNED INSULAR G + case 0xA780: + return 0xA781; // [C] LATIN CAPITAL LETTER TURNED L + case 0xA782: + return 0xA783; // [C] LATIN CAPITAL LETTER INSULAR R + case 0xA784: + return 0xA785; // [C] LATIN CAPITAL LETTER INSULAR S + case 0xA786: + return 0xA787; // [C] LATIN CAPITAL LETTER INSULAR T + case 0xA78B: + return 0xA78C; // [C] LATIN CAPITAL LETTER SALTILLO + case 0xA78D: + return 0x0265; // [C] LATIN CAPITAL LETTER TURNED H + case 0xA790: + return 0xA791; // [C] LATIN CAPITAL LETTER N WITH DESCENDER + case 0xA792: + return 0xA793; // [C] LATIN CAPITAL LETTER C WITH BAR + case 0xA796: + return 0xA797; // [C] LATIN CAPITAL LETTER B WITH FLOURISH + case 0xA798: + return 0xA799; // [C] LATIN CAPITAL LETTER F WITH STROKE + case 0xA79A: + return 0xA79B; // [C] LATIN CAPITAL LETTER VOLAPUK AE + case 0xA79C: + return 0xA79D; // [C] LATIN CAPITAL LETTER VOLAPUK OE + case 0xA79E: + return 0xA79F; // [C] LATIN CAPITAL LETTER VOLAPUK UE + case 0xA7A0: + return 0xA7A1; // [C] LATIN CAPITAL LETTER G WITH OBLIQUE STROKE + case 0xA7A2: + return 0xA7A3; // [C] LATIN CAPITAL LETTER K WITH OBLIQUE STROKE + case 0xA7A4: + return 0xA7A5; // [C] LATIN CAPITAL LETTER N WITH OBLIQUE STROKE + case 0xA7A6: + return 0xA7A7; // [C] LATIN CAPITAL LETTER R WITH OBLIQUE STROKE + case 0xA7A8: + return 0xA7A9; // [C] LATIN CAPITAL LETTER S WITH OBLIQUE STROKE + case 0xA7AA: + return 0x0266; // [C] LATIN CAPITAL LETTER H WITH HOOK + case 0xA7AB: + return 0x025C; // [C] LATIN CAPITAL LETTER REVERSED OPEN E + case 0xA7AC: + return 0x0261; // [C] LATIN CAPITAL LETTER SCRIPT G + case 0xA7AD: + return 0x026C; // [C] LATIN CAPITAL LETTER L WITH BELT + case 0xA7AE: + return 0x026A; // [C] LATIN CAPITAL LETTER SMALL CAPITAL I + case 0xA7B0: + return 0x029E; // [C] LATIN CAPITAL LETTER TURNED K + case 0xA7B1: + return 0x0287; // [C] LATIN CAPITAL LETTER TURNED T + case 0xA7B2: + return 0x029D; // [C] LATIN CAPITAL LETTER J WITH CROSSED-TAIL + case 0xA7B3: + return 0xAB53; // [C] LATIN CAPITAL LETTER CHI + case 0xA7B4: + return 0xA7B5; // [C] LATIN CAPITAL LETTER BETA + case 0xA7B6: + return 0xA7B7; // [C] LATIN CAPITAL LETTER OMEGA + case 0xA7B8: + return 0xA7B9; // [C] LATIN CAPITAL LETTER U WITH STROKE + case 0xA7BA: + return 0xA7BB; // [C] LATIN CAPITAL LETTER GLOTTAL A + case 0xA7BC: + return 0xA7BD; // [C] LATIN CAPITAL LETTER GLOTTAL I + case 0xA7BE: + return 0xA7BF; // [C] LATIN CAPITAL LETTER GLOTTAL U + case 0xA7C0: + return 0xA7C1; // [C] LATIN CAPITAL LETTER OLD POLISH O + case 0xA7C2: + return 0xA7C3; // [C] LATIN CAPITAL LETTER ANGLICANA W + case 0xA7C4: + return 0xA794; // [C] LATIN CAPITAL LETTER C WITH PALATAL HOOK + case 0xA7C5: + return 0x0282; // [C] LATIN CAPITAL LETTER S WITH HOOK + case 0xA7C6: + return 0x1D8E; // [C] LATIN CAPITAL LETTER Z WITH PALATAL HOOK + case 0xA7C7: + return 0xA7C8; // [C] LATIN CAPITAL LETTER D WITH SHORT STROKE OVERLAY + case 0xA7C9: + return 0xA7CA; // [C] LATIN CAPITAL LETTER S WITH SHORT STROKE OVERLAY + case 0xA7CB: + return 0x0264; // [C] LATIN CAPITAL LETTER RAMS HORN + case 0xA7CC: + return 0xA7CD; // [C] LATIN CAPITAL LETTER S WITH DIAGONAL STROKE + case 0xA7D0: + return 0xA7D1; // [C] LATIN CAPITAL LETTER CLOSED INSULAR G + case 0xA7D6: + return 0xA7D7; // [C] LATIN CAPITAL LETTER MIDDLE SCOTS S + case 0xA7D8: + return 0xA7D9; // [C] LATIN CAPITAL LETTER SIGMOID S + case 0xA7DA: + return 0xA7DB; // [C] LATIN CAPITAL LETTER LAMBDA + case 0xA7DC: + return 0x019B; // [C] LATIN CAPITAL LETTER LAMBDA WITH STROKE + case 0xA7F5: + return 0xA7F6; // [C] LATIN CAPITAL LETTER REVERSED HALF H + case 0xAB70: + return 0x13A0; // [C] CHEROKEE SMALL LETTER A + case 0xAB71: + return 0x13A1; // [C] CHEROKEE SMALL LETTER E + case 0xAB72: + return 0x13A2; // [C] CHEROKEE SMALL LETTER I + case 0xAB73: + return 0x13A3; // [C] CHEROKEE SMALL LETTER O + case 0xAB74: + return 0x13A4; // [C] CHEROKEE SMALL LETTER U + case 0xAB75: + return 0x13A5; // [C] CHEROKEE SMALL LETTER V + case 0xAB76: + return 0x13A6; // [C] CHEROKEE SMALL LETTER GA + case 0xAB77: + return 0x13A7; // [C] CHEROKEE SMALL LETTER KA + case 0xAB78: + return 0x13A8; // [C] CHEROKEE SMALL LETTER GE + case 0xAB79: + return 0x13A9; // [C] CHEROKEE SMALL LETTER GI + case 0xAB7A: + return 0x13AA; // [C] CHEROKEE SMALL LETTER GO + case 0xAB7B: + return 0x13AB; // [C] CHEROKEE SMALL LETTER GU + case 0xAB7C: + return 0x13AC; // [C] CHEROKEE SMALL LETTER GV + case 0xAB7D: + return 0x13AD; // [C] CHEROKEE SMALL LETTER HA + case 0xAB7E: + return 0x13AE; // [C] CHEROKEE SMALL LETTER HE + case 0xAB7F: + return 0x13AF; // [C] CHEROKEE SMALL LETTER HI + case 0xAB80: + return 0x13B0; // [C] CHEROKEE SMALL LETTER HO + case 0xAB81: + return 0x13B1; // [C] CHEROKEE SMALL LETTER HU + case 0xAB82: + return 0x13B2; // [C] CHEROKEE SMALL LETTER HV + case 0xAB83: + return 0x13B3; // [C] CHEROKEE SMALL LETTER LA + case 0xAB84: + return 0x13B4; // [C] CHEROKEE SMALL LETTER LE + case 0xAB85: + return 0x13B5; // [C] CHEROKEE SMALL LETTER LI + case 0xAB86: + return 0x13B6; // [C] CHEROKEE SMALL LETTER LO + case 0xAB87: + return 0x13B7; // [C] CHEROKEE SMALL LETTER LU + case 0xAB88: + return 0x13B8; // [C] CHEROKEE SMALL LETTER LV + case 0xAB89: + return 0x13B9; // [C] CHEROKEE SMALL LETTER MA + case 0xAB8A: + return 0x13BA; // [C] CHEROKEE SMALL LETTER ME + case 0xAB8B: + return 0x13BB; // [C] CHEROKEE SMALL LETTER MI + case 0xAB8C: + return 0x13BC; // [C] CHEROKEE SMALL LETTER MO + case 0xAB8D: + return 0x13BD; // [C] CHEROKEE SMALL LETTER MU + case 0xAB8E: + return 0x13BE; // [C] CHEROKEE SMALL LETTER NA + case 0xAB8F: + return 0x13BF; // [C] CHEROKEE SMALL LETTER HNA + case 0xAB90: + return 0x13C0; // [C] CHEROKEE SMALL LETTER NAH + case 0xAB91: + return 0x13C1; // [C] CHEROKEE SMALL LETTER NE + case 0xAB92: + return 0x13C2; // [C] CHEROKEE SMALL LETTER NI + case 0xAB93: + return 0x13C3; // [C] CHEROKEE SMALL LETTER NO + case 0xAB94: + return 0x13C4; // [C] CHEROKEE SMALL LETTER NU + case 0xAB95: + return 0x13C5; // [C] CHEROKEE SMALL LETTER NV + case 0xAB96: + return 0x13C6; // [C] CHEROKEE SMALL LETTER QUA + case 0xAB97: + return 0x13C7; // [C] CHEROKEE SMALL LETTER QUE + case 0xAB98: + return 0x13C8; // [C] CHEROKEE SMALL LETTER QUI + case 0xAB99: + return 0x13C9; // [C] CHEROKEE SMALL LETTER QUO + case 0xAB9A: + return 0x13CA; // [C] CHEROKEE SMALL LETTER QUU + case 0xAB9B: + return 0x13CB; // [C] CHEROKEE SMALL LETTER QUV + case 0xAB9C: + return 0x13CC; // [C] CHEROKEE SMALL LETTER SA + case 0xAB9D: + return 0x13CD; // [C] CHEROKEE SMALL LETTER S + case 0xAB9E: + return 0x13CE; // [C] CHEROKEE SMALL LETTER SE + case 0xAB9F: + return 0x13CF; // [C] CHEROKEE SMALL LETTER SI + case 0xABA0: + return 0x13D0; // [C] CHEROKEE SMALL LETTER SO + case 0xABA1: + return 0x13D1; // [C] CHEROKEE SMALL LETTER SU + case 0xABA2: + return 0x13D2; // [C] CHEROKEE SMALL LETTER SV + case 0xABA3: + return 0x13D3; // [C] CHEROKEE SMALL LETTER DA + case 0xABA4: + return 0x13D4; // [C] CHEROKEE SMALL LETTER TA + case 0xABA5: + return 0x13D5; // [C] CHEROKEE SMALL LETTER DE + case 0xABA6: + return 0x13D6; // [C] CHEROKEE SMALL LETTER TE + case 0xABA7: + return 0x13D7; // [C] CHEROKEE SMALL LETTER DI + case 0xABA8: + return 0x13D8; // [C] CHEROKEE SMALL LETTER TI + case 0xABA9: + return 0x13D9; // [C] CHEROKEE SMALL LETTER DO + case 0xABAA: + return 0x13DA; // [C] CHEROKEE SMALL LETTER DU + case 0xABAB: + return 0x13DB; // [C] CHEROKEE SMALL LETTER DV + case 0xABAC: + return 0x13DC; // [C] CHEROKEE SMALL LETTER DLA + case 0xABAD: + return 0x13DD; // [C] CHEROKEE SMALL LETTER TLA + case 0xABAE: + return 0x13DE; // [C] CHEROKEE SMALL LETTER TLE + case 0xABAF: + return 0x13DF; // [C] CHEROKEE SMALL LETTER TLI + case 0xABB0: + return 0x13E0; // [C] CHEROKEE SMALL LETTER TLO + case 0xABB1: + return 0x13E1; // [C] CHEROKEE SMALL LETTER TLU + case 0xABB2: + return 0x13E2; // [C] CHEROKEE SMALL LETTER TLV + case 0xABB3: + return 0x13E3; // [C] CHEROKEE SMALL LETTER TSA + case 0xABB4: + return 0x13E4; // [C] CHEROKEE SMALL LETTER TSE + case 0xABB5: + return 0x13E5; // [C] CHEROKEE SMALL LETTER TSI + case 0xABB6: + return 0x13E6; // [C] CHEROKEE SMALL LETTER TSO + case 0xABB7: + return 0x13E7; // [C] CHEROKEE SMALL LETTER TSU + case 0xABB8: + return 0x13E8; // [C] CHEROKEE SMALL LETTER TSV + case 0xABB9: + return 0x13E9; // [C] CHEROKEE SMALL LETTER WA + case 0xABBA: + return 0x13EA; // [C] CHEROKEE SMALL LETTER WE + case 0xABBB: + return 0x13EB; // [C] CHEROKEE SMALL LETTER WI + case 0xABBC: + return 0x13EC; // [C] CHEROKEE SMALL LETTER WO + case 0xABBD: + return 0x13ED; // [C] CHEROKEE SMALL LETTER WU + case 0xABBE: + return 0x13EE; // [C] CHEROKEE SMALL LETTER WV + case 0xABBF: + return 0x13EF; // [C] CHEROKEE SMALL LETTER YA + case 0xFB05: + return 0xFB06; // [S] LATIN SMALL LIGATURE LONG S T + case 0xFF21: + return 0xFF41; // [C] FULLWIDTH LATIN CAPITAL LETTER A + case 0xFF22: + return 0xFF42; // [C] FULLWIDTH LATIN CAPITAL LETTER B + case 0xFF23: + return 0xFF43; // [C] FULLWIDTH LATIN CAPITAL LETTER C + case 0xFF24: + return 0xFF44; // [C] FULLWIDTH LATIN CAPITAL LETTER D + case 0xFF25: + return 0xFF45; // [C] FULLWIDTH LATIN CAPITAL LETTER E + case 0xFF26: + return 0xFF46; // [C] FULLWIDTH LATIN CAPITAL LETTER F + case 0xFF27: + return 0xFF47; // [C] FULLWIDTH LATIN CAPITAL LETTER G + case 0xFF28: + return 0xFF48; // [C] FULLWIDTH LATIN CAPITAL LETTER H + case 0xFF29: + return 0xFF49; // [C] FULLWIDTH LATIN CAPITAL LETTER I + case 0xFF2A: + return 0xFF4A; // [C] FULLWIDTH LATIN CAPITAL LETTER J + case 0xFF2B: + return 0xFF4B; // [C] FULLWIDTH LATIN CAPITAL LETTER K + case 0xFF2C: + return 0xFF4C; // [C] FULLWIDTH LATIN CAPITAL LETTER L + case 0xFF2D: + return 0xFF4D; // [C] FULLWIDTH LATIN CAPITAL LETTER M + case 0xFF2E: + return 0xFF4E; // [C] FULLWIDTH LATIN CAPITAL LETTER N + case 0xFF2F: + return 0xFF4F; // [C] FULLWIDTH LATIN CAPITAL LETTER O + case 0xFF30: + return 0xFF50; // [C] FULLWIDTH LATIN CAPITAL LETTER P + case 0xFF31: + return 0xFF51; // [C] FULLWIDTH LATIN CAPITAL LETTER Q + case 0xFF32: + return 0xFF52; // [C] FULLWIDTH LATIN CAPITAL LETTER R + case 0xFF33: + return 0xFF53; // [C] FULLWIDTH LATIN CAPITAL LETTER S + case 0xFF34: + return 0xFF54; // [C] FULLWIDTH LATIN CAPITAL LETTER T + case 0xFF35: + return 0xFF55; // [C] FULLWIDTH LATIN CAPITAL LETTER U + case 0xFF36: + return 0xFF56; // [C] FULLWIDTH LATIN CAPITAL LETTER V + case 0xFF37: + return 0xFF57; // [C] FULLWIDTH LATIN CAPITAL LETTER W + case 0xFF38: + return 0xFF58; // [C] FULLWIDTH LATIN CAPITAL LETTER X + case 0xFF39: + return 0xFF59; // [C] FULLWIDTH LATIN CAPITAL LETTER Y + case 0xFF3A: + return 0xFF5A; // [C] FULLWIDTH LATIN CAPITAL LETTER Z + case 0x10400: + return 0x10428; // [C] DESERET CAPITAL LETTER LONG I + case 0x10401: + return 0x10429; // [C] DESERET CAPITAL LETTER LONG E + case 0x10402: + return 0x1042A; // [C] DESERET CAPITAL LETTER LONG A + case 0x10403: + return 0x1042B; // [C] DESERET CAPITAL LETTER LONG AH + case 0x10404: + return 0x1042C; // [C] DESERET CAPITAL LETTER LONG O + case 0x10405: + return 0x1042D; // [C] DESERET CAPITAL LETTER LONG OO + case 0x10406: + return 0x1042E; // [C] DESERET CAPITAL LETTER SHORT I + case 0x10407: + return 0x1042F; // [C] DESERET CAPITAL LETTER SHORT E + case 0x10408: + return 0x10430; // [C] DESERET CAPITAL LETTER SHORT A + case 0x10409: + return 0x10431; // [C] DESERET CAPITAL LETTER SHORT AH + case 0x1040A: + return 0x10432; // [C] DESERET CAPITAL LETTER SHORT O + case 0x1040B: + return 0x10433; // [C] DESERET CAPITAL LETTER SHORT OO + case 0x1040C: + return 0x10434; // [C] DESERET CAPITAL LETTER AY + case 0x1040D: + return 0x10435; // [C] DESERET CAPITAL LETTER OW + case 0x1040E: + return 0x10436; // [C] DESERET CAPITAL LETTER WU + case 0x1040F: + return 0x10437; // [C] DESERET CAPITAL LETTER YEE + case 0x10410: + return 0x10438; // [C] DESERET CAPITAL LETTER H + case 0x10411: + return 0x10439; // [C] DESERET CAPITAL LETTER PEE + case 0x10412: + return 0x1043A; // [C] DESERET CAPITAL LETTER BEE + case 0x10413: + return 0x1043B; // [C] DESERET CAPITAL LETTER TEE + case 0x10414: + return 0x1043C; // [C] DESERET CAPITAL LETTER DEE + case 0x10415: + return 0x1043D; // [C] DESERET CAPITAL LETTER CHEE + case 0x10416: + return 0x1043E; // [C] DESERET CAPITAL LETTER JEE + case 0x10417: + return 0x1043F; // [C] DESERET CAPITAL LETTER KAY + case 0x10418: + return 0x10440; // [C] DESERET CAPITAL LETTER GAY + case 0x10419: + return 0x10441; // [C] DESERET CAPITAL LETTER EF + case 0x1041A: + return 0x10442; // [C] DESERET CAPITAL LETTER VEE + case 0x1041B: + return 0x10443; // [C] DESERET CAPITAL LETTER ETH + case 0x1041C: + return 0x10444; // [C] DESERET CAPITAL LETTER THEE + case 0x1041D: + return 0x10445; // [C] DESERET CAPITAL LETTER ES + case 0x1041E: + return 0x10446; // [C] DESERET CAPITAL LETTER ZEE + case 0x1041F: + return 0x10447; // [C] DESERET CAPITAL LETTER ESH + case 0x10420: + return 0x10448; // [C] DESERET CAPITAL LETTER ZHEE + case 0x10421: + return 0x10449; // [C] DESERET CAPITAL LETTER ER + case 0x10422: + return 0x1044A; // [C] DESERET CAPITAL LETTER EL + case 0x10423: + return 0x1044B; // [C] DESERET CAPITAL LETTER EM + case 0x10424: + return 0x1044C; // [C] DESERET CAPITAL LETTER EN + case 0x10425: + return 0x1044D; // [C] DESERET CAPITAL LETTER ENG + case 0x10426: + return 0x1044E; // [C] DESERET CAPITAL LETTER OI + case 0x10427: + return 0x1044F; // [C] DESERET CAPITAL LETTER EW + case 0x104B0: + return 0x104D8; // [C] OSAGE CAPITAL LETTER A + case 0x104B1: + return 0x104D9; // [C] OSAGE CAPITAL LETTER AI + case 0x104B2: + return 0x104DA; // [C] OSAGE CAPITAL LETTER AIN + case 0x104B3: + return 0x104DB; // [C] OSAGE CAPITAL LETTER AH + case 0x104B4: + return 0x104DC; // [C] OSAGE CAPITAL LETTER BRA + case 0x104B5: + return 0x104DD; // [C] OSAGE CAPITAL LETTER CHA + case 0x104B6: + return 0x104DE; // [C] OSAGE CAPITAL LETTER EHCHA + case 0x104B7: + return 0x104DF; // [C] OSAGE CAPITAL LETTER E + case 0x104B8: + return 0x104E0; // [C] OSAGE CAPITAL LETTER EIN + case 0x104B9: + return 0x104E1; // [C] OSAGE CAPITAL LETTER HA + case 0x104BA: + return 0x104E2; // [C] OSAGE CAPITAL LETTER HYA + case 0x104BB: + return 0x104E3; // [C] OSAGE CAPITAL LETTER I + case 0x104BC: + return 0x104E4; // [C] OSAGE CAPITAL LETTER KA + case 0x104BD: + return 0x104E5; // [C] OSAGE CAPITAL LETTER EHKA + case 0x104BE: + return 0x104E6; // [C] OSAGE CAPITAL LETTER KYA + case 0x104BF: + return 0x104E7; // [C] OSAGE CAPITAL LETTER LA + case 0x104C0: + return 0x104E8; // [C] OSAGE CAPITAL LETTER MA + case 0x104C1: + return 0x104E9; // [C] OSAGE CAPITAL LETTER NA + case 0x104C2: + return 0x104EA; // [C] OSAGE CAPITAL LETTER O + case 0x104C3: + return 0x104EB; // [C] OSAGE CAPITAL LETTER OIN + case 0x104C4: + return 0x104EC; // [C] OSAGE CAPITAL LETTER PA + case 0x104C5: + return 0x104ED; // [C] OSAGE CAPITAL LETTER EHPA + case 0x104C6: + return 0x104EE; // [C] OSAGE CAPITAL LETTER SA + case 0x104C7: + return 0x104EF; // [C] OSAGE CAPITAL LETTER SHA + case 0x104C8: + return 0x104F0; // [C] OSAGE CAPITAL LETTER TA + case 0x104C9: + return 0x104F1; // [C] OSAGE CAPITAL LETTER EHTA + case 0x104CA: + return 0x104F2; // [C] OSAGE CAPITAL LETTER TSA + case 0x104CB: + return 0x104F3; // [C] OSAGE CAPITAL LETTER EHTSA + case 0x104CC: + return 0x104F4; // [C] OSAGE CAPITAL LETTER TSHA + case 0x104CD: + return 0x104F5; // [C] OSAGE CAPITAL LETTER DHA + case 0x104CE: + return 0x104F6; // [C] OSAGE CAPITAL LETTER U + case 0x104CF: + return 0x104F7; // [C] OSAGE CAPITAL LETTER WA + case 0x104D0: + return 0x104F8; // [C] OSAGE CAPITAL LETTER KHA + case 0x104D1: + return 0x104F9; // [C] OSAGE CAPITAL LETTER GHA + case 0x104D2: + return 0x104FA; // [C] OSAGE CAPITAL LETTER ZA + case 0x104D3: + return 0x104FB; // [C] OSAGE CAPITAL LETTER ZHA + case 0x10570: + return 0x10597; // [C] VITHKUQI CAPITAL LETTER A + case 0x10571: + return 0x10598; // [C] VITHKUQI CAPITAL LETTER BBE + case 0x10572: + return 0x10599; // [C] VITHKUQI CAPITAL LETTER BE + case 0x10573: + return 0x1059A; // [C] VITHKUQI CAPITAL LETTER CE + case 0x10574: + return 0x1059B; // [C] VITHKUQI CAPITAL LETTER CHE + case 0x10575: + return 0x1059C; // [C] VITHKUQI CAPITAL LETTER DE + case 0x10576: + return 0x1059D; // [C] VITHKUQI CAPITAL LETTER DHE + case 0x10577: + return 0x1059E; // [C] VITHKUQI CAPITAL LETTER EI + case 0x10578: + return 0x1059F; // [C] VITHKUQI CAPITAL LETTER E + case 0x10579: + return 0x105A0; // [C] VITHKUQI CAPITAL LETTER FE + case 0x1057A: + return 0x105A1; // [C] VITHKUQI CAPITAL LETTER GA + case 0x1057C: + return 0x105A3; // [C] VITHKUQI CAPITAL LETTER HA + case 0x1057D: + return 0x105A4; // [C] VITHKUQI CAPITAL LETTER HHA + case 0x1057E: + return 0x105A5; // [C] VITHKUQI CAPITAL LETTER I + case 0x1057F: + return 0x105A6; // [C] VITHKUQI CAPITAL LETTER IJE + case 0x10580: + return 0x105A7; // [C] VITHKUQI CAPITAL LETTER JE + case 0x10581: + return 0x105A8; // [C] VITHKUQI CAPITAL LETTER KA + case 0x10582: + return 0x105A9; // [C] VITHKUQI CAPITAL LETTER LA + case 0x10583: + return 0x105AA; // [C] VITHKUQI CAPITAL LETTER LLA + case 0x10584: + return 0x105AB; // [C] VITHKUQI CAPITAL LETTER ME + case 0x10585: + return 0x105AC; // [C] VITHKUQI CAPITAL LETTER NE + case 0x10586: + return 0x105AD; // [C] VITHKUQI CAPITAL LETTER NJE + case 0x10587: + return 0x105AE; // [C] VITHKUQI CAPITAL LETTER O + case 0x10588: + return 0x105AF; // [C] VITHKUQI CAPITAL LETTER PE + case 0x10589: + return 0x105B0; // [C] VITHKUQI CAPITAL LETTER QA + case 0x1058A: + return 0x105B1; // [C] VITHKUQI CAPITAL LETTER RE + case 0x1058C: + return 0x105B3; // [C] VITHKUQI CAPITAL LETTER SE + case 0x1058D: + return 0x105B4; // [C] VITHKUQI CAPITAL LETTER SHE + case 0x1058E: + return 0x105B5; // [C] VITHKUQI CAPITAL LETTER TE + case 0x1058F: + return 0x105B6; // [C] VITHKUQI CAPITAL LETTER THE + case 0x10590: + return 0x105B7; // [C] VITHKUQI CAPITAL LETTER U + case 0x10591: + return 0x105B8; // [C] VITHKUQI CAPITAL LETTER VE + case 0x10592: + return 0x105B9; // [C] VITHKUQI CAPITAL LETTER XE + case 0x10594: + return 0x105BB; // [C] VITHKUQI CAPITAL LETTER Y + case 0x10595: + return 0x105BC; // [C] VITHKUQI CAPITAL LETTER ZE + case 0x10C80: + return 0x10CC0; // [C] OLD HUNGARIAN CAPITAL LETTER A + case 0x10C81: + return 0x10CC1; // [C] OLD HUNGARIAN CAPITAL LETTER AA + case 0x10C82: + return 0x10CC2; // [C] OLD HUNGARIAN CAPITAL LETTER EB + case 0x10C83: + return 0x10CC3; // [C] OLD HUNGARIAN CAPITAL LETTER AMB + case 0x10C84: + return 0x10CC4; // [C] OLD HUNGARIAN CAPITAL LETTER EC + case 0x10C85: + return 0x10CC5; // [C] OLD HUNGARIAN CAPITAL LETTER ENC + case 0x10C86: + return 0x10CC6; // [C] OLD HUNGARIAN CAPITAL LETTER ECS + case 0x10C87: + return 0x10CC7; // [C] OLD HUNGARIAN CAPITAL LETTER ED + case 0x10C88: + return 0x10CC8; // [C] OLD HUNGARIAN CAPITAL LETTER AND + case 0x10C89: + return 0x10CC9; // [C] OLD HUNGARIAN CAPITAL LETTER E + case 0x10C8A: + return 0x10CCA; // [C] OLD HUNGARIAN CAPITAL LETTER CLOSE E + case 0x10C8B: + return 0x10CCB; // [C] OLD HUNGARIAN CAPITAL LETTER EE + case 0x10C8C: + return 0x10CCC; // [C] OLD HUNGARIAN CAPITAL LETTER EF + case 0x10C8D: + return 0x10CCD; // [C] OLD HUNGARIAN CAPITAL LETTER EG + case 0x10C8E: + return 0x10CCE; // [C] OLD HUNGARIAN CAPITAL LETTER EGY + case 0x10C8F: + return 0x10CCF; // [C] OLD HUNGARIAN CAPITAL LETTER EH + case 0x10C90: + return 0x10CD0; // [C] OLD HUNGARIAN CAPITAL LETTER I + case 0x10C91: + return 0x10CD1; // [C] OLD HUNGARIAN CAPITAL LETTER II + case 0x10C92: + return 0x10CD2; // [C] OLD HUNGARIAN CAPITAL LETTER EJ + case 0x10C93: + return 0x10CD3; // [C] OLD HUNGARIAN CAPITAL LETTER EK + case 0x10C94: + return 0x10CD4; // [C] OLD HUNGARIAN CAPITAL LETTER AK + case 0x10C95: + return 0x10CD5; // [C] OLD HUNGARIAN CAPITAL LETTER UNK + case 0x10C96: + return 0x10CD6; // [C] OLD HUNGARIAN CAPITAL LETTER EL + case 0x10C97: + return 0x10CD7; // [C] OLD HUNGARIAN CAPITAL LETTER ELY + case 0x10C98: + return 0x10CD8; // [C] OLD HUNGARIAN CAPITAL LETTER EM + case 0x10C99: + return 0x10CD9; // [C] OLD HUNGARIAN CAPITAL LETTER EN + case 0x10C9A: + return 0x10CDA; // [C] OLD HUNGARIAN CAPITAL LETTER ENY + case 0x10C9B: + return 0x10CDB; // [C] OLD HUNGARIAN CAPITAL LETTER O + case 0x10C9C: + return 0x10CDC; // [C] OLD HUNGARIAN CAPITAL LETTER OO + case 0x10C9D: + return 0x10CDD; // [C] OLD HUNGARIAN CAPITAL LETTER NIKOLSBURG OE + case 0x10C9E: + return 0x10CDE; // [C] OLD HUNGARIAN CAPITAL LETTER RUDIMENTA OE + case 0x10C9F: + return 0x10CDF; // [C] OLD HUNGARIAN CAPITAL LETTER OEE + case 0x10CA0: + return 0x10CE0; // [C] OLD HUNGARIAN CAPITAL LETTER EP + case 0x10CA1: + return 0x10CE1; // [C] OLD HUNGARIAN CAPITAL LETTER EMP + case 0x10CA2: + return 0x10CE2; // [C] OLD HUNGARIAN CAPITAL LETTER ER + case 0x10CA3: + return 0x10CE3; // [C] OLD HUNGARIAN CAPITAL LETTER SHORT ER + case 0x10CA4: + return 0x10CE4; // [C] OLD HUNGARIAN CAPITAL LETTER ES + case 0x10CA5: + return 0x10CE5; // [C] OLD HUNGARIAN CAPITAL LETTER ESZ + case 0x10CA6: + return 0x10CE6; // [C] OLD HUNGARIAN CAPITAL LETTER ET + case 0x10CA7: + return 0x10CE7; // [C] OLD HUNGARIAN CAPITAL LETTER ENT + case 0x10CA8: + return 0x10CE8; // [C] OLD HUNGARIAN CAPITAL LETTER ETY + case 0x10CA9: + return 0x10CE9; // [C] OLD HUNGARIAN CAPITAL LETTER ECH + case 0x10CAA: + return 0x10CEA; // [C] OLD HUNGARIAN CAPITAL LETTER U + case 0x10CAB: + return 0x10CEB; // [C] OLD HUNGARIAN CAPITAL LETTER UU + case 0x10CAC: + return 0x10CEC; // [C] OLD HUNGARIAN CAPITAL LETTER NIKOLSBURG UE + case 0x10CAD: + return 0x10CED; // [C] OLD HUNGARIAN CAPITAL LETTER RUDIMENTA UE + case 0x10CAE: + return 0x10CEE; // [C] OLD HUNGARIAN CAPITAL LETTER EV + case 0x10CAF: + return 0x10CEF; // [C] OLD HUNGARIAN CAPITAL LETTER EZ + case 0x10CB0: + return 0x10CF0; // [C] OLD HUNGARIAN CAPITAL LETTER EZS + case 0x10CB1: + return 0x10CF1; // [C] OLD HUNGARIAN CAPITAL LETTER ENT-SHAPED SIGN + case 0x10CB2: + return 0x10CF2; // [C] OLD HUNGARIAN CAPITAL LETTER US + case 0x10D50: + return 0x10D70; // [C] GARAY CAPITAL LETTER A + case 0x10D51: + return 0x10D71; // [C] GARAY CAPITAL LETTER CA + case 0x10D52: + return 0x10D72; // [C] GARAY CAPITAL LETTER MA + case 0x10D53: + return 0x10D73; // [C] GARAY CAPITAL LETTER KA + case 0x10D54: + return 0x10D74; // [C] GARAY CAPITAL LETTER BA + case 0x10D55: + return 0x10D75; // [C] GARAY CAPITAL LETTER JA + case 0x10D56: + return 0x10D76; // [C] GARAY CAPITAL LETTER SA + case 0x10D57: + return 0x10D77; // [C] GARAY CAPITAL LETTER WA + case 0x10D58: + return 0x10D78; // [C] GARAY CAPITAL LETTER LA + case 0x10D59: + return 0x10D79; // [C] GARAY CAPITAL LETTER GA + case 0x10D5A: + return 0x10D7A; // [C] GARAY CAPITAL LETTER DA + case 0x10D5B: + return 0x10D7B; // [C] GARAY CAPITAL LETTER XA + case 0x10D5C: + return 0x10D7C; // [C] GARAY CAPITAL LETTER YA + case 0x10D5D: + return 0x10D7D; // [C] GARAY CAPITAL LETTER TA + case 0x10D5E: + return 0x10D7E; // [C] GARAY CAPITAL LETTER RA + case 0x10D5F: + return 0x10D7F; // [C] GARAY CAPITAL LETTER NYA + case 0x10D60: + return 0x10D80; // [C] GARAY CAPITAL LETTER FA + case 0x10D61: + return 0x10D81; // [C] GARAY CAPITAL LETTER NA + case 0x10D62: + return 0x10D82; // [C] GARAY CAPITAL LETTER PA + case 0x10D63: + return 0x10D83; // [C] GARAY CAPITAL LETTER HA + case 0x10D64: + return 0x10D84; // [C] GARAY CAPITAL LETTER OLD KA + case 0x10D65: + return 0x10D85; // [C] GARAY CAPITAL LETTER OLD NA + case 0x118A0: + return 0x118C0; // [C] WARANG CITI CAPITAL LETTER NGAA + case 0x118A1: + return 0x118C1; // [C] WARANG CITI CAPITAL LETTER A + case 0x118A2: + return 0x118C2; // [C] WARANG CITI CAPITAL LETTER WI + case 0x118A3: + return 0x118C3; // [C] WARANG CITI CAPITAL LETTER YU + case 0x118A4: + return 0x118C4; // [C] WARANG CITI CAPITAL LETTER YA + case 0x118A5: + return 0x118C5; // [C] WARANG CITI CAPITAL LETTER YO + case 0x118A6: + return 0x118C6; // [C] WARANG CITI CAPITAL LETTER II + case 0x118A7: + return 0x118C7; // [C] WARANG CITI CAPITAL LETTER UU + case 0x118A8: + return 0x118C8; // [C] WARANG CITI CAPITAL LETTER E + case 0x118A9: + return 0x118C9; // [C] WARANG CITI CAPITAL LETTER O + case 0x118AA: + return 0x118CA; // [C] WARANG CITI CAPITAL LETTER ANG + case 0x118AB: + return 0x118CB; // [C] WARANG CITI CAPITAL LETTER GA + case 0x118AC: + return 0x118CC; // [C] WARANG CITI CAPITAL LETTER KO + case 0x118AD: + return 0x118CD; // [C] WARANG CITI CAPITAL LETTER ENY + case 0x118AE: + return 0x118CE; // [C] WARANG CITI CAPITAL LETTER YUJ + case 0x118AF: + return 0x118CF; // [C] WARANG CITI CAPITAL LETTER UC + case 0x118B0: + return 0x118D0; // [C] WARANG CITI CAPITAL LETTER ENN + case 0x118B1: + return 0x118D1; // [C] WARANG CITI CAPITAL LETTER ODD + case 0x118B2: + return 0x118D2; // [C] WARANG CITI CAPITAL LETTER TTE + case 0x118B3: + return 0x118D3; // [C] WARANG CITI CAPITAL LETTER NUNG + case 0x118B4: + return 0x118D4; // [C] WARANG CITI CAPITAL LETTER DA + case 0x118B5: + return 0x118D5; // [C] WARANG CITI CAPITAL LETTER AT + case 0x118B6: + return 0x118D6; // [C] WARANG CITI CAPITAL LETTER AM + case 0x118B7: + return 0x118D7; // [C] WARANG CITI CAPITAL LETTER BU + case 0x118B8: + return 0x118D8; // [C] WARANG CITI CAPITAL LETTER PU + case 0x118B9: + return 0x118D9; // [C] WARANG CITI CAPITAL LETTER HIYO + case 0x118BA: + return 0x118DA; // [C] WARANG CITI CAPITAL LETTER HOLO + case 0x118BB: + return 0x118DB; // [C] WARANG CITI CAPITAL LETTER HORR + case 0x118BC: + return 0x118DC; // [C] WARANG CITI CAPITAL LETTER HAR + case 0x118BD: + return 0x118DD; // [C] WARANG CITI CAPITAL LETTER SSUU + case 0x118BE: + return 0x118DE; // [C] WARANG CITI CAPITAL LETTER SII + case 0x118BF: + return 0x118DF; // [C] WARANG CITI CAPITAL LETTER VIYO + case 0x16E40: + return 0x16E60; // [C] MEDEFAIDRIN CAPITAL LETTER M + case 0x16E41: + return 0x16E61; // [C] MEDEFAIDRIN CAPITAL LETTER S + case 0x16E42: + return 0x16E62; // [C] MEDEFAIDRIN CAPITAL LETTER V + case 0x16E43: + return 0x16E63; // [C] MEDEFAIDRIN CAPITAL LETTER W + case 0x16E44: + return 0x16E64; // [C] MEDEFAIDRIN CAPITAL LETTER ATIU + case 0x16E45: + return 0x16E65; // [C] MEDEFAIDRIN CAPITAL LETTER Z + case 0x16E46: + return 0x16E66; // [C] MEDEFAIDRIN CAPITAL LETTER KP + case 0x16E47: + return 0x16E67; // [C] MEDEFAIDRIN CAPITAL LETTER P + case 0x16E48: + return 0x16E68; // [C] MEDEFAIDRIN CAPITAL LETTER T + case 0x16E49: + return 0x16E69; // [C] MEDEFAIDRIN CAPITAL LETTER G + case 0x16E4A: + return 0x16E6A; // [C] MEDEFAIDRIN CAPITAL LETTER F + case 0x16E4B: + return 0x16E6B; // [C] MEDEFAIDRIN CAPITAL LETTER I + case 0x16E4C: + return 0x16E6C; // [C] MEDEFAIDRIN CAPITAL LETTER K + case 0x16E4D: + return 0x16E6D; // [C] MEDEFAIDRIN CAPITAL LETTER A + case 0x16E4E: + return 0x16E6E; // [C] MEDEFAIDRIN CAPITAL LETTER J + case 0x16E4F: + return 0x16E6F; // [C] MEDEFAIDRIN CAPITAL LETTER E + case 0x16E50: + return 0x16E70; // [C] MEDEFAIDRIN CAPITAL LETTER B + case 0x16E51: + return 0x16E71; // [C] MEDEFAIDRIN CAPITAL LETTER C + case 0x16E52: + return 0x16E72; // [C] MEDEFAIDRIN CAPITAL LETTER U + case 0x16E53: + return 0x16E73; // [C] MEDEFAIDRIN CAPITAL LETTER YU + case 0x16E54: + return 0x16E74; // [C] MEDEFAIDRIN CAPITAL LETTER L + case 0x16E55: + return 0x16E75; // [C] MEDEFAIDRIN CAPITAL LETTER Q + case 0x16E56: + return 0x16E76; // [C] MEDEFAIDRIN CAPITAL LETTER HP + case 0x16E57: + return 0x16E77; // [C] MEDEFAIDRIN CAPITAL LETTER NY + case 0x16E58: + return 0x16E78; // [C] MEDEFAIDRIN CAPITAL LETTER X + case 0x16E59: + return 0x16E79; // [C] MEDEFAIDRIN CAPITAL LETTER D + case 0x16E5A: + return 0x16E7A; // [C] MEDEFAIDRIN CAPITAL LETTER OE + case 0x16E5B: + return 0x16E7B; // [C] MEDEFAIDRIN CAPITAL LETTER N + case 0x16E5C: + return 0x16E7C; // [C] MEDEFAIDRIN CAPITAL LETTER R + case 0x16E5D: + return 0x16E7D; // [C] MEDEFAIDRIN CAPITAL LETTER O + case 0x16E5E: + return 0x16E7E; // [C] MEDEFAIDRIN CAPITAL LETTER AI + case 0x16E5F: + return 0x16E7F; // [C] MEDEFAIDRIN CAPITAL LETTER Y + case 0x1E900: + return 0x1E922; // [C] ADLAM CAPITAL LETTER ALIF + case 0x1E901: + return 0x1E923; // [C] ADLAM CAPITAL LETTER DAALI + case 0x1E902: + return 0x1E924; // [C] ADLAM CAPITAL LETTER LAAM + case 0x1E903: + return 0x1E925; // [C] ADLAM CAPITAL LETTER MIIM + case 0x1E904: + return 0x1E926; // [C] ADLAM CAPITAL LETTER BA + case 0x1E905: + return 0x1E927; // [C] ADLAM CAPITAL LETTER SINNYIIYHE + case 0x1E906: + return 0x1E928; // [C] ADLAM CAPITAL LETTER PE + case 0x1E907: + return 0x1E929; // [C] ADLAM CAPITAL LETTER BHE + case 0x1E908: + return 0x1E92A; // [C] ADLAM CAPITAL LETTER RA + case 0x1E909: + return 0x1E92B; // [C] ADLAM CAPITAL LETTER E + case 0x1E90A: + return 0x1E92C; // [C] ADLAM CAPITAL LETTER FA + case 0x1E90B: + return 0x1E92D; // [C] ADLAM CAPITAL LETTER I + case 0x1E90C: + return 0x1E92E; // [C] ADLAM CAPITAL LETTER O + case 0x1E90D: + return 0x1E92F; // [C] ADLAM CAPITAL LETTER DHA + case 0x1E90E: + return 0x1E930; // [C] ADLAM CAPITAL LETTER YHE + case 0x1E90F: + return 0x1E931; // [C] ADLAM CAPITAL LETTER WAW + case 0x1E910: + return 0x1E932; // [C] ADLAM CAPITAL LETTER NUN + case 0x1E911: + return 0x1E933; // [C] ADLAM CAPITAL LETTER KAF + case 0x1E912: + return 0x1E934; // [C] ADLAM CAPITAL LETTER YA + case 0x1E913: + return 0x1E935; // [C] ADLAM CAPITAL LETTER U + case 0x1E914: + return 0x1E936; // [C] ADLAM CAPITAL LETTER JIIM + case 0x1E915: + return 0x1E937; // [C] ADLAM CAPITAL LETTER CHI + case 0x1E916: + return 0x1E938; // [C] ADLAM CAPITAL LETTER HA + case 0x1E917: + return 0x1E939; // [C] ADLAM CAPITAL LETTER QAAF + case 0x1E918: + return 0x1E93A; // [C] ADLAM CAPITAL LETTER GA + case 0x1E919: + return 0x1E93B; // [C] ADLAM CAPITAL LETTER NYA + case 0x1E91A: + return 0x1E93C; // [C] ADLAM CAPITAL LETTER TU + case 0x1E91B: + return 0x1E93D; // [C] ADLAM CAPITAL LETTER NHA + case 0x1E91C: + return 0x1E93E; // [C] ADLAM CAPITAL LETTER VA + case 0x1E91D: + return 0x1E93F; // [C] ADLAM CAPITAL LETTER KHA + case 0x1E91E: + return 0x1E940; // [C] ADLAM CAPITAL LETTER GBE + case 0x1E91F: + return 0x1E941; // [C] ADLAM CAPITAL LETTER ZAL + case 0x1E920: + return 0x1E942; // [C] ADLAM CAPITAL LETTER KPO + case 0x1E921: + return 0x1E943; // [C] ADLAM CAPITAL LETTER SHA + default: + return in; + } +} + +inline char32_t case_fold_char(char32_t in) { + if (in < 0xB5) [[likely]] { + if (in >= 0x41 && in <= 0x5A) { + in += 0x20; + } + return in; + } + + return case_fold_char_slow(in); +} + +template +void case_fold_impl(InputIt start, InputIt end, OutputIt out) { + while (start < end) { + auto cp = utf8::next(start, end); + auto folded = case_fold_char(cp); + out = utf8::append(folded, out); + } +} + +template +void case_fold_unchecked_impl(InputIt start, InputIt end, OutputIt out) { + while (start < end) { + auto cp = utf8::unchecked::next(start); + auto folded = case_fold_char(cp); + out = utf8::unchecked::append(folded, out); + } +} + +} // namespace + +std::string utf8_case_fold(std::string_view in) { + std::string out; + out.reserve(in.size()); + case_fold_impl(in.begin(), in.end(), std::back_inserter(out)); + return out; +} + +std::string utf8_case_fold_unchecked(std::string_view in) { + std::string out; + out.reserve(in.size()); + case_fold_unchecked_impl(in.begin(), in.end(), std::back_inserter(out)); + return out; +} + +} // namespace dwarfs::internal diff --git a/src/reader/internal/metadata_v2.cpp b/src/reader/internal/metadata_v2.cpp index 820cea006..0777844c9 100644 --- a/src/reader/internal/metadata_v2.cpp +++ b/src/reader/internal/metadata_v2.cpp @@ -32,19 +32,28 @@ #include +#include + #include #include #include #include #include +#if FMT_VERSION >= 110000 +#include +#endif #include #include #include +#include #include +#include + #include +#include #include #include @@ -60,6 +69,7 @@ #include #include #include +#include #include #include @@ -415,7 +425,7 @@ class metadata_ final : public metadata_v2::impl { , symlinks_(meta_.compact_symlinks() ? string_table(lgr, "symlinks", *meta_.compact_symlinks()) : string_table(meta_.symlinks())) - // clang-format off + , dir_icase_cache_{build_dir_icase_cache()} // clang-format off PERFMON_CLS_PROXY_INIT(perfmon, "metadata_v2") PERFMON_CLS_TIMER_INIT(find) PERFMON_CLS_TIMER_INIT(getattr) @@ -661,6 +671,10 @@ class metadata_ final : public metadata_v2::impl { nlohmann::json as_json(dir_entry_view entry) const; nlohmann::json as_json(directory_view dir, dir_entry_view entry) const; + std::optional + find_impl(directory_view dir, auto const& range, auto const& name, + auto const& index_map, auto const& entry_name_transform) const; + std::optional find(directory_view dir, std::string_view name) const; @@ -920,6 +934,79 @@ class metadata_ final : public metadata_v2::impl { return packed_nlinks; } + std::vector> build_dir_icase_cache() const { + std::vector> cache; + + if (options_.case_insensitive_lookup) { + auto ti = LOG_TIMED_INFO; + size_t num_cached_dirs = 0; + size_t num_cached_files = 0; + size_t total_cache_size = 0; + + cache.resize(meta_.directories().size()); + + for (uint32_t inode = 0; inode < meta_.directories().size() - 1; + ++inode) { + directory_view dir{inode, global_}; + auto range = dir.entry_range(); + + // Cache the folded names of the directory entries; this significantly + // speeds up the sorting code. + std::vector names(range.size()); + std::transform(range.begin(), range.end(), names.begin(), [&](auto ix) { + return utf8_case_fold_unchecked( + dir_entry_view_impl::name(ix, global_)); + }); + + // Check and report any collisions in the directory + phmap::flat_hash_map> + collisions; + collisions.reserve(range.size()); + for (size_t i = 0; i < names.size(); ++i) { + collisions[names[i]].push_back(i); + } + for (auto& [name, indices] : collisions) { + if (indices.size() > 1) { + LOG_WARN << fmt::format( + "case-insensitive collision in directory \"{}\" (inode={}): {}", + dir.self_entry_view().unix_path(), inode, + fmt::join(indices | ranges::views::transform([&](auto i) { + return dir_entry_view_impl::name(range[i], global_); + }), + ", ")); + } + } + + // It's faster to check here if the folded names are sorted than to + // check later if the indices in `entries` are sorted. + if (!std::is_sorted(names.begin(), names.end())) { + std::vector entries(range.size()); + std::iota(entries.begin(), entries.end(), 0); + boost::sort::flat_stable_sort( + entries.begin(), entries.end(), + [&](auto a, auto b) { return names[a] < names[b]; }); + auto& pv = cache[inode]; + pv.reset(std::bit_width(entries.size()), entries.size()); + for (size_t i = 0; i < entries.size(); ++i) { + pv.set(i, entries[i]); + } + ++num_cached_dirs; + num_cached_files += entries.size(); + total_cache_size += pv.size_in_bytes(); + } + } + + ti << "built case-insensitive directory cache for " << num_cached_files + << " entries in " << num_cached_dirs << " out of " + << meta_.directories().size() - 1 << " directories (" + << size_with_unit(total_cache_size + + sizeof(decltype(cache)::value_type) * cache.size()) + << ")"; + } + + return cache; + } + size_t total_file_entries() const { return (dev_inode_offset_ - file_inode_offset_) + (meta_.dir_entries() @@ -943,6 +1030,7 @@ class metadata_ final : public metadata_v2::impl { const int unique_files_; const metadata_options options_; const string_table symlinks_; + std::vector> const dir_icase_cache_; PERFMON_CLS_PROXY_DECL PERFMON_CLS_TIMER_DECL(find) PERFMON_CLS_TIMER_DECL(getattr) @@ -1689,26 +1777,53 @@ void metadata_::walk_data_order_impl( template std::optional -metadata_::find(directory_view dir, std::string_view name) const { - PERFMON_CLS_SCOPED_SECTION(find) - - auto range = dir.entry_range(); +metadata_::find_impl(directory_view dir, auto const& range, + auto const& name, auto const& index_map, + auto const& entry_name_transform) const { + auto entry_name = [&](auto ix) { + return entry_name_transform(dir_entry_view_impl::name(ix, global_)); + }; - auto it = std::lower_bound( - range.begin(), range.end(), name, [&](auto ix, std::string_view name) { - return internal::dir_entry_view_impl::name(ix, global_) < name; - }); + auto it = std::lower_bound(range.begin(), range.end(), name, + [&](auto ix, auto const& name) { + return entry_name(index_map(ix)) < name; + }); if (it != range.end()) { - if (internal::dir_entry_view_impl::name(*it, global_) == name) { + auto ix = index_map(*it); + if (entry_name(ix) == name) { return dir_entry_view{dir_entry_view_impl::from_dir_entry_index_shared( - *it, global_.self_dir_entry(dir.inode()), global_)}; + ix, global_.self_dir_entry(dir.inode()), global_)}; } } return std::nullopt; } +template +std::optional +metadata_::find(directory_view dir, std::string_view name) const { + PERFMON_CLS_SCOPED_SECTION(find) + + auto range = dir.entry_range(); + + if (!options_.case_insensitive_lookup) { + return find_impl(dir, range, name, std::identity{}, std::identity{}); + } + + auto const& cache = dir_icase_cache_[dir.inode()]; + + return find_impl( + dir, boost::irange(range.size()), utf8_case_fold(name), + [&cache, &range](auto ix) { + if (!cache.empty()) { + ix = cache[ix]; + } + return range[ix]; + }, + utf8_case_fold_unchecked); +} + template std::optional metadata_::find(std::string_view path) const { diff --git a/test/dwarfs_test.cpp b/test/dwarfs_test.cpp index c1d8de6c1..58f32a19c 100644 --- a/test/dwarfs_test.cpp +++ b/test/dwarfs_test.cpp @@ -28,6 +28,7 @@ #include #include +#include #include // This needs to be included *after* gtest.h @@ -2054,3 +2055,183 @@ TEST(filesystem, multi_image) { EXPECT_EQ("baz", fs.read_string(fs.open(baz->inode()))); } } + +TEST(filesystem, case_insensitive_lookup) { + auto input = std::make_shared(); + + input->add_dir(""); + input->add_dir(u8"hEllÖwÖrLD"); + input->add_dir(u8"FÜñKÿStrÍñg"); + input->add_dir(u8"unícødérøcks"); + input->add_dir(u8"JÄLAPEÑOPEPPÉR"); + input->add_dir(u8"SpIcYsÜsHiRoLL"); + input->add_dir(u8"CAFÉMØCHAlatte"); + input->add_dir(u8"ČhàŧGƤŦ"); + input->add_dir(u8"lõREMÏpSüM"); + input->add_dir(u8"ŠåmpŁËŠTrInG"); + input->add_dir(u8"pythonprogramming"); + input->add_dir(u8"DÃTâScïÊNcË"); + input->add_dir(u8"AIISFÛTÛRË"); + input->add_dir(u8"readability"); + input->add_file(u8"TëStCãSeSçÉNâRïÖ", "testcasescenario"); + input->add_file(u8"lõREMÏpSüM/ÆSTHETÎCcøding", "aestheticcoding"); + input->add_file(u8"lõREMÏpSüM/smîLëyFÀÇë😊", "smileyface"); + input->add_file(u8"lõREMÏpSüM/NØRTHèast", "northeast"); + input->add_file(u8"lõREMÏpSüM/SPACEadventure", "spaceadventure"); + input->add_file(u8"lõREMÏpSüM/cõMPLEXïTy🚀", "complexity"); + input->add_file(u8"lõREMÏpSüM/thisisatest", "thisisatest"); + input->add_file(u8"lõREMÏpSüM/thisISaTEST", "thisisatest"); + + std::vector case_sensitive_dirs{ + u8"/hEllÖwÖrLD", u8"/FÜñKÿStrÍñg", u8"/unícødérøcks", + u8"/JÄLAPEÑOPEPPÉR", u8"/SpIcYsÜsHiRoLL", u8"/CAFÉMØCHAlatte", + u8"/ČhàŧGƤŦ", u8"/lõREMÏpSüM", u8"/ŠåmpŁËŠTrInG", + u8"/pythonprogramming", u8"/DÃTâScïÊNcË", u8"/AIISFÛTÛRË", + u8"/readability", + }; + + std::vector> case_sensitive_files{ + {u8"/TëStCãSeSçÉNâRïÖ", "testcasescenario"}, + {u8"/lõREMÏpSüM/ÆSTHETÎCcøding", "aestheticcoding"}, + {u8"/lõREMÏpSüM/smîLëyFÀÇë😊", "smileyface"}, + {u8"/lõREMÏpSüM/NØRTHèast", "northeast"}, + {u8"/lõREMÏpSüM/SPACEadventure", "spaceadventure"}, + {u8"/lõREMÏpSüM/cõMPLEXïTy🚀", "complexity"}, + {u8"/lõREMÏpSüM/thisisatest", "thisisatest"}, + {u8"/lõREMÏpSüM/thisISaTEST", "thisisatest"}, + }; + + std::vector case_insensitive_dirs{ + u8"/HELlÖwÖRLD", u8"/FÜÑKÿSTríÑg", u8"/uNÍcødéRøcks", + u8"/JÄLApeñOPePPÉR", u8"/SpiCysÜshiRoLL", u8"/CAféMØchAlatte", + u8"/čhàŧgƥŧ", u8"/lõremÏpsüM", u8"/šåmpŁëšTrInG", + u8"/pyTHonproGRamming", u8"/DãtÂScïêNcË", u8"/AiisFÛTÛRË", + u8"/reADabiLIty", + }; + + std::vector> case_insensitive_files{ + {u8"/TësTcãSeSçéNâRïÖ", "testcasescenario"}, + {u8"/lõRemïpSüM/ÆstHETÎCcØDing", "aestheticcoding"}, + {u8"/lõremïPSüM/smîlËYfàÇë😊", "smileyface"}, + {u8"/lõREMÏPsÜM/NØRthÈAst", "northeast"}, + {u8"/lõRemïPsüM/SPACEadvENTure", "spaceadventure"}, + {u8"/LÕREMÏpSüM/CõMPlexïTy🚀", "complexity"}, + {u8"/lõrEMÏpSüM/thiSISatest", "thisisatest"}, + }; + + std::vector non_matching_entries{ + u8"/HELlÖwÖRLDx", + u8"/FÜÑKÿSTríÑj", + u8"/uNÍcødéRcks", + u8"/JÄLApeñOPePPÉ", + u8"/SpiCysÜshiRoLLx", + u8"/CAféMØchAltte", + u8"/čhàŧgƥŧx", + u8"/lõremÏpsü", + u8"/šåmpŁëšTrnG", + u8"/pyTHonproGRammin", + u8"/DãtÂScïêNcËx", + u8"/AiisFÛTÛTË", + u8"/reADabiLItx", + u8"/TësRcãSeSçéNâRïÖ", + u8"/lõRemïpüM/ÆstHETÎCcØDing", + u8"/lõremïPSüM/mîlËYfàÇë😊", + u8"/lõRMÏPsÜM/NØRthÈAst", + u8"/lõRemïPsüM/SPACEadvENTurex", + u8"/LÕREMÏpSüM/CõMPexïTy🚀", + u8"/lõrEMÏpSüM/thiSISatesy", + }; + + test::test_logger lgr; + auto fsimage = build_dwarfs(lgr, input, "null"); + + auto mm = std::make_shared(std::move(fsimage)); + + lgr.clear(); + + { + reader::filesystem_v2 fs(lgr, *input, mm, + {.metadata = {.case_insensitive_lookup = false}}); + + EXPECT_TRUE(lgr.empty()); + + for (auto const& dir : case_sensitive_dirs) { + auto name = u8string_to_string(dir); + auto dev = fs.find(name); + EXPECT_TRUE(dev) << name; + } + + for (auto const& [file, content] : case_sensitive_files) { + auto name = u8string_to_string(file); + auto dev = fs.find(name); + EXPECT_TRUE(dev) << name; + EXPECT_EQ(content, fs.read_string(fs.open(dev->inode()))) << name; + } + + for (auto const& dir : case_insensitive_dirs) { + auto name = u8string_to_string(dir); + auto dev = fs.find(name); + EXPECT_FALSE(dev) << name; + } + + for (auto const& [file, content] : case_insensitive_files) { + auto name = u8string_to_string(file); + auto dev = fs.find(name); + EXPECT_FALSE(dev) << name; + } + + for (auto const& ent : non_matching_entries) { + auto name = u8string_to_string(ent); + auto dev = fs.find(name); + EXPECT_FALSE(dev) << name; + } + } + + lgr.clear(); + + { + reader::filesystem_v2 fs(lgr, *input, mm, + {.metadata = {.case_insensitive_lookup = true}}); + + EXPECT_THAT( + lgr.get_log(), + testing::Contains(testing::ResultOf( + [](const auto& entry) { return entry.output; }, + testing::AllOf(testing::HasSubstr(u8string_to_string( + u8"case-insensitive collision in directory " + u8"\"lõREMÏpSüM\" (inode=")), + testing::HasSubstr("thisISaTEST, thisisatest"))))); + + for (auto const& dir : case_sensitive_dirs) { + auto name = u8string_to_string(dir); + auto dev = fs.find(name); + EXPECT_TRUE(dev) << name; + } + + for (auto const& [file, content] : case_sensitive_files) { + auto name = u8string_to_string(file); + auto dev = fs.find(name); + EXPECT_TRUE(dev) << name; + EXPECT_EQ(content, fs.read_string(fs.open(dev->inode()))) << name; + } + + for (auto const& dir : case_insensitive_dirs) { + auto name = u8string_to_string(dir); + auto dev = fs.find(name); + EXPECT_TRUE(dev) << name; + } + + for (auto const& [file, content] : case_insensitive_files) { + auto name = u8string_to_string(file); + auto dev = fs.find(name); + EXPECT_TRUE(dev) << name; + EXPECT_EQ(content, fs.read_string(fs.open(dev->inode()))) << name; + } + + for (auto const& ent : non_matching_entries) { + auto name = u8string_to_string(ent); + auto dev = fs.find(name); + EXPECT_FALSE(dev) << name; + } + } +} diff --git a/test/tools_test.cpp b/test/tools_test.cpp index 2a0e4c872..9c2407955 100644 --- a/test/tools_test.cpp +++ b/test/tools_test.cpp @@ -1053,6 +1053,7 @@ TEST_P(tools_test, end_to_end) { std::vector all_options{ "-s", + "-ocase_insensitive", #ifndef _WIN32 "-oenable_nlink", "-oreadonly", @@ -1074,6 +1075,7 @@ TEST_P(tools_test, end_to_end) { for (unsigned bitmask = 0; bitmask < combinations; ++bitmask) { std::vector args; + bool case_insensitive{false}; #ifndef _WIN32 bool enable_nlink{false}; bool readonly{false}; @@ -1083,6 +1085,9 @@ TEST_P(tools_test, end_to_end) { for (size_t i = 0; i < all_options.size(); ++i) { if ((1 << i) & bitmask) { auto const& opt = all_options[i]; + if (opt == "-ocase_insensitive") { + case_insensitive = true; + } #ifndef _WIN32 if (opt == "-oreadonly") { readonly = true; @@ -1139,6 +1144,12 @@ TEST_P(tools_test, end_to_end) { EXPECT_EQ(st.st_gid, 3456) << runner.cmdline(); } #endif + EXPECT_TRUE(fs::exists(mountpoint / "format.sh")) << runner.cmdline(); + EXPECT_EQ(case_insensitive, fs::exists(mountpoint / "FORMAT.SH")) + << runner.cmdline(); + EXPECT_EQ(case_insensitive, fs::exists(mountpoint / "fOrMaT.Sh")) + << runner.cmdline(); + auto perfmon = dwarfs::getxattr(mountpoint, "user.dwarfs.driver.perfmon"); #if DWARFS_PERFMON_ENABLED diff --git a/test/unicode_test.cpp b/test/unicode_test.cpp new file mode 100644 index 000000000..a0382d7b9 --- /dev/null +++ b/test/unicode_test.cpp @@ -0,0 +1,111 @@ +/* vim:set ts=2 sw=2 sts=2 et: */ +/** + * \author Marcus Holland-Moritz (github@mhxnet.de) + * \copyright Copyright (c) Marcus Holland-Moritz + * + * This file is part of dwarfs. + * + * dwarfs is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * dwarfs is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with dwarfs. If not, see . + */ + +#include +#include + +#include +#include + +#if __has_include() +#include +#else +#include +#endif + +#include + +using namespace dwarfs::internal; + +namespace { + +using namespace std::string_view_literals; + +std::array, + 26> constexpr kCaseFoldData{{ + {u8"\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007\u0008\u0009\u000A\u000B\u000C\u000D\u000E\u000F\u0010\u0011\u0012\u0013\u0014\u0015\u0016\u0017\u0018\u0019\u001A\u001B\u001C\u001D\u001E\u001F\u0020\u0021\u0022\u0023\u0024\u0025\u0026\u0027\u0028\u0029\u002A\u002B\u002C\u002D\u002E\u002F\u0030\u0031\u0032\u0033\u0034\u0035\u0036\u0037\u0038\u0039\u003A\u003B\u003C\u003D\u003E\u003F\u0040\u0041\u0042\u0043\u0044\u0045\u0046\u0047\u0048\u0049\u004A\u004B\u004C\u004D\u004E\u004F\u0050\u0051\u0052\u0053\u0054\u0055\u0056\u0057\u0058\u0059\u005A\u005B\u005C\u005D\u005E\u005F\u0060\u0061\u0062\u0063\u0064\u0065\u0066\u0067\u0068\u0069\u006A\u006B\u006C\u006D\u006E\u006F\u0070\u0071\u0072\u0073\u0074\u0075\u0076\u0077\u0078\u0079\u007A\u007B\u007C\u007D\u007E\u007F\u0080\u0081\u0082\u0083\u0084\u0085\u0086\u0087\u0088\u0089\u008A\u008B\u008C\u008D\u008E\u008F\u0090\u0091\u0092\u0093\u0094\u0095\u0096\u0097\u0098\u0099\u009A\u009B\u009C\u009D\u009E\u009F\u00A0\u00A1\u00A2\u00A3\u00A4\u00A5\u00A6\u00A7\u00A8\u00A9\u00AA\u00AB\u00AC\u00AD\u00AE\u00AF\u00B0\u00B1\u00B2\u00B3\u00B4\u00B5\u00B6\u00B7\u00B8\u00B9\u00BA\u00BB\u00BC\u00BD\u00BE\u00BF\u00C0\u00C1\u00C2\u00C3\u00C4\u00C5\u00C6\u00C7\u00C8\u00C9\u00CA\u00CB\u00CC\u00CD\u00CE\u00CF\u00D0\u00D1\u00D2\u00D3\u00D4\u00D5\u00D6\u00D7\u00D8\u00D9\u00DA\u00DB\u00DC\u00DD\u00DE\u00DF\u00E0\u00E1\u00E2\u00E3\u00E4\u00E5\u00E6\u00E7\u00E8\u00E9\u00EA\u00EB\u00EC\u00ED\u00EE\u00EF\u00F0\u00F1\u00F2\u00F3\u00F4\u00F5\u00F6\u00F7\u00F8\u00F9\u00FA\u00FB\u00FC\u00FD\u00FE\u00FF"sv, + u8"\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007\u0008\u0009\u000A\u000B\u000C\u000D\u000E\u000F\u0010\u0011\u0012\u0013\u0014\u0015\u0016\u0017\u0018\u0019\u001A\u001B\u001C\u001D\u001E\u001F\u0020\u0021\u0022\u0023\u0024\u0025\u0026\u0027\u0028\u0029\u002A\u002B\u002C\u002D\u002E\u002F\u0030\u0031\u0032\u0033\u0034\u0035\u0036\u0037\u0038\u0039\u003A\u003B\u003C\u003D\u003E\u003F\u0040\u0061\u0062\u0063\u0064\u0065\u0066\u0067\u0068\u0069\u006A\u006B\u006C\u006D\u006E\u006F\u0070\u0071\u0072\u0073\u0074\u0075\u0076\u0077\u0078\u0079\u007A\u005B\u005C\u005D\u005E\u005F\u0060\u0061\u0062\u0063\u0064\u0065\u0066\u0067\u0068\u0069\u006A\u006B\u006C\u006D\u006E\u006F\u0070\u0071\u0072\u0073\u0074\u0075\u0076\u0077\u0078\u0079\u007A\u007B\u007C\u007D\u007E\u007F\u0080\u0081\u0082\u0083\u0084\u0085\u0086\u0087\u0088\u0089\u008A\u008B\u008C\u008D\u008E\u008F\u0090\u0091\u0092\u0093\u0094\u0095\u0096\u0097\u0098\u0099\u009A\u009B\u009C\u009D\u009E\u009F\u00A0\u00A1\u00A2\u00A3\u00A4\u00A5\u00A6\u00A7\u00A8\u00A9\u00AA\u00AB\u00AC\u00AD\u00AE\u00AF\u00B0\u00B1\u00B2\u00B3\u00B4\u03BC\u00B6\u00B7\u00B8\u00B9\u00BA\u00BB\u00BC\u00BD\u00BE\u00BF\u00E0\u00E1\u00E2\u00E3\u00E4\u00E5\u00E6\u00E7\u00E8\u00E9\u00EA\u00EB\u00EC\u00ED\u00EE\u00EF\u00F0\u00F1\u00F2\u00F3\u00F4\u00F5\u00F6\u00D7\u00F8\u00F9\u00FA\u00FB\u00FC\u00FD\u00FE\u00DF\u00E0\u00E1\u00E2\u00E3\u00E4\u00E5\u00E6\u00E7\u00E8\u00E9\u00EA\u00EB\u00EC\u00ED\u00EE\u00EF\u00F0\u00F1\u00F2\u00F3\u00F4\u00F5\u00F6\u00F7\u00F8\u00F9\u00FA\u00FB\u00FC\u00FD\u00FE\u00FF"sv}, + {u8"\u0100\u0101\u0102\u0103\u0104\u0105\u0106\u0107\u0108\u0109\u010A\u010B\u010C\u010D\u010E\u010F\u0110\u0111\u0112\u0113\u0114\u0115\u0116\u0117\u0118\u0119\u011A\u011B\u011C\u011D\u011E\u011F\u0120\u0121\u0122\u0123\u0124\u0125\u0126\u0127\u0128\u0129\u012A\u012B\u012C\u012D\u012E\u012F\u0130\u0131\u0132\u0133\u0134\u0135\u0136\u0137\u0138\u0139\u013A\u013B\u013C\u013D\u013E\u013F\u0140\u0141\u0142\u0143\u0144\u0145\u0146\u0147\u0148\u0149\u014A\u014B\u014C\u014D\u014E\u014F\u0150\u0151\u0152\u0153\u0154\u0155\u0156\u0157\u0158\u0159\u015A\u015B\u015C\u015D\u015E\u015F\u0160\u0161\u0162\u0163\u0164\u0165\u0166\u0167\u0168\u0169\u016A\u016B\u016C\u016D\u016E\u016F\u0170\u0171\u0172\u0173\u0174\u0175\u0176\u0177\u0178\u0179\u017A\u017B\u017C\u017D\u017E\u017F\u0180\u0181\u0182\u0183\u0184\u0185\u0186\u0187\u0188\u0189\u018A\u018B\u018C\u018D\u018E\u018F\u0190\u0191\u0192\u0193\u0194\u0195\u0196\u0197\u0198\u0199\u019A\u019B\u019C\u019D\u019E\u019F\u01A0\u01A1\u01A2\u01A3\u01A4\u01A5\u01A6\u01A7\u01A8\u01A9\u01AA\u01AB\u01AC\u01AD\u01AE\u01AF\u01B0\u01B1\u01B2\u01B3\u01B4\u01B5\u01B6\u01B7\u01B8\u01B9\u01BA\u01BB\u01BC\u01BD\u01BE\u01BF\u01C0\u01C1\u01C2\u01C3\u01C4\u01C5\u01C6\u01C7\u01C8\u01C9\u01CA\u01CB\u01CC\u01CD\u01CE\u01CF\u01D0\u01D1\u01D2\u01D3\u01D4\u01D5\u01D6\u01D7\u01D8\u01D9\u01DA\u01DB\u01DC\u01DD\u01DE\u01DF\u01E0\u01E1\u01E2\u01E3\u01E4\u01E5\u01E6\u01E7\u01E8\u01E9\u01EA\u01EB\u01EC\u01ED\u01EE\u01EF\u01F0\u01F1\u01F2\u01F3\u01F4\u01F5\u01F6\u01F7\u01F8\u01F9\u01FA\u01FB\u01FC\u01FD\u01FE\u01FF"sv, + u8"\u0101\u0101\u0103\u0103\u0105\u0105\u0107\u0107\u0109\u0109\u010B\u010B\u010D\u010D\u010F\u010F\u0111\u0111\u0113\u0113\u0115\u0115\u0117\u0117\u0119\u0119\u011B\u011B\u011D\u011D\u011F\u011F\u0121\u0121\u0123\u0123\u0125\u0125\u0127\u0127\u0129\u0129\u012B\u012B\u012D\u012D\u012F\u012F\u0130\u0131\u0133\u0133\u0135\u0135\u0137\u0137\u0138\u013A\u013A\u013C\u013C\u013E\u013E\u0140\u0140\u0142\u0142\u0144\u0144\u0146\u0146\u0148\u0148\u0149\u014B\u014B\u014D\u014D\u014F\u014F\u0151\u0151\u0153\u0153\u0155\u0155\u0157\u0157\u0159\u0159\u015B\u015B\u015D\u015D\u015F\u015F\u0161\u0161\u0163\u0163\u0165\u0165\u0167\u0167\u0169\u0169\u016B\u016B\u016D\u016D\u016F\u016F\u0171\u0171\u0173\u0173\u0175\u0175\u0177\u0177\u00FF\u017A\u017A\u017C\u017C\u017E\u017E\u0073\u0180\u0253\u0183\u0183\u0185\u0185\u0254\u0188\u0188\u0256\u0257\u018C\u018C\u018D\u01DD\u0259\u025B\u0192\u0192\u0260\u0263\u0195\u0269\u0268\u0199\u0199\u019A\u019B\u026F\u0272\u019E\u0275\u01A1\u01A1\u01A3\u01A3\u01A5\u01A5\u0280\u01A8\u01A8\u0283\u01AA\u01AB\u01AD\u01AD\u0288\u01B0\u01B0\u028A\u028B\u01B4\u01B4\u01B6\u01B6\u0292\u01B9\u01B9\u01BA\u01BB\u01BD\u01BD\u01BE\u01BF\u01C0\u01C1\u01C2\u01C3\u01C6\u01C6\u01C6\u01C9\u01C9\u01C9\u01CC\u01CC\u01CC\u01CE\u01CE\u01D0\u01D0\u01D2\u01D2\u01D4\u01D4\u01D6\u01D6\u01D8\u01D8\u01DA\u01DA\u01DC\u01DC\u01DD\u01DF\u01DF\u01E1\u01E1\u01E3\u01E3\u01E5\u01E5\u01E7\u01E7\u01E9\u01E9\u01EB\u01EB\u01ED\u01ED\u01EF\u01EF\u01F0\u01F3\u01F3\u01F3\u01F5\u01F5\u0195\u01BF\u01F9\u01F9\u01FB\u01FB\u01FD\u01FD\u01FF\u01FF"sv}, + {u8"\u0200\u0201\u0202\u0203\u0204\u0205\u0206\u0207\u0208\u0209\u020A\u020B\u020C\u020D\u020E\u020F\u0210\u0211\u0212\u0213\u0214\u0215\u0216\u0217\u0218\u0219\u021A\u021B\u021C\u021D\u021E\u021F\u0220\u0221\u0222\u0223\u0224\u0225\u0226\u0227\u0228\u0229\u022A\u022B\u022C\u022D\u022E\u022F\u0230\u0231\u0232\u0233\u0234\u0235\u0236\u0237\u0238\u0239\u023A\u023B\u023C\u023D\u023E\u023F\u0240\u0241\u0242\u0243\u0244\u0245\u0246\u0247\u0248\u0249\u024A\u024B\u024C\u024D\u024E\u024F\u0250\u0251\u0252\u0253\u0254\u0255\u0256\u0257\u0258\u0259\u025A\u025B\u025C\u025D\u025E\u025F\u0260\u0261\u0262\u0263\u0264\u0265\u0266\u0267\u0268\u0269\u026A\u026B\u026C\u026D\u026E\u026F\u0270\u0271\u0272\u0273\u0274\u0275\u0276\u0277\u0278\u0279\u027A\u027B\u027C\u027D\u027E\u027F\u0280\u0281\u0282\u0283\u0284\u0285\u0286\u0287\u0288\u0289\u028A\u028B\u028C\u028D\u028E\u028F\u0290\u0291\u0292\u0293\u0294\u0295\u0296\u0297\u0298\u0299\u029A\u029B\u029C\u029D\u029E\u029F\u02A0\u02A1\u02A2\u02A3\u02A4\u02A5\u02A6\u02A7\u02A8\u02A9\u02AA\u02AB\u02AC\u02AD\u02AE\u02AF\u02B0\u02B1\u02B2\u02B3\u02B4\u02B5\u02B6\u02B7\u02B8\u02B9\u02BA\u02BB\u02BC\u02BD\u02BE\u02BF\u02C0\u02C1\u02C2\u02C3\u02C4\u02C5\u02C6\u02C7\u02C8\u02C9\u02CA\u02CB\u02CC\u02CD\u02CE\u02CF\u02D0\u02D1\u02D2\u02D3\u02D4\u02D5\u02D6\u02D7\u02D8\u02D9\u02DA\u02DB\u02DC\u02DD\u02DE\u02DF\u02E0\u02E1\u02E2\u02E3\u02E4\u02E5\u02E6\u02E7\u02E8\u02E9\u02EA\u02EB\u02EC\u02ED\u02EE\u02EF\u02F0\u02F1\u02F2\u02F3\u02F4\u02F5\u02F6\u02F7\u02F8\u02F9\u02FA\u02FB\u02FC\u02FD\u02FE\u02FF"sv, + u8"\u0201\u0201\u0203\u0203\u0205\u0205\u0207\u0207\u0209\u0209\u020B\u020B\u020D\u020D\u020F\u020F\u0211\u0211\u0213\u0213\u0215\u0215\u0217\u0217\u0219\u0219\u021B\u021B\u021D\u021D\u021F\u021F\u019E\u0221\u0223\u0223\u0225\u0225\u0227\u0227\u0229\u0229\u022B\u022B\u022D\u022D\u022F\u022F\u0231\u0231\u0233\u0233\u0234\u0235\u0236\u0237\u0238\u0239\u2C65\u023C\u023C\u019A\u2C66\u023F\u0240\u0242\u0242\u0180\u0289\u028C\u0247\u0247\u0249\u0249\u024B\u024B\u024D\u024D\u024F\u024F\u0250\u0251\u0252\u0253\u0254\u0255\u0256\u0257\u0258\u0259\u025A\u025B\u025C\u025D\u025E\u025F\u0260\u0261\u0262\u0263\u0264\u0265\u0266\u0267\u0268\u0269\u026A\u026B\u026C\u026D\u026E\u026F\u0270\u0271\u0272\u0273\u0274\u0275\u0276\u0277\u0278\u0279\u027A\u027B\u027C\u027D\u027E\u027F\u0280\u0281\u0282\u0283\u0284\u0285\u0286\u0287\u0288\u0289\u028A\u028B\u028C\u028D\u028E\u028F\u0290\u0291\u0292\u0293\u0294\u0295\u0296\u0297\u0298\u0299\u029A\u029B\u029C\u029D\u029E\u029F\u02A0\u02A1\u02A2\u02A3\u02A4\u02A5\u02A6\u02A7\u02A8\u02A9\u02AA\u02AB\u02AC\u02AD\u02AE\u02AF\u02B0\u02B1\u02B2\u02B3\u02B4\u02B5\u02B6\u02B7\u02B8\u02B9\u02BA\u02BB\u02BC\u02BD\u02BE\u02BF\u02C0\u02C1\u02C2\u02C3\u02C4\u02C5\u02C6\u02C7\u02C8\u02C9\u02CA\u02CB\u02CC\u02CD\u02CE\u02CF\u02D0\u02D1\u02D2\u02D3\u02D4\u02D5\u02D6\u02D7\u02D8\u02D9\u02DA\u02DB\u02DC\u02DD\u02DE\u02DF\u02E0\u02E1\u02E2\u02E3\u02E4\u02E5\u02E6\u02E7\u02E8\u02E9\u02EA\u02EB\u02EC\u02ED\u02EE\u02EF\u02F0\u02F1\u02F2\u02F3\u02F4\u02F5\u02F6\u02F7\u02F8\u02F9\u02FA\u02FB\u02FC\u02FD\u02FE\u02FF"sv}, + {u8"\u0300\u0301\u0302\u0303\u0304\u0305\u0306\u0307\u0308\u0309\u030A\u030B\u030C\u030D\u030E\u030F\u0310\u0311\u0312\u0313\u0314\u0315\u0316\u0317\u0318\u0319\u031A\u031B\u031C\u031D\u031E\u031F\u0320\u0321\u0322\u0323\u0324\u0325\u0326\u0327\u0328\u0329\u032A\u032B\u032C\u032D\u032E\u032F\u0330\u0331\u0332\u0333\u0334\u0335\u0336\u0337\u0338\u0339\u033A\u033B\u033C\u033D\u033E\u033F\u0340\u0341\u0342\u0343\u0344\u0345\u0346\u0347\u0348\u0349\u034A\u034B\u034C\u034D\u034E\u034F\u0350\u0351\u0352\u0353\u0354\u0355\u0356\u0357\u0358\u0359\u035A\u035B\u035C\u035D\u035E\u035F\u0360\u0361\u0362\u0363\u0364\u0365\u0366\u0367\u0368\u0369\u036A\u036B\u036C\u036D\u036E\u036F\u0370\u0371\u0372\u0373\u0374\u0375\u0376\u0377\u0378\u0379\u037A\u037B\u037C\u037D\u037E\u037F\u0380\u0381\u0382\u0383\u0384\u0385\u0386\u0387\u0388\u0389\u038A\u038B\u038C\u038D\u038E\u038F\u0390\u0391\u0392\u0393\u0394\u0395\u0396\u0397\u0398\u0399\u039A\u039B\u039C\u039D\u039E\u039F\u03A0\u03A1\u03A2\u03A3\u03A4\u03A5\u03A6\u03A7\u03A8\u03A9\u03AA\u03AB\u03AC\u03AD\u03AE\u03AF\u03B0\u03B1\u03B2\u03B3\u03B4\u03B5\u03B6\u03B7\u03B8\u03B9\u03BA\u03BB\u03BC\u03BD\u03BE\u03BF\u03C0\u03C1\u03C2\u03C3\u03C4\u03C5\u03C6\u03C7\u03C8\u03C9\u03CA\u03CB\u03CC\u03CD\u03CE\u03CF\u03D0\u03D1\u03D2\u03D3\u03D4\u03D5\u03D6\u03D7\u03D8\u03D9\u03DA\u03DB\u03DC\u03DD\u03DE\u03DF\u03E0\u03E1\u03E2\u03E3\u03E4\u03E5\u03E6\u03E7\u03E8\u03E9\u03EA\u03EB\u03EC\u03ED\u03EE\u03EF\u03F0\u03F1\u03F2\u03F3\u03F4\u03F5\u03F6\u03F7\u03F8\u03F9\u03FA\u03FB\u03FC\u03FD\u03FE\u03FF"sv, + u8"\u0300\u0301\u0302\u0303\u0304\u0305\u0306\u0307\u0308\u0309\u030A\u030B\u030C\u030D\u030E\u030F\u0310\u0311\u0312\u0313\u0314\u0315\u0316\u0317\u0318\u0319\u031A\u031B\u031C\u031D\u031E\u031F\u0320\u0321\u0322\u0323\u0324\u0325\u0326\u0327\u0328\u0329\u032A\u032B\u032C\u032D\u032E\u032F\u0330\u0331\u0332\u0333\u0334\u0335\u0336\u0337\u0338\u0339\u033A\u033B\u033C\u033D\u033E\u033F\u0340\u0341\u0342\u0343\u0344\u03B9\u0346\u0347\u0348\u0349\u034A\u034B\u034C\u034D\u034E\u034F\u0350\u0351\u0352\u0353\u0354\u0355\u0356\u0357\u0358\u0359\u035A\u035B\u035C\u035D\u035E\u035F\u0360\u0361\u0362\u0363\u0364\u0365\u0366\u0367\u0368\u0369\u036A\u036B\u036C\u036D\u036E\u036F\u0371\u0371\u0373\u0373\u0374\u0375\u0377\u0377\u0378\u0379\u037A\u037B\u037C\u037D\u037E\u03F3\u0380\u0381\u0382\u0383\u0384\u0385\u03AC\u0387\u03AD\u03AE\u03AF\u038B\u03CC\u038D\u03CD\u03CE\u0390\u03B1\u03B2\u03B3\u03B4\u03B5\u03B6\u03B7\u03B8\u03B9\u03BA\u03BB\u03BC\u03BD\u03BE\u03BF\u03C0\u03C1\u03A2\u03C3\u03C4\u03C5\u03C6\u03C7\u03C8\u03C9\u03CA\u03CB\u03AC\u03AD\u03AE\u03AF\u03B0\u03B1\u03B2\u03B3\u03B4\u03B5\u03B6\u03B7\u03B8\u03B9\u03BA\u03BB\u03BC\u03BD\u03BE\u03BF\u03C0\u03C1\u03C3\u03C3\u03C4\u03C5\u03C6\u03C7\u03C8\u03C9\u03CA\u03CB\u03CC\u03CD\u03CE\u03D7\u03B2\u03B8\u03D2\u03D3\u03D4\u03C6\u03C0\u03D7\u03D9\u03D9\u03DB\u03DB\u03DD\u03DD\u03DF\u03DF\u03E1\u03E1\u03E3\u03E3\u03E5\u03E5\u03E7\u03E7\u03E9\u03E9\u03EB\u03EB\u03ED\u03ED\u03EF\u03EF\u03BA\u03C1\u03F2\u03F3\u03B8\u03B5\u03F6\u03F8\u03F8\u03F2\u03FB\u03FB\u03FC\u037B\u037C\u037D"sv}, + {u8"\u0400\u0401\u0402\u0403\u0404\u0405\u0406\u0407\u0408\u0409\u040A\u040B\u040C\u040D\u040E\u040F\u0410\u0411\u0412\u0413\u0414\u0415\u0416\u0417\u0418\u0419\u041A\u041B\u041C\u041D\u041E\u041F\u0420\u0421\u0422\u0423\u0424\u0425\u0426\u0427\u0428\u0429\u042A\u042B\u042C\u042D\u042E\u042F\u0430\u0431\u0432\u0433\u0434\u0435\u0436\u0437\u0438\u0439\u043A\u043B\u043C\u043D\u043E\u043F\u0440\u0441\u0442\u0443\u0444\u0445\u0446\u0447\u0448\u0449\u044A\u044B\u044C\u044D\u044E\u044F\u0450\u0451\u0452\u0453\u0454\u0455\u0456\u0457\u0458\u0459\u045A\u045B\u045C\u045D\u045E\u045F\u0460\u0461\u0462\u0463\u0464\u0465\u0466\u0467\u0468\u0469\u046A\u046B\u046C\u046D\u046E\u046F\u0470\u0471\u0472\u0473\u0474\u0475\u0476\u0477\u0478\u0479\u047A\u047B\u047C\u047D\u047E\u047F\u0480\u0481\u0482\u0483\u0484\u0485\u0486\u0487\u0488\u0489\u048A\u048B\u048C\u048D\u048E\u048F\u0490\u0491\u0492\u0493\u0494\u0495\u0496\u0497\u0498\u0499\u049A\u049B\u049C\u049D\u049E\u049F\u04A0\u04A1\u04A2\u04A3\u04A4\u04A5\u04A6\u04A7\u04A8\u04A9\u04AA\u04AB\u04AC\u04AD\u04AE\u04AF\u04B0\u04B1\u04B2\u04B3\u04B4\u04B5\u04B6\u04B7\u04B8\u04B9\u04BA\u04BB\u04BC\u04BD\u04BE\u04BF\u04C0\u04C1\u04C2\u04C3\u04C4\u04C5\u04C6\u04C7\u04C8\u04C9\u04CA\u04CB\u04CC\u04CD\u04CE\u04CF\u04D0\u04D1\u04D2\u04D3\u04D4\u04D5\u04D6\u04D7\u04D8\u04D9\u04DA\u04DB\u04DC\u04DD\u04DE\u04DF\u04E0\u04E1\u04E2\u04E3\u04E4\u04E5\u04E6\u04E7\u04E8\u04E9\u04EA\u04EB\u04EC\u04ED\u04EE\u04EF\u04F0\u04F1\u04F2\u04F3\u04F4\u04F5\u04F6\u04F7\u04F8\u04F9\u04FA\u04FB\u04FC\u04FD\u04FE\u04FF"sv, + u8"\u0450\u0451\u0452\u0453\u0454\u0455\u0456\u0457\u0458\u0459\u045A\u045B\u045C\u045D\u045E\u045F\u0430\u0431\u0432\u0433\u0434\u0435\u0436\u0437\u0438\u0439\u043A\u043B\u043C\u043D\u043E\u043F\u0440\u0441\u0442\u0443\u0444\u0445\u0446\u0447\u0448\u0449\u044A\u044B\u044C\u044D\u044E\u044F\u0430\u0431\u0432\u0433\u0434\u0435\u0436\u0437\u0438\u0439\u043A\u043B\u043C\u043D\u043E\u043F\u0440\u0441\u0442\u0443\u0444\u0445\u0446\u0447\u0448\u0449\u044A\u044B\u044C\u044D\u044E\u044F\u0450\u0451\u0452\u0453\u0454\u0455\u0456\u0457\u0458\u0459\u045A\u045B\u045C\u045D\u045E\u045F\u0461\u0461\u0463\u0463\u0465\u0465\u0467\u0467\u0469\u0469\u046B\u046B\u046D\u046D\u046F\u046F\u0471\u0471\u0473\u0473\u0475\u0475\u0477\u0477\u0479\u0479\u047B\u047B\u047D\u047D\u047F\u047F\u0481\u0481\u0482\u0483\u0484\u0485\u0486\u0487\u0488\u0489\u048B\u048B\u048D\u048D\u048F\u048F\u0491\u0491\u0493\u0493\u0495\u0495\u0497\u0497\u0499\u0499\u049B\u049B\u049D\u049D\u049F\u049F\u04A1\u04A1\u04A3\u04A3\u04A5\u04A5\u04A7\u04A7\u04A9\u04A9\u04AB\u04AB\u04AD\u04AD\u04AF\u04AF\u04B1\u04B1\u04B3\u04B3\u04B5\u04B5\u04B7\u04B7\u04B9\u04B9\u04BB\u04BB\u04BD\u04BD\u04BF\u04BF\u04CF\u04C2\u04C2\u04C4\u04C4\u04C6\u04C6\u04C8\u04C8\u04CA\u04CA\u04CC\u04CC\u04CE\u04CE\u04CF\u04D1\u04D1\u04D3\u04D3\u04D5\u04D5\u04D7\u04D7\u04D9\u04D9\u04DB\u04DB\u04DD\u04DD\u04DF\u04DF\u04E1\u04E1\u04E3\u04E3\u04E5\u04E5\u04E7\u04E7\u04E9\u04E9\u04EB\u04EB\u04ED\u04ED\u04EF\u04EF\u04F1\u04F1\u04F3\u04F3\u04F5\u04F5\u04F7\u04F7\u04F9\u04F9\u04FB\u04FB\u04FD\u04FD\u04FF\u04FF"sv}, + {u8"\u0500\u0501\u0502\u0503\u0504\u0505\u0506\u0507\u0508\u0509\u050A\u050B\u050C\u050D\u050E\u050F\u0510\u0511\u0512\u0513\u0514\u0515\u0516\u0517\u0518\u0519\u051A\u051B\u051C\u051D\u051E\u051F\u0520\u0521\u0522\u0523\u0524\u0525\u0526\u0527\u0528\u0529\u052A\u052B\u052C\u052D\u052E\u052F\u0530\u0531\u0532\u0533\u0534\u0535\u0536\u0537\u0538\u0539\u053A\u053B\u053C\u053D\u053E\u053F\u0540\u0541\u0542\u0543\u0544\u0545\u0546\u0547\u0548\u0549\u054A\u054B\u054C\u054D\u054E\u054F\u0550\u0551\u0552\u0553\u0554\u0555\u0556\u0557\u0558\u0559\u055A\u055B\u055C\u055D\u055E\u055F\u0560\u0561\u0562\u0563\u0564\u0565\u0566\u0567\u0568\u0569\u056A\u056B\u056C\u056D\u056E\u056F\u0570\u0571\u0572\u0573\u0574\u0575\u0576\u0577\u0578\u0579\u057A\u057B\u057C\u057D\u057E\u057F\u0580\u0581\u0582\u0583\u0584\u0585\u0586\u0587\u0588\u0589\u058A\u058B\u058C\u058D\u058E\u058F\u0590\u0591\u0592\u0593\u0594\u0595\u0596\u0597\u0598\u0599\u059A\u059B\u059C\u059D\u059E\u059F\u05A0\u05A1\u05A2\u05A3\u05A4\u05A5\u05A6\u05A7\u05A8\u05A9\u05AA\u05AB\u05AC\u05AD\u05AE\u05AF\u05B0\u05B1\u05B2\u05B3\u05B4\u05B5\u05B6\u05B7\u05B8\u05B9\u05BA\u05BB\u05BC\u05BD\u05BE\u05BF\u05C0\u05C1\u05C2\u05C3\u05C4\u05C5\u05C6\u05C7\u05C8\u05C9\u05CA\u05CB\u05CC\u05CD\u05CE\u05CF\u05D0\u05D1\u05D2\u05D3\u05D4\u05D5\u05D6\u05D7\u05D8\u05D9\u05DA\u05DB\u05DC\u05DD\u05DE\u05DF\u05E0\u05E1\u05E2\u05E3\u05E4\u05E5\u05E6\u05E7\u05E8\u05E9\u05EA\u05EB\u05EC\u05ED\u05EE\u05EF\u05F0\u05F1\u05F2\u05F3\u05F4\u05F5\u05F6\u05F7\u05F8\u05F9\u05FA\u05FB\u05FC\u05FD\u05FE\u05FF"sv, + u8"\u0501\u0501\u0503\u0503\u0505\u0505\u0507\u0507\u0509\u0509\u050B\u050B\u050D\u050D\u050F\u050F\u0511\u0511\u0513\u0513\u0515\u0515\u0517\u0517\u0519\u0519\u051B\u051B\u051D\u051D\u051F\u051F\u0521\u0521\u0523\u0523\u0525\u0525\u0527\u0527\u0529\u0529\u052B\u052B\u052D\u052D\u052F\u052F\u0530\u0561\u0562\u0563\u0564\u0565\u0566\u0567\u0568\u0569\u056A\u056B\u056C\u056D\u056E\u056F\u0570\u0571\u0572\u0573\u0574\u0575\u0576\u0577\u0578\u0579\u057A\u057B\u057C\u057D\u057E\u057F\u0580\u0581\u0582\u0583\u0584\u0585\u0586\u0557\u0558\u0559\u055A\u055B\u055C\u055D\u055E\u055F\u0560\u0561\u0562\u0563\u0564\u0565\u0566\u0567\u0568\u0569\u056A\u056B\u056C\u056D\u056E\u056F\u0570\u0571\u0572\u0573\u0574\u0575\u0576\u0577\u0578\u0579\u057A\u057B\u057C\u057D\u057E\u057F\u0580\u0581\u0582\u0583\u0584\u0585\u0586\u0587\u0588\u0589\u058A\u058B\u058C\u058D\u058E\u058F\u0590\u0591\u0592\u0593\u0594\u0595\u0596\u0597\u0598\u0599\u059A\u059B\u059C\u059D\u059E\u059F\u05A0\u05A1\u05A2\u05A3\u05A4\u05A5\u05A6\u05A7\u05A8\u05A9\u05AA\u05AB\u05AC\u05AD\u05AE\u05AF\u05B0\u05B1\u05B2\u05B3\u05B4\u05B5\u05B6\u05B7\u05B8\u05B9\u05BA\u05BB\u05BC\u05BD\u05BE\u05BF\u05C0\u05C1\u05C2\u05C3\u05C4\u05C5\u05C6\u05C7\u05C8\u05C9\u05CA\u05CB\u05CC\u05CD\u05CE\u05CF\u05D0\u05D1\u05D2\u05D3\u05D4\u05D5\u05D6\u05D7\u05D8\u05D9\u05DA\u05DB\u05DC\u05DD\u05DE\u05DF\u05E0\u05E1\u05E2\u05E3\u05E4\u05E5\u05E6\u05E7\u05E8\u05E9\u05EA\u05EB\u05EC\u05ED\u05EE\u05EF\u05F0\u05F1\u05F2\u05F3\u05F4\u05F5\u05F6\u05F7\u05F8\u05F9\u05FA\u05FB\u05FC\u05FD\u05FE\u05FF"sv}, + {u8"\u1000\u1001\u1002\u1003\u1004\u1005\u1006\u1007\u1008\u1009\u100A\u100B\u100C\u100D\u100E\u100F\u1010\u1011\u1012\u1013\u1014\u1015\u1016\u1017\u1018\u1019\u101A\u101B\u101C\u101D\u101E\u101F\u1020\u1021\u1022\u1023\u1024\u1025\u1026\u1027\u1028\u1029\u102A\u102B\u102C\u102D\u102E\u102F\u1030\u1031\u1032\u1033\u1034\u1035\u1036\u1037\u1038\u1039\u103A\u103B\u103C\u103D\u103E\u103F\u1040\u1041\u1042\u1043\u1044\u1045\u1046\u1047\u1048\u1049\u104A\u104B\u104C\u104D\u104E\u104F\u1050\u1051\u1052\u1053\u1054\u1055\u1056\u1057\u1058\u1059\u105A\u105B\u105C\u105D\u105E\u105F\u1060\u1061\u1062\u1063\u1064\u1065\u1066\u1067\u1068\u1069\u106A\u106B\u106C\u106D\u106E\u106F\u1070\u1071\u1072\u1073\u1074\u1075\u1076\u1077\u1078\u1079\u107A\u107B\u107C\u107D\u107E\u107F\u1080\u1081\u1082\u1083\u1084\u1085\u1086\u1087\u1088\u1089\u108A\u108B\u108C\u108D\u108E\u108F\u1090\u1091\u1092\u1093\u1094\u1095\u1096\u1097\u1098\u1099\u109A\u109B\u109C\u109D\u109E\u109F\u10A0\u10A1\u10A2\u10A3\u10A4\u10A5\u10A6\u10A7\u10A8\u10A9\u10AA\u10AB\u10AC\u10AD\u10AE\u10AF\u10B0\u10B1\u10B2\u10B3\u10B4\u10B5\u10B6\u10B7\u10B8\u10B9\u10BA\u10BB\u10BC\u10BD\u10BE\u10BF\u10C0\u10C1\u10C2\u10C3\u10C4\u10C5\u10C6\u10C7\u10C8\u10C9\u10CA\u10CB\u10CC\u10CD\u10CE\u10CF\u10D0\u10D1\u10D2\u10D3\u10D4\u10D5\u10D6\u10D7\u10D8\u10D9\u10DA\u10DB\u10DC\u10DD\u10DE\u10DF\u10E0\u10E1\u10E2\u10E3\u10E4\u10E5\u10E6\u10E7\u10E8\u10E9\u10EA\u10EB\u10EC\u10ED\u10EE\u10EF\u10F0\u10F1\u10F2\u10F3\u10F4\u10F5\u10F6\u10F7\u10F8\u10F9\u10FA\u10FB\u10FC\u10FD\u10FE\u10FF"sv, u8"\u1000\u1001\u1002\u1003\u1004\u1005\u1006\u1007\u1008\u1009\u100A\u100B\u100C\u100D\u100E\u100F\u1010\u1011\u1012\u1013\u1014\u1015\u1016\u1017\u1018\u1019\u101A\u101B\u101C\u101D\u101E\u101F\u1020\u1021\u1022\u1023\u1024\u1025\u1026\u1027\u1028\u1029\u102A\u102B\u102C\u102D\u102E\u102F\u1030\u1031\u1032\u1033\u1034\u1035\u1036\u1037\u1038\u1039\u103A\u103B\u103C\u103D\u103E\u103F\u1040\u1041\u1042\u1043\u1044\u1045\u1046\u1047\u1048\u1049\u104A\u104B\u104C\u104D\u104E\u104F\u1050\u1051\u1052\u1053\u1054\u1055\u1056\u1057\u1058\u1059\u105A\u105B\u105C\u105D\u105E\u105F\u1060\u1061\u1062\u1063\u1064\u1065\u1066\u1067\u1068\u1069\u106A\u106B\u106C\u106D\u106E\u106F\u1070\u1071\u1072\u1073\u1074\u1075\u1076\u1077\u1078\u1079\u107A\u107B\u107C\u107D\u107E\u107F\u1080\u1081\u1082\u1083\u1084\u1085\u1086\u1087\u1088\u1089\u108A\u108B\u108C\u108D\u108E\u108F\u1090\u1091\u1092\u1093\u1094\u1095\u1096\u1097\u1098\u1099\u109A\u109B\u109C\u109D\u109E\u109F\u2D00\u2D01\u2D02\u2D03\u2D04\u2D05\u2D06\u2D07\u2D08\u2D09\u2D0A\u2D0B\u2D0C\u2D0D\u2D0E\u2D0F\u2D10\u2D11\u2D12\u2D13\u2D14\u2D15\u2D16\u2D17\u2D18\u2D19\u2D1A\u2D1B\u2D1C\u2D1D\u2D1E\u2D1F\u2D20\u2D21\u2D22\u2D23\u2D24\u2D25\u10C6\u2D27\u10C8\u10C9\u10CA\u10CB\u10CC\u2D2D\u10CE\u10CF\u10D0\u10D1\u10D2\u10D3\u10D4\u10D5\u10D6\u10D7\u10D8\u10D9\u10DA\u10DB\u10DC\u10DD\u10DE\u10DF\u10E0\u10E1\u10E2\u10E3\u10E4\u10E5\u10E6\u10E7\u10E8\u10E9\u10EA\u10EB\u10EC\u10ED\u10EE\u10EF\u10F0\u10F1\u10F2\u10F3\u10F4\u10F5\u10F6\u10F7\u10F8\u10F9\u10FA\u10FB\u10FC\u10FD\u10FE\u10FF"sv}, + {u8"\u1300\u1301\u1302\u1303\u1304\u1305\u1306\u1307\u1308\u1309\u130A\u130B\u130C\u130D\u130E\u130F\u1310\u1311\u1312\u1313\u1314\u1315\u1316\u1317\u1318\u1319\u131A\u131B\u131C\u131D\u131E\u131F\u1320\u1321\u1322\u1323\u1324\u1325\u1326\u1327\u1328\u1329\u132A\u132B\u132C\u132D\u132E\u132F\u1330\u1331\u1332\u1333\u1334\u1335\u1336\u1337\u1338\u1339\u133A\u133B\u133C\u133D\u133E\u133F\u1340\u1341\u1342\u1343\u1344\u1345\u1346\u1347\u1348\u1349\u134A\u134B\u134C\u134D\u134E\u134F\u1350\u1351\u1352\u1353\u1354\u1355\u1356\u1357\u1358\u1359\u135A\u135B\u135C\u135D\u135E\u135F\u1360\u1361\u1362\u1363\u1364\u1365\u1366\u1367\u1368\u1369\u136A\u136B\u136C\u136D\u136E\u136F\u1370\u1371\u1372\u1373\u1374\u1375\u1376\u1377\u1378\u1379\u137A\u137B\u137C\u137D\u137E\u137F\u1380\u1381\u1382\u1383\u1384\u1385\u1386\u1387\u1388\u1389\u138A\u138B\u138C\u138D\u138E\u138F\u1390\u1391\u1392\u1393\u1394\u1395\u1396\u1397\u1398\u1399\u139A\u139B\u139C\u139D\u139E\u139F\u13A0\u13A1\u13A2\u13A3\u13A4\u13A5\u13A6\u13A7\u13A8\u13A9\u13AA\u13AB\u13AC\u13AD\u13AE\u13AF\u13B0\u13B1\u13B2\u13B3\u13B4\u13B5\u13B6\u13B7\u13B8\u13B9\u13BA\u13BB\u13BC\u13BD\u13BE\u13BF\u13C0\u13C1\u13C2\u13C3\u13C4\u13C5\u13C6\u13C7\u13C8\u13C9\u13CA\u13CB\u13CC\u13CD\u13CE\u13CF\u13D0\u13D1\u13D2\u13D3\u13D4\u13D5\u13D6\u13D7\u13D8\u13D9\u13DA\u13DB\u13DC\u13DD\u13DE\u13DF\u13E0\u13E1\u13E2\u13E3\u13E4\u13E5\u13E6\u13E7\u13E8\u13E9\u13EA\u13EB\u13EC\u13ED\u13EE\u13EF\u13F0\u13F1\u13F2\u13F3\u13F4\u13F5\u13F6\u13F7\u13F8\u13F9\u13FA\u13FB\u13FC\u13FD\u13FE\u13FF"sv, + u8"\u1300\u1301\u1302\u1303\u1304\u1305\u1306\u1307\u1308\u1309\u130A\u130B\u130C\u130D\u130E\u130F\u1310\u1311\u1312\u1313\u1314\u1315\u1316\u1317\u1318\u1319\u131A\u131B\u131C\u131D\u131E\u131F\u1320\u1321\u1322\u1323\u1324\u1325\u1326\u1327\u1328\u1329\u132A\u132B\u132C\u132D\u132E\u132F\u1330\u1331\u1332\u1333\u1334\u1335\u1336\u1337\u1338\u1339\u133A\u133B\u133C\u133D\u133E\u133F\u1340\u1341\u1342\u1343\u1344\u1345\u1346\u1347\u1348\u1349\u134A\u134B\u134C\u134D\u134E\u134F\u1350\u1351\u1352\u1353\u1354\u1355\u1356\u1357\u1358\u1359\u135A\u135B\u135C\u135D\u135E\u135F\u1360\u1361\u1362\u1363\u1364\u1365\u1366\u1367\u1368\u1369\u136A\u136B\u136C\u136D\u136E\u136F\u1370\u1371\u1372\u1373\u1374\u1375\u1376\u1377\u1378\u1379\u137A\u137B\u137C\u137D\u137E\u137F\u1380\u1381\u1382\u1383\u1384\u1385\u1386\u1387\u1388\u1389\u138A\u138B\u138C\u138D\u138E\u138F\u1390\u1391\u1392\u1393\u1394\u1395\u1396\u1397\u1398\u1399\u139A\u139B\u139C\u139D\u139E\u139F\u13A0\u13A1\u13A2\u13A3\u13A4\u13A5\u13A6\u13A7\u13A8\u13A9\u13AA\u13AB\u13AC\u13AD\u13AE\u13AF\u13B0\u13B1\u13B2\u13B3\u13B4\u13B5\u13B6\u13B7\u13B8\u13B9\u13BA\u13BB\u13BC\u13BD\u13BE\u13BF\u13C0\u13C1\u13C2\u13C3\u13C4\u13C5\u13C6\u13C7\u13C8\u13C9\u13CA\u13CB\u13CC\u13CD\u13CE\u13CF\u13D0\u13D1\u13D2\u13D3\u13D4\u13D5\u13D6\u13D7\u13D8\u13D9\u13DA\u13DB\u13DC\u13DD\u13DE\u13DF\u13E0\u13E1\u13E2\u13E3\u13E4\u13E5\u13E6\u13E7\u13E8\u13E9\u13EA\u13EB\u13EC\u13ED\u13EE\u13EF\u13F0\u13F1\u13F2\u13F3\u13F4\u13F5\u13F6\u13F7\u13F0\u13F1\u13F2\u13F3\u13F4\u13F5\u13FE\u13FF"sv}, + {u8"\u1C00\u1C01\u1C02\u1C03\u1C04\u1C05\u1C06\u1C07\u1C08\u1C09\u1C0A\u1C0B\u1C0C\u1C0D\u1C0E\u1C0F\u1C10\u1C11\u1C12\u1C13\u1C14\u1C15\u1C16\u1C17\u1C18\u1C19\u1C1A\u1C1B\u1C1C\u1C1D\u1C1E\u1C1F\u1C20\u1C21\u1C22\u1C23\u1C24\u1C25\u1C26\u1C27\u1C28\u1C29\u1C2A\u1C2B\u1C2C\u1C2D\u1C2E\u1C2F\u1C30\u1C31\u1C32\u1C33\u1C34\u1C35\u1C36\u1C37\u1C38\u1C39\u1C3A\u1C3B\u1C3C\u1C3D\u1C3E\u1C3F\u1C40\u1C41\u1C42\u1C43\u1C44\u1C45\u1C46\u1C47\u1C48\u1C49\u1C4A\u1C4B\u1C4C\u1C4D\u1C4E\u1C4F\u1C50\u1C51\u1C52\u1C53\u1C54\u1C55\u1C56\u1C57\u1C58\u1C59\u1C5A\u1C5B\u1C5C\u1C5D\u1C5E\u1C5F\u1C60\u1C61\u1C62\u1C63\u1C64\u1C65\u1C66\u1C67\u1C68\u1C69\u1C6A\u1C6B\u1C6C\u1C6D\u1C6E\u1C6F\u1C70\u1C71\u1C72\u1C73\u1C74\u1C75\u1C76\u1C77\u1C78\u1C79\u1C7A\u1C7B\u1C7C\u1C7D\u1C7E\u1C7F\u1C80\u1C81\u1C82\u1C83\u1C84\u1C85\u1C86\u1C87\u1C88\u1C89\u1C8A\u1C8B\u1C8C\u1C8D\u1C8E\u1C8F\u1C90\u1C91\u1C92\u1C93\u1C94\u1C95\u1C96\u1C97\u1C98\u1C99\u1C9A\u1C9B\u1C9C\u1C9D\u1C9E\u1C9F\u1CA0\u1CA1\u1CA2\u1CA3\u1CA4\u1CA5\u1CA6\u1CA7\u1CA8\u1CA9\u1CAA\u1CAB\u1CAC\u1CAD\u1CAE\u1CAF\u1CB0\u1CB1\u1CB2\u1CB3\u1CB4\u1CB5\u1CB6\u1CB7\u1CB8\u1CB9\u1CBA\u1CBB\u1CBC\u1CBD\u1CBE\u1CBF\u1CC0\u1CC1\u1CC2\u1CC3\u1CC4\u1CC5\u1CC6\u1CC7\u1CC8\u1CC9\u1CCA\u1CCB\u1CCC\u1CCD\u1CCE\u1CCF\u1CD0\u1CD1\u1CD2\u1CD3\u1CD4\u1CD5\u1CD6\u1CD7\u1CD8\u1CD9\u1CDA\u1CDB\u1CDC\u1CDD\u1CDE\u1CDF\u1CE0\u1CE1\u1CE2\u1CE3\u1CE4\u1CE5\u1CE6\u1CE7\u1CE8\u1CE9\u1CEA\u1CEB\u1CEC\u1CED\u1CEE\u1CEF\u1CF0\u1CF1\u1CF2\u1CF3\u1CF4\u1CF5\u1CF6\u1CF7\u1CF8\u1CF9\u1CFA\u1CFB\u1CFC\u1CFD\u1CFE\u1CFF"sv, + u8"\u1C00\u1C01\u1C02\u1C03\u1C04\u1C05\u1C06\u1C07\u1C08\u1C09\u1C0A\u1C0B\u1C0C\u1C0D\u1C0E\u1C0F\u1C10\u1C11\u1C12\u1C13\u1C14\u1C15\u1C16\u1C17\u1C18\u1C19\u1C1A\u1C1B\u1C1C\u1C1D\u1C1E\u1C1F\u1C20\u1C21\u1C22\u1C23\u1C24\u1C25\u1C26\u1C27\u1C28\u1C29\u1C2A\u1C2B\u1C2C\u1C2D\u1C2E\u1C2F\u1C30\u1C31\u1C32\u1C33\u1C34\u1C35\u1C36\u1C37\u1C38\u1C39\u1C3A\u1C3B\u1C3C\u1C3D\u1C3E\u1C3F\u1C40\u1C41\u1C42\u1C43\u1C44\u1C45\u1C46\u1C47\u1C48\u1C49\u1C4A\u1C4B\u1C4C\u1C4D\u1C4E\u1C4F\u1C50\u1C51\u1C52\u1C53\u1C54\u1C55\u1C56\u1C57\u1C58\u1C59\u1C5A\u1C5B\u1C5C\u1C5D\u1C5E\u1C5F\u1C60\u1C61\u1C62\u1C63\u1C64\u1C65\u1C66\u1C67\u1C68\u1C69\u1C6A\u1C6B\u1C6C\u1C6D\u1C6E\u1C6F\u1C70\u1C71\u1C72\u1C73\u1C74\u1C75\u1C76\u1C77\u1C78\u1C79\u1C7A\u1C7B\u1C7C\u1C7D\u1C7E\u1C7F\u0432\u0434\u043E\u0441\u0442\u0442\u044A\u0463\uA64B\u1C8A\u1C8A\u1C8B\u1C8C\u1C8D\u1C8E\u1C8F\u10D0\u10D1\u10D2\u10D3\u10D4\u10D5\u10D6\u10D7\u10D8\u10D9\u10DA\u10DB\u10DC\u10DD\u10DE\u10DF\u10E0\u10E1\u10E2\u10E3\u10E4\u10E5\u10E6\u10E7\u10E8\u10E9\u10EA\u10EB\u10EC\u10ED\u10EE\u10EF\u10F0\u10F1\u10F2\u10F3\u10F4\u10F5\u10F6\u10F7\u10F8\u10F9\u10FA\u1CBB\u1CBC\u10FD\u10FE\u10FF\u1CC0\u1CC1\u1CC2\u1CC3\u1CC4\u1CC5\u1CC6\u1CC7\u1CC8\u1CC9\u1CCA\u1CCB\u1CCC\u1CCD\u1CCE\u1CCF\u1CD0\u1CD1\u1CD2\u1CD3\u1CD4\u1CD5\u1CD6\u1CD7\u1CD8\u1CD9\u1CDA\u1CDB\u1CDC\u1CDD\u1CDE\u1CDF\u1CE0\u1CE1\u1CE2\u1CE3\u1CE4\u1CE5\u1CE6\u1CE7\u1CE8\u1CE9\u1CEA\u1CEB\u1CEC\u1CED\u1CEE\u1CEF\u1CF0\u1CF1\u1CF2\u1CF3\u1CF4\u1CF5\u1CF6\u1CF7\u1CF8\u1CF9\u1CFA\u1CFB\u1CFC\u1CFD\u1CFE\u1CFF"sv}, + {u8"\u1E00\u1E01\u1E02\u1E03\u1E04\u1E05\u1E06\u1E07\u1E08\u1E09\u1E0A\u1E0B\u1E0C\u1E0D\u1E0E\u1E0F\u1E10\u1E11\u1E12\u1E13\u1E14\u1E15\u1E16\u1E17\u1E18\u1E19\u1E1A\u1E1B\u1E1C\u1E1D\u1E1E\u1E1F\u1E20\u1E21\u1E22\u1E23\u1E24\u1E25\u1E26\u1E27\u1E28\u1E29\u1E2A\u1E2B\u1E2C\u1E2D\u1E2E\u1E2F\u1E30\u1E31\u1E32\u1E33\u1E34\u1E35\u1E36\u1E37\u1E38\u1E39\u1E3A\u1E3B\u1E3C\u1E3D\u1E3E\u1E3F\u1E40\u1E41\u1E42\u1E43\u1E44\u1E45\u1E46\u1E47\u1E48\u1E49\u1E4A\u1E4B\u1E4C\u1E4D\u1E4E\u1E4F\u1E50\u1E51\u1E52\u1E53\u1E54\u1E55\u1E56\u1E57\u1E58\u1E59\u1E5A\u1E5B\u1E5C\u1E5D\u1E5E\u1E5F\u1E60\u1E61\u1E62\u1E63\u1E64\u1E65\u1E66\u1E67\u1E68\u1E69\u1E6A\u1E6B\u1E6C\u1E6D\u1E6E\u1E6F\u1E70\u1E71\u1E72\u1E73\u1E74\u1E75\u1E76\u1E77\u1E78\u1E79\u1E7A\u1E7B\u1E7C\u1E7D\u1E7E\u1E7F\u1E80\u1E81\u1E82\u1E83\u1E84\u1E85\u1E86\u1E87\u1E88\u1E89\u1E8A\u1E8B\u1E8C\u1E8D\u1E8E\u1E8F\u1E90\u1E91\u1E92\u1E93\u1E94\u1E95\u1E96\u1E97\u1E98\u1E99\u1E9A\u1E9B\u1E9C\u1E9D\u1E9E\u1E9F\u1EA0\u1EA1\u1EA2\u1EA3\u1EA4\u1EA5\u1EA6\u1EA7\u1EA8\u1EA9\u1EAA\u1EAB\u1EAC\u1EAD\u1EAE\u1EAF\u1EB0\u1EB1\u1EB2\u1EB3\u1EB4\u1EB5\u1EB6\u1EB7\u1EB8\u1EB9\u1EBA\u1EBB\u1EBC\u1EBD\u1EBE\u1EBF\u1EC0\u1EC1\u1EC2\u1EC3\u1EC4\u1EC5\u1EC6\u1EC7\u1EC8\u1EC9\u1ECA\u1ECB\u1ECC\u1ECD\u1ECE\u1ECF\u1ED0\u1ED1\u1ED2\u1ED3\u1ED4\u1ED5\u1ED6\u1ED7\u1ED8\u1ED9\u1EDA\u1EDB\u1EDC\u1EDD\u1EDE\u1EDF\u1EE0\u1EE1\u1EE2\u1EE3\u1EE4\u1EE5\u1EE6\u1EE7\u1EE8\u1EE9\u1EEA\u1EEB\u1EEC\u1EED\u1EEE\u1EEF\u1EF0\u1EF1\u1EF2\u1EF3\u1EF4\u1EF5\u1EF6\u1EF7\u1EF8\u1EF9\u1EFA\u1EFB\u1EFC\u1EFD\u1EFE\u1EFF"sv, + u8"\u1E01\u1E01\u1E03\u1E03\u1E05\u1E05\u1E07\u1E07\u1E09\u1E09\u1E0B\u1E0B\u1E0D\u1E0D\u1E0F\u1E0F\u1E11\u1E11\u1E13\u1E13\u1E15\u1E15\u1E17\u1E17\u1E19\u1E19\u1E1B\u1E1B\u1E1D\u1E1D\u1E1F\u1E1F\u1E21\u1E21\u1E23\u1E23\u1E25\u1E25\u1E27\u1E27\u1E29\u1E29\u1E2B\u1E2B\u1E2D\u1E2D\u1E2F\u1E2F\u1E31\u1E31\u1E33\u1E33\u1E35\u1E35\u1E37\u1E37\u1E39\u1E39\u1E3B\u1E3B\u1E3D\u1E3D\u1E3F\u1E3F\u1E41\u1E41\u1E43\u1E43\u1E45\u1E45\u1E47\u1E47\u1E49\u1E49\u1E4B\u1E4B\u1E4D\u1E4D\u1E4F\u1E4F\u1E51\u1E51\u1E53\u1E53\u1E55\u1E55\u1E57\u1E57\u1E59\u1E59\u1E5B\u1E5B\u1E5D\u1E5D\u1E5F\u1E5F\u1E61\u1E61\u1E63\u1E63\u1E65\u1E65\u1E67\u1E67\u1E69\u1E69\u1E6B\u1E6B\u1E6D\u1E6D\u1E6F\u1E6F\u1E71\u1E71\u1E73\u1E73\u1E75\u1E75\u1E77\u1E77\u1E79\u1E79\u1E7B\u1E7B\u1E7D\u1E7D\u1E7F\u1E7F\u1E81\u1E81\u1E83\u1E83\u1E85\u1E85\u1E87\u1E87\u1E89\u1E89\u1E8B\u1E8B\u1E8D\u1E8D\u1E8F\u1E8F\u1E91\u1E91\u1E93\u1E93\u1E95\u1E95\u1E96\u1E97\u1E98\u1E99\u1E9A\u1E61\u1E9C\u1E9D\u00DF\u1E9F\u1EA1\u1EA1\u1EA3\u1EA3\u1EA5\u1EA5\u1EA7\u1EA7\u1EA9\u1EA9\u1EAB\u1EAB\u1EAD\u1EAD\u1EAF\u1EAF\u1EB1\u1EB1\u1EB3\u1EB3\u1EB5\u1EB5\u1EB7\u1EB7\u1EB9\u1EB9\u1EBB\u1EBB\u1EBD\u1EBD\u1EBF\u1EBF\u1EC1\u1EC1\u1EC3\u1EC3\u1EC5\u1EC5\u1EC7\u1EC7\u1EC9\u1EC9\u1ECB\u1ECB\u1ECD\u1ECD\u1ECF\u1ECF\u1ED1\u1ED1\u1ED3\u1ED3\u1ED5\u1ED5\u1ED7\u1ED7\u1ED9\u1ED9\u1EDB\u1EDB\u1EDD\u1EDD\u1EDF\u1EDF\u1EE1\u1EE1\u1EE3\u1EE3\u1EE5\u1EE5\u1EE7\u1EE7\u1EE9\u1EE9\u1EEB\u1EEB\u1EED\u1EED\u1EEF\u1EEF\u1EF1\u1EF1\u1EF3\u1EF3\u1EF5\u1EF5\u1EF7\u1EF7\u1EF9\u1EF9\u1EFB\u1EFB\u1EFD\u1EFD\u1EFF\u1EFF"sv}, + {u8"\u1F00\u1F01\u1F02\u1F03\u1F04\u1F05\u1F06\u1F07\u1F08\u1F09\u1F0A\u1F0B\u1F0C\u1F0D\u1F0E\u1F0F\u1F10\u1F11\u1F12\u1F13\u1F14\u1F15\u1F16\u1F17\u1F18\u1F19\u1F1A\u1F1B\u1F1C\u1F1D\u1F1E\u1F1F\u1F20\u1F21\u1F22\u1F23\u1F24\u1F25\u1F26\u1F27\u1F28\u1F29\u1F2A\u1F2B\u1F2C\u1F2D\u1F2E\u1F2F\u1F30\u1F31\u1F32\u1F33\u1F34\u1F35\u1F36\u1F37\u1F38\u1F39\u1F3A\u1F3B\u1F3C\u1F3D\u1F3E\u1F3F\u1F40\u1F41\u1F42\u1F43\u1F44\u1F45\u1F46\u1F47\u1F48\u1F49\u1F4A\u1F4B\u1F4C\u1F4D\u1F4E\u1F4F\u1F50\u1F51\u1F52\u1F53\u1F54\u1F55\u1F56\u1F57\u1F58\u1F59\u1F5A\u1F5B\u1F5C\u1F5D\u1F5E\u1F5F\u1F60\u1F61\u1F62\u1F63\u1F64\u1F65\u1F66\u1F67\u1F68\u1F69\u1F6A\u1F6B\u1F6C\u1F6D\u1F6E\u1F6F\u1F70\u1F71\u1F72\u1F73\u1F74\u1F75\u1F76\u1F77\u1F78\u1F79\u1F7A\u1F7B\u1F7C\u1F7D\u1F7E\u1F7F\u1F80\u1F81\u1F82\u1F83\u1F84\u1F85\u1F86\u1F87\u1F88\u1F89\u1F8A\u1F8B\u1F8C\u1F8D\u1F8E\u1F8F\u1F90\u1F91\u1F92\u1F93\u1F94\u1F95\u1F96\u1F97\u1F98\u1F99\u1F9A\u1F9B\u1F9C\u1F9D\u1F9E\u1F9F\u1FA0\u1FA1\u1FA2\u1FA3\u1FA4\u1FA5\u1FA6\u1FA7\u1FA8\u1FA9\u1FAA\u1FAB\u1FAC\u1FAD\u1FAE\u1FAF\u1FB0\u1FB1\u1FB2\u1FB3\u1FB4\u1FB5\u1FB6\u1FB7\u1FB8\u1FB9\u1FBA\u1FBB\u1FBC\u1FBD\u1FBE\u1FBF\u1FC0\u1FC1\u1FC2\u1FC3\u1FC4\u1FC5\u1FC6\u1FC7\u1FC8\u1FC9\u1FCA\u1FCB\u1FCC\u1FCD\u1FCE\u1FCF\u1FD0\u1FD1\u1FD2\u1FD3\u1FD4\u1FD5\u1FD6\u1FD7\u1FD8\u1FD9\u1FDA\u1FDB\u1FDC\u1FDD\u1FDE\u1FDF\u1FE0\u1FE1\u1FE2\u1FE3\u1FE4\u1FE5\u1FE6\u1FE7\u1FE8\u1FE9\u1FEA\u1FEB\u1FEC\u1FED\u1FEE\u1FEF\u1FF0\u1FF1\u1FF2\u1FF3\u1FF4\u1FF5\u1FF6\u1FF7\u1FF8\u1FF9\u1FFA\u1FFB\u1FFC\u1FFD\u1FFE\u1FFF"sv, + u8"\u1F00\u1F01\u1F02\u1F03\u1F04\u1F05\u1F06\u1F07\u1F00\u1F01\u1F02\u1F03\u1F04\u1F05\u1F06\u1F07\u1F10\u1F11\u1F12\u1F13\u1F14\u1F15\u1F16\u1F17\u1F10\u1F11\u1F12\u1F13\u1F14\u1F15\u1F1E\u1F1F\u1F20\u1F21\u1F22\u1F23\u1F24\u1F25\u1F26\u1F27\u1F20\u1F21\u1F22\u1F23\u1F24\u1F25\u1F26\u1F27\u1F30\u1F31\u1F32\u1F33\u1F34\u1F35\u1F36\u1F37\u1F30\u1F31\u1F32\u1F33\u1F34\u1F35\u1F36\u1F37\u1F40\u1F41\u1F42\u1F43\u1F44\u1F45\u1F46\u1F47\u1F40\u1F41\u1F42\u1F43\u1F44\u1F45\u1F4E\u1F4F\u1F50\u1F51\u1F52\u1F53\u1F54\u1F55\u1F56\u1F57\u1F58\u1F51\u1F5A\u1F53\u1F5C\u1F55\u1F5E\u1F57\u1F60\u1F61\u1F62\u1F63\u1F64\u1F65\u1F66\u1F67\u1F60\u1F61\u1F62\u1F63\u1F64\u1F65\u1F66\u1F67\u1F70\u1F71\u1F72\u1F73\u1F74\u1F75\u1F76\u1F77\u1F78\u1F79\u1F7A\u1F7B\u1F7C\u1F7D\u1F7E\u1F7F\u1F80\u1F81\u1F82\u1F83\u1F84\u1F85\u1F86\u1F87\u1F80\u1F81\u1F82\u1F83\u1F84\u1F85\u1F86\u1F87\u1F90\u1F91\u1F92\u1F93\u1F94\u1F95\u1F96\u1F97\u1F90\u1F91\u1F92\u1F93\u1F94\u1F95\u1F96\u1F97\u1FA0\u1FA1\u1FA2\u1FA3\u1FA4\u1FA5\u1FA6\u1FA7\u1FA0\u1FA1\u1FA2\u1FA3\u1FA4\u1FA5\u1FA6\u1FA7\u1FB0\u1FB1\u1FB2\u1FB3\u1FB4\u1FB5\u1FB6\u1FB7\u1FB0\u1FB1\u1F70\u1F71\u1FB3\u1FBD\u03B9\u1FBF\u1FC0\u1FC1\u1FC2\u1FC3\u1FC4\u1FC5\u1FC6\u1FC7\u1F72\u1F73\u1F74\u1F75\u1FC3\u1FCD\u1FCE\u1FCF\u1FD0\u1FD1\u1FD2\u0390\u1FD4\u1FD5\u1FD6\u1FD7\u1FD0\u1FD1\u1F76\u1F77\u1FDC\u1FDD\u1FDE\u1FDF\u1FE0\u1FE1\u1FE2\u03B0\u1FE4\u1FE5\u1FE6\u1FE7\u1FE0\u1FE1\u1F7A\u1F7B\u1FE5\u1FED\u1FEE\u1FEF\u1FF0\u1FF1\u1FF2\u1FF3\u1FF4\u1FF5\u1FF6\u1FF7\u1F78\u1F79\u1F7C\u1F7D\u1FF3\u1FFD\u1FFE\u1FFF"sv}, + {u8"\u2100\u2101\u2102\u2103\u2104\u2105\u2106\u2107\u2108\u2109\u210A\u210B\u210C\u210D\u210E\u210F\u2110\u2111\u2112\u2113\u2114\u2115\u2116\u2117\u2118\u2119\u211A\u211B\u211C\u211D\u211E\u211F\u2120\u2121\u2122\u2123\u2124\u2125\u2126\u2127\u2128\u2129\u212A\u212B\u212C\u212D\u212E\u212F\u2130\u2131\u2132\u2133\u2134\u2135\u2136\u2137\u2138\u2139\u213A\u213B\u213C\u213D\u213E\u213F\u2140\u2141\u2142\u2143\u2144\u2145\u2146\u2147\u2148\u2149\u214A\u214B\u214C\u214D\u214E\u214F\u2150\u2151\u2152\u2153\u2154\u2155\u2156\u2157\u2158\u2159\u215A\u215B\u215C\u215D\u215E\u215F\u2160\u2161\u2162\u2163\u2164\u2165\u2166\u2167\u2168\u2169\u216A\u216B\u216C\u216D\u216E\u216F\u2170\u2171\u2172\u2173\u2174\u2175\u2176\u2177\u2178\u2179\u217A\u217B\u217C\u217D\u217E\u217F\u2180\u2181\u2182\u2183\u2184\u2185\u2186\u2187\u2188\u2189\u218A\u218B\u218C\u218D\u218E\u218F\u2190\u2191\u2192\u2193\u2194\u2195\u2196\u2197\u2198\u2199\u219A\u219B\u219C\u219D\u219E\u219F\u21A0\u21A1\u21A2\u21A3\u21A4\u21A5\u21A6\u21A7\u21A8\u21A9\u21AA\u21AB\u21AC\u21AD\u21AE\u21AF\u21B0\u21B1\u21B2\u21B3\u21B4\u21B5\u21B6\u21B7\u21B8\u21B9\u21BA\u21BB\u21BC\u21BD\u21BE\u21BF\u21C0\u21C1\u21C2\u21C3\u21C4\u21C5\u21C6\u21C7\u21C8\u21C9\u21CA\u21CB\u21CC\u21CD\u21CE\u21CF\u21D0\u21D1\u21D2\u21D3\u21D4\u21D5\u21D6\u21D7\u21D8\u21D9\u21DA\u21DB\u21DC\u21DD\u21DE\u21DF\u21E0\u21E1\u21E2\u21E3\u21E4\u21E5\u21E6\u21E7\u21E8\u21E9\u21EA\u21EB\u21EC\u21ED\u21EE\u21EF\u21F0\u21F1\u21F2\u21F3\u21F4\u21F5\u21F6\u21F7\u21F8\u21F9\u21FA\u21FB\u21FC\u21FD\u21FE\u21FF"sv, + u8"\u2100\u2101\u2102\u2103\u2104\u2105\u2106\u2107\u2108\u2109\u210A\u210B\u210C\u210D\u210E\u210F\u2110\u2111\u2112\u2113\u2114\u2115\u2116\u2117\u2118\u2119\u211A\u211B\u211C\u211D\u211E\u211F\u2120\u2121\u2122\u2123\u2124\u2125\u03C9\u2127\u2128\u2129\u006B\u00E5\u212C\u212D\u212E\u212F\u2130\u2131\u214E\u2133\u2134\u2135\u2136\u2137\u2138\u2139\u213A\u213B\u213C\u213D\u213E\u213F\u2140\u2141\u2142\u2143\u2144\u2145\u2146\u2147\u2148\u2149\u214A\u214B\u214C\u214D\u214E\u214F\u2150\u2151\u2152\u2153\u2154\u2155\u2156\u2157\u2158\u2159\u215A\u215B\u215C\u215D\u215E\u215F\u2170\u2171\u2172\u2173\u2174\u2175\u2176\u2177\u2178\u2179\u217A\u217B\u217C\u217D\u217E\u217F\u2170\u2171\u2172\u2173\u2174\u2175\u2176\u2177\u2178\u2179\u217A\u217B\u217C\u217D\u217E\u217F\u2180\u2181\u2182\u2184\u2184\u2185\u2186\u2187\u2188\u2189\u218A\u218B\u218C\u218D\u218E\u218F\u2190\u2191\u2192\u2193\u2194\u2195\u2196\u2197\u2198\u2199\u219A\u219B\u219C\u219D\u219E\u219F\u21A0\u21A1\u21A2\u21A3\u21A4\u21A5\u21A6\u21A7\u21A8\u21A9\u21AA\u21AB\u21AC\u21AD\u21AE\u21AF\u21B0\u21B1\u21B2\u21B3\u21B4\u21B5\u21B6\u21B7\u21B8\u21B9\u21BA\u21BB\u21BC\u21BD\u21BE\u21BF\u21C0\u21C1\u21C2\u21C3\u21C4\u21C5\u21C6\u21C7\u21C8\u21C9\u21CA\u21CB\u21CC\u21CD\u21CE\u21CF\u21D0\u21D1\u21D2\u21D3\u21D4\u21D5\u21D6\u21D7\u21D8\u21D9\u21DA\u21DB\u21DC\u21DD\u21DE\u21DF\u21E0\u21E1\u21E2\u21E3\u21E4\u21E5\u21E6\u21E7\u21E8\u21E9\u21EA\u21EB\u21EC\u21ED\u21EE\u21EF\u21F0\u21F1\u21F2\u21F3\u21F4\u21F5\u21F6\u21F7\u21F8\u21F9\u21FA\u21FB\u21FC\u21FD\u21FE\u21FF"sv}, + {u8"\u2400\u2401\u2402\u2403\u2404\u2405\u2406\u2407\u2408\u2409\u240A\u240B\u240C\u240D\u240E\u240F\u2410\u2411\u2412\u2413\u2414\u2415\u2416\u2417\u2418\u2419\u241A\u241B\u241C\u241D\u241E\u241F\u2420\u2421\u2422\u2423\u2424\u2425\u2426\u2427\u2428\u2429\u242A\u242B\u242C\u242D\u242E\u242F\u2430\u2431\u2432\u2433\u2434\u2435\u2436\u2437\u2438\u2439\u243A\u243B\u243C\u243D\u243E\u243F\u2440\u2441\u2442\u2443\u2444\u2445\u2446\u2447\u2448\u2449\u244A\u244B\u244C\u244D\u244E\u244F\u2450\u2451\u2452\u2453\u2454\u2455\u2456\u2457\u2458\u2459\u245A\u245B\u245C\u245D\u245E\u245F\u2460\u2461\u2462\u2463\u2464\u2465\u2466\u2467\u2468\u2469\u246A\u246B\u246C\u246D\u246E\u246F\u2470\u2471\u2472\u2473\u2474\u2475\u2476\u2477\u2478\u2479\u247A\u247B\u247C\u247D\u247E\u247F\u2480\u2481\u2482\u2483\u2484\u2485\u2486\u2487\u2488\u2489\u248A\u248B\u248C\u248D\u248E\u248F\u2490\u2491\u2492\u2493\u2494\u2495\u2496\u2497\u2498\u2499\u249A\u249B\u249C\u249D\u249E\u249F\u24A0\u24A1\u24A2\u24A3\u24A4\u24A5\u24A6\u24A7\u24A8\u24A9\u24AA\u24AB\u24AC\u24AD\u24AE\u24AF\u24B0\u24B1\u24B2\u24B3\u24B4\u24B5\u24B6\u24B7\u24B8\u24B9\u24BA\u24BB\u24BC\u24BD\u24BE\u24BF\u24C0\u24C1\u24C2\u24C3\u24C4\u24C5\u24C6\u24C7\u24C8\u24C9\u24CA\u24CB\u24CC\u24CD\u24CE\u24CF\u24D0\u24D1\u24D2\u24D3\u24D4\u24D5\u24D6\u24D7\u24D8\u24D9\u24DA\u24DB\u24DC\u24DD\u24DE\u24DF\u24E0\u24E1\u24E2\u24E3\u24E4\u24E5\u24E6\u24E7\u24E8\u24E9\u24EA\u24EB\u24EC\u24ED\u24EE\u24EF\u24F0\u24F1\u24F2\u24F3\u24F4\u24F5\u24F6\u24F7\u24F8\u24F9\u24FA\u24FB\u24FC\u24FD\u24FE\u24FF"sv, + u8"\u2400\u2401\u2402\u2403\u2404\u2405\u2406\u2407\u2408\u2409\u240A\u240B\u240C\u240D\u240E\u240F\u2410\u2411\u2412\u2413\u2414\u2415\u2416\u2417\u2418\u2419\u241A\u241B\u241C\u241D\u241E\u241F\u2420\u2421\u2422\u2423\u2424\u2425\u2426\u2427\u2428\u2429\u242A\u242B\u242C\u242D\u242E\u242F\u2430\u2431\u2432\u2433\u2434\u2435\u2436\u2437\u2438\u2439\u243A\u243B\u243C\u243D\u243E\u243F\u2440\u2441\u2442\u2443\u2444\u2445\u2446\u2447\u2448\u2449\u244A\u244B\u244C\u244D\u244E\u244F\u2450\u2451\u2452\u2453\u2454\u2455\u2456\u2457\u2458\u2459\u245A\u245B\u245C\u245D\u245E\u245F\u2460\u2461\u2462\u2463\u2464\u2465\u2466\u2467\u2468\u2469\u246A\u246B\u246C\u246D\u246E\u246F\u2470\u2471\u2472\u2473\u2474\u2475\u2476\u2477\u2478\u2479\u247A\u247B\u247C\u247D\u247E\u247F\u2480\u2481\u2482\u2483\u2484\u2485\u2486\u2487\u2488\u2489\u248A\u248B\u248C\u248D\u248E\u248F\u2490\u2491\u2492\u2493\u2494\u2495\u2496\u2497\u2498\u2499\u249A\u249B\u249C\u249D\u249E\u249F\u24A0\u24A1\u24A2\u24A3\u24A4\u24A5\u24A6\u24A7\u24A8\u24A9\u24AA\u24AB\u24AC\u24AD\u24AE\u24AF\u24B0\u24B1\u24B2\u24B3\u24B4\u24B5\u24D0\u24D1\u24D2\u24D3\u24D4\u24D5\u24D6\u24D7\u24D8\u24D9\u24DA\u24DB\u24DC\u24DD\u24DE\u24DF\u24E0\u24E1\u24E2\u24E3\u24E4\u24E5\u24E6\u24E7\u24E8\u24E9\u24D0\u24D1\u24D2\u24D3\u24D4\u24D5\u24D6\u24D7\u24D8\u24D9\u24DA\u24DB\u24DC\u24DD\u24DE\u24DF\u24E0\u24E1\u24E2\u24E3\u24E4\u24E5\u24E6\u24E7\u24E8\u24E9\u24EA\u24EB\u24EC\u24ED\u24EE\u24EF\u24F0\u24F1\u24F2\u24F3\u24F4\u24F5\u24F6\u24F7\u24F8\u24F9\u24FA\u24FB\u24FC\u24FD\u24FE\u24FF"sv}, + {u8"\u2C00\u2C01\u2C02\u2C03\u2C04\u2C05\u2C06\u2C07\u2C08\u2C09\u2C0A\u2C0B\u2C0C\u2C0D\u2C0E\u2C0F\u2C10\u2C11\u2C12\u2C13\u2C14\u2C15\u2C16\u2C17\u2C18\u2C19\u2C1A\u2C1B\u2C1C\u2C1D\u2C1E\u2C1F\u2C20\u2C21\u2C22\u2C23\u2C24\u2C25\u2C26\u2C27\u2C28\u2C29\u2C2A\u2C2B\u2C2C\u2C2D\u2C2E\u2C2F\u2C30\u2C31\u2C32\u2C33\u2C34\u2C35\u2C36\u2C37\u2C38\u2C39\u2C3A\u2C3B\u2C3C\u2C3D\u2C3E\u2C3F\u2C40\u2C41\u2C42\u2C43\u2C44\u2C45\u2C46\u2C47\u2C48\u2C49\u2C4A\u2C4B\u2C4C\u2C4D\u2C4E\u2C4F\u2C50\u2C51\u2C52\u2C53\u2C54\u2C55\u2C56\u2C57\u2C58\u2C59\u2C5A\u2C5B\u2C5C\u2C5D\u2C5E\u2C5F\u2C60\u2C61\u2C62\u2C63\u2C64\u2C65\u2C66\u2C67\u2C68\u2C69\u2C6A\u2C6B\u2C6C\u2C6D\u2C6E\u2C6F\u2C70\u2C71\u2C72\u2C73\u2C74\u2C75\u2C76\u2C77\u2C78\u2C79\u2C7A\u2C7B\u2C7C\u2C7D\u2C7E\u2C7F\u2C80\u2C81\u2C82\u2C83\u2C84\u2C85\u2C86\u2C87\u2C88\u2C89\u2C8A\u2C8B\u2C8C\u2C8D\u2C8E\u2C8F\u2C90\u2C91\u2C92\u2C93\u2C94\u2C95\u2C96\u2C97\u2C98\u2C99\u2C9A\u2C9B\u2C9C\u2C9D\u2C9E\u2C9F\u2CA0\u2CA1\u2CA2\u2CA3\u2CA4\u2CA5\u2CA6\u2CA7\u2CA8\u2CA9\u2CAA\u2CAB\u2CAC\u2CAD\u2CAE\u2CAF\u2CB0\u2CB1\u2CB2\u2CB3\u2CB4\u2CB5\u2CB6\u2CB7\u2CB8\u2CB9\u2CBA\u2CBB\u2CBC\u2CBD\u2CBE\u2CBF\u2CC0\u2CC1\u2CC2\u2CC3\u2CC4\u2CC5\u2CC6\u2CC7\u2CC8\u2CC9\u2CCA\u2CCB\u2CCC\u2CCD\u2CCE\u2CCF\u2CD0\u2CD1\u2CD2\u2CD3\u2CD4\u2CD5\u2CD6\u2CD7\u2CD8\u2CD9\u2CDA\u2CDB\u2CDC\u2CDD\u2CDE\u2CDF\u2CE0\u2CE1\u2CE2\u2CE3\u2CE4\u2CE5\u2CE6\u2CE7\u2CE8\u2CE9\u2CEA\u2CEB\u2CEC\u2CED\u2CEE\u2CEF\u2CF0\u2CF1\u2CF2\u2CF3\u2CF4\u2CF5\u2CF6\u2CF7\u2CF8\u2CF9\u2CFA\u2CFB\u2CFC\u2CFD\u2CFE\u2CFF"sv, + u8"\u2C30\u2C31\u2C32\u2C33\u2C34\u2C35\u2C36\u2C37\u2C38\u2C39\u2C3A\u2C3B\u2C3C\u2C3D\u2C3E\u2C3F\u2C40\u2C41\u2C42\u2C43\u2C44\u2C45\u2C46\u2C47\u2C48\u2C49\u2C4A\u2C4B\u2C4C\u2C4D\u2C4E\u2C4F\u2C50\u2C51\u2C52\u2C53\u2C54\u2C55\u2C56\u2C57\u2C58\u2C59\u2C5A\u2C5B\u2C5C\u2C5D\u2C5E\u2C5F\u2C30\u2C31\u2C32\u2C33\u2C34\u2C35\u2C36\u2C37\u2C38\u2C39\u2C3A\u2C3B\u2C3C\u2C3D\u2C3E\u2C3F\u2C40\u2C41\u2C42\u2C43\u2C44\u2C45\u2C46\u2C47\u2C48\u2C49\u2C4A\u2C4B\u2C4C\u2C4D\u2C4E\u2C4F\u2C50\u2C51\u2C52\u2C53\u2C54\u2C55\u2C56\u2C57\u2C58\u2C59\u2C5A\u2C5B\u2C5C\u2C5D\u2C5E\u2C5F\u2C61\u2C61\u026B\u1D7D\u027D\u2C65\u2C66\u2C68\u2C68\u2C6A\u2C6A\u2C6C\u2C6C\u0251\u0271\u0250\u0252\u2C71\u2C73\u2C73\u2C74\u2C76\u2C76\u2C77\u2C78\u2C79\u2C7A\u2C7B\u2C7C\u2C7D\u023F\u0240\u2C81\u2C81\u2C83\u2C83\u2C85\u2C85\u2C87\u2C87\u2C89\u2C89\u2C8B\u2C8B\u2C8D\u2C8D\u2C8F\u2C8F\u2C91\u2C91\u2C93\u2C93\u2C95\u2C95\u2C97\u2C97\u2C99\u2C99\u2C9B\u2C9B\u2C9D\u2C9D\u2C9F\u2C9F\u2CA1\u2CA1\u2CA3\u2CA3\u2CA5\u2CA5\u2CA7\u2CA7\u2CA9\u2CA9\u2CAB\u2CAB\u2CAD\u2CAD\u2CAF\u2CAF\u2CB1\u2CB1\u2CB3\u2CB3\u2CB5\u2CB5\u2CB7\u2CB7\u2CB9\u2CB9\u2CBB\u2CBB\u2CBD\u2CBD\u2CBF\u2CBF\u2CC1\u2CC1\u2CC3\u2CC3\u2CC5\u2CC5\u2CC7\u2CC7\u2CC9\u2CC9\u2CCB\u2CCB\u2CCD\u2CCD\u2CCF\u2CCF\u2CD1\u2CD1\u2CD3\u2CD3\u2CD5\u2CD5\u2CD7\u2CD7\u2CD9\u2CD9\u2CDB\u2CDB\u2CDD\u2CDD\u2CDF\u2CDF\u2CE1\u2CE1\u2CE3\u2CE3\u2CE4\u2CE5\u2CE6\u2CE7\u2CE8\u2CE9\u2CEA\u2CEC\u2CEC\u2CEE\u2CEE\u2CEF\u2CF0\u2CF1\u2CF3\u2CF3\u2CF4\u2CF5\u2CF6\u2CF7\u2CF8\u2CF9\u2CFA\u2CFB\u2CFC\u2CFD\u2CFE\u2CFF"sv}, + {u8"\uA600\uA601\uA602\uA603\uA604\uA605\uA606\uA607\uA608\uA609\uA60A\uA60B\uA60C\uA60D\uA60E\uA60F\uA610\uA611\uA612\uA613\uA614\uA615\uA616\uA617\uA618\uA619\uA61A\uA61B\uA61C\uA61D\uA61E\uA61F\uA620\uA621\uA622\uA623\uA624\uA625\uA626\uA627\uA628\uA629\uA62A\uA62B\uA62C\uA62D\uA62E\uA62F\uA630\uA631\uA632\uA633\uA634\uA635\uA636\uA637\uA638\uA639\uA63A\uA63B\uA63C\uA63D\uA63E\uA63F\uA640\uA641\uA642\uA643\uA644\uA645\uA646\uA647\uA648\uA649\uA64A\uA64B\uA64C\uA64D\uA64E\uA64F\uA650\uA651\uA652\uA653\uA654\uA655\uA656\uA657\uA658\uA659\uA65A\uA65B\uA65C\uA65D\uA65E\uA65F\uA660\uA661\uA662\uA663\uA664\uA665\uA666\uA667\uA668\uA669\uA66A\uA66B\uA66C\uA66D\uA66E\uA66F\uA670\uA671\uA672\uA673\uA674\uA675\uA676\uA677\uA678\uA679\uA67A\uA67B\uA67C\uA67D\uA67E\uA67F\uA680\uA681\uA682\uA683\uA684\uA685\uA686\uA687\uA688\uA689\uA68A\uA68B\uA68C\uA68D\uA68E\uA68F\uA690\uA691\uA692\uA693\uA694\uA695\uA696\uA697\uA698\uA699\uA69A\uA69B\uA69C\uA69D\uA69E\uA69F\uA6A0\uA6A1\uA6A2\uA6A3\uA6A4\uA6A5\uA6A6\uA6A7\uA6A8\uA6A9\uA6AA\uA6AB\uA6AC\uA6AD\uA6AE\uA6AF\uA6B0\uA6B1\uA6B2\uA6B3\uA6B4\uA6B5\uA6B6\uA6B7\uA6B8\uA6B9\uA6BA\uA6BB\uA6BC\uA6BD\uA6BE\uA6BF\uA6C0\uA6C1\uA6C2\uA6C3\uA6C4\uA6C5\uA6C6\uA6C7\uA6C8\uA6C9\uA6CA\uA6CB\uA6CC\uA6CD\uA6CE\uA6CF\uA6D0\uA6D1\uA6D2\uA6D3\uA6D4\uA6D5\uA6D6\uA6D7\uA6D8\uA6D9\uA6DA\uA6DB\uA6DC\uA6DD\uA6DE\uA6DF\uA6E0\uA6E1\uA6E2\uA6E3\uA6E4\uA6E5\uA6E6\uA6E7\uA6E8\uA6E9\uA6EA\uA6EB\uA6EC\uA6ED\uA6EE\uA6EF\uA6F0\uA6F1\uA6F2\uA6F3\uA6F4\uA6F5\uA6F6\uA6F7\uA6F8\uA6F9\uA6FA\uA6FB\uA6FC\uA6FD\uA6FE\uA6FF"sv, + u8"\uA600\uA601\uA602\uA603\uA604\uA605\uA606\uA607\uA608\uA609\uA60A\uA60B\uA60C\uA60D\uA60E\uA60F\uA610\uA611\uA612\uA613\uA614\uA615\uA616\uA617\uA618\uA619\uA61A\uA61B\uA61C\uA61D\uA61E\uA61F\uA620\uA621\uA622\uA623\uA624\uA625\uA626\uA627\uA628\uA629\uA62A\uA62B\uA62C\uA62D\uA62E\uA62F\uA630\uA631\uA632\uA633\uA634\uA635\uA636\uA637\uA638\uA639\uA63A\uA63B\uA63C\uA63D\uA63E\uA63F\uA641\uA641\uA643\uA643\uA645\uA645\uA647\uA647\uA649\uA649\uA64B\uA64B\uA64D\uA64D\uA64F\uA64F\uA651\uA651\uA653\uA653\uA655\uA655\uA657\uA657\uA659\uA659\uA65B\uA65B\uA65D\uA65D\uA65F\uA65F\uA661\uA661\uA663\uA663\uA665\uA665\uA667\uA667\uA669\uA669\uA66B\uA66B\uA66D\uA66D\uA66E\uA66F\uA670\uA671\uA672\uA673\uA674\uA675\uA676\uA677\uA678\uA679\uA67A\uA67B\uA67C\uA67D\uA67E\uA67F\uA681\uA681\uA683\uA683\uA685\uA685\uA687\uA687\uA689\uA689\uA68B\uA68B\uA68D\uA68D\uA68F\uA68F\uA691\uA691\uA693\uA693\uA695\uA695\uA697\uA697\uA699\uA699\uA69B\uA69B\uA69C\uA69D\uA69E\uA69F\uA6A0\uA6A1\uA6A2\uA6A3\uA6A4\uA6A5\uA6A6\uA6A7\uA6A8\uA6A9\uA6AA\uA6AB\uA6AC\uA6AD\uA6AE\uA6AF\uA6B0\uA6B1\uA6B2\uA6B3\uA6B4\uA6B5\uA6B6\uA6B7\uA6B8\uA6B9\uA6BA\uA6BB\uA6BC\uA6BD\uA6BE\uA6BF\uA6C0\uA6C1\uA6C2\uA6C3\uA6C4\uA6C5\uA6C6\uA6C7\uA6C8\uA6C9\uA6CA\uA6CB\uA6CC\uA6CD\uA6CE\uA6CF\uA6D0\uA6D1\uA6D2\uA6D3\uA6D4\uA6D5\uA6D6\uA6D7\uA6D8\uA6D9\uA6DA\uA6DB\uA6DC\uA6DD\uA6DE\uA6DF\uA6E0\uA6E1\uA6E2\uA6E3\uA6E4\uA6E5\uA6E6\uA6E7\uA6E8\uA6E9\uA6EA\uA6EB\uA6EC\uA6ED\uA6EE\uA6EF\uA6F0\uA6F1\uA6F2\uA6F3\uA6F4\uA6F5\uA6F6\uA6F7\uA6F8\uA6F9\uA6FA\uA6FB\uA6FC\uA6FD\uA6FE\uA6FF"sv}, + {u8"\uA700\uA701\uA702\uA703\uA704\uA705\uA706\uA707\uA708\uA709\uA70A\uA70B\uA70C\uA70D\uA70E\uA70F\uA710\uA711\uA712\uA713\uA714\uA715\uA716\uA717\uA718\uA719\uA71A\uA71B\uA71C\uA71D\uA71E\uA71F\uA720\uA721\uA722\uA723\uA724\uA725\uA726\uA727\uA728\uA729\uA72A\uA72B\uA72C\uA72D\uA72E\uA72F\uA730\uA731\uA732\uA733\uA734\uA735\uA736\uA737\uA738\uA739\uA73A\uA73B\uA73C\uA73D\uA73E\uA73F\uA740\uA741\uA742\uA743\uA744\uA745\uA746\uA747\uA748\uA749\uA74A\uA74B\uA74C\uA74D\uA74E\uA74F\uA750\uA751\uA752\uA753\uA754\uA755\uA756\uA757\uA758\uA759\uA75A\uA75B\uA75C\uA75D\uA75E\uA75F\uA760\uA761\uA762\uA763\uA764\uA765\uA766\uA767\uA768\uA769\uA76A\uA76B\uA76C\uA76D\uA76E\uA76F\uA770\uA771\uA772\uA773\uA774\uA775\uA776\uA777\uA778\uA779\uA77A\uA77B\uA77C\uA77D\uA77E\uA77F\uA780\uA781\uA782\uA783\uA784\uA785\uA786\uA787\uA788\uA789\uA78A\uA78B\uA78C\uA78D\uA78E\uA78F\uA790\uA791\uA792\uA793\uA794\uA795\uA796\uA797\uA798\uA799\uA79A\uA79B\uA79C\uA79D\uA79E\uA79F\uA7A0\uA7A1\uA7A2\uA7A3\uA7A4\uA7A5\uA7A6\uA7A7\uA7A8\uA7A9\uA7AA\uA7AB\uA7AC\uA7AD\uA7AE\uA7AF\uA7B0\uA7B1\uA7B2\uA7B3\uA7B4\uA7B5\uA7B6\uA7B7\uA7B8\uA7B9\uA7BA\uA7BB\uA7BC\uA7BD\uA7BE\uA7BF\uA7C0\uA7C1\uA7C2\uA7C3\uA7C4\uA7C5\uA7C6\uA7C7\uA7C8\uA7C9\uA7CA\uA7CB\uA7CC\uA7CD\uA7CE\uA7CF\uA7D0\uA7D1\uA7D2\uA7D3\uA7D4\uA7D5\uA7D6\uA7D7\uA7D8\uA7D9\uA7DA\uA7DB\uA7DC\uA7DD\uA7DE\uA7DF\uA7E0\uA7E1\uA7E2\uA7E3\uA7E4\uA7E5\uA7E6\uA7E7\uA7E8\uA7E9\uA7EA\uA7EB\uA7EC\uA7ED\uA7EE\uA7EF\uA7F0\uA7F1\uA7F2\uA7F3\uA7F4\uA7F5\uA7F6\uA7F7\uA7F8\uA7F9\uA7FA\uA7FB\uA7FC\uA7FD\uA7FE\uA7FF"sv, + u8"\uA700\uA701\uA702\uA703\uA704\uA705\uA706\uA707\uA708\uA709\uA70A\uA70B\uA70C\uA70D\uA70E\uA70F\uA710\uA711\uA712\uA713\uA714\uA715\uA716\uA717\uA718\uA719\uA71A\uA71B\uA71C\uA71D\uA71E\uA71F\uA720\uA721\uA723\uA723\uA725\uA725\uA727\uA727\uA729\uA729\uA72B\uA72B\uA72D\uA72D\uA72F\uA72F\uA730\uA731\uA733\uA733\uA735\uA735\uA737\uA737\uA739\uA739\uA73B\uA73B\uA73D\uA73D\uA73F\uA73F\uA741\uA741\uA743\uA743\uA745\uA745\uA747\uA747\uA749\uA749\uA74B\uA74B\uA74D\uA74D\uA74F\uA74F\uA751\uA751\uA753\uA753\uA755\uA755\uA757\uA757\uA759\uA759\uA75B\uA75B\uA75D\uA75D\uA75F\uA75F\uA761\uA761\uA763\uA763\uA765\uA765\uA767\uA767\uA769\uA769\uA76B\uA76B\uA76D\uA76D\uA76F\uA76F\uA770\uA771\uA772\uA773\uA774\uA775\uA776\uA777\uA778\uA77A\uA77A\uA77C\uA77C\u1D79\uA77F\uA77F\uA781\uA781\uA783\uA783\uA785\uA785\uA787\uA787\uA788\uA789\uA78A\uA78C\uA78C\u0265\uA78E\uA78F\uA791\uA791\uA793\uA793\uA794\uA795\uA797\uA797\uA799\uA799\uA79B\uA79B\uA79D\uA79D\uA79F\uA79F\uA7A1\uA7A1\uA7A3\uA7A3\uA7A5\uA7A5\uA7A7\uA7A7\uA7A9\uA7A9\u0266\u025C\u0261\u026C\u026A\uA7AF\u029E\u0287\u029D\uAB53\uA7B5\uA7B5\uA7B7\uA7B7\uA7B9\uA7B9\uA7BB\uA7BB\uA7BD\uA7BD\uA7BF\uA7BF\uA7C1\uA7C1\uA7C3\uA7C3\uA794\u0282\u1D8E\uA7C8\uA7C8\uA7CA\uA7CA\u0264\uA7CD\uA7CD\uA7CE\uA7CF\uA7D1\uA7D1\uA7D2\uA7D3\uA7D4\uA7D5\uA7D7\uA7D7\uA7D9\uA7D9\uA7DB\uA7DB\u019B\uA7DD\uA7DE\uA7DF\uA7E0\uA7E1\uA7E2\uA7E3\uA7E4\uA7E5\uA7E6\uA7E7\uA7E8\uA7E9\uA7EA\uA7EB\uA7EC\uA7ED\uA7EE\uA7EF\uA7F0\uA7F1\uA7F2\uA7F3\uA7F4\uA7F6\uA7F6\uA7F7\uA7F8\uA7F9\uA7FA\uA7FB\uA7FC\uA7FD\uA7FE\uA7FF"sv}, + {u8"\uAB00\uAB01\uAB02\uAB03\uAB04\uAB05\uAB06\uAB07\uAB08\uAB09\uAB0A\uAB0B\uAB0C\uAB0D\uAB0E\uAB0F\uAB10\uAB11\uAB12\uAB13\uAB14\uAB15\uAB16\uAB17\uAB18\uAB19\uAB1A\uAB1B\uAB1C\uAB1D\uAB1E\uAB1F\uAB20\uAB21\uAB22\uAB23\uAB24\uAB25\uAB26\uAB27\uAB28\uAB29\uAB2A\uAB2B\uAB2C\uAB2D\uAB2E\uAB2F\uAB30\uAB31\uAB32\uAB33\uAB34\uAB35\uAB36\uAB37\uAB38\uAB39\uAB3A\uAB3B\uAB3C\uAB3D\uAB3E\uAB3F\uAB40\uAB41\uAB42\uAB43\uAB44\uAB45\uAB46\uAB47\uAB48\uAB49\uAB4A\uAB4B\uAB4C\uAB4D\uAB4E\uAB4F\uAB50\uAB51\uAB52\uAB53\uAB54\uAB55\uAB56\uAB57\uAB58\uAB59\uAB5A\uAB5B\uAB5C\uAB5D\uAB5E\uAB5F\uAB60\uAB61\uAB62\uAB63\uAB64\uAB65\uAB66\uAB67\uAB68\uAB69\uAB6A\uAB6B\uAB6C\uAB6D\uAB6E\uAB6F\uAB70\uAB71\uAB72\uAB73\uAB74\uAB75\uAB76\uAB77\uAB78\uAB79\uAB7A\uAB7B\uAB7C\uAB7D\uAB7E\uAB7F\uAB80\uAB81\uAB82\uAB83\uAB84\uAB85\uAB86\uAB87\uAB88\uAB89\uAB8A\uAB8B\uAB8C\uAB8D\uAB8E\uAB8F\uAB90\uAB91\uAB92\uAB93\uAB94\uAB95\uAB96\uAB97\uAB98\uAB99\uAB9A\uAB9B\uAB9C\uAB9D\uAB9E\uAB9F\uABA0\uABA1\uABA2\uABA3\uABA4\uABA5\uABA6\uABA7\uABA8\uABA9\uABAA\uABAB\uABAC\uABAD\uABAE\uABAF\uABB0\uABB1\uABB2\uABB3\uABB4\uABB5\uABB6\uABB7\uABB8\uABB9\uABBA\uABBB\uABBC\uABBD\uABBE\uABBF\uABC0\uABC1\uABC2\uABC3\uABC4\uABC5\uABC6\uABC7\uABC8\uABC9\uABCA\uABCB\uABCC\uABCD\uABCE\uABCF\uABD0\uABD1\uABD2\uABD3\uABD4\uABD5\uABD6\uABD7\uABD8\uABD9\uABDA\uABDB\uABDC\uABDD\uABDE\uABDF\uABE0\uABE1\uABE2\uABE3\uABE4\uABE5\uABE6\uABE7\uABE8\uABE9\uABEA\uABEB\uABEC\uABED\uABEE\uABEF\uABF0\uABF1\uABF2\uABF3\uABF4\uABF5\uABF6\uABF7\uABF8\uABF9\uABFA\uABFB\uABFC\uABFD\uABFE\uABFF"sv, + u8"\uAB00\uAB01\uAB02\uAB03\uAB04\uAB05\uAB06\uAB07\uAB08\uAB09\uAB0A\uAB0B\uAB0C\uAB0D\uAB0E\uAB0F\uAB10\uAB11\uAB12\uAB13\uAB14\uAB15\uAB16\uAB17\uAB18\uAB19\uAB1A\uAB1B\uAB1C\uAB1D\uAB1E\uAB1F\uAB20\uAB21\uAB22\uAB23\uAB24\uAB25\uAB26\uAB27\uAB28\uAB29\uAB2A\uAB2B\uAB2C\uAB2D\uAB2E\uAB2F\uAB30\uAB31\uAB32\uAB33\uAB34\uAB35\uAB36\uAB37\uAB38\uAB39\uAB3A\uAB3B\uAB3C\uAB3D\uAB3E\uAB3F\uAB40\uAB41\uAB42\uAB43\uAB44\uAB45\uAB46\uAB47\uAB48\uAB49\uAB4A\uAB4B\uAB4C\uAB4D\uAB4E\uAB4F\uAB50\uAB51\uAB52\uAB53\uAB54\uAB55\uAB56\uAB57\uAB58\uAB59\uAB5A\uAB5B\uAB5C\uAB5D\uAB5E\uAB5F\uAB60\uAB61\uAB62\uAB63\uAB64\uAB65\uAB66\uAB67\uAB68\uAB69\uAB6A\uAB6B\uAB6C\uAB6D\uAB6E\uAB6F\u13A0\u13A1\u13A2\u13A3\u13A4\u13A5\u13A6\u13A7\u13A8\u13A9\u13AA\u13AB\u13AC\u13AD\u13AE\u13AF\u13B0\u13B1\u13B2\u13B3\u13B4\u13B5\u13B6\u13B7\u13B8\u13B9\u13BA\u13BB\u13BC\u13BD\u13BE\u13BF\u13C0\u13C1\u13C2\u13C3\u13C4\u13C5\u13C6\u13C7\u13C8\u13C9\u13CA\u13CB\u13CC\u13CD\u13CE\u13CF\u13D0\u13D1\u13D2\u13D3\u13D4\u13D5\u13D6\u13D7\u13D8\u13D9\u13DA\u13DB\u13DC\u13DD\u13DE\u13DF\u13E0\u13E1\u13E2\u13E3\u13E4\u13E5\u13E6\u13E7\u13E8\u13E9\u13EA\u13EB\u13EC\u13ED\u13EE\u13EF\uABC0\uABC1\uABC2\uABC3\uABC4\uABC5\uABC6\uABC7\uABC8\uABC9\uABCA\uABCB\uABCC\uABCD\uABCE\uABCF\uABD0\uABD1\uABD2\uABD3\uABD4\uABD5\uABD6\uABD7\uABD8\uABD9\uABDA\uABDB\uABDC\uABDD\uABDE\uABDF\uABE0\uABE1\uABE2\uABE3\uABE4\uABE5\uABE6\uABE7\uABE8\uABE9\uABEA\uABEB\uABEC\uABED\uABEE\uABEF\uABF0\uABF1\uABF2\uABF3\uABF4\uABF5\uABF6\uABF7\uABF8\uABF9\uABFA\uABFB\uABFC\uABFD\uABFE\uABFF"sv}, + {u8"\uFB00\uFB01\uFB02\uFB03\uFB04\uFB05\uFB06\uFB07\uFB08\uFB09\uFB0A\uFB0B\uFB0C\uFB0D\uFB0E\uFB0F\uFB10\uFB11\uFB12\uFB13\uFB14\uFB15\uFB16\uFB17\uFB18\uFB19\uFB1A\uFB1B\uFB1C\uFB1D\uFB1E\uFB1F\uFB20\uFB21\uFB22\uFB23\uFB24\uFB25\uFB26\uFB27\uFB28\uFB29\uFB2A\uFB2B\uFB2C\uFB2D\uFB2E\uFB2F\uFB30\uFB31\uFB32\uFB33\uFB34\uFB35\uFB36\uFB37\uFB38\uFB39\uFB3A\uFB3B\uFB3C\uFB3D\uFB3E\uFB3F\uFB40\uFB41\uFB42\uFB43\uFB44\uFB45\uFB46\uFB47\uFB48\uFB49\uFB4A\uFB4B\uFB4C\uFB4D\uFB4E\uFB4F\uFB50\uFB51\uFB52\uFB53\uFB54\uFB55\uFB56\uFB57\uFB58\uFB59\uFB5A\uFB5B\uFB5C\uFB5D\uFB5E\uFB5F\uFB60\uFB61\uFB62\uFB63\uFB64\uFB65\uFB66\uFB67\uFB68\uFB69\uFB6A\uFB6B\uFB6C\uFB6D\uFB6E\uFB6F\uFB70\uFB71\uFB72\uFB73\uFB74\uFB75\uFB76\uFB77\uFB78\uFB79\uFB7A\uFB7B\uFB7C\uFB7D\uFB7E\uFB7F\uFB80\uFB81\uFB82\uFB83\uFB84\uFB85\uFB86\uFB87\uFB88\uFB89\uFB8A\uFB8B\uFB8C\uFB8D\uFB8E\uFB8F\uFB90\uFB91\uFB92\uFB93\uFB94\uFB95\uFB96\uFB97\uFB98\uFB99\uFB9A\uFB9B\uFB9C\uFB9D\uFB9E\uFB9F\uFBA0\uFBA1\uFBA2\uFBA3\uFBA4\uFBA5\uFBA6\uFBA7\uFBA8\uFBA9\uFBAA\uFBAB\uFBAC\uFBAD\uFBAE\uFBAF\uFBB0\uFBB1\uFBB2\uFBB3\uFBB4\uFBB5\uFBB6\uFBB7\uFBB8\uFBB9\uFBBA\uFBBB\uFBBC\uFBBD\uFBBE\uFBBF\uFBC0\uFBC1\uFBC2\uFBC3\uFBC4\uFBC5\uFBC6\uFBC7\uFBC8\uFBC9\uFBCA\uFBCB\uFBCC\uFBCD\uFBCE\uFBCF\uFBD0\uFBD1\uFBD2\uFBD3\uFBD4\uFBD5\uFBD6\uFBD7\uFBD8\uFBD9\uFBDA\uFBDB\uFBDC\uFBDD\uFBDE\uFBDF\uFBE0\uFBE1\uFBE2\uFBE3\uFBE4\uFBE5\uFBE6\uFBE7\uFBE8\uFBE9\uFBEA\uFBEB\uFBEC\uFBED\uFBEE\uFBEF\uFBF0\uFBF1\uFBF2\uFBF3\uFBF4\uFBF5\uFBF6\uFBF7\uFBF8\uFBF9\uFBFA\uFBFB\uFBFC\uFBFD\uFBFE\uFBFF"sv, + u8"\uFB00\uFB01\uFB02\uFB03\uFB04\uFB06\uFB06\uFB07\uFB08\uFB09\uFB0A\uFB0B\uFB0C\uFB0D\uFB0E\uFB0F\uFB10\uFB11\uFB12\uFB13\uFB14\uFB15\uFB16\uFB17\uFB18\uFB19\uFB1A\uFB1B\uFB1C\uFB1D\uFB1E\uFB1F\uFB20\uFB21\uFB22\uFB23\uFB24\uFB25\uFB26\uFB27\uFB28\uFB29\uFB2A\uFB2B\uFB2C\uFB2D\uFB2E\uFB2F\uFB30\uFB31\uFB32\uFB33\uFB34\uFB35\uFB36\uFB37\uFB38\uFB39\uFB3A\uFB3B\uFB3C\uFB3D\uFB3E\uFB3F\uFB40\uFB41\uFB42\uFB43\uFB44\uFB45\uFB46\uFB47\uFB48\uFB49\uFB4A\uFB4B\uFB4C\uFB4D\uFB4E\uFB4F\uFB50\uFB51\uFB52\uFB53\uFB54\uFB55\uFB56\uFB57\uFB58\uFB59\uFB5A\uFB5B\uFB5C\uFB5D\uFB5E\uFB5F\uFB60\uFB61\uFB62\uFB63\uFB64\uFB65\uFB66\uFB67\uFB68\uFB69\uFB6A\uFB6B\uFB6C\uFB6D\uFB6E\uFB6F\uFB70\uFB71\uFB72\uFB73\uFB74\uFB75\uFB76\uFB77\uFB78\uFB79\uFB7A\uFB7B\uFB7C\uFB7D\uFB7E\uFB7F\uFB80\uFB81\uFB82\uFB83\uFB84\uFB85\uFB86\uFB87\uFB88\uFB89\uFB8A\uFB8B\uFB8C\uFB8D\uFB8E\uFB8F\uFB90\uFB91\uFB92\uFB93\uFB94\uFB95\uFB96\uFB97\uFB98\uFB99\uFB9A\uFB9B\uFB9C\uFB9D\uFB9E\uFB9F\uFBA0\uFBA1\uFBA2\uFBA3\uFBA4\uFBA5\uFBA6\uFBA7\uFBA8\uFBA9\uFBAA\uFBAB\uFBAC\uFBAD\uFBAE\uFBAF\uFBB0\uFBB1\uFBB2\uFBB3\uFBB4\uFBB5\uFBB6\uFBB7\uFBB8\uFBB9\uFBBA\uFBBB\uFBBC\uFBBD\uFBBE\uFBBF\uFBC0\uFBC1\uFBC2\uFBC3\uFBC4\uFBC5\uFBC6\uFBC7\uFBC8\uFBC9\uFBCA\uFBCB\uFBCC\uFBCD\uFBCE\uFBCF\uFBD0\uFBD1\uFBD2\uFBD3\uFBD4\uFBD5\uFBD6\uFBD7\uFBD8\uFBD9\uFBDA\uFBDB\uFBDC\uFBDD\uFBDE\uFBDF\uFBE0\uFBE1\uFBE2\uFBE3\uFBE4\uFBE5\uFBE6\uFBE7\uFBE8\uFBE9\uFBEA\uFBEB\uFBEC\uFBED\uFBEE\uFBEF\uFBF0\uFBF1\uFBF2\uFBF3\uFBF4\uFBF5\uFBF6\uFBF7\uFBF8\uFBF9\uFBFA\uFBFB\uFBFC\uFBFD\uFBFE\uFBFF"sv}, + {u8"\uFF00\uFF01\uFF02\uFF03\uFF04\uFF05\uFF06\uFF07\uFF08\uFF09\uFF0A\uFF0B\uFF0C\uFF0D\uFF0E\uFF0F\uFF10\uFF11\uFF12\uFF13\uFF14\uFF15\uFF16\uFF17\uFF18\uFF19\uFF1A\uFF1B\uFF1C\uFF1D\uFF1E\uFF1F\uFF20\uFF21\uFF22\uFF23\uFF24\uFF25\uFF26\uFF27\uFF28\uFF29\uFF2A\uFF2B\uFF2C\uFF2D\uFF2E\uFF2F\uFF30\uFF31\uFF32\uFF33\uFF34\uFF35\uFF36\uFF37\uFF38\uFF39\uFF3A\uFF3B\uFF3C\uFF3D\uFF3E\uFF3F\uFF40\uFF41\uFF42\uFF43\uFF44\uFF45\uFF46\uFF47\uFF48\uFF49\uFF4A\uFF4B\uFF4C\uFF4D\uFF4E\uFF4F\uFF50\uFF51\uFF52\uFF53\uFF54\uFF55\uFF56\uFF57\uFF58\uFF59\uFF5A\uFF5B\uFF5C\uFF5D\uFF5E\uFF5F\uFF60\uFF61\uFF62\uFF63\uFF64\uFF65\uFF66\uFF67\uFF68\uFF69\uFF6A\uFF6B\uFF6C\uFF6D\uFF6E\uFF6F\uFF70\uFF71\uFF72\uFF73\uFF74\uFF75\uFF76\uFF77\uFF78\uFF79\uFF7A\uFF7B\uFF7C\uFF7D\uFF7E\uFF7F\uFF80\uFF81\uFF82\uFF83\uFF84\uFF85\uFF86\uFF87\uFF88\uFF89\uFF8A\uFF8B\uFF8C\uFF8D\uFF8E\uFF8F\uFF90\uFF91\uFF92\uFF93\uFF94\uFF95\uFF96\uFF97\uFF98\uFF99\uFF9A\uFF9B\uFF9C\uFF9D\uFF9E\uFF9F\uFFA0\uFFA1\uFFA2\uFFA3\uFFA4\uFFA5\uFFA6\uFFA7\uFFA8\uFFA9\uFFAA\uFFAB\uFFAC\uFFAD\uFFAE\uFFAF\uFFB0\uFFB1\uFFB2\uFFB3\uFFB4\uFFB5\uFFB6\uFFB7\uFFB8\uFFB9\uFFBA\uFFBB\uFFBC\uFFBD\uFFBE\uFFBF\uFFC0\uFFC1\uFFC2\uFFC3\uFFC4\uFFC5\uFFC6\uFFC7\uFFC8\uFFC9\uFFCA\uFFCB\uFFCC\uFFCD\uFFCE\uFFCF\uFFD0\uFFD1\uFFD2\uFFD3\uFFD4\uFFD5\uFFD6\uFFD7\uFFD8\uFFD9\uFFDA\uFFDB\uFFDC\uFFDD\uFFDE\uFFDF\uFFE0\uFFE1\uFFE2\uFFE3\uFFE4\uFFE5\uFFE6\uFFE7\uFFE8\uFFE9\uFFEA\uFFEB\uFFEC\uFFED\uFFEE\uFFEF\uFFF0\uFFF1\uFFF2\uFFF3\uFFF4\uFFF5\uFFF6\uFFF7\uFFF8\uFFF9\uFFFA\uFFFB\uFFFC\uFFFD\uFFFE\uFFFF"sv, + u8"\uFF00\uFF01\uFF02\uFF03\uFF04\uFF05\uFF06\uFF07\uFF08\uFF09\uFF0A\uFF0B\uFF0C\uFF0D\uFF0E\uFF0F\uFF10\uFF11\uFF12\uFF13\uFF14\uFF15\uFF16\uFF17\uFF18\uFF19\uFF1A\uFF1B\uFF1C\uFF1D\uFF1E\uFF1F\uFF20\uFF41\uFF42\uFF43\uFF44\uFF45\uFF46\uFF47\uFF48\uFF49\uFF4A\uFF4B\uFF4C\uFF4D\uFF4E\uFF4F\uFF50\uFF51\uFF52\uFF53\uFF54\uFF55\uFF56\uFF57\uFF58\uFF59\uFF5A\uFF3B\uFF3C\uFF3D\uFF3E\uFF3F\uFF40\uFF41\uFF42\uFF43\uFF44\uFF45\uFF46\uFF47\uFF48\uFF49\uFF4A\uFF4B\uFF4C\uFF4D\uFF4E\uFF4F\uFF50\uFF51\uFF52\uFF53\uFF54\uFF55\uFF56\uFF57\uFF58\uFF59\uFF5A\uFF5B\uFF5C\uFF5D\uFF5E\uFF5F\uFF60\uFF61\uFF62\uFF63\uFF64\uFF65\uFF66\uFF67\uFF68\uFF69\uFF6A\uFF6B\uFF6C\uFF6D\uFF6E\uFF6F\uFF70\uFF71\uFF72\uFF73\uFF74\uFF75\uFF76\uFF77\uFF78\uFF79\uFF7A\uFF7B\uFF7C\uFF7D\uFF7E\uFF7F\uFF80\uFF81\uFF82\uFF83\uFF84\uFF85\uFF86\uFF87\uFF88\uFF89\uFF8A\uFF8B\uFF8C\uFF8D\uFF8E\uFF8F\uFF90\uFF91\uFF92\uFF93\uFF94\uFF95\uFF96\uFF97\uFF98\uFF99\uFF9A\uFF9B\uFF9C\uFF9D\uFF9E\uFF9F\uFFA0\uFFA1\uFFA2\uFFA3\uFFA4\uFFA5\uFFA6\uFFA7\uFFA8\uFFA9\uFFAA\uFFAB\uFFAC\uFFAD\uFFAE\uFFAF\uFFB0\uFFB1\uFFB2\uFFB3\uFFB4\uFFB5\uFFB6\uFFB7\uFFB8\uFFB9\uFFBA\uFFBB\uFFBC\uFFBD\uFFBE\uFFBF\uFFC0\uFFC1\uFFC2\uFFC3\uFFC4\uFFC5\uFFC6\uFFC7\uFFC8\uFFC9\uFFCA\uFFCB\uFFCC\uFFCD\uFFCE\uFFCF\uFFD0\uFFD1\uFFD2\uFFD3\uFFD4\uFFD5\uFFD6\uFFD7\uFFD8\uFFD9\uFFDA\uFFDB\uFFDC\uFFDD\uFFDE\uFFDF\uFFE0\uFFE1\uFFE2\uFFE3\uFFE4\uFFE5\uFFE6\uFFE7\uFFE8\uFFE9\uFFEA\uFFEB\uFFEC\uFFED\uFFEE\uFFEF\uFFF0\uFFF1\uFFF2\uFFF3\uFFF4\uFFF5\uFFF6\uFFF7\uFFF8\uFFF9\uFFFA\uFFFB\uFFFC\uFFFD\uFFFE\uFFFF"sv}, + {u8"\U00010400\U00010401\U00010402\U00010403\U00010404\U00010405\U00010406\U00010407\U00010408\U00010409\U0001040A\U0001040B\U0001040C\U0001040D\U0001040E\U0001040F\U00010410\U00010411\U00010412\U00010413\U00010414\U00010415\U00010416\U00010417\U00010418\U00010419\U0001041A\U0001041B\U0001041C\U0001041D\U0001041E\U0001041F\U00010420\U00010421\U00010422\U00010423\U00010424\U00010425\U00010426\U00010427\U00010428\U00010429\U0001042A\U0001042B\U0001042C\U0001042D\U0001042E\U0001042F\U00010430\U00010431\U00010432\U00010433\U00010434\U00010435\U00010436\U00010437\U00010438\U00010439\U0001043A\U0001043B\U0001043C\U0001043D\U0001043E\U0001043F\U00010440\U00010441\U00010442\U00010443\U00010444\U00010445\U00010446\U00010447\U00010448\U00010449\U0001044A\U0001044B\U0001044C\U0001044D\U0001044E\U0001044F\U00010450\U00010451\U00010452\U00010453\U00010454\U00010455\U00010456\U00010457\U00010458\U00010459\U0001045A\U0001045B\U0001045C\U0001045D\U0001045E\U0001045F\U00010460\U00010461\U00010462\U00010463\U00010464\U00010465\U00010466\U00010467\U00010468\U00010469\U0001046A\U0001046B\U0001046C\U0001046D\U0001046E\U0001046F\U00010470\U00010471\U00010472\U00010473\U00010474\U00010475\U00010476\U00010477\U00010478\U00010479\U0001047A\U0001047B\U0001047C\U0001047D\U0001047E\U0001047F\U00010480\U00010481\U00010482\U00010483\U00010484\U00010485\U00010486\U00010487\U00010488\U00010489\U0001048A\U0001048B\U0001048C\U0001048D\U0001048E\U0001048F\U00010490\U00010491\U00010492\U00010493\U00010494\U00010495\U00010496\U00010497\U00010498\U00010499\U0001049A\U0001049B\U0001049C\U0001049D\U0001049E\U0001049F\U000104A0\U000104A1\U000104A2\U000104A3\U000104A4\U000104A5\U000104A6\U000104A7\U000104A8\U000104A9\U000104AA\U000104AB\U000104AC\U000104AD\U000104AE\U000104AF\U000104B0\U000104B1\U000104B2\U000104B3\U000104B4\U000104B5\U000104B6\U000104B7\U000104B8\U000104B9\U000104BA\U000104BB\U000104BC\U000104BD\U000104BE\U000104BF\U000104C0\U000104C1\U000104C2\U000104C3\U000104C4\U000104C5\U000104C6\U000104C7\U000104C8\U000104C9\U000104CA\U000104CB\U000104CC\U000104CD\U000104CE\U000104CF\U000104D0\U000104D1\U000104D2\U000104D3\U000104D4\U000104D5\U000104D6\U000104D7\U000104D8\U000104D9\U000104DA\U000104DB\U000104DC\U000104DD\U000104DE\U000104DF\U000104E0\U000104E1\U000104E2\U000104E3\U000104E4\U000104E5\U000104E6\U000104E7\U000104E8\U000104E9\U000104EA\U000104EB\U000104EC\U000104ED\U000104EE\U000104EF\U000104F0\U000104F1\U000104F2\U000104F3\U000104F4\U000104F5\U000104F6\U000104F7\U000104F8\U000104F9\U000104FA\U000104FB\U000104FC\U000104FD\U000104FE\U000104FF"sv, + u8"\U00010428\U00010429\U0001042A\U0001042B\U0001042C\U0001042D\U0001042E\U0001042F\U00010430\U00010431\U00010432\U00010433\U00010434\U00010435\U00010436\U00010437\U00010438\U00010439\U0001043A\U0001043B\U0001043C\U0001043D\U0001043E\U0001043F\U00010440\U00010441\U00010442\U00010443\U00010444\U00010445\U00010446\U00010447\U00010448\U00010449\U0001044A\U0001044B\U0001044C\U0001044D\U0001044E\U0001044F\U00010428\U00010429\U0001042A\U0001042B\U0001042C\U0001042D\U0001042E\U0001042F\U00010430\U00010431\U00010432\U00010433\U00010434\U00010435\U00010436\U00010437\U00010438\U00010439\U0001043A\U0001043B\U0001043C\U0001043D\U0001043E\U0001043F\U00010440\U00010441\U00010442\U00010443\U00010444\U00010445\U00010446\U00010447\U00010448\U00010449\U0001044A\U0001044B\U0001044C\U0001044D\U0001044E\U0001044F\U00010450\U00010451\U00010452\U00010453\U00010454\U00010455\U00010456\U00010457\U00010458\U00010459\U0001045A\U0001045B\U0001045C\U0001045D\U0001045E\U0001045F\U00010460\U00010461\U00010462\U00010463\U00010464\U00010465\U00010466\U00010467\U00010468\U00010469\U0001046A\U0001046B\U0001046C\U0001046D\U0001046E\U0001046F\U00010470\U00010471\U00010472\U00010473\U00010474\U00010475\U00010476\U00010477\U00010478\U00010479\U0001047A\U0001047B\U0001047C\U0001047D\U0001047E\U0001047F\U00010480\U00010481\U00010482\U00010483\U00010484\U00010485\U00010486\U00010487\U00010488\U00010489\U0001048A\U0001048B\U0001048C\U0001048D\U0001048E\U0001048F\U00010490\U00010491\U00010492\U00010493\U00010494\U00010495\U00010496\U00010497\U00010498\U00010499\U0001049A\U0001049B\U0001049C\U0001049D\U0001049E\U0001049F\U000104A0\U000104A1\U000104A2\U000104A3\U000104A4\U000104A5\U000104A6\U000104A7\U000104A8\U000104A9\U000104AA\U000104AB\U000104AC\U000104AD\U000104AE\U000104AF\U000104D8\U000104D9\U000104DA\U000104DB\U000104DC\U000104DD\U000104DE\U000104DF\U000104E0\U000104E1\U000104E2\U000104E3\U000104E4\U000104E5\U000104E6\U000104E7\U000104E8\U000104E9\U000104EA\U000104EB\U000104EC\U000104ED\U000104EE\U000104EF\U000104F0\U000104F1\U000104F2\U000104F3\U000104F4\U000104F5\U000104F6\U000104F7\U000104F8\U000104F9\U000104FA\U000104FB\U000104D4\U000104D5\U000104D6\U000104D7\U000104D8\U000104D9\U000104DA\U000104DB\U000104DC\U000104DD\U000104DE\U000104DF\U000104E0\U000104E1\U000104E2\U000104E3\U000104E4\U000104E5\U000104E6\U000104E7\U000104E8\U000104E9\U000104EA\U000104EB\U000104EC\U000104ED\U000104EE\U000104EF\U000104F0\U000104F1\U000104F2\U000104F3\U000104F4\U000104F5\U000104F6\U000104F7\U000104F8\U000104F9\U000104FA\U000104FB\U000104FC\U000104FD\U000104FE\U000104FF"sv}, + {u8"\U00010500\U00010501\U00010502\U00010503\U00010504\U00010505\U00010506\U00010507\U00010508\U00010509\U0001050A\U0001050B\U0001050C\U0001050D\U0001050E\U0001050F\U00010510\U00010511\U00010512\U00010513\U00010514\U00010515\U00010516\U00010517\U00010518\U00010519\U0001051A\U0001051B\U0001051C\U0001051D\U0001051E\U0001051F\U00010520\U00010521\U00010522\U00010523\U00010524\U00010525\U00010526\U00010527\U00010528\U00010529\U0001052A\U0001052B\U0001052C\U0001052D\U0001052E\U0001052F\U00010530\U00010531\U00010532\U00010533\U00010534\U00010535\U00010536\U00010537\U00010538\U00010539\U0001053A\U0001053B\U0001053C\U0001053D\U0001053E\U0001053F\U00010540\U00010541\U00010542\U00010543\U00010544\U00010545\U00010546\U00010547\U00010548\U00010549\U0001054A\U0001054B\U0001054C\U0001054D\U0001054E\U0001054F\U00010550\U00010551\U00010552\U00010553\U00010554\U00010555\U00010556\U00010557\U00010558\U00010559\U0001055A\U0001055B\U0001055C\U0001055D\U0001055E\U0001055F\U00010560\U00010561\U00010562\U00010563\U00010564\U00010565\U00010566\U00010567\U00010568\U00010569\U0001056A\U0001056B\U0001056C\U0001056D\U0001056E\U0001056F\U00010570\U00010571\U00010572\U00010573\U00010574\U00010575\U00010576\U00010577\U00010578\U00010579\U0001057A\U0001057B\U0001057C\U0001057D\U0001057E\U0001057F\U00010580\U00010581\U00010582\U00010583\U00010584\U00010585\U00010586\U00010587\U00010588\U00010589\U0001058A\U0001058B\U0001058C\U0001058D\U0001058E\U0001058F\U00010590\U00010591\U00010592\U00010593\U00010594\U00010595\U00010596\U00010597\U00010598\U00010599\U0001059A\U0001059B\U0001059C\U0001059D\U0001059E\U0001059F\U000105A0\U000105A1\U000105A2\U000105A3\U000105A4\U000105A5\U000105A6\U000105A7\U000105A8\U000105A9\U000105AA\U000105AB\U000105AC\U000105AD\U000105AE\U000105AF\U000105B0\U000105B1\U000105B2\U000105B3\U000105B4\U000105B5\U000105B6\U000105B7\U000105B8\U000105B9\U000105BA\U000105BB\U000105BC\U000105BD\U000105BE\U000105BF\U000105C0\U000105C1\U000105C2\U000105C3\U000105C4\U000105C5\U000105C6\U000105C7\U000105C8\U000105C9\U000105CA\U000105CB\U000105CC\U000105CD\U000105CE\U000105CF\U000105D0\U000105D1\U000105D2\U000105D3\U000105D4\U000105D5\U000105D6\U000105D7\U000105D8\U000105D9\U000105DA\U000105DB\U000105DC\U000105DD\U000105DE\U000105DF\U000105E0\U000105E1\U000105E2\U000105E3\U000105E4\U000105E5\U000105E6\U000105E7\U000105E8\U000105E9\U000105EA\U000105EB\U000105EC\U000105ED\U000105EE\U000105EF\U000105F0\U000105F1\U000105F2\U000105F3\U000105F4\U000105F5\U000105F6\U000105F7\U000105F8\U000105F9\U000105FA\U000105FB\U000105FC\U000105FD\U000105FE\U000105FF"sv, + u8"\U00010500\U00010501\U00010502\U00010503\U00010504\U00010505\U00010506\U00010507\U00010508\U00010509\U0001050A\U0001050B\U0001050C\U0001050D\U0001050E\U0001050F\U00010510\U00010511\U00010512\U00010513\U00010514\U00010515\U00010516\U00010517\U00010518\U00010519\U0001051A\U0001051B\U0001051C\U0001051D\U0001051E\U0001051F\U00010520\U00010521\U00010522\U00010523\U00010524\U00010525\U00010526\U00010527\U00010528\U00010529\U0001052A\U0001052B\U0001052C\U0001052D\U0001052E\U0001052F\U00010530\U00010531\U00010532\U00010533\U00010534\U00010535\U00010536\U00010537\U00010538\U00010539\U0001053A\U0001053B\U0001053C\U0001053D\U0001053E\U0001053F\U00010540\U00010541\U00010542\U00010543\U00010544\U00010545\U00010546\U00010547\U00010548\U00010549\U0001054A\U0001054B\U0001054C\U0001054D\U0001054E\U0001054F\U00010550\U00010551\U00010552\U00010553\U00010554\U00010555\U00010556\U00010557\U00010558\U00010559\U0001055A\U0001055B\U0001055C\U0001055D\U0001055E\U0001055F\U00010560\U00010561\U00010562\U00010563\U00010564\U00010565\U00010566\U00010567\U00010568\U00010569\U0001056A\U0001056B\U0001056C\U0001056D\U0001056E\U0001056F\U00010597\U00010598\U00010599\U0001059A\U0001059B\U0001059C\U0001059D\U0001059E\U0001059F\U000105A0\U000105A1\U0001057B\U000105A3\U000105A4\U000105A5\U000105A6\U000105A7\U000105A8\U000105A9\U000105AA\U000105AB\U000105AC\U000105AD\U000105AE\U000105AF\U000105B0\U000105B1\U0001058B\U000105B3\U000105B4\U000105B5\U000105B6\U000105B7\U000105B8\U000105B9\U00010593\U000105BB\U000105BC\U00010596\U00010597\U00010598\U00010599\U0001059A\U0001059B\U0001059C\U0001059D\U0001059E\U0001059F\U000105A0\U000105A1\U000105A2\U000105A3\U000105A4\U000105A5\U000105A6\U000105A7\U000105A8\U000105A9\U000105AA\U000105AB\U000105AC\U000105AD\U000105AE\U000105AF\U000105B0\U000105B1\U000105B2\U000105B3\U000105B4\U000105B5\U000105B6\U000105B7\U000105B8\U000105B9\U000105BA\U000105BB\U000105BC\U000105BD\U000105BE\U000105BF\U000105C0\U000105C1\U000105C2\U000105C3\U000105C4\U000105C5\U000105C6\U000105C7\U000105C8\U000105C9\U000105CA\U000105CB\U000105CC\U000105CD\U000105CE\U000105CF\U000105D0\U000105D1\U000105D2\U000105D3\U000105D4\U000105D5\U000105D6\U000105D7\U000105D8\U000105D9\U000105DA\U000105DB\U000105DC\U000105DD\U000105DE\U000105DF\U000105E0\U000105E1\U000105E2\U000105E3\U000105E4\U000105E5\U000105E6\U000105E7\U000105E8\U000105E9\U000105EA\U000105EB\U000105EC\U000105ED\U000105EE\U000105EF\U000105F0\U000105F1\U000105F2\U000105F3\U000105F4\U000105F5\U000105F6\U000105F7\U000105F8\U000105F9\U000105FA\U000105FB\U000105FC\U000105FD\U000105FE\U000105FF"sv}, + {u8"\U00010C00\U00010C01\U00010C02\U00010C03\U00010C04\U00010C05\U00010C06\U00010C07\U00010C08\U00010C09\U00010C0A\U00010C0B\U00010C0C\U00010C0D\U00010C0E\U00010C0F\U00010C10\U00010C11\U00010C12\U00010C13\U00010C14\U00010C15\U00010C16\U00010C17\U00010C18\U00010C19\U00010C1A\U00010C1B\U00010C1C\U00010C1D\U00010C1E\U00010C1F\U00010C20\U00010C21\U00010C22\U00010C23\U00010C24\U00010C25\U00010C26\U00010C27\U00010C28\U00010C29\U00010C2A\U00010C2B\U00010C2C\U00010C2D\U00010C2E\U00010C2F\U00010C30\U00010C31\U00010C32\U00010C33\U00010C34\U00010C35\U00010C36\U00010C37\U00010C38\U00010C39\U00010C3A\U00010C3B\U00010C3C\U00010C3D\U00010C3E\U00010C3F\U00010C40\U00010C41\U00010C42\U00010C43\U00010C44\U00010C45\U00010C46\U00010C47\U00010C48\U00010C49\U00010C4A\U00010C4B\U00010C4C\U00010C4D\U00010C4E\U00010C4F\U00010C50\U00010C51\U00010C52\U00010C53\U00010C54\U00010C55\U00010C56\U00010C57\U00010C58\U00010C59\U00010C5A\U00010C5B\U00010C5C\U00010C5D\U00010C5E\U00010C5F\U00010C60\U00010C61\U00010C62\U00010C63\U00010C64\U00010C65\U00010C66\U00010C67\U00010C68\U00010C69\U00010C6A\U00010C6B\U00010C6C\U00010C6D\U00010C6E\U00010C6F\U00010C70\U00010C71\U00010C72\U00010C73\U00010C74\U00010C75\U00010C76\U00010C77\U00010C78\U00010C79\U00010C7A\U00010C7B\U00010C7C\U00010C7D\U00010C7E\U00010C7F\U00010C80\U00010C81\U00010C82\U00010C83\U00010C84\U00010C85\U00010C86\U00010C87\U00010C88\U00010C89\U00010C8A\U00010C8B\U00010C8C\U00010C8D\U00010C8E\U00010C8F\U00010C90\U00010C91\U00010C92\U00010C93\U00010C94\U00010C95\U00010C96\U00010C97\U00010C98\U00010C99\U00010C9A\U00010C9B\U00010C9C\U00010C9D\U00010C9E\U00010C9F\U00010CA0\U00010CA1\U00010CA2\U00010CA3\U00010CA4\U00010CA5\U00010CA6\U00010CA7\U00010CA8\U00010CA9\U00010CAA\U00010CAB\U00010CAC\U00010CAD\U00010CAE\U00010CAF\U00010CB0\U00010CB1\U00010CB2\U00010CB3\U00010CB4\U00010CB5\U00010CB6\U00010CB7\U00010CB8\U00010CB9\U00010CBA\U00010CBB\U00010CBC\U00010CBD\U00010CBE\U00010CBF\U00010CC0\U00010CC1\U00010CC2\U00010CC3\U00010CC4\U00010CC5\U00010CC6\U00010CC7\U00010CC8\U00010CC9\U00010CCA\U00010CCB\U00010CCC\U00010CCD\U00010CCE\U00010CCF\U00010CD0\U00010CD1\U00010CD2\U00010CD3\U00010CD4\U00010CD5\U00010CD6\U00010CD7\U00010CD8\U00010CD9\U00010CDA\U00010CDB\U00010CDC\U00010CDD\U00010CDE\U00010CDF\U00010CE0\U00010CE1\U00010CE2\U00010CE3\U00010CE4\U00010CE5\U00010CE6\U00010CE7\U00010CE8\U00010CE9\U00010CEA\U00010CEB\U00010CEC\U00010CED\U00010CEE\U00010CEF\U00010CF0\U00010CF1\U00010CF2\U00010CF3\U00010CF4\U00010CF5\U00010CF6\U00010CF7\U00010CF8\U00010CF9\U00010CFA\U00010CFB\U00010CFC\U00010CFD\U00010CFE\U00010CFF"sv, + u8"\U00010C00\U00010C01\U00010C02\U00010C03\U00010C04\U00010C05\U00010C06\U00010C07\U00010C08\U00010C09\U00010C0A\U00010C0B\U00010C0C\U00010C0D\U00010C0E\U00010C0F\U00010C10\U00010C11\U00010C12\U00010C13\U00010C14\U00010C15\U00010C16\U00010C17\U00010C18\U00010C19\U00010C1A\U00010C1B\U00010C1C\U00010C1D\U00010C1E\U00010C1F\U00010C20\U00010C21\U00010C22\U00010C23\U00010C24\U00010C25\U00010C26\U00010C27\U00010C28\U00010C29\U00010C2A\U00010C2B\U00010C2C\U00010C2D\U00010C2E\U00010C2F\U00010C30\U00010C31\U00010C32\U00010C33\U00010C34\U00010C35\U00010C36\U00010C37\U00010C38\U00010C39\U00010C3A\U00010C3B\U00010C3C\U00010C3D\U00010C3E\U00010C3F\U00010C40\U00010C41\U00010C42\U00010C43\U00010C44\U00010C45\U00010C46\U00010C47\U00010C48\U00010C49\U00010C4A\U00010C4B\U00010C4C\U00010C4D\U00010C4E\U00010C4F\U00010C50\U00010C51\U00010C52\U00010C53\U00010C54\U00010C55\U00010C56\U00010C57\U00010C58\U00010C59\U00010C5A\U00010C5B\U00010C5C\U00010C5D\U00010C5E\U00010C5F\U00010C60\U00010C61\U00010C62\U00010C63\U00010C64\U00010C65\U00010C66\U00010C67\U00010C68\U00010C69\U00010C6A\U00010C6B\U00010C6C\U00010C6D\U00010C6E\U00010C6F\U00010C70\U00010C71\U00010C72\U00010C73\U00010C74\U00010C75\U00010C76\U00010C77\U00010C78\U00010C79\U00010C7A\U00010C7B\U00010C7C\U00010C7D\U00010C7E\U00010C7F\U00010CC0\U00010CC1\U00010CC2\U00010CC3\U00010CC4\U00010CC5\U00010CC6\U00010CC7\U00010CC8\U00010CC9\U00010CCA\U00010CCB\U00010CCC\U00010CCD\U00010CCE\U00010CCF\U00010CD0\U00010CD1\U00010CD2\U00010CD3\U00010CD4\U00010CD5\U00010CD6\U00010CD7\U00010CD8\U00010CD9\U00010CDA\U00010CDB\U00010CDC\U00010CDD\U00010CDE\U00010CDF\U00010CE0\U00010CE1\U00010CE2\U00010CE3\U00010CE4\U00010CE5\U00010CE6\U00010CE7\U00010CE8\U00010CE9\U00010CEA\U00010CEB\U00010CEC\U00010CED\U00010CEE\U00010CEF\U00010CF0\U00010CF1\U00010CF2\U00010CB3\U00010CB4\U00010CB5\U00010CB6\U00010CB7\U00010CB8\U00010CB9\U00010CBA\U00010CBB\U00010CBC\U00010CBD\U00010CBE\U00010CBF\U00010CC0\U00010CC1\U00010CC2\U00010CC3\U00010CC4\U00010CC5\U00010CC6\U00010CC7\U00010CC8\U00010CC9\U00010CCA\U00010CCB\U00010CCC\U00010CCD\U00010CCE\U00010CCF\U00010CD0\U00010CD1\U00010CD2\U00010CD3\U00010CD4\U00010CD5\U00010CD6\U00010CD7\U00010CD8\U00010CD9\U00010CDA\U00010CDB\U00010CDC\U00010CDD\U00010CDE\U00010CDF\U00010CE0\U00010CE1\U00010CE2\U00010CE3\U00010CE4\U00010CE5\U00010CE6\U00010CE7\U00010CE8\U00010CE9\U00010CEA\U00010CEB\U00010CEC\U00010CED\U00010CEE\U00010CEF\U00010CF0\U00010CF1\U00010CF2\U00010CF3\U00010CF4\U00010CF5\U00010CF6\U00010CF7\U00010CF8\U00010CF9\U00010CFA\U00010CFB\U00010CFC\U00010CFD\U00010CFE\U00010CFF"sv}, + {u8"\U00010D00\U00010D01\U00010D02\U00010D03\U00010D04\U00010D05\U00010D06\U00010D07\U00010D08\U00010D09\U00010D0A\U00010D0B\U00010D0C\U00010D0D\U00010D0E\U00010D0F\U00010D10\U00010D11\U00010D12\U00010D13\U00010D14\U00010D15\U00010D16\U00010D17\U00010D18\U00010D19\U00010D1A\U00010D1B\U00010D1C\U00010D1D\U00010D1E\U00010D1F\U00010D20\U00010D21\U00010D22\U00010D23\U00010D24\U00010D25\U00010D26\U00010D27\U00010D28\U00010D29\U00010D2A\U00010D2B\U00010D2C\U00010D2D\U00010D2E\U00010D2F\U00010D30\U00010D31\U00010D32\U00010D33\U00010D34\U00010D35\U00010D36\U00010D37\U00010D38\U00010D39\U00010D3A\U00010D3B\U00010D3C\U00010D3D\U00010D3E\U00010D3F\U00010D40\U00010D41\U00010D42\U00010D43\U00010D44\U00010D45\U00010D46\U00010D47\U00010D48\U00010D49\U00010D4A\U00010D4B\U00010D4C\U00010D4D\U00010D4E\U00010D4F\U00010D50\U00010D51\U00010D52\U00010D53\U00010D54\U00010D55\U00010D56\U00010D57\U00010D58\U00010D59\U00010D5A\U00010D5B\U00010D5C\U00010D5D\U00010D5E\U00010D5F\U00010D60\U00010D61\U00010D62\U00010D63\U00010D64\U00010D65\U00010D66\U00010D67\U00010D68\U00010D69\U00010D6A\U00010D6B\U00010D6C\U00010D6D\U00010D6E\U00010D6F\U00010D70\U00010D71\U00010D72\U00010D73\U00010D74\U00010D75\U00010D76\U00010D77\U00010D78\U00010D79\U00010D7A\U00010D7B\U00010D7C\U00010D7D\U00010D7E\U00010D7F\U00010D80\U00010D81\U00010D82\U00010D83\U00010D84\U00010D85\U00010D86\U00010D87\U00010D88\U00010D89\U00010D8A\U00010D8B\U00010D8C\U00010D8D\U00010D8E\U00010D8F\U00010D90\U00010D91\U00010D92\U00010D93\U00010D94\U00010D95\U00010D96\U00010D97\U00010D98\U00010D99\U00010D9A\U00010D9B\U00010D9C\U00010D9D\U00010D9E\U00010D9F\U00010DA0\U00010DA1\U00010DA2\U00010DA3\U00010DA4\U00010DA5\U00010DA6\U00010DA7\U00010DA8\U00010DA9\U00010DAA\U00010DAB\U00010DAC\U00010DAD\U00010DAE\U00010DAF\U00010DB0\U00010DB1\U00010DB2\U00010DB3\U00010DB4\U00010DB5\U00010DB6\U00010DB7\U00010DB8\U00010DB9\U00010DBA\U00010DBB\U00010DBC\U00010DBD\U00010DBE\U00010DBF\U00010DC0\U00010DC1\U00010DC2\U00010DC3\U00010DC4\U00010DC5\U00010DC6\U00010DC7\U00010DC8\U00010DC9\U00010DCA\U00010DCB\U00010DCC\U00010DCD\U00010DCE\U00010DCF\U00010DD0\U00010DD1\U00010DD2\U00010DD3\U00010DD4\U00010DD5\U00010DD6\U00010DD7\U00010DD8\U00010DD9\U00010DDA\U00010DDB\U00010DDC\U00010DDD\U00010DDE\U00010DDF\U00010DE0\U00010DE1\U00010DE2\U00010DE3\U00010DE4\U00010DE5\U00010DE6\U00010DE7\U00010DE8\U00010DE9\U00010DEA\U00010DEB\U00010DEC\U00010DED\U00010DEE\U00010DEF\U00010DF0\U00010DF1\U00010DF2\U00010DF3\U00010DF4\U00010DF5\U00010DF6\U00010DF7\U00010DF8\U00010DF9\U00010DFA\U00010DFB\U00010DFC\U00010DFD\U00010DFE\U00010DFF"sv, u8"\U00010D00\U00010D01\U00010D02\U00010D03\U00010D04\U00010D05\U00010D06\U00010D07\U00010D08\U00010D09\U00010D0A\U00010D0B\U00010D0C\U00010D0D\U00010D0E\U00010D0F\U00010D10\U00010D11\U00010D12\U00010D13\U00010D14\U00010D15\U00010D16\U00010D17\U00010D18\U00010D19\U00010D1A\U00010D1B\U00010D1C\U00010D1D\U00010D1E\U00010D1F\U00010D20\U00010D21\U00010D22\U00010D23\U00010D24\U00010D25\U00010D26\U00010D27\U00010D28\U00010D29\U00010D2A\U00010D2B\U00010D2C\U00010D2D\U00010D2E\U00010D2F\U00010D30\U00010D31\U00010D32\U00010D33\U00010D34\U00010D35\U00010D36\U00010D37\U00010D38\U00010D39\U00010D3A\U00010D3B\U00010D3C\U00010D3D\U00010D3E\U00010D3F\U00010D40\U00010D41\U00010D42\U00010D43\U00010D44\U00010D45\U00010D46\U00010D47\U00010D48\U00010D49\U00010D4A\U00010D4B\U00010D4C\U00010D4D\U00010D4E\U00010D4F\U00010D70\U00010D71\U00010D72\U00010D73\U00010D74\U00010D75\U00010D76\U00010D77\U00010D78\U00010D79\U00010D7A\U00010D7B\U00010D7C\U00010D7D\U00010D7E\U00010D7F\U00010D80\U00010D81\U00010D82\U00010D83\U00010D84\U00010D85\U00010D66\U00010D67\U00010D68\U00010D69\U00010D6A\U00010D6B\U00010D6C\U00010D6D\U00010D6E\U00010D6F\U00010D70\U00010D71\U00010D72\U00010D73\U00010D74\U00010D75\U00010D76\U00010D77\U00010D78\U00010D79\U00010D7A\U00010D7B\U00010D7C\U00010D7D\U00010D7E\U00010D7F\U00010D80\U00010D81\U00010D82\U00010D83\U00010D84\U00010D85\U00010D86\U00010D87\U00010D88\U00010D89\U00010D8A\U00010D8B\U00010D8C\U00010D8D\U00010D8E\U00010D8F\U00010D90\U00010D91\U00010D92\U00010D93\U00010D94\U00010D95\U00010D96\U00010D97\U00010D98\U00010D99\U00010D9A\U00010D9B\U00010D9C\U00010D9D\U00010D9E\U00010D9F\U00010DA0\U00010DA1\U00010DA2\U00010DA3\U00010DA4\U00010DA5\U00010DA6\U00010DA7\U00010DA8\U00010DA9\U00010DAA\U00010DAB\U00010DAC\U00010DAD\U00010DAE\U00010DAF\U00010DB0\U00010DB1\U00010DB2\U00010DB3\U00010DB4\U00010DB5\U00010DB6\U00010DB7\U00010DB8\U00010DB9\U00010DBA\U00010DBB\U00010DBC\U00010DBD\U00010DBE\U00010DBF\U00010DC0\U00010DC1\U00010DC2\U00010DC3\U00010DC4\U00010DC5\U00010DC6\U00010DC7\U00010DC8\U00010DC9\U00010DCA\U00010DCB\U00010DCC\U00010DCD\U00010DCE\U00010DCF\U00010DD0\U00010DD1\U00010DD2\U00010DD3\U00010DD4\U00010DD5\U00010DD6\U00010DD7\U00010DD8\U00010DD9\U00010DDA\U00010DDB\U00010DDC\U00010DDD\U00010DDE\U00010DDF\U00010DE0\U00010DE1\U00010DE2\U00010DE3\U00010DE4\U00010DE5\U00010DE6\U00010DE7\U00010DE8\U00010DE9\U00010DEA\U00010DEB\U00010DEC\U00010DED\U00010DEE\U00010DEF\U00010DF0\U00010DF1\U00010DF2\U00010DF3\U00010DF4\U00010DF5\U00010DF6\U00010DF7\U00010DF8\U00010DF9\U00010DFA\U00010DFB\U00010DFC\U00010DFD\U00010DFE\U00010DFF"sv}, + {u8"\U00011800\U00011801\U00011802\U00011803\U00011804\U00011805\U00011806\U00011807\U00011808\U00011809\U0001180A\U0001180B\U0001180C\U0001180D\U0001180E\U0001180F\U00011810\U00011811\U00011812\U00011813\U00011814\U00011815\U00011816\U00011817\U00011818\U00011819\U0001181A\U0001181B\U0001181C\U0001181D\U0001181E\U0001181F\U00011820\U00011821\U00011822\U00011823\U00011824\U00011825\U00011826\U00011827\U00011828\U00011829\U0001182A\U0001182B\U0001182C\U0001182D\U0001182E\U0001182F\U00011830\U00011831\U00011832\U00011833\U00011834\U00011835\U00011836\U00011837\U00011838\U00011839\U0001183A\U0001183B\U0001183C\U0001183D\U0001183E\U0001183F\U00011840\U00011841\U00011842\U00011843\U00011844\U00011845\U00011846\U00011847\U00011848\U00011849\U0001184A\U0001184B\U0001184C\U0001184D\U0001184E\U0001184F\U00011850\U00011851\U00011852\U00011853\U00011854\U00011855\U00011856\U00011857\U00011858\U00011859\U0001185A\U0001185B\U0001185C\U0001185D\U0001185E\U0001185F\U00011860\U00011861\U00011862\U00011863\U00011864\U00011865\U00011866\U00011867\U00011868\U00011869\U0001186A\U0001186B\U0001186C\U0001186D\U0001186E\U0001186F\U00011870\U00011871\U00011872\U00011873\U00011874\U00011875\U00011876\U00011877\U00011878\U00011879\U0001187A\U0001187B\U0001187C\U0001187D\U0001187E\U0001187F\U00011880\U00011881\U00011882\U00011883\U00011884\U00011885\U00011886\U00011887\U00011888\U00011889\U0001188A\U0001188B\U0001188C\U0001188D\U0001188E\U0001188F\U00011890\U00011891\U00011892\U00011893\U00011894\U00011895\U00011896\U00011897\U00011898\U00011899\U0001189A\U0001189B\U0001189C\U0001189D\U0001189E\U0001189F\U000118A0\U000118A1\U000118A2\U000118A3\U000118A4\U000118A5\U000118A6\U000118A7\U000118A8\U000118A9\U000118AA\U000118AB\U000118AC\U000118AD\U000118AE\U000118AF\U000118B0\U000118B1\U000118B2\U000118B3\U000118B4\U000118B5\U000118B6\U000118B7\U000118B8\U000118B9\U000118BA\U000118BB\U000118BC\U000118BD\U000118BE\U000118BF\U000118C0\U000118C1\U000118C2\U000118C3\U000118C4\U000118C5\U000118C6\U000118C7\U000118C8\U000118C9\U000118CA\U000118CB\U000118CC\U000118CD\U000118CE\U000118CF\U000118D0\U000118D1\U000118D2\U000118D3\U000118D4\U000118D5\U000118D6\U000118D7\U000118D8\U000118D9\U000118DA\U000118DB\U000118DC\U000118DD\U000118DE\U000118DF\U000118E0\U000118E1\U000118E2\U000118E3\U000118E4\U000118E5\U000118E6\U000118E7\U000118E8\U000118E9\U000118EA\U000118EB\U000118EC\U000118ED\U000118EE\U000118EF\U000118F0\U000118F1\U000118F2\U000118F3\U000118F4\U000118F5\U000118F6\U000118F7\U000118F8\U000118F9\U000118FA\U000118FB\U000118FC\U000118FD\U000118FE\U000118FF"sv, u8"\U00011800\U00011801\U00011802\U00011803\U00011804\U00011805\U00011806\U00011807\U00011808\U00011809\U0001180A\U0001180B\U0001180C\U0001180D\U0001180E\U0001180F\U00011810\U00011811\U00011812\U00011813\U00011814\U00011815\U00011816\U00011817\U00011818\U00011819\U0001181A\U0001181B\U0001181C\U0001181D\U0001181E\U0001181F\U00011820\U00011821\U00011822\U00011823\U00011824\U00011825\U00011826\U00011827\U00011828\U00011829\U0001182A\U0001182B\U0001182C\U0001182D\U0001182E\U0001182F\U00011830\U00011831\U00011832\U00011833\U00011834\U00011835\U00011836\U00011837\U00011838\U00011839\U0001183A\U0001183B\U0001183C\U0001183D\U0001183E\U0001183F\U00011840\U00011841\U00011842\U00011843\U00011844\U00011845\U00011846\U00011847\U00011848\U00011849\U0001184A\U0001184B\U0001184C\U0001184D\U0001184E\U0001184F\U00011850\U00011851\U00011852\U00011853\U00011854\U00011855\U00011856\U00011857\U00011858\U00011859\U0001185A\U0001185B\U0001185C\U0001185D\U0001185E\U0001185F\U00011860\U00011861\U00011862\U00011863\U00011864\U00011865\U00011866\U00011867\U00011868\U00011869\U0001186A\U0001186B\U0001186C\U0001186D\U0001186E\U0001186F\U00011870\U00011871\U00011872\U00011873\U00011874\U00011875\U00011876\U00011877\U00011878\U00011879\U0001187A\U0001187B\U0001187C\U0001187D\U0001187E\U0001187F\U00011880\U00011881\U00011882\U00011883\U00011884\U00011885\U00011886\U00011887\U00011888\U00011889\U0001188A\U0001188B\U0001188C\U0001188D\U0001188E\U0001188F\U00011890\U00011891\U00011892\U00011893\U00011894\U00011895\U00011896\U00011897\U00011898\U00011899\U0001189A\U0001189B\U0001189C\U0001189D\U0001189E\U0001189F\U000118C0\U000118C1\U000118C2\U000118C3\U000118C4\U000118C5\U000118C6\U000118C7\U000118C8\U000118C9\U000118CA\U000118CB\U000118CC\U000118CD\U000118CE\U000118CF\U000118D0\U000118D1\U000118D2\U000118D3\U000118D4\U000118D5\U000118D6\U000118D7\U000118D8\U000118D9\U000118DA\U000118DB\U000118DC\U000118DD\U000118DE\U000118DF\U000118C0\U000118C1\U000118C2\U000118C3\U000118C4\U000118C5\U000118C6\U000118C7\U000118C8\U000118C9\U000118CA\U000118CB\U000118CC\U000118CD\U000118CE\U000118CF\U000118D0\U000118D1\U000118D2\U000118D3\U000118D4\U000118D5\U000118D6\U000118D7\U000118D8\U000118D9\U000118DA\U000118DB\U000118DC\U000118DD\U000118DE\U000118DF\U000118E0\U000118E1\U000118E2\U000118E3\U000118E4\U000118E5\U000118E6\U000118E7\U000118E8\U000118E9\U000118EA\U000118EB\U000118EC\U000118ED\U000118EE\U000118EF\U000118F0\U000118F1\U000118F2\U000118F3\U000118F4\U000118F5\U000118F6\U000118F7\U000118F8\U000118F9\U000118FA\U000118FB\U000118FC\U000118FD\U000118FE\U000118FF"sv}, + {u8"\U00016E00\U00016E01\U00016E02\U00016E03\U00016E04\U00016E05\U00016E06\U00016E07\U00016E08\U00016E09\U00016E0A\U00016E0B\U00016E0C\U00016E0D\U00016E0E\U00016E0F\U00016E10\U00016E11\U00016E12\U00016E13\U00016E14\U00016E15\U00016E16\U00016E17\U00016E18\U00016E19\U00016E1A\U00016E1B\U00016E1C\U00016E1D\U00016E1E\U00016E1F\U00016E20\U00016E21\U00016E22\U00016E23\U00016E24\U00016E25\U00016E26\U00016E27\U00016E28\U00016E29\U00016E2A\U00016E2B\U00016E2C\U00016E2D\U00016E2E\U00016E2F\U00016E30\U00016E31\U00016E32\U00016E33\U00016E34\U00016E35\U00016E36\U00016E37\U00016E38\U00016E39\U00016E3A\U00016E3B\U00016E3C\U00016E3D\U00016E3E\U00016E3F\U00016E40\U00016E41\U00016E42\U00016E43\U00016E44\U00016E45\U00016E46\U00016E47\U00016E48\U00016E49\U00016E4A\U00016E4B\U00016E4C\U00016E4D\U00016E4E\U00016E4F\U00016E50\U00016E51\U00016E52\U00016E53\U00016E54\U00016E55\U00016E56\U00016E57\U00016E58\U00016E59\U00016E5A\U00016E5B\U00016E5C\U00016E5D\U00016E5E\U00016E5F\U00016E60\U00016E61\U00016E62\U00016E63\U00016E64\U00016E65\U00016E66\U00016E67\U00016E68\U00016E69\U00016E6A\U00016E6B\U00016E6C\U00016E6D\U00016E6E\U00016E6F\U00016E70\U00016E71\U00016E72\U00016E73\U00016E74\U00016E75\U00016E76\U00016E77\U00016E78\U00016E79\U00016E7A\U00016E7B\U00016E7C\U00016E7D\U00016E7E\U00016E7F\U00016E80\U00016E81\U00016E82\U00016E83\U00016E84\U00016E85\U00016E86\U00016E87\U00016E88\U00016E89\U00016E8A\U00016E8B\U00016E8C\U00016E8D\U00016E8E\U00016E8F\U00016E90\U00016E91\U00016E92\U00016E93\U00016E94\U00016E95\U00016E96\U00016E97\U00016E98\U00016E99\U00016E9A\U00016E9B\U00016E9C\U00016E9D\U00016E9E\U00016E9F\U00016EA0\U00016EA1\U00016EA2\U00016EA3\U00016EA4\U00016EA5\U00016EA6\U00016EA7\U00016EA8\U00016EA9\U00016EAA\U00016EAB\U00016EAC\U00016EAD\U00016EAE\U00016EAF\U00016EB0\U00016EB1\U00016EB2\U00016EB3\U00016EB4\U00016EB5\U00016EB6\U00016EB7\U00016EB8\U00016EB9\U00016EBA\U00016EBB\U00016EBC\U00016EBD\U00016EBE\U00016EBF\U00016EC0\U00016EC1\U00016EC2\U00016EC3\U00016EC4\U00016EC5\U00016EC6\U00016EC7\U00016EC8\U00016EC9\U00016ECA\U00016ECB\U00016ECC\U00016ECD\U00016ECE\U00016ECF\U00016ED0\U00016ED1\U00016ED2\U00016ED3\U00016ED4\U00016ED5\U00016ED6\U00016ED7\U00016ED8\U00016ED9\U00016EDA\U00016EDB\U00016EDC\U00016EDD\U00016EDE\U00016EDF\U00016EE0\U00016EE1\U00016EE2\U00016EE3\U00016EE4\U00016EE5\U00016EE6\U00016EE7\U00016EE8\U00016EE9\U00016EEA\U00016EEB\U00016EEC\U00016EED\U00016EEE\U00016EEF\U00016EF0\U00016EF1\U00016EF2\U00016EF3\U00016EF4\U00016EF5\U00016EF6\U00016EF7\U00016EF8\U00016EF9\U00016EFA\U00016EFB\U00016EFC\U00016EFD\U00016EFE\U00016EFF"sv, + u8"\U00016E00\U00016E01\U00016E02\U00016E03\U00016E04\U00016E05\U00016E06\U00016E07\U00016E08\U00016E09\U00016E0A\U00016E0B\U00016E0C\U00016E0D\U00016E0E\U00016E0F\U00016E10\U00016E11\U00016E12\U00016E13\U00016E14\U00016E15\U00016E16\U00016E17\U00016E18\U00016E19\U00016E1A\U00016E1B\U00016E1C\U00016E1D\U00016E1E\U00016E1F\U00016E20\U00016E21\U00016E22\U00016E23\U00016E24\U00016E25\U00016E26\U00016E27\U00016E28\U00016E29\U00016E2A\U00016E2B\U00016E2C\U00016E2D\U00016E2E\U00016E2F\U00016E30\U00016E31\U00016E32\U00016E33\U00016E34\U00016E35\U00016E36\U00016E37\U00016E38\U00016E39\U00016E3A\U00016E3B\U00016E3C\U00016E3D\U00016E3E\U00016E3F\U00016E60\U00016E61\U00016E62\U00016E63\U00016E64\U00016E65\U00016E66\U00016E67\U00016E68\U00016E69\U00016E6A\U00016E6B\U00016E6C\U00016E6D\U00016E6E\U00016E6F\U00016E70\U00016E71\U00016E72\U00016E73\U00016E74\U00016E75\U00016E76\U00016E77\U00016E78\U00016E79\U00016E7A\U00016E7B\U00016E7C\U00016E7D\U00016E7E\U00016E7F\U00016E60\U00016E61\U00016E62\U00016E63\U00016E64\U00016E65\U00016E66\U00016E67\U00016E68\U00016E69\U00016E6A\U00016E6B\U00016E6C\U00016E6D\U00016E6E\U00016E6F\U00016E70\U00016E71\U00016E72\U00016E73\U00016E74\U00016E75\U00016E76\U00016E77\U00016E78\U00016E79\U00016E7A\U00016E7B\U00016E7C\U00016E7D\U00016E7E\U00016E7F\U00016E80\U00016E81\U00016E82\U00016E83\U00016E84\U00016E85\U00016E86\U00016E87\U00016E88\U00016E89\U00016E8A\U00016E8B\U00016E8C\U00016E8D\U00016E8E\U00016E8F\U00016E90\U00016E91\U00016E92\U00016E93\U00016E94\U00016E95\U00016E96\U00016E97\U00016E98\U00016E99\U00016E9A\U00016E9B\U00016E9C\U00016E9D\U00016E9E\U00016E9F\U00016EA0\U00016EA1\U00016EA2\U00016EA3\U00016EA4\U00016EA5\U00016EA6\U00016EA7\U00016EA8\U00016EA9\U00016EAA\U00016EAB\U00016EAC\U00016EAD\U00016EAE\U00016EAF\U00016EB0\U00016EB1\U00016EB2\U00016EB3\U00016EB4\U00016EB5\U00016EB6\U00016EB7\U00016EB8\U00016EB9\U00016EBA\U00016EBB\U00016EBC\U00016EBD\U00016EBE\U00016EBF\U00016EC0\U00016EC1\U00016EC2\U00016EC3\U00016EC4\U00016EC5\U00016EC6\U00016EC7\U00016EC8\U00016EC9\U00016ECA\U00016ECB\U00016ECC\U00016ECD\U00016ECE\U00016ECF\U00016ED0\U00016ED1\U00016ED2\U00016ED3\U00016ED4\U00016ED5\U00016ED6\U00016ED7\U00016ED8\U00016ED9\U00016EDA\U00016EDB\U00016EDC\U00016EDD\U00016EDE\U00016EDF\U00016EE0\U00016EE1\U00016EE2\U00016EE3\U00016EE4\U00016EE5\U00016EE6\U00016EE7\U00016EE8\U00016EE9\U00016EEA\U00016EEB\U00016EEC\U00016EED\U00016EEE\U00016EEF\U00016EF0\U00016EF1\U00016EF2\U00016EF3\U00016EF4\U00016EF5\U00016EF6\U00016EF7\U00016EF8\U00016EF9\U00016EFA\U00016EFB\U00016EFC\U00016EFD\U00016EFE\U00016EFF"sv}, + {u8"\U0001E900\U0001E901\U0001E902\U0001E903\U0001E904\U0001E905\U0001E906\U0001E907\U0001E908\U0001E909\U0001E90A\U0001E90B\U0001E90C\U0001E90D\U0001E90E\U0001E90F\U0001E910\U0001E911\U0001E912\U0001E913\U0001E914\U0001E915\U0001E916\U0001E917\U0001E918\U0001E919\U0001E91A\U0001E91B\U0001E91C\U0001E91D\U0001E91E\U0001E91F\U0001E920\U0001E921\U0001E922\U0001E923\U0001E924\U0001E925\U0001E926\U0001E927\U0001E928\U0001E929\U0001E92A\U0001E92B\U0001E92C\U0001E92D\U0001E92E\U0001E92F\U0001E930\U0001E931\U0001E932\U0001E933\U0001E934\U0001E935\U0001E936\U0001E937\U0001E938\U0001E939\U0001E93A\U0001E93B\U0001E93C\U0001E93D\U0001E93E\U0001E93F\U0001E940\U0001E941\U0001E942\U0001E943\U0001E944\U0001E945\U0001E946\U0001E947\U0001E948\U0001E949\U0001E94A\U0001E94B\U0001E94C\U0001E94D\U0001E94E\U0001E94F\U0001E950\U0001E951\U0001E952\U0001E953\U0001E954\U0001E955\U0001E956\U0001E957\U0001E958\U0001E959\U0001E95A\U0001E95B\U0001E95C\U0001E95D\U0001E95E\U0001E95F\U0001E960\U0001E961\U0001E962\U0001E963\U0001E964\U0001E965\U0001E966\U0001E967\U0001E968\U0001E969\U0001E96A\U0001E96B\U0001E96C\U0001E96D\U0001E96E\U0001E96F\U0001E970\U0001E971\U0001E972\U0001E973\U0001E974\U0001E975\U0001E976\U0001E977\U0001E978\U0001E979\U0001E97A\U0001E97B\U0001E97C\U0001E97D\U0001E97E\U0001E97F\U0001E980\U0001E981\U0001E982\U0001E983\U0001E984\U0001E985\U0001E986\U0001E987\U0001E988\U0001E989\U0001E98A\U0001E98B\U0001E98C\U0001E98D\U0001E98E\U0001E98F\U0001E990\U0001E991\U0001E992\U0001E993\U0001E994\U0001E995\U0001E996\U0001E997\U0001E998\U0001E999\U0001E99A\U0001E99B\U0001E99C\U0001E99D\U0001E99E\U0001E99F\U0001E9A0\U0001E9A1\U0001E9A2\U0001E9A3\U0001E9A4\U0001E9A5\U0001E9A6\U0001E9A7\U0001E9A8\U0001E9A9\U0001E9AA\U0001E9AB\U0001E9AC\U0001E9AD\U0001E9AE\U0001E9AF\U0001E9B0\U0001E9B1\U0001E9B2\U0001E9B3\U0001E9B4\U0001E9B5\U0001E9B6\U0001E9B7\U0001E9B8\U0001E9B9\U0001E9BA\U0001E9BB\U0001E9BC\U0001E9BD\U0001E9BE\U0001E9BF\U0001E9C0\U0001E9C1\U0001E9C2\U0001E9C3\U0001E9C4\U0001E9C5\U0001E9C6\U0001E9C7\U0001E9C8\U0001E9C9\U0001E9CA\U0001E9CB\U0001E9CC\U0001E9CD\U0001E9CE\U0001E9CF\U0001E9D0\U0001E9D1\U0001E9D2\U0001E9D3\U0001E9D4\U0001E9D5\U0001E9D6\U0001E9D7\U0001E9D8\U0001E9D9\U0001E9DA\U0001E9DB\U0001E9DC\U0001E9DD\U0001E9DE\U0001E9DF\U0001E9E0\U0001E9E1\U0001E9E2\U0001E9E3\U0001E9E4\U0001E9E5\U0001E9E6\U0001E9E7\U0001E9E8\U0001E9E9\U0001E9EA\U0001E9EB\U0001E9EC\U0001E9ED\U0001E9EE\U0001E9EF\U0001E9F0\U0001E9F1\U0001E9F2\U0001E9F3\U0001E9F4\U0001E9F5\U0001E9F6\U0001E9F7\U0001E9F8\U0001E9F9\U0001E9FA\U0001E9FB\U0001E9FC\U0001E9FD\U0001E9FE\U0001E9FF"sv, + u8"\U0001E922\U0001E923\U0001E924\U0001E925\U0001E926\U0001E927\U0001E928\U0001E929\U0001E92A\U0001E92B\U0001E92C\U0001E92D\U0001E92E\U0001E92F\U0001E930\U0001E931\U0001E932\U0001E933\U0001E934\U0001E935\U0001E936\U0001E937\U0001E938\U0001E939\U0001E93A\U0001E93B\U0001E93C\U0001E93D\U0001E93E\U0001E93F\U0001E940\U0001E941\U0001E942\U0001E943\U0001E922\U0001E923\U0001E924\U0001E925\U0001E926\U0001E927\U0001E928\U0001E929\U0001E92A\U0001E92B\U0001E92C\U0001E92D\U0001E92E\U0001E92F\U0001E930\U0001E931\U0001E932\U0001E933\U0001E934\U0001E935\U0001E936\U0001E937\U0001E938\U0001E939\U0001E93A\U0001E93B\U0001E93C\U0001E93D\U0001E93E\U0001E93F\U0001E940\U0001E941\U0001E942\U0001E943\U0001E944\U0001E945\U0001E946\U0001E947\U0001E948\U0001E949\U0001E94A\U0001E94B\U0001E94C\U0001E94D\U0001E94E\U0001E94F\U0001E950\U0001E951\U0001E952\U0001E953\U0001E954\U0001E955\U0001E956\U0001E957\U0001E958\U0001E959\U0001E95A\U0001E95B\U0001E95C\U0001E95D\U0001E95E\U0001E95F\U0001E960\U0001E961\U0001E962\U0001E963\U0001E964\U0001E965\U0001E966\U0001E967\U0001E968\U0001E969\U0001E96A\U0001E96B\U0001E96C\U0001E96D\U0001E96E\U0001E96F\U0001E970\U0001E971\U0001E972\U0001E973\U0001E974\U0001E975\U0001E976\U0001E977\U0001E978\U0001E979\U0001E97A\U0001E97B\U0001E97C\U0001E97D\U0001E97E\U0001E97F\U0001E980\U0001E981\U0001E982\U0001E983\U0001E984\U0001E985\U0001E986\U0001E987\U0001E988\U0001E989\U0001E98A\U0001E98B\U0001E98C\U0001E98D\U0001E98E\U0001E98F\U0001E990\U0001E991\U0001E992\U0001E993\U0001E994\U0001E995\U0001E996\U0001E997\U0001E998\U0001E999\U0001E99A\U0001E99B\U0001E99C\U0001E99D\U0001E99E\U0001E99F\U0001E9A0\U0001E9A1\U0001E9A2\U0001E9A3\U0001E9A4\U0001E9A5\U0001E9A6\U0001E9A7\U0001E9A8\U0001E9A9\U0001E9AA\U0001E9AB\U0001E9AC\U0001E9AD\U0001E9AE\U0001E9AF\U0001E9B0\U0001E9B1\U0001E9B2\U0001E9B3\U0001E9B4\U0001E9B5\U0001E9B6\U0001E9B7\U0001E9B8\U0001E9B9\U0001E9BA\U0001E9BB\U0001E9BC\U0001E9BD\U0001E9BE\U0001E9BF\U0001E9C0\U0001E9C1\U0001E9C2\U0001E9C3\U0001E9C4\U0001E9C5\U0001E9C6\U0001E9C7\U0001E9C8\U0001E9C9\U0001E9CA\U0001E9CB\U0001E9CC\U0001E9CD\U0001E9CE\U0001E9CF\U0001E9D0\U0001E9D1\U0001E9D2\U0001E9D3\U0001E9D4\U0001E9D5\U0001E9D6\U0001E9D7\U0001E9D8\U0001E9D9\U0001E9DA\U0001E9DB\U0001E9DC\U0001E9DD\U0001E9DE\U0001E9DF\U0001E9E0\U0001E9E1\U0001E9E2\U0001E9E3\U0001E9E4\U0001E9E5\U0001E9E6\U0001E9E7\U0001E9E8\U0001E9E9\U0001E9EA\U0001E9EB\U0001E9EC\U0001E9ED\U0001E9EE\U0001E9EF\U0001E9F0\U0001E9F1\U0001E9F2\U0001E9F3\U0001E9F4\U0001E9F5\U0001E9F6\U0001E9F7\U0001E9F8\U0001E9F9\U0001E9FA\U0001E9FB\U0001E9FC\U0001E9FD\U0001E9FE\U0001E9FF"sv}, +}}; + +} // namespace + +TEST(unicode_test, case_folding) { + for (const auto& [orig, folded] : kCaseFoldData) { + std::string_view orig_sv(reinterpret_cast(orig.data()), + orig.size()); + std::string_view folded_sv(reinterpret_cast(folded.data()), + folded.size()); + EXPECT_TRUE(utf8::is_valid(orig_sv)); + EXPECT_TRUE(utf8::is_valid(folded_sv)); + EXPECT_NE(folded_sv, orig_sv); + auto folded_result = utf8_case_fold(orig_sv); + auto folded_unchecked_result = utf8_case_fold_unchecked(orig_sv); + EXPECT_EQ(folded_sv, folded_result); + EXPECT_EQ(folded_sv, folded_unchecked_result); + } +} diff --git a/tools/src/dwarfs_main.cpp b/tools/src/dwarfs_main.cpp index 219ba0f15..293edfebf 100644 --- a/tools/src/dwarfs_main.cpp +++ b/tools/src/dwarfs_main.cpp @@ -179,6 +179,7 @@ struct options { #endif int enable_nlink{0}; int readonly{0}; + int case_insensitive{0}; int cache_image{0}; int cache_files{0}; size_t cachesize{0}; @@ -258,6 +259,7 @@ constexpr struct ::fuse_opt dwarfs_opts[] = { DWARFS_OPT("seq_detector=%s", seq_detector_thresh_str, 0), DWARFS_OPT("enable_nlink", enable_nlink, 1), DWARFS_OPT("readonly", readonly, 1), + DWARFS_OPT("case_insensitive", case_insensitive, 1), DWARFS_OPT("cache_image", cache_image, 1), DWARFS_OPT("no_cache_image", cache_image, 0), DWARFS_OPT("cache_files", cache_files, 1), @@ -1224,6 +1226,7 @@ void usage(std::ostream& os, std::filesystem::path const& progname) { << " -o imagesize=NUM filesystem image size in bytes\n" << " -o enable_nlink show correct hardlink numbers\n" << " -o readonly show read-only file system\n" + << " -o case_insensitive perform case-insensitive lookups\n" << " -o (no_)cache_image (don't) keep image in kernel cache\n" << " -o (no_)cache_files (don't) keep files in kernel cache\n" << " -o debuglevel=NAME " << logger::all_level_names() << "\n" @@ -1464,6 +1467,7 @@ void load_filesystem(dwarfs_userdata& userdata) { fsopts.inode_reader.readahead = opts.readahead; fsopts.metadata.enable_nlink = bool(opts.enable_nlink); fsopts.metadata.readonly = bool(opts.readonly); + fsopts.metadata.case_insensitive_lookup = bool(opts.case_insensitive); fsopts.metadata.block_size = opts.blocksize; #ifndef _WIN32 fsopts.metadata.fs_uid = opts.fs_uid; diff --git a/vcpkg.json b/vcpkg.json index fbb2f7619..c01538877 100644 --- a/vcpkg.json +++ b/vcpkg.json @@ -11,6 +11,7 @@ "boost-multi-index", "boost-process", "boost-program-options", + "boost-sort", "boost-thread", "boost-uuid", "boost-variant",