// Generated by scripts/mapgen.mjs
// 2026-05-22

///|
fn lookup(orig : Char) -> Fold {
  // The code below is is intended to reduce the binary size from that of a simple 1:1 lookup table.
  // It exploits two facts:
  // 1. Many of the mappings form ranges mapped to other ranges.
  //    To benefit from this, we match on ranges instead of single numbers.
  //    Alone, this decreases the binary size but results in performance regression over the simple 1:1 lookup.
  // 2. Most of the mappings are from relatively small chars (0 - 0x2CFF).
  //    To benefit from this, we use a jump table based on the high byte for this range.
  //    This more than recovers the performance regression from exploiting fact #1, at least in the tested benchmark.
  let u16_mask : UInt = 0x0000FFFFU
  let from = orig.to_uint()
  if from <= 0x2CFF {
    let from = from & u16_mask
    let high_byte = (from >> 8).to_byte()
    let low_byte = (from & 0x0000_00FFU).to_byte()
    let single_char : UInt = match high_byte {
      0x00 =>
        match low_byte {
          b'\x41'..=b'\x5a' => from + 0x0020
          b'\xb5' => 0x03bcU
          b'\xc0'..=b'\xd6' => from + 0x0020
          b'\xd8'..=b'\xde' => from + 0x0020
          b'\xdf' => return Two('\u{0073}', '\u{0073}')
          _ => from
        }
      0x01 =>
        match low_byte {
          _..=b'\x2e' => from | 0x0000_0001U
          b'\x30' => return Two('\u{0069}', '\u{0307}')
          b'\x32'..=b'\x36' => from | 0x0000_0001U
          b'\x39'..=b'\x47' => (from + 1) & 0xFFFF_FFFEU
          b'\x49' => return Two('\u{02bc}', '\u{006e}')
          b'\x4a'..=b'\x76' => from | 0x0000_0001U
          b'\x78' => 0x00ffU
          b'\x79'..=b'\x7d' => (from + 1) & 0xFFFF_FFFEU
          b'\x7f' => 0x0073U
          b'\x81' => 0x0253U
          b'\x82'..=b'\x84' => from | 0x0000_0001U
          b'\x86' => 0x0254U
          b'\x87' => 0x0188U
          b'\x89'..=b'\x8a' => from + 0x00cd
          b'\x8b' => 0x018cU
          b'\x8e' => 0x01ddU
          b'\x8f' => 0x0259U
          b'\x90' => 0x025bU
          b'\x91' => 0x0192U
          b'\x93' => 0x0260U
          b'\x94' => 0x0263U
          b'\x96' => 0x0269U
          b'\x97' => 0x0268U
          b'\x98' => 0x0199U
          b'\x9c' => 0x026fU
          b'\x9d' => 0x0272U
          b'\x9f' => 0x0275U
          b'\xa0'..=b'\xa4' => from | 0x0000_0001U
          b'\xa6' => 0x0280U
          b'\xa7' => 0x01a8U
          b'\xa9' => 0x0283U
          b'\xac' => 0x01adU
          b'\xae' => 0x0288U
          b'\xaf' => 0x01b0U
          b'\xb1'..=b'\xb2' => from + 0x00d9
          b'\xb3'..=b'\xb5' => (from + 1) & 0xFFFF_FFFEU
          b'\xb7' => 0x0292U
          b'\xb8' => 0x01b9U
          b'\xbc' => 0x01bdU
          b'\xc4' => 0x01c6U
          b'\xc5' => 0x01c6U
          b'\xc7' => 0x01c9U
          b'\xc8' => 0x01c9U
          b'\xca' => 0x01ccU
          b'\xcb'..=b'\xdb' => (from + 1) & 0xFFFF_FFFEU
          b'\xde'..=b'\xee' => from | 0x0000_0001U
          b'\xf0' => return Two('\u{006a}', '\u{030c}')
          b'\xf1' => 0x01f3U
          b'\xf2'..=b'\xf4' => from | 0x0000_0001U
          b'\xf6' => 0x0195U
          b'\xf7' => 0x01bfU
          b'\xf8'..<_ => from | 0x0000_0001U
          _ => from
        }
      0x02 =>
        match low_byte {
          _..=b'\x1e' => from | 0x0000_0001U
          b'\x20' => 0x019eU
          b'\x22'..=b'\x32' => from | 0x0000_0001U
          b'\x3a' => 0x2c65U
          b'\x3b' => 0x023cU
          b'\x3d' => 0x019aU
          b'\x3e' => 0x2c66U
          b'\x41' => 0x0242U
          b'\x43' => 0x0180U
          b'\x44' => 0x0289U
          b'\x45' => 0x028cU
          b'\x46'..=b'\x4e' => from | 0x0000_0001U
          _ => from
        }
      0x03 =>
        match low_byte {
          b'\x45' => 0x03b9U
          b'\x70'..=b'\x72' => from | 0x0000_0001U
          b'\x76' => 0x0377U
          b'\x7f' => 0x03f3U
          b'\x86' => 0x03acU
          b'\x88'..=b'\x8a' => from + 0x0025
          b'\x8c' => 0x03ccU
          b'\x8e'..=b'\x8f' => from + 0x003f
          b'\x90' => return Three('\u{03b9}', '\u{0308}', '\u{0301}')
          b'\x91'..=b'\xa1' => from + 0x0020
          b'\xa3'..=b'\xab' => from + 0x0020
          b'\xb0' => return Three('\u{03c5}', '\u{0308}', '\u{0301}')
          b'\xc2' => 0x03c3U
          b'\xcf' => 0x03d7U
          b'\xd0' => 0x03b2U
          b'\xd1' => 0x03b8U
          b'\xd5' => 0x03c6U
          b'\xd6' => 0x03c0U
          b'\xd8'..=b'\xee' => from | 0x0000_0001U
          b'\xf0' => 0x03baU
          b'\xf1' => 0x03c1U
          b'\xf4' => 0x03b8U
          b'\xf5' => 0x03b5U
          b'\xf7' => 0x03f8U
          b'\xf9' => 0x03f2U
          b'\xfa' => 0x03fbU
          b'\xfd'..<_ => from - 0x0082
          _ => from
        }
      0x04 =>
        match low_byte {
          _..=b'\x0f' => from + 0x0050
          b'\x10'..=b'\x2f' => from + 0x0020
          b'\x60'..=b'\x80' => from | 0x0000_0001U
          b'\x8a'..=b'\xbe' => from | 0x0000_0001U
          b'\xc0' => 0x04cfU
          b'\xc1'..=b'\xcd' => (from + 1) & 0xFFFF_FFFEU
          b'\xd0'..<_ => from | 0x0000_0001U
          _ => from
        }
      0x05 =>
        match low_byte {
          _..=b'\x2e' => from | 0x0000_0001U
          b'\x31'..=b'\x56' => from + 0x0030
          b'\x87' => return Two('\u{0565}', '\u{0582}')
          _ => from
        }
      0x06 => from
      0x07 => from
      0x08 => from
      0x09 => from
      0x0a => from
      0x0b => from
      0x0c => from
      0x0d => from
      0x0e => from
      0x0f => from
      0x10 =>
        match low_byte {
          b'\xa0'..=b'\xc5' => from + 0x1c60
          b'\xc7' => 0x2d27U
          b'\xcd' => 0x2d2dU
          _ => from
        }
      0x11 => from
      0x12 => from
      0x13 =>
        match low_byte {
          b'\xf8'..=b'\xfd' => from - 0x0008
          _ => from
        }
      0x14 => from
      0x15 => from
      0x16 => from
      0x17 => from
      0x18 => from
      0x19 => from
      0x1a => from
      0x1b => from
      0x1c =>
        match low_byte {
          b'\x80' => 0x0432U
          b'\x81' => 0x0434U
          b'\x82' => 0x043eU
          b'\x83'..=b'\x84' => from - 0x1842
          b'\x85' => 0x0442U
          b'\x86' => 0x044aU
          b'\x87' => 0x0463U
          b'\x88' => 0xa64bU
          b'\x89' => 0x1c8aU
          b'\x90'..=b'\xba' => from - 0x0bc0
          b'\xbd'..=b'\xbf' => from - 0x0bc0
          _ => from
        }
      0x1d => from
      0x1e =>
        match low_byte {
          _..=b'\x94' => from | 0x0000_0001U
          b'\x96' => return Two('\u{0068}', '\u{0331}')
          b'\x97' => return Two('\u{0074}', '\u{0308}')
          b'\x98' => return Two('\u{0077}', '\u{030a}')
          b'\x99' => return Two('\u{0079}', '\u{030a}')
          b'\x9a' => return Two('\u{0061}', '\u{02be}')
          b'\x9b' => 0x1e61U
          b'\x9e' => return Two('\u{0073}', '\u{0073}')
          b'\xa0'..=b'\xfe' => from | 0x0000_0001U
          _ => from
        }
      0x1f =>
        match low_byte {
          b'\x08'..=b'\x0f' => from - 0x0008
          b'\x18'..=b'\x1d' => from - 0x0008
          b'\x28'..=b'\x2f' => from - 0x0008
          b'\x38'..=b'\x3f' => from - 0x0008
          b'\x48'..=b'\x4d' => from - 0x0008
          b'\x50' => return Two('\u{03c5}', '\u{0313}')
          b'\x52' => return Three('\u{03c5}', '\u{0313}', '\u{0300}')
          b'\x54' => return Three('\u{03c5}', '\u{0313}', '\u{0301}')
          b'\x56' => return Three('\u{03c5}', '\u{0313}', '\u{0342}')
          b'\x59'..=b'\x5f' =>
            if (from & 0x0000_0001U) == 1 {
              from - 0x0008
            } else {
              from
            }
          b'\x68'..=b'\x6f' => from - 0x0008
          b'\x80' => return Two('\u{1f00}', '\u{03b9}')
          b'\x81' => return Two('\u{1f01}', '\u{03b9}')
          b'\x82' => return Two('\u{1f02}', '\u{03b9}')
          b'\x83' => return Two('\u{1f03}', '\u{03b9}')
          b'\x84' => return Two('\u{1f04}', '\u{03b9}')
          b'\x85' => return Two('\u{1f05}', '\u{03b9}')
          b'\x86' => return Two('\u{1f06}', '\u{03b9}')
          b'\x87' => return Two('\u{1f07}', '\u{03b9}')
          b'\x88' => return Two('\u{1f00}', '\u{03b9}')
          b'\x89' => return Two('\u{1f01}', '\u{03b9}')
          b'\x8a' => return Two('\u{1f02}', '\u{03b9}')
          b'\x8b' => return Two('\u{1f03}', '\u{03b9}')
          b'\x8c' => return Two('\u{1f04}', '\u{03b9}')
          b'\x8d' => return Two('\u{1f05}', '\u{03b9}')
          b'\x8e' => return Two('\u{1f06}', '\u{03b9}')
          b'\x8f' => return Two('\u{1f07}', '\u{03b9}')
          b'\x90' => return Two('\u{1f20}', '\u{03b9}')
          b'\x91' => return Two('\u{1f21}', '\u{03b9}')
          b'\x92' => return Two('\u{1f22}', '\u{03b9}')
          b'\x93' => return Two('\u{1f23}', '\u{03b9}')
          b'\x94' => return Two('\u{1f24}', '\u{03b9}')
          b'\x95' => return Two('\u{1f25}', '\u{03b9}')
          b'\x96' => return Two('\u{1f26}', '\u{03b9}')
          b'\x97' => return Two('\u{1f27}', '\u{03b9}')
          b'\x98' => return Two('\u{1f20}', '\u{03b9}')
          b'\x99' => return Two('\u{1f21}', '\u{03b9}')
          b'\x9a' => return Two('\u{1f22}', '\u{03b9}')
          b'\x9b' => return Two('\u{1f23}', '\u{03b9}')
          b'\x9c' => return Two('\u{1f24}', '\u{03b9}')
          b'\x9d' => return Two('\u{1f25}', '\u{03b9}')
          b'\x9e' => return Two('\u{1f26}', '\u{03b9}')
          b'\x9f' => return Two('\u{1f27}', '\u{03b9}')
          b'\xa0' => return Two('\u{1f60}', '\u{03b9}')
          b'\xa1' => return Two('\u{1f61}', '\u{03b9}')
          b'\xa2' => return Two('\u{1f62}', '\u{03b9}')
          b'\xa3' => return Two('\u{1f63}', '\u{03b9}')
          b'\xa4' => return Two('\u{1f64}', '\u{03b9}')
          b'\xa5' => return Two('\u{1f65}', '\u{03b9}')
          b'\xa6' => return Two('\u{1f66}', '\u{03b9}')
          b'\xa7' => return Two('\u{1f67}', '\u{03b9}')
          b'\xa8' => return Two('\u{1f60}', '\u{03b9}')
          b'\xa9' => return Two('\u{1f61}', '\u{03b9}')
          b'\xaa' => return Two('\u{1f62}', '\u{03b9}')
          b'\xab' => return Two('\u{1f63}', '\u{03b9}')
          b'\xac' => return Two('\u{1f64}', '\u{03b9}')
          b'\xad' => return Two('\u{1f65}', '\u{03b9}')
          b'\xae' => return Two('\u{1f66}', '\u{03b9}')
          b'\xaf' => return Two('\u{1f67}', '\u{03b9}')
          b'\xb2' => return Two('\u{1f70}', '\u{03b9}')
          b'\xb3' => return Two('\u{03b1}', '\u{03b9}')
          b'\xb4' => return Two('\u{03ac}', '\u{03b9}')
          b'\xb6' => return Two('\u{03b1}', '\u{0342}')
          b'\xb7' => return Three('\u{03b1}', '\u{0342}', '\u{03b9}')
          b'\xb8'..=b'\xb9' => from - 0x0008
          b'\xba'..=b'\xbb' => from - 0x004a
          b'\xbc' => return Two('\u{03b1}', '\u{03b9}')
          b'\xbe' => 0x03b9U
          b'\xc2' => return Two('\u{1f74}', '\u{03b9}')
          b'\xc3' => return Two('\u{03b7}', '\u{03b9}')
          b'\xc4' => return Two('\u{03ae}', '\u{03b9}')
          b'\xc6' => return Two('\u{03b7}', '\u{0342}')
          b'\xc7' => return Three('\u{03b7}', '\u{0342}', '\u{03b9}')
          b'\xc8'..=b'\xcb' => from - 0x0056
          b'\xcc' => return Two('\u{03b7}', '\u{03b9}')
          b'\xd2' => return Three('\u{03b9}', '\u{0308}', '\u{0300}')
          b'\xd3' => return Three('\u{03b9}', '\u{0308}', '\u{0301}')
          b'\xd6' => return Two('\u{03b9}', '\u{0342}')
          b'\xd7' => return Three('\u{03b9}', '\u{0308}', '\u{0342}')
          b'\xd8'..=b'\xd9' => from - 0x0008
          b'\xda'..=b'\xdb' => from - 0x0064
          b'\xe2' => return Three('\u{03c5}', '\u{0308}', '\u{0300}')
          b'\xe3' => return Three('\u{03c5}', '\u{0308}', '\u{0301}')
          b'\xe4' => return Two('\u{03c1}', '\u{0313}')
          b'\xe6' => return Two('\u{03c5}', '\u{0342}')
          b'\xe7' => return Three('\u{03c5}', '\u{0308}', '\u{0342}')
          b'\xe8'..=b'\xe9' => from - 0x0008
          b'\xea'..=b'\xeb' => from - 0x0070
          b'\xec' => 0x1fe5U
          b'\xf2' => return Two('\u{1f7c}', '\u{03b9}')
          b'\xf3' => return Two('\u{03c9}', '\u{03b9}')
          b'\xf4' => return Two('\u{03ce}', '\u{03b9}')
          b'\xf6' => return Two('\u{03c9}', '\u{0342}')
          b'\xf7' => return Three('\u{03c9}', '\u{0342}', '\u{03b9}')
          b'\xf8'..=b'\xf9' => from - 0x0080
          b'\xfa'..=b'\xfb' => from - 0x007e
          b'\xfc' => return Two('\u{03c9}', '\u{03b9}')
          _ => from
        }
      0x20 => from
      0x21 =>
        match low_byte {
          b'\x26' => 0x03c9U
          b'\x2a' => 0x006bU
          b'\x2b' => 0x00e5U
          b'\x32' => 0x214eU
          b'\x60'..=b'\x6f' => from + 0x0010
          b'\x83' => 0x2184U
          _ => from
        }
      0x22 => from
      0x23 => from
      0x24 =>
        match low_byte {
          b'\xb6'..=b'\xcf' => from + 0x001a
          _ => from
        }
      0x25 => from
      0x26 => from
      0x27 => from
      0x28 => from
      0x29 => from
      0x2a => from
      0x2b => from
      0x2c =>
        match low_byte {
          _..=b'\x2f' => from + 0x0030
          b'\x60' => 0x2c61U
          b'\x62' => 0x026bU
          b'\x63' => 0x1d7dU
          b'\x64' => 0x027dU
          b'\x67'..=b'\x6b' => (from + 1) & 0xFFFF_FFFEU
          b'\x6d' => 0x0251U
          b'\x6e' => 0x0271U
          b'\x6f' => 0x0250U
          b'\x70' => 0x0252U
          b'\x72' => 0x2c73U
          b'\x75' => 0x2c76U
          b'\x7e'..=b'\x7f' => from - 0x2a3f
          b'\x80'..=b'\xe2' => from | 0x0000_0001U
          b'\xeb'..=b'\xed' => (from + 1) & 0xFFFF_FFFEU
          b'\xf2' => 0x2cf3U
          _ => from
        }
      _ => from
    }
    One(Int::unsafe_to_char(single_char.reinterpret_as_int()))
  } else {
    let single_char : UInt = match from {
      0xa640U..=0xa66cU => from | 0x0000_0001U
      0xa680U..=0xa69aU => from | 0x0000_0001U
      0xa722U..=0xa72eU => from | 0x0000_0001U
      0xa732U..=0xa76eU => from | 0x0000_0001U
      0xa779U..=0xa77bU => (from + 1) & 0xFFFF_FFFEU
      0xa77dU => 0x1d79U
      0xa77eU..=0xa786U => from | 0x0000_0001U
      0xa78bU => 0xa78cU
      0xa78dU => 0x0265U
      0xa790U..=0xa792U => from | 0x0000_0001U
      0xa796U..=0xa7a8U => from | 0x0000_0001U
      0xa7aaU => 0x0266U
      0xa7abU => 0x025cU
      0xa7acU => 0x0261U
      0xa7adU => 0x026cU
      0xa7aeU => 0x026aU
      0xa7b0U => 0x029eU
      0xa7b1U => 0x0287U
      0xa7b2U => 0x029dU
      0xa7b3U => 0xab53U
      0xa7b4U..=0xa7c2U => from | 0x0000_0001U
      0xa7c4U => 0xa794U
      0xa7c5U => 0x0282U
      0xa7c6U => 0x1d8eU
      0xa7c7U..=0xa7c9U => (from + 1) & 0xFFFF_FFFEU
      0xa7cbU => 0x0264U
      0xa7ccU => 0xa7cdU
      0xa7d0U => 0xa7d1U
      0xa7d6U..=0xa7daU => from | 0x0000_0001U
      0xa7dcU => 0x019bU
      0xa7f5U => 0xa7f6U
      0xab70U..=0xabbfU => from - 0x97d0
      0xfb00U => return Two('\u{0066}', '\u{0066}')
      0xfb01U => return Two('\u{0066}', '\u{0069}')
      0xfb02U => return Two('\u{0066}', '\u{006c}')
      0xfb03U => return Three('\u{0066}', '\u{0066}', '\u{0069}')
      0xfb04U => return Three('\u{0066}', '\u{0066}', '\u{006c}')
      0xfb05U => return Two('\u{0073}', '\u{0074}')
      0xfb06U => return Two('\u{0073}', '\u{0074}')
      0xfb13U => return Two('\u{0574}', '\u{0576}')
      0xfb14U => return Two('\u{0574}', '\u{0565}')
      0xfb15U => return Two('\u{0574}', '\u{056b}')
      0xfb16U => return Two('\u{057e}', '\u{0576}')
      0xfb17U => return Two('\u{0574}', '\u{056d}')
      0xff21U..=0xff3aU => from + 0x0020
      0x10400U..=0x10427U => from + 0x0028
      0x104b0U..=0x104d3U => from + 0x0028
      0x10570U..=0x1057aU => from + 0x0027
      0x1057cU..=0x1058aU => from + 0x0027
      0x1058cU..=0x10592U => from + 0x0027
      0x10594U..=0x10595U => from + 0x0027
      0x10c80U..=0x10cb2U => from + 0x0040
      0x10d50U..=0x10d65U => from + 0x0020
      0x118a0U..=0x118bfU => from + 0x0020
      0x16e40U..=0x16e5fU => from + 0x0020
      0x1e900U..=0x1e921U => from + 0x0022
      _ => from
    }
    One(Int::unsafe_to_char(single_char.reinterpret_as_int()))
  }
}

