[llvm-branch-commits] [libc] [libc][wctype] Add perfect hash map for conversion functions (PR #187670)

Muhammad Bassiouni via llvm-branch-commits llvm-branch-commits at lists.llvm.org
Fri Mar 20 03:29:42 PDT 2026


https://github.com/bassiounix updated https://github.com/llvm/llvm-project/pull/187670

>From 658bed566fa520ae7113603cf4a8832c92a73738 Mon Sep 17 00:00:00 2001
From: bassiounix <muhammad.m.bassiouni at gmail.com>
Date: Fri, 20 Mar 2026 12:01:03 +0200
Subject: [PATCH 1/4] [libc][wctype] Add perfect hash map for conversion
 functions

---
 libc/src/__support/CPP/CMakeLists.txt         |   8 +
 libc/src/__support/CPP/algorithm.h            |  20 +
 libc/src/__support/CPP/iterator.h             |  37 +-
 libc/src/__support/CPP/monostate.h            |  31 +
 libc/src/__support/wctype/CMakeLists.txt      |  36 +
 libc/src/__support/wctype/lower_to_upper.h    | 568 ++++++++++++
 libc/src/__support/wctype/lower_to_upper.inc  | 400 --------
 libc/src/__support/wctype/perfect_hash_map.h  | 876 ++++++++++++++++++
 libc/src/__support/wctype/upper_to_lower.h    | 553 +++++++++++
 libc/src/__support/wctype/upper_to_lower.inc  | 390 --------
 libc/test/src/__support/wctype/CMakeLists.txt |  14 +-
 .../wctype/wctype_perfect_hash_test.cpp       |  35 +
 .../wctype_utils/conversion/hex_writer.py     |  72 +-
 libc/utils/wctype_utils/gen.py                |  13 +-
 14 files changed, 2256 insertions(+), 797 deletions(-)
 create mode 100644 libc/src/__support/CPP/monostate.h
 create mode 100644 libc/src/__support/wctype/lower_to_upper.h
 delete mode 100644 libc/src/__support/wctype/lower_to_upper.inc
 create mode 100644 libc/src/__support/wctype/perfect_hash_map.h
 create mode 100644 libc/src/__support/wctype/upper_to_lower.h
 delete mode 100644 libc/src/__support/wctype/upper_to_lower.inc
 create mode 100644 libc/test/src/__support/wctype/wctype_perfect_hash_test.cpp

diff --git a/libc/src/__support/CPP/CMakeLists.txt b/libc/src/__support/CPP/CMakeLists.txt
index bdfbc6151c773..678fb7f50e9cf 100644
--- a/libc/src/__support/CPP/CMakeLists.txt
+++ b/libc/src/__support/CPP/CMakeLists.txt
@@ -56,6 +56,14 @@ add_header_library(
     libc.src.__support.macros.properties.types
 )
 
+add_header_library(
+  monostate
+  HDRS
+    monostate.h
+  DEPENDS
+    libc.src.__support.common
+)
+
 add_header_library(
   mutex
   HDRS
diff --git a/libc/src/__support/CPP/algorithm.h b/libc/src/__support/CPP/algorithm.h
index de0c47369d945..3e2ac8b7b95ce 100644
--- a/libc/src/__support/CPP/algorithm.h
+++ b/libc/src/__support/CPP/algorithm.h
@@ -49,6 +49,26 @@ LIBC_INLINE constexpr bool all_of(InputIt first, InputIt last, UnaryPred p) {
   return find_if_not(first, last, p) == last;
 }
 
+template <typename It, typename T, typename Comp>
+LIBC_INLINE constexpr It lower_bound(It first, It last, const T &value,
+                                     Comp comp) {
+  auto count = last - first;
+
+  while (count > 0) {
+    It it = first;
+    auto step = count / 2;
+    it += step;
+
+    if (comp(*it, value)) {
+      first = ++it;
+      count -= step + 1;
+    } else {
+      count = step;
+    }
+  }
+  return first;
+}
+
 } // namespace cpp
 } // namespace LIBC_NAMESPACE_DECL
 
diff --git a/libc/src/__support/CPP/iterator.h b/libc/src/__support/CPP/iterator.h
index 168a269731822..cfefbbd3b9101 100644
--- a/libc/src/__support/CPP/iterator.h
+++ b/libc/src/__support/CPP/iterator.h
@@ -9,6 +9,7 @@
 #ifndef LLVM_LIBC_SRC___SUPPORT_CPP_ITERATOR_H
 #define LLVM_LIBC_SRC___SUPPORT_CPP_ITERATOR_H
 
+#include "hdr/types/size_t.h"
 #include "src/__support/CPP/type_traits/enable_if.h"
 #include "src/__support/CPP/type_traits/is_convertible.h"
 #include "src/__support/CPP/type_traits/is_same.h"
@@ -18,12 +19,22 @@
 namespace LIBC_NAMESPACE_DECL {
 namespace cpp {
 
-template <typename T> struct iterator_traits;
+struct input_iterator_tag {};
+struct random_access_iterator_tag : input_iterator_tag {};
+
+template <typename It> struct iterator_traits {
+  using iterator_category = typename It::iterator_category;
+};
 template <typename T> struct iterator_traits<T *> {
   using reference = T &;
+  using iterator_category = random_access_iterator_tag;
   using value_type = T;
 };
 
+template <typename T> struct iterator_traits<const T *> {
+  using iterator_category = random_access_iterator_tag;
+};
+
 template <typename Iter> class reverse_iterator {
   Iter current;
 
@@ -93,6 +104,30 @@ template <typename Iter> class reverse_iterator {
   }
 };
 
+namespace cpp_internal {
+
+template <typename It>
+LIBC_INLINE constexpr size_t distance(It first, It last,
+                                      random_access_iterator_tag) {
+  return last - first;
+}
+
+template <typename It>
+LIBC_INLINE constexpr auto distance(It first, It last, input_iterator_tag) {
+  size_t n = 0;
+  for (; first != last; ++first) {
+    ++n;
+  }
+  return n;
+}
+
+} // namespace cpp_internal
+
+template <typename It> auto distance(It first, It last) {
+  return cpp_internal::distance(
+      first, last, typename iterator_traits<It>::iterator_category{});
+}
+
 } // namespace cpp
 } // namespace LIBC_NAMESPACE_DECL
 
