From 54ff6e72468fc0149607e133507e244b657be104 Mon Sep 17 00:00:00 2001 From: Pierre Le Marre Date: Mon, 9 Dec 2024 09:21:01 +0100 Subject: [PATCH] keysyms: Add sharp S upper case mapping exception MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The case mapping `ssharp` ß ↔ `U1E9E` ẞ was added in 13b30f4f0dccc08dfea426d73570b913596ed602 but was broken: - For the lower case mapping it returned the keysym `0x10000df`, which is an invalid Unicode keysym. - For the upper case mapping it returned the upper Unicode code point rather than the corresponding keysym. It did accidentally enable the detection of alphabetic key type for the pair (ß, ẞ) though. However this detection was accidentally removed in 5c7c79970a2800b6248e829464676e1f09c5f43d (v1.7) with an attempt to fix the wrong keysym case mapping. Finally both the *lower* case mapping and the key type detection were fixed for good when we implemented the complete Unicode simple case mappings and corresponding tests in e83d08ddbc9851944c662c18e86d4eb0eff23e68. However, the *upper* case mapping `ssharp` → `U1E9E` remained disabled. Indeed, ẞ is a relatively recent addition to Unicode (2008) and had no official recommendation, until recently. So while the lower mapping ẞ→ß exists in Unicode, its converse upper mapping does not. Yet since 2017 the Council for German Orthography (Rat für deutsche Rechtschreibung) recommends[^1] ẞ as the capitalization of ß. Due to its stability policies, the Unicode Character Database (UCD) that we use to generate our keysym case mappings (via ICU) cannot update the simple case mapping of ß. Discussions are currently ongoing in the Unicode mailing list[^2] and CLDR[^3] about how to deal with the new recommended case mapping. However, the discussions are oriented on text-processing and compatibility mappings, while libxkbcommon is on a rather lower level. It seems that the slow adoption of ẞ is partly due to the difficulty to type it. Since ẞ is used only for ALL CAPS casing, the expectation is to type it using CapsLock. While our detection of alphabetic key types works well[^4] for the pair (ß,ẞ), the *internal capitalization* currently does not work and is fixed by this commit. Added the ß → ẞ upper mapping: - Added an exception in the generation script - Fixed tests - Added documentation of the exceptions in `xkbcommon.h` - Added/updated log entries [^1]: https://www.rechtschreibrat.com/regeln-und-woerterverzeichnis/ [^2]: https://corp.unicode.org/pipermail/unicode/2024-November/011162.html [^3]: https://unicode-org.atlassian.net/browse/CLDR-17624 [^4]: Except libxkbcommon 1.7, see the second paragraph. --- .../+gro\303\237es-\341\272\236.breaking.md" | 2 + .../+gro\303\237es-\341\272\236.bugfix.md" | 2 + changes/api/+unicode-16.breaking.md | 9 +- data/keysyms.yaml | 1 + include/xkbcommon/xkbcommon.h | 15 +- meson.build | 8 +- scripts/update-unicode.py | 50 +- src/keysym-case-mappings.c | 626 +++++++++--------- test/keysym-case-mapping.h | 31 + test/keysym-case-mapping.h.jinja | 35 + test/keysym.c | 15 +- 11 files changed, 456 insertions(+), 338 deletions(-) create mode 100644 "changes/api/+gro\303\237es-\341\272\236.breaking.md" create mode 100644 "changes/api/+gro\303\237es-\341\272\236.bugfix.md" create mode 100644 test/keysym-case-mapping.h create mode 100644 test/keysym-case-mapping.h.jinja diff --git "a/changes/api/+gro\303\237es-\341\272\236.breaking.md" "b/changes/api/+gro\303\237es-\341\272\236.breaking.md" new file mode 100644 index 00000000..520b0108 --- /dev/null +++ "b/changes/api/+gro\303\237es-\341\272\236.breaking.md" @@ -0,0 +1,2 @@ +Added the upper case mapping ß → ẞ (`ssharp` → `U1E9E`). This enable to type +ẞ using CapsLock thanks to the internal capitalization rules. diff --git "a/changes/api/+gro\303\237es-\341\272\236.bugfix.md" "b/changes/api/+gro\303\237es-\341\272\236.bugfix.md" new file mode 100644 index 00000000..6cafc1ca --- /dev/null +++ "b/changes/api/+gro\303\237es-\341\272\236.bugfix.md" @@ -0,0 +1,2 @@ +Fixed the lower case mapping ẞ → ß (`U1E9E` → `ssharp`). This re-enable the detection +of alphabetic key types for the pair (ß, ẞ). diff --git a/changes/api/+unicode-16.breaking.md b/changes/api/+unicode-16.breaking.md index 22694409..44ce350e 100644 --- a/changes/api/+unicode-16.breaking.md +++ b/changes/api/+unicode-16.breaking.md @@ -5,13 +5,16 @@ the following: - `xkb_keysym_to_lower()` and `xkb_keysym_to_upper()` give different output for keysyms not covered previously and handle *title*-cased keysyms. - Example of title-cased keysym: `0x10001f2` (`U+01F2` “Dz”): - - `xkb_keysym_to_lower(0x10001f2) == 0x10001f3` (`U+01F3` “dz”) - - `xkb_keysym_to_upper(0x10001f2) == 0x10001f1` (`U+01F1` “DZ”) + Example of title-cased keysym: `U01F2` “Dz”: + - `xkb_keysym_to_lower(U01F2) == U01F3` “Dz” → “dz” + - `xkb_keysym_to_upper(U01F2) == U01F1` “Dz” → “DZ” - *Implicit* alphabetic key types are better detected, because they use the latest Unicode case mappings and now handle the *title*-cased keysyms the same way as upper-case ones. +Note: There is a single *exception* that do not follow the Unicode mappings: +- `xkb_keysym_to_upper(ssharp) == U1E9E` “ß” → “ẞ” + Note: As before, only *simple* case mappings (i.e. one-to-one) are supported. For example, the full upper case of `U+01F0` “ǰ” is “J̌” (2 characters: `U+004A` and `U+030C`), which would require 2 keysyms, which is not supported by the diff --git a/data/keysyms.yaml b/data/keysyms.yaml index 070de9db..bf96fe7c 100644 --- a/data/keysyms.yaml +++ b/data/keysyms.yaml @@ -560,6 +560,7 @@ 0x00df: name: ssharp code point: 0x00DF + upper: 0x1001e9e # U1E9E 0x00e0: name: agrave code point: 0x00E0 diff --git a/include/xkbcommon/xkbcommon.h b/include/xkbcommon/xkbcommon.h index acf010c6..27775fff 100644 --- a/include/xkbcommon/xkbcommon.h +++ b/include/xkbcommon/xkbcommon.h @@ -552,9 +552,18 @@ xkb_utf32_to_keysym(uint32_t ucs); * If there is no such form, the keysym is returned unchanged. * * The conversion rules are the *simple* (i.e. one-to-one) Unicode case - * mappings and do not depend on the locale. If you need the special - * case mappings (i.e. not one-to-one or locale-dependent), prefer to - * work with the Unicode representation instead, when possible. + * mappings (with some exceptions, see hereinafter) and do not depend + * on the locale. If you need the special case mappings (i.e. not + * one-to-one or locale-dependent), prefer to work with the Unicode + * representation instead, when possible. + * + * Exceptions to the Unicode mappings: + * + * | Lower keysym | Lower letter | Upper keysym | Upper letter | Comment | + * | ------------ | ------------ | ------------ | ------------ | ------- | + * | `ssharp` | `U+00DF`: ß | `U1E9E` | `U+1E9E`: ẞ | [Council for German Orthography] | + * + * [Council for German Orthography]: https://www.rechtschreibrat.com/regeln-und-woerterverzeichnis/ * * @since 0.8.0: Initial implementation, based on `libX11`. * @since 1.8.0: Use Unicode 16.0 mappings for complete Unicode coverage. diff --git a/meson.build b/meson.build index 83d74888..d9aa047d 100644 --- a/meson.build +++ b/meson.build @@ -742,8 +742,12 @@ test( ) test( 'keymap', - executable('test-keymap', 'test/keymap.c', 'test/keysym.h', - dependencies: test_dep), + executable( + 'test-keymap', + 'test/keymap.c', + 'test/keysym.h', + 'test/keysym-case-mapping.h', + dependencies: test_dep), env: test_env, ) test( diff --git a/scripts/update-unicode.py b/scripts/update-unicode.py index cac4a8e2..fbbe2668 100755 --- a/scripts/update-unicode.py +++ b/scripts/update-unicode.py @@ -90,6 +90,7 @@ from pathlib import Path from typing import ( Any, + ClassVar, Generator, Generic, Iterable, @@ -101,8 +102,10 @@ TypeVar, cast, ) +import unicodedata import icu +import jinja2 import yaml assert sys.version_info >= (3, 12) @@ -110,6 +113,7 @@ c = icu.Locale.createFromName("C") icu.Locale.setDefault(c) +SCRIPT = Path(__file__) CodePoint = NewType("CodePoint", int) Keysym = NewType("Keysym", int) KeysymName = NewType("KeysymName", str) @@ -294,6 +298,9 @@ class Entry: upper: int is_lower: bool is_upper: bool + # [NOTE] Exceptions must be documented in `xkbcommon.h`. + to_upper_exceptions: ClassVar[dict[str, str]] = {"ß": "ẞ"} + "Upper mappings exceptions" @classmethod def zeros(cls) -> Self: @@ -326,16 +333,20 @@ def lower_delta(cls, cp: CodePoint) -> int: def upper_delta(cls, cp: CodePoint) -> int: return cp - cls.to_upper_cp(cp) - @staticmethod - def to_upper_cp(cp: CodePoint) -> CodePoint: + @classmethod + def to_upper_cp(cls, cp: CodePoint) -> CodePoint: + if upper := cls.to_upper_exceptions.get(chr(cp)): + return ord(upper) return icu.Char.toupper(cp) @staticmethod def to_lower_cp(cp: CodePoint) -> CodePoint: return icu.Char.tolower(cp) - @staticmethod - def to_upper_char(char: str) -> str: + @classmethod + def to_upper_char(cls, char: str) -> str: + if upper := cls.to_upper_exceptions.get(char): + return upper return icu.Char.toupper(char) @staticmethod @@ -1954,6 +1965,37 @@ def run( best_solution.test(config) if write: best_solution.write(root) + cls.write_tests(root) + + @classmethod + def write_tests(cls, root: Path) -> None: + # Configure Jinja + template_loader = jinja2.FileSystemLoader(root, encoding="utf-8") + jinja_env = jinja2.Environment( + loader=template_loader, + keep_trailing_newline=True, + trim_blocks=True, + lstrip_blocks=True, + ) + + def code_point_name_constant(c: str, padding: int = 0) -> str: + if not (name := unicodedata.name(c)): + raise ValueError(f"No Unicode name for code point: U+{ord(c):0>4X}") + name = name.replace("-", "_").replace(" ", "_").upper() + return name.ljust(padding) + + jinja_env.filters["code_point"] = lambda c: f"0x{ord(c):0>4x}" + jinja_env.filters["code_point_name_constant"] = code_point_name_constant + path = root / "test/keysym-case-mapping.h" + template_path = path.with_suffix(f"{path.suffix}.jinja") + template = jinja_env.get_template(str(template_path.relative_to(root))) + with path.open("wt", encoding="utf-8") as fd: + fd.writelines( + template.generate( + upper_exceptions=Entry.to_upper_exceptions, + script=SCRIPT.relative_to(root), + ) + ) ################################################################################ diff --git a/src/keysym-case-mappings.c b/src/keysym-case-mappings.c index 151af5a1..344ba04f 100644 --- a/src/keysym-case-mappings.c +++ b/src/keysym-case-mappings.c @@ -104,83 +104,83 @@ struct CaseMappings{ int32_t offset:30; }; -static const struct CaseMappings legacy_keysym_data[46] = { - {1, 0, 0x000020}, {0, 1, 0x000000}, {1, 0, 0x000010}, {0, 0, 0x000000}, - {0, 0, 0x000000}, {1, 0, 0x000020}, {1, 0, 0x000020}, {0, 0, 0x000000}, - {0, 1,-0x000717}, {0, 1, 0x000020}, {0, 0, 0x000000}, {0, 1, 0x000020}, - {0, 1, 0x000020}, {0, 1,-0x0012bf}, {0, 1, 0x000000}, {0, 0, 0x000000}, - {1, 0, 0x000010}, {1, 0, 0x000010}, {0, 1,-0xfff89b}, {0, 0, 0x000000}, - {0, 1, 0x000010}, {0, 0, 0x000000}, {0, 1,-0x000010}, {0, 1,-0x000010}, - {0, 1, 0x000000}, {0, 1, 0x000010}, {0, 1, 0x000010}, {1, 0, 0x000002}, - {0, 0, 0x000000}, {1, 0,-0x000010}, {1, 0,-0x000010}, {1, 0,-0x0012bf}, - {1, 0,-0x000020}, {1, 0,-0x000020}, {0, 1,-0x000020}, {0, 1,-0x000020}, - {0, 0, 0x000000}, {1, 0,-0x000240}, {0, 0, 0x000000}, {0, 1, 0x000002}, - {0, 0, 0x000000}, {0, 1, 0x000270}, {0, 1, 0x000020}, {0, 1, 0x000021}, - {1, 0, 0x000001}, {0, 1, 0x000001} +static const struct CaseMappings legacy_keysym_data[47] = { + {0, 1, 0x0000000}, {1, 0, 0x0000010}, {0, 0, 0x0000000}, {0, 0, 0x0000000}, + {1, 0, 0x0000020}, {0, 1,-0x1001dbf}, {1, 0, 0x0000020}, {1, 0, 0x0000020}, + {0, 0, 0x0000000}, {0, 1,-0x0000717}, {0, 1, 0x0000020}, {0, 0, 0x0000000}, + {0, 1, 0x0000020}, {0, 1, 0x0000020}, {0, 1,-0x00012bf}, {0, 1, 0x0000000}, + {0, 0, 0x0000000}, {1, 0, 0x0000010}, {1, 0, 0x0000010}, {0, 1,-0x0fff89b}, + {0, 0, 0x0000000}, {0, 1, 0x0000010}, {0, 0, 0x0000000}, {0, 1,-0x0000010}, + {0, 1,-0x0000010}, {0, 1, 0x0000000}, {0, 1, 0x0000010}, {0, 1, 0x0000010}, + {1, 0, 0x0000002}, {0, 0, 0x0000000}, {1, 0,-0x0000010}, {1, 0,-0x0000010}, + {1, 0,-0x00012bf}, {1, 0,-0x0000020}, {1, 0,-0x0000020}, {0, 1,-0x0000020}, + {0, 1,-0x0000020}, {0, 0, 0x0000000}, {1, 0,-0x0000240}, {0, 0, 0x0000000}, + {0, 1, 0x0000002}, {0, 0, 0x0000000}, {0, 1, 0x0000270}, {0, 1, 0x0000020}, + {0, 1, 0x0000021}, {1, 0, 0x0000001}, {0, 1, 0x0000001} }; static const uint8_t legacy_keysym_offsets1[540] = { - 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, - 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x000f, 0x0010, 0x0010, 0x000f, - 0x0010, 0x000f, 0x0003, 0x0003, 0x0013, 0x0019, 0x0019, 0x0018, 0x0019, 0x0018, - 0x0003, 0x0003, 0x0004, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, - 0x0005, 0x0006, 0x0005, 0x0005, 0x0005, 0x0003, 0x0003, 0x0003, 0x000a, 0x000b, - 0x000b, 0x000b, 0x000b, 0x000b, 0x000b, 0x000b, 0x000b, 0x002a, 0x000b, 0x000b, - 0x000b, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, - 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, - 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, - 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, - 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, - 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, - 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0012, 0x0003, 0x0003, 0x0003, 0x0003, - 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, - 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, - 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0004, 0x0005, - 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, - 0x0005, 0x0006, 0x0003, 0x0003, 0x000a, 0x000b, 0x000b, 0x000b, 0x000b, 0x000b, - 0x000b, 0x000b, 0x000b, 0x000b, 0x000b, 0x000b, 0x000b, 0x0009, 0x0003, 0x0003, - 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, - 0x0003, 0x0003, 0x0003, 0x0003, 0x000f, 0x000f, 0x000f, 0x0002, 0x000f, 0x0010, - 0x0002, 0x0010, 0x0013, 0x0013, 0x0013, 0x0014, 0x0013, 0x0019, 0x0014, 0x0019, - 0x0006, 0x0004, 0x0004, 0x0006, 0x0006, 0x0006, 0x0006, 0x0004, 0x0005, 0x0006, - 0x0004, 0x0003, 0x0005, 0x0004, 0x0003, 0x0006, 0x0009, 0x000a, 0x000a, 0x0009, - 0x0009, 0x0009, 0x0009, 0x000a, 0x000b, 0x0009, 0x000a, 0x0003, 0x000b, 0x000a, - 0x0003, 0x0009, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, - 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0001, - 0x000f, 0x0002, 0x0003, 0x0010, 0x0002, 0x0003, 0x0003, 0x0013, 0x0013, 0x0014, - 0x0003, 0x0019, 0x001a, 0x0026, 0x0006, 0x0003, 0x0003, 0x0004, 0x0003, 0x0003, - 0x0006, 0x0004, 0x0004, 0x0005, 0x0003, 0x0003, 0x0004, 0x0003, 0x0004, 0x0006, - 0x0009, 0x0003, 0x0003, 0x000a, 0x0003, 0x0003, 0x0009, 0x000a, 0x000a, 0x000b, - 0x0003, 0x0003, 0x000a, 0x0003, 0x000a, 0x0009, 0x0003, 0x0003, 0x0003, 0x0003, - 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, - 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, - 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x002c, 0x001f, 0x0003, 0x0003, - 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, - 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x000e, - 0x0003, 0x0003, 0x0003, 0x0003, 0x0007, 0x0003, 0x0003, 0x000e, 0x0003, 0x0003, - 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, - 0x0005, 0x0006, 0x0005, 0x0005, 0x0005, 0x0000, 0x000b, 0x000b, 0x000b, 0x000b, - 0x000b, 0x000b, 0x000b, 0x000b, 0x000b, 0x000b, 0x000b, 0x0009, 0x000b, 0x000b, - 0x000b, 0x000c, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, - 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x000f, 0x0003, - 0x0003, 0x0002, 0x0024, 0x000f, 0x0002, 0x0003, 0x0013, 0x0003, 0x0003, 0x0014, - 0x0028, 0x0013, 0x0014, 0x0003, 0x0003, 0x0003, 0x0004, 0x0006, 0x0003, 0x0003, - 0x0003, 0x0003, 0x0003, 0x0003, 0x0004, 0x0003, 0x0006, 0x0003, 0x0004, 0x0006, - 0x0003, 0x0003, 0x000a, 0x0009, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, - 0x000a, 0x0003, 0x0009, 0x0003, 0x000a, 0x0009, 0x0003, 0x0003, 0x0003, 0x0003, - 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, - 0x0003, 0x0003, 0x0015, 0x0016, 0x0016, 0x0016, 0x0016, 0x0016, 0x0016, 0x0016, - 0x001c, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x0022, 0x0022, - 0x0022, 0x0022, 0x0022, 0x0022, 0x0022, 0x0022, 0x0022, 0x0022, 0x0022, 0x0022, - 0x0022, 0x0022, 0x0022, 0x0022, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, - 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020 + 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, + 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, + 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, + 0x0002, 0x0002, 0x0003, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, + 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0007, 0x0002, 0x0002, 0x000b, 0x000c, + 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, + 0x000c, 0x000a, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, + 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0010, 0x0011, + 0x0011, 0x0010, 0x0011, 0x0010, 0x0002, 0x0002, 0x0014, 0x001a, 0x001a, 0x0019, + 0x001a, 0x0019, 0x0002, 0x0002, 0x0003, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, + 0x0006, 0x0006, 0x0006, 0x0007, 0x0006, 0x0006, 0x0006, 0x0002, 0x0002, 0x0002, + 0x000b, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x002b, + 0x000c, 0x000c, 0x000c, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, + 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, + 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, + 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, + 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, + 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, + 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0013, 0x0002, 0x0002, + 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, + 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, + 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x002d, 0x0020, + 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, + 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0000, 0x0010, 0x0001, + 0x0002, 0x0011, 0x0001, 0x0002, 0x0002, 0x0014, 0x0014, 0x0015, 0x0002, 0x001a, + 0x001b, 0x0027, 0x0007, 0x0002, 0x0002, 0x0003, 0x0002, 0x0002, 0x0007, 0x0003, + 0x0003, 0x0006, 0x0002, 0x0002, 0x0003, 0x0002, 0x0003, 0x0007, 0x000a, 0x0002, + 0x0002, 0x000b, 0x0002, 0x0002, 0x000a, 0x000b, 0x000b, 0x000c, 0x0002, 0x0002, + 0x000b, 0x0002, 0x000b, 0x000a, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, + 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, + 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x000f, 0x0002, 0x0002, 0x0002, 0x0002, + 0x0008, 0x0002, 0x0002, 0x000f, 0x0002, 0x0002, 0x0006, 0x0006, 0x0006, 0x0006, + 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0007, 0x0006, 0x0006, + 0x0006, 0x0004, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, + 0x000c, 0x000c, 0x000c, 0x000a, 0x000c, 0x000c, 0x000c, 0x000d, 0x0002, 0x0002, + 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, + 0x0002, 0x0002, 0x0002, 0x0002, 0x0010, 0x0002, 0x0002, 0x0001, 0x0025, 0x0010, + 0x0001, 0x0002, 0x0014, 0x0002, 0x0002, 0x0015, 0x0029, 0x0014, 0x0015, 0x0002, + 0x0002, 0x0002, 0x0003, 0x0007, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, + 0x0003, 0x0002, 0x0007, 0x0002, 0x0003, 0x0007, 0x0002, 0x0002, 0x000b, 0x000a, + 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x000b, 0x0002, 0x000a, 0x0002, + 0x000b, 0x000a, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, + 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0010, 0x0010, + 0x0010, 0x0001, 0x0010, 0x0011, 0x0001, 0x0011, 0x0014, 0x0014, 0x0014, 0x0015, + 0x0014, 0x001a, 0x0015, 0x001a, 0x0007, 0x0003, 0x0003, 0x0007, 0x0007, 0x0007, + 0x0007, 0x0003, 0x0006, 0x0007, 0x0003, 0x0002, 0x0006, 0x0003, 0x0002, 0x0007, + 0x000a, 0x000b, 0x000b, 0x000a, 0x000a, 0x000a, 0x000a, 0x000b, 0x000c, 0x000a, + 0x000b, 0x0002, 0x000c, 0x000b, 0x0002, 0x000a, 0x0002, 0x0002, 0x0002, 0x0002, + 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, + 0x0002, 0x0002, 0x0016, 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, + 0x001d, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x0023, 0x0023, + 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, + 0x0023, 0x0023, 0x0023, 0x0023, 0x0021, 0x0021, 0x0021, 0x0021, 0x0021, 0x0021, + 0x0021, 0x0021, 0x0021, 0x0021, 0x0021, 0x0021, 0x0021, 0x0021, 0x0021, 0x0021 }; static const uint16_t legacy_keysym_offsets2[40] = { - 0x007e, 0x015c, 0x003d, 0x00bc, 0x003d, 0x019c, 0x003d, 0x00fc, 0x003d, 0x003d, - 0x003d, 0x003d, 0x003d, 0x01dc, 0x003d, 0x0000, 0x003d, 0x0042, 0x003d, 0x003d, - 0x003d, 0x003d, 0x003d, 0x003d, 0x003d, 0x003d, 0x003d, 0x003d, 0x003d, 0x003d, - 0x003d, 0x003d, 0x003d, 0x003d, 0x003d, 0x003d, 0x003d, 0x003d, 0x003d, 0x013c + 0x0000, 0x011c, 0x007b, 0x019c, 0x007b, 0x015c, 0x007b, 0x00dc, 0x007b, 0x007b, + 0x007b, 0x007b, 0x007b, 0x01dc, 0x007b, 0x003e, 0x007b, 0x0080, 0x007b, 0x007b, + 0x007b, 0x007b, 0x007b, 0x007b, 0x007b, 0x007b, 0x007b, 0x007b, 0x007b, 0x007b, + 0x007b, 0x007b, 0x007b, 0x007b, 0x007b, 0x007b, 0x007b, 0x007b, 0x007b, 0x00bc }; static inline const struct CaseMappings * @@ -200,191 +200,191 @@ static const struct CaseMappings unicode_data[1004] = { {1, 0, 0x0001}, {0, 1, 0x0001}, {1, 0,-0x0061}, {1, 0,-0x0038}, {1, 0, 0x0020}, {1, 0, 0x0020}, {0, 0, 0x0000}, {1, 0, 0x0020}, {1, 0, 0x0020}, {1, 0, 0x0020}, {1, 0, 0x0020}, {1, 0, 0x0020}, + {1, 0, 0x0020}, {1, 0, 0x0020}, {1, 0, 0x0020}, {0, 1,-0x1dbf}, + {0, 1, 0x0001}, {1, 0, 0x00da}, {0, 1, 0x0000}, {0, 1, 0x0000}, + {1, 0, 0x0001}, {0, 1, 0x0001}, {1, 0, 0x00da}, {1, 0, 0x0001}, + {0, 1, 0x0001}, {1, 0, 0x0001}, {0, 1, 0x0001}, {1, 0,-0xa641}, + {0, 0, 0x0000}, {0, 0, 0x0000}, {0, 0, 0x0000}, {1, 0,-0x0008}, + {0, 0, 0x0000}, {1, 0,-0x0008}, {0, 0, 0x0000}, {1, 0,-0x0008}, + {0, 0, 0x0000}, {1, 0,-0x0008}, {1, 0,-0x0008}, {1, 0,-0x004a}, + {1, 0,-0x004a}, {1, 0,-0x0009}, {0, 0, 0x0000}, {0, 1, 0x1c25}, + {0, 0, 0x0000}, {0, 1, 0x0020}, {0, 1, 0x0020}, {0, 1, 0x0020}, + {0, 1, 0x0020}, {0, 1, 0x0020}, {0, 1, 0x0020}, {0, 1, 0x0020}, + {0, 1, 0x0020}, {0, 1,-0x0079}, {0, 1,-0x2a1f}, {0, 1,-0x2a1c}, + {0, 1,-0x2a1e}, {0, 1, 0x00d2}, {0, 1, 0x00ce}, {0, 1, 0x0000}, + {0, 1, 0x00cd}, {0, 1, 0x00cd}, {0, 1,-0xa54b}, {0, 1, 0x0000}, + {0, 1, 0x00cf}, {0, 1,-0xa567}, {0, 1,-0xa528}, {0, 1,-0xa544}, + {0, 1, 0x0000}, {0, 1,-0x29fd}, {0, 1, 0x00d5}, {0, 1, 0x0000}, + {0, 1, 0x0000}, {0, 1, 0x00d6}, {0, 1, 0x0000}, {0, 1, 0x0000}, + {1, 0, 0x0020}, {1, 0, 0x0020}, {1, 0, 0x0020}, {1, 0, 0x0020}, {1, 0, 0x0020}, {1, 0, 0x0020}, {1, 0, 0x0020}, {0, 0, 0x0000}, {0, 0, 0x0000}, {0, 0, 0x0000}, {0, 0, 0x0000}, {0, 0, 0x0000}, {0, 1,-0x02e7}, {0, 0, 0x0000}, {0, 0, 0x0000}, {0, 1, 0x0000}, {0, 1, 0x0000}, {0, 1, 0x0000}, {1, 0, 0x0001}, {0, 1, 0x0001}, - {0, 0, 0x0000}, {1, 0,-0x0008}, {0, 0, 0x0000}, {1, 0,-0x0008}, - {0, 0, 0x0000}, {1, 0,-0x0008}, {0, 0, 0x0000}, {1, 0,-0x0008}, - {1, 0,-0x0008}, {1, 0,-0x004a}, {1, 0,-0x004a}, {1, 0,-0x0009}, - {0, 0, 0x0000}, {0, 1, 0x1c25}, {0, 0, 0x0000}, {0, 1, 0x0001}, - {1, 0, 0x00da}, {0, 1, 0x0000}, {0, 1, 0x0000}, {1, 0, 0x0001}, - {0, 1, 0x0001}, {1, 0, 0x00da}, {1, 0, 0x0001}, {0, 1, 0x0001}, - {1, 0, 0x0001}, {0, 1, 0x0001}, {1, 0,-0xa641}, {0, 0, 0x0000}, - {0, 0, 0x0000}, {0, 0, 0x0000}, {0, 1, 0x0020}, {0, 1, 0x0020}, - {0, 1, 0x0020}, {0, 1, 0x0020}, {0, 1, 0x0020}, {0, 1, 0x0020}, - {0, 1, 0x0020}, {0, 1, 0x0020}, {0, 1,-0x0079}, {0, 1,-0x2a1f}, - {0, 1,-0x2a1c}, {0, 1,-0x2a1e}, {0, 1, 0x00d2}, {0, 1, 0x00ce}, - {0, 1, 0x0000}, {0, 1, 0x00cd}, {0, 1, 0x00cd}, {0, 1,-0xa54b}, - {0, 1, 0x0000}, {0, 1, 0x00cf}, {0, 1,-0xa567}, {0, 1,-0xa528}, - {0, 1,-0xa544}, {0, 1, 0x0000}, {0, 1,-0x29fd}, {0, 1, 0x00d5}, - {0, 1, 0x0000}, {0, 1, 0x0000}, {0, 1, 0x00d6}, {0, 1, 0x0000}, - {0, 1, 0x0000}, {1, 0, 0x0020}, {1, 0, 0x0020}, {1, 0, 0x0020}, - {1, 0, 0x0020}, {1, 0, 0x0020}, {1, 0, 0x0020}, {1, 0, 0x0020}, - {0, 1, 0x0000}, {0, 1,-0x0008}, {0, 1, 0x0000}, {0, 1,-0x0008}, - {0, 1, 0x0000}, {0, 1,-0x0008}, {0, 1, 0x0000}, {0, 1,-0x0008}, - {0, 1,-0x0008}, {0, 1, 0x0000}, {0, 1, 0x0000}, {0, 1, 0x0000}, - {0, 1,-0x0007}, {0, 1, 0x0000}, {0, 1, 0x0000}, {1, 0, 0x0001}, - {0, 1, 0x0001}, {1, 0, 0x0001}, {0, 1, 0x0001}, {1, 0, 0x0001}, - {0, 1, 0x0001}, {1, 0, 0x0001}, {0, 1, 0x0001}, {0, 1, 0x000f}, + {0, 0, 0x0000}, {1, 0, 0x0000}, {1, 0, 0x0000}, {1, 0, 0x0000}, + {1, 0, 0x0000}, {1, 0, 0x0000}, {0, 0, 0x0000}, {1, 0, 0x0000}, + {0, 0, 0x0000}, {1, 0,-0x20bf}, {1, 0,-0x2046}, {1, 0, 0x0000}, + {1, 0, 0x0000}, {0, 0, 0x0000}, {0, 1, 0x0000}, {0, 0, 0x0000}, + {0, 0, 0x0000}, {0, 1, 0x0000}, {0, 1, 0x0000}, {1, 0, 0x0000}, {1, 0, 0x0000}, {1, 0, 0x0000}, {1, 0, 0x0000}, {1, 0, 0x0000}, - {1, 0, 0x0000}, {0, 0, 0x0000}, {1, 0, 0x0000}, {0, 0, 0x0000}, - {1, 0,-0x20bf}, {1, 0,-0x2046}, {1, 0, 0x0000}, {1, 0, 0x0000}, - {0, 0, 0x0000}, {0, 1, 0x0000}, {0, 0, 0x0000}, {0, 0, 0x0000}, - {0, 1, 0x0000}, {0, 1, 0x0000}, {1, 0, 0x0000}, {1, 0, 0x0000}, - {1, 0, 0x0000}, {1, 0, 0x0000}, {1, 0, 0x0000}, {0, 0, 0x0000}, - {0, 1, 0x0000}, {0, 1, 0x0000}, {0, 1, 0x0000}, {0, 1, 0x0000}, + {0, 0, 0x0000}, {0, 1, 0x0000}, {0, 1, 0x0000}, {0, 1, 0x0000}, {0, 1, 0x0000}, {0, 1, 0x0000}, {0, 1, 0x0000}, {0, 1, 0x0000}, - {0, 0, 0x0000}, {0, 0, 0x0000}, {0, 0, 0x0000}, {0, 0, 0x0000}, - {0, 0, 0x0000}, {0, 0, 0x0000}, {1, 0, 0x001a}, {1, 0, 0x001a}, + {0, 1, 0x0000}, {0, 0, 0x0000}, {0, 0, 0x0000}, {0, 0, 0x0000}, + {0, 0, 0x0000}, {0, 0, 0x0000}, {0, 0, 0x0000}, {1, 0, 0x001a}, {1, 0, 0x001a}, {1, 0, 0x001a}, {1, 0, 0x001a}, {1, 0, 0x001a}, - {1, 0, 0x001a}, {1, 0, 0x001a}, {0, 1,-0x89c2}, {1, 0, 0x0001}, - {0, 1, 0x0001}, {0, 0, 0x0000}, {0, 0, 0x0000}, {0, 0, 0x0000}, - {0, 0, 0x0000}, {0, 0, 0x0000}, {0, 0, 0x0000}, {1, 0, 0x0026}, - {0, 0, 0x0000}, {1, 0,-0x0008}, {1, 0,-0x0008}, {1, 0,-0x0064}, - {1, 0,-0x0064}, {0, 0, 0x0000}, {0, 0, 0x0000}, {0, 0, 0x0000}, - {0, 0, 0x0000}, {1, 0, 0x0030}, {1, 0, 0x0030}, {1, 0, 0x0030}, + {1, 0, 0x001a}, {1, 0, 0x001a}, {1, 0, 0x001a}, {0, 1,-0x89c2}, + {1, 0, 0x0001}, {0, 1, 0x0001}, {0, 0, 0x0000}, {0, 0, 0x0000}, + {0, 0, 0x0000}, {0, 0, 0x0000}, {0, 0, 0x0000}, {0, 0, 0x0000}, + {1, 0, 0x0026}, {0, 0, 0x0000}, {1, 0,-0x0008}, {1, 0,-0x0008}, + {1, 0,-0x0064}, {1, 0,-0x0064}, {0, 0, 0x0000}, {0, 0, 0x0000}, + {0, 0, 0x0000}, {0, 0, 0x0000}, {1, 0, 0x0030}, {1, 0, 0x0030}, {1, 0, 0x0030}, {1, 0, 0x0030}, {1, 0, 0x0030}, {1, 0, 0x0030}, - {1, 0, 0x0030}, {0, 0, 0x0000}, {0, 1, 0x0001}, {1, 0, 0x0001}, - {0, 1, 0x0001}, {1, 0,-0xa567}, {1, 0, 0x0001}, {0, 1, 0x0001}, - {0, 0, 0x0000}, {0, 0, 0x0000}, {1, 0, 0x0000}, {0, 0, 0x0000}, - {0, 0, 0x0000}, {1, 0, 0x0000}, {1, 0, 0x0000}, {0, 0, 0x0000}, + {1, 0, 0x0030}, {1, 0, 0x0030}, {0, 0, 0x0000}, {0, 1, 0x0001}, + {1, 0, 0x0001}, {0, 1, 0x0001}, {1, 0,-0xa567}, {1, 0, 0x0001}, + {0, 1, 0x0001}, {0, 0, 0x0000}, {0, 0, 0x0000}, {1, 0, 0x0000}, + {0, 0, 0x0000}, {0, 0, 0x0000}, {1, 0, 0x0000}, {1, 0, 0x0000}, {0, 0, 0x0000}, {0, 0, 0x0000}, {0, 0, 0x0000}, {0, 0, 0x0000}, - {0, 0, 0x0000}, {1, 0, 0x0001}, {0, 1, 0x0001}, {0, 0, 0x0000}, - {0, 0, 0x0000}, {0, 0, 0x0000}, {0, 0, 0x0000}, {1, 0, 0x0002}, - {1, 1, 0x0001}, {0, 1, 0x0002}, {1, 0, 0x0002}, {1, 1, 0x0001}, - {0, 1, 0x0002}, {1, 0, 0x0001}, {0, 1, 0x0001}, {1, 0, 0x0001}, - {0, 1, 0x0001}, {1, 0,-0x0030}, {1, 0,-0xa543}, {1, 0,-0x8a38}, - {1, 0, 0x0001}, {0, 1, 0x003e}, {0, 1, 0x0039}, {1, 0, 0x0000}, - {1, 0, 0x0000}, {1, 0, 0x0000}, {0, 1, 0x002f}, {0, 1, 0x0036}, - {0, 1, 0x0008}, {0, 1, 0x0008}, {0, 1, 0x0008}, {0, 1, 0x0008}, - {0, 1, 0x0008}, {0, 1, 0x0008}, {0, 0, 0x0000}, {0, 0, 0x0000}, - {0, 1, 0x0000}, {1, 0, 0x0000}, {1, 0, 0x0000}, {1, 0, 0x0000}, - {0, 1, 0x0000}, {0, 1, 0x0000}, {0, 1, 0x0000}, {0, 1, 0x0000}, - {0, 1, 0x0000}, {0, 1, 0x0000}, {1, 0, 0x0000}, {1, 0, 0x0000}, + {0, 0, 0x0000}, {0, 0, 0x0000}, {1, 0, 0x0001}, {0, 1, 0x0001}, + {0, 0, 0x0000}, {0, 0, 0x0000}, {0, 0, 0x0000}, {0, 0, 0x0000}, + {1, 0, 0x0002}, {1, 1, 0x0001}, {0, 1, 0x0002}, {1, 0, 0x0002}, + {1, 1, 0x0001}, {0, 1, 0x0002}, {1, 0, 0x0001}, {0, 1, 0x0001}, + {1, 0, 0x0001}, {0, 1, 0x0001}, {1, 0,-0x0030}, {1, 0,-0xa543}, + {1, 0,-0x8a38}, {1, 0, 0x0001}, {0, 1, 0x003e}, {0, 1, 0x0039}, + {1, 0, 0x0000}, {1, 0, 0x0000}, {1, 0, 0x0000}, {0, 1, 0x002f}, + {0, 1, 0x0036}, {0, 1, 0x0008}, {0, 1, 0x0008}, {0, 1, 0x0008}, + {0, 1, 0x0008}, {0, 1, 0x0008}, {0, 1, 0x0008}, {0, 0, 0x0000}, + {0, 0, 0x0000}, {0, 1, 0x0000}, {1, 0, 0x0000}, {1, 0, 0x0000}, + {1, 0, 0x0000}, {0, 1, 0x0000}, {0, 1, 0x0000}, {0, 1, 0x0000}, + {0, 1, 0x0000}, {0, 1, 0x0000}, {0, 1, 0x0000}, {1, 0, 0x0000}, {1, 0, 0x0000}, {1, 0, 0x0000}, {1, 0, 0x0000}, {1, 0, 0x0000}, - {1, 0, 0x0000}, {1, 0, 0x0000}, {0, 0, 0x0000}, {1, 0, 0x0000}, {1, 0, 0x0000}, {1, 0, 0x0000}, {1, 0, 0x0000}, {0, 0, 0x0000}, {1, 0, 0x0000}, {1, 0, 0x0000}, {1, 0, 0x0000}, {1, 0, 0x0000}, - {1, 0, 0x0000}, {0, 0, 0x0000}, {0, 0, 0x0000}, {1, 0, 0x0000}, + {0, 0, 0x0000}, {1, 0, 0x0000}, {1, 0, 0x0000}, {1, 0, 0x0000}, + {1, 0, 0x0000}, {1, 0, 0x0000}, {0, 0, 0x0000}, {0, 0, 0x0000}, {1, 0, 0x0000}, {1, 0, 0x0000}, {1, 0, 0x0000}, {1, 0, 0x0000}, - {1, 0, 0x0000}, {0, 1, 0x0000}, {0, 1, 0x0000}, {1, 0, 0x0000}, - {0, 1, 0x0000}, {0, 0, 0x0000}, {0, 0, 0x0000}, {0, 0, 0x0000}, - {0, 0, 0x0000}, {0, 1, 0x0000}, {0, 1,-0x0082}, {0, 1,-0x0082}, - {0, 1,-0x0082}, {0, 0, 0x0000}, {1, 0, 0x0074}, {1, 0,-0x00c7}, - {0, 1, 0x00e8}, {1, 0, 0x0001}, {0, 1, 0x0001}, {1, 0, 0x0001}, - {0, 1, 0x0001}, {1, 0, 0x0001}, {0, 1, 0x0001}, {1, 0, 0x00da}, - {1, 0, 0x0001}, {1, 0, 0x000f}, {1, 0, 0x0001}, {0, 1, 0x0001}, - {1, 0, 0x0001}, {0, 1, 0x0001}, {1, 0, 0x0001}, {0, 1, 0x0001}, - {1, 0, 0x0001}, {0, 1, 0x0001}, {1, 0, 0x0001}, {0, 1, 0x0001}, - {1, 0,-0x2a1c}, {1, 0,-0x29fd}, {1, 0,-0x2a1f}, {0, 1, 0x0001}, - {0, 1, 0x0000}, {1, 0, 0x0001}, {0, 1, 0x0001}, {1, 0, 0x0001}, - {0, 1, 0x0001}, {1, 0, 0x0001}, {0, 1, 0x0001}, {0, 1, 0x0000}, - {0, 1, 0x0000}, {0, 1, 0x0000}, {0, 1, 0x0000}, {1, 0, 0x0000}, - {0, 0, 0x0000}, {1, 0, 0x0000}, {1, 0, 0x0000}, {1, 0, 0x001c}, + {1, 0, 0x0000}, {1, 0, 0x0000}, {0, 1, 0x0000}, {0, 1, 0x0000}, {1, 0, 0x0000}, {0, 1, 0x0000}, {0, 0, 0x0000}, {0, 0, 0x0000}, - {0, 0, 0x0000}, {0, 1, 0x0001}, {1, 0,-0x0007}, {1, 0, 0x0001}, - {0, 1, 0x0001}, {0, 1, 0x0000}, {1, 0,-0x0082}, {1, 0,-0x0082}, - {1, 0,-0x0082}, {0, 1, 0x0000}, {1, 0, 0x0001}, {0, 1, 0x0001}, + {0, 0, 0x0000}, {0, 0, 0x0000}, {0, 1, 0x0000}, {0, 1,-0x0082}, + {0, 1,-0x0082}, {0, 1,-0x0082}, {0, 0, 0x0000}, {1, 0, 0x0074}, + {1, 0,-0x00c7}, {0, 1, 0x00e8}, {1, 0, 0x0001}, {0, 1, 0x0001}, {1, 0, 0x0001}, {0, 1, 0x0001}, {1, 0, 0x0001}, {0, 1, 0x0001}, - {0, 0, 0x0000}, {0, 0, 0x0000}, {1, 0, 0x0001}, {0, 1, 0x0001}, + {1, 0, 0x00da}, {1, 0, 0x0001}, {1, 0, 0x000f}, {1, 0, 0x0001}, + {0, 1, 0x0001}, {1, 0, 0x0001}, {0, 1, 0x0001}, {1, 0, 0x0001}, + {0, 1, 0x0001}, {1, 0, 0x0001}, {0, 1, 0x0001}, {1, 0, 0x0001}, + {0, 1, 0x0001}, {1, 0,-0x2a1c}, {1, 0,-0x29fd}, {1, 0,-0x2a1f}, + {0, 1, 0x0001}, {0, 1, 0x0000}, {1, 0, 0x0001}, {0, 1, 0x0001}, {1, 0, 0x0001}, {0, 1, 0x0001}, {1, 0, 0x0001}, {0, 1, 0x0001}, - {0, 1, 0x004f}, {1, 0, 0x0001}, {0, 1, 0x0001}, {1, 0,-0xa544}, - {1, 0,-0xa54f}, {1, 0,-0xa54b}, {1, 0,-0xa541}, {1, 0,-0xa544}, - {0, 1, 0x0000}, {0, 1,-0x8a04}, {0, 1, 0x0000}, {0, 1, 0x0000}, - {0, 1, 0x0000}, {0, 1,-0x0ee6}, {0, 1, 0x0000}, {0, 1, 0x0000}, - {0, 1, 0x0020}, {0, 1, 0x0020}, {0, 1, 0x0020}, {0, 1, 0x0020}, - {0, 1, 0x0020}, {0, 1, 0x0020}, {0, 1, 0x0020}, {0, 0, 0x0000}, - {0, 0, 0x0000}, {0, 0, 0x0000}, {0, 0, 0x0000}, {0, 0, 0x0000}, - {1, 0, 0x1c60}, {0, 0, 0x0000}, {0, 0, 0x0000}, {0, 1, 0x0000}, - {0, 1,-0x0009}, {0, 1, 0x0000}, {0, 0, 0x0000}, {0, 1, 0x0000}, - {0, 1, 0x0000}, {0, 1, 0x0000}, {0, 1, 0x003b}, {0, 1, 0x0000}, - {0, 1, 0x0000}, {1, 0,-0x1dbf}, {0, 1, 0x0000}, {0, 1, 0x0030}, - {0, 1, 0x0030}, {0, 1, 0x0030}, {0, 1, 0x0030}, {0, 1, 0x0030}, - {0, 1, 0x0030}, {0, 1, 0x0030}, {0, 1, 0x0030}, {0, 1, 0x0000}, - {0, 1, 0x00ca}, {0, 1, 0x0000}, {0, 1, 0x00cb}, {0, 1,-0xa54f}, - {0, 1, 0x0000}, {0, 1, 0x0000}, {0, 1, 0x0000}, {0, 1, 0x03a0}, - {0, 1, 0x0000}, {0, 1, 0x0000}, {0, 1, 0x0000}, {0, 1, 0x0000}, - {0, 1, 0x0000}, {0, 0, 0x0000}, {0, 1, 0x0000}, {0, 1, 0x0000}, {0, 1, 0x0000}, {0, 1, 0x0000}, {0, 1, 0x0000}, {0, 1, 0x0000}, - {1, 0,-0x2a3f}, {1, 0,-0x2a3f}, {1, 0, 0x1c60}, {1, 0, 0x1c60}, + {1, 0, 0x0000}, {0, 0, 0x0000}, {1, 0, 0x0000}, {1, 0, 0x0000}, + {1, 0, 0x001c}, {1, 0, 0x0000}, {0, 1, 0x0000}, {0, 0, 0x0000}, + {0, 0, 0x0000}, {0, 0, 0x0000}, {0, 1, 0x0001}, {1, 0,-0x0007}, + {1, 0, 0x0001}, {0, 1, 0x0001}, {0, 1, 0x0000}, {1, 0,-0x0082}, + {1, 0,-0x0082}, {1, 0,-0x0082}, {0, 1, 0x0000}, {1, 0, 0x0001}, + {0, 1, 0x0001}, {1, 0, 0x0001}, {0, 1, 0x0001}, {1, 0, 0x0001}, + {0, 1, 0x0001}, {0, 0, 0x0000}, {0, 0, 0x0000}, {1, 0, 0x0001}, + {0, 1, 0x0001}, {1, 0, 0x0001}, {0, 1, 0x0001}, {1, 0, 0x0001}, + {0, 1, 0x0001}, {0, 1, 0x004f}, {1, 0, 0x0001}, {0, 1, 0x0001}, + {1, 0,-0xa544}, {1, 0,-0xa54f}, {1, 0,-0xa54b}, {1, 0,-0xa541}, + {1, 0,-0xa544}, {0, 1, 0x0000}, {0, 1, 0x0030}, {0, 1, 0x0030}, + {0, 1, 0x0030}, {0, 1, 0x0030}, {0, 1, 0x0030}, {0, 1, 0x0030}, + {0, 1, 0x0030}, {0, 1, 0x0030}, {0, 1, 0x0000}, {0, 1,-0x8a04}, + {0, 1, 0x0000}, {0, 1, 0x0000}, {0, 1, 0x0000}, {0, 1,-0x0ee6}, + {0, 1, 0x0000}, {0, 1, 0x0000}, {0, 1, 0x0020}, {0, 1, 0x0020}, + {0, 1, 0x0020}, {0, 1, 0x0020}, {0, 1, 0x0020}, {0, 1, 0x0020}, + {0, 1, 0x0020}, {0, 0, 0x0000}, {0, 0, 0x0000}, {0, 0, 0x0000}, + {0, 0, 0x0000}, {0, 0, 0x0000}, {1, 0, 0x1c60}, {0, 0, 0x0000}, + {0, 0, 0x0000}, {0, 1, 0x0000}, {0, 1,-0x0009}, {0, 1, 0x0000}, + {0, 0, 0x0000}, {0, 1, 0x0000}, {0, 1, 0x0000}, {0, 1, 0x0000}, + {0, 1, 0x003b}, {0, 1, 0x0000}, {0, 1, 0x0000}, {1, 0,-0x1dbf}, + {0, 1, 0x0000}, {0, 1,-0x0008}, {0, 1, 0x0000}, {0, 1,-0x0008}, + {0, 1, 0x0000}, {0, 1,-0x0008}, {0, 1, 0x0000}, {0, 1,-0x0008}, + {0, 1,-0x0008}, {0, 1, 0x0000}, {0, 1, 0x0000}, {0, 1, 0x0000}, + {0, 1,-0x0007}, {0, 1, 0x0000}, {0, 1, 0x0000}, {1, 0, 0x0001}, + {0, 1, 0x0001}, {1, 0, 0x0001}, {0, 1, 0x0001}, {1, 0, 0x0001}, + {0, 1, 0x0001}, {1, 0, 0x0001}, {0, 1, 0x0001}, {0, 1, 0x000f}, {1, 0, 0x1c60}, {1, 0, 0x1c60}, {1, 0, 0x1c60}, {1, 0, 0x1c60}, - {1, 0, 0x1c60}, {1, 0, 0x1c60}, {0, 0, 0x0000}, {1, 0, 0x1c60}, - {0, 1,-0x0008}, {0, 1,-0x0008}, {0, 1,-0x0008}, {0, 1,-0x0008}, + {1, 0, 0x1c60}, {1, 0, 0x1c60}, {1, 0, 0x1c60}, {1, 0, 0x1c60}, + {0, 0, 0x0000}, {1, 0, 0x1c60}, {0, 1,-0x0008}, {0, 1,-0x0008}, {0, 1,-0x0008}, {0, 1,-0x0008}, {0, 1,-0x0008}, {0, 1,-0x0008}, - {0, 0, 0x0000}, {0, 0, 0x0000}, {1, 0,-0x0008}, {1, 0,-0x0008}, + {0, 1,-0x0008}, {0, 1,-0x0008}, {0, 0, 0x0000}, {0, 0, 0x0000}, {1, 0,-0x0008}, {1, 0,-0x0008}, {1, 0,-0x0008}, {1, 0,-0x0008}, - {1, 0,-0x0008}, {1, 0,-0x0008}, {0, 0, 0x0000}, {0, 0, 0x0000}, - {0, 1, 0x1c60}, {0, 1, 0x1c60}, {0, 1, 0x1c60}, {0, 1, 0x1c60}, + {1, 0,-0x0008}, {1, 0,-0x0008}, {1, 0,-0x0008}, {1, 0,-0x0008}, + {0, 0, 0x0000}, {0, 0, 0x0000}, {0, 1, 0x1c60}, {0, 1, 0x1c60}, {0, 1, 0x1c60}, {0, 1, 0x1c60}, {0, 1, 0x1c60}, {0, 1, 0x1c60}, - {0, 0, 0x0000}, {0, 1, 0x1c60}, {1, 0, 0x0022}, {1, 0, 0x0022}, + {0, 1, 0x1c60}, {0, 1, 0x1c60}, {0, 0, 0x0000}, {0, 1, 0x1c60}, + {1, 0, 0x0022}, {1, 0, 0x0022}, {1, 0, 0x0022}, {1, 0, 0x0022}, {1, 0, 0x0022}, {1, 0, 0x0022}, {1, 0, 0x0022}, {1, 0, 0x0022}, - {1, 0, 0x0022}, {1, 0, 0x0022}, {0, 1, 0x0022}, {0, 1, 0x0022}, {0, 1, 0x0022}, {0, 1, 0x0022}, {0, 1, 0x0022}, {0, 1, 0x0022}, - {0, 1, 0x0022}, {0, 1, 0x0022}, {0, 0, 0x0000}, {0, 0, 0x0000}, - {0, 0, 0x0000}, {0, 0, 0x0000}, {1, 0, 0x0001}, {0, 1, 0x0001}, - {1, 0, 0x0001}, {0, 1, 0x0001}, {0, 0, 0x0000}, {0, 1, 0x0000}, - {0, 0, 0x0000}, {0, 1, 0x0000}, {1, 0, 0x0001}, {0, 1, 0x0001}, - {1, 0, 0x0001}, {0, 1, 0x0001}, {1, 0,-0x8a04}, {1, 0, 0x0001}, - {0, 1, 0x0001}, {1, 0,-0x29f7}, {1, 0,-0x0ee6}, {1, 0,-0x29e7}, - {0, 1, 0x2a2b}, {0, 1, 0x2a28}, {1, 0, 0x0001}, {0, 1, 0x001a}, - {0, 1, 0x001a}, {0, 1, 0x001a}, {0, 1, 0x001a}, {0, 1, 0x001a}, - {0, 1, 0x001a}, {0, 1, 0x001a}, {0, 1, 0x001a}, {0, 0, 0x0000}, + {0, 1, 0x0022}, {0, 1, 0x0022}, {0, 1, 0x0022}, {0, 1, 0x0022}, {0, 0, 0x0000}, {0, 0, 0x0000}, {0, 0, 0x0000}, {0, 0, 0x0000}, - {0, 0, 0x0000}, {0, 1,-0x0054}, {0, 0, 0x0000}, {0, 0, 0x0000}, - {0, 1,-0x0008}, {0, 1,-0x0008}, {0, 1, 0x0000}, {0, 1, 0x0000}, - {0, 0, 0x0000}, {0, 0, 0x0000}, {0, 1, 0x0000}, {0, 1, 0x0000}, - {0, 1, 0x0000}, {0, 0, 0x0000}, {0, 1, 0x0000}, {0, 0, 0x0000}, - {0, 1, 0x0000}, {0, 1, 0x0000}, {0, 1, 0x0000}, {0, 1, 0x0000}, - {1, 0, 0x0000}, {1, 0, 0x0000}, {0, 0, 0x0000}, {1, 0, 0x0000}, - {1, 0, 0x0000}, {1, 0, 0x0000}, {0, 1, 0x0000}, {0, 0, 0x0000}, - {1, 0, 0x0000}, {0, 0, 0x0000}, {0, 0, 0x0000}, {1, 0, 0x0040}, + {1, 0, 0x0001}, {0, 1, 0x0001}, {1, 0, 0x0001}, {0, 1, 0x0001}, + {0, 0, 0x0000}, {0, 1, 0x0000}, {0, 0, 0x0000}, {0, 1, 0x0000}, + {1, 0, 0x0001}, {0, 1, 0x0001}, {1, 0, 0x0001}, {0, 1, 0x0001}, + {1, 0,-0x8a04}, {1, 0, 0x0001}, {0, 1, 0x0001}, {1, 0,-0x29f7}, + {1, 0,-0x0ee6}, {1, 0,-0x29e7}, {0, 1, 0x2a2b}, {0, 1, 0x2a28}, + {1, 0, 0x0001}, {0, 1, 0x001a}, {0, 1, 0x001a}, {0, 1, 0x001a}, + {0, 1, 0x001a}, {0, 1, 0x001a}, {0, 1, 0x001a}, {0, 1, 0x001a}, + {0, 1, 0x001a}, {0, 0, 0x0000}, {0, 0, 0x0000}, {0, 0, 0x0000}, + {0, 0, 0x0000}, {0, 0, 0x0000}, {0, 0, 0x0000}, {0, 1,-0x0054}, + {0, 0, 0x0000}, {0, 0, 0x0000}, {0, 1,-0x0008}, {0, 1,-0x0008}, + {0, 1, 0x0000}, {0, 1, 0x0000}, {0, 0, 0x0000}, {0, 0, 0x0000}, + {0, 1, 0x0000}, {0, 1, 0x0000}, {0, 1, 0x0000}, {0, 0, 0x0000}, + {0, 1, 0x0000}, {0, 0, 0x0000}, {0, 1, 0x0000}, {0, 1, 0x0000}, + {0, 1, 0x0000}, {0, 1, 0x0000}, {1, 0, 0x0000}, {1, 0, 0x0000}, + {0, 0, 0x0000}, {1, 0, 0x0000}, {1, 0, 0x0000}, {1, 0, 0x0000}, + {0, 1, 0x0000}, {0, 0, 0x0000}, {1, 0, 0x0000}, {0, 0, 0x0000}, + {0, 0, 0x0000}, {1, 0, 0x0040}, {1, 0, 0x0040}, {1, 0, 0x0040}, {1, 0, 0x0040}, {1, 0, 0x0040}, {1, 0, 0x0040}, {1, 0, 0x0040}, - {1, 0, 0x0040}, {1, 0, 0x0040}, {1, 0, 0x0040}, {0, 0, 0x0000}, - {0, 0, 0x0000}, {0, 0, 0x0000}, {0, 0, 0x0000}, {0, 0, 0x0000}, - {1, 0, 0x0000}, {0, 1, 0x0000}, {0, 1, 0x0000}, {1, 0, 0x2a2b}, - {1, 0, 0x0001}, {0, 1, 0x0001}, {1, 0,-0x00a3}, {1, 0, 0x2a28}, - {0, 1,-0x2a3f}, {1, 0, 0x0001}, {0, 1, 0x0001}, {1, 0,-0x00c3}, - {1, 0, 0x0045}, {1, 0, 0x0047}, {1, 0, 0x0001}, {0, 1, 0x0001}, - {0, 1,-0x00a3}, {0, 1,-0xa641}, {1, 0, 0x00d3}, {1, 0, 0x00d5}, - {0, 1,-0x0082}, {1, 0, 0x00d6}, {0, 1, 0x0040}, {0, 1, 0x0040}, + {1, 0, 0x0040}, {0, 0, 0x0000}, {0, 0, 0x0000}, {0, 0, 0x0000}, + {0, 0, 0x0000}, {0, 0, 0x0000}, {1, 0, 0x0000}, {0, 1, 0x0000}, + {0, 1, 0x0000}, {1, 0, 0x2a2b}, {1, 0, 0x0001}, {0, 1, 0x0001}, + {1, 0,-0x00a3}, {1, 0, 0x2a28}, {0, 1,-0x2a3f}, {1, 0, 0x0001}, + {0, 1, 0x0001}, {1, 0,-0x00c3}, {1, 0, 0x0045}, {1, 0, 0x0047}, + {1, 0, 0x0001}, {0, 1, 0x0001}, {0, 1,-0x00a3}, {0, 1,-0xa641}, + {1, 0, 0x00d3}, {1, 0, 0x00d5}, {0, 1,-0x0082}, {1, 0, 0x00d6}, {0, 1, 0x0040}, {0, 1, 0x0040}, {0, 1, 0x0040}, {0, 1, 0x0040}, - {0, 1, 0x0040}, {0, 1, 0x0040}, {0, 0, 0x0000}, {0, 0, 0x0000}, - {0, 0, 0x0000}, {0, 0, 0x0000}, {0, 0, 0x0000}, {0, 1, 0x1c60}, - {0, 0, 0x0000}, {0, 0, 0x0000}, {0, 1, 0x0020}, {0, 1, 0x0020}, - {0, 1, 0x001f}, {0, 1, 0x0020}, {0, 1, 0x0020}, {0, 1, 0x0020}, - {0, 1, 0x0020}, {0, 1, 0x0020}, {0, 1, 0x0040}, {0, 1, 0x003f}, - {0, 1, 0x003f}, {1, 0, 0x0008}, {1, 0, 0x0008}, {1, 0, 0x0008}, - {1, 0, 0x0008}, {1, 0, 0x0008}, {1, 0, 0x0008}, {0, 0, 0x0000}, - {0, 0, 0x0000}, {1, 0, 0x0000}, {0, 0, 0x0000}, {0, 0, 0x0000}, - {0, 0, 0x0000}, {0, 0, 0x0000}, {1, 0, 0x0000}, {0, 0, 0x0000}, - {1, 0,-0x1d5d}, {0, 0, 0x0000}, {1, 0,-0xa512}, {1, 0,-0xa52a}, - {1, 0,-0xa515}, {1, 0, 0x03a0}, {1, 0, 0x0001}, {0, 1, 0x0001}, - {1, 0, 0x0001}, {0, 1, 0x0001}, {0, 1, 0x0000}, {0, 1, 0x0000}, + {0, 1, 0x0040}, {0, 1, 0x0040}, {0, 1, 0x0040}, {0, 1, 0x0040}, + {0, 0, 0x0000}, {0, 0, 0x0000}, {0, 0, 0x0000}, {0, 0, 0x0000}, + {0, 0, 0x0000}, {0, 1, 0x1c60}, {0, 0, 0x0000}, {0, 0, 0x0000}, + {0, 1, 0x0020}, {0, 1, 0x0020}, {0, 1, 0x001f}, {0, 1, 0x0020}, + {0, 1, 0x0020}, {0, 1, 0x0020}, {0, 1, 0x0020}, {0, 1, 0x0020}, + {0, 1, 0x0040}, {0, 1, 0x003f}, {0, 1, 0x003f}, {1, 0, 0x0008}, + {1, 0, 0x0008}, {1, 0, 0x0008}, {1, 0, 0x0008}, {1, 0, 0x0008}, + {1, 0, 0x0008}, {0, 0, 0x0000}, {0, 0, 0x0000}, {1, 0, 0x0000}, {0, 0, 0x0000}, {0, 0, 0x0000}, {0, 0, 0x0000}, {0, 0, 0x0000}, - {0, 1, 0x001c}, {0, 0, 0x0000}, {1, 0, 0x0028}, {1, 0, 0x0028}, + {1, 0, 0x0000}, {0, 0, 0x0000}, {1, 0,-0x1d5d}, {0, 0, 0x0000}, + {1, 0,-0xa512}, {1, 0,-0xa52a}, {1, 0,-0xa515}, {1, 0, 0x03a0}, + {1, 0, 0x0001}, {0, 1, 0x0001}, {1, 0, 0x0001}, {0, 1, 0x0001}, + {0, 1, 0x0000}, {0, 1, 0x0000}, {0, 0, 0x0000}, {0, 0, 0x0000}, + {0, 0, 0x0000}, {0, 0, 0x0000}, {0, 1, 0x001c}, {0, 0, 0x0000}, {1, 0, 0x0028}, {1, 0, 0x0028}, {1, 0, 0x0028}, {1, 0, 0x0028}, - {1, 0, 0x0028}, {1, 0, 0x0028}, {0, 0, 0x0000}, {0, 0, 0x0000}, - {0, 0, 0x0000}, {0, 0, 0x0000}, {1, 0, 0x0001}, {0, 1, 0x0001}, - {1, 0,-0xa528}, {0, 1, 0x0000}, {0, 0, 0x0000}, {0, 1, 0x0028}, + {1, 0, 0x0028}, {1, 0, 0x0028}, {1, 0, 0x0028}, {1, 0, 0x0028}, + {0, 0, 0x0000}, {0, 0, 0x0000}, {0, 0, 0x0000}, {0, 0, 0x0000}, + {1, 0, 0x0001}, {0, 1, 0x0001}, {1, 0,-0xa528}, {0, 1, 0x0000}, + {0, 0, 0x0000}, {0, 1, 0x0028}, {0, 1, 0x0028}, {0, 1, 0x0028}, {0, 1, 0x0028}, {0, 1, 0x0028}, {0, 1, 0x0028}, {0, 1, 0x0028}, - {0, 1, 0x0028}, {0, 1, 0x0028}, {0, 1, 0x0028}, {0, 0, 0x0000}, - {0, 0, 0x0000}, {0, 0, 0x0000}, {0, 0, 0x0000}, {1, 0, 0x0027}, - {1, 0, 0x0027}, {1, 0, 0x0027}, {0, 0, 0x0000}, {1, 0, 0x0027}, + {0, 1, 0x0028}, {0, 0, 0x0000}, {0, 0, 0x0000}, {0, 0, 0x0000}, + {0, 0, 0x0000}, {1, 0, 0x0027}, {1, 0, 0x0027}, {1, 0, 0x0027}, + {0, 0, 0x0000}, {1, 0, 0x0027}, {1, 0, 0x0027}, {1, 0, 0x0027}, {1, 0, 0x0027}, {1, 0, 0x0027}, {1, 0, 0x0027}, {1, 0, 0x0027}, - {1, 0, 0x0027}, {1, 0, 0x0027}, {1, 0, 0x0027}, {0, 0, 0x0000}, - {1, 0, 0x0027}, {1, 0, 0x0027}, {0, 0, 0x0000}, {0, 1, 0x0027}, - {0, 1, 0x0027}, {0, 0, 0x0000}, {0, 1, 0x0027}, {0, 1, 0x0027}, + {1, 0, 0x0027}, {0, 0, 0x0000}, {1, 0, 0x0027}, {1, 0, 0x0027}, + {0, 0, 0x0000}, {0, 1, 0x0027}, {0, 1, 0x0027}, {0, 0, 0x0000}, + {0, 1, 0x0027}, {0, 1, 0x0027}, {0, 1, 0x0027}, {0, 1, 0x0027}, {0, 1, 0x0027}, {0, 1, 0x0027}, {0, 1, 0x0027}, {0, 1, 0x0027}, - {0, 1, 0x0027}, {0, 1, 0x0027}, {0, 0, 0x0000}, {0, 1, 0x0027}, - {0, 1, 0x0027}, {0, 0, 0x0000}, {0, 0, 0x0000}, {0, 0, 0x0000}, - {1, 0,-0x2a1e}, {0, 1, 0x0000}, {1, 0, 0x0001}, {0, 1, 0x0001}, - {0, 1, 0x0000}, {1, 0, 0x0001}, {0, 1, 0x0001}, {0, 1, 0x0000}, - {0, 0, 0x0000}, {1, 0, 0x0001}, {0, 1, 0x0001}, {0, 1, 0x0000}, - {0, 1,-0x0038}, {0, 1, 0x00da}, {0, 1, 0x0045}, {0, 1, 0x00d9}, - {0, 1, 0x00d9}, {0, 1, 0x0047}, {0, 1, 0x0000}, {0, 1, 0x0000}, - {0, 1, 0x0000}, {0, 1, 0x0000}, {0, 1, 0x0000}, {0, 1,-0x29e7}, - {0, 1, 0x0000}, {0, 1, 0x0000}, {0, 1,-0x0008}, {0, 1,-0x0008}, + {0, 0, 0x0000}, {0, 1, 0x0027}, {0, 1, 0x0027}, {0, 0, 0x0000}, + {0, 0, 0x0000}, {0, 0, 0x0000}, {1, 0,-0x2a1e}, {0, 1, 0x0000}, + {1, 0, 0x0001}, {0, 1, 0x0001}, {0, 1, 0x0000}, {1, 0, 0x0001}, + {0, 1, 0x0001}, {0, 1, 0x0000}, {0, 0, 0x0000}, {1, 0, 0x0001}, + {0, 1, 0x0001}, {0, 1, 0x0000}, {0, 1,-0x0038}, {0, 1, 0x00da}, + {0, 1, 0x0045}, {0, 1, 0x00d9}, {0, 1, 0x00d9}, {0, 1, 0x0047}, + {0, 1, 0x0000}, {0, 1, 0x0000}, {0, 1, 0x0000}, {0, 1, 0x0000}, + {0, 1, 0x0000}, {0, 1,-0x29e7}, {0, 1, 0x0000}, {0, 1, 0x0000}, + {0, 1, 0x00ca}, {0, 1, 0x0000}, {0, 1, 0x00cb}, {0, 1,-0xa54f}, + {0, 1, 0x0000}, {0, 1, 0x0000}, {0, 1, 0x0000}, {0, 1, 0x03a0}, + {0, 1, 0x0000}, {0, 1, 0x0000}, {0, 1, 0x0000}, {0, 1, 0x0000}, + {0, 1, 0x0000}, {0, 0, 0x0000}, {0, 1, 0x0000}, {0, 1, 0x0000}, + {0, 1, 0x0000}, {0, 1, 0x0000}, {0, 1, 0x0000}, {0, 1, 0x0000}, + {1, 0,-0x2a3f}, {1, 0,-0x2a3f}, {0, 1,-0x0008}, {0, 1,-0x0008}, {0, 1, 0x0000}, {0, 1,-0x0009}, {0, 1, 0x0000}, {0, 0, 0x0000}, {0, 1, 0x0000}, {0, 1, 0x0000}, {0, 1, 0x00db}, {0, 1, 0x0000}, {0, 0, 0x0000}, {0, 1, 0x0000}, {0, 1, 0x0000}, {0, 1, 0x0000}, @@ -444,104 +444,104 @@ static const struct CaseMappings unicode_data[1004] = { }; static const uint16_t unicode_offsets1[907] = { - 0x00ad, 0x0009, 0x000e, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, + 0x0096, 0x0009, 0x000e, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, - 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x00b4, 0x00ba, 0x00ba, 0x00ba, 0x0227, - 0x0227, 0x0227, 0x022d, 0x0009, 0x0009, 0x01f4, 0x01f4, 0x01f4, 0x01f4, 0x01f6, - 0x027e, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, + 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x009d, 0x00a3, 0x00a3, 0x00a3, 0x0211, + 0x0211, 0x0211, 0x0217, 0x0009, 0x0009, 0x01de, 0x01de, 0x01de, 0x01de, 0x01e0, + 0x0268, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, - 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x01d6, 0x01d6, 0x01d6, - 0x01d6, 0x01d8, 0x01a3, 0x031d, 0x031d, 0x031d, 0x031d, 0x031d, 0x0322, 0x011e, - 0x011e, 0x011e, 0x0116, 0x00ac, 0x00ac, 0x011a, 0x011e, 0x011e, 0x0133, 0x01c8, - 0x00ac, 0x00ac, 0x011e, 0x011e, 0x011e, 0x0116, 0x00ac, 0x00ac, 0x0167, 0x00e4, - 0x0126, 0x0133, 0x023f, 0x01c9, 0x00ac, 0x011e, 0x011e, 0x011e, 0x0116, 0x00ac, - 0x00ac, 0x00ac, 0x00ac, 0x00ac, 0x00ac, 0x00ac, 0x00ac, 0x00ac, 0x00ac, 0x00ac, - 0x00ac, 0x00ac, 0x00ac, 0x00ac, 0x0194, 0x00ac, 0x0315, 0x00ac, 0x00ac, 0x00ac, - 0x00ac, 0x00ac, 0x00ac, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, - 0x0009, 0x0022, 0x0023, 0x0023, 0x0028, 0x0055, 0x0056, 0x0056, 0x01a0, 0x0009, + 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x01c0, 0x01c0, 0x01c0, + 0x01c0, 0x01c2, 0x0195, 0x031d, 0x031d, 0x031d, 0x031d, 0x031d, 0x0322, 0x0107, + 0x0107, 0x0107, 0x00ff, 0x0095, 0x0095, 0x0103, 0x0107, 0x0107, 0x011c, 0x02fc, + 0x0095, 0x0095, 0x0107, 0x0107, 0x0107, 0x00ff, 0x0095, 0x0095, 0x0150, 0x00cd, + 0x010f, 0x011c, 0x0229, 0x02fd, 0x0095, 0x0107, 0x0107, 0x0107, 0x00ff, 0x0095, + 0x0095, 0x0095, 0x0095, 0x0095, 0x0095, 0x0095, 0x0095, 0x0095, 0x0095, 0x0095, + 0x0095, 0x0095, 0x0095, 0x0095, 0x0186, 0x0095, 0x0315, 0x0095, 0x0095, 0x0095, + 0x0095, 0x0095, 0x0095, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, + 0x0009, 0x0022, 0x0023, 0x0023, 0x006c, 0x0048, 0x0049, 0x0049, 0x0192, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x03e4, - 0x03e4, 0x03e4, 0x03e4, 0x03e4, 0x03e4, 0x03e4, 0x03e4, 0x03e4, 0x03e4, 0x0291, - 0x010c, 0x01fe, 0x01fe, 0x01fe, 0x01fe, 0x0204, 0x0206, 0x0206, 0x0206, 0x020a, + 0x03e4, 0x03e4, 0x03e4, 0x03e4, 0x03e4, 0x03e4, 0x03e4, 0x03e4, 0x03e4, 0x027b, + 0x00f5, 0x01e8, 0x01e8, 0x01e8, 0x01e8, 0x01ee, 0x01f0, 0x01f0, 0x01f0, 0x01f4, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, - 0x0009, 0x0009, 0x0009, 0x0023, 0x0023, 0x0023, 0x0023, 0x0056, 0x0056, 0x0056, - 0x0056, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, - 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0253, 0x0253, 0x0253, - 0x0253, 0x0253, 0x0253, 0x0258, 0x0009, 0x0276, 0x0276, 0x0276, 0x0276, 0x0276, - 0x0276, 0x027b, 0x0009, 0x00ac, 0x01cb, 0x00ac, 0x00ad, 0x000c, 0x00b1, 0x0009, + 0x0009, 0x0009, 0x0009, 0x0023, 0x0023, 0x0023, 0x0023, 0x0049, 0x0049, 0x0049, + 0x0049, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, + 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0225, 0x0095, 0x0095, + 0x0095, 0x0095, 0x0095, 0x0300, 0x009a, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, + 0x0009, 0x0009, 0x0009, 0x0022, 0x0023, 0x0023, 0x006c, 0x0048, 0x0049, 0x0049, + 0x0192, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0006, 0x006f, 0x0006, 0x0023, + 0x0023, 0x0068, 0x0024, 0x0049, 0x0049, 0x018e, 0x004a, 0x0095, 0x02ff, 0x0095, + 0x0096, 0x000c, 0x009a, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, + 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x03ac, + 0x00ab, 0x032a, 0x032a, 0x032a, 0x032a, 0x032a, 0x032f, 0x0009, 0x0009, 0x0009, + 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x01b7, 0x01b7, 0x01b7, 0x01b7, 0x01b7, + 0x0167, 0x0009, 0x0009, 0x01b7, 0x01b7, 0x01b7, 0x0290, 0x0009, 0x0009, 0x0009, + 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x021a, + 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0169, 0x0128, 0x00ae, 0x03cc, 0x0067, + 0x0023, 0x0020, 0x03c4, 0x018d, 0x0049, 0x0270, 0x0274, 0x00ee, 0x01b7, 0x01b7, + 0x01b7, 0x0337, 0x015e, 0x0095, 0x0095, 0x02fc, 0x0103, 0x0107, 0x0107, 0x008f, + 0x0095, 0x0095, 0x0096, 0x0101, 0x0107, 0x0107, 0x0108, 0x0095, 0x0095, 0x0095, + 0x0300, 0x0107, 0x0107, 0x0107, 0x0093, 0x0095, 0x0095, 0x02fe, 0x0122, 0x0009, + 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0095, 0x0095, 0x0095, 0x0095, 0x0095, + 0x0095, 0x0095, 0x0097, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, - 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x03ac, 0x00c2, 0x032a, 0x032a, 0x032a, - 0x032a, 0x032a, 0x032f, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, - 0x0009, 0x0022, 0x0023, 0x0023, 0x0028, 0x0055, 0x0056, 0x0056, 0x01a0, 0x0009, - 0x0009, 0x0009, 0x0009, 0x0009, 0x0006, 0x002b, 0x0006, 0x0023, 0x0023, 0x0024, - 0x0075, 0x0056, 0x0056, 0x019c, 0x0057, 0x00ac, 0x00ac, 0x01c8, 0x011a, 0x011e, - 0x011e, 0x00a6, 0x00ac, 0x00ac, 0x00ad, 0x0118, 0x011e, 0x011e, 0x011f, 0x00ac, - 0x00ac, 0x00ac, 0x01cc, 0x011e, 0x011e, 0x011e, 0x00aa, 0x00ac, 0x00ac, 0x01ca, - 0x0139, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x00ac, 0x00ac, 0x00ac, - 0x00ac, 0x01c4, 0x01ca, 0x00ac, 0x00b2, 0x03b4, 0x03b4, 0x03b4, 0x03b4, 0x03b4, - 0x03b4, 0x03b4, 0x03b4, 0x03b4, 0x03b4, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, - 0x0009, 0x0009, 0x0009, 0x00ac, 0x00ac, 0x00ac, 0x00ac, 0x00ac, 0x00ac, 0x00ac, - 0x00ae, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, - 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x023b, - 0x00ac, 0x00ac, 0x00ac, 0x00ac, 0x00ac, 0x01cc, 0x00b1, 0x0009, 0x0009, 0x0009, - 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0230, 0x0009, 0x0009, 0x0009, 0x0009, - 0x0009, 0x0180, 0x013f, 0x00c5, 0x03cc, 0x0074, 0x0023, 0x0020, 0x03c4, 0x019b, - 0x0056, 0x0286, 0x028a, 0x0105, 0x008b, 0x008b, 0x008b, 0x0337, 0x0175, 0x03d4, - 0x03d4, 0x0023, 0x0023, 0x0023, 0x0023, 0x0056, 0x0056, 0x0056, 0x0056, 0x0394, - 0x0394, 0x008b, 0x008b, 0x008b, 0x008b, 0x00c3, 0x0184, 0x008b, 0x008b, 0x008b, - 0x008b, 0x008b, 0x008b, 0x0151, 0x008c, 0x008b, 0x008b, 0x008b, 0x008b, 0x008b, - 0x008b, 0x00d4, 0x00d5, 0x00d5, 0x00d5, 0x00d6, 0x0009, 0x01b6, 0x01b7, 0x01b7, - 0x01b7, 0x01b8, 0x0008, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, - 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0007, 0x000a, 0x0009, - 0x0009, 0x00ac, 0x00af, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, - 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0023, 0x0023, 0x0025, 0x0009, 0x0056, - 0x0056, 0x019d, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, - 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x008b, 0x008b, 0x008b, - 0x008b, 0x008b, 0x017e, 0x0009, 0x0009, 0x008b, 0x008b, 0x008b, 0x02a6, 0x0009, + 0x0009, 0x023d, 0x023d, 0x023d, 0x023d, 0x023d, 0x023d, 0x0242, 0x0009, 0x0260, + 0x0260, 0x0260, 0x0260, 0x0260, 0x0260, 0x0265, 0x0009, 0x03d4, 0x03d4, 0x0023, + 0x0023, 0x0023, 0x0023, 0x0049, 0x0049, 0x0049, 0x0049, 0x0394, 0x0394, 0x01b7, + 0x01b7, 0x01b7, 0x01b7, 0x00ac, 0x016d, 0x01b7, 0x01b7, 0x01b7, 0x01b7, 0x01b7, + 0x01b7, 0x013a, 0x01b8, 0x01b7, 0x01b7, 0x01b7, 0x01b7, 0x01b7, 0x01b7, 0x00bd, + 0x00be, 0x00be, 0x00be, 0x00bf, 0x0009, 0x017d, 0x017e, 0x017e, 0x017e, 0x017f, + 0x0008, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, + 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0007, 0x000a, 0x0009, 0x0009, 0x0095, + 0x0098, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, + 0x0009, 0x0009, 0x0009, 0x0023, 0x0023, 0x0069, 0x0009, 0x0049, 0x0049, 0x018f, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, - 0x0009, 0x011e, 0x011e, 0x011e, 0x00e9, 0x011e, 0x011e, 0x011e, 0x00e9, 0x011e, - 0x011e, 0x011e, 0x00a6, 0x0297, 0x0112, 0x024b, 0x012b, 0x029a, 0x009a, 0x016d, - 0x00a0, 0x025b, 0x02aa, 0x0009, 0x0009, 0x03bc, 0x03bc, 0x038c, 0x038c, 0x00ee, + 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0095, 0x0095, 0x0095, 0x0095, 0x02f8, + 0x02fe, 0x0095, 0x009b, 0x03b4, 0x03b4, 0x03b4, 0x03b4, 0x03b4, 0x03b4, 0x03b4, + 0x03b4, 0x03b4, 0x03b4, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, + 0x0009, 0x0107, 0x0107, 0x0107, 0x00d2, 0x0107, 0x0107, 0x0107, 0x00d2, 0x0107, + 0x0107, 0x0107, 0x008f, 0x0281, 0x00fb, 0x0235, 0x0114, 0x0284, 0x0083, 0x0156, + 0x0089, 0x0245, 0x0294, 0x0009, 0x0009, 0x03bc, 0x03bc, 0x038c, 0x038c, 0x00d7, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, - 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x02d3, 0x02cf, 0x02d3, 0x02cf, 0x02d8, - 0x02e2, 0x02df, 0x02e2, 0x02df, 0x02e8, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, - 0x0009, 0x0009, 0x0009, 0x0184, 0x008b, 0x0089, 0x008b, 0x008b, 0x008b, 0x008b, - 0x008b, 0x008b, 0x008b, 0x00ac, 0x0219, 0x008b, 0x02bb, 0x033e, 0x008b, 0x008b, - 0x018d, 0x02a2, 0x008b, 0x00fd, 0x00de, 0x0214, 0x004e, 0x0009, 0x0009, 0x0031, - 0x00b1, 0x0244, 0x012e, 0x0121, 0x00a6, 0x00ac, 0x00ac, 0x00ac, 0x0124, 0x0094, - 0x0131, 0x00aa, 0x00ac, 0x00ac, 0x011a, 0x011e, 0x011e, 0x0133, 0x00ac, 0x00ac, - 0x00ac, 0x011e, 0x011e, 0x011e, 0x0116, 0x00ac, 0x00ac, 0x011a, 0x011e, 0x011e, - 0x0133, 0x00ac, 0x00ac, 0x00ac, 0x011e, 0x011e, 0x011e, 0x0116, 0x00ac, 0x00ac, - 0x00ae, 0x011e, 0x011e, 0x011e, 0x00aa, 0x00ac, 0x00ac, 0x01ca, 0x011c, 0x011e, - 0x011e, 0x00a8, 0x008b, 0x008b, 0x008b, 0x008b, 0x008b, 0x008b, 0x008b, 0x008b, - 0x008b, 0x008b, 0x008b, 0x008b, 0x008b, 0x008b, 0x008b, 0x008b, 0x008b, 0x008b, - 0x0161, 0x01af, 0x008b, 0x008b, 0x008b, 0x008b, 0x008b, 0x008b, 0x008b, 0x008b, - 0x008b, 0x008b, 0x008b, 0x008b, 0x0147, 0x008a, 0x0153, 0x015f, 0x008b, 0x008b, - 0x008b, 0x008b, 0x008b, 0x0354, 0x036c, 0x037c, 0x03dc, 0x026e, 0x0149, 0x0047, - 0x0384, 0x02f5, 0x00f3, 0x00f8, 0x0153, 0x0187, 0x008b, 0x008b, 0x0018, 0x008b, - 0x008b, 0x008b, 0x008b, 0x017c, 0x008b, 0x0163, 0x0261, 0x0268, 0x008b, 0x005f, - 0x01bf, 0x0066, 0x039c, 0x006d, 0x0302, 0x03a4, 0x02fd, 0x0310, 0x0011, 0x00ac, - 0x00ac, 0x00ac, 0x0008, 0x00b2, 0x0009, 0x0009, 0x0009, 0x00af, 0x0009, 0x0009, - 0x0009, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x01b7, 0x01b7, 0x01b7, - 0x01b7, 0x01b7, 0x01b7, 0x021f, 0x0157, 0x02f0, 0x01ce, 0x008b, 0x008b, 0x008b, - 0x008b, 0x008b, 0x008b, 0x008b, 0x008b, 0x008b, 0x008b, 0x008b, 0x008b, 0x0344, - 0x020f, 0x00ef, 0x0009, 0x01e0, 0x01ea, 0x01e2, 0x01ec, 0x01e0, 0x01ea, 0x01e0, - 0x01ea, 0x01e2, 0x01ec, 0x007c, 0x0038, 0x01e0, 0x01ea, 0x0374, 0x0000, 0x01e0, - 0x01ea, 0x01e0, 0x01ea, 0x01e0, 0x01ea, 0x030a, 0x003f, 0x01a9, 0x035c, 0x0238, - 0x00cd, 0x0083, 0x0364, 0x01a9, 0x034c, 0x02b2, 0x02b2, 0x02b2, 0x02b2, 0x02b2, - 0x02c3, 0x02c3, 0x02c3, 0x02c3, 0x02c3, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, - 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x02b2, 0x02b2, 0x02b2, - 0x02b2, 0x02b6, 0x02c3, 0x02c3, 0x02c3, 0x02c3, 0x02c7 + 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x02bd, 0x02b9, 0x02bd, 0x02b9, 0x02c2, + 0x02cc, 0x02c9, 0x02cc, 0x02c9, 0x02d2, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, + 0x0009, 0x0009, 0x0009, 0x016d, 0x01b7, 0x01b5, 0x01b7, 0x01b7, 0x01b7, 0x01b7, + 0x01b7, 0x01b7, 0x01b7, 0x0095, 0x0203, 0x01b7, 0x02a5, 0x033e, 0x01b7, 0x01b7, + 0x0176, 0x028c, 0x01b7, 0x00e6, 0x00c7, 0x01fe, 0x0033, 0x0009, 0x0009, 0x0075, + 0x009a, 0x022e, 0x0117, 0x010a, 0x008f, 0x0095, 0x0095, 0x0095, 0x010d, 0x007d, + 0x011a, 0x0093, 0x0095, 0x0095, 0x0103, 0x0107, 0x0107, 0x011c, 0x0095, 0x0095, + 0x0095, 0x0107, 0x0107, 0x0107, 0x00ff, 0x0095, 0x0095, 0x0103, 0x0107, 0x0107, + 0x011c, 0x0095, 0x0095, 0x0095, 0x0107, 0x0107, 0x0107, 0x00ff, 0x0095, 0x0095, + 0x0097, 0x0107, 0x0107, 0x0107, 0x0093, 0x0095, 0x0095, 0x02fe, 0x0105, 0x0107, + 0x0107, 0x0091, 0x01b7, 0x01b7, 0x01b7, 0x01b7, 0x01b7, 0x01b7, 0x01b7, 0x01b7, + 0x01b7, 0x01b7, 0x01b7, 0x01b7, 0x01b7, 0x01b7, 0x01b7, 0x01b7, 0x01b7, 0x01b7, + 0x014a, 0x01a1, 0x01b7, 0x01b7, 0x01b7, 0x01b7, 0x01b7, 0x01b7, 0x01b7, 0x01b7, + 0x01b7, 0x01b7, 0x01b7, 0x01b7, 0x0130, 0x01b6, 0x013c, 0x0148, 0x01b7, 0x01b7, + 0x01b7, 0x01b7, 0x01b7, 0x0354, 0x036c, 0x037c, 0x03dc, 0x0258, 0x0132, 0x002c, + 0x0384, 0x02df, 0x00dc, 0x00e1, 0x013c, 0x0170, 0x01b7, 0x01b7, 0x0018, 0x01b7, + 0x01b7, 0x01b7, 0x01b7, 0x0165, 0x01b7, 0x014c, 0x024b, 0x0252, 0x01b7, 0x0052, + 0x02f3, 0x0059, 0x039c, 0x0060, 0x02ec, 0x03a4, 0x02e7, 0x0310, 0x0011, 0x0095, + 0x0095, 0x0095, 0x0008, 0x009b, 0x0009, 0x0009, 0x0009, 0x0098, 0x0009, 0x0009, + 0x0009, 0x00be, 0x00be, 0x00be, 0x00be, 0x00be, 0x00be, 0x017e, 0x017e, 0x017e, + 0x017e, 0x017e, 0x017e, 0x0209, 0x0140, 0x02da, 0x0302, 0x01b7, 0x01b7, 0x01b7, + 0x01b7, 0x01b7, 0x01b7, 0x01b7, 0x01b7, 0x01b7, 0x01b7, 0x01b7, 0x01b7, 0x0344, + 0x01f9, 0x00d8, 0x0009, 0x01ca, 0x01d4, 0x01cc, 0x01d6, 0x01ca, 0x01d4, 0x01ca, + 0x01d4, 0x01cc, 0x01d6, 0x01a8, 0x003a, 0x01ca, 0x01d4, 0x0374, 0x0000, 0x01ca, + 0x01d4, 0x01ca, 0x01d4, 0x01ca, 0x01d4, 0x030a, 0x0041, 0x019b, 0x035c, 0x0222, + 0x00b6, 0x01af, 0x0364, 0x019b, 0x034c, 0x029c, 0x029c, 0x029c, 0x029c, 0x029c, + 0x02ad, 0x02ad, 0x02ad, 0x02ad, 0x02ad, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, + 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x029c, 0x029c, 0x029c, + 0x029c, 0x02a0, 0x02ad, 0x02ad, 0x02ad, 0x02ad, 0x02b1 }; static const uint16_t unicode_offsets2[498] = { - 0x012f, 0x02ec, 0x030b, 0x01ab, 0x01cb, 0x01e5, 0x0003, 0x0003, 0x0003, 0x0003, + 0x00ff, 0x02ec, 0x030b, 0x015f, 0x01c9, 0x01e3, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0039, 0x0003, 0x0003, 0x009f, - 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0117, 0x0077, - 0x02d2, 0x034b, 0x01f7, 0x0251, 0x0003, 0x0003, 0x000d, 0x0003, 0x0003, 0x0003, + 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x012f, 0x0077, + 0x02d2, 0x034b, 0x01f5, 0x0251, 0x0003, 0x0003, 0x000d, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x032b, 0x002d, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, @@ -554,8 +554,8 @@ static const uint16_t unicode_offsets2[498] = { 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, - 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0225, 0x027f, 0x0003, 0x0003, - 0x0003, 0x0169, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, + 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0147, 0x027f, 0x0003, 0x0003, + 0x0003, 0x0225, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, @@ -564,7 +564,7 @@ static const uint16_t unicode_offsets2[498] = { 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0000, 0x0003, 0x0003, 0x0003, 0x0093, 0x0003, 0x0003, 0x0003, 0x0003, - 0x036b, 0x0263, 0x0003, 0x0193, 0x0003, 0x0003, 0x0003, 0x0003, 0x00e7, 0x020d, + 0x036b, 0x0263, 0x0003, 0x00e7, 0x0003, 0x0003, 0x0003, 0x0003, 0x01a9, 0x020b, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x00cb, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, @@ -585,8 +585,8 @@ static const uint16_t unicode_offsets2[498] = { 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0059, 0x029f, - 0x02b2, 0x014f, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0107, - 0x0183, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x00bf, + 0x02b2, 0x017f, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x011f, + 0x0199, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x00bf, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x023f }; diff --git a/test/keysym-case-mapping.h b/test/keysym-case-mapping.h new file mode 100644 index 00000000..0897a912 --- /dev/null +++ b/test/keysym-case-mapping.h @@ -0,0 +1,31 @@ +// WARNING: This file is automatically generated by: scripts/update-unicode.py +#ifndef KEYSYM_CASE_EXCEPTIONS_TEST_H +#define KEYSYM_CASE_EXCEPTIONS_TEST_H + +#include +#include + +/* Unicode code points used in case mapping exceptions */ +#define LATIN_SMALL_LETTER_SHARP_S 0x00df // ß +#define LATIN_CAPITAL_LETTER_SHARP_S 0x1e9e // ẞ + +static inline uint32_t +to_simple_lower(uint32_t cp) +{ + return (uint32_t)u_tolower((UChar32) cp); +} + +static inline uint32_t +to_simple_upper(uint32_t cp) +{ + switch (cp) { + /* Some exceptions */ + case LATIN_SMALL_LETTER_SHARP_S: + return LATIN_CAPITAL_LETTER_SHARP_S; + /* Default to the Unicode simple mapping */ + default: + return (uint32_t)u_toupper((UChar32) cp); + } +} + +#endif diff --git a/test/keysym-case-mapping.h.jinja b/test/keysym-case-mapping.h.jinja new file mode 100644 index 00000000..c84bf763 --- /dev/null +++ b/test/keysym-case-mapping.h.jinja @@ -0,0 +1,35 @@ +// WARNING: This file is automatically generated by: {{ script }} +#ifndef KEYSYM_CASE_EXCEPTIONS_TEST_H +#define KEYSYM_CASE_EXCEPTIONS_TEST_H + +#include +#include + +/* Unicode code points used in case mapping exceptions */ +{% for lower, upper in upper_exceptions.items() %} +#define {{ lower | code_point_name_constant(padding=28) }} {{ lower | code_point }} // {{ lower }} +#define {{ upper | code_point_name_constant(padding=28) }} {{ upper | code_point }} // {{ upper }} +{% endfor %} + +static inline uint32_t +to_simple_lower(uint32_t cp) +{ + return (uint32_t)u_tolower((UChar32) cp); +} + +static inline uint32_t +to_simple_upper(uint32_t cp) +{ + switch (cp) { + /* Some exceptions */ + {% for lower, upper in upper_exceptions.items() %} + case {{ lower | code_point_name_constant }}: + return {{ upper | code_point_name_constant }}; + {% endfor %} + /* Default to the Unicode simple mapping */ + default: + return (uint32_t)u_toupper((UChar32) cp); + } +} + +#endif diff --git a/test/keysym.c b/test/keysym.c index 906af106..29b8aacd 100644 --- a/test/keysym.c +++ b/test/keysym.c @@ -28,6 +28,7 @@ #include #include #include +#include "test/keysym-case-mapping.h" #endif #include "test.h" @@ -241,18 +242,6 @@ compare_unicode_version(const UVersionInfo v1, const UVersionInfo v2) } \ } -static inline uint32_t -to_simple_lower(uint32_t cp) -{ - return (uint32_t)u_tolower((UChar32) cp); -} - -static inline uint32_t -to_simple_upper(uint32_t cp) -{ - return (uint32_t)u_toupper((UChar32) cp); -} - #define KEYSYM "0x%04"PRIx32 #define CODE_POINT "U+%04"PRIX32 @@ -846,7 +835,7 @@ main(void) assert(xkb_keysym_is_upper_or_title(XKB_KEY_Ssharp)); assert(xkb_keysym_is_lower(XKB_KEY_ssharp)); assert(!xkb_keysym_is_lower(XKB_KEY_Ssharp)); - assert(xkb_keysym_to_upper(XKB_KEY_ssharp) == XKB_KEY_ssharp); + assert(xkb_keysym_to_upper(XKB_KEY_ssharp) == XKB_KEY_Ssharp); assert(xkb_keysym_to_lower(XKB_KEY_ssharp) == XKB_KEY_ssharp); assert(xkb_keysym_to_upper(XKB_KEY_Ssharp) == XKB_KEY_Ssharp); assert(xkb_keysym_to_lower(XKB_KEY_Ssharp) == XKB_KEY_ssharp);