///|
test "lookup_consistency" {
  fn lookup_naive(orig : Char) -> Fold {
    let single_char = match orig.to_uint() {
      0x0041U => 0x0061U
      0x0042U => 0x0062U
      0x0043U => 0x0063U
      0x0044U => 0x0064U
      0x0045U => 0x0065U
      0x0046U => 0x0066U
      0x0047U => 0x0067U
      0x0048U => 0x0068U
      0x0049U => 0x0069U
      0x004aU => 0x006aU
      0x004bU => 0x006bU
      0x004cU => 0x006cU
      0x004dU => 0x006dU
      0x004eU => 0x006eU
      0x004fU => 0x006fU
      0x0050U => 0x0070U
      0x0051U => 0x0071U
      0x0052U => 0x0072U
      0x0053U => 0x0073U
      0x0054U => 0x0074U
      0x0055U => 0x0075U
      0x0056U => 0x0076U
      0x0057U => 0x0077U
      0x0058U => 0x0078U
      0x0059U => 0x0079U
      0x005aU => 0x007aU
      0x00b5U => 0x03bcU
      0x00c0U => 0x00e0U
      0x00c1U => 0x00e1U
      0x00c2U => 0x00e2U
      0x00c3U => 0x00e3U
      0x00c4U => 0x00e4U
      0x00c5U => 0x00e5U
      0x00c6U => 0x00e6U
      0x00c7U => 0x00e7U
      0x00c8U => 0x00e8U
      0x00c9U => 0x00e9U
      0x00caU => 0x00eaU
      0x00cbU => 0x00ebU
      0x00ccU => 0x00ecU
      0x00cdU => 0x00edU
      0x00ceU => 0x00eeU
      0x00cfU => 0x00efU
      0x00d0U => 0x00f0U
      0x00d1U => 0x00f1U
      0x00d2U => 0x00f2U
      0x00d3U => 0x00f3U
      0x00d4U => 0x00f4U
      0x00d5U => 0x00f5U
      0x00d6U => 0x00f6U
      0x00d8U => 0x00f8U
      0x00d9U => 0x00f9U
      0x00daU => 0x00faU
      0x00dbU => 0x00fbU
      0x00dcU => 0x00fcU
      0x00ddU => 0x00fdU
      0x00deU => 0x00feU
      0x00dfU => return Two('\u{0073}', '\u{0073}')
      0x0100U => 0x0101U
      0x0102U => 0x0103U
      0x0104U => 0x0105U
      0x0106U => 0x0107U
      0x0108U => 0x0109U
      0x010aU => 0x010bU
      0x010cU => 0x010dU
      0x010eU => 0x010fU
      0x0110U => 0x0111U
      0x0112U => 0x0113U
      0x0114U => 0x0115U
      0x0116U => 0x0117U
      0x0118U => 0x0119U
      0x011aU => 0x011bU
      0x011cU => 0x011dU
      0x011eU => 0x011fU
      0x0120U => 0x0121U
      0x0122U => 0x0123U
      0x0124U => 0x0125U
      0x0126U => 0x0127U
      0x0128U => 0x0129U
      0x012aU => 0x012bU
      0x012cU => 0x012dU
      0x012eU => 0x012fU
      0x0130U => return Two('\u{0069}', '\u{0307}')
      0x0132U => 0x0133U
      0x0134U => 0x0135U
      0x0136U => 0x0137U
      0x0139U => 0x013aU
      0x013bU => 0x013cU
      0x013dU => 0x013eU
      0x013fU => 0x0140U
      0x0141U => 0x0142U
      0x0143U => 0x0144U
      0x0145U => 0x0146U
      0x0147U => 0x0148U
      0x0149U => return Two('\u{02bc}', '\u{006e}')
      0x014aU => 0x014bU
      0x014cU => 0x014dU
      0x014eU => 0x014fU
      0x0150U => 0x0151U
      0x0152U => 0x0153U
      0x0154U => 0x0155U
      0x0156U => 0x0157U
      0x0158U => 0x0159U
      0x015aU => 0x015bU
      0x015cU => 0x015dU
      0x015eU => 0x015fU
      0x0160U => 0x0161U
      0x0162U => 0x0163U
      0x0164U => 0x0165U
      0x0166U => 0x0167U
      0x0168U => 0x0169U
      0x016aU => 0x016bU
      0x016cU => 0x016dU
      0x016eU => 0x016fU
      0x0170U => 0x0171U
      0x0172U => 0x0173U
      0x0174U => 0x0175U
      0x0176U => 0x0177U
      0x0178U => 0x00ffU
      0x0179U => 0x017aU
      0x017bU => 0x017cU
      0x017dU => 0x017eU
      0x017fU => 0x0073U
      0x0181U => 0x0253U
      0x0182U => 0x0183U
      0x0184U => 0x0185U
      0x0186U => 0x0254U
      0x0187U => 0x0188U
      0x0189U => 0x0256U
      0x018aU => 0x0257U
      0x018bU => 0x018cU
      0x018eU => 0x01ddU
      0x018fU => 0x0259U
      0x0190U => 0x025bU
      0x0191U => 0x0192U
      0x0193U => 0x0260U
      0x0194U => 0x0263U
      0x0196U => 0x0269U
      0x0197U => 0x0268U
      0x0198U => 0x0199U
      0x019cU => 0x026fU
      0x019dU => 0x0272U
      0x019fU => 0x0275U
      0x01a0U => 0x01a1U
      0x01a2U => 0x01a3U
      0x01a4U => 0x01a5U
      0x01a6U => 0x0280U
      0x01a7U => 0x01a8U
      0x01a9U => 0x0283U
      0x01acU => 0x01adU
      0x01aeU => 0x0288U
      0x01afU => 0x01b0U
      0x01b1U => 0x028aU
      0x01b2U => 0x028bU
      0x01b3U => 0x01b4U
      0x01b5U => 0x01b6U
      0x01b7U => 0x0292U
      0x01b8U => 0x01b9U
      0x01bcU => 0x01bdU
      0x01c4U => 0x01c6U
      0x01c5U => 0x01c6U
      0x01c7U => 0x01c9U
      0x01c8U => 0x01c9U
      0x01caU => 0x01ccU
      0x01cbU => 0x01ccU
      0x01cdU => 0x01ceU
      0x01cfU => 0x01d0U
      0x01d1U => 0x01d2U
      0x01d3U => 0x01d4U
      0x01d5U => 0x01d6U
      0x01d7U => 0x01d8U
      0x01d9U => 0x01daU
      0x01dbU => 0x01dcU
      0x01deU => 0x01dfU
      0x01e0U => 0x01e1U
      0x01e2U => 0x01e3U
      0x01e4U => 0x01e5U
      0x01e6U => 0x01e7U
      0x01e8U => 0x01e9U
      0x01eaU => 0x01ebU
      0x01ecU => 0x01edU
      0x01eeU => 0x01efU
      0x01f0U => return Two('\u{006a}', '\u{030c}')
      0x01f1U => 0x01f3U
      0x01f2U => 0x01f3U
      0x01f4U => 0x01f5U
      0x01f6U => 0x0195U
      0x01f7U => 0x01bfU
      0x01f8U => 0x01f9U
      0x01faU => 0x01fbU
      0x01fcU => 0x01fdU
      0x01feU => 0x01ffU
      0x0200U => 0x0201U
      0x0202U => 0x0203U
      0x0204U => 0x0205U
      0x0206U => 0x0207U
      0x0208U => 0x0209U
      0x020aU => 0x020bU
      0x020cU => 0x020dU
      0x020eU => 0x020fU
      0x0210U => 0x0211U
      0x0212U => 0x0213U
      0x0214U => 0x0215U
      0x0216U => 0x0217U
      0x0218U => 0x0219U
      0x021aU => 0x021bU
      0x021cU => 0x021dU
      0x021eU => 0x021fU
      0x0220U => 0x019eU
      0x0222U => 0x0223U
      0x0224U => 0x0225U
      0x0226U => 0x0227U
      0x0228U => 0x0229U
      0x022aU => 0x022bU
      0x022cU => 0x022dU
      0x022eU => 0x022fU
      0x0230U => 0x0231U
      0x0232U => 0x0233U
      0x023aU => 0x2c65U
      0x023bU => 0x023cU
      0x023dU => 0x019aU
      0x023eU => 0x2c66U
      0x0241U => 0x0242U
      0x0243U => 0x0180U
      0x0244U => 0x0289U
      0x0245U => 0x028cU
      0x0246U => 0x0247U
      0x0248U => 0x0249U
      0x024aU => 0x024bU
      0x024cU => 0x024dU
      0x024eU => 0x024fU
      0x0345U => 0x03b9U
      0x0370U => 0x0371U
      0x0372U => 0x0373U
      0x0376U => 0x0377U
      0x037fU => 0x03f3U
      0x0386U => 0x03acU
      0x0388U => 0x03adU
      0x0389U => 0x03aeU
      0x038aU => 0x03afU
      0x038cU => 0x03ccU
      0x038eU => 0x03cdU
      0x038fU => 0x03ceU
      0x0390U => return Three('\u{03b9}', '\u{0308}', '\u{0301}')
      0x0391U => 0x03b1U
      0x0392U => 0x03b2U
      0x0393U => 0x03b3U
      0x0394U => 0x03b4U
      0x0395U => 0x03b5U
      0x0396U => 0x03b6U
      0x0397U => 0x03b7U
      0x0398U => 0x03b8U
      0x0399U => 0x03b9U
      0x039aU => 0x03baU
      0x039bU => 0x03bbU
      0x039cU => 0x03bcU
      0x039dU => 0x03bdU
      0x039eU => 0x03beU
      0x039fU => 0x03bfU
      0x03a0U => 0x03c0U
      0x03a1U => 0x03c1U
      0x03a3U => 0x03c3U
      0x03a4U => 0x03c4U
      0x03a5U => 0x03c5U
      0x03a6U => 0x03c6U
      0x03a7U => 0x03c7U
      0x03a8U => 0x03c8U
      0x03a9U => 0x03c9U
      0x03aaU => 0x03caU
      0x03abU => 0x03cbU
      0x03b0U => return Three('\u{03c5}', '\u{0308}', '\u{0301}')
      0x03c2U => 0x03c3U
      0x03cfU => 0x03d7U
      0x03d0U => 0x03b2U
      0x03d1U => 0x03b8U
      0x03d5U => 0x03c6U
      0x03d6U => 0x03c0U
      0x03d8U => 0x03d9U
      0x03daU => 0x03dbU
      0x03dcU => 0x03ddU
      0x03deU => 0x03dfU
      0x03e0U => 0x03e1U
      0x03e2U => 0x03e3U
      0x03e4U => 0x03e5U
      0x03e6U => 0x03e7U
      0x03e8U => 0x03e9U
      0x03eaU => 0x03ebU
      0x03ecU => 0x03edU
      0x03eeU => 0x03efU
      0x03f0U => 0x03baU
      0x03f1U => 0x03c1U
      0x03f4U => 0x03b8U
      0x03f5U => 0x03b5U
      0x03f7U => 0x03f8U
      0x03f9U => 0x03f2U
      0x03faU => 0x03fbU
      0x03fdU => 0x037bU
      0x03feU => 0x037cU
      0x03ffU => 0x037dU
      0x0400U => 0x0450U
      0x0401U => 0x0451U
      0x0402U => 0x0452U
      0x0403U => 0x0453U
      0x0404U => 0x0454U
      0x0405U => 0x0455U
      0x0406U => 0x0456U
      0x0407U => 0x0457U
      0x0408U => 0x0458U
      0x0409U => 0x0459U
      0x040aU => 0x045aU
      0x040bU => 0x045bU
      0x040cU => 0x045cU
      0x040dU => 0x045dU
      0x040eU => 0x045eU
      0x040fU => 0x045fU
      0x0410U => 0x0430U
      0x0411U => 0x0431U
      0x0412U => 0x0432U
      0x0413U => 0x0433U
      0x0414U => 0x0434U
      0x0415U => 0x0435U
      0x0416U => 0x0436U
      0x0417U => 0x0437U
      0x0418U => 0x0438U
      0x0419U => 0x0439U
      0x041aU => 0x043aU
      0x041bU => 0x043bU
      0x041cU => 0x043cU
      0x041dU => 0x043dU
      0x041eU => 0x043eU
      0x041fU => 0x043fU
      0x0420U => 0x0440U
      0x0421U => 0x0441U
      0x0422U => 0x0442U
      0x0423U => 0x0443U
      0x0424U => 0x0444U
      0x0425U => 0x0445U
      0x0426U => 0x0446U
      0x0427U => 0x0447U
      0x0428U => 0x0448U
      0x0429U => 0x0449U
      0x042aU => 0x044aU
      0x042bU => 0x044bU
      0x042cU => 0x044cU
      0x042dU => 0x044dU
      0x042eU => 0x044eU
      0x042fU => 0x044fU
      0x0460U => 0x0461U
      0x0462U => 0x0463U
      0x0464U => 0x0465U
      0x0466U => 0x0467U
      0x0468U => 0x0469U
      0x046aU => 0x046bU
      0x046cU => 0x046dU
      0x046eU => 0x046fU
      0x0470U => 0x0471U
      0x0472U => 0x0473U
      0x0474U => 0x0475U
      0x0476U => 0x0477U
      0x0478U => 0x0479U
      0x047aU => 0x047bU
      0x047cU => 0x047dU
      0x047eU => 0x047fU
      0x0480U => 0x0481U
      0x048aU => 0x048bU
      0x048cU => 0x048dU
      0x048eU => 0x048fU
      0x0490U => 0x0491U
      0x0492U => 0x0493U
      0x0494U => 0x0495U
      0x0496U => 0x0497U
      0x0498U => 0x0499U
      0x049aU => 0x049bU
      0x049cU => 0x049dU
      0x049eU => 0x049fU
      0x04a0U => 0x04a1U
      0x04a2U => 0x04a3U
      0x04a4U => 0x04a5U
      0x04a6U => 0x04a7U
      0x04a8U => 0x04a9U
      0x04aaU => 0x04abU
      0x04acU => 0x04adU
      0x04aeU => 0x04afU
      0x04b0U => 0x04b1U
      0x04b2U => 0x04b3U
      0x04b4U => 0x04b5U
      0x04b6U => 0x04b7U
      0x04b8U => 0x04b9U
      0x04baU => 0x04bbU
      0x04bcU => 0x04bdU
      0x04beU => 0x04bfU
      0x04c0U => 0x04cfU
      0x04c1U => 0x04c2U
      0x04c3U => 0x04c4U
      0x04c5U => 0x04c6U
      0x04c7U => 0x04c8U
      0x04c9U => 0x04caU
      0x04cbU => 0x04ccU
      0x04cdU => 0x04ceU
      0x04d0U => 0x04d1U
      0x04d2U => 0x04d3U
      0x04d4U => 0x04d5U
      0x04d6U => 0x04d7U
      0x04d8U => 0x04d9U
      0x04daU => 0x04dbU
      0x04dcU => 0x04ddU
      0x04deU => 0x04dfU
      0x04e0U => 0x04e1U
      0x04e2U => 0x04e3U
      0x04e4U => 0x04e5U
      0x04e6U => 0x04e7U
      0x04e8U => 0x04e9U
      0x04eaU => 0x04ebU
      0x04ecU => 0x04edU
      0x04eeU => 0x04efU
      0x04f0U => 0x04f1U
      0x04f2U => 0x04f3U
      0x04f4U => 0x04f5U
      0x04f6U => 0x04f7U
      0x04f8U => 0x04f9U
      0x04faU => 0x04fbU
      0x04fcU => 0x04fdU
      0x04feU => 0x04ffU
      0x0500U => 0x0501U
      0x0502U => 0x0503U
      0x0504U => 0x0505U
      0x0506U => 0x0507U
      0x0508U => 0x0509U
      0x050aU => 0x050bU
      0x050cU => 0x050dU
      0x050eU => 0x050fU
      0x0510U => 0x0511U
      0x0512U => 0x0513U
      0x0514U => 0x0515U
      0x0516U => 0x0517U
      0x0518U => 0x0519U
      0x051aU => 0x051bU
      0x051cU => 0x051dU
      0x051eU => 0x051fU
      0x0520U => 0x0521U
      0x0522U => 0x0523U
      0x0524U => 0x0525U
      0x0526U => 0x0527U
      0x0528U => 0x0529U
      0x052aU => 0x052bU
      0x052cU => 0x052dU
      0x052eU => 0x052fU
      0x0531U => 0x0561U
      0x0532U => 0x0562U
      0x0533U => 0x0563U
      0x0534U => 0x0564U
      0x0535U => 0x0565U
      0x0536U => 0x0566U
      0x0537U => 0x0567U
      0x0538U => 0x0568U
      0x0539U => 0x0569U
      0x053aU => 0x056aU
      0x053bU => 0x056bU
      0x053cU => 0x056cU
      0x053dU => 0x056dU
      0x053eU => 0x056eU
      0x053fU => 0x056fU
      0x0540U => 0x0570U
      0x0541U => 0x0571U
      0x0542U => 0x0572U
      0x0543U => 0x0573U
      0x0544U => 0x0574U
      0x0545U => 0x0575U
      0x0546U => 0x0576U
      0x0547U => 0x0577U
      0x0548U => 0x0578U
      0x0549U => 0x0579U
      0x054aU => 0x057aU
      0x054bU => 0x057bU
      0x054cU => 0x057cU
      0x054dU => 0x057dU
      0x054eU => 0x057eU
      0x054fU => 0x057fU
      0x0550U => 0x0580U
      0x0551U => 0x0581U
      0x0552U => 0x0582U
      0x0553U => 0x0583U
      0x0554U => 0x0584U
      0x0555U => 0x0585U
      0x0556U => 0x0586U
      0x0587U => return Two('\u{0565}', '\u{0582}')
      0x10a0U => 0x2d00U
      0x10a1U => 0x2d01U
      0x10a2U => 0x2d02U
      0x10a3U => 0x2d03U
      0x10a4U => 0x2d04U
      0x10a5U => 0x2d05U
      0x10a6U => 0x2d06U
      0x10a7U => 0x2d07U
      0x10a8U => 0x2d08U
      0x10a9U => 0x2d09U
      0x10aaU => 0x2d0aU
      0x10abU => 0x2d0bU
      0x10acU => 0x2d0cU
      0x10adU => 0x2d0dU
      0x10aeU => 0x2d0eU
      0x10afU => 0x2d0fU
      0x10b0U => 0x2d10U
      0x10b1U => 0x2d11U
      0x10b2U => 0x2d12U
      0x10b3U => 0x2d13U
      0x10b4U => 0x2d14U
      0x10b5U => 0x2d15U
      0x10b6U => 0x2d16U
      0x10b7U => 0x2d17U
      0x10b8U => 0x2d18U
      0x10b9U => 0x2d19U
      0x10baU => 0x2d1aU
      0x10bbU => 0x2d1bU
      0x10bcU => 0x2d1cU
      0x10bdU => 0x2d1dU
      0x10beU => 0x2d1eU
      0x10bfU => 0x2d1fU
      0x10c0U => 0x2d20U
      0x10c1U => 0x2d21U
      0x10c2U => 0x2d22U
      0x10c3U => 0x2d23U
      0x10c4U => 0x2d24U
      0x10c5U => 0x2d25U
      0x10c7U => 0x2d27U
      0x10cdU => 0x2d2dU
      0x13f8U => 0x13f0U
      0x13f9U => 0x13f1U
      0x13faU => 0x13f2U
      0x13fbU => 0x13f3U
      0x13fcU => 0x13f4U
      0x13fdU => 0x13f5U
      0x1c80U => 0x0432U
      0x1c81U => 0x0434U
      0x1c82U => 0x043eU
      0x1c83U => 0x0441U
      0x1c84U => 0x0442U
      0x1c85U => 0x0442U
      0x1c86U => 0x044aU
      0x1c87U => 0x0463U
      0x1c88U => 0xa64bU
      0x1c89U => 0x1c8aU
      0x1c90U => 0x10d0U
      0x1c91U => 0x10d1U
      0x1c92U => 0x10d2U
      0x1c93U => 0x10d3U
      0x1c94U => 0x10d4U
      0x1c95U => 0x10d5U
      0x1c96U => 0x10d6U
      0x1c97U => 0x10d7U
      0x1c98U => 0x10d8U
      0x1c99U => 0x10d9U
      0x1c9aU => 0x10daU
      0x1c9bU => 0x10dbU
      0x1c9cU => 0x10dcU
      0x1c9dU => 0x10ddU
      0x1c9eU => 0x10deU
      0x1c9fU => 0x10dfU
      0x1ca0U => 0x10e0U
      0x1ca1U => 0x10e1U
      0x1ca2U => 0x10e2U
      0x1ca3U => 0x10e3U
      0x1ca4U => 0x10e4U
      0x1ca5U => 0x10e5U
      0x1ca6U => 0x10e6U
      0x1ca7U => 0x10e7U
      0x1ca8U => 0x10e8U
      0x1ca9U => 0x10e9U
      0x1caaU => 0x10eaU
      0x1cabU => 0x10ebU
      0x1cacU => 0x10ecU
      0x1cadU => 0x10edU
      0x1caeU => 0x10eeU
      0x1cafU => 0x10efU
      0x1cb0U => 0x10f0U
      0x1cb1U => 0x10f1U
      0x1cb2U => 0x10f2U
      0x1cb3U => 0x10f3U
      0x1cb4U => 0x10f4U
      0x1cb5U => 0x10f5U
      0x1cb6U => 0x10f6U
      0x1cb7U => 0x10f7U
      0x1cb8U => 0x10f8U
      0x1cb9U => 0x10f9U
      0x1cbaU => 0x10faU
      0x1cbdU => 0x10fdU
      0x1cbeU => 0x10feU
      0x1cbfU => 0x10ffU
      0x1e00U => 0x1e01U
      0x1e02U => 0x1e03U
      0x1e04U => 0x1e05U
      0x1e06U => 0x1e07U
      0x1e08U => 0x1e09U
      0x1e0aU => 0x1e0bU
      0x1e0cU => 0x1e0dU
      0x1e0eU => 0x1e0fU
      0x1e10U => 0x1e11U
      0x1e12U => 0x1e13U
      0x1e14U => 0x1e15U
      0x1e16U => 0x1e17U
      0x1e18U => 0x1e19U
      0x1e1aU => 0x1e1bU
      0x1e1cU => 0x1e1dU
      0x1e1eU => 0x1e1fU
      0x1e20U => 0x1e21U
      0x1e22U => 0x1e23U
      0x1e24U => 0x1e25U
      0x1e26U => 0x1e27U
      0x1e28U => 0x1e29U
      0x1e2aU => 0x1e2bU
      0x1e2cU => 0x1e2dU
      0x1e2eU => 0x1e2fU
      0x1e30U => 0x1e31U
      0x1e32U => 0x1e33U
      0x1e34U => 0x1e35U
      0x1e36U => 0x1e37U
      0x1e38U => 0x1e39U
      0x1e3aU => 0x1e3bU
      0x1e3cU => 0x1e3dU
      0x1e3eU => 0x1e3fU
      0x1e40U => 0x1e41U
      0x1e42U => 0x1e43U
      0x1e44U => 0x1e45U
      0x1e46U => 0x1e47U
      0x1e48U => 0x1e49U
      0x1e4aU => 0x1e4bU
      0x1e4cU => 0x1e4dU
      0x1e4eU => 0x1e4fU
      0x1e50U => 0x1e51U
      0x1e52U => 0x1e53U
      0x1e54U => 0x1e55U
      0x1e56U => 0x1e57U
      0x1e58U => 0x1e59U
      0x1e5aU => 0x1e5bU
      0x1e5cU => 0x1e5dU
      0x1e5eU => 0x1e5fU
      0x1e60U => 0x1e61U
      0x1e62U => 0x1e63U
      0x1e64U => 0x1e65U
      0x1e66U => 0x1e67U
      0x1e68U => 0x1e69U
      0x1e6aU => 0x1e6bU
      0x1e6cU => 0x1e6dU
      0x1e6eU => 0x1e6fU
      0x1e70U => 0x1e71U
      0x1e72U => 0x1e73U
      0x1e74U => 0x1e75U
      0x1e76U => 0x1e77U
      0x1e78U => 0x1e79U
      0x1e7aU => 0x1e7bU
      0x1e7cU => 0x1e7dU
      0x1e7eU => 0x1e7fU
      0x1e80U => 0x1e81U
      0x1e82U => 0x1e83U
      0x1e84U => 0x1e85U
      0x1e86U => 0x1e87U
      0x1e88U => 0x1e89U
      0x1e8aU => 0x1e8bU
      0x1e8cU => 0x1e8dU
      0x1e8eU => 0x1e8fU
      0x1e90U => 0x1e91U
      0x1e92U => 0x1e93U
      0x1e94U => 0x1e95U
      0x1e96U => return Two('\u{0068}', '\u{0331}')
      0x1e97U => return Two('\u{0074}', '\u{0308}')
      0x1e98U => return Two('\u{0077}', '\u{030a}')
      0x1e99U => return Two('\u{0079}', '\u{030a}')
      0x1e9aU => return Two('\u{0061}', '\u{02be}')
      0x1e9bU => 0x1e61U
      0x1e9eU => return Two('\u{0073}', '\u{0073}')
      0x1ea0U => 0x1ea1U
      0x1ea2U => 0x1ea3U
      0x1ea4U => 0x1ea5U
      0x1ea6U => 0x1ea7U
      0x1ea8U => 0x1ea9U
      0x1eaaU => 0x1eabU
      0x1eacU => 0x1eadU
      0x1eaeU => 0x1eafU
      0x1eb0U => 0x1eb1U
      0x1eb2U => 0x1eb3U
      0x1eb4U => 0x1eb5U
      0x1eb6U => 0x1eb7U
      0x1eb8U => 0x1eb9U
      0x1ebaU => 0x1ebbU
      0x1ebcU => 0x1ebdU
      0x1ebeU => 0x1ebfU
      0x1ec0U => 0x1ec1U
      0x1ec2U => 0x1ec3U
      0x1ec4U => 0x1ec5U
      0x1ec6U => 0x1ec7U
      0x1ec8U => 0x1ec9U
      0x1ecaU => 0x1ecbU
      0x1eccU => 0x1ecdU
      0x1eceU => 0x1ecfU
      0x1ed0U => 0x1ed1U
      0x1ed2U => 0x1ed3U
      0x1ed4U => 0x1ed5U
      0x1ed6U => 0x1ed7U
      0x1ed8U => 0x1ed9U
      0x1edaU => 0x1edbU
      0x1edcU => 0x1eddU
      0x1edeU => 0x1edfU
      0x1ee0U => 0x1ee1U
      0x1ee2U => 0x1ee3U
      0x1ee4U => 0x1ee5U
      0x1ee6U => 0x1ee7U
      0x1ee8U => 0x1ee9U
      0x1eeaU => 0x1eebU
      0x1eecU => 0x1eedU
      0x1eeeU => 0x1eefU
      0x1ef0U => 0x1ef1U
      0x1ef2U => 0x1ef3U
      0x1ef4U => 0x1ef5U
      0x1ef6U => 0x1ef7U
      0x1ef8U => 0x1ef9U
      0x1efaU => 0x1efbU
      0x1efcU => 0x1efdU
      0x1efeU => 0x1effU
      0x1f08U => 0x1f00U
      0x1f09U => 0x1f01U
      0x1f0aU => 0x1f02U
      0x1f0bU => 0x1f03U
      0x1f0cU => 0x1f04U
      0x1f0dU => 0x1f05U
      0x1f0eU => 0x1f06U
      0x1f0fU => 0x1f07U
      0x1f18U => 0x1f10U
      0x1f19U => 0x1f11U
      0x1f1aU => 0x1f12U
      0x1f1bU => 0x1f13U
      0x1f1cU => 0x1f14U
      0x1f1dU => 0x1f15U
      0x1f28U => 0x1f20U
      0x1f29U => 0x1f21U
      0x1f2aU => 0x1f22U
      0x1f2bU => 0x1f23U
      0x1f2cU => 0x1f24U
      0x1f2dU => 0x1f25U
      0x1f2eU => 0x1f26U
      0x1f2fU => 0x1f27U
      0x1f38U => 0x1f30U
      0x1f39U => 0x1f31U
      0x1f3aU => 0x1f32U
      0x1f3bU => 0x1f33U
      0x1f3cU => 0x1f34U
      0x1f3dU => 0x1f35U
      0x1f3eU => 0x1f36U
      0x1f3fU => 0x1f37U
      0x1f48U => 0x1f40U
      0x1f49U => 0x1f41U
      0x1f4aU => 0x1f42U
      0x1f4bU => 0x1f43U
      0x1f4cU => 0x1f44U
      0x1f4dU => 0x1f45U
      0x1f50U => return Two('\u{03c5}', '\u{0313}')
      0x1f52U => return Three('\u{03c5}', '\u{0313}', '\u{0300}')
      0x1f54U => return Three('\u{03c5}', '\u{0313}', '\u{0301}')
      0x1f56U => return Three('\u{03c5}', '\u{0313}', '\u{0342}')
      0x1f59U => 0x1f51U
      0x1f5bU => 0x1f53U
      0x1f5dU => 0x1f55U
      0x1f5fU => 0x1f57U
      0x1f68U => 0x1f60U
      0x1f69U => 0x1f61U
      0x1f6aU => 0x1f62U
      0x1f6bU => 0x1f63U
      0x1f6cU => 0x1f64U
      0x1f6dU => 0x1f65U
      0x1f6eU => 0x1f66U
      0x1f6fU => 0x1f67U
      0x1f80U => return Two('\u{1f00}', '\u{03b9}')
      0x1f81U => return Two('\u{1f01}', '\u{03b9}')
      0x1f82U => return Two('\u{1f02}', '\u{03b9}')
      0x1f83U => return Two('\u{1f03}', '\u{03b9}')
      0x1f84U => return Two('\u{1f04}', '\u{03b9}')
      0x1f85U => return Two('\u{1f05}', '\u{03b9}')
      0x1f86U => return Two('\u{1f06}', '\u{03b9}')
      0x1f87U => return Two('\u{1f07}', '\u{03b9}')
      0x1f88U => return Two('\u{1f00}', '\u{03b9}')
      0x1f89U => return Two('\u{1f01}', '\u{03b9}')
      0x1f8aU => return Two('\u{1f02}', '\u{03b9}')
      0x1f8bU => return Two('\u{1f03}', '\u{03b9}')
      0x1f8cU => return Two('\u{1f04}', '\u{03b9}')
      0x1f8dU => return Two('\u{1f05}', '\u{03b9}')
      0x1f8eU => return Two('\u{1f06}', '\u{03b9}')
      0x1f8fU => return Two('\u{1f07}', '\u{03b9}')
      0x1f90U => return Two('\u{1f20}', '\u{03b9}')
      0x1f91U => return Two('\u{1f21}', '\u{03b9}')
      0x1f92U => return Two('\u{1f22}', '\u{03b9}')
      0x1f93U => return Two('\u{1f23}', '\u{03b9}')
      0x1f94U => return Two('\u{1f24}', '\u{03b9}')
      0x1f95U => return Two('\u{1f25}', '\u{03b9}')
      0x1f96U => return Two('\u{1f26}', '\u{03b9}')
      0x1f97U => return Two('\u{1f27}', '\u{03b9}')
      0x1f98U => return Two('\u{1f20}', '\u{03b9}')
      0x1f99U => return Two('\u{1f21}', '\u{03b9}')
      0x1f9aU => return Two('\u{1f22}', '\u{03b9}')
      0x1f9bU => return Two('\u{1f23}', '\u{03b9}')
      0x1f9cU => return Two('\u{1f24}', '\u{03b9}')
      0x1f9dU => return Two('\u{1f25}', '\u{03b9}')
      0x1f9eU => return Two('\u{1f26}', '\u{03b9}')
      0x1f9fU => return Two('\u{1f27}', '\u{03b9}')
      0x1fa0U => return Two('\u{1f60}', '\u{03b9}')
      0x1fa1U => return Two('\u{1f61}', '\u{03b9}')
      0x1fa2U => return Two('\u{1f62}', '\u{03b9}')
      0x1fa3U => return Two('\u{1f63}', '\u{03b9}')
      0x1fa4U => return Two('\u{1f64}', '\u{03b9}')
      0x1fa5U => return Two('\u{1f65}', '\u{03b9}')
      0x1fa6U => return Two('\u{1f66}', '\u{03b9}')
      0x1fa7U => return Two('\u{1f67}', '\u{03b9}')
      0x1fa8U => return Two('\u{1f60}', '\u{03b9}')
      0x1fa9U => return Two('\u{1f61}', '\u{03b9}')
      0x1faaU => return Two('\u{1f62}', '\u{03b9}')
      0x1fabU => return Two('\u{1f63}', '\u{03b9}')
      0x1facU => return Two('\u{1f64}', '\u{03b9}')
      0x1fadU => return Two('\u{1f65}', '\u{03b9}')
      0x1faeU => return Two('\u{1f66}', '\u{03b9}')
      0x1fafU => return Two('\u{1f67}', '\u{03b9}')
      0x1fb2U => return Two('\u{1f70}', '\u{03b9}')
      0x1fb3U => return Two('\u{03b1}', '\u{03b9}')
      0x1fb4U => return Two('\u{03ac}', '\u{03b9}')
      0x1fb6U => return Two('\u{03b1}', '\u{0342}')
      0x1fb7U => return Three('\u{03b1}', '\u{0342}', '\u{03b9}')
      0x1fb8U => 0x1fb0U
      0x1fb9U => 0x1fb1U
      0x1fbaU => 0x1f70U
      0x1fbbU => 0x1f71U
      0x1fbcU => return Two('\u{03b1}', '\u{03b9}')
      0x1fbeU => 0x03b9U
      0x1fc2U => return Two('\u{1f74}', '\u{03b9}')
      0x1fc3U => return Two('\u{03b7}', '\u{03b9}')
      0x1fc4U => return Two('\u{03ae}', '\u{03b9}')
      0x1fc6U => return Two('\u{03b7}', '\u{0342}')
      0x1fc7U => return Three('\u{03b7}', '\u{0342}', '\u{03b9}')
      0x1fc8U => 0x1f72U
      0x1fc9U => 0x1f73U
      0x1fcaU => 0x1f74U
      0x1fcbU => 0x1f75U
      0x1fccU => return Two('\u{03b7}', '\u{03b9}')
      0x1fd2U => return Three('\u{03b9}', '\u{0308}', '\u{0300}')
      0x1fd3U => return Three('\u{03b9}', '\u{0308}', '\u{0301}')
      0x1fd6U => return Two('\u{03b9}', '\u{0342}')
      0x1fd7U => return Three('\u{03b9}', '\u{0308}', '\u{0342}')
      0x1fd8U => 0x1fd0U
      0x1fd9U => 0x1fd1U
      0x1fdaU => 0x1f76U
      0x1fdbU => 0x1f77U
      0x1fe2U => return Three('\u{03c5}', '\u{0308}', '\u{0300}')
      0x1fe3U => return Three('\u{03c5}', '\u{0308}', '\u{0301}')
      0x1fe4U => return Two('\u{03c1}', '\u{0313}')
      0x1fe6U => return Two('\u{03c5}', '\u{0342}')
      0x1fe7U => return Three('\u{03c5}', '\u{0308}', '\u{0342}')
      0x1fe8U => 0x1fe0U
      0x1fe9U => 0x1fe1U
      0x1feaU => 0x1f7aU
      0x1febU => 0x1f7bU
      0x1fecU => 0x1fe5U
      0x1ff2U => return Two('\u{1f7c}', '\u{03b9}')
      0x1ff3U => return Two('\u{03c9}', '\u{03b9}')
      0x1ff4U => return Two('\u{03ce}', '\u{03b9}')
      0x1ff6U => return Two('\u{03c9}', '\u{0342}')
      0x1ff7U => return Three('\u{03c9}', '\u{0342}', '\u{03b9}')
      0x1ff8U => 0x1f78U
      0x1ff9U => 0x1f79U
      0x1ffaU => 0x1f7cU
      0x1ffbU => 0x1f7dU
      0x1ffcU => return Two('\u{03c9}', '\u{03b9}')
      0x2126U => 0x03c9U
      0x212aU => 0x006bU
      0x212bU => 0x00e5U
      0x2132U => 0x214eU
      0x2160U => 0x2170U
      0x2161U => 0x2171U
      0x2162U => 0x2172U
      0x2163U => 0x2173U
      0x2164U => 0x2174U
      0x2165U => 0x2175U
      0x2166U => 0x2176U
      0x2167U => 0x2177U
      0x2168U => 0x2178U
      0x2169U => 0x2179U
      0x216aU => 0x217aU
      0x216bU => 0x217bU
      0x216cU => 0x217cU
      0x216dU => 0x217dU
      0x216eU => 0x217eU
      0x216fU => 0x217fU
      0x2183U => 0x2184U
      0x24b6U => 0x24d0U
      0x24b7U => 0x24d1U
      0x24b8U => 0x24d2U
      0x24b9U => 0x24d3U
      0x24baU => 0x24d4U
      0x24bbU => 0x24d5U
      0x24bcU => 0x24d6U
      0x24bdU => 0x24d7U
      0x24beU => 0x24d8U
      0x24bfU => 0x24d9U
      0x24c0U => 0x24daU
      0x24c1U => 0x24dbU
      0x24c2U => 0x24dcU
      0x24c3U => 0x24ddU
      0x24c4U => 0x24deU
      0x24c5U => 0x24dfU
      0x24c6U => 0x24e0U
      0x24c7U => 0x24e1U
      0x24c8U => 0x24e2U
      0x24c9U => 0x24e3U
      0x24caU => 0x24e4U
      0x24cbU => 0x24e5U
      0x24ccU => 0x24e6U
      0x24cdU => 0x24e7U
      0x24ceU => 0x24e8U
      0x24cfU => 0x24e9U
      0x2c00U => 0x2c30U
      0x2c01U => 0x2c31U
      0x2c02U => 0x2c32U
      0x2c03U => 0x2c33U
      0x2c04U => 0x2c34U
      0x2c05U => 0x2c35U
      0x2c06U => 0x2c36U
      0x2c07U => 0x2c37U
      0x2c08U => 0x2c38U
      0x2c09U => 0x2c39U
      0x2c0aU => 0x2c3aU
      0x2c0bU => 0x2c3bU
      0x2c0cU => 0x2c3cU
      0x2c0dU => 0x2c3dU
      0x2c0eU => 0x2c3eU
      0x2c0fU => 0x2c3fU
      0x2c10U => 0x2c40U
      0x2c11U => 0x2c41U
      0x2c12U => 0x2c42U
      0x2c13U => 0x2c43U
      0x2c14U => 0x2c44U
      0x2c15U => 0x2c45U
      0x2c16U => 0x2c46U
      0x2c17U => 0x2c47U
      0x2c18U => 0x2c48U
      0x2c19U => 0x2c49U
      0x2c1aU => 0x2c4aU
      0x2c1bU => 0x2c4bU
      0x2c1cU => 0x2c4cU
      0x2c1dU => 0x2c4dU
      0x2c1eU => 0x2c4eU
      0x2c1fU => 0x2c4fU
      0x2c20U => 0x2c50U
      0x2c21U => 0x2c51U
      0x2c22U => 0x2c52U
      0x2c23U => 0x2c53U
      0x2c24U => 0x2c54U
      0x2c25U => 0x2c55U
      0x2c26U => 0x2c56U
      0x2c27U => 0x2c57U
      0x2c28U => 0x2c58U
      0x2c29U => 0x2c59U
      0x2c2aU => 0x2c5aU
      0x2c2bU => 0x2c5bU
      0x2c2cU => 0x2c5cU
      0x2c2dU => 0x2c5dU
      0x2c2eU => 0x2c5eU
      0x2c2fU => 0x2c5fU
      0x2c60U => 0x2c61U
      0x2c62U => 0x026bU
      0x2c63U => 0x1d7dU
      0x2c64U => 0x027dU
      0x2c67U => 0x2c68U
      0x2c69U => 0x2c6aU
      0x2c6bU => 0x2c6cU
      0x2c6dU => 0x0251U
      0x2c6eU => 0x0271U
      0x2c6fU => 0x0250U
      0x2c70U => 0x0252U
      0x2c72U => 0x2c73U
      0x2c75U => 0x2c76U
      0x2c7eU => 0x023fU
      0x2c7fU => 0x0240U
      0x2c80U => 0x2c81U
      0x2c82U => 0x2c83U
      0x2c84U => 0x2c85U
      0x2c86U => 0x2c87U
      0x2c88U => 0x2c89U
      0x2c8aU => 0x2c8bU
      0x2c8cU => 0x2c8dU
      0x2c8eU => 0x2c8fU
      0x2c90U => 0x2c91U
      0x2c92U => 0x2c93U
      0x2c94U => 0x2c95U
      0x2c96U => 0x2c97U
      0x2c98U => 0x2c99U
      0x2c9aU => 0x2c9bU
      0x2c9cU => 0x2c9dU
      0x2c9eU => 0x2c9fU
      0x2ca0U => 0x2ca1U
      0x2ca2U => 0x2ca3U
      0x2ca4U => 0x2ca5U
      0x2ca6U => 0x2ca7U
      0x2ca8U => 0x2ca9U
      0x2caaU => 0x2cabU
      0x2cacU => 0x2cadU
      0x2caeU => 0x2cafU
      0x2cb0U => 0x2cb1U
      0x2cb2U => 0x2cb3U
      0x2cb4U => 0x2cb5U
      0x2cb6U => 0x2cb7U
      0x2cb8U => 0x2cb9U
      0x2cbaU => 0x2cbbU
      0x2cbcU => 0x2cbdU
      0x2cbeU => 0x2cbfU
      0x2cc0U => 0x2cc1U
      0x2cc2U => 0x2cc3U
      0x2cc4U => 0x2cc5U
      0x2cc6U => 0x2cc7U
      0x2cc8U => 0x2cc9U
      0x2ccaU => 0x2ccbU
      0x2cccU => 0x2ccdU
      0x2cceU => 0x2ccfU
      0x2cd0U => 0x2cd1U
      0x2cd2U => 0x2cd3U
      0x2cd4U => 0x2cd5U
      0x2cd6U => 0x2cd7U
      0x2cd8U => 0x2cd9U
      0x2cdaU => 0x2cdbU
      0x2cdcU => 0x2cddU
      0x2cdeU => 0x2cdfU
      0x2ce0U => 0x2ce1U
      0x2ce2U => 0x2ce3U
      0x2cebU => 0x2cecU
      0x2cedU => 0x2ceeU
      0x2cf2U => 0x2cf3U
      0xa640U => 0xa641U
      0xa642U => 0xa643U
      0xa644U => 0xa645U
      0xa646U => 0xa647U
      0xa648U => 0xa649U
      0xa64aU => 0xa64bU
      0xa64cU => 0xa64dU
      0xa64eU => 0xa64fU
      0xa650U => 0xa651U
      0xa652U => 0xa653U
      0xa654U => 0xa655U
      0xa656U => 0xa657U
      0xa658U => 0xa659U
      0xa65aU => 0xa65bU
      0xa65cU => 0xa65dU
      0xa65eU => 0xa65fU
      0xa660U => 0xa661U
      0xa662U => 0xa663U
      0xa664U => 0xa665U
      0xa666U => 0xa667U
      0xa668U => 0xa669U
      0xa66aU => 0xa66bU
      0xa66cU => 0xa66dU
      0xa680U => 0xa681U
      0xa682U => 0xa683U
      0xa684U => 0xa685U
      0xa686U => 0xa687U
      0xa688U => 0xa689U
      0xa68aU => 0xa68bU
      0xa68cU => 0xa68dU
      0xa68eU => 0xa68fU
      0xa690U => 0xa691U
      0xa692U => 0xa693U
      0xa694U => 0xa695U
      0xa696U => 0xa697U
      0xa698U => 0xa699U
      0xa69aU => 0xa69bU
      0xa722U => 0xa723U
      0xa724U => 0xa725U
      0xa726U => 0xa727U
      0xa728U => 0xa729U
      0xa72aU => 0xa72bU
      0xa72cU => 0xa72dU
      0xa72eU => 0xa72fU
      0xa732U => 0xa733U
      0xa734U => 0xa735U
      0xa736U => 0xa737U
      0xa738U => 0xa739U
      0xa73aU => 0xa73bU
      0xa73cU => 0xa73dU
      0xa73eU => 0xa73fU
      0xa740U => 0xa741U
      0xa742U => 0xa743U
      0xa744U => 0xa745U
      0xa746U => 0xa747U
      0xa748U => 0xa749U
      0xa74aU => 0xa74bU
      0xa74cU => 0xa74dU
      0xa74eU => 0xa74fU
      0xa750U => 0xa751U
      0xa752U => 0xa753U
      0xa754U => 0xa755U
      0xa756U => 0xa757U
      0xa758U => 0xa759U
      0xa75aU => 0xa75bU
      0xa75cU => 0xa75dU
      0xa75eU => 0xa75fU
      0xa760U => 0xa761U
      0xa762U => 0xa763U
      0xa764U => 0xa765U
      0xa766U => 0xa767U
      0xa768U => 0xa769U
      0xa76aU => 0xa76bU
      0xa76cU => 0xa76dU
      0xa76eU => 0xa76fU
      0xa779U => 0xa77aU
      0xa77bU => 0xa77cU
      0xa77dU => 0x1d79U
      0xa77eU => 0xa77fU
      0xa780U => 0xa781U
      0xa782U => 0xa783U
      0xa784U => 0xa785U
      0xa786U => 0xa787U
      0xa78bU => 0xa78cU
      0xa78dU => 0x0265U
      0xa790U => 0xa791U
      0xa792U => 0xa793U
      0xa796U => 0xa797U
      0xa798U => 0xa799U
      0xa79aU => 0xa79bU
      0xa79cU => 0xa79dU
      0xa79eU => 0xa79fU
      0xa7a0U => 0xa7a1U
      0xa7a2U => 0xa7a3U
      0xa7a4U => 0xa7a5U
      0xa7a6U => 0xa7a7U
      0xa7a8U => 0xa7a9U
      0xa7aaU => 0x0266U
      0xa7abU => 0x025cU
      0xa7acU => 0x0261U
      0xa7adU => 0x026cU
      0xa7aeU => 0x026aU
      0xa7b0U => 0x029eU
      0xa7b1U => 0x0287U
      0xa7b2U => 0x029dU
      0xa7b3U => 0xab53U
      0xa7b4U => 0xa7b5U
      0xa7b6U => 0xa7b7U
      0xa7b8U => 0xa7b9U
      0xa7baU => 0xa7bbU
      0xa7bcU => 0xa7bdU
      0xa7beU => 0xa7bfU
      0xa7c0U => 0xa7c1U
      0xa7c2U => 0xa7c3U
      0xa7c4U => 0xa794U
      0xa7c5U => 0x0282U
      0xa7c6U => 0x1d8eU
      0xa7c7U => 0xa7c8U
      0xa7c9U => 0xa7caU
      0xa7cbU => 0x0264U
      0xa7ccU => 0xa7cdU
      0xa7d0U => 0xa7d1U
      0xa7d6U => 0xa7d7U
      0xa7d8U => 0xa7d9U
      0xa7daU => 0xa7dbU
      0xa7dcU => 0x019bU
      0xa7f5U => 0xa7f6U
      0xab70U => 0x13a0U
      0xab71U => 0x13a1U
      0xab72U => 0x13a2U
      0xab73U => 0x13a3U
      0xab74U => 0x13a4U
      0xab75U => 0x13a5U
      0xab76U => 0x13a6U
      0xab77U => 0x13a7U
      0xab78U => 0x13a8U
      0xab79U => 0x13a9U
      0xab7aU => 0x13aaU
      0xab7bU => 0x13abU
      0xab7cU => 0x13acU
      0xab7dU => 0x13adU
      0xab7eU => 0x13aeU
      0xab7fU => 0x13afU
      0xab80U => 0x13b0U
      0xab81U => 0x13b1U
      0xab82U => 0x13b2U
      0xab83U => 0x13b3U
      0xab84U => 0x13b4U
      0xab85U => 0x13b5U
      0xab86U => 0x13b6U
      0xab87U => 0x13b7U
      0xab88U => 0x13b8U
      0xab89U => 0x13b9U
      0xab8aU => 0x13baU
      0xab8bU => 0x13bbU
      0xab8cU => 0x13bcU
      0xab8dU => 0x13bdU
      0xab8eU => 0x13beU
      0xab8fU => 0x13bfU
      0xab90U => 0x13c0U
      0xab91U => 0x13c1U
      0xab92U => 0x13c2U
      0xab93U => 0x13c3U
      0xab94U => 0x13c4U
      0xab95U => 0x13c5U
      0xab96U => 0x13c6U
      0xab97U => 0x13c7U
      0xab98U => 0x13c8U
      0xab99U => 0x13c9U
      0xab9aU => 0x13caU
      0xab9bU => 0x13cbU
      0xab9cU => 0x13ccU
      0xab9dU => 0x13cdU
      0xab9eU => 0x13ceU
      0xab9fU => 0x13cfU
      0xaba0U => 0x13d0U
      0xaba1U => 0x13d1U
      0xaba2U => 0x13d2U
      0xaba3U => 0x13d3U
      0xaba4U => 0x13d4U
      0xaba5U => 0x13d5U
      0xaba6U => 0x13d6U
      0xaba7U => 0x13d7U
      0xaba8U => 0x13d8U
      0xaba9U => 0x13d9U
      0xabaaU => 0x13daU
      0xababU => 0x13dbU
      0xabacU => 0x13dcU
      0xabadU => 0x13ddU
      0xabaeU => 0x13deU
      0xabafU => 0x13dfU
      0xabb0U => 0x13e0U
      0xabb1U => 0x13e1U
      0xabb2U => 0x13e2U
      0xabb3U => 0x13e3U
      0xabb4U => 0x13e4U
      0xabb5U => 0x13e5U
      0xabb6U => 0x13e6U
      0xabb7U => 0x13e7U
      0xabb8U => 0x13e8U
      0xabb9U => 0x13e9U
      0xabbaU => 0x13eaU
      0xabbbU => 0x13ebU
      0xabbcU => 0x13ecU
      0xabbdU => 0x13edU
      0xabbeU => 0x13eeU
      0xabbfU => 0x13efU
      0xfb00U => return Two('\u{0066}', '\u{0066}')
      0xfb01U => return Two('\u{0066}', '\u{0069}')
      0xfb02U => return Two('\u{0066}', '\u{006c}')
      0xfb03U => return Three('\u{0066}', '\u{0066}', '\u{0069}')
      0xfb04U => return Three('\u{0066}', '\u{0066}', '\u{006c}')
      0xfb05U => return Two('\u{0073}', '\u{0074}')
      0xfb06U => return Two('\u{0073}', '\u{0074}')
      0xfb13U => return Two('\u{0574}', '\u{0576}')
      0xfb14U => return Two('\u{0574}', '\u{0565}')
      0xfb15U => return Two('\u{0574}', '\u{056b}')
      0xfb16U => return Two('\u{057e}', '\u{0576}')
      0xfb17U => return Two('\u{0574}', '\u{056d}')
      0xff21U => 0xff41U
      0xff22U => 0xff42U
      0xff23U => 0xff43U
      0xff24U => 0xff44U
      0xff25U => 0xff45U
      0xff26U => 0xff46U
      0xff27U => 0xff47U
      0xff28U => 0xff48U
      0xff29U => 0xff49U
      0xff2aU => 0xff4aU
      0xff2bU => 0xff4bU
      0xff2cU => 0xff4cU
      0xff2dU => 0xff4dU
      0xff2eU => 0xff4eU
      0xff2fU => 0xff4fU
      0xff30U => 0xff50U
      0xff31U => 0xff51U
      0xff32U => 0xff52U
      0xff33U => 0xff53U
      0xff34U => 0xff54U
      0xff35U => 0xff55U
      0xff36U => 0xff56U
      0xff37U => 0xff57U
      0xff38U => 0xff58U
      0xff39U => 0xff59U
      0xff3aU => 0xff5aU
      0x10400U => 0x10428U
      0x10401U => 0x10429U
      0x10402U => 0x1042aU
      0x10403U => 0x1042bU
      0x10404U => 0x1042cU
      0x10405U => 0x1042dU
      0x10406U => 0x1042eU
      0x10407U => 0x1042fU
      0x10408U => 0x10430U
      0x10409U => 0x10431U
      0x1040aU => 0x10432U
      0x1040bU => 0x10433U
      0x1040cU => 0x10434U
      0x1040dU => 0x10435U
      0x1040eU => 0x10436U
      0x1040fU => 0x10437U
      0x10410U => 0x10438U
      0x10411U => 0x10439U
      0x10412U => 0x1043aU
      0x10413U => 0x1043bU
      0x10414U => 0x1043cU
      0x10415U => 0x1043dU
      0x10416U => 0x1043eU
      0x10417U => 0x1043fU
      0x10418U => 0x10440U
      0x10419U => 0x10441U
      0x1041aU => 0x10442U
      0x1041bU => 0x10443U
      0x1041cU => 0x10444U
      0x1041dU => 0x10445U
      0x1041eU => 0x10446U
      0x1041fU => 0x10447U
      0x10420U => 0x10448U
      0x10421U => 0x10449U
      0x10422U => 0x1044aU
      0x10423U => 0x1044bU
      0x10424U => 0x1044cU
      0x10425U => 0x1044dU
      0x10426U => 0x1044eU
      0x10427U => 0x1044fU
      0x104b0U => 0x104d8U
      0x104b1U => 0x104d9U
      0x104b2U => 0x104daU
      0x104b3U => 0x104dbU
      0x104b4U => 0x104dcU
      0x104b5U => 0x104ddU
      0x104b6U => 0x104deU
      0x104b7U => 0x104dfU
      0x104b8U => 0x104e0U
      0x104b9U => 0x104e1U
      0x104baU => 0x104e2U
      0x104bbU => 0x104e3U
      0x104bcU => 0x104e4U
      0x104bdU => 0x104e5U
      0x104beU => 0x104e6U
      0x104bfU => 0x104e7U
      0x104c0U => 0x104e8U
      0x104c1U => 0x104e9U
      0x104c2U => 0x104eaU
      0x104c3U => 0x104ebU
      0x104c4U => 0x104ecU
      0x104c5U => 0x104edU
      0x104c6U => 0x104eeU
      0x104c7U => 0x104efU
      0x104c8U => 0x104f0U
      0x104c9U => 0x104f1U
      0x104caU => 0x104f2U
      0x104cbU => 0x104f3U
      0x104ccU => 0x104f4U
      0x104cdU => 0x104f5U
      0x104ceU => 0x104f6U
      0x104cfU => 0x104f7U
      0x104d0U => 0x104f8U
      0x104d1U => 0x104f9U
      0x104d2U => 0x104faU
      0x104d3U => 0x104fbU
      0x10570U => 0x10597U
      0x10571U => 0x10598U
      0x10572U => 0x10599U
      0x10573U => 0x1059aU
      0x10574U => 0x1059bU
      0x10575U => 0x1059cU
      0x10576U => 0x1059dU
      0x10577U => 0x1059eU
      0x10578U => 0x1059fU
      0x10579U => 0x105a0U
      0x1057aU => 0x105a1U
      0x1057cU => 0x105a3U
      0x1057dU => 0x105a4U
      0x1057eU => 0x105a5U
      0x1057fU => 0x105a6U
      0x10580U => 0x105a7U
      0x10581U => 0x105a8U
      0x10582U => 0x105a9U
      0x10583U => 0x105aaU
      0x10584U => 0x105abU
      0x10585U => 0x105acU
      0x10586U => 0x105adU
      0x10587U => 0x105aeU
      0x10588U => 0x105afU
      0x10589U => 0x105b0U
      0x1058aU => 0x105b1U
      0x1058cU => 0x105b3U
      0x1058dU => 0x105b4U
      0x1058eU => 0x105b5U
      0x1058fU => 0x105b6U
      0x10590U => 0x105b7U
      0x10591U => 0x105b8U
      0x10592U => 0x105b9U
      0x10594U => 0x105bbU
      0x10595U => 0x105bcU
      0x10c80U => 0x10cc0U
      0x10c81U => 0x10cc1U
      0x10c82U => 0x10cc2U
      0x10c83U => 0x10cc3U
      0x10c84U => 0x10cc4U
      0x10c85U => 0x10cc5U
      0x10c86U => 0x10cc6U
      0x10c87U => 0x10cc7U
      0x10c88U => 0x10cc8U
      0x10c89U => 0x10cc9U
      0x10c8aU => 0x10ccaU
      0x10c8bU => 0x10ccbU
      0x10c8cU => 0x10cccU
      0x10c8dU => 0x10ccdU
      0x10c8eU => 0x10cceU
      0x10c8fU => 0x10ccfU
      0x10c90U => 0x10cd0U
      0x10c91U => 0x10cd1U
      0x10c92U => 0x10cd2U
      0x10c93U => 0x10cd3U
      0x10c94U => 0x10cd4U
      0x10c95U => 0x10cd5U
      0x10c96U => 0x10cd6U
      0x10c97U => 0x10cd7U
      0x10c98U => 0x10cd8U
      0x10c99U => 0x10cd9U
      0x10c9aU => 0x10cdaU
      0x10c9bU => 0x10cdbU
      0x10c9cU => 0x10cdcU
      0x10c9dU => 0x10cddU
      0x10c9eU => 0x10cdeU
      0x10c9fU => 0x10cdfU
      0x10ca0U => 0x10ce0U
      0x10ca1U => 0x10ce1U
      0x10ca2U => 0x10ce2U
      0x10ca3U => 0x10ce3U
      0x10ca4U => 0x10ce4U
      0x10ca5U => 0x10ce5U
      0x10ca6U => 0x10ce6U
      0x10ca7U => 0x10ce7U
      0x10ca8U => 0x10ce8U
      0x10ca9U => 0x10ce9U
      0x10caaU => 0x10ceaU
      0x10cabU => 0x10cebU
      0x10cacU => 0x10cecU
      0x10cadU => 0x10cedU
      0x10caeU => 0x10ceeU
      0x10cafU => 0x10cefU
      0x10cb0U => 0x10cf0U
      0x10cb1U => 0x10cf1U
      0x10cb2U => 0x10cf2U
      0x10d50U => 0x10d70U
      0x10d51U => 0x10d71U
      0x10d52U => 0x10d72U
      0x10d53U => 0x10d73U
      0x10d54U => 0x10d74U
      0x10d55U => 0x10d75U
      0x10d56U => 0x10d76U
      0x10d57U => 0x10d77U
      0x10d58U => 0x10d78U
      0x10d59U => 0x10d79U
      0x10d5aU => 0x10d7aU
      0x10d5bU => 0x10d7bU
      0x10d5cU => 0x10d7cU
      0x10d5dU => 0x10d7dU
      0x10d5eU => 0x10d7eU
      0x10d5fU => 0x10d7fU
      0x10d60U => 0x10d80U
      0x10d61U => 0x10d81U
      0x10d62U => 0x10d82U
      0x10d63U => 0x10d83U
      0x10d64U => 0x10d84U
      0x10d65U => 0x10d85U
      0x118a0U => 0x118c0U
      0x118a1U => 0x118c1U
      0x118a2U => 0x118c2U
      0x118a3U => 0x118c3U
      0x118a4U => 0x118c4U
      0x118a5U => 0x118c5U
      0x118a6U => 0x118c6U
      0x118a7U => 0x118c7U
      0x118a8U => 0x118c8U
      0x118a9U => 0x118c9U
      0x118aaU => 0x118caU
      0x118abU => 0x118cbU
      0x118acU => 0x118ccU
      0x118adU => 0x118cdU
      0x118aeU => 0x118ceU
      0x118afU => 0x118cfU
      0x118b0U => 0x118d0U
      0x118b1U => 0x118d1U
      0x118b2U => 0x118d2U
      0x118b3U => 0x118d3U
      0x118b4U => 0x118d4U
      0x118b5U => 0x118d5U
      0x118b6U => 0x118d6U
      0x118b7U => 0x118d7U
      0x118b8U => 0x118d8U
      0x118b9U => 0x118d9U
      0x118baU => 0x118daU
      0x118bbU => 0x118dbU
      0x118bcU => 0x118dcU
      0x118bdU => 0x118ddU
      0x118beU => 0x118deU
      0x118bfU => 0x118dfU
      0x16e40U => 0x16e60U
      0x16e41U => 0x16e61U
      0x16e42U => 0x16e62U
      0x16e43U => 0x16e63U
      0x16e44U => 0x16e64U
      0x16e45U => 0x16e65U
      0x16e46U => 0x16e66U
      0x16e47U => 0x16e67U
      0x16e48U => 0x16e68U
      0x16e49U => 0x16e69U
      0x16e4aU => 0x16e6aU
      0x16e4bU => 0x16e6bU
      0x16e4cU => 0x16e6cU
      0x16e4dU => 0x16e6dU
      0x16e4eU => 0x16e6eU
      0x16e4fU => 0x16e6fU
      0x16e50U => 0x16e70U
      0x16e51U => 0x16e71U
      0x16e52U => 0x16e72U
      0x16e53U => 0x16e73U
      0x16e54U => 0x16e74U
      0x16e55U => 0x16e75U
      0x16e56U => 0x16e76U
      0x16e57U => 0x16e77U
      0x16e58U => 0x16e78U
      0x16e59U => 0x16e79U
      0x16e5aU => 0x16e7aU
      0x16e5bU => 0x16e7bU
      0x16e5cU => 0x16e7cU
      0x16e5dU => 0x16e7dU
      0x16e5eU => 0x16e7eU
      0x16e5fU => 0x16e7fU
      0x1e900U => 0x1e922U
      0x1e901U => 0x1e923U
      0x1e902U => 0x1e924U
      0x1e903U => 0x1e925U
      0x1e904U => 0x1e926U
      0x1e905U => 0x1e927U
      0x1e906U => 0x1e928U
      0x1e907U => 0x1e929U
      0x1e908U => 0x1e92aU
      0x1e909U => 0x1e92bU
      0x1e90aU => 0x1e92cU
      0x1e90bU => 0x1e92dU
      0x1e90cU => 0x1e92eU
      0x1e90dU => 0x1e92fU
      0x1e90eU => 0x1e930U
      0x1e90fU => 0x1e931U
      0x1e910U => 0x1e932U
      0x1e911U => 0x1e933U
      0x1e912U => 0x1e934U
      0x1e913U => 0x1e935U
      0x1e914U => 0x1e936U
      0x1e915U => 0x1e937U
      0x1e916U => 0x1e938U
      0x1e917U => 0x1e939U
      0x1e918U => 0x1e93aU
      0x1e919U => 0x1e93bU
      0x1e91aU => 0x1e93cU
      0x1e91bU => 0x1e93dU
      0x1e91cU => 0x1e93eU
      0x1e91dU => 0x1e93fU
      0x1e91eU => 0x1e940U
      0x1e91fU => 0x1e941U
      0x1e920U => 0x1e942U
      0x1e921U => 0x1e943U
      _ => orig.to_uint()
    }
    One(Int::unsafe_to_char(single_char.reinterpret_as_int()))
  }

  for c_index in 0..<126217 {
    let c = Int::unsafe_to_char(c_index)
    let reference : Array[Char] = lookup_naive(c).collect()
    let actual : Array[Char] = lookup(c).collect()
    if actual != reference {
      println(
        "case-folding \{c} \{c_index} failed: Expected \{@debug.to_string(reference)}, got \{@debug.to_string(actual)}",
      )
      panic()
    }
  }
}