diff --git a/corpus/506_unicode_case_mapping.rb b/corpus/506_unicode_case_mapping.rb new file mode 100644 index 0000000..66fbbd8 --- /dev/null +++ b/corpus/506_unicode_case_mapping.rb @@ -0,0 +1,43 @@ +# Case mapping is context-independent in Ruby. Titlecase and case folding +# need their own mappings, including characters that map to themselves. +samples = ["ΣΣ Σ", "ßß", "ʼnʼn", "DžLjNjDz", "ᾈᾀ", "և", "აᲐ", "Ꭰꭰ", "Iİıi", + "漢字𠀀🙂aZ"] +%w[UTF-8 UTF-16LE UTF-16BE UTF-32LE UTF-32BE].each do |encoding| + samples.each do |sample| + source = sample.encode(encoding) + results = [:upcase, :downcase, :capitalize, :swapcase].map do |method| + result = source.public_send(method) + [result.encode('UTF-8'), result.encoding.name, result.valid_encoding?] + end + p results + p source.downcase(:fold).encode('UTF-8') + end + source = "Iİıi".encode(encoding) + p [:upcase, :downcase, :capitalize, :swapcase].map { |m| source.public_send(m, :turkic).encode('UTF-8') } + p "aΣß".encode(encoding).capitalize(:ascii).encode('UTF-8') + # Compare bytes here: noncharacter rendering by String#inspect is separate + # from the case mapping and the mask's upper bound. + high = "\u{10FFFF}Aß".encode(encoding) + p [:upcase, :downcase, :capitalize, :swapcase].map { |m| high.public_send(m).bytes } + p high.downcase(:fold).bytes +end + +# Even an all-ASCII source can map to a non-ASCII byte in a single-byte +# encoding. Its bytes must be encoded back rather than copied from UTF-8. +%w[ISO-8859-1 ISO-8859-3 ISO-8859-9 Windows-1254 Windows-1257].each do |encoding| + p "ßß".encode(encoding).capitalize.bytes + source = 'Ii'.encode(encoding) + p [:upcase, :downcase, :capitalize, :swapcase].map { |m| source.public_send(m, :turkic).bytes } +end + +value = "ßΣ" +p [value.capitalize!.equal?(value), value, value.capitalize!] +p "Ꭰ".casecmp?("ꭰ") +%w[GBK CP936 CP949].each do |encoding| + value = "\x80aZ".b.force_encoding(encoding) + p [value.valid_encoding?, value.tr('a-z', 'A-Z').bytes, + value.upcase.bytes, value.downcase.bytes, value.capitalize.bytes, value.swapcase.bytes] +end +value = "\x81A".b.force_encoding('GBK') +p [value.valid_encoding?, value.downcase.bytes] +p "\xff".b.force_encoding('GBK').valid_encoding? diff --git a/m_codec.mere b/m_codec.mere index 727feda..cd6a62c 100644 --- a/m_codec.mere +++ b/m_codec.mere @@ -813,7 +813,7 @@ let encode_cps = fn (cps: int list) -> fn (to: str) -> fn (acc: str) -> // case maps for the scripts with a regular offset: ASCII, Latin-1, Greek // (U+0391-03A9 <-> U+03B1-03C9, +/-32; final sigma U+03C2 -> Sigma), and // Cyrillic (U+0410-042F <-> U+0430-044F +/-32; U+0400-040F <-> U+0450-045F -// +/-80). Full Unicode (Latin Extended, folding, Turkic) is out of scope. +// +/-80). Full mappings and exceptions are supplied by the tables below. let cp_upcase = fn (cp: int) -> if cp >= 97 && cp <= 122 then cp - 32 else if cp >= 224 && cp <= 254 && (if cp == 247 then false else true) then cp - 32 @@ -838,18 +838,28 @@ let cp_downcase = fn (cp: int) -> else if cp >= 1024 && cp <= 1039 then cp + 80 else cp; // ---- full Unicode case mapping --------------------------------------------- -// Generated by tools/gen_case_tables.rb from ruby's own #upcase / #downcase / -// #downcase(:fold); only non-ASCII mappings are listed ("CP:CP[ CP..]" hex, +// Generated by tools/gen_case_tables.rb from Ruby's case methods; +// only non-ASCII mappings are listed ("CP:CP[ CP..]" hex, // comma-separated). The arithmetic maps above answer first; these tables are // the long tail (Latin Extended, special casing like eszett, folding). -// FOLD lists only codepoints whose folding differs from their downcase. +// FOLD, TITLE and SWAP hold exceptions to their default mappings, including +// identity mappings when the default would change a character. // ENC_CASE_TABLES BEGIN let case_up_raw = "B5:39C,DF:53 53,E0:C0,E1:C1,E2:C2,E3:C3,E4:C4,E5:C5,E6:C6,E7:C7,E8:C8,E9:C9,EA:CA,EB:CB,EC:CC,ED:CD,EE:CE,EF:CF,F0:D0,F1:D1,F2:D2,F3:D3,F4:D4,F5:D5,F6:D6,F8:D8,F9:D9,FA:DA,FB:DB,FC:DC,FD:DD,FE:DE,FF:178,101:100,103:102,105:104,107:106,109:108,10B:10A,10D:10C,10F:10E,111:110,113:112,115:114,117:116,119:118,11B:11A,11D:11C,11F:11E,121:120,123:122,125:124,127:126,129:128,12B:12A,12D:12C,12F:12E,131:49,133:132,135:134,137:136,13A:139,13C:13B,13E:13D,140:13F,142:141,144:143,146:145,148:147,149:2BC 4E,14B:14A,14D:14C,14F:14E,151:150,153:152,155:154,157:156,159:158,15B:15A,15D:15C,15F:15E,161:160,163:162,165:164,167:166,169:168,16B:16A,16D:16C,16F:16E,171:170,173:172,175:174,177:176,17A:179,17C:17B,17E:17D,17F:53,180:243,183:182,185:184,188:187,18C:18B,192:191,195:1F6,199:198,19A:23D,19B:A7DC,19E:220,1A1:1A0,1A3:1A2,1A5:1A4,1A8:1A7,1AD:1AC,1B0:1AF,1B4:1B3,1B6:1B5,1B9:1B8,1BD:1BC,1BF:1F7,1C5:1C4,1C6:1C4,1C8:1C7,1C9:1C7,1CB:1CA,1CC:1CA,1CE:1CD,1D0:1CF,1D2:1D1,1D4:1D3,1D6:1D5,1D8:1D7,1DA:1D9,1DC:1DB,1DD:18E,1DF:1DE,1E1:1E0,1E3:1E2,1E5:1E4,1E7:1E6,1E9:1E8,1EB:1EA,1ED:1EC,1EF:1EE,1F0:4A 30C,1F2:1F1,1F3:1F1,1F5:1F4,1F9:1F8,1FB:1FA,1FD:1FC,1FF:1FE,201:200,203:202,205:204,207:206,209:208,20B:20A,20D:20C,20F:20E,211:210,213:212,215:214,217:216,219:218,21B:21A,21D:21C,21F:21E,223:222,225:224,227:226,229:228,22B:22A,22D:22C,22F:22E,231:230,233:232,23C:23B,23F:2C7E,240:2C7F,242:241,247:246,249:248,24B:24A,24D:24C,24F:24E,250:2C6F,251:2C6D,252:2C70,253:181,254:186,256:189,257:18A,259:18F,25B:190,25C:A7AB,260:193,261:A7AC,263:194,264:A7CB,265:A78D,266:A7AA,268:197,269:196,26A:A7AE,26B:2C62,26C:A7AD,26F:19C,271:2C6E,272:19D,275:19F,27D:2C64,280:1A6,282:A7C5,283:1A9,287:A7B1,288:1AE,289:244,28A:1B1,28B:1B2,28C:245,292:1B7,29D:A7B2,29E:A7B0,345:399,371:370,373:372,377:376,37B:3FD,37C:3FE,37D:3FF,390:399 308 301,3AC:386,3AD:388,3AE:389,3AF:38A,3B0:3A5 308 301,3B1:391,3B2:392,3B3:393,3B4:394,3B5:395,3B6:396,3B7:397,3B8:398,3B9:399,3BA:39A,3BB:39B,3BC:39C,3BD:39D,3BE:39E,3BF:39F,3C0:3A0,3C1:3A1,3C2:3A3,3C3:3A3,3C4:3A4,3C5:3A5,3C6:3A6,3C7:3A7,3C8:3A8,3C9:3A9,3CA:3AA,3CB:3AB,3CC:38C,3CD:38E,3CE:38F,3D0:392,3D1:398,3D5:3A6,3D6:3A0,3D7:3CF,3D9:3D8,3DB:3DA,3DD:3DC,3DF:3DE,3E1:3E0,3E3:3E2,3E5:3E4,3E7:3E6,3E9:3E8,3EB:3EA,3ED:3EC,3EF:3EE,3F0:39A,3F1:3A1,3F2:3F9,3F3:37F,3F5:395,3F8:3F7,3FB:3FA,430:410,431:411,432:412,433:413,434:414,435:415,436:416,437:417,438:418,439:419,43A:41A,43B:41B,43C:41C,43D:41D,43E:41E,43F:41F,440:420,441:421,442:422,443:423,444:424,445:425,446:426,447:427,448:428,449:429,44A:42A,44B:42B,44C:42C,44D:42D,44E:42E,44F:42F,450:400,451:401,452:402,453:403,454:404,455:405,456:406,457:407,458:408,459:409,45A:40A,45B:40B,45C:40C,45D:40D,45E:40E,45F:40F,461:460,463:462,465:464,467:466,469:468,46B:46A,46D:46C,46F:46E,471:470,473:472,475:474,477:476,479:478,47B:47A,47D:47C,47F:47E,481:480,48B:48A,48D:48C,48F:48E,491:490,493:492,495:494,497:496,499:498,49B:49A,49D:49C,49F:49E,4A1:4A0,4A3:4A2,4A5:4A4,4A7:4A6,4A9:4A8,4AB:4AA,4AD:4AC,4AF:4AE,4B1:4B0,4B3:4B2,4B5:4B4,4B7:4B6,4B9:4B8,4BB:4BA,4BD:4BC,4BF:4BE,4C2:4C1,4C4:4C3,4C6:4C5,4C8:4C7,4CA:4C9,4CC:4CB,4CE:4CD,4CF:4C0,4D1:4D0,4D3:4D2,4D5:4D4,4D7:4D6,4D9:4D8,4DB:4DA,4DD:4DC,4DF:4DE,4E1:4E0,4E3:4E2,4E5:4E4,4E7:4E6,4E9:4E8,4EB:4EA,4ED:4EC,4EF:4EE,4F1:4F0,4F3:4F2,4F5:4F4,4F7:4F6,4F9:4F8,4FB:4FA,4FD:4FC,4FF:4FE,501:500,503:502,505:504,507:506,509:508,50B:50A,50D:50C,50F:50E,511:510,513:512,515:514,517:516,519:518,51B:51A,51D:51C,51F:51E,521:520,523:522,525:524,527:526,529:528,52B:52A,52D:52C,52F:52E,561:531,562:532,563:533,564:534,565:535,566:536,567:537,568:538,569:539,56A:53A,56B:53B,56C:53C,56D:53D,56E:53E,56F:53F,570:540,571:541,572:542,573:543,574:544,575:545,576:546,577:547,578:548,579:549,57A:54A,57B:54B,57C:54C,57D:54D,57E:54E,57F:54F,580:550,581:551,582:552,583:553,584:554,585:555,586:556,587:535 552,10D0:1C90,10D1:1C91,10D2:1C92,10D3:1C93,10D4:1C94,10D5:1C95,10D6:1C96,10D7:1C97,10D8:1C98,10D9:1C99,10DA:1C9A,10DB:1C9B,10DC:1C9C,10DD:1C9D,10DE:1C9E,10DF:1C9F,10E0:1CA0,10E1:1CA1,10E2:1CA2,10E3:1CA3,10E4:1CA4,10E5:1CA5,10E6:1CA6,10E7:1CA7,10E8:1CA8,10E9:1CA9,10EA:1CAA,10EB:1CAB,10EC:1CAC,10ED:1CAD,10EE:1CAE,10EF:1CAF,10F0:1CB0,10F1:1CB1,10F2:1CB2,10F3:1CB3,10F4:1CB4,10F5:1CB5,10F6:1CB6,10F7:1CB7,10F8:1CB8,10F9:1CB9,10FA:1CBA,10FD:1CBD,10FE:1CBE,10FF:1CBF,13F8:13F0,13F9:13F1,13FA:13F2,13FB:13F3,13FC:13F4,13FD:13F5,1C80:412,1C81:414,1C82:41E,1C83:421,1C84:422,1C85:422,1C86:42A,1C87:462,1C88:A64A,1C8A:1C89,1D79:A77D,1D7D:2C63,1D8E:A7C6,1E01:1E00,1E03:1E02,1E05:1E04,1E07:1E06,1E09:1E08,1E0B:1E0A,1E0D:1E0C,1E0F:1E0E,1E11:1E10,1E13:1E12,1E15:1E14,1E17:1E16,1E19:1E18,1E1B:1E1A,1E1D:1E1C,1E1F:1E1E,1E21:1E20,1E23:1E22,1E25:1E24,1E27:1E26,1E29:1E28,1E2B:1E2A,1E2D:1E2C,1E2F:1E2E,1E31:1E30,1E33:1E32,1E35:1E34,1E37:1E36,1E39:1E38,1E3B:1E3A,1E3D:1E3C,1E3F:1E3E,1E41:1E40,1E43:1E42,1E45:1E44,1E47:1E46,1E49:1E48,1E4B:1E4A,1E4D:1E4C,1E4F:1E4E,1E51:1E50,1E53:1E52,1E55:1E54,1E57:1E56,1E59:1E58,1E5B:1E5A,1E5D:1E5C,1E5F:1E5E,1E61:1E60,1E63:1E62,1E65:1E64,1E67:1E66,1E69:1E68,1E6B:1E6A,1E6D:1E6C,1E6F:1E6E,1E71:1E70,1E73:1E72,1E75:1E74,1E77:1E76,1E79:1E78,1E7B:1E7A,1E7D:1E7C,1E7F:1E7E,1E81:1E80,1E83:1E82,1E85:1E84,1E87:1E86,1E89:1E88,1E8B:1E8A,1E8D:1E8C,1E8F:1E8E,1E91:1E90,1E93:1E92,1E95:1E94,1E96:48 331,1E97:54 308,1E98:57 30A,1E99:59 30A,1E9A:41 2BE,1E9B:1E60,1EA1:1EA0,1EA3:1EA2,1EA5:1EA4,1EA7:1EA6,1EA9:1EA8,1EAB:1EAA,1EAD:1EAC,1EAF:1EAE,1EB1:1EB0,1EB3:1EB2,1EB5:1EB4,1EB7:1EB6,1EB9:1EB8,1EBB:1EBA,1EBD:1EBC,1EBF:1EBE,1EC1:1EC0,1EC3:1EC2,1EC5:1EC4,1EC7:1EC6,1EC9:1EC8,1ECB:1ECA,1ECD:1ECC,1ECF:1ECE,1ED1:1ED0,1ED3:1ED2,1ED5:1ED4,1ED7:1ED6,1ED9:1ED8,1EDB:1EDA,1EDD:1EDC,1EDF:1EDE,1EE1:1EE0,1EE3:1EE2,1EE5:1EE4,1EE7:1EE6,1EE9:1EE8,1EEB:1EEA,1EED:1EEC,1EEF:1EEE,1EF1:1EF0,1EF3:1EF2,1EF5:1EF4,1EF7:1EF6,1EF9:1EF8,1EFB:1EFA,1EFD:1EFC,1EFF:1EFE,1F00:1F08,1F01:1F09,1F02:1F0A,1F03:1F0B,1F04:1F0C,1F05:1F0D,1F06:1F0E,1F07:1F0F,1F10:1F18,1F11:1F19,1F12:1F1A,1F13:1F1B,1F14:1F1C,1F15:1F1D,1F20:1F28,1F21:1F29,1F22:1F2A,1F23:1F2B,1F24:1F2C,1F25:1F2D,1F26:1F2E,1F27:1F2F,1F30:1F38,1F31:1F39,1F32:1F3A,1F33:1F3B,1F34:1F3C,1F35:1F3D,1F36:1F3E,1F37:1F3F,1F40:1F48,1F41:1F49,1F42:1F4A,1F43:1F4B,1F44:1F4C,1F45:1F4D,1F50:3A5 313,1F51:1F59,1F52:3A5 313 300,1F53:1F5B,1F54:3A5 313 301,1F55:1F5D,1F56:3A5 313 342,1F57:1F5F,1F60:1F68,1F61:1F69,1F62:1F6A,1F63:1F6B,1F64:1F6C,1F65:1F6D,1F66:1F6E,1F67:1F6F,1F70:1FBA,1F71:1FBB,1F72:1FC8,1F73:1FC9,1F74:1FCA,1F75:1FCB,1F76:1FDA,1F77:1FDB,1F78:1FF8,1F79:1FF9,1F7A:1FEA,1F7B:1FEB,1F7C:1FFA,1F7D:1FFB,1F80:1F08 399,1F81:1F09 399,1F82:1F0A 399,1F83:1F0B 399,1F84:1F0C 399,1F85:1F0D 399,1F86:1F0E 399,1F87:1F0F 399,1F88:1F08 399,1F89:1F09 399,1F8A:1F0A 399,1F8B:1F0B 399,1F8C:1F0C 399,1F8D:1F0D 399,1F8E:1F0E 399,1F8F:1F0F 399,1F90:1F28 399,1F91:1F29 399,1F92:1F2A 399,1F93:1F2B 399,1F94:1F2C 399,1F95:1F2D 399,1F96:1F2E 399,1F97:1F2F 399,1F98:1F28 399,1F99:1F29 399,1F9A:1F2A 399,1F9B:1F2B 399,1F9C:1F2C 399,1F9D:1F2D 399,1F9E:1F2E 399,1F9F:1F2F 399,1FA0:1F68 399,1FA1:1F69 399,1FA2:1F6A 399,1FA3:1F6B 399,1FA4:1F6C 399,1FA5:1F6D 399,1FA6:1F6E 399,1FA7:1F6F 399,1FA8:1F68 399,1FA9:1F69 399,1FAA:1F6A 399,1FAB:1F6B 399,1FAC:1F6C 399,1FAD:1F6D 399,1FAE:1F6E 399,1FAF:1F6F 399,1FB0:1FB8,1FB1:1FB9,1FB2:1FBA 399,1FB3:391 399,1FB4:386 399,1FB6:391 342,1FB7:391 342 399,1FBC:391 399,1FBE:399,1FC2:1FCA 399,1FC3:397 399,1FC4:389 399,1FC6:397 342,1FC7:397 342 399,1FCC:397 399,1FD0:1FD8,1FD1:1FD9,1FD2:399 308 300,1FD3:399 308 301,1FD6:399 342,1FD7:399 308 342,1FE0:1FE8,1FE1:1FE9,1FE2:3A5 308 300,1FE3:3A5 308 301,1FE4:3A1 313,1FE5:1FEC,1FE6:3A5 342,1FE7:3A5 308 342,1FF2:1FFA 399,1FF3:3A9 399,1FF4:38F 399,1FF6:3A9 342,1FF7:3A9 342 399,1FFC:3A9 399,214E:2132,2170:2160,2171:2161,2172:2162,2173:2163,2174:2164,2175:2165,2176:2166,2177:2167,2178:2168,2179:2169,217A:216A,217B:216B,217C:216C,217D:216D,217E:216E,217F:216F,2184:2183,24D0:24B6,24D1:24B7,24D2:24B8,24D3:24B9,24D4:24BA,24D5:24BB,24D6:24BC,24D7:24BD,24D8:24BE,24D9:24BF,24DA:24C0,24DB:24C1,24DC:24C2,24DD:24C3,24DE:24C4,24DF:24C5,24E0:24C6,24E1:24C7,24E2:24C8,24E3:24C9,24E4:24CA,24E5:24CB,24E6:24CC,24E7:24CD,24E8:24CE,24E9:24CF,2C30:2C00,2C31:2C01,2C32:2C02,2C33:2C03,2C34:2C04,2C35:2C05,2C36:2C06,2C37:2C07,2C38:2C08,2C39:2C09,2C3A:2C0A,2C3B:2C0B,2C3C:2C0C,2C3D:2C0D,2C3E:2C0E,2C3F:2C0F,2C40:2C10,2C41:2C11,2C42:2C12,2C43:2C13,2C44:2C14,2C45:2C15,2C46:2C16,2C47:2C17,2C48:2C18,2C49:2C19,2C4A:2C1A,2C4B:2C1B,2C4C:2C1C,2C4D:2C1D,2C4E:2C1E,2C4F:2C1F,2C50:2C20,2C51:2C21,2C52:2C22,2C53:2C23,2C54:2C24,2C55:2C25,2C56:2C26,2C57:2C27,2C58:2C28,2C59:2C29,2C5A:2C2A,2C5B:2C2B,2C5C:2C2C,2C5D:2C2D,2C5E:2C2E,2C5F:2C2F,2C61:2C60,2C65:23A,2C66:23E,2C68:2C67,2C6A:2C69,2C6C:2C6B,2C73:2C72,2C76:2C75,2C81:2C80,2C83:2C82,2C85:2C84,2C87:2C86,2C89:2C88,2C8B:2C8A,2C8D:2C8C,2C8F:2C8E,2C91:2C90,2C93:2C92,2C95:2C94,2C97:2C96,2C99:2C98,2C9B:2C9A,2C9D:2C9C,2C9F:2C9E,2CA1:2CA0,2CA3:2CA2,2CA5:2CA4,2CA7:2CA6,2CA9:2CA8,2CAB:2CAA,2CAD:2CAC,2CAF:2CAE,2CB1:2CB0,2CB3:2CB2,2CB5:2CB4,2CB7:2CB6,2CB9:2CB8,2CBB:2CBA,2CBD:2CBC,2CBF:2CBE,2CC1:2CC0,2CC3:2CC2,2CC5:2CC4,2CC7:2CC6,2CC9:2CC8,2CCB:2CCA,2CCD:2CCC,2CCF:2CCE,2CD1:2CD0,2CD3:2CD2,2CD5:2CD4,2CD7:2CD6,2CD9:2CD8,2CDB:2CDA,2CDD:2CDC,2CDF:2CDE,2CE1:2CE0,2CE3:2CE2,2CEC:2CEB,2CEE:2CED,2CF3:2CF2,2D00:10A0,2D01:10A1,2D02:10A2,2D03:10A3,2D04:10A4,2D05:10A5,2D06:10A6,2D07:10A7,2D08:10A8,2D09:10A9,2D0A:10AA,2D0B:10AB,2D0C:10AC,2D0D:10AD,2D0E:10AE,2D0F:10AF,2D10:10B0,2D11:10B1,2D12:10B2,2D13:10B3,2D14:10B4,2D15:10B5,2D16:10B6,2D17:10B7,2D18:10B8,2D19:10B9,2D1A:10BA,2D1B:10BB,2D1C:10BC,2D1D:10BD,2D1E:10BE,2D1F:10BF,2D20:10C0,2D21:10C1,2D22:10C2,2D23:10C3,2D24:10C4,2D25:10C5,2D27:10C7,2D2D:10CD,A641:A640,A643:A642,A645:A644,A647:A646,A649:A648,A64B:A64A,A64D:A64C,A64F:A64E,A651:A650,A653:A652,A655:A654,A657:A656,A659:A658,A65B:A65A,A65D:A65C,A65F:A65E,A661:A660,A663:A662,A665:A664,A667:A666,A669:A668,A66B:A66A,A66D:A66C,A681:A680,A683:A682,A685:A684,A687:A686,A689:A688,A68B:A68A,A68D:A68C,A68F:A68E,A691:A690,A693:A692,A695:A694,A697:A696,A699:A698,A69B:A69A,A723:A722,A725:A724,A727:A726,A729:A728,A72B:A72A,A72D:A72C,A72F:A72E,A733:A732,A735:A734,A737:A736,A739:A738,A73B:A73A,A73D:A73C,A73F:A73E,A741:A740,A743:A742,A745:A744,A747:A746,A749:A748,A74B:A74A,A74D:A74C,A74F:A74E,A751:A750,A753:A752,A755:A754,A757:A756,A759:A758,A75B:A75A,A75D:A75C,A75F:A75E,A761:A760,A763:A762,A765:A764,A767:A766,A769:A768,A76B:A76A,A76D:A76C,A76F:A76E,A77A:A779,A77C:A77B,A77F:A77E,A781:A780,A783:A782,A785:A784,A787:A786,A78C:A78B,A791:A790,A793:A792,A794:A7C4,A797:A796,A799:A798,A79B:A79A,A79D:A79C,A79F:A79E,A7A1:A7A0,A7A3:A7A2,A7A5:A7A4,A7A7:A7A6,A7A9:A7A8,A7B5:A7B4,A7B7:A7B6,A7B9:A7B8,A7BB:A7BA,A7BD:A7BC,A7BF:A7BE,A7C1:A7C0,A7C3:A7C2,A7C8:A7C7,A7CA:A7C9,A7CD:A7CC,A7CF:A7CE,A7D1:A7D0,A7D3:A7D2,A7D5:A7D4,A7D7:A7D6,A7D9:A7D8,A7DB:A7DA,A7F6:A7F5,AB53:A7B3,AB70:13A0,AB71:13A1,AB72:13A2,AB73:13A3,AB74:13A4,AB75:13A5,AB76:13A6,AB77:13A7,AB78:13A8,AB79:13A9,AB7A:13AA,AB7B:13AB,AB7C:13AC,AB7D:13AD,AB7E:13AE,AB7F:13AF,AB80:13B0,AB81:13B1,AB82:13B2,AB83:13B3,AB84:13B4,AB85:13B5,AB86:13B6,AB87:13B7,AB88:13B8,AB89:13B9,AB8A:13BA,AB8B:13BB,AB8C:13BC,AB8D:13BD,AB8E:13BE,AB8F:13BF,AB90:13C0,AB91:13C1,AB92:13C2,AB93:13C3,AB94:13C4,AB95:13C5,AB96:13C6,AB97:13C7,AB98:13C8,AB99:13C9,AB9A:13CA,AB9B:13CB,AB9C:13CC,AB9D:13CD,AB9E:13CE,AB9F:13CF,ABA0:13D0,ABA1:13D1,ABA2:13D2,ABA3:13D3,ABA4:13D4,ABA5:13D5,ABA6:13D6,ABA7:13D7,ABA8:13D8,ABA9:13D9,ABAA:13DA,ABAB:13DB,ABAC:13DC,ABAD:13DD,ABAE:13DE,ABAF:13DF,ABB0:13E0,ABB1:13E1,ABB2:13E2,ABB3:13E3,ABB4:13E4,ABB5:13E5,ABB6:13E6,ABB7:13E7,ABB8:13E8,ABB9:13E9,ABBA:13EA,ABBB:13EB,ABBC:13EC,ABBD:13ED,ABBE:13EE,ABBF:13EF,FB00:46 46,FB01:46 49,FB02:46 4C,FB03:46 46 49,FB04:46 46 4C,FB05:53 54,FB06:53 54,FB13:544 546,FB14:544 535,FB15:544 53B,FB16:54E 546,FB17:544 53D,FF41:FF21,FF42:FF22,FF43:FF23,FF44:FF24,FF45:FF25,FF46:FF26,FF47:FF27,FF48:FF28,FF49:FF29,FF4A:FF2A,FF4B:FF2B,FF4C:FF2C,FF4D:FF2D,FF4E:FF2E,FF4F:FF2F,FF50:FF30,FF51:FF31,FF52:FF32,FF53:FF33,FF54:FF34,FF55:FF35,FF56:FF36,FF57:FF37,FF58:FF38,FF59:FF39,FF5A:FF3A,10428:10400,10429:10401,1042A:10402,1042B:10403,1042C:10404,1042D:10405,1042E:10406,1042F:10407,10430:10408,10431:10409,10432:1040A,10433:1040B,10434:1040C,10435:1040D,10436:1040E,10437:1040F,10438:10410,10439:10411,1043A:10412,1043B:10413,1043C:10414,1043D:10415,1043E:10416,1043F:10417,10440:10418,10441:10419,10442:1041A,10443:1041B,10444:1041C,10445:1041D,10446:1041E,10447:1041F,10448:10420,10449:10421,1044A:10422,1044B:10423,1044C:10424,1044D:10425,1044E:10426,1044F:10427,104D8:104B0,104D9:104B1,104DA:104B2,104DB:104B3,104DC:104B4,104DD:104B5,104DE:104B6,104DF:104B7,104E0:104B8,104E1:104B9,104E2:104BA,104E3:104BB,104E4:104BC,104E5:104BD,104E6:104BE,104E7:104BF,104E8:104C0,104E9:104C1,104EA:104C2,104EB:104C3,104EC:104C4,104ED:104C5,104EE:104C6,104EF:104C7,104F0:104C8,104F1:104C9,104F2:104CA,104F3:104CB,104F4:104CC,104F5:104CD,104F6:104CE,104F7:104CF,104F8:104D0,104F9:104D1,104FA:104D2,104FB:104D3,10597:10570,10598:10571,10599:10572,1059A:10573,1059B:10574,1059C:10575,1059D:10576,1059E:10577,1059F:10578,105A0:10579,105A1:1057A,105A3:1057C,105A4:1057D,105A5:1057E,105A6:1057F,105A7:10580,105A8:10581,105A9:10582,105AA:10583,105AB:10584,105AC:10585,105AD:10586,105AE:10587,105AF:10588,105B0:10589,105B1:1058A,105B3:1058C,105B4:1058D,105B5:1058E,105B6:1058F,105B7:10590,105B8:10591,105B9:10592,105BB:10594,105BC:10595,10CC0:10C80,10CC1:10C81,10CC2:10C82,10CC3:10C83,10CC4:10C84,10CC5:10C85,10CC6:10C86,10CC7:10C87,10CC8:10C88,10CC9:10C89,10CCA:10C8A,10CCB:10C8B,10CCC:10C8C,10CCD:10C8D,10CCE:10C8E,10CCF:10C8F,10CD0:10C90,10CD1:10C91,10CD2:10C92,10CD3:10C93,10CD4:10C94,10CD5:10C95,10CD6:10C96,10CD7:10C97,10CD8:10C98,10CD9:10C99,10CDA:10C9A,10CDB:10C9B,10CDC:10C9C,10CDD:10C9D,10CDE:10C9E,10CDF:10C9F,10CE0:10CA0,10CE1:10CA1,10CE2:10CA2,10CE3:10CA3,10CE4:10CA4,10CE5:10CA5,10CE6:10CA6,10CE7:10CA7,10CE8:10CA8,10CE9:10CA9,10CEA:10CAA,10CEB:10CAB,10CEC:10CAC,10CED:10CAD,10CEE:10CAE,10CEF:10CAF,10CF0:10CB0,10CF1:10CB1,10CF2:10CB2,10D70:10D50,10D71:10D51,10D72:10D52,10D73:10D53,10D74:10D54,10D75:10D55,10D76:10D56,10D77:10D57,10D78:10D58,10D79:10D59,10D7A:10D5A,10D7B:10D5B,10D7C:10D5C,10D7D:10D5D,10D7E:10D5E,10D7F:10D5F,10D80:10D60,10D81:10D61,10D82:10D62,10D83:10D63,10D84:10D64,10D85:10D65,118C0:118A0,118C1:118A1,118C2:118A2,118C3:118A3,118C4:118A4,118C5:118A5,118C6:118A6,118C7:118A7,118C8:118A8,118C9:118A9,118CA:118AA,118CB:118AB,118CC:118AC,118CD:118AD,118CE:118AE,118CF:118AF,118D0:118B0,118D1:118B1,118D2:118B2,118D3:118B3,118D4:118B4,118D5:118B5,118D6:118B6,118D7:118B7,118D8:118B8,118D9:118B9,118DA:118BA,118DB:118BB,118DC:118BC,118DD:118BD,118DE:118BE,118DF:118BF,16E60:16E40,16E61:16E41,16E62:16E42,16E63:16E43,16E64:16E44,16E65:16E45,16E66:16E46,16E67:16E47,16E68:16E48,16E69:16E49,16E6A:16E4A,16E6B:16E4B,16E6C:16E4C,16E6D:16E4D,16E6E:16E4E,16E6F:16E4F,16E70:16E50,16E71:16E51,16E72:16E52,16E73:16E53,16E74:16E54,16E75:16E55,16E76:16E56,16E77:16E57,16E78:16E58,16E79:16E59,16E7A:16E5A,16E7B:16E5B,16E7C:16E5C,16E7D:16E5D,16E7E:16E5E,16E7F:16E5F,16EBB:16EA0,16EBC:16EA1,16EBD:16EA2,16EBE:16EA3,16EBF:16EA4,16EC0:16EA5,16EC1:16EA6,16EC2:16EA7,16EC3:16EA8,16EC4:16EA9,16EC5:16EAA,16EC6:16EAB,16EC7:16EAC,16EC8:16EAD,16EC9:16EAE,16ECA:16EAF,16ECB:16EB0,16ECC:16EB1,16ECD:16EB2,16ECE:16EB3,16ECF:16EB4,16ED0:16EB5,16ED1:16EB6,16ED2:16EB7,16ED3:16EB8,1E922:1E900,1E923:1E901,1E924:1E902,1E925:1E903,1E926:1E904,1E927:1E905,1E928:1E906,1E929:1E907,1E92A:1E908,1E92B:1E909,1E92C:1E90A,1E92D:1E90B,1E92E:1E90C,1E92F:1E90D,1E930:1E90E,1E931:1E90F,1E932:1E910,1E933:1E911,1E934:1E912,1E935:1E913,1E936:1E914,1E937:1E915,1E938:1E916,1E939:1E917,1E93A:1E918,1E93B:1E919,1E93C:1E91A,1E93D:1E91B,1E93E:1E91C,1E93F:1E91D,1E940:1E91E,1E941:1E91F,1E942:1E920,1E943:1E921"; let case_down_raw = "C0:E0,C1:E1,C2:E2,C3:E3,C4:E4,C5:E5,C6:E6,C7:E7,C8:E8,C9:E9,CA:EA,CB:EB,CC:EC,CD:ED,CE:EE,CF:EF,D0:F0,D1:F1,D2:F2,D3:F3,D4:F4,D5:F5,D6:F6,D8:F8,D9:F9,DA:FA,DB:FB,DC:FC,DD:FD,DE:FE,100:101,102:103,104:105,106:107,108:109,10A:10B,10C:10D,10E:10F,110:111,112:113,114:115,116:117,118:119,11A:11B,11C:11D,11E:11F,120:121,122:123,124:125,126:127,128:129,12A:12B,12C:12D,12E:12F,130:69 307,132:133,134:135,136:137,139:13A,13B:13C,13D:13E,13F:140,141:142,143:144,145:146,147:148,14A:14B,14C:14D,14E:14F,150:151,152:153,154:155,156:157,158:159,15A:15B,15C:15D,15E:15F,160:161,162:163,164:165,166:167,168:169,16A:16B,16C:16D,16E:16F,170:171,172:173,174:175,176:177,178:FF,179:17A,17B:17C,17D:17E,181:253,182:183,184:185,186:254,187:188,189:256,18A:257,18B:18C,18E:1DD,18F:259,190:25B,191:192,193:260,194:263,196:269,197:268,198:199,19C:26F,19D:272,19F:275,1A0:1A1,1A2:1A3,1A4:1A5,1A6:280,1A7:1A8,1A9:283,1AC:1AD,1AE:288,1AF:1B0,1B1:28A,1B2:28B,1B3:1B4,1B5:1B6,1B7:292,1B8:1B9,1BC:1BD,1C4:1C6,1C5:1C6,1C7:1C9,1C8:1C9,1CA:1CC,1CB:1CC,1CD:1CE,1CF:1D0,1D1:1D2,1D3:1D4,1D5:1D6,1D7:1D8,1D9:1DA,1DB:1DC,1DE:1DF,1E0:1E1,1E2:1E3,1E4:1E5,1E6:1E7,1E8:1E9,1EA:1EB,1EC:1ED,1EE:1EF,1F1:1F3,1F2:1F3,1F4:1F5,1F6:195,1F7:1BF,1F8:1F9,1FA:1FB,1FC:1FD,1FE:1FF,200:201,202:203,204:205,206:207,208:209,20A:20B,20C:20D,20E:20F,210:211,212:213,214:215,216:217,218:219,21A:21B,21C:21D,21E:21F,220:19E,222:223,224:225,226:227,228:229,22A:22B,22C:22D,22E:22F,230:231,232:233,23A:2C65,23B:23C,23D:19A,23E:2C66,241:242,243:180,244:289,245:28C,246:247,248:249,24A:24B,24C:24D,24E:24F,370:371,372:373,376:377,37F:3F3,386:3AC,388:3AD,389:3AE,38A:3AF,38C:3CC,38E:3CD,38F:3CE,391:3B1,392:3B2,393:3B3,394:3B4,395:3B5,396:3B6,397:3B7,398:3B8,399:3B9,39A:3BA,39B:3BB,39C:3BC,39D:3BD,39E:3BE,39F:3BF,3A0:3C0,3A1:3C1,3A3:3C3,3A4:3C4,3A5:3C5,3A6:3C6,3A7:3C7,3A8:3C8,3A9:3C9,3AA:3CA,3AB:3CB,3CF:3D7,3D8:3D9,3DA:3DB,3DC:3DD,3DE:3DF,3E0:3E1,3E2:3E3,3E4:3E5,3E6:3E7,3E8:3E9,3EA:3EB,3EC:3ED,3EE:3EF,3F4:3B8,3F7:3F8,3F9:3F2,3FA:3FB,3FD:37B,3FE:37C,3FF:37D,400:450,401:451,402:452,403:453,404:454,405:455,406:456,407:457,408:458,409:459,40A:45A,40B:45B,40C:45C,40D:45D,40E:45E,40F:45F,410:430,411:431,412:432,413:433,414:434,415:435,416:436,417:437,418:438,419:439,41A:43A,41B:43B,41C:43C,41D:43D,41E:43E,41F:43F,420:440,421:441,422:442,423:443,424:444,425:445,426:446,427:447,428:448,429:449,42A:44A,42B:44B,42C:44C,42D:44D,42E:44E,42F:44F,460:461,462:463,464:465,466:467,468:469,46A:46B,46C:46D,46E:46F,470:471,472:473,474:475,476:477,478:479,47A:47B,47C:47D,47E:47F,480:481,48A:48B,48C:48D,48E:48F,490:491,492:493,494:495,496:497,498:499,49A:49B,49C:49D,49E:49F,4A0:4A1,4A2:4A3,4A4:4A5,4A6:4A7,4A8:4A9,4AA:4AB,4AC:4AD,4AE:4AF,4B0:4B1,4B2:4B3,4B4:4B5,4B6:4B7,4B8:4B9,4BA:4BB,4BC:4BD,4BE:4BF,4C0:4CF,4C1:4C2,4C3:4C4,4C5:4C6,4C7:4C8,4C9:4CA,4CB:4CC,4CD:4CE,4D0:4D1,4D2:4D3,4D4:4D5,4D6:4D7,4D8:4D9,4DA:4DB,4DC:4DD,4DE:4DF,4E0:4E1,4E2:4E3,4E4:4E5,4E6:4E7,4E8:4E9,4EA:4EB,4EC:4ED,4EE:4EF,4F0:4F1,4F2:4F3,4F4:4F5,4F6:4F7,4F8:4F9,4FA:4FB,4FC:4FD,4FE:4FF,500:501,502:503,504:505,506:507,508:509,50A:50B,50C:50D,50E:50F,510:511,512:513,514:515,516:517,518:519,51A:51B,51C:51D,51E:51F,520:521,522:523,524:525,526:527,528:529,52A:52B,52C:52D,52E:52F,531:561,532:562,533:563,534:564,535:565,536:566,537:567,538:568,539:569,53A:56A,53B:56B,53C:56C,53D:56D,53E:56E,53F:56F,540:570,541:571,542:572,543:573,544:574,545:575,546:576,547:577,548:578,549:579,54A:57A,54B:57B,54C:57C,54D:57D,54E:57E,54F:57F,550:580,551:581,552:582,553:583,554:584,555:585,556:586,10A0:2D00,10A1:2D01,10A2:2D02,10A3:2D03,10A4:2D04,10A5:2D05,10A6:2D06,10A7:2D07,10A8:2D08,10A9:2D09,10AA:2D0A,10AB:2D0B,10AC:2D0C,10AD:2D0D,10AE:2D0E,10AF:2D0F,10B0:2D10,10B1:2D11,10B2:2D12,10B3:2D13,10B4:2D14,10B5:2D15,10B6:2D16,10B7:2D17,10B8:2D18,10B9:2D19,10BA:2D1A,10BB:2D1B,10BC:2D1C,10BD:2D1D,10BE:2D1E,10BF:2D1F,10C0:2D20,10C1:2D21,10C2:2D22,10C3:2D23,10C4:2D24,10C5:2D25,10C7:2D27,10CD:2D2D,13A0:AB70,13A1:AB71,13A2:AB72,13A3:AB73,13A4:AB74,13A5:AB75,13A6:AB76,13A7:AB77,13A8:AB78,13A9:AB79,13AA:AB7A,13AB:AB7B,13AC:AB7C,13AD:AB7D,13AE:AB7E,13AF:AB7F,13B0:AB80,13B1:AB81,13B2:AB82,13B3:AB83,13B4:AB84,13B5:AB85,13B6:AB86,13B7:AB87,13B8:AB88,13B9:AB89,13BA:AB8A,13BB:AB8B,13BC:AB8C,13BD:AB8D,13BE:AB8E,13BF:AB8F,13C0:AB90,13C1:AB91,13C2:AB92,13C3:AB93,13C4:AB94,13C5:AB95,13C6:AB96,13C7:AB97,13C8:AB98,13C9:AB99,13CA:AB9A,13CB:AB9B,13CC:AB9C,13CD:AB9D,13CE:AB9E,13CF:AB9F,13D0:ABA0,13D1:ABA1,13D2:ABA2,13D3:ABA3,13D4:ABA4,13D5:ABA5,13D6:ABA6,13D7:ABA7,13D8:ABA8,13D9:ABA9,13DA:ABAA,13DB:ABAB,13DC:ABAC,13DD:ABAD,13DE:ABAE,13DF:ABAF,13E0:ABB0,13E1:ABB1,13E2:ABB2,13E3:ABB3,13E4:ABB4,13E5:ABB5,13E6:ABB6,13E7:ABB7,13E8:ABB8,13E9:ABB9,13EA:ABBA,13EB:ABBB,13EC:ABBC,13ED:ABBD,13EE:ABBE,13EF:ABBF,13F0:13F8,13F1:13F9,13F2:13FA,13F3:13FB,13F4:13FC,13F5:13FD,1C89:1C8A,1C90:10D0,1C91:10D1,1C92:10D2,1C93:10D3,1C94:10D4,1C95:10D5,1C96:10D6,1C97:10D7,1C98:10D8,1C99:10D9,1C9A:10DA,1C9B:10DB,1C9C:10DC,1C9D:10DD,1C9E:10DE,1C9F:10DF,1CA0:10E0,1CA1:10E1,1CA2:10E2,1CA3:10E3,1CA4:10E4,1CA5:10E5,1CA6:10E6,1CA7:10E7,1CA8:10E8,1CA9:10E9,1CAA:10EA,1CAB:10EB,1CAC:10EC,1CAD:10ED,1CAE:10EE,1CAF:10EF,1CB0:10F0,1CB1:10F1,1CB2:10F2,1CB3:10F3,1CB4:10F4,1CB5:10F5,1CB6:10F6,1CB7:10F7,1CB8:10F8,1CB9:10F9,1CBA:10FA,1CBD:10FD,1CBE:10FE,1CBF:10FF,1E00:1E01,1E02:1E03,1E04:1E05,1E06:1E07,1E08:1E09,1E0A:1E0B,1E0C:1E0D,1E0E:1E0F,1E10:1E11,1E12:1E13,1E14:1E15,1E16:1E17,1E18:1E19,1E1A:1E1B,1E1C:1E1D,1E1E:1E1F,1E20:1E21,1E22:1E23,1E24:1E25,1E26:1E27,1E28:1E29,1E2A:1E2B,1E2C:1E2D,1E2E:1E2F,1E30:1E31,1E32:1E33,1E34:1E35,1E36:1E37,1E38:1E39,1E3A:1E3B,1E3C:1E3D,1E3E:1E3F,1E40:1E41,1E42:1E43,1E44:1E45,1E46:1E47,1E48:1E49,1E4A:1E4B,1E4C:1E4D,1E4E:1E4F,1E50:1E51,1E52:1E53,1E54:1E55,1E56:1E57,1E58:1E59,1E5A:1E5B,1E5C:1E5D,1E5E:1E5F,1E60:1E61,1E62:1E63,1E64:1E65,1E66:1E67,1E68:1E69,1E6A:1E6B,1E6C:1E6D,1E6E:1E6F,1E70:1E71,1E72:1E73,1E74:1E75,1E76:1E77,1E78:1E79,1E7A:1E7B,1E7C:1E7D,1E7E:1E7F,1E80:1E81,1E82:1E83,1E84:1E85,1E86:1E87,1E88:1E89,1E8A:1E8B,1E8C:1E8D,1E8E:1E8F,1E90:1E91,1E92:1E93,1E94:1E95,1E9E:DF,1EA0:1EA1,1EA2:1EA3,1EA4:1EA5,1EA6:1EA7,1EA8:1EA9,1EAA:1EAB,1EAC:1EAD,1EAE:1EAF,1EB0:1EB1,1EB2:1EB3,1EB4:1EB5,1EB6:1EB7,1EB8:1EB9,1EBA:1EBB,1EBC:1EBD,1EBE:1EBF,1EC0:1EC1,1EC2:1EC3,1EC4:1EC5,1EC6:1EC7,1EC8:1EC9,1ECA:1ECB,1ECC:1ECD,1ECE:1ECF,1ED0:1ED1,1ED2:1ED3,1ED4:1ED5,1ED6:1ED7,1ED8:1ED9,1EDA:1EDB,1EDC:1EDD,1EDE:1EDF,1EE0:1EE1,1EE2:1EE3,1EE4:1EE5,1EE6:1EE7,1EE8:1EE9,1EEA:1EEB,1EEC:1EED,1EEE:1EEF,1EF0:1EF1,1EF2:1EF3,1EF4:1EF5,1EF6:1EF7,1EF8:1EF9,1EFA:1EFB,1EFC:1EFD,1EFE:1EFF,1F08:1F00,1F09:1F01,1F0A:1F02,1F0B:1F03,1F0C:1F04,1F0D:1F05,1F0E:1F06,1F0F:1F07,1F18:1F10,1F19:1F11,1F1A:1F12,1F1B:1F13,1F1C:1F14,1F1D:1F15,1F28:1F20,1F29:1F21,1F2A:1F22,1F2B:1F23,1F2C:1F24,1F2D:1F25,1F2E:1F26,1F2F:1F27,1F38:1F30,1F39:1F31,1F3A:1F32,1F3B:1F33,1F3C:1F34,1F3D:1F35,1F3E:1F36,1F3F:1F37,1F48:1F40,1F49:1F41,1F4A:1F42,1F4B:1F43,1F4C:1F44,1F4D:1F45,1F59:1F51,1F5B:1F53,1F5D:1F55,1F5F:1F57,1F68:1F60,1F69:1F61,1F6A:1F62,1F6B:1F63,1F6C:1F64,1F6D:1F65,1F6E:1F66,1F6F:1F67,1F88:1F80,1F89:1F81,1F8A:1F82,1F8B:1F83,1F8C:1F84,1F8D:1F85,1F8E:1F86,1F8F:1F87,1F98:1F90,1F99:1F91,1F9A:1F92,1F9B:1F93,1F9C:1F94,1F9D:1F95,1F9E:1F96,1F9F:1F97,1FA8:1FA0,1FA9:1FA1,1FAA:1FA2,1FAB:1FA3,1FAC:1FA4,1FAD:1FA5,1FAE:1FA6,1FAF:1FA7,1FB8:1FB0,1FB9:1FB1,1FBA:1F70,1FBB:1F71,1FBC:1FB3,1FC8:1F72,1FC9:1F73,1FCA:1F74,1FCB:1F75,1FCC:1FC3,1FD8:1FD0,1FD9:1FD1,1FDA:1F76,1FDB:1F77,1FE8:1FE0,1FE9:1FE1,1FEA:1F7A,1FEB:1F7B,1FEC:1FE5,1FF8:1F78,1FF9:1F79,1FFA:1F7C,1FFB:1F7D,1FFC:1FF3,2126:3C9,212A:6B,212B:E5,2132:214E,2160:2170,2161:2171,2162:2172,2163:2173,2164:2174,2165:2175,2166:2176,2167:2177,2168:2178,2169:2179,216A:217A,216B:217B,216C:217C,216D:217D,216E:217E,216F:217F,2183:2184,24B6:24D0,24B7:24D1,24B8:24D2,24B9:24D3,24BA:24D4,24BB:24D5,24BC:24D6,24BD:24D7,24BE:24D8,24BF:24D9,24C0:24DA,24C1:24DB,24C2:24DC,24C3:24DD,24C4:24DE,24C5:24DF,24C6:24E0,24C7:24E1,24C8:24E2,24C9:24E3,24CA:24E4,24CB:24E5,24CC:24E6,24CD:24E7,24CE:24E8,24CF:24E9,2C00:2C30,2C01:2C31,2C02:2C32,2C03:2C33,2C04:2C34,2C05:2C35,2C06:2C36,2C07:2C37,2C08:2C38,2C09:2C39,2C0A:2C3A,2C0B:2C3B,2C0C:2C3C,2C0D:2C3D,2C0E:2C3E,2C0F:2C3F,2C10:2C40,2C11:2C41,2C12:2C42,2C13:2C43,2C14:2C44,2C15:2C45,2C16:2C46,2C17:2C47,2C18:2C48,2C19:2C49,2C1A:2C4A,2C1B:2C4B,2C1C:2C4C,2C1D:2C4D,2C1E:2C4E,2C1F:2C4F,2C20:2C50,2C21:2C51,2C22:2C52,2C23:2C53,2C24:2C54,2C25:2C55,2C26:2C56,2C27:2C57,2C28:2C58,2C29:2C59,2C2A:2C5A,2C2B:2C5B,2C2C:2C5C,2C2D:2C5D,2C2E:2C5E,2C2F:2C5F,2C60:2C61,2C62:26B,2C63:1D7D,2C64:27D,2C67:2C68,2C69:2C6A,2C6B:2C6C,2C6D:251,2C6E:271,2C6F:250,2C70:252,2C72:2C73,2C75:2C76,2C7E:23F,2C7F:240,2C80:2C81,2C82:2C83,2C84:2C85,2C86:2C87,2C88:2C89,2C8A:2C8B,2C8C:2C8D,2C8E:2C8F,2C90:2C91,2C92:2C93,2C94:2C95,2C96:2C97,2C98:2C99,2C9A:2C9B,2C9C:2C9D,2C9E:2C9F,2CA0:2CA1,2CA2:2CA3,2CA4:2CA5,2CA6:2CA7,2CA8:2CA9,2CAA:2CAB,2CAC:2CAD,2CAE:2CAF,2CB0:2CB1,2CB2:2CB3,2CB4:2CB5,2CB6:2CB7,2CB8:2CB9,2CBA:2CBB,2CBC:2CBD,2CBE:2CBF,2CC0:2CC1,2CC2:2CC3,2CC4:2CC5,2CC6:2CC7,2CC8:2CC9,2CCA:2CCB,2CCC:2CCD,2CCE:2CCF,2CD0:2CD1,2CD2:2CD3,2CD4:2CD5,2CD6:2CD7,2CD8:2CD9,2CDA:2CDB,2CDC:2CDD,2CDE:2CDF,2CE0:2CE1,2CE2:2CE3,2CEB:2CEC,2CED:2CEE,2CF2:2CF3,A640:A641,A642:A643,A644:A645,A646:A647,A648:A649,A64A:A64B,A64C:A64D,A64E:A64F,A650:A651,A652:A653,A654:A655,A656:A657,A658:A659,A65A:A65B,A65C:A65D,A65E:A65F,A660:A661,A662:A663,A664:A665,A666:A667,A668:A669,A66A:A66B,A66C:A66D,A680:A681,A682:A683,A684:A685,A686:A687,A688:A689,A68A:A68B,A68C:A68D,A68E:A68F,A690:A691,A692:A693,A694:A695,A696:A697,A698:A699,A69A:A69B,A722:A723,A724:A725,A726:A727,A728:A729,A72A:A72B,A72C:A72D,A72E:A72F,A732:A733,A734:A735,A736:A737,A738:A739,A73A:A73B,A73C:A73D,A73E:A73F,A740:A741,A742:A743,A744:A745,A746:A747,A748:A749,A74A:A74B,A74C:A74D,A74E:A74F,A750:A751,A752:A753,A754:A755,A756:A757,A758:A759,A75A:A75B,A75C:A75D,A75E:A75F,A760:A761,A762:A763,A764:A765,A766:A767,A768:A769,A76A:A76B,A76C:A76D,A76E:A76F,A779:A77A,A77B:A77C,A77D:1D79,A77E:A77F,A780:A781,A782:A783,A784:A785,A786:A787,A78B:A78C,A78D:265,A790:A791,A792:A793,A796:A797,A798:A799,A79A:A79B,A79C:A79D,A79E:A79F,A7A0:A7A1,A7A2:A7A3,A7A4:A7A5,A7A6:A7A7,A7A8:A7A9,A7AA:266,A7AB:25C,A7AC:261,A7AD:26C,A7AE:26A,A7B0:29E,A7B1:287,A7B2:29D,A7B3:AB53,A7B4:A7B5,A7B6:A7B7,A7B8:A7B9,A7BA:A7BB,A7BC:A7BD,A7BE:A7BF,A7C0:A7C1,A7C2:A7C3,A7C4:A794,A7C5:282,A7C6:1D8E,A7C7:A7C8,A7C9:A7CA,A7CB:264,A7CC:A7CD,A7CE:A7CF,A7D0:A7D1,A7D2:A7D3,A7D4:A7D5,A7D6:A7D7,A7D8:A7D9,A7DA:A7DB,A7DC:19B,A7F5:A7F6,FF21:FF41,FF22:FF42,FF23:FF43,FF24:FF44,FF25:FF45,FF26:FF46,FF27:FF47,FF28:FF48,FF29:FF49,FF2A:FF4A,FF2B:FF4B,FF2C:FF4C,FF2D:FF4D,FF2E:FF4E,FF2F:FF4F,FF30:FF50,FF31:FF51,FF32:FF52,FF33:FF53,FF34:FF54,FF35:FF55,FF36:FF56,FF37:FF57,FF38:FF58,FF39:FF59,FF3A:FF5A,10400:10428,10401:10429,10402:1042A,10403:1042B,10404:1042C,10405:1042D,10406:1042E,10407:1042F,10408:10430,10409:10431,1040A:10432,1040B:10433,1040C:10434,1040D:10435,1040E:10436,1040F:10437,10410:10438,10411:10439,10412:1043A,10413:1043B,10414:1043C,10415:1043D,10416:1043E,10417:1043F,10418:10440,10419:10441,1041A:10442,1041B:10443,1041C:10444,1041D:10445,1041E:10446,1041F:10447,10420:10448,10421:10449,10422:1044A,10423:1044B,10424:1044C,10425:1044D,10426:1044E,10427:1044F,104B0:104D8,104B1:104D9,104B2:104DA,104B3:104DB,104B4:104DC,104B5:104DD,104B6:104DE,104B7:104DF,104B8:104E0,104B9:104E1,104BA:104E2,104BB:104E3,104BC:104E4,104BD:104E5,104BE:104E6,104BF:104E7,104C0:104E8,104C1:104E9,104C2:104EA,104C3:104EB,104C4:104EC,104C5:104ED,104C6:104EE,104C7:104EF,104C8:104F0,104C9:104F1,104CA:104F2,104CB:104F3,104CC:104F4,104CD:104F5,104CE:104F6,104CF:104F7,104D0:104F8,104D1:104F9,104D2:104FA,104D3:104FB,10570:10597,10571:10598,10572:10599,10573:1059A,10574:1059B,10575:1059C,10576:1059D,10577:1059E,10578:1059F,10579:105A0,1057A:105A1,1057C:105A3,1057D:105A4,1057E:105A5,1057F:105A6,10580:105A7,10581:105A8,10582:105A9,10583:105AA,10584:105AB,10585:105AC,10586:105AD,10587:105AE,10588:105AF,10589:105B0,1058A:105B1,1058C:105B3,1058D:105B4,1058E:105B5,1058F:105B6,10590:105B7,10591:105B8,10592:105B9,10594:105BB,10595:105BC,10C80:10CC0,10C81:10CC1,10C82:10CC2,10C83:10CC3,10C84:10CC4,10C85:10CC5,10C86:10CC6,10C87:10CC7,10C88:10CC8,10C89:10CC9,10C8A:10CCA,10C8B:10CCB,10C8C:10CCC,10C8D:10CCD,10C8E:10CCE,10C8F:10CCF,10C90:10CD0,10C91:10CD1,10C92:10CD2,10C93:10CD3,10C94:10CD4,10C95:10CD5,10C96:10CD6,10C97:10CD7,10C98:10CD8,10C99:10CD9,10C9A:10CDA,10C9B:10CDB,10C9C:10CDC,10C9D:10CDD,10C9E:10CDE,10C9F:10CDF,10CA0:10CE0,10CA1:10CE1,10CA2:10CE2,10CA3:10CE3,10CA4:10CE4,10CA5:10CE5,10CA6:10CE6,10CA7:10CE7,10CA8:10CE8,10CA9:10CE9,10CAA:10CEA,10CAB:10CEB,10CAC:10CEC,10CAD:10CED,10CAE:10CEE,10CAF:10CEF,10CB0:10CF0,10CB1:10CF1,10CB2:10CF2,10D50:10D70,10D51:10D71,10D52:10D72,10D53:10D73,10D54:10D74,10D55:10D75,10D56:10D76,10D57:10D77,10D58:10D78,10D59:10D79,10D5A:10D7A,10D5B:10D7B,10D5C:10D7C,10D5D:10D7D,10D5E:10D7E,10D5F:10D7F,10D60:10D80,10D61:10D81,10D62:10D82,10D63:10D83,10D64:10D84,10D65:10D85,118A0:118C0,118A1:118C1,118A2:118C2,118A3:118C3,118A4:118C4,118A5:118C5,118A6:118C6,118A7:118C7,118A8:118C8,118A9:118C9,118AA:118CA,118AB:118CB,118AC:118CC,118AD:118CD,118AE:118CE,118AF:118CF,118B0:118D0,118B1:118D1,118B2:118D2,118B3:118D3,118B4:118D4,118B5:118D5,118B6:118D6,118B7:118D7,118B8:118D8,118B9:118D9,118BA:118DA,118BB:118DB,118BC:118DC,118BD:118DD,118BE:118DE,118BF:118DF,16E40:16E60,16E41:16E61,16E42:16E62,16E43:16E63,16E44:16E64,16E45:16E65,16E46:16E66,16E47:16E67,16E48:16E68,16E49:16E69,16E4A:16E6A,16E4B:16E6B,16E4C:16E6C,16E4D:16E6D,16E4E:16E6E,16E4F:16E6F,16E50:16E70,16E51:16E71,16E52:16E72,16E53:16E73,16E54:16E74,16E55:16E75,16E56:16E76,16E57:16E77,16E58:16E78,16E59:16E79,16E5A:16E7A,16E5B:16E7B,16E5C:16E7C,16E5D:16E7D,16E5E:16E7E,16E5F:16E7F,16EA0:16EBB,16EA1:16EBC,16EA2:16EBD,16EA3:16EBE,16EA4:16EBF,16EA5:16EC0,16EA6:16EC1,16EA7:16EC2,16EA8:16EC3,16EA9:16EC4,16EAA:16EC5,16EAB:16EC6,16EAC:16EC7,16EAD:16EC8,16EAE:16EC9,16EAF:16ECA,16EB0:16ECB,16EB1:16ECC,16EB2:16ECD,16EB3:16ECE,16EB4:16ECF,16EB5:16ED0,16EB6:16ED1,16EB7:16ED2,16EB8:16ED3,1E900:1E922,1E901:1E923,1E902:1E924,1E903:1E925,1E904:1E926,1E905:1E927,1E906:1E928,1E907:1E929,1E908:1E92A,1E909:1E92B,1E90A:1E92C,1E90B:1E92D,1E90C:1E92E,1E90D:1E92F,1E90E:1E930,1E90F:1E931,1E910:1E932,1E911:1E933,1E912:1E934,1E913:1E935,1E914:1E936,1E915:1E937,1E916:1E938,1E917:1E939,1E918:1E93A,1E919:1E93B,1E91A:1E93C,1E91B:1E93D,1E91C:1E93E,1E91D:1E93F,1E91E:1E940,1E91F:1E941,1E920:1E942,1E921:1E943"; -let case_fold_raw = "B5:3BC,DF:73 73,149:2BC 6E,17F:73,1F0:6A 30C,345:3B9,390:3B9 308 301,3B0:3C5 308 301,3C2:3C3,3D0:3B2,3D1:3B8,3D5:3C6,3D6:3C0,3F0:3BA,3F1:3C1,3F5:3B5,587:565 582,13F8:13F0,13F9:13F1,13FA:13F2,13FB:13F3,13FC:13F4,13FD:13F5,1C80:432,1C81:434,1C82:43E,1C83:441,1C84:442,1C85:442,1C86:44A,1C87:463,1C88:A64B,1E96:68 331,1E97:74 308,1E98:77 30A,1E99:79 30A,1E9A:61 2BE,1E9B:1E61,1E9E:73 73,1F50:3C5 313,1F52:3C5 313 300,1F54:3C5 313 301,1F56:3C5 313 342,1F80:1F00 3B9,1F81:1F01 3B9,1F82:1F02 3B9,1F83:1F03 3B9,1F84:1F04 3B9,1F85:1F05 3B9,1F86:1F06 3B9,1F87:1F07 3B9,1F88:1F00 3B9,1F89:1F01 3B9,1F8A:1F02 3B9,1F8B:1F03 3B9,1F8C:1F04 3B9,1F8D:1F05 3B9,1F8E:1F06 3B9,1F8F:1F07 3B9,1F90:1F20 3B9,1F91:1F21 3B9,1F92:1F22 3B9,1F93:1F23 3B9,1F94:1F24 3B9,1F95:1F25 3B9,1F96:1F26 3B9,1F97:1F27 3B9,1F98:1F20 3B9,1F99:1F21 3B9,1F9A:1F22 3B9,1F9B:1F23 3B9,1F9C:1F24 3B9,1F9D:1F25 3B9,1F9E:1F26 3B9,1F9F:1F27 3B9,1FA0:1F60 3B9,1FA1:1F61 3B9,1FA2:1F62 3B9,1FA3:1F63 3B9,1FA4:1F64 3B9,1FA5:1F65 3B9,1FA6:1F66 3B9,1FA7:1F67 3B9,1FA8:1F60 3B9,1FA9:1F61 3B9,1FAA:1F62 3B9,1FAB:1F63 3B9,1FAC:1F64 3B9,1FAD:1F65 3B9,1FAE:1F66 3B9,1FAF:1F67 3B9,1FB2:1F70 3B9,1FB3:3B1 3B9,1FB4:3AC 3B9,1FB6:3B1 342,1FB7:3B1 342 3B9,1FBC:3B1 3B9,1FBE:3B9,1FC2:1F74 3B9,1FC3:3B7 3B9,1FC4:3AE 3B9,1FC6:3B7 342,1FC7:3B7 342 3B9,1FCC:3B7 3B9,1FD2:3B9 308 300,1FD3:3B9 308 301,1FD6:3B9 342,1FD7:3B9 308 342,1FE2:3C5 308 300,1FE3:3C5 308 301,1FE4:3C1 313,1FE6:3C5 342,1FE7:3C5 308 342,1FF2:1F7C 3B9,1FF3:3C9 3B9,1FF4:3CE 3B9,1FF6:3C9 342,1FF7:3C9 342 3B9,1FFC:3C9 3B9,AB70:13A0,AB71:13A1,AB72:13A2,AB73:13A3,AB74:13A4,AB75:13A5,AB76:13A6,AB77:13A7,AB78:13A8,AB79:13A9,AB7A:13AA,AB7B:13AB,AB7C:13AC,AB7D:13AD,AB7E:13AE,AB7F:13AF,AB80:13B0,AB81:13B1,AB82:13B2,AB83:13B3,AB84:13B4,AB85:13B5,AB86:13B6,AB87:13B7,AB88:13B8,AB89:13B9,AB8A:13BA,AB8B:13BB,AB8C:13BC,AB8D:13BD,AB8E:13BE,AB8F:13BF,AB90:13C0,AB91:13C1,AB92:13C2,AB93:13C3,AB94:13C4,AB95:13C5,AB96:13C6,AB97:13C7,AB98:13C8,AB99:13C9,AB9A:13CA,AB9B:13CB,AB9C:13CC,AB9D:13CD,AB9E:13CE,AB9F:13CF,ABA0:13D0,ABA1:13D1,ABA2:13D2,ABA3:13D3,ABA4:13D4,ABA5:13D5,ABA6:13D6,ABA7:13D7,ABA8:13D8,ABA9:13D9,ABAA:13DA,ABAB:13DB,ABAC:13DC,ABAD:13DD,ABAE:13DE,ABAF:13DF,ABB0:13E0,ABB1:13E1,ABB2:13E2,ABB3:13E3,ABB4:13E4,ABB5:13E5,ABB6:13E6,ABB7:13E7,ABB8:13E8,ABB9:13E9,ABBA:13EA,ABBB:13EB,ABBC:13EC,ABBD:13ED,ABBE:13EE,ABBF:13EF,FB00:66 66,FB01:66 69,FB02:66 6C,FB03:66 66 69,FB04:66 66 6C,FB05:73 74,FB06:73 74,FB13:574 576,FB14:574 565,FB15:574 56B,FB16:57E 576,FB17:574 56D"; +let case_fold_raw = "B5:3BC,DF:73 73,149:2BC 6E,17F:73,1F0:6A 30C,345:3B9,390:3B9 308 301,3B0:3C5 308 301,3C2:3C3,3D0:3B2,3D1:3B8,3D5:3C6,3D6:3C0,3F0:3BA,3F1:3C1,3F5:3B5,587:565 582,13A0:13A0,13A1:13A1,13A2:13A2,13A3:13A3,13A4:13A4,13A5:13A5,13A6:13A6,13A7:13A7,13A8:13A8,13A9:13A9,13AA:13AA,13AB:13AB,13AC:13AC,13AD:13AD,13AE:13AE,13AF:13AF,13B0:13B0,13B1:13B1,13B2:13B2,13B3:13B3,13B4:13B4,13B5:13B5,13B6:13B6,13B7:13B7,13B8:13B8,13B9:13B9,13BA:13BA,13BB:13BB,13BC:13BC,13BD:13BD,13BE:13BE,13BF:13BF,13C0:13C0,13C1:13C1,13C2:13C2,13C3:13C3,13C4:13C4,13C5:13C5,13C6:13C6,13C7:13C7,13C8:13C8,13C9:13C9,13CA:13CA,13CB:13CB,13CC:13CC,13CD:13CD,13CE:13CE,13CF:13CF,13D0:13D0,13D1:13D1,13D2:13D2,13D3:13D3,13D4:13D4,13D5:13D5,13D6:13D6,13D7:13D7,13D8:13D8,13D9:13D9,13DA:13DA,13DB:13DB,13DC:13DC,13DD:13DD,13DE:13DE,13DF:13DF,13E0:13E0,13E1:13E1,13E2:13E2,13E3:13E3,13E4:13E4,13E5:13E5,13E6:13E6,13E7:13E7,13E8:13E8,13E9:13E9,13EA:13EA,13EB:13EB,13EC:13EC,13ED:13ED,13EE:13EE,13EF:13EF,13F0:13F0,13F1:13F1,13F2:13F2,13F3:13F3,13F4:13F4,13F5:13F5,13F8:13F0,13F9:13F1,13FA:13F2,13FB:13F3,13FC:13F4,13FD:13F5,1C80:432,1C81:434,1C82:43E,1C83:441,1C84:442,1C85:442,1C86:44A,1C87:463,1C88:A64B,1E96:68 331,1E97:74 308,1E98:77 30A,1E99:79 30A,1E9A:61 2BE,1E9B:1E61,1E9E:73 73,1F50:3C5 313,1F52:3C5 313 300,1F54:3C5 313 301,1F56:3C5 313 342,1F80:1F00 3B9,1F81:1F01 3B9,1F82:1F02 3B9,1F83:1F03 3B9,1F84:1F04 3B9,1F85:1F05 3B9,1F86:1F06 3B9,1F87:1F07 3B9,1F88:1F00 3B9,1F89:1F01 3B9,1F8A:1F02 3B9,1F8B:1F03 3B9,1F8C:1F04 3B9,1F8D:1F05 3B9,1F8E:1F06 3B9,1F8F:1F07 3B9,1F90:1F20 3B9,1F91:1F21 3B9,1F92:1F22 3B9,1F93:1F23 3B9,1F94:1F24 3B9,1F95:1F25 3B9,1F96:1F26 3B9,1F97:1F27 3B9,1F98:1F20 3B9,1F99:1F21 3B9,1F9A:1F22 3B9,1F9B:1F23 3B9,1F9C:1F24 3B9,1F9D:1F25 3B9,1F9E:1F26 3B9,1F9F:1F27 3B9,1FA0:1F60 3B9,1FA1:1F61 3B9,1FA2:1F62 3B9,1FA3:1F63 3B9,1FA4:1F64 3B9,1FA5:1F65 3B9,1FA6:1F66 3B9,1FA7:1F67 3B9,1FA8:1F60 3B9,1FA9:1F61 3B9,1FAA:1F62 3B9,1FAB:1F63 3B9,1FAC:1F64 3B9,1FAD:1F65 3B9,1FAE:1F66 3B9,1FAF:1F67 3B9,1FB2:1F70 3B9,1FB3:3B1 3B9,1FB4:3AC 3B9,1FB6:3B1 342,1FB7:3B1 342 3B9,1FBC:3B1 3B9,1FBE:3B9,1FC2:1F74 3B9,1FC3:3B7 3B9,1FC4:3AE 3B9,1FC6:3B7 342,1FC7:3B7 342 3B9,1FCC:3B7 3B9,1FD2:3B9 308 300,1FD3:3B9 308 301,1FD6:3B9 342,1FD7:3B9 308 342,1FE2:3C5 308 300,1FE3:3C5 308 301,1FE4:3C1 313,1FE6:3C5 342,1FE7:3C5 308 342,1FF2:1F7C 3B9,1FF3:3C9 3B9,1FF4:3CE 3B9,1FF6:3C9 342,1FF7:3C9 342 3B9,1FFC:3C9 3B9,AB70:13A0,AB71:13A1,AB72:13A2,AB73:13A3,AB74:13A4,AB75:13A5,AB76:13A6,AB77:13A7,AB78:13A8,AB79:13A9,AB7A:13AA,AB7B:13AB,AB7C:13AC,AB7D:13AD,AB7E:13AE,AB7F:13AF,AB80:13B0,AB81:13B1,AB82:13B2,AB83:13B3,AB84:13B4,AB85:13B5,AB86:13B6,AB87:13B7,AB88:13B8,AB89:13B9,AB8A:13BA,AB8B:13BB,AB8C:13BC,AB8D:13BD,AB8E:13BE,AB8F:13BF,AB90:13C0,AB91:13C1,AB92:13C2,AB93:13C3,AB94:13C4,AB95:13C5,AB96:13C6,AB97:13C7,AB98:13C8,AB99:13C9,AB9A:13CA,AB9B:13CB,AB9C:13CC,AB9D:13CD,AB9E:13CE,AB9F:13CF,ABA0:13D0,ABA1:13D1,ABA2:13D2,ABA3:13D3,ABA4:13D4,ABA5:13D5,ABA6:13D6,ABA7:13D7,ABA8:13D8,ABA9:13D9,ABAA:13DA,ABAB:13DB,ABAC:13DC,ABAD:13DD,ABAE:13DE,ABAF:13DF,ABB0:13E0,ABB1:13E1,ABB2:13E2,ABB3:13E3,ABB4:13E4,ABB5:13E5,ABB6:13E6,ABB7:13E7,ABB8:13E8,ABB9:13E9,ABBA:13EA,ABBB:13EB,ABBC:13EC,ABBD:13ED,ABBE:13EE,ABBF:13EF,FB00:66 66,FB01:66 69,FB02:66 6C,FB03:66 66 69,FB04:66 66 6C,FB05:73 74,FB06:73 74,FB13:574 576,FB14:574 565,FB15:574 56B,FB16:57E 576,FB17:574 56D"; +let case_title_raw = "DF:53 73,1C4:1C5,1C5:1C5,1C6:1C5,1C7:1C8,1C8:1C8,1C9:1C8,1CA:1CB,1CB:1CB,1CC:1CB,1F1:1F2,1F2:1F2,1F3:1F2,587:535 582,10D0:10D0,10D1:10D1,10D2:10D2,10D3:10D3,10D4:10D4,10D5:10D5,10D6:10D6,10D7:10D7,10D8:10D8,10D9:10D9,10DA:10DA,10DB:10DB,10DC:10DC,10DD:10DD,10DE:10DE,10DF:10DF,10E0:10E0,10E1:10E1,10E2:10E2,10E3:10E3,10E4:10E4,10E5:10E5,10E6:10E6,10E7:10E7,10E8:10E8,10E9:10E9,10EA:10EA,10EB:10EB,10EC:10EC,10ED:10ED,10EE:10EE,10EF:10EF,10F0:10F0,10F1:10F1,10F2:10F2,10F3:10F3,10F4:10F4,10F5:10F5,10F6:10F6,10F7:10F7,10F8:10F8,10F9:10F9,10FA:10FA,10FD:10FD,10FE:10FE,10FF:10FF,1C90:10D0,1C91:10D1,1C92:10D2,1C93:10D3,1C94:10D4,1C95:10D5,1C96:10D6,1C97:10D7,1C98:10D8,1C99:10D9,1C9A:10DA,1C9B:10DB,1C9C:10DC,1C9D:10DD,1C9E:10DE,1C9F:10DF,1CA0:10E0,1CA1:10E1,1CA2:10E2,1CA3:10E3,1CA4:10E4,1CA5:10E5,1CA6:10E6,1CA7:10E7,1CA8:10E8,1CA9:10E9,1CAA:10EA,1CAB:10EB,1CAC:10EC,1CAD:10ED,1CAE:10EE,1CAF:10EF,1CB0:10F0,1CB1:10F1,1CB2:10F2,1CB3:10F3,1CB4:10F4,1CB5:10F5,1CB6:10F6,1CB7:10F7,1CB8:10F8,1CB9:10F9,1CBA:10FA,1CBD:10FD,1CBE:10FE,1CBF:10FF,1F80:1F88,1F81:1F89,1F82:1F8A,1F83:1F8B,1F84:1F8C,1F85:1F8D,1F86:1F8E,1F87:1F8F,1F88:1F88,1F89:1F89,1F8A:1F8A,1F8B:1F8B,1F8C:1F8C,1F8D:1F8D,1F8E:1F8E,1F8F:1F8F,1F90:1F98,1F91:1F99,1F92:1F9A,1F93:1F9B,1F94:1F9C,1F95:1F9D,1F96:1F9E,1F97:1F9F,1F98:1F98,1F99:1F99,1F9A:1F9A,1F9B:1F9B,1F9C:1F9C,1F9D:1F9D,1F9E:1F9E,1F9F:1F9F,1FA0:1FA8,1FA1:1FA9,1FA2:1FAA,1FA3:1FAB,1FA4:1FAC,1FA5:1FAD,1FA6:1FAE,1FA7:1FAF,1FA8:1FA8,1FA9:1FA9,1FAA:1FAA,1FAB:1FAB,1FAC:1FAC,1FAD:1FAD,1FAE:1FAE,1FAF:1FAF,1FB2:1FBA 345,1FB3:1FBC,1FB4:386 345,1FB7:391 342 345,1FBC:1FBC,1FC2:1FCA 345,1FC3:1FCC,1FC4:389 345,1FC7:397 342 345,1FCC:1FCC,1FF2:1FFA 345,1FF3:1FFC,1FF4:38F 345,1FF7:3A9 342 345,1FFC:1FFC,FB00:46 66,FB01:46 69,FB02:46 6C,FB03:46 66 69,FB04:46 66 6C,FB05:53 74,FB06:53 74,FB13:544 576,FB14:544 565,FB15:544 56B,FB16:54E 576,FB17:544 56D"; +let case_swap_raw = "1C5:64 17D,1C8:6C 4A,1CB:6E 4A,1F2:64 5A,1F88:1F00 399,1F89:1F01 399,1F8A:1F02 399,1F8B:1F03 399,1F8C:1F04 399,1F8D:1F05 399,1F8E:1F06 399,1F8F:1F07 399,1F98:1F20 399,1F99:1F21 399,1F9A:1F22 399,1F9B:1F23 399,1F9C:1F24 399,1F9D:1F25 399,1F9E:1F26 399,1F9F:1F27 399,1FA8:1F60 399,1FA9:1F61 399,1FAA:1F62 399,1FAB:1F63 399,1FAC:1F64 399,1FAD:1F65 399,1FAE:1F66 399,1FAF:1F67 399,1FBC:3B1 399,1FCC:3B7 399,1FFC:3C9 399"; +// Generated page mask: zero pages contain no mapping or identity exception. +let case_pages = "1111110000000000100100000000111101001000000011000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000110001000000000000000000000000000000000000000000000000000000000000000000000000000000010001000011000000110000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001"; +let cp_case_page = fn (cp: int) -> + let page = cp / 256 in + page < str_len case_pages && str_eq (char_at case_pages page) "1"; let case_up_tbl = map_new (); let case_down_tbl = map_new (); let case_fold_tbl = map_new (); +let case_title_tbl = map_new (); +let case_swap_tbl = map_new (); let case_tbl_load = fn tbl -> fn (raw: str) -> let n = str_len raw in let rec fin = fn (j: int) -> if j < n && (if str_eq (char_at raw j) "," then false else true) then fin (j + 1) else j in @@ -867,7 +877,9 @@ let case_tbls_build = fn (u: unit) -> else let _ = case_tbl_load case_up_tbl case_up_raw in let _ = case_tbl_load case_down_tbl case_down_raw in - case_tbl_load case_fold_tbl case_fold_raw; + let _ = case_tbl_load case_fold_tbl case_fold_raw in + let _ = case_tbl_load case_title_tbl case_title_raw in + case_tbl_load case_swap_tbl case_swap_raw; let cp_hex = fn (cp: int) -> let rec hx = fn (v: int) -> fn (acc: str) -> if v == 0 then acc @@ -901,6 +913,10 @@ let cp_fold_seq = fn (cp: int) -> let k = cp_hex cp in if map_has case_fold_tbl k then case_seq_parse (map_get case_fold_tbl k) else cp_down_seq cp; let cp_swap_seq = fn (cp: int) -> + let _ = (if cp < 128 then () else case_tbls_build ()) in + let special = if cp < 128 then "" else cp_hex cp in + if map_has case_swap_tbl special then case_seq_parse (map_get case_swap_tbl special) + else let d = cp_downcase cp in if d != cp then Cons (d, (Nil : int list)) else @@ -912,20 +928,28 @@ let cp_swap_seq = fn (cp: int) -> if map_has case_down_tbl k then case_seq_parse (map_get case_down_tbl k) else if map_has case_up_tbl k then case_seq_parse (map_get case_up_tbl k) else Cons (cp, Nil)); +let cp_title_seq = fn (cp: int) -> + if cp < 128 then cp_up_seq cp + else + let _ = case_tbls_build () in + let k = cp_hex cp in + if map_has case_title_tbl k then case_seq_parse (map_get case_title_tbl k) + else cp_up_seq cp; let rec cps_utf8 = fn (xs: int list) -> match xs with Nil -> "" | Cons (h, t) -> utf8_enc h ++ cps_utf8 t; // one string-domain walker for the four case methods: maps codepoints, -// passes bytes that are not valid UTF-8 through unchanged, downcases a -// word-final capital sigma to its final form, and titlecases the head for -// capitalize (a multi-character upcase keeps only its first capital). +// passes bytes that are not valid UTF-8 through unchanged and uses Ruby's +// context-independent mapping, including titlecase for capitalize's head. // kind: "u" up, "d" down, "s" swap, "c" capitalize. // mode: "" plain, "a" ascii-only, "t" turkic, "f" fold (downcase only). let rb_case_map1 = fn (kind: str) -> fn (mode: str) -> fn (cp: int) -> - if str_eq mode "a" then - Cons ((if str_eq kind "u" then (if cp >= 97 && cp <= 122 then cp - 32 else cp) + if cp >= 128 && (if cp_case_page cp then false else true) then Cons (cp, (Nil : int list)) + else if str_eq mode "a" then + Cons ((if str_eq kind "u" || str_eq kind "c" then (if cp >= 97 && cp <= 122 then cp - 32 else cp) else if str_eq kind "d" then (if cp >= 65 && cp <= 90 then cp + 32 else cp) else (if cp >= 97 && cp <= 122 then cp - 32 else if cp >= 65 && cp <= 90 then cp + 32 else cp)), (Nil : int list)) else if str_eq mode "f" then cp_fold_seq cp + else if str_eq kind "c" then (if str_eq mode "t" && cp == 105 then Cons (304, (Nil : int list)) else cp_title_seq cp) else if str_eq kind "u" then (if str_eq mode "t" && cp == 105 then Cons (304, (Nil : int list)) else cp_up_seq cp) else if str_eq kind "d" then (if str_eq mode "t" && cp == 73 then Cons (305, (Nil : int list)) @@ -934,39 +958,27 @@ let rb_case_map1 = fn (kind: str) -> fn (mode: str) -> fn (cp: int) -> else (if str_eq mode "t" && cp == 73 then Cons (305, (Nil : int list)) else if str_eq mode "t" && cp == 105 then Cons (304, (Nil : int list)) + else if str_eq mode "t" && cp == 304 then Cons (105, (Nil : int list)) else cp_swap_seq cp); let rb_case_str = fn (kind: str) -> fn (mode: str) -> fn (s: str) -> let n = str_len s in - let isl = fn (cp: int) -> (cp >= 65 && cp <= 90) || (cp >= 97 && cp <= 122) || cp >= 128 in // (into a StrBuf: `acc ++ piece` per character copied the result so far -- // in a region of its own, or the buffer stays in the default region, one // per call, note 441) region RCS { let cb = strbuf_new () in - let rec go = fn (i: int) -> fn (first: bool) -> fn (prevl: bool) -> fn (acc: str) -> + let rec go = fn (i: int) -> fn (first: bool) -> if i >= n then () else let cpl = utf8_cp s i in let cp = (match cpl with (c, _) -> c) in let l = (match cpl with (_, ln) -> ln) in - if cp >= 128 && l == 1 then (let _ = strbuf_push cb (substring s i (i + 1)) in go (i + l) false true "") + if cp >= 128 && l == 1 then (let _ = strbuf_push cb (substring s i (i + 1)) in go (i + l) false) else - let k2 = (if str_eq kind "c" then (if first then "u" else "d") else kind) in - let piece = - (if str_eq k2 "d" && cp == 931 && (str_eq mode "" || str_eq mode "t") then - (let nxt = (if i + l >= n then 0 - 1 else (match utf8_cp s (i + l) with (c2, _) -> c2)) in - let final = prevl && (if nxt < 0 then true else (if isl nxt then false else true)) in - utf8_enc (if final then 962 else 963)) - else if str_eq kind "c" && first then - (let useq = rb_case_map1 "u" mode cp in - let head = (match useq with Cons (hh, _) -> hh | Nil -> cp) in - let tl = (match useq with Cons (_, tt) -> tt | Nil -> (Nil : int list)) in - let rec dnl = fn (xs: int list) -> fn (a2: str) -> - (match xs with Nil -> a2 | Cons (hh, tt) -> dnl tt (a2 ++ cps_utf8 (rb_case_map1 "d" mode hh))) in - utf8_enc head ++ dnl tl "") - else cps_utf8 (rb_case_map1 k2 mode cp)) in - (let _ = strbuf_push cb piece in go (i + l) false (isl cp) "") in - let _ = go 0 true false "" in + let k2 = (if str_eq kind "c" && (if first then false else true) then "d" else kind) in + let _ = strbuf_push cb (cps_utf8 (rb_case_map1 k2 mode cp)) in + go (i + l) false in + let _ = go 0 true in strbuf_to_str cb }; let str_upcase = fn (s: str) -> rb_case_str "u" "" s; diff --git a/m_state.mere b/m_state.mere index e94e64a..3188f1e 100644 --- a/m_state.mere +++ b/m_state.mere @@ -5022,13 +5022,13 @@ let rec enc_valid_gb18030 = fn (s: str) -> fn (i: int) -> && (let b3 = ord (char_at s (i + 3)) in b3 >= 48 && b3 <= 57) && enc_valid_gb18030 s (i + 4)) else if (b1 >= 64 && b1 <= 126) || (b1 >= 128 && b1 <= 254) then enc_valid_gb18030 s (i + 2) else false)); -let enc_valid_db = fn (s: str) -> fn (l_lo: int) -> fn (l_hi: int) -> fn (t1_lo: int) -> fn (t1_hi: int) -> fn (t2_lo: int) -> fn (t2_hi: int) -> +let enc_valid_db = fn (s: str) -> fn (l_lo: int) -> fn (l_hi: int) -> fn (t1_lo: int) -> fn (t1_hi: int) -> fn (t2_lo: int) -> fn (t2_hi: int) -> fn (single_80: bool) -> let n = str_len s in let rec go = fn (i: int) -> if i >= n then true else let b0 = ord (char_at s i) in - if b0 < 128 then go (i + 1) + if b0 < 128 || (single_80 && b0 == 128) then go (i + 1) else if b0 >= l_lo && b0 <= l_hi then (if i + 1 < n then (let b1 = ord (char_at s (i + 1)) in @@ -5073,14 +5073,14 @@ let enc_valid = fn (s: str) -> fn (e: str) -> go 0) else if str_eq e "EUC-JP" || str_eq e "eucJP-ms" || str_eq e "CP51932" || str_eq e "EUC-JIS-2004" || str_eq e "stateless-ISO-2022-JP-KDDI" then enc_valid_eucjp s - else if str_eq e "EUC-KR" || str_eq e "GB2312" || str_eq e "EUC-TW" || str_eq e "GB12345" then enc_valid_db s 161 254 161 254 (0 - 1) (0 - 1) + else if str_eq e "EUC-KR" || str_eq e "GB2312" || str_eq e "EUC-TW" || str_eq e "GB12345" then enc_valid_db s 161 254 161 254 (0 - 1) (0 - 1) false else if str_eq e "Shift_JIS" || str_eq e "Windows-31J" || str_eq e "MacJapanese" || str_eq e "SJIS-DoCoMo" || str_eq e "SJIS-KDDI" || str_eq e "SJIS-SoftBank" then enc_valid_sjis s else if str_eq e "Big5" || str_eq e "CP950" || str_eq e "CP951" - || str_eq e "Big5-HKSCS" || str_eq e "Big5-UAO" then enc_valid_db s 129 254 64 126 161 254 - else if str_eq e "CP949" then enc_valid_db s 129 254 65 90 97 254 - else if str_eq e "GBK" || str_eq e "CP936" then enc_valid_db s 129 254 64 126 128 254 + || str_eq e "Big5-HKSCS" || str_eq e "Big5-UAO" then enc_valid_db s 129 254 64 126 161 254 false + else if str_eq e "CP949" then enc_valid_db s 129 254 65 90 97 254 true + else if str_eq e "GBK" || str_eq e "CP936" then enc_valid_db s 129 254 64 126 128 254 true else if str_eq e "GB18030" then enc_valid_gb18030 s 0 else if str_eq e "Emacs-Mule" then enc_valid_emacs s else true; diff --git a/m_unicode.mere b/m_unicode.mere index 9369a46..c2616fa 100644 --- a/m_unicode.mere +++ b/m_unicode.mere @@ -480,16 +480,23 @@ let sbcs_cased = fn (e: str) -> || str_eq e "Windows-1250" || str_eq e "Windows-1251" || str_eq e "Windows-1252" || str_eq e "Windows-1253" || str_eq e "Windows-1254" || str_eq e "Windows-1257"; let sbcs_case = fn (s: str) -> fn (e: str) -> fn (kind: str) -> fn (mode: str) -> + // Only the single-byte encodings with Turkish case tables honor :turkic. + // Windows-1257 also has byte-level overrides in Ruby's encoding table. + let effective_mode = + (if str_eq mode "t" && (str_eq e "ISO-8859-3" || str_eq e "ISO-8859-9" || str_eq e "Windows-1254") then mode + else if str_eq mode "t" then "" else mode) in let b9 = strbuf_new () in let rec go = fn (i: int) -> fn (first: bool) -> if i >= str_len s then () else (let c = char_at s i in - let k2 = (if str_eq kind "c" then (if first then "u" else "d") else kind) in + let k2 = (if str_eq kind "c" && (if first then false else true) then "d" else kind) in let out = - (match decode_cps c e 0 with + (if str_eq mode "t" && str_eq e "Windows-1257" && ord c == 73 && (str_eq k2 "d" || str_eq k2 "s") then chr 185 + else if str_eq mode "t" && str_eq e "Windows-1257" && ord c == 105 && (str_eq k2 "u" || str_eq k2 "c" || str_eq k2 "s") then chr 169 + else match decode_cps c e 0 with | Cons (cp, Nil) -> - (let m9 = rb_case_map1 k2 mode cp in + (let m9 = rb_case_map1 k2 effective_mode cp in // (Turkish İ lowers to a plain i in these encodings) let m2 = (match m9 with Cons (105, Cons (775, Nil)) -> Cons (105, (Nil : int list)) | _ -> m9) in match encode_cps m2 e "" with @@ -508,7 +515,7 @@ let rb_case_apply = fn (sh: int) -> fn (kind: str) -> fn (mode: str) -> else (let _ = prim_raise "ArgumentError" "input string invalid" in ())) in let body = (if enc_ascii_compat e && enc_multibyte e && (if enc_utf8_family e then false else true) then es_case_ascii (sget sh) e kind - else if sbcs_cased e && (if str_is_ascii sh then false else true) then sbcs_case (sget sh) e kind mode + else if sbcs_cased e && ((if str_is_ascii sh then false else true) || str_eq mode "t") then sbcs_case (sget sh) e kind mode else if enc_ascii_compat e then rb_case_str kind mode (sget sh) else (let cps = decode_cps (sget sh) e 0 in @@ -516,7 +523,7 @@ let rb_case_apply = fn (sh: int) -> fn (kind: str) -> fn (mode: str) -> (match xs with | Nil -> (Nil : int list) | Cons (cp, t) -> - let k2 = (if str_eq kind "c" then (if first then "u" else "d") else kind) in + let k2 = (if str_eq kind "c" && (if first then false else true) then "d" else kind) in rb_iseq_app (rb_case_map1 k2 mode cp) (tr t false)) in (match encode_cps (tr cps true) e "" with (bytes, _) -> bytes))) in let c = mkstr body in diff --git a/tools/gen_case_tables.rb b/tools/gen_case_tables.rb index 02c72cf..f921b22 100644 --- a/tools/gen_case_tables.rb +++ b/tools/gen_case_tables.rb @@ -1,8 +1,8 @@ -# Generates the Unicode case-mapping tables embedded in main.mere between the -# ENC_CASE_TABLES markers, asking ruby's own String#upcase/#downcase (and -# downcase(:fold) for casecmp?'s folding). Only mappings the arithmetic core -# (ASCII, Latin-1, Greek, Cyrillic offsets) does NOT already cover are listed. -# Entries are "CP:CP[ CP...]" hex, comma-separated; three tables: UP, DOWN, FOLD. +# Generates the Unicode case-mapping tables embedded in m_codec.mere using +# the reference Ruby. Entries are "CP:CP[ CP...]" hex, comma-separated. +# PAGES is an ASCII 0/1 mask of the pages containing any table entry. +# FOLD, TITLE and SWAP store exceptions to downcase, upcase and the usual +# lower/upper swap respectively, including identity mappings when necessary. # only ASCII is excluded: the arithmetic core answers Latin-1/Greek/Cyrillic # too, but claiming a range here silently drops its irregular members (the # first version dropped 0xDF, and eszett stopped upcasing). @@ -18,16 +18,27 @@ def table(kind) when :up then ch.upcase when :down then ch.downcase when :fold then ch.downcase(:fold) + when :title then ch.capitalize + when :swap then ch.swapcase end - next if out == ch - next if kind != :fold && covered_arith(cp) - # fold table only needs entries that differ from plain downcase - next if kind == :fold && out == ch.downcase && covered_arith(cp) - next if kind == :fold && out == ch.downcase && !covered_arith(cp) + fallback = case kind + when :fold then ch.downcase + when :title then ch.upcase + when :swap then ch.downcase == ch ? ch.upcase : ch.downcase + else ch + end + next if out == fallback + next if covered_arith(cp) rows << format("%X:%s", cp, out.codepoints.map { |c| format("%X", c) }.join(" ")) end rows.join(",") end -puts "UP"; puts table(:up) -puts "DOWN"; puts table(:down) -puts "FOLD"; puts table(:fold) +tables = %i[up down fold title swap].to_h { |kind| [kind, table(kind)] } +tables.each { |kind, rows| puts kind.to_s.upcase; puts rows } +# Most Unicode codepoints have no case mapping. One byte per 256-codepoint +# page lets the walker avoid hexadecimal key construction and table lookups +# there. A marked page may contain unchanged characters; an unmarked one +# must not contain any entry, including an identity exception. +pages = tables.values.flat_map { |rows| rows.split(',').map { |r| r.to_i(16) / 256 } }.uniq +puts "PAGES" +puts (0..pages.max).map { |page| pages.include?(page) ? '1' : '0' }.join