diff --git a/libc/src/__support/CPP/monostate.h b/libc/src/__support/CPP/monostate.h
new file mode 100644
index 0000000000000..231550cd4cc69
--- /dev/null
+++ b/libc/src/__support/CPP/monostate.h
@@ -0,0 +1,31 @@
+//===-- Definition of cpp::monostate ----------------------------*- C++ -*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_LIBC_SRC___SUPPORT_CPP_MONOSTATE_H
+#define LLVM_LIBC_SRC___SUPPORT_CPP_MONOSTATE_H
+
+#include "src/__support/common.h"
+
+namespace LIBC_NAMESPACE_DECL {
+
+namespace cpp {
+
+struct monostate {};
+
+LIBC_INLINE constexpr bool operator==(monostate, monostate) { return true; }
+LIBC_INLINE constexpr bool operator!=(monostate, monostate) { return false; }
+LIBC_INLINE constexpr bool operator<(monostate, monostate) { return false; }
+LIBC_INLINE constexpr bool operator>(monostate, monostate) { return false; }
+LIBC_INLINE constexpr bool operator<=(monostate, monostate) { return true; }
+LIBC_INLINE constexpr bool operator>=(monostate, monostate) { return true; }
+
+} // namespace cpp
+
+} // namespace LIBC_NAMESPACE_DECL
+
+#endif // LIBC_SRC___SUPPORT_CPP_MONOSTATE_H
diff --git a/libc/src/__support/wctype/CMakeLists.txt b/libc/src/__support/wctype/CMakeLists.txt
index fcd4b777b2203..43c45d04ec2b7 100644
--- a/libc/src/__support/wctype/CMakeLists.txt
+++ b/libc/src/__support/wctype/CMakeLists.txt
@@ -1,3 +1,39 @@
+add_header_library(
+  perfect_hash_map
+  HDRS
+    perfect_hash_map.h
+  DEPENDS
+    libc.hdr.types.size_t
+    libc.hdr.types.wint_t
+    libc.src.__support.CPP.array
+    libc.src.__support.CPP.expected
+    libc.src.__support.CPP.monostate
+    libc.src.__support.CPP.optional
+    libc.src.__support.CPP.span
+    libc.src.__support.CPP.string
+    libc.src.__support.CPP.tuple
+    libc.src.__support.CPP.type_traits
+    libc.src.__support.OSUtil.osutil
+    libc.src.__support.math.ceil
+    libc.src.__support.math.log
+)
+
+add_header_library(
+  lower_to_upper
+  HDRS
+    lower_to_upper.h
+  DEPENDS
+    .perfect_hash_map
+)
+
+add_header_library(
+  upper_to_lower
+  HDRS
+    upper_to_lower.h
+  DEPENDS
+    .perfect_hash_map
+)
+
 add_object_library(
   wctype_classification_utils
   HDRS
diff --git a/libc/src/__support/wctype/lower_to_upper.h b/libc/src/__support/wctype/lower_to_upper.h
new file mode 100644
index 0000000000000..489089c6ea628
--- /dev/null
+++ b/libc/src/__support/wctype/lower_to_upper.h
@@ -0,0 +1,568 @@
+//===-- Auto-generated lower to upper case mappings table -------*- C++ -*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+// DO NOT EDIT MANUALLY.
+// This file is generated by libc/utils/wctype_utils scripts.
+// This file is meant to be included directly into LLVM libc code
+// Format: {from_codepoint, to_codepoint}
+// Info: 1458 entries
+
+#ifndef LLVM_LIBC_SRC___SUPPORT_WCTYPE_LOWER_TO_UPPER_H
+#define LLVM_LIBC_SRC___SUPPORT_WCTYPE_LOWER_TO_UPPER_H
+
+#include "perfect_hash_map.h"
+
+namespace LIBC_NAMESPACE_DECL {
+
+LIBC_INLINE_VAR constexpr cpp::array<cpp::array<wint_t, 2>, 1458>
+    LOWER_TO_UPPER_DATA = {
+        {{0x61, 0x41},       {0x62, 0x42},       {0x63, 0x43},
+         {0x64, 0x44},       {0x65, 0x45},       {0x66, 0x46},
+         {0x67, 0x47},       {0x68, 0x48},       {0x69, 0x49},
+         {0x6A, 0x4A},       {0x6B, 0x4B},       {0x6C, 0x4C},
+         {0x6D, 0x4D},       {0x6E, 0x4E},       {0x6F, 0x4F},
+         {0x70, 0x50},       {0x71, 0x51},       {0x72, 0x52},
+         {0x73, 0x53},       {0x74, 0x54},       {0x75, 0x55},
+         {0x76, 0x56},       {0x77, 0x57},       {0x78, 0x58},
+         {0x79, 0x59},       {0x7A, 0x5A},       {0xB5, 0x39C},
+         {0xE0, 0xC0},       {0xE1, 0xC1},       {0xE2, 0xC2},
+         {0xE3, 0xC3},       {0xE4, 0xC4},       {0xE5, 0xC5},
+         {0xE6, 0xC6},       {0xE7, 0xC7},       {0xE8, 0xC8},
+         {0xE9, 0xC9},       {0xEA, 0xCA},       {0xEB, 0xCB},
+         {0xEC, 0xCC},       {0xED, 0xCD},       {0xEE, 0xCE},
+         {0xEF, 0xCF},       {0xF0, 0xD0},       {0xF1, 0xD1},
+         {0xF2, 0xD2},       {0xF3, 0xD3},       {0xF4, 0xD4},
+         {0xF5, 0xD5},       {0xF6, 0xD6},       {0xF8, 0xD8},
+         {0xF9, 0xD9},       {0xFA, 0xDA},       {0xFB, 0xDB},
+         {0xFC, 0xDC},       {0xFD, 0xDD},       {0xFE, 0xDE},
+         {0xFF, 0x178},      {0x101, 0x100},     {0x103, 0x102},
+         {0x105, 0x104},     {0x107, 0x106},     {0x109, 0x108},
+         {0x10B, 0x10A},     {0x10D, 0x10C},     {0x10F, 0x10E},
+         {0x111, 0x110},     {0x113, 0x112},     {0x115, 0x114},
+         {0x117, 0x116},     {0x119, 0x118},     {0x11B, 0x11A},
+         {0x11D, 0x11C},     {0x11F, 0x11E},     {0x121, 0x120},
+         {0x123, 0x122},     {0x125, 0x124},     {0x127, 0x126},
+         {0x129, 0x128},     {0x12B, 0x12A},     {0x12D, 0x12C},
+         {0x12F, 0x12E},     {0x131, 0x49},      {0x133, 0x132},
+         {0x135, 0x134},     {0x137, 0x136},     {0x13A, 0x139},
+         {0x13C, 0x13B},     {0x13E, 0x13D},     {0x140, 0x13F},
+         {0x142, 0x141},     {0x144, 0x143},     {0x146, 0x145},
+         {0x148, 0x147},     {0x14B, 0x14A},     {0x14D, 0x14C},
+         {0x14F, 0x14E},     {0x151, 0x150},     {0x153, 0x152},
+         {0x155, 0x154},     {0x157, 0x156},     {0x159, 0x158},
+         {0x15B, 0x15A},     {0x15D, 0x15C},     {0x15F, 0x15E},
+         {0x161, 0x160},     {0x163, 0x162},     {0x165, 0x164},
+         {0x167, 0x166},     {0x169, 0x168},     {0x16B, 0x16A},
+         {0x16D, 0x16C},     {0x16F, 0x16E},     {0x171, 0x170},
+         {0x173, 0x172},     {0x175, 0x174},     {0x177, 0x176},
+         {0x17A, 0x179},     {0x17C, 0x17B},     {0x17E, 0x17D},
+         {0x17F, 0x53},      {0x180, 0x243},     {0x183, 0x182},
+         {0x185, 0x184},     {0x188, 0x187},     {0x18C, 0x18B},
+         {0x192, 0x191},     {0x195, 0x1F6},     {0x199, 0x198},
+         {0x19A, 0x23D},     {0x19B, 0xA7DC},    {0x19E, 0x220},
+         {0x1A1, 0x1A0},     {0x1A3, 0x1A2},     {0x1A5, 0x1A4},
+         {0x1A8, 0x1A7},     {0x1AD, 0x1AC},     {0x1B0, 0x1AF},
+         {0x1B4, 0x1B3},     {0x1B6, 0x1B5},     {0x1B9, 0x1B8},
+         {0x1BD, 0x1BC},     {0x1BF, 0x1F7},     {0x1C6, 0x1C4},
+         {0x1C9, 0x1C7},     {0x1CC, 0x1CA},     {0x1CE, 0x1CD},
+         {0x1D0, 0x1CF},     {0x1D2, 0x1D1},     {0x1D4, 0x1D3},
+         {0x1D6, 0x1D5},     {0x1D8, 0x1D7},     {0x1DA, 0x1D9},
+         {0x1DC, 0x1DB},     {0x1DD, 0x18E},     {0x1DF, 0x1DE},
+         {0x1E1, 0x1E0},     {0x1E3, 0x1E2},     {0x1E5, 0x1E4},
+         {0x1E7, 0x1E6},     {0x1E9, 0x1E8},     {0x1EB, 0x1EA},
+         {0x1ED, 0x1EC},     {0x1EF, 0x1EE},     {0x1F3, 0x1F1},
+         {0x1F5, 0x1F4},     {0x1F9, 0x1F8},     {0x1FB, 0x1FA},
+         {0x1FD, 0x1FC},     {0x1FF, 0x1FE},     {0x201, 0x200},
+         {0x203, 0x202},     {0x205, 0x204},     {0x207, 0x206},
+         {0x209, 0x208},     {0x20B, 0x20A},     {0x20D, 0x20C},
+         {0x20F, 0x20E},     {0x211, 0x210},     {0x213, 0x212},
+         {0x215, 0x214},     {0x217, 0x216},     {0x219, 0x218},
+         {0x21B, 0x21A},     {0x21D, 0x21C},     {0x21F, 0x21E},
+         {0x223, 0x222},     {0x225, 0x224},     {0x227, 0x226},
+         {0x229, 0x228},     {0x22B, 0x22A},     {0x22D, 0x22C},
+         {0x22F, 0x22E},     {0x231, 0x230},     {0x233, 0x232},
+         {0x23C, 0x23B},     {0x23F, 0x2C7E},    {0x240, 0x2C7F},
+         {0x242, 0x241},     {0x247, 0x246},     {0x249, 0x248},
+         {0x24B, 0x24A},     {0x24D, 0x24C},     {0x24F, 0x24E},
+         {0x250, 0x2C6F},    {0x251, 0x2C6D},    {0x252, 0x2C70},
+         {0x253, 0x181},     {0x254, 0x186},     {0x256, 0x189},
+         {0x257, 0x18A},     {0x259, 0x18F},     {0x25B, 0x190},
+         {0x25C, 0xA7AB},    {0x260, 0x193},     {0x261, 0xA7AC},
+         {0x263, 0x194},     {0x264, 0xA7CB},    {0x265, 0xA78D},
+         {0x266, 0xA7AA},    {0x268, 0x197},     {0x269, 0x196},
+         {0x26A, 0xA7AE},    {0x26B, 0x2C62},    {0x26C, 0xA7AD},
+         {0x26F, 0x19C},     {0x271, 0x2C6E},    {0x272, 0x19D},
+         {0x275, 0x19F},     {0x27D, 0x2C64},    {0x280, 0x1A6},
+         {0x282, 0xA7C5},    {0x283, 0x1A9},     {0x287, 0xA7B1},
+         {0x288, 0x1AE},     {0x289, 0x244},     {0x28A, 0x1B1},
+         {0x28B, 0x1B2},     {0x28C, 0x245},     {0x292, 0x1B7},
+         {0x29D, 0xA7B2},    {0x29E, 0xA7B0},    {0x371, 0x370},
+         {0x373, 0x372},     {0x377, 0x376},     {0x37B, 0x3FD},
+         {0x37C, 0x3FE},     {0x37D, 0x3FF},     {0x3AC, 0x386},
+         {0x3AD, 0x388},     {0x3AE, 0x389},     {0x3AF, 0x38A},
+         {0x3B1, 0x391},     {0x3B2, 0x392},     {0x3B3, 0x393},
+         {0x3B4, 0x394},     {0x3B5, 0x395},     {0x3B6, 0x396},
+         {0x3B7, 0x397},     {0x3B8, 0x398},     {0x3B9, 0x399},
+         {0x3BA, 0x39A},     {0x3BB, 0x39B},     {0x3BC, 0x39C},
+         {0x3BD, 0x39D},     {0x3BE, 0x39E},     {0x3BF, 0x39F},
+         {0x3C0, 0x3A0},     {0x3C1, 0x3A1},     {0x3C2, 0x3A3},
+         {0x3C3, 0x3A3},     {0x3C4, 0x3A4},     {0x3C5, 0x3A5},
+         {0x3C6, 0x3A6},     {0x3C7, 0x3A7},     {0x3C8, 0x3A8},
+         {0x3C9, 0x3A9},     {0x3CA, 0x3AA},     {0x3CB, 0x3AB},
+         {0x3CC, 0x38C},     {0x3CD, 0x38E},     {0x3CE, 0x38F},
+         {0x3D0, 0x392},     {0x3D1, 0x398},     {0x3D5, 0x3A6},
+         {0x3D6, 0x3A0},     {0x3D7, 0x3CF},     {0x3D9, 0x3D8},
+         {0x3DB, 0x3DA},     {0x3DD, 0x3DC},     {0x3DF, 0x3DE},
+         {0x3E1, 0x3E0},     {0x3E3, 0x3E2},     {0x3E5, 0x3E4},
+         {0x3E7, 0x3E6},     {0x3E9, 0x3E8},     {0x3EB, 0x3EA},
+         {0x3ED, 0x3EC},     {0x3EF, 0x3EE},     {0x3F0, 0x39A},
+         {0x3F1, 0x3A1},     {0x3F2, 0x3F9},     {0x3F3, 0x37F},
+         {0x3F5, 0x395},     {0x3F8, 0x3F7},     {0x3FB, 0x3FA},
+         {0x430, 0x410},     {0x431, 0x411},     {0x432, 0x412},
+         {0x433, 0x413},     {0x434, 0x414},     {0x435, 0x415},
+         {0x436, 0x416},     {0x437, 0x417},     {0x438, 0x418},
+         {0x439, 0x419},     {0x43A, 0x41A},     {0x43B, 0x41B},
+         {0x43C, 0x41C},     {0x43D, 0x41D},     {0x43E, 0x41E},
+         {0x43F, 0x41F},     {0x440, 0x420},     {0x441, 0x421},
+         {0x442, 0x422},     {0x443, 0x423},     {0x444, 0x424},
+         {0x445, 0x425},     {0x446, 0x426},     {0x447, 0x427},
+         {0x448, 0x428},     {0x449, 0x429},     {0x44A, 0x42A},
+         {0x44B, 0x42B},     {0x44C, 0x42C},     {0x44D, 0x42D},
+         {0x44E, 0x42E},     {0x44F, 0x42F},     {0x450, 0x400},
+         {0x451, 0x401},     {0x452, 0x402},     {0x453, 0x403},
+         {0x454, 0x404},     {0x455, 0x405},     {0x456, 0x406},
+         {0x457, 0x407},     {0x458, 0x408},     {0x459, 0x409},
+         {0x45A, 0x40A},     {0x45B, 0x40B},     {0x45C, 0x40C},
+         {0x45D, 0x40D},     {0x45E, 0x40E},     {0x45F, 0x40F},
+         {0x461, 0x460},     {0x463, 0x462},     {0x465, 0x464},
+         {0x467, 0x466},     {0x469, 0x468},     {0x46B, 0x46A},
+         {0x46D, 0x46C},     {0x46F, 0x46E},     {0x471, 0x470},
+         {0x473, 0x472},     {0x475, 0x474},     {0x477, 0x476},
+         {0x479, 0x478},     {0x47B, 0x47A},     {0x47D, 0x47C},
+         {0x47F, 0x47E},     {0x481, 0x480},     {0x48B, 0x48A},
+         {0x48D, 0x48C},     {0x48F, 0x48E},     {0x491, 0x490},
+         {0x493, 0x492},     {0x495, 0x494},     {0x497, 0x496},
+         {0x499, 0x498},     {0x49B, 0x49A},     {0x49D, 0x49C},
+         {0x49F, 0x49E},     {0x4A1, 0x4A0},     {0x4A3, 0x4A2},
+         {0x4A5, 0x4A4},     {0x4A7, 0x4A6},     {0x4A9, 0x4A8},
+         {0x4AB, 0x4AA},     {0x4AD, 0x4AC},     {0x4AF, 0x4AE},
+         {0x4B1, 0x4B0},     {0x4B3, 0x4B2},     {0x4B5, 0x4B4},
+         {0x4B7, 0x4B6},     {0x4B9, 0x4B8},     {0x4BB, 0x4BA},
+         {0x4BD, 0x4BC},     {0x4BF, 0x4BE},     {0x4C2, 0x4C1},
+         {0x4C4, 0x4C3},     {0x4C6, 0x4C5},     {0x4C8, 0x4C7},
+         {0x4CA, 0x4C9},     {0x4CC, 0x4CB},     {0x4CE, 0x4CD},
+         {0x4CF, 0x4C0},     {0x4D1, 0x4D0},     {0x4D3, 0x4D2},
+         {0x4D5, 0x4D4},     {0x4D7, 0x4D6},     {0x4D9, 0x4D8},
+         {0x4DB, 0x4DA},     {0x4DD, 0x4DC},     {0x4DF, 0x4DE},
+         {0x4E1, 0x4E0},     {0x4E3, 0x4E2},     {0x4E5, 0x4E4},
+         {0x4E7, 0x4E6},     {0x4E9, 0x4E8},     {0x4EB, 0x4EA},
+         {0x4ED, 0x4EC},     {0x4EF, 0x4EE},     {0x4F1, 0x4F0},
+         {0x4F3, 0x4F2},     {0x4F5, 0x4F4},     {0x4F7, 0x4F6},
+         {0x4F9, 0x4F8},     {0x4FB, 0x4FA},     {0x4FD, 0x4FC},
+         {0x4FF, 0x4FE},     {0x501, 0x500},     {0x503, 0x502},
+         {0x505, 0x504},     {0x507, 0x506},     {0x509, 0x508},
+         {0x50B, 0x50A},     {0x50D, 0x50C},     {0x50F, 0x50E},
+         {0x511, 0x510},     {0x513, 0x512},     {0x515, 0x514},
+         {0x517, 0x516},     {0x519, 0x518},     {0x51B, 0x51A},
+         {0x51D, 0x51C},     {0x51F, 0x51E},     {0x521, 0x520},
+         {0x523, 0x522},     {0x525, 0x524},     {0x527, 0x526},
+         {0x529, 0x528},     {0x52B, 0x52A},     {0x52D, 0x52C},
+         {0x52F, 0x52E},     {0x561, 0x531},     {0x562, 0x532},
+         {0x563, 0x533},     {0x564, 0x534},     {0x565, 0x535},
+         {0x566, 0x536},     {0x567, 0x537},     {0x568, 0x538},
+         {0x569, 0x539},     {0x56A, 0x53A},     {0x56B, 0x53B},
+         {0x56C, 0x53C},     {0x56D, 0x53D},     {0x56E, 0x53E},
+         {0x56F, 0x53F},     {0x570, 0x540},     {0x571, 0x541},
+         {0x572, 0x542},     {0x573, 0x543},     {0x574, 0x544},
+         {0x575, 0x545},     {0x576, 0x546},     {0x577, 0x547},
+         {0x578, 0x548},     {0x579, 0x549},     {0x57A, 0x54A},
+         {0x57B, 0x54B},     {0x57C, 0x54C},     {0x57D, 0x54D},
+         {0x57E, 0x54E},     {0x57F, 0x54F},     {0x580, 0x550},
+         {0x581, 0x551},     {0x582, 0x552},     {0x583, 0x553},
+         {0x584, 0x554},     {0x585, 0x555},     {0x586, 0x556},
+         {0x10D0, 0x1C90},   {0x10D1, 0x1C91},   {0x10D2, 0x1C92},
+         {0x10D3, 0x1C93},   {0x10D4, 0x1C94},   {0x10D5, 0x1C95},
+         {0x10D6, 0x1C96},   {0x10D7, 0x1C97},   {0x10D8, 0x1C98},
+         {0x10D9, 0x1C99},   {0x10DA, 0x1C9A},   {0x10DB, 0x1C9B},
+         {0x10DC, 0x1C9C},   {0x10DD, 0x1C9D},   {0x10DE, 0x1C9E},
+         {0x10DF, 0x1C9F},   {0x10E0, 0x1CA0},   {0x10E1, 0x1CA1},
+         {0x10E2, 0x1CA2},   {0x10E3, 0x1CA3},   {0x10E4, 0x1CA4},
+         {0x10E5, 0x1CA5},   {0x10E6, 0x1CA6},   {0x10E7, 0x1CA7},
+         {0x10E8, 0x1CA8},   {0x10E9, 0x1CA9},   {0x10EA, 0x1CAA},
+         {0x10EB, 0x1CAB},   {0x10EC, 0x1CAC},   {0x10ED, 0x1CAD},
+         {0x10EE, 0x1CAE},   {0x10EF, 0x1CAF},   {0x10F0, 0x1CB0},
+         {0x10F1, 0x1CB1},   {0x10F2, 0x1CB2},   {0x10F3, 0x1CB3},
+         {0x10F4, 0x1CB4},   {0x10F5, 0x1CB5},   {0x10F6, 0x1CB6},
+         {0x10F7, 0x1CB7},   {0x10F8, 0x1CB8},   {0x10F9, 0x1CB9},
+         {0x10FA, 0x1CBA},   {0x10FD, 0x1CBD},   {0x10FE, 0x1CBE},
+         {0x10FF, 0x1CBF},   {0x13F8, 0x13F0},   {0x13F9, 0x13F1},
+         {0x13FA, 0x13F2},   {0x13FB, 0x13F3},   {0x13FC, 0x13F4},
+         {0x13FD, 0x13F5},   {0x1C80, 0x412},    {0x1C81, 0x414},
+         {0x1C82, 0x41E},    {0x1C83, 0x421},    {0x1C84, 0x422},
+         {0x1C85, 0x422},    {0x1C86, 0x42A},    {0x1C87, 0x462},
+         {0x1C88, 0xA64A},   {0x1C8A, 0x1C89},   {0x1D79, 0xA77D},
+         {0x1D7D, 0x2C63},   {0x1D8E, 0xA7C6},   {0x1E01, 0x1E00},
+         {0x1E03, 0x1E02},   {0x1E05, 0x1E04},   {0x1E07, 0x1E06},
+         {0x1E09, 0x1E08},   {0x1E0B, 0x1E0A},   {0x1E0D, 0x1E0C},
+         {0x1E0F, 0x1E0E},   {0x1E11, 0x1E10},   {0x1E13, 0x1E12},
+         {0x1E15, 0x1E14},   {0x1E17, 0x1E16},   {0x1E19, 0x1E18},
+         {0x1E1B, 0x1E1A},   {0x1E1D, 0x1E1C},   {0x1E1F, 0x1E1E},
+         {0x1E21, 0x1E20},   {0x1E23, 0x1E22},   {0x1E25, 0x1E24},
+         {0x1E27, 0x1E26},   {0x1E29, 0x1E28},   {0x1E2B, 0x1E2A},
+         {0x1E2D, 0x1E2C},   {0x1E2F, 0x1E2E},   {0x1E31, 0x1E30},
+         {0x1E33, 0x1E32},   {0x1E35, 0x1E34},   {0x1E37, 0x1E36},
+         {0x1E39, 0x1E38},   {0x1E3B, 0x1E3A},   {0x1E3D, 0x1E3C},
+         {0x1E3F, 0x1E3E},   {0x1E41, 0x1E40},   {0x1E43, 0x1E42},
+         {0x1E45, 0x1E44},   {0x1E47, 0x1E46},   {0x1E49, 0x1E48},
+         {0x1E4B, 0x1E4A},   {0x1E4D, 0x1E4C},   {0x1E4F, 0x1E4E},
+         {0x1E51, 0x1E50},   {0x1E53, 0x1E52},   {0x1E55, 0x1E54},
+         {0x1E57, 0x1E56},   {0x1E59, 0x1E58},   {0x1E5B, 0x1E5A},
+         {0x1E5D, 0x1E5C},   {0x1E5F, 0x1E5E},   {0x1E61, 0x1E60},
+         {0x1E63, 0x1E62},   {0x1E65, 0x1E64},   {0x1E67, 0x1E66},
+         {0x1E69, 0x1E68},   {0x1E6B, 0x1E6A},   {0x1E6D, 0x1E6C},
+         {0x1E6F, 0x1E6E},   {0x1E71, 0x1E70},   {0x1E73, 0x1E72},
+         {0x1E75, 0x1E74},   {0x1E77, 0x1E76},   {0x1E79, 0x1E78},
+         {0x1E7B, 0x1E7A},   {0x1E7D, 0x1E7C},   {0x1E7F, 0x1E7E},
+         {0x1E81, 0x1E80},   {0x1E83, 0x1E82},   {0x1E85, 0x1E84},
+         {0x1E87, 0x1E86},   {0x1E89, 0x1E88},   {0x1E8B, 0x1E8A},
+         {0x1E8D, 0x1E8C},   {0x1E8F, 0x1E8E},   {0x1E91, 0x1E90},
+         {0x1E93, 0x1E92},   {0x1E95, 0x1E94},   {0x1E9B, 0x1E60},
+         {0x1EA1, 0x1EA0},   {0x1EA3, 0x1EA2},   {0x1EA5, 0x1EA4},
+         {0x1EA7, 0x1EA6},   {0x1EA9, 0x1EA8},   {0x1EAB, 0x1EAA},
+         {0x1EAD, 0x1EAC},   {0x1EAF, 0x1EAE},   {0x1EB1, 0x1EB0},
+         {0x1EB3, 0x1EB2},   {0x1EB5, 0x1EB4},   {0x1EB7, 0x1EB6},
+         {0x1EB9, 0x1EB8},   {0x1EBB, 0x1EBA},   {0x1EBD, 0x1EBC},
+         {0x1EBF, 0x1EBE},   {0x1EC1, 0x1EC0},   {0x1EC3, 0x1EC2},
+         {0x1EC5, 0x1EC4},   {0x1EC7, 0x1EC6},   {0x1EC9, 0x1EC8},
+         {0x1ECB, 0x1ECA},   {0x1ECD, 0x1ECC},   {0x1ECF, 0x1ECE},
+         {0x1ED1, 0x1ED0},   {0x1ED3, 0x1ED2},   {0x1ED5, 0x1ED4},
+         {0x1ED7, 0x1ED6},   {0x1ED9, 0x1ED8},   {0x1EDB, 0x1EDA},
+         {0x1EDD, 0x1EDC},   {0x1EDF, 0x1EDE},   {0x1EE1, 0x1EE0},
+         {0x1EE3, 0x1EE2},   {0x1EE5, 0x1EE4},   {0x1EE7, 0x1EE6},
+         {0x1EE9, 0x1EE8},   {0x1EEB, 0x1EEA},   {0x1EED, 0x1EEC},
+         {0x1EEF, 0x1EEE},   {0x1EF1, 0x1EF0},   {0x1EF3, 0x1EF2},
+         {0x1EF5, 0x1EF4},   {0x1EF7, 0x1EF6},   {0x1EF9, 0x1EF8},
+         {0x1EFB, 0x1EFA},   {0x1EFD, 0x1EFC},   {0x1EFF, 0x1EFE},
+         {0x1F00, 0x1F08},   {0x1F01, 0x1F09},   {0x1F02, 0x1F0A},
+         {0x1F03, 0x1F0B},   {0x1F04, 0x1F0C},   {0x1F05, 0x1F0D},
+         {0x1F06, 0x1F0E},   {0x1F07, 0x1F0F},   {0x1F10, 0x1F18},
+         {0x1F11, 0x1F19},   {0x1F12, 0x1F1A},   {0x1F13, 0x1F1B},
+         {0x1F14, 0x1F1C},   {0x1F15, 0x1F1D},   {0x1F20, 0x1F28},
+         {0x1F21, 0x1F29},   {0x1F22, 0x1F2A},   {0x1F23, 0x1F2B},
+         {0x1F24, 0x1F2C},   {0x1F25, 0x1F2D},   {0x1F26, 0x1F2E},
+         {0x1F27, 0x1F2F},   {0x1F30, 0x1F38},   {0x1F31, 0x1F39},
+         {0x1F32, 0x1F3A},   {0x1F33, 0x1F3B},   {0x1F34, 0x1F3C},
+         {0x1F35, 0x1F3D},   {0x1F36, 0x1F3E},   {0x1F37, 0x1F3F},
+         {0x1F40, 0x1F48},   {0x1F41, 0x1F49},   {0x1F42, 0x1F4A},
+         {0x1F43, 0x1F4B},   {0x1F44, 0x1F4C},   {0x1F45, 0x1F4D},
+         {0x1F51, 0x1F59},   {0x1F53, 0x1F5B},   {0x1F55, 0x1F5D},
+         {0x1F57, 0x1F5F},   {0x1F60, 0x1F68},   {0x1F61, 0x1F69},
+         {0x1F62, 0x1F6A},   {0x1F63, 0x1F6B},   {0x1F64, 0x1F6C},
+         {0x1F65, 0x1F6D},   {0x1F66, 0x1F6E},   {0x1F67, 0x1F6F},
+         {0x1F70, 0x1FBA},   {0x1F71, 0x1FBB},   {0x1F72, 0x1FC8},
+         {0x1F73, 0x1FC9},   {0x1F74, 0x1FCA},   {0x1F75, 0x1FCB},
+         {0x1F76, 0x1FDA},   {0x1F77, 0x1FDB},   {0x1F78, 0x1FF8},
+         {0x1F79, 0x1FF9},   {0x1F7A, 0x1FEA},   {0x1F7B, 0x1FEB},
+         {0x1F7C, 0x1FFA},   {0x1F7D, 0x1FFB},   {0x1F80, 0x1F88},
+         {0x1F81, 0x1F89},   {0x1F82, 0x1F8A},   {0x1F83, 0x1F8B},
+         {0x1F84, 0x1F8C},   {0x1F85, 0x1F8D},   {0x1F86, 0x1F8E},
+         {0x1F87, 0x1F8F},   {0x1F90, 0x1F98},   {0x1F91, 0x1F99},
+         {0x1F92, 0x1F9A},   {0x1F93, 0x1F9B},   {0x1F94, 0x1F9C},
+         {0x1F95, 0x1F9D},   {0x1F96, 0x1F9E},   {0x1F97, 0x1F9F},
+         {0x1FA0, 0x1FA8},   {0x1FA1, 0x1FA9},   {0x1FA2, 0x1FAA},
+         {0x1FA3, 0x1FAB},   {0x1FA4, 0x1FAC},   {0x1FA5, 0x1FAD},
+         {0x1FA6, 0x1FAE},   {0x1FA7, 0x1FAF},   {0x1FB0, 0x1FB8},
+         {0x1FB1, 0x1FB9},   {0x1FB3, 0x1FBC},   {0x1FBE, 0x399},
+         {0x1FC3, 0x1FCC},   {0x1FD0, 0x1FD8},   {0x1FD1, 0x1FD9},
+         {0x1FE0, 0x1FE8},   {0x1FE1, 0x1FE9},   {0x1FE5, 0x1FEC},
+         {0x1FF3, 0x1FFC},   {0x214E, 0x2132},   {0x2184, 0x2183},
+         {0x2C30, 0x2C00},   {0x2C31, 0x2C01},   {0x2C32, 0x2C02},
+         {0x2C33, 0x2C03},   {0x2C34, 0x2C04},   {0x2C35, 0x2C05},
+         {0x2C36, 0x2C06},   {0x2C37, 0x2C07},   {0x2C38, 0x2C08},
+         {0x2C39, 0x2C09},   {0x2C3A, 0x2C0A},   {0x2C3B, 0x2C0B},
+         {0x2C3C, 0x2C0C},   {0x2C3D, 0x2C0D},   {0x2C3E, 0x2C0E},
+         {0x2C3F, 0x2C0F},   {0x2C40, 0x2C10},   {0x2C41, 0x2C11},
+         {0x2C42, 0x2C12},   {0x2C43, 0x2C13},   {0x2C44, 0x2C14},
+         {0x2C45, 0x2C15},   {0x2C46, 0x2C16},   {0x2C47, 0x2C17},
+         {0x2C48, 0x2C18},   {0x2C49, 0x2C19},   {0x2C4A, 0x2C1A},
+         {0x2C4B, 0x2C1B},   {0x2C4C, 0x2C1C},   {0x2C4D, 0x2C1D},
+         {0x2C4E, 0x2C1E},   {0x2C4F, 0x2C1F},   {0x2C50, 0x2C20},
+         {0x2C51, 0x2C21},   {0x2C52, 0x2C22},   {0x2C53, 0x2C23},
+         {0x2C54, 0x2C24},   {0x2C55, 0x2C25},   {0x2C56, 0x2C26},
+         {0x2C57, 0x2C27},   {0x2C58, 0x2C28},   {0x2C59, 0x2C29},
+         {0x2C5A, 0x2C2A},   {0x2C5B, 0x2C2B},   {0x2C5C, 0x2C2C},
+         {0x2C5D, 0x2C2D},   {0x2C5E, 0x2C2E},   {0x2C5F, 0x2C2F},
+         {0x2C61, 0x2C60},   {0x2C65, 0x23A},    {0x2C66, 0x23E},
+         {0x2C68, 0x2C67},   {0x2C6A, 0x2C69},   {0x2C6C, 0x2C6B},
+         {0x2C73, 0x2C72},   {0x2C76, 0x2C75},   {0x2C81, 0x2C80},
+         {0x2C83, 0x2C82},   {0x2C85, 0x2C84},   {0x2C87, 0x2C86},
+         {0x2C89, 0x2C88},   {0x2C8B, 0x2C8A},   {0x2C8D, 0x2C8C},
+         {0x2C8F, 0x2C8E},   {0x2C91, 0x2C90},   {0x2C93, 0x2C92},
+         {0x2C95, 0x2C94},   {0x2C97, 0x2C96},   {0x2C99, 0x2C98},
+         {0x2C9B, 0x2C9A},   {0x2C9D, 0x2C9C},   {0x2C9F, 0x2C9E},
+         {0x2CA1, 0x2CA0},   {0x2CA3, 0x2CA2},   {0x2CA5, 0x2CA4},
+         {0x2CA7, 0x2CA6},   {0x2CA9, 0x2CA8},   {0x2CAB, 0x2CAA},
+         {0x2CAD, 0x2CAC},   {0x2CAF, 0x2CAE},   {0x2CB1, 0x2CB0},
+         {0x2CB3, 0x2CB2},   {0x2CB5, 0x2CB4},   {0x2CB7, 0x2CB6},
+         {0x2CB9, 0x2CB8},   {0x2CBB, 0x2CBA},   {0x2CBD, 0x2CBC},
+         {0x2CBF, 0x2CBE},   {0x2CC1, 0x2CC0},   {0x2CC3, 0x2CC2},
+         {0x2CC5, 0x2CC4},   {0x2CC7, 0x2CC6},   {0x2CC9, 0x2CC8},
+         {0x2CCB, 0x2CCA},   {0x2CCD, 0x2CCC},   {0x2CCF, 0x2CCE},
+         {0x2CD1, 0x2CD0},   {0x2CD3, 0x2CD2},   {0x2CD5, 0x2CD4},
+         {0x2CD7, 0x2CD6},   {0x2CD9, 0x2CD8},   {0x2CDB, 0x2CDA},
+         {0x2CDD, 0x2CDC},   {0x2CDF, 0x2CDE},   {0x2CE1, 0x2CE0},
+         {0x2CE3, 0x2CE2},   {0x2CEC, 0x2CEB},   {0x2CEE, 0x2CED},
+         {0x2CF3, 0x2CF2},   {0x2D00, 0x10A0},   {0x2D01, 0x10A1},
+         {0x2D02, 0x10A2},   {0x2D03, 0x10A3},   {0x2D04, 0x10A4},
+         {0x2D05, 0x10A5},   {0x2D06, 0x10A6},   {0x2D07, 0x10A7},
+         {0x2D08, 0x10A8},   {0x2D09, 0x10A9},   {0x2D0A, 0x10AA},
+         {0x2D0B, 0x10AB},   {0x2D0C, 0x10AC},   {0x2D0D, 0x10AD},
+         {0x2D0E, 0x10AE},   {0x2D0F, 0x10AF},   {0x2D10, 0x10B0},
+         {0x2D11, 0x10B1},   {0x2D12, 0x10B2},   {0x2D13, 0x10B3},
+         {0x2D14, 0x10B4},   {0x2D15, 0x10B5},   {0x2D16, 0x10B6},
+         {0x2D17, 0x10B7},   {0x2D18, 0x10B8},   {0x2D19, 0x10B9},
+         {0x2D1A, 0x10BA},   {0x2D1B, 0x10BB},   {0x2D1C, 0x10BC},
+         {0x2D1D, 0x10BD},   {0x2D1E, 0x10BE},   {0x2D1F, 0x10BF},
+         {0x2D20, 0x10C0},   {0x2D21, 0x10C1},   {0x2D22, 0x10C2},
+         {0x2D23, 0x10C3},   {0x2D24, 0x10C4},   {0x2D25, 0x10C5},
+         {0x2D27, 0x10C7},   {0x2D2D, 0x10CD},   {0xA641, 0xA640},
+         {0xA643, 0xA642},   {0xA645, 0xA644},   {0xA647, 0xA646},
+         {0xA649, 0xA648},   {0xA64B, 0xA64A},   {0xA64D, 0xA64C},
+         {0xA64F, 0xA64E},   {0xA651, 0xA650},   {0xA653, 0xA652},
+         {0xA655, 0xA654},   {0xA657, 0xA656},   {0xA659, 0xA658},
+         {0xA65B, 0xA65A},   {0xA65D, 0xA65C},   {0xA65F, 0xA65E},
+         {0xA661, 0xA660},   {0xA663, 0xA662},   {0xA665, 0xA664},
+         {0xA667, 0xA666},   {0xA669, 0xA668},   {0xA66B, 0xA66A},
+         {0xA66D, 0xA66C},   {0xA681, 0xA680},   {0xA683, 0xA682},
+         {0xA685, 0xA684},   {0xA687, 0xA686},   {0xA689, 0xA688},
+         {0xA68B, 0xA68A},   {0xA68D, 0xA68C},   {0xA68F, 0xA68E},
+         {0xA691, 0xA690},   {0xA693, 0xA692},   {0xA695, 0xA694},
+         {0xA697, 0xA696},   {0xA699, 0xA698},   {0xA69B, 0xA69A},
+         {0xA723, 0xA722},   {0xA725, 0xA724},   {0xA727, 0xA726},
+         {0xA729, 0xA728},   {0xA72B, 0xA72A},   {0xA72D, 0xA72C},
+         {0xA72F, 0xA72E},   {0xA733, 0xA732},   {0xA735, 0xA734},
+         {0xA737, 0xA736},   {0xA739, 0xA738},   {0xA73B, 0xA73A},
+         {0xA73D, 0xA73C},   {0xA73F, 0xA73E},   {0xA741, 0xA740},
+         {0xA743, 0xA742},   {0xA745, 0xA744},   {0xA747, 0xA746},
+         {0xA749, 0xA748},   {0xA74B, 0xA74A},   {0xA74D, 0xA74C},
+         {0xA74F, 0xA74E},   {0xA751, 0xA750},   {0xA753, 0xA752},
+         {0xA755, 0xA754},   {0xA757, 0xA756},   {0xA759, 0xA758},
+         {0xA75B, 0xA75A},   {0xA75D, 0xA75C},   {0xA75F, 0xA75E},
+         {0xA761, 0xA760},   {0xA763, 0xA762},   {0xA765, 0xA764},
+         {0xA767, 0xA766},   {0xA769, 0xA768},   {0xA76B, 0xA76A},
+         {0xA76D, 0xA76C},   {0xA76F, 0xA76E},   {0xA77A, 0xA779},
+         {0xA77C, 0xA77B},   {0xA77F, 0xA77E},   {0xA781, 0xA780},
+         {0xA783, 0xA782},   {0xA785, 0xA784},   {0xA787, 0xA786},
+         {0xA78C, 0xA78B},   {0xA791, 0xA790},   {0xA793, 0xA792},
+         {0xA794, 0xA7C4},   {0xA797, 0xA796},   {0xA799, 0xA798},
+         {0xA79B, 0xA79A},   {0xA79D, 0xA79C},   {0xA79F, 0xA79E},
+         {0xA7A1, 0xA7A0},   {0xA7A3, 0xA7A2},   {0xA7A5, 0xA7A4},
+         {0xA7A7, 0xA7A6},   {0xA7A9, 0xA7A8},   {0xA7B5, 0xA7B4},
+         {0xA7B7, 0xA7B6},   {0xA7B9, 0xA7B8},   {0xA7BB, 0xA7BA},
+         {0xA7BD, 0xA7BC},   {0xA7BF, 0xA7BE},   {0xA7C1, 0xA7C0},
+         {0xA7C3, 0xA7C2},   {0xA7C8, 0xA7C7},   {0xA7CA, 0xA7C9},
+         {0xA7CD, 0xA7CC},   {0xA7CF, 0xA7CE},   {0xA7D1, 0xA7D0},
+         {0xA7D3, 0xA7D2},   {0xA7D5, 0xA7D4},   {0xA7D7, 0xA7D6},
+         {0xA7D9, 0xA7D8},   {0xA7DB, 0xA7DA},   {0xA7F6, 0xA7F5},
+         {0xAB53, 0xA7B3},   {0xAB70, 0x13A0},   {0xAB71, 0x13A1},
+         {0xAB72, 0x13A2},   {0xAB73, 0x13A3},   {0xAB74, 0x13A4},
+         {0xAB75, 0x13A5},   {0xAB76, 0x13A6},   {0xAB77, 0x13A7},
+         {0xAB78, 0x13A8},   {0xAB79, 0x13A9},   {0xAB7A, 0x13AA},
+         {0xAB7B, 0x13AB},   {0xAB7C, 0x13AC},   {0xAB7D, 0x13AD},
+         {0xAB7E, 0x13AE},   {0xAB7F, 0x13AF},   {0xAB80, 0x13B0},
+         {0xAB81, 0x13B1},   {0xAB82, 0x13B2},   {0xAB83, 0x13B3},
+         {0xAB84, 0x13B4},   {0xAB85, 0x13B5},   {0xAB86, 0x13B6},
+         {0xAB87, 0x13B7},   {0xAB88, 0x13B8},   {0xAB89, 0x13B9},
+         {0xAB8A, 0x13BA},   {0xAB8B, 0x13BB},   {0xAB8C, 0x13BC},
+         {0xAB8D, 0x13BD},   {0xAB8E, 0x13BE},   {0xAB8F, 0x13BF},
+         {0xAB90, 0x13C0},   {0xAB91, 0x13C1},   {0xAB92, 0x13C2},
+         {0xAB93, 0x13C3},   {0xAB94, 0x13C4},   {0xAB95, 0x13C5},
+         {0xAB96, 0x13C6},   {0xAB97, 0x13C7},   {0xAB98, 0x13C8},
+         {0xAB99, 0x13C9},   {0xAB9A, 0x13CA},   {0xAB9B, 0x13CB},
+         {0xAB9C, 0x13CC},   {0xAB9D, 0x13CD},   {0xAB9E, 0x13CE},
+         {0xAB9F, 0x13CF},   {0xABA0, 0x13D0},   {0xABA1, 0x13D1},
+         {0xABA2, 0x13D2},   {0xABA3, 0x13D3},   {0xABA4, 0x13D4},
+         {0xABA5, 0x13D5},   {0xABA6, 0x13D6},   {0xABA7, 0x13D7},
+         {0xABA8, 0x13D8},   {0xABA9, 0x13D9},   {0xABAA, 0x13DA},
+         {0xABAB, 0x13DB},   {0xABAC, 0x13DC},   {0xABAD, 0x13DD},
+         {0xABAE, 0x13DE},   {0xABAF, 0x13DF},   {0xABB0, 0x13E0},
+         {0xABB1, 0x13E1},   {0xABB2, 0x13E2},   {0xABB3, 0x13E3},
+         {0xABB4, 0x13E4},   {0xABB5, 0x13E5},   {0xABB6, 0x13E6},
+         {0xABB7, 0x13E7},   {0xABB8, 0x13E8},   {0xABB9, 0x13E9},
+         {0xABBA, 0x13EA},   {0xABBB, 0x13EB},   {0xABBC, 0x13EC},
+         {0xABBD, 0x13ED},   {0xABBE, 0x13EE},   {0xABBF, 0x13EF},
+         {0xFF41, 0xFF21},   {0xFF42, 0xFF22},   {0xFF43, 0xFF23},
+         {0xFF44, 0xFF24},   {0xFF45, 0xFF25},   {0xFF46, 0xFF26},
+         {0xFF47, 0xFF27},   {0xFF48, 0xFF28},   {0xFF49, 0xFF29},
+         {0xFF4A, 0xFF2A},   {0xFF4B, 0xFF2B},   {0xFF4C, 0xFF2C},
+         {0xFF4D, 0xFF2D},   {0xFF4E, 0xFF2E},   {0xFF4F, 0xFF2F},
+         {0xFF50, 0xFF30},   {0xFF51, 0xFF31},   {0xFF52, 0xFF32},
+         {0xFF53, 0xFF33},   {0xFF54, 0xFF34},   {0xFF55, 0xFF35},
+         {0xFF56, 0xFF36},   {0xFF57, 0xFF37},   {0xFF58, 0xFF38},
+         {0xFF59, 0xFF39},   {0xFF5A, 0xFF3A},   {0x10428, 0x10400},
+         {0x10429, 0x10401}, {0x1042A, 0x10402}, {0x1042B, 0x10403},
+         {0x1042C, 0x10404}, {0x1042D, 0x10405}, {0x1042E, 0x10406},
+         {0x1042F, 0x10407}, {0x10430, 0x10408}, {0x10431, 0x10409},
+         {0x10432, 0x1040A}, {0x10433, 0x1040B}, {0x10434, 0x1040C},
+         {0x10435, 0x1040D}, {0x10436, 0x1040E}, {0x10437, 0x1040F},
+         {0x10438, 0x10410}, {0x10439, 0x10411}, {0x1043A, 0x10412},
+         {0x1043B, 0x10413}, {0x1043C, 0x10414}, {0x1043D, 0x10415},
+         {0x1043E, 0x10416}, {0x1043F, 0x10417}, {0x10440, 0x10418},
+         {0x10441, 0x10419}, {0x10442, 0x1041A}, {0x10443, 0x1041B},
+         {0x10444, 0x1041C}, {0x10445, 0x1041D}, {0x10446, 0x1041E},
+         {0x10447, 0x1041F}, {0x10448, 0x10420}, {0x10449, 0x10421},
+         {0x1044A, 0x10422}, {0x1044B, 0x10423}, {0x1044C, 0x10424},
+         {0x1044D, 0x10425}, {0x1044E, 0x10426}, {0x1044F, 0x10427},
+         {0x104D8, 0x104B0}, {0x104D9, 0x104B1}, {0x104DA, 0x104B2},
+         {0x104DB, 0x104B3}, {0x104DC, 0x104B4}, {0x104DD, 0x104B5},
+         {0x104DE, 0x104B6}, {0x104DF, 0x104B7}, {0x104E0, 0x104B8},
+         {0x104E1, 0x104B9}, {0x104E2, 0x104BA}, {0x104E3, 0x104BB},
+         {0x104E4, 0x104BC}, {0x104E5, 0x104BD}, {0x104E6, 0x104BE},
+         {0x104E7, 0x104BF}, {0x104E8, 0x104C0}, {0x104E9, 0x104C1},
+         {0x104EA, 0x104C2}, {0x104EB, 0x104C3}, {0x104EC, 0x104C4},
+         {0x104ED, 0x104C5}, {0x104EE, 0x104C6}, {0x104EF, 0x104C7},
+         {0x104F0, 0x104C8}, {0x104F1, 0x104C9}, {0x104F2, 0x104CA},
+         {0x104F3, 0x104CB}, {0x104F4, 0x104CC}, {0x104F5, 0x104CD},
+         {0x104F6, 0x104CE}, {0x104F7, 0x104CF}, {0x104F8, 0x104D0},
+         {0x104F9, 0x104D1}, {0x104FA, 0x104D2}, {0x104FB, 0x104D3},
+         {0x10597, 0x10570}, {0x10598, 0x10571}, {0x10599, 0x10572},
+         {0x1059A, 0x10573}, {0x1059B, 0x10574}, {0x1059C, 0x10575},
+         {0x1059D, 0x10576}, {0x1059E, 0x10577}, {0x1059F, 0x10578},
+         {0x105A0, 0x10579}, {0x105A1, 0x1057A}, {0x105A3, 0x1057C},
+         {0x105A4, 0x1057D}, {0x105A5, 0x1057E}, {0x105A6, 0x1057F},
+         {0x105A7, 0x10580}, {0x105A8, 0x10581}, {0x105A9, 0x10582},
+         {0x105AA, 0x10583}, {0x105AB, 0x10584}, {0x105AC, 0x10585},
+         {0x105AD, 0x10586}, {0x105AE, 0x10587}, {0x105AF, 0x10588},
+         {0x105B0, 0x10589}, {0x105B1, 0x1058A}, {0x105B3, 0x1058C},
+         {0x105B4, 0x1058D}, {0x105B5, 0x1058E}, {0x105B6, 0x1058F},
+         {0x105B7, 0x10590}, {0x105B8, 0x10591}, {0x105B9, 0x10592},
+         {0x105BB, 0x10594}, {0x105BC, 0x10595}, {0x10CC0, 0x10C80},
+         {0x10CC1, 0x10C81}, {0x10CC2, 0x10C82}, {0x10CC3, 0x10C83},
+         {0x10CC4, 0x10C84}, {0x10CC5, 0x10C85}, {0x10CC6, 0x10C86},
+         {0x10CC7, 0x10C87}, {0x10CC8, 0x10C88}, {0x10CC9, 0x10C89},
+         {0x10CCA, 0x10C8A}, {0x10CCB, 0x10C8B}, {0x10CCC, 0x10C8C},
+         {0x10CCD, 0x10C8D}, {0x10CCE, 0x10C8E}, {0x10CCF, 0x10C8F},
+         {0x10CD0, 0x10C90}, {0x10CD1, 0x10C91}, {0x10CD2, 0x10C92},
+         {0x10CD3, 0x10C93}, {0x10CD4, 0x10C94}, {0x10CD5, 0x10C95},
+         {0x10CD6, 0x10C96}, {0x10CD7, 0x10C97}, {0x10CD8, 0x10C98},
+         {0x10CD9, 0x10C99}, {0x10CDA, 0x10C9A}, {0x10CDB, 0x10C9B},
+         {0x10CDC, 0x10C9C}, {0x10CDD, 0x10C9D}, {0x10CDE, 0x10C9E},
+         {0x10CDF, 0x10C9F}, {0x10CE0, 0x10CA0}, {0x10CE1, 0x10CA1},
+         {0x10CE2, 0x10CA2}, {0x10CE3, 0x10CA3}, {0x10CE4, 0x10CA4},
+         {0x10CE5, 0x10CA5}, {0x10CE6, 0x10CA6}, {0x10CE7, 0x10CA7},
+         {0x10CE8, 0x10CA8}, {0x10CE9, 0x10CA9}, {0x10CEA, 0x10CAA},
+         {0x10CEB, 0x10CAB}, {0x10CEC, 0x10CAC}, {0x10CED, 0x10CAD},
+         {0x10CEE, 0x10CAE}, {0x10CEF, 0x10CAF}, {0x10CF0, 0x10CB0},
+         {0x10CF1, 0x10CB1}, {0x10CF2, 0x10CB2}, {0x10D70, 0x10D50},
+         {0x10D71, 0x10D51}, {0x10D72, 0x10D52}, {0x10D73, 0x10D53},
+         {0x10D74, 0x10D54}, {0x10D75, 0x10D55}, {0x10D76, 0x10D56},
+         {0x10D77, 0x10D57}, {0x10D78, 0x10D58}, {0x10D79, 0x10D59},
+         {0x10D7A, 0x10D5A}, {0x10D7B, 0x10D5B}, {0x10D7C, 0x10D5C},
+         {0x10D7D, 0x10D5D}, {0x10D7E, 0x10D5E}, {0x10D7F, 0x10D5F},
+         {0x10D80, 0x10D60}, {0x10D81, 0x10D61}, {0x10D82, 0x10D62},
+         {0x10D83, 0x10D63}, {0x10D84, 0x10D64}, {0x10D85, 0x10D65},
+         {0x118C0, 0x118A0}, {0x118C1, 0x118A1}, {0x118C2, 0x118A2},
+         {0x118C3, 0x118A3}, {0x118C4, 0x118A4}, {0x118C5, 0x118A5},
+         {0x118C6, 0x118A6}, {0x118C7, 0x118A7}, {0x118C8, 0x118A8},
+         {0x118C9, 0x118A9}, {0x118CA, 0x118AA}, {0x118CB, 0x118AB},
+         {0x118CC, 0x118AC}, {0x118CD, 0x118AD}, {0x118CE, 0x118AE},
+         {0x118CF, 0x118AF}, {0x118D0, 0x118B0}, {0x118D1, 0x118B1},
+         {0x118D2, 0x118B2}, {0x118D3, 0x118B3}, {0x118D4, 0x118B4},
+         {0x118D5, 0x118B5}, {0x118D6, 0x118B6}, {0x118D7, 0x118B7},
+         {0x118D8, 0x118B8}, {0x118D9, 0x118B9}, {0x118DA, 0x118BA},
+         {0x118DB, 0x118BB}, {0x118DC, 0x118BC}, {0x118DD, 0x118BD},
+         {0x118DE, 0x118BE}, {0x118DF, 0x118BF}, {0x16E60, 0x16E40},
+         {0x16E61, 0x16E41}, {0x16E62, 0x16E42}, {0x16E63, 0x16E43},
+         {0x16E64, 0x16E44}, {0x16E65, 0x16E45}, {0x16E66, 0x16E46},
+         {0x16E67, 0x16E47}, {0x16E68, 0x16E48}, {0x16E69, 0x16E49},
+         {0x16E6A, 0x16E4A}, {0x16E6B, 0x16E4B}, {0x16E6C, 0x16E4C},
+         {0x16E6D, 0x16E4D}, {0x16E6E, 0x16E4E}, {0x16E6F, 0x16E4F},
+         {0x16E70, 0x16E50}, {0x16E71, 0x16E51}, {0x16E72, 0x16E52},
+         {0x16E73, 0x16E53}, {0x16E74, 0x16E54}, {0x16E75, 0x16E55},
+         {0x16E76, 0x16E56}, {0x16E77, 0x16E57}, {0x16E78, 0x16E58},
+         {0x16E79, 0x16E59}, {0x16E7A, 0x16E5A}, {0x16E7B, 0x16E5B},
+         {0x16E7C, 0x16E5C}, {0x16E7D, 0x16E5D}, {0x16E7E, 0x16E5E},
+         {0x16E7F, 0x16E5F}, {0x16EBB, 0x16EA0}, {0x16EBC, 0x16EA1},
+         {0x16EBD, 0x16EA2}, {0x16EBE, 0x16EA3}, {0x16EBF, 0x16EA4},
+         {0x16EC0, 0x16EA5}, {0x16EC1, 0x16EA6}, {0x16EC2, 0x16EA7},
+         {0x16EC3, 0x16EA8}, {0x16EC4, 0x16EA9}, {0x16EC5, 0x16EAA},
+         {0x16EC6, 0x16EAB}, {0x16EC7, 0x16EAC}, {0x16EC8, 0x16EAD},
+         {0x16EC9, 0x16EAE}, {0x16ECA, 0x16EAF}, {0x16ECB, 0x16EB0},
+         {0x16ECC, 0x16EB1}, {0x16ECD, 0x16EB2}, {0x16ECE, 0x16EB3},
+         {0x16ECF, 0x16EB4}, {0x16ED0, 0x16EB5}, {0x16ED1, 0x16EB6},
+         {0x16ED2, 0x16EB7}, {0x16ED3, 0x16EB8}, {0x1E922, 0x1E900},
+         {0x1E923, 0x1E901}, {0x1E924, 0x1E902}, {0x1E925, 0x1E903},
+         {0x1E926, 0x1E904}, {0x1E927, 0x1E905}, {0x1E928, 0x1E906},
+         {0x1E929, 0x1E907}, {0x1E92A, 0x1E908}, {0x1E92B, 0x1E909},
+         {0x1E92C, 0x1E90A}, {0x1E92D, 0x1E90B}, {0x1E92E, 0x1E90C},
+         {0x1E92F, 0x1E90D}, {0x1E930, 0x1E90E}, {0x1E931, 0x1E90F},
+         {0x1E932, 0x1E910}, {0x1E933, 0x1E911}, {0x1E934, 0x1E912},
+         {0x1E935, 0x1E913}, {0x1E936, 0x1E914}, {0x1E937, 0x1E915},
+         {0x1E938, 0x1E916}, {0x1E939, 0x1E917}, {0x1E93A, 0x1E918},
+         {0x1E93B, 0x1E919}, {0x1E93C, 0x1E91A}, {0x1E93D, 0x1E91B},
+         {0x1E93E, 0x1E91C}, {0x1E93F, 0x1E91D}, {0x1E940, 0x1E91E},
+         {0x1E941, 0x1E91F}, {0x1E942, 0x1E920}, {0x1E943, 0x1E921}}};
+
+LIBC_INLINE_VAR constexpr auto LOWER_TO_UPPER_HASHER =
+    ptrhash::init_hasher<1458>(
+        0x1A275D28E2768536,
+        cpp::array<uint8_t, 489>{
+            0x0,  0x12, 0x8,  0x16, 0x2,  0x1,  0x2,  0xD,  0x2E, 0x0,  0x0,
+            0x8,  0x10, 0x33, 0x0,  0x1A, 0xB,  0x3,  0x0,  0x0,  0x0,  0x17,
+            0x2C, 0x19, 0x48, 0x33, 0x2,  0x11, 0x0,  0x42, 0x1,  0xA,  0x0,
+            0x31, 0x2,  0x5,  0x0,  0x4E, 0x2,  0x4,  0x0,  0x1,  0x9,  0x23,
+            0x7,  0x2,  0x9,  0xE,  0x0,  0x1,  0x14, 0x27, 0x1,  0x3B, 0x0,
+            0x41, 0xB,  0x2,  0x15, 0xB,  0x33, 0x1,  0x0,  0x11, 0x1,  0x6,
+            0x2,  0x0,  0x3E, 0x0,  0x0,  0x1,  0xE,  0x18, 0x50, 0x1,  0xB,
+            0x18, 0xC,  0x1,  0x28, 0x8,  0x15, 0x6,  0x0,  0x1,  0x13, 0x3,
+            0x8,  0x9,  0x1D, 0x0,  0x3,  0xC,  0x0,  0x17, 0x10, 0xB,  0x15,
+            0x5,  0x1,  0x18, 0x18, 0x34, 0x2D, 0x0,  0x5,  0xC0, 0xE,  0x40,
+            0x3C, 0x1,  0x4,  0x1,  0x2,  0x11, 0x10, 0x10, 0x3E, 0x27, 0x5,
+            0x7,  0x2B, 0x0,  0x2,  0x2,  0xC,  0x21, 0x1,  0xC,  0x5,  0x2,
+            0x6,  0x10, 0x1,  0x4C, 0x3B, 0xB,  0x0,  0x0,  0xD,  0x5,  0x12,
+            0x2,  0x5,  0x4,  0x0,  0x1B, 0x5B, 0xE,  0x3,  0x20, 0x13, 0x7,
+            0x0,  0x7,  0x14, 0x8,  0x20, 0x0,  0x29, 0x0,  0x19, 0x1F, 0x0,
+            0x40, 0x1D, 0x0,  0x7,  0x0,  0x2,  0x1,  0x1D, 0x1B, 0x32, 0xD,
+            0x4,  0x0,  0x9,  0x0,  0x18, 0x13, 0x4D, 0x10, 0x13, 0xE,  0x21,
+            0x2C, 0x94, 0x7,  0x25, 0x5,  0x0,  0x93, 0x7,  0x0,  0x0,  0x30,
+            0xF,  0x2,  0x5,  0x30, 0x2C, 0x4,  0x0,  0x5,  0x2,  0x0,  0x2,
+            0x0,  0x5,  0x12, 0x4,  0x40, 0x2,  0x9,  0x5,  0xE,  0x2A, 0x3C,
+            0x3F, 0x0,  0x1A, 0x0,  0x9F, 0x1,  0x0,  0x45, 0x26, 0xC,  0x10,
+            0x23, 0x7,  0x0,  0x1B, 0x6,  0x0,  0x1F, 0xA,  0x5,  0x3,  0x2,
+            0x0,  0x0,  0x80, 0x20, 0x1,  0x2C, 0x36, 0x8,  0x20, 0x4,  0x87,
+            0x2A, 0xC,  0x2,  0x33, 0x5,  0x0,  0x3A, 0x1,  0x4F, 0xB,  0x0,
+            0xF,  0x1F, 0x24, 0x6,  0xE,  0x85, 0xF,  0x6,  0x3,  0x1D, 0x1,
+            0x1,  0x7A, 0x7,  0x1,  0x2,  0x1A, 0x3,  0x34, 0x2,  0x0,  0x6,
+            0x48, 0x2,  0xD,  0x49, 0xA,  0x8,  0xF,  0xC,  0x1F, 0x25, 0x6,
+            0x6,  0x4,  0xE,  0x0,  0x1,  0x0,  0x0,  0x4E, 0x16, 0x1C, 0x15,
+            0x38, 0xD,  0x2F, 0x27, 0x3C, 0x3,  0x0,  0x64, 0x4F, 0xD,  0x32,
+            0x0,  0x13, 0x21, 0x16, 0x0,  0x11, 0x0,  0x8,  0x1F, 0x36, 0x1,
+            0x1E, 0x0,  0x0,  0x15, 0x10, 0x20, 0x7E, 0x2,  0x6,  0x2,  0x63,
+            0x11, 0x6,  0x35, 0x14, 0x3,  0x0,  0x39, 0x2,  0x13, 0x48, 0x30,
+            0x0,  0x4B, 0x55, 0x3A, 0xB,  0x11, 0x1D, 0x2D, 0x0,  0xB,  0x0,
+            0xA6, 0x36, 0x0,  0x4,  0x17, 0x5,  0x11, 0x40, 0xB3, 0x1,  0x89,
+            0x0,  0x10, 0xDF, 0x22, 0xF,  0x4C, 0x3,  0x0,  0x30, 0x42, 0x15,
+            0x6D, 0x1C, 0xA,  0x22, 0x0,  0x0,  0x78, 0x2,  0x6,  0x46, 0x4B,
+            0x1E, 0x32, 0x5D, 0x2E, 0x0,  0x65, 0x5,  0x0,  0xE,  0x5,  0xE,
+            0x24, 0x19, 0x3F, 0x8F, 0x16, 0x1,  0x71, 0x1E, 0x15, 0x0,  0x1,
+            0x4,  0x2,  0x0,  0x4,  0x0,  0x8,  0x57, 0xE,  0x3,  0x4,  0xEF,
+            0x93, 0xF,  0x21, 0x4,  0x0,  0x3A, 0x9,  0x9,  0xF3, 0x33, 0x6,
+            0x12, 0x1C, 0xAB, 0x18, 0x2,  0x2,  0x7,  0x7,  0x0,  0x8,  0x2,
+            0x9,  0x0,  0x51, 0xC6, 0x37, 0xB,  0xB2, 0x0,  0x60, 0x1E, 0x83,
+            0x9,  0xA2, 0x1,  0x5B, 0xF5, 0x30, 0x7,  0x0,  0x1,  0xF6, 0x7E,
+            0x29, 0xC,  0xF4, 0x35, 0xD,  0xB5, 0xD,  0x9,  0x27, 0x86, 0x6,
+            0xEC, 0x4,  0x57, 0xE,  0x1C},
+        cpp::array<uint32_t, 14>{0xA5, 0xB1, 0xEB, 0x136, 0x156, 0x176, 0x19C,
+                                 0x1A5, 0x2D8, 0x42A, 0x446, 0x4F3, 0x500,
+                                 0x52E});
+
+LIBC_INLINE_VAR constexpr PerfectHashMap<1458, decltype(LOWER_TO_UPPER_HASHER)>
+    LOWER_TO_UPPER_MAP{LOWER_TO_UPPER_DATA, LOWER_TO_UPPER_HASHER};
+
+} // namespace LIBC_NAMESPACE_DECL
+
+#endif // LLVM_LIBC_SRC___SUPPORT_WCTYPE_LOWER_TO_UPPER_H
diff --git a/libc/src/__support/wctype/lower_to_upper.inc b/libc/src/__support/wctype/lower_to_upper.inc
deleted file mode 100644
index e20d8a9e61714..0000000000000
--- a/libc/src/__support/wctype/lower_to_upper.inc
+++ /dev/null
@@ -1,400 +0,0 @@
-//===-- Auto-generated lower to upper case mappings table -------*- C++ -*-===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-// DO NOT EDIT MANUALLY.
-// This file is generated by libc/utils/wctype_utils scripts.
-// This file is meant to be included directly into LLVM libc code
-// Format: {from_codepoint, to_codepoint}
-// Info: 1458 entries
-
-{0x61, 0x41}, {0x62, 0x42}, {0x63, 0x43}, {0x64, 0x44}, {0x65, 0x45},
-    {0x66, 0x46}, {0x67, 0x47}, {0x68, 0x48}, {0x69, 0x49}, {0x6A, 0x4A},
-    {0x6B, 0x4B}, {0x6C, 0x4C}, {0x6D, 0x4D}, {0x6E, 0x4E}, {0x6F, 0x4F},
-    {0x70, 0x50}, {0x71, 0x51}, {0x72, 0x52}, {0x73, 0x53}, {0x74, 0x54},
-    {0x75, 0x55}, {0x76, 0x56}, {0x77, 0x57}, {0x78, 0x58}, {0x79, 0x59},
-    {0x7A, 0x5A}, {0xB5, 0x39C}, {0xE0, 0xC0}, {0xE1, 0xC1}, {0xE2, 0xC2},
-    {0xE3, 0xC3}, {0xE4, 0xC4}, {0xE5, 0xC5}, {0xE6, 0xC6}, {0xE7, 0xC7},
-    {0xE8, 0xC8}, {0xE9, 0xC9}, {0xEA, 0xCA}, {0xEB, 0xCB}, {0xEC, 0xCC},
-    {0xED, 0xCD}, {0xEE, 0xCE}, {0xEF, 0xCF}, {0xF0, 0xD0}, {0xF1, 0xD1},
-    {0xF2, 0xD2}, {0xF3, 0xD3}, {0xF4, 0xD4}, {0xF5, 0xD5}, {0xF6, 0xD6},
-    {0xF8, 0xD8}, {0xF9, 0xD9}, {0xFA, 0xDA}, {0xFB, 0xDB}, {0xFC, 0xDC},
-    {0xFD, 0xDD}, {0xFE, 0xDE}, {0xFF, 0x178}, {0x101, 0x100}, {0x103, 0x102},
-    {0x105, 0x104}, {0x107, 0x106}, {0x109, 0x108}, {0x10B, 0x10A},
-    {0x10D, 0x10C}, {0x10F, 0x10E}, {0x111, 0x110}, {0x113, 0x112},
-    {0x115, 0x114}, {0x117, 0x116}, {0x119, 0x118}, {0x11B, 0x11A},
-    {0x11D, 0x11C}, {0x11F, 0x11E}, {0x121, 0x120}, {0x123, 0x122},
-    {0x125, 0x124}, {0x127, 0x126}, {0x129, 0x128}, {0x12B, 0x12A},
-    {0x12D, 0x12C}, {0x12F, 0x12E}, {0x131, 0x49}, {0x133, 0x132},
-    {0x135, 0x134}, {0x137, 0x136}, {0x13A, 0x139}, {0x13C, 0x13B},
-    {0x13E, 0x13D}, {0x140, 0x13F}, {0x142, 0x141}, {0x144, 0x143},
-    {0x146, 0x145}, {0x148, 0x147}, {0x14B, 0x14A}, {0x14D, 0x14C},
-    {0x14F, 0x14E}, {0x151, 0x150}, {0x153, 0x152}, {0x155, 0x154},
-    {0x157, 0x156}, {0x159, 0x158}, {0x15B, 0x15A}, {0x15D, 0x15C},
-    {0x15F, 0x15E}, {0x161, 0x160}, {0x163, 0x162}, {0x165, 0x164},
-    {0x167, 0x166}, {0x169, 0x168}, {0x16B, 0x16A}, {0x16D, 0x16C},
-    {0x16F, 0x16E}, {0x171, 0x170}, {0x173, 0x172}, {0x175, 0x174},
-    {0x177, 0x176}, {0x17A, 0x179}, {0x17C, 0x17B}, {0x17E, 0x17D},
-    {0x17F, 0x53}, {0x180, 0x243}, {0x183, 0x182}, {0x185, 0x184},
-    {0x188, 0x187}, {0x18C, 0x18B}, {0x192, 0x191}, {0x195, 0x1F6},
-    {0x199, 0x198}, {0x19A, 0x23D}, {0x19B, 0xA7DC}, {0x19E, 0x220},
-    {0x1A1, 0x1A0}, {0x1A3, 0x1A2}, {0x1A5, 0x1A4}, {0x1A8, 0x1A7},
-    {0x1AD, 0x1AC}, {0x1B0, 0x1AF}, {0x1B4, 0x1B3}, {0x1B6, 0x1B5},
-    {0x1B9, 0x1B8}, {0x1BD, 0x1BC}, {0x1BF, 0x1F7}, {0x1C6, 0x1C4},
-    {0x1C9, 0x1C7}, {0x1CC, 0x1CA}, {0x1CE, 0x1CD}, {0x1D0, 0x1CF},
-    {0x1D2, 0x1D1}, {0x1D4, 0x1D3}, {0x1D6, 0x1D5}, {0x1D8, 0x1D7},
-    {0x1DA, 0x1D9}, {0x1DC, 0x1DB}, {0x1DD, 0x18E}, {0x1DF, 0x1DE},
-    {0x1E1, 0x1E0}, {0x1E3, 0x1E2}, {0x1E5, 0x1E4}, {0x1E7, 0x1E6},
-    {0x1E9, 0x1E8}, {0x1EB, 0x1EA}, {0x1ED, 0x1EC}, {0x1EF, 0x1EE},
-    {0x1F3, 0x1F1}, {0x1F5, 0x1F4}, {0x1F9, 0x1F8}, {0x1FB, 0x1FA},
-    {0x1FD, 0x1FC}, {0x1FF, 0x1FE}, {0x201, 0x200}, {0x203, 0x202},
-    {0x205, 0x204}, {0x207, 0x206}, {0x209, 0x208}, {0x20B, 0x20A},
-    {0x20D, 0x20C}, {0x20F, 0x20E}, {0x211, 0x210}, {0x213, 0x212},
-    {0x215, 0x214}, {0x217, 0x216}, {0x219, 0x218}, {0x21B, 0x21A},
-    {0x21D, 0x21C}, {0x21F, 0x21E}, {0x223, 0x222}, {0x225, 0x224},
-    {0x227, 0x226}, {0x229, 0x228}, {0x22B, 0x22A}, {0x22D, 0x22C},
-    {0x22F, 0x22E}, {0x231, 0x230}, {0x233, 0x232}, {0x23C, 0x23B},
-    {0x23F, 0x2C7E}, {0x240, 0x2C7F}, {0x242, 0x241}, {0x247, 0x246},
-    {0x249, 0x248}, {0x24B, 0x24A}, {0x24D, 0x24C}, {0x24F, 0x24E},
-    {0x250, 0x2C6F}, {0x251, 0x2C6D}, {0x252, 0x2C70}, {0x253, 0x181},
-    {0x254, 0x186}, {0x256, 0x189}, {0x257, 0x18A}, {0x259, 0x18F},
-    {0x25B, 0x190}, {0x25C, 0xA7AB}, {0x260, 0x193}, {0x261, 0xA7AC},
-    {0x263, 0x194}, {0x264, 0xA7CB}, {0x265, 0xA78D}, {0x266, 0xA7AA},
-    {0x268, 0x197}, {0x269, 0x196}, {0x26A, 0xA7AE}, {0x26B, 0x2C62},
-    {0x26C, 0xA7AD}, {0x26F, 0x19C}, {0x271, 0x2C6E}, {0x272, 0x19D},
-    {0x275, 0x19F}, {0x27D, 0x2C64}, {0x280, 0x1A6}, {0x282, 0xA7C5},
-    {0x283, 0x1A9}, {0x287, 0xA7B1}, {0x288, 0x1AE}, {0x289, 0x244},
-    {0x28A, 0x1B1}, {0x28B, 0x1B2}, {0x28C, 0x245}, {0x292, 0x1B7},
-    {0x29D, 0xA7B2}, {0x29E, 0xA7B0}, {0x371, 0x370}, {0x373, 0x372},
-    {0x377, 0x376}, {0x37B, 0x3FD}, {0x37C, 0x3FE}, {0x37D, 0x3FF},
-    {0x3AC, 0x386}, {0x3AD, 0x388}, {0x3AE, 0x389}, {0x3AF, 0x38A},
-    {0x3B1, 0x391}, {0x3B2, 0x392}, {0x3B3, 0x393}, {0x3B4, 0x394},
-    {0x3B5, 0x395}, {0x3B6, 0x396}, {0x3B7, 0x397}, {0x3B8, 0x398},
-    {0x3B9, 0x399}, {0x3BA, 0x39A}, {0x3BB, 0x39B}, {0x3BC, 0x39C},
-    {0x3BD, 0x39D}, {0x3BE, 0x39E}, {0x3BF, 0x39F}, {0x3C0, 0x3A0},
-    {0x3C1, 0x3A1}, {0x3C2, 0x3A3}, {0x3C3, 0x3A3}, {0x3C4, 0x3A4},
-    {0x3C5, 0x3A5}, {0x3C6, 0x3A6}, {0x3C7, 0x3A7}, {0x3C8, 0x3A8},
-    {0x3C9, 0x3A9}, {0x3CA, 0x3AA}, {0x3CB, 0x3AB}, {0x3CC, 0x38C},
-    {0x3CD, 0x38E}, {0x3CE, 0x38F}, {0x3D0, 0x392}, {0x3D1, 0x398},
-    {0x3D5, 0x3A6}, {0x3D6, 0x3A0}, {0x3D7, 0x3CF}, {0x3D9, 0x3D8},
-    {0x3DB, 0x3DA}, {0x3DD, 0x3DC}, {0x3DF, 0x3DE}, {0x3E1, 0x3E0},
-    {0x3E3, 0x3E2}, {0x3E5, 0x3E4}, {0x3E7, 0x3E6}, {0x3E9, 0x3E8},
-    {0x3EB, 0x3EA}, {0x3ED, 0x3EC}, {0x3EF, 0x3EE}, {0x3F0, 0x39A},
-    {0x3F1, 0x3A1}, {0x3F2, 0x3F9}, {0x3F3, 0x37F}, {0x3F5, 0x395},
-    {0x3F8, 0x3F7}, {0x3FB, 0x3FA}, {0x430, 0x410}, {0x431, 0x411},
-    {0x432, 0x412}, {0x433, 0x413}, {0x434, 0x414}, {0x435, 0x415},
-    {0x436, 0x416}, {0x437, 0x417}, {0x438, 0x418}, {0x439, 0x419},
-    {0x43A, 0x41A}, {0x43B, 0x41B}, {0x43C, 0x41C}, {0x43D, 0x41D},
-    {0x43E, 0x41E}, {0x43F, 0x41F}, {0x440, 0x420}, {0x441, 0x421},
-    {0x442, 0x422}, {0x443, 0x423}, {0x444, 0x424}, {0x445, 0x425},
-    {0x446, 0x426}, {0x447, 0x427}, {0x448, 0x428}, {0x449, 0x429},
-    {0x44A, 0x42A}, {0x44B, 0x42B}, {0x44C, 0x42C}, {0x44D, 0x42D},
-    {0x44E, 0x42E}, {0x44F, 0x42F}, {0x450, 0x400}, {0x451, 0x401},
-    {0x452, 0x402}, {0x453, 0x403}, {0x454, 0x404}, {0x455, 0x405},
-    {0x456, 0x406}, {0x457, 0x407}, {0x458, 0x408}, {0x459, 0x409},
-    {0x45A, 0x40A}, {0x45B, 0x40B}, {0x45C, 0x40C}, {0x45D, 0x40D},
-    {0x45E, 0x40E}, {0x45F, 0x40F}, {0x461, 0x460}, {0x463, 0x462},
-    {0x465, 0x464}, {0x467, 0x466}, {0x469, 0x468}, {0x46B, 0x46A},
-    {0x46D, 0x46C}, {0x46F, 0x46E}, {0x471, 0x470}, {0x473, 0x472},
-    {0x475, 0x474}, {0x477, 0x476}, {0x479, 0x478}, {0x47B, 0x47A},
-    {0x47D, 0x47C}, {0x47F, 0x47E}, {0x481, 0x480}, {0x48B, 0x48A},
-    {0x48D, 0x48C}, {0x48F, 0x48E}, {0x491, 0x490}, {0x493, 0x492},
-    {0x495, 0x494}, {0x497, 0x496}, {0x499, 0x498}, {0x49B, 0x49A},
-    {0x49D, 0x49C}, {0x49F, 0x49E}, {0x4A1, 0x4A0}, {0x4A3, 0x4A2},
-    {0x4A5, 0x4A4}, {0x4A7, 0x4A6}, {0x4A9, 0x4A8}, {0x4AB, 0x4AA},
-    {0x4AD, 0x4AC}, {0x4AF, 0x4AE}, {0x4B1, 0x4B0}, {0x4B3, 0x4B2},
-    {0x4B5, 0x4B4}, {0x4B7, 0x4B6}, {0x4B9, 0x4B8}, {0x4BB, 0x4BA},
-    {0x4BD, 0x4BC}, {0x4BF, 0x4BE}, {0x4C2, 0x4C1}, {0x4C4, 0x4C3},
-    {0x4C6, 0x4C5}, {0x4C8, 0x4C7}, {0x4CA, 0x4C9}, {0x4CC, 0x4CB},
-    {0x4CE, 0x4CD}, {0x4CF, 0x4C0}, {0x4D1, 0x4D0}, {0x4D3, 0x4D2},
-    {0x4D5, 0x4D4}, {0x4D7, 0x4D6}, {0x4D9, 0x4D8}, {0x4DB, 0x4DA},
-    {0x4DD, 0x4DC}, {0x4DF, 0x4DE}, {0x4E1, 0x4E0}, {0x4E3, 0x4E2},
-    {0x4E5, 0x4E4}, {0x4E7, 0x4E6}, {0x4E9, 0x4E8}, {0x4EB, 0x4EA},
-    {0x4ED, 0x4EC}, {0x4EF, 0x4EE}, {0x4F1, 0x4F0}, {0x4F3, 0x4F2},
-    {0x4F5, 0x4F4}, {0x4F7, 0x4F6}, {0x4F9, 0x4F8}, {0x4FB, 0x4FA},
-    {0x4FD, 0x4FC}, {0x4FF, 0x4FE}, {0x501, 0x500}, {0x503, 0x502},
-    {0x505, 0x504}, {0x507, 0x506}, {0x509, 0x508}, {0x50B, 0x50A},
-    {0x50D, 0x50C}, {0x50F, 0x50E}, {0x511, 0x510}, {0x513, 0x512},
-    {0x515, 0x514}, {0x517, 0x516}, {0x519, 0x518}, {0x51B, 0x51A},
-    {0x51D, 0x51C}, {0x51F, 0x51E}, {0x521, 0x520}, {0x523, 0x522},
-    {0x525, 0x524}, {0x527, 0x526}, {0x529, 0x528}, {0x52B, 0x52A},
-    {0x52D, 0x52C}, {0x52F, 0x52E}, {0x561, 0x531}, {0x562, 0x532},
-    {0x563, 0x533}, {0x564, 0x534}, {0x565, 0x535}, {0x566, 0x536},
-    {0x567, 0x537}, {0x568, 0x538}, {0x569, 0x539}, {0x56A, 0x53A},
-    {0x56B, 0x53B}, {0x56C, 0x53C}, {0x56D, 0x53D}, {0x56E, 0x53E},
-    {0x56F, 0x53F}, {0x570, 0x540}, {0x571, 0x541}, {0x572, 0x542},
-    {0x573, 0x543}, {0x574, 0x544}, {0x575, 0x545}, {0x576, 0x546},
-    {0x577, 0x547}, {0x578, 0x548}, {0x579, 0x549}, {0x57A, 0x54A},
-    {0x57B, 0x54B}, {0x57C, 0x54C}, {0x57D, 0x54D}, {0x57E, 0x54E},
-    {0x57F, 0x54F}, {0x580, 0x550}, {0x581, 0x551}, {0x582, 0x552},
-    {0x583, 0x553}, {0x584, 0x554}, {0x585, 0x555}, {0x586, 0x556},
-    {0x10D0, 0x1C90}, {0x10D1, 0x1C91}, {0x10D2, 0x1C92}, {0x10D3, 0x1C93},
-    {0x10D4, 0x1C94}, {0x10D5, 0x1C95}, {0x10D6, 0x1C96}, {0x10D7, 0x1C97},
-    {0x10D8, 0x1C98}, {0x10D9, 0x1C99}, {0x10DA, 0x1C9A}, {0x10DB, 0x1C9B},
-    {0x10DC, 0x1C9C}, {0x10DD, 0x1C9D}, {0x10DE, 0x1C9E}, {0x10DF, 0x1C9F},
-    {0x10E0, 0x1CA0}, {0x10E1, 0x1CA1}, {0x10E2, 0x1CA2}, {0x10E3, 0x1CA3},
-    {0x10E4, 0x1CA4}, {0x10E5, 0x1CA5}, {0x10E6, 0x1CA6}, {0x10E7, 0x1CA7},
-    {0x10E8, 0x1CA8}, {0x10E9, 0x1CA9}, {0x10EA, 0x1CAA}, {0x10EB, 0x1CAB},
-    {0x10EC, 0x1CAC}, {0x10ED, 0x1CAD}, {0x10EE, 0x1CAE}, {0x10EF, 0x1CAF},
-    {0x10F0, 0x1CB0}, {0x10F1, 0x1CB1}, {0x10F2, 0x1CB2}, {0x10F3, 0x1CB3},
-    {0x10F4, 0x1CB4}, {0x10F5, 0x1CB5}, {0x10F6, 0x1CB6}, {0x10F7, 0x1CB7},
-    {0x10F8, 0x1CB8}, {0x10F9, 0x1CB9}, {0x10FA, 0x1CBA}, {0x10FD, 0x1CBD},
-    {0x10FE, 0x1CBE}, {0x10FF, 0x1CBF}, {0x13F8, 0x13F0}, {0x13F9, 0x13F1},
-    {0x13FA, 0x13F2}, {0x13FB, 0x13F3}, {0x13FC, 0x13F4}, {0x13FD, 0x13F5},
-    {0x1C80, 0x412}, {0x1C81, 0x414}, {0x1C82, 0x41E}, {0x1C83, 0x421},
-    {0x1C84, 0x422}, {0x1C85, 0x422}, {0x1C86, 0x42A}, {0x1C87, 0x462},
-    {0x1C88, 0xA64A}, {0x1C8A, 0x1C89}, {0x1D79, 0xA77D}, {0x1D7D, 0x2C63},
-    {0x1D8E, 0xA7C6}, {0x1E01, 0x1E00}, {0x1E03, 0x1E02}, {0x1E05, 0x1E04},
-    {0x1E07, 0x1E06}, {0x1E09, 0x1E08}, {0x1E0B, 0x1E0A}, {0x1E0D, 0x1E0C},
-    {0x1E0F, 0x1E0E}, {0x1E11, 0x1E10}, {0x1E13, 0x1E12}, {0x1E15, 0x1E14},
-    {0x1E17, 0x1E16}, {0x1E19, 0x1E18}, {0x1E1B, 0x1E1A}, {0x1E1D, 0x1E1C},
-    {0x1E1F, 0x1E1E}, {0x1E21, 0x1E20}, {0x1E23, 0x1E22}, {0x1E25, 0x1E24},
-    {0x1E27, 0x1E26}, {0x1E29, 0x1E28}, {0x1E2B, 0x1E2A}, {0x1E2D, 0x1E2C},
-    {0x1E2F, 0x1E2E}, {0x1E31, 0x1E30}, {0x1E33, 0x1E32}, {0x1E35, 0x1E34},
-    {0x1E37, 0x1E36}, {0x1E39, 0x1E38}, {0x1E3B, 0x1E3A}, {0x1E3D, 0x1E3C},
-    {0x1E3F, 0x1E3E}, {0x1E41, 0x1E40}, {0x1E43, 0x1E42}, {0x1E45, 0x1E44},
-    {0x1E47, 0x1E46}, {0x1E49, 0x1E48}, {0x1E4B, 0x1E4A}, {0x1E4D, 0x1E4C},
-    {0x1E4F, 0x1E4E}, {0x1E51, 0x1E50}, {0x1E53, 0x1E52}, {0x1E55, 0x1E54},
-    {0x1E57, 0x1E56}, {0x1E59, 0x1E58}, {0x1E5B, 0x1E5A}, {0x1E5D, 0x1E5C},
-    {0x1E5F, 0x1E5E}, {0x1E61, 0x1E60}, {0x1E63, 0x1E62}, {0x1E65, 0x1E64},
-    {0x1E67, 0x1E66}, {0x1E69, 0x1E68}, {0x1E6B, 0x1E6A}, {0x1E6D, 0x1E6C},
-    {0x1E6F, 0x1E6E}, {0x1E71, 0x1E70}, {0x1E73, 0x1E72}, {0x1E75, 0x1E74},
-    {0x1E77, 0x1E76}, {0x1E79, 0x1E78}, {0x1E7B, 0x1E7A}, {0x1E7D, 0x1E7C},
-    {0x1E7F, 0x1E7E}, {0x1E81, 0x1E80}, {0x1E83, 0x1E82}, {0x1E85, 0x1E84},
-    {0x1E87, 0x1E86}, {0x1E89, 0x1E88}, {0x1E8B, 0x1E8A}, {0x1E8D, 0x1E8C},
-    {0x1E8F, 0x1E8E}, {0x1E91, 0x1E90}, {0x1E93, 0x1E92}, {0x1E95, 0x1E94},
-    {0x1E9B, 0x1E60}, {0x1EA1, 0x1EA0}, {0x1EA3, 0x1EA2}, {0x1EA5, 0x1EA4},
-    {0x1EA7, 0x1EA6}, {0x1EA9, 0x1EA8}, {0x1EAB, 0x1EAA}, {0x1EAD, 0x1EAC},
-    {0x1EAF, 0x1EAE}, {0x1EB1, 0x1EB0}, {0x1EB3, 0x1EB2}, {0x1EB5, 0x1EB4},
-    {0x1EB7, 0x1EB6}, {0x1EB9, 0x1EB8}, {0x1EBB, 0x1EBA}, {0x1EBD, 0x1EBC},
-    {0x1EBF, 0x1EBE}, {0x1EC1, 0x1EC0}, {0x1EC3, 0x1EC2}, {0x1EC5, 0x1EC4},
-    {0x1EC7, 0x1EC6}, {0x1EC9, 0x1EC8}, {0x1ECB, 0x1ECA}, {0x1ECD, 0x1ECC},
-    {0x1ECF, 0x1ECE}, {0x1ED1, 0x1ED0}, {0x1ED3, 0x1ED2}, {0x1ED5, 0x1ED4},
-    {0x1ED7, 0x1ED6}, {0x1ED9, 0x1ED8}, {0x1EDB, 0x1EDA}, {0x1EDD, 0x1EDC},
-    {0x1EDF, 0x1EDE}, {0x1EE1, 0x1EE0}, {0x1EE3, 0x1EE2}, {0x1EE5, 0x1EE4},
-    {0x1EE7, 0x1EE6}, {0x1EE9, 0x1EE8}, {0x1EEB, 0x1EEA}, {0x1EED, 0x1EEC},
-    {0x1EEF, 0x1EEE}, {0x1EF1, 0x1EF0}, {0x1EF3, 0x1EF2}, {0x1EF5, 0x1EF4},
-    {0x1EF7, 0x1EF6}, {0x1EF9, 0x1EF8}, {0x1EFB, 0x1EFA}, {0x1EFD, 0x1EFC},
-    {0x1EFF, 0x1EFE}, {0x1F00, 0x1F08}, {0x1F01, 0x1F09}, {0x1F02, 0x1F0A},
-    {0x1F03, 0x1F0B}, {0x1F04, 0x1F0C}, {0x1F05, 0x1F0D}, {0x1F06, 0x1F0E},
-    {0x1F07, 0x1F0F}, {0x1F10, 0x1F18}, {0x1F11, 0x1F19}, {0x1F12, 0x1F1A},
-    {0x1F13, 0x1F1B}, {0x1F14, 0x1F1C}, {0x1F15, 0x1F1D}, {0x1F20, 0x1F28},
-    {0x1F21, 0x1F29}, {0x1F22, 0x1F2A}, {0x1F23, 0x1F2B}, {0x1F24, 0x1F2C},
-    {0x1F25, 0x1F2D}, {0x1F26, 0x1F2E}, {0x1F27, 0x1F2F}, {0x1F30, 0x1F38},
-    {0x1F31, 0x1F39}, {0x1F32, 0x1F3A}, {0x1F33, 0x1F3B}, {0x1F34, 0x1F3C},
-    {0x1F35, 0x1F3D}, {0x1F36, 0x1F3E}, {0x1F37, 0x1F3F}, {0x1F40, 0x1F48},
-    {0x1F41, 0x1F49}, {0x1F42, 0x1F4A}, {0x1F43, 0x1F4B}, {0x1F44, 0x1F4C},
-    {0x1F45, 0x1F4D}, {0x1F51, 0x1F59}, {0x1F53, 0x1F5B}, {0x1F55, 0x1F5D},
-    {0x1F57, 0x1F5F}, {0x1F60, 0x1F68}, {0x1F61, 0x1F69}, {0x1F62, 0x1F6A},
-    {0x1F63, 0x1F6B}, {0x1F64, 0x1F6C}, {0x1F65, 0x1F6D}, {0x1F66, 0x1F6E},
-    {0x1F67, 0x1F6F}, {0x1F70, 0x1FBA}, {0x1F71, 0x1FBB}, {0x1F72, 0x1FC8},
-    {0x1F73, 0x1FC9}, {0x1F74, 0x1FCA}, {0x1F75, 0x1FCB}, {0x1F76, 0x1FDA},
-    {0x1F77, 0x1FDB}, {0x1F78, 0x1FF8}, {0x1F79, 0x1FF9}, {0x1F7A, 0x1FEA},
-    {0x1F7B, 0x1FEB}, {0x1F7C, 0x1FFA}, {0x1F7D, 0x1FFB}, {0x1F80, 0x1F88},
-    {0x1F81, 0x1F89}, {0x1F82, 0x1F8A}, {0x1F83, 0x1F8B}, {0x1F84, 0x1F8C},
-    {0x1F85, 0x1F8D}, {0x1F86, 0x1F8E}, {0x1F87, 0x1F8F}, {0x1F90, 0x1F98},
-    {0x1F91, 0x1F99}, {0x1F92, 0x1F9A}, {0x1F93, 0x1F9B}, {0x1F94, 0x1F9C},
-    {0x1F95, 0x1F9D}, {0x1F96, 0x1F9E}, {0x1F97, 0x1F9F}, {0x1FA0, 0x1FA8},
-    {0x1FA1, 0x1FA9}, {0x1FA2, 0x1FAA}, {0x1FA3, 0x1FAB}, {0x1FA4, 0x1FAC},
-    {0x1FA5, 0x1FAD}, {0x1FA6, 0x1FAE}, {0x1FA7, 0x1FAF}, {0x1FB0, 0x1FB8},
-    {0x1FB1, 0x1FB9}, {0x1FB3, 0x1FBC}, {0x1FBE, 0x399}, {0x1FC3, 0x1FCC},
-    {0x1FD0, 0x1FD8}, {0x1FD1, 0x1FD9}, {0x1FE0, 0x1FE8}, {0x1FE1, 0x1FE9},
-    {0x1FE5, 0x1FEC}, {0x1FF3, 0x1FFC}, {0x214E, 0x2132}, {0x2184, 0x2183},
-    {0x2C30, 0x2C00}, {0x2C31, 0x2C01}, {0x2C32, 0x2C02}, {0x2C33, 0x2C03},
-    {0x2C34, 0x2C04}, {0x2C35, 0x2C05}, {0x2C36, 0x2C06}, {0x2C37, 0x2C07},
-    {0x2C38, 0x2C08}, {0x2C39, 0x2C09}, {0x2C3A, 0x2C0A}, {0x2C3B, 0x2C0B},
-    {0x2C3C, 0x2C0C}, {0x2C3D, 0x2C0D}, {0x2C3E, 0x2C0E}, {0x2C3F, 0x2C0F},
-    {0x2C40, 0x2C10}, {0x2C41, 0x2C11}, {0x2C42, 0x2C12}, {0x2C43, 0x2C13},
-    {0x2C44, 0x2C14}, {0x2C45, 0x2C15}, {0x2C46, 0x2C16}, {0x2C47, 0x2C17},
-    {0x2C48, 0x2C18}, {0x2C49, 0x2C19}, {0x2C4A, 0x2C1A}, {0x2C4B, 0x2C1B},
-    {0x2C4C, 0x2C1C}, {0x2C4D, 0x2C1D}, {0x2C4E, 0x2C1E}, {0x2C4F, 0x2C1F},
-    {0x2C50, 0x2C20}, {0x2C51, 0x2C21}, {0x2C52, 0x2C22}, {0x2C53, 0x2C23},
-    {0x2C54, 0x2C24}, {0x2C55, 0x2C25}, {0x2C56, 0x2C26}, {0x2C57, 0x2C27},
-    {0x2C58, 0x2C28}, {0x2C59, 0x2C29}, {0x2C5A, 0x2C2A}, {0x2C5B, 0x2C2B},
-    {0x2C5C, 0x2C2C}, {0x2C5D, 0x2C2D}, {0x2C5E, 0x2C2E}, {0x2C5F, 0x2C2F},
-    {0x2C61, 0x2C60}, {0x2C65, 0x23A}, {0x2C66, 0x23E}, {0x2C68, 0x2C67},
-    {0x2C6A, 0x2C69}, {0x2C6C, 0x2C6B}, {0x2C73, 0x2C72}, {0x2C76, 0x2C75},
-    {0x2C81, 0x2C80}, {0x2C83, 0x2C82}, {0x2C85, 0x2C84}, {0x2C87, 0x2C86},
-    {0x2C89, 0x2C88}, {0x2C8B, 0x2C8A}, {0x2C8D, 0x2C8C}, {0x2C8F, 0x2C8E},
-    {0x2C91, 0x2C90}, {0x2C93, 0x2C92}, {0x2C95, 0x2C94}, {0x2C97, 0x2C96},
-    {0x2C99, 0x2C98}, {0x2C9B, 0x2C9A}, {0x2C9D, 0x2C9C}, {0x2C9F, 0x2C9E},
-    {0x2CA1, 0x2CA0}, {0x2CA3, 0x2CA2}, {0x2CA5, 0x2CA4}, {0x2CA7, 0x2CA6},
-    {0x2CA9, 0x2CA8}, {0x2CAB, 0x2CAA}, {0x2CAD, 0x2CAC}, {0x2CAF, 0x2CAE},
-    {0x2CB1, 0x2CB0}, {0x2CB3, 0x2CB2}, {0x2CB5, 0x2CB4}, {0x2CB7, 0x2CB6},
-    {0x2CB9, 0x2CB8}, {0x2CBB, 0x2CBA}, {0x2CBD, 0x2CBC}, {0x2CBF, 0x2CBE},
-    {0x2CC1, 0x2CC0}, {0x2CC3, 0x2CC2}, {0x2CC5, 0x2CC4}, {0x2CC7, 0x2CC6},
-    {0x2CC9, 0x2CC8}, {0x2CCB, 0x2CCA}, {0x2CCD, 0x2CCC}, {0x2CCF, 0x2CCE},
-    {0x2CD1, 0x2CD0}, {0x2CD3, 0x2CD2}, {0x2CD5, 0x2CD4}, {0x2CD7, 0x2CD6},
-    {0x2CD9, 0x2CD8}, {0x2CDB, 0x2CDA}, {0x2CDD, 0x2CDC}, {0x2CDF, 0x2CDE},
-    {0x2CE1, 0x2CE0}, {0x2CE3, 0x2CE2}, {0x2CEC, 0x2CEB}, {0x2CEE, 0x2CED},
-    {0x2CF3, 0x2CF2}, {0x2D00, 0x10A0}, {0x2D01, 0x10A1}, {0x2D02, 0x10A2},
-    {0x2D03, 0x10A3}, {0x2D04, 0x10A4}, {0x2D05, 0x10A5}, {0x2D06, 0x10A6},
-    {0x2D07, 0x10A7}, {0x2D08, 0x10A8}, {0x2D09, 0x10A9}, {0x2D0A, 0x10AA},
-    {0x2D0B, 0x10AB}, {0x2D0C, 0x10AC}, {0x2D0D, 0x10AD}, {0x2D0E, 0x10AE},
-    {0x2D0F, 0x10AF}, {0x2D10, 0x10B0}, {0x2D11, 0x10B1}, {0x2D12, 0x10B2},
-    {0x2D13, 0x10B3}, {0x2D14, 0x10B4}, {0x2D15, 0x10B5}, {0x2D16, 0x10B6},
-    {0x2D17, 0x10B7}, {0x2D18, 0x10B8}, {0x2D19, 0x10B9}, {0x2D1A, 0x10BA},
-    {0x2D1B, 0x10BB}, {0x2D1C, 0x10BC}, {0x2D1D, 0x10BD}, {0x2D1E, 0x10BE},
-    {0x2D1F, 0x10BF}, {0x2D20, 0x10C0}, {0x2D21, 0x10C1}, {0x2D22, 0x10C2},
-    {0x2D23, 0x10C3}, {0x2D24, 0x10C4}, {0x2D25, 0x10C5}, {0x2D27, 0x10C7},
-    {0x2D2D, 0x10CD}, {0xA641, 0xA640}, {0xA643, 0xA642}, {0xA645, 0xA644},
-    {0xA647, 0xA646}, {0xA649, 0xA648}, {0xA64B, 0xA64A}, {0xA64D, 0xA64C},
-    {0xA64F, 0xA64E}, {0xA651, 0xA650}, {0xA653, 0xA652}, {0xA655, 0xA654},
-    {0xA657, 0xA656}, {0xA659, 0xA658}, {0xA65B, 0xA65A}, {0xA65D, 0xA65C},
-    {0xA65F, 0xA65E}, {0xA661, 0xA660}, {0xA663, 0xA662}, {0xA665, 0xA664},
-    {0xA667, 0xA666}, {0xA669, 0xA668}, {0xA66B, 0xA66A}, {0xA66D, 0xA66C},
-    {0xA681, 0xA680}, {0xA683, 0xA682}, {0xA685, 0xA684}, {0xA687, 0xA686},
-    {0xA689, 0xA688}, {0xA68B, 0xA68A}, {0xA68D, 0xA68C}, {0xA68F, 0xA68E},
-    {0xA691, 0xA690}, {0xA693, 0xA692}, {0xA695, 0xA694}, {0xA697, 0xA696},
-    {0xA699, 0xA698}, {0xA69B, 0xA69A}, {0xA723, 0xA722}, {0xA725, 0xA724},
-    {0xA727, 0xA726}, {0xA729, 0xA728}, {0xA72B, 0xA72A}, {0xA72D, 0xA72C},
-    {0xA72F, 0xA72E}, {0xA733, 0xA732}, {0xA735, 0xA734}, {0xA737, 0xA736},
-    {0xA739, 0xA738}, {0xA73B, 0xA73A}, {0xA73D, 0xA73C}, {0xA73F, 0xA73E},
-    {0xA741, 0xA740}, {0xA743, 0xA742}, {0xA745, 0xA744}, {0xA747, 0xA746},
-    {0xA749, 0xA748}, {0xA74B, 0xA74A}, {0xA74D, 0xA74C}, {0xA74F, 0xA74E},
-    {0xA751, 0xA750}, {0xA753, 0xA752}, {0xA755, 0xA754}, {0xA757, 0xA756},
-    {0xA759, 0xA758}, {0xA75B, 0xA75A}, {0xA75D, 0xA75C}, {0xA75F, 0xA75E},
-    {0xA761, 0xA760}, {0xA763, 0xA762}, {0xA765, 0xA764}, {0xA767, 0xA766},
-    {0xA769, 0xA768}, {0xA76B, 0xA76A}, {0xA76D, 0xA76C}, {0xA76F, 0xA76E},
-    {0xA77A, 0xA779}, {0xA77C, 0xA77B}, {0xA77F, 0xA77E}, {0xA781, 0xA780},
-    {0xA783, 0xA782}, {0xA785, 0xA784}, {0xA787, 0xA786}, {0xA78C, 0xA78B},
-    {0xA791, 0xA790}, {0xA793, 0xA792}, {0xA794, 0xA7C4}, {0xA797, 0xA796},
-    {0xA799, 0xA798}, {0xA79B, 0xA79A}, {0xA79D, 0xA79C}, {0xA79F, 0xA79E},
-    {0xA7A1, 0xA7A0}, {0xA7A3, 0xA7A2}, {0xA7A5, 0xA7A4}, {0xA7A7, 0xA7A6},
-    {0xA7A9, 0xA7A8}, {0xA7B5, 0xA7B4}, {0xA7B7, 0xA7B6}, {0xA7B9, 0xA7B8},
-    {0xA7BB, 0xA7BA}, {0xA7BD, 0xA7BC}, {0xA7BF, 0xA7BE}, {0xA7C1, 0xA7C0},
-    {0xA7C3, 0xA7C2}, {0xA7C8, 0xA7C7}, {0xA7CA, 0xA7C9}, {0xA7CD, 0xA7CC},
-    {0xA7CF, 0xA7CE}, {0xA7D1, 0xA7D0}, {0xA7D3, 0xA7D2}, {0xA7D5, 0xA7D4},
-    {0xA7D7, 0xA7D6}, {0xA7D9, 0xA7D8}, {0xA7DB, 0xA7DA}, {0xA7F6, 0xA7F5},
-    {0xAB53, 0xA7B3}, {0xAB70, 0x13A0}, {0xAB71, 0x13A1}, {0xAB72, 0x13A2},
-    {0xAB73, 0x13A3}, {0xAB74, 0x13A4}, {0xAB75, 0x13A5}, {0xAB76, 0x13A6},
-    {0xAB77, 0x13A7}, {0xAB78, 0x13A8}, {0xAB79, 0x13A9}, {0xAB7A, 0x13AA},
-    {0xAB7B, 0x13AB}, {0xAB7C, 0x13AC}, {0xAB7D, 0x13AD}, {0xAB7E, 0x13AE},
-    {0xAB7F, 0x13AF}, {0xAB80, 0x13B0}, {0xAB81, 0x13B1}, {0xAB82, 0x13B2},
-    {0xAB83, 0x13B3}, {0xAB84, 0x13B4}, {0xAB85, 0x13B5}, {0xAB86, 0x13B6},
-    {0xAB87, 0x13B7}, {0xAB88, 0x13B8}, {0xAB89, 0x13B9}, {0xAB8A, 0x13BA},
-    {0xAB8B, 0x13BB}, {0xAB8C, 0x13BC}, {0xAB8D, 0x13BD}, {0xAB8E, 0x13BE},
-    {0xAB8F, 0x13BF}, {0xAB90, 0x13C0}, {0xAB91, 0x13C1}, {0xAB92, 0x13C2},
-    {0xAB93, 0x13C3}, {0xAB94, 0x13C4}, {0xAB95, 0x13C5}, {0xAB96, 0x13C6},
-    {0xAB97, 0x13C7}, {0xAB98, 0x13C8}, {0xAB99, 0x13C9}, {0xAB9A, 0x13CA},
-    {0xAB9B, 0x13CB}, {0xAB9C, 0x13CC}, {0xAB9D, 0x13CD}, {0xAB9E, 0x13CE},
-    {0xAB9F, 0x13CF}, {0xABA0, 0x13D0}, {0xABA1, 0x13D1}, {0xABA2, 0x13D2},
-    {0xABA3, 0x13D3}, {0xABA4, 0x13D4}, {0xABA5, 0x13D5}, {0xABA6, 0x13D6},
-    {0xABA7, 0x13D7}, {0xABA8, 0x13D8}, {0xABA9, 0x13D9}, {0xABAA, 0x13DA},
-    {0xABAB, 0x13DB}, {0xABAC, 0x13DC}, {0xABAD, 0x13DD}, {0xABAE, 0x13DE},
-    {0xABAF, 0x13DF}, {0xABB0, 0x13E0}, {0xABB1, 0x13E1}, {0xABB2, 0x13E2},
-    {0xABB3, 0x13E3}, {0xABB4, 0x13E4}, {0xABB5, 0x13E5}, {0xABB6, 0x13E6},
-    {0xABB7, 0x13E7}, {0xABB8, 0x13E8}, {0xABB9, 0x13E9}, {0xABBA, 0x13EA},
-    {0xABBB, 0x13EB}, {0xABBC, 0x13EC}, {0xABBD, 0x13ED}, {0xABBE, 0x13EE},
-    {0xABBF, 0x13EF}, {0xFF41, 0xFF21}, {0xFF42, 0xFF22}, {0xFF43, 0xFF23},
-    {0xFF44, 0xFF24}, {0xFF45, 0xFF25}, {0xFF46, 0xFF26}, {0xFF47, 0xFF27},
-    {0xFF48, 0xFF28}, {0xFF49, 0xFF29}, {0xFF4A, 0xFF2A}, {0xFF4B, 0xFF2B},
-    {0xFF4C, 0xFF2C}, {0xFF4D, 0xFF2D}, {0xFF4E, 0xFF2E}, {0xFF4F, 0xFF2F},
-    {0xFF50, 0xFF30}, {0xFF51, 0xFF31}, {0xFF52, 0xFF32}, {0xFF53, 0xFF33},
-    {0xFF54, 0xFF34}, {0xFF55, 0xFF35}, {0xFF56, 0xFF36}, {0xFF57, 0xFF37},
-    {0xFF58, 0xFF38}, {0xFF59, 0xFF39}, {0xFF5A, 0xFF3A}, {0x10428, 0x10400},
-    {0x10429, 0x10401}, {0x1042A, 0x10402}, {0x1042B, 0x10403},
-    {0x1042C, 0x10404}, {0x1042D, 0x10405}, {0x1042E, 0x10406},
-    {0x1042F, 0x10407}, {0x10430, 0x10408}, {0x10431, 0x10409},
-    {0x10432, 0x1040A}, {0x10433, 0x1040B}, {0x10434, 0x1040C},
-    {0x10435, 0x1040D}, {0x10436, 0x1040E}, {0x10437, 0x1040F},
-    {0x10438, 0x10410}, {0x10439, 0x10411}, {0x1043A, 0x10412},
-    {0x1043B, 0x10413}, {0x1043C, 0x10414}, {0x1043D, 0x10415},
-    {0x1043E, 0x10416}, {0x1043F, 0x10417}, {0x10440, 0x10418},
-    {0x10441, 0x10419}, {0x10442, 0x1041A}, {0x10443, 0x1041B},
-    {0x10444, 0x1041C}, {0x10445, 0x1041D}, {0x10446, 0x1041E},
-    {0x10447, 0x1041F}, {0x10448, 0x10420}, {0x10449, 0x10421},
-    {0x1044A, 0x10422}, {0x1044B, 0x10423}, {0x1044C, 0x10424},
-    {0x1044D, 0x10425}, {0x1044E, 0x10426}, {0x1044F, 0x10427},
-    {0x104D8, 0x104B0}, {0x104D9, 0x104B1}, {0x104DA, 0x104B2},
-    {0x104DB, 0x104B3}, {0x104DC, 0x104B4}, {0x104DD, 0x104B5},
-    {0x104DE, 0x104B6}, {0x104DF, 0x104B7}, {0x104E0, 0x104B8},
-    {0x104E1, 0x104B9}, {0x104E2, 0x104BA}, {0x104E3, 0x104BB},
-    {0x104E4, 0x104BC}, {0x104E5, 0x104BD}, {0x104E6, 0x104BE},
-    {0x104E7, 0x104BF}, {0x104E8, 0x104C0}, {0x104E9, 0x104C1},
-    {0x104EA, 0x104C2}, {0x104EB, 0x104C3}, {0x104EC, 0x104C4},
-    {0x104ED, 0x104C5}, {0x104EE, 0x104C6}, {0x104EF, 0x104C7},
-    {0x104F0, 0x104C8}, {0x104F1, 0x104C9}, {0x104F2, 0x104CA},
-    {0x104F3, 0x104CB}, {0x104F4, 0x104CC}, {0x104F5, 0x104CD},
-    {0x104F6, 0x104CE}, {0x104F7, 0x104CF}, {0x104F8, 0x104D0},
-    {0x104F9, 0x104D1}, {0x104FA, 0x104D2}, {0x104FB, 0x104D3},
-    {0x10597, 0x10570}, {0x10598, 0x10571}, {0x10599, 0x10572},
-    {0x1059A, 0x10573}, {0x1059B, 0x10574}, {0x1059C, 0x10575},
-    {0x1059D, 0x10576}, {0x1059E, 0x10577}, {0x1059F, 0x10578},
-    {0x105A0, 0x10579}, {0x105A1, 0x1057A}, {0x105A3, 0x1057C},
-    {0x105A4, 0x1057D}, {0x105A5, 0x1057E}, {0x105A6, 0x1057F},
-    {0x105A7, 0x10580}, {0x105A8, 0x10581}, {0x105A9, 0x10582},
-    {0x105AA, 0x10583}, {0x105AB, 0x10584}, {0x105AC, 0x10585},
-    {0x105AD, 0x10586}, {0x105AE, 0x10587}, {0x105AF, 0x10588},
-    {0x105B0, 0x10589}, {0x105B1, 0x1058A}, {0x105B3, 0x1058C},
-    {0x105B4, 0x1058D}, {0x105B5, 0x1058E}, {0x105B6, 0x1058F},
-    {0x105B7, 0x10590}, {0x105B8, 0x10591}, {0x105B9, 0x10592},
-    {0x105BB, 0x10594}, {0x105BC, 0x10595}, {0x10CC0, 0x10C80},
-    {0x10CC1, 0x10C81}, {0x10CC2, 0x10C82}, {0x10CC3, 0x10C83},
-    {0x10CC4, 0x10C84}, {0x10CC5, 0x10C85}, {0x10CC6, 0x10C86},
-    {0x10CC7, 0x10C87}, {0x10CC8, 0x10C88}, {0x10CC9, 0x10C89},
-    {0x10CCA, 0x10C8A}, {0x10CCB, 0x10C8B}, {0x10CCC, 0x10C8C},
-    {0x10CCD, 0x10C8D}, {0x10CCE, 0x10C8E}, {0x10CCF, 0x10C8F},
-    {0x10CD0, 0x10C90}, {0x10CD1, 0x10C91}, {0x10CD2, 0x10C92},
-    {0x10CD3, 0x10C93}, {0x10CD4, 0x10C94}, {0x10CD5, 0x10C95},
-    {0x10CD6, 0x10C96}, {0x10CD7, 0x10C97}, {0x10CD8, 0x10C98},
-    {0x10CD9, 0x10C99}, {0x10CDA, 0x10C9A}, {0x10CDB, 0x10C9B},
-    {0x10CDC, 0x10C9C}, {0x10CDD, 0x10C9D}, {0x10CDE, 0x10C9E},
-    {0x10CDF, 0x10C9F}, {0x10CE0, 0x10CA0}, {0x10CE1, 0x10CA1},
-    {0x10CE2, 0x10CA2}, {0x10CE3, 0x10CA3}, {0x10CE4, 0x10CA4},
-    {0x10CE5, 0x10CA5}, {0x10CE6, 0x10CA6}, {0x10CE7, 0x10CA7},
-    {0x10CE8, 0x10CA8}, {0x10CE9, 0x10CA9}, {0x10CEA, 0x10CAA},
-    {0x10CEB, 0x10CAB}, {0x10CEC, 0x10CAC}, {0x10CED, 0x10CAD},
-    {0x10CEE, 0x10CAE}, {0x10CEF, 0x10CAF}, {0x10CF0, 0x10CB0},
-    {0x10CF1, 0x10CB1}, {0x10CF2, 0x10CB2}, {0x10D70, 0x10D50},
-    {0x10D71, 0x10D51}, {0x10D72, 0x10D52}, {0x10D73, 0x10D53},
-    {0x10D74, 0x10D54}, {0x10D75, 0x10D55}, {0x10D76, 0x10D56},
-    {0x10D77, 0x10D57}, {0x10D78, 0x10D58}, {0x10D79, 0x10D59},
-    {0x10D7A, 0x10D5A}, {0x10D7B, 0x10D5B}, {0x10D7C, 0x10D5C},
-    {0x10D7D, 0x10D5D}, {0x10D7E, 0x10D5E}, {0x10D7F, 0x10D5F},
-    {0x10D80, 0x10D60}, {0x10D81, 0x10D61}, {0x10D82, 0x10D62},
-    {0x10D83, 0x10D63}, {0x10D84, 0x10D64}, {0x10D85, 0x10D65},
-    {0x118C0, 0x118A0}, {0x118C1, 0x118A1}, {0x118C2, 0x118A2},
-    {0x118C3, 0x118A3}, {0x118C4, 0x118A4}, {0x118C5, 0x118A5},
-    {0x118C6, 0x118A6}, {0x118C7, 0x118A7}, {0x118C8, 0x118A8},
-    {0x118C9, 0x118A9}, {0x118CA, 0x118AA}, {0x118CB, 0x118AB},
-    {0x118CC, 0x118AC}, {0x118CD, 0x118AD}, {0x118CE, 0x118AE},
-    {0x118CF, 0x118AF}, {0x118D0, 0x118B0}, {0x118D1, 0x118B1},
-    {0x118D2, 0x118B2}, {0x118D3, 0x118B3}, {0x118D4, 0x118B4},
-    {0x118D5, 0x118B5}, {0x118D6, 0x118B6}, {0x118D7, 0x118B7},
-    {0x118D8, 0x118B8}, {0x118D9, 0x118B9}, {0x118DA, 0x118BA},
-    {0x118DB, 0x118BB}, {0x118DC, 0x118BC}, {0x118DD, 0x118BD},
-    {0x118DE, 0x118BE}, {0x118DF, 0x118BF}, {0x16E60, 0x16E40},
-    {0x16E61, 0x16E41}, {0x16E62, 0x16E42}, {0x16E63, 0x16E43},
-    {0x16E64, 0x16E44}, {0x16E65, 0x16E45}, {0x16E66, 0x16E46},
-    {0x16E67, 0x16E47}, {0x16E68, 0x16E48}, {0x16E69, 0x16E49},
-    {0x16E6A, 0x16E4A}, {0x16E6B, 0x16E4B}, {0x16E6C, 0x16E4C},
-    {0x16E6D, 0x16E4D}, {0x16E6E, 0x16E4E}, {0x16E6F, 0x16E4F},
-    {0x16E70, 0x16E50}, {0x16E71, 0x16E51}, {0x16E72, 0x16E52},
-    {0x16E73, 0x16E53}, {0x16E74, 0x16E54}, {0x16E75, 0x16E55},
-    {0x16E76, 0x16E56}, {0x16E77, 0x16E57}, {0x16E78, 0x16E58},
-    {0x16E79, 0x16E59}, {0x16E7A, 0x16E5A}, {0x16E7B, 0x16E5B},
-    {0x16E7C, 0x16E5C}, {0x16E7D, 0x16E5D}, {0x16E7E, 0x16E5E},
-    {0x16E7F, 0x16E5F}, {0x16EBB, 0x16EA0}, {0x16EBC, 0x16EA1},
-    {0x16EBD, 0x16EA2}, {0x16EBE, 0x16EA3}, {0x16EBF, 0x16EA4},
-    {0x16EC0, 0x16EA5}, {0x16EC1, 0x16EA6}, {0x16EC2, 0x16EA7},
-    {0x16EC3, 0x16EA8}, {0x16EC4, 0x16EA9}, {0x16EC5, 0x16EAA},
-    {0x16EC6, 0x16EAB}, {0x16EC7, 0x16EAC}, {0x16EC8, 0x16EAD},
-    {0x16EC9, 0x16EAE}, {0x16ECA, 0x16EAF}, {0x16ECB, 0x16EB0},
-    {0x16ECC, 0x16EB1}, {0x16ECD, 0x16EB2}, {0x16ECE, 0x16EB3},
-    {0x16ECF, 0x16EB4}, {0x16ED0, 0x16EB5}, {0x16ED1, 0x16EB6},
-    {0x16ED2, 0x16EB7}, {0x16ED3, 0x16EB8}, {0x1E922, 0x1E900},
-    {0x1E923, 0x1E901}, {0x1E924, 0x1E902}, {0x1E925, 0x1E903},
-    {0x1E926, 0x1E904}, {0x1E927, 0x1E905}, {0x1E928, 0x1E906},
-    {0x1E929, 0x1E907}, {0x1E92A, 0x1E908}, {0x1E92B, 0x1E909},
-    {0x1E92C, 0x1E90A}, {0x1E92D, 0x1E90B}, {0x1E92E, 0x1E90C},
-    {0x1E92F, 0x1E90D}, {0x1E930, 0x1E90E}, {0x1E931, 0x1E90F},
-    {0x1E932, 0x1E910}, {0x1E933, 0x1E911}, {0x1E934, 0x1E912},
-    {0x1E935, 0x1E913}, {0x1E936, 0x1E914}, {0x1E937, 0x1E915},
-    {0x1E938, 0x1E916}, {0x1E939, 0x1E917}, {0x1E93A, 0x1E918},
-    {0x1E93B, 0x1E919}, {0x1E93C, 0x1E91A}, {0x1E93D, 0x1E91B},
-    {0x1E93E, 0x1E91C}, {0x1E93F, 0x1E91D}, {0x1E940, 0x1E91E},
-    {0x1E941, 0x1E91F}, {0x1E942, 0x1E920}, {0x1E943, 0x1E921}
diff --git a/libc/src/__support/wctype/perfect_hash_map.h b/libc/src/__support/wctype/perfect_hash_map.h
new file mode 100644
index 0000000000000..2832723121ce4
--- /dev/null
+++ b/libc/src/__support/wctype/perfect_hash_map.h
@@ -0,0 +1,876 @@
+//===-- Perfect hash map for conversion functions ---------------*- C++ -*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_LIBC_SRC___SUPPORT_WCTYPE_PTR_HASH_H
+#define LLVM_LIBC_SRC___SUPPORT_WCTYPE_PTR_HASH_H
+
+#define LIBC_ENABLE_CONSTEXPR 1
+
+#include "hdr/types/size_t.h"
+#include "hdr/types/wint_t.h"
+#include "src/__support/CPP/array.h"
+#include "src/__support/CPP/expected.h"
+#include "src/__support/CPP/monostate.h"
+#include "src/__support/CPP/optional.h"
+#include "src/__support/CPP/span.h"
+#include "src/__support/CPP/string.h"
+#include "src/__support/CPP/tuple.h"
+#include "src/__support/CPP/type_traits/is_unsigned.h"
+#include "src/__support/OSUtil/io.h"
+#include "src/__support/math/ceil.h"
+#include "src/__support/math/log.h"
+
+#undef LIBC_ENABLE_CONSTEXPR
+
+namespace LIBC_NAMESPACE_DECL {
+
+namespace ptrhash {
+
+LIBC_INLINE_VAR constexpr size_t SHARDS = 1;
+
+class Fastrand {
+public:
+  // This seed value is very important for different inputs. Bad values are
+  // known to cause compilation errors and/or incorrect computations in some
+  // cases. Defaulted to 0xEF6F79ED30BA75A in the original implementation, but
+  // this is not sufficient. 0x64a727ea04c46a32 is another viable seed.
+  LIBC_INLINE constexpr Fastrand() : seed(0xeec13c9f1362aa74) {}
+
+  LIBC_INLINE constexpr uint8_t gen_byte() {
+    return static_cast<uint8_t>(this->gen());
+  }
+
+  LIBC_INLINE constexpr uint64_t gen() {
+    constexpr uint64_t WY_CONST_0 = 0x2d35'8dcc'aa6c'78a5;
+    constexpr uint64_t WY_CONST_1 = 0x8bb8'4b93'962e'acc9;
+
+    auto s = wrapping_add(seed, WY_CONST_0);
+    seed = s;
+    auto const t =
+        static_cast<__uint128_t>(s) * static_cast<__uint128_t>(s ^ WY_CONST_1);
+    return static_cast<uint64_t>(t) ^ static_cast<uint64_t>(t >> 64);
+  }
+
+private:
+  template <typename T> LIBC_INLINE static constexpr T wrapping_add(T a, T b) {
+    while (b != 0) {
+      T carry = a & b;
+      a = a ^ b;
+      b = carry << 1;
+    }
+    return a;
+  }
+
+private:
+  uint64_t seed;
+};
+
+LIBC_INLINE_VAR constexpr auto BUCKET_IDX_NONE = ~static_cast<uint32_t>(0);
+
+template <size_t MaxSize = 5> class BinaryHeap {
+public:
+  LIBC_INLINE constexpr BinaryHeap() = default;
+
+  LIBC_INLINE constexpr void push(const cpp::tuple<size_t, uint32_t> &value) {
+    if (current_size >= MaxSize)
+      return;
+    data[current_size++] = value;
+  }
+
+  LIBC_INLINE constexpr cpp::tuple<size_t, uint32_t> pop() {
+    if (current_size == 0)
+      return {};
+    size_t max_idx = 0;
+    for (size_t i = 1; i < current_size; ++i) {
+      if (cmp(data[max_idx], data[i]))
+        max_idx = i;
+    }
+    auto top = data[max_idx];
+    data[max_idx] = data[current_size - 1];
+    --current_size;
+    return top;
+  }
+
+  LIBC_INLINE constexpr const cpp::tuple<size_t, uint32_t> &peek() const {
+    size_t max_idx = 0;
+    for (size_t i = 1; i < current_size; ++i) {
+      if (cmp(data[max_idx], data[i]))
+        max_idx = i;
+    }
+    return data[max_idx];
+  }
+
+  LIBC_INLINE constexpr bool empty() const { return current_size == 0; }
+
+private:
+  LIBC_INLINE static constexpr bool cmp(cpp::tuple<size_t, uint32_t> x,
+                                        cpp::tuple<size_t, uint32_t> y) {
+    return cpp::get<0>(x) < cpp::get<0>(y) ||
+           (!(cpp::get<0>(y) < cpp::get<0>(x)) &&
+            cpp::get<1>(x) < cpp::get<1>(y));
+  }
+
+private:
+  cpp::array<cpp::tuple<size_t, uint32_t>, MaxSize> data{};
+  size_t current_size{};
+};
+
+template <typename T> LIBC_INLINE constexpr bool is_power_of_two(T x) {
+  static_assert(cpp::is_unsigned_v<T>,
+                "is_power_of_two requires unsigned type");
+  return x != 0 && (x & (x - 1)) == 0;
+}
+
+LIBC_INLINE constexpr size_t get_parts(size_t n) {
+  size_t parts = 0;
+  auto eps = 0.01 / 2.0;
+  auto x = static_cast<double>(n) * eps * eps / 2.0;
+  auto target_parts = static_cast<size_t>(x / math::log(x));
+  auto parts_per_shard = target_parts / SHARDS;
+  parts = ((parts_per_shard > 1) ? parts_per_shard : 1) * SHARDS;
+  return parts;
+}
+
+LIBC_INLINE constexpr size_t get_slots_per_part(size_t keys_per_part) {
+  size_t slots_per_part =
+      static_cast<size_t>(static_cast<double>(keys_per_part) / 0.99);
+  if (is_power_of_two(slots_per_part)) {
+    slots_per_part += 1;
+  }
+  return slots_per_part;
+}
+
+template <size_t n> class PtrhashConfig {
+public:
+  LIBC_INLINE_VAR static constexpr size_t PARTS = get_parts(n);
+  LIBC_INLINE_VAR static constexpr size_t KEYS_PER_PART = n / PARTS;
+  LIBC_INLINE_VAR static constexpr size_t PARTS_PER_SHARD = PARTS / SHARDS;
+  LIBC_INLINE_VAR static constexpr size_t SLOTS_PER_PART =
+      get_slots_per_part(KEYS_PER_PART);
+  LIBC_INLINE_VAR static constexpr size_t SLOTS_TOTAL = PARTS * SLOTS_PER_PART;
+  LIBC_INLINE_VAR static constexpr size_t BUCKETS_PER_PART =
+      math::ceil(KEYS_PER_PART / 3.0) + 3;
+  LIBC_INLINE_VAR static constexpr size_t BUCKETS_TOTAL =
+      PARTS * BUCKETS_PER_PART;
+};
+
+template <size_t n_, size_t parts_, size_t parts_per_shard_,
+          size_t slots_total_, size_t buckets_total_, size_t slots_,
+          size_t buckets_, typename Key = uint64_t,
+          typename F = cpp::array<uint32_t, slots_total_ - n_>,
+          typename PilotsTypeV = cpp::array<uint8_t, buckets_total_>>
+class PtrHash {
+public:
+  static_assert(
+      cpp::is_same_v<PilotsTypeV, cpp::span<uint8_t>> ||
+          cpp::is_same_v<PilotsTypeV, cpp::array<uint8_t, buckets_total_>>,
+      "V must be a byte slice or byte vector");
+
+  uint64_t seed;
+  PilotsTypeV pilots;
+  F remap;
+
+  LIBC_INLINE constexpr PtrHash(uint64_t seed_, PilotsTypeV pilots_, F remap_)
+      : seed(seed_), pilots(pilots_), remap(remap_) {}
+
+  LIBC_INLINE constexpr PtrHash(const PtrHash &) = default;
+  LIBC_INLINE constexpr PtrHash(PtrHash &&) = default;
+
+  LIBC_INLINE constexpr PtrHash &operator=(const PtrHash &) = default;
+  LIBC_INLINE constexpr PtrHash &operator=(PtrHash &&) = default;
+
+  LIBC_INLINE constexpr size_t index(Key key) const {
+    auto slot = this->index_no_remap(key);
+
+    if (slot < n_) {
+      return slot;
+    }
+
+    return this->remap[slot - n_];
+  }
+
+  LIBC_INLINE constexpr size_t index_no_remap(Key key) const {
+    auto hx = this->hash_key(key);
+    auto b = this->bucket(hx);
+    auto pilot = this->pilots[b];
+    return this->slot(hx, pilot);
+  }
+
+  LIBC_INLINE constexpr size_t slot(uint64_t hx, uint64_t pilot) const {
+    return (this->part(hx) * slots_) + this->slot_in_part(hx, pilot);
+  }
+
+  LIBC_INLINE constexpr size_t slot_in_part(uint64_t hx, uint64_t pilot) const {
+    return this->slot_in_part_hp(hx, this->hash_pilot(pilot));
+  }
+
+  LIBC_INLINE constexpr cpp::optional<cpp::tuple<uint64_t, PilotsTypeV, F>>
+  compute_pilots(const cpp::array<Key, n_> &keys) {
+    cpp::array<cpp::array<bool, slots_>, parts_> taken{};
+    for (cpp::array<bool, slots_> &t : taken) {
+      for (size_t i = 0; i < slots_; i++) {
+        t[i] = 0;
+      }
+    }
+    PilotsTypeV pilots{};
+
+    size_t tries = 0;
+    constexpr size_t MAX_TRIES = 10;
+
+    // hard code random numbers for the generator to make it simpler
+    constexpr uint64_t STDRNG[MAX_TRIES] = {
+        0x1a275d28e2768536, 0x72737b411117ac11, 0xeb08f8fcd423148f,
+        0x1d6f85975d49be9e, 0xf03250d1c097577,  0xac6e884d8db1fa90,
+        0x4415d98c0c03a79f, 0xa36bfbcfddf4d5e6, 0x154aef1f436d8e98,
+        0xd21f78471475f18e};
+
+    while (true) {
+      bool contd = false;
+      tries += 1;
+      if (tries > MAX_TRIES) {
+        return {};
+      }
+
+      this->seed = STDRNG[tries - 1];
+      pilots = PilotsTypeV{0};
+
+      for (auto &t : taken)
+        for (size_t e = 0; e < pilots.size(); e++)
+          t[e] = false;
+
+      auto shard_hashes = this->shards(keys);
+
+      const size_t pilots_chunk_size =
+          cpp::max(buckets_ * parts_per_shard_, static_cast<size_t>(1));
+      const size_t taken_chunk_size = parts_per_shard_;
+      const size_t num_pilots_chunks =
+          (pilots.size() + pilots_chunk_size - 1) / pilots_chunk_size;
+      const size_t num_taken_chunks =
+          (taken.size() + taken_chunk_size - 1) / taken_chunk_size;
+
+      for (size_t shard = 0;
+           shard < cpp::min(shard_hashes.size(),
+                            cpp::min(num_pilots_chunks, num_taken_chunks));
+           shard++) {
+        cpp::array<uint64_t, n_> hashes = shard_hashes[shard];
+
+        size_t pilots_begin = shard * pilots_chunk_size;
+        size_t pilots_end =
+            cpp::min(pilots_begin + pilots_chunk_size, pilots.size());
+
+        size_t taken_begin = shard * taken_chunk_size;
+        size_t taken_end =
+            cpp::min(taken_begin + taken_chunk_size, taken.size());
+
+        cpp::optional<cpp::tuple<cpp::array<uint64_t, n_>,
+                                 cpp::array<uint32_t, parts_per_shard_ + 1>>>
+            sorted_parts = this->sort_parts(shard, hashes);
+        if (!sorted_parts) {
+          contd = true;
+          break;
+        }
+
+        auto &[new_hashes, part_starts] = sorted_parts.value();
+
+        if (!this->build_shard(shard, new_hashes, part_starts, pilots,
+                               pilots_begin, pilots_end, taken_begin, taken_end,
+                               taken)) {
+          contd = true;
+          break;
+        }
+      }
+      if (contd) {
+        continue;
+      }
+
+      auto const remap = this->remap_free_slots(taken);
+
+      if (!remap) {
+        continue;
+      }
+      break;
+    }
+    this->pilots = pilots;
+
+    return {{this->seed, this->pilots, this->remap}};
+  }
+
+  LIBC_INLINE constexpr cpp::expected<cpp::monostate, cpp::nullopt_t>
+  remap_free_slots(cpp::array<cpp::array<bool, slots_>, parts_> &taken) {
+    cpp::array<size_t, parts_> val{};
+    for (size_t i = 0; i < taken.size(); ++i) {
+      size_t counter = 0;
+      for (auto element : taken[i]) {
+        if (!element) {
+          counter++;
+        }
+      }
+      val[i] = counter;
+    }
+
+    size_t acc = 0;
+    for (const auto &item : val) {
+      acc += item;
+    }
+
+    if (acc != slots_total_ - n_) {
+      write_to_stderr("Not the right number of free slots left!\n");
+      write_to_stderr(" total slots ");
+      write_to_stderr(cpp::to_string(slots_total_));
+      write_to_stderr(" - n ");
+      write_to_stderr(cpp::to_string(n_));
+      write_to_stderr("\n");
+      return cpp::unexpected(cpp::nullopt);
+    }
+
+    if (slots_total_ == n_) {
+      return cpp::monostate{};
+    }
+
+    cpp::array<uint64_t, slots_total_ - n_> v{};
+    size_t v_idx = 0;
+
+    auto const get = [&](cpp::array<cpp::array<bool, slots_>, parts_> &t,
+                         size_t idx) { return t[idx / slots_][idx % slots_]; };
+
+    size_t p = 0;
+    for (const auto &t : taken) {
+      auto const offset = p * slots_;
+      for (size_t idx = 0; idx < t.size(); idx++) {
+        if (!t[idx]) {
+          auto result = offset + idx;
+          if (result < n_) {
+            while (!get(taken, n_ + v_idx)) {
+              v[v_idx++] = result;
+            }
+            v[v_idx++] = result;
+          }
+        }
+      }
+      p++;
+    }
+
+    for (size_t i = 0; i < v.size(); i++) {
+      this->remap[i] = static_cast<uint32_t>(v[i]);
+    }
+
+    return cpp::monostate{};
+  }
+
+  LIBC_INLINE constexpr auto shards(const cpp::array<Key, n_> &keys) const {
+    return this->no_sharding(keys);
+  }
+
+  LIBC_INLINE constexpr cpp::array<cpp::array<uint64_t, n_>, 1>
+  no_sharding(const cpp::array<Key, n_> &keys) const {
+    cpp::array<uint64_t, n_> ret;
+    for (size_t i = 0; i < keys.size(); i++) {
+      ret[i] = this->hash_key(keys[i]);
+    }
+    return {ret};
+  }
+
+  LIBC_INLINE constexpr uint64_t hash_key(Key x) const {
+    uint64_t value = 0;
+    constexpr uint64_t BITS = sizeof(uint64_t) * 8;
+    value = ((value << 5) | (value >> (BITS - 5))) ^ x;
+    value *= 0x517cc1b727220a95;
+    return value ^ this->seed;
+  }
+
+  LIBC_INLINE constexpr cpp::optional<cpp::tuple<
+      cpp::array<uint64_t, n_>, cpp::array<uint32_t, parts_per_shard_ + 1>>>
+  sort_parts(size_t shard, cpp::array<uint64_t, n_> hashes) const {
+    for (size_t i = 0; i < hashes.size(); i++) {
+      for (size_t j = i + 1; j < hashes.size(); j++) {
+        if (hashes[i] > hashes[j]) {
+          auto temp = hashes[i];
+          hashes[i] = hashes[j];
+          hashes[j] = temp;
+        }
+      }
+    }
+
+    bool distinct = true;
+    for (size_t i = 1; i < hashes.size(); ++i) {
+      if (hashes[i] == hashes[i - 1]) {
+        distinct = false;
+        break;
+      }
+    }
+
+    if (!distinct) {
+      write_to_stderr("Hashes are not distinct\n");
+      return cpp::nullopt;
+    }
+
+    if (!hashes.empty()) {
+      LIBC_ASSERT(shard * parts_per_shard_ <= this->part(hashes[0]));
+      LIBC_ASSERT(this->part(hashes[hashes.size() - 1]) <
+                  (shard + 1) * parts_per_shard_);
+    }
+
+    cpp::array<uint32_t, parts_per_shard_ + 1> part_starts{};
+
+    for (size_t part_in_shard = 1; part_in_shard < parts_per_shard_ + 1;
+         ++part_in_shard) {
+      auto it = cpp::lower_bound(
+          hashes.begin(), hashes.end(),
+          shard * parts_per_shard_ + part_in_shard,
+          [&](uint64_t h, uint64_t k) { return this->part(h) < k; });
+
+      part_starts[part_in_shard] =
+          static_cast<uint32_t>(cpp::distance(hashes.begin(), it));
+    }
+    size_t max_part_len = 0;
+    for (size_t i = 0; i + 1 < part_starts.size(); ++i) {
+      auto start = part_starts[i];
+      auto end = part_starts[i + 1];
+
+      size_t len = end - start;
+      max_part_len = cpp::max<size_t>(max_part_len, len);
+    }
+
+    if (max_part_len > slots_) {
+      return cpp::nullopt;
+    }
+
+    return cpp::tuple<cpp::array<uint64_t, n_>,
+                      cpp::array<uint32_t, parts_per_shard_ + 1>>{hashes,
+                                                                  part_starts};
+  }
+
+  LIBC_INLINE constexpr bool
+  build_shard(size_t shard, cpp::array<uint64_t, n_> &hashes,
+              cpp::array<uint32_t, parts_per_shard_ + 1> &part_starts,
+              PilotsTypeV &pilots, size_t pilots_begin, size_t pilots_end,
+              size_t taken_begin, size_t taken_end,
+              cpp::array<cpp::array<bool, slots_>, parts_> &taken) const {
+
+    size_t pilots_chunk_size = pilots_end - pilots_begin;
+
+    auto part_in_shard = 0;
+    for (size_t taken_idx = taken_begin; taken_idx < taken_end; ++taken_idx) {
+      const auto num_chunks = pilots_chunk_size / buckets_;
+      for (size_t i = 0; i < num_chunks; ++i) {
+        size_t target_pilots_begin = pilots_begin + i * buckets_;
+        size_t target_pilots_end =
+            cpp::min(target_pilots_begin + buckets_, pilots_end);
+        auto part = shard * parts_per_shard_ + part_in_shard;
+
+        auto _cnt = this->build_part(
+            part,
+            cpp::span<uint64_t>(hashes).subspan(part_starts[part_in_shard],
+                                                part_starts[part_in_shard + 1] -
+                                                    part_starts[part_in_shard]),
+            cpp::span<uint8_t>(
+                const_cast<uint8_t *>(pilots.data() + target_pilots_begin),
+                target_pilots_end - target_pilots_begin),
+            taken[taken_idx]);
+        if (!_cnt) {
+          return false;
+        }
+      }
+      part_in_shard++;
+    }
+
+    return true;
+  }
+
+  LIBC_INLINE constexpr cpp::optional<size_t>
+  build_part(size_t part, cpp::span<uint64_t> hashes, cpp::span<uint8_t> pilots,
+             cpp::array<bool, slots_> &taken) const {
+    cpp::tuple<cpp::array<uint32_t, buckets_ + 1>,
+               cpp::array<uint32_t, buckets_>>
+        sorted_buckets = this->sort_buckets(part, hashes);
+    cpp::array<uint32_t, buckets_ + 1> starts = cpp::get<0>(sorted_buckets);
+    cpp::array<uint32_t, buckets_> bucket_order = cpp::get<1>(sorted_buckets);
+
+    auto kmax = 256u;
+
+    cpp::array<uint32_t, slots_> slots{};
+    for (size_t i = 0; i < slots_; i++) {
+      slots[i] = BUCKET_IDX_NONE;
+    }
+
+    auto bucket_len = [&](uint32_t b) constexpr -> size_t {
+      return starts[b + 1] - starts[b];
+    };
+
+    auto heap = BinaryHeap<>();
+
+    auto duplicate_slots = [&](uint32_t b, uint64_t p) constexpr {
+      auto hp = this->hash_pilot(p);
+      auto hashes_range = hashes.subspan(starts[b], starts[b + 1] - starts[b]);
+
+      auto i = 0;
+      for (auto const &e1 : hashes_range) {
+        auto hx = this->slot_in_part_hp(e1, hp);
+        for (auto e2 : hashes_range.subspan(i + 1)) {
+          auto hy = this->slot_in_part_hp(e2, hp);
+          if (hx == hy) {
+            return true;
+          }
+        }
+        i++;
+      }
+      return false;
+    };
+
+    cpp::array<uint32_t, 16> recent{
+        {BUCKET_IDX_NONE, BUCKET_IDX_NONE, BUCKET_IDX_NONE, BUCKET_IDX_NONE,
+         BUCKET_IDX_NONE, BUCKET_IDX_NONE, BUCKET_IDX_NONE, BUCKET_IDX_NONE,
+         BUCKET_IDX_NONE, BUCKET_IDX_NONE, BUCKET_IDX_NONE, BUCKET_IDX_NONE,
+         BUCKET_IDX_NONE, BUCKET_IDX_NONE, BUCKET_IDX_NONE, BUCKET_IDX_NONE}};
+    size_t total_evictions = 0;
+
+    auto rng = Fastrand();
+
+    for (size_t iter_num = 0; iter_num < bucket_order.size(); iter_num++) {
+      auto const &new_b = bucket_order[iter_num];
+      auto const new_bucket =
+          hashes.subspan(starts[new_b], starts[new_b + 1] - starts[new_b]);
+      if (new_bucket.empty()) {
+        pilots[new_b] = 0;
+        continue;
+      }
+      auto const new_b_len = new_bucket.size();
+      size_t evictions = 0;
+
+      heap.push({new_b_len, new_b});
+      for (size_t i = 0; i < recent.size(); ++i) {
+        recent[i] = BUCKET_IDX_NONE;
+      }
+      auto recent_idx = 0;
+      recent[0] = new_b;
+
+      while (!heap.empty()) {
+        auto const b = cpp::get<1>(heap.peek());
+        heap.pop();
+        if (evictions > slots_ && is_power_of_two((evictions))) {
+          if (evictions >= 10 * slots_) {
+            return cpp::nullopt;
+          }
+        }
+        auto const bucket =
+            hashes.subspan(starts[b], starts[b + 1] - starts[b]);
+        if (auto fpilot = this->find_pilot(kmax, bucket, taken)) {
+          auto &[p, hp] = fpilot.value();
+          pilots[b] = static_cast<uint8_t>(p);
+          for (auto &item :
+               hashes.subspan(starts[b], starts[b + 1] - starts[b])) {
+            auto p = this->slot_in_part_hp(item, hp);
+            slots[p] = b;
+          }
+          continue;
+        }
+        uint64_t p0 = rng.gen_byte();
+        cpp::tuple<size_t, uint64_t> best = {
+            cpp::numeric_limits<size_t>::max(),
+            cpp::numeric_limits<uint64_t>::max()};
+        for (size_t delat = 0; delat < kmax; ++delat) {
+          bool build_part_loop_continue_inner_continue = false;
+          auto const p = (p0 + delat) % kmax;
+          auto const hp = this->hash_pilot(p);
+          size_t collision_score = 0;
+          for (auto &item :
+               hashes.subspan(starts[b], starts[b + 1] - starts[b])) {
+            auto p = this->slot_in_part_hp(item, hp);
+            auto const s = slots[p];
+            size_t new_score = 0;
+            if (s == BUCKET_IDX_NONE) {
+              continue;
+            } else {
+              bool found = false;
+              for (auto it : recent) {
+                found = found || it == s;
+              }
+              if (found) {
+                build_part_loop_continue_inner_continue = true;
+                break;
+              } else {
+                auto const len = bucket_len(s);
+                new_score = len * len;
+              }
+            }
+            collision_score += new_score;
+            if (collision_score >= cpp::get<0>(best)) {
+              build_part_loop_continue_inner_continue = true;
+              break;
+            }
+          }
+          if (build_part_loop_continue_inner_continue) {
+            continue;
+          }
+          if (!duplicate_slots(b, p)) {
+            best = {collision_score, p};
+            if (collision_score == new_b_len * new_b_len) {
+              break;
+            }
+          }
+        }
+        if (cpp::get<0>(best) == cpp::numeric_limits<size_t>::max() &&
+            cpp::get<1>(best) == cpp::numeric_limits<uint64_t>::max()) {
+          return cpp::nullopt;
+        }
+
+        auto const &p = cpp::get<1>(best);
+        pilots[b] = static_cast<uint8_t>(p);
+        auto const hp = this->hash_pilot(p);
+        for (auto &item :
+             hashes.subspan(starts[b], starts[b + 1] - starts[b])) {
+          auto slot = this->slot_in_part_hp(item, hp);
+          auto const b2 = slots[slot];
+          if (b2 != BUCKET_IDX_NONE) {
+            LIBC_ASSERT(b2 != b);
+            heap.push({bucket_len(b2), b2});
+            evictions++;
+
+            auto hp = this->hash_pilot(static_cast<uint64_t>(pilots[b2]));
+            for (auto &item :
+                 hashes.subspan(starts[b2], starts[b2 + 1] - starts[b2])) {
+              auto p2 = this->slot_in_part_hp(item, hp);
+              slots[p2] = BUCKET_IDX_NONE;
+              taken[p2] = false;
+            }
+          }
+          slots[slot] = b;
+          taken[slot] = true;
+        }
+
+        recent_idx++;
+        recent_idx %= recent.size();
+        recent[recent_idx] = b;
+      }
+
+      total_evictions += evictions;
+    }
+    return total_evictions;
+  }
+
+  LIBC_INLINE constexpr cpp::optional<cpp::tuple<uint64_t, uint64_t>>
+  find_pilot(uint64_t kmax, cpp::span<uint64_t> bucket,
+             cpp::array<bool, slots_> &taken) const {
+    auto const r = bucket.size() / 4 * 4;
+    for (size_t p = 0; p < kmax; p++) {
+      bool find_pilot_continue = false;
+      auto const hp = this->hash_pilot(p);
+      auto const check = [&](uint64_t hx) {
+        return taken[this->slot_in_part_hp(hx, hp)];
+      };
+      auto bad = false;
+      for (size_t i = 0; i < r; i++) {
+        if (check(bucket[i])) {
+          find_pilot_continue = true;
+          break;
+        }
+      }
+      if (find_pilot_continue) {
+        continue;
+      }
+      for (auto hx : bucket.subspan(r)) {
+        bad |= check(hx);
+      }
+      if (bad) {
+        continue;
+      }
+
+      if (this->try_take_pilot(bucket, hp, taken)) {
+        return cpp::tuple<size_t, uint64_t>{p, hp};
+      }
+    }
+    return cpp::nullopt;
+  }
+
+  LIBC_INLINE constexpr bool
+  try_take_pilot(cpp::span<uint64_t> bucket, uint64_t hp,
+                 cpp::array<bool, slots_> &taken) const {
+    for (size_t i = 0; i < bucket.size(); i++) {
+      size_t hx = bucket[i];
+      auto const slot = this->slot_in_part_hp(hx, hp);
+      if (taken[slot]) {
+        for (auto hx : bucket.subspan(0, i)) {
+          taken[this->slot_in_part_hp(hx, hp)] = false;
+        }
+        return false;
+      }
+      taken[slot] = true;
+    }
+    return true;
+  }
+
+  LIBC_INLINE constexpr uint64_t hash_pilot(uint64_t p) const {
+    uint64_t c = 0x517cc1b727220a95;
+    uint64_t b = p ^ this->seed;
+    uint64_t result = 0;
+
+    while (b != 0) {
+      if (b & 1) {
+        result = result + c;
+      }
+      c = c << 1;
+      b >>= 1;
+    }
+
+    return result;
+  }
+
+  LIBC_INLINE constexpr size_t slot_in_part_hp(uint64_t hx, uint64_t hp) const {
+    uint64_t d =
+        cpp::max(PtrhashConfig<n_>::SLOTS_PER_PART, static_cast<size_t>(1));
+    uint64_t m = cpp::numeric_limits<uint64_t>::max() / d + 1;
+    auto lowbits = m * (hx ^ hp);
+    return (static_cast<__uint128_t>(lowbits) * static_cast<__uint128_t>(d)) >>
+           64;
+  }
+
+  LIBC_INLINE constexpr cpp::tuple<cpp::array<uint32_t, buckets_ + 1>,
+                                   cpp::array<uint32_t, buckets_>>
+  sort_buckets(size_t part, cpp::span<uint64_t> hashes) const {
+    cpp::array<uint32_t, buckets_ + 1> bucket_starts{};
+    size_t bucket_starts_idx = 0;
+    cpp::array<uint32_t, buckets_> order{};
+    for (size_t i = 0; i < order.size(); ++i) {
+      order[i] = BUCKET_IDX_NONE;
+    }
+    cpp::array<size_t, 32> bucket_len_cnt = {0};
+
+    size_t end = 0;
+    bucket_starts[bucket_starts_idx++] = static_cast<uint32_t>(end);
+
+    for (size_t b = 0; b < buckets_; b++) {
+      auto start = end;
+      while (end < hashes.size() &&
+             this->bucket(hashes[end]) == part * buckets_ + b) {
+        end++;
+      }
+
+      auto l = end - start;
+      bucket_len_cnt[l]++;
+      bucket_starts[bucket_starts_idx++] = static_cast<uint32_t>(end);
+    }
+
+    LIBC_ASSERT(end == hashes.size());
+
+    auto max_bucket_size = bucket_len_cnt.size() - 1;
+    auto const expected_bucket_size = slots_ / buckets_;
+    //  "Part {part}: Bucket size {max_bucket_size} is too much "
+    //  "larger than the expected size of {expected_bucket_size}."
+    LIBC_ASSERT(static_cast<double>(max_bucket_size) <=
+                (20. * expected_bucket_size));
+    auto acc = 0;
+    for (int i = static_cast<int>(max_bucket_size); i > -1; i--) {
+      auto tmp = bucket_len_cnt[i];
+      bucket_len_cnt[i] = acc;
+      acc += tmp;
+    }
+    for (size_t b = 0; b < buckets_; b++) {
+      size_t l = bucket_starts[b + 1] - bucket_starts[b];
+      order[bucket_len_cnt[l]] = static_cast<uint32_t>(b);
+      bucket_len_cnt[l] += 1;
+    }
+
+    return {bucket_starts, order};
+  }
+
+  LIBC_INLINE constexpr size_t part(uint64_t hx) const {
+    return (static_cast<__uint128_t>(PtrhashConfig<n_>::PARTS) *
+            static_cast<__uint128_t>(hx)) >>
+           64;
+  }
+
+  LIBC_INLINE constexpr size_t bucket(uint64_t hx) const {
+    return (static_cast<__uint128_t>(PtrhashConfig<n_>::BUCKETS_TOTAL) *
+            static_cast<__uint128_t>(hx)) >>
+           64;
+  }
+};
+
+template <size_t n, typename Key = uint64_t>
+LIBC_INLINE constexpr auto get_params(const cpp::array<Key, n> &keys) {
+  using F = cpp::array<uint32_t, PtrhashConfig<n>::SLOTS_TOTAL - n>;
+  using PilotsTypeV = cpp::array<uint8_t, PtrhashConfig<n>::BUCKETS_TOTAL>;
+
+  auto p =
+      PtrHash<n, PtrhashConfig<n>::PARTS, PtrhashConfig<n>::PARTS_PER_SHARD,
+              PtrhashConfig<n>::SLOTS_TOTAL, PtrhashConfig<n>::BUCKETS_TOTAL,
+              PtrhashConfig<n>::SLOTS_PER_PART,
+              PtrhashConfig<n>::BUCKETS_PER_PART, Key, F, PilotsTypeV>(
+          0, PilotsTypeV(), F());
+  auto result = p.compute_pilots(keys);
+
+  LIBC_ASSERT(result &&
+              "Unable to construct PtrHash after 10 tries. Try using a "
+              "better hash or decreasing lambda.\n");
+
+  return result.value();
+}
+
+template <
+    size_t n,
+    typename PilotsTypeV = cpp::array<uint8_t, PtrhashConfig<n>::BUCKETS_TOTAL>,
+    typename F = cpp::array<uint32_t, PtrhashConfig<n>::SLOTS_TOTAL - n>>
+LIBC_INLINE constexpr auto init_hasher(size_t seed, PilotsTypeV pilots,
+                                       F remap) {
+  return PtrHash<n, PtrhashConfig<n>::PARTS, PtrhashConfig<n>::PARTS_PER_SHARD,
+                 PtrhashConfig<n>::SLOTS_TOTAL, PtrhashConfig<n>::BUCKETS_TOTAL,
+                 PtrhashConfig<n>::SLOTS_PER_PART,
+                 PtrhashConfig<n>::BUCKETS_PER_PART>(seed, pilots, remap);
+}
+
+} // namespace ptrhash
+
+template <size_t Capacity, class Hasher> class PerfectHashMap {
+public:
+  struct Entry {
+    wint_t key : 21;
+    wint_t value : 21;
+    LIBC_INLINE constexpr Entry() = default;
+    LIBC_INLINE constexpr Entry(wint_t key, wint_t value)
+        : key(key), value(value) {}
+  };
+
+  LIBC_INLINE constexpr PerfectHashMap(
+      const cpp::array<cpp::array<wint_t, 2>, Capacity> &pairs,
+      const Hasher &hasher)
+      : hasher(hasher) {
+    for (const auto &pair : pairs) {
+      const auto &key = pair[0];
+      const auto &value = pair[1];
+      auto const idx = hasher.index(key);
+      LIBC_ASSERT(idx < Capacity && "Index out of bounds");
+      this->entries[idx] = Entry{key, value};
+    }
+  }
+
+  LIBC_INLINE constexpr cpp::optional<wint_t> find(const wint_t key) const {
+    size_t idx = hasher.index(key);
+    if (idx >= Capacity)
+      return cpp::nullopt;
+
+    const Entry &e = entries[idx];
+    if (e.key != key)
+      return cpp::nullopt;
+
+    return e.value;
+  }
+
+  LIBC_INLINE constexpr bool contains(const wint_t key) const {
+    return this->find(key).has_value();
+  }
+
+  LIBC_INLINE constexpr size_t size() { return Capacity; }
+
+private:
+  Entry entries[Capacity];
+  const Hasher &hasher;
+};
+
+} // namespace LIBC_NAMESPACE_DECL
+
+#endif // LLVM_LIBC_SRC___SUPPORT_WCTYPE_PTR_HASH_H
diff --git a/libc/src/__support/wctype/upper_to_lower.h b/libc/src/__support/wctype/upper_to_lower.h
new file mode 100644
index 0000000000000..516a89033c9c0
--- /dev/null
+++ b/libc/src/__support/wctype/upper_to_lower.h
@@ -0,0 +1,553 @@
+//===-- Auto-generated upper to lower case mappings table -------*- C++ -*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+// DO NOT EDIT MANUALLY.
+// This file is generated by libc/utils/wctype_utils scripts.
+// This file is meant to be included directly into LLVM libc code
+// Format: {from_codepoint, to_codepoint}
+// Info: 1415 entries
+
+#ifndef LLVM_LIBC_SRC___SUPPORT_WCTYPE_UPPER_TO_LOWER_H
+#define LLVM_LIBC_SRC___SUPPORT_WCTYPE_UPPER_TO_LOWER_H
+
+#include "perfect_hash_map.h"
+
+namespace LIBC_NAMESPACE_DECL {
+
+LIBC_INLINE_VAR constexpr cpp::array<cpp::array<wint_t, 2>, 1415>
+    UPPER_TO_LOWER_DATA = {
+        {{0x41, 0x61},       {0x42, 0x62},       {0x43, 0x63},
+         {0x44, 0x64},       {0x45, 0x65},       {0x46, 0x66},
+         {0x47, 0x67},       {0x48, 0x68},       {0x49, 0x69},
+         {0x4A, 0x6A},       {0x4B, 0x6B},       {0x4C, 0x6C},
+         {0x4D, 0x6D},       {0x4E, 0x6E},       {0x4F, 0x6F},
+         {0x50, 0x70},       {0x51, 0x71},       {0x52, 0x72},
+         {0x53, 0x73},       {0x54, 0x74},       {0x55, 0x75},
+         {0x56, 0x76},       {0x57, 0x77},       {0x58, 0x78},
+         {0x59, 0x79},       {0x5A, 0x7A},       {0xC0, 0xE0},
+         {0xC1, 0xE1},       {0xC2, 0xE2},       {0xC3, 0xE3},
+         {0xC4, 0xE4},       {0xC5, 0xE5},       {0xC6, 0xE6},
+         {0xC7, 0xE7},       {0xC8, 0xE8},       {0xC9, 0xE9},
+         {0xCA, 0xEA},       {0xCB, 0xEB},       {0xCC, 0xEC},
+         {0xCD, 0xED},       {0xCE, 0xEE},       {0xCF, 0xEF},
+         {0xD0, 0xF0},       {0xD1, 0xF1},       {0xD2, 0xF2},
+         {0xD3, 0xF3},       {0xD4, 0xF4},       {0xD5, 0xF5},
+         {0xD6, 0xF6},       {0xD8, 0xF8},       {0xD9, 0xF9},
+         {0xDA, 0xFA},       {0xDB, 0xFB},       {0xDC, 0xFC},
+         {0xDD, 0xFD},       {0xDE, 0xFE},       {0x100, 0x101},
+         {0x102, 0x103},     {0x104, 0x105},     {0x106, 0x107},
+         {0x108, 0x109},     {0x10A, 0x10B},     {0x10C, 0x10D},
+         {0x10E, 0x10F},     {0x110, 0x111},     {0x112, 0x113},
+         {0x114, 0x115},     {0x116, 0x117},     {0x118, 0x119},
+         {0x11A, 0x11B},     {0x11C, 0x11D},     {0x11E, 0x11F},
+         {0x120, 0x121},     {0x122, 0x123},     {0x124, 0x125},
+         {0x126, 0x127},     {0x128, 0x129},     {0x12A, 0x12B},
+         {0x12C, 0x12D},     {0x12E, 0x12F},     {0x130, 0x69},
+         {0x132, 0x133},     {0x134, 0x135},     {0x136, 0x137},
+         {0x139, 0x13A},     {0x13B, 0x13C},     {0x13D, 0x13E},
+         {0x13F, 0x140},     {0x141, 0x142},     {0x143, 0x144},
+         {0x145, 0x146},     {0x147, 0x148},     {0x14A, 0x14B},
+         {0x14C, 0x14D},     {0x14E, 0x14F},     {0x150, 0x151},
+         {0x152, 0x153},     {0x154, 0x155},     {0x156, 0x157},
+         {0x158, 0x159},     {0x15A, 0x15B},     {0x15C, 0x15D},
+         {0x15E, 0x15F},     {0x160, 0x161},     {0x162, 0x163},
+         {0x164, 0x165},     {0x166, 0x167},     {0x168, 0x169},
+         {0x16A, 0x16B},     {0x16C, 0x16D},     {0x16E, 0x16F},
+         {0x170, 0x171},     {0x172, 0x173},     {0x174, 0x175},
+         {0x176, 0x177},     {0x178, 0xFF},      {0x179, 0x17A},
+         {0x17B, 0x17C},     {0x17D, 0x17E},     {0x181, 0x253},
+         {0x182, 0x183},     {0x184, 0x185},     {0x186, 0x254},
+         {0x187, 0x188},     {0x189, 0x256},     {0x18A, 0x257},
+         {0x18B, 0x18C},     {0x18E, 0x1DD},     {0x18F, 0x259},
+         {0x190, 0x25B},     {0x191, 0x192},     {0x193, 0x260},
+         {0x194, 0x263},     {0x196, 0x269},     {0x197, 0x268},
+         {0x198, 0x199},     {0x19C, 0x26F},     {0x19D, 0x272},
+         {0x19F, 0x275},     {0x1A0, 0x1A1},     {0x1A2, 0x1A3},
+         {0x1A4, 0x1A5},     {0x1A6, 0x280},     {0x1A7, 0x1A8},
+         {0x1A9, 0x283},     {0x1AC, 0x1AD},     {0x1AE, 0x288},
+         {0x1AF, 0x1B0},     {0x1B1, 0x28A},     {0x1B2, 0x28B},
+         {0x1B3, 0x1B4},     {0x1B5, 0x1B6},     {0x1B7, 0x292},
+         {0x1B8, 0x1B9},     {0x1BC, 0x1BD},     {0x1C4, 0x1C6},
+         {0x1C7, 0x1C9},     {0x1CA, 0x1CC},     {0x1CD, 0x1CE},
+         {0x1CF, 0x1D0},     {0x1D1, 0x1D2},     {0x1D3, 0x1D4},
+         {0x1D5, 0x1D6},     {0x1D7, 0x1D8},     {0x1D9, 0x1DA},
+         {0x1DB, 0x1DC},     {0x1DE, 0x1DF},     {0x1E0, 0x1E1},
+         {0x1E2, 0x1E3},     {0x1E4, 0x1E5},     {0x1E6, 0x1E7},
+         {0x1E8, 0x1E9},     {0x1EA, 0x1EB},     {0x1EC, 0x1ED},
+         {0x1EE, 0x1EF},     {0x1F1, 0x1F3},     {0x1F4, 0x1F5},
+         {0x1F6, 0x195},     {0x1F7, 0x1BF},     {0x1F8, 0x1F9},
+         {0x1FA, 0x1FB},     {0x1FC, 0x1FD},     {0x1FE, 0x1FF},
+         {0x200, 0x201},     {0x202, 0x203},     {0x204, 0x205},
+         {0x206, 0x207},     {0x208, 0x209},     {0x20A, 0x20B},
+         {0x20C, 0x20D},     {0x20E, 0x20F},     {0x210, 0x211},
+         {0x212, 0x213},     {0x214, 0x215},     {0x216, 0x217},
+         {0x218, 0x219},     {0x21A, 0x21B},     {0x21C, 0x21D},
+         {0x21E, 0x21F},     {0x220, 0x19E},     {0x222, 0x223},
+         {0x224, 0x225},     {0x226, 0x227},     {0x228, 0x229},
+         {0x22A, 0x22B},     {0x22C, 0x22D},     {0x22E, 0x22F},
+         {0x230, 0x231},     {0x232, 0x233},     {0x23A, 0x2C65},
+         {0x23B, 0x23C},     {0x23D, 0x19A},     {0x23E, 0x2C66},
+         {0x241, 0x242},     {0x243, 0x180},     {0x244, 0x289},
+         {0x245, 0x28C},     {0x246, 0x247},     {0x248, 0x249},
+         {0x24A, 0x24B},     {0x24C, 0x24D},     {0x24E, 0x24F},
+         {0x370, 0x371},     {0x372, 0x373},     {0x376, 0x377},
+         {0x37F, 0x3F3},     {0x386, 0x3AC},     {0x388, 0x3AD},
+         {0x389, 0x3AE},     {0x38A, 0x3AF},     {0x38C, 0x3CC},
+         {0x38E, 0x3CD},     {0x38F, 0x3CE},     {0x391, 0x3B1},
+         {0x392, 0x3B2},     {0x393, 0x3B3},     {0x394, 0x3B4},
+         {0x395, 0x3B5},     {0x396, 0x3B6},     {0x397, 0x3B7},
+         {0x398, 0x3B8},     {0x399, 0x3B9},     {0x39A, 0x3BA},
+         {0x39B, 0x3BB},     {0x39C, 0x3BC},     {0x39D, 0x3BD},
+         {0x39E, 0x3BE},     {0x39F, 0x3BF},     {0x3A0, 0x3C0},
+         {0x3A1, 0x3C1},     {0x3A3, 0x3C3},     {0x3A4, 0x3C4},
+         {0x3A5, 0x3C5},     {0x3A6, 0x3C6},     {0x3A7, 0x3C7},
+         {0x3A8, 0x3C8},     {0x3A9, 0x3C9},     {0x3AA, 0x3CA},
+         {0x3AB, 0x3CB},     {0x3CF, 0x3D7},     {0x3D8, 0x3D9},
+         {0x3DA, 0x3DB},     {0x3DC, 0x3DD},     {0x3DE, 0x3DF},
+         {0x3E0, 0x3E1},     {0x3E2, 0x3E3},     {0x3E4, 0x3E5},
+         {0x3E6, 0x3E7},     {0x3E8, 0x3E9},     {0x3EA, 0x3EB},
+         {0x3EC, 0x3ED},     {0x3EE, 0x3EF},     {0x3F4, 0x3B8},
+         {0x3F7, 0x3F8},     {0x3F9, 0x3F2},     {0x3FA, 0x3FB},
+         {0x3FD, 0x37B},     {0x3FE, 0x37C},     {0x3FF, 0x37D},
+         {0x400, 0x450},     {0x401, 0x451},     {0x402, 0x452},
+         {0x403, 0x453},     {0x404, 0x454},     {0x405, 0x455},
+         {0x406, 0x456},     {0x407, 0x457},     {0x408, 0x458},
+         {0x409, 0x459},     {0x40A, 0x45A},     {0x40B, 0x45B},
+         {0x40C, 0x45C},     {0x40D, 0x45D},     {0x40E, 0x45E},
+         {0x40F, 0x45F},     {0x410, 0x430},     {0x411, 0x431},
+         {0x412, 0x432},     {0x413, 0x433},     {0x414, 0x434},
+         {0x415, 0x435},     {0x416, 0x436},     {0x417, 0x437},
+         {0x418, 0x438},     {0x419, 0x439},     {0x41A, 0x43A},
+         {0x41B, 0x43B},     {0x41C, 0x43C},     {0x41D, 0x43D},
+         {0x41E, 0x43E},     {0x41F, 0x43F},     {0x420, 0x440},
+         {0x421, 0x441},     {0x422, 0x442},     {0x423, 0x443},
+         {0x424, 0x444},     {0x425, 0x445},     {0x426, 0x446},
+         {0x427, 0x447},     {0x428, 0x448},     {0x429, 0x449},
+         {0x42A, 0x44A},     {0x42B, 0x44B},     {0x42C, 0x44C},
+         {0x42D, 0x44D},     {0x42E, 0x44E},     {0x42F, 0x44F},
+         {0x460, 0x461},     {0x462, 0x463},     {0x464, 0x465},
+         {0x466, 0x467},     {0x468, 0x469},     {0x46A, 0x46B},
+         {0x46C, 0x46D},     {0x46E, 0x46F},     {0x470, 0x471},
+         {0x472, 0x473},     {0x474, 0x475},     {0x476, 0x477},
+         {0x478, 0x479},     {0x47A, 0x47B},     {0x47C, 0x47D},
+         {0x47E, 0x47F},     {0x480, 0x481},     {0x48A, 0x48B},
+         {0x48C, 0x48D},     {0x48E, 0x48F},     {0x490, 0x491},
+         {0x492, 0x493},     {0x494, 0x495},     {0x496, 0x497},
+         {0x498, 0x499},     {0x49A, 0x49B},     {0x49C, 0x49D},
+         {0x49E, 0x49F},     {0x4A0, 0x4A1},     {0x4A2, 0x4A3},
+         {0x4A4, 0x4A5},     {0x4A6, 0x4A7},     {0x4A8, 0x4A9},
+         {0x4AA, 0x4AB},     {0x4AC, 0x4AD},     {0x4AE, 0x4AF},
+         {0x4B0, 0x4B1},     {0x4B2, 0x4B3},     {0x4B4, 0x4B5},
+         {0x4B6, 0x4B7},     {0x4B8, 0x4B9},     {0x4BA, 0x4BB},
+         {0x4BC, 0x4BD},     {0x4BE, 0x4BF},     {0x4C0, 0x4CF},
+         {0x4C1, 0x4C2},     {0x4C3, 0x4C4},     {0x4C5, 0x4C6},
+         {0x4C7, 0x4C8},     {0x4C9, 0x4CA},     {0x4CB, 0x4CC},
+         {0x4CD, 0x4CE},     {0x4D0, 0x4D1},     {0x4D2, 0x4D3},
+         {0x4D4, 0x4D5},     {0x4D6, 0x4D7},     {0x4D8, 0x4D9},
+         {0x4DA, 0x4DB},     {0x4DC, 0x4DD},     {0x4DE, 0x4DF},
+         {0x4E0, 0x4E1},     {0x4E2, 0x4E3},     {0x4E4, 0x4E5},
+         {0x4E6, 0x4E7},     {0x4E8, 0x4E9},     {0x4EA, 0x4EB},
+         {0x4EC, 0x4ED},     {0x4EE, 0x4EF},     {0x4F0, 0x4F1},
+         {0x4F2, 0x4F3},     {0x4F4, 0x4F5},     {0x4F6, 0x4F7},
+         {0x4F8, 0x4F9},     {0x4FA, 0x4FB},     {0x4FC, 0x4FD},
+         {0x4FE, 0x4FF},     {0x500, 0x501},     {0x502, 0x503},
+         {0x504, 0x505},     {0x506, 0x507},     {0x508, 0x509},
+         {0x50A, 0x50B},     {0x50C, 0x50D},     {0x50E, 0x50F},
+         {0x510, 0x511},     {0x512, 0x513},     {0x514, 0x515},
+         {0x516, 0x517},     {0x518, 0x519},     {0x51A, 0x51B},
+         {0x51C, 0x51D},     {0x51E, 0x51F},     {0x520, 0x521},
+         {0x522, 0x523},     {0x524, 0x525},     {0x526, 0x527},
+         {0x528, 0x529},     {0x52A, 0x52B},     {0x52C, 0x52D},
+         {0x52E, 0x52F},     {0x531, 0x561},     {0x532, 0x562},
+         {0x533, 0x563},     {0x534, 0x564},     {0x535, 0x565},
+         {0x536, 0x566},     {0x537, 0x567},     {0x538, 0x568},
+         {0x539, 0x569},     {0x53A, 0x56A},     {0x53B, 0x56B},
+         {0x53C, 0x56C},     {0x53D, 0x56D},     {0x53E, 0x56E},
+         {0x53F, 0x56F},     {0x540, 0x570},     {0x541, 0x571},
+         {0x542, 0x572},     {0x543, 0x573},     {0x544, 0x574},
+         {0x545, 0x575},     {0x546, 0x576},     {0x547, 0x577},
+         {0x548, 0x578},     {0x549, 0x579},     {0x54A, 0x57A},
+         {0x54B, 0x57B},     {0x54C, 0x57C},     {0x54D, 0x57D},
+         {0x54E, 0x57E},     {0x54F, 0x57F},     {0x550, 0x580},
+         {0x551, 0x581},     {0x552, 0x582},     {0x553, 0x583},
+         {0x554, 0x584},     {0x555, 0x585},     {0x556, 0x586},
+         {0x10A0, 0x2D00},   {0x10A1, 0x2D01},   {0x10A2, 0x2D02},
+         {0x10A3, 0x2D03},   {0x10A4, 0x2D04},   {0x10A5, 0x2D05},
+         {0x10A6, 0x2D06},   {0x10A7, 0x2D07},   {0x10A8, 0x2D08},
+         {0x10A9, 0x2D09},   {0x10AA, 0x2D0A},   {0x10AB, 0x2D0B},
+         {0x10AC, 0x2D0C},   {0x10AD, 0x2D0D},   {0x10AE, 0x2D0E},
+         {0x10AF, 0x2D0F},   {0x10B0, 0x2D10},   {0x10B1, 0x2D11},
+         {0x10B2, 0x2D12},   {0x10B3, 0x2D13},   {0x10B4, 0x2D14},
+         {0x10B5, 0x2D15},   {0x10B6, 0x2D16},   {0x10B7, 0x2D17},
+         {0x10B8, 0x2D18},   {0x10B9, 0x2D19},   {0x10BA, 0x2D1A},
+         {0x10BB, 0x2D1B},   {0x10BC, 0x2D1C},   {0x10BD, 0x2D1D},
+         {0x10BE, 0x2D1E},   {0x10BF, 0x2D1F},   {0x10C0, 0x2D20},
+         {0x10C1, 0x2D21},   {0x10C2, 0x2D22},   {0x10C3, 0x2D23},
+         {0x10C4, 0x2D24},   {0x10C5, 0x2D25},   {0x10C7, 0x2D27},
+         {0x10CD, 0x2D2D},   {0x13A0, 0xAB70},   {0x13A1, 0xAB71},
+         {0x13A2, 0xAB72},   {0x13A3, 0xAB73},   {0x13A4, 0xAB74},
+         {0x13A5, 0xAB75},   {0x13A6, 0xAB76},   {0x13A7, 0xAB77},
+         {0x13A8, 0xAB78},   {0x13A9, 0xAB79},   {0x13AA, 0xAB7A},
+         {0x13AB, 0xAB7B},   {0x13AC, 0xAB7C},   {0x13AD, 0xAB7D},
+         {0x13AE, 0xAB7E},   {0x13AF, 0xAB7F},   {0x13B0, 0xAB80},
+         {0x13B1, 0xAB81},   {0x13B2, 0xAB82},   {0x13B3, 0xAB83},
+         {0x13B4, 0xAB84},   {0x13B5, 0xAB85},   {0x13B6, 0xAB86},
+         {0x13B7, 0xAB87},   {0x13B8, 0xAB88},   {0x13B9, 0xAB89},
+         {0x13BA, 0xAB8A},   {0x13BB, 0xAB8B},   {0x13BC, 0xAB8C},
+         {0x13BD, 0xAB8D},   {0x13BE, 0xAB8E},   {0x13BF, 0xAB8F},
+         {0x13C0, 0xAB90},   {0x13C1, 0xAB91},   {0x13C2, 0xAB92},
+         {0x13C3, 0xAB93},   {0x13C4, 0xAB94},   {0x13C5, 0xAB95},
+         {0x13C6, 0xAB96},   {0x13C7, 0xAB97},   {0x13C8, 0xAB98},
+         {0x13C9, 0xAB99},   {0x13CA, 0xAB9A},   {0x13CB, 0xAB9B},
+         {0x13CC, 0xAB9C},   {0x13CD, 0xAB9D},   {0x13CE, 0xAB9E},
+         {0x13CF, 0xAB9F},   {0x13D0, 0xABA0},   {0x13D1, 0xABA1},
+         {0x13D2, 0xABA2},   {0x13D3, 0xABA3},   {0x13D4, 0xABA4},
+         {0x13D5, 0xABA5},   {0x13D6, 0xABA6},   {0x13D7, 0xABA7},
+         {0x13D8, 0xABA8},   {0x13D9, 0xABA9},   {0x13DA, 0xABAA},
+         {0x13DB, 0xABAB},   {0x13DC, 0xABAC},   {0x13DD, 0xABAD},
+         {0x13DE, 0xABAE},   {0x13DF, 0xABAF},   {0x13E0, 0xABB0},
+         {0x13E1, 0xABB1},   {0x13E2, 0xABB2},   {0x13E3, 0xABB3},
+         {0x13E4, 0xABB4},   {0x13E5, 0xABB5},   {0x13E6, 0xABB6},
+         {0x13E7, 0xABB7},   {0x13E8, 0xABB8},   {0x13E9, 0xABB9},
+         {0x13EA, 0xABBA},   {0x13EB, 0xABBB},   {0x13EC, 0xABBC},
+         {0x13ED, 0xABBD},   {0x13EE, 0xABBE},   {0x13EF, 0xABBF},
+         {0x13F0, 0x13F8},   {0x13F1, 0x13F9},   {0x13F2, 0x13FA},
+         {0x13F3, 0x13FB},   {0x13F4, 0x13FC},   {0x13F5, 0x13FD},
+         {0x1C89, 0x1C8A},   {0x1C90, 0x10D0},   {0x1C91, 0x10D1},
+         {0x1C92, 0x10D2},   {0x1C93, 0x10D3},   {0x1C94, 0x10D4},
+         {0x1C95, 0x10D5},   {0x1C96, 0x10D6},   {0x1C97, 0x10D7},
+         {0x1C98, 0x10D8},   {0x1C99, 0x10D9},   {0x1C9A, 0x10DA},
+         {0x1C9B, 0x10DB},   {0x1C9C, 0x10DC},   {0x1C9D, 0x10DD},
+         {0x1C9E, 0x10DE},   {0x1C9F, 0x10DF},   {0x1CA0, 0x10E0},
+         {0x1CA1, 0x10E1},   {0x1CA2, 0x10E2},   {0x1CA3, 0x10E3},
+         {0x1CA4, 0x10E4},   {0x1CA5, 0x10E5},   {0x1CA6, 0x10E6},
+         {0x1CA7, 0x10E7},   {0x1CA8, 0x10E8},   {0x1CA9, 0x10E9},
+         {0x1CAA, 0x10EA},   {0x1CAB, 0x10EB},   {0x1CAC, 0x10EC},
+         {0x1CAD, 0x10ED},   {0x1CAE, 0x10EE},   {0x1CAF, 0x10EF},
+         {0x1CB0, 0x10F0},   {0x1CB1, 0x10F1},   {0x1CB2, 0x10F2},
+         {0x1CB3, 0x10F3},   {0x1CB4, 0x10F4},   {0x1CB5, 0x10F5},
+         {0x1CB6, 0x10F6},   {0x1CB7, 0x10F7},   {0x1CB8, 0x10F8},
+         {0x1CB9, 0x10F9},   {0x1CBA, 0x10FA},   {0x1CBD, 0x10FD},
+         {0x1CBE, 0x10FE},   {0x1CBF, 0x10FF},   {0x1E00, 0x1E01},
+         {0x1E02, 0x1E03},   {0x1E04, 0x1E05},   {0x1E06, 0x1E07},
+         {0x1E08, 0x1E09},   {0x1E0A, 0x1E0B},   {0x1E0C, 0x1E0D},
+         {0x1E0E, 0x1E0F},   {0x1E10, 0x1E11},   {0x1E12, 0x1E13},
+         {0x1E14, 0x1E15},   {0x1E16, 0x1E17},   {0x1E18, 0x1E19},
+         {0x1E1A, 0x1E1B},   {0x1E1C, 0x1E1D},   {0x1E1E, 0x1E1F},
+         {0x1E20, 0x1E21},   {0x1E22, 0x1E23},   {0x1E24, 0x1E25},
+         {0x1E26, 0x1E27},   {0x1E28, 0x1E29},   {0x1E2A, 0x1E2B},
+         {0x1E2C, 0x1E2D},   {0x1E2E, 0x1E2F},   {0x1E30, 0x1E31},
+         {0x1E32, 0x1E33},   {0x1E34, 0x1E35},   {0x1E36, 0x1E37},
+         {0x1E38, 0x1E39},   {0x1E3A, 0x1E3B},   {0x1E3C, 0x1E3D},
+         {0x1E3E, 0x1E3F},   {0x1E40, 0x1E41},   {0x1E42, 0x1E43},
+         {0x1E44, 0x1E45},   {0x1E46, 0x1E47},   {0x1E48, 0x1E49},
+         {0x1E4A, 0x1E4B},   {0x1E4C, 0x1E4D},   {0x1E4E, 0x1E4F},
+         {0x1E50, 0x1E51},   {0x1E52, 0x1E53},   {0x1E54, 0x1E55},
+         {0x1E56, 0x1E57},   {0x1E58, 0x1E59},   {0x1E5A, 0x1E5B},
+         {0x1E5C, 0x1E5D},   {0x1E5E, 0x1E5F},   {0x1E60, 0x1E61},
+         {0x1E62, 0x1E63},   {0x1E64, 0x1E65},   {0x1E66, 0x1E67},
+         {0x1E68, 0x1E69},   {0x1E6A, 0x1E6B},   {0x1E6C, 0x1E6D},
+         {0x1E6E, 0x1E6F},   {0x1E70, 0x1E71},   {0x1E72, 0x1E73},
+         {0x1E74, 0x1E75},   {0x1E76, 0x1E77},   {0x1E78, 0x1E79},
+         {0x1E7A, 0x1E7B},   {0x1E7C, 0x1E7D},   {0x1E7E, 0x1E7F},
+         {0x1E80, 0x1E81},   {0x1E82, 0x1E83},   {0x1E84, 0x1E85},
+         {0x1E86, 0x1E87},   {0x1E88, 0x1E89},   {0x1E8A, 0x1E8B},
+         {0x1E8C, 0x1E8D},   {0x1E8E, 0x1E8F},   {0x1E90, 0x1E91},
+         {0x1E92, 0x1E93},   {0x1E94, 0x1E95},   {0x1E9E, 0xDF},
+         {0x1EA0, 0x1EA1},   {0x1EA2, 0x1EA3},   {0x1EA4, 0x1EA5},
+         {0x1EA6, 0x1EA7},   {0x1EA8, 0x1EA9},   {0x1EAA, 0x1EAB},
+         {0x1EAC, 0x1EAD},   {0x1EAE, 0x1EAF},   {0x1EB0, 0x1EB1},
+         {0x1EB2, 0x1EB3},   {0x1EB4, 0x1EB5},   {0x1EB6, 0x1EB7},
+         {0x1EB8, 0x1EB9},   {0x1EBA, 0x1EBB},   {0x1EBC, 0x1EBD},
+         {0x1EBE, 0x1EBF},   {0x1EC0, 0x1EC1},   {0x1EC2, 0x1EC3},
+         {0x1EC4, 0x1EC5},   {0x1EC6, 0x1EC7},   {0x1EC8, 0x1EC9},
+         {0x1ECA, 0x1ECB},   {0x1ECC, 0x1ECD},   {0x1ECE, 0x1ECF},
+         {0x1ED0, 0x1ED1},   {0x1ED2, 0x1ED3},   {0x1ED4, 0x1ED5},
+         {0x1ED6, 0x1ED7},   {0x1ED8, 0x1ED9},   {0x1EDA, 0x1EDB},
+         {0x1EDC, 0x1EDD},   {0x1EDE, 0x1EDF},   {0x1EE0, 0x1EE1},
+         {0x1EE2, 0x1EE3},   {0x1EE4, 0x1EE5},   {0x1EE6, 0x1EE7},
+         {0x1EE8, 0x1EE9},   {0x1EEA, 0x1EEB},   {0x1EEC, 0x1EED},
+         {0x1EEE, 0x1EEF},   {0x1EF0, 0x1EF1},   {0x1EF2, 0x1EF3},
+         {0x1EF4, 0x1EF5},   {0x1EF6, 0x1EF7},   {0x1EF8, 0x1EF9},
+         {0x1EFA, 0x1EFB},   {0x1EFC, 0x1EFD},   {0x1EFE, 0x1EFF},
+         {0x1F08, 0x1F00},   {0x1F09, 0x1F01},   {0x1F0A, 0x1F02},
+         {0x1F0B, 0x1F03},   {0x1F0C, 0x1F04},   {0x1F0D, 0x1F05},
+         {0x1F0E, 0x1F06},   {0x1F0F, 0x1F07},   {0x1F18, 0x1F10},
+         {0x1F19, 0x1F11},   {0x1F1A, 0x1F12},   {0x1F1B, 0x1F13},
+         {0x1F1C, 0x1F14},   {0x1F1D, 0x1F15},   {0x1F28, 0x1F20},
+         {0x1F29, 0x1F21},   {0x1F2A, 0x1F22},   {0x1F2B, 0x1F23},
+         {0x1F2C, 0x1F24},   {0x1F2D, 0x1F25},   {0x1F2E, 0x1F26},
+         {0x1F2F, 0x1F27},   {0x1F38, 0x1F30},   {0x1F39, 0x1F31},
+         {0x1F3A, 0x1F32},   {0x1F3B, 0x1F33},   {0x1F3C, 0x1F34},
+         {0x1F3D, 0x1F35},   {0x1F3E, 0x1F36},   {0x1F3F, 0x1F37},
+         {0x1F48, 0x1F40},   {0x1F49, 0x1F41},   {0x1F4A, 0x1F42},
+         {0x1F4B, 0x1F43},   {0x1F4C, 0x1F44},   {0x1F4D, 0x1F45},
+         {0x1F59, 0x1F51},   {0x1F5B, 0x1F53},   {0x1F5D, 0x1F55},
+         {0x1F5F, 0x1F57},   {0x1F68, 0x1F60},   {0x1F69, 0x1F61},
+         {0x1F6A, 0x1F62},   {0x1F6B, 0x1F63},   {0x1F6C, 0x1F64},
+         {0x1F6D, 0x1F65},   {0x1F6E, 0x1F66},   {0x1F6F, 0x1F67},
+         {0x1FB8, 0x1FB0},   {0x1FB9, 0x1FB1},   {0x1FBA, 0x1F70},
+         {0x1FBB, 0x1F71},   {0x1FC8, 0x1F72},   {0x1FC9, 0x1F73},
+         {0x1FCA, 0x1F74},   {0x1FCB, 0x1F75},   {0x1FD8, 0x1FD0},
+         {0x1FD9, 0x1FD1},   {0x1FDA, 0x1F76},   {0x1FDB, 0x1F77},
+         {0x1FE8, 0x1FE0},   {0x1FE9, 0x1FE1},   {0x1FEA, 0x1F7A},
+         {0x1FEB, 0x1F7B},   {0x1FEC, 0x1FE5},   {0x1FF8, 0x1F78},
+         {0x1FF9, 0x1F79},   {0x1FFA, 0x1F7C},   {0x1FFB, 0x1F7D},
+         {0x2126, 0x3C9},    {0x212A, 0x6B},     {0x212B, 0xE5},
+         {0x2132, 0x214E},   {0x2183, 0x2184},   {0x2C00, 0x2C30},
+         {0x2C01, 0x2C31},   {0x2C02, 0x2C32},   {0x2C03, 0x2C33},
+         {0x2C04, 0x2C34},   {0x2C05, 0x2C35},   {0x2C06, 0x2C36},
+         {0x2C07, 0x2C37},   {0x2C08, 0x2C38},   {0x2C09, 0x2C39},
+         {0x2C0A, 0x2C3A},   {0x2C0B, 0x2C3B},   {0x2C0C, 0x2C3C},
+         {0x2C0D, 0x2C3D},   {0x2C0E, 0x2C3E},   {0x2C0F, 0x2C3F},
+         {0x2C10, 0x2C40},   {0x2C11, 0x2C41},   {0x2C12, 0x2C42},
+         {0x2C13, 0x2C43},   {0x2C14, 0x2C44},   {0x2C15, 0x2C45},
+         {0x2C16, 0x2C46},   {0x2C17, 0x2C47},   {0x2C18, 0x2C48},
+         {0x2C19, 0x2C49},   {0x2C1A, 0x2C4A},   {0x2C1B, 0x2C4B},
+         {0x2C1C, 0x2C4C},   {0x2C1D, 0x2C4D},   {0x2C1E, 0x2C4E},
+         {0x2C1F, 0x2C4F},   {0x2C20, 0x2C50},   {0x2C21, 0x2C51},
+         {0x2C22, 0x2C52},   {0x2C23, 0x2C53},   {0x2C24, 0x2C54},
+         {0x2C25, 0x2C55},   {0x2C26, 0x2C56},   {0x2C27, 0x2C57},
+         {0x2C28, 0x2C58},   {0x2C29, 0x2C59},   {0x2C2A, 0x2C5A},
+         {0x2C2B, 0x2C5B},   {0x2C2C, 0x2C5C},   {0x2C2D, 0x2C5D},
+         {0x2C2E, 0x2C5E},   {0x2C2F, 0x2C5F},   {0x2C60, 0x2C61},
+         {0x2C62, 0x26B},    {0x2C63, 0x1D7D},   {0x2C64, 0x27D},
+         {0x2C67, 0x2C68},   {0x2C69, 0x2C6A},   {0x2C6B, 0x2C6C},
+         {0x2C6D, 0x251},    {0x2C6E, 0x271},    {0x2C6F, 0x250},
+         {0x2C70, 0x252},    {0x2C72, 0x2C73},   {0x2C75, 0x2C76},
+         {0x2C7E, 0x23F},    {0x2C7F, 0x240},    {0x2C80, 0x2C81},
+         {0x2C82, 0x2C83},   {0x2C84, 0x2C85},   {0x2C86, 0x2C87},
+         {0x2C88, 0x2C89},   {0x2C8A, 0x2C8B},   {0x2C8C, 0x2C8D},
+         {0x2C8E, 0x2C8F},   {0x2C90, 0x2C91},   {0x2C92, 0x2C93},
+         {0x2C94, 0x2C95},   {0x2C96, 0x2C97},   {0x2C98, 0x2C99},
+         {0x2C9A, 0x2C9B},   {0x2C9C, 0x2C9D},   {0x2C9E, 0x2C9F},
+         {0x2CA0, 0x2CA1},   {0x2CA2, 0x2CA3},   {0x2CA4, 0x2CA5},
+         {0x2CA6, 0x2CA7},   {0x2CA8, 0x2CA9},   {0x2CAA, 0x2CAB},
+         {0x2CAC, 0x2CAD},   {0x2CAE, 0x2CAF},   {0x2CB0, 0x2CB1},
+         {0x2CB2, 0x2CB3},   {0x2CB4, 0x2CB5},   {0x2CB6, 0x2CB7},
+         {0x2CB8, 0x2CB9},   {0x2CBA, 0x2CBB},   {0x2CBC, 0x2CBD},
+         {0x2CBE, 0x2CBF},   {0x2CC0, 0x2CC1},   {0x2CC2, 0x2CC3},
+         {0x2CC4, 0x2CC5},   {0x2CC6, 0x2CC7},   {0x2CC8, 0x2CC9},
+         {0x2CCA, 0x2CCB},   {0x2CCC, 0x2CCD},   {0x2CCE, 0x2CCF},
+         {0x2CD0, 0x2CD1},   {0x2CD2, 0x2CD3},   {0x2CD4, 0x2CD5},
+         {0x2CD6, 0x2CD7},   {0x2CD8, 0x2CD9},   {0x2CDA, 0x2CDB},
+         {0x2CDC, 0x2CDD},   {0x2CDE, 0x2CDF},   {0x2CE0, 0x2CE1},
+         {0x2CE2, 0x2CE3},   {0x2CEB, 0x2CEC},   {0x2CED, 0x2CEE},
+         {0x2CF2, 0x2CF3},   {0xA640, 0xA641},   {0xA642, 0xA643},
+         {0xA644, 0xA645},   {0xA646, 0xA647},   {0xA648, 0xA649},
+         {0xA64A, 0xA64B},   {0xA64C, 0xA64D},   {0xA64E, 0xA64F},
+         {0xA650, 0xA651},   {0xA652, 0xA653},   {0xA654, 0xA655},
+         {0xA656, 0xA657},   {0xA658, 0xA659},   {0xA65A, 0xA65B},
+         {0xA65C, 0xA65D},   {0xA65E, 0xA65F},   {0xA660, 0xA661},
+         {0xA662, 0xA663},   {0xA664, 0xA665},   {0xA666, 0xA667},
+         {0xA668, 0xA669},   {0xA66A, 0xA66B},   {0xA66C, 0xA66D},
+         {0xA680, 0xA681},   {0xA682, 0xA683},   {0xA684, 0xA685},
+         {0xA686, 0xA687},   {0xA688, 0xA689},   {0xA68A, 0xA68B},
+         {0xA68C, 0xA68D},   {0xA68E, 0xA68F},   {0xA690, 0xA691},
+         {0xA692, 0xA693},   {0xA694, 0xA695},   {0xA696, 0xA697},
+         {0xA698, 0xA699},   {0xA69A, 0xA69B},   {0xA722, 0xA723},
+         {0xA724, 0xA725},   {0xA726, 0xA727},   {0xA728, 0xA729},
+         {0xA72A, 0xA72B},   {0xA72C, 0xA72D},   {0xA72E, 0xA72F},
+         {0xA732, 0xA733},   {0xA734, 0xA735},   {0xA736, 0xA737},
+         {0xA738, 0xA739},   {0xA73A, 0xA73B},   {0xA73C, 0xA73D},
+         {0xA73E, 0xA73F},   {0xA740, 0xA741},   {0xA742, 0xA743},
+         {0xA744, 0xA745},   {0xA746, 0xA747},   {0xA748, 0xA749},
+         {0xA74A, 0xA74B},   {0xA74C, 0xA74D},   {0xA74E, 0xA74F},
+         {0xA750, 0xA751},   {0xA752, 0xA753},   {0xA754, 0xA755},
+         {0xA756, 0xA757},   {0xA758, 0xA759},   {0xA75A, 0xA75B},
+         {0xA75C, 0xA75D},   {0xA75E, 0xA75F},   {0xA760, 0xA761},
+         {0xA762, 0xA763},   {0xA764, 0xA765},   {0xA766, 0xA767},
+         {0xA768, 0xA769},   {0xA76A, 0xA76B},   {0xA76C, 0xA76D},
+         {0xA76E, 0xA76F},   {0xA779, 0xA77A},   {0xA77B, 0xA77C},
+         {0xA77D, 0x1D79},   {0xA77E, 0xA77F},   {0xA780, 0xA781},
+         {0xA782, 0xA783},   {0xA784, 0xA785},   {0xA786, 0xA787},
+         {0xA78B, 0xA78C},   {0xA78D, 0x265},    {0xA790, 0xA791},
+         {0xA792, 0xA793},   {0xA796, 0xA797},   {0xA798, 0xA799},
+         {0xA79A, 0xA79B},   {0xA79C, 0xA79D},   {0xA79E, 0xA79F},
+         {0xA7A0, 0xA7A1},   {0xA7A2, 0xA7A3},   {0xA7A4, 0xA7A5},
+         {0xA7A6, 0xA7A7},   {0xA7A8, 0xA7A9},   {0xA7AA, 0x266},
+         {0xA7AB, 0x25C},    {0xA7AC, 0x261},    {0xA7AD, 0x26C},
+         {0xA7AE, 0x26A},    {0xA7B0, 0x29E},    {0xA7B1, 0x287},
+         {0xA7B2, 0x29D},    {0xA7B3, 0xAB53},   {0xA7B4, 0xA7B5},
+         {0xA7B6, 0xA7B7},   {0xA7B8, 0xA7B9},   {0xA7BA, 0xA7BB},
+         {0xA7BC, 0xA7BD},   {0xA7BE, 0xA7BF},   {0xA7C0, 0xA7C1},
+         {0xA7C2, 0xA7C3},   {0xA7C4, 0xA794},   {0xA7C5, 0x282},
+         {0xA7C6, 0x1D8E},   {0xA7C7, 0xA7C8},   {0xA7C9, 0xA7CA},
+         {0xA7CB, 0x264},    {0xA7CC, 0xA7CD},   {0xA7CE, 0xA7CF},
+         {0xA7D0, 0xA7D1},   {0xA7D2, 0xA7D3},   {0xA7D4, 0xA7D5},
+         {0xA7D6, 0xA7D7},   {0xA7D8, 0xA7D9},   {0xA7DA, 0xA7DB},
+         {0xA7DC, 0x19B},    {0xA7F5, 0xA7F6},   {0xFF21, 0xFF41},
+         {0xFF22, 0xFF42},   {0xFF23, 0xFF43},   {0xFF24, 0xFF44},
+         {0xFF25, 0xFF45},   {0xFF26, 0xFF46},   {0xFF27, 0xFF47},
+         {0xFF28, 0xFF48},   {0xFF29, 0xFF49},   {0xFF2A, 0xFF4A},
+         {0xFF2B, 0xFF4B},   {0xFF2C, 0xFF4C},   {0xFF2D, 0xFF4D},
+         {0xFF2E, 0xFF4E},   {0xFF2F, 0xFF4F},   {0xFF30, 0xFF50},
+         {0xFF31, 0xFF51},   {0xFF32, 0xFF52},   {0xFF33, 0xFF53},
+         {0xFF34, 0xFF54},   {0xFF35, 0xFF55},   {0xFF36, 0xFF56},
+         {0xFF37, 0xFF57},   {0xFF38, 0xFF58},   {0xFF39, 0xFF59},
+         {0xFF3A, 0xFF5A},   {0x10400, 0x10428}, {0x10401, 0x10429},
+         {0x10402, 0x1042A}, {0x10403, 0x1042B}, {0x10404, 0x1042C},
+         {0x10405, 0x1042D}, {0x10406, 0x1042E}, {0x10407, 0x1042F},
+         {0x10408, 0x10430}, {0x10409, 0x10431}, {0x1040A, 0x10432},
+         {0x1040B, 0x10433}, {0x1040C, 0x10434}, {0x1040D, 0x10435},
+         {0x1040E, 0x10436}, {0x1040F, 0x10437}, {0x10410, 0x10438},
+         {0x10411, 0x10439}, {0x10412, 0x1043A}, {0x10413, 0x1043B},
+         {0x10414, 0x1043C}, {0x10415, 0x1043D}, {0x10416, 0x1043E},
+         {0x10417, 0x1043F}, {0x10418, 0x10440}, {0x10419, 0x10441},
+         {0x1041A, 0x10442}, {0x1041B, 0x10443}, {0x1041C, 0x10444},
+         {0x1041D, 0x10445}, {0x1041E, 0x10446}, {0x1041F, 0x10447},
+         {0x10420, 0x10448}, {0x10421, 0x10449}, {0x10422, 0x1044A},
+         {0x10423, 0x1044B}, {0x10424, 0x1044C}, {0x10425, 0x1044D},
+         {0x10426, 0x1044E}, {0x10427, 0x1044F}, {0x104B0, 0x104D8},
+         {0x104B1, 0x104D9}, {0x104B2, 0x104DA}, {0x104B3, 0x104DB},
+         {0x104B4, 0x104DC}, {0x104B5, 0x104DD}, {0x104B6, 0x104DE},
+         {0x104B7, 0x104DF}, {0x104B8, 0x104E0}, {0x104B9, 0x104E1},
+         {0x104BA, 0x104E2}, {0x104BB, 0x104E3}, {0x104BC, 0x104E4},
+         {0x104BD, 0x104E5}, {0x104BE, 0x104E6}, {0x104BF, 0x104E7},
+         {0x104C0, 0x104E8}, {0x104C1, 0x104E9}, {0x104C2, 0x104EA},
+         {0x104C3, 0x104EB}, {0x104C4, 0x104EC}, {0x104C5, 0x104ED},
+         {0x104C6, 0x104EE}, {0x104C7, 0x104EF}, {0x104C8, 0x104F0},
+         {0x104C9, 0x104F1}, {0x104CA, 0x104F2}, {0x104CB, 0x104F3},
+         {0x104CC, 0x104F4}, {0x104CD, 0x104F5}, {0x104CE, 0x104F6},
+         {0x104CF, 0x104F7}, {0x104D0, 0x104F8}, {0x104D1, 0x104F9},
+         {0x104D2, 0x104FA}, {0x104D3, 0x104FB}, {0x10570, 0x10597},
+         {0x10571, 0x10598}, {0x10572, 0x10599}, {0x10573, 0x1059A},
+         {0x10574, 0x1059B}, {0x10575, 0x1059C}, {0x10576, 0x1059D},
+         {0x10577, 0x1059E}, {0x10578, 0x1059F}, {0x10579, 0x105A0},
+         {0x1057A, 0x105A1}, {0x1057C, 0x105A3}, {0x1057D, 0x105A4},
+         {0x1057E, 0x105A5}, {0x1057F, 0x105A6}, {0x10580, 0x105A7},
+         {0x10581, 0x105A8}, {0x10582, 0x105A9}, {0x10583, 0x105AA},
+         {0x10584, 0x105AB}, {0x10585, 0x105AC}, {0x10586, 0x105AD},
+         {0x10587, 0x105AE}, {0x10588, 0x105AF}, {0x10589, 0x105B0},
+         {0x1058A, 0x105B1}, {0x1058C, 0x105B3}, {0x1058D, 0x105B4},
+         {0x1058E, 0x105B5}, {0x1058F, 0x105B6}, {0x10590, 0x105B7},
+         {0x10591, 0x105B8}, {0x10592, 0x105B9}, {0x10594, 0x105BB},
+         {0x10595, 0x105BC}, {0x10C80, 0x10CC0}, {0x10C81, 0x10CC1},
+         {0x10C82, 0x10CC2}, {0x10C83, 0x10CC3}, {0x10C84, 0x10CC4},
+         {0x10C85, 0x10CC5}, {0x10C86, 0x10CC6}, {0x10C87, 0x10CC7},
+         {0x10C88, 0x10CC8}, {0x10C89, 0x10CC9}, {0x10C8A, 0x10CCA},
+         {0x10C8B, 0x10CCB}, {0x10C8C, 0x10CCC}, {0x10C8D, 0x10CCD},
+         {0x10C8E, 0x10CCE}, {0x10C8F, 0x10CCF}, {0x10C90, 0x10CD0},
+         {0x10C91, 0x10CD1}, {0x10C92, 0x10CD2}, {0x10C93, 0x10CD3},
+         {0x10C94, 0x10CD4}, {0x10C95, 0x10CD5}, {0x10C96, 0x10CD6},
+         {0x10C97, 0x10CD7}, {0x10C98, 0x10CD8}, {0x10C99, 0x10CD9},
+         {0x10C9A, 0x10CDA}, {0x10C9B, 0x10CDB}, {0x10C9C, 0x10CDC},
+         {0x10C9D, 0x10CDD}, {0x10C9E, 0x10CDE}, {0x10C9F, 0x10CDF},
+         {0x10CA0, 0x10CE0}, {0x10CA1, 0x10CE1}, {0x10CA2, 0x10CE2},
+         {0x10CA3, 0x10CE3}, {0x10CA4, 0x10CE4}, {0x10CA5, 0x10CE5},
+         {0x10CA6, 0x10CE6}, {0x10CA7, 0x10CE7}, {0x10CA8, 0x10CE8},
+         {0x10CA9, 0x10CE9}, {0x10CAA, 0x10CEA}, {0x10CAB, 0x10CEB},
+         {0x10CAC, 0x10CEC}, {0x10CAD, 0x10CED}, {0x10CAE, 0x10CEE},
+         {0x10CAF, 0x10CEF}, {0x10CB0, 0x10CF0}, {0x10CB1, 0x10CF1},
+         {0x10CB2, 0x10CF2}, {0x10D50, 0x10D70}, {0x10D51, 0x10D71},
+         {0x10D52, 0x10D72}, {0x10D53, 0x10D73}, {0x10D54, 0x10D74},
+         {0x10D55, 0x10D75}, {0x10D56, 0x10D76}, {0x10D57, 0x10D77},
+         {0x10D58, 0x10D78}, {0x10D59, 0x10D79}, {0x10D5A, 0x10D7A},
+         {0x10D5B, 0x10D7B}, {0x10D5C, 0x10D7C}, {0x10D5D, 0x10D7D},
+         {0x10D5E, 0x10D7E}, {0x10D5F, 0x10D7F}, {0x10D60, 0x10D80},
+         {0x10D61, 0x10D81}, {0x10D62, 0x10D82}, {0x10D63, 0x10D83},
+         {0x10D64, 0x10D84}, {0x10D65, 0x10D85}, {0x118A0, 0x118C0},
+         {0x118A1, 0x118C1}, {0x118A2, 0x118C2}, {0x118A3, 0x118C3},
+         {0x118A4, 0x118C4}, {0x118A5, 0x118C5}, {0x118A6, 0x118C6},
+         {0x118A7, 0x118C7}, {0x118A8, 0x118C8}, {0x118A9, 0x118C9},
+         {0x118AA, 0x118CA}, {0x118AB, 0x118CB}, {0x118AC, 0x118CC},
+         {0x118AD, 0x118CD}, {0x118AE, 0x118CE}, {0x118AF, 0x118CF},
+         {0x118B0, 0x118D0}, {0x118B1, 0x118D1}, {0x118B2, 0x118D2},
+         {0x118B3, 0x118D3}, {0x118B4, 0x118D4}, {0x118B5, 0x118D5},
+         {0x118B6, 0x118D6}, {0x118B7, 0x118D7}, {0x118B8, 0x118D8},
+         {0x118B9, 0x118D9}, {0x118BA, 0x118DA}, {0x118BB, 0x118DB},
+         {0x118BC, 0x118DC}, {0x118BD, 0x118DD}, {0x118BE, 0x118DE},
+         {0x118BF, 0x118DF}, {0x16E40, 0x16E60}, {0x16E41, 0x16E61},
+         {0x16E42, 0x16E62}, {0x16E43, 0x16E63}, {0x16E44, 0x16E64},
+         {0x16E45, 0x16E65}, {0x16E46, 0x16E66}, {0x16E47, 0x16E67},
+         {0x16E48, 0x16E68}, {0x16E49, 0x16E69}, {0x16E4A, 0x16E6A},
+         {0x16E4B, 0x16E6B}, {0x16E4C, 0x16E6C}, {0x16E4D, 0x16E6D},
+         {0x16E4E, 0x16E6E}, {0x16E4F, 0x16E6F}, {0x16E50, 0x16E70},
+         {0x16E51, 0x16E71}, {0x16E52, 0x16E72}, {0x16E53, 0x16E73},
+         {0x16E54, 0x16E74}, {0x16E55, 0x16E75}, {0x16E56, 0x16E76},
+         {0x16E57, 0x16E77}, {0x16E58, 0x16E78}, {0x16E59, 0x16E79},
+         {0x16E5A, 0x16E7A}, {0x16E5B, 0x16E7B}, {0x16E5C, 0x16E7C},
+         {0x16E5D, 0x16E7D}, {0x16E5E, 0x16E7E}, {0x16E5F, 0x16E7F},
+         {0x16EA0, 0x16EBB}, {0x16EA1, 0x16EBC}, {0x16EA2, 0x16EBD},
+         {0x16EA3, 0x16EBE}, {0x16EA4, 0x16EBF}, {0x16EA5, 0x16EC0},
+         {0x16EA6, 0x16EC1}, {0x16EA7, 0x16EC2}, {0x16EA8, 0x16EC3},
+         {0x16EA9, 0x16EC4}, {0x16EAA, 0x16EC5}, {0x16EAB, 0x16EC6},
+         {0x16EAC, 0x16EC7}, {0x16EAD, 0x16EC8}, {0x16EAE, 0x16EC9},
+         {0x16EAF, 0x16ECA}, {0x16EB0, 0x16ECB}, {0x16EB1, 0x16ECC},
+         {0x16EB2, 0x16ECD}, {0x16EB3, 0x16ECE}, {0x16EB4, 0x16ECF},
+         {0x16EB5, 0x16ED0}, {0x16EB6, 0x16ED1}, {0x16EB7, 0x16ED2},
+         {0x16EB8, 0x16ED3}, {0x1E900, 0x1E922}, {0x1E901, 0x1E923},
+         {0x1E902, 0x1E924}, {0x1E903, 0x1E925}, {0x1E904, 0x1E926},
+         {0x1E905, 0x1E927}, {0x1E906, 0x1E928}, {0x1E907, 0x1E929},
+         {0x1E908, 0x1E92A}, {0x1E909, 0x1E92B}, {0x1E90A, 0x1E92C},
+         {0x1E90B, 0x1E92D}, {0x1E90C, 0x1E92E}, {0x1E90D, 0x1E92F},
+         {0x1E90E, 0x1E930}, {0x1E90F, 0x1E931}, {0x1E910, 0x1E932},
+         {0x1E911, 0x1E933}, {0x1E912, 0x1E934}, {0x1E913, 0x1E935},
+         {0x1E914, 0x1E936}, {0x1E915, 0x1E937}, {0x1E916, 0x1E938},
+         {0x1E917, 0x1E939}, {0x1E918, 0x1E93A}, {0x1E919, 0x1E93B},
+         {0x1E91A, 0x1E93C}, {0x1E91B, 0x1E93D}, {0x1E91C, 0x1E93E},
+         {0x1E91D, 0x1E93F}, {0x1E91E, 0x1E940}, {0x1E91F, 0x1E941},
+         {0x1E920, 0x1E942}, {0x1E921, 0x1E943}}};
+
+LIBC_INLINE_VAR constexpr auto UPPER_TO_LOWER_HASHER =
+    ptrhash::init_hasher<1415>(
+        0x1A275D28E2768536,
+        cpp::array<uint8_t, 475>{
+            0x18, 0x4,  0x40, 0x24, 0x8,  0x2,  0x0,  0x0,  0x1,  0xA,  0x19,
+            0x1E, 0xB,  0x0,  0xE,  0x0,  0x0,  0x6,  0x0,  0x11, 0xC,  0x2,
+            0xA,  0x4,  0x22, 0x1,  0x5,  0xE,  0x0,  0x0,  0x8,  0x39, 0xC,
+            0x3,  0x46, 0x0,  0x0,  0x1,  0x37, 0x3,  0x1,  0x9,  0xF,  0x7,
+            0x0,  0x3,  0x3,  0x0,  0x0,  0x0,  0x60, 0x53, 0x2,  0x0,  0x34,
+            0x3,  0x17, 0x22, 0x16, 0x2,  0x15, 0x5,  0x1D, 0x2,  0x6,  0xD,
+            0x1,  0x1,  0x0,  0x13, 0x0,  0x1,  0x0,  0xB,  0x42, 0x1D, 0xC,
+            0x0,  0xB,  0x2B, 0x1,  0x2,  0xA,  0x1C, 0x0,  0x0,  0x15, 0x3F,
+            0x5,  0x6F, 0x0,  0x7,  0x8,  0x2,  0x1,  0x2,  0x0,  0xF,  0x0,
+            0x3,  0x8,  0x27, 0x5,  0x7,  0x5,  0x2F, 0x0,  0x5,  0x0,  0x18,
+            0xF,  0x1F, 0x4,  0x0,  0x2F, 0x21, 0x17, 0x9D, 0x0,  0x27, 0x9,
+            0x33, 0x3D, 0x1,  0x0,  0x1D, 0x1A, 0x7,  0x2,  0x1,  0x5,  0x17,
+            0x0,  0x4,  0x6,  0x36, 0x1,  0x6,  0xD,  0x25, 0x2,  0x4B, 0x15,
+            0x5,  0x7,  0x0,  0xA,  0x1F, 0x5,  0xCF, 0x7,  0x3D, 0x0,  0x9,
+            0x69, 0xB,  0x5,  0x14, 0x7,  0x40, 0x0,  0xE,  0xF,  0x12, 0x3,
+            0x1,  0x3,  0x2,  0x1,  0x1,  0xE,  0x7,  0x16, 0x9,  0x6,  0xD,
+            0x12, 0xC,  0x0,  0x1,  0x2,  0x33, 0x4,  0xC2, 0x6,  0x0,  0x0,
+            0xCF, 0x0,  0x6,  0x19, 0x1,  0xC,  0x52, 0x42, 0x0,  0x0,  0xE,
+            0x26, 0x9,  0x17, 0x0,  0x6,  0x0,  0x1,  0x0,  0x12, 0x10, 0x1A,
+            0x1B, 0x7,  0x1B, 0x9,  0xC,  0x2,  0x58, 0x8A, 0xD,  0x0,  0x49,
+            0x52, 0x0,  0x24, 0x7,  0x0,  0xFB, 0x12, 0x13, 0x2,  0x0,  0x0,
+            0x3,  0x18, 0x3,  0x34, 0x3C, 0x10, 0x7,  0x4,  0x47, 0x1,  0x11,
+            0x4F, 0x0,  0x12, 0x3,  0x6,  0x0,  0x8,  0x43, 0x6,  0x0,  0x2,
+            0x2,  0x4,  0x11, 0x5C, 0x72, 0x0,  0x21, 0x13, 0x18, 0x0,  0x11,
+            0x0,  0x0,  0x1,  0xB,  0xAE, 0x14, 0x12, 0x0,  0x4D, 0x4,  0xC,
+            0x26, 0x52, 0x5,  0x0,  0x0,  0x12, 0x39, 0x26, 0x17, 0x13, 0x2A,
+            0x8,  0x17, 0x1C, 0x0,  0x85, 0x3A, 0x0,  0x5D, 0x22, 0x66, 0x0,
+            0x2,  0x1,  0x47, 0xBF, 0xA3, 0x2,  0xA,  0x46, 0x0,  0x1B, 0x5,
+            0x1A, 0x3,  0x1,  0x2D, 0x0,  0x29, 0x5,  0x0,  0x2,  0x27, 0x7,
+            0x0,  0x1D, 0x5,  0x7,  0x1A, 0x1,  0x2,  0x0,  0x3B, 0x0,  0xD,
+            0x5F, 0x31, 0x9B, 0x19, 0x82, 0x8,  0xD,  0x36, 0x0,  0x1C, 0x38,
+            0xDB, 0xB,  0x0,  0xB5, 0xC,  0xA,  0x2F, 0x16, 0x4B, 0x16, 0x16,
+            0x26, 0x4,  0x1,  0x13, 0x3,  0x0,  0x12, 0x1A, 0x3,  0xE8, 0x22,
+            0x1,  0x6B, 0x38, 0x2,  0x16, 0xC,  0x1A, 0xAB, 0x27, 0xC,  0x33,
+            0x5C, 0x2,  0x2,  0x8,  0xFD, 0x7,  0x33, 0x38, 0x0,  0x22, 0x7F,
+            0x45, 0xC,  0x6F, 0x3,  0x0,  0x3C, 0x13, 0x3C, 0xC6, 0x15, 0x22,
+            0x3A, 0x8,  0x1,  0x5C, 0x3,  0x14, 0x32, 0x2,  0x0,  0x31, 0x79,
+            0x2,  0xE9, 0x1E, 0x0,  0xB,  0x1B, 0x4D, 0x0,  0x0,  0xB3, 0x0,
+            0x16, 0x73, 0x0,  0x0,  0x9,  0x0,  0x5,  0x9,  0xD6, 0xA6, 0x3D,
+            0x7,  0x4,  0x27, 0xA,  0x9B, 0x57, 0xA2, 0xB,  0x2E, 0x1C, 0xE9,
+            0x56, 0x2B, 0x8,  0x18, 0x49, 0x43, 0x48, 0x0,  0x44, 0x1B, 0x1A,
+            0x24, 0xC,  0x20, 0x3C, 0xEC, 0x76, 0x4,  0x0,  0x2,  0xAC, 0xF,
+            0x3,  0x2,  0x2,  0x16, 0x34, 0x2,  0x20, 0x2A, 0x44, 0x43, 0x0,
+            0x2C, 0x1D},
+        cpp::array<uint32_t, 14>{0xC5, 0xD8, 0x115, 0x197, 0x1B9, 0x1EF, 0x214,
+                                 0x226, 0x413, 0x487, 0x493, 0x4A7, 0x4AC,
+                                 0x514});
+
+LIBC_INLINE_VAR constexpr PerfectHashMap<1415, decltype(UPPER_TO_LOWER_HASHER)>
+    UPPER_TO_LOWER_MAP{UPPER_TO_LOWER_DATA, UPPER_TO_LOWER_HASHER};
+
+} // namespace LIBC_NAMESPACE_DECL
+
+#endif // LLVM_LIBC_SRC___SUPPORT_WCTYPE_UPPER_TO_LOWER_H
diff --git a/libc/src/__support/wctype/upper_to_lower.inc b/libc/src/__support/wctype/upper_to_lower.inc
deleted file mode 100644
index 2b35b58082d1f..0000000000000
--- a/libc/src/__support/wctype/upper_to_lower.inc
+++ /dev/null
@@ -1,390 +0,0 @@
-//===-- Auto-generated upper to lower case mappings table -------*- C++ -*-===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-// DO NOT EDIT MANUALLY.
-// This file is generated by libc/utils/wctype_utils scripts.
-// This file is meant to be included directly into LLVM libc code
-// Format: {from_codepoint, to_codepoint}
-// Info: 1415 entries
-
-{0x41, 0x61}, {0x42, 0x62}, {0x43, 0x63}, {0x44, 0x64}, {0x45, 0x65},
-    {0x46, 0x66}, {0x47, 0x67}, {0x48, 0x68}, {0x49, 0x69}, {0x4A, 0x6A},
-    {0x4B, 0x6B}, {0x4C, 0x6C}, {0x4D, 0x6D}, {0x4E, 0x6E}, {0x4F, 0x6F},
-    {0x50, 0x70}, {0x51, 0x71}, {0x52, 0x72}, {0x53, 0x73}, {0x54, 0x74},
-    {0x55, 0x75}, {0x56, 0x76}, {0x57, 0x77}, {0x58, 0x78}, {0x59, 0x79},
-    {0x5A, 0x7A}, {0xC0, 0xE0}, {0xC1, 0xE1}, {0xC2, 0xE2}, {0xC3, 0xE3},
-    {0xC4, 0xE4}, {0xC5, 0xE5}, {0xC6, 0xE6}, {0xC7, 0xE7}, {0xC8, 0xE8},
-    {0xC9, 0xE9}, {0xCA, 0xEA}, {0xCB, 0xEB}, {0xCC, 0xEC}, {0xCD, 0xED},
-    {0xCE, 0xEE}, {0xCF, 0xEF}, {0xD0, 0xF0}, {0xD1, 0xF1}, {0xD2, 0xF2},
-    {0xD3, 0xF3}, {0xD4, 0xF4}, {0xD5, 0xF5}, {0xD6, 0xF6}, {0xD8, 0xF8},
-    {0xD9, 0xF9}, {0xDA, 0xFA}, {0xDB, 0xFB}, {0xDC, 0xFC}, {0xDD, 0xFD},
-    {0xDE, 0xFE}, {0x100, 0x101}, {0x102, 0x103}, {0x104, 0x105},
-    {0x106, 0x107}, {0x108, 0x109}, {0x10A, 0x10B}, {0x10C, 0x10D},
-    {0x10E, 0x10F}, {0x110, 0x111}, {0x112, 0x113}, {0x114, 0x115},
-    {0x116, 0x117}, {0x118, 0x119}, {0x11A, 0x11B}, {0x11C, 0x11D},
-    {0x11E, 0x11F}, {0x120, 0x121}, {0x122, 0x123}, {0x124, 0x125},
-    {0x126, 0x127}, {0x128, 0x129}, {0x12A, 0x12B}, {0x12C, 0x12D},
-    {0x12E, 0x12F}, {0x130, 0x69}, {0x132, 0x133}, {0x134, 0x135},
-    {0x136, 0x137}, {0x139, 0x13A}, {0x13B, 0x13C}, {0x13D, 0x13E},
-    {0x13F, 0x140}, {0x141, 0x142}, {0x143, 0x144}, {0x145, 0x146},
-    {0x147, 0x148}, {0x14A, 0x14B}, {0x14C, 0x14D}, {0x14E, 0x14F},
-    {0x150, 0x151}, {0x152, 0x153}, {0x154, 0x155}, {0x156, 0x157},
-    {0x158, 0x159}, {0x15A, 0x15B}, {0x15C, 0x15D}, {0x15E, 0x15F},
-    {0x160, 0x161}, {0x162, 0x163}, {0x164, 0x165}, {0x166, 0x167},
-    {0x168, 0x169}, {0x16A, 0x16B}, {0x16C, 0x16D}, {0x16E, 0x16F},
-    {0x170, 0x171}, {0x172, 0x173}, {0x174, 0x175}, {0x176, 0x177},
-    {0x178, 0xFF}, {0x179, 0x17A}, {0x17B, 0x17C}, {0x17D, 0x17E},
-    {0x181, 0x253}, {0x182, 0x183}, {0x184, 0x185}, {0x186, 0x254},
-    {0x187, 0x188}, {0x189, 0x256}, {0x18A, 0x257}, {0x18B, 0x18C},
-    {0x18E, 0x1DD}, {0x18F, 0x259}, {0x190, 0x25B}, {0x191, 0x192},
-    {0x193, 0x260}, {0x194, 0x263}, {0x196, 0x269}, {0x197, 0x268},
-    {0x198, 0x199}, {0x19C, 0x26F}, {0x19D, 0x272}, {0x19F, 0x275},
-    {0x1A0, 0x1A1}, {0x1A2, 0x1A3}, {0x1A4, 0x1A5}, {0x1A6, 0x280},
-    {0x1A7, 0x1A8}, {0x1A9, 0x283}, {0x1AC, 0x1AD}, {0x1AE, 0x288},
-    {0x1AF, 0x1B0}, {0x1B1, 0x28A}, {0x1B2, 0x28B}, {0x1B3, 0x1B4},
-    {0x1B5, 0x1B6}, {0x1B7, 0x292}, {0x1B8, 0x1B9}, {0x1BC, 0x1BD},
-    {0x1C4, 0x1C6}, {0x1C7, 0x1C9}, {0x1CA, 0x1CC}, {0x1CD, 0x1CE},
-    {0x1CF, 0x1D0}, {0x1D1, 0x1D2}, {0x1D3, 0x1D4}, {0x1D5, 0x1D6},
-    {0x1D7, 0x1D8}, {0x1D9, 0x1DA}, {0x1DB, 0x1DC}, {0x1DE, 0x1DF},
-    {0x1E0, 0x1E1}, {0x1E2, 0x1E3}, {0x1E4, 0x1E5}, {0x1E6, 0x1E7},
-    {0x1E8, 0x1E9}, {0x1EA, 0x1EB}, {0x1EC, 0x1ED}, {0x1EE, 0x1EF},
-    {0x1F1, 0x1F3}, {0x1F4, 0x1F5}, {0x1F6, 0x195}, {0x1F7, 0x1BF},
-    {0x1F8, 0x1F9}, {0x1FA, 0x1FB}, {0x1FC, 0x1FD}, {0x1FE, 0x1FF},
-    {0x200, 0x201}, {0x202, 0x203}, {0x204, 0x205}, {0x206, 0x207},
-    {0x208, 0x209}, {0x20A, 0x20B}, {0x20C, 0x20D}, {0x20E, 0x20F},
-    {0x210, 0x211}, {0x212, 0x213}, {0x214, 0x215}, {0x216, 0x217},
-    {0x218, 0x219}, {0x21A, 0x21B}, {0x21C, 0x21D}, {0x21E, 0x21F},
-    {0x220, 0x19E}, {0x222, 0x223}, {0x224, 0x225}, {0x226, 0x227},
-    {0x228, 0x229}, {0x22A, 0x22B}, {0x22C, 0x22D}, {0x22E, 0x22F},
-    {0x230, 0x231}, {0x232, 0x233}, {0x23A, 0x2C65}, {0x23B, 0x23C},
-    {0x23D, 0x19A}, {0x23E, 0x2C66}, {0x241, 0x242}, {0x243, 0x180},
-    {0x244, 0x289}, {0x245, 0x28C}, {0x246, 0x247}, {0x248, 0x249},
-    {0x24A, 0x24B}, {0x24C, 0x24D}, {0x24E, 0x24F}, {0x370, 0x371},
-    {0x372, 0x373}, {0x376, 0x377}, {0x37F, 0x3F3}, {0x386, 0x3AC},
-    {0x388, 0x3AD}, {0x389, 0x3AE}, {0x38A, 0x3AF}, {0x38C, 0x3CC},
-    {0x38E, 0x3CD}, {0x38F, 0x3CE}, {0x391, 0x3B1}, {0x392, 0x3B2},
-    {0x393, 0x3B3}, {0x394, 0x3B4}, {0x395, 0x3B5}, {0x396, 0x3B6},
-    {0x397, 0x3B7}, {0x398, 0x3B8}, {0x399, 0x3B9}, {0x39A, 0x3BA},
-    {0x39B, 0x3BB}, {0x39C, 0x3BC}, {0x39D, 0x3BD}, {0x39E, 0x3BE},
-    {0x39F, 0x3BF}, {0x3A0, 0x3C0}, {0x3A1, 0x3C1}, {0x3A3, 0x3C3},
-    {0x3A4, 0x3C4}, {0x3A5, 0x3C5}, {0x3A6, 0x3C6}, {0x3A7, 0x3C7},
-    {0x3A8, 0x3C8}, {0x3A9, 0x3C9}, {0x3AA, 0x3CA}, {0x3AB, 0x3CB},
-    {0x3CF, 0x3D7}, {0x3D8, 0x3D9}, {0x3DA, 0x3DB}, {0x3DC, 0x3DD},
-    {0x3DE, 0x3DF}, {0x3E0, 0x3E1}, {0x3E2, 0x3E3}, {0x3E4, 0x3E5},
-    {0x3E6, 0x3E7}, {0x3E8, 0x3E9}, {0x3EA, 0x3EB}, {0x3EC, 0x3ED},
-    {0x3EE, 0x3EF}, {0x3F4, 0x3B8}, {0x3F7, 0x3F8}, {0x3F9, 0x3F2},
-    {0x3FA, 0x3FB}, {0x3FD, 0x37B}, {0x3FE, 0x37C}, {0x3FF, 0x37D},
-    {0x400, 0x450}, {0x401, 0x451}, {0x402, 0x452}, {0x403, 0x453},
-    {0x404, 0x454}, {0x405, 0x455}, {0x406, 0x456}, {0x407, 0x457},
-    {0x408, 0x458}, {0x409, 0x459}, {0x40A, 0x45A}, {0x40B, 0x45B},
-    {0x40C, 0x45C}, {0x40D, 0x45D}, {0x40E, 0x45E}, {0x40F, 0x45F},
-    {0x410, 0x430}, {0x411, 0x431}, {0x412, 0x432}, {0x413, 0x433},
-    {0x414, 0x434}, {0x415, 0x435}, {0x416, 0x436}, {0x417, 0x437},
-    {0x418, 0x438}, {0x419, 0x439}, {0x41A, 0x43A}, {0x41B, 0x43B},
-    {0x41C, 0x43C}, {0x41D, 0x43D}, {0x41E, 0x43E}, {0x41F, 0x43F},
-    {0x420, 0x440}, {0x421, 0x441}, {0x422, 0x442}, {0x423, 0x443},
-    {0x424, 0x444}, {0x425, 0x445}, {0x426, 0x446}, {0x427, 0x447},
-    {0x428, 0x448}, {0x429, 0x449}, {0x42A, 0x44A}, {0x42B, 0x44B},
-    {0x42C, 0x44C}, {0x42D, 0x44D}, {0x42E, 0x44E}, {0x42F, 0x44F},
-    {0x460, 0x461}, {0x462, 0x463}, {0x464, 0x465}, {0x466, 0x467},
-    {0x468, 0x469}, {0x46A, 0x46B}, {0x46C, 0x46D}, {0x46E, 0x46F},
-    {0x470, 0x471}, {0x472, 0x473}, {0x474, 0x475}, {0x476, 0x477},
-    {0x478, 0x479}, {0x47A, 0x47B}, {0x47C, 0x47D}, {0x47E, 0x47F},
-    {0x480, 0x481}, {0x48A, 0x48B}, {0x48C, 0x48D}, {0x48E, 0x48F},
-    {0x490, 0x491}, {0x492, 0x493}, {0x494, 0x495}, {0x496, 0x497},
-    {0x498, 0x499}, {0x49A, 0x49B}, {0x49C, 0x49D}, {0x49E, 0x49F},
-    {0x4A0, 0x4A1}, {0x4A2, 0x4A3}, {0x4A4, 0x4A5}, {0x4A6, 0x4A7},
-    {0x4A8, 0x4A9}, {0x4AA, 0x4AB}, {0x4AC, 0x4AD}, {0x4AE, 0x4AF},
-    {0x4B0, 0x4B1}, {0x4B2, 0x4B3}, {0x4B4, 0x4B5}, {0x4B6, 0x4B7},
-    {0x4B8, 0x4B9}, {0x4BA, 0x4BB}, {0x4BC, 0x4BD}, {0x4BE, 0x4BF},
-    {0x4C0, 0x4CF}, {0x4C1, 0x4C2}, {0x4C3, 0x4C4}, {0x4C5, 0x4C6},
-    {0x4C7, 0x4C8}, {0x4C9, 0x4CA}, {0x4CB, 0x4CC}, {0x4CD, 0x4CE},
-    {0x4D0, 0x4D1}, {0x4D2, 0x4D3}, {0x4D4, 0x4D5}, {0x4D6, 0x4D7},
-    {0x4D8, 0x4D9}, {0x4DA, 0x4DB}, {0x4DC, 0x4DD}, {0x4DE, 0x4DF},
-    {0x4E0, 0x4E1}, {0x4E2, 0x4E3}, {0x4E4, 0x4E5}, {0x4E6, 0x4E7},
-    {0x4E8, 0x4E9}, {0x4EA, 0x4EB}, {0x4EC, 0x4ED}, {0x4EE, 0x4EF},
-    {0x4F0, 0x4F1}, {0x4F2, 0x4F3}, {0x4F4, 0x4F5}, {0x4F6, 0x4F7},
-    {0x4F8, 0x4F9}, {0x4FA, 0x4FB}, {0x4FC, 0x4FD}, {0x4FE, 0x4FF},
-    {0x500, 0x501}, {0x502, 0x503}, {0x504, 0x505}, {0x506, 0x507},
-    {0x508, 0x509}, {0x50A, 0x50B}, {0x50C, 0x50D}, {0x50E, 0x50F},
-    {0x510, 0x511}, {0x512, 0x513}, {0x514, 0x515}, {0x516, 0x517},
-    {0x518, 0x519}, {0x51A, 0x51B}, {0x51C, 0x51D}, {0x51E, 0x51F},
-    {0x520, 0x521}, {0x522, 0x523}, {0x524, 0x525}, {0x526, 0x527},
-    {0x528, 0x529}, {0x52A, 0x52B}, {0x52C, 0x52D}, {0x52E, 0x52F},
-    {0x531, 0x561}, {0x532, 0x562}, {0x533, 0x563}, {0x534, 0x564},
-    {0x535, 0x565}, {0x536, 0x566}, {0x537, 0x567}, {0x538, 0x568},
-    {0x539, 0x569}, {0x53A, 0x56A}, {0x53B, 0x56B}, {0x53C, 0x56C},
-    {0x53D, 0x56D}, {0x53E, 0x56E}, {0x53F, 0x56F}, {0x540, 0x570},
-    {0x541, 0x571}, {0x542, 0x572}, {0x543, 0x573}, {0x544, 0x574},
-    {0x545, 0x575}, {0x546, 0x576}, {0x547, 0x577}, {0x548, 0x578},
-    {0x549, 0x579}, {0x54A, 0x57A}, {0x54B, 0x57B}, {0x54C, 0x57C},
-    {0x54D, 0x57D}, {0x54E, 0x57E}, {0x54F, 0x57F}, {0x550, 0x580},
-    {0x551, 0x581}, {0x552, 0x582}, {0x553, 0x583}, {0x554, 0x584},
-    {0x555, 0x585}, {0x556, 0x586}, {0x10A0, 0x2D00}, {0x10A1, 0x2D01},
-    {0x10A2, 0x2D02}, {0x10A3, 0x2D03}, {0x10A4, 0x2D04}, {0x10A5, 0x2D05},
-    {0x10A6, 0x2D06}, {0x10A7, 0x2D07}, {0x10A8, 0x2D08}, {0x10A9, 0x2D09},
-    {0x10AA, 0x2D0A}, {0x10AB, 0x2D0B}, {0x10AC, 0x2D0C}, {0x10AD, 0x2D0D},
-    {0x10AE, 0x2D0E}, {0x10AF, 0x2D0F}, {0x10B0, 0x2D10}, {0x10B1, 0x2D11},
-    {0x10B2, 0x2D12}, {0x10B3, 0x2D13}, {0x10B4, 0x2D14}, {0x10B5, 0x2D15},
-    {0x10B6, 0x2D16}, {0x10B7, 0x2D17}, {0x10B8, 0x2D18}, {0x10B9, 0x2D19},
-    {0x10BA, 0x2D1A}, {0x10BB, 0x2D1B}, {0x10BC, 0x2D1C}, {0x10BD, 0x2D1D},
-    {0x10BE, 0x2D1E}, {0x10BF, 0x2D1F}, {0x10C0, 0x2D20}, {0x10C1, 0x2D21},
-    {0x10C2, 0x2D22}, {0x10C3, 0x2D23}, {0x10C4, 0x2D24}, {0x10C5, 0x2D25},
-    {0x10C7, 0x2D27}, {0x10CD, 0x2D2D}, {0x13A0, 0xAB70}, {0x13A1, 0xAB71},
-    {0x13A2, 0xAB72}, {0x13A3, 0xAB73}, {0x13A4, 0xAB74}, {0x13A5, 0xAB75},
-    {0x13A6, 0xAB76}, {0x13A7, 0xAB77}, {0x13A8, 0xAB78}, {0x13A9, 0xAB79},
-    {0x13AA, 0xAB7A}, {0x13AB, 0xAB7B}, {0x13AC, 0xAB7C}, {0x13AD, 0xAB7D},
-    {0x13AE, 0xAB7E}, {0x13AF, 0xAB7F}, {0x13B0, 0xAB80}, {0x13B1, 0xAB81},
-    {0x13B2, 0xAB82}, {0x13B3, 0xAB83}, {0x13B4, 0xAB84}, {0x13B5, 0xAB85},
-    {0x13B6, 0xAB86}, {0x13B7, 0xAB87}, {0x13B8, 0xAB88}, {0x13B9, 0xAB89},
-    {0x13BA, 0xAB8A}, {0x13BB, 0xAB8B}, {0x13BC, 0xAB8C}, {0x13BD, 0xAB8D},
-    {0x13BE, 0xAB8E}, {0x13BF, 0xAB8F}, {0x13C0, 0xAB90}, {0x13C1, 0xAB91},
-    {0x13C2, 0xAB92}, {0x13C3, 0xAB93}, {0x13C4, 0xAB94}, {0x13C5, 0xAB95},
-    {0x13C6, 0xAB96}, {0x13C7, 0xAB97}, {0x13C8, 0xAB98}, {0x13C9, 0xAB99},
-    {0x13CA, 0xAB9A}, {0x13CB, 0xAB9B}, {0x13CC, 0xAB9C}, {0x13CD, 0xAB9D},
-    {0x13CE, 0xAB9E}, {0x13CF, 0xAB9F}, {0x13D0, 0xABA0}, {0x13D1, 0xABA1},
-    {0x13D2, 0xABA2}, {0x13D3, 0xABA3}, {0x13D4, 0xABA4}, {0x13D5, 0xABA5},
-    {0x13D6, 0xABA6}, {0x13D7, 0xABA7}, {0x13D8, 0xABA8}, {0x13D9, 0xABA9},
-    {0x13DA, 0xABAA}, {0x13DB, 0xABAB}, {0x13DC, 0xABAC}, {0x13DD, 0xABAD},
-    {0x13DE, 0xABAE}, {0x13DF, 0xABAF}, {0x13E0, 0xABB0}, {0x13E1, 0xABB1},
-    {0x13E2, 0xABB2}, {0x13E3, 0xABB3}, {0x13E4, 0xABB4}, {0x13E5, 0xABB5},
-    {0x13E6, 0xABB6}, {0x13E7, 0xABB7}, {0x13E8, 0xABB8}, {0x13E9, 0xABB9},
-    {0x13EA, 0xABBA}, {0x13EB, 0xABBB}, {0x13EC, 0xABBC}, {0x13ED, 0xABBD},
-    {0x13EE, 0xABBE}, {0x13EF, 0xABBF}, {0x13F0, 0x13F8}, {0x13F1, 0x13F9},
-    {0x13F2, 0x13FA}, {0x13F3, 0x13FB}, {0x13F4, 0x13FC}, {0x13F5, 0x13FD},
-    {0x1C89, 0x1C8A}, {0x1C90, 0x10D0}, {0x1C91, 0x10D1}, {0x1C92, 0x10D2},
-    {0x1C93, 0x10D3}, {0x1C94, 0x10D4}, {0x1C95, 0x10D5}, {0x1C96, 0x10D6},
-    {0x1C97, 0x10D7}, {0x1C98, 0x10D8}, {0x1C99, 0x10D9}, {0x1C9A, 0x10DA},
-    {0x1C9B, 0x10DB}, {0x1C9C, 0x10DC}, {0x1C9D, 0x10DD}, {0x1C9E, 0x10DE},
-    {0x1C9F, 0x10DF}, {0x1CA0, 0x10E0}, {0x1CA1, 0x10E1}, {0x1CA2, 0x10E2},
-    {0x1CA3, 0x10E3}, {0x1CA4, 0x10E4}, {0x1CA5, 0x10E5}, {0x1CA6, 0x10E6},
-    {0x1CA7, 0x10E7}, {0x1CA8, 0x10E8}, {0x1CA9, 0x10E9}, {0x1CAA, 0x10EA},
-    {0x1CAB, 0x10EB}, {0x1CAC, 0x10EC}, {0x1CAD, 0x10ED}, {0x1CAE, 0x10EE},
-    {0x1CAF, 0x10EF}, {0x1CB0, 0x10F0}, {0x1CB1, 0x10F1}, {0x1CB2, 0x10F2},
-    {0x1CB3, 0x10F3}, {0x1CB4, 0x10F4}, {0x1CB5, 0x10F5}, {0x1CB6, 0x10F6},
-    {0x1CB7, 0x10F7}, {0x1CB8, 0x10F8}, {0x1CB9, 0x10F9}, {0x1CBA, 0x10FA},
-    {0x1CBD, 0x10FD}, {0x1CBE, 0x10FE}, {0x1CBF, 0x10FF}, {0x1E00, 0x1E01},
-    {0x1E02, 0x1E03}, {0x1E04, 0x1E05}, {0x1E06, 0x1E07}, {0x1E08, 0x1E09},
-    {0x1E0A, 0x1E0B}, {0x1E0C, 0x1E0D}, {0x1E0E, 0x1E0F}, {0x1E10, 0x1E11},
-    {0x1E12, 0x1E13}, {0x1E14, 0x1E15}, {0x1E16, 0x1E17}, {0x1E18, 0x1E19},
-    {0x1E1A, 0x1E1B}, {0x1E1C, 0x1E1D}, {0x1E1E, 0x1E1F}, {0x1E20, 0x1E21},
-    {0x1E22, 0x1E23}, {0x1E24, 0x1E25}, {0x1E26, 0x1E27}, {0x1E28, 0x1E29},
-    {0x1E2A, 0x1E2B}, {0x1E2C, 0x1E2D}, {0x1E2E, 0x1E2F}, {0x1E30, 0x1E31},
-    {0x1E32, 0x1E33}, {0x1E34, 0x1E35}, {0x1E36, 0x1E37}, {0x1E38, 0x1E39},
-    {0x1E3A, 0x1E3B}, {0x1E3C, 0x1E3D}, {0x1E3E, 0x1E3F}, {0x1E40, 0x1E41},
-    {0x1E42, 0x1E43}, {0x1E44, 0x1E45}, {0x1E46, 0x1E47}, {0x1E48, 0x1E49},
-    {0x1E4A, 0x1E4B}, {0x1E4C, 0x1E4D}, {0x1E4E, 0x1E4F}, {0x1E50, 0x1E51},
-    {0x1E52, 0x1E53}, {0x1E54, 0x1E55}, {0x1E56, 0x1E57}, {0x1E58, 0x1E59},
-    {0x1E5A, 0x1E5B}, {0x1E5C, 0x1E5D}, {0x1E5E, 0x1E5F}, {0x1E60, 0x1E61},
-    {0x1E62, 0x1E63}, {0x1E64, 0x1E65}, {0x1E66, 0x1E67}, {0x1E68, 0x1E69},
-    {0x1E6A, 0x1E6B}, {0x1E6C, 0x1E6D}, {0x1E6E, 0x1E6F}, {0x1E70, 0x1E71},
-    {0x1E72, 0x1E73}, {0x1E74, 0x1E75}, {0x1E76, 0x1E77}, {0x1E78, 0x1E79},
-    {0x1E7A, 0x1E7B}, {0x1E7C, 0x1E7D}, {0x1E7E, 0x1E7F}, {0x1E80, 0x1E81},
-    {0x1E82, 0x1E83}, {0x1E84, 0x1E85}, {0x1E86, 0x1E87}, {0x1E88, 0x1E89},
-    {0x1E8A, 0x1E8B}, {0x1E8C, 0x1E8D}, {0x1E8E, 0x1E8F}, {0x1E90, 0x1E91},
-    {0x1E92, 0x1E93}, {0x1E94, 0x1E95}, {0x1E9E, 0xDF}, {0x1EA0, 0x1EA1},
-    {0x1EA2, 0x1EA3}, {0x1EA4, 0x1EA5}, {0x1EA6, 0x1EA7}, {0x1EA8, 0x1EA9},
-    {0x1EAA, 0x1EAB}, {0x1EAC, 0x1EAD}, {0x1EAE, 0x1EAF}, {0x1EB0, 0x1EB1},
-    {0x1EB2, 0x1EB3}, {0x1EB4, 0x1EB5}, {0x1EB6, 0x1EB7}, {0x1EB8, 0x1EB9},
-    {0x1EBA, 0x1EBB}, {0x1EBC, 0x1EBD}, {0x1EBE, 0x1EBF}, {0x1EC0, 0x1EC1},
-    {0x1EC2, 0x1EC3}, {0x1EC4, 0x1EC5}, {0x1EC6, 0x1EC7}, {0x1EC8, 0x1EC9},
-    {0x1ECA, 0x1ECB}, {0x1ECC, 0x1ECD}, {0x1ECE, 0x1ECF}, {0x1ED0, 0x1ED1},
-    {0x1ED2, 0x1ED3}, {0x1ED4, 0x1ED5}, {0x1ED6, 0x1ED7}, {0x1ED8, 0x1ED9},
-    {0x1EDA, 0x1EDB}, {0x1EDC, 0x1EDD}, {0x1EDE, 0x1EDF}, {0x1EE0, 0x1EE1},
-    {0x1EE2, 0x1EE3}, {0x1EE4, 0x1EE5}, {0x1EE6, 0x1EE7}, {0x1EE8, 0x1EE9},
-    {0x1EEA, 0x1EEB}, {0x1EEC, 0x1EED}, {0x1EEE, 0x1EEF}, {0x1EF0, 0x1EF1},
-    {0x1EF2, 0x1EF3}, {0x1EF4, 0x1EF5}, {0x1EF6, 0x1EF7}, {0x1EF8, 0x1EF9},
-    {0x1EFA, 0x1EFB}, {0x1EFC, 0x1EFD}, {0x1EFE, 0x1EFF}, {0x1F08, 0x1F00},
-    {0x1F09, 0x1F01}, {0x1F0A, 0x1F02}, {0x1F0B, 0x1F03}, {0x1F0C, 0x1F04},
-    {0x1F0D, 0x1F05}, {0x1F0E, 0x1F06}, {0x1F0F, 0x1F07}, {0x1F18, 0x1F10},
-    {0x1F19, 0x1F11}, {0x1F1A, 0x1F12}, {0x1F1B, 0x1F13}, {0x1F1C, 0x1F14},
-    {0x1F1D, 0x1F15}, {0x1F28, 0x1F20}, {0x1F29, 0x1F21}, {0x1F2A, 0x1F22},
-    {0x1F2B, 0x1F23}, {0x1F2C, 0x1F24}, {0x1F2D, 0x1F25}, {0x1F2E, 0x1F26},
-    {0x1F2F, 0x1F27}, {0x1F38, 0x1F30}, {0x1F39, 0x1F31}, {0x1F3A, 0x1F32},
-    {0x1F3B, 0x1F33}, {0x1F3C, 0x1F34}, {0x1F3D, 0x1F35}, {0x1F3E, 0x1F36},
-    {0x1F3F, 0x1F37}, {0x1F48, 0x1F40}, {0x1F49, 0x1F41}, {0x1F4A, 0x1F42},
-    {0x1F4B, 0x1F43}, {0x1F4C, 0x1F44}, {0x1F4D, 0x1F45}, {0x1F59, 0x1F51},
-    {0x1F5B, 0x1F53}, {0x1F5D, 0x1F55}, {0x1F5F, 0x1F57}, {0x1F68, 0x1F60},
-    {0x1F69, 0x1F61}, {0x1F6A, 0x1F62}, {0x1F6B, 0x1F63}, {0x1F6C, 0x1F64},
-    {0x1F6D, 0x1F65}, {0x1F6E, 0x1F66}, {0x1F6F, 0x1F67}, {0x1FB8, 0x1FB0},
-    {0x1FB9, 0x1FB1}, {0x1FBA, 0x1F70}, {0x1FBB, 0x1F71}, {0x1FC8, 0x1F72},
-    {0x1FC9, 0x1F73}, {0x1FCA, 0x1F74}, {0x1FCB, 0x1F75}, {0x1FD8, 0x1FD0},
-    {0x1FD9, 0x1FD1}, {0x1FDA, 0x1F76}, {0x1FDB, 0x1F77}, {0x1FE8, 0x1FE0},
-    {0x1FE9, 0x1FE1}, {0x1FEA, 0x1F7A}, {0x1FEB, 0x1F7B}, {0x1FEC, 0x1FE5},
-    {0x1FF8, 0x1F78}, {0x1FF9, 0x1F79}, {0x1FFA, 0x1F7C}, {0x1FFB, 0x1F7D},
-    {0x2126, 0x3C9}, {0x212A, 0x6B}, {0x212B, 0xE5}, {0x2132, 0x214E},
-    {0x2183, 0x2184}, {0x2C00, 0x2C30}, {0x2C01, 0x2C31}, {0x2C02, 0x2C32},
-    {0x2C03, 0x2C33}, {0x2C04, 0x2C34}, {0x2C05, 0x2C35}, {0x2C06, 0x2C36},
-    {0x2C07, 0x2C37}, {0x2C08, 0x2C38}, {0x2C09, 0x2C39}, {0x2C0A, 0x2C3A},
-    {0x2C0B, 0x2C3B}, {0x2C0C, 0x2C3C}, {0x2C0D, 0x2C3D}, {0x2C0E, 0x2C3E},
-    {0x2C0F, 0x2C3F}, {0x2C10, 0x2C40}, {0x2C11, 0x2C41}, {0x2C12, 0x2C42},
-    {0x2C13, 0x2C43}, {0x2C14, 0x2C44}, {0x2C15, 0x2C45}, {0x2C16, 0x2C46},
-    {0x2C17, 0x2C47}, {0x2C18, 0x2C48}, {0x2C19, 0x2C49}, {0x2C1A, 0x2C4A},
-    {0x2C1B, 0x2C4B}, {0x2C1C, 0x2C4C}, {0x2C1D, 0x2C4D}, {0x2C1E, 0x2C4E},
-    {0x2C1F, 0x2C4F}, {0x2C20, 0x2C50}, {0x2C21, 0x2C51}, {0x2C22, 0x2C52},
-    {0x2C23, 0x2C53}, {0x2C24, 0x2C54}, {0x2C25, 0x2C55}, {0x2C26, 0x2C56},
-    {0x2C27, 0x2C57}, {0x2C28, 0x2C58}, {0x2C29, 0x2C59}, {0x2C2A, 0x2C5A},
-    {0x2C2B, 0x2C5B}, {0x2C2C, 0x2C5C}, {0x2C2D, 0x2C5D}, {0x2C2E, 0x2C5E},
-    {0x2C2F, 0x2C5F}, {0x2C60, 0x2C61}, {0x2C62, 0x26B}, {0x2C63, 0x1D7D},
-    {0x2C64, 0x27D}, {0x2C67, 0x2C68}, {0x2C69, 0x2C6A}, {0x2C6B, 0x2C6C},
-    {0x2C6D, 0x251}, {0x2C6E, 0x271}, {0x2C6F, 0x250}, {0x2C70, 0x252},
-    {0x2C72, 0x2C73}, {0x2C75, 0x2C76}, {0x2C7E, 0x23F}, {0x2C7F, 0x240},
-    {0x2C80, 0x2C81}, {0x2C82, 0x2C83}, {0x2C84, 0x2C85}, {0x2C86, 0x2C87},
-    {0x2C88, 0x2C89}, {0x2C8A, 0x2C8B}, {0x2C8C, 0x2C8D}, {0x2C8E, 0x2C8F},
-    {0x2C90, 0x2C91}, {0x2C92, 0x2C93}, {0x2C94, 0x2C95}, {0x2C96, 0x2C97},
-    {0x2C98, 0x2C99}, {0x2C9A, 0x2C9B}, {0x2C9C, 0x2C9D}, {0x2C9E, 0x2C9F},
-    {0x2CA0, 0x2CA1}, {0x2CA2, 0x2CA3}, {0x2CA4, 0x2CA5}, {0x2CA6, 0x2CA7},
-    {0x2CA8, 0x2CA9}, {0x2CAA, 0x2CAB}, {0x2CAC, 0x2CAD}, {0x2CAE, 0x2CAF},
-    {0x2CB0, 0x2CB1}, {0x2CB2, 0x2CB3}, {0x2CB4, 0x2CB5}, {0x2CB6, 0x2CB7},
-    {0x2CB8, 0x2CB9}, {0x2CBA, 0x2CBB}, {0x2CBC, 0x2CBD}, {0x2CBE, 0x2CBF},
-    {0x2CC0, 0x2CC1}, {0x2CC2, 0x2CC3}, {0x2CC4, 0x2CC5}, {0x2CC6, 0x2CC7},
-    {0x2CC8, 0x2CC9}, {0x2CCA, 0x2CCB}, {0x2CCC, 0x2CCD}, {0x2CCE, 0x2CCF},
-    {0x2CD0, 0x2CD1}, {0x2CD2, 0x2CD3}, {0x2CD4, 0x2CD5}, {0x2CD6, 0x2CD7},
-    {0x2CD8, 0x2CD9}, {0x2CDA, 0x2CDB}, {0x2CDC, 0x2CDD}, {0x2CDE, 0x2CDF},
-    {0x2CE0, 0x2CE1}, {0x2CE2, 0x2CE3}, {0x2CEB, 0x2CEC}, {0x2CED, 0x2CEE},
-    {0x2CF2, 0x2CF3}, {0xA640, 0xA641}, {0xA642, 0xA643}, {0xA644, 0xA645},
-    {0xA646, 0xA647}, {0xA648, 0xA649}, {0xA64A, 0xA64B}, {0xA64C, 0xA64D},
-    {0xA64E, 0xA64F}, {0xA650, 0xA651}, {0xA652, 0xA653}, {0xA654, 0xA655},
-    {0xA656, 0xA657}, {0xA658, 0xA659}, {0xA65A, 0xA65B}, {0xA65C, 0xA65D},
-    {0xA65E, 0xA65F}, {0xA660, 0xA661}, {0xA662, 0xA663}, {0xA664, 0xA665},
-    {0xA666, 0xA667}, {0xA668, 0xA669}, {0xA66A, 0xA66B}, {0xA66C, 0xA66D},
-    {0xA680, 0xA681}, {0xA682, 0xA683}, {0xA684, 0xA685}, {0xA686, 0xA687},
-    {0xA688, 0xA689}, {0xA68A, 0xA68B}, {0xA68C, 0xA68D}, {0xA68E, 0xA68F},
-    {0xA690, 0xA691}, {0xA692, 0xA693}, {0xA694, 0xA695}, {0xA696, 0xA697},
-    {0xA698, 0xA699}, {0xA69A, 0xA69B}, {0xA722, 0xA723}, {0xA724, 0xA725},
-    {0xA726, 0xA727}, {0xA728, 0xA729}, {0xA72A, 0xA72B}, {0xA72C, 0xA72D},
-    {0xA72E, 0xA72F}, {0xA732, 0xA733}, {0xA734, 0xA735}, {0xA736, 0xA737},
-    {0xA738, 0xA739}, {0xA73A, 0xA73B}, {0xA73C, 0xA73D}, {0xA73E, 0xA73F},
-    {0xA740, 0xA741}, {0xA742, 0xA743}, {0xA744, 0xA745}, {0xA746, 0xA747},
-    {0xA748, 0xA749}, {0xA74A, 0xA74B}, {0xA74C, 0xA74D}, {0xA74E, 0xA74F},
-    {0xA750, 0xA751}, {0xA752, 0xA753}, {0xA754, 0xA755}, {0xA756, 0xA757},
-    {0xA758, 0xA759}, {0xA75A, 0xA75B}, {0xA75C, 0xA75D}, {0xA75E, 0xA75F},
-    {0xA760, 0xA761}, {0xA762, 0xA763}, {0xA764, 0xA765}, {0xA766, 0xA767},
-    {0xA768, 0xA769}, {0xA76A, 0xA76B}, {0xA76C, 0xA76D}, {0xA76E, 0xA76F},
-    {0xA779, 0xA77A}, {0xA77B, 0xA77C}, {0xA77D, 0x1D79}, {0xA77E, 0xA77F},
-    {0xA780, 0xA781}, {0xA782, 0xA783}, {0xA784, 0xA785}, {0xA786, 0xA787},
-    {0xA78B, 0xA78C}, {0xA78D, 0x265}, {0xA790, 0xA791}, {0xA792, 0xA793},
-    {0xA796, 0xA797}, {0xA798, 0xA799}, {0xA79A, 0xA79B}, {0xA79C, 0xA79D},
-    {0xA79E, 0xA79F}, {0xA7A0, 0xA7A1}, {0xA7A2, 0xA7A3}, {0xA7A4, 0xA7A5},
-    {0xA7A6, 0xA7A7}, {0xA7A8, 0xA7A9}, {0xA7AA, 0x266}, {0xA7AB, 0x25C},
-    {0xA7AC, 0x261}, {0xA7AD, 0x26C}, {0xA7AE, 0x26A}, {0xA7B0, 0x29E},
-    {0xA7B1, 0x287}, {0xA7B2, 0x29D}, {0xA7B3, 0xAB53}, {0xA7B4, 0xA7B5},
-    {0xA7B6, 0xA7B7}, {0xA7B8, 0xA7B9}, {0xA7BA, 0xA7BB}, {0xA7BC, 0xA7BD},
-    {0xA7BE, 0xA7BF}, {0xA7C0, 0xA7C1}, {0xA7C2, 0xA7C3}, {0xA7C4, 0xA794},
-    {0xA7C5, 0x282}, {0xA7C6, 0x1D8E}, {0xA7C7, 0xA7C8}, {0xA7C9, 0xA7CA},
-    {0xA7CB, 0x264}, {0xA7CC, 0xA7CD}, {0xA7CE, 0xA7CF}, {0xA7D0, 0xA7D1},
-    {0xA7D2, 0xA7D3}, {0xA7D4, 0xA7D5}, {0xA7D6, 0xA7D7}, {0xA7D8, 0xA7D9},
-    {0xA7DA, 0xA7DB}, {0xA7DC, 0x19B}, {0xA7F5, 0xA7F6}, {0xFF21, 0xFF41},
-    {0xFF22, 0xFF42}, {0xFF23, 0xFF43}, {0xFF24, 0xFF44}, {0xFF25, 0xFF45},
-    {0xFF26, 0xFF46}, {0xFF27, 0xFF47}, {0xFF28, 0xFF48}, {0xFF29, 0xFF49},
-    {0xFF2A, 0xFF4A}, {0xFF2B, 0xFF4B}, {0xFF2C, 0xFF4C}, {0xFF2D, 0xFF4D},
-    {0xFF2E, 0xFF4E}, {0xFF2F, 0xFF4F}, {0xFF30, 0xFF50}, {0xFF31, 0xFF51},
-    {0xFF32, 0xFF52}, {0xFF33, 0xFF53}, {0xFF34, 0xFF54}, {0xFF35, 0xFF55},
-    {0xFF36, 0xFF56}, {0xFF37, 0xFF57}, {0xFF38, 0xFF58}, {0xFF39, 0xFF59},
-    {0xFF3A, 0xFF5A}, {0x10400, 0x10428}, {0x10401, 0x10429},
-    {0x10402, 0x1042A}, {0x10403, 0x1042B}, {0x10404, 0x1042C},
-    {0x10405, 0x1042D}, {0x10406, 0x1042E}, {0x10407, 0x1042F},
-    {0x10408, 0x10430}, {0x10409, 0x10431}, {0x1040A, 0x10432},
-    {0x1040B, 0x10433}, {0x1040C, 0x10434}, {0x1040D, 0x10435},
-    {0x1040E, 0x10436}, {0x1040F, 0x10437}, {0x10410, 0x10438},
-    {0x10411, 0x10439}, {0x10412, 0x1043A}, {0x10413, 0x1043B},
-    {0x10414, 0x1043C}, {0x10415, 0x1043D}, {0x10416, 0x1043E},
-    {0x10417, 0x1043F}, {0x10418, 0x10440}, {0x10419, 0x10441},
-    {0x1041A, 0x10442}, {0x1041B, 0x10443}, {0x1041C, 0x10444},
-    {0x1041D, 0x10445}, {0x1041E, 0x10446}, {0x1041F, 0x10447},
-    {0x10420, 0x10448}, {0x10421, 0x10449}, {0x10422, 0x1044A},
-    {0x10423, 0x1044B}, {0x10424, 0x1044C}, {0x10425, 0x1044D},
-    {0x10426, 0x1044E}, {0x10427, 0x1044F}, {0x104B0, 0x104D8},
-    {0x104B1, 0x104D9}, {0x104B2, 0x104DA}, {0x104B3, 0x104DB},
-    {0x104B4, 0x104DC}, {0x104B5, 0x104DD}, {0x104B6, 0x104DE},
-    {0x104B7, 0x104DF}, {0x104B8, 0x104E0}, {0x104B9, 0x104E1},
-    {0x104BA, 0x104E2}, {0x104BB, 0x104E3}, {0x104BC, 0x104E4},
-    {0x104BD, 0x104E5}, {0x104BE, 0x104E6}, {0x104BF, 0x104E7},
-    {0x104C0, 0x104E8}, {0x104C1, 0x104E9}, {0x104C2, 0x104EA},
-    {0x104C3, 0x104EB}, {0x104C4, 0x104EC}, {0x104C5, 0x104ED},
-    {0x104C6, 0x104EE}, {0x104C7, 0x104EF}, {0x104C8, 0x104F0},
-    {0x104C9, 0x104F1}, {0x104CA, 0x104F2}, {0x104CB, 0x104F3},
-    {0x104CC, 0x104F4}, {0x104CD, 0x104F5}, {0x104CE, 0x104F6},
-    {0x104CF, 0x104F7}, {0x104D0, 0x104F8}, {0x104D1, 0x104F9},
-    {0x104D2, 0x104FA}, {0x104D3, 0x104FB}, {0x10570, 0x10597},
-    {0x10571, 0x10598}, {0x10572, 0x10599}, {0x10573, 0x1059A},
-    {0x10574, 0x1059B}, {0x10575, 0x1059C}, {0x10576, 0x1059D},
-    {0x10577, 0x1059E}, {0x10578, 0x1059F}, {0x10579, 0x105A0},
-    {0x1057A, 0x105A1}, {0x1057C, 0x105A3}, {0x1057D, 0x105A4},
-    {0x1057E, 0x105A5}, {0x1057F, 0x105A6}, {0x10580, 0x105A7},
-    {0x10581, 0x105A8}, {0x10582, 0x105A9}, {0x10583, 0x105AA},
-    {0x10584, 0x105AB}, {0x10585, 0x105AC}, {0x10586, 0x105AD},
-    {0x10587, 0x105AE}, {0x10588, 0x105AF}, {0x10589, 0x105B0},
-    {0x1058A, 0x105B1}, {0x1058C, 0x105B3}, {0x1058D, 0x105B4},
-    {0x1058E, 0x105B5}, {0x1058F, 0x105B6}, {0x10590, 0x105B7},
-    {0x10591, 0x105B8}, {0x10592, 0x105B9}, {0x10594, 0x105BB},
-    {0x10595, 0x105BC}, {0x10C80, 0x10CC0}, {0x10C81, 0x10CC1},
-    {0x10C82, 0x10CC2}, {0x10C83, 0x10CC3}, {0x10C84, 0x10CC4},
-    {0x10C85, 0x10CC5}, {0x10C86, 0x10CC6}, {0x10C87, 0x10CC7},
-    {0x10C88, 0x10CC8}, {0x10C89, 0x10CC9}, {0x10C8A, 0x10CCA},
-    {0x10C8B, 0x10CCB}, {0x10C8C, 0x10CCC}, {0x10C8D, 0x10CCD},
-    {0x10C8E, 0x10CCE}, {0x10C8F, 0x10CCF}, {0x10C90, 0x10CD0},
-    {0x10C91, 0x10CD1}, {0x10C92, 0x10CD2}, {0x10C93, 0x10CD3},
-    {0x10C94, 0x10CD4}, {0x10C95, 0x10CD5}, {0x10C96, 0x10CD6},
-    {0x10C97, 0x10CD7}, {0x10C98, 0x10CD8}, {0x10C99, 0x10CD9},
-    {0x10C9A, 0x10CDA}, {0x10C9B, 0x10CDB}, {0x10C9C, 0x10CDC},
-    {0x10C9D, 0x10CDD}, {0x10C9E, 0x10CDE}, {0x10C9F, 0x10CDF},
-    {0x10CA0, 0x10CE0}, {0x10CA1, 0x10CE1}, {0x10CA2, 0x10CE2},
-    {0x10CA3, 0x10CE3}, {0x10CA4, 0x10CE4}, {0x10CA5, 0x10CE5},
-    {0x10CA6, 0x10CE6}, {0x10CA7, 0x10CE7}, {0x10CA8, 0x10CE8},
-    {0x10CA9, 0x10CE9}, {0x10CAA, 0x10CEA}, {0x10CAB, 0x10CEB},
-    {0x10CAC, 0x10CEC}, {0x10CAD, 0x10CED}, {0x10CAE, 0x10CEE},
-    {0x10CAF, 0x10CEF}, {0x10CB0, 0x10CF0}, {0x10CB1, 0x10CF1},
-    {0x10CB2, 0x10CF2}, {0x10D50, 0x10D70}, {0x10D51, 0x10D71},
-    {0x10D52, 0x10D72}, {0x10D53, 0x10D73}, {0x10D54, 0x10D74},
-    {0x10D55, 0x10D75}, {0x10D56, 0x10D76}, {0x10D57, 0x10D77},
-    {0x10D58, 0x10D78}, {0x10D59, 0x10D79}, {0x10D5A, 0x10D7A},
-    {0x10D5B, 0x10D7B}, {0x10D5C, 0x10D7C}, {0x10D5D, 0x10D7D},
-    {0x10D5E, 0x10D7E}, {0x10D5F, 0x10D7F}, {0x10D60, 0x10D80},
-    {0x10D61, 0x10D81}, {0x10D62, 0x10D82}, {0x10D63, 0x10D83},
-    {0x10D64, 0x10D84}, {0x10D65, 0x10D85}, {0x118A0, 0x118C0},
-    {0x118A1, 0x118C1}, {0x118A2, 0x118C2}, {0x118A3, 0x118C3},
-    {0x118A4, 0x118C4}, {0x118A5, 0x118C5}, {0x118A6, 0x118C6},
-    {0x118A7, 0x118C7}, {0x118A8, 0x118C8}, {0x118A9, 0x118C9},
-    {0x118AA, 0x118CA}, {0x118AB, 0x118CB}, {0x118AC, 0x118CC},
-    {0x118AD, 0x118CD}, {0x118AE, 0x118CE}, {0x118AF, 0x118CF},
-    {0x118B0, 0x118D0}, {0x118B1, 0x118D1}, {0x118B2, 0x118D2},
-    {0x118B3, 0x118D3}, {0x118B4, 0x118D4}, {0x118B5, 0x118D5},
-    {0x118B6, 0x118D6}, {0x118B7, 0x118D7}, {0x118B8, 0x118D8},
-    {0x118B9, 0x118D9}, {0x118BA, 0x118DA}, {0x118BB, 0x118DB},
-    {0x118BC, 0x118DC}, {0x118BD, 0x118DD}, {0x118BE, 0x118DE},
-    {0x118BF, 0x118DF}, {0x16E40, 0x16E60}, {0x16E41, 0x16E61},
-    {0x16E42, 0x16E62}, {0x16E43, 0x16E63}, {0x16E44, 0x16E64},
-    {0x16E45, 0x16E65}, {0x16E46, 0x16E66}, {0x16E47, 0x16E67},
-    {0x16E48, 0x16E68}, {0x16E49, 0x16E69}, {0x16E4A, 0x16E6A},
-    {0x16E4B, 0x16E6B}, {0x16E4C, 0x16E6C}, {0x16E4D, 0x16E6D},
-    {0x16E4E, 0x16E6E}, {0x16E4F, 0x16E6F}, {0x16E50, 0x16E70},
-    {0x16E51, 0x16E71}, {0x16E52, 0x16E72}, {0x16E53, 0x16E73},
-    {0x16E54, 0x16E74}, {0x16E55, 0x16E75}, {0x16E56, 0x16E76},
-    {0x16E57, 0x16E77}, {0x16E58, 0x16E78}, {0x16E59, 0x16E79},
-    {0x16E5A, 0x16E7A}, {0x16E5B, 0x16E7B}, {0x16E5C, 0x16E7C},
-    {0x16E5D, 0x16E7D}, {0x16E5E, 0x16E7E}, {0x16E5F, 0x16E7F},
-    {0x16EA0, 0x16EBB}, {0x16EA1, 0x16EBC}, {0x16EA2, 0x16EBD},
-    {0x16EA3, 0x16EBE}, {0x16EA4, 0x16EBF}, {0x16EA5, 0x16EC0},
-    {0x16EA6, 0x16EC1}, {0x16EA7, 0x16EC2}, {0x16EA8, 0x16EC3},
-    {0x16EA9, 0x16EC4}, {0x16EAA, 0x16EC5}, {0x16EAB, 0x16EC6},
-    {0x16EAC, 0x16EC7}, {0x16EAD, 0x16EC8}, {0x16EAE, 0x16EC9},
-    {0x16EAF, 0x16ECA}, {0x16EB0, 0x16ECB}, {0x16EB1, 0x16ECC},
-    {0x16EB2, 0x16ECD}, {0x16EB3, 0x16ECE}, {0x16EB4, 0x16ECF},
-    {0x16EB5, 0x16ED0}, {0x16EB6, 0x16ED1}, {0x16EB7, 0x16ED2},
-    {0x16EB8, 0x16ED3}, {0x1E900, 0x1E922}, {0x1E901, 0x1E923},
-    {0x1E902, 0x1E924}, {0x1E903, 0x1E925}, {0x1E904, 0x1E926},
-    {0x1E905, 0x1E927}, {0x1E906, 0x1E928}, {0x1E907, 0x1E929},
-    {0x1E908, 0x1E92A}, {0x1E909, 0x1E92B}, {0x1E90A, 0x1E92C},
-    {0x1E90B, 0x1E92D}, {0x1E90C, 0x1E92E}, {0x1E90D, 0x1E92F},
-    {0x1E90E, 0x1E930}, {0x1E90F, 0x1E931}, {0x1E910, 0x1E932},
-    {0x1E911, 0x1E933}, {0x1E912, 0x1E934}, {0x1E913, 0x1E935},
-    {0x1E914, 0x1E936}, {0x1E915, 0x1E937}, {0x1E916, 0x1E938},
-    {0x1E917, 0x1E939}, {0x1E918, 0x1E93A}, {0x1E919, 0x1E93B},
-    {0x1E91A, 0x1E93C}, {0x1E91B, 0x1E93D}, {0x1E91C, 0x1E93E},
-    {0x1E91D, 0x1E93F}, {0x1E91E, 0x1E940}, {0x1E91F, 0x1E941},
-    {0x1E920, 0x1E942}, {0x1E921, 0x1E943}
diff --git a/libc/test/src/__support/wctype/CMakeLists.txt b/libc/test/src/__support/wctype/CMakeLists.txt
index abfdc9c4d7d11..b529bd15a1926 100644
--- a/libc/test/src/__support/wctype/CMakeLists.txt
+++ b/libc/test/src/__support/wctype/CMakeLists.txt
@@ -1,13 +1,23 @@
 add_custom_target(libc-support-wctype-tests)
 
+add_libc_test(
+  wctype_perfect_hash_test
+  SUITE
+    libc-support-wctype-tests
+  SRCS
+    wctype_perfect_hash_test.cpp
+  DEPENDS
+    libc.src.__support.wctype.lower_to_upper
+    libc.src.__support.wctype.upper_to_lower
+)
+
 add_libc_test(
   wctype_classification_utils_test
   SUITE
-    libc-support-tests
+    libc-support-wctype-tests
   SRCS
     wctype_classification_utils_test.cpp
   DEPENDS
     libc.hdr.stdint_proxy
     libc.src.__support.wctype.wctype_classification_utils
 )
-
diff --git a/libc/test/src/__support/wctype/wctype_perfect_hash_test.cpp b/libc/test/src/__support/wctype/wctype_perfect_hash_test.cpp
new file mode 100644
index 0000000000000..3da3124e953a0
--- /dev/null
+++ b/libc/test/src/__support/wctype/wctype_perfect_hash_test.cpp
@@ -0,0 +1,35 @@
+//===-- Unittests for wctype perfect hash maps ----------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "src/__support/wctype/lower_to_upper.h"
+#include "src/__support/wctype/upper_to_lower.h"
+#include "test/UnitTest/Test.h"
+
+namespace LIBC_NAMESPACE_DECL {
+
+TEST(LlvmLibcWctypePerfectHashTest, LowerToUpper) {
+  for (const auto entry : LOWER_TO_UPPER_DATA) {
+    const auto &lower = entry[0];
+    const auto &upper = entry[1];
+    EXPECT_EQ(true, LOWER_TO_UPPER_MAP.contains(lower)) << lower << "\n";
+    EXPECT_EQ(upper, LOWER_TO_UPPER_MAP.find(lower).value())
+        << lower << " -> " << upper << "\n";
+  }
+}
+
+TEST(LlvmLibcWctypePerfectHashTest, UpperToLower) {
+  for (const auto entry : UPPER_TO_LOWER_DATA) {
+    const auto &upper = entry[0];
+    const auto &lower = entry[1];
+    EXPECT_EQ(true, UPPER_TO_LOWER_MAP.contains(upper)) << upper << "\n";
+    EXPECT_EQ(lower, UPPER_TO_LOWER_MAP.find(upper).value())
+        << upper << " -> " << lower << "\n";
+  }
+}
+
+} // namespace LIBC_NAMESPACE_DECL
diff --git a/libc/utils/wctype_utils/conversion/hex_writer.py b/libc/utils/wctype_utils/conversion/hex_writer.py
index 2552c8e89f139..de2817255a1fc 100644
--- a/libc/utils/wctype_utils/conversion/hex_writer.py
+++ b/libc/utils/wctype_utils/conversion/hex_writer.py
@@ -6,11 +6,47 @@
 #
 # ==------------------------------------------------------------------------==#
 
+import cppyy
+
+
+def fetch_params(file_path: str, mappings: dict):
+    file_path_list = file_path.split("/")[:-1]
+    file_path_list.append("perfect_hash_map.h")
+
+    cppyy.include("/".join(file_path_list))
+
+    LIBC_NAMESPACE = cppyy.gbl.LIBC_NAMESPACE
+
+    arr = LIBC_NAMESPACE.cpp.array[cppyy.gbl.wint_t, len(mappings)]()
+
+    for i, key in enumerate(mappings.keys()):
+        arr[i] = key
+
+    res = LIBC_NAMESPACE.ptrhash.get_params(arr)
+    pilots = LIBC_NAMESPACE.cpp.get[1](res)
+    pilots_size = pilots.size()
+    pilots = list(map(lambda x: f"0x{x:X}", map(cppyy.gbl.uint8_t, pilots)))
+    pilots = ", ".join(pilots).replace("[", "{").replace("]", "}")
+    pilots = "{" + pilots + "}"
+
+    remap = LIBC_NAMESPACE.cpp.get[2](res)
+    remap_size = remap.size()
+    remap = map(lambda x: f"0x{x:X}", map(cppyy.gbl.uint32_t, remap))
+    remap = list(remap)
+    remap = ", ".join(remap).replace("[", "{").replace("]", "}")
+    remap = "{" + remap + "}"
+    return (
+        f"0x{cppyy.gbl.uint8_t(LIBC_NAMESPACE.cpp.get[0](res)):X}",
+        (pilots, pilots_size),
+        (remap, remap_size),
+    )
+
 
 def write_hex_conversions(file_path: str, mappings: dict[int, int]) -> None:
     """Writes the given mapping as hex numbers to the given file path"""
     with open(file_path, "w") as file:
         title = file_path.split("/")[-1].split(".")[0].replace("_", " ")
+        data_var_name = f"{title.upper().replace(' ', '_')}_DATA"
         file.write(
             f"""//===-- Auto-generated {title} case mappings table -------*- C++ -*-===//
 //
@@ -24,8 +60,23 @@ def write_hex_conversions(file_path: str, mappings: dict[int, int]) -> None:
             + "// This file is generated by libc/utils/wctype_utils scripts.\n"
             + "// This file is meant to be included directly into LLVM libc code\n"
             + "// Format: {from_codepoint, to_codepoint}\n"
-            + f"// Info: {len(mappings)} entries\n\n"
+            + f"// Info: {len(mappings)} entries\n"
+        )
+        file.write(
+            f"""
+#ifndef LLVM_LIBC_SRC___SUPPORT_WCTYPE_{data_var_name[:-5]}_H
+#define LLVM_LIBC_SRC___SUPPORT_WCTYPE_{data_var_name[:-5]}_H
+
+#include "perfect_hash_map.h"
+
+namespace LIBC_NAMESPACE_DECL {'{'}
+
+"""
+            + f"LIBC_INLINE_VAR constexpr cpp::array<cpp::array<wint_t, 2>, {len(mappings)}>"
+            + f"""
+    {data_var_name} = """
         )
+        file.write("{{\n")
         for i, key in enumerate(mappings):
             file.write("{")
             file.write(f"0x{key:X}, 0x{mappings[key]:X}")
@@ -33,3 +84,22 @@ def write_hex_conversions(file_path: str, mappings: dict[int, int]) -> None:
                 file.write("}\n")
             else:
                 file.write("},\n")
+        file.write("}};\n\n")
+
+        seed, (pilots, pilots_size), (remap, remap_size) = fetch_params(
+            file_path, mappings
+        )
+        file.write(
+            f"LIBC_INLINE_VAR constexpr auto {data_var_name[:-5]}_HASHER = ptrhash::init_hasher<{len(mappings)}>({seed}, cpp::array<uint8_t, {pilots_size}>{pilots}, cpp::array<uint32_t, {remap_size}>{remap});\n\n"
+        )
+        file.write(
+            f"LIBC_INLINE_VAR constexpr PerfectHashMap<{len(mappings)}, decltype({data_var_name[:-5]}_HASHER)> "
+            + data_var_name[:-5]
+            + "_MAP"
+            + "{\n"
+        )
+        file.write(f"{data_var_name}, {data_var_name[:-5]}_HASHER")
+        file.write("};")
+
+        file.write("\n\n} // namespace LIBC_NAMESPACE_DECL\n\n")
+        file.write(f"#endif // LLVM_LIBC_SRC___SUPPORT_WCTYPE_{data_var_name[:-5]}_H\n")
diff --git a/libc/utils/wctype_utils/gen.py b/libc/utils/wctype_utils/gen.py
index f922f90711641..e067a7a968406 100755
--- a/libc/utils/wctype_utils/gen.py
+++ b/libc/utils/wctype_utils/gen.py
@@ -8,6 +8,14 @@
 #
 # ==------------------------------------------------------------------------==#
 
+from os import environ
+from sys import argv
+
+if len(argv) > 1:
+    environ["EXTRA_CLING_ARGS"] = (
+        f"-DLIBC_NAMESPACE=LIBC_NAMESPACE -I{argv[1]}/libc -I{argv[1]}/build-libc/libc -fvisibility-inlines-hidden -fdiagnostics-color -Xclang -fno-pch-timestamp -std=gnu++17 -DLIBC_QSORT_IMPL=LIBC_QSORT_QUICK_SORT -DLIBC_COPT_STRING_LENGTH_IMPL=clang_vector -DLIBC_COPT_FIND_FIRST_CHARACTER_IMPL=word -DLIBC_ADD_NULL_CHECKS -DLIBC_ERRNO_MODE=LIBC_ERRNO_MODE_DEFAULT -DLIBC_THREAD_MODE=LIBC_THREAD_MODE_PLATFORM -DLIBC_CONF_WCTYPE_MODE=LIBC_WCTYPE_MODE_ASCII -DLIBC_COPT_RAW_MUTEX_DEFAULT_SPIN_COUNT=100 -fpie -ffreestanding -idirafter/usr/include -ffixed-point -fno-builtin -fno-lax-vector-conversions -fno-unwind-tables -fno-asynchronous-unwind-tables -fno-rtti -ftrivial-auto-var-init=pattern -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -fstack-protector-strong -Werror=date-time -Werror=unguarded-availability-new -Wall -Wextra -Wno-unused-parameter -Wwrite-strings -Wcast-qual -Wmissing-field-initializers -Wimplicit-fallthrough -Wcovered-switch-default -Wno-noexcept-type -Wnon-virtual-dtor -Wdelete-non-virtual-dtor -Wsuggest-override -Wstring-conversion -Wno-pass-failed -Wmisleading-indentation -Wctad-maybe-unsupported -Wconversion -Wno-sign-conversion -Wno-c99-extensions -Wno-gnu-imaginary-constant -Wno-pedantic -Wimplicit-fallthrough -Wwrite-strings -Wextra-semi -Wnewline-eof -Wnonportable-system-include-path -Wstrict-prototypes -Wthread-safety -Wglobal-constructors"
+    )
+
 from conversion.gen_conversion_data import extract_maps_from_unicode_file
 from conversion.hex_writer import write_hex_conversions
 from classification.gen_classification_data import (
@@ -16,7 +24,6 @@
     build_lookup_tables,
     generate_code,
 )
-from sys import argv
 from sys import exit
 
 
@@ -28,11 +35,11 @@ def write_wctype_conversion_data(
         f"{unicode_data_folder_path}/UnicodeData.txt"
     )
     write_hex_conversions(
-        file_path=f"{llvm_project_root_path}/libc/src/__support/wctype/lower_to_upper.inc",
+        file_path=f"{llvm_project_root_path}/libc/src/__support/wctype/lower_to_upper.h",
         mappings=lower_to_upper,
     )
     write_hex_conversions(
-        file_path=f"{llvm_project_root_path}/libc/src/__support/wctype/upper_to_lower.inc",
+        file_path=f"{llvm_project_root_path}/libc/src/__support/wctype/upper_to_lower.h",
         mappings=upper_to_lower,
     )
 

>From 1083efcaf1a973a1f63edfb72bb8500177766429 Mon Sep 17 00:00:00 2001
From: bassiounix <muhammad.m.bassiouni at gmail.com>
Date: Fri, 20 Mar 2026 12:19:56 +0200
Subject: [PATCH 2/4] format

---
 libc/utils/wctype_utils/conversion/hex_writer.py | 3 ++-
 libc/utils/wctype_utils/gen.py                   | 3 ++-
 2 files changed, 4 insertions(+), 2 deletions(-)

diff --git a/libc/utils/wctype_utils/conversion/hex_writer.py b/libc/utils/wctype_utils/conversion/hex_writer.py
index de2817255a1fc..1dea92c5c2495 100644
--- a/libc/utils/wctype_utils/conversion/hex_writer.py
+++ b/libc/utils/wctype_utils/conversion/hex_writer.py
@@ -102,4 +102,5 @@ def write_hex_conversions(file_path: str, mappings: dict[int, int]) -> None:
         file.write("};")
 
         file.write("\n\n} // namespace LIBC_NAMESPACE_DECL\n\n")
-        file.write(f"#endif // LLVM_LIBC_SRC___SUPPORT_WCTYPE_{data_var_name[:-5]}_H\n")
+        file.write(
+            f"#endif // LLVM_LIBC_SRC___SUPPORT_WCTYPE_{data_var_name[:-5]}_H\n")
diff --git a/libc/utils/wctype_utils/gen.py b/libc/utils/wctype_utils/gen.py
index e067a7a968406..6832ab22daceb 100755
--- a/libc/utils/wctype_utils/gen.py
+++ b/libc/utils/wctype_utils/gen.py
@@ -71,7 +71,8 @@ def main() -> None:
     write_wctype_classification_data(
         llvm_project_root_path=argv[1], unicode_data_folder_path=argv[2]
     )
-    print(f"wctype conversion data is written to {argv[1]}/libc/src/__support/wctype/")
+    print(
+        f"wctype conversion data is written to {argv[1]}/libc/src/__support/wctype/")
 
 
 if __name__ == "__main__":

>From df3b24a9ae58ed91336c5b38c5791f8e93184973 Mon Sep 17 00:00:00 2001
From: bassiounix <muhammad.m.bassiouni at gmail.com>
Date: Fri, 20 Mar 2026 12:26:14 +0200
Subject: [PATCH 3/4] format

---
 libc/utils/wctype_utils/conversion/hex_writer.py | 3 +--
 libc/utils/wctype_utils/gen.py                   | 9 ++++-----
 2 files changed, 5 insertions(+), 7 deletions(-)

diff --git a/libc/utils/wctype_utils/conversion/hex_writer.py b/libc/utils/wctype_utils/conversion/hex_writer.py
index 1dea92c5c2495..de2817255a1fc 100644
--- a/libc/utils/wctype_utils/conversion/hex_writer.py
+++ b/libc/utils/wctype_utils/conversion/hex_writer.py
@@ -102,5 +102,4 @@ def write_hex_conversions(file_path: str, mappings: dict[int, int]) -> None:
         file.write("};")
 
         file.write("\n\n} // namespace LIBC_NAMESPACE_DECL\n\n")
-        file.write(
-            f"#endif // LLVM_LIBC_SRC___SUPPORT_WCTYPE_{data_var_name[:-5]}_H\n")
+        file.write(f"#endif // LLVM_LIBC_SRC___SUPPORT_WCTYPE_{data_var_name[:-5]}_H\n")
diff --git a/libc/utils/wctype_utils/gen.py b/libc/utils/wctype_utils/gen.py
index 6832ab22daceb..7fe83054dbe75 100755
--- a/libc/utils/wctype_utils/gen.py
+++ b/libc/utils/wctype_utils/gen.py
@@ -12,9 +12,9 @@
 from sys import argv
 
 if len(argv) > 1:
-    environ["EXTRA_CLING_ARGS"] = (
-        f"-DLIBC_NAMESPACE=LIBC_NAMESPACE -I{argv[1]}/libc -I{argv[1]}/build-libc/libc -fvisibility-inlines-hidden -fdiagnostics-color -Xclang -fno-pch-timestamp -std=gnu++17 -DLIBC_QSORT_IMPL=LIBC_QSORT_QUICK_SORT -DLIBC_COPT_STRING_LENGTH_IMPL=clang_vector -DLIBC_COPT_FIND_FIRST_CHARACTER_IMPL=word -DLIBC_ADD_NULL_CHECKS -DLIBC_ERRNO_MODE=LIBC_ERRNO_MODE_DEFAULT -DLIBC_THREAD_MODE=LIBC_THREAD_MODE_PLATFORM -DLIBC_CONF_WCTYPE_MODE=LIBC_WCTYPE_MODE_ASCII -DLIBC_COPT_RAW_MUTEX_DEFAULT_SPIN_COUNT=100 -fpie -ffreestanding -idirafter/usr/include -ffixed-point -fno-builtin -fno-lax-vector-conversions -fno-unwind-tables -fno-asynchronous-unwind-tables -fno-rtti -ftrivial-auto-var-init=pattern -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -fstack-protector-strong -Werror=date-time -Werror=unguarded-availability-new -Wall -Wextra -Wno-unused-parameter -Wwrite-strings -Wcast-qual -Wmissing-field-initializers -Wimplicit-fallthrough -Wcovered-switch-default -Wno-noexcept-type -Wnon-virtual-dtor -Wdelete-non-virtual-dtor -Wsuggest-override -Wstring-conversion -Wno-pass-failed -Wmisleading-indentation -Wctad-maybe-unsupported -Wconversion -Wno-sign-conversion -Wno-c99-extensions -Wno-gnu-imaginary-constant -Wno-pedantic -Wimplicit-fallthrough -Wwrite-strings -Wextra-semi -Wnewline-eof -Wnonportable-system-include-path -Wstrict-prototypes -Wthread-safety -Wglobal-constructors"
-    )
+    environ[
+        "EXTRA_CLING_ARGS"
+    ] = f"-DLIBC_NAMESPACE=LIBC_NAMESPACE -I{argv[1]}/libc -I{argv[1]}/build-libc/libc -fvisibility-inlines-hidden -fdiagnostics-color -Xclang -fno-pch-timestamp -std=gnu++17 -DLIBC_QSORT_IMPL=LIBC_QSORT_QUICK_SORT -DLIBC_COPT_STRING_LENGTH_IMPL=clang_vector -DLIBC_COPT_FIND_FIRST_CHARACTER_IMPL=word -DLIBC_ADD_NULL_CHECKS -DLIBC_ERRNO_MODE=LIBC_ERRNO_MODE_DEFAULT -DLIBC_THREAD_MODE=LIBC_THREAD_MODE_PLATFORM -DLIBC_CONF_WCTYPE_MODE=LIBC_WCTYPE_MODE_ASCII -DLIBC_COPT_RAW_MUTEX_DEFAULT_SPIN_COUNT=100 -fpie -ffreestanding -idirafter/usr/include -ffixed-point -fno-builtin -fno-lax-vector-conversions -fno-unwind-tables -fno-asynchronous-unwind-tables -fno-rtti -ftrivial-auto-var-init=pattern -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -fstack-protector-strong -Werror=date-time -Werror=unguarded-availability-new -Wall -Wextra -Wno-unused-parameter -Wwrite-strings -Wcast-qual -Wmissing-field-initializers -Wimplicit-fallthrough -Wcovered-switch-default -Wno-noexcept-type -Wnon-virtual-dtor -Wdelete-non-virtual-dtor -Wsuggest-override -Wstring-conversion -Wno-pass-failed -Wmisleading-indentation -Wctad-maybe-unsupported -Wconversion -Wno-sign-conversion -Wno-c99-extensions -Wno-gnu-imaginary-constant -Wno-pedantic -Wimplicit-fallthrough -Wwrite-strings -Wextra-semi -Wnewline-eof -Wnonportable-system-include-path -Wstrict-prototypes -Wthread-safety -Wglobal-constructors"
 
 from conversion.gen_conversion_data import extract_maps_from_unicode_file
 from conversion.hex_writer import write_hex_conversions
@@ -71,8 +71,7 @@ def main() -> None:
     write_wctype_classification_data(
         llvm_project_root_path=argv[1], unicode_data_folder_path=argv[2]
     )
-    print(
-        f"wctype conversion data is written to {argv[1]}/libc/src/__support/wctype/")
+    print(f"wctype conversion data is written to {argv[1]}/libc/src/__support/wctype/")
 
 
 if __name__ == "__main__":

>From 03cd3063761a6d19ca39ce958fe5462e7bc9eb35 Mon Sep 17 00:00:00 2001
From: bassiounix <muhammad.m.bassiouni at gmail.com>
Date: Fri, 20 Mar 2026 12:29:27 +0200
Subject: [PATCH 4/4] remove flag

---
 libc/utils/wctype_utils/gen.py | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/libc/utils/wctype_utils/gen.py b/libc/utils/wctype_utils/gen.py
index 7fe83054dbe75..8fca9e9a08369 100755
--- a/libc/utils/wctype_utils/gen.py
+++ b/libc/utils/wctype_utils/gen.py
@@ -14,7 +14,7 @@
 if len(argv) > 1:
     environ[
         "EXTRA_CLING_ARGS"
-    ] = f"-DLIBC_NAMESPACE=LIBC_NAMESPACE -I{argv[1]}/libc -I{argv[1]}/build-libc/libc -fvisibility-inlines-hidden -fdiagnostics-color -Xclang -fno-pch-timestamp -std=gnu++17 -DLIBC_QSORT_IMPL=LIBC_QSORT_QUICK_SORT -DLIBC_COPT_STRING_LENGTH_IMPL=clang_vector -DLIBC_COPT_FIND_FIRST_CHARACTER_IMPL=word -DLIBC_ADD_NULL_CHECKS -DLIBC_ERRNO_MODE=LIBC_ERRNO_MODE_DEFAULT -DLIBC_THREAD_MODE=LIBC_THREAD_MODE_PLATFORM -DLIBC_CONF_WCTYPE_MODE=LIBC_WCTYPE_MODE_ASCII -DLIBC_COPT_RAW_MUTEX_DEFAULT_SPIN_COUNT=100 -fpie -ffreestanding -idirafter/usr/include -ffixed-point -fno-builtin -fno-lax-vector-conversions -fno-unwind-tables -fno-asynchronous-unwind-tables -fno-rtti -ftrivial-auto-var-init=pattern -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -fstack-protector-strong -Werror=date-time -Werror=unguarded-availability-new -Wall -Wextra -Wno-unused-parameter -Wwrite-strings -Wcast-qual -Wmissing-field-initializers -Wimplicit-fallthrough -Wcovered-switch-default -Wno-noexcept-type -Wnon-virtual-dtor -Wdelete-non-virtual-dtor -Wsuggest-override -Wstring-conversion -Wno-pass-failed -Wmisleading-indentation -Wctad-maybe-unsupported -Wconversion -Wno-sign-conversion -Wno-c99-extensions -Wno-gnu-imaginary-constant -Wno-pedantic -Wimplicit-fallthrough -Wwrite-strings -Wextra-semi -Wnewline-eof -Wnonportable-system-include-path -Wstrict-prototypes -Wthread-safety -Wglobal-constructors"
+    ] = f"-DLIBC_NAMESPACE=LIBC_NAMESPACE -I{argv[1]}/libc -fvisibility-inlines-hidden -fdiagnostics-color -Xclang -fno-pch-timestamp -std=gnu++17 -DLIBC_QSORT_IMPL=LIBC_QSORT_QUICK_SORT -DLIBC_COPT_STRING_LENGTH_IMPL=clang_vector -DLIBC_COPT_FIND_FIRST_CHARACTER_IMPL=word -DLIBC_ADD_NULL_CHECKS -DLIBC_ERRNO_MODE=LIBC_ERRNO_MODE_DEFAULT -DLIBC_THREAD_MODE=LIBC_THREAD_MODE_PLATFORM -DLIBC_CONF_WCTYPE_MODE=LIBC_WCTYPE_MODE_ASCII -DLIBC_COPT_RAW_MUTEX_DEFAULT_SPIN_COUNT=100 -fpie -ffreestanding -idirafter/usr/include -ffixed-point -fno-builtin -fno-lax-vector-conversions -fno-unwind-tables -fno-asynchronous-unwind-tables -fno-rtti -ftrivial-auto-var-init=pattern -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -fstack-protector-strong -Werror=date-time -Werror=unguarded-availability-new -Wall -Wextra -Wno-unused-parameter -Wwrite-strings -Wcast-qual -Wmissing-field-initializers -Wimplicit-fallthrough -Wcovered-switch-default -Wno-noexcept-type -Wnon-virtual-dtor -Wdelete-non-virtual-dtor -Wsuggest-override -Wstring-conversion -Wno-pass-failed -Wmisleading-indentation -Wctad-maybe-unsupported -Wconversion -Wno-sign-conversion -Wno-c99-extensions -Wno-gnu-imaginary-constant -Wno-pedantic -Wimplicit-fallthrough -Wwrite-strings -Wextra-semi -Wnewline-eof -Wnonportable-system-include-path -Wstrict-prototypes -Wthread-safety -Wglobal-constructors"
 
 from conversion.gen_conversion_data import extract_maps_from_unicode_file
 from conversion.hex_writer import write_hex_conversions



More information about the llvm-branch-commits mailing list