From a7747ed2b95183e1aa12cae55c0181781b9a6d51 Mon Sep 17 00:00:00 2001
From: Antonio Terceiro <terceiro@debian.org>
Date: Mon, 14 Sep 2020 15:27:00 -0300
Subject: [PATCH] New upstream version 0.1.20200714

---
 MANIFEST.in                                   |     8 +
 PKG-INFO                                      |  2110 +-
 README                                        |    18 -
 README.rst                                    |  1063 +
 docs/Features.html                            |   255 +-
 docs/Features.rst                             |  1227 +-
 ...deProperties.txt => UnicodeProperties.rst} |     0
 regex.egg-info/PKG-INFO                       |  1086 +
 regex.egg-info/SOURCES.txt                    |    27 +
 regex.egg-info/dependency_links.txt           |     1 +
 regex.egg-info/top_level.txt                  |     1 +
 regex_2/{regex => }/__init__.py               |     0
 regex_2/_regex.c                              |  1096 +-
 regex_2/_regex.h                              |    46 +-
 regex_2/{regex => }/_regex_core.py            |   105 +-
 regex_2/_regex_unicode.c                      | 42122 ++++++++++------
 regex_2/_regex_unicode.h                      |   459 +-
 regex_2/{regex => }/regex.py                  |    86 +-
 regex_2/regex/test/__init__.py                |     0
 regex_2/{regex/test => }/test_regex.py        |   139 +-
 regex_3/{regex => }/__init__.py               |     0
 regex_3/_regex.c                              |  1237 +-
 regex_3/_regex.h                              |    46 +-
 regex_3/{regex => }/_regex_core.py            |   105 +-
 regex_3/_regex_unicode.c                      | 42122 ++++++++++------
 regex_3/_regex_unicode.h                      |   459 +-
 regex_3/{regex => }/regex.py                  |    86 +-
 regex_3/regex/test/__init__.py                |     0
 regex_3/{regex/test => }/test_regex.py        |   140 +-
 setup.cfg                                     |     4 +
 setup.py                                      |    42 +-
 tools/build_regex_unicode.py                  |  4129 +-
 32 files changed, 58186 insertions(+), 40033 deletions(-)
 create mode 100644 MANIFEST.in
 delete mode 100644 README
 create mode 100644 README.rst
 rename docs/{UnicodeProperties.txt => UnicodeProperties.rst} (100%)
 create mode 100644 regex.egg-info/PKG-INFO
 create mode 100644 regex.egg-info/SOURCES.txt
 create mode 100644 regex.egg-info/dependency_links.txt
 create mode 100644 regex.egg-info/top_level.txt
 rename regex_2/{regex => }/__init__.py (100%)
 rename regex_2/{regex => }/_regex_core.py (98%)
 rename regex_2/{regex => }/regex.py (92%)
 delete mode 100644 regex_2/regex/test/__init__.py
 rename regex_2/{regex/test => }/test_regex.py (97%)
 rename regex_3/{regex => }/__init__.py (100%)
 rename regex_3/{regex => }/_regex_core.py (98%)
 rename regex_3/{regex => }/regex.py (91%)
 delete mode 100644 regex_3/regex/test/__init__.py
 rename regex_3/{regex/test => }/test_regex.py (97%)
 create mode 100644 setup.cfg

diff --git a/MANIFEST.in b/MANIFEST.in
new file mode 100644
index 0000000..1265fad
--- /dev/null
+++ b/MANIFEST.in
@@ -0,0 +1,8 @@
+include regex_2/*.c
+include regex_2/*.h
+include regex_2/*.py
+include regex_3/*.c
+include regex_3/*.h
+include regex_3/*.py
+include docs/*.*
+include tools/*.py
diff --git a/PKG-INFO b/PKG-INFO
index 0ba4a0e..584e08b 100644
--- a/PKG-INFO
+++ b/PKG-INFO
@@ -1,1024 +1,1086 @@
-Metadata-Version: 1.1
-Name: regex
-Version: 2019.08.19
-Summary: Alternative regular expression module, to replace re.
-Home-page: https://bitbucket.org/mrabarnett/mrab-regex
-Author: Matthew Barnett
-Author-email: regex@mrabarnett.plus.com
-License: Python Software Foundation License
-Description: Introduction
-        ------------
-        
-        This regex implementation is backwards-compatible with the standard 're' module, but offers additional functionality.
-        
-        Note
-        ----
-        
-        The re module's behaviour with zero-width matches changed in Python 3.7, and this module will follow that behaviour when compiled for Python 3.7.
-        
-        Old vs new behaviour
-        --------------------
-        
-        In order to be compatible with the re module, this module has 2 behaviours:
-        
-        * **Version 0** behaviour (old behaviour, compatible with the re module):
-        
-          Please note that the re module's behaviour may change over time, and I'll endeavour to match that behaviour in version 0.
-        
-          * Indicated by the ``VERSION0`` or ``V0`` flag, or ``(?V0)`` in the pattern.
-        
-          * Zero-width matches are not handled correctly in the re module before Python 3.7. The behaviour in those earlier versions is:
-        
-            * ``.split`` won't split a string at a zero-width match.
-        
-            * ``.sub`` will advance by one character after a zero-width match.
-        
-          * Inline flags apply to the entire pattern, and they can't be turned off.
-        
-          * Only simple sets are supported.
-        
-          * Case-insensitive matches in Unicode use simple case-folding by default.
-        
-        * **Version 1** behaviour (new behaviour, possibly different from the re module):
-        
-          * Indicated by the ``VERSION1`` or ``V1`` flag, or ``(?V1)`` in the pattern.
-        
-          * Zero-width matches are handled correctly.
-        
-          * Inline flags apply to the end of the group or pattern, and they can be turned off.
-        
-          * Nested sets and set operations are supported.
-        
-          * Case-insensitive matches in Unicode use full case-folding by default.
-        
-        If no version is specified, the regex module will default to ``regex.DEFAULT_VERSION``.
-        
-        Case-insensitive matches in Unicode
-        -----------------------------------
-        
-        The regex module supports both simple and full case-folding for case-insensitive matches in Unicode. Use of full case-folding can be turned on using the ``FULLCASE`` or ``F`` flag, or ``(?f)`` in the pattern. Please note that this flag affects how the ``IGNORECASE`` flag works; the ``FULLCASE`` flag itself does not turn on case-insensitive matching.
-        
-        In the version 0 behaviour, the flag is off by default.
-        
-        In the version 1 behaviour, the flag is on by default.
-        
-        Nested sets and set operations
-        ------------------------------
-        
-        It's not possible to support both simple sets, as used in the re module, and nested sets at the same time because of a difference in the meaning of an unescaped ``"["`` in a set.
-        
-        For example, the pattern ``[[a-z]--[aeiou]]`` is treated in the version 0 behaviour (simple sets, compatible with the re module) as:
-        
-        * Set containing "[" and the letters "a" to "z"
-        
-        * Literal "--"
-        
-        * Set containing letters "a", "e", "i", "o", "u"
-        
-        * Literal "]"
-        
-        but in the version 1 behaviour (nested sets, enhanced behaviour) as:
-        
-        * Set which is:
-        
-          * Set containing the letters "a" to "z"
-        
-        * but excluding:
-        
-          * Set containing the letters "a", "e", "i", "o", "u"
-        
-        Version 0 behaviour: only simple sets are supported.
-        
-        Version 1 behaviour: nested sets and set operations are supported.
-        
-        Flags
-        -----
-        
-        There are 2 kinds of flag: scoped and global. Scoped flags can apply to only part of a pattern and can be turned on or off; global flags apply to the entire pattern and can only be turned on.
-        
-        The scoped flags are: ``FULLCASE``, ``IGNORECASE``, ``MULTILINE``, ``DOTALL``, ``VERBOSE``, ``WORD``.
-        
-        The global flags are: ``ASCII``, ``BESTMATCH``, ``ENHANCEMATCH``, ``LOCALE``, ``POSIX``, ``REVERSE``, ``UNICODE``, ``VERSION0``, ``VERSION1``.
-        
-        If neither the ``ASCII``, ``LOCALE`` nor ``UNICODE`` flag is specified, it will default to ``UNICODE`` if the regex pattern is a Unicode string and ``ASCII`` if it's a bytestring.
-        
-        The ``ENHANCEMATCH`` flag makes fuzzy matching attempt to improve the fit of the next match that it finds.
-        
-        The ``BESTMATCH`` flag makes fuzzy matching search for the best match instead of the next match.
-        
-        Notes on named capture groups
-        -----------------------------
-        
-        All capture groups have a group number, starting from 1.
-        
-        Groups with the same group name will have the same group number, and groups with a different group name will have a different group number.
-        
-        The same name can be used by more than one group, with later captures 'overwriting' earlier captures. All of the captures of the group will be available from the ``captures`` method of the match object.
-        
-        Group numbers will be reused across different branches of a branch reset, eg. ``(?|(first)|(second))`` has only group 1. If capture groups have different group names then they will, of course, have different group numbers, eg. ``(?|(?P<foo>first)|(?P<bar>second))`` has group 1 ("foo") and group 2 ("bar").
-        
-        In the regex ``(\s+)(?|(?P<foo>[A-Z]+)|(\w+) (?P<foo>[0-9]+)`` there are 2 groups:
-        
-        * ``(\s+)`` is group 1.
-        
-        * ``(?P<foo>[A-Z]+)`` is group 2, also called "foo".
-        
-        * ``(\w+)`` is group 2 because of the branch reset.
-        
-        * ``(?P<foo>[0-9]+)`` is group 2 because it's called "foo".
-        
-        If you want to prevent ``(\w+)`` from being group 2, you need to name it (different name, different group number).
-        
-        Multithreading
-        --------------
-        
-        The regex module releases the GIL during matching on instances of the built-in (immutable) string classes, enabling other Python threads to run concurrently. It is also possible to force the regex module to release the GIL during matching by calling the matching methods with the keyword argument ``concurrent=True``. The behaviour is undefined if the string changes during matching, so use it *only* when it is guaranteed that that won't happen.
-        
-        Unicode
-        -------
-        
-        This module supports Unicode 12.1.0.
-        
-        Full Unicode case-folding is supported.
-        
-        Additional features
-        -------------------
-        
-        The issue numbers relate to the Python bug tracker, except where listed as "Hg issue".
-        
-        * Added support for lookaround in conditional pattern (`Hg issue 163 <https://bitbucket.org/mrabarnett/mrab-regex/issues/163>`_)
-        
-          The test of a conditional pattern can now be a lookaround.
-        
-          Examples:
-        
-          .. sourcecode:: python
-        
-            >>> regex.match(r'(?(?=\d)\d+|\w+)', '123abc')
-            <regex.Match object; span=(0, 3), match='123'>
-            >>> regex.match(r'(?(?=\d)\d+|\w+)', 'abc123')
-            <regex.Match object; span=(0, 6), match='abc123'>
-        
-          This is not quite the same as putting a lookaround in the first branch of a pair of alternatives.
-        
-          Examples:
-        
-          .. sourcecode:: python
-        
-            >>> print(regex.match(r'(?:(?=\d)\d+\b|\w+)', '123abc'))
-            <regex.Match object; span=(0, 6), match='123abc'>
-            >>> print(regex.match(r'(?(?=\d)\d+\b|\w+)', '123abc'))
-            None
-        
-          In the first example, the lookaround matched, but the remainder of the first branch failed to match, and so the second branch was attempted, whereas in the second example, the lookaround matched, and the first branch failed to match, but the second branch was **not** attempted.
-        
-        * Added POSIX matching (leftmost longest) (`Hg issue 150 <https://bitbucket.org/mrabarnett/mrab-regex/issues/150>`_)
-        
-          The POSIX standard for regex is to return the leftmost longest match. This can be turned on using the ``POSIX`` flag (``(?p)``).
-        
-          Examples:
-        
-          .. sourcecode:: python
-        
-            >>> # Normal matching.
-            >>> regex.search(r'Mr|Mrs', 'Mrs')
-            <regex.Match object; span=(0, 2), match='Mr'>
-            >>> regex.search(r'one(self)?(selfsufficient)?', 'oneselfsufficient')
-            <regex.Match object; span=(0, 7), match='oneself'>
-            >>> # POSIX matching.
-            >>> regex.search(r'(?p)Mr|Mrs', 'Mrs')
-            <regex.Match object; span=(0, 3), match='Mrs'>
-            >>> regex.search(r'(?p)one(self)?(selfsufficient)?', 'oneselfsufficient')
-            <regex.Match object; span=(0, 17), match='oneselfsufficient'>
-        
-          Note that it will take longer to find matches because when it finds a match at a certain position, it won't return that immediately, but will keep looking to see if there's another longer match there.
-        
-        * Added ``(?(DEFINE)...)`` (`Hg issue 152 <https://bitbucket.org/mrabarnett/mrab-regex/issues/152>`_)
-        
-          If there's no group called "DEFINE", then ... will be ignored, but any group definitions within it will be available.
-        
-          Examples:
-        
-          .. sourcecode:: python
-        
-            >>> regex.search(r'(?(DEFINE)(?P<quant>\d+)(?P<item>\w+))(?&quant) (?&item)', '5 elephants')
-            <regex.Match object; span=(0, 11), match='5 elephants'>
-        
-        * Added ``(*PRUNE)``, ``(*SKIP)`` and ``(*FAIL)`` (`Hg issue 153 <https://bitbucket.org/mrabarnett/mrab-regex/issues/153>`_)
-        
-          ``(*PRUNE)`` discards the backtracking info up to that point. When used in an atomic group or a lookaround, it won't affect the enclosing pattern.
-        
-          ``(*SKIP)`` is similar to ``(*PRUNE)``, except that it also sets where in the text the next attempt to match will start. When used in an atomic group or a lookaround, it won't affect the enclosing pattern.
-        
-          ``(*FAIL)`` causes immediate backtracking. ``(*F)`` is a permitted abbreviation.
-        
-        * Added ``\K`` (`Hg issue 151 <https://bitbucket.org/mrabarnett/mrab-regex/issues/151>`_)
-        
-          Keeps the part of the entire match after the position where ``\K`` occurred; the part before it is discarded.
-        
-          It does not affect what capture groups return.
-        
-          Examples:
-        
-          .. sourcecode:: python
-        
-            >>> m = regex.search(r'(\w\w\K\w\w\w)', 'abcdef')
-            >>> m[0]
-            'cde'
-            >>> m[1]
-            'abcde'
-            >>>
-            >>> m = regex.search(r'(?r)(\w\w\K\w\w\w)', 'abcdef')
-            >>> m[0]
-            'bc'
-            >>> m[1]
-            'bcdef'
-        
-        * Added capture subscripting for ``expandf`` and ``subf``/``subfn`` (`Hg issue 133 <https://bitbucket.org/mrabarnett/mrab-regex/issues/133>`_)
-        
-          You can now use subscripting to get the captures of a repeated capture group.
-        
-          Examples:
-        
-          .. sourcecode:: python
-        
-            >>> m = regex.match(r"(\w)+", "abc")
-            >>> m.expandf("{1}")
-            'c'
-            >>> m.expandf("{1[0]} {1[1]} {1[2]}")
-            'a b c'
-            >>> m.expandf("{1[-1]} {1[-2]} {1[-3]}")
-            'c b a'
-            >>>
-            >>> m = regex.match(r"(?P<letter>\w)+", "abc")
-            >>> m.expandf("{letter}")
-            'c'
-            >>> m.expandf("{letter[0]} {letter[1]} {letter[2]}")
-            'a b c'
-            >>> m.expandf("{letter[-1]} {letter[-2]} {letter[-3]}")
-            'c b a'
-        
-        * Added support for referring to a group by number using ``(?P=...)``.
-        
-          This is in addition to the existing ``\g<...>``.
-        
-        * Fixed the handling of locale-sensitive regexes.
-        
-          The ``LOCALE`` flag is intended for legacy code and has limited support. You're still recommended to use Unicode instead.
-        
-        * Added partial matches (`Hg issue 102 <https://bitbucket.org/mrabarnett/mrab-regex/issues/102>`_)
-        
-          A partial match is one that matches up to the end of string, but that string has been truncated and you want to know whether a complete match could be possible if the string had not been truncated.
-        
-          Partial matches are supported by ``match``, ``search``, ``fullmatch`` and ``finditer`` with the ``partial`` keyword argument.
-        
-          Match objects have a ``partial`` attribute, which is ``True`` if it's a partial match.
-        
-          For example, if you wanted a user to enter a 4-digit number and check it character by character as it was being entered:
-        
-          .. sourcecode:: python
-        
-            >>> pattern = regex.compile(r'\d{4}')
-        
-            >>> # Initially, nothing has been entered:
-            >>> print(pattern.fullmatch('', partial=True))
-            <regex.Match object; span=(0, 0), match='', partial=True>
-        
-            >>> # An empty string is OK, but it's only a partial match.
-            >>> # The user enters a letter:
-            >>> print(pattern.fullmatch('a', partial=True))
-            None
-            >>> # It'll never match.
-        
-            >>> # The user deletes that and enters a digit:
-            >>> print(pattern.fullmatch('1', partial=True))
-            <regex.Match object; span=(0, 1), match='1', partial=True>
-            >>> # It matches this far, but it's only a partial match.
-        
-            >>> # The user enters 2 more digits:
-            >>> print(pattern.fullmatch('123', partial=True))
-            <regex.Match object; span=(0, 3), match='123', partial=True>
-            >>> # It matches this far, but it's only a partial match.
-        
-            >>> # The user enters another digit:
-            >>> print(pattern.fullmatch('1234', partial=True))
-            <regex.Match object; span=(0, 4), match='1234'>
-            >>> # It's a complete match.
-        
-            >>> # If the user enters another digit:
-            >>> print(pattern.fullmatch('12345', partial=True))
-            None
-            >>> # It's no longer a match.
-        
-            >>> # This is a partial match:
-            >>> pattern.match('123', partial=True).partial
-            True
-        
-            >>> # This is a complete match:
-            >>> pattern.match('1233', partial=True).partial
-            False
-        
-        * ``*`` operator not working correctly with sub() (`Hg issue 106 <https://bitbucket.org/mrabarnett/mrab-regex/issues/106>`_)
-        
-          Sometimes it's not clear how zero-width matches should be handled. For example, should ``.*`` match 0 characters directly after matching >0 characters?
-        
-          Examples:
-        
-          .. sourcecode:: python
-        
-            # Python 3.7 and later
-            >>> regex.sub('.*', 'x', 'test')
-            'xx'
-            >>> regex.sub('.*?', '|', 'test')
-            '|||||||||'
-        
-            # Python 3.6 and earlier
-            >>> regex.sub('(?V0).*', 'x', 'test')
-            'x'
-            >>> regex.sub('(?V1).*', 'x', 'test')
-            'xx'
-            >>> regex.sub('(?V0).*?', '|', 'test')
-            '|t|e|s|t|'
-            >>> regex.sub('(?V1).*?', '|', 'test')
-            '|||||||||'
-        
-        * Added ``capturesdict`` (`Hg issue 86 <https://bitbucket.org/mrabarnett/mrab-regex/issues/86>`_)
-        
-          ``capturesdict`` is a combination of ``groupdict`` and ``captures``:
-        
-          ``groupdict`` returns a dict of the named groups and the last capture of those groups.
-        
-          ``captures`` returns a list of all the captures of a group
-        
-          ``capturesdict`` returns a dict of the named groups and lists of all the captures of those groups.
-        
-          Examples:
-        
-          .. sourcecode:: python
-        
-            >>> m = regex.match(r"(?:(?P<word>\w+) (?P<digits>\d+)\n)+", "one 1\ntwo 2\nthree 3\n")
-            >>> m.groupdict()
-            {'word': 'three', 'digits': '3'}
-            >>> m.captures("word")
-            ['one', 'two', 'three']
-            >>> m.captures("digits")
-            ['1', '2', '3']
-            >>> m.capturesdict()
-            {'word': ['one', 'two', 'three'], 'digits': ['1', '2', '3']}
-        
-        * Allow duplicate names of groups (`Hg issue 87 <https://bitbucket.org/mrabarnett/mrab-regex/issues/87>`_)
-        
-          Group names can now be duplicated.
-        
-          Examples:
-        
-          .. sourcecode:: python
-        
-            >>> # With optional groups:
-            >>>
-            >>> # Both groups capture, the second capture 'overwriting' the first.
-            >>> m = regex.match(r"(?P<item>\w+)? or (?P<item>\w+)?", "first or second")
-            >>> m.group("item")
-            'second'
-            >>> m.captures("item")
-            ['first', 'second']
-            >>> # Only the second group captures.
-            >>> m = regex.match(r"(?P<item>\w+)? or (?P<item>\w+)?", " or second")
-            >>> m.group("item")
-            'second'
-            >>> m.captures("item")
-            ['second']
-            >>> # Only the first group captures.
-            >>> m = regex.match(r"(?P<item>\w+)? or (?P<item>\w+)?", "first or ")
-            >>> m.group("item")
-            'first'
-            >>> m.captures("item")
-            ['first']
-            >>>
-            >>> # With mandatory groups:
-            >>>
-            >>> # Both groups capture, the second capture 'overwriting' the first.
-            >>> m = regex.match(r"(?P<item>\w*) or (?P<item>\w*)?", "first or second")
-            >>> m.group("item")
-            'second'
-            >>> m.captures("item")
-            ['first', 'second']
-            >>> # Again, both groups capture, the second capture 'overwriting' the first.
-            >>> m = regex.match(r"(?P<item>\w*) or (?P<item>\w*)", " or second")
-            >>> m.group("item")
-            'second'
-            >>> m.captures("item")
-            ['', 'second']
-            >>> # And yet again, both groups capture, the second capture 'overwriting' the first.
-            >>> m = regex.match(r"(?P<item>\w*) or (?P<item>\w*)", "first or ")
-            >>> m.group("item")
-            ''
-            >>> m.captures("item")
-            ['first', '']
-        
-        * Added ``fullmatch`` (`issue #16203 <https://bugs.python.org/issue16203>`_)
-        
-          ``fullmatch`` behaves like ``match``, except that it must match all of the string.
-        
-          Examples:
-        
-          .. sourcecode:: python
-        
-            >>> print(regex.fullmatch(r"abc", "abc").span())
-            (0, 3)
-            >>> print(regex.fullmatch(r"abc", "abcx"))
-            None
-            >>> print(regex.fullmatch(r"abc", "abcx", endpos=3).span())
-            (0, 3)
-            >>> print(regex.fullmatch(r"abc", "xabcy", pos=1, endpos=4).span())
-            (1, 4)
-            >>>
-            >>> regex.match(r"a.*?", "abcd").group(0)
-            'a'
-            >>> regex.fullmatch(r"a.*?", "abcd").group(0)
-            'abcd'
-        
-        * Added ``subf`` and ``subfn``
-        
-          ``subf`` and ``subfn`` are alternatives to ``sub`` and ``subn`` respectively. When passed a replacement string, they treat it as a format string.
-        
-          Examples:
-        
-          .. sourcecode:: python
-        
-            >>> regex.subf(r"(\w+) (\w+)", "{0} => {2} {1}", "foo bar")
-            'foo bar => bar foo'
-            >>> regex.subf(r"(?P<word1>\w+) (?P<word2>\w+)", "{word2} {word1}", "foo bar")
-            'bar foo'
-        
-        * Added ``expandf`` to match object
-        
-          ``expandf`` is an alternative to ``expand``. When passed a replacement string, it treats it as a format string.
-        
-          Examples:
-        
-          .. sourcecode:: python
-        
-            >>> m = regex.match(r"(\w+) (\w+)", "foo bar")
-            >>> m.expandf("{0} => {2} {1}")
-            'foo bar => bar foo'
-            >>>
-            >>> m = regex.match(r"(?P<word1>\w+) (?P<word2>\w+)", "foo bar")
-            >>> m.expandf("{word2} {word1}")
-            'bar foo'
-        
-        * Detach searched string
-        
-          A match object contains a reference to the string that was searched, via its ``string`` attribute. The ``detach_string`` method will 'detach' that string, making it available for garbage collection, which might save valuable memory if that string is very large.
-        
-          Example:
-        
-          .. sourcecode:: python
-        
-            >>> m = regex.search(r"\w+", "Hello world")
-            >>> print(m.group())
-            Hello
-            >>> print(m.string)
-            Hello world
-            >>> m.detach_string()
-            >>> print(m.group())
-            Hello
-            >>> print(m.string)
-            None
-        
-        * Recursive patterns (`Hg issue 27 <https://bitbucket.org/mrabarnett/mrab-regex/issues/27>`_)
-        
-          Recursive and repeated patterns are supported.
-        
-          ``(?R)`` or ``(?0)`` tries to match the entire regex recursively. ``(?1)``, ``(?2)``, etc, try to match the relevant capture group.
-        
-          ``(?&name)`` tries to match the named capture group.
-        
-          Examples:
-        
-          .. sourcecode:: python
-        
-            >>> regex.match(r"(Tarzan|Jane) loves (?1)", "Tarzan loves Jane").groups()
-            ('Tarzan',)
-            >>> regex.match(r"(Tarzan|Jane) loves (?1)", "Jane loves Tarzan").groups()
-            ('Jane',)
-        
-            >>> m = regex.search(r"(\w)(?:(?R)|(\w?))\1", "kayak")
-            >>> m.group(0, 1, 2)
-            ('kayak', 'k', None)
-        
-          The first two examples show how the subpattern within the capture group is reused, but is _not_ itself a capture group. In other words, ``"(Tarzan|Jane) loves (?1)"`` is equivalent to ``"(Tarzan|Jane) loves (?:Tarzan|Jane)"``.
-        
-          It's possible to backtrack into a recursed or repeated group.
-        
-          You can't call a group if there is more than one group with that group name or group number (``"ambiguous group reference"``).
-        
-          The alternative forms ``(?P>name)`` and ``(?P&name)`` are also supported.
-        
-        * Full Unicode case-folding is supported.
-        
-          In version 1 behaviour, the regex module uses full case-folding when performing case-insensitive matches in Unicode.
-        
-          Examples (in Python 3):
-        
-          .. sourcecode:: python
-        
-            >>> regex.match(r"(?iV1)strasse", "stra\N{LATIN SMALL LETTER SHARP S}e").span()
-            (0, 6)
-            >>> regex.match(r"(?iV1)stra\N{LATIN SMALL LETTER SHARP S}e", "STRASSE").span()
-            (0, 7)
-        
-          In version 0 behaviour, it uses simple case-folding for backward compatibility with the re module.
-        
-        * Approximate "fuzzy" matching (`Hg issue 12 <https://bitbucket.org/mrabarnett/mrab-regex/issues/12>`_, `Hg issue 41 <https://bitbucket.org/mrabarnett/mrab-regex/issues/41>`_, `Hg issue 109 <https://bitbucket.org/mrabarnett/mrab-regex/issues/109>`_)
-        
-          Regex usually attempts an exact match, but sometimes an approximate, or "fuzzy", match is needed, for those cases where the text being searched may contain errors in the form of inserted, deleted or substituted characters.
-        
-          A fuzzy regex specifies which types of errors are permitted, and, optionally, either the minimum and maximum or only the maximum permitted number of each type. (You cannot specify only a minimum.)
-        
-          The 3 types of error are:
-        
-          * Insertion, indicated by "i"
-        
-          * Deletion, indicated by "d"
-        
-          * Substitution, indicated by "s"
-        
-          In addition, "e" indicates any type of error.
-        
-          The fuzziness of a regex item is specified between "{" and "}" after the item.
-        
-          Examples:
-        
-          * ``foo`` match "foo" exactly
-        
-          * ``(?:foo){i}`` match "foo", permitting insertions
-        
-          * ``(?:foo){d}`` match "foo", permitting deletions
-        
-          * ``(?:foo){s}`` match "foo", permitting substitutions
-        
-          * ``(?:foo){i,s}`` match "foo", permitting insertions and substitutions
-        
-          * ``(?:foo){e}`` match "foo", permitting errors
-        
-          If a certain type of error is specified, then any type not specified will **not** be permitted.
-        
-          In the following examples I'll omit the item and write only the fuzziness:
-        
-          * ``{d<=3}`` permit at most 3 deletions, but no other types
-        
-          * ``{i<=1,s<=2}`` permit at most 1 insertion and at most 2 substitutions, but no deletions
-        
-          * ``{1<=e<=3}`` permit at least 1 and at most 3 errors
-        
-          * ``{i<=2,d<=2,e<=3}`` permit at most 2 insertions, at most 2 deletions, at most 3 errors in total, but no substitutions
-        
-          It's also possible to state the costs of each type of error and the maximum permitted total cost.
-        
-          Examples:
-        
-          * ``{2i+2d+1s<=4}`` each insertion costs 2, each deletion costs 2, each substitution costs 1, the total cost must not exceed 4
-        
-          * ``{i<=1,d<=1,s<=1,2i+2d+1s<=4}`` at most 1 insertion, at most 1 deletion, at most 1 substitution; each insertion costs 2, each deletion costs 2, each substitution costs 1, the total cost must not exceed 4
-        
-          You can also use "<" instead of "<=" if you want an exclusive minimum or maximum.
-        
-          You can add a test to perform on a character that's substituted or inserted.
-        
-          Examples:
-        
-          * ``{s<=2:[a-z]}`` at most 2 substitutions, which must be in the character set ``[a-z]``.
-        
-          * ``{s<=2,i<=3:\d}`` at most 2 substitutions, at most 3 insertions, which must be digits.
-        
-          By default, fuzzy matching searches for the first match that meets the given constraints. The ``ENHANCEMATCH`` flag will cause it to attempt to improve the fit (i.e. reduce the number of errors) of the match that it has found.
-        
-          The ``BESTMATCH`` flag will make it search for the best match instead.
-        
-          Further examples to note:
-        
-          * ``regex.search("(dog){e}", "cat and dog")[1]`` returns ``"cat"`` because that matches ``"dog"`` with 3 errors (an unlimited number of errors is permitted).
-        
-          * ``regex.search("(dog){e<=1}", "cat and dog")[1]`` returns ``" dog"`` (with a leading space) because that matches ``"dog"`` with 1 error, which is within the limit.
-        
-          * ``regex.search("(?e)(dog){e<=1}", "cat and dog")[1]`` returns ``"dog"`` (without a leading space) because the fuzzy search matches ``" dog"`` with 1 error, which is within the limit, and the ``(?e)`` then it attempts a better fit.
-        
-          In the first two examples there are perfect matches later in the string, but in neither case is it the first possible match.
-        
-          The match object has an attribute ``fuzzy_counts`` which gives the total number of substitutions, insertions and deletions.
-        
-          .. sourcecode:: python
-        
-            >>> # A 'raw' fuzzy match:
-            >>> regex.fullmatch(r"(?:cats|cat){e<=1}", "cat").fuzzy_counts
-            (0, 0, 1)
-            >>> # 0 substitutions, 0 insertions, 1 deletion.
-        
-            >>> # A better match might be possible if the ENHANCEMATCH flag used:
-            >>> regex.fullmatch(r"(?e)(?:cats|cat){e<=1}", "cat").fuzzy_counts
-            (0, 0, 0)
-            >>> # 0 substitutions, 0 insertions, 0 deletions.
-        
-          The match object also has an attribute ``fuzzy_changes`` which gives a tuple of the positions of the substitutions, insertions and deletions.
-        
-          .. sourcecode:: python
-        
-            >>> m = regex.search('(fuu){i<=2,d<=2,e<=5}', 'anaconda foo bar')
-            >>> m
-            <regex.Match object; span=(7, 10), match='a f', fuzzy_counts=(0, 2, 2)>
-            >>> m.fuzzy_changes
-            ([], [7, 8], [10, 11])
-        
-          What this means is that if the matched part of the string had been:
-        
-          .. sourcecode:: python
-        
-            'anacondfuuoo bar'
-        
-          it would've been an exact match.
-        
-          However, there were insertions at positions 7 and 8:
-        
-          .. sourcecode:: python
-        
-            'anaconda fuuoo bar'
-                    ^^
-        
-          and deletions at positions 10 and 11:
-        
-          .. sourcecode:: python
-        
-            'anaconda f~~oo bar'
-                       ^^
-        
-          So the actual string was:
-        
-          .. sourcecode:: python
-        
-            'anaconda foo bar'
-        
-        * Named lists (`Hg issue 11 <https://bitbucket.org/mrabarnett/mrab-regex/issues/11>`_)
-        
-          ``\L<name>``
-        
-          There are occasions where you may want to include a list (actually, a set) of options in a regex.
-        
-          One way is to build the pattern like this:
-        
-          .. sourcecode:: python
-        
-            >>> p = regex.compile(r"first|second|third|fourth|fifth")
-        
-          but if the list is large, parsing the resulting regex can take considerable time, and care must also be taken that the strings are properly escaped and properly ordered, for example, "cats" before "cat".
-        
-          The new alternative is to use a named list:
-        
-          .. sourcecode:: python
-        
-            >>> option_set = ["first", "second", "third", "fourth", "fifth"]
-            >>> p = regex.compile(r"\L<options>", options=option_set)
-        
-          The order of the items is irrelevant, they are treated as a set. The named lists are available as the ``.named_lists`` attribute of the pattern object :
-        
-          .. sourcecode:: python
-        
-            >>> print(p.named_lists)
-            # Python 3
-            {'options': frozenset({'fifth', 'first', 'fourth', 'second', 'third'})}
-            # Python 2
-            {'options': frozenset(['fifth', 'fourth', 'second', 'third', 'first'])}
-        
-        * Start and end of word
-        
-          ``\m`` matches at the start of a word.
-        
-          ``\M`` matches at the end of a word.
-        
-          Compare with ``\b``, which matches at the start or end of a word.
-        
-        * Unicode line separators
-        
-          Normally the only line separator is ``\n`` (``\x0A``), but if the ``WORD`` flag is turned on then the line separators are ``\x0D\x0A``, ``\x0A``, ``\x0B``, ``\x0C`` and ``\x0D``, plus ``\x85``, ``\u2028`` and ``\u2029`` when working with Unicode.
-        
-          This affects the regex dot ``"."``, which, with the ``DOTALL`` flag turned off, matches any character except a line separator. It also affects the line anchors ``^`` and ``$`` (in multiline mode).
-        
-        * Set operators
-        
-          **Version 1 behaviour only**
-        
-          Set operators have been added, and a set ``[...]`` can include nested sets.
-        
-          The operators, in order of increasing precedence, are:
-        
-          * ``||`` for union ("x||y" means "x or y")
-        
-          * ``~~`` (double tilde) for symmetric difference ("x~~y" means "x or y, but not both")
-        
-          * ``&&`` for intersection ("x&&y" means "x and y")
-        
-          * ``--`` (double dash) for difference ("x--y" means "x but not y")
-        
-          Implicit union, ie, simple juxtaposition like in ``[ab]``, has the highest precedence. Thus, ``[ab&&cd]`` is the same as ``[[a||b]&&[c||d]]``.
-        
-          Examples:
-        
-          * ``[ab]`` # Set containing 'a' and 'b'
-        
-          * ``[a-z]`` # Set containing 'a' .. 'z'
-        
-          * ``[[a-z]--[qw]]`` # Set containing 'a' .. 'z', but not 'q' or 'w'
-        
-          * ``[a-z--qw]`` # Same as above
-        
-          * ``[\p{L}--QW]`` # Set containing all letters except 'Q' and 'W'
-        
-          * ``[\p{N}--[0-9]]`` # Set containing all numbers except '0' .. '9'
-        
-          * ``[\p{ASCII}&&\p{Letter}]`` # Set containing all characters which are ASCII and letter
-        
-        * regex.escape (`issue #2650 <https://bugs.python.org/issue2650>`_)
-        
-          regex.escape has an additional keyword parameter ``special_only``. When True, only 'special' regex characters, such as '?', are escaped.
-        
-          Examples:
-        
-          .. sourcecode:: python
-        
-            >>> regex.escape("foo!?", special_only=False)
-            'foo\\!\\?'
-            >>> regex.escape("foo!?", special_only=True)
-            'foo!\\?'
-        
-        * regex.escape (`Hg issue 249 <https://bitbucket.org/mrabarnett/mrab-regex/issues/249>`_)
-        
-          regex.escape has an additional keyword parameter ``literal_spaces``. When True, spaces are not escaped.
-        
-          Examples:
-        
-          .. sourcecode:: python
-        
-            >>> regex.escape("foo bar!?", literal_spaces=False)
-            'foo\\ bar!\\?'
-            >>> regex.escape("foo bar!?", literal_spaces=True)
-            'foo bar!\\?'
-        
-        * Repeated captures (`issue #7132 <https://bugs.python.org/issue7132>`_)
-        
-          A match object has additional methods which return information on all the successful matches of a repeated capture group. These methods are:
-        
-          * ``matchobject.captures([group1, ...])``
-        
-            * Returns a list of the strings matched in a group or groups. Compare with ``matchobject.group([group1, ...])``.
-        
-          * ``matchobject.starts([group])``
-        
-            * Returns a list of the start positions. Compare with ``matchobject.start([group])``.
-        
-          * ``matchobject.ends([group])``
-        
-            * Returns a list of the end positions. Compare with ``matchobject.end([group])``.
-        
-          * ``matchobject.spans([group])``
-        
-            * Returns a list of the spans. Compare with ``matchobject.span([group])``.
-        
-          Examples:
-        
-          .. sourcecode:: python
-        
-            >>> m = regex.search(r"(\w{3})+", "123456789")
-            >>> m.group(1)
-            '789'
-            >>> m.captures(1)
-            ['123', '456', '789']
-            >>> m.start(1)
-            6
-            >>> m.starts(1)
-            [0, 3, 6]
-            >>> m.end(1)
-            9
-            >>> m.ends(1)
-            [3, 6, 9]
-            >>> m.span(1)
-            (6, 9)
-            >>> m.spans(1)
-            [(0, 3), (3, 6), (6, 9)]
-        
-        * Atomic grouping (`issue #433030 <https://bugs.python.org/issue433030>`_)
-        
-          ``(?>...)``
-        
-          If the following pattern subsequently fails, then the subpattern as a whole will fail.
-        
-        * Possessive quantifiers.
-        
-          ``(?:...)?+`` ; ``(?:...)*+`` ; ``(?:...)++`` ; ``(?:...){min,max}+``
-        
-          The subpattern is matched up to 'max' times. If the following pattern subsequently fails, then all of the repeated subpatterns will fail as a whole. For example, ``(?:...)++`` is equivalent to ``(?>(?:...)+)``.
-        
-        * Scoped flags (`issue #433028 <https://bugs.python.org/issue433028>`_)
-        
-          ``(?flags-flags:...)``
-        
-          The flags will apply only to the subpattern. Flags can be turned on or off.
-        
-        * Definition of 'word' character (`issue #1693050 <https://bugs.python.org/issue1693050>`_)
-        
-          The definition of a 'word' character has been expanded for Unicode. It now conforms to the Unicode specification at ``http://www.unicode.org/reports/tr29/``.
-        
-        * Variable-length lookbehind
-        
-          A lookbehind can match a variable-length string.
-        
-        * Flags argument for regex.split, regex.sub and regex.subn (`issue #3482 <https://bugs.python.org/issue3482>`_)
-        
-          ``regex.split``, ``regex.sub`` and ``regex.subn`` support a 'flags' argument.
-        
-        * Pos and endpos arguments for regex.sub and regex.subn
-        
-          ``regex.sub`` and ``regex.subn`` support 'pos' and 'endpos' arguments.
-        
-        * 'Overlapped' argument for regex.findall and regex.finditer
-        
-          ``regex.findall`` and ``regex.finditer`` support an 'overlapped' flag which permits overlapped matches.
-        
-        * Splititer
-        
-          ``regex.splititer`` has been added. It's a generator equivalent of ``regex.split``.
-        
-        * Subscripting for groups
-        
-          A match object accepts access to the captured groups via subscripting and slicing:
-        
-          .. sourcecode:: python
-        
-            >>> m = regex.search(r"(?P<before>.*?)(?P<num>\d+)(?P<after>.*)", "pqr123stu")
-            >>> print(m["before"])
-            pqr
-            >>> print(len(m))
-            4
-            >>> print(m[:])
-            ('pqr123stu', 'pqr', '123', 'stu')
-        
-        * Named groups
-        
-          Groups can be named with ``(?<name>...)`` as well as the current ``(?P<name>...)``.
-        
-        * Group references
-        
-          Groups can be referenced within a pattern with ``\g<name>``. This also allows there to be more than 99 groups.
-        
-        * Named characters
-        
-          ``\N{name}``
-        
-          Named characters are supported. (Note: only those known by Python's Unicode database are supported.)
-        
-        * Unicode codepoint properties, including scripts and blocks
-        
-          ``\p{property=value}``; ``\P{property=value}``; ``\p{value}`` ; ``\P{value}``
-        
-          Many Unicode properties are supported, including blocks and scripts. ``\p{property=value}`` or ``\p{property:value}`` matches a character whose property ``property`` has value ``value``. The inverse of ``\p{property=value}`` is ``\P{property=value}`` or ``\p{^property=value}``.
-        
-          If the short form ``\p{value}`` is used, the properties are checked in the order: ``General_Category``, ``Script``, ``Block``, binary property:
-        
-          * ``Latin``, the 'Latin' script (``Script=Latin``).
-        
-          * ``BasicLatin``, the 'BasicLatin' block (``Block=BasicLatin``).
-        
-          * ``Alphabetic``, the 'Alphabetic' binary property (``Alphabetic=Yes``).
-        
-          A short form starting with ``Is`` indicates a script or binary property:
-        
-          * ``IsLatin``, the 'Latin' script (``Script=Latin``).
-        
-          * ``IsAlphabetic``, the 'Alphabetic' binary property (``Alphabetic=Yes``).
-        
-          A short form starting with ``In`` indicates a block property:
-        
-          * ``InBasicLatin``, the 'BasicLatin' block (``Block=BasicLatin``).
-        
-        * POSIX character classes
-        
-          ``[[:alpha:]]``; ``[[:^alpha:]]``
-        
-          POSIX character classes are supported. These are normally treated as an alternative form of ``\p{...}``.
-        
-          The exceptions are ``alnum``, ``digit``, ``punct`` and ``xdigit``, whose definitions are different from those of Unicode.
-        
-          ``[[:alnum:]]`` is equivalent to ``\p{posix_alnum}``.
-        
-          ``[[:digit:]]`` is equivalent to ``\p{posix_digit}``.
-        
-          ``[[:punct:]]`` is equivalent to ``\p{posix_punct}``.
-        
-          ``[[:xdigit:]]`` is equivalent to ``\p{posix_xdigit}``.
-        
-        * Search anchor
-        
-          ``\G``
-        
-          A search anchor has been added. It matches at the position where each search started/continued and can be used for contiguous matches or in negative variable-length lookbehinds to limit how far back the lookbehind goes:
-        
-          .. sourcecode:: python
-        
-            >>> regex.findall(r"\w{2}", "abcd ef")
-            ['ab', 'cd', 'ef']
-            >>> regex.findall(r"\G\w{2}", "abcd ef")
-            ['ab', 'cd']
-        
-          * The search starts at position 0 and matches 2 letters 'ab'.
-        
-          * The search continues at position 2 and matches 2 letters 'cd'.
-        
-          * The search continues at position 4 and fails to match any letters.
-        
-          * The anchor stops the search start position from being advanced, so there are no more results.
-        
-        * Reverse searching
-        
-          Searches can now work backwards:
-        
-          .. sourcecode:: python
-        
-            >>> regex.findall(r".", "abc")
-            ['a', 'b', 'c']
-            >>> regex.findall(r"(?r).", "abc")
-            ['c', 'b', 'a']
-        
-          Note: the result of a reverse search is not necessarily the reverse of a forward search:
-        
-          .. sourcecode:: python
-        
-            >>> regex.findall(r"..", "abcde")
-            ['ab', 'cd']
-            >>> regex.findall(r"(?r)..", "abcde")
-            ['de', 'bc']
-        
-        * Matching a single grapheme
-        
-          ``\X``
-        
-          The grapheme matcher is supported. It now conforms to the Unicode specification at ``http://www.unicode.org/reports/tr29/``.
-        
-        * Branch reset
-        
-          ``(?|...|...)``
-        
-          Capture group numbers will be reused across the alternatives, but groups with different names will have different group numbers.
-        
-          Examples:
-        
-          .. sourcecode:: python
-        
-            >>> regex.match(r"(?|(first)|(second))", "first").groups()
-            ('first',)
-            >>> regex.match(r"(?|(first)|(second))", "second").groups()
-            ('second',)
-        
-          Note that there is only one group.
-        
-        * Default Unicode word boundary
-        
-          The ``WORD`` flag changes the definition of a 'word boundary' to that of a default Unicode word boundary. This applies to ``\b`` and ``\B``.
-        
-        * Timeout (Python 3)
-        
-          The matching methods and functions support timeouts. The timeout (in seconds) applies to the entire operation:
-        
-          .. sourcecode:: python
-        
-            >>> from time import sleep
-            >>>
-            >>> def fast_replace(m):
-            ...     return 'X'
-            ...
-            >>> def slow_replace(m):
-            ...     sleep(0.5)
-            ...     return 'X'
-            ...
-            >>> regex.sub(r'[a-z]', fast_replace, 'abcde', timeout=2)
-            'XXXXX'
-            >>> regex.sub(r'[a-z]', slow_replace, 'abcde', timeout=2)
-            Traceback (most recent call last):
-              File "<stdin>", line 1, in <module>
-              File "C:\Python37\lib\site-packages\regex\regex.py", line 276, in sub
-                endpos, concurrent, timeout)
-            TimeoutError: regex timed out
-Platform: UNKNOWN
-Classifier: Development Status :: 5 - Production/Stable
-Classifier: Intended Audience :: Developers
-Classifier: License :: OSI Approved :: Python Software Foundation License
-Classifier: Operating System :: OS Independent
-Classifier: Programming Language :: Python :: 2
-Classifier: Programming Language :: Python :: 2.7
-Classifier: Programming Language :: Python :: 3
-Classifier: Programming Language :: Python :: 3.5
-Classifier: Programming Language :: Python :: 3.6
-Classifier: Programming Language :: Python :: 3.7
-Classifier: Programming Language :: Python :: 3.8
-Classifier: Topic :: Scientific/Engineering :: Information Analysis
-Classifier: Topic :: Software Development :: Libraries :: Python Modules
-Classifier: Topic :: Text Processing
-Classifier: Topic :: Text Processing :: General
+Metadata-Version: 1.1
+Name: regex
+Version: 2020.7.14
+Summary: Alternative regular expression module, to replace re.
+Home-page: https://bitbucket.org/mrabarnett/mrab-regex
+Author: Matthew Barnett
+Author-email: regex@mrabarnett.plus.com
+License: Python Software Foundation License
+Description: Introduction
+        ------------
+        
+        This regex implementation is backwards-compatible with the standard 're' module, but offers additional functionality.
+        
+        Note
+        ----
+        
+        The re module's behaviour with zero-width matches changed in Python 3.7, and this module will follow that behaviour when compiled for Python 3.7.
+        
+        Old vs new behaviour
+        --------------------
+        
+        In order to be compatible with the re module, this module has 2 behaviours:
+        
+        * **Version 0** behaviour (old behaviour, compatible with the re module):
+        
+          Please note that the re module's behaviour may change over time, and I'll endeavour to match that behaviour in version 0.
+        
+          * Indicated by the ``VERSION0`` or ``V0`` flag, or ``(?V0)`` in the pattern.
+        
+          * Zero-width matches are not handled correctly in the re module before Python 3.7. The behaviour in those earlier versions is:
+        
+            * ``.split`` won't split a string at a zero-width match.
+        
+            * ``.sub`` will advance by one character after a zero-width match.
+        
+          * Inline flags apply to the entire pattern, and they can't be turned off.
+        
+          * Only simple sets are supported.
+        
+          * Case-insensitive matches in Unicode use simple case-folding by default.
+        
+        * **Version 1** behaviour (new behaviour, possibly different from the re module):
+        
+          * Indicated by the ``VERSION1`` or ``V1`` flag, or ``(?V1)`` in the pattern.
+        
+          * Zero-width matches are handled correctly.
+        
+          * Inline flags apply to the end of the group or pattern, and they can be turned off.
+        
+          * Nested sets and set operations are supported.
+        
+          * Case-insensitive matches in Unicode use full case-folding by default.
+        
+        If no version is specified, the regex module will default to ``regex.DEFAULT_VERSION``.
+        
+        Case-insensitive matches in Unicode
+        -----------------------------------
+        
+        The regex module supports both simple and full case-folding for case-insensitive matches in Unicode. Use of full case-folding can be turned on using the ``FULLCASE`` or ``F`` flag, or ``(?f)`` in the pattern. Please note that this flag affects how the ``IGNORECASE`` flag works; the ``FULLCASE`` flag itself does not turn on case-insensitive matching.
+        
+        In the version 0 behaviour, the flag is off by default.
+        
+        In the version 1 behaviour, the flag is on by default.
+        
+        Nested sets and set operations
+        ------------------------------
+        
+        It's not possible to support both simple sets, as used in the re module, and nested sets at the same time because of a difference in the meaning of an unescaped ``"["`` in a set.
+        
+        For example, the pattern ``[[a-z]--[aeiou]]`` is treated in the version 0 behaviour (simple sets, compatible with the re module) as:
+        
+        * Set containing "[" and the letters "a" to "z"
+        
+        * Literal "--"
+        
+        * Set containing letters "a", "e", "i", "o", "u"
+        
+        * Literal "]"
+        
+        but in the version 1 behaviour (nested sets, enhanced behaviour) as:
+        
+        * Set which is:
+        
+          * Set containing the letters "a" to "z"
+        
+        * but excluding:
+        
+          * Set containing the letters "a", "e", "i", "o", "u"
+        
+        Version 0 behaviour: only simple sets are supported.
+        
+        Version 1 behaviour: nested sets and set operations are supported.
+        
+        Flags
+        -----
+        
+        There are 2 kinds of flag: scoped and global. Scoped flags can apply to only part of a pattern and can be turned on or off; global flags apply to the entire pattern and can only be turned on.
+        
+        The scoped flags are: ``FULLCASE``, ``IGNORECASE``, ``MULTILINE``, ``DOTALL``, ``VERBOSE``, ``WORD``.
+        
+        The global flags are: ``ASCII``, ``BESTMATCH``, ``ENHANCEMATCH``, ``LOCALE``, ``POSIX``, ``REVERSE``, ``UNICODE``, ``VERSION0``, ``VERSION1``.
+        
+        If neither the ``ASCII``, ``LOCALE`` nor ``UNICODE`` flag is specified, it will default to ``UNICODE`` if the regex pattern is a Unicode string and ``ASCII`` if it's a bytestring.
+        
+        The ``ENHANCEMATCH`` flag makes fuzzy matching attempt to improve the fit of the next match that it finds.
+        
+        The ``BESTMATCH`` flag makes fuzzy matching search for the best match instead of the next match.
+        
+        Notes on named capture groups
+        -----------------------------
+        
+        All capture groups have a group number, starting from 1.
+        
+        Groups with the same group name will have the same group number, and groups with a different group name will have a different group number.
+        
+        The same name can be used by more than one group, with later captures 'overwriting' earlier captures. All of the captures of the group will be available from the ``captures`` method of the match object.
+        
+        Group numbers will be reused across different branches of a branch reset, eg. ``(?|(first)|(second))`` has only group 1. If capture groups have different group names then they will, of course, have different group numbers, eg. ``(?|(?P<foo>first)|(?P<bar>second))`` has group 1 ("foo") and group 2 ("bar").
+        
+        In the regex ``(\s+)(?|(?P<foo>[A-Z]+)|(\w+) (?P<foo>[0-9]+)`` there are 2 groups:
+        
+        * ``(\s+)`` is group 1.
+        
+        * ``(?P<foo>[A-Z]+)`` is group 2, also called "foo".
+        
+        * ``(\w+)`` is group 2 because of the branch reset.
+        
+        * ``(?P<foo>[0-9]+)`` is group 2 because it's called "foo".
+        
+        If you want to prevent ``(\w+)`` from being group 2, you need to name it (different name, different group number).
+        
+        Multithreading
+        --------------
+        
+        The regex module releases the GIL during matching on instances of the built-in (immutable) string classes, enabling other Python threads to run concurrently. It is also possible to force the regex module to release the GIL during matching by calling the matching methods with the keyword argument ``concurrent=True``. The behaviour is undefined if the string changes during matching, so use it *only* when it is guaranteed that that won't happen.
+        
+        Unicode
+        -------
+        
+        This module supports Unicode 13.0.0.
+        
+        Full Unicode case-folding is supported.
+        
+        Additional features
+        -------------------
+        
+        The issue numbers relate to the Python bug tracker, except where listed as "Hg issue".
+        
+        Added support for lookaround in conditional pattern (`Hg issue 163 <https://bitbucket.org/mrabarnett/mrab-regex/issues/163>`_)
+        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+        
+        The test of a conditional pattern can now be a lookaround.
+        
+        Examples:
+        
+        .. sourcecode:: python
+        
+          >>> regex.match(r'(?(?=\d)\d+|\w+)', '123abc')
+          <regex.Match object; span=(0, 3), match='123'>
+          >>> regex.match(r'(?(?=\d)\d+|\w+)', 'abc123')
+          <regex.Match object; span=(0, 6), match='abc123'>
+        
+        This is not quite the same as putting a lookaround in the first branch of a pair of alternatives.
+        
+        Examples:
+        
+        .. sourcecode:: python
+        
+          >>> print(regex.match(r'(?:(?=\d)\d+\b|\w+)', '123abc'))
+          <regex.Match object; span=(0, 6), match='123abc'>
+          >>> print(regex.match(r'(?(?=\d)\d+\b|\w+)', '123abc'))
+          None
+        
+        In the first example, the lookaround matched, but the remainder of the first branch failed to match, and so the second branch was attempted, whereas in the second example, the lookaround matched, and the first branch failed to match, but the second branch was **not** attempted.
+        
+        Added POSIX matching (leftmost longest) (`Hg issue 150 <https://bitbucket.org/mrabarnett/mrab-regex/issues/150>`_)
+        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+        
+        The POSIX standard for regex is to return the leftmost longest match. This can be turned on using the ``POSIX`` flag (``(?p)``).
+        
+        Examples:
+        
+        .. sourcecode:: python
+        
+          >>> # Normal matching.
+          >>> regex.search(r'Mr|Mrs', 'Mrs')
+          <regex.Match object; span=(0, 2), match='Mr'>
+          >>> regex.search(r'one(self)?(selfsufficient)?', 'oneselfsufficient')
+          <regex.Match object; span=(0, 7), match='oneself'>
+          >>> # POSIX matching.
+          >>> regex.search(r'(?p)Mr|Mrs', 'Mrs')
+          <regex.Match object; span=(0, 3), match='Mrs'>
+          >>> regex.search(r'(?p)one(self)?(selfsufficient)?', 'oneselfsufficient')
+          <regex.Match object; span=(0, 17), match='oneselfsufficient'>
+        
+        Note that it will take longer to find matches because when it finds a match at a certain position, it won't return that immediately, but will keep looking to see if there's another longer match there.
+        
+        Added ``(?(DEFINE)...)`` (`Hg issue 152 <https://bitbucket.org/mrabarnett/mrab-regex/issues/152>`_)
+        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+        
+        If there's no group called "DEFINE", then ... will be ignored, but any group definitions within it will be available.
+        
+        Examples:
+        
+        .. sourcecode:: python
+        
+          >>> regex.search(r'(?(DEFINE)(?P<quant>\d+)(?P<item>\w+))(?&quant) (?&item)', '5 elephants')
+          <regex.Match object; span=(0, 11), match='5 elephants'>
+        
+        Added ``(*PRUNE)``, ``(*SKIP)`` and ``(*FAIL)`` (`Hg issue 153 <https://bitbucket.org/mrabarnett/mrab-regex/issues/153>`_)
+        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+        
+        ``(*PRUNE)`` discards the backtracking info up to that point. When used in an atomic group or a lookaround, it won't affect the enclosing pattern.
+        
+        ``(*SKIP)`` is similar to ``(*PRUNE)``, except that it also sets where in the text the next attempt to match will start. When used in an atomic group or a lookaround, it won't affect the enclosing pattern.
+        
+        ``(*FAIL)`` causes immediate backtracking. ``(*F)`` is a permitted abbreviation.
+        
+        Added ``\K`` (`Hg issue 151 <https://bitbucket.org/mrabarnett/mrab-regex/issues/151>`_)
+        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+        
+        Keeps the part of the entire match after the position where ``\K`` occurred; the part before it is discarded.
+        
+        It does not affect what capture groups return.
+        
+        Examples:
+        
+        .. sourcecode:: python
+        
+          >>> m = regex.search(r'(\w\w\K\w\w\w)', 'abcdef')
+          >>> m[0]
+          'cde'
+          >>> m[1]
+          'abcde'
+          >>>
+          >>> m = regex.search(r'(?r)(\w\w\K\w\w\w)', 'abcdef')
+          >>> m[0]
+          'bc'
+          >>> m[1]
+          'bcdef'
+        
+        Added capture subscripting for ``expandf`` and ``subf``/``subfn`` (`Hg issue 133 <https://bitbucket.org/mrabarnett/mrab-regex/issues/133>`_)
+        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+        
+        You can now use subscripting to get the captures of a repeated capture group.
+        
+        Examples:
+        
+        .. sourcecode:: python
+        
+          >>> m = regex.match(r"(\w)+", "abc")
+          >>> m.expandf("{1}")
+          'c'
+          >>> m.expandf("{1[0]} {1[1]} {1[2]}")
+          'a b c'
+          >>> m.expandf("{1[-1]} {1[-2]} {1[-3]}")
+          'c b a'
+          >>>
+          >>> m = regex.match(r"(?P<letter>\w)+", "abc")
+          >>> m.expandf("{letter}")
+          'c'
+          >>> m.expandf("{letter[0]} {letter[1]} {letter[2]}")
+          'a b c'
+          >>> m.expandf("{letter[-1]} {letter[-2]} {letter[-3]}")
+          'c b a'
+        
+        Added support for referring to a group by number using ``(?P=...)``.
+        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+        
+        This is in addition to the existing ``\g<...>``.
+        
+        Fixed the handling of locale-sensitive regexes.
+        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+        
+        The ``LOCALE`` flag is intended for legacy code and has limited support. You're still recommended to use Unicode instead.
+        
+        Added partial matches (`Hg issue 102 <https://bitbucket.org/mrabarnett/mrab-regex/issues/102>`_)
+        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+        
+        A partial match is one that matches up to the end of string, but that string has been truncated and you want to know whether a complete match could be possible if the string had not been truncated.
+        
+        Partial matches are supported by ``match``, ``search``, ``fullmatch`` and ``finditer`` with the ``partial`` keyword argument.
+        
+        Match objects have a ``partial`` attribute, which is ``True`` if it's a partial match.
+        
+        For example, if you wanted a user to enter a 4-digit number and check it character by character as it was being entered:
+        
+        .. sourcecode:: python
+        
+          >>> pattern = regex.compile(r'\d{4}')
+        
+          >>> # Initially, nothing has been entered:
+          >>> print(pattern.fullmatch('', partial=True))
+          <regex.Match object; span=(0, 0), match='', partial=True>
+        
+          >>> # An empty string is OK, but it's only a partial match.
+          >>> # The user enters a letter:
+          >>> print(pattern.fullmatch('a', partial=True))
+          None
+          >>> # It'll never match.
+        
+          >>> # The user deletes that and enters a digit:
+          >>> print(pattern.fullmatch('1', partial=True))
+          <regex.Match object; span=(0, 1), match='1', partial=True>
+          >>> # It matches this far, but it's only a partial match.
+        
+          >>> # The user enters 2 more digits:
+          >>> print(pattern.fullmatch('123', partial=True))
+          <regex.Match object; span=(0, 3), match='123', partial=True>
+          >>> # It matches this far, but it's only a partial match.
+        
+          >>> # The user enters another digit:
+          >>> print(pattern.fullmatch('1234', partial=True))
+          <regex.Match object; span=(0, 4), match='1234'>
+          >>> # It's a complete match.
+        
+          >>> # If the user enters another digit:
+          >>> print(pattern.fullmatch('12345', partial=True))
+          None
+          >>> # It's no longer a match.
+        
+          >>> # This is a partial match:
+          >>> pattern.match('123', partial=True).partial
+          True
+        
+          >>> # This is a complete match:
+          >>> pattern.match('1233', partial=True).partial
+          False
+        
+        ``*`` operator not working correctly with sub() (`Hg issue 106 <https://bitbucket.org/mrabarnett/mrab-regex/issues/106>`_)
+        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+        
+        Sometimes it's not clear how zero-width matches should be handled. For example, should ``.*`` match 0 characters directly after matching >0 characters?
+        
+        Examples:
+        
+        .. sourcecode:: python
+        
+          # Python 3.7 and later
+          >>> regex.sub('.*', 'x', 'test')
+          'xx'
+          >>> regex.sub('.*?', '|', 'test')
+          '|||||||||'
+        
+          # Python 3.6 and earlier
+          >>> regex.sub('(?V0).*', 'x', 'test')
+          'x'
+          >>> regex.sub('(?V1).*', 'x', 'test')
+          'xx'
+          >>> regex.sub('(?V0).*?', '|', 'test')
+          '|t|e|s|t|'
+          >>> regex.sub('(?V1).*?', '|', 'test')
+          '|||||||||'
+        
+        Added ``capturesdict`` (`Hg issue 86 <https://bitbucket.org/mrabarnett/mrab-regex/issues/86>`_)
+        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+        
+        ``capturesdict`` is a combination of ``groupdict`` and ``captures``:
+        
+        ``groupdict`` returns a dict of the named groups and the last capture of those groups.
+        
+        ``captures`` returns a list of all the captures of a group
+        
+        ``capturesdict`` returns a dict of the named groups and lists of all the captures of those groups.
+        
+        Examples:
+        
+        .. sourcecode:: python
+        
+          >>> m = regex.match(r"(?:(?P<word>\w+) (?P<digits>\d+)\n)+", "one 1\ntwo 2\nthree 3\n")
+          >>> m.groupdict()
+          {'word': 'three', 'digits': '3'}
+          >>> m.captures("word")
+          ['one', 'two', 'three']
+          >>> m.captures("digits")
+          ['1', '2', '3']
+          >>> m.capturesdict()
+          {'word': ['one', 'two', 'three'], 'digits': ['1', '2', '3']}
+        
+        Allow duplicate names of groups (`Hg issue 87 <https://bitbucket.org/mrabarnett/mrab-regex/issues/87>`_)
+        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+        
+        Group names can now be duplicated.
+        
+        Examples:
+        
+        .. sourcecode:: python
+        
+          >>> # With optional groups:
+          >>>
+          >>> # Both groups capture, the second capture 'overwriting' the first.
+          >>> m = regex.match(r"(?P<item>\w+)? or (?P<item>\w+)?", "first or second")
+          >>> m.group("item")
+          'second'
+          >>> m.captures("item")
+          ['first', 'second']
+          >>> # Only the second group captures.
+          >>> m = regex.match(r"(?P<item>\w+)? or (?P<item>\w+)?", " or second")
+          >>> m.group("item")
+          'second'
+          >>> m.captures("item")
+          ['second']
+          >>> # Only the first group captures.
+          >>> m = regex.match(r"(?P<item>\w+)? or (?P<item>\w+)?", "first or ")
+          >>> m.group("item")
+          'first'
+          >>> m.captures("item")
+          ['first']
+          >>>
+          >>> # With mandatory groups:
+          >>>
+          >>> # Both groups capture, the second capture 'overwriting' the first.
+          >>> m = regex.match(r"(?P<item>\w*) or (?P<item>\w*)?", "first or second")
+          >>> m.group("item")
+          'second'
+          >>> m.captures("item")
+          ['first', 'second']
+          >>> # Again, both groups capture, the second capture 'overwriting' the first.
+          >>> m = regex.match(r"(?P<item>\w*) or (?P<item>\w*)", " or second")
+          >>> m.group("item")
+          'second'
+          >>> m.captures("item")
+          ['', 'second']
+          >>> # And yet again, both groups capture, the second capture 'overwriting' the first.
+          >>> m = regex.match(r"(?P<item>\w*) or (?P<item>\w*)", "first or ")
+          >>> m.group("item")
+          ''
+          >>> m.captures("item")
+          ['first', '']
+        
+        Added ``fullmatch`` (`issue #16203 <https://bugs.python.org/issue16203>`_)
+        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+        
+        ``fullmatch`` behaves like ``match``, except that it must match all of the string.
+        
+        Examples:
+        
+        .. sourcecode:: python
+        
+          >>> print(regex.fullmatch(r"abc", "abc").span())
+          (0, 3)
+          >>> print(regex.fullmatch(r"abc", "abcx"))
+          None
+          >>> print(regex.fullmatch(r"abc", "abcx", endpos=3).span())
+          (0, 3)
+          >>> print(regex.fullmatch(r"abc", "xabcy", pos=1, endpos=4).span())
+          (1, 4)
+          >>>
+          >>> regex.match(r"a.*?", "abcd").group(0)
+          'a'
+          >>> regex.fullmatch(r"a.*?", "abcd").group(0)
+          'abcd'
+        
+        Added ``subf`` and ``subfn``
+        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+        
+        ``subf`` and ``subfn`` are alternatives to ``sub`` and ``subn`` respectively. When passed a replacement string, they treat it as a format string.
+        
+        Examples:
+        
+        .. sourcecode:: python
+        
+          >>> regex.subf(r"(\w+) (\w+)", "{0} => {2} {1}", "foo bar")
+          'foo bar => bar foo'
+          >>> regex.subf(r"(?P<word1>\w+) (?P<word2>\w+)", "{word2} {word1}", "foo bar")
+          'bar foo'
+        
+        Added ``expandf`` to match object
+        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+        
+        ``expandf`` is an alternative to ``expand``. When passed a replacement string, it treats it as a format string.
+        
+        Examples:
+        
+        .. sourcecode:: python
+        
+          >>> m = regex.match(r"(\w+) (\w+)", "foo bar")
+          >>> m.expandf("{0} => {2} {1}")
+          'foo bar => bar foo'
+          >>>
+          >>> m = regex.match(r"(?P<word1>\w+) (?P<word2>\w+)", "foo bar")
+          >>> m.expandf("{word2} {word1}")
+          'bar foo'
+        
+        Detach searched string
+        ^^^^^^^^^^^^^^^^^^^^^^
+        
+        A match object contains a reference to the string that was searched, via its ``string`` attribute. The ``detach_string`` method will 'detach' that string, making it available for garbage collection, which might save valuable memory if that string is very large.
+        
+        Example:
+        
+        .. sourcecode:: python
+        
+          >>> m = regex.search(r"\w+", "Hello world")
+          >>> print(m.group())
+          Hello
+          >>> print(m.string)
+          Hello world
+          >>> m.detach_string()
+          >>> print(m.group())
+          Hello
+          >>> print(m.string)
+          None
+        
+        Recursive patterns (`Hg issue 27 <https://bitbucket.org/mrabarnett/mrab-regex/issues/27>`_)
+        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+        
+        Recursive and repeated patterns are supported.
+        
+        ``(?R)`` or ``(?0)`` tries to match the entire regex recursively. ``(?1)``, ``(?2)``, etc, try to match the relevant capture group.
+        
+        ``(?&name)`` tries to match the named capture group.
+        
+        Examples:
+        
+        .. sourcecode:: python
+        
+          >>> regex.match(r"(Tarzan|Jane) loves (?1)", "Tarzan loves Jane").groups()
+          ('Tarzan',)
+          >>> regex.match(r"(Tarzan|Jane) loves (?1)", "Jane loves Tarzan").groups()
+          ('Jane',)
+        
+          >>> m = regex.search(r"(\w)(?:(?R)|(\w?))\1", "kayak")
+          >>> m.group(0, 1, 2)
+          ('kayak', 'k', None)
+        
+        The first two examples show how the subpattern within the capture group is reused, but is _not_ itself a capture group. In other words, ``"(Tarzan|Jane) loves (?1)"`` is equivalent to ``"(Tarzan|Jane) loves (?:Tarzan|Jane)"``.
+        
+        It's possible to backtrack into a recursed or repeated group.
+        
+        You can't call a group if there is more than one group with that group name or group number (``"ambiguous group reference"``).
+        
+        The alternative forms ``(?P>name)`` and ``(?P&name)`` are also supported.
+        
+        Full Unicode case-folding is supported.
+        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+        
+        In version 1 behaviour, the regex module uses full case-folding when performing case-insensitive matches in Unicode.
+        
+        Examples (in Python 3):
+        
+        .. sourcecode:: python
+        
+          >>> regex.match(r"(?iV1)strasse", "stra\N{LATIN SMALL LETTER SHARP S}e").span()
+          (0, 6)
+          >>> regex.match(r"(?iV1)stra\N{LATIN SMALL LETTER SHARP S}e", "STRASSE").span()
+          (0, 7)
+        
+        In version 0 behaviour, it uses simple case-folding for backward compatibility with the re module.
+        
+        Approximate "fuzzy" matching (`Hg issue 12 <https://bitbucket.org/mrabarnett/mrab-regex/issues/12>`_, `Hg issue 41 <https://bitbucket.org/mrabarnett/mrab-regex/issues/41>`_, `Hg issue 109 <https://bitbucket.org/mrabarnett/mrab-regex/issues/109>`_)
+        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+        
+        Regex usually attempts an exact match, but sometimes an approximate, or "fuzzy", match is needed, for those cases where the text being searched may contain errors in the form of inserted, deleted or substituted characters.
+        
+        A fuzzy regex specifies which types of errors are permitted, and, optionally, either the minimum and maximum or only the maximum permitted number of each type. (You cannot specify only a minimum.)
+        
+        The 3 types of error are:
+        
+        * Insertion, indicated by "i"
+        
+        * Deletion, indicated by "d"
+        
+        * Substitution, indicated by "s"
+        
+        In addition, "e" indicates any type of error.
+        
+        The fuzziness of a regex item is specified between "{" and "}" after the item.
+        
+        Examples:
+        
+        * ``foo`` match "foo" exactly
+        
+        * ``(?:foo){i}`` match "foo", permitting insertions
+        
+        * ``(?:foo){d}`` match "foo", permitting deletions
+        
+        * ``(?:foo){s}`` match "foo", permitting substitutions
+        
+        * ``(?:foo){i,s}`` match "foo", permitting insertions and substitutions
+        
+        * ``(?:foo){e}`` match "foo", permitting errors
+        
+        If a certain type of error is specified, then any type not specified will **not** be permitted.
+        
+        In the following examples I'll omit the item and write only the fuzziness:
+        
+        * ``{d<=3}`` permit at most 3 deletions, but no other types
+        
+        * ``{i<=1,s<=2}`` permit at most 1 insertion and at most 2 substitutions, but no deletions
+        
+        * ``{1<=e<=3}`` permit at least 1 and at most 3 errors
+        
+        * ``{i<=2,d<=2,e<=3}`` permit at most 2 insertions, at most 2 deletions, at most 3 errors in total, but no substitutions
+        
+        It's also possible to state the costs of each type of error and the maximum permitted total cost.
+        
+        Examples:
+        
+        * ``{2i+2d+1s<=4}`` each insertion costs 2, each deletion costs 2, each substitution costs 1, the total cost must not exceed 4
+        
+        * ``{i<=1,d<=1,s<=1,2i+2d+1s<=4}`` at most 1 insertion, at most 1 deletion, at most 1 substitution; each insertion costs 2, each deletion costs 2, each substitution costs 1, the total cost must not exceed 4
+        
+        You can also use "<" instead of "<=" if you want an exclusive minimum or maximum.
+        
+        You can add a test to perform on a character that's substituted or inserted.
+        
+        Examples:
+        
+        * ``{s<=2:[a-z]}`` at most 2 substitutions, which must be in the character set ``[a-z]``.
+        
+        * ``{s<=2,i<=3:\d}`` at most 2 substitutions, at most 3 insertions, which must be digits.
+        
+        By default, fuzzy matching searches for the first match that meets the given constraints. The ``ENHANCEMATCH`` flag will cause it to attempt to improve the fit (i.e. reduce the number of errors) of the match that it has found.
+        
+        The ``BESTMATCH`` flag will make it search for the best match instead.
+        
+        Further examples to note:
+        
+        * ``regex.search("(dog){e}", "cat and dog")[1]`` returns ``"cat"`` because that matches ``"dog"`` with 3 errors (an unlimited number of errors is permitted).
+        
+        * ``regex.search("(dog){e<=1}", "cat and dog")[1]`` returns ``" dog"`` (with a leading space) because that matches ``"dog"`` with 1 error, which is within the limit.
+        
+        * ``regex.search("(?e)(dog){e<=1}", "cat and dog")[1]`` returns ``"dog"`` (without a leading space) because the fuzzy search matches ``" dog"`` with 1 error, which is within the limit, and the ``(?e)`` then it attempts a better fit.
+        
+        In the first two examples there are perfect matches later in the string, but in neither case is it the first possible match.
+        
+        The match object has an attribute ``fuzzy_counts`` which gives the total number of substitutions, insertions and deletions.
+        
+        .. sourcecode:: python
+        
+          >>> # A 'raw' fuzzy match:
+          >>> regex.fullmatch(r"(?:cats|cat){e<=1}", "cat").fuzzy_counts
+          (0, 0, 1)
+          >>> # 0 substitutions, 0 insertions, 1 deletion.
+        
+          >>> # A better match might be possible if the ENHANCEMATCH flag used:
+          >>> regex.fullmatch(r"(?e)(?:cats|cat){e<=1}", "cat").fuzzy_counts
+          (0, 0, 0)
+          >>> # 0 substitutions, 0 insertions, 0 deletions.
+        
+        The match object also has an attribute ``fuzzy_changes`` which gives a tuple of the positions of the substitutions, insertions and deletions.
+        
+        .. sourcecode:: python
+        
+          >>> m = regex.search('(fuu){i<=2,d<=2,e<=5}', 'anaconda foo bar')
+          >>> m
+          <regex.Match object; span=(7, 10), match='a f', fuzzy_counts=(0, 2, 2)>
+          >>> m.fuzzy_changes
+          ([], [7, 8], [10, 11])
+        
+        What this means is that if the matched part of the string had been:
+        
+        .. sourcecode:: python
+        
+          'anacondfuuoo bar'
+        
+        it would've been an exact match.
+        
+        However, there were insertions at positions 7 and 8:
+        
+        .. sourcecode:: python
+        
+          'anaconda fuuoo bar'
+                  ^^
+        
+        and deletions at positions 10 and 11:
+        
+        .. sourcecode:: python
+        
+          'anaconda f~~oo bar'
+                     ^^
+        
+        So the actual string was:
+        
+        .. sourcecode:: python
+        
+          'anaconda foo bar'
+        
+        Named lists (`Hg issue 11 <https://bitbucket.org/mrabarnett/mrab-regex/issues/11>`_)
+        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+        
+        ``\L<name>``
+        
+        There are occasions where you may want to include a list (actually, a set) of options in a regex.
+        
+        One way is to build the pattern like this:
+        
+        .. sourcecode:: python
+        
+          >>> p = regex.compile(r"first|second|third|fourth|fifth")
+        
+        but if the list is large, parsing the resulting regex can take considerable time, and care must also be taken that the strings are properly escaped and properly ordered, for example, "cats" before "cat".
+        
+        The new alternative is to use a named list:
+        
+        .. sourcecode:: python
+        
+          >>> option_set = ["first", "second", "third", "fourth", "fifth"]
+          >>> p = regex.compile(r"\L<options>", options=option_set)
+        
+        The order of the items is irrelevant, they are treated as a set. The named lists are available as the ``.named_lists`` attribute of the pattern object :
+        
+        .. sourcecode:: python
+        
+          >>> print(p.named_lists)
+          # Python 3
+          {'options': frozenset({'fifth', 'first', 'fourth', 'second', 'third'})}
+          # Python 2
+          {'options': frozenset(['fifth', 'fourth', 'second', 'third', 'first'])}
+        
+        If there are any unused keyword arguments, ``ValueError`` will be raised unless you tell it otherwise:
+        
+        .. sourcecode:: python
+        
+          >>> option_set = ["first", "second", "third", "fourth", "fifth"]
+          >>> p = regex.compile(r"\L<options>", options=option_set, other_options=[])
+          Traceback (most recent call last):
+            File "<stdin>", line 1, in <module>
+            File "C:\Python37\lib\site-packages\regex\regex.py", line 348, in compile
+              return _compile(pattern, flags, ignore_unused, kwargs)
+            File "C:\Python37\lib\site-packages\regex\regex.py", line 585, in _compile
+              raise ValueError('unused keyword argument {!a}'.format(any_one))
+          ValueError: unused keyword argument 'other_options'
+          >>> p = regex.compile(r"\L<options>", options=option_set, other_options=[], ignore_unused=True)
+          >>>
+        
+        Start and end of word
+        ^^^^^^^^^^^^^^^^^^^^^
+        
+        ``\m`` matches at the start of a word.
+        
+        ``\M`` matches at the end of a word.
+        
+        Compare with ``\b``, which matches at the start or end of a word.
+        
+        Unicode line separators
+        ^^^^^^^^^^^^^^^^^^^^^^^
+        
+        Normally the only line separator is ``\n`` (``\x0A``), but if the ``WORD`` flag is turned on then the line separators are ``\x0D\x0A``, ``\x0A``, ``\x0B``, ``\x0C`` and ``\x0D``, plus ``\x85``, ``\u2028`` and ``\u2029`` when working with Unicode.
+        
+        This affects the regex dot ``"."``, which, with the ``DOTALL`` flag turned off, matches any character except a line separator. It also affects the line anchors ``^`` and ``$`` (in multiline mode).
+        
+        Set operators
+        ^^^^^^^^^^^^^
+        
+        **Version 1 behaviour only**
+        
+        Set operators have been added, and a set ``[...]`` can include nested sets.
+        
+        The operators, in order of increasing precedence, are:
+        
+        * ``||`` for union ("x||y" means "x or y")
+        
+        * ``~~`` (double tilde) for symmetric difference ("x~~y" means "x or y, but not both")
+        
+        * ``&&`` for intersection ("x&&y" means "x and y")
+        
+        * ``--`` (double dash) for difference ("x--y" means "x but not y")
+        
+        Implicit union, ie, simple juxtaposition like in ``[ab]``, has the highest precedence. Thus, ``[ab&&cd]`` is the same as ``[[a||b]&&[c||d]]``.
+        
+        Examples:
+        
+        * ``[ab]`` # Set containing 'a' and 'b'
+        
+        * ``[a-z]`` # Set containing 'a' .. 'z'
+        
+        * ``[[a-z]--[qw]]`` # Set containing 'a' .. 'z', but not 'q' or 'w'
+        
+        * ``[a-z--qw]`` # Same as above
+        
+        * ``[\p{L}--QW]`` # Set containing all letters except 'Q' and 'W'
+        
+        * ``[\p{N}--[0-9]]`` # Set containing all numbers except '0' .. '9'
+        
+        * ``[\p{ASCII}&&\p{Letter}]`` # Set containing all characters which are ASCII and letter
+        
+        regex.escape (`issue #2650 <https://bugs.python.org/issue2650>`_)
+        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+        
+        regex.escape has an additional keyword parameter ``special_only``. When True, only 'special' regex characters, such as '?', are escaped.
+        
+        Examples:
+        
+        .. sourcecode:: python
+        
+          >>> regex.escape("foo!?", special_only=False)
+          'foo\\!\\?'
+          >>> regex.escape("foo!?", special_only=True)
+          'foo!\\?'
+        
+        regex.escape (`Hg issue 249 <https://bitbucket.org/mrabarnett/mrab-regex/issues/249>`_)
+        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+        
+        regex.escape has an additional keyword parameter ``literal_spaces``. When True, spaces are not escaped.
+        
+        Examples:
+        
+        .. sourcecode:: python
+        
+          >>> regex.escape("foo bar!?", literal_spaces=False)
+          'foo\\ bar!\\?'
+          >>> regex.escape("foo bar!?", literal_spaces=True)
+          'foo bar!\\?'
+        
+        Repeated captures (`issue #7132 <https://bugs.python.org/issue7132>`_)
+        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+        
+        A match object has additional methods which return information on all the successful matches of a repeated capture group. These methods are:
+        
+        * ``matchobject.captures([group1, ...])``
+        
+          * Returns a list of the strings matched in a group or groups. Compare with ``matchobject.group([group1, ...])``.
+        
+        * ``matchobject.starts([group])``
+        
+          * Returns a list of the start positions. Compare with ``matchobject.start([group])``.
+        
+        * ``matchobject.ends([group])``
+        
+          * Returns a list of the end positions. Compare with ``matchobject.end([group])``.
+        
+        * ``matchobject.spans([group])``
+        
+          * Returns a list of the spans. Compare with ``matchobject.span([group])``.
+        
+        Examples:
+        
+        .. sourcecode:: python
+        
+          >>> m = regex.search(r"(\w{3})+", "123456789")
+          >>> m.group(1)
+          '789'
+          >>> m.captures(1)
+          ['123', '456', '789']
+          >>> m.start(1)
+          6
+          >>> m.starts(1)
+          [0, 3, 6]
+          >>> m.end(1)
+          9
+          >>> m.ends(1)
+          [3, 6, 9]
+          >>> m.span(1)
+          (6, 9)
+          >>> m.spans(1)
+          [(0, 3), (3, 6), (6, 9)]
+        
+        Atomic grouping (`issue #433030 <https://bugs.python.org/issue433030>`_)
+        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+        
+        ``(?>...)``
+        
+        If the following pattern subsequently fails, then the subpattern as a whole will fail.
+        
+        Possessive quantifiers.
+        ^^^^^^^^^^^^^^^^^^^^^^^
+        
+        ``(?:...)?+`` ; ``(?:...)*+`` ; ``(?:...)++`` ; ``(?:...){min,max}+``
+        
+        The subpattern is matched up to 'max' times. If the following pattern subsequently fails, then all of the repeated subpatterns will fail as a whole. For example, ``(?:...)++`` is equivalent to ``(?>(?:...)+)``.
+        
+        Scoped flags (`issue #433028 <https://bugs.python.org/issue433028>`_)
+        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+        
+        ``(?flags-flags:...)``
+        
+        The flags will apply only to the subpattern. Flags can be turned on or off.
+        
+        Definition of 'word' character (`issue #1693050 <https://bugs.python.org/issue1693050>`_)
+        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+        
+        The definition of a 'word' character has been expanded for Unicode. It now conforms to the Unicode specification at ``http://www.unicode.org/reports/tr29/``.
+        
+        Variable-length lookbehind
+        ^^^^^^^^^^^^^^^^^^^^^^^^^^
+        
+        A lookbehind can match a variable-length string.
+        
+        Flags argument for regex.split, regex.sub and regex.subn (`issue #3482 <https://bugs.python.org/issue3482>`_)
+        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+        
+        ``regex.split``, ``regex.sub`` and ``regex.subn`` support a 'flags' argument.
+        
+        Pos and endpos arguments for regex.sub and regex.subn
+        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+        
+        ``regex.sub`` and ``regex.subn`` support 'pos' and 'endpos' arguments.
+        
+        'Overlapped' argument for regex.findall and regex.finditer
+        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+        
+        ``regex.findall`` and ``regex.finditer`` support an 'overlapped' flag which permits overlapped matches.
+        
+        Splititer
+        ^^^^^^^^^
+        
+        ``regex.splititer`` has been added. It's a generator equivalent of ``regex.split``.
+        
+        Subscripting for groups
+        ^^^^^^^^^^^^^^^^^^^^^^^
+        
+        A match object accepts access to the captured groups via subscripting and slicing:
+        
+        .. sourcecode:: python
+        
+          >>> m = regex.search(r"(?P<before>.*?)(?P<num>\d+)(?P<after>.*)", "pqr123stu")
+          >>> print(m["before"])
+          pqr
+          >>> print(len(m))
+          4
+          >>> print(m[:])
+          ('pqr123stu', 'pqr', '123', 'stu')
+        
+        Named groups
+        ^^^^^^^^^^^^
+        
+        Groups can be named with ``(?<name>...)`` as well as the current ``(?P<name>...)``.
+        
+        Group references
+        ^^^^^^^^^^^^^^^^
+        
+        Groups can be referenced within a pattern with ``\g<name>``. This also allows there to be more than 99 groups.
+        
+        Named characters
+        ^^^^^^^^^^^^^^^^
+        
+        ``\N{name}``
+        
+        Named characters are supported. (Note: only those known by Python's Unicode database are supported.)
+        
+        Unicode codepoint properties, including scripts and blocks
+        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+        
+        ``\p{property=value}``; ``\P{property=value}``; ``\p{value}`` ; ``\P{value}``
+        
+        Many Unicode properties are supported, including blocks and scripts. ``\p{property=value}`` or ``\p{property:value}`` matches a character whose property ``property`` has value ``value``. The inverse of ``\p{property=value}`` is ``\P{property=value}`` or ``\p{^property=value}``.
+        
+        If the short form ``\p{value}`` is used, the properties are checked in the order: ``General_Category``, ``Script``, ``Block``, binary property:
+        
+        * ``Latin``, the 'Latin' script (``Script=Latin``).
+        
+        * ``BasicLatin``, the 'BasicLatin' block (``Block=BasicLatin``).
+        
+        * ``Alphabetic``, the 'Alphabetic' binary property (``Alphabetic=Yes``).
+        
+        A short form starting with ``Is`` indicates a script or binary property:
+        
+        * ``IsLatin``, the 'Latin' script (``Script=Latin``).
+        
+        * ``IsAlphabetic``, the 'Alphabetic' binary property (``Alphabetic=Yes``).
+        
+        A short form starting with ``In`` indicates a block property:
+        
+        * ``InBasicLatin``, the 'BasicLatin' block (``Block=BasicLatin``).
+        
+        POSIX character classes
+        ^^^^^^^^^^^^^^^^^^^^^^^
+        
+        ``[[:alpha:]]``; ``[[:^alpha:]]``
+        
+        POSIX character classes are supported. These are normally treated as an alternative form of ``\p{...}``.
+        
+        The exceptions are ``alnum``, ``digit``, ``punct`` and ``xdigit``, whose definitions are different from those of Unicode.
+        
+        ``[[:alnum:]]`` is equivalent to ``\p{posix_alnum}``.
+        
+        ``[[:digit:]]`` is equivalent to ``\p{posix_digit}``.
+        
+        ``[[:punct:]]`` is equivalent to ``\p{posix_punct}``.
+        
+        ``[[:xdigit:]]`` is equivalent to ``\p{posix_xdigit}``.
+        
+        Search anchor
+        ^^^^^^^^^^^^^
+        
+        ``\G``
+        
+        A search anchor has been added. It matches at the position where each search started/continued and can be used for contiguous matches or in negative variable-length lookbehinds to limit how far back the lookbehind goes:
+        
+        .. sourcecode:: python
+        
+          >>> regex.findall(r"\w{2}", "abcd ef")
+          ['ab', 'cd', 'ef']
+          >>> regex.findall(r"\G\w{2}", "abcd ef")
+          ['ab', 'cd']
+        
+        * The search starts at position 0 and matches 2 letters 'ab'.
+        
+        * The search continues at position 2 and matches 2 letters 'cd'.
+        
+        * The search continues at position 4 and fails to match any letters.
+        
+        * The anchor stops the search start position from being advanced, so there are no more results.
+        
+        Reverse searching
+        ^^^^^^^^^^^^^^^^^
+        
+        Searches can now work backwards:
+        
+        .. sourcecode:: python
+        
+          >>> regex.findall(r".", "abc")
+          ['a', 'b', 'c']
+          >>> regex.findall(r"(?r).", "abc")
+          ['c', 'b', 'a']
+        
+        Note: the result of a reverse search is not necessarily the reverse of a forward search:
+        
+        .. sourcecode:: python
+        
+          >>> regex.findall(r"..", "abcde")
+          ['ab', 'cd']
+          >>> regex.findall(r"(?r)..", "abcde")
+          ['de', 'bc']
+        
+        Matching a single grapheme
+        ^^^^^^^^^^^^^^^^^^^^^^^^^^
+        
+        ``\X``
+        
+        The grapheme matcher is supported. It now conforms to the Unicode specification at ``http://www.unicode.org/reports/tr29/``.
+        
+        Branch reset
+        ^^^^^^^^^^^^
+        
+        ``(?|...|...)``
+        
+        Capture group numbers will be reused across the alternatives, but groups with different names will have different group numbers.
+        
+        Examples:
+        
+        .. sourcecode:: python
+        
+          >>> regex.match(r"(?|(first)|(second))", "first").groups()
+          ('first',)
+          >>> regex.match(r"(?|(first)|(second))", "second").groups()
+          ('second',)
+        
+        Note that there is only one group.
+        
+        Default Unicode word boundary
+        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+        
+        The ``WORD`` flag changes the definition of a 'word boundary' to that of a default Unicode word boundary. This applies to ``\b`` and ``\B``.
+        
+        Timeout (Python 3)
+        ^^^^^^^^^^^^^^^^^^
+        
+        The matching methods and functions support timeouts. The timeout (in seconds) applies to the entire operation:
+        
+        .. sourcecode:: python
+        
+          >>> from time import sleep
+          >>>
+          >>> def fast_replace(m):
+          ...     return 'X'
+          ...
+          >>> def slow_replace(m):
+          ...     sleep(0.5)
+          ...     return 'X'
+          ...
+          >>> regex.sub(r'[a-z]', fast_replace, 'abcde', timeout=2)
+          'XXXXX'
+          >>> regex.sub(r'[a-z]', slow_replace, 'abcde', timeout=2)
+          Traceback (most recent call last):
+            File "<stdin>", line 1, in <module>
+            File "C:\Python37\lib\site-packages\regex\regex.py", line 276, in sub
+              endpos, concurrent, timeout)
+          TimeoutError: regex timed out
+        
+Platform: UNKNOWN
+Classifier: Development Status :: 5 - Production/Stable
+Classifier: Intended Audience :: Developers
+Classifier: License :: OSI Approved :: Python Software Foundation License
+Classifier: Operating System :: OS Independent
+Classifier: Programming Language :: Python :: 2.7
+Classifier: Programming Language :: Python :: 3.5
+Classifier: Programming Language :: Python :: 3.6
+Classifier: Programming Language :: Python :: 3.7
+Classifier: Programming Language :: Python :: 3.8
+Classifier: Topic :: Scientific/Engineering :: Information Analysis
+Classifier: Topic :: Software Development :: Libraries :: Python Modules
+Classifier: Topic :: Text Processing
+Classifier: Topic :: Text Processing :: General
diff --git a/README b/README
deleted file mode 100644
index adb0672..0000000
--- a/README
+++ /dev/null
@@ -1,18 +0,0 @@
-regex is an alternative to the re package in the Python standard library. It is
-intended to act as a drop in replacement. regex is supported on multiple
-versions of Python.
-
-For a full list of features see docs/Features.rst.
-
-To install from PyPI run
-
-    python -m pip install regex
-
-To build and install regex for your default Python run
-
-    python setup.py install
-
-To install regex for a specific version run setup.py with that interpreter, e.g.
-
-    python3.7 setup.py install
-
diff --git a/README.rst b/README.rst
new file mode 100644
index 0000000..622c000
--- /dev/null
+++ b/README.rst
@@ -0,0 +1,1063 @@
+Introduction
+------------
+
+This regex implementation is backwards-compatible with the standard 're' module, but offers additional functionality.
+
+Note
+----
+
+The re module's behaviour with zero-width matches changed in Python 3.7, and this module will follow that behaviour when compiled for Python 3.7.
+
+Old vs new behaviour
+--------------------
+
+In order to be compatible with the re module, this module has 2 behaviours:
+
+* **Version 0** behaviour (old behaviour, compatible with the re module):
+
+  Please note that the re module's behaviour may change over time, and I'll endeavour to match that behaviour in version 0.
+
+  * Indicated by the ``VERSION0`` or ``V0`` flag, or ``(?V0)`` in the pattern.
+
+  * Zero-width matches are not handled correctly in the re module before Python 3.7. The behaviour in those earlier versions is:
+
+    * ``.split`` won't split a string at a zero-width match.
+
+    * ``.sub`` will advance by one character after a zero-width match.
+
+  * Inline flags apply to the entire pattern, and they can't be turned off.
+
+  * Only simple sets are supported.
+
+  * Case-insensitive matches in Unicode use simple case-folding by default.
+
+* **Version 1** behaviour (new behaviour, possibly different from the re module):
+
+  * Indicated by the ``VERSION1`` or ``V1`` flag, or ``(?V1)`` in the pattern.
+
+  * Zero-width matches are handled correctly.
+
+  * Inline flags apply to the end of the group or pattern, and they can be turned off.
+
+  * Nested sets and set operations are supported.
+
+  * Case-insensitive matches in Unicode use full case-folding by default.
+
+If no version is specified, the regex module will default to ``regex.DEFAULT_VERSION``.
+
+Case-insensitive matches in Unicode
+-----------------------------------
+
+The regex module supports both simple and full case-folding for case-insensitive matches in Unicode. Use of full case-folding can be turned on using the ``FULLCASE`` or ``F`` flag, or ``(?f)`` in the pattern. Please note that this flag affects how the ``IGNORECASE`` flag works; the ``FULLCASE`` flag itself does not turn on case-insensitive matching.
+
+In the version 0 behaviour, the flag is off by default.
+
+In the version 1 behaviour, the flag is on by default.
+
+Nested sets and set operations
+------------------------------
+
+It's not possible to support both simple sets, as used in the re module, and nested sets at the same time because of a difference in the meaning of an unescaped ``"["`` in a set.
+
+For example, the pattern ``[[a-z]--[aeiou]]`` is treated in the version 0 behaviour (simple sets, compatible with the re module) as:
+
+* Set containing "[" and the letters "a" to "z"
+
+* Literal "--"
+
+* Set containing letters "a", "e", "i", "o", "u"
+
+* Literal "]"
+
+but in the version 1 behaviour (nested sets, enhanced behaviour) as:
+
+* Set which is:
+
+  * Set containing the letters "a" to "z"
+
+* but excluding:
+
+  * Set containing the letters "a", "e", "i", "o", "u"
+
+Version 0 behaviour: only simple sets are supported.
+
+Version 1 behaviour: nested sets and set operations are supported.
+
+Flags
+-----
+
+There are 2 kinds of flag: scoped and global. Scoped flags can apply to only part of a pattern and can be turned on or off; global flags apply to the entire pattern and can only be turned on.
+
+The scoped flags are: ``FULLCASE``, ``IGNORECASE``, ``MULTILINE``, ``DOTALL``, ``VERBOSE``, ``WORD``.
+
+The global flags are: ``ASCII``, ``BESTMATCH``, ``ENHANCEMATCH``, ``LOCALE``, ``POSIX``, ``REVERSE``, ``UNICODE``, ``VERSION0``, ``VERSION1``.
+
+If neither the ``ASCII``, ``LOCALE`` nor ``UNICODE`` flag is specified, it will default to ``UNICODE`` if the regex pattern is a Unicode string and ``ASCII`` if it's a bytestring.
+
+The ``ENHANCEMATCH`` flag makes fuzzy matching attempt to improve the fit of the next match that it finds.
+
+The ``BESTMATCH`` flag makes fuzzy matching search for the best match instead of the next match.
+
+Notes on named capture groups
+-----------------------------
+
+All capture groups have a group number, starting from 1.
+
+Groups with the same group name will have the same group number, and groups with a different group name will have a different group number.
+
+The same name can be used by more than one group, with later captures 'overwriting' earlier captures. All of the captures of the group will be available from the ``captures`` method of the match object.
+
+Group numbers will be reused across different branches of a branch reset, eg. ``(?|(first)|(second))`` has only group 1. If capture groups have different group names then they will, of course, have different group numbers, eg. ``(?|(?P<foo>first)|(?P<bar>second))`` has group 1 ("foo") and group 2 ("bar").
+
+In the regex ``(\s+)(?|(?P<foo>[A-Z]+)|(\w+) (?P<foo>[0-9]+)`` there are 2 groups:
+
+* ``(\s+)`` is group 1.
+
+* ``(?P<foo>[A-Z]+)`` is group 2, also called "foo".
+
+* ``(\w+)`` is group 2 because of the branch reset.
+
+* ``(?P<foo>[0-9]+)`` is group 2 because it's called "foo".
+
+If you want to prevent ``(\w+)`` from being group 2, you need to name it (different name, different group number).
+
+Multithreading
+--------------
+
+The regex module releases the GIL during matching on instances of the built-in (immutable) string classes, enabling other Python threads to run concurrently. It is also possible to force the regex module to release the GIL during matching by calling the matching methods with the keyword argument ``concurrent=True``. The behaviour is undefined if the string changes during matching, so use it *only* when it is guaranteed that that won't happen.
+
+Unicode
+-------
+
+This module supports Unicode 13.0.0.
+
+Full Unicode case-folding is supported.
+
+Additional features
+-------------------
+
+The issue numbers relate to the Python bug tracker, except where listed as "Hg issue".
+
+Added support for lookaround in conditional pattern (`Hg issue 163 <https://bitbucket.org/mrabarnett/mrab-regex/issues/163>`_)
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+The test of a conditional pattern can now be a lookaround.
+
+Examples:
+
+.. sourcecode:: python
+
+  >>> regex.match(r'(?(?=\d)\d+|\w+)', '123abc')
+  <regex.Match object; span=(0, 3), match='123'>
+  >>> regex.match(r'(?(?=\d)\d+|\w+)', 'abc123')
+  <regex.Match object; span=(0, 6), match='abc123'>
+
+This is not quite the same as putting a lookaround in the first branch of a pair of alternatives.
+
+Examples:
+
+.. sourcecode:: python
+
+  >>> print(regex.match(r'(?:(?=\d)\d+\b|\w+)', '123abc'))
+  <regex.Match object; span=(0, 6), match='123abc'>
+  >>> print(regex.match(r'(?(?=\d)\d+\b|\w+)', '123abc'))
+  None
+
+In the first example, the lookaround matched, but the remainder of the first branch failed to match, and so the second branch was attempted, whereas in the second example, the lookaround matched, and the first branch failed to match, but the second branch was **not** attempted.
+
+Added POSIX matching (leftmost longest) (`Hg issue 150 <https://bitbucket.org/mrabarnett/mrab-regex/issues/150>`_)
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+The POSIX standard for regex is to return the leftmost longest match. This can be turned on using the ``POSIX`` flag (``(?p)``).
+
+Examples:
+
+.. sourcecode:: python
+
+  >>> # Normal matching.
+  >>> regex.search(r'Mr|Mrs', 'Mrs')
+  <regex.Match object; span=(0, 2), match='Mr'>
+  >>> regex.search(r'one(self)?(selfsufficient)?', 'oneselfsufficient')
+  <regex.Match object; span=(0, 7), match='oneself'>
+  >>> # POSIX matching.
+  >>> regex.search(r'(?p)Mr|Mrs', 'Mrs')
+  <regex.Match object; span=(0, 3), match='Mrs'>
+  >>> regex.search(r'(?p)one(self)?(selfsufficient)?', 'oneselfsufficient')
+  <regex.Match object; span=(0, 17), match='oneselfsufficient'>
+
+Note that it will take longer to find matches because when it finds a match at a certain position, it won't return that immediately, but will keep looking to see if there's another longer match there.
+
+Added ``(?(DEFINE)...)`` (`Hg issue 152 <https://bitbucket.org/mrabarnett/mrab-regex/issues/152>`_)
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+If there's no group called "DEFINE", then ... will be ignored, but any group definitions within it will be available.
+
+Examples:
+
+.. sourcecode:: python
+
+  >>> regex.search(r'(?(DEFINE)(?P<quant>\d+)(?P<item>\w+))(?&quant) (?&item)', '5 elephants')
+  <regex.Match object; span=(0, 11), match='5 elephants'>
+
+Added ``(*PRUNE)``, ``(*SKIP)`` and ``(*FAIL)`` (`Hg issue 153 <https://bitbucket.org/mrabarnett/mrab-regex/issues/153>`_)
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+``(*PRUNE)`` discards the backtracking info up to that point. When used in an atomic group or a lookaround, it won't affect the enclosing pattern.
+
+``(*SKIP)`` is similar to ``(*PRUNE)``, except that it also sets where in the text the next attempt to match will start. When used in an atomic group or a lookaround, it won't affect the enclosing pattern.
+
+``(*FAIL)`` causes immediate backtracking. ``(*F)`` is a permitted abbreviation.
+
+Added ``\K`` (`Hg issue 151 <https://bitbucket.org/mrabarnett/mrab-regex/issues/151>`_)
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+Keeps the part of the entire match after the position where ``\K`` occurred; the part before it is discarded.
+
+It does not affect what capture groups return.
+
+Examples:
+
+.. sourcecode:: python
+
+  >>> m = regex.search(r'(\w\w\K\w\w\w)', 'abcdef')
+  >>> m[0]
+  'cde'
+  >>> m[1]
+  'abcde'
+  >>>
+  >>> m = regex.search(r'(?r)(\w\w\K\w\w\w)', 'abcdef')
+  >>> m[0]
+  'bc'
+  >>> m[1]
+  'bcdef'
+
+Added capture subscripting for ``expandf`` and ``subf``/``subfn`` (`Hg issue 133 <https://bitbucket.org/mrabarnett/mrab-regex/issues/133>`_)
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+You can now use subscripting to get the captures of a repeated capture group.
+
+Examples:
+
+.. sourcecode:: python
+
+  >>> m = regex.match(r"(\w)+", "abc")
+  >>> m.expandf("{1}")
+  'c'
+  >>> m.expandf("{1[0]} {1[1]} {1[2]}")
+  'a b c'
+  >>> m.expandf("{1[-1]} {1[-2]} {1[-3]}")
+  'c b a'
+  >>>
+  >>> m = regex.match(r"(?P<letter>\w)+", "abc")
+  >>> m.expandf("{letter}")
+  'c'
+  >>> m.expandf("{letter[0]} {letter[1]} {letter[2]}")
+  'a b c'
+  >>> m.expandf("{letter[-1]} {letter[-2]} {letter[-3]}")
+  'c b a'
+
+Added support for referring to a group by number using ``(?P=...)``.
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+This is in addition to the existing ``\g<...>``.
+
+Fixed the handling of locale-sensitive regexes.
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+The ``LOCALE`` flag is intended for legacy code and has limited support. You're still recommended to use Unicode instead.
+
+Added partial matches (`Hg issue 102 <https://bitbucket.org/mrabarnett/mrab-regex/issues/102>`_)
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+A partial match is one that matches up to the end of string, but that string has been truncated and you want to know whether a complete match could be possible if the string had not been truncated.
+
+Partial matches are supported by ``match``, ``search``, ``fullmatch`` and ``finditer`` with the ``partial`` keyword argument.
+
+Match objects have a ``partial`` attribute, which is ``True`` if it's a partial match.
+
+For example, if you wanted a user to enter a 4-digit number and check it character by character as it was being entered:
+
+.. sourcecode:: python
+
+  >>> pattern = regex.compile(r'\d{4}')
+
+  >>> # Initially, nothing has been entered:
+  >>> print(pattern.fullmatch('', partial=True))
+  <regex.Match object; span=(0, 0), match='', partial=True>
+
+  >>> # An empty string is OK, but it's only a partial match.
+  >>> # The user enters a letter:
+  >>> print(pattern.fullmatch('a', partial=True))
+  None
+  >>> # It'll never match.
+
+  >>> # The user deletes that and enters a digit:
+  >>> print(pattern.fullmatch('1', partial=True))
+  <regex.Match object; span=(0, 1), match='1', partial=True>
+  >>> # It matches this far, but it's only a partial match.
+
+  >>> # The user enters 2 more digits:
+  >>> print(pattern.fullmatch('123', partial=True))
+  <regex.Match object; span=(0, 3), match='123', partial=True>
+  >>> # It matches this far, but it's only a partial match.
+
+  >>> # The user enters another digit:
+  >>> print(pattern.fullmatch('1234', partial=True))
+  <regex.Match object; span=(0, 4), match='1234'>
+  >>> # It's a complete match.
+
+  >>> # If the user enters another digit:
+  >>> print(pattern.fullmatch('12345', partial=True))
+  None
+  >>> # It's no longer a match.
+
+  >>> # This is a partial match:
+  >>> pattern.match('123', partial=True).partial
+  True
+
+  >>> # This is a complete match:
+  >>> pattern.match('1233', partial=True).partial
+  False
+
+``*`` operator not working correctly with sub() (`Hg issue 106 <https://bitbucket.org/mrabarnett/mrab-regex/issues/106>`_)
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+Sometimes it's not clear how zero-width matches should be handled. For example, should ``.*`` match 0 characters directly after matching >0 characters?
+
+Examples:
+
+.. sourcecode:: python
+
+  # Python 3.7 and later
+  >>> regex.sub('.*', 'x', 'test')
+  'xx'
+  >>> regex.sub('.*?', '|', 'test')
+  '|||||||||'
+
+  # Python 3.6 and earlier
+  >>> regex.sub('(?V0).*', 'x', 'test')
+  'x'
+  >>> regex.sub('(?V1).*', 'x', 'test')
+  'xx'
+  >>> regex.sub('(?V0).*?', '|', 'test')
+  '|t|e|s|t|'
+  >>> regex.sub('(?V1).*?', '|', 'test')
+  '|||||||||'
+
+Added ``capturesdict`` (`Hg issue 86 <https://bitbucket.org/mrabarnett/mrab-regex/issues/86>`_)
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+``capturesdict`` is a combination of ``groupdict`` and ``captures``:
+
+``groupdict`` returns a dict of the named groups and the last capture of those groups.
+
+``captures`` returns a list of all the captures of a group
+
+``capturesdict`` returns a dict of the named groups and lists of all the captures of those groups.
+
+Examples:
+
+.. sourcecode:: python
+
+  >>> m = regex.match(r"(?:(?P<word>\w+) (?P<digits>\d+)\n)+", "one 1\ntwo 2\nthree 3\n")
+  >>> m.groupdict()
+  {'word': 'three', 'digits': '3'}
+  >>> m.captures("word")
+  ['one', 'two', 'three']
+  >>> m.captures("digits")
+  ['1', '2', '3']
+  >>> m.capturesdict()
+  {'word': ['one', 'two', 'three'], 'digits': ['1', '2', '3']}
+
+Allow duplicate names of groups (`Hg issue 87 <https://bitbucket.org/mrabarnett/mrab-regex/issues/87>`_)
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+Group names can now be duplicated.
+
+Examples:
+
+.. sourcecode:: python
+
+  >>> # With optional groups:
+  >>>
+  >>> # Both groups capture, the second capture 'overwriting' the first.
+  >>> m = regex.match(r"(?P<item>\w+)? or (?P<item>\w+)?", "first or second")
+  >>> m.group("item")
+  'second'
+  >>> m.captures("item")
+  ['first', 'second']
+  >>> # Only the second group captures.
+  >>> m = regex.match(r"(?P<item>\w+)? or (?P<item>\w+)?", " or second")
+  >>> m.group("item")
+  'second'
+  >>> m.captures("item")
+  ['second']
+  >>> # Only the first group captures.
+  >>> m = regex.match(r"(?P<item>\w+)? or (?P<item>\w+)?", "first or ")
+  >>> m.group("item")
+  'first'
+  >>> m.captures("item")
+  ['first']
+  >>>
+  >>> # With mandatory groups:
+  >>>
+  >>> # Both groups capture, the second capture 'overwriting' the first.
+  >>> m = regex.match(r"(?P<item>\w*) or (?P<item>\w*)?", "first or second")
+  >>> m.group("item")
+  'second'
+  >>> m.captures("item")
+  ['first', 'second']
+  >>> # Again, both groups capture, the second capture 'overwriting' the first.
+  >>> m = regex.match(r"(?P<item>\w*) or (?P<item>\w*)", " or second")
+  >>> m.group("item")
+  'second'
+  >>> m.captures("item")
+  ['', 'second']
+  >>> # And yet again, both groups capture, the second capture 'overwriting' the first.
+  >>> m = regex.match(r"(?P<item>\w*) or (?P<item>\w*)", "first or ")
+  >>> m.group("item")
+  ''
+  >>> m.captures("item")
+  ['first', '']
+
+Added ``fullmatch`` (`issue #16203 <https://bugs.python.org/issue16203>`_)
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+``fullmatch`` behaves like ``match``, except that it must match all of the string.
+
+Examples:
+
+.. sourcecode:: python
+
+  >>> print(regex.fullmatch(r"abc", "abc").span())
+  (0, 3)
+  >>> print(regex.fullmatch(r"abc", "abcx"))
+  None
+  >>> print(regex.fullmatch(r"abc", "abcx", endpos=3).span())
+  (0, 3)
+  >>> print(regex.fullmatch(r"abc", "xabcy", pos=1, endpos=4).span())
+  (1, 4)
+  >>>
+  >>> regex.match(r"a.*?", "abcd").group(0)
+  'a'
+  >>> regex.fullmatch(r"a.*?", "abcd").group(0)
+  'abcd'
+
+Added ``subf`` and ``subfn``
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+``subf`` and ``subfn`` are alternatives to ``sub`` and ``subn`` respectively. When passed a replacement string, they treat it as a format string.
+
+Examples:
+
+.. sourcecode:: python
+
+  >>> regex.subf(r"(\w+) (\w+)", "{0} => {2} {1}", "foo bar")
+  'foo bar => bar foo'
+  >>> regex.subf(r"(?P<word1>\w+) (?P<word2>\w+)", "{word2} {word1}", "foo bar")
+  'bar foo'
+
+Added ``expandf`` to match object
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+``expandf`` is an alternative to ``expand``. When passed a replacement string, it treats it as a format string.
+
+Examples:
+
+.. sourcecode:: python
+
+  >>> m = regex.match(r"(\w+) (\w+)", "foo bar")
+  >>> m.expandf("{0} => {2} {1}")
+  'foo bar => bar foo'
+  >>>
+  >>> m = regex.match(r"(?P<word1>\w+) (?P<word2>\w+)", "foo bar")
+  >>> m.expandf("{word2} {word1}")
+  'bar foo'
+
+Detach searched string
+^^^^^^^^^^^^^^^^^^^^^^
+
+A match object contains a reference to the string that was searched, via its ``string`` attribute. The ``detach_string`` method will 'detach' that string, making it available for garbage collection, which might save valuable memory if that string is very large.
+
+Example:
+
+.. sourcecode:: python
+
+  >>> m = regex.search(r"\w+", "Hello world")
+  >>> print(m.group())
+  Hello
+  >>> print(m.string)
+  Hello world
+  >>> m.detach_string()
+  >>> print(m.group())
+  Hello
+  >>> print(m.string)
+  None
+
+Recursive patterns (`Hg issue 27 <https://bitbucket.org/mrabarnett/mrab-regex/issues/27>`_)
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+Recursive and repeated patterns are supported.
+
+``(?R)`` or ``(?0)`` tries to match the entire regex recursively. ``(?1)``, ``(?2)``, etc, try to match the relevant capture group.
+
+``(?&name)`` tries to match the named capture group.
+
+Examples:
+
+.. sourcecode:: python
+
+  >>> regex.match(r"(Tarzan|Jane) loves (?1)", "Tarzan loves Jane").groups()
+  ('Tarzan',)
+  >>> regex.match(r"(Tarzan|Jane) loves (?1)", "Jane loves Tarzan").groups()
+  ('Jane',)
+
+  >>> m = regex.search(r"(\w)(?:(?R)|(\w?))\1", "kayak")
+  >>> m.group(0, 1, 2)
+  ('kayak', 'k', None)
+
+The first two examples show how the subpattern within the capture group is reused, but is _not_ itself a capture group. In other words, ``"(Tarzan|Jane) loves (?1)"`` is equivalent to ``"(Tarzan|Jane) loves (?:Tarzan|Jane)"``.
+
+It's possible to backtrack into a recursed or repeated group.
+
+You can't call a group if there is more than one group with that group name or group number (``"ambiguous group reference"``).
+
+The alternative forms ``(?P>name)`` and ``(?P&name)`` are also supported.
+
+Full Unicode case-folding is supported.
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+In version 1 behaviour, the regex module uses full case-folding when performing case-insensitive matches in Unicode.
+
+Examples (in Python 3):
+
+.. sourcecode:: python
+
+  >>> regex.match(r"(?iV1)strasse", "stra\N{LATIN SMALL LETTER SHARP S}e").span()
+  (0, 6)
+  >>> regex.match(r"(?iV1)stra\N{LATIN SMALL LETTER SHARP S}e", "STRASSE").span()
+  (0, 7)
+
+In version 0 behaviour, it uses simple case-folding for backward compatibility with the re module.
+
+Approximate "fuzzy" matching (`Hg issue 12 <https://bitbucket.org/mrabarnett/mrab-regex/issues/12>`_, `Hg issue 41 <https://bitbucket.org/mrabarnett/mrab-regex/issues/41>`_, `Hg issue 109 <https://bitbucket.org/mrabarnett/mrab-regex/issues/109>`_)
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+Regex usually attempts an exact match, but sometimes an approximate, or "fuzzy", match is needed, for those cases where the text being searched may contain errors in the form of inserted, deleted or substituted characters.
+
+A fuzzy regex specifies which types of errors are permitted, and, optionally, either the minimum and maximum or only the maximum permitted number of each type. (You cannot specify only a minimum.)
+
+The 3 types of error are:
+
+* Insertion, indicated by "i"
+
+* Deletion, indicated by "d"
+
+* Substitution, indicated by "s"
+
+In addition, "e" indicates any type of error.
+
+The fuzziness of a regex item is specified between "{" and "}" after the item.
+
+Examples:
+
+* ``foo`` match "foo" exactly
+
+* ``(?:foo){i}`` match "foo", permitting insertions
+
+* ``(?:foo){d}`` match "foo", permitting deletions
+
+* ``(?:foo){s}`` match "foo", permitting substitutions
+
+* ``(?:foo){i,s}`` match "foo", permitting insertions and substitutions
+
+* ``(?:foo){e}`` match "foo", permitting errors
+
+If a certain type of error is specified, then any type not specified will **not** be permitted.
+
+In the following examples I'll omit the item and write only the fuzziness:
+
+* ``{d<=3}`` permit at most 3 deletions, but no other types
+
+* ``{i<=1,s<=2}`` permit at most 1 insertion and at most 2 substitutions, but no deletions
+
+* ``{1<=e<=3}`` permit at least 1 and at most 3 errors
+
+* ``{i<=2,d<=2,e<=3}`` permit at most 2 insertions, at most 2 deletions, at most 3 errors in total, but no substitutions
+
+It's also possible to state the costs of each type of error and the maximum permitted total cost.
+
+Examples:
+
+* ``{2i+2d+1s<=4}`` each insertion costs 2, each deletion costs 2, each substitution costs 1, the total cost must not exceed 4
+
+* ``{i<=1,d<=1,s<=1,2i+2d+1s<=4}`` at most 1 insertion, at most 1 deletion, at most 1 substitution; each insertion costs 2, each deletion costs 2, each substitution costs 1, the total cost must not exceed 4
+
+You can also use "<" instead of "<=" if you want an exclusive minimum or maximum.
+
+You can add a test to perform on a character that's substituted or inserted.
+
+Examples:
+
+* ``{s<=2:[a-z]}`` at most 2 substitutions, which must be in the character set ``[a-z]``.
+
+* ``{s<=2,i<=3:\d}`` at most 2 substitutions, at most 3 insertions, which must be digits.
+
+By default, fuzzy matching searches for the first match that meets the given constraints. The ``ENHANCEMATCH`` flag will cause it to attempt to improve the fit (i.e. reduce the number of errors) of the match that it has found.
+
+The ``BESTMATCH`` flag will make it search for the best match instead.
+
+Further examples to note:
+
+* ``regex.search("(dog){e}", "cat and dog")[1]`` returns ``"cat"`` because that matches ``"dog"`` with 3 errors (an unlimited number of errors is permitted).
+
+* ``regex.search("(dog){e<=1}", "cat and dog")[1]`` returns ``" dog"`` (with a leading space) because that matches ``"dog"`` with 1 error, which is within the limit.
+
+* ``regex.search("(?e)(dog){e<=1}", "cat and dog")[1]`` returns ``"dog"`` (without a leading space) because the fuzzy search matches ``" dog"`` with 1 error, which is within the limit, and the ``(?e)`` then it attempts a better fit.
+
+In the first two examples there are perfect matches later in the string, but in neither case is it the first possible match.
+
+The match object has an attribute ``fuzzy_counts`` which gives the total number of substitutions, insertions and deletions.
+
+.. sourcecode:: python
+
+  >>> # A 'raw' fuzzy match:
+  >>> regex.fullmatch(r"(?:cats|cat){e<=1}", "cat").fuzzy_counts
+  (0, 0, 1)
+  >>> # 0 substitutions, 0 insertions, 1 deletion.
+
+  >>> # A better match might be possible if the ENHANCEMATCH flag used:
+  >>> regex.fullmatch(r"(?e)(?:cats|cat){e<=1}", "cat").fuzzy_counts
+  (0, 0, 0)
+  >>> # 0 substitutions, 0 insertions, 0 deletions.
+
+The match object also has an attribute ``fuzzy_changes`` which gives a tuple of the positions of the substitutions, insertions and deletions.
+
+.. sourcecode:: python
+
+  >>> m = regex.search('(fuu){i<=2,d<=2,e<=5}', 'anaconda foo bar')
+  >>> m
+  <regex.Match object; span=(7, 10), match='a f', fuzzy_counts=(0, 2, 2)>
+  >>> m.fuzzy_changes
+  ([], [7, 8], [10, 11])
+
+What this means is that if the matched part of the string had been:
+
+.. sourcecode:: python
+
+  'anacondfuuoo bar'
+
+it would've been an exact match.
+
+However, there were insertions at positions 7 and 8:
+
+.. sourcecode:: python
+
+  'anaconda fuuoo bar'
+          ^^
+
+and deletions at positions 10 and 11:
+
+.. sourcecode:: python
+
+  'anaconda f~~oo bar'
+             ^^
+
+So the actual string was:
+
+.. sourcecode:: python
+
+  'anaconda foo bar'
+
+Named lists (`Hg issue 11 <https://bitbucket.org/mrabarnett/mrab-regex/issues/11>`_)
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+``\L<name>``
+
+There are occasions where you may want to include a list (actually, a set) of options in a regex.
+
+One way is to build the pattern like this:
+
+.. sourcecode:: python
+
+  >>> p = regex.compile(r"first|second|third|fourth|fifth")
+
+but if the list is large, parsing the resulting regex can take considerable time, and care must also be taken that the strings are properly escaped and properly ordered, for example, "cats" before "cat".
+
+The new alternative is to use a named list:
+
+.. sourcecode:: python
+
+  >>> option_set = ["first", "second", "third", "fourth", "fifth"]
+  >>> p = regex.compile(r"\L<options>", options=option_set)
+
+The order of the items is irrelevant, they are treated as a set. The named lists are available as the ``.named_lists`` attribute of the pattern object :
+
+.. sourcecode:: python
+
+  >>> print(p.named_lists)
+  # Python 3
+  {'options': frozenset({'fifth', 'first', 'fourth', 'second', 'third'})}
+  # Python 2
+  {'options': frozenset(['fifth', 'fourth', 'second', 'third', 'first'])}
+
+If there are any unused keyword arguments, ``ValueError`` will be raised unless you tell it otherwise:
+
+.. sourcecode:: python
+
+  >>> option_set = ["first", "second", "third", "fourth", "fifth"]
+  >>> p = regex.compile(r"\L<options>", options=option_set, other_options=[])
+  Traceback (most recent call last):
+    File "<stdin>", line 1, in <module>
+    File "C:\Python37\lib\site-packages\regex\regex.py", line 348, in compile
+      return _compile(pattern, flags, ignore_unused, kwargs)
+    File "C:\Python37\lib\site-packages\regex\regex.py", line 585, in _compile
+      raise ValueError('unused keyword argument {!a}'.format(any_one))
+  ValueError: unused keyword argument 'other_options'
+  >>> p = regex.compile(r"\L<options>", options=option_set, other_options=[], ignore_unused=True)
+  >>>
+
+Start and end of word
+^^^^^^^^^^^^^^^^^^^^^
+
+``\m`` matches at the start of a word.
+
+``\M`` matches at the end of a word.
+
+Compare with ``\b``, which matches at the start or end of a word.
+
+Unicode line separators
+^^^^^^^^^^^^^^^^^^^^^^^
+
+Normally the only line separator is ``\n`` (``\x0A``), but if the ``WORD`` flag is turned on then the line separators are ``\x0D\x0A``, ``\x0A``, ``\x0B``, ``\x0C`` and ``\x0D``, plus ``\x85``, ``\u2028`` and ``\u2029`` when working with Unicode.
+
+This affects the regex dot ``"."``, which, with the ``DOTALL`` flag turned off, matches any character except a line separator. It also affects the line anchors ``^`` and ``$`` (in multiline mode).
+
+Set operators
+^^^^^^^^^^^^^
+
+**Version 1 behaviour only**
+
+Set operators have been added, and a set ``[...]`` can include nested sets.
+
+The operators, in order of increasing precedence, are:
+
+* ``||`` for union ("x||y" means "x or y")
+
+* ``~~`` (double tilde) for symmetric difference ("x~~y" means "x or y, but not both")
+
+* ``&&`` for intersection ("x&&y" means "x and y")
+
+* ``--`` (double dash) for difference ("x--y" means "x but not y")
+
+Implicit union, ie, simple juxtaposition like in ``[ab]``, has the highest precedence. Thus, ``[ab&&cd]`` is the same as ``[[a||b]&&[c||d]]``.
+
+Examples:
+
+* ``[ab]`` # Set containing 'a' and 'b'
+
+* ``[a-z]`` # Set containing 'a' .. 'z'
+
+* ``[[a-z]--[qw]]`` # Set containing 'a' .. 'z', but not 'q' or 'w'
+
+* ``[a-z--qw]`` # Same as above
+
+* ``[\p{L}--QW]`` # Set containing all letters except 'Q' and 'W'
+
+* ``[\p{N}--[0-9]]`` # Set containing all numbers except '0' .. '9'
+
+* ``[\p{ASCII}&&\p{Letter}]`` # Set containing all characters which are ASCII and letter
+
+regex.escape (`issue #2650 <https://bugs.python.org/issue2650>`_)
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+regex.escape has an additional keyword parameter ``special_only``. When True, only 'special' regex characters, such as '?', are escaped.
+
+Examples:
+
+.. sourcecode:: python
+
+  >>> regex.escape("foo!?", special_only=False)
+  'foo\\!\\?'
+  >>> regex.escape("foo!?", special_only=True)
+  'foo!\\?'
+
+regex.escape (`Hg issue 249 <https://bitbucket.org/mrabarnett/mrab-regex/issues/249>`_)
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+regex.escape has an additional keyword parameter ``literal_spaces``. When True, spaces are not escaped.
+
+Examples:
+
+.. sourcecode:: python
+
+  >>> regex.escape("foo bar!?", literal_spaces=False)
+  'foo\\ bar!\\?'
+  >>> regex.escape("foo bar!?", literal_spaces=True)
+  'foo bar!\\?'
+
+Repeated captures (`issue #7132 <https://bugs.python.org/issue7132>`_)
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+A match object has additional methods which return information on all the successful matches of a repeated capture group. These methods are:
+
+* ``matchobject.captures([group1, ...])``
+
+  * Returns a list of the strings matched in a group or groups. Compare with ``matchobject.group([group1, ...])``.
+
+* ``matchobject.starts([group])``
+
+  * Returns a list of the start positions. Compare with ``matchobject.start([group])``.
+
+* ``matchobject.ends([group])``
+
+  * Returns a list of the end positions. Compare with ``matchobject.end([group])``.
+
+* ``matchobject.spans([group])``
+
+  * Returns a list of the spans. Compare with ``matchobject.span([group])``.
+
+Examples:
+
+.. sourcecode:: python
+
+  >>> m = regex.search(r"(\w{3})+", "123456789")
+  >>> m.group(1)
+  '789'
+  >>> m.captures(1)
+  ['123', '456', '789']
+  >>> m.start(1)
+  6
+  >>> m.starts(1)
+  [0, 3, 6]
+  >>> m.end(1)
+  9
+  >>> m.ends(1)
+  [3, 6, 9]
+  >>> m.span(1)
+  (6, 9)
+  >>> m.spans(1)
+  [(0, 3), (3, 6), (6, 9)]
+
+Atomic grouping (`issue #433030 <https://bugs.python.org/issue433030>`_)
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+``(?>...)``
+
+If the following pattern subsequently fails, then the subpattern as a whole will fail.
+
+Possessive quantifiers.
+^^^^^^^^^^^^^^^^^^^^^^^
+
+``(?:...)?+`` ; ``(?:...)*+`` ; ``(?:...)++`` ; ``(?:...){min,max}+``
+
+The subpattern is matched up to 'max' times. If the following pattern subsequently fails, then all of the repeated subpatterns will fail as a whole. For example, ``(?:...)++`` is equivalent to ``(?>(?:...)+)``.
+
+Scoped flags (`issue #433028 <https://bugs.python.org/issue433028>`_)
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+``(?flags-flags:...)``
+
+The flags will apply only to the subpattern. Flags can be turned on or off.
+
+Definition of 'word' character (`issue #1693050 <https://bugs.python.org/issue1693050>`_)
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+The definition of a 'word' character has been expanded for Unicode. It now conforms to the Unicode specification at ``http://www.unicode.org/reports/tr29/``.
+
+Variable-length lookbehind
+^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+A lookbehind can match a variable-length string.
+
+Flags argument for regex.split, regex.sub and regex.subn (`issue #3482 <https://bugs.python.org/issue3482>`_)
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+``regex.split``, ``regex.sub`` and ``regex.subn`` support a 'flags' argument.
+
+Pos and endpos arguments for regex.sub and regex.subn
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+``regex.sub`` and ``regex.subn`` support 'pos' and 'endpos' arguments.
+
+'Overlapped' argument for regex.findall and regex.finditer
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+``regex.findall`` and ``regex.finditer`` support an 'overlapped' flag which permits overlapped matches.
+
+Splititer
+^^^^^^^^^
+
+``regex.splititer`` has been added. It's a generator equivalent of ``regex.split``.
+
+Subscripting for groups
+^^^^^^^^^^^^^^^^^^^^^^^
+
+A match object accepts access to the captured groups via subscripting and slicing:
+
+.. sourcecode:: python
+
+  >>> m = regex.search(r"(?P<before>.*?)(?P<num>\d+)(?P<after>.*)", "pqr123stu")
+  >>> print(m["before"])
+  pqr
+  >>> print(len(m))
+  4
+  >>> print(m[:])
+  ('pqr123stu', 'pqr', '123', 'stu')
+
+Named groups
+^^^^^^^^^^^^
+
+Groups can be named with ``(?<name>...)`` as well as the current ``(?P<name>...)``.
+
+Group references
+^^^^^^^^^^^^^^^^
+
+Groups can be referenced within a pattern with ``\g<name>``. This also allows there to be more than 99 groups.
+
+Named characters
+^^^^^^^^^^^^^^^^
+
+``\N{name}``
+
+Named characters are supported. (Note: only those known by Python's Unicode database are supported.)
+
+Unicode codepoint properties, including scripts and blocks
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+``\p{property=value}``; ``\P{property=value}``; ``\p{value}`` ; ``\P{value}``
+
+Many Unicode properties are supported, including blocks and scripts. ``\p{property=value}`` or ``\p{property:value}`` matches a character whose property ``property`` has value ``value``. The inverse of ``\p{property=value}`` is ``\P{property=value}`` or ``\p{^property=value}``.
+
+If the short form ``\p{value}`` is used, the properties are checked in the order: ``General_Category``, ``Script``, ``Block``, binary property:
+
+* ``Latin``, the 'Latin' script (``Script=Latin``).
+
+* ``BasicLatin``, the 'BasicLatin' block (``Block=BasicLatin``).
+
+* ``Alphabetic``, the 'Alphabetic' binary property (``Alphabetic=Yes``).
+
+A short form starting with ``Is`` indicates a script or binary property:
+
+* ``IsLatin``, the 'Latin' script (``Script=Latin``).
+
+* ``IsAlphabetic``, the 'Alphabetic' binary property (``Alphabetic=Yes``).
+
+A short form starting with ``In`` indicates a block property:
+
+* ``InBasicLatin``, the 'BasicLatin' block (``Block=BasicLatin``).
+
+POSIX character classes
+^^^^^^^^^^^^^^^^^^^^^^^
+
+``[[:alpha:]]``; ``[[:^alpha:]]``
+
+POSIX character classes are supported. These are normally treated as an alternative form of ``\p{...}``.
+
+The exceptions are ``alnum``, ``digit``, ``punct`` and ``xdigit``, whose definitions are different from those of Unicode.
+
+``[[:alnum:]]`` is equivalent to ``\p{posix_alnum}``.
+
+``[[:digit:]]`` is equivalent to ``\p{posix_digit}``.
+
+``[[:punct:]]`` is equivalent to ``\p{posix_punct}``.
+
+``[[:xdigit:]]`` is equivalent to ``\p{posix_xdigit}``.
+
+Search anchor
+^^^^^^^^^^^^^
+
+``\G``
+
+A search anchor has been added. It matches at the position where each search started/continued and can be used for contiguous matches or in negative variable-length lookbehinds to limit how far back the lookbehind goes:
+
+.. sourcecode:: python
+
+  >>> regex.findall(r"\w{2}", "abcd ef")
+  ['ab', 'cd', 'ef']
+  >>> regex.findall(r"\G\w{2}", "abcd ef")
+  ['ab', 'cd']
+
+* The search starts at position 0 and matches 2 letters 'ab'.
+
+* The search continues at position 2 and matches 2 letters 'cd'.
+
+* The search continues at position 4 and fails to match any letters.
+
+* The anchor stops the search start position from being advanced, so there are no more results.
+
+Reverse searching
+^^^^^^^^^^^^^^^^^
+
+Searches can now work backwards:
+
+.. sourcecode:: python
+
+  >>> regex.findall(r".", "abc")
+  ['a', 'b', 'c']
+  >>> regex.findall(r"(?r).", "abc")
+  ['c', 'b', 'a']
+
+Note: the result of a reverse search is not necessarily the reverse of a forward search:
+
+.. sourcecode:: python
+
+  >>> regex.findall(r"..", "abcde")
+  ['ab', 'cd']
+  >>> regex.findall(r"(?r)..", "abcde")
+  ['de', 'bc']
+
+Matching a single grapheme
+^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+``\X``
+
+The grapheme matcher is supported. It now conforms to the Unicode specification at ``http://www.unicode.org/reports/tr29/``.
+
+Branch reset
+^^^^^^^^^^^^
+
+``(?|...|...)``
+
+Capture group numbers will be reused across the alternatives, but groups with different names will have different group numbers.
+
+Examples:
+
+.. sourcecode:: python
+
+  >>> regex.match(r"(?|(first)|(second))", "first").groups()
+  ('first',)
+  >>> regex.match(r"(?|(first)|(second))", "second").groups()
+  ('second',)
+
+Note that there is only one group.
+
+Default Unicode word boundary
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+The ``WORD`` flag changes the definition of a 'word boundary' to that of a default Unicode word boundary. This applies to ``\b`` and ``\B``.
+
+Timeout (Python 3)
+^^^^^^^^^^^^^^^^^^
+
+The matching methods and functions support timeouts. The timeout (in seconds) applies to the entire operation:
+
+.. sourcecode:: python
+
+  >>> from time import sleep
+  >>>
+  >>> def fast_replace(m):
+  ...     return 'X'
+  ...
+  >>> def slow_replace(m):
+  ...     sleep(0.5)
+  ...     return 'X'
+  ...
+  >>> regex.sub(r'[a-z]', fast_replace, 'abcde', timeout=2)
+  'XXXXX'
+  >>> regex.sub(r'[a-z]', slow_replace, 'abcde', timeout=2)
+  Traceback (most recent call last):
+    File "<stdin>", line 1, in <module>
+    File "C:\Python37\lib\site-packages\regex\regex.py", line 276, in sub
+      endpos, concurrent, timeout)
+  TimeoutError: regex timed out
diff --git a/docs/Features.html b/docs/Features.html
index cb4b13a..34d0e4b 100644
--- a/docs/Features.html
+++ b/docs/Features.html
@@ -3,7 +3,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
-<meta name="generator" content="Docutils 0.14: http://docutils.sourceforge.net/" />
+<meta name="generator" content="Docutils 0.15.2: http://docutils.sourceforge.net/" />
 <title>Features.rst</title>
 <style type="text/css">
 
@@ -461,14 +461,14 @@ ul.auto-toc {
 </div>
 <div class="section" id="unicode">
 <h1>Unicode</h1>
-<p>This module supports Unicode 12.1.0.</p>
+<p>This module supports Unicode 13.0.0.</p>
 <p>Full Unicode case-folding is supported.</p>
 </div>
 <div class="section" id="additional-features">
 <h1>Additional features</h1>
 <p>The issue numbers relate to the Python bug tracker, except where listed as &quot;Hg issue&quot;.</p>
-<ul>
-<li><p class="first">Added support for lookaround in conditional pattern (<a class="reference external" href="https://bitbucket.org/mrabarnett/mrab-regex/issues/163">Hg issue 163</a>)</p>
+<div class="section" id="added-support-for-lookaround-in-conditional-pattern-hg-issue-163">
+<h2>Added support for lookaround in conditional pattern (<a class="reference external" href="https://bitbucket.org/mrabarnett/mrab-regex/issues/163">Hg issue 163</a>)</h2>
 <p>The test of a conditional pattern can now be a lookaround.</p>
 <p>Examples:</p>
 <pre class="code python literal-block">
@@ -486,8 +486,9 @@ ul.auto-toc {
 <span class="name builtin pseudo">None</span>
 </pre>
 <p>In the first example, the lookaround matched, but the remainder of the first branch failed to match, and so the second branch was attempted, whereas in the second example, the lookaround matched, and the first branch failed to match, but the second branch was <strong>not</strong> attempted.</p>
-</li>
-<li><p class="first">Added POSIX matching (leftmost longest) (<a class="reference external" href="https://bitbucket.org/mrabarnett/mrab-regex/issues/150">Hg issue 150</a>)</p>
+</div>
+<div class="section" id="added-posix-matching-leftmost-longest-hg-issue-150">
+<h2>Added POSIX matching (leftmost longest) (<a class="reference external" href="https://bitbucket.org/mrabarnett/mrab-regex/issues/150">Hg issue 150</a>)</h2>
 <p>The POSIX standard for regex is to return the leftmost longest match. This can be turned on using the <tt class="docutils literal">POSIX</tt> flag (<tt class="docutils literal"><span class="pre">(?p)</span></tt>).</p>
 <p>Examples:</p>
 <pre class="code python literal-block">
@@ -503,21 +504,24 @@ ul.auto-toc {
 <span class="operator">&lt;</span><span class="name">regex</span><span class="operator">.</span><span class="name">Match</span> <span class="name builtin">object</span><span class="punctuation">;</span> <span class="name">span</span><span class="operator">=</span><span class="punctuation">(</span><span class="literal number integer">0</span><span class="punctuation">,</span> <span class="literal number integer">17</span><span class="punctuation">),</span> <span class="name">match</span><span class="operator">=</span><span class="literal string single">'oneselfsufficient'</span><span class="operator">&gt;</span>
 </pre>
 <p>Note that it will take longer to find matches because when it finds a match at a certain position, it won't return that immediately, but will keep looking to see if there's another longer match there.</p>
-</li>
-<li><p class="first">Added <tt class="docutils literal"><span class="pre">(?(DEFINE)...)</span></tt> (<a class="reference external" href="https://bitbucket.org/mrabarnett/mrab-regex/issues/152">Hg issue 152</a>)</p>
+</div>
+<div class="section" id="added-define-hg-issue-152">
+<h2>Added <tt class="docutils literal"><span class="pre">(?(DEFINE)...)</span></tt> (<a class="reference external" href="https://bitbucket.org/mrabarnett/mrab-regex/issues/152">Hg issue 152</a>)</h2>
 <p>If there's no group called &quot;DEFINE&quot;, then ... will be ignored, but any group definitions within it will be available.</p>
 <p>Examples:</p>
 <pre class="code python literal-block">
 <span class="operator">&gt;&gt;&gt;</span> <span class="name">regex</span><span class="operator">.</span><span class="name">search</span><span class="punctuation">(</span><span class="literal string affix">r</span><span class="literal string single">'(?(DEFINE)(?P&lt;quant&gt;\d+)(?P&lt;item&gt;\w+))(?&amp;quant) (?&amp;item)'</span><span class="punctuation">,</span> <span class="literal string single">'5 elephants'</span><span class="punctuation">)</span>
 <span class="operator">&lt;</span><span class="name">regex</span><span class="operator">.</span><span class="name">Match</span> <span class="name builtin">object</span><span class="punctuation">;</span> <span class="name">span</span><span class="operator">=</span><span class="punctuation">(</span><span class="literal number integer">0</span><span class="punctuation">,</span> <span class="literal number integer">11</span><span class="punctuation">),</span> <span class="name">match</span><span class="operator">=</span><span class="literal string single">'5 elephants'</span><span class="operator">&gt;</span>
 </pre>
-</li>
-<li><p class="first">Added <tt class="docutils literal">(*PRUNE)</tt>, <tt class="docutils literal">(*SKIP)</tt> and <tt class="docutils literal">(*FAIL)</tt> (<a class="reference external" href="https://bitbucket.org/mrabarnett/mrab-regex/issues/153">Hg issue 153</a>)</p>
+</div>
+<div class="section" id="added-prune-skip-and-fail-hg-issue-153">
+<h2>Added <tt class="docutils literal">(*PRUNE)</tt>, <tt class="docutils literal">(*SKIP)</tt> and <tt class="docutils literal">(*FAIL)</tt> (<a class="reference external" href="https://bitbucket.org/mrabarnett/mrab-regex/issues/153">Hg issue 153</a>)</h2>
 <p><tt class="docutils literal">(*PRUNE)</tt> discards the backtracking info up to that point. When used in an atomic group or a lookaround, it won't affect the enclosing pattern.</p>
 <p><tt class="docutils literal">(*SKIP)</tt> is similar to <tt class="docutils literal">(*PRUNE)</tt>, except that it also sets where in the text the next attempt to match will start. When used in an atomic group or a lookaround, it won't affect the enclosing pattern.</p>
 <p><tt class="docutils literal">(*FAIL)</tt> causes immediate backtracking. <tt class="docutils literal">(*F)</tt> is a permitted abbreviation.</p>
-</li>
-<li><p class="first">Added <tt class="docutils literal">\K</tt> (<a class="reference external" href="https://bitbucket.org/mrabarnett/mrab-regex/issues/151">Hg issue 151</a>)</p>
+</div>
+<div class="section" id="added-k-hg-issue-151">
+<h2>Added <tt class="docutils literal">\K</tt> (<a class="reference external" href="https://bitbucket.org/mrabarnett/mrab-regex/issues/151">Hg issue 151</a>)</h2>
 <p>Keeps the part of the entire match after the position where <tt class="docutils literal">\K</tt> occurred; the part before it is discarded.</p>
 <p>It does not affect what capture groups return.</p>
 <p>Examples:</p>
@@ -534,8 +538,9 @@ ul.auto-toc {
 <span class="operator">&gt;&gt;&gt;</span> <span class="name">m</span><span class="punctuation">[</span><span class="literal number integer">1</span><span class="punctuation">]</span>
 <span class="literal string single">'bcdef'</span>
 </pre>
-</li>
-<li><p class="first">Added capture subscripting for <tt class="docutils literal">expandf</tt> and <tt class="docutils literal">subf</tt>/<tt class="docutils literal">subfn</tt> (<a class="reference external" href="https://bitbucket.org/mrabarnett/mrab-regex/issues/133">Hg issue 133</a>)</p>
+</div>
+<div class="section" id="added-capture-subscripting-for-expandf-and-subf-subfn-hg-issue-133">
+<h2>Added capture subscripting for <tt class="docutils literal">expandf</tt> and <tt class="docutils literal">subf</tt>/<tt class="docutils literal">subfn</tt> (<a class="reference external" href="https://bitbucket.org/mrabarnett/mrab-regex/issues/133">Hg issue 133</a>)</h2>
 <p>You can now use subscripting to get the captures of a repeated capture group.</p>
 <p>Examples:</p>
 <pre class="code python literal-block">
@@ -555,14 +560,17 @@ ul.auto-toc {
 <span class="operator">&gt;&gt;&gt;</span> <span class="name">m</span><span class="operator">.</span><span class="name">expandf</span><span class="punctuation">(</span><span class="literal string double">&quot;{letter[-1]} {letter[-2]} {letter[-3]}&quot;</span><span class="punctuation">)</span>
 <span class="literal string single">'c b a'</span>
 </pre>
-</li>
-<li><p class="first">Added support for referring to a group by number using <tt class="docutils literal"><span class="pre">(?P=...)</span></tt>.</p>
+</div>
+<div class="section" id="added-support-for-referring-to-a-group-by-number-using-p">
+<h2>Added support for referring to a group by number using <tt class="docutils literal"><span class="pre">(?P=...)</span></tt>.</h2>
 <p>This is in addition to the existing <tt class="docutils literal"><span class="pre">\g&lt;...&gt;</span></tt>.</p>
-</li>
-<li><p class="first">Fixed the handling of locale-sensitive regexes.</p>
+</div>
+<div class="section" id="fixed-the-handling-of-locale-sensitive-regexes">
+<h2>Fixed the handling of locale-sensitive regexes.</h2>
 <p>The <tt class="docutils literal">LOCALE</tt> flag is intended for legacy code and has limited support. You're still recommended to use Unicode instead.</p>
-</li>
-<li><p class="first">Added partial matches (<a class="reference external" href="https://bitbucket.org/mrabarnett/mrab-regex/issues/102">Hg issue 102</a>)</p>
+</div>
+<div class="section" id="added-partial-matches-hg-issue-102">
+<h2>Added partial matches (<a class="reference external" href="https://bitbucket.org/mrabarnett/mrab-regex/issues/102">Hg issue 102</a>)</h2>
 <p>A partial match is one that matches up to the end of string, but that string has been truncated and you want to know whether a complete match could be possible if the string had not been truncated.</p>
 <p>Partial matches are supported by <tt class="docutils literal">match</tt>, <tt class="docutils literal">search</tt>, <tt class="docutils literal">fullmatch</tt> and <tt class="docutils literal">finditer</tt> with the <tt class="docutils literal">partial</tt> keyword argument.</p>
 <p>Match objects have a <tt class="docutils literal">partial</tt> attribute, which is <tt class="docutils literal">True</tt> if it's a partial match.</p>
@@ -608,8 +616,9 @@ ul.auto-toc {
 <span class="operator">&gt;&gt;&gt;</span> <span class="name">pattern</span><span class="operator">.</span><span class="name">match</span><span class="punctuation">(</span><span class="literal string single">'1233'</span><span class="punctuation">,</span> <span class="name">partial</span><span class="operator">=</span><span class="name builtin pseudo">True</span><span class="punctuation">)</span><span class="operator">.</span><span class="name">partial</span>
 <span class="name builtin pseudo">False</span>
 </pre>
-</li>
-<li><p class="first"><tt class="docutils literal">*</tt> operator not working correctly with sub() (<a class="reference external" href="https://bitbucket.org/mrabarnett/mrab-regex/issues/106">Hg issue 106</a>)</p>
+</div>
+<div class="section" id="operator-not-working-correctly-with-sub-hg-issue-106">
+<h2><tt class="docutils literal">*</tt> operator not working correctly with sub() (<a class="reference external" href="https://bitbucket.org/mrabarnett/mrab-regex/issues/106">Hg issue 106</a>)</h2>
 <p>Sometimes it's not clear how zero-width matches should be handled. For example, should <tt class="docutils literal">.*</tt> match 0 characters directly after matching &gt;0 characters?</p>
 <p>Examples:</p>
 <pre class="code python literal-block">
@@ -629,8 +638,9 @@ ul.auto-toc {
 <span class="operator">&gt;&gt;&gt;</span> <span class="name">regex</span><span class="operator">.</span><span class="name">sub</span><span class="punctuation">(</span><span class="literal string single">'(?V1).*?'</span><span class="punctuation">,</span> <span class="literal string single">'|'</span><span class="punctuation">,</span> <span class="literal string single">'test'</span><span class="punctuation">)</span>
 <span class="literal string single">'|||||||||'</span>
 </pre>
-</li>
-<li><p class="first">Added <tt class="docutils literal">capturesdict</tt> (<a class="reference external" href="https://bitbucket.org/mrabarnett/mrab-regex/issues/86">Hg issue 86</a>)</p>
+</div>
+<div class="section" id="added-capturesdict-hg-issue-86">
+<h2>Added <tt class="docutils literal">capturesdict</tt> (<a class="reference external" href="https://bitbucket.org/mrabarnett/mrab-regex/issues/86">Hg issue 86</a>)</h2>
 <p><tt class="docutils literal">capturesdict</tt> is a combination of <tt class="docutils literal">groupdict</tt> and <tt class="docutils literal">captures</tt>:</p>
 <p><tt class="docutils literal">groupdict</tt> returns a dict of the named groups and the last capture of those groups.</p>
 <p><tt class="docutils literal">captures</tt> returns a list of all the captures of a group</p>
@@ -647,8 +657,9 @@ ul.auto-toc {
 <span class="operator">&gt;&gt;&gt;</span> <span class="name">m</span><span class="operator">.</span><span class="name">capturesdict</span><span class="punctuation">()</span>
 <span class="punctuation">{</span><span class="literal string single">'word'</span><span class="punctuation">:</span> <span class="punctuation">[</span><span class="literal string single">'one'</span><span class="punctuation">,</span> <span class="literal string single">'two'</span><span class="punctuation">,</span> <span class="literal string single">'three'</span><span class="punctuation">],</span> <span class="literal string single">'digits'</span><span class="punctuation">:</span> <span class="punctuation">[</span><span class="literal string single">'1'</span><span class="punctuation">,</span> <span class="literal string single">'2'</span><span class="punctuation">,</span> <span class="literal string single">'3'</span><span class="punctuation">]}</span>
 </pre>
-</li>
-<li><p class="first">Allow duplicate names of groups (<a class="reference external" href="https://bitbucket.org/mrabarnett/mrab-regex/issues/87">Hg issue 87</a>)</p>
+</div>
+<div class="section" id="allow-duplicate-names-of-groups-hg-issue-87">
+<h2>Allow duplicate names of groups (<a class="reference external" href="https://bitbucket.org/mrabarnett/mrab-regex/issues/87">Hg issue 87</a>)</h2>
 <p>Group names can now be duplicated.</p>
 <p>Examples:</p>
 <pre class="code python literal-block">
@@ -694,8 +705,9 @@ ul.auto-toc {
 <span class="operator">&gt;&gt;&gt;</span> <span class="name">m</span><span class="operator">.</span><span class="name">captures</span><span class="punctuation">(</span><span class="literal string double">&quot;item&quot;</span><span class="punctuation">)</span>
 <span class="punctuation">[</span><span class="literal string single">'first'</span><span class="punctuation">,</span> <span class="literal string single">''</span><span class="punctuation">]</span>
 </pre>
-</li>
-<li><p class="first">Added <tt class="docutils literal">fullmatch</tt> (<a class="reference external" href="https://bugs.python.org/issue16203">issue #16203</a>)</p>
+</div>
+<div class="section" id="added-fullmatch-issue-16203">
+<h2>Added <tt class="docutils literal">fullmatch</tt> (<a class="reference external" href="https://bugs.python.org/issue16203">issue #16203</a>)</h2>
 <p><tt class="docutils literal">fullmatch</tt> behaves like <tt class="docutils literal">match</tt>, except that it must match all of the string.</p>
 <p>Examples:</p>
 <pre class="code python literal-block">
@@ -713,8 +725,9 @@ ul.auto-toc {
 <span class="operator">&gt;&gt;&gt;</span> <span class="name">regex</span><span class="operator">.</span><span class="name">fullmatch</span><span class="punctuation">(</span><span class="literal string affix">r</span><span class="literal string double">&quot;a.*?&quot;</span><span class="punctuation">,</span> <span class="literal string double">&quot;abcd&quot;</span><span class="punctuation">)</span><span class="operator">.</span><span class="name">group</span><span class="punctuation">(</span><span class="literal number integer">0</span><span class="punctuation">)</span>
 <span class="literal string single">'abcd'</span>
 </pre>
-</li>
-<li><p class="first">Added <tt class="docutils literal">subf</tt> and <tt class="docutils literal">subfn</tt></p>
+</div>
+<div class="section" id="added-subf-and-subfn">
+<h2>Added <tt class="docutils literal">subf</tt> and <tt class="docutils literal">subfn</tt></h2>
 <p><tt class="docutils literal">subf</tt> and <tt class="docutils literal">subfn</tt> are alternatives to <tt class="docutils literal">sub</tt> and <tt class="docutils literal">subn</tt> respectively. When passed a replacement string, they treat it as a format string.</p>
 <p>Examples:</p>
 <pre class="code python literal-block">
@@ -723,8 +736,9 @@ ul.auto-toc {
 <span class="operator">&gt;&gt;&gt;</span> <span class="name">regex</span><span class="operator">.</span><span class="name">subf</span><span class="punctuation">(</span><span class="literal string affix">r</span><span class="literal string double">&quot;(?P&lt;word1&gt;\w+) (?P&lt;word2&gt;\w+)&quot;</span><span class="punctuation">,</span> <span class="literal string double">&quot;{word2} {word1}&quot;</span><span class="punctuation">,</span> <span class="literal string double">&quot;foo bar&quot;</span><span class="punctuation">)</span>
 <span class="literal string single">'bar foo'</span>
 </pre>
-</li>
-<li><p class="first">Added <tt class="docutils literal">expandf</tt> to match object</p>
+</div>
+<div class="section" id="added-expandf-to-match-object">
+<h2>Added <tt class="docutils literal">expandf</tt> to match object</h2>
 <p><tt class="docutils literal">expandf</tt> is an alternative to <tt class="docutils literal">expand</tt>. When passed a replacement string, it treats it as a format string.</p>
 <p>Examples:</p>
 <pre class="code python literal-block">
@@ -736,8 +750,9 @@ ul.auto-toc {
 <span class="operator">&gt;&gt;&gt;</span> <span class="name">m</span><span class="operator">.</span><span class="name">expandf</span><span class="punctuation">(</span><span class="literal string double">&quot;{word2} {word1}&quot;</span><span class="punctuation">)</span>
 <span class="literal string single">'bar foo'</span>
 </pre>
-</li>
-<li><p class="first">Detach searched string</p>
+</div>
+<div class="section" id="detach-searched-string">
+<h2>Detach searched string</h2>
 <p>A match object contains a reference to the string that was searched, via its <tt class="docutils literal">string</tt> attribute. The <tt class="docutils literal">detach_string</tt> method will 'detach' that string, making it available for garbage collection, which might save valuable memory if that string is very large.</p>
 <p>Example:</p>
 <pre class="code python literal-block">
@@ -752,8 +767,9 @@ ul.auto-toc {
 <span class="operator">&gt;&gt;&gt;</span> <span class="keyword">print</span><span class="punctuation">(</span><span class="name">m</span><span class="operator">.</span><span class="name">string</span><span class="punctuation">)</span>
 <span class="name builtin pseudo">None</span>
 </pre>
-</li>
-<li><p class="first">Recursive patterns (<a class="reference external" href="https://bitbucket.org/mrabarnett/mrab-regex/issues/27">Hg issue 27</a>)</p>
+</div>
+<div class="section" id="recursive-patterns-hg-issue-27">
+<h2>Recursive patterns (<a class="reference external" href="https://bitbucket.org/mrabarnett/mrab-regex/issues/27">Hg issue 27</a>)</h2>
 <p>Recursive and repeated patterns are supported.</p>
 <p><tt class="docutils literal"><span class="pre">(?R)</span></tt> or <tt class="docutils literal"><span class="pre">(?0)</span></tt> tries to match the entire regex recursively. <tt class="docutils literal"><span class="pre">(?1)</span></tt>, <tt class="docutils literal"><span class="pre">(?2)</span></tt>, etc, try to match the relevant capture group.</p>
 <p><tt class="docutils literal"><span class="pre">(?&amp;name)</span></tt> tries to match the named capture group.</p>
@@ -772,8 +788,9 @@ ul.auto-toc {
 <p>It's possible to backtrack into a recursed or repeated group.</p>
 <p>You can't call a group if there is more than one group with that group name or group number (<tt class="docutils literal">&quot;ambiguous group reference&quot;</tt>).</p>
 <p>The alternative forms <tt class="docutils literal"><span class="pre">(?P&gt;name)</span></tt> and <tt class="docutils literal"><span class="pre">(?P&amp;name)</span></tt> are also supported.</p>
-</li>
-<li><p class="first">Full Unicode case-folding is supported.</p>
+</div>
+<div class="section" id="full-unicode-case-folding-is-supported">
+<h2>Full Unicode case-folding is supported.</h2>
 <p>In version 1 behaviour, the regex module uses full case-folding when performing case-insensitive matches in Unicode.</p>
 <p>Examples (in Python 3):</p>
 <pre class="code python literal-block">
@@ -783,8 +800,9 @@ ul.auto-toc {
 <span class="punctuation">(</span><span class="literal number integer">0</span><span class="punctuation">,</span> <span class="literal number integer">7</span><span class="punctuation">)</span>
 </pre>
 <p>In version 0 behaviour, it uses simple case-folding for backward compatibility with the re module.</p>
-</li>
-<li><p class="first">Approximate &quot;fuzzy&quot; matching (<a class="reference external" href="https://bitbucket.org/mrabarnett/mrab-regex/issues/12">Hg issue 12</a>, <a class="reference external" href="https://bitbucket.org/mrabarnett/mrab-regex/issues/41">Hg issue 41</a>, <a class="reference external" href="https://bitbucket.org/mrabarnett/mrab-regex/issues/109">Hg issue 109</a>)</p>
+</div>
+<div class="section" id="approximate-fuzzy-matching-hg-issue-12-hg-issue-41-hg-issue-109">
+<h2>Approximate &quot;fuzzy&quot; matching (<a class="reference external" href="https://bitbucket.org/mrabarnett/mrab-regex/issues/12">Hg issue 12</a>, <a class="reference external" href="https://bitbucket.org/mrabarnett/mrab-regex/issues/41">Hg issue 41</a>, <a class="reference external" href="https://bitbucket.org/mrabarnett/mrab-regex/issues/109">Hg issue 109</a>)</h2>
 <p>Regex usually attempts an exact match, but sometimes an approximate, or &quot;fuzzy&quot;, match is needed, for those cases where the text being searched may contain errors in the form of inserted, deleted or substituted characters.</p>
 <p>A fuzzy regex specifies which types of errors are permitted, and, optionally, either the minimum and maximum or only the maximum permitted number of each type. (You cannot specify only a minimum.)</p>
 <p>The 3 types of error are:</p>
@@ -873,8 +891,9 @@ ul.auto-toc {
 <pre class="code python literal-block">
 <span class="literal string single">'anaconda foo bar'</span>
 </pre>
-</li>
-<li><p class="first">Named lists (<a class="reference external" href="https://bitbucket.org/mrabarnett/mrab-regex/issues/11">Hg issue 11</a>)</p>
+</div>
+<div class="section" id="named-lists-hg-issue-11">
+<h2>Named lists (<a class="reference external" href="https://bitbucket.org/mrabarnett/mrab-regex/issues/11">Hg issue 11</a>)</h2>
 <p><tt class="docutils literal">\L&lt;name&gt;</tt></p>
 <p>There are occasions where you may want to include a list (actually, a set) of options in a regex.</p>
 <p>One way is to build the pattern like this:</p>
@@ -895,17 +914,34 @@ ul.auto-toc {
 <span class="comment single"># Python 2</span>
 <span class="punctuation">{</span><span class="literal string single">'options'</span><span class="punctuation">:</span> <span class="name builtin">frozenset</span><span class="punctuation">([</span><span class="literal string single">'fifth'</span><span class="punctuation">,</span> <span class="literal string single">'fourth'</span><span class="punctuation">,</span> <span class="literal string single">'second'</span><span class="punctuation">,</span> <span class="literal string single">'third'</span><span class="punctuation">,</span> <span class="literal string single">'first'</span><span class="punctuation">])}</span>
 </pre>
-</li>
-<li><p class="first">Start and end of word</p>
+<p>If there are any unused keyword arguments, <tt class="docutils literal">ValueError</tt> will be raised unless you tell it otherwise:</p>
+<pre class="code python literal-block">
+<span class="operator">&gt;&gt;&gt;</span> <span class="name">option_set</span> <span class="operator">=</span> <span class="punctuation">[</span><span class="literal string double">&quot;first&quot;</span><span class="punctuation">,</span> <span class="literal string double">&quot;second&quot;</span><span class="punctuation">,</span> <span class="literal string double">&quot;third&quot;</span><span class="punctuation">,</span> <span class="literal string double">&quot;fourth&quot;</span><span class="punctuation">,</span> <span class="literal string double">&quot;fifth&quot;</span><span class="punctuation">]</span>
+<span class="operator">&gt;&gt;&gt;</span> <span class="name">p</span> <span class="operator">=</span> <span class="name">regex</span><span class="operator">.</span><span class="name">compile</span><span class="punctuation">(</span><span class="literal string affix">r</span><span class="literal string double">&quot;\L&lt;options&gt;&quot;</span><span class="punctuation">,</span> <span class="name">options</span><span class="operator">=</span><span class="name">option_set</span><span class="punctuation">,</span> <span class="name">other_options</span><span class="operator">=</span><span class="punctuation">[])</span>
+<span class="name">Traceback</span> <span class="punctuation">(</span><span class="name">most</span> <span class="name">recent</span> <span class="name">call</span> <span class="name">last</span><span class="punctuation">):</span>
+  <span class="name">File</span> <span class="literal string double">&quot;&lt;stdin&gt;&quot;</span><span class="punctuation">,</span> <span class="name">line</span> <span class="literal number integer">1</span><span class="punctuation">,</span> <span class="operator word">in</span> <span class="operator">&lt;</span><span class="name">module</span><span class="operator">&gt;</span>
+  <span class="name">File</span> <span class="literal string double">&quot;C:\Python37\lib\site-packages</span><span class="literal string escape">\r</span><span class="literal string double">egex</span><span class="literal string escape">\r</span><span class="literal string double">egex.py&quot;</span><span class="punctuation">,</span> <span class="name">line</span> <span class="literal number integer">348</span><span class="punctuation">,</span> <span class="operator word">in</span> <span class="name builtin">compile</span>
+    <span class="keyword">return</span> <span class="name">_compile</span><span class="punctuation">(</span><span class="name">pattern</span><span class="punctuation">,</span> <span class="name">flags</span><span class="punctuation">,</span> <span class="name">ignore_unused</span><span class="punctuation">,</span> <span class="name">kwargs</span><span class="punctuation">)</span>
+  <span class="name">File</span> <span class="literal string double">&quot;C:\Python37\lib\site-packages</span><span class="literal string escape">\r</span><span class="literal string double">egex</span><span class="literal string escape">\r</span><span class="literal string double">egex.py&quot;</span><span class="punctuation">,</span> <span class="name">line</span> <span class="literal number integer">585</span><span class="punctuation">,</span> <span class="operator word">in</span> <span class="name">_compile</span>
+    <span class="keyword">raise</span> <span class="name exception">ValueError</span><span class="punctuation">(</span><span class="literal string single">'unused keyword argument {!a}'</span><span class="operator">.</span><span class="name">format</span><span class="punctuation">(</span><span class="name">any_one</span><span class="punctuation">))</span>
+<span class="name exception">ValueError</span><span class="punctuation">:</span> <span class="name">unused</span> <span class="name">keyword</span> <span class="name">argument</span> <span class="literal string single">'other_options'</span>
+<span class="operator">&gt;&gt;&gt;</span> <span class="name">p</span> <span class="operator">=</span> <span class="name">regex</span><span class="operator">.</span><span class="name">compile</span><span class="punctuation">(</span><span class="literal string affix">r</span><span class="literal string double">&quot;\L&lt;options&gt;&quot;</span><span class="punctuation">,</span> <span class="name">options</span><span class="operator">=</span><span class="name">option_set</span><span class="punctuation">,</span> <span class="name">other_options</span><span class="operator">=</span><span class="punctuation">[],</span> <span class="name">ignore_unused</span><span class="operator">=</span><span class="name builtin pseudo">True</span><span class="punctuation">)</span>
+<span class="operator">&gt;&gt;&gt;</span>
+</pre>
+</div>
+<div class="section" id="start-and-end-of-word">
+<h2>Start and end of word</h2>
 <p><tt class="docutils literal">\m</tt> matches at the start of a word.</p>
 <p><tt class="docutils literal">\M</tt> matches at the end of a word.</p>
 <p>Compare with <tt class="docutils literal">\b</tt>, which matches at the start or end of a word.</p>
-</li>
-<li><p class="first">Unicode line separators</p>
+</div>
+<div class="section" id="unicode-line-separators">
+<h2>Unicode line separators</h2>
 <p>Normally the only line separator is <tt class="docutils literal">\n</tt> (<tt class="docutils literal">\x0A</tt>), but if the <tt class="docutils literal">WORD</tt> flag is turned on then the line separators are <tt class="docutils literal">\x0D\x0A</tt>, <tt class="docutils literal">\x0A</tt>, <tt class="docutils literal">\x0B</tt>, <tt class="docutils literal">\x0C</tt> and <tt class="docutils literal">\x0D</tt>, plus <tt class="docutils literal">\x85</tt>, <tt class="docutils literal">\u2028</tt> and <tt class="docutils literal">\u2029</tt> when working with Unicode.</p>
 <p>This affects the regex dot <tt class="docutils literal">&quot;.&quot;</tt>, which, with the <tt class="docutils literal">DOTALL</tt> flag turned off, matches any character except a line separator. It also affects the line anchors <tt class="docutils literal">^</tt> and <tt class="docutils literal">$</tt> (in multiline mode).</p>
-</li>
-<li><p class="first">Set operators</p>
+</div>
+<div class="section" id="set-operators">
+<h2>Set operators</h2>
 <p><strong>Version 1 behaviour only</strong></p>
 <p>Set operators have been added, and a set <tt class="docutils literal"><span class="pre">[...]</span></tt> can include nested sets.</p>
 <p>The operators, in order of increasing precedence, are:</p>
@@ -926,8 +962,9 @@ ul.auto-toc {
 <li><tt class="docutils literal"><span class="pre">[\p{N}--[0-9]]</span></tt> # Set containing all numbers except '0' .. '9'</li>
 <li><tt class="docutils literal"><span class="pre">[\p{ASCII}&amp;&amp;\p{Letter}]</span></tt> # Set containing all characters which are ASCII and letter</li>
 </ul>
-</li>
-<li><p class="first">regex.escape (<a class="reference external" href="https://bugs.python.org/issue2650">issue #2650</a>)</p>
+</div>
+<div class="section" id="regex-escape-issue-2650">
+<h2>regex.escape (<a class="reference external" href="https://bugs.python.org/issue2650">issue #2650</a>)</h2>
 <p>regex.escape has an additional keyword parameter <tt class="docutils literal">special_only</tt>. When True, only 'special' regex characters, such as '?', are escaped.</p>
 <p>Examples:</p>
 <pre class="code python literal-block">
@@ -936,8 +973,9 @@ ul.auto-toc {
 <span class="operator">&gt;&gt;&gt;</span> <span class="name">regex</span><span class="operator">.</span><span class="name">escape</span><span class="punctuation">(</span><span class="literal string double">&quot;foo!?&quot;</span><span class="punctuation">,</span> <span class="name">special_only</span><span class="operator">=</span><span class="name builtin pseudo">True</span><span class="punctuation">)</span>
 <span class="literal string single">'foo!</span><span class="literal string escape">\\</span><span class="literal string single">?'</span>
 </pre>
-</li>
-<li><p class="first">regex.escape (<a class="reference external" href="https://bitbucket.org/mrabarnett/mrab-regex/issues/249">Hg issue 249</a>)</p>
+</div>
+<div class="section" id="regex-escape-hg-issue-249">
+<h2>regex.escape (<a class="reference external" href="https://bitbucket.org/mrabarnett/mrab-regex/issues/249">Hg issue 249</a>)</h2>
 <p>regex.escape has an additional keyword parameter <tt class="docutils literal">literal_spaces</tt>. When True, spaces are not escaped.</p>
 <p>Examples:</p>
 <pre class="code python literal-block">
@@ -946,8 +984,9 @@ ul.auto-toc {
 <span class="operator">&gt;&gt;&gt;</span> <span class="name">regex</span><span class="operator">.</span><span class="name">escape</span><span class="punctuation">(</span><span class="literal string double">&quot;foo bar!?&quot;</span><span class="punctuation">,</span> <span class="name">literal_spaces</span><span class="operator">=</span><span class="name builtin pseudo">True</span><span class="punctuation">)</span>
 <span class="literal string single">'foo bar!</span><span class="literal string escape">\\</span><span class="literal string single">?'</span>
 </pre>
-</li>
-<li><p class="first">Repeated captures (<a class="reference external" href="https://bugs.python.org/issue7132">issue #7132</a>)</p>
+</div>
+<div class="section" id="repeated-captures-issue-7132">
+<h2>Repeated captures (<a class="reference external" href="https://bugs.python.org/issue7132">issue #7132</a>)</h2>
 <p>A match object has additional methods which return information on all the successful matches of a repeated capture group. These methods are:</p>
 <ul class="simple">
 <li><tt class="docutils literal"><span class="pre">matchobject.captures([group1,</span> <span class="pre">...])</span></tt><ul>
@@ -987,38 +1026,48 @@ ul.auto-toc {
 <span class="operator">&gt;&gt;&gt;</span> <span class="name">m</span><span class="operator">.</span><span class="name">spans</span><span class="punctuation">(</span><span class="literal number integer">1</span><span class="punctuation">)</span>
 <span class="punctuation">[(</span><span class="literal number integer">0</span><span class="punctuation">,</span> <span class="literal number integer">3</span><span class="punctuation">),</span> <span class="punctuation">(</span><span class="literal number integer">3</span><span class="punctuation">,</span> <span class="literal number integer">6</span><span class="punctuation">),</span> <span class="punctuation">(</span><span class="literal number integer">6</span><span class="punctuation">,</span> <span class="literal number integer">9</span><span class="punctuation">)]</span>
 </pre>
-</li>
-<li><p class="first">Atomic grouping (<a class="reference external" href="https://bugs.python.org/issue433030">issue #433030</a>)</p>
+</div>
+<div class="section" id="atomic-grouping-issue-433030">
+<h2>Atomic grouping (<a class="reference external" href="https://bugs.python.org/issue433030">issue #433030</a>)</h2>
 <p><tt class="docutils literal"><span class="pre">(?&gt;...)</span></tt></p>
 <p>If the following pattern subsequently fails, then the subpattern as a whole will fail.</p>
-</li>
-<li><p class="first">Possessive quantifiers.</p>
+</div>
+<div class="section" id="possessive-quantifiers">
+<h2>Possessive quantifiers.</h2>
 <p><tt class="docutils literal"><span class="pre">(?:...)?+</span></tt> ; <tt class="docutils literal"><span class="pre">(?:...)*+</span></tt> ; <tt class="docutils literal"><span class="pre">(?:...)++</span></tt> ; <tt class="docutils literal"><span class="pre">(?:...){min,max}+</span></tt></p>
 <p>The subpattern is matched up to 'max' times. If the following pattern subsequently fails, then all of the repeated subpatterns will fail as a whole. For example, <tt class="docutils literal"><span class="pre">(?:...)++</span></tt> is equivalent to <tt class="docutils literal"><span class="pre">(?&gt;(?:...)+)</span></tt>.</p>
-</li>
-<li><p class="first">Scoped flags (<a class="reference external" href="https://bugs.python.org/issue433028">issue #433028</a>)</p>
+</div>
+<div class="section" id="scoped-flags-issue-433028">
+<h2>Scoped flags (<a class="reference external" href="https://bugs.python.org/issue433028">issue #433028</a>)</h2>
 <p><tt class="docutils literal"><span class="pre">(?flags-flags:...)</span></tt></p>
 <p>The flags will apply only to the subpattern. Flags can be turned on or off.</p>
-</li>
-<li><p class="first">Definition of 'word' character (<a class="reference external" href="https://bugs.python.org/issue1693050">issue #1693050</a>)</p>
+</div>
+<div class="section" id="definition-of-word-character-issue-1693050">
+<h2>Definition of 'word' character (<a class="reference external" href="https://bugs.python.org/issue1693050">issue #1693050</a>)</h2>
 <p>The definition of a 'word' character has been expanded for Unicode. It now conforms to the Unicode specification at <tt class="docutils literal"><span class="pre">http://www.unicode.org/reports/tr29/</span></tt>.</p>
-</li>
-<li><p class="first">Variable-length lookbehind</p>
+</div>
+<div class="section" id="variable-length-lookbehind">
+<h2>Variable-length lookbehind</h2>
 <p>A lookbehind can match a variable-length string.</p>
-</li>
-<li><p class="first">Flags argument for regex.split, regex.sub and regex.subn (<a class="reference external" href="https://bugs.python.org/issue3482">issue #3482</a>)</p>
+</div>
+<div class="section" id="flags-argument-for-regex-split-regex-sub-and-regex-subn-issue-3482">
+<h2>Flags argument for regex.split, regex.sub and regex.subn (<a class="reference external" href="https://bugs.python.org/issue3482">issue #3482</a>)</h2>
 <p><tt class="docutils literal">regex.split</tt>, <tt class="docutils literal">regex.sub</tt> and <tt class="docutils literal">regex.subn</tt> support a 'flags' argument.</p>
-</li>
-<li><p class="first">Pos and endpos arguments for regex.sub and regex.subn</p>
+</div>
+<div class="section" id="pos-and-endpos-arguments-for-regex-sub-and-regex-subn">
+<h2>Pos and endpos arguments for regex.sub and regex.subn</h2>
 <p><tt class="docutils literal">regex.sub</tt> and <tt class="docutils literal">regex.subn</tt> support 'pos' and 'endpos' arguments.</p>
-</li>
-<li><p class="first">'Overlapped' argument for regex.findall and regex.finditer</p>
+</div>
+<div class="section" id="overlapped-argument-for-regex-findall-and-regex-finditer">
+<h2>'Overlapped' argument for regex.findall and regex.finditer</h2>
 <p><tt class="docutils literal">regex.findall</tt> and <tt class="docutils literal">regex.finditer</tt> support an 'overlapped' flag which permits overlapped matches.</p>
-</li>
-<li><p class="first">Splititer</p>
+</div>
+<div class="section" id="splititer">
+<h2>Splititer</h2>
 <p><tt class="docutils literal">regex.splititer</tt> has been added. It's a generator equivalent of <tt class="docutils literal">regex.split</tt>.</p>
-</li>
-<li><p class="first">Subscripting for groups</p>
+</div>
+<div class="section" id="subscripting-for-groups">
+<h2>Subscripting for groups</h2>
 <p>A match object accepts access to the captured groups via subscripting and slicing:</p>
 <pre class="code python literal-block">
 <span class="operator">&gt;&gt;&gt;</span> <span class="name">m</span> <span class="operator">=</span> <span class="name">regex</span><span class="operator">.</span><span class="name">search</span><span class="punctuation">(</span><span class="literal string affix">r</span><span class="literal string double">&quot;(?P&lt;before&gt;.*?)(?P&lt;num&gt;\d+)(?P&lt;after&gt;.*)&quot;</span><span class="punctuation">,</span> <span class="literal string double">&quot;pqr123stu&quot;</span><span class="punctuation">)</span>
@@ -1029,18 +1078,22 @@ ul.auto-toc {
 <span class="operator">&gt;&gt;&gt;</span> <span class="keyword">print</span><span class="punctuation">(</span><span class="name">m</span><span class="punctuation">[:])</span>
 <span class="punctuation">(</span><span class="literal string single">'pqr123stu'</span><span class="punctuation">,</span> <span class="literal string single">'pqr'</span><span class="punctuation">,</span> <span class="literal string single">'123'</span><span class="punctuation">,</span> <span class="literal string single">'stu'</span><span class="punctuation">)</span>
 </pre>
-</li>
-<li><p class="first">Named groups</p>
+</div>
+<div class="section" id="named-groups">
+<h2>Named groups</h2>
 <p>Groups can be named with <tt class="docutils literal"><span class="pre">(?&lt;name&gt;...)</span></tt> as well as the current <tt class="docutils literal"><span class="pre">(?P&lt;name&gt;...)</span></tt>.</p>
-</li>
-<li><p class="first">Group references</p>
+</div>
+<div class="section" id="group-references">
+<h2>Group references</h2>
 <p>Groups can be referenced within a pattern with <tt class="docutils literal">\g&lt;name&gt;</tt>. This also allows there to be more than 99 groups.</p>
-</li>
-<li><p class="first">Named characters</p>
+</div>
+<div class="section" id="named-characters">
+<h2>Named characters</h2>
 <p><tt class="docutils literal">\N{name}</tt></p>
 <p>Named characters are supported. (Note: only those known by Python's Unicode database are supported.)</p>
-</li>
-<li><p class="first">Unicode codepoint properties, including scripts and blocks</p>
+</div>
+<div class="section" id="unicode-codepoint-properties-including-scripts-and-blocks">
+<h2>Unicode codepoint properties, including scripts and blocks</h2>
 <p><tt class="docutils literal">\p{property=value}</tt>; <tt class="docutils literal">\P{property=value}</tt>; <tt class="docutils literal">\p{value}</tt> ; <tt class="docutils literal">\P{value}</tt></p>
 <p>Many Unicode properties are supported, including blocks and scripts. <tt class="docutils literal">\p{property=value}</tt> or <tt class="docutils literal">\p{property:value}</tt> matches a character whose property <tt class="docutils literal">property</tt> has value <tt class="docutils literal">value</tt>. The inverse of <tt class="docutils literal">\p{property=value}</tt> is <tt class="docutils literal">\P{property=value}</tt> or <tt class="docutils literal"><span class="pre">\p{^property=value}</span></tt>.</p>
 <p>If the short form <tt class="docutils literal">\p{value}</tt> is used, the properties are checked in the order: <tt class="docutils literal">General_Category</tt>, <tt class="docutils literal">Script</tt>, <tt class="docutils literal">Block</tt>, binary property:</p>
@@ -1058,8 +1111,9 @@ ul.auto-toc {
 <ul class="simple">
 <li><tt class="docutils literal">InBasicLatin</tt>, the 'BasicLatin' block (<tt class="docutils literal">Block=BasicLatin</tt>).</li>
 </ul>
-</li>
-<li><p class="first">POSIX character classes</p>
+</div>
+<div class="section" id="posix-character-classes">
+<h2>POSIX character classes</h2>
 <p><tt class="docutils literal"><span class="pre">[[:alpha:]]</span></tt>; <tt class="docutils literal"><span class="pre">[[:^alpha:]]</span></tt></p>
 <p>POSIX character classes are supported. These are normally treated as an alternative form of <tt class="docutils literal"><span class="pre">\p{...}</span></tt>.</p>
 <p>The exceptions are <tt class="docutils literal">alnum</tt>, <tt class="docutils literal">digit</tt>, <tt class="docutils literal">punct</tt> and <tt class="docutils literal">xdigit</tt>, whose definitions are different from those of Unicode.</p>
@@ -1067,8 +1121,9 @@ ul.auto-toc {
 <p><tt class="docutils literal"><span class="pre">[[:digit:]]</span></tt> is equivalent to <tt class="docutils literal">\p{posix_digit}</tt>.</p>
 <p><tt class="docutils literal"><span class="pre">[[:punct:]]</span></tt> is equivalent to <tt class="docutils literal">\p{posix_punct}</tt>.</p>
 <p><tt class="docutils literal"><span class="pre">[[:xdigit:]]</span></tt> is equivalent to <tt class="docutils literal">\p{posix_xdigit}</tt>.</p>
-</li>
-<li><p class="first">Search anchor</p>
+</div>
+<div class="section" id="search-anchor">
+<h2>Search anchor</h2>
 <p><tt class="docutils literal">\G</tt></p>
 <p>A search anchor has been added. It matches at the position where each search started/continued and can be used for contiguous matches or in negative variable-length lookbehinds to limit how far back the lookbehind goes:</p>
 <pre class="code python literal-block">
@@ -1083,8 +1138,9 @@ ul.auto-toc {
 <li>The search continues at position 4 and fails to match any letters.</li>
 <li>The anchor stops the search start position from being advanced, so there are no more results.</li>
 </ul>
-</li>
-<li><p class="first">Reverse searching</p>
+</div>
+<div class="section" id="reverse-searching">
+<h2>Reverse searching</h2>
 <p>Searches can now work backwards:</p>
 <pre class="code python literal-block">
 <span class="operator">&gt;&gt;&gt;</span> <span class="name">regex</span><span class="operator">.</span><span class="name">findall</span><span class="punctuation">(</span><span class="literal string affix">r</span><span class="literal string double">&quot;.&quot;</span><span class="punctuation">,</span> <span class="literal string double">&quot;abc&quot;</span><span class="punctuation">)</span>
@@ -1099,12 +1155,14 @@ ul.auto-toc {
 <span class="operator">&gt;&gt;&gt;</span> <span class="name">regex</span><span class="operator">.</span><span class="name">findall</span><span class="punctuation">(</span><span class="literal string affix">r</span><span class="literal string double">&quot;(?r)..&quot;</span><span class="punctuation">,</span> <span class="literal string double">&quot;abcde&quot;</span><span class="punctuation">)</span>
 <span class="punctuation">[</span><span class="literal string single">'de'</span><span class="punctuation">,</span> <span class="literal string single">'bc'</span><span class="punctuation">]</span>
 </pre>
-</li>
-<li><p class="first">Matching a single grapheme</p>
+</div>
+<div class="section" id="matching-a-single-grapheme">
+<h2>Matching a single grapheme</h2>
 <p><tt class="docutils literal">\X</tt></p>
 <p>The grapheme matcher is supported. It now conforms to the Unicode specification at <tt class="docutils literal"><span class="pre">http://www.unicode.org/reports/tr29/</span></tt>.</p>
-</li>
-<li><p class="first">Branch reset</p>
+</div>
+<div class="section" id="branch-reset">
+<h2>Branch reset</h2>
 <p><tt class="docutils literal"><span class="pre">(?|...|...)</span></tt></p>
 <p>Capture group numbers will be reused across the alternatives, but groups with different names will have different group numbers.</p>
 <p>Examples:</p>
@@ -1115,11 +1173,13 @@ ul.auto-toc {
 <span class="punctuation">(</span><span class="literal string single">'second'</span><span class="punctuation">,)</span>
 </pre>
 <p>Note that there is only one group.</p>
-</li>
-<li><p class="first">Default Unicode word boundary</p>
+</div>
+<div class="section" id="default-unicode-word-boundary">
+<h2>Default Unicode word boundary</h2>
 <p>The <tt class="docutils literal">WORD</tt> flag changes the definition of a 'word boundary' to that of a default Unicode word boundary. This applies to <tt class="docutils literal">\b</tt> and <tt class="docutils literal">\B</tt>.</p>
-</li>
-<li><p class="first">Timeout (Python 3)</p>
+</div>
+<div class="section" id="timeout-python-3">
+<h2>Timeout (Python 3)</h2>
 <p>The matching methods and functions support timeouts. The timeout (in seconds) applies to the entire operation:</p>
 <pre class="code python literal-block">
 <span class="operator">&gt;&gt;&gt;</span> <span class="keyword namespace">from</span> <span class="name namespace">time</span> <span class="keyword namespace">import</span> <span class="name">sleep</span>
@@ -1140,8 +1200,7 @@ ul.auto-toc {
     <span class="name">endpos</span><span class="punctuation">,</span> <span class="name">concurrent</span><span class="punctuation">,</span> <span class="name">timeout</span><span class="punctuation">)</span>
 <span class="name">TimeoutError</span><span class="punctuation">:</span> <span class="name">regex</span> <span class="name">timed</span> <span class="name">out</span>
 </pre>
-</li>
-</ul>
+</div>
 </div>
 </div>
 </body>
diff --git a/docs/Features.rst b/docs/Features.rst
index c73f113..622c000 100644
--- a/docs/Features.rst
+++ b/docs/Features.rst
@@ -129,7 +129,7 @@ The regex module releases the GIL during matching on instances of the built-in (
 Unicode
 -------
 
-This module supports Unicode 12.1.0.
+This module supports Unicode 13.0.0.
 
 Full Unicode case-folding is supported.
 
@@ -138,863 +138,926 @@ Additional features
 
 The issue numbers relate to the Python bug tracker, except where listed as "Hg issue".
 
-* Added support for lookaround in conditional pattern (`Hg issue 163 <https://bitbucket.org/mrabarnett/mrab-regex/issues/163>`_)
+Added support for lookaround in conditional pattern (`Hg issue 163 <https://bitbucket.org/mrabarnett/mrab-regex/issues/163>`_)
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
-  The test of a conditional pattern can now be a lookaround.
+The test of a conditional pattern can now be a lookaround.
 
-  Examples:
+Examples:
 
-  .. sourcecode:: python
+.. sourcecode:: python
 
-    >>> regex.match(r'(?(?=\d)\d+|\w+)', '123abc')
-    <regex.Match object; span=(0, 3), match='123'>
-    >>> regex.match(r'(?(?=\d)\d+|\w+)', 'abc123')
-    <regex.Match object; span=(0, 6), match='abc123'>
+  >>> regex.match(r'(?(?=\d)\d+|\w+)', '123abc')
+  <regex.Match object; span=(0, 3), match='123'>
+  >>> regex.match(r'(?(?=\d)\d+|\w+)', 'abc123')
+  <regex.Match object; span=(0, 6), match='abc123'>
 
-  This is not quite the same as putting a lookaround in the first branch of a pair of alternatives.
+This is not quite the same as putting a lookaround in the first branch of a pair of alternatives.
 
-  Examples:
+Examples:
 
-  .. sourcecode:: python
+.. sourcecode:: python
 
-    >>> print(regex.match(r'(?:(?=\d)\d+\b|\w+)', '123abc'))
-    <regex.Match object; span=(0, 6), match='123abc'>
-    >>> print(regex.match(r'(?(?=\d)\d+\b|\w+)', '123abc'))
-    None
+  >>> print(regex.match(r'(?:(?=\d)\d+\b|\w+)', '123abc'))
+  <regex.Match object; span=(0, 6), match='123abc'>
+  >>> print(regex.match(r'(?(?=\d)\d+\b|\w+)', '123abc'))
+  None
 
-  In the first example, the lookaround matched, but the remainder of the first branch failed to match, and so the second branch was attempted, whereas in the second example, the lookaround matched, and the first branch failed to match, but the second branch was **not** attempted.
+In the first example, the lookaround matched, but the remainder of the first branch failed to match, and so the second branch was attempted, whereas in the second example, the lookaround matched, and the first branch failed to match, but the second branch was **not** attempted.
 
-* Added POSIX matching (leftmost longest) (`Hg issue 150 <https://bitbucket.org/mrabarnett/mrab-regex/issues/150>`_)
+Added POSIX matching (leftmost longest) (`Hg issue 150 <https://bitbucket.org/mrabarnett/mrab-regex/issues/150>`_)
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
-  The POSIX standard for regex is to return the leftmost longest match. This can be turned on using the ``POSIX`` flag (``(?p)``).
+The POSIX standard for regex is to return the leftmost longest match. This can be turned on using the ``POSIX`` flag (``(?p)``).
 
-  Examples:
+Examples:
 
-  .. sourcecode:: python
+.. sourcecode:: python
 
-    >>> # Normal matching.
-    >>> regex.search(r'Mr|Mrs', 'Mrs')
-    <regex.Match object; span=(0, 2), match='Mr'>
-    >>> regex.search(r'one(self)?(selfsufficient)?', 'oneselfsufficient')
-    <regex.Match object; span=(0, 7), match='oneself'>
-    >>> # POSIX matching.
-    >>> regex.search(r'(?p)Mr|Mrs', 'Mrs')
-    <regex.Match object; span=(0, 3), match='Mrs'>
-    >>> regex.search(r'(?p)one(self)?(selfsufficient)?', 'oneselfsufficient')
-    <regex.Match object; span=(0, 17), match='oneselfsufficient'>
+  >>> # Normal matching.
+  >>> regex.search(r'Mr|Mrs', 'Mrs')
+  <regex.Match object; span=(0, 2), match='Mr'>
+  >>> regex.search(r'one(self)?(selfsufficient)?', 'oneselfsufficient')
+  <regex.Match object; span=(0, 7), match='oneself'>
+  >>> # POSIX matching.
+  >>> regex.search(r'(?p)Mr|Mrs', 'Mrs')
+  <regex.Match object; span=(0, 3), match='Mrs'>
+  >>> regex.search(r'(?p)one(self)?(selfsufficient)?', 'oneselfsufficient')
+  <regex.Match object; span=(0, 17), match='oneselfsufficient'>
 
-  Note that it will take longer to find matches because when it finds a match at a certain position, it won't return that immediately, but will keep looking to see if there's another longer match there.
+Note that it will take longer to find matches because when it finds a match at a certain position, it won't return that immediately, but will keep looking to see if there's another longer match there.
 
-* Added ``(?(DEFINE)...)`` (`Hg issue 152 <https://bitbucket.org/mrabarnett/mrab-regex/issues/152>`_)
+Added ``(?(DEFINE)...)`` (`Hg issue 152 <https://bitbucket.org/mrabarnett/mrab-regex/issues/152>`_)
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
-  If there's no group called "DEFINE", then ... will be ignored, but any group definitions within it will be available.
+If there's no group called "DEFINE", then ... will be ignored, but any group definitions within it will be available.
 
-  Examples:
+Examples:
 
-  .. sourcecode:: python
+.. sourcecode:: python
 
-    >>> regex.search(r'(?(DEFINE)(?P<quant>\d+)(?P<item>\w+))(?&quant) (?&item)', '5 elephants')
-    <regex.Match object; span=(0, 11), match='5 elephants'>
+  >>> regex.search(r'(?(DEFINE)(?P<quant>\d+)(?P<item>\w+))(?&quant) (?&item)', '5 elephants')
+  <regex.Match object; span=(0, 11), match='5 elephants'>
 
-* Added ``(*PRUNE)``, ``(*SKIP)`` and ``(*FAIL)`` (`Hg issue 153 <https://bitbucket.org/mrabarnett/mrab-regex/issues/153>`_)
+Added ``(*PRUNE)``, ``(*SKIP)`` and ``(*FAIL)`` (`Hg issue 153 <https://bitbucket.org/mrabarnett/mrab-regex/issues/153>`_)
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
-  ``(*PRUNE)`` discards the backtracking info up to that point. When used in an atomic group or a lookaround, it won't affect the enclosing pattern.
+``(*PRUNE)`` discards the backtracking info up to that point. When used in an atomic group or a lookaround, it won't affect the enclosing pattern.
 
-  ``(*SKIP)`` is similar to ``(*PRUNE)``, except that it also sets where in the text the next attempt to match will start. When used in an atomic group or a lookaround, it won't affect the enclosing pattern.
+``(*SKIP)`` is similar to ``(*PRUNE)``, except that it also sets where in the text the next attempt to match will start. When used in an atomic group or a lookaround, it won't affect the enclosing pattern.
 
-  ``(*FAIL)`` causes immediate backtracking. ``(*F)`` is a permitted abbreviation.
+``(*FAIL)`` causes immediate backtracking. ``(*F)`` is a permitted abbreviation.
 
-* Added ``\K`` (`Hg issue 151 <https://bitbucket.org/mrabarnett/mrab-regex/issues/151>`_)
+Added ``\K`` (`Hg issue 151 <https://bitbucket.org/mrabarnett/mrab-regex/issues/151>`_)
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
-  Keeps the part of the entire match after the position where ``\K`` occurred; the part before it is discarded.
+Keeps the part of the entire match after the position where ``\K`` occurred; the part before it is discarded.
 
-  It does not affect what capture groups return.
+It does not affect what capture groups return.
 
-  Examples:
+Examples:
 
-  .. sourcecode:: python
+.. sourcecode:: python
 
-    >>> m = regex.search(r'(\w\w\K\w\w\w)', 'abcdef')
-    >>> m[0]
-    'cde'
-    >>> m[1]
-    'abcde'
-    >>>
-    >>> m = regex.search(r'(?r)(\w\w\K\w\w\w)', 'abcdef')
-    >>> m[0]
-    'bc'
-    >>> m[1]
-    'bcdef'
+  >>> m = regex.search(r'(\w\w\K\w\w\w)', 'abcdef')
+  >>> m[0]
+  'cde'
+  >>> m[1]
+  'abcde'
+  >>>
+  >>> m = regex.search(r'(?r)(\w\w\K\w\w\w)', 'abcdef')
+  >>> m[0]
+  'bc'
+  >>> m[1]
+  'bcdef'
 
-* Added capture subscripting for ``expandf`` and ``subf``/``subfn`` (`Hg issue 133 <https://bitbucket.org/mrabarnett/mrab-regex/issues/133>`_)
+Added capture subscripting for ``expandf`` and ``subf``/``subfn`` (`Hg issue 133 <https://bitbucket.org/mrabarnett/mrab-regex/issues/133>`_)
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
-  You can now use subscripting to get the captures of a repeated capture group.
+You can now use subscripting to get the captures of a repeated capture group.
 
-  Examples:
+Examples:
 
-  .. sourcecode:: python
+.. sourcecode:: python
 
-    >>> m = regex.match(r"(\w)+", "abc")
-    >>> m.expandf("{1}")
-    'c'
-    >>> m.expandf("{1[0]} {1[1]} {1[2]}")
-    'a b c'
-    >>> m.expandf("{1[-1]} {1[-2]} {1[-3]}")
-    'c b a'
-    >>>
-    >>> m = regex.match(r"(?P<letter>\w)+", "abc")
-    >>> m.expandf("{letter}")
-    'c'
-    >>> m.expandf("{letter[0]} {letter[1]} {letter[2]}")
-    'a b c'
-    >>> m.expandf("{letter[-1]} {letter[-2]} {letter[-3]}")
-    'c b a'
+  >>> m = regex.match(r"(\w)+", "abc")
+  >>> m.expandf("{1}")
+  'c'
+  >>> m.expandf("{1[0]} {1[1]} {1[2]}")
+  'a b c'
+  >>> m.expandf("{1[-1]} {1[-2]} {1[-3]}")
+  'c b a'
+  >>>
+  >>> m = regex.match(r"(?P<letter>\w)+", "abc")
+  >>> m.expandf("{letter}")
+  'c'
+  >>> m.expandf("{letter[0]} {letter[1]} {letter[2]}")
+  'a b c'
+  >>> m.expandf("{letter[-1]} {letter[-2]} {letter[-3]}")
+  'c b a'
 
-* Added support for referring to a group by number using ``(?P=...)``.
+Added support for referring to a group by number using ``(?P=...)``.
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
-  This is in addition to the existing ``\g<...>``.
+This is in addition to the existing ``\g<...>``.
 
-* Fixed the handling of locale-sensitive regexes.
+Fixed the handling of locale-sensitive regexes.
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
-  The ``LOCALE`` flag is intended for legacy code and has limited support. You're still recommended to use Unicode instead.
+The ``LOCALE`` flag is intended for legacy code and has limited support. You're still recommended to use Unicode instead.
 
-* Added partial matches (`Hg issue 102 <https://bitbucket.org/mrabarnett/mrab-regex/issues/102>`_)
+Added partial matches (`Hg issue 102 <https://bitbucket.org/mrabarnett/mrab-regex/issues/102>`_)
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
-  A partial match is one that matches up to the end of string, but that string has been truncated and you want to know whether a complete match could be possible if the string had not been truncated.
+A partial match is one that matches up to the end of string, but that string has been truncated and you want to know whether a complete match could be possible if the string had not been truncated.
 
-  Partial matches are supported by ``match``, ``search``, ``fullmatch`` and ``finditer`` with the ``partial`` keyword argument.
+Partial matches are supported by ``match``, ``search``, ``fullmatch`` and ``finditer`` with the ``partial`` keyword argument.
 
-  Match objects have a ``partial`` attribute, which is ``True`` if it's a partial match.
+Match objects have a ``partial`` attribute, which is ``True`` if it's a partial match.
 
-  For example, if you wanted a user to enter a 4-digit number and check it character by character as it was being entered:
+For example, if you wanted a user to enter a 4-digit number and check it character by character as it was being entered:
 
-  .. sourcecode:: python
+.. sourcecode:: python
 
-    >>> pattern = regex.compile(r'\d{4}')
+  >>> pattern = regex.compile(r'\d{4}')
 
-    >>> # Initially, nothing has been entered:
-    >>> print(pattern.fullmatch('', partial=True))
-    <regex.Match object; span=(0, 0), match='', partial=True>
+  >>> # Initially, nothing has been entered:
+  >>> print(pattern.fullmatch('', partial=True))
+  <regex.Match object; span=(0, 0), match='', partial=True>
 
-    >>> # An empty string is OK, but it's only a partial match.
-    >>> # The user enters a letter:
-    >>> print(pattern.fullmatch('a', partial=True))
-    None
-    >>> # It'll never match.
+  >>> # An empty string is OK, but it's only a partial match.
+  >>> # The user enters a letter:
+  >>> print(pattern.fullmatch('a', partial=True))
+  None
+  >>> # It'll never match.
 
-    >>> # The user deletes that and enters a digit:
-    >>> print(pattern.fullmatch('1', partial=True))
-    <regex.Match object; span=(0, 1), match='1', partial=True>
-    >>> # It matches this far, but it's only a partial match.
+  >>> # The user deletes that and enters a digit:
+  >>> print(pattern.fullmatch('1', partial=True))
+  <regex.Match object; span=(0, 1), match='1', partial=True>
+  >>> # It matches this far, but it's only a partial match.
 
-    >>> # The user enters 2 more digits:
-    >>> print(pattern.fullmatch('123', partial=True))
-    <regex.Match object; span=(0, 3), match='123', partial=True>
-    >>> # It matches this far, but it's only a partial match.
+  >>> # The user enters 2 more digits:
+  >>> print(pattern.fullmatch('123', partial=True))
+  <regex.Match object; span=(0, 3), match='123', partial=True>
+  >>> # It matches this far, but it's only a partial match.
 
-    >>> # The user enters another digit:
-    >>> print(pattern.fullmatch('1234', partial=True))
-    <regex.Match object; span=(0, 4), match='1234'>
-    >>> # It's a complete match.
+  >>> # The user enters another digit:
+  >>> print(pattern.fullmatch('1234', partial=True))
+  <regex.Match object; span=(0, 4), match='1234'>
+  >>> # It's a complete match.
 
-    >>> # If the user enters another digit:
-    >>> print(pattern.fullmatch('12345', partial=True))
-    None
-    >>> # It's no longer a match.
+  >>> # If the user enters another digit:
+  >>> print(pattern.fullmatch('12345', partial=True))
+  None
+  >>> # It's no longer a match.
+
+  >>> # This is a partial match:
+  >>> pattern.match('123', partial=True).partial
+  True
+
+  >>> # This is a complete match:
+  >>> pattern.match('1233', partial=True).partial
+  False
+
+``*`` operator not working correctly with sub() (`Hg issue 106 <https://bitbucket.org/mrabarnett/mrab-regex/issues/106>`_)
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+Sometimes it's not clear how zero-width matches should be handled. For example, should ``.*`` match 0 characters directly after matching >0 characters?
+
+Examples:
+
+.. sourcecode:: python
+
+  # Python 3.7 and later
+  >>> regex.sub('.*', 'x', 'test')
+  'xx'
+  >>> regex.sub('.*?', '|', 'test')
+  '|||||||||'
+
+  # Python 3.6 and earlier
+  >>> regex.sub('(?V0).*', 'x', 'test')
+  'x'
+  >>> regex.sub('(?V1).*', 'x', 'test')
+  'xx'
+  >>> regex.sub('(?V0).*?', '|', 'test')
+  '|t|e|s|t|'
+  >>> regex.sub('(?V1).*?', '|', 'test')
+  '|||||||||'
+
+Added ``capturesdict`` (`Hg issue 86 <https://bitbucket.org/mrabarnett/mrab-regex/issues/86>`_)
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+``capturesdict`` is a combination of ``groupdict`` and ``captures``:
+
+``groupdict`` returns a dict of the named groups and the last capture of those groups.
+
+``captures`` returns a list of all the captures of a group
+
+``capturesdict`` returns a dict of the named groups and lists of all the captures of those groups.
+
+Examples:
+
+.. sourcecode:: python
+
+  >>> m = regex.match(r"(?:(?P<word>\w+) (?P<digits>\d+)\n)+", "one 1\ntwo 2\nthree 3\n")
+  >>> m.groupdict()
+  {'word': 'three', 'digits': '3'}
+  >>> m.captures("word")
+  ['one', 'two', 'three']
+  >>> m.captures("digits")
+  ['1', '2', '3']
+  >>> m.capturesdict()
+  {'word': ['one', 'two', 'three'], 'digits': ['1', '2', '3']}
+
+Allow duplicate names of groups (`Hg issue 87 <https://bitbucket.org/mrabarnett/mrab-regex/issues/87>`_)
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+Group names can now be duplicated.
+
+Examples:
+
+.. sourcecode:: python
+
+  >>> # With optional groups:
+  >>>
+  >>> # Both groups capture, the second capture 'overwriting' the first.
+  >>> m = regex.match(r"(?P<item>\w+)? or (?P<item>\w+)?", "first or second")
+  >>> m.group("item")
+  'second'
+  >>> m.captures("item")
+  ['first', 'second']
+  >>> # Only the second group captures.
+  >>> m = regex.match(r"(?P<item>\w+)? or (?P<item>\w+)?", " or second")
+  >>> m.group("item")
+  'second'
+  >>> m.captures("item")
+  ['second']
+  >>> # Only the first group captures.
+  >>> m = regex.match(r"(?P<item>\w+)? or (?P<item>\w+)?", "first or ")
+  >>> m.group("item")
+  'first'
+  >>> m.captures("item")
+  ['first']
+  >>>
+  >>> # With mandatory groups:
+  >>>
+  >>> # Both groups capture, the second capture 'overwriting' the first.
+  >>> m = regex.match(r"(?P<item>\w*) or (?P<item>\w*)?", "first or second")
+  >>> m.group("item")
+  'second'
+  >>> m.captures("item")
+  ['first', 'second']
+  >>> # Again, both groups capture, the second capture 'overwriting' the first.
+  >>> m = regex.match(r"(?P<item>\w*) or (?P<item>\w*)", " or second")
+  >>> m.group("item")
+  'second'
+  >>> m.captures("item")
+  ['', 'second']
+  >>> # And yet again, both groups capture, the second capture 'overwriting' the first.
+  >>> m = regex.match(r"(?P<item>\w*) or (?P<item>\w*)", "first or ")
+  >>> m.group("item")
+  ''
+  >>> m.captures("item")
+  ['first', '']
+
+Added ``fullmatch`` (`issue #16203 <https://bugs.python.org/issue16203>`_)
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+``fullmatch`` behaves like ``match``, except that it must match all of the string.
+
+Examples:
+
+.. sourcecode:: python
+
+  >>> print(regex.fullmatch(r"abc", "abc").span())
+  (0, 3)
+  >>> print(regex.fullmatch(r"abc", "abcx"))
+  None
+  >>> print(regex.fullmatch(r"abc", "abcx", endpos=3).span())
+  (0, 3)
+  >>> print(regex.fullmatch(r"abc", "xabcy", pos=1, endpos=4).span())
+  (1, 4)
+  >>>
+  >>> regex.match(r"a.*?", "abcd").group(0)
+  'a'
+  >>> regex.fullmatch(r"a.*?", "abcd").group(0)
+  'abcd'
 
-    >>> # This is a partial match:
-    >>> pattern.match('123', partial=True).partial
-    True
-
-    >>> # This is a complete match:
-    >>> pattern.match('1233', partial=True).partial
-    False
-
-* ``*`` operator not working correctly with sub() (`Hg issue 106 <https://bitbucket.org/mrabarnett/mrab-regex/issues/106>`_)
-
-  Sometimes it's not clear how zero-width matches should be handled. For example, should ``.*`` match 0 characters directly after matching >0 characters?
-
-  Examples:
-
-  .. sourcecode:: python
-
-    # Python 3.7 and later
-    >>> regex.sub('.*', 'x', 'test')
-    'xx'
-    >>> regex.sub('.*?', '|', 'test')
-    '|||||||||'
-
-    # Python 3.6 and earlier
-    >>> regex.sub('(?V0).*', 'x', 'test')
-    'x'
-    >>> regex.sub('(?V1).*', 'x', 'test')
-    'xx'
-    >>> regex.sub('(?V0).*?', '|', 'test')
-    '|t|e|s|t|'
-    >>> regex.sub('(?V1).*?', '|', 'test')
-    '|||||||||'
-
-* Added ``capturesdict`` (`Hg issue 86 <https://bitbucket.org/mrabarnett/mrab-regex/issues/86>`_)
-
-  ``capturesdict`` is a combination of ``groupdict`` and ``captures``:
-
-  ``groupdict`` returns a dict of the named groups and the last capture of those groups.
-
-  ``captures`` returns a list of all the captures of a group
-
-  ``capturesdict`` returns a dict of the named groups and lists of all the captures of those groups.
-
-  Examples:
+Added ``subf`` and ``subfn``
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
-  .. sourcecode:: python
+``subf`` and ``subfn`` are alternatives to ``sub`` and ``subn`` respectively. When passed a replacement string, they treat it as a format string.
 
-    >>> m = regex.match(r"(?:(?P<word>\w+) (?P<digits>\d+)\n)+", "one 1\ntwo 2\nthree 3\n")
-    >>> m.groupdict()
-    {'word': 'three', 'digits': '3'}
-    >>> m.captures("word")
-    ['one', 'two', 'three']
-    >>> m.captures("digits")
-    ['1', '2', '3']
-    >>> m.capturesdict()
-    {'word': ['one', 'two', 'three'], 'digits': ['1', '2', '3']}
-
-* Allow duplicate names of groups (`Hg issue 87 <https://bitbucket.org/mrabarnett/mrab-regex/issues/87>`_)
-
-  Group names can now be duplicated.
-
-  Examples:
-
-  .. sourcecode:: python
-
-    >>> # With optional groups:
-    >>>
-    >>> # Both groups capture, the second capture 'overwriting' the first.
-    >>> m = regex.match(r"(?P<item>\w+)? or (?P<item>\w+)?", "first or second")
-    >>> m.group("item")
-    'second'
-    >>> m.captures("item")
-    ['first', 'second']
-    >>> # Only the second group captures.
-    >>> m = regex.match(r"(?P<item>\w+)? or (?P<item>\w+)?", " or second")
-    >>> m.group("item")
-    'second'
-    >>> m.captures("item")
-    ['second']
-    >>> # Only the first group captures.
-    >>> m = regex.match(r"(?P<item>\w+)? or (?P<item>\w+)?", "first or ")
-    >>> m.group("item")
-    'first'
-    >>> m.captures("item")
-    ['first']
-    >>>
-    >>> # With mandatory groups:
-    >>>
-    >>> # Both groups capture, the second capture 'overwriting' the first.
-    >>> m = regex.match(r"(?P<item>\w*) or (?P<item>\w*)?", "first or second")
-    >>> m.group("item")
-    'second'
-    >>> m.captures("item")
-    ['first', 'second']
-    >>> # Again, both groups capture, the second capture 'overwriting' the first.
-    >>> m = regex.match(r"(?P<item>\w*) or (?P<item>\w*)", " or second")
-    >>> m.group("item")
-    'second'
-    >>> m.captures("item")
-    ['', 'second']
-    >>> # And yet again, both groups capture, the second capture 'overwriting' the first.
-    >>> m = regex.match(r"(?P<item>\w*) or (?P<item>\w*)", "first or ")
-    >>> m.group("item")
-    ''
-    >>> m.captures("item")
-    ['first', '']
+Examples:
 
-* Added ``fullmatch`` (`issue #16203 <https://bugs.python.org/issue16203>`_)
+.. sourcecode:: python
+
+  >>> regex.subf(r"(\w+) (\w+)", "{0} => {2} {1}", "foo bar")
+  'foo bar => bar foo'
+  >>> regex.subf(r"(?P<word1>\w+) (?P<word2>\w+)", "{word2} {word1}", "foo bar")
+  'bar foo'
+
+Added ``expandf`` to match object
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+``expandf`` is an alternative to ``expand``. When passed a replacement string, it treats it as a format string.
+
+Examples:
+
+.. sourcecode:: python
+
+  >>> m = regex.match(r"(\w+) (\w+)", "foo bar")
+  >>> m.expandf("{0} => {2} {1}")
+  'foo bar => bar foo'
+  >>>
+  >>> m = regex.match(r"(?P<word1>\w+) (?P<word2>\w+)", "foo bar")
+  >>> m.expandf("{word2} {word1}")
+  'bar foo'
+
+Detach searched string
+^^^^^^^^^^^^^^^^^^^^^^
+
+A match object contains a reference to the string that was searched, via its ``string`` attribute. The ``detach_string`` method will 'detach' that string, making it available for garbage collection, which might save valuable memory if that string is very large.
+
+Example:
+
+.. sourcecode:: python
+
+  >>> m = regex.search(r"\w+", "Hello world")
+  >>> print(m.group())
+  Hello
+  >>> print(m.string)
+  Hello world
+  >>> m.detach_string()
+  >>> print(m.group())
+  Hello
+  >>> print(m.string)
+  None
 
-  ``fullmatch`` behaves like ``match``, except that it must match all of the string.
+Recursive patterns (`Hg issue 27 <https://bitbucket.org/mrabarnett/mrab-regex/issues/27>`_)
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
-  Examples:
+Recursive and repeated patterns are supported.
 
-  .. sourcecode:: python
+``(?R)`` or ``(?0)`` tries to match the entire regex recursively. ``(?1)``, ``(?2)``, etc, try to match the relevant capture group.
 
-    >>> print(regex.fullmatch(r"abc", "abc").span())
-    (0, 3)
-    >>> print(regex.fullmatch(r"abc", "abcx"))
-    None
-    >>> print(regex.fullmatch(r"abc", "abcx", endpos=3).span())
-    (0, 3)
-    >>> print(regex.fullmatch(r"abc", "xabcy", pos=1, endpos=4).span())
-    (1, 4)
-    >>>
-    >>> regex.match(r"a.*?", "abcd").group(0)
-    'a'
-    >>> regex.fullmatch(r"a.*?", "abcd").group(0)
-    'abcd'
+``(?&name)`` tries to match the named capture group.
 
-* Added ``subf`` and ``subfn``
+Examples:
 
-  ``subf`` and ``subfn`` are alternatives to ``sub`` and ``subn`` respectively. When passed a replacement string, they treat it as a format string.
+.. sourcecode:: python
 
-  Examples:
+  >>> regex.match(r"(Tarzan|Jane) loves (?1)", "Tarzan loves Jane").groups()
+  ('Tarzan',)
+  >>> regex.match(r"(Tarzan|Jane) loves (?1)", "Jane loves Tarzan").groups()
+  ('Jane',)
 
-  .. sourcecode:: python
+  >>> m = regex.search(r"(\w)(?:(?R)|(\w?))\1", "kayak")
+  >>> m.group(0, 1, 2)
+  ('kayak', 'k', None)
 
-    >>> regex.subf(r"(\w+) (\w+)", "{0} => {2} {1}", "foo bar")
-    'foo bar => bar foo'
-    >>> regex.subf(r"(?P<word1>\w+) (?P<word2>\w+)", "{word2} {word1}", "foo bar")
-    'bar foo'
+The first two examples show how the subpattern within the capture group is reused, but is _not_ itself a capture group. In other words, ``"(Tarzan|Jane) loves (?1)"`` is equivalent to ``"(Tarzan|Jane) loves (?:Tarzan|Jane)"``.
 
-* Added ``expandf`` to match object
+It's possible to backtrack into a recursed or repeated group.
 
-  ``expandf`` is an alternative to ``expand``. When passed a replacement string, it treats it as a format string.
+You can't call a group if there is more than one group with that group name or group number (``"ambiguous group reference"``).
 
-  Examples:
+The alternative forms ``(?P>name)`` and ``(?P&name)`` are also supported.
 
-  .. sourcecode:: python
-
-    >>> m = regex.match(r"(\w+) (\w+)", "foo bar")
-    >>> m.expandf("{0} => {2} {1}")
-    'foo bar => bar foo'
-    >>>
-    >>> m = regex.match(r"(?P<word1>\w+) (?P<word2>\w+)", "foo bar")
-    >>> m.expandf("{word2} {word1}")
-    'bar foo'
-
-* Detach searched string
-
-  A match object contains a reference to the string that was searched, via its ``string`` attribute. The ``detach_string`` method will 'detach' that string, making it available for garbage collection, which might save valuable memory if that string is very large.
-
-  Example:
-
-  .. sourcecode:: python
-
-    >>> m = regex.search(r"\w+", "Hello world")
-    >>> print(m.group())
-    Hello
-    >>> print(m.string)
-    Hello world
-    >>> m.detach_string()
-    >>> print(m.group())
-    Hello
-    >>> print(m.string)
-    None
-
-* Recursive patterns (`Hg issue 27 <https://bitbucket.org/mrabarnett/mrab-regex/issues/27>`_)
-
-  Recursive and repeated patterns are supported.
-
-  ``(?R)`` or ``(?0)`` tries to match the entire regex recursively. ``(?1)``, ``(?2)``, etc, try to match the relevant capture group.
-
-  ``(?&name)`` tries to match the named capture group.
-
-  Examples:
-
-  .. sourcecode:: python
-
-    >>> regex.match(r"(Tarzan|Jane) loves (?1)", "Tarzan loves Jane").groups()
-    ('Tarzan',)
-    >>> regex.match(r"(Tarzan|Jane) loves (?1)", "Jane loves Tarzan").groups()
-    ('Jane',)
-
-    >>> m = regex.search(r"(\w)(?:(?R)|(\w?))\1", "kayak")
-    >>> m.group(0, 1, 2)
-    ('kayak', 'k', None)
-
-  The first two examples show how the subpattern within the capture group is reused, but is _not_ itself a capture group. In other words, ``"(Tarzan|Jane) loves (?1)"`` is equivalent to ``"(Tarzan|Jane) loves (?:Tarzan|Jane)"``.
-
-  It's possible to backtrack into a recursed or repeated group.
+Full Unicode case-folding is supported.
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
-  You can't call a group if there is more than one group with that group name or group number (``"ambiguous group reference"``).
+In version 1 behaviour, the regex module uses full case-folding when performing case-insensitive matches in Unicode.
 
-  The alternative forms ``(?P>name)`` and ``(?P&name)`` are also supported.
+Examples (in Python 3):
 
-* Full Unicode case-folding is supported.
+.. sourcecode:: python
 
-  In version 1 behaviour, the regex module uses full case-folding when performing case-insensitive matches in Unicode.
+  >>> regex.match(r"(?iV1)strasse", "stra\N{LATIN SMALL LETTER SHARP S}e").span()
+  (0, 6)
+  >>> regex.match(r"(?iV1)stra\N{LATIN SMALL LETTER SHARP S}e", "STRASSE").span()
+  (0, 7)
 
-  Examples (in Python 3):
+In version 0 behaviour, it uses simple case-folding for backward compatibility with the re module.
 
-  .. sourcecode:: python
+Approximate "fuzzy" matching (`Hg issue 12 <https://bitbucket.org/mrabarnett/mrab-regex/issues/12>`_, `Hg issue 41 <https://bitbucket.org/mrabarnett/mrab-regex/issues/41>`_, `Hg issue 109 <https://bitbucket.org/mrabarnett/mrab-regex/issues/109>`_)
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
-    >>> regex.match(r"(?iV1)strasse", "stra\N{LATIN SMALL LETTER SHARP S}e").span()
-    (0, 6)
-    >>> regex.match(r"(?iV1)stra\N{LATIN SMALL LETTER SHARP S}e", "STRASSE").span()
-    (0, 7)
+Regex usually attempts an exact match, but sometimes an approximate, or "fuzzy", match is needed, for those cases where the text being searched may contain errors in the form of inserted, deleted or substituted characters.
 
-  In version 0 behaviour, it uses simple case-folding for backward compatibility with the re module.
+A fuzzy regex specifies which types of errors are permitted, and, optionally, either the minimum and maximum or only the maximum permitted number of each type. (You cannot specify only a minimum.)
 
-* Approximate "fuzzy" matching (`Hg issue 12 <https://bitbucket.org/mrabarnett/mrab-regex/issues/12>`_, `Hg issue 41 <https://bitbucket.org/mrabarnett/mrab-regex/issues/41>`_, `Hg issue 109 <https://bitbucket.org/mrabarnett/mrab-regex/issues/109>`_)
+The 3 types of error are:
 
-  Regex usually attempts an exact match, but sometimes an approximate, or "fuzzy", match is needed, for those cases where the text being searched may contain errors in the form of inserted, deleted or substituted characters.
+* Insertion, indicated by "i"
 
-  A fuzzy regex specifies which types of errors are permitted, and, optionally, either the minimum and maximum or only the maximum permitted number of each type. (You cannot specify only a minimum.)
+* Deletion, indicated by "d"
 
-  The 3 types of error are:
+* Substitution, indicated by "s"
 
-  * Insertion, indicated by "i"
+In addition, "e" indicates any type of error.
 
-  * Deletion, indicated by "d"
+The fuzziness of a regex item is specified between "{" and "}" after the item.
 
-  * Substitution, indicated by "s"
+Examples:
 
-  In addition, "e" indicates any type of error.
+* ``foo`` match "foo" exactly
 
-  The fuzziness of a regex item is specified between "{" and "}" after the item.
+* ``(?:foo){i}`` match "foo", permitting insertions
 
-  Examples:
+* ``(?:foo){d}`` match "foo", permitting deletions
 
-  * ``foo`` match "foo" exactly
+* ``(?:foo){s}`` match "foo", permitting substitutions
 
-  * ``(?:foo){i}`` match "foo", permitting insertions
+* ``(?:foo){i,s}`` match "foo", permitting insertions and substitutions
 
-  * ``(?:foo){d}`` match "foo", permitting deletions
+* ``(?:foo){e}`` match "foo", permitting errors
 
-  * ``(?:foo){s}`` match "foo", permitting substitutions
+If a certain type of error is specified, then any type not specified will **not** be permitted.
 
-  * ``(?:foo){i,s}`` match "foo", permitting insertions and substitutions
+In the following examples I'll omit the item and write only the fuzziness:
 
-  * ``(?:foo){e}`` match "foo", permitting errors
+* ``{d<=3}`` permit at most 3 deletions, but no other types
 
-  If a certain type of error is specified, then any type not specified will **not** be permitted.
+* ``{i<=1,s<=2}`` permit at most 1 insertion and at most 2 substitutions, but no deletions
 
-  In the following examples I'll omit the item and write only the fuzziness:
+* ``{1<=e<=3}`` permit at least 1 and at most 3 errors
 
-  * ``{d<=3}`` permit at most 3 deletions, but no other types
+* ``{i<=2,d<=2,e<=3}`` permit at most 2 insertions, at most 2 deletions, at most 3 errors in total, but no substitutions
 
-  * ``{i<=1,s<=2}`` permit at most 1 insertion and at most 2 substitutions, but no deletions
+It's also possible to state the costs of each type of error and the maximum permitted total cost.
 
-  * ``{1<=e<=3}`` permit at least 1 and at most 3 errors
+Examples:
 
-  * ``{i<=2,d<=2,e<=3}`` permit at most 2 insertions, at most 2 deletions, at most 3 errors in total, but no substitutions
+* ``{2i+2d+1s<=4}`` each insertion costs 2, each deletion costs 2, each substitution costs 1, the total cost must not exceed 4
 
-  It's also possible to state the costs of each type of error and the maximum permitted total cost.
+* ``{i<=1,d<=1,s<=1,2i+2d+1s<=4}`` at most 1 insertion, at most 1 deletion, at most 1 substitution; each insertion costs 2, each deletion costs 2, each substitution costs 1, the total cost must not exceed 4
 
-  Examples:
+You can also use "<" instead of "<=" if you want an exclusive minimum or maximum.
 
-  * ``{2i+2d+1s<=4}`` each insertion costs 2, each deletion costs 2, each substitution costs 1, the total cost must not exceed 4
+You can add a test to perform on a character that's substituted or inserted.
 
-  * ``{i<=1,d<=1,s<=1,2i+2d+1s<=4}`` at most 1 insertion, at most 1 deletion, at most 1 substitution; each insertion costs 2, each deletion costs 2, each substitution costs 1, the total cost must not exceed 4
+Examples:
 
-  You can also use "<" instead of "<=" if you want an exclusive minimum or maximum.
+* ``{s<=2:[a-z]}`` at most 2 substitutions, which must be in the character set ``[a-z]``.
 
-  You can add a test to perform on a character that's substituted or inserted.
+* ``{s<=2,i<=3:\d}`` at most 2 substitutions, at most 3 insertions, which must be digits.
 
-  Examples:
+By default, fuzzy matching searches for the first match that meets the given constraints. The ``ENHANCEMATCH`` flag will cause it to attempt to improve the fit (i.e. reduce the number of errors) of the match that it has found.
 
-  * ``{s<=2:[a-z]}`` at most 2 substitutions, which must be in the character set ``[a-z]``.
+The ``BESTMATCH`` flag will make it search for the best match instead.
 
-  * ``{s<=2,i<=3:\d}`` at most 2 substitutions, at most 3 insertions, which must be digits.
+Further examples to note:
 
-  By default, fuzzy matching searches for the first match that meets the given constraints. The ``ENHANCEMATCH`` flag will cause it to attempt to improve the fit (i.e. reduce the number of errors) of the match that it has found.
+* ``regex.search("(dog){e}", "cat and dog")[1]`` returns ``"cat"`` because that matches ``"dog"`` with 3 errors (an unlimited number of errors is permitted).
 
-  The ``BESTMATCH`` flag will make it search for the best match instead.
+* ``regex.search("(dog){e<=1}", "cat and dog")[1]`` returns ``" dog"`` (with a leading space) because that matches ``"dog"`` with 1 error, which is within the limit.
 
-  Further examples to note:
+* ``regex.search("(?e)(dog){e<=1}", "cat and dog")[1]`` returns ``"dog"`` (without a leading space) because the fuzzy search matches ``" dog"`` with 1 error, which is within the limit, and the ``(?e)`` then it attempts a better fit.
 
-  * ``regex.search("(dog){e}", "cat and dog")[1]`` returns ``"cat"`` because that matches ``"dog"`` with 3 errors (an unlimited number of errors is permitted).
+In the first two examples there are perfect matches later in the string, but in neither case is it the first possible match.
 
-  * ``regex.search("(dog){e<=1}", "cat and dog")[1]`` returns ``" dog"`` (with a leading space) because that matches ``"dog"`` with 1 error, which is within the limit.
+The match object has an attribute ``fuzzy_counts`` which gives the total number of substitutions, insertions and deletions.
 
-  * ``regex.search("(?e)(dog){e<=1}", "cat and dog")[1]`` returns ``"dog"`` (without a leading space) because the fuzzy search matches ``" dog"`` with 1 error, which is within the limit, and the ``(?e)`` then it attempts a better fit.
+.. sourcecode:: python
 
-  In the first two examples there are perfect matches later in the string, but in neither case is it the first possible match.
+  >>> # A 'raw' fuzzy match:
+  >>> regex.fullmatch(r"(?:cats|cat){e<=1}", "cat").fuzzy_counts
+  (0, 0, 1)
+  >>> # 0 substitutions, 0 insertions, 1 deletion.
 
-  The match object has an attribute ``fuzzy_counts`` which gives the total number of substitutions, insertions and deletions.
+  >>> # A better match might be possible if the ENHANCEMATCH flag used:
+  >>> regex.fullmatch(r"(?e)(?:cats|cat){e<=1}", "cat").fuzzy_counts
+  (0, 0, 0)
+  >>> # 0 substitutions, 0 insertions, 0 deletions.
 
-  .. sourcecode:: python
+The match object also has an attribute ``fuzzy_changes`` which gives a tuple of the positions of the substitutions, insertions and deletions.
 
-    >>> # A 'raw' fuzzy match:
-    >>> regex.fullmatch(r"(?:cats|cat){e<=1}", "cat").fuzzy_counts
-    (0, 0, 1)
-    >>> # 0 substitutions, 0 insertions, 1 deletion.
+.. sourcecode:: python
 
-    >>> # A better match might be possible if the ENHANCEMATCH flag used:
-    >>> regex.fullmatch(r"(?e)(?:cats|cat){e<=1}", "cat").fuzzy_counts
-    (0, 0, 0)
-    >>> # 0 substitutions, 0 insertions, 0 deletions.
+  >>> m = regex.search('(fuu){i<=2,d<=2,e<=5}', 'anaconda foo bar')
+  >>> m
+  <regex.Match object; span=(7, 10), match='a f', fuzzy_counts=(0, 2, 2)>
+  >>> m.fuzzy_changes
+  ([], [7, 8], [10, 11])
 
-  The match object also has an attribute ``fuzzy_changes`` which gives a tuple of the positions of the substitutions, insertions and deletions.
+What this means is that if the matched part of the string had been:
 
-  .. sourcecode:: python
+.. sourcecode:: python
 
-    >>> m = regex.search('(fuu){i<=2,d<=2,e<=5}', 'anaconda foo bar')
-    >>> m
-    <regex.Match object; span=(7, 10), match='a f', fuzzy_counts=(0, 2, 2)>
-    >>> m.fuzzy_changes
-    ([], [7, 8], [10, 11])
+  'anacondfuuoo bar'
 
-  What this means is that if the matched part of the string had been:
+it would've been an exact match.
 
-  .. sourcecode:: python
+However, there were insertions at positions 7 and 8:
 
-    'anacondfuuoo bar'
+.. sourcecode:: python
 
-  it would've been an exact match.
+  'anaconda fuuoo bar'
+          ^^
 
-  However, there were insertions at positions 7 and 8:
+and deletions at positions 10 and 11:
 
-  .. sourcecode:: python
+.. sourcecode:: python
 
-    'anaconda fuuoo bar'
-            ^^
+  'anaconda f~~oo bar'
+             ^^
 
-  and deletions at positions 10 and 11:
+So the actual string was:
 
-  .. sourcecode:: python
+.. sourcecode:: python
 
-    'anaconda f~~oo bar'
-               ^^
+  'anaconda foo bar'
 
-  So the actual string was:
+Named lists (`Hg issue 11 <https://bitbucket.org/mrabarnett/mrab-regex/issues/11>`_)
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
-  .. sourcecode:: python
+``\L<name>``
 
-    'anaconda foo bar'
+There are occasions where you may want to include a list (actually, a set) of options in a regex.
 
-* Named lists (`Hg issue 11 <https://bitbucket.org/mrabarnett/mrab-regex/issues/11>`_)
+One way is to build the pattern like this:
 
-  ``\L<name>``
+.. sourcecode:: python
 
-  There are occasions where you may want to include a list (actually, a set) of options in a regex.
+  >>> p = regex.compile(r"first|second|third|fourth|fifth")
 
-  One way is to build the pattern like this:
+but if the list is large, parsing the resulting regex can take considerable time, and care must also be taken that the strings are properly escaped and properly ordered, for example, "cats" before "cat".
 
-  .. sourcecode:: python
+The new alternative is to use a named list:
 
-    >>> p = regex.compile(r"first|second|third|fourth|fifth")
+.. sourcecode:: python
 
-  but if the list is large, parsing the resulting regex can take considerable time, and care must also be taken that the strings are properly escaped and properly ordered, for example, "cats" before "cat".
+  >>> option_set = ["first", "second", "third", "fourth", "fifth"]
+  >>> p = regex.compile(r"\L<options>", options=option_set)
 
-  The new alternative is to use a named list:
+The order of the items is irrelevant, they are treated as a set. The named lists are available as the ``.named_lists`` attribute of the pattern object :
 
-  .. sourcecode:: python
+.. sourcecode:: python
 
-    >>> option_set = ["first", "second", "third", "fourth", "fifth"]
-    >>> p = regex.compile(r"\L<options>", options=option_set)
+  >>> print(p.named_lists)
+  # Python 3
+  {'options': frozenset({'fifth', 'first', 'fourth', 'second', 'third'})}
+  # Python 2
+  {'options': frozenset(['fifth', 'fourth', 'second', 'third', 'first'])}
 
-  The order of the items is irrelevant, they are treated as a set. The named lists are available as the ``.named_lists`` attribute of the pattern object :
+If there are any unused keyword arguments, ``ValueError`` will be raised unless you tell it otherwise:
 
-  .. sourcecode:: python
+.. sourcecode:: python
 
-    >>> print(p.named_lists)
-    # Python 3
-    {'options': frozenset({'fifth', 'first', 'fourth', 'second', 'third'})}
-    # Python 2
-    {'options': frozenset(['fifth', 'fourth', 'second', 'third', 'first'])}
+  >>> option_set = ["first", "second", "third", "fourth", "fifth"]
+  >>> p = regex.compile(r"\L<options>", options=option_set, other_options=[])
+  Traceback (most recent call last):
+    File "<stdin>", line 1, in <module>
+    File "C:\Python37\lib\site-packages\regex\regex.py", line 348, in compile
+      return _compile(pattern, flags, ignore_unused, kwargs)
+    File "C:\Python37\lib\site-packages\regex\regex.py", line 585, in _compile
+      raise ValueError('unused keyword argument {!a}'.format(any_one))
+  ValueError: unused keyword argument 'other_options'
+  >>> p = regex.compile(r"\L<options>", options=option_set, other_options=[], ignore_unused=True)
+  >>>
 
-* Start and end of word
+Start and end of word
+^^^^^^^^^^^^^^^^^^^^^
 
-  ``\m`` matches at the start of a word.
+``\m`` matches at the start of a word.
 
-  ``\M`` matches at the end of a word.
+``\M`` matches at the end of a word.
 
-  Compare with ``\b``, which matches at the start or end of a word.
+Compare with ``\b``, which matches at the start or end of a word.
 
-* Unicode line separators
+Unicode line separators
+^^^^^^^^^^^^^^^^^^^^^^^
 
-  Normally the only line separator is ``\n`` (``\x0A``), but if the ``WORD`` flag is turned on then the line separators are ``\x0D\x0A``, ``\x0A``, ``\x0B``, ``\x0C`` and ``\x0D``, plus ``\x85``, ``\u2028`` and ``\u2029`` when working with Unicode.
+Normally the only line separator is ``\n`` (``\x0A``), but if the ``WORD`` flag is turned on then the line separators are ``\x0D\x0A``, ``\x0A``, ``\x0B``, ``\x0C`` and ``\x0D``, plus ``\x85``, ``\u2028`` and ``\u2029`` when working with Unicode.
 
-  This affects the regex dot ``"."``, which, with the ``DOTALL`` flag turned off, matches any character except a line separator. It also affects the line anchors ``^`` and ``$`` (in multiline mode).
+This affects the regex dot ``"."``, which, with the ``DOTALL`` flag turned off, matches any character except a line separator. It also affects the line anchors ``^`` and ``$`` (in multiline mode).
 
-* Set operators
+Set operators
+^^^^^^^^^^^^^
 
-  **Version 1 behaviour only**
+**Version 1 behaviour only**
 
-  Set operators have been added, and a set ``[...]`` can include nested sets.
+Set operators have been added, and a set ``[...]`` can include nested sets.
 
-  The operators, in order of increasing precedence, are:
+The operators, in order of increasing precedence, are:
 
-  * ``||`` for union ("x||y" means "x or y")
+* ``||`` for union ("x||y" means "x or y")
 
-  * ``~~`` (double tilde) for symmetric difference ("x~~y" means "x or y, but not both")
+* ``~~`` (double tilde) for symmetric difference ("x~~y" means "x or y, but not both")
 
-  * ``&&`` for intersection ("x&&y" means "x and y")
+* ``&&`` for intersection ("x&&y" means "x and y")
 
-  * ``--`` (double dash) for difference ("x--y" means "x but not y")
+* ``--`` (double dash) for difference ("x--y" means "x but not y")
 
-  Implicit union, ie, simple juxtaposition like in ``[ab]``, has the highest precedence. Thus, ``[ab&&cd]`` is the same as ``[[a||b]&&[c||d]]``.
+Implicit union, ie, simple juxtaposition like in ``[ab]``, has the highest precedence. Thus, ``[ab&&cd]`` is the same as ``[[a||b]&&[c||d]]``.
 
-  Examples:
+Examples:
 
-  * ``[ab]`` # Set containing 'a' and 'b'
+* ``[ab]`` # Set containing 'a' and 'b'
 
-  * ``[a-z]`` # Set containing 'a' .. 'z'
+* ``[a-z]`` # Set containing 'a' .. 'z'
 
-  * ``[[a-z]--[qw]]`` # Set containing 'a' .. 'z', but not 'q' or 'w'
+* ``[[a-z]--[qw]]`` # Set containing 'a' .. 'z', but not 'q' or 'w'
 
-  * ``[a-z--qw]`` # Same as above
+* ``[a-z--qw]`` # Same as above
 
-  * ``[\p{L}--QW]`` # Set containing all letters except 'Q' and 'W'
+* ``[\p{L}--QW]`` # Set containing all letters except 'Q' and 'W'
 
-  * ``[\p{N}--[0-9]]`` # Set containing all numbers except '0' .. '9'
+* ``[\p{N}--[0-9]]`` # Set containing all numbers except '0' .. '9'
 
-  * ``[\p{ASCII}&&\p{Letter}]`` # Set containing all characters which are ASCII and letter
+* ``[\p{ASCII}&&\p{Letter}]`` # Set containing all characters which are ASCII and letter
 
-* regex.escape (`issue #2650 <https://bugs.python.org/issue2650>`_)
+regex.escape (`issue #2650 <https://bugs.python.org/issue2650>`_)
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
-  regex.escape has an additional keyword parameter ``special_only``. When True, only 'special' regex characters, such as '?', are escaped.
+regex.escape has an additional keyword parameter ``special_only``. When True, only 'special' regex characters, such as '?', are escaped.
 
-  Examples:
+Examples:
 
-  .. sourcecode:: python
+.. sourcecode:: python
 
-    >>> regex.escape("foo!?", special_only=False)
-    'foo\\!\\?'
-    >>> regex.escape("foo!?", special_only=True)
-    'foo!\\?'
+  >>> regex.escape("foo!?", special_only=False)
+  'foo\\!\\?'
+  >>> regex.escape("foo!?", special_only=True)
+  'foo!\\?'
 
-* regex.escape (`Hg issue 249 <https://bitbucket.org/mrabarnett/mrab-regex/issues/249>`_)
+regex.escape (`Hg issue 249 <https://bitbucket.org/mrabarnett/mrab-regex/issues/249>`_)
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
-  regex.escape has an additional keyword parameter ``literal_spaces``. When True, spaces are not escaped.
+regex.escape has an additional keyword parameter ``literal_spaces``. When True, spaces are not escaped.
 
-  Examples:
+Examples:
 
-  .. sourcecode:: python
+.. sourcecode:: python
 
-    >>> regex.escape("foo bar!?", literal_spaces=False)
-    'foo\\ bar!\\?'
-    >>> regex.escape("foo bar!?", literal_spaces=True)
-    'foo bar!\\?'
+  >>> regex.escape("foo bar!?", literal_spaces=False)
+  'foo\\ bar!\\?'
+  >>> regex.escape("foo bar!?", literal_spaces=True)
+  'foo bar!\\?'
 
-* Repeated captures (`issue #7132 <https://bugs.python.org/issue7132>`_)
+Repeated captures (`issue #7132 <https://bugs.python.org/issue7132>`_)
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
-  A match object has additional methods which return information on all the successful matches of a repeated capture group. These methods are:
+A match object has additional methods which return information on all the successful matches of a repeated capture group. These methods are:
 
-  * ``matchobject.captures([group1, ...])``
+* ``matchobject.captures([group1, ...])``
 
-    * Returns a list of the strings matched in a group or groups. Compare with ``matchobject.group([group1, ...])``.
+  * Returns a list of the strings matched in a group or groups. Compare with ``matchobject.group([group1, ...])``.
 
-  * ``matchobject.starts([group])``
+* ``matchobject.starts([group])``
 
-    * Returns a list of the start positions. Compare with ``matchobject.start([group])``.
+  * Returns a list of the start positions. Compare with ``matchobject.start([group])``.
 
-  * ``matchobject.ends([group])``
+* ``matchobject.ends([group])``
 
-    * Returns a list of the end positions. Compare with ``matchobject.end([group])``.
+  * Returns a list of the end positions. Compare with ``matchobject.end([group])``.
 
-  * ``matchobject.spans([group])``
+* ``matchobject.spans([group])``
 
-    * Returns a list of the spans. Compare with ``matchobject.span([group])``.
+  * Returns a list of the spans. Compare with ``matchobject.span([group])``.
 
-  Examples:
+Examples:
 
-  .. sourcecode:: python
+.. sourcecode:: python
 
-    >>> m = regex.search(r"(\w{3})+", "123456789")
-    >>> m.group(1)
-    '789'
-    >>> m.captures(1)
-    ['123', '456', '789']
-    >>> m.start(1)
-    6
-    >>> m.starts(1)
-    [0, 3, 6]
-    >>> m.end(1)
-    9
-    >>> m.ends(1)
-    [3, 6, 9]
-    >>> m.span(1)
-    (6, 9)
-    >>> m.spans(1)
-    [(0, 3), (3, 6), (6, 9)]
+  >>> m = regex.search(r"(\w{3})+", "123456789")
+  >>> m.group(1)
+  '789'
+  >>> m.captures(1)
+  ['123', '456', '789']
+  >>> m.start(1)
+  6
+  >>> m.starts(1)
+  [0, 3, 6]
+  >>> m.end(1)
+  9
+  >>> m.ends(1)
+  [3, 6, 9]
+  >>> m.span(1)
+  (6, 9)
+  >>> m.spans(1)
+  [(0, 3), (3, 6), (6, 9)]
 
-* Atomic grouping (`issue #433030 <https://bugs.python.org/issue433030>`_)
+Atomic grouping (`issue #433030 <https://bugs.python.org/issue433030>`_)
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
-  ``(?>...)``
+``(?>...)``
 
-  If the following pattern subsequently fails, then the subpattern as a whole will fail.
+If the following pattern subsequently fails, then the subpattern as a whole will fail.
 
-* Possessive quantifiers.
+Possessive quantifiers.
+^^^^^^^^^^^^^^^^^^^^^^^
 
-  ``(?:...)?+`` ; ``(?:...)*+`` ; ``(?:...)++`` ; ``(?:...){min,max}+``
+``(?:...)?+`` ; ``(?:...)*+`` ; ``(?:...)++`` ; ``(?:...){min,max}+``
 
-  The subpattern is matched up to 'max' times. If the following pattern subsequently fails, then all of the repeated subpatterns will fail as a whole. For example, ``(?:...)++`` is equivalent to ``(?>(?:...)+)``.
+The subpattern is matched up to 'max' times. If the following pattern subsequently fails, then all of the repeated subpatterns will fail as a whole. For example, ``(?:...)++`` is equivalent to ``(?>(?:...)+)``.
 
-* Scoped flags (`issue #433028 <https://bugs.python.org/issue433028>`_)
+Scoped flags (`issue #433028 <https://bugs.python.org/issue433028>`_)
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
-  ``(?flags-flags:...)``
+``(?flags-flags:...)``
 
-  The flags will apply only to the subpattern. Flags can be turned on or off.
+The flags will apply only to the subpattern. Flags can be turned on or off.
 
-* Definition of 'word' character (`issue #1693050 <https://bugs.python.org/issue1693050>`_)
+Definition of 'word' character (`issue #1693050 <https://bugs.python.org/issue1693050>`_)
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
-  The definition of a 'word' character has been expanded for Unicode. It now conforms to the Unicode specification at ``http://www.unicode.org/reports/tr29/``.
+The definition of a 'word' character has been expanded for Unicode. It now conforms to the Unicode specification at ``http://www.unicode.org/reports/tr29/``.
 
-* Variable-length lookbehind
+Variable-length lookbehind
+^^^^^^^^^^^^^^^^^^^^^^^^^^
 
-  A lookbehind can match a variable-length string.
+A lookbehind can match a variable-length string.
 
-* Flags argument for regex.split, regex.sub and regex.subn (`issue #3482 <https://bugs.python.org/issue3482>`_)
+Flags argument for regex.split, regex.sub and regex.subn (`issue #3482 <https://bugs.python.org/issue3482>`_)
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
-  ``regex.split``, ``regex.sub`` and ``regex.subn`` support a 'flags' argument.
+``regex.split``, ``regex.sub`` and ``regex.subn`` support a 'flags' argument.
 
-* Pos and endpos arguments for regex.sub and regex.subn
+Pos and endpos arguments for regex.sub and regex.subn
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
-  ``regex.sub`` and ``regex.subn`` support 'pos' and 'endpos' arguments.
+``regex.sub`` and ``regex.subn`` support 'pos' and 'endpos' arguments.
 
-* 'Overlapped' argument for regex.findall and regex.finditer
+'Overlapped' argument for regex.findall and regex.finditer
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
-  ``regex.findall`` and ``regex.finditer`` support an 'overlapped' flag which permits overlapped matches.
+``regex.findall`` and ``regex.finditer`` support an 'overlapped' flag which permits overlapped matches.
 
-* Splititer
+Splititer
+^^^^^^^^^
 
-  ``regex.splititer`` has been added. It's a generator equivalent of ``regex.split``.
+``regex.splititer`` has been added. It's a generator equivalent of ``regex.split``.
 
-* Subscripting for groups
+Subscripting for groups
+^^^^^^^^^^^^^^^^^^^^^^^
 
-  A match object accepts access to the captured groups via subscripting and slicing:
+A match object accepts access to the captured groups via subscripting and slicing:
 
-  .. sourcecode:: python
+.. sourcecode:: python
 
-    >>> m = regex.search(r"(?P<before>.*?)(?P<num>\d+)(?P<after>.*)", "pqr123stu")
-    >>> print(m["before"])
-    pqr
-    >>> print(len(m))
-    4
-    >>> print(m[:])
-    ('pqr123stu', 'pqr', '123', 'stu')
+  >>> m = regex.search(r"(?P<before>.*?)(?P<num>\d+)(?P<after>.*)", "pqr123stu")
+  >>> print(m["before"])
+  pqr
+  >>> print(len(m))
+  4
+  >>> print(m[:])
+  ('pqr123stu', 'pqr', '123', 'stu')
 
-* Named groups
+Named groups
+^^^^^^^^^^^^
 
-  Groups can be named with ``(?<name>...)`` as well as the current ``(?P<name>...)``.
+Groups can be named with ``(?<name>...)`` as well as the current ``(?P<name>...)``.
 
-* Group references
+Group references
+^^^^^^^^^^^^^^^^
 
-  Groups can be referenced within a pattern with ``\g<name>``. This also allows there to be more than 99 groups.
+Groups can be referenced within a pattern with ``\g<name>``. This also allows there to be more than 99 groups.
 
-* Named characters
+Named characters
+^^^^^^^^^^^^^^^^
 
-  ``\N{name}``
+``\N{name}``
 
-  Named characters are supported. (Note: only those known by Python's Unicode database are supported.)
+Named characters are supported. (Note: only those known by Python's Unicode database are supported.)
 
-* Unicode codepoint properties, including scripts and blocks
+Unicode codepoint properties, including scripts and blocks
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
-  ``\p{property=value}``; ``\P{property=value}``; ``\p{value}`` ; ``\P{value}``
+``\p{property=value}``; ``\P{property=value}``; ``\p{value}`` ; ``\P{value}``
 
-  Many Unicode properties are supported, including blocks and scripts. ``\p{property=value}`` or ``\p{property:value}`` matches a character whose property ``property`` has value ``value``. The inverse of ``\p{property=value}`` is ``\P{property=value}`` or ``\p{^property=value}``.
+Many Unicode properties are supported, including blocks and scripts. ``\p{property=value}`` or ``\p{property:value}`` matches a character whose property ``property`` has value ``value``. The inverse of ``\p{property=value}`` is ``\P{property=value}`` or ``\p{^property=value}``.
 
-  If the short form ``\p{value}`` is used, the properties are checked in the order: ``General_Category``, ``Script``, ``Block``, binary property:
+If the short form ``\p{value}`` is used, the properties are checked in the order: ``General_Category``, ``Script``, ``Block``, binary property:
 
-  * ``Latin``, the 'Latin' script (``Script=Latin``).
+* ``Latin``, the 'Latin' script (``Script=Latin``).
 
-  * ``BasicLatin``, the 'BasicLatin' block (``Block=BasicLatin``).
+* ``BasicLatin``, the 'BasicLatin' block (``Block=BasicLatin``).
 
-  * ``Alphabetic``, the 'Alphabetic' binary property (``Alphabetic=Yes``).
+* ``Alphabetic``, the 'Alphabetic' binary property (``Alphabetic=Yes``).
 
-  A short form starting with ``Is`` indicates a script or binary property:
+A short form starting with ``Is`` indicates a script or binary property:
 
-  * ``IsLatin``, the 'Latin' script (``Script=Latin``).
+* ``IsLatin``, the 'Latin' script (``Script=Latin``).
 
-  * ``IsAlphabetic``, the 'Alphabetic' binary property (``Alphabetic=Yes``).
+* ``IsAlphabetic``, the 'Alphabetic' binary property (``Alphabetic=Yes``).
 
-  A short form starting with ``In`` indicates a block property:
+A short form starting with ``In`` indicates a block property:
 
-  * ``InBasicLatin``, the 'BasicLatin' block (``Block=BasicLatin``).
+* ``InBasicLatin``, the 'BasicLatin' block (``Block=BasicLatin``).
 
-* POSIX character classes
+POSIX character classes
+^^^^^^^^^^^^^^^^^^^^^^^
 
-  ``[[:alpha:]]``; ``[[:^alpha:]]``
+``[[:alpha:]]``; ``[[:^alpha:]]``
 
-  POSIX character classes are supported. These are normally treated as an alternative form of ``\p{...}``.
+POSIX character classes are supported. These are normally treated as an alternative form of ``\p{...}``.
 
-  The exceptions are ``alnum``, ``digit``, ``punct`` and ``xdigit``, whose definitions are different from those of Unicode.
+The exceptions are ``alnum``, ``digit``, ``punct`` and ``xdigit``, whose definitions are different from those of Unicode.
 
-  ``[[:alnum:]]`` is equivalent to ``\p{posix_alnum}``.
+``[[:alnum:]]`` is equivalent to ``\p{posix_alnum}``.
 
-  ``[[:digit:]]`` is equivalent to ``\p{posix_digit}``.
+``[[:digit:]]`` is equivalent to ``\p{posix_digit}``.
 
-  ``[[:punct:]]`` is equivalent to ``\p{posix_punct}``.
+``[[:punct:]]`` is equivalent to ``\p{posix_punct}``.
 
-  ``[[:xdigit:]]`` is equivalent to ``\p{posix_xdigit}``.
+``[[:xdigit:]]`` is equivalent to ``\p{posix_xdigit}``.
 
-* Search anchor
+Search anchor
+^^^^^^^^^^^^^
 
-  ``\G``
+``\G``
 
-  A search anchor has been added. It matches at the position where each search started/continued and can be used for contiguous matches or in negative variable-length lookbehinds to limit how far back the lookbehind goes:
+A search anchor has been added. It matches at the position where each search started/continued and can be used for contiguous matches or in negative variable-length lookbehinds to limit how far back the lookbehind goes:
 
-  .. sourcecode:: python
+.. sourcecode:: python
 
-    >>> regex.findall(r"\w{2}", "abcd ef")
-    ['ab', 'cd', 'ef']
-    >>> regex.findall(r"\G\w{2}", "abcd ef")
-    ['ab', 'cd']
+  >>> regex.findall(r"\w{2}", "abcd ef")
+  ['ab', 'cd', 'ef']
+  >>> regex.findall(r"\G\w{2}", "abcd ef")
+  ['ab', 'cd']
 
-  * The search starts at position 0 and matches 2 letters 'ab'.
+* The search starts at position 0 and matches 2 letters 'ab'.
 
-  * The search continues at position 2 and matches 2 letters 'cd'.
+* The search continues at position 2 and matches 2 letters 'cd'.
 
-  * The search continues at position 4 and fails to match any letters.
+* The search continues at position 4 and fails to match any letters.
 
-  * The anchor stops the search start position from being advanced, so there are no more results.
+* The anchor stops the search start position from being advanced, so there are no more results.
 
-* Reverse searching
+Reverse searching
+^^^^^^^^^^^^^^^^^
 
-  Searches can now work backwards:
+Searches can now work backwards:
 
-  .. sourcecode:: python
+.. sourcecode:: python
 
-    >>> regex.findall(r".", "abc")
-    ['a', 'b', 'c']
-    >>> regex.findall(r"(?r).", "abc")
-    ['c', 'b', 'a']
+  >>> regex.findall(r".", "abc")
+  ['a', 'b', 'c']
+  >>> regex.findall(r"(?r).", "abc")
+  ['c', 'b', 'a']
 
-  Note: the result of a reverse search is not necessarily the reverse of a forward search:
+Note: the result of a reverse search is not necessarily the reverse of a forward search:
 
-  .. sourcecode:: python
+.. sourcecode:: python
 
-    >>> regex.findall(r"..", "abcde")
-    ['ab', 'cd']
-    >>> regex.findall(r"(?r)..", "abcde")
-    ['de', 'bc']
+  >>> regex.findall(r"..", "abcde")
+  ['ab', 'cd']
+  >>> regex.findall(r"(?r)..", "abcde")
+  ['de', 'bc']
 
-* Matching a single grapheme
+Matching a single grapheme
+^^^^^^^^^^^^^^^^^^^^^^^^^^
 
-  ``\X``
+``\X``
 
-  The grapheme matcher is supported. It now conforms to the Unicode specification at ``http://www.unicode.org/reports/tr29/``.
+The grapheme matcher is supported. It now conforms to the Unicode specification at ``http://www.unicode.org/reports/tr29/``.
 
-* Branch reset
+Branch reset
+^^^^^^^^^^^^
 
-  ``(?|...|...)``
+``(?|...|...)``
 
-  Capture group numbers will be reused across the alternatives, but groups with different names will have different group numbers.
+Capture group numbers will be reused across the alternatives, but groups with different names will have different group numbers.
 
-  Examples:
+Examples:
 
-  .. sourcecode:: python
+.. sourcecode:: python
 
-    >>> regex.match(r"(?|(first)|(second))", "first").groups()
-    ('first',)
-    >>> regex.match(r"(?|(first)|(second))", "second").groups()
-    ('second',)
+  >>> regex.match(r"(?|(first)|(second))", "first").groups()
+  ('first',)
+  >>> regex.match(r"(?|(first)|(second))", "second").groups()
+  ('second',)
 
-  Note that there is only one group.
+Note that there is only one group.
 
-* Default Unicode word boundary
+Default Unicode word boundary
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
-  The ``WORD`` flag changes the definition of a 'word boundary' to that of a default Unicode word boundary. This applies to ``\b`` and ``\B``.
+The ``WORD`` flag changes the definition of a 'word boundary' to that of a default Unicode word boundary. This applies to ``\b`` and ``\B``.
 
-* Timeout (Python 3)
+Timeout (Python 3)
+^^^^^^^^^^^^^^^^^^
 
-  The matching methods and functions support timeouts. The timeout (in seconds) applies to the entire operation:
+The matching methods and functions support timeouts. The timeout (in seconds) applies to the entire operation:
 
-  .. sourcecode:: python
+.. sourcecode:: python
 
-    >>> from time import sleep
-    >>>
-    >>> def fast_replace(m):
-    ...     return 'X'
-    ...
-    >>> def slow_replace(m):
-    ...     sleep(0.5)
-    ...     return 'X'
-    ...
-    >>> regex.sub(r'[a-z]', fast_replace, 'abcde', timeout=2)
-    'XXXXX'
-    >>> regex.sub(r'[a-z]', slow_replace, 'abcde', timeout=2)
-    Traceback (most recent call last):
-      File "<stdin>", line 1, in <module>
-      File "C:\Python37\lib\site-packages\regex\regex.py", line 276, in sub
-        endpos, concurrent, timeout)
-    TimeoutError: regex timed out
+  >>> from time import sleep
+  >>>
+  >>> def fast_replace(m):
+  ...     return 'X'
+  ...
+  >>> def slow_replace(m):
+  ...     sleep(0.5)
+  ...     return 'X'
+  ...
+  >>> regex.sub(r'[a-z]', fast_replace, 'abcde', timeout=2)
+  'XXXXX'
+  >>> regex.sub(r'[a-z]', slow_replace, 'abcde', timeout=2)
+  Traceback (most recent call last):
+    File "<stdin>", line 1, in <module>
+    File "C:\Python37\lib\site-packages\regex\regex.py", line 276, in sub
+      endpos, concurrent, timeout)
+  TimeoutError: regex timed out
diff --git a/docs/UnicodeProperties.txt b/docs/UnicodeProperties.rst
similarity index 100%
rename from docs/UnicodeProperties.txt
rename to docs/UnicodeProperties.rst
diff --git a/regex.egg-info/PKG-INFO b/regex.egg-info/PKG-INFO
new file mode 100644
index 0000000..584e08b
--- /dev/null
+++ b/regex.egg-info/PKG-INFO
@@ -0,0 +1,1086 @@
+Metadata-Version: 1.1
+Name: regex
+Version: 2020.7.14
+Summary: Alternative regular expression module, to replace re.
+Home-page: https://bitbucket.org/mrabarnett/mrab-regex
+Author: Matthew Barnett
+Author-email: regex@mrabarnett.plus.com
+License: Python Software Foundation License
+Description: Introduction
+        ------------
+        
+        This regex implementation is backwards-compatible with the standard 're' module, but offers additional functionality.
+        
+        Note
+        ----
+        
+        The re module's behaviour with zero-width matches changed in Python 3.7, and this module will follow that behaviour when compiled for Python 3.7.
+        
+        Old vs new behaviour
+        --------------------
+        
+        In order to be compatible with the re module, this module has 2 behaviours:
+        
+        * **Version 0** behaviour (old behaviour, compatible with the re module):
+        
+          Please note that the re module's behaviour may change over time, and I'll endeavour to match that behaviour in version 0.
+        
+          * Indicated by the ``VERSION0`` or ``V0`` flag, or ``(?V0)`` in the pattern.
+        
+          * Zero-width matches are not handled correctly in the re module before Python 3.7. The behaviour in those earlier versions is:
+        
+            * ``.split`` won't split a string at a zero-width match.
+        
+            * ``.sub`` will advance by one character after a zero-width match.
+        
+          * Inline flags apply to the entire pattern, and they can't be turned off.
+        
+          * Only simple sets are supported.
+        
+          * Case-insensitive matches in Unicode use simple case-folding by default.
+        
+        * **Version 1** behaviour (new behaviour, possibly different from the re module):
+        
+          * Indicated by the ``VERSION1`` or ``V1`` flag, or ``(?V1)`` in the pattern.
+        
+          * Zero-width matches are handled correctly.
+        
+          * Inline flags apply to the end of the group or pattern, and they can be turned off.
+        
+          * Nested sets and set operations are supported.
+        
+          * Case-insensitive matches in Unicode use full case-folding by default.
+        
+        If no version is specified, the regex module will default to ``regex.DEFAULT_VERSION``.
+        
+        Case-insensitive matches in Unicode
+        -----------------------------------
+        
+        The regex module supports both simple and full case-folding for case-insensitive matches in Unicode. Use of full case-folding can be turned on using the ``FULLCASE`` or ``F`` flag, or ``(?f)`` in the pattern. Please note that this flag affects how the ``IGNORECASE`` flag works; the ``FULLCASE`` flag itself does not turn on case-insensitive matching.
+        
+        In the version 0 behaviour, the flag is off by default.
+        
+        In the version 1 behaviour, the flag is on by default.
+        
+        Nested sets and set operations
+        ------------------------------
+        
+        It's not possible to support both simple sets, as used in the re module, and nested sets at the same time because of a difference in the meaning of an unescaped ``"["`` in a set.
+        
+        For example, the pattern ``[[a-z]--[aeiou]]`` is treated in the version 0 behaviour (simple sets, compatible with the re module) as:
+        
+        * Set containing "[" and the letters "a" to "z"
+        
+        * Literal "--"
+        
+        * Set containing letters "a", "e", "i", "o", "u"
+        
+        * Literal "]"
+        
+        but in the version 1 behaviour (nested sets, enhanced behaviour) as:
+        
+        * Set which is:
+        
+          * Set containing the letters "a" to "z"
+        
+        * but excluding:
+        
+          * Set containing the letters "a", "e", "i", "o", "u"
+        
+        Version 0 behaviour: only simple sets are supported.
+        
+        Version 1 behaviour: nested sets and set operations are supported.
+        
+        Flags
+        -----
+        
+        There are 2 kinds of flag: scoped and global. Scoped flags can apply to only part of a pattern and can be turned on or off; global flags apply to the entire pattern and can only be turned on.
+        
+        The scoped flags are: ``FULLCASE``, ``IGNORECASE``, ``MULTILINE``, ``DOTALL``, ``VERBOSE``, ``WORD``.
+        
+        The global flags are: ``ASCII``, ``BESTMATCH``, ``ENHANCEMATCH``, ``LOCALE``, ``POSIX``, ``REVERSE``, ``UNICODE``, ``VERSION0``, ``VERSION1``.
+        
+        If neither the ``ASCII``, ``LOCALE`` nor ``UNICODE`` flag is specified, it will default to ``UNICODE`` if the regex pattern is a Unicode string and ``ASCII`` if it's a bytestring.
+        
+        The ``ENHANCEMATCH`` flag makes fuzzy matching attempt to improve the fit of the next match that it finds.
+        
+        The ``BESTMATCH`` flag makes fuzzy matching search for the best match instead of the next match.
+        
+        Notes on named capture groups
+        -----------------------------
+        
+        All capture groups have a group number, starting from 1.
+        
+        Groups with the same group name will have the same group number, and groups with a different group name will have a different group number.
+        
+        The same name can be used by more than one group, with later captures 'overwriting' earlier captures. All of the captures of the group will be available from the ``captures`` method of the match object.
+        
+        Group numbers will be reused across different branches of a branch reset, eg. ``(?|(first)|(second))`` has only group 1. If capture groups have different group names then they will, of course, have different group numbers, eg. ``(?|(?P<foo>first)|(?P<bar>second))`` has group 1 ("foo") and group 2 ("bar").
+        
+        In the regex ``(\s+)(?|(?P<foo>[A-Z]+)|(\w+) (?P<foo>[0-9]+)`` there are 2 groups:
+        
+        * ``(\s+)`` is group 1.
+        
+        * ``(?P<foo>[A-Z]+)`` is group 2, also called "foo".
+        
+        * ``(\w+)`` is group 2 because of the branch reset.
+        
+        * ``(?P<foo>[0-9]+)`` is group 2 because it's called "foo".
+        
+        If you want to prevent ``(\w+)`` from being group 2, you need to name it (different name, different group number).
+        
+        Multithreading
+        --------------
+        
+        The regex module releases the GIL during matching on instances of the built-in (immutable) string classes, enabling other Python threads to run concurrently. It is also possible to force the regex module to release the GIL during matching by calling the matching methods with the keyword argument ``concurrent=True``. The behaviour is undefined if the string changes during matching, so use it *only* when it is guaranteed that that won't happen.
+        
+        Unicode
+        -------
+        
+        This module supports Unicode 13.0.0.
+        
+        Full Unicode case-folding is supported.
+        
+        Additional features
+        -------------------
+        
+        The issue numbers relate to the Python bug tracker, except where listed as "Hg issue".
+        
+        Added support for lookaround in conditional pattern (`Hg issue 163 <https://bitbucket.org/mrabarnett/mrab-regex/issues/163>`_)
+        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+        
+        The test of a conditional pattern can now be a lookaround.
+        
+        Examples:
+        
+        .. sourcecode:: python
+        
+          >>> regex.match(r'(?(?=\d)\d+|\w+)', '123abc')
+          <regex.Match object; span=(0, 3), match='123'>
+          >>> regex.match(r'(?(?=\d)\d+|\w+)', 'abc123')
+          <regex.Match object; span=(0, 6), match='abc123'>
+        
+        This is not quite the same as putting a lookaround in the first branch of a pair of alternatives.
+        
+        Examples:
+        
+        .. sourcecode:: python
+        
+          >>> print(regex.match(r'(?:(?=\d)\d+\b|\w+)', '123abc'))
+          <regex.Match object; span=(0, 6), match='123abc'>
+          >>> print(regex.match(r'(?(?=\d)\d+\b|\w+)', '123abc'))
+          None
+        
+        In the first example, the lookaround matched, but the remainder of the first branch failed to match, and so the second branch was attempted, whereas in the second example, the lookaround matched, and the first branch failed to match, but the second branch was **not** attempted.
+        
+        Added POSIX matching (leftmost longest) (`Hg issue 150 <https://bitbucket.org/mrabarnett/mrab-regex/issues/150>`_)
+        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+        
+        The POSIX standard for regex is to return the leftmost longest match. This can be turned on using the ``POSIX`` flag (``(?p)``).
+        
+        Examples:
+        
+        .. sourcecode:: python
+        
+          >>> # Normal matching.
+          >>> regex.search(r'Mr|Mrs', 'Mrs')
+          <regex.Match object; span=(0, 2), match='Mr'>
+          >>> regex.search(r'one(self)?(selfsufficient)?', 'oneselfsufficient')
+          <regex.Match object; span=(0, 7), match='oneself'>
+          >>> # POSIX matching.
+          >>> regex.search(r'(?p)Mr|Mrs', 'Mrs')
+          <regex.Match object; span=(0, 3), match='Mrs'>
+          >>> regex.search(r'(?p)one(self)?(selfsufficient)?', 'oneselfsufficient')
+          <regex.Match object; span=(0, 17), match='oneselfsufficient'>
+        
+        Note that it will take longer to find matches because when it finds a match at a certain position, it won't return that immediately, but will keep looking to see if there's another longer match there.
+        
+        Added ``(?(DEFINE)...)`` (`Hg issue 152 <https://bitbucket.org/mrabarnett/mrab-regex/issues/152>`_)
+        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+        
+        If there's no group called "DEFINE", then ... will be ignored, but any group definitions within it will be available.
+        
+        Examples:
+        
+        .. sourcecode:: python
+        
+          >>> regex.search(r'(?(DEFINE)(?P<quant>\d+)(?P<item>\w+))(?&quant) (?&item)', '5 elephants')
+          <regex.Match object; span=(0, 11), match='5 elephants'>
+        
+        Added ``(*PRUNE)``, ``(*SKIP)`` and ``(*FAIL)`` (`Hg issue 153 <https://bitbucket.org/mrabarnett/mrab-regex/issues/153>`_)
+        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+        
+        ``(*PRUNE)`` discards the backtracking info up to that point. When used in an atomic group or a lookaround, it won't affect the enclosing pattern.
+        
+        ``(*SKIP)`` is similar to ``(*PRUNE)``, except that it also sets where in the text the next attempt to match will start. When used in an atomic group or a lookaround, it won't affect the enclosing pattern.
+        
+        ``(*FAIL)`` causes immediate backtracking. ``(*F)`` is a permitted abbreviation.
+        
+        Added ``\K`` (`Hg issue 151 <https://bitbucket.org/mrabarnett/mrab-regex/issues/151>`_)
+        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+        
+        Keeps the part of the entire match after the position where ``\K`` occurred; the part before it is discarded.
+        
+        It does not affect what capture groups return.
+        
+        Examples:
+        
+        .. sourcecode:: python
+        
+          >>> m = regex.search(r'(\w\w\K\w\w\w)', 'abcdef')
+          >>> m[0]
+          'cde'
+          >>> m[1]
+          'abcde'
+          >>>
+          >>> m = regex.search(r'(?r)(\w\w\K\w\w\w)', 'abcdef')
+          >>> m[0]
+          'bc'
+          >>> m[1]
+          'bcdef'
+        
+        Added capture subscripting for ``expandf`` and ``subf``/``subfn`` (`Hg issue 133 <https://bitbucket.org/mrabarnett/mrab-regex/issues/133>`_)
+        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+        
+        You can now use subscripting to get the captures of a repeated capture group.
+        
+        Examples:
+        
+        .. sourcecode:: python
+        
+          >>> m = regex.match(r"(\w)+", "abc")
+          >>> m.expandf("{1}")
+          'c'
+          >>> m.expandf("{1[0]} {1[1]} {1[2]}")
+          'a b c'
+          >>> m.expandf("{1[-1]} {1[-2]} {1[-3]}")
+          'c b a'
+          >>>
+          >>> m = regex.match(r"(?P<letter>\w)+", "abc")
+          >>> m.expandf("{letter}")
+          'c'
+          >>> m.expandf("{letter[0]} {letter[1]} {letter[2]}")
+          'a b c'
+          >>> m.expandf("{letter[-1]} {letter[-2]} {letter[-3]}")
+          'c b a'
+        
+        Added support for referring to a group by number using ``(?P=...)``.
+        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+        
+        This is in addition to the existing ``\g<...>``.
+        
+        Fixed the handling of locale-sensitive regexes.
+        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+        
+        The ``LOCALE`` flag is intended for legacy code and has limited support. You're still recommended to use Unicode instead.
+        
+        Added partial matches (`Hg issue 102 <https://bitbucket.org/mrabarnett/mrab-regex/issues/102>`_)
+        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+        
+        A partial match is one that matches up to the end of string, but that string has been truncated and you want to know whether a complete match could be possible if the string had not been truncated.
+        
+        Partial matches are supported by ``match``, ``search``, ``fullmatch`` and ``finditer`` with the ``partial`` keyword argument.
+        
+        Match objects have a ``partial`` attribute, which is ``True`` if it's a partial match.
+        
+        For example, if you wanted a user to enter a 4-digit number and check it character by character as it was being entered:
+        
+        .. sourcecode:: python
+        
+          >>> pattern = regex.compile(r'\d{4}')
+        
+          >>> # Initially, nothing has been entered:
+          >>> print(pattern.fullmatch('', partial=True))
+          <regex.Match object; span=(0, 0), match='', partial=True>
+        
+          >>> # An empty string is OK, but it's only a partial match.
+          >>> # The user enters a letter:
+          >>> print(pattern.fullmatch('a', partial=True))
+          None
+          >>> # It'll never match.
+        
+          >>> # The user deletes that and enters a digit:
+          >>> print(pattern.fullmatch('1', partial=True))
+          <regex.Match object; span=(0, 1), match='1', partial=True>
+          >>> # It matches this far, but it's only a partial match.
+        
+          >>> # The user enters 2 more digits:
+          >>> print(pattern.fullmatch('123', partial=True))
+          <regex.Match object; span=(0, 3), match='123', partial=True>
+          >>> # It matches this far, but it's only a partial match.
+        
+          >>> # The user enters another digit:
+          >>> print(pattern.fullmatch('1234', partial=True))
+          <regex.Match object; span=(0, 4), match='1234'>
+          >>> # It's a complete match.
+        
+          >>> # If the user enters another digit:
+          >>> print(pattern.fullmatch('12345', partial=True))
+          None
+          >>> # It's no longer a match.
+        
+          >>> # This is a partial match:
+          >>> pattern.match('123', partial=True).partial
+          True
+        
+          >>> # This is a complete match:
+          >>> pattern.match('1233', partial=True).partial
+          False
+        
+        ``*`` operator not working correctly with sub() (`Hg issue 106 <https://bitbucket.org/mrabarnett/mrab-regex/issues/106>`_)
+        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+        
+        Sometimes it's not clear how zero-width matches should be handled. For example, should ``.*`` match 0 characters directly after matching >0 characters?
+        
+        Examples:
+        
+        .. sourcecode:: python
+        
+          # Python 3.7 and later
+          >>> regex.sub('.*', 'x', 'test')
+          'xx'
+          >>> regex.sub('.*?', '|', 'test')
+          '|||||||||'
+        
+          # Python 3.6 and earlier
+          >>> regex.sub('(?V0).*', 'x', 'test')
+          'x'
+          >>> regex.sub('(?V1).*', 'x', 'test')
+          'xx'
+          >>> regex.sub('(?V0).*?', '|', 'test')
+          '|t|e|s|t|'
+          >>> regex.sub('(?V1).*?', '|', 'test')
+          '|||||||||'
+        
+        Added ``capturesdict`` (`Hg issue 86 <https://bitbucket.org/mrabarnett/mrab-regex/issues/86>`_)
+        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+        
+        ``capturesdict`` is a combination of ``groupdict`` and ``captures``:
+        
+        ``groupdict`` returns a dict of the named groups and the last capture of those groups.
+        
+        ``captures`` returns a list of all the captures of a group
+        
+        ``capturesdict`` returns a dict of the named groups and lists of all the captures of those groups.
+        
+        Examples:
+        
+        .. sourcecode:: python
+        
+          >>> m = regex.match(r"(?:(?P<word>\w+) (?P<digits>\d+)\n)+", "one 1\ntwo 2\nthree 3\n")
+          >>> m.groupdict()
+          {'word': 'three', 'digits': '3'}
+          >>> m.captures("word")
+          ['one', 'two', 'three']
+          >>> m.captures("digits")
+          ['1', '2', '3']
+          >>> m.capturesdict()
+          {'word': ['one', 'two', 'three'], 'digits': ['1', '2', '3']}
+        
+        Allow duplicate names of groups (`Hg issue 87 <https://bitbucket.org/mrabarnett/mrab-regex/issues/87>`_)
+        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+        
+        Group names can now be duplicated.
+        
+        Examples:
+        
+        .. sourcecode:: python
+        
+          >>> # With optional groups:
+          >>>
+          >>> # Both groups capture, the second capture 'overwriting' the first.
+          >>> m = regex.match(r"(?P<item>\w+)? or (?P<item>\w+)?", "first or second")
+          >>> m.group("item")
+          'second'
+          >>> m.captures("item")
+          ['first', 'second']
+          >>> # Only the second group captures.
+          >>> m = regex.match(r"(?P<item>\w+)? or (?P<item>\w+)?", " or second")
+          >>> m.group("item")
+          'second'
+          >>> m.captures("item")
+          ['second']
+          >>> # Only the first group captures.
+          >>> m = regex.match(r"(?P<item>\w+)? or (?P<item>\w+)?", "first or ")
+          >>> m.group("item")
+          'first'
+          >>> m.captures("item")
+          ['first']
+          >>>
+          >>> # With mandatory groups:
+          >>>
+          >>> # Both groups capture, the second capture 'overwriting' the first.
+          >>> m = regex.match(r"(?P<item>\w*) or (?P<item>\w*)?", "first or second")
+          >>> m.group("item")
+          'second'
+          >>> m.captures("item")
+          ['first', 'second']
+          >>> # Again, both groups capture, the second capture 'overwriting' the first.
+          >>> m = regex.match(r"(?P<item>\w*) or (?P<item>\w*)", " or second")
+          >>> m.group("item")
+          'second'
+          >>> m.captures("item")
+          ['', 'second']
+          >>> # And yet again, both groups capture, the second capture 'overwriting' the first.
+          >>> m = regex.match(r"(?P<item>\w*) or (?P<item>\w*)", "first or ")
+          >>> m.group("item")
+          ''
+          >>> m.captures("item")
+          ['first', '']
+        
+        Added ``fullmatch`` (`issue #16203 <https://bugs.python.org/issue16203>`_)
+        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+        
+        ``fullmatch`` behaves like ``match``, except that it must match all of the string.
+        
+        Examples:
+        
+        .. sourcecode:: python
+        
+          >>> print(regex.fullmatch(r"abc", "abc").span())
+          (0, 3)
+          >>> print(regex.fullmatch(r"abc", "abcx"))
+          None
+          >>> print(regex.fullmatch(r"abc", "abcx", endpos=3).span())
+          (0, 3)
+          >>> print(regex.fullmatch(r"abc", "xabcy", pos=1, endpos=4).span())
+          (1, 4)
+          >>>
+          >>> regex.match(r"a.*?", "abcd").group(0)
+          'a'
+          >>> regex.fullmatch(r"a.*?", "abcd").group(0)
+          'abcd'
+        
+        Added ``subf`` and ``subfn``
+        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+        
+        ``subf`` and ``subfn`` are alternatives to ``sub`` and ``subn`` respectively. When passed a replacement string, they treat it as a format string.
+        
+        Examples:
+        
+        .. sourcecode:: python
+        
+          >>> regex.subf(r"(\w+) (\w+)", "{0} => {2} {1}", "foo bar")
+          'foo bar => bar foo'
+          >>> regex.subf(r"(?P<word1>\w+) (?P<word2>\w+)", "{word2} {word1}", "foo bar")
+          'bar foo'
+        
+        Added ``expandf`` to match object
+        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+        
+        ``expandf`` is an alternative to ``expand``. When passed a replacement string, it treats it as a format string.
+        
+        Examples:
+        
+        .. sourcecode:: python
+        
+          >>> m = regex.match(r"(\w+) (\w+)", "foo bar")
+          >>> m.expandf("{0} => {2} {1}")
+          'foo bar => bar foo'
+          >>>
+          >>> m = regex.match(r"(?P<word1>\w+) (?P<word2>\w+)", "foo bar")
+          >>> m.expandf("{word2} {word1}")
+          'bar foo'
+        
+        Detach searched string
+        ^^^^^^^^^^^^^^^^^^^^^^
+        
+        A match object contains a reference to the string that was searched, via its ``string`` attribute. The ``detach_string`` method will 'detach' that string, making it available for garbage collection, which might save valuable memory if that string is very large.
+        
+        Example:
+        
+        .. sourcecode:: python
+        
+          >>> m = regex.search(r"\w+", "Hello world")
+          >>> print(m.group())
+          Hello
+          >>> print(m.string)
+          Hello world
+          >>> m.detach_string()
+          >>> print(m.group())
+          Hello
+          >>> print(m.string)
+          None
+        
+        Recursive patterns (`Hg issue 27 <https://bitbucket.org/mrabarnett/mrab-regex/issues/27>`_)
+        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+        
+        Recursive and repeated patterns are supported.
+        
+        ``(?R)`` or ``(?0)`` tries to match the entire regex recursively. ``(?1)``, ``(?2)``, etc, try to match the relevant capture group.
+        
+        ``(?&name)`` tries to match the named capture group.
+        
+        Examples:
+        
+        .. sourcecode:: python
+        
+          >>> regex.match(r"(Tarzan|Jane) loves (?1)", "Tarzan loves Jane").groups()
+          ('Tarzan',)
+          >>> regex.match(r"(Tarzan|Jane) loves (?1)", "Jane loves Tarzan").groups()
+          ('Jane',)
+        
+          >>> m = regex.search(r"(\w)(?:(?R)|(\w?))\1", "kayak")
+          >>> m.group(0, 1, 2)
+          ('kayak', 'k', None)
+        
+        The first two examples show how the subpattern within the capture group is reused, but is _not_ itself a capture group. In other words, ``"(Tarzan|Jane) loves (?1)"`` is equivalent to ``"(Tarzan|Jane) loves (?:Tarzan|Jane)"``.
+        
+        It's possible to backtrack into a recursed or repeated group.
+        
+        You can't call a group if there is more than one group with that group name or group number (``"ambiguous group reference"``).
+        
+        The alternative forms ``(?P>name)`` and ``(?P&name)`` are also supported.
+        
+        Full Unicode case-folding is supported.
+        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+        
+        In version 1 behaviour, the regex module uses full case-folding when performing case-insensitive matches in Unicode.
+        
+        Examples (in Python 3):
+        
+        .. sourcecode:: python
+        
+          >>> regex.match(r"(?iV1)strasse", "stra\N{LATIN SMALL LETTER SHARP S}e").span()
+          (0, 6)
+          >>> regex.match(r"(?iV1)stra\N{LATIN SMALL LETTER SHARP S}e", "STRASSE").span()
+          (0, 7)
+        
+        In version 0 behaviour, it uses simple case-folding for backward compatibility with the re module.
+        
+        Approximate "fuzzy" matching (`Hg issue 12 <https://bitbucket.org/mrabarnett/mrab-regex/issues/12>`_, `Hg issue 41 <https://bitbucket.org/mrabarnett/mrab-regex/issues/41>`_, `Hg issue 109 <https://bitbucket.org/mrabarnett/mrab-regex/issues/109>`_)
+        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+        
+        Regex usually attempts an exact match, but sometimes an approximate, or "fuzzy", match is needed, for those cases where the text being searched may contain errors in the form of inserted, deleted or substituted characters.
+        
+        A fuzzy regex specifies which types of errors are permitted, and, optionally, either the minimum and maximum or only the maximum permitted number of each type. (You cannot specify only a minimum.)
+        
+        The 3 types of error are:
+        
+        * Insertion, indicated by "i"
+        
+        * Deletion, indicated by "d"
+        
+        * Substitution, indicated by "s"
+        
+        In addition, "e" indicates any type of error.
+        
+        The fuzziness of a regex item is specified between "{" and "}" after the item.
+        
+        Examples:
+        
+        * ``foo`` match "foo" exactly
+        
+        * ``(?:foo){i}`` match "foo", permitting insertions
+        
+        * ``(?:foo){d}`` match "foo", permitting deletions
+        
+        * ``(?:foo){s}`` match "foo", permitting substitutions
+        
+        * ``(?:foo){i,s}`` match "foo", permitting insertions and substitutions
+        
+        * ``(?:foo){e}`` match "foo", permitting errors
+        
+        If a certain type of error is specified, then any type not specified will **not** be permitted.
+        
+        In the following examples I'll omit the item and write only the fuzziness:
+        
+        * ``{d<=3}`` permit at most 3 deletions, but no other types
+        
+        * ``{i<=1,s<=2}`` permit at most 1 insertion and at most 2 substitutions, but no deletions
+        
+        * ``{1<=e<=3}`` permit at least 1 and at most 3 errors
+        
+        * ``{i<=2,d<=2,e<=3}`` permit at most 2 insertions, at most 2 deletions, at most 3 errors in total, but no substitutions
+        
+        It's also possible to state the costs of each type of error and the maximum permitted total cost.
+        
+        Examples:
+        
+        * ``{2i+2d+1s<=4}`` each insertion costs 2, each deletion costs 2, each substitution costs 1, the total cost must not exceed 4
+        
+        * ``{i<=1,d<=1,s<=1,2i+2d+1s<=4}`` at most 1 insertion, at most 1 deletion, at most 1 substitution; each insertion costs 2, each deletion costs 2, each substitution costs 1, the total cost must not exceed 4
+        
+        You can also use "<" instead of "<=" if you want an exclusive minimum or maximum.
+        
+        You can add a test to perform on a character that's substituted or inserted.
+        
+        Examples:
+        
+        * ``{s<=2:[a-z]}`` at most 2 substitutions, which must be in the character set ``[a-z]``.
+        
+        * ``{s<=2,i<=3:\d}`` at most 2 substitutions, at most 3 insertions, which must be digits.
+        
+        By default, fuzzy matching searches for the first match that meets the given constraints. The ``ENHANCEMATCH`` flag will cause it to attempt to improve the fit (i.e. reduce the number of errors) of the match that it has found.
+        
+        The ``BESTMATCH`` flag will make it search for the best match instead.
+        
+        Further examples to note:
+        
+        * ``regex.search("(dog){e}", "cat and dog")[1]`` returns ``"cat"`` because that matches ``"dog"`` with 3 errors (an unlimited number of errors is permitted).
+        
+        * ``regex.search("(dog){e<=1}", "cat and dog")[1]`` returns ``" dog"`` (with a leading space) because that matches ``"dog"`` with 1 error, which is within the limit.
+        
+        * ``regex.search("(?e)(dog){e<=1}", "cat and dog")[1]`` returns ``"dog"`` (without a leading space) because the fuzzy search matches ``" dog"`` with 1 error, which is within the limit, and the ``(?e)`` then it attempts a better fit.
+        
+        In the first two examples there are perfect matches later in the string, but in neither case is it the first possible match.
+        
+        The match object has an attribute ``fuzzy_counts`` which gives the total number of substitutions, insertions and deletions.
+        
+        .. sourcecode:: python
+        
+          >>> # A 'raw' fuzzy match:
+          >>> regex.fullmatch(r"(?:cats|cat){e<=1}", "cat").fuzzy_counts
+          (0, 0, 1)
+          >>> # 0 substitutions, 0 insertions, 1 deletion.
+        
+          >>> # A better match might be possible if the ENHANCEMATCH flag used:
+          >>> regex.fullmatch(r"(?e)(?:cats|cat){e<=1}", "cat").fuzzy_counts
+          (0, 0, 0)
+          >>> # 0 substitutions, 0 insertions, 0 deletions.
+        
+        The match object also has an attribute ``fuzzy_changes`` which gives a tuple of the positions of the substitutions, insertions and deletions.
+        
+        .. sourcecode:: python
+        
+          >>> m = regex.search('(fuu){i<=2,d<=2,e<=5}', 'anaconda foo bar')
+          >>> m
+          <regex.Match object; span=(7, 10), match='a f', fuzzy_counts=(0, 2, 2)>
+          >>> m.fuzzy_changes
+          ([], [7, 8], [10, 11])
+        
+        What this means is that if the matched part of the string had been:
+        
+        .. sourcecode:: python
+        
+          'anacondfuuoo bar'
+        
+        it would've been an exact match.
+        
+        However, there were insertions at positions 7 and 8:
+        
+        .. sourcecode:: python
+        
+          'anaconda fuuoo bar'
+                  ^^
+        
+        and deletions at positions 10 and 11:
+        
+        .. sourcecode:: python
+        
+          'anaconda f~~oo bar'
+                     ^^
+        
+        So the actual string was:
+        
+        .. sourcecode:: python
+        
+          'anaconda foo bar'
+        
+        Named lists (`Hg issue 11 <https://bitbucket.org/mrabarnett/mrab-regex/issues/11>`_)
+        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+        
+        ``\L<name>``
+        
+        There are occasions where you may want to include a list (actually, a set) of options in a regex.
+        
+        One way is to build the pattern like this:
+        
+        .. sourcecode:: python
+        
+          >>> p = regex.compile(r"first|second|third|fourth|fifth")
+        
+        but if the list is large, parsing the resulting regex can take considerable time, and care must also be taken that the strings are properly escaped and properly ordered, for example, "cats" before "cat".
+        
+        The new alternative is to use a named list:
+        
+        .. sourcecode:: python
+        
+          >>> option_set = ["first", "second", "third", "fourth", "fifth"]
+          >>> p = regex.compile(r"\L<options>", options=option_set)
+        
+        The order of the items is irrelevant, they are treated as a set. The named lists are available as the ``.named_lists`` attribute of the pattern object :
+        
+        .. sourcecode:: python
+        
+          >>> print(p.named_lists)
+          # Python 3
+          {'options': frozenset({'fifth', 'first', 'fourth', 'second', 'third'})}
+          # Python 2
+          {'options': frozenset(['fifth', 'fourth', 'second', 'third', 'first'])}
+        
+        If there are any unused keyword arguments, ``ValueError`` will be raised unless you tell it otherwise:
+        
+        .. sourcecode:: python
+        
+          >>> option_set = ["first", "second", "third", "fourth", "fifth"]
+          >>> p = regex.compile(r"\L<options>", options=option_set, other_options=[])
+          Traceback (most recent call last):
+            File "<stdin>", line 1, in <module>
+            File "C:\Python37\lib\site-packages\regex\regex.py", line 348, in compile
+              return _compile(pattern, flags, ignore_unused, kwargs)
+            File "C:\Python37\lib\site-packages\regex\regex.py", line 585, in _compile
+              raise ValueError('unused keyword argument {!a}'.format(any_one))
+          ValueError: unused keyword argument 'other_options'
+          >>> p = regex.compile(r"\L<options>", options=option_set, other_options=[], ignore_unused=True)
+          >>>
+        
+        Start and end of word
+        ^^^^^^^^^^^^^^^^^^^^^
+        
+        ``\m`` matches at the start of a word.
+        
+        ``\M`` matches at the end of a word.
+        
+        Compare with ``\b``, which matches at the start or end of a word.
+        
+        Unicode line separators
+        ^^^^^^^^^^^^^^^^^^^^^^^
+        
+        Normally the only line separator is ``\n`` (``\x0A``), but if the ``WORD`` flag is turned on then the line separators are ``\x0D\x0A``, ``\x0A``, ``\x0B``, ``\x0C`` and ``\x0D``, plus ``\x85``, ``\u2028`` and ``\u2029`` when working with Unicode.
+        
+        This affects the regex dot ``"."``, which, with the ``DOTALL`` flag turned off, matches any character except a line separator. It also affects the line anchors ``^`` and ``$`` (in multiline mode).
+        
+        Set operators
+        ^^^^^^^^^^^^^
+        
+        **Version 1 behaviour only**
+        
+        Set operators have been added, and a set ``[...]`` can include nested sets.
+        
+        The operators, in order of increasing precedence, are:
+        
+        * ``||`` for union ("x||y" means "x or y")
+        
+        * ``~~`` (double tilde) for symmetric difference ("x~~y" means "x or y, but not both")
+        
+        * ``&&`` for intersection ("x&&y" means "x and y")
+        
+        * ``--`` (double dash) for difference ("x--y" means "x but not y")
+        
+        Implicit union, ie, simple juxtaposition like in ``[ab]``, has the highest precedence. Thus, ``[ab&&cd]`` is the same as ``[[a||b]&&[c||d]]``.
+        
+        Examples:
+        
+        * ``[ab]`` # Set containing 'a' and 'b'
+        
+        * ``[a-z]`` # Set containing 'a' .. 'z'
+        
+        * ``[[a-z]--[qw]]`` # Set containing 'a' .. 'z', but not 'q' or 'w'
+        
+        * ``[a-z--qw]`` # Same as above
+        
+        * ``[\p{L}--QW]`` # Set containing all letters except 'Q' and 'W'
+        
+        * ``[\p{N}--[0-9]]`` # Set containing all numbers except '0' .. '9'
+        
+        * ``[\p{ASCII}&&\p{Letter}]`` # Set containing all characters which are ASCII and letter
+        
+        regex.escape (`issue #2650 <https://bugs.python.org/issue2650>`_)
+        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+        
+        regex.escape has an additional keyword parameter ``special_only``. When True, only 'special' regex characters, such as '?', are escaped.
+        
+        Examples:
+        
+        .. sourcecode:: python
+        
+          >>> regex.escape("foo!?", special_only=False)
+          'foo\\!\\?'
+          >>> regex.escape("foo!?", special_only=True)
+          'foo!\\?'
+        
+        regex.escape (`Hg issue 249 <https://bitbucket.org/mrabarnett/mrab-regex/issues/249>`_)
+        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+        
+        regex.escape has an additional keyword parameter ``literal_spaces``. When True, spaces are not escaped.
+        
+        Examples:
+        
+        .. sourcecode:: python
+        
+          >>> regex.escape("foo bar!?", literal_spaces=False)
+          'foo\\ bar!\\?'
+          >>> regex.escape("foo bar!?", literal_spaces=True)
+          'foo bar!\\?'
+        
+        Repeated captures (`issue #7132 <https://bugs.python.org/issue7132>`_)
+        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+        
+        A match object has additional methods which return information on all the successful matches of a repeated capture group. These methods are:
+        
+        * ``matchobject.captures([group1, ...])``
+        
+          * Returns a list of the strings matched in a group or groups. Compare with ``matchobject.group([group1, ...])``.
+        
+        * ``matchobject.starts([group])``
+        
+          * Returns a list of the start positions. Compare with ``matchobject.start([group])``.
+        
+        * ``matchobject.ends([group])``
+        
+          * Returns a list of the end positions. Compare with ``matchobject.end([group])``.
+        
+        * ``matchobject.spans([group])``
+        
+          * Returns a list of the spans. Compare with ``matchobject.span([group])``.
+        
+        Examples:
+        
+        .. sourcecode:: python
+        
+          >>> m = regex.search(r"(\w{3})+", "123456789")
+          >>> m.group(1)
+          '789'
+          >>> m.captures(1)
+          ['123', '456', '789']
+          >>> m.start(1)
+          6
+          >>> m.starts(1)
+          [0, 3, 6]
+          >>> m.end(1)
+          9
+          >>> m.ends(1)
+          [3, 6, 9]
+          >>> m.span(1)
+          (6, 9)
+          >>> m.spans(1)
+          [(0, 3), (3, 6), (6, 9)]
+        
+        Atomic grouping (`issue #433030 <https://bugs.python.org/issue433030>`_)
+        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+        
+        ``(?>...)``
+        
+        If the following pattern subsequently fails, then the subpattern as a whole will fail.
+        
+        Possessive quantifiers.
+        ^^^^^^^^^^^^^^^^^^^^^^^
+        
+        ``(?:...)?+`` ; ``(?:...)*+`` ; ``(?:...)++`` ; ``(?:...){min,max}+``
+        
+        The subpattern is matched up to 'max' times. If the following pattern subsequently fails, then all of the repeated subpatterns will fail as a whole. For example, ``(?:...)++`` is equivalent to ``(?>(?:...)+)``.
+        
+        Scoped flags (`issue #433028 <https://bugs.python.org/issue433028>`_)
+        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+        
+        ``(?flags-flags:...)``
+        
+        The flags will apply only to the subpattern. Flags can be turned on or off.
+        
+        Definition of 'word' character (`issue #1693050 <https://bugs.python.org/issue1693050>`_)
+        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+        
+        The definition of a 'word' character has been expanded for Unicode. It now conforms to the Unicode specification at ``http://www.unicode.org/reports/tr29/``.
+        
+        Variable-length lookbehind
+        ^^^^^^^^^^^^^^^^^^^^^^^^^^
+        
+        A lookbehind can match a variable-length string.
+        
+        Flags argument for regex.split, regex.sub and regex.subn (`issue #3482 <https://bugs.python.org/issue3482>`_)
+        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+        
+        ``regex.split``, ``regex.sub`` and ``regex.subn`` support a 'flags' argument.
+        
+        Pos and endpos arguments for regex.sub and regex.subn
+        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+        
+        ``regex.sub`` and ``regex.subn`` support 'pos' and 'endpos' arguments.
+        
+        'Overlapped' argument for regex.findall and regex.finditer
+        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+        
+        ``regex.findall`` and ``regex.finditer`` support an 'overlapped' flag which permits overlapped matches.
+        
+        Splititer
+        ^^^^^^^^^
+        
+        ``regex.splititer`` has been added. It's a generator equivalent of ``regex.split``.
+        
+        Subscripting for groups
+        ^^^^^^^^^^^^^^^^^^^^^^^
+        
+        A match object accepts access to the captured groups via subscripting and slicing:
+        
+        .. sourcecode:: python
+        
+          >>> m = regex.search(r"(?P<before>.*?)(?P<num>\d+)(?P<after>.*)", "pqr123stu")
+          >>> print(m["before"])
+          pqr
+          >>> print(len(m))
+          4
+          >>> print(m[:])
+          ('pqr123stu', 'pqr', '123', 'stu')
+        
+        Named groups
+        ^^^^^^^^^^^^
+        
+        Groups can be named with ``(?<name>...)`` as well as the current ``(?P<name>...)``.
+        
+        Group references
+        ^^^^^^^^^^^^^^^^
+        
+        Groups can be referenced within a pattern with ``\g<name>``. This also allows there to be more than 99 groups.
+        
+        Named characters
+        ^^^^^^^^^^^^^^^^
+        
+        ``\N{name}``
+        
+        Named characters are supported. (Note: only those known by Python's Unicode database are supported.)
+        
+        Unicode codepoint properties, including scripts and blocks
+        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+        
+        ``\p{property=value}``; ``\P{property=value}``; ``\p{value}`` ; ``\P{value}``
+        
+        Many Unicode properties are supported, including blocks and scripts. ``\p{property=value}`` or ``\p{property:value}`` matches a character whose property ``property`` has value ``value``. The inverse of ``\p{property=value}`` is ``\P{property=value}`` or ``\p{^property=value}``.
+        
+        If the short form ``\p{value}`` is used, the properties are checked in the order: ``General_Category``, ``Script``, ``Block``, binary property:
+        
+        * ``Latin``, the 'Latin' script (``Script=Latin``).
+        
+        * ``BasicLatin``, the 'BasicLatin' block (``Block=BasicLatin``).
+        
+        * ``Alphabetic``, the 'Alphabetic' binary property (``Alphabetic=Yes``).
+        
+        A short form starting with ``Is`` indicates a script or binary property:
+        
+        * ``IsLatin``, the 'Latin' script (``Script=Latin``).
+        
+        * ``IsAlphabetic``, the 'Alphabetic' binary property (``Alphabetic=Yes``).
+        
+        A short form starting with ``In`` indicates a block property:
+        
+        * ``InBasicLatin``, the 'BasicLatin' block (``Block=BasicLatin``).
+        
+        POSIX character classes
+        ^^^^^^^^^^^^^^^^^^^^^^^
+        
+        ``[[:alpha:]]``; ``[[:^alpha:]]``
+        
+        POSIX character classes are supported. These are normally treated as an alternative form of ``\p{...}``.
+        
+        The exceptions are ``alnum``, ``digit``, ``punct`` and ``xdigit``, whose definitions are different from those of Unicode.
+        
+        ``[[:alnum:]]`` is equivalent to ``\p{posix_alnum}``.
+        
+        ``[[:digit:]]`` is equivalent to ``\p{posix_digit}``.
+        
+        ``[[:punct:]]`` is equivalent to ``\p{posix_punct}``.
+        
+        ``[[:xdigit:]]`` is equivalent to ``\p{posix_xdigit}``.
+        
+        Search anchor
+        ^^^^^^^^^^^^^
+        
+        ``\G``
+        
+        A search anchor has been added. It matches at the position where each search started/continued and can be used for contiguous matches or in negative variable-length lookbehinds to limit how far back the lookbehind goes:
+        
+        .. sourcecode:: python
+        
+          >>> regex.findall(r"\w{2}", "abcd ef")
+          ['ab', 'cd', 'ef']
+          >>> regex.findall(r"\G\w{2}", "abcd ef")
+          ['ab', 'cd']
+        
+        * The search starts at position 0 and matches 2 letters 'ab'.
+        
+        * The search continues at position 2 and matches 2 letters 'cd'.
+        
+        * The search continues at position 4 and fails to match any letters.
+        
+        * The anchor stops the search start position from being advanced, so there are no more results.
+        
+        Reverse searching
+        ^^^^^^^^^^^^^^^^^
+        
+        Searches can now work backwards:
+        
+        .. sourcecode:: python
+        
+          >>> regex.findall(r".", "abc")
+          ['a', 'b', 'c']
+          >>> regex.findall(r"(?r).", "abc")
+          ['c', 'b', 'a']
+        
+        Note: the result of a reverse search is not necessarily the reverse of a forward search:
+        
+        .. sourcecode:: python
+        
+          >>> regex.findall(r"..", "abcde")
+          ['ab', 'cd']
+          >>> regex.findall(r"(?r)..", "abcde")
+          ['de', 'bc']
+        
+        Matching a single grapheme
+        ^^^^^^^^^^^^^^^^^^^^^^^^^^
+        
+        ``\X``
+        
+        The grapheme matcher is supported. It now conforms to the Unicode specification at ``http://www.unicode.org/reports/tr29/``.
+        
+        Branch reset
+        ^^^^^^^^^^^^
+        
+        ``(?|...|...)``
+        
+        Capture group numbers will be reused across the alternatives, but groups with different names will have different group numbers.
+        
+        Examples:
+        
+        .. sourcecode:: python
+        
+          >>> regex.match(r"(?|(first)|(second))", "first").groups()
+          ('first',)
+          >>> regex.match(r"(?|(first)|(second))", "second").groups()
+          ('second',)
+        
+        Note that there is only one group.
+        
+        Default Unicode word boundary
+        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+        
+        The ``WORD`` flag changes the definition of a 'word boundary' to that of a default Unicode word boundary. This applies to ``\b`` and ``\B``.
+        
+        Timeout (Python 3)
+        ^^^^^^^^^^^^^^^^^^
+        
+        The matching methods and functions support timeouts. The timeout (in seconds) applies to the entire operation:
+        
+        .. sourcecode:: python
+        
+          >>> from time import sleep
+          >>>
+          >>> def fast_replace(m):
+          ...     return 'X'
+          ...
+          >>> def slow_replace(m):
+          ...     sleep(0.5)
+          ...     return 'X'
+          ...
+          >>> regex.sub(r'[a-z]', fast_replace, 'abcde', timeout=2)
+          'XXXXX'
+          >>> regex.sub(r'[a-z]', slow_replace, 'abcde', timeout=2)
+          Traceback (most recent call last):
+            File "<stdin>", line 1, in <module>
+            File "C:\Python37\lib\site-packages\regex\regex.py", line 276, in sub
+              endpos, concurrent, timeout)
+          TimeoutError: regex timed out
+        
+Platform: UNKNOWN
+Classifier: Development Status :: 5 - Production/Stable
+Classifier: Intended Audience :: Developers
+Classifier: License :: OSI Approved :: Python Software Foundation License
+Classifier: Operating System :: OS Independent
+Classifier: Programming Language :: Python :: 2.7
+Classifier: Programming Language :: Python :: 3.5
+Classifier: Programming Language :: Python :: 3.6
+Classifier: Programming Language :: Python :: 3.7
+Classifier: Programming Language :: Python :: 3.8
+Classifier: Topic :: Scientific/Engineering :: Information Analysis
+Classifier: Topic :: Software Development :: Libraries :: Python Modules
+Classifier: Topic :: Text Processing
+Classifier: Topic :: Text Processing :: General
diff --git a/regex.egg-info/SOURCES.txt b/regex.egg-info/SOURCES.txt
new file mode 100644
index 0000000..820e244
--- /dev/null
+++ b/regex.egg-info/SOURCES.txt
@@ -0,0 +1,27 @@
+MANIFEST.in
+README.rst
+setup.py
+docs/Features.html
+docs/Features.rst
+docs/UnicodeProperties.rst
+regex.egg-info/PKG-INFO
+regex.egg-info/SOURCES.txt
+regex.egg-info/dependency_links.txt
+regex.egg-info/top_level.txt
+regex_2/__init__.py
+regex_2/_regex.c
+regex_2/_regex.h
+regex_2/_regex_core.py
+regex_2/_regex_unicode.c
+regex_2/_regex_unicode.h
+regex_2/regex.py
+regex_2/test_regex.py
+regex_3/__init__.py
+regex_3/_regex.c
+regex_3/_regex.h
+regex_3/_regex_core.py
+regex_3/_regex_unicode.c
+regex_3/_regex_unicode.h
+regex_3/regex.py
+regex_3/test_regex.py
+tools/build_regex_unicode.py
\ No newline at end of file
diff --git a/regex.egg-info/dependency_links.txt b/regex.egg-info/dependency_links.txt
new file mode 100644
index 0000000..8b13789
--- /dev/null
+++ b/regex.egg-info/dependency_links.txt
@@ -0,0 +1 @@
+
diff --git a/regex.egg-info/top_level.txt b/regex.egg-info/top_level.txt
new file mode 100644
index 0000000..4f9256d
--- /dev/null
+++ b/regex.egg-info/top_level.txt
@@ -0,0 +1 @@
+regex
diff --git a/regex_2/regex/__init__.py b/regex_2/__init__.py
similarity index 100%
rename from regex_2/regex/__init__.py
rename to regex_2/__init__.py
diff --git a/regex_2/_regex.c b/regex_2/_regex.c
index f87e706..01ac858 100644
--- a/regex_2/_regex.c
+++ b/regex_2/_regex.c
@@ -495,6 +495,7 @@ typedef struct RE_State {
     Py_ssize_t req_pos; /* The position where the required string matched. */
     Py_ssize_t req_end; /* The end position where the required string matched. */
     int partial_side; /* The side that could truncate in a partial match. */
+    /* Various flags. */
     RE_UINT16 iterations; /* The number of iterations the matching engine has performed since checking for KeyboardInterrupt. */
     BOOL is_unicode; /* Whether the string to be matched is Unicode. */
     BOOL should_release; /* Whether the buffer should be released. */
@@ -1829,7 +1830,7 @@ static BOOL unicode_at_grapheme_boundary(RE_State* state, Py_ssize_t text_pos)
         return FALSE;
 
     /* GB8 */
-    if ((left_prop == RE_GBREAK_LVT || left_prop == RE_GBREAK_T) && left_prop
+    if ((left_prop == RE_GBREAK_LVT || left_prop == RE_GBREAK_T) && right_prop
       == RE_GBREAK_T)
         return FALSE;
 
@@ -1870,14 +1871,16 @@ static BOOL unicode_at_grapheme_boundary(RE_State* state, Py_ssize_t text_pos)
      * number of RI characters before the break point.
      */
     /* GB12 and GB13 */
-    pos = left_pos;
+    if (right_prop == RE_GBREAK_REGIONALINDICATOR) {
+        pos = left_pos;
 
-    while (pos >= 0 && re_get_grapheme_cluster_break(char_at(state->text, pos))
-      == RE_WBREAK_REGIONALINDICATOR)
-        --pos;
+        while (pos >= 0 && re_get_grapheme_cluster_break(char_at(state->text,
+          pos)) == RE_GBREAK_REGIONALINDICATOR)
+            --pos;
 
-    if ((left_pos - pos) % 2 == 1)
-        return FALSE;
+        if ((left_pos - pos) % 2 == 1)
+            return FALSE;
+    }
 
     /* Otherwise, break everywhere. */
     /* GB999 */
@@ -9318,7 +9321,8 @@ Py_LOCAL_INLINE(BOOL) is_repeat_guarded(RE_State* state, size_t index,
     RE_GuardList* guard_list;
 
     /* Is a guard active here? */
-    if (!(state->pattern->repeat_info[index].status & guard_type))
+    if (!(state->pattern->repeat_info[index].status & guard_type) ||
+      state->is_fuzzy)
         return FALSE;
 
     /* Which guard list? */
@@ -9460,715 +9464,6 @@ too_wide:
     return NULL;
 }
 
-/* Looks for a string in a string set. */
-Py_LOCAL_INLINE(int) string_set_contains(RE_State* state, PyObject* string_set,
-  Py_ssize_t first, Py_ssize_t last) {
-    PyObject* string;
-    int status;
-
-    if (state->is_unicode)
-        string = build_unicode_value(state->text, first, last,
-          state->charsize);
-    else
-        string = build_bytes_value(state->text, first, last, state->charsize);
-    if (!string)
-        return RE_ERROR_INTERNAL;
-
-    status = PySet_Contains(string_set, string);
-    Py_DECREF(string);
-
-    return status;
-}
-
-/* Looks for a string in a string set, ignoring case. */
-Py_LOCAL_INLINE(int) string_set_contains_ign(RE_State* state, PyObject*
-  string_set, void* buffer, Py_ssize_t first, Py_ssize_t last, Py_ssize_t
-   index, Py_ssize_t buffer_charsize) {
-    Py_UCS4 (*char_at)(void* text, Py_ssize_t pos);
-    void (*set_char_at)(void* text, Py_ssize_t pos, Py_UCS4 ch);
-    RE_EncodingTable* encoding;
-    RE_LocaleInfo* locale_info;
-    BOOL (*possible_turkic)(RE_LocaleInfo* locale_info, Py_UCS4 ch);
-    Py_UCS4 codepoints[4];
-
-    switch (buffer_charsize) {
-    case 1:
-        char_at = bytes1_char_at;
-        set_char_at = bytes1_set_char_at;
-        break;
-    case 2:
-        char_at = bytes2_char_at;
-        set_char_at = bytes2_set_char_at;
-        break;
-    case 4:
-        char_at = bytes4_char_at;
-        set_char_at = bytes4_set_char_at;
-        break;
-    default:
-        char_at = bytes1_char_at;
-        set_char_at = bytes1_set_char_at;
-        break;
-    }
-
-    encoding = state->encoding;
-    locale_info = state->locale_info;
-    possible_turkic = encoding->possible_turkic;
-
-    /* Look for a possible Turkic 'I'. */
-    while (index < last && !possible_turkic(locale_info, char_at(buffer,
-      index)))
-        ++index;
-
-    if (index < last) {
-        /* Possible Turkic 'I'. */
-        int count;
-        int i;
-
-        /* Try all the alternatives to the 'I'. */
-        count = encoding->all_turkic_i(locale_info, char_at(buffer, index),
-          codepoints);
-
-        for (i = 0; i < count; i++) {
-            int status;
-
-            set_char_at(buffer, index, codepoints[i]);
-
-            /* Recurse for the remainder of the string. */
-            status = string_set_contains_ign(state, string_set, buffer, first,
-              last, index + 1, buffer_charsize);
-            if (status != 0)
-                return status;
-        }
-
-        return 0;
-    } else {
-        /* No Turkic 'I'. */
-        PyObject* string;
-        int status;
-
-        if (state->is_unicode)
-            string = build_unicode_value(buffer, first, last, buffer_charsize);
-        else
-            string = build_bytes_value(buffer, first, last, buffer_charsize);
-        if (!string)
-            return RE_ERROR_MEMORY;
-
-        status = PySet_Contains(string_set, string);
-        Py_DECREF(string);
-
-        return status;
-    }
-}
-
-/* Creates a partial string set for truncation at the left or right side. */
-Py_LOCAL_INLINE(int) make_partial_string_set(RE_State* state, RE_Node* node) {
-    PatternObject* pattern;
-    int partial_side;
-    PyObject* string_set;
-    PyObject* partial_set;
-    PyObject* iter = NULL;
-    PyObject* item = NULL;
-    PyObject* slice = NULL;
-
-    pattern = state->pattern;
-    partial_side = state->partial_side;
-    if (partial_side != RE_PARTIAL_LEFT && partial_side != RE_PARTIAL_RIGHT)
-        return RE_ERROR_INTERNAL;
-
-    /* Fetch the full string set. PyList_GET_ITEM borrows a reference. */
-    string_set = PyList_GET_ITEM(pattern->named_list_indexes, node->values[0]);
-    if (!string_set)
-        return RE_ERROR_INTERNAL;
-
-    /* Gets the list of partial string sets. */
-    if (!pattern->partial_named_lists[partial_side]) {
-        size_t size;
-
-        size = pattern->named_lists_count * sizeof(PyObject*);
-        pattern->partial_named_lists[partial_side] = re_alloc(size);
-        if (!pattern->partial_named_lists[partial_side])
-            return RE_ERROR_INTERNAL;
-
-        memset(pattern->partial_named_lists[partial_side], 0, size);
-    }
-
-    /* Get the partial string set. */
-    partial_set = pattern->partial_named_lists[partial_side][node->values[0]];
-    if (partial_set)
-        return 1;
-
-    /* Build the partial string set. */
-    partial_set = PySet_New(NULL);
-    if (!partial_set)
-        return RE_ERROR_INTERNAL;
-
-    iter = PyObject_GetIter(string_set);
-    if (!iter)
-        goto error;
-
-    item = PyIter_Next(iter);
-
-    while (item) {
-        Py_ssize_t len;
-        Py_ssize_t first;
-        Py_ssize_t last;
-
-        len = PySequence_Length(item);
-        if (len == -1)
-            goto error;
-
-        first = 0;
-        last = len;
-
-        while (last - first > 1) {
-            int status;
-
-            /* Shorten the entry. */
-            if (partial_side == RE_PARTIAL_LEFT)
-                ++first;
-            else
-                --last;
-
-            slice = PySequence_GetSlice(item, first, last);
-            if (!slice)
-                goto error;
-
-            status = PySet_Add(partial_set, slice);
-            Py_DECREF(slice);
-            if (status < 0)
-                goto error;
-        }
-
-        Py_DECREF(item);
-        item = PyIter_Next(iter);
-    }
-
-    if (PyErr_Occurred())
-        goto error;
-
-    Py_DECREF(iter);
-
-    pattern->partial_named_lists[partial_side][node->values[0]] = partial_set;
-
-    return 1;
-
-error:
-    Py_XDECREF(item);
-    Py_XDECREF(iter);
-    Py_DECREF(partial_set);
-
-    return RE_ERROR_INTERNAL;
-}
-
-/* Tries to match a string at the current position with a member of a string
- * set, forwards or backwards.
- */
-Py_LOCAL_INLINE(int) string_set_match_fwdrev(RE_State* state, RE_Node* node,
-  BOOL reverse) {
-    Py_ssize_t min_len;
-    Py_ssize_t max_len;
-    Py_ssize_t text_available;
-    Py_ssize_t slice_available;
-    int partial_side;
-    Py_ssize_t len;
-    Py_ssize_t first;
-    Py_ssize_t last;
-    int status;
-    PyObject* string_set;
-
-    min_len = (Py_ssize_t)node->values[1];
-    max_len = (Py_ssize_t)node->values[2];
-
-    acquire_GIL(state);
-
-    if (reverse) {
-        text_available = state->text_pos;
-        slice_available = state->text_pos - state->slice_start;
-        partial_side = RE_PARTIAL_LEFT;
-    } else {
-        text_available = state->text_length - state->text_pos;
-        slice_available = state->slice_end - state->text_pos;
-        partial_side = RE_PARTIAL_RIGHT;
-    }
-
-    /* Get as many characters as we need for the longest possible match. */
-    len = min_ssize_t(max_len, slice_available);
-
-    if (reverse) {
-        first = state->text_pos - len;
-        last = state->text_pos;
-    } else {
-        first = state->text_pos;
-        last = state->text_pos + len;
-    }
-
-    /* If we didn't get all of the characters we need, is a partial match
-     * allowed?
-     */
-    if (len < max_len && len == text_available && state->partial_side ==
-      partial_side) {
-        if (len == 0) {
-            /* An empty string is always a possible partial match. */
-            status = RE_ERROR_PARTIAL;
-            goto finished;
-        }
-
-        /* Make a set of the possible partial matches. */
-        status = make_partial_string_set(state, node);
-        if (status < 0)
-            goto finished;
-
-        /* Fetch the partial string set. */
-        string_set =
-          state->pattern->partial_named_lists[partial_side][node->values[0]];
-
-        /* Is the text we have a partial match? */
-        status = string_set_contains(state, string_set, first, last);
-        if (status < 0)
-            goto finished;
-
-        if (status == 1) {
-            /* Advance past the match. */
-            if (reverse)
-                state->text_pos -= len;
-            else
-                state->text_pos += len;
-
-            status = RE_ERROR_PARTIAL;
-            goto finished;
-        }
-    }
-
-    /* Fetch the string set. PyList_GET_ITEM borrows a reference. */
-    string_set = PyList_GET_ITEM(state->pattern->named_list_indexes,
-      node->values[0]);
-    if (!string_set) {
-        status = RE_ERROR_INTERNAL;
-        goto finished;
-    }
-
-    /* We've already looked for a partial match (if allowed), but what about a
-     * complete match?
-     */
-    while (len >= min_len) {
-        status = string_set_contains(state, string_set, first, last);
-
-        if (status == 1) {
-            /* Advance past the match. */
-            if (reverse)
-                state->text_pos -= len;
-            else
-                state->text_pos += len;
-
-            status = 1;
-            goto finished;
-        }
-
-        /* Look for a shorter match. */
-        --len;
-        if (reverse)
-            ++first;
-        else
-            --last;
-    }
-
-    /* No match. */
-    status = 0;
-
-finished:
-    release_GIL(state);
-
-    return status;
-}
-
-/* Tries to match a string at the current position with a member of a string
- * set, ignoring case, forwards or backwards.
- */
-Py_LOCAL_INLINE(int) string_set_match_fld_fwdrev(RE_State* state, RE_Node*
-  node, BOOL reverse) {
-    int (*full_case_fold)(RE_LocaleInfo* locale_info, Py_UCS4 ch, Py_UCS4*
-      folded);
-    Py_UCS4 (*char_at)(void* text, Py_ssize_t pos);
-    Py_ssize_t folded_charsize;
-    void (*set_char_at)(void* text, Py_ssize_t pos, Py_UCS4 ch);
-    Py_ssize_t min_len;
-    Py_ssize_t max_len;
-    Py_ssize_t buf_len;
-    void* folded;
-    int status;
-    BOOL* end_of_fold = NULL;
-    Py_ssize_t text_available;
-    Py_ssize_t slice_available;
-    Py_ssize_t t_pos;
-    Py_ssize_t f_pos;
-    int step;
-    int partial_side;
-    Py_ssize_t len;
-    Py_ssize_t consumed;
-    Py_UCS4 codepoints[RE_MAX_FOLDED];
-    Py_ssize_t first;
-    Py_ssize_t last;
-    PyObject* string_set;
-
-    full_case_fold = state->encoding->full_case_fold;
-    char_at = state->char_at;
-
-    /* The folded string will have the same width as the original string. */
-    folded_charsize = state->charsize;
-
-    switch (folded_charsize) {
-    case 1:
-        set_char_at = bytes1_set_char_at;
-        break;
-    case 2:
-        set_char_at = bytes2_set_char_at;
-        break;
-    case 4:
-        set_char_at = bytes4_set_char_at;
-        break;
-    default:
-        return RE_ERROR_INTERNAL;
-    }
-
-    min_len = (Py_ssize_t)node->values[1];
-    max_len = (Py_ssize_t)node->values[2];
-
-    acquire_GIL(state);
-
-    /* Allocate a buffer for the folded string. */
-    buf_len = max_len + RE_MAX_FOLDED;
-    folded = re_alloc((size_t)(buf_len * folded_charsize));
-    if (!folded) {
-        status = RE_ERROR_MEMORY;
-        goto finished;
-    }
-
-    end_of_fold = re_alloc((size_t)buf_len * sizeof(BOOL));
-    if (!end_of_fold) {
-        status = RE_ERROR_MEMORY;
-        goto finished;
-    }
-
-    memset(end_of_fold, 0, (size_t)buf_len * sizeof(BOOL));
-
-    if (reverse) {
-        text_available = state->text_pos;
-        slice_available = state->text_pos - state->slice_start;
-        t_pos = state->text_pos - 1;
-        f_pos = buf_len;
-        step = -1;
-        partial_side = RE_PARTIAL_LEFT;
-    } else {
-        text_available = state->text_length - state->text_pos;
-        slice_available = state->slice_end - state->text_pos;
-        t_pos = state->text_pos;
-        f_pos = 0;
-        step = 1;
-        partial_side = RE_PARTIAL_RIGHT;
-    }
-
-    /* We can stop getting characters as soon as the case-folded string is long
-     * enough (each codepoint from the text can expand to more than one folded
-     * codepoint).
-     */
-    len = 0;
-    end_of_fold[len] = TRUE;
-
-    consumed = 0;
-    while (len < max_len && consumed < slice_available) {
-        int count;
-        int j;
-
-        count = full_case_fold(state->locale_info, char_at(state->text, t_pos),
-          codepoints);
-
-        if (reverse)
-            f_pos -= count;
-
-        for (j = 0; j < count; j++)
-            set_char_at(folded, f_pos + j, codepoints[j]);
-
-        if (!reverse)
-            f_pos += count;
-
-        len += count;
-        end_of_fold[len] = TRUE;
-        ++consumed;
-        t_pos += step;
-    }
-
-    if (reverse) {
-        first = f_pos;
-        last = buf_len;
-    } else {
-        first = 0;
-        last = f_pos;
-    }
-
-    /* If we didn't get all of the characters we need, is a partial match
-     * allowed?
-     */
-    if (len < max_len && len == text_available && state->partial_side ==
-      partial_side) {
-        if (len == 0) {
-            /* An empty string is always a possible partial match. */
-            status = RE_ERROR_PARTIAL;
-            goto finished;
-        }
-
-        /* Make a set of the possible partial matches. */
-        status = make_partial_string_set(state, node);
-        if (status < 0)
-            goto finished;
-
-        /* Fetch the partial string set. */
-        string_set =
-          state->pattern->partial_named_lists[partial_side][node->values[0]];
-
-        /* Is the text we have a partial match? */
-        status = string_set_contains_ign(state, string_set, folded, first,
-          last, first, folded_charsize);
-        if (status < 0)
-            goto finished;
-
-        if (status == 1) {
-            /* Advance past the match. */
-            if (reverse)
-                state->text_pos -= consumed;
-            else
-                state->text_pos += consumed;
-
-            status = RE_ERROR_PARTIAL;
-            goto finished;
-        }
-    }
-
-    /* Fetch the string set. PyList_GET_ITEM borrows a reference. */
-    string_set = PyList_GET_ITEM(state->pattern->named_list_indexes,
-      node->values[0]);
-    if (!string_set) {
-        status = RE_ERROR_INTERNAL;
-        goto finished;
-    }
-
-    /* We've already looked for a partial match (if allowed), but what about a
-     * complete match?
-     */
-    while (len >= min_len) {
-        if (end_of_fold[len]) {
-            status = string_set_contains_ign(state, string_set, folded, first,
-              last, first, folded_charsize);
-
-            if (status == 1) {
-                /* Advance past the match. */
-                if (reverse)
-                    state->text_pos -= consumed;
-                else
-                    state->text_pos += consumed;
-
-                status = 1;
-                goto finished;
-            }
-
-            --consumed;
-        }
-
-        /* Look for a shorter match. */
-        --len;
-        if (reverse)
-            ++first;
-        else
-            --last;
-    }
-
-    /* No match. */
-    status = 0;
-
-finished:
-    re_dealloc(end_of_fold);
-    re_dealloc(folded);
-
-    release_GIL(state);
-
-    return status;
-}
-
-/* Tries to match a string at the current position with a member of a string
- * set, ignoring case, forwards or backwards.
- */
-Py_LOCAL_INLINE(int) string_set_match_ign_fwdrev(RE_State* state, RE_Node*
-  node, BOOL reverse) {
-    Py_UCS4 (*simple_case_fold)(RE_LocaleInfo* locale_info, Py_UCS4 ch);
-    Py_UCS4 (*char_at)(void* text, Py_ssize_t pos);
-    Py_ssize_t folded_charsize;
-    void (*set_char_at)(void* text, Py_ssize_t pos, Py_UCS4 ch);
-    Py_ssize_t min_len;
-    Py_ssize_t max_len;
-    void* folded;
-    int status;
-    Py_ssize_t text_available;
-    Py_ssize_t slice_available;
-    Py_ssize_t t_pos;
-    Py_ssize_t f_pos;
-    int step;
-    int partial_side;
-    Py_ssize_t len;
-    Py_ssize_t i;
-    Py_ssize_t first;
-    Py_ssize_t last;
-    PyObject* string_set;
-
-    simple_case_fold = state->encoding->simple_case_fold;
-    char_at = state->char_at;
-
-    /* The folded string will have the same width as the original string. */
-    folded_charsize = state->charsize;
-
-    switch (folded_charsize) {
-    case 1:
-        set_char_at = bytes1_set_char_at;
-        break;
-    case 2:
-        set_char_at = bytes2_set_char_at;
-        break;
-    case 4:
-        set_char_at = bytes4_set_char_at;
-        break;
-    default:
-        return RE_ERROR_INTERNAL;
-    }
-
-    min_len = (Py_ssize_t)node->values[1];
-    max_len = (Py_ssize_t)node->values[2];
-
-    acquire_GIL(state);
-
-    /* Allocate a buffer for the folded string. */
-    folded = re_alloc((size_t)(max_len * folded_charsize));
-    if (!folded) {
-        status = RE_ERROR_MEMORY;
-        goto finished;
-    }
-
-    if (reverse) {
-        text_available = state->text_pos;
-        slice_available = state->text_pos - state->slice_start;
-        t_pos = state->text_pos - 1;
-        f_pos = max_len - 1;
-        step = -1;
-        partial_side = RE_PARTIAL_LEFT;
-    } else {
-        text_available = state->text_length - state->text_pos;
-        slice_available = state->slice_end - state->text_pos;
-        t_pos = state->text_pos;
-        f_pos = 0;
-        step = 1;
-        partial_side = RE_PARTIAL_RIGHT;
-    }
-
-    /* Get as many characters as we need for the longest possible match. */
-    len = min_ssize_t(max_len, slice_available);
-
-    for (i = 0; i < len; i ++) {
-        Py_UCS4 ch;
-
-        ch = simple_case_fold(state->locale_info, char_at(state->text, t_pos));
-        set_char_at(folded, f_pos, ch);
-        t_pos += step;
-        f_pos += step;
-    }
-
-    if (reverse) {
-        first = f_pos + 1;
-        last = max_len;
-    } else {
-        first = 0;
-        last = f_pos;
-    }
-
-    /* If we didn't get all of the characters we need, is a partial match
-     * allowed?
-     */
-    if (len < max_len && len == text_available && state->partial_side ==
-      partial_side) {
-        if (len == 0) {
-            /* An empty string is always a possible partial match. */
-            status = RE_ERROR_PARTIAL;
-            goto finished;
-        }
-
-        /* Make a set of the possible partial matches. */
-        status = make_partial_string_set(state, node);
-        if (status < 0)
-            goto finished;
-
-        /* Fetch the partial string set. */
-        string_set =
-          state->pattern->partial_named_lists[partial_side][node->values[0]];
-
-        /* Is the text we have a partial match? */
-        status = string_set_contains_ign(state, string_set, folded, first,
-          last, first, folded_charsize);
-        if (status < 0)
-            goto finished;
-
-        if (status == 1) {
-            /* Advance past the match. */
-            if (reverse)
-                state->text_pos -= len;
-            else
-                state->text_pos += len;
-
-            status = RE_ERROR_PARTIAL;
-            goto finished;
-        }
-    }
-
-    /* Fetch the string set. PyList_GET_ITEM borrows a reference. */
-    string_set = PyList_GET_ITEM(state->pattern->named_list_indexes,
-      node->values[0]);
-    if (!string_set) {
-        status = RE_ERROR_INTERNAL;
-        goto finished;
-    }
-
-    /* We've already looked for a partial match (if allowed), but what about a
-     * complete match?
-     */
-    while (len >= min_len) {
-        status = string_set_contains_ign(state, string_set, folded, first,
-          last, first, folded_charsize);
-
-        if (status == 1) {
-            /* Advance past the match. */
-            if (reverse)
-                state->text_pos -= len;
-            else
-                state->text_pos += len;
-
-            status = 1;
-            goto finished;
-        }
-
-        /* Look for a shorter match. */
-        --len;
-        if (reverse)
-            ++first;
-        else
-            --last;
-    }
-
-    /* No match. */
-    status = 0;
-
-finished:
-    re_dealloc(folded);
-
-    release_GIL(state);
-
-    return status;
-}
-
 Py_LOCAL_INLINE(size_t) total_errors(size_t* fuzzy_counts) {
     return fuzzy_counts[RE_FUZZY_DEL] + fuzzy_counts[RE_FUZZY_INS] +
       fuzzy_counts[RE_FUZZY_SUB];
@@ -10330,16 +9625,25 @@ Py_LOCAL_INLINE(void) unrecord_fuzzy(RE_State* state) {
     --state->fuzzy_changes.count;
 }
 
-/* Makes a list of lists of fuzzy changes. */
-Py_LOCAL_INLINE(void) make_fuzzy_changes_list(RE_FuzzyChangesList*
+/* Initialises a list of fuzzy changes. */
+Py_LOCAL_INLINE(void) init_fuzzy_changes_list(RE_FuzzyChangesList*
   changes_list) {
     changes_list->capacity = 0;
     changes_list->count = 0;
     changes_list->items = NULL;
 }
 
-/* Makes a list of lists of fuzzy changes. */
-Py_LOCAL_INLINE(void) make_best_changes_list(RE_BestChangesList*
+/* Finalises a list of fuzzy changes. */
+Py_LOCAL_INLINE(void) fini_fuzzy_changes_list(RE_State* state,
+  RE_FuzzyChangesList* changes_list) {
+    safe_dealloc(state, changes_list->items);
+    changes_list->capacity = 0;
+    changes_list->count = 0;
+    changes_list->items = NULL;
+}
+
+/* Initialises a list of lists of fuzzy changes. */
+Py_LOCAL_INLINE(void) init_best_changes_list(RE_BestChangesList*
   best_changes_list) {
     best_changes_list->capacity = 0;
     best_changes_list->count = 0;
@@ -10364,11 +9668,14 @@ Py_LOCAL_INLINE(void) clear_best_fuzzy_changes(RE_State* state,
     best_changes_list->count = 0;
 }
 
-/* Destroys a list of lists of fuzzy changes. */
-Py_LOCAL_INLINE(void) destroy_best_changes_list(RE_State* state,
+/* Finalises a list of lists of fuzzy changes. */
+Py_LOCAL_INLINE(void) fini_best_changes_list(RE_State* state,
   RE_BestChangesList* best_changes_list) {
     clear_best_fuzzy_changes(state, best_changes_list);
     safe_dealloc(state, best_changes_list->lists);
+    best_changes_list->capacity = 0;
+    best_changes_list->count = 0;
+    best_changes_list->lists = NULL;
 }
 
 /* Adds a list of fuzzy changes to a list of best fuzzy changes. */
@@ -10411,20 +9718,6 @@ Py_LOCAL_INLINE(BOOL) add_best_fuzzy_changes(RE_State* state,
     return TRUE;
 }
 
-/* Initialises a list of fuzzy changes. */
-Py_LOCAL_INLINE(void) make_changes_list(RE_State* state, RE_FuzzyChangesList*
-  best_changes_list) {
-    best_changes_list->capacity = 0;
-    best_changes_list->count = 0;
-    best_changes_list->items = NULL;
-}
-
-/* Finitialises a list of fuzzy changes. */
-Py_LOCAL_INLINE(void) destroy_changes_list(RE_State* state,
-  RE_FuzzyChangesList* best_changes_list) {
-    safe_dealloc(state, best_changes_list->items);
-}
-
 /* Saves a list of fuzzy changes. */
 Py_LOCAL_INLINE(BOOL) save_fuzzy_changes(RE_State* state, RE_FuzzyChangesList*
   best_changes_list) {
@@ -10522,6 +9815,13 @@ Py_LOCAL_INLINE(BOOL) fuzzy_ext_match(RE_State* state, RE_Node* fuzzy_node,
         return pos > state->slice_start && matches_RANGE(state->encoding,
           state->locale_info, test_node, state->char_at(state->text, pos - 1))
           == test_node->match;
+    case RE_OP_SET_DIFF:
+    case RE_OP_SET_INTER:
+    case RE_OP_SET_SYM_DIFF:
+    case RE_OP_SET_UNION:
+        return pos < state->slice_end && matches_SET(state->encoding,
+          state->locale_info, test_node, state->char_at(state->text, pos)) ==
+          test_node->match;
     }
 
     return TRUE;
@@ -10613,6 +9913,14 @@ Py_LOCAL_INLINE(BOOL) fuzzy_ext_match_group_fld(RE_State* state, RE_Node*
           matches_RANGE(state->encoding, state->locale_info, test_node,
           folded_char_at(state, state->text_pos - 1, folded_pos - 1)) ==
           test_node->match;
+    case RE_OP_SET_DIFF:
+    case RE_OP_SET_INTER:
+    case RE_OP_SET_SYM_DIFF:
+    case RE_OP_SET_UNION:
+        return state->text_pos < state->slice_end &&
+          matches_SET(state->encoding, state->locale_info, test_node,
+          folded_char_at(state, state->text_pos, folded_pos)) ==
+          test_node->match;
     }
 
     return TRUE;
@@ -10623,58 +9931,60 @@ Py_LOCAL_INLINE(int) next_fuzzy_match_item(RE_State* state, RE_FuzzyData* data,
   BOOL is_string, RE_INT8 step) {
     Py_ssize_t new_pos;
 
-    if (this_error_permitted(state, data->fuzzy_type)) {
-        switch (data->fuzzy_type) {
-        case RE_FUZZY_DEL:
-            /* Could a character at text_pos have been deleted? */
-            if (step == 0)
-                return RE_ERROR_FAILURE;
+    if (!this_error_permitted(state, data->fuzzy_type))
+        return RE_ERROR_FAILURE;
 
-            if (is_string)
-                data->new_string_pos += step;
-            else
-                data->new_node = data->new_node->next_1.node;
-            return RE_ERROR_SUCCESS;
-        case RE_FUZZY_INS:
-            /* Could the character at text_pos have been inserted? */
-            if (!data->permit_insertion)
+    switch (data->fuzzy_type) {
+    case RE_FUZZY_DEL:
+        /* Could a character at text_pos have been deleted? */
+        if (step == 0)
+            return RE_ERROR_FAILURE;
+
+        if (is_string)
+            data->new_string_pos += step;
+        else
+            data->new_node = data->new_node->next_1.node;
+        return RE_ERROR_SUCCESS;
+    case RE_FUZZY_INS:
+        /* Could the character at text_pos have been inserted? */
+        if (!data->permit_insertion)
+            return RE_ERROR_FAILURE;
+
+        if (step == 0)
+            new_pos = data->new_text_pos + data->step;
+        else
+            new_pos = data->new_text_pos + step;
+
+        if (state->slice_start <= new_pos && new_pos <= state->slice_end) {
+            if (!fuzzy_ext_match(state, state->fuzzy_node, data->new_text_pos))
                 return RE_ERROR_FAILURE;
 
-            if (step == 0)
-                new_pos = data->new_text_pos + data->step;
-            else
-                new_pos = data->new_text_pos + step;
-            if (state->slice_start <= new_pos && new_pos <= state->slice_end) {
-                if (!fuzzy_ext_match(state, state->fuzzy_node,
-                  data->new_text_pos))
-                    return RE_ERROR_FAILURE;
+            data->new_text_pos = new_pos;
+            return RE_ERROR_SUCCESS;
+        }
 
-                data->new_text_pos = new_pos;
-                return RE_ERROR_SUCCESS;
-            }
+        return check_fuzzy_partial(state, new_pos);
+    case RE_FUZZY_SUB:
+        /* Could the character at text_pos have been substituted? */
+        if (step == 0)
+            return RE_ERROR_FAILURE;
 
-            return check_fuzzy_partial(state, new_pos);
-        case RE_FUZZY_SUB:
-            /* Could the character at text_pos have been substituted? */
-            if (step == 0)
+        new_pos = data->new_text_pos + step;
+        if (state->slice_start <= new_pos && new_pos <= state->slice_end) {
+            if (!fuzzy_ext_match(state, state->fuzzy_node, data->new_text_pos))
                 return RE_ERROR_FAILURE;
 
-            new_pos = data->new_text_pos + step;
-            if (state->slice_start <= new_pos && new_pos <= state->slice_end) {
-                if (!fuzzy_ext_match(state, state->fuzzy_node,
-                  data->new_text_pos))
-                    return RE_ERROR_FAILURE;
+            data->new_text_pos = new_pos;
 
-                data->new_text_pos = new_pos;
-                if (is_string)
-                    data->new_string_pos += step;
-                else
-                    data->new_node = data->new_node->next_1.node;
-                return RE_ERROR_SUCCESS;
-            }
+            if (is_string)
+                data->new_string_pos += step;
+            else
+                data->new_node = data->new_node->next_1.node;
 
-            return check_fuzzy_partial(state, new_pos);
+            return RE_ERROR_SUCCESS;
         }
+
+        return check_fuzzy_partial(state, new_pos);
     }
 
     return RE_ERROR_FAILURE;
@@ -10685,11 +9995,14 @@ Py_LOCAL_INLINE(int) fuzzy_match_item(RE_State* state, BOOL search, Py_ssize_t*
   text_pos, RE_Node** node, RE_INT8 step) {
     size_t* fuzzy_counts;
     RE_FuzzyData data;
+    TRACE(("<<fuzzy_match_item>>\n"))
 
     fuzzy_counts = state->fuzzy_counts;
 
-    if (!any_error_permitted(state))
+    if (!any_error_permitted(state)) {
+        TRACE(("    return RE_ERROR_FAILURE\n"))
         return RE_ERROR_FAILURE;
+    }
 
     data.new_text_pos = *text_pos;
     data.new_node = *node;
@@ -10723,6 +10036,7 @@ Py_LOCAL_INLINE(int) fuzzy_match_item(RE_State* state, BOOL search, Py_ssize_t*
             goto found;
     }
 
+    TRACE(("    return RE_ERROR_FAILURE\n"))
     return RE_ERROR_FAILURE;
 
 found:
@@ -10739,7 +10053,8 @@ found:
 
     /* bstack: node step text_pos fuzzy_type op */
 
-    if (!record_fuzzy(state, data.fuzzy_type, data.new_text_pos - data.step))
+    if (!record_fuzzy(state, data.fuzzy_type, data.fuzzy_type == RE_FUZZY_DEL ?
+      data.new_text_pos : data.new_text_pos - data.step))
         return RE_ERROR_MEMORY;
 
     ++fuzzy_counts[data.fuzzy_type];
@@ -10748,6 +10063,9 @@ found:
     *text_pos = data.new_text_pos;
     *node = data.new_node;
 
+    TRACE(("    fuzzy_counts is (%zd, %zd, %zd)\n", fuzzy_counts[0],
+      fuzzy_counts[1], fuzzy_counts[2]))
+    TRACE(("    return RE_ERROR_SUCCESS\n"))
     return RE_ERROR_SUCCESS;
 }
 
@@ -10759,6 +10077,7 @@ Py_LOCAL_INLINE(int) retry_fuzzy_match_item(RE_State* state, RE_UINT8 op, BOOL
     RE_FuzzyData data;
     RE_INT8 step;
     RE_Node* curr_node;
+    TRACE(("<<retry_fuzzy_match_item>>\n"))
 
     fuzzy_counts = state->fuzzy_counts;
 
@@ -10804,6 +10123,7 @@ Py_LOCAL_INLINE(int) retry_fuzzy_match_item(RE_State* state, RE_UINT8 op, BOOL
             goto found;
     }
 
+    TRACE(("    return RE_ERROR_FAILURE\n"))
     return RE_ERROR_FAILURE;
 
 found:
@@ -10820,7 +10140,8 @@ found:
 
     /* bstack: node step text_pos fuzzy_type op */
 
-    if (!record_fuzzy(state, data.fuzzy_type, data.new_text_pos - data.step))
+    if (!record_fuzzy(state, data.fuzzy_type, data.fuzzy_type == RE_FUZZY_DEL ?
+      data.new_text_pos : data.new_text_pos - data.step))
         return RE_ERROR_MEMORY;
 
     ++fuzzy_counts[data.fuzzy_type];
@@ -10829,6 +10150,9 @@ found:
     *text_pos = data.new_text_pos;
     *node = data.new_node;
 
+    TRACE(("    fuzzy_counts is (%zd, %zd, %zd)\n", fuzzy_counts[0],
+      fuzzy_counts[1], fuzzy_counts[2]))
+    TRACE(("    return RE_ERROR_SUCCESS\n"))
     return RE_ERROR_SUCCESS;
 }
 
@@ -10925,11 +10249,14 @@ Py_LOCAL_INLINE(int) fuzzy_match_string(RE_State* state, BOOL search,
   Py_ssize_t* text_pos, RE_Node* node, Py_ssize_t* string_pos, RE_INT8 step) {
     size_t* fuzzy_counts;
     RE_FuzzyData data;
+    TRACE(("<<fuzzy_match_string>>\n"))
 
     fuzzy_counts = state->fuzzy_counts;
 
-    if (!any_error_permitted(state))
+    if (!any_error_permitted(state)) {
+        TRACE(("    return RE_ERROR_FAILURE\n"))
         return RE_ERROR_FAILURE;
+    }
 
     data.new_text_pos = *text_pos;
     data.new_string_pos = *string_pos;
@@ -10953,6 +10280,7 @@ Py_LOCAL_INLINE(int) fuzzy_match_string(RE_State* state, BOOL search,
             goto found;
     }
 
+    TRACE(("    return RE_ERROR_FAILURE\n"))
     return RE_ERROR_FAILURE;
 
 found:
@@ -10971,7 +10299,8 @@ found:
 
     /* bstack: node step string_pos text_pos fuzzy_type op */
 
-    if (!record_fuzzy(state, data.fuzzy_type, data.new_text_pos - data.step))
+    if (!record_fuzzy(state, data.fuzzy_type, data.fuzzy_type == RE_FUZZY_DEL ?
+      data.new_text_pos : data.new_text_pos - data.step))
         return RE_ERROR_MEMORY;
 
     ++fuzzy_counts[data.fuzzy_type];
@@ -10980,6 +10309,9 @@ found:
     *text_pos = data.new_text_pos;
     *string_pos = data.new_string_pos;
 
+    TRACE(("    fuzzy_counts is (%zd, %zd, %zd)\n", fuzzy_counts[0],
+      fuzzy_counts[1], fuzzy_counts[2]))
+    TRACE(("    return RE_ERROR_SUCCESS\n"))
     return RE_ERROR_SUCCESS;
 }
 
@@ -10991,6 +10323,7 @@ Py_LOCAL_INLINE(int) retry_fuzzy_match_string(RE_State* state, RE_UINT8 op,
     Py_ssize_t curr_text_pos;
     Py_ssize_t curr_string_pos;
     RE_Node* new_node;
+    TRACE(("<<retry_fuzzy_match_string>>\n"))
 
     fuzzy_counts = state->fuzzy_counts;
 
@@ -11032,6 +10365,7 @@ Py_LOCAL_INLINE(int) retry_fuzzy_match_string(RE_State* state, RE_UINT8 op,
             goto found;
     }
 
+    TRACE(("    return RE_ERROR_FAILURE\n"))
     return RE_ERROR_FAILURE;
 
 found:
@@ -11048,7 +10382,8 @@ found:
     if (!push_uint8(state, &state->bstack, op))
         return RE_ERROR_MEMORY;
 
-    if (!record_fuzzy(state, data.fuzzy_type, data.new_text_pos - data.step))
+    if (!record_fuzzy(state, data.fuzzy_type, data.fuzzy_type == RE_FUZZY_DEL ?
+      data.new_text_pos : data.new_text_pos - data.step))
         return RE_ERROR_MEMORY;
 
     /* bstack: node step string_pos text_pos fuzzy_type op */
@@ -11060,6 +10395,9 @@ found:
     *node = new_node;
     *string_pos = data.new_string_pos;
 
+    TRACE(("    fuzzy_counts is (%zd, %zd, %zd)\n", fuzzy_counts[0],
+      fuzzy_counts[1], fuzzy_counts[2]))
+    TRACE(("    return RE_ERROR_SUCCESS\n"))
     return RE_ERROR_SUCCESS;
 }
 
@@ -11177,7 +10515,8 @@ found:
      * op
      */
 
-    if (!record_fuzzy(state, data.fuzzy_type, data.new_text_pos - data.step))
+    if (!record_fuzzy(state, data.fuzzy_type, data.fuzzy_type == RE_FUZZY_DEL ?
+      data.new_text_pos : data.new_text_pos - data.step))
         return RE_ERROR_MEMORY;
 
     ++fuzzy_counts[data.fuzzy_type];
@@ -11276,7 +10615,8 @@ found:
      * op
      */
 
-    if (!record_fuzzy(state, data.fuzzy_type, data.new_text_pos - data.step))
+    if (!record_fuzzy(state, data.fuzzy_type, data.fuzzy_type == RE_FUZZY_DEL ?
+      data.new_text_pos : data.new_text_pos - data.step))
         return RE_ERROR_MEMORY;
 
     ++fuzzy_counts[data.fuzzy_type];
@@ -11410,7 +10750,8 @@ found:
      * folded_len text_pos fuzzy_type op
      */
 
-    if (!record_fuzzy(state, data.fuzzy_type, data.new_text_pos - data.step))
+    if (!record_fuzzy(state, data.fuzzy_type, data.fuzzy_type == RE_FUZZY_DEL ?
+      data.new_text_pos : data.new_text_pos - data.step))
         return RE_ERROR_MEMORY;
 
     ++fuzzy_counts[data.fuzzy_type];
@@ -11515,7 +10856,8 @@ found:
      * folded_len text_pos fuzzy_type op
      */
 
-    if (!record_fuzzy(state, data.fuzzy_type, data.new_text_pos - data.step))
+    if (!record_fuzzy(state, data.fuzzy_type, data.fuzzy_type == RE_FUZZY_DEL ?
+      data.new_text_pos : data.new_text_pos - data.step))
         return RE_ERROR_MEMORY;
 
     ++fuzzy_counts[data.fuzzy_type];
@@ -12966,7 +12308,7 @@ advance:
             /* The counts are of type size_t, so the format needs to specify
              * that.
              */
-            TRACE(("min is %u, max is %u, count is %" PY_FORMAT_SIZE_T "u\n",
+            TRACE(("    min is %u, max is %u, count is %" PY_FORMAT_SIZE_T "u\n",
               node->values[1], node->values[2], rp_data->count))
 
             /* Could the body or tail match? */
@@ -13193,7 +12535,7 @@ advance:
             /* The counts are of type size_t, so the format needs to specify
              * that.
              */
-            TRACE(("min is %u, max is %u, count is %" PY_FORMAT_SIZE_T "u\n",
+            TRACE(("    min is %u, max is %u, count is %" PY_FORMAT_SIZE_T "u\n",
               node->values[1], node->values[2], rp_data->count))
 
             /* Could the body or tail match? */
@@ -13615,6 +12957,11 @@ advance:
             rp_data->capture_change = state->capture_change;
 
             /* Could the body or tail match? */
+#if defined(VERBOSE)
+            printf("    is_repeat_guarded(..., RE_STATUS_BODY) returns %d\n",
+              is_repeat_guarded(state, index, state->text_pos,
+              RE_STATUS_BODY));
+#endif
             try_body = node->values[2] > 0 && !is_repeat_guarded(state, index,
               state->text_pos, RE_STATUS_BODY);
             if (try_body) {
@@ -15538,66 +14885,6 @@ advance:
             node = node->next_1.node;
             break;
         }
-        case RE_OP_STRING_SET: /* Member of a string set. */
-            TRACE(("%s\n", re_op_text[node->op]))
-
-            status = string_set_match_fwdrev(state, node, FALSE);
-            if (status < 0)
-                return status;
-            if (status == 0)
-                goto backtrack;
-            node = node->next_1.node;
-            break;
-        case RE_OP_STRING_SET_FLD: /* Member of a string set, ignoring case. */
-            TRACE(("%s\n", re_op_text[node->op]))
-
-            status = string_set_match_fld_fwdrev(state, node, FALSE);
-            if (status < 0)
-                return status;
-            if (status == 0)
-                goto backtrack;
-            node = node->next_1.node;
-            break;
-        case RE_OP_STRING_SET_FLD_REV: /* Member of a string set, ignoring case. */
-            TRACE(("%s\n", re_op_text[node->op]))
-
-            status = string_set_match_fld_fwdrev(state, node, TRUE);
-            if (status < 0)
-                return status;
-            if (status == 0)
-                goto backtrack;
-            node = node->next_1.node;
-            break;
-        case RE_OP_STRING_SET_IGN: /* Member of a string set, ignoring case. */
-            TRACE(("%s\n", re_op_text[node->op]))
-
-            status = string_set_match_ign_fwdrev(state, node, FALSE);
-            if (status < 0)
-                return status;
-            if (status == 0)
-                goto backtrack;
-            node = node->next_1.node;
-            break;
-        case RE_OP_STRING_SET_IGN_REV: /* Member of a string set, ignoring case. */
-            TRACE(("%s\n", re_op_text[node->op]))
-
-            status = string_set_match_ign_fwdrev(state, node, TRUE);
-            if (status < 0)
-                return status;
-            if (status == 0)
-                goto backtrack;
-            node = node->next_1.node;
-            break;
-        case RE_OP_STRING_SET_REV: /* Member of a string set. */
-            TRACE(("%s\n", re_op_text[node->op]))
-
-            status = string_set_match_fwdrev(state, node, TRUE);
-            if (status < 0)
-                return status;
-            if (status == 0)
-                goto backtrack;
-            node = node->next_1.node;
-            break;
         case RE_OP_SUCCESS: /* Success. */
             /* Must the match advance past its start? */
             TRACE(("%s\n", re_op_text[node->op]))
@@ -17923,8 +17210,17 @@ Py_LOCAL_INLINE(void) restore_fuzzy_counts(RE_State* state, size_t*
     Py_MEMCPY(state->fuzzy_counts, fuzzy_counts, sizeof(state->fuzzy_counts));
 }
 
-/* Makes the list of best matches found so far. */
-Py_LOCAL_INLINE(void) make_best_list(RE_BestList* best_list) {
+/* Initialises the list of best matches found so far. */
+Py_LOCAL_INLINE(void) init_best_list(RE_BestList* best_list) {
+    best_list->capacity = 0;
+    best_list->count = 0;
+    best_list->entries = NULL;
+}
+
+/* Finalises the list of best matches found so far. */
+Py_LOCAL_INLINE(void) fini_best_list(RE_State* state, RE_BestList*
+  best_list) {
+    safe_dealloc(state, best_list->entries);
     best_list->capacity = 0;
     best_list->count = 0;
     best_list->entries = NULL;
@@ -17965,13 +17261,6 @@ Py_LOCAL_INLINE(BOOL) add_to_best_list(RE_State* state, RE_BestList* best_list,
     return TRUE;
 }
 
-/* Destroy the list of best matches found so far. */
-Py_LOCAL_INLINE(void) destroy_best_list(RE_State* state, RE_BestList*
-  best_list) {
-    if (best_list->entries)
-        safe_dealloc(state, best_list->entries);
-}
-
 /* Performs a match or search from the current text position for a best fuzzy
  * match.
  */
@@ -18005,8 +17294,8 @@ Py_LOCAL_INLINE(int) do_best_fuzzy_match(RE_State* state, BOOL search) {
     must_advance = state->must_advance;
     found_match = FALSE;
 
-    make_best_list(&best_list);
-    make_best_changes_list(&best_changes_list);
+    init_best_list(&best_list);
+    init_best_changes_list(&best_changes_list);
 
     /* Search the text for the best match. */
     start_pos = state->text_pos;
@@ -18099,7 +17388,7 @@ Py_LOCAL_INLINE(int) do_best_fuzzy_match(RE_State* state, BOOL search) {
                 error_limit = RE_MAX_ERRORS;
 
             best_groups = NULL;
-            make_fuzzy_changes_list(&best_fuzzy_changes);
+            init_fuzzy_changes_list(&best_fuzzy_changes);
 
             /* Look again at the best of the matches that we've seen. */
             for (i = 0; i < best_list.count; i++) {
@@ -18220,27 +17509,29 @@ Py_LOCAL_INLINE(int) do_best_fuzzy_match(RE_State* state, BOOL search) {
                 state->text_pos = entry->match_pos;
                 init_match(state);
                 status = basic_match(state, search);
+
+                list = &best_changes_list.lists[0];
+                state->fuzzy_changes.count = list->count;
+                Py_MEMCPY(state->fuzzy_changes.items, list->items,
+                  (size_t)list->count * sizeof(RE_FuzzyChange));
             }
 
+            fini_fuzzy_changes_list(state, &best_fuzzy_changes);
+
             state->slice_start = slice_start;
             state->slice_end = slice_end;
-
-            list = &best_changes_list.lists[0];
-            state->fuzzy_changes.count = list->count;
-            Py_MEMCPY(state->fuzzy_changes.items, list->items,
-              (size_t)list->count * sizeof(RE_FuzzyChange));
         } else
             state->fuzzy_changes.count = 0;
     }
 
-    destroy_best_list(state, &best_list);
-    destroy_best_changes_list(state, &best_changes_list);
+    fini_best_list(state, &best_list);
+    fini_best_changes_list(state, &best_changes_list);
 
     return status;
 
 error:
-    destroy_best_list(state, &best_list);
-    destroy_best_changes_list(state, &best_changes_list);
+    fini_best_list(state, &best_list);
+    fini_best_changes_list(state, &best_changes_list);
     return RE_ERROR_MEMORY;
 }
 
@@ -18264,7 +17555,7 @@ Py_LOCAL_INLINE(int) do_enhanced_fuzzy_match(RE_State* state, BOOL search) {
 
     pattern = state->pattern;
 
-    make_changes_list(state, &best_fuzzy_changes);
+    init_fuzzy_changes_list(&best_fuzzy_changes);
 
     if (state->reverse)
         available = state->text_pos - state->slice_start;
@@ -18400,12 +17691,12 @@ Py_LOCAL_INLINE(int) do_enhanced_fuzzy_match(RE_State* state, BOOL search) {
         restore_fuzzy_changes(state, &best_fuzzy_changes);
     }
 
-    destroy_changes_list(state, &best_fuzzy_changes);
+    fini_fuzzy_changes_list(state, &best_fuzzy_changes);
 
     return status;
 
 error:
-    destroy_changes_list(state, &best_fuzzy_changes);
+    fini_fuzzy_changes_list(state, &best_fuzzy_changes);
     return status;
 }
 
@@ -18967,7 +18258,6 @@ Py_LOCAL_INLINE(BOOL) state_init_2(RE_State* state, PatternObject* pattern,
         break;
     }
 
-
     /* A state struct can sometimes be shared across threads. In such
      * instances, if multithreading is enabled we need to protect the state
      * with a lock (mutex) during matching.
@@ -19144,7 +18434,7 @@ Py_LOCAL_INLINE(Py_ssize_t) as_string_index(PyObject* obj, Py_ssize_t def) {
         return value;
 
     set_error(RE_ERROR_INDEX, NULL);
-    return 0;
+    return -1;
 }
 
 /* Deallocates a MatchObject. */
@@ -20661,6 +19951,8 @@ static PyObject* match_lastgroup(PyObject* self_) {
         PyObject* result;
 
         index = Py_BuildValue("n", self->lastgroup);
+        if (!index)
+            return NULL;
 
         /* PyDict_GetItem returns borrows a reference. */
         result = PyDict_GetItem(self->pattern->indexgroup, index);
@@ -25291,12 +24583,6 @@ Py_LOCAL_INLINE(BOOL) section_contains_repeat(RE_CODE** code, RE_CODE*
         case RE_OP_RANGE_IGN:
         case RE_OP_RANGE_IGN_REV:
         case RE_OP_RANGE_REV:
-        case RE_OP_STRING_SET:
-        case RE_OP_STRING_SET_FLD:
-        case RE_OP_STRING_SET_FLD_REV:
-        case RE_OP_STRING_SET_IGN:
-        case RE_OP_STRING_SET_IGN_REV:
-        case RE_OP_STRING_SET_REV:
             /* codes: opcode, value, value, value. */
             *code += 4;
             break;
@@ -25671,37 +24957,6 @@ Py_LOCAL_INLINE(int) build_SET(RE_CompileArgs* args) {
     return RE_ERROR_SUCCESS;
 }
 
-/* Builds a STRING_SET node. */
-Py_LOCAL_INLINE(int) build_STRING_SET(RE_CompileArgs* args) {
-    RE_CODE index;
-    RE_CODE min_len;
-    RE_CODE max_len;
-    RE_Node* node;
-
-    /* codes: opcode, index, min_len, max_len. */
-    if (args->code + 3 > args->end_code)
-        return RE_ERROR_ILLEGAL;
-
-    index = args->code[1];
-    min_len = args->code[2];
-    max_len = args->code[3];
-    node = create_node(args->pattern, (RE_UINT8)args->code[0], 0, 0, 3);
-    if (!node)
-        return RE_ERROR_MEMORY;
-
-    node->values[0] = index;
-    node->values[1] = min_len;
-    node->values[2] = max_len;
-
-    args->code += 4;
-
-    /* Append the reference. */
-    add_node(args->end, node);
-    args->end = node;
-
-    return RE_ERROR_SUCCESS;
-}
-
 /* Builds a SUCCESS node . */
 Py_LOCAL_INLINE(int) build_SUCCESS(RE_CompileArgs* args) {
     RE_Node* node;
@@ -26011,17 +25266,6 @@ Py_LOCAL_INLINE(int) build_sequence(RE_CompileArgs* args) {
             if (!build_STRING(args, FALSE))
                 return FALSE;
             break;
-        case RE_OP_STRING_SET:
-        case RE_OP_STRING_SET_FLD:
-        case RE_OP_STRING_SET_FLD_REV:
-        case RE_OP_STRING_SET_IGN:
-        case RE_OP_STRING_SET_IGN_REV:
-        case RE_OP_STRING_SET_REV:
-            /* A reference to a list. */
-            status = build_STRING_SET(args);
-            if (status != RE_ERROR_SUCCESS)
-                return status;
-            break;
         default:
             /* We've found an opcode which we don't recognise. We'll leave it
              * for the caller.
@@ -26935,5 +26179,3 @@ PyMODINIT_FUNC init_regex(void) {
         return;
     }
 }
-
-/* vim:ts=4:sw=4:et */
diff --git a/regex_2/_regex.h b/regex_2/_regex.h
index f2b7d67..4c7f5fb 100644
--- a/regex_2/_regex.h
+++ b/regex_2/_regex.h
@@ -98,29 +98,23 @@
 #define RE_OP_STRING_IGN 77
 #define RE_OP_STRING_IGN_REV 78
 #define RE_OP_STRING_REV 79
-#define RE_OP_STRING_SET 80
-#define RE_OP_STRING_SET_FLD 81
-#define RE_OP_STRING_SET_FLD_REV 82
-#define RE_OP_STRING_SET_IGN 83
-#define RE_OP_STRING_SET_IGN_REV 84
-#define RE_OP_STRING_SET_REV 85
-#define RE_OP_FUZZY_EXT 86
-#define RE_OP_BODY_END 87
-#define RE_OP_BODY_START 88
-#define RE_OP_END_ATOMIC 89
-#define RE_OP_END_CONDITIONAL 90
-#define RE_OP_END_FUZZY 91
-#define RE_OP_END_GREEDY_REPEAT 92
-#define RE_OP_END_GROUP 93
-#define RE_OP_END_LAZY_REPEAT 94
-#define RE_OP_END_LOOKAROUND 95
-#define RE_OP_FUZZY_INSERT 96
-#define RE_OP_GREEDY_REPEAT_ONE 97
-#define RE_OP_GROUP_RETURN 98
-#define RE_OP_LAZY_REPEAT_ONE 99
-#define RE_OP_MATCH_BODY 100
-#define RE_OP_MATCH_TAIL 101
-#define RE_OP_START_GROUP 102
+#define RE_OP_FUZZY_EXT 80
+#define RE_OP_BODY_END 81
+#define RE_OP_BODY_START 82
+#define RE_OP_END_ATOMIC 83
+#define RE_OP_END_CONDITIONAL 84
+#define RE_OP_END_FUZZY 85
+#define RE_OP_END_GREEDY_REPEAT 86
+#define RE_OP_END_GROUP 87
+#define RE_OP_END_LAZY_REPEAT 88
+#define RE_OP_END_LOOKAROUND 89
+#define RE_OP_FUZZY_INSERT 90
+#define RE_OP_GREEDY_REPEAT_ONE 91
+#define RE_OP_GROUP_RETURN 92
+#define RE_OP_LAZY_REPEAT_ONE 93
+#define RE_OP_MATCH_BODY 94
+#define RE_OP_MATCH_TAIL 95
+#define RE_OP_START_GROUP 96
 
 char* re_op_text[] = {
     "RE_OP_FAILURE",
@@ -203,12 +197,6 @@ char* re_op_text[] = {
     "RE_OP_STRING_IGN",
     "RE_OP_STRING_IGN_REV",
     "RE_OP_STRING_REV",
-    "RE_OP_STRING_SET",
-    "RE_OP_STRING_SET_FLD",
-    "RE_OP_STRING_SET_FLD_REV",
-    "RE_OP_STRING_SET_IGN",
-    "RE_OP_STRING_SET_IGN_REV",
-    "RE_OP_STRING_SET_REV",
     "RE_OP_FUZZY_EXT",
     "RE_OP_BODY_END",
     "RE_OP_BODY_START",
diff --git a/regex_2/regex/_regex_core.py b/regex_2/_regex_core.py
similarity index 98%
rename from regex_2/regex/_regex_core.py
rename to regex_2/_regex_core.py
index 93b6e15..9a77fe0 100644
--- a/regex_2/regex/_regex_core.py
+++ b/regex_2/_regex_core.py
@@ -219,12 +219,6 @@ STRING_FLD_REV
 STRING_IGN
 STRING_IGN_REV
 STRING_REV
-STRING_SET
-STRING_SET_FLD
-STRING_SET_FLD_REV
-STRING_SET_IGN
-STRING_SET_IGN_REV
-STRING_SET_REV
 FUZZY_EXT
 """
 
@@ -2033,6 +2027,9 @@ class Branch(RegexBase):
             b.fix_groups(pattern, reverse, fuzzy)
 
     def optimise(self, info, reverse):
+        if not self.branches:
+            return Sequence([])
+
         # Flatten branches within branches.
         branches = Branch._flatten_branches(info, reverse, self.branches)
 
@@ -2452,6 +2449,9 @@ class CallGroup(RegexBase):
     def max_width(self):
         return UNLIMITED
 
+    def __del__(self):
+        self.info = None
+
 class CallRef(RegexBase):
     def __init__(self, ref, parsed):
         self.ref = ref
@@ -2621,6 +2621,9 @@ class Conditional(RegexBase):
     def max_width(self):
         return max(self.yes_item.max_width(), self.no_item.max_width())
 
+    def __del__(self):
+        self.info = None
+
 class DefaultBoundary(ZeroWidthBase):
     _opcode = OP.DEFAULT_BOUNDARY
     _op_name = "DEFAULT_BOUNDARY"
@@ -3015,6 +3018,9 @@ class Group(RegexBase):
     def get_required_string(self, reverse):
         return self.subpattern.get_required_string(reverse)
 
+    def __del__(self):
+        self.info = None
+
 class Keep(ZeroWidthBase):
     _opcode = OP.KEEP
     _op_name = "KEEP"
@@ -3363,6 +3369,9 @@ class RefGroup(RegexBase):
     def max_width(self):
         return UNLIMITED
 
+    def __del__(self):
+        self.info = None
+
 class SearchAnchor(ZeroWidthBase):
     _opcode = OP.SEARCH_ANCHOR
     _op_name = "SEARCH_ANCHOR"
@@ -3682,6 +3691,9 @@ class SetBase(RegexBase):
 
         return max(len(folded) for folded in seen)
 
+    def __del__(self):
+        self.info = None
+
 class SetDiff(SetBase):
     _opcode = {(NOCASE, False): OP.SET_DIFF, (IGNORECASE, False):
       OP.SET_DIFF_IGN, (FULLCASE, False): OP.SET_DIFF, (FULLIGNORECASE, False):
@@ -3919,13 +3931,7 @@ class Literal(String):
         print "%sLITERAL MATCH %s%s" % (INDENT * indent, display,
           CASE_TEXT[self.case_flags])
 
-class StringSet(RegexBase):
-    _opcode = {(NOCASE, False): OP.STRING_SET, (IGNORECASE, False):
-      OP.STRING_SET_IGN, (FULLCASE, False): OP.STRING_SET, (FULLIGNORECASE,
-      False): OP.STRING_SET_FLD, (NOCASE, True): OP.STRING_SET_REV,
-      (IGNORECASE, True): OP.STRING_SET_IGN_REV, (FULLCASE, True):
-      OP.STRING_SET_REV, (FULLIGNORECASE, True): OP.STRING_SET_FLD_REV}
-
+class StringSet(Branch):
     def __init__(self, info, name, case_flags=NOCASE):
         self.info = info
         self.name = name
@@ -3937,84 +3943,30 @@ class StringSet(RegexBase):
         if self.set_key not in info.named_lists_used:
             info.named_lists_used[self.set_key] = len(info.named_lists_used)
 
-    def _compile(self, reverse, fuzzy):
         index = self.info.named_lists_used[self.set_key]
         items = self.info.kwargs[self.name]
 
         case_flags = self.case_flags
 
-        if not items:
-            return []
-
         encoding = self.info.flags & _ALL_ENCODINGS
         fold_flags = encoding | case_flags
 
-        if fuzzy:
-            choices = [self._folded(fold_flags, i) for i in items]
-
-            # Sort from longest to shortest.
-            choices.sort(key=lambda s: (-len(s), s))
+        choices = []
+        for string in items:
+            choices.append([Character(ord(c), case_flags=case_flags) for c in
+              string])
 
-            branches = []
-            for string in choices:
-                branches.append(Sequence([Character(c, case_flags=case_flags)
-                  for c in string]))
+        # Sort from longest to shortest.
+        choices.sort(key=len, reverse=True)
 
-            if len(branches) > 1:
-                branch = Branch(branches)
-            else:
-                branch = branches[0]
-            branch = branch.optimise(self.info,
-              reverse).pack_characters(self.info)
-
-            return branch.compile(reverse, fuzzy)
-        else:
-            min_len = min(len(i) for i in items)
-            max_len = max(len(self._folded(fold_flags, i)) for i in items)
-            return [(self._opcode[case_flags, reverse], index, min_len,
-              max_len)]
+        self.branches = [Sequence(choice) for choice in choices]
 
     def dump(self, indent, reverse):
         print "%sSTRING_SET %s%s" % (INDENT * indent, self.name,
           CASE_TEXT[self.case_flags])
 
-    def _folded(self, fold_flags, item):
-        if isinstance(item, unicode):
-            return [ord(c) for c in _regex.fold_case(fold_flags, item)]
-        else:
-            return [ord(c) for c in item]
-
-    def _flatten(self, s):
-        # Flattens the branches.
-        if isinstance(s, Branch):
-            for b in s.branches:
-                self._flatten(b)
-        elif isinstance(s, Sequence) and s.items:
-            seq = s.items
-
-            while isinstance(seq[-1], Sequence):
-                seq[-1 : ] = seq[-1].items
-
-            n = 0
-            while n < len(seq) and isinstance(seq[n], Character):
-                n += 1
-
-            if n > 1:
-                seq[ : n] = [String([c.value for c in seq[ : n]],
-                  case_flags=self.case_flags)]
-
-            self._flatten(seq[-1])
-
-    def max_width(self):
-        if not self.info.kwargs[self.name]:
-            return 0
-
-        if self.case_flags & IGNORECASE:
-            fold_flags = (self.info.flags & _ALL_ENCODINGS) | self.case_flags
-            return max(len(_regex.fold_case(fold_flags, i)) for i in
-              self.info.kwargs[self.name])
-        else:
-            return max(len(i) for i in self.info.kwargs[self.name])
+    def __del__(self):
+        self.info = None
 
 class Source(object):
     "Scanner for the regular expression source string."
@@ -4488,6 +4440,7 @@ CHARACTER_ESCAPES = {
 CHARSET_ESCAPES = {
     "d": lookup_property(None, "Digit", True),
     "D": lookup_property(None, "Digit", False),
+    "h": lookup_property(None, "Blank", True),
     "s": lookup_property(None, "Space", True),
     "S": lookup_property(None, "Space", False),
     "w": lookup_property(None, "Word", True),
diff --git a/regex_2/_regex_unicode.c b/regex_2/_regex_unicode.c
index eff2643..aec7fe7 100644
--- a/regex_2/_regex_unicode.c
+++ b/regex_2/_regex_unicode.c
@@ -1,4 +1,4 @@
-/* For Unicode version 12.1.0 */
+/* For Unicode version 13.0.0 */
 
 #include "_regex_unicode.h"
 
@@ -6,21 +6,20 @@
 #define RE_GRAPH_MASK ((1 << RE_PROP_CC) | (1 << RE_PROP_CS) | (1 << RE_PROP_CN))
 #define RE_WORD_MASK (RE_PROP_M_MASK | (1 << RE_PROP_ND) | (1 << RE_PROP_PC))
 
-typedef struct RE_ScriptExt {
+typedef struct {
     RE_UINT8 scripts[RE_MAX_SCX];
 } RE_ScriptExt;
 
-typedef struct RE_AllCases {
-    RE_INT32 diffs[RE_MAX_CASES - 1];
+typedef struct {
+    RE_UINT32 delta;
+    RE_UINT16 others[RE_MAX_CASES - 1];
 } RE_AllCases;
 
-typedef struct RE_FullCaseFolding {
-    RE_INT32 diff;
-    RE_UINT16 codepoints[RE_MAX_FOLDED - 1];
+typedef struct {
+    RE_UINT16 data[RE_MAX_FOLDED];
 } RE_FullCaseFolding;
 
-/* strings. */
-
+/* Strings. */
 char* re_strings[] = {
     "-1/2",
     "0",
@@ -393,6 +392,8 @@ char* re_strings[] = {
     "CHEROKEESUP",
     "CHEROKEESUPPLEMENT",
     "CHESSSYMBOLS",
+    "CHORASMIAN",
+    "CHRS",
     "CI",
     "CIRCLE",
     "CJ",
@@ -411,6 +412,7 @@ char* re_strings[] = {
     "CJKEXTD",
     "CJKEXTE",
     "CJKEXTF",
+    "CJKEXTG",
     "CJKRADICALSSUP",
     "CJKRADICALSSUPPLEMENT",
     "CJKSTROKES",
@@ -423,6 +425,7 @@ char* re_strings[] = {
     "CJKUNIFIEDIDEOGRAPHSEXTENSIOND",
     "CJKUNIFIEDIDEOGRAPHSEXTENSIONE",
     "CJKUNIFIEDIDEOGRAPHSEXTENSIONF",
+    "CJKUNIFIEDIDEOGRAPHSEXTENSIONG",
     "CL",
     "CLOSE",
     "CLOSEPARENTHESIS",
@@ -521,8 +524,10 @@ char* re_strings[] = {
     "DIACRITICALSEXT",
     "DIACRITICALSFORSYMBOLS",
     "DIACRITICALSSUP",
+    "DIAK",
     "DIGIT",
     "DINGBATS",
+    "DIVESAKURU",
     "DOGR",
     "DOGRA",
     "DOMINO",
@@ -544,6 +549,7 @@ char* re_strings[] = {
     "EBASE",
     "EBASEGAZ",
     "EBG",
+    "ECOMP",
     "EGYP",
     "EGYPTIANHIEROGLYPHFORMATCONTROLS",
     "EGYPTIANHIEROGLYPHS",
@@ -552,6 +558,7 @@ char* re_strings[] = {
     "ELYM",
     "ELYMAIC",
     "EM",
+    "EMOD",
     "EMODIFIER",
     "EMOJI",
     "EMOJICOMPONENT",
@@ -570,6 +577,7 @@ char* re_strings[] = {
     "ENCLOSEDIDEOGRAPHICSUP",
     "ENCLOSEDIDEOGRAPHICSUPPLEMENT",
     "ENCLOSINGMARK",
+    "EPRES",
     "ES",
     "ET",
     "ETHI",
@@ -590,6 +598,7 @@ char* re_strings[] = {
     "EXTENDEDPICTOGRAPHIC",
     "EXTENDER",
     "EXTENDNUMLET",
+    "EXTPICT",
     "F",
     "FALSE",
     "FARSIYEH",
@@ -678,6 +687,8 @@ char* re_strings[] = {
     "HANIFIROHINGYAKINNAYA",
     "HANIFIROHINGYAPA",
     "HANO",
+    "HANR",
+    "HANREADING",
     "HANUNOO",
     "HATR",
     "HATRAN",
@@ -781,12 +792,14 @@ char* re_strings[] = {
     "KHAPH",
     "KHAR",
     "KHAROSHTHI",
+    "KHITANSMALLSCRIPT",
     "KHMER",
     "KHMERSYMBOLS",
     "KHMR",
     "KHOJ",
     "KHOJKI",
     "KHUDAWADI",
+    "KITS",
     "KNDA",
     "KNOTTEDHEH",
     "KTHI",
@@ -844,6 +857,8 @@ char* re_strings[] = {
     "LINEFEED",
     "LINESEPARATOR",
     "LISU",
+    "LISUSUP",
+    "LISUSUPPLEMENT",
     "LL",
     "LM",
     "LO",
@@ -1299,6 +1314,7 @@ char* re_strings[] = {
     "SYMBOL",
     "SYMBOLSANDPICTOGRAPHSEXTA",
     "SYMBOLSANDPICTOGRAPHSEXTENDEDA",
+    "SYMBOLSFORLEGACYCOMPUTING",
     "SYRC",
     "SYRIAC",
     "SYRIACSUP",
@@ -1326,6 +1342,8 @@ char* re_strings[] = {
     "TANG",
     "TANGUT",
     "TANGUTCOMPONENTS",
+    "TANGUTSUP",
+    "TANGUTSUPPLEMENT",
     "TAVT",
     "TAW",
     "TEHMARBUTA",
@@ -1350,6 +1368,7 @@ char* re_strings[] = {
     "TONEMARK",
     "TOP",
     "TOPANDBOTTOM",
+    "TOPANDBOTTOMANDLEFT",
     "TOPANDBOTTOMANDRIGHT",
     "TOPANDLEFT",
     "TOPANDLEFTANDRIGHT",
@@ -1424,6 +1443,8 @@ char* re_strings[] = {
     "YEHBARREE",
     "YEHWITHTAIL",
     "YES",
+    "YEZI",
+    "YEZIDI",
     "YI",
     "YIII",
     "YIJING",
@@ -1449,1760 +1470,1777 @@ char* re_strings[] = {
     "ZZZZ",
 };
 
-/* strings: 13687 bytes. */
-
-/* properties. */
-
+/* Properties. */
 RE_Property re_properties[] = {
-    { 591,  0,  0},
-    { 588,  0,  0},
-    { 271,  1,  1},
-    { 270,  1,  1},
-    {1185,  2,  2},
-    {1183,  2,  2},
-    {1186,  3,  2},
-    {1187,  3,  2},
-    {1384,  4,  3},
-    {1378,  4,  3},
-    { 617,  5,  4},
-    { 589,  5,  4},
-    {1193,  6,  5},
-    {1182,  6,  5},
-    { 900,  7,  6},
-    { 189,  8,  6},
-    { 188,  8,  6},
-    { 828,  9,  6},
-    { 827,  9,  6},
-    {1350, 10,  6},
-    {1349, 10,  6},
-    { 314, 11,  6},
-    { 316, 12,  6},
-    { 371, 12,  6},
-    { 363, 13,  6},
-    { 457, 13,  6},
-    { 365, 14,  6},
-    { 459, 14,  6},
-    { 364, 15,  6},
-    { 458, 15,  6},
-    { 361, 16,  6},
-    { 455, 16,  6},
-    { 362, 17,  6},
-    { 456, 17,  6},
-    { 694, 18,  6},
-    { 690, 18,  6},
-    { 684, 19,  6},
-    { 683, 19,  6},
-    {1393, 20,  6},
-    {1392, 20,  6},
-    {1391, 21,  6},
-    {1390, 21,  6},
-    { 484, 22,  6},
-    { 492, 22,  6},
-    { 618, 23,  6},
-    { 626, 23,  6},
-    { 616, 24,  6},
-    { 620, 24,  6},
-    { 619, 25,  6},
-    { 627, 25,  6},
-    {1380, 26,  6},
-    {1388, 26,  6},
-    {1231, 26,  6},
-    { 263, 27,  6},
-    { 261, 27,  6},
-    { 730, 28,  6},
-    { 728, 28,  6},
-    { 477, 29,  6},
-    { 681, 30,  6},
-    {1147, 31,  6},
-    {1144, 31,  6},
-    {1311, 32,  6},
-    {1310, 32,  6},
-    {1071, 33,  6},
-    {1050, 33,  6},
-    { 667, 34,  6},
-    { 666, 34,  6},
-    { 221, 35,  6},
-    { 177, 35,  6},
-    {1064, 36,  6},
-    {1030, 36,  6},
-    { 686, 37,  6},
-    { 685, 37,  6},
-    { 494, 38,  6},
-    { 493, 38,  6},
-    { 566, 39,  6},
-    { 563, 39,  6},
-    {1070, 40,  6},
-    {1049, 40,  6},
-    {1076, 41,  6},
-    {1078, 41,  6},
-    {1003, 42,  6},
-    { 980, 42,  6},
-    {1066, 43,  6},
-    {1035, 43,  6},
-    { 692, 44,  6},
-    { 691, 44,  6},
-    { 695, 45,  6},
-    { 693, 45,  6},
-    {1149, 46,  6},
-    {1346, 47,  6},
-    {1342, 47,  6},
-    {1065, 48,  6},
-    {1032, 48,  6},
-    { 486, 49,  6},
-    { 485, 49,  6},
-    {1222, 50,  6},
-    {1188, 50,  6},
-    { 826, 51,  6},
-    { 825, 51,  6},
-    {1068, 52,  6},
-    {1037, 52,  6},
-    {1067, 53,  6},
-    {1036, 53,  6},
-    {1194, 54,  6},
-    {1240, 54,  6},
-    {1355, 55,  6},
-    {1371, 55,  6},
-    {1090, 56,  6},
-    {1091, 56,  6},
-    {1089, 57,  6},
-    {1088, 57,  6},
-    {1129, 58,  6},
-    {1095, 58,  6},
-    {1150, 59,  6},
-    {1155, 59,  6},
-    { 650, 60,  7},
-    { 678, 60,  7},
-    { 262, 61,  8},
-    { 251, 61,  8},
-    { 308, 62,  9},
-    { 320, 62,  9},
-    { 483, 63, 10},
-    { 510, 63, 10},
-    { 517, 64, 11},
-    { 515, 64, 11},
-    { 732, 65, 12},
-    { 726, 65, 12},
-    { 733, 66, 13},
-    { 734, 66, 13},
-    { 818, 67, 14},
-    { 793, 67, 14},
-    {1023, 68, 15},
-    {1016, 68, 15},
-    {1024, 69, 16},
-    {1027, 69, 16},
-    { 265, 70,  6},
-    { 264, 70,  6},
-    { 699, 71, 17},
-    { 707, 71, 17},
-    { 701, 72, 18},
-    { 708, 72, 18},
-    { 531, 73, 19},
-    { 535, 74, 19},
-    { 533, 75, 19},
-    { 534, 76, 19},
-    { 532, 77, 19},
-    { 565, 78, 19},
-    { 990, 79, 20},
-    { 989, 79, 20},
-    { 988, 80, 21},
-    { 987, 80, 21},
-    { 994, 81, 20},
-    { 993, 81, 20},
-    { 992, 82, 21},
-    { 991, 82, 21},
-    { 192, 83,  6},
-    { 187, 83,  6},
-    { 200, 84,  6},
-    { 269, 85,  6},
-    { 615, 86,  6},
-    {1130, 87,  6},
-    {1383, 88,  6},
-    {1389, 89,  6},
-    {1121, 90,  6},
-    {1120, 91,  6},
-    {1122, 92,  6},
-    {1123, 93,  6},
-};
-
-/* properties: 672 bytes. */
-
-/* property values. */
-
+    { 189,  0,  0}, /* ALPHABETIC */
+    { 188,  0,  0}, /* ALPHA */
+    { 192,  1,  0}, /* ALPHANUMERIC */
+    { 187,  1,  0}, /* ALNUM */
+    { 200,  2,  0}, /* ANY */
+    { 221,  3,  0}, /* ASCIIHEXDIGIT */
+    { 177,  3,  0}, /* AHEX */
+    { 262,  4,  1}, /* BIDICLASS */
+    { 251,  4,  1}, /* BC */
+    { 263,  5,  0}, /* BIDICONTROL */
+    { 261,  5,  0}, /* BIDIC */
+    { 265,  6,  0}, /* BIDIMIRRORED */
+    { 264,  6,  0}, /* BIDIM */
+    { 269,  7,  0}, /* BLANK */
+    { 271,  8,  2}, /* BLOCK */
+    { 270,  8,  2}, /* BLK */
+    { 308,  9,  3}, /* CANONICALCOMBININGCLASS */
+    { 320,  9,  3}, /* CCC */
+    { 314, 10,  0}, /* CASED */
+    { 316, 11,  0}, /* CASEIGNORABLE */
+    { 373, 11,  0}, /* CI */
+    { 361, 12,  0}, /* CHANGESWHENCASEFOLDED */
+    { 459, 12,  0}, /* CWCF */
+    { 362, 13,  0}, /* CHANGESWHENCASEMAPPED */
+    { 460, 13,  0}, /* CWCM */
+    { 363, 14,  0}, /* CHANGESWHENLOWERCASED */
+    { 461, 14,  0}, /* CWL */
+    { 364, 15,  0}, /* CHANGESWHENTITLECASED */
+    { 462, 15,  0}, /* CWT */
+    { 365, 16,  0}, /* CHANGESWHENUPPERCASED */
+    { 463, 16,  0}, /* CWU */
+    { 481, 17,  0}, /* DASH */
+    { 487, 18,  4}, /* DECOMPOSITIONTYPE */
+    { 516, 18,  4}, /* DT */
+    { 488, 19,  0}, /* DEFAULTIGNORABLECODEPOINT */
+    { 496, 19,  0}, /* DI */
+    { 490, 20,  0}, /* DEPRECATED */
+    { 489, 20,  0}, /* DEP */
+    { 498, 21,  0}, /* DIACRITIC */
+    { 497, 21,  0}, /* DIA */
+    { 523, 22,  5}, /* EASTASIANWIDTH */
+    { 521, 22,  5}, /* EA */
+    { 539, 23,  0}, /* EMOJI */
+    { 540, 24,  0}, /* EMOJICOMPONENT */
+    { 528, 24,  0}, /* ECOMP */
+    { 541, 25,  0}, /* EMOJIMODIFIER */
+    { 537, 25,  0}, /* EMOD */
+    { 542, 26,  0}, /* EMOJIMODIFIERBASE */
+    { 525, 26,  0}, /* EBASE */
+    { 543, 27,  0}, /* EMOJIPRESENTATION */
+    { 556, 27,  0}, /* EPRES */
+    { 574, 28,  0}, /* EXTENDEDPICTOGRAPHIC */
+    { 577, 28,  0}, /* EXTPICT */
+    { 575, 29,  0}, /* EXTENDER */
+    { 572, 29,  0}, /* EXT */
+    { 601, 30,  6}, /* GENERALCATEGORY */
+    { 598, 30,  6}, /* GC */
+    { 625, 31,  0}, /* GRAPH */
+    { 626, 32,  0}, /* GRAPHEMEBASE */
+    { 630, 32,  0}, /* GRBASE */
+    { 627, 33,  7}, /* GRAPHEMECLUSTERBREAK */
+    { 599, 33,  7}, /* GCB */
+    { 628, 34,  0}, /* GRAPHEMEEXTEND */
+    { 636, 34,  0}, /* GREXT */
+    { 629, 35,  0}, /* GRAPHEMELINK */
+    { 637, 35,  0}, /* GRLINK */
+    { 660, 36,  8}, /* HANGULSYLLABLETYPE */
+    { 690, 36,  8}, /* HST */
+    { 679, 37,  0}, /* HEXDIGIT */
+    { 678, 37,  0}, /* HEX */
+    { 693, 38,  0}, /* HYPHEN */
+    { 696, 39,  0}, /* IDCONTINUE */
+    { 695, 39,  0}, /* IDC */
+    { 698, 40,  0}, /* IDEOGRAPHIC */
+    { 697, 40,  0}, /* IDEO */
+    { 704, 41,  0}, /* IDSBINARYOPERATOR */
+    { 703, 41,  0}, /* IDSB */
+    { 706, 42,  0}, /* IDSTART */
+    { 702, 42,  0}, /* IDS */
+    { 707, 43,  0}, /* IDSTRINARYOPERATOR */
+    { 705, 43,  0}, /* IDST */
+    { 711, 44,  9}, /* INDICPOSITIONALCATEGORY */
+    { 719, 44,  9}, /* INPC */
+    { 713, 45, 10}, /* INDICSYLLABICCATEGORY */
+    { 720, 45, 10}, /* INSC */
+    { 742, 46,  0}, /* JOINCONTROL */
+    { 740, 46,  0}, /* JOINC */
+    { 744, 47, 11}, /* JOININGGROUP */
+    { 738, 47, 11}, /* JG */
+    { 745, 48, 12}, /* JOININGTYPE */
+    { 746, 48, 12}, /* JT */
+    { 832, 49, 13}, /* LINEBREAK */
+    { 807, 49, 13}, /* LB */
+    { 842, 50,  0}, /* LOGICALORDEREXCEPTION */
+    { 841, 50,  0}, /* LOE */
+    { 844, 51,  0}, /* LOWERCASE */
+    { 843, 51,  0}, /* LOWER */
+    { 916, 52,  0}, /* MATH */
+    {1004, 53, 14}, /* NFCQUICKCHECK */
+    {1003, 53, 14}, /* NFCQC */
+    {1006, 54, 15}, /* NFDQUICKCHECK */
+    {1005, 54, 15}, /* NFDQC */
+    {1008, 55, 14}, /* NFKCQUICKCHECK */
+    {1007, 55, 14}, /* NFKCQC */
+    {1010, 56, 15}, /* NFKDQUICKCHECK */
+    {1009, 56, 15}, /* NFKDQC */
+    {1019, 57,  0}, /* NONCHARACTERCODEPOINT */
+    { 996, 57,  0}, /* NCHAR */
+    {1039, 58, 16}, /* NUMERICTYPE */
+    {1032, 58, 16}, /* NT */
+    {1040, 59, 17}, /* NUMERICVALUE */
+    {1043, 59, 17}, /* NV */
+    {1080, 60,  0}, /* OTHERALPHABETIC */
+    {1046, 60,  0}, /* OALPHA */
+    {1081, 61,  0}, /* OTHERDEFAULTIGNORABLECODEPOINT */
+    {1048, 61,  0}, /* ODI */
+    {1082, 62,  0}, /* OTHERGRAPHEMEEXTEND */
+    {1051, 62,  0}, /* OGREXT */
+    {1083, 63,  0}, /* OTHERIDCONTINUE */
+    {1052, 63,  0}, /* OIDC */
+    {1084, 64,  0}, /* OTHERIDSTART */
+    {1053, 64,  0}, /* OIDS */
+    {1086, 65,  0}, /* OTHERLOWERCASE */
+    {1065, 65,  0}, /* OLOWER */
+    {1087, 66,  0}, /* OTHERMATH */
+    {1066, 66,  0}, /* OMATH */
+    {1092, 67,  0}, /* OTHERUPPERCASE */
+    {1094, 67,  0}, /* OUPPER */
+    {1105, 68,  0}, /* PATTERNSYNTAX */
+    {1104, 68,  0}, /* PATSYN */
+    {1106, 69,  0}, /* PATTERNWHITESPACE */
+    {1107, 69,  0}, /* PATWS */
+    {1136, 70,  0}, /* POSIXALNUM */
+    {1137, 71,  0}, /* POSIXDIGIT */
+    {1138, 72,  0}, /* POSIXPUNCT */
+    {1139, 73,  0}, /* POSIXXDIGIT */
+    {1145, 74,  0}, /* PREPENDEDCONCATENATIONMARK */
+    {1111, 74,  0}, /* PCM */
+    {1146, 75,  0}, /* PRINT */
+    {1163, 76,  0}, /* QUOTATIONMARK */
+    {1160, 76,  0}, /* QMARK */
+    {1165, 77,  0}, /* RADICAL */
+    {1166, 78,  0}, /* REGIONALINDICATOR */
+    {1171, 78,  0}, /* RI */
+    {1201, 79, 18}, /* SCRIPT */
+    {1199, 79, 18}, /* SC */
+    {1202, 80, 18}, /* SCRIPTEXTENSIONS */
+    {1203, 80, 18}, /* SCX */
+    {1209, 81, 19}, /* SENTENCEBREAK */
+    {1198, 81, 19}, /* SB */
+    {1210, 82,  0}, /* SENTENCETERMINAL */
+    {1256, 82,  0}, /* STERM */
+    {1238, 83,  0}, /* SOFTDOTTED */
+    {1204, 83,  0}, /* SD */
+    {1330, 84,  0}, /* TERMINALPUNCTUATION */
+    {1329, 84,  0}, /* TERM */
+    {1366, 85,  0}, /* UNIFIEDIDEOGRAPH */
+    {1362, 85,  0}, /* UIDEO */
+    {1370, 86,  0}, /* UPPERCASE */
+    {1369, 86,  0}, /* UPPER */
+    {1375, 87,  0}, /* VARIATIONSELECTOR */
+    {1391, 87,  0}, /* VS */
+    {1400, 88,  0}, /* WHITESPACE */
+    {1408, 88,  0}, /* WSPACE */
+    {1247, 88,  0}, /* SPACE */
+    {1403, 89,  0}, /* WORD */
+    {1404, 90, 20}, /* WORDBREAK */
+    {1398, 90, 20}, /* WB */
+    {1409, 91,  0}, /* XDIGIT */
+    {1411, 92,  0}, /* XIDCONTINUE */
+    {1410, 92,  0}, /* XIDC */
+    {1413, 93,  0}, /* XIDSTART */
+    {1412, 93,  0}, /* XIDS */
+};
+
+/* Property values. */
 RE_PropertyValue re_property_values[] = {
-    {1343,  0,   0},
-    { 406,  0,   0},
-    {1351,  0,   1},
-    { 835,  0,   1},
-    { 829,  0,   2},
-    { 822,  0,   2},
-    {1323,  0,   3},
-    { 834,  0,   3},
-    { 946,  0,   4},
-    { 823,  0,   4},
-    {1069,  0,   5},
-    { 824,  0,   5},
-    {1007,  0,   6},
-    { 944,  0,   6},
-    { 547,  0,   7},
-    { 910,  0,   7},
-    {1233,  0,   8},
-    { 909,  0,   8},
-    { 482,  0,   9},
-    { 981,  0,   9},
-    { 499,  0,   9},
-    { 808,  0,  10},
-    { 998,  0,  10},
-    {1073,  0,  11},
-    { 999,  0,  11},
-    {1232,  0,  12},
-    {1419,  0,  12},
-    { 820,  0,  13},
-    {1417,  0,  13},
-    {1087,  0,  14},
-    {1418,  0,  14},
-    { 439,  0,  15},
-    { 319,  0,  15},
-    { 407,  0,  15},
-    { 580,  0,  16},
-    { 358,  0,  16},
-    {1131,  0,  17},
-    { 408,  0,  17},
-    {1267,  0,  18},
-    { 449,  0,  18},
-    { 478,  0,  19},
-    {1096,  0,  19},
-    {1053,  0,  20},
-    {1134,  0,  20},
-    { 404,  0,  21},
-    {1099,  0,  21},
-    { 424,  0,  22},
-    {1094,  0,  22},
-    {1074,  0,  23},
-    {1117,  0,  23},
-    { 905,  0,  24},
-    {1214,  0,  24},
-    { 453,  0,  25},
-    {1183,  0,  25},
-    { 948,  0,  26},
-    {1213,  0,  26},
-    {1075,  0,  27},
-    {1221,  0,  27},
-    { 706,  0,  28},
-    {1114,  0,  28},
-    { 575,  0,  29},
-    {1101,  0,  29},
-    {1063,  0,  30},
-    { 301,  0,  30},
-    { 302,  0,  30},
-    { 806,  0,  31},
-    { 769,  0,  31},
-    { 770,  0,  31},
-    { 898,  0,  32},
-    { 844,  0,  32},
-    { 415,  0,  32},
-    { 845,  0,  32},
-    {1019,  0,  33},
-    { 968,  0,  33},
-    { 969,  0,  33},
-    {1138,  0,  34},
-    {1082,  0,  34},
-    {1137,  0,  34},
-    {1083,  0,  34},
-    {1274,  0,  35},
-    {1172,  0,  35},
-    {1173,  0,  35},
-    {1196,  0,  36},
-    {1410,  0,  36},
-    {1411,  0,  36},
-    { 315,  0,  37},
-    { 794,  0,  37},
-    { 222,  0,  38},
-    {1000,  1,   0},
-    { 978,  1,   0},
-    { 245,  1,   1},
-    { 220,  1,   1},
-    { 779,  1,   2},
-    { 778,  1,   2},
-    { 777,  1,   2},
-    { 786,  1,   3},
-    { 780,  1,   3},
-    { 788,  1,   4},
-    { 782,  1,   4},
-    { 716,  1,   5},
-    { 715,  1,   5},
-    {1234,  1,   6},
-    { 947,  1,   6},
-    { 410,  1,   7},
-    { 495,  1,   7},
-    { 622,  1,   8},
-    { 621,  1,   8},
-    { 462,  1,   9},
-    { 470,  1,  10},
-    { 469,  1,  10},
-    { 471,  1,  10},
-    { 216,  1,  11},
-    { 661,  1,  12},
-    { 203,  1,  13},
-    {1278,  1,  14},
-    { 215,  1,  15},
-    { 214,  1,  15},
-    {1316,  1,  16},
-    { 996,  1,  17},
-    {1177,  1,  18},
-    { 865,  1,  19},
-    {1280,  1,  20},
-    {1279,  1,  20},
-    { 205,  1,  21},
-    { 204,  1,  21},
-    { 489,  1,  22},
-    { 257,  1,  23},
-    { 631,  1,  24},
-    { 628,  1,  25},
-    {1055,  1,  26},
-    {1297,  1,  27},
-    {1309,  1,  28},
-    { 749,  1,  29},
-    { 852,  1,  30},
-    {1211,  1,  31},
-    {1317,  1,  32},
-    { 774,  1,  33},
-    {1318,  1,  34},
-    { 962,  1,  35},
-    { 597,  1,  36},
-    { 646,  1,  37},
-    { 721,  1,  37},
-    { 551,  1,  38},
-    { 557,  1,  39},
-    { 556,  1,  39},
-    { 367,  1,  40},
-    {1344,  1,  41},
-    {1338,  1,  41},
-    { 306,  1,  41},
-    {1034,  1,  42},
-    {1170,  1,  43},
-    {1283,  1,  44},
-    { 656,  1,  45},
-    { 297,  1,  46},
-    {1285,  1,  47},
-    { 759,  1,  48},
-    { 952,  1,  49},
-    {1345,  1,  50},
-    {1339,  1,  50},
-    { 811,  1,  51},
-    {1288,  1,  52},
-    { 985,  1,  53},
-    { 760,  1,  54},
-    { 295,  1,  55},
-    {1289,  1,  56},
-    { 411,  1,  57},
-    { 496,  1,  57},
-    { 240,  1,  58},
-    {1244,  1,  59},
-    { 248,  1,  60},
-    { 805,  1,  61},
-    {1038,  1,  62},
-    { 468,  1,  63},
-    { 465,  1,  63},
-    { 599,  1,  64},
-    { 598,  1,  64},
-    {1246,  1,  65},
-    {1245,  1,  65},
-    {1359,  1,  66},
-    {1358,  1,  66},
-    {1111,  1,  67},
-    {1110,  1,  67},
-    {1112,  1,  68},
-    {1113,  1,  68},
-    { 413,  1,  69},
-    { 498,  1,  69},
-    { 787,  1,  70},
-    { 781,  1,  70},
-    { 624,  1,  71},
-    { 623,  1,  71},
-    { 592,  1,  72},
-    {1138,  1,  72},
-    {1253,  1,  73},
-    {1252,  1,  73},
-    { 454,  1,  74},
-    { 412,  1,  75},
-    { 497,  1,  75},
-    { 416,  1,  75},
-    { 807,  1,  76},
-    {1020,  1,  77},
-    { 219,  1,  78},
-    { 903,  1,  79},
-    { 904,  1,  79},
-    { 936,  1,  80},
-    { 941,  1,  80},
-    { 440,  1,  81},
-    {1054,  1,  82},
-    {1031,  1,  82},
-    { 540,  1,  83},
-    { 539,  1,  83},
-    { 282,  1,  84},
-    { 272,  1,  85},
-    { 593,  1,  86},
-    { 933,  1,  87},
-    { 940,  1,  87},
-    { 500,  1,  88},
-    { 931,  1,  89},
-    { 937,  1,  89},
-    {1255,  1,  90},
-    {1248,  1,  90},
-    { 289,  1,  91},
-    { 288,  1,  91},
-    {1256,  1,  92},
-    {1249,  1,  92},
-    { 932,  1,  93},
-    { 938,  1,  93},
-    {1258,  1,  94},
-    {1254,  1,  94},
-    { 934,  1,  95},
-    { 930,  1,  95},
-    { 604,  1,  96},
-    { 789,  1,  97},
-    { 783,  1,  97},
-    { 442,  1,  98},
-    { 601,  1,  99},
-    { 600,  1,  99},
-    {1320,  1, 100},
-    { 554,  1, 101},
-    { 552,  1, 101},
-    { 466,  1, 102},
-    { 463,  1, 102},
-    {1259,  1, 103},
-    {1265,  1, 103},
-    { 390,  1, 104},
-    { 389,  1, 104},
-    { 748,  1, 105},
-    { 747,  1, 105},
-    { 687,  1, 106},
-    { 683,  1, 106},
-    { 393,  1, 107},
-    { 392,  1, 107},
-    { 672,  1, 108},
-    { 751,  1, 109},
-    { 275,  1, 110},
-    { 645,  1, 111},
-    { 421,  1, 111},
-    { 746,  1, 112},
-    { 277,  1, 113},
-    { 276,  1, 113},
-    { 391,  1, 114},
-    { 754,  1, 115},
-    { 752,  1, 115},
-    { 544,  1, 116},
-    { 543,  1, 116},
-    { 377,  1, 117},
-    { 375,  1, 117},
-    { 395,  1, 118},
-    { 383,  1, 118},
-    {1405,  1, 119},
-    {1404,  1, 119},
-    { 394,  1, 120},
-    { 374,  1, 120},
-    {1407,  1, 121},
-    {1406,  1, 122},
-    { 821,  1, 123},
-    {1353,  1, 124},
-    { 467,  1, 125},
-    { 464,  1, 125},
-    { 242,  1, 126},
-    { 949,  1, 127},
-    { 790,  1, 128},
-    { 784,  1, 128},
-    {1273,  1, 129},
-    { 418,  1, 130},
-    { 698,  1, 130},
-    {1103,  1, 131},
-    {1181,  1, 132},
-    { 491,  1, 133},
-    { 490,  1, 133},
-    { 755,  1, 134},
-    {1153,  1, 135},
-    { 647,  1, 136},
-    { 722,  1, 136},
-    { 725,  1, 137},
-    { 966,  1, 138},
-    { 964,  1, 138},
-    { 360,  1, 139},
-    { 965,  1, 140},
-    { 963,  1, 140},
-    {1290,  1, 141},
-    { 918,  1, 142},
-    { 917,  1, 142},
-    { 555,  1, 143},
-    { 553,  1, 143},
-    { 791,  1, 144},
-    { 785,  1, 144},
-    { 369,  1, 145},
-    { 368,  1, 145},
-    { 916,  1, 146},
-    { 649,  1, 147},
-    { 644,  1, 147},
-    { 648,  1, 148},
-    { 723,  1, 148},
-    { 670,  1, 149},
-    { 668,  1, 150},
-    { 669,  1, 150},
-    { 830,  1, 151},
-    {1132,  1, 152},
-    {1136,  1, 152},
-    {1131,  1, 152},
-    { 379,  1, 153},
-    { 381,  1, 153},
-    { 191,  1, 154},
-    { 190,  1, 154},
-    { 212,  1, 155},
-    { 210,  1, 155},
-    {1356,  1, 156},
-    {1371,  1, 156},
-    {1362,  1, 157},
-    { 414,  1, 158},
-    { 638,  1, 158},
-    { 378,  1, 159},
-    { 376,  1, 159},
-    {1217,  1, 160},
-    {1216,  1, 160},
-    { 213,  1, 161},
-    { 211,  1, 161},
-    { 640,  1, 162},
-    { 637,  1, 162},
-    {1235,  1, 163},
-    { 817,  1, 164},
-    { 816,  1, 165},
-    { 172,  1, 166},
-    { 198,  1, 167},
-    { 199,  1, 168},
-    {1105,  1, 169},
-    {1104,  1, 169},
-    { 841,  1, 170},
-    { 312,  1, 171},
-    { 443,  1, 172},
-    {1041,  1, 173},
-    { 612,  1, 174},
-    {1043,  1, 175},
-    {1341,  1, 176},
-    {1044,  1, 177},
-    { 487,  1, 178},
-    {1200,  1, 179},
-    {1062,  1, 180},
-    {1059,  1, 181},
-    { 526,  1, 182},
-    { 317,  1, 183},
-    { 814,  1, 184},
-    { 461,  1, 185},
-    { 696,  1, 186},
-    {1086,  1, 187},
-    { 971,  1, 188},
-    { 658,  1, 189},
-    {1109,  1, 190},
-    { 843,  1, 191},
-    { 924,  1, 192},
-    { 923,  1, 193},
-    { 758,  1, 194},
-    {1046,  1, 195},
-    {1042,  1, 196},
-    { 868,  1, 197},
-    { 234,  1, 198},
-    { 710,  1, 199},
-    { 709,  1, 200},
-    {1135,  1, 201},
-    {1047,  1, 202},
-    {1040,  1, 203},
-    { 652,  1, 204},
-    {1169,  1, 205},
-    {1168,  1, 205},
-    {1045,  1, 206},
-    {1224,  1, 207},
-    { 528,  1, 208},
-    { 285,  1, 209},
-    { 738,  1, 210},
-    {1227,  1, 211},
-    { 359,  1, 212},
-    { 846,  1, 213},
-    {1199,  1, 214},
-    {1212,  1, 215},
-    { 763,  1, 216},
-    { 959,  1, 217},
-    { 764,  1, 218},
-    { 614,  1, 219},
-    { 983,  1, 220},
-    {1322,  1, 221},
-    {1206,  1, 222},
-    { 945,  1, 223},
-    { 954,  1, 224},
-    { 953,  1, 224},
-    {1294,  1, 225},
-    { 178,  1, 226},
-    { 502,  1, 227},
-    {1376,  1, 228},
-    { 974,  1, 229},
-    {1413,  1, 230},
-    {1229,  1, 231},
-    {1093,  1, 232},
-    { 259,  1, 233},
-    { 897,  1, 234},
-    { 899,  1, 235},
-    { 630,  1, 236},
-    { 851,  1, 237},
-    {1299,  1, 238},
-    {1298,  1, 238},
-    { 450,  1, 239},
-    { 452,  1, 240},
-    { 451,  1, 240},
-    { 516,  1, 241},
-    { 524,  1, 242},
-    { 523,  1, 243},
-    { 195,  1, 244},
-    { 244,  1, 245},
-    { 243,  1, 245},
-    { 955,  1, 246},
-    { 247,  1, 247},
-    {1084,  1, 248},
-    { 912,  1, 249},
-    { 925,  1, 250},
-    { 689,  1, 251},
-    { 688,  1, 251},
-    {1302,  1, 252},
-    {1303,  1, 253},
-    { 744,  1, 254},
-    { 743,  1, 254},
-    { 742,  1, 255},
-    { 741,  1, 255},
-    {1219,  1, 256},
-    {1218,  1, 256},
-    {1026,  1, 257},
-    { 513,  1, 258},
-    {1203,  1, 259},
-    { 300,  1, 260},
-    { 299,  1, 260},
-    { 961,  1, 261},
-    { 960,  1, 261},
-    { 197,  1, 262},
-    { 196,  1, 262},
-    { 906,  1, 263},
-    {1292,  1, 264},
-    {1291,  1, 264},
-    { 445,  1, 265},
-    { 444,  1, 265},
-    { 902,  1, 266},
-    { 901,  1, 266},
-    {1268,  1, 267},
-    { 606,  1, 268},
-    { 605,  1, 268},
-    {1029,  1, 269},
-    {1374,  1, 270},
-    { 920,  1, 271},
-    { 170,  1, 272},
-    { 700,  1, 273},
-    {1077,  1, 274},
-    { 208,  1, 275},
-    { 207,  1, 275},
-    { 849,  1, 276},
-    { 848,  1, 276},
-    { 504,  1, 277},
-    { 503,  1, 277},
-    {1115,  1, 278},
-    { 541,  1, 279},
-    { 542,  1, 279},
-    { 546,  1, 280},
-    { 545,  1, 280},
-    { 935,  1, 281},
-    { 939,  1, 281},
-    { 536,  1, 282},
-    {1057,  1, 283},
-    {1335,  1, 284},
-    {1334,  1, 284},
-    { 184,  1, 285},
-    { 183,  1, 285},
-    { 595,  1, 286},
-    { 594,  1, 286},
-    {1257,  1, 287},
-    {1250,  1, 287},
-    {1260,  1, 288},
-    {1266,  1, 288},
-    { 370,  1, 289},
-    {1276,  1, 290},
-    {1275,  1, 290},
-    { 396,  1, 291},
-    { 384,  1, 291},
-    { 397,  1, 292},
-    { 385,  1, 292},
-    { 398,  1, 293},
-    { 386,  1, 293},
-    { 399,  1, 294},
-    { 387,  1, 294},
-    { 400,  1, 295},
-    { 388,  1, 295},
-    { 380,  1, 296},
-    { 382,  1, 296},
-    {1286,  1, 297},
-    {1357,  1, 298},
-    {1372,  1, 298},
-    {1261,  1, 299},
-    {1263,  1, 299},
-    {1262,  1, 300},
-    {1264,  1, 300},
-    {1347,  2,   0},
-    {1424,  2,   0},
-    { 417,  2,   1},
-    {1423,  2,   1},
-    { 776,  2,   2},
-    { 792,  2,   2},
-    { 621,  2,   3},
-    { 625,  2,   3},
-    { 462,  2,   4},
-    { 472,  2,   4},
-    { 216,  2,   5},
-    { 218,  2,   5},
-    { 661,  2,   6},
-    { 660,  2,   6},
-    { 203,  2,   7},
-    { 202,  2,   7},
-    {1278,  2,   8},
-    {1277,  2,   8},
-    {1316,  2,   9},
-    {1315,  2,   9},
-    { 489,  2,  10},
-    { 488,  2,  10},
-    { 257,  2,  11},
-    { 256,  2,  11},
-    { 631,  2,  12},
-    { 632,  2,  12},
-    { 628,  2,  13},
-    { 629,  2,  13},
-    {1055,  2,  14},
-    {1058,  2,  14},
-    {1297,  2,  15},
-    {1300,  2,  15},
-    {1309,  2,  16},
-    {1308,  2,  16},
-    { 749,  2,  17},
-    { 765,  2,  17},
-    { 852,  2,  18},
-    { 943,  2,  18},
-    {1211,  2,  19},
-    {1210,  2,  19},
-    {1317,  2,  20},
-    { 774,  2,  21},
-    { 775,  2,  21},
-    {1318,  2,  22},
-    {1319,  2,  22},
-    { 962,  2,  23},
-    { 967,  2,  23},
-    { 597,  2,  24},
-    { 596,  2,  24},
-    { 644,  2,  25},
-    { 643,  2,  25},
-    { 551,  2,  26},
-    { 550,  2,  26},
-    { 367,  2,  27},
-    { 366,  2,  27},
-    { 305,  2,  28},
-    { 309,  2,  28},
-    {1034,  2,  29},
-    {1033,  2,  29},
-    {1170,  2,  30},
-    {1171,  2,  30},
-    { 759,  2,  31},
-    { 761,  2,  31},
-    { 952,  2,  32},
-    { 951,  2,  32},
-    { 672,  2,  33},
-    { 671,  2,  33},
-    { 751,  2,  34},
-    { 740,  2,  34},
-    { 275,  2,  35},
-    { 274,  2,  35},
-    { 642,  2,  36},
-    { 651,  2,  36},
-    {1402,  2,  37},
-    {1403,  2,  37},
-    {1041,  2,  38},
-    { 720,  2,  38},
-    { 612,  2,  39},
-    { 611,  2,  39},
-    { 487,  2,  40},
-    { 509,  2,  40},
-    { 703,  2,  41},
-    {1416,  2,  41},
-    {1141,  2,  41},
-    {1283,  2,  42},
-    {1314,  2,  42},
-    { 656,  2,  43},
-    { 655,  2,  43},
-    { 297,  2,  44},
-    { 296,  2,  44},
-    {1285,  2,  45},
-    {1284,  2,  45},
-    { 811,  2,  46},
-    { 810,  2,  46},
-    {1288,  2,  47},
-    {1295,  2,  47},
-    { 815,  2,  48},
-    { 813,  2,  48},
-    {1341,  2,  49},
-    {1340,  2,  49},
-    {1200,  2,  50},
-    {1201,  2,  50},
-    {1062,  2,  51},
-    {1061,  2,  51},
-    { 460,  2,  52},
-    { 447,  2,  52},
-    { 288,  2,  53},
-    { 287,  2,  53},
-    { 295,  2,  54},
-    { 294,  2,  54},
-    { 442,  2,  55},
-    { 441,  2,  55},
-    {1140,  2,  55},
-    { 985,  2,  56},
-    {1296,  2,  56},
-    { 604,  2,  57},
-    { 603,  2,  57},
-    {1320,  2,  58},
-    {1313,  2,  58},
-    {1273,  2,  59},
-    {1272,  2,  59},
-    {1044,  2,  60},
-    {1394,  2,  60},
-    { 758,  2,  61},
-    { 757,  2,  61},
-    { 240,  2,  62},
-    { 239,  2,  62},
-    { 450,  2,  63},
-    {1395,  2,  63},
-    {1109,  2,  64},
-    {1108,  2,  64},
-    {1103,  2,  65},
-    {1102,  2,  65},
-    { 996,  2,  66},
-    { 997,  2,  66},
-    {1244,  2,  67},
-    {1243,  2,  67},
-    { 805,  2,  68},
-    { 804,  2,  68},
-    {1038,  2,  69},
-    {1039,  2,  69},
-    {1353,  2,  70},
-    {1354,  2,  70},
-    {1181,  2,  71},
-    {1180,  2,  71},
-    { 755,  2,  72},
-    { 739,  2,  72},
-    {1153,  2,  73},
-    {1162,  2,  73},
-    { 841,  2,  74},
-    { 840,  2,  74},
-    { 312,  2,  75},
-    { 311,  2,  75},
-    { 843,  2,  76},
-    { 842,  2,  76},
-    { 360,  2,  77},
-    {1289,  2,  78},
-    { 773,  2,  78},
-    {1290,  2,  79},
-    {1304,  2,  79},
-    { 234,  2,  80},
-    { 235,  2,  80},
-    { 524,  2,  81},
-    { 522,  2,  81},
-    {1177,  2,  82},
-    {1178,  2,  82},
-    { 821,  2,  83},
-    { 242,  2,  84},
-    { 241,  2,  84},
-    { 725,  2,  85},
-    { 724,  2,  85},
-    { 916,  2,  86},
-    { 957,  2,  86},
-    { 696,  2,  87},
-    { 217,  2,  87},
-    {1046,  2,  88},
-    {1179,  2,  88},
-    { 710,  2,  89},
-    {1133,  2,  89},
-    { 709,  2,  90},
-    {1106,  2,  90},
-    {1047,  2,  91},
-    {1056,  2,  91},
-    { 738,  2,  92},
-    { 767,  2,  92},
-    { 248,  2,  93},
-    { 249,  2,  93},
-    { 285,  2,  94},
-    { 284,  2,  94},
-    { 865,  2,  95},
-    { 864,  2,  95},
-    { 359,  2,  96},
-    { 303,  2,  96},
-    { 923,  2,  97},
-    { 921,  2,  97},
-    { 924,  2,  98},
-    { 922,  2,  98},
-    { 925,  2,  99},
-    {1116,  2,  99},
-    {1199,  2, 100},
-    {1204,  2, 100},
-    {1227,  2, 101},
-    {1226,  2, 101},
-    {1294,  2, 102},
-    {1293,  2, 102},
-    { 317,  2, 103},
-    { 176,  2, 103},
-    { 247,  2, 104},
-    { 246,  2, 104},
-    { 513,  2, 105},
-    { 512,  2, 105},
-    { 526,  2, 106},
-    { 525,  2, 106},
-    { 614,  2, 107},
-    { 613,  2, 107},
-    {1084,  2, 108},
-    { 675,  2, 108},
-    { 763,  2, 109},
-    { 762,  2, 109},
-    { 814,  2, 110},
-    { 812,  2, 110},
-    { 846,  2, 111},
-    { 847,  2, 111},
-    { 868,  2, 112},
-    { 867,  2, 112},
-    { 920,  2, 113},
-    { 919,  2, 113},
-    { 945,  2, 114},
-    { 955,  2, 115},
-    { 956,  2, 115},
-    {1042,  2, 116},
-    { 976,  2, 116},
-    { 971,  2, 117},
-    { 979,  2, 117},
-    {1086,  2, 118},
-    {1085,  2, 118},
-    {1093,  2, 119},
-    {1092,  2, 119},
-    {1043,  2, 120},
-    {1100,  2, 120},
-    {1135,  2, 121},
-    {1107,  2, 121},
-    {1206,  2, 122},
-    {1205,  2, 122},
-    { 764,  2, 123},
-    {1208,  2, 123},
-    {1322,  2, 124},
-    {1321,  2, 124},
-    {1376,  2, 125},
-    {1375,  2, 125},
-    { 178,  2, 126},
-    { 195,  2, 127},
-    { 674,  2, 127},
-    { 658,  2, 128},
-    { 657,  2, 128},
-    { 959,  2, 129},
-    { 958,  2, 129},
-    {1040,  2, 130},
-    { 679,  2, 130},
-    {1207,  2, 131},
-    {1198,  2, 131},
-    { 170,  2, 132},
-    { 171,  2, 132},
-    { 259,  2, 133},
-    { 260,  2, 133},
-    { 897,  2, 134},
-    { 896,  2, 134},
-    { 983,  2, 135},
-    {1059,  2, 136},
-    {1060,  2, 136},
-    {1302,  2, 137},
-    {1301,  2, 137},
-    { 899,  2, 138},
-    { 610,  2, 138},
-    {1026,  2, 139},
-    {1014,  2, 139},
-    {1229,  2, 140},
-    {1228,  2, 140},
-    {1413,  2, 141},
-    {1414,  2, 141},
-    { 502,  2, 142},
-    { 501,  2, 142},
-    { 630,  2, 143},
-    { 609,  2, 143},
-    { 851,  2, 144},
-    { 850,  2, 144},
-    { 912,  2, 145},
-    { 913,  2, 145},
-    { 652,  2, 146},
-    {1166,  2, 146},
-    {1224,  2, 147},
-    {1223,  2, 147},
-    {1045,  2, 148},
-    {1225,  2, 148},
-    { 528,  2, 149},
-    { 527,  2, 149},
-    { 974,  2, 150},
-    { 973,  2, 150},
-    {1029,  2, 151},
-    { 676,  2, 151},
-    {1374,  2, 152},
-    {1379,  2, 152},
-    { 753,  2, 153},
-    { 677,  2, 153},
-    {1063,  3,   0},
-    {1396,  3,   0},
-    { 507,  3,   1},
-    { 508,  3,   1},
-    {1209,  3,   2},
-    {1236,  3,   2},
-    { 662,  3,   3},
-    { 673,  3,   3},
-    { 448,  3,   4},
-    { 809,  3,   5},
-    { 984,  3,   6},
-    { 998,  3,   6},
-    { 564,  3,   7},
-    {1150,  3,   8},
-    {1155,  3,   8},
-    { 580,  3,   9},
-    { 578,  3,   9},
-    { 751,  3,  10},
-    { 736,  3,  10},
-    { 186,  3,  11},
-    { 795,  3,  11},
-    { 926,  3,  12},
-    { 942,  3,  12},
-    { 927,  3,  13},
-    { 944,  3,  13},
-    { 928,  3,  14},
-    { 908,  3,  14},
-    {1022,  3,  15},
-    {1017,  3,  15},
-    { 567,  3,  16},
-    { 561,  3,  16},
-    {1421,  3,  17},
-    {1387,  3,  18},
-    { 519,  3,  19},
-    { 518,  3,  19},
-    { 520,  3,  20},
-    { 521,  3,  20},
-    { 530,  3,  21},
-    { 529,  3,  21},
-    { 608,  3,  22},
-    { 587,  3,  22},
-    {1063,  4,   0},
-    {1396,  4,   0},
-    {1128,  4,   1},
-    {1125,  4,   1},
-    { 448,  4,   2},
-    { 809,  4,   3},
-    { 439,  4,   4},
-    { 406,  4,   4},
-    { 564,  4,   5},
-    { 561,  4,   5},
-    {1150,  4,   6},
-    {1155,  4,   6},
-    {1233,  4,   7},
-    {1214,  4,   7},
-    { 769,  4,   8},
-    {1352,  4,   9},
-    {1282,  4,  10},
-    { 836,  4,  11},
-    { 838,  4,  12},
-    {1421,  4,  13},
-    { 519,  4,  14},
-    { 518,  4,  14},
-    { 520,  4,  15},
-    { 521,  4,  15},
-    { 530,  4,  16},
-    { 529,  4,  16},
-    { 608,  4,  17},
-    { 587,  4,  17},
-    {1063,  5,   0},
-    {1396,  5,   0},
-    { 448,  5,   1},
-    { 809,  5,   2},
-    { 564,  5,   3},
-    { 561,  5,   3},
-    {1195,  5,   4},
-    {1189,  5,   4},
-    { 580,  5,   5},
-    { 578,  5,   5},
-    {1230,  5,   6},
-    { 827,  5,   7},
-    { 824,  5,   7},
-    {1349,  5,   8},
-    {1348,  5,   8},
-    {1048,  5,   9},
-    { 795,  5,   9},
-    {1022,  5,  10},
-    {1017,  5,  10},
-    { 228,  5,  11},
-    { 223,  5,  11},
-    {1240,  5,  12},
-    {1239,  5,  12},
-    { 402,  5,  13},
-    { 401,  5,  13},
-    {1184,  5,  14},
-    {1183,  5,  14},
-    { 999,  6,   0},
-    { 968,  6,   0},
-    { 568,  6,   0},
-    { 569,  6,   0},
-    {1401,  6,   1},
-    {1397,  6,   1},
-    {1282,  6,   1},
-    {1336,  6,   1},
-    {1010,  7,   0},
-    { 970,  7,   0},
-    { 796,  7,   1},
-    { 769,  7,   1},
-    {1369,  7,   2},
-    {1352,  7,   2},
-    {1332,  7,   3},
-    {1282,  7,   3},
-    { 837,  7,   4},
-    { 836,  7,   4},
-    { 839,  7,   5},
-    { 838,  7,   5},
-    { 800,  8,   0},
-    { 769,  8,   0},
-    {1158,  8,   1},
-    {1148,  8,   1},
-    { 558,  8,   2},
-    { 537,  8,   2},
-    { 559,  8,   3},
-    { 548,  8,   3},
-    { 560,  8,   4},
-    { 549,  8,   4},
-    { 209,  8,   5},
-    { 194,  8,   5},
-    { 419,  8,   6},
-    { 449,  8,   6},
-    {1087,  8,   7},
-    { 236,  8,   7},
-    {1191,  8,   8},
-    {1172,  8,   8},
-    {1380,  8,   9},
-    {1386,  8,   9},
-    {1072,  8,  10},
-    {1051,  8,  10},
-    { 281,  8,  11},
-    { 273,  8,  11},
-    {1007,  8,  12},
-    {1015,  8,  12},
-    { 206,  8,  13},
-    { 181,  8,  13},
-    { 803,  8,  14},
-    { 833,  8,  14},
-    {1161,  8,  15},
-    {1165,  8,  15},
-    { 801,  8,  16},
-    { 831,  8,  16},
-    {1159,  8,  17},
-    {1163,  8,  17},
-    {1118,  8,  18},
-    {1097,  8,  18},
-    { 802,  8,  19},
-    { 832,  8,  19},
-    {1160,  8,  20},
-    {1164,  8,  20},
-    { 577,  8,  21},
-    { 583,  8,  21},
-    {1119,  8,  22},
-    {1098,  8,  22},
-    {1011,  9,   0},
-    {   1,  9,   0},
-    {1012,  9,   0},
-    {1080,  9,   1},
-    {   2,  9,   1},
-    {1079,  9,   1},
-    {1018,  9,   2},
-    { 142,  9,   2},
-    { 995,  9,   2},
-    { 745,  9,   3},
-    { 151,  9,   3},
-    { 768,  9,   3},
-    {1363,  9,   4},
-    { 158,  9,   4},
-    {1370,  9,   4},
-    { 321,  9,   5},
-    {  21,  9,   5},
-    { 324,  9,   6},
-    {  33,  9,   6},
-    { 326,  9,   7},
-    {  37,  9,   7},
-    { 329,  9,   8},
-    {  40,  9,   8},
-    { 333,  9,   9},
-    {  45,  9,   9},
-    { 334,  9,  10},
-    {  46,  9,  10},
-    { 335,  9,  11},
-    {  48,  9,  11},
-    { 336,  9,  12},
-    {  49,  9,  12},
-    { 337,  9,  13},
-    {  51,  9,  13},
-    { 338,  9,  14},
-    {  52,  9,  14},
-    { 339,  9,  15},
-    {  56,  9,  15},
-    { 340,  9,  16},
-    {  63,  9,  16},
-    { 341,  9,  17},
-    {  68,  9,  17},
-    { 342,  9,  18},
-    {  74,  9,  18},
-    { 343,  9,  19},
-    {  79,  9,  19},
-    { 344,  9,  20},
-    {  81,  9,  20},
-    { 345,  9,  21},
-    {  82,  9,  21},
-    { 346,  9,  22},
-    {  83,  9,  22},
-    { 347,  9,  23},
-    {  84,  9,  23},
-    { 348,  9,  24},
-    {  85,  9,  24},
-    { 349,  9,  25},
-    {  95,  9,  25},
-    { 350,  9,  26},
-    { 100,  9,  26},
-    { 351,  9,  27},
-    { 101,  9,  27},
-    { 352,  9,  28},
-    { 102,  9,  28},
-    { 353,  9,  29},
-    { 103,  9,  29},
-    { 354,  9,  30},
-    { 104,  9,  30},
-    { 355,  9,  31},
-    { 105,  9,  31},
-    { 356,  9,  32},
-    { 157,  9,  32},
-    { 357,  9,  33},
-    { 165,  9,  33},
-    { 322,  9,  34},
-    {  31,  9,  34},
-    { 323,  9,  35},
-    {  32,  9,  35},
-    { 325,  9,  36},
-    {  36,  9,  36},
-    { 327,  9,  37},
-    {  38,  9,  37},
-    { 328,  9,  38},
-    {  39,  9,  38},
-    { 330,  9,  39},
-    {  42,  9,  39},
-    { 331,  9,  40},
-    {  43,  9,  40},
-    { 231,  9,  41},
-    {  62,  9,  41},
-    { 226,  9,  41},
-    { 229,  9,  42},
-    {  64,  9,  42},
-    { 224,  9,  42},
-    { 230,  9,  43},
-    {  65,  9,  43},
-    { 225,  9,  43},
-    { 254,  9,  44},
-    {  67,  9,  44},
-    { 268,  9,  44},
-    { 253,  9,  45},
-    {  69,  9,  45},
-    { 236,  9,  45},
-    { 255,  9,  46},
-    {  70,  9,  46},
-    { 283,  9,  46},
-    { 797,  9,  47},
-    {  71,  9,  47},
-    { 769,  9,  47},
-    {1156,  9,  48},
-    {  72,  9,  48},
-    {1148,  9,  48},
-    { 168,  9,  49},
-    {  73,  9,  49},
-    { 181,  9,  49},
-    { 167,  9,  50},
-    {  75,  9,  50},
-    { 166,  9,  50},
-    { 169,  9,  51},
-    {  76,  9,  51},
-    { 201,  9,  51},
-    { 506,  9,  52},
-    {  77,  9,  52},
-    { 479,  9,  52},
-    { 505,  9,  53},
-    {  78,  9,  53},
-    { 474,  9,  53},
-    { 714,  9,  54},
-    {  80,  9,  54},
-    { 717,  9,  54},
-    { 332,  9,  55},
-    {  44,  9,  55},
-    { 232,  9,  56},
-    {  57,  9,  56},
-    { 227,  9,  56},
-    {1004, 10,   0},
-    { 307, 10,   1},
-    { 304, 10,   1},
-    { 420, 10,   2},
-    { 409, 10,   2},
-    { 579, 10,   3},
-    {1001, 10,   4},
-    { 978, 10,   4},
-    { 705, 10,   5},
-    { 704, 10,   5},
-    { 914, 10,   6},
-    { 911, 10,   6},
-    { 574, 10,   7},
-    { 573, 10,   7},
-    { 719, 10,   8},
-    { 718, 10,   8},
-    { 372, 10,   9},
-    { 538, 10,   9},
-    {1251, 10,  10},
-    {1247, 10,  10},
-    {1242, 10,  11},
-    {1361, 10,  12},
-    {1360, 10,  12},
-    {1381, 10,  13},
-    { 977, 10,  14},
-    { 975, 10,  14},
-    {1215, 10,  15},
-    {1220, 10,  15},
-    {1238, 10,  16},
-    {1237, 10,  16},
-    { 582, 10,  17},
-    { 581, 10,  17},
-    { 982, 11,   0},
-    { 968, 11,   0},
-    { 193, 11,   1},
-    { 166, 11,   1},
-    { 639, 11,   2},
-    { 633, 11,   2},
-    {1381, 11,   3},
-    {1373, 11,   3},
-    { 584, 11,   4},
-    { 568, 11,   4},
-    { 977, 11,   5},
-    { 970, 11,   5},
-    {1002, 12,   0},
-    { 180, 12,   1},
-    { 182, 12,   2},
-    { 185, 12,   3},
-    { 252, 12,   4},
-    { 258, 12,   5},
-    { 475, 12,   6},
-    { 476, 12,   7},
-    { 514, 12,   8},
-    { 572, 12,   9},
-    { 576, 12,  10},
-    { 585, 12,  11},
-    { 586, 12,  12},
-    { 636, 12,  13},
-    { 641, 12,  14},
-    {1307, 12,  14},
-    { 659, 12,  15},
-    { 663, 12,  16},
-    { 664, 12,  17},
-    { 665, 12,  18},
-    { 737, 12,  19},
-    { 750, 12,  20},
-    { 766, 12,  21},
-    { 771, 12,  22},
-    { 772, 12,  23},
-    { 915, 12,  24},
-    { 929, 12,  25},
-    {1009, 12,  26},
-    {1025, 12,  27},
-    {1099, 12,  28},
-    {1142, 12,  29},
-    {1143, 12,  30},
-    {1152, 12,  31},
-    {1154, 12,  32},
-    {1175, 12,  33},
-    {1176, 12,  34},
-    {1190, 12,  35},
-    {1192, 12,  36},
-    {1202, 12,  37},
-    {1269, 12,  38},
-    {1287, 12,  39},
-    {1305, 12,  40},
-    {1306, 12,  41},
-    {1312, 12,  42},
-    {1377, 12,  43},
-    {1281, 12,  44},
-    {1398, 12,  45},
-    {1399, 12,  46},
-    {1400, 12,  47},
-    {1408, 12,  48},
-    {1409, 12,  49},
-    {1412, 12,  50},
-    {1415, 12,  51},
-    { 756, 12,  52},
-    { 571, 12,  53},
-    { 298, 12,  54},
-    { 570, 12,  55},
-    {1028, 12,  56},
-    {1167, 12,  57},
-    {1241, 12,  58},
-    { 869, 12,  59},
-    { 870, 12,  60},
-    { 871, 12,  61},
-    { 872, 12,  62},
-    { 873, 12,  63},
-    { 874, 12,  64},
-    { 875, 12,  65},
-    { 876, 12,  66},
-    { 877, 12,  67},
-    { 878, 12,  68},
-    { 879, 12,  69},
-    { 880, 12,  70},
-    { 881, 12,  71},
-    { 882, 12,  72},
-    { 883, 12,  73},
-    { 884, 12,  74},
-    { 885, 12,  75},
-    { 886, 12,  76},
-    { 887, 12,  77},
-    { 888, 12,  78},
-    { 889, 12,  79},
-    { 890, 12,  80},
-    { 891, 12,  81},
-    { 892, 12,  82},
-    { 893, 12,  83},
-    { 894, 12,  84},
-    { 895, 12,  85},
-    { 173, 12,  86},
-    { 175, 12,  87},
-    { 174, 12,  88},
-    { 857, 12,  89},
-    { 854, 12,  90},
-    { 860, 12,  91},
-    { 863, 12,  92},
-    { 858, 12,  93},
-    { 859, 12,  94},
-    { 853, 12,  95},
-    { 861, 12,  96},
-    { 855, 12,  97},
-    { 856, 12,  98},
-    { 862, 12,  99},
-    { 654, 12, 100},
-    { 653, 12, 101},
-    {1006, 13,   0},
-    {1337, 13,   0},
-    { 729, 13,   1},
-    { 301, 13,   1},
-    { 511, 13,   2},
-    { 473, 13,   2},
-    {1157, 13,   3},
-    {1148, 13,   3},
-    { 799, 13,   4},
-    { 769, 13,   4},
-    {1333, 13,   5},
-    {1282, 13,   5},
-    {1347, 14,   0},
-    {1396, 14,   0},
-    {1053, 14,   1},
-    {1052, 14,   1},
-    { 404, 14,   2},
-    { 401, 14,   2},
-    {1146, 14,   3},
-    {1145, 14,   3},
-    { 607, 14,   4},
-    { 602, 14,   4},
-    {1008, 14,   5},
-    {1013, 14,   5},
-    { 562, 14,   6},
-    { 561, 14,   6},
-    { 293, 14,   7},
-    {1270, 14,   7},
-    { 702, 14,   8},
-    { 717, 14,   8},
-    {1127, 14,   9},
-    {1126, 14,   9},
-    {1124, 14,  10},
-    {1117, 14,  10},
-    {1022, 14,  11},
-    {1017, 14,  11},
-    { 189, 14,  12},
-    { 181, 14,  12},
-    { 686, 14,  13},
-    { 682, 14,  13},
-    { 711, 14,  14},
-    { 697, 14,  14},
-    { 712, 14,  14},
-    { 681, 14,  15},
-    { 680, 14,  15},
-    { 415, 14,  16},
-    { 405, 14,  16},
-    { 291, 14,  17},
-    { 250, 14,  17},
-    { 290, 14,  18},
-    { 238, 14,  18},
-    {1231, 14,  19},
-    {1230, 14,  19},
-    { 866, 14,  20},
-    { 267, 14,  20},
-    { 313, 14,  21},
-    { 448, 14,  21},
-    { 819, 14,  22},
-    { 809, 14,  22},
-    { 438, 14,  23},
-    { 318, 14,  23},
-    { 422, 14,  24},
-    {1174, 14,  24},
-    { 193, 14,  25},
-    { 179, 14,  25},
-    { 292, 14,  26},
-    { 237, 14,  26},
-    {1267, 14,  27},
-    {1197, 14,  27},
-    {1422, 14,  28},
-    {1420, 14,  28},
-    { 986, 14,  29},
-    { 998, 14,  29},
-    {1385, 14,  30},
-    {1382, 14,  30},
-    { 727, 14,  31},
-    { 735, 14,  32},
-    { 734, 14,  33},
-    { 634, 14,  34},
-    { 635, 14,  35},
-    { 403, 14,  36},
-    { 446, 14,  36},
-    { 662, 14,  37},
-    { 673, 14,  37},
-    { 423, 14,  38},
-    { 373, 14,  38},
-    {1150, 14,  39},
-    {1155, 14,  39},
-    { 519, 14,  40},
-    { 518, 14,  40},
-    { 530, 14,  41},
-    { 529, 14,  41},
-    {1421, 14,  42},
-    {1004, 15,   0},
-    {1022, 15,   1},
-    {1017, 15,   1},
-    { 499, 15,   2},
-    { 492, 15,   2},
-    { 481, 15,   3},
-    { 480, 15,   3},
-    { 972, 16,   0},
-    {   0, 16,   1},
-    {   1, 16,   2},
-    {  11, 16,   3},
-    {   6, 16,   4},
-    {  19, 16,   5},
-    {  16, 16,   6},
-    {  13, 16,   7},
-    {  10, 16,   8},
-    {  94, 16,   9},
-    {  92, 16,  10},
-    {   8, 16,  11},
-    {   5, 16,  12},
-    {   4, 16,  13},
-    {   3, 16,  14},
-    {  20, 16,  15},
-    {  18, 16,  16},
-    {  17, 16,  17},
-    {  89, 16,  18},
-    {  15, 16,  19},
-    {  87, 16,  20},
-    {  14, 16,  21},
-    {  12, 16,  22},
-    {   9, 16,  23},
-    {  93, 16,  24},
-    {  55, 16,  25},
-    { 127, 16,  26},
-    {   7, 16,  27},
-    { 143, 16,  28},
-    {  91, 16,  29},
-    { 130, 16,  30},
-    {  54, 16,  31},
-    {  90, 16,  32},
-    { 110, 16,  33},
-    { 129, 16,  34},
-    { 145, 16,  35},
-    {  34, 16,  36},
-    {   2, 16,  37},
-    {  88, 16,  38},
-    {  53, 16,  39},
-    { 128, 16,  40},
-    {  86, 16,  41},
-    { 144, 16,  42},
-    { 109, 16,  43},
-    { 159, 16,  44},
-    { 126, 16,  45},
-    {  35, 16,  46},
-    { 136, 16,  47},
-    {  41, 16,  48},
-    { 142, 16,  49},
-    {  47, 16,  50},
-    { 151, 16,  51},
-    {  50, 16,  52},
-    { 158, 16,  53},
-    {  21, 16,  54},
-    {  33, 16,  55},
-    {  37, 16,  56},
-    {  40, 16,  57},
-    {  45, 16,  58},
-    {  46, 16,  59},
-    {  48, 16,  60},
-    {  49, 16,  61},
-    {  51, 16,  62},
-    {  52, 16,  63},
-    {  56, 16,  64},
-    {  63, 16,  65},
-    {  68, 16,  66},
-    {  74, 16,  67},
-    {  79, 16,  68},
-    {  81, 16,  69},
-    {  82, 16,  70},
-    {  83, 16,  71},
-    {  84, 16,  72},
-    {  85, 16,  73},
-    {  95, 16,  74},
-    { 100, 16,  75},
-    { 101, 16,  76},
-    { 102, 16,  77},
-    { 103, 16,  78},
-    { 104, 16,  79},
-    { 105, 16,  80},
-    { 106, 16,  81},
-    { 107, 16,  82},
-    { 108, 16,  83},
-    { 111, 16,  84},
-    { 116, 16,  85},
-    { 117, 16,  86},
-    { 118, 16,  87},
-    { 120, 16,  88},
-    { 121, 16,  89},
-    { 122, 16,  90},
-    { 123, 16,  91},
-    { 124, 16,  92},
-    { 125, 16,  93},
-    { 131, 16,  94},
-    { 137, 16,  95},
-    { 146, 16,  96},
-    { 152, 16,  97},
-    { 160, 16,  98},
-    {  22, 16,  99},
-    {  57, 16, 100},
-    {  96, 16, 101},
-    { 112, 16, 102},
-    { 132, 16, 103},
-    { 138, 16, 104},
-    { 147, 16, 105},
-    { 153, 16, 106},
-    { 161, 16, 107},
-    {  23, 16, 108},
-    {  58, 16, 109},
-    {  97, 16, 110},
-    { 113, 16, 111},
-    { 133, 16, 112},
-    { 139, 16, 113},
-    { 148, 16, 114},
-    { 154, 16, 115},
-    { 162, 16, 116},
-    {  24, 16, 117},
-    {  59, 16, 118},
-    {  98, 16, 119},
-    { 114, 16, 120},
-    { 134, 16, 121},
-    { 140, 16, 122},
-    { 149, 16, 123},
-    { 155, 16, 124},
-    { 163, 16, 125},
-    {  25, 16, 126},
-    {  60, 16, 127},
-    {  66, 16, 128},
-    {  99, 16, 129},
-    { 115, 16, 130},
-    { 119, 16, 131},
-    { 135, 16, 132},
-    { 141, 16, 133},
-    { 150, 16, 134},
-    { 156, 16, 135},
-    { 164, 16, 136},
-    {  26, 16, 137},
-    {  27, 16, 138},
-    {  61, 16, 139},
-    {  28, 16, 140},
-    {  29, 16, 141},
-    {  30, 16, 142},
-    { 970, 17,   0},
-    {1156, 17,   1},
-    { 797, 17,   2},
-    {1365, 17,   3},
-    { 798, 17,   4},
-    {1326, 17,   5},
-    { 278, 17,   6},
-    {1327, 17,   7},
-    {1331, 17,   8},
-    {1329, 17,   9},
-    {1330, 17,  10},
-    { 280, 17,  11},
-    { 279, 17,  12},
-    {1328, 17,  13},
-    {1081, 17,  14},
-    {1063, 18,   0},
-    { 266, 18,   1},
-    {1364, 18,   2},
-    { 233, 18,   3},
-    {1018, 18,   4},
-    {1363, 18,   5},
-    {1139, 18,   6},
-    { 713, 18,   7},
-    {1368, 18,   8},
-    {1367, 18,   9},
-    {1366, 18,  10},
-    { 432, 18,  11},
-    { 425, 18,  12},
-    { 426, 18,  13},
-    { 437, 18,  14},
-    { 434, 18,  15},
-    { 433, 18,  16},
-    { 429, 18,  17},
-    { 436, 18,  18},
-    { 435, 18,  19},
-    { 431, 18,  20},
-    { 427, 18,  21},
-    { 428, 18,  22},
-    { 950, 18,  23},
-    {1324, 18,  24},
-    {1325, 18,  25},
-    { 590, 18,  26},
-    { 310, 18,  27},
-    {1151, 18,  28},
-    {1271, 18,  29},
-    { 430, 18,  30},
-    {1005, 18,  31},
-    { 731, 18,  32},
-    {1021, 18,  33},
-    {1019, 18,  34},
-    { 286, 18,  35},
-    { 999, 19,   0},
-    {1401, 19,   1},
-    {1401, 20,   0},
-    {1397, 20,   0},
-    { 999, 20,   1},
-    { 968, 20,   1},
-    {1401, 21,   0},
-    {1397, 21,   0},
-    { 999, 21,   1},
-    { 968, 21,   1},
-    { 907, 21,   2},
-    { 844, 21,   2},
+    {1015,  0,   0}, /* NO */
+    { 984,  0,   0}, /* N */
+    { 578,  0,   0}, /* F */
+    { 579,  0,   0}, /* FALSE */
+    {1421,  0,   1}, /* YES */
+    {1417,  0,   1}, /* Y */
+    {1299,  0,   1}, /* T */
+    {1356,  0,   1}, /* TRUE */
+    { 814,  1,   0}, /* LEFTTORIGHT */
+    { 783,  1,   0}, /* L */
+    { 281,  1,   1}, /* BOUNDARYNEUTRAL */
+    { 273,  1,   1}, /* BN */
+    {1207,  1,   2}, /* SEGMENTSEPARATOR */
+    {1188,  1,   2}, /* S */
+    {1103,  1,   3}, /* PARAGRAPHSEPARATOR */
+    { 236,  1,   3}, /* B */
+    {1400,  1,   4}, /* WHITESPACE */
+    {1406,  1,   4}, /* WS */
+    {1088,  1,   5}, /* OTHERNEUTRAL */
+    {1067,  1,   5}, /* ON */
+    { 569,  1,   6}, /* EUROPEANTERMINATOR */
+    { 558,  1,   6}, /* ET */
+    { 568,  1,   7}, /* EUROPEANSEPARATOR */
+    { 557,  1,   7}, /* ES */
+    { 423,  1,   8}, /* COMMONSEPARATOR */
+    { 453,  1,   8}, /* CS */
+    { 567,  1,   9}, /* EUROPEANNUMBER */
+    { 545,  1,   9}, /* EN */
+    {1023,  1,  10}, /* NONSPACINGMARK */
+    {1031,  1,  10}, /* NSM */
+    {1174,  1,  11}, /* RIGHTTOLEFT */
+    {1164,  1,  11}, /* R */
+    { 209,  1,  12}, /* ARABICNUMBER */
+    { 194,  1,  12}, /* AN */
+    { 206,  1,  13}, /* ARABICLETTER */
+    { 181,  1,  13}, /* AL */
+    { 815,  1,  14}, /* LEFTTORIGHTEMBEDDING */
+    { 847,  1,  14}, /* LRE */
+    {1175,  1,  15}, /* RIGHTTOLEFTEMBEDDING */
+    {1179,  1,  15}, /* RLE */
+    {1134,  1,  16}, /* POPDIRECTIONALFORMAT */
+    {1113,  1,  16}, /* PDF */
+    { 817,  1,  17}, /* LEFTTORIGHTOVERRIDE */
+    { 849,  1,  17}, /* LRO */
+    {1177,  1,  18}, /* RIGHTTOLEFTOVERRIDE */
+    {1181,  1,  18}, /* RLO */
+    { 816,  1,  19}, /* LEFTTORIGHTISOLATE */
+    { 848,  1,  19}, /* LRI */
+    {1176,  1,  20}, /* RIGHTTOLEFTISOLATE */
+    {1180,  1,  20}, /* RLI */
+    { 587,  1,  21}, /* FIRSTSTRONGISOLATE */
+    { 593,  1,  21}, /* FSI */
+    {1135,  1,  22}, /* POPDIRECTIONALISOLATE */
+    {1114,  1,  22}, /* PDI */
+    {1016,  2,   0}, /* NOBLOCK */
+    { 994,  2,   0}, /* NB */
+    { 245,  2,   1}, /* BASICLATIN */
+    { 220,  2,   1}, /* ASCII */
+    { 793,  2,   2}, /* LATIN1SUPPLEMENT */
+    { 792,  2,   2}, /* LATIN1SUP */
+    { 791,  2,   2}, /* LATIN1 */
+    { 800,  2,   3}, /* LATINEXTENDEDA */
+    { 794,  2,   3}, /* LATINEXTA */
+    { 802,  2,   4}, /* LATINEXTENDEDB */
+    { 796,  2,   4}, /* LATINEXTB */
+    { 728,  2,   5}, /* IPAEXTENSIONS */
+    { 727,  2,   5}, /* IPAEXT */
+    {1250,  2,   6}, /* SPACINGMODIFIERLETTERS */
+    { 963,  2,   6}, /* MODIFIERLETTERS */
+    { 414,  2,   7}, /* COMBININGDIACRITICALMARKS */
+    { 499,  2,   7}, /* DIACRITICALS */
+    { 632,  2,   8}, /* GREEKANDCOPTIC */
+    { 631,  2,   8}, /* GREEK */
+    { 466,  2,   9}, /* CYRILLIC */
+    { 474,  2,  10}, /* CYRILLICSUPPLEMENT */
+    { 473,  2,  10}, /* CYRILLICSUP */
+    { 475,  2,  10}, /* CYRILLICSUPPLEMENTARY */
+    { 216,  2,  11}, /* ARMENIAN */
+    { 673,  2,  12}, /* HEBREW */
+    { 203,  2,  13}, /* ARABIC */
+    {1295,  2,  14}, /* SYRIAC */
+    { 215,  2,  15}, /* ARABICSUPPLEMENT */
+    { 214,  2,  15}, /* ARABICSUP */
+    {1335,  2,  16}, /* THAANA */
+    {1012,  2,  17}, /* NKO */
+    {1193,  2,  18}, /* SAMARITAN */
+    { 881,  2,  19}, /* MANDAIC */
+    {1297,  2,  20}, /* SYRIACSUPPLEMENT */
+    {1296,  2,  20}, /* SYRIACSUP */
+    { 205,  2,  21}, /* ARABICEXTENDEDA */
+    { 204,  2,  21}, /* ARABICEXTA */
+    { 493,  2,  22}, /* DEVANAGARI */
+    { 257,  2,  23}, /* BENGALI */
+    { 641,  2,  24}, /* GURMUKHI */
+    { 638,  2,  25}, /* GUJARATI */
+    {1071,  2,  26}, /* ORIYA */
+    {1314,  2,  27}, /* TAMIL */
+    {1328,  2,  28}, /* TELUGU */
+    { 761,  2,  29}, /* KANNADA */
+    { 868,  2,  30}, /* MALAYALAM */
+    {1227,  2,  31}, /* SINHALA */
+    {1336,  2,  32}, /* THAI */
+    { 788,  2,  33}, /* LAO */
+    {1337,  2,  34}, /* TIBETAN */
+    { 978,  2,  35}, /* MYANMAR */
+    { 607,  2,  36}, /* GEORGIAN */
+    { 656,  2,  37}, /* HANGULJAMO */
+    { 733,  2,  37}, /* JAMO */
+    { 560,  2,  38}, /* ETHIOPIC */
+    { 566,  2,  39}, /* ETHIOPICSUPPLEMENT */
+    { 565,  2,  39}, /* ETHIOPICSUP */
+    { 367,  2,  40}, /* CHEROKEE */
+    {1364,  2,  41}, /* UNIFIEDCANADIANABORIGINALSYLLABICS */
+    {1358,  2,  41}, /* UCAS */
+    { 306,  2,  41}, /* CANADIANSYLLABICS */
+    {1050,  2,  42}, /* OGHAM */
+    {1186,  2,  43}, /* RUNIC */
+    {1300,  2,  44}, /* TAGALOG */
+    { 668,  2,  45}, /* HANUNOO */
+    { 297,  2,  46}, /* BUHID */
+    {1302,  2,  47}, /* TAGBANWA */
+    { 772,  2,  48}, /* KHMER */
+    { 968,  2,  49}, /* MONGOLIAN */
+    {1365,  2,  50}, /* UNIFIEDCANADIANABORIGINALSYLLABICSEXTENDED */
+    {1359,  2,  50}, /* UCASEXT */
+    { 825,  2,  51}, /* LIMBU */
+    {1305,  2,  52}, /* TAILE */
+    {1001,  2,  53}, /* NEWTAILUE */
+    { 773,  2,  54}, /* KHMERSYMBOLS */
+    { 295,  2,  55}, /* BUGINESE */
+    {1306,  2,  56}, /* TAITHAM */
+    { 415,  2,  57}, /* COMBININGDIACRITICALMARKSEXTENDED */
+    { 500,  2,  57}, /* DIACRITICALSEXT */
+    { 240,  2,  58}, /* BALINESE */
+    {1260,  2,  59}, /* SUNDANESE */
+    { 248,  2,  60}, /* BATAK */
+    { 819,  2,  61}, /* LEPCHA */
+    {1054,  2,  62}, /* OLCHIKI */
+    { 472,  2,  63}, /* CYRILLICEXTENDEDC */
+    { 469,  2,  63}, /* CYRILLICEXTC */
+    { 609,  2,  64}, /* GEORGIANEXTENDED */
+    { 608,  2,  64}, /* GEORGIANEXT */
+    {1262,  2,  65}, /* SUNDANESESUPPLEMENT */
+    {1261,  2,  65}, /* SUNDANESESUP */
+    {1379,  2,  66}, /* VEDICEXTENSIONS */
+    {1378,  2,  66}, /* VEDICEXT */
+    {1127,  2,  67}, /* PHONETICEXTENSIONS */
+    {1126,  2,  67}, /* PHONETICEXT */
+    {1128,  2,  68}, /* PHONETICEXTENSIONSSUPPLEMENT */
+    {1129,  2,  68}, /* PHONETICEXTSUP */
+    { 417,  2,  69}, /* COMBININGDIACRITICALMARKSSUPPLEMENT */
+    { 502,  2,  69}, /* DIACRITICALSSUP */
+    { 801,  2,  70}, /* LATINEXTENDEDADDITIONAL */
+    { 795,  2,  70}, /* LATINEXTADDITIONAL */
+    { 634,  2,  71}, /* GREEKEXTENDED */
+    { 633,  2,  71}, /* GREEKEXT */
+    { 602,  2,  72}, /* GENERALPUNCTUATION */
+    {1154,  2,  72}, /* PUNCTUATION */
+    {1269,  2,  73}, /* SUPERSCRIPTSANDSUBSCRIPTS */
+    {1268,  2,  73}, /* SUPERANDSUB */
+    { 458,  2,  74}, /* CURRENCYSYMBOLS */
+    { 416,  2,  75}, /* COMBININGDIACRITICALMARKSFORSYMBOLS */
+    { 501,  2,  75}, /* DIACRITICALSFORSYMBOLS */
+    { 420,  2,  75}, /* COMBININGMARKSFORSYMBOLS */
+    { 821,  2,  76}, /* LETTERLIKESYMBOLS */
+    {1036,  2,  77}, /* NUMBERFORMS */
+    { 219,  2,  78}, /* ARROWS */
+    { 919,  2,  79}, /* MATHEMATICALOPERATORS */
+    { 920,  2,  79}, /* MATHOPERATORS */
+    { 952,  2,  80}, /* MISCELLANEOUSTECHNICAL */
+    { 957,  2,  80}, /* MISCTECHNICAL */
+    { 444,  2,  81}, /* CONTROLPICTURES */
+    {1070,  2,  82}, /* OPTICALCHARACTERRECOGNITION */
+    {1047,  2,  82}, /* OCR */
+    { 548,  2,  83}, /* ENCLOSEDALPHANUMERICS */
+    { 547,  2,  83}, /* ENCLOSEDALPHANUM */
+    { 282,  2,  84}, /* BOXDRAWING */
+    { 272,  2,  85}, /* BLOCKELEMENTS */
+    { 603,  2,  86}, /* GEOMETRICSHAPES */
+    { 949,  2,  87}, /* MISCELLANEOUSSYMBOLS */
+    { 956,  2,  87}, /* MISCSYMBOLS */
+    { 505,  2,  88}, /* DINGBATS */
+    { 947,  2,  89}, /* MISCELLANEOUSMATHEMATICALSYMBOLSA */
+    { 953,  2,  89}, /* MISCMATHSYMBOLSA */
+    {1271,  2,  90}, /* SUPPLEMENTALARROWSA */
+    {1264,  2,  90}, /* SUPARROWSA */
+    { 289,  2,  91}, /* BRAILLEPATTERNS */
+    { 288,  2,  91}, /* BRAILLE */
+    {1272,  2,  92}, /* SUPPLEMENTALARROWSB */
+    {1265,  2,  92}, /* SUPARROWSB */
+    { 948,  2,  93}, /* MISCELLANEOUSMATHEMATICALSYMBOLSB */
+    { 954,  2,  93}, /* MISCMATHSYMBOLSB */
+    {1274,  2,  94}, /* SUPPLEMENTALMATHEMATICALOPERATORS */
+    {1270,  2,  94}, /* SUPMATHOPERATORS */
+    { 950,  2,  95}, /* MISCELLANEOUSSYMBOLSANDARROWS */
+    { 946,  2,  95}, /* MISCARROWS */
+    { 614,  2,  96}, /* GLAGOLITIC */
+    { 803,  2,  97}, /* LATINEXTENDEDC */
+    { 797,  2,  97}, /* LATINEXTC */
+    { 446,  2,  98}, /* COPTIC */
+    { 611,  2,  99}, /* GEORGIANSUPPLEMENT */
+    { 610,  2,  99}, /* GEORGIANSUP */
+    {1339,  2, 100}, /* TIFINAGH */
+    { 563,  2, 101}, /* ETHIOPICEXTENDED */
+    { 561,  2, 101}, /* ETHIOPICEXT */
+    { 470,  2, 102}, /* CYRILLICEXTENDEDA */
+    { 467,  2, 102}, /* CYRILLICEXTA */
+    {1275,  2, 103}, /* SUPPLEMENTALPUNCTUATION */
+    {1281,  2, 103}, /* SUPPUNCTUATION */
+    { 393,  2, 104}, /* CJKRADICALSSUPPLEMENT */
+    { 392,  2, 104}, /* CJKRADICALSSUP */
+    { 760,  2, 105}, /* KANGXIRADICALS */
+    { 759,  2, 105}, /* KANGXI */
+    { 699,  2, 106}, /* IDEOGRAPHICDESCRIPTIONCHARACTERS */
+    { 695,  2, 106}, /* IDC */
+    { 396,  2, 107}, /* CJKSYMBOLSANDPUNCTUATION */
+    { 395,  2, 107}, /* CJKSYMBOLS */
+    { 684,  2, 108}, /* HIRAGANA */
+    { 763,  2, 109}, /* KATAKANA */
+    { 275,  2, 110}, /* BOPOMOFO */
+    { 655,  2, 111}, /* HANGULCOMPATIBILITYJAMO */
+    { 425,  2, 111}, /* COMPATJAMO */
+    { 758,  2, 112}, /* KANBUN */
+    { 277,  2, 113}, /* BOPOMOFOEXTENDED */
+    { 276,  2, 113}, /* BOPOMOFOEXT */
+    { 394,  2, 114}, /* CJKSTROKES */
+    { 766,  2, 115}, /* KATAKANAPHONETICEXTENSIONS */
+    { 764,  2, 115}, /* KATAKANAEXT */
+    { 552,  2, 116}, /* ENCLOSEDCJKLETTERSANDMONTHS */
+    { 551,  2, 116}, /* ENCLOSEDCJK */
+    { 379,  2, 117}, /* CJKCOMPATIBILITY */
+    { 377,  2, 117}, /* CJKCOMPAT */
+    { 398,  2, 118}, /* CJKUNIFIEDIDEOGRAPHSEXTENSIONA */
+    { 385,  2, 118}, /* CJKEXTA */
+    {1427,  2, 119}, /* YIJINGHEXAGRAMSYMBOLS */
+    {1426,  2, 119}, /* YIJING */
+    { 397,  2, 120}, /* CJKUNIFIEDIDEOGRAPHS */
+    { 376,  2, 120}, /* CJK */
+    {1429,  2, 121}, /* YISYLLABLES */
+    {1428,  2, 122}, /* YIRADICALS */
+    { 835,  2, 123}, /* LISU */
+    {1373,  2, 124}, /* VAI */
+    { 471,  2, 125}, /* CYRILLICEXTENDEDB */
+    { 468,  2, 125}, /* CYRILLICEXTB */
+    { 242,  2, 126}, /* BAMUM */
+    { 965,  2, 127}, /* MODIFIERTONELETTERS */
+    { 804,  2, 128}, /* LATINEXTENDEDD */
+    { 798,  2, 128}, /* LATINEXTD */
+    {1289,  2, 129}, /* SYLOTINAGRI */
+    { 422,  2, 130}, /* COMMONINDICNUMBERFORMS */
+    { 710,  2, 130}, /* INDICNUMBERFORMS */
+    {1119,  2, 131}, /* PHAGSPA */
+    {1197,  2, 132}, /* SAURASHTRA */
+    { 495,  2, 133}, /* DEVANAGARIEXTENDED */
+    { 494,  2, 133}, /* DEVANAGARIEXT */
+    { 767,  2, 134}, /* KAYAHLI */
+    {1169,  2, 135}, /* REJANG */
+    { 657,  2, 136}, /* HANGULJAMOEXTENDEDA */
+    { 734,  2, 136}, /* JAMOEXTA */
+    { 737,  2, 137}, /* JAVANESE */
+    { 982,  2, 138}, /* MYANMAREXTENDEDB */
+    { 980,  2, 138}, /* MYANMAREXTB */
+    { 360,  2, 139}, /* CHAM */
+    { 981,  2, 140}, /* MYANMAREXTENDEDA */
+    { 979,  2, 140}, /* MYANMAREXTA */
+    {1307,  2, 141}, /* TAIVIET */
+    { 934,  2, 142}, /* MEETEIMAYEKEXTENSIONS */
+    { 933,  2, 142}, /* MEETEIMAYEKEXT */
+    { 564,  2, 143}, /* ETHIOPICEXTENDEDA */
+    { 562,  2, 143}, /* ETHIOPICEXTA */
+    { 805,  2, 144}, /* LATINEXTENDEDE */
+    { 799,  2, 144}, /* LATINEXTE */
+    { 369,  2, 145}, /* CHEROKEESUPPLEMENT */
+    { 368,  2, 145}, /* CHEROKEESUP */
+    { 932,  2, 146}, /* MEETEIMAYEK */
+    { 659,  2, 147}, /* HANGULSYLLABLES */
+    { 654,  2, 147}, /* HANGUL */
+    { 658,  2, 148}, /* HANGULJAMOEXTENDEDB */
+    { 735,  2, 148}, /* JAMOEXTB */
+    { 682,  2, 149}, /* HIGHSURROGATES */
+    { 680,  2, 150}, /* HIGHPRIVATEUSESURROGATES */
+    { 681,  2, 150}, /* HIGHPUSURROGATES */
+    { 846,  2, 151}, /* LOWSURROGATES */
+    {1148,  2, 152}, /* PRIVATEUSEAREA */
+    {1152,  2, 152}, /* PUA */
+    {1147,  2, 152}, /* PRIVATEUSE */
+    { 381,  2, 153}, /* CJKCOMPATIBILITYIDEOGRAPHS */
+    { 383,  2, 153}, /* CJKCOMPATIDEOGRAPHS */
+    { 191,  2, 154}, /* ALPHABETICPRESENTATIONFORMS */
+    { 190,  2, 154}, /* ALPHABETICPF */
+    { 212,  2, 155}, /* ARABICPRESENTATIONFORMSA */
+    { 210,  2, 155}, /* ARABICPFA */
+    {1376,  2, 156}, /* VARIATIONSELECTORS */
+    {1391,  2, 156}, /* VS */
+    {1382,  2, 157}, /* VERTICALFORMS */
+    { 418,  2, 158}, /* COMBININGHALFMARKS */
+    { 648,  2, 158}, /* HALFMARKS */
+    { 380,  2, 159}, /* CJKCOMPATIBILITYFORMS */
+    { 378,  2, 159}, /* CJKCOMPATFORMS */
+    {1233,  2, 160}, /* SMALLFORMVARIANTS */
+    {1232,  2, 160}, /* SMALLFORMS */
+    { 213,  2, 161}, /* ARABICPRESENTATIONFORMSB */
+    { 211,  2, 161}, /* ARABICPFB */
+    { 650,  2, 162}, /* HALFWIDTHANDFULLWIDTHFORMS */
+    { 647,  2, 162}, /* HALFANDFULLFORMS */
+    {1251,  2, 163}, /* SPECIALS */
+    { 831,  2, 164}, /* LINEARBSYLLABARY */
+    { 830,  2, 165}, /* LINEARBIDEOGRAMS */
+    { 172,  2, 166}, /* AEGEANNUMBERS */
+    { 198,  2, 167}, /* ANCIENTGREEKNUMBERS */
+    { 199,  2, 168}, /* ANCIENTSYMBOLS */
+    {1121,  2, 169}, /* PHAISTOSDISC */
+    {1120,  2, 169}, /* PHAISTOS */
+    { 857,  2, 170}, /* LYCIAN */
+    { 312,  2, 171}, /* CARIAN */
+    { 447,  2, 172}, /* COPTICEPACTNUMBERS */
+    {1057,  2, 173}, /* OLDITALIC */
+    { 622,  2, 174}, /* GOTHIC */
+    {1059,  2, 175}, /* OLDPERMIC */
+    {1361,  2, 176}, /* UGARITIC */
+    {1060,  2, 177}, /* OLDPERSIAN */
+    { 491,  2, 178}, /* DESERET */
+    {1216,  2, 179}, /* SHAVIAN */
+    {1078,  2, 180}, /* OSMANYA */
+    {1075,  2, 181}, /* OSAGE */
+    { 533,  2, 182}, /* ELBASAN */
+    { 317,  2, 183}, /* CAUCASIANALBANIAN */
+    { 828,  2, 184}, /* LINEARA */
+    { 465,  2, 185}, /* CYPRIOTSYLLABARY */
+    { 708,  2, 186}, /* IMPERIALARAMAIC */
+    {1102,  2, 187}, /* PALMYRENE */
+    { 987,  2, 188}, /* NABATAEAN */
+    { 670,  2, 189}, /* HATRAN */
+    {1125,  2, 190}, /* PHOENICIAN */
+    { 859,  2, 191}, /* LYDIAN */
+    { 940,  2, 192}, /* MEROITICHIEROGLYPHS */
+    { 939,  2, 193}, /* MEROITICCURSIVE */
+    { 770,  2, 194}, /* KHAROSHTHI */
+    {1062,  2, 195}, /* OLDSOUTHARABIAN */
+    {1058,  2, 196}, /* OLDNORTHARABIAN */
+    { 884,  2, 197}, /* MANICHAEAN */
+    { 234,  2, 198}, /* AVESTAN */
+    { 722,  2, 199}, /* INSCRIPTIONALPARTHIAN */
+    { 721,  2, 200}, /* INSCRIPTIONALPAHLAVI */
+    {1151,  2, 201}, /* PSALTERPAHLAVI */
+    {1063,  2, 202}, /* OLDTURKIC */
+    {1056,  2, 203}, /* OLDHUNGARIAN */
+    { 662,  2, 204}, /* HANIFIROHINGYA */
+    {1185,  2, 205}, /* RUMINUMERALSYMBOLS */
+    {1184,  2, 205}, /* RUMI */
+    {1423,  2, 206}, /* YEZIDI */
+    {1061,  2, 207}, /* OLDSOGDIAN */
+    {1240,  2, 208}, /* SOGDIAN */
+    { 371,  2, 209}, /* CHORASMIAN */
+    { 535,  2, 210}, /* ELYMAIC */
+    { 285,  2, 211}, /* BRAHMI */
+    { 750,  2, 212}, /* KAITHI */
+    {1243,  2, 213}, /* SORASOMPENG */
+    { 359,  2, 214}, /* CHAKMA */
+    { 862,  2, 215}, /* MAHAJANI */
+    {1215,  2, 216}, /* SHARADA */
+    {1228,  2, 217}, /* SINHALAARCHAICNUMBERS */
+    { 776,  2, 218}, /* KHOJKI */
+    { 975,  2, 219}, /* MULTANI */
+    { 777,  2, 220}, /* KHUDAWADI */
+    { 624,  2, 221}, /* GRANTHA */
+    { 999,  2, 222}, /* NEWA */
+    {1341,  2, 223}, /* TIRHUTA */
+    {1222,  2, 224}, /* SIDDHAM */
+    { 961,  2, 225}, /* MODI */
+    { 970,  2, 226}, /* MONGOLIANSUPPLEMENT */
+    { 969,  2, 226}, /* MONGOLIANSUP */
+    {1311,  2, 227}, /* TAKRI */
+    { 178,  2, 228}, /* AHOM */
+    { 508,  2, 229}, /* DOGRA */
+    {1396,  2, 230}, /* WARANGCITI */
+    { 506,  2, 231}, /* DIVESAKURU */
+    { 990,  2, 232}, /* NANDINAGARI */
+    {1435,  2, 233}, /* ZANABAZARSQUARE */
+    {1245,  2, 234}, /* SOYOMBO */
+    {1109,  2, 235}, /* PAUCINHAU */
+    { 259,  2, 236}, /* BHAIKSUKI */
+    { 913,  2, 237}, /* MARCHEN */
+    { 915,  2, 238}, /* MASARAMGONDI */
+    { 640,  2, 239}, /* GUNJALAGONDI */
+    { 867,  2, 240}, /* MAKASAR */
+    { 837,  2, 241}, /* LISUSUPPLEMENT */
+    { 836,  2, 241}, /* LISUSUP */
+    {1316,  2, 242}, /* TAMILSUPPLEMENT */
+    {1315,  2, 242}, /* TAMILSUP */
+    { 454,  2, 243}, /* CUNEIFORM */
+    { 456,  2, 244}, /* CUNEIFORMNUMBERSANDPUNCTUATION */
+    { 455,  2, 244}, /* CUNEIFORMNUMBERS */
+    { 522,  2, 245}, /* EARLYDYNASTICCUNEIFORM */
+    { 531,  2, 246}, /* EGYPTIANHIEROGLYPHS */
+    { 530,  2, 247}, /* EGYPTIANHIEROGLYPHFORMATCONTROLS */
+    { 195,  2, 248}, /* ANATOLIANHIEROGLYPHS */
+    { 244,  2, 249}, /* BAMUMSUPPLEMENT */
+    { 243,  2, 249}, /* BAMUMSUP */
+    { 971,  2, 250}, /* MRO */
+    { 247,  2, 251}, /* BASSAVAH */
+    {1100,  2, 252}, /* PAHAWHHMONG */
+    { 928,  2, 253}, /* MEDEFAIDRIN */
+    { 941,  2, 254}, /* MIAO */
+    { 701,  2, 255}, /* IDEOGRAPHICSYMBOLSANDPUNCTUATION */
+    { 700,  2, 255}, /* IDEOGRAPHICSYMBOLS */
+    {1319,  2, 256}, /* TANGUT */
+    {1320,  2, 257}, /* TANGUTCOMPONENTS */
+    { 771,  2, 258}, /* KHITANSMALLSCRIPT */
+    {1322,  2, 259}, /* TANGUTSUPPLEMENT */
+    {1321,  2, 259}, /* TANGUTSUP */
+    { 756,  2, 260}, /* KANASUPPLEMENT */
+    { 755,  2, 260}, /* KANASUP */
+    { 754,  2, 261}, /* KANAEXTENDEDA */
+    { 753,  2, 261}, /* KANAEXTA */
+    {1235,  2, 262}, /* SMALLKANAEXTENSION */
+    {1234,  2, 262}, /* SMALLKANAEXT */
+    {1042,  2, 263}, /* NUSHU */
+    { 519,  2, 264}, /* DUPLOYAN */
+    {1219,  2, 265}, /* SHORTHANDFORMATCONTROLS */
+    { 300,  2, 266}, /* BYZANTINEMUSICALSYMBOLS */
+    { 299,  2, 266}, /* BYZANTINEMUSIC */
+    { 977,  2, 267}, /* MUSICALSYMBOLS */
+    { 976,  2, 267}, /* MUSIC */
+    { 197,  2, 268}, /* ANCIENTGREEKMUSICALNOTATION */
+    { 196,  2, 268}, /* ANCIENTGREEKMUSIC */
+    { 922,  2, 269}, /* MAYANNUMERALS */
+    {1309,  2, 270}, /* TAIXUANJINGSYMBOLS */
+    {1308,  2, 270}, /* TAIXUANJING */
+    { 449,  2, 271}, /* COUNTINGRODNUMERALS */
+    { 448,  2, 271}, /* COUNTINGROD */
+    { 918,  2, 272}, /* MATHEMATICALALPHANUMERICSYMBOLS */
+    { 917,  2, 272}, /* MATHALPHANUM */
+    {1284,  2, 273}, /* SUTTONSIGNWRITING */
+    { 616,  2, 274}, /* GLAGOLITICSUPPLEMENT */
+    { 615,  2, 274}, /* GLAGOLITICSUP */
+    {1045,  2, 275}, /* NYIAKENGPUACHUEHMONG */
+    {1394,  2, 276}, /* WANCHO */
+    { 936,  2, 277}, /* MENDEKIKAKUI */
+    { 170,  2, 278}, /* ADLAM */
+    { 712,  2, 279}, /* INDICSIYAQNUMBERS */
+    {1093,  2, 280}, /* OTTOMANSIYAQNUMBERS */
+    { 208,  2, 281}, /* ARABICMATHEMATICALALPHABETICSYMBOLS */
+    { 207,  2, 281}, /* ARABICMATH */
+    { 865,  2, 282}, /* MAHJONGTILES */
+    { 864,  2, 282}, /* MAHJONG */
+    { 510,  2, 283}, /* DOMINOTILES */
+    { 509,  2, 283}, /* DOMINO */
+    {1131,  2, 284}, /* PLAYINGCARDS */
+    { 549,  2, 285}, /* ENCLOSEDALPHANUMERICSUPPLEMENT */
+    { 550,  2, 285}, /* ENCLOSEDALPHANUMSUP */
+    { 554,  2, 286}, /* ENCLOSEDIDEOGRAPHICSUPPLEMENT */
+    { 553,  2, 286}, /* ENCLOSEDIDEOGRAPHICSUP */
+    { 951,  2, 287}, /* MISCELLANEOUSSYMBOLSANDPICTOGRAPHS */
+    { 955,  2, 287}, /* MISCPICTOGRAPHS */
+    { 544,  2, 288}, /* EMOTICONS */
+    {1073,  2, 289}, /* ORNAMENTALDINGBATS */
+    {1355,  2, 290}, /* TRANSPORTANDMAPSYMBOLS */
+    {1354,  2, 290}, /* TRANSPORTANDMAP */
+    { 184,  2, 291}, /* ALCHEMICALSYMBOLS */
+    { 183,  2, 291}, /* ALCHEMICAL */
+    { 605,  2, 292}, /* GEOMETRICSHAPESEXTENDED */
+    { 604,  2, 292}, /* GEOMETRICSHAPESEXT */
+    {1273,  2, 293}, /* SUPPLEMENTALARROWSC */
+    {1266,  2, 293}, /* SUPARROWSC */
+    {1276,  2, 294}, /* SUPPLEMENTALSYMBOLSANDPICTOGRAPHS */
+    {1282,  2, 294}, /* SUPSYMBOLSANDPICTOGRAPHS */
+    { 370,  2, 295}, /* CHESSSYMBOLS */
+    {1292,  2, 296}, /* SYMBOLSANDPICTOGRAPHSEXTENDEDA */
+    {1291,  2, 296}, /* SYMBOLSANDPICTOGRAPHSEXTA */
+    {1293,  2, 297}, /* SYMBOLSFORLEGACYCOMPUTING */
+    { 399,  2, 298}, /* CJKUNIFIEDIDEOGRAPHSEXTENSIONB */
+    { 386,  2, 298}, /* CJKEXTB */
+    { 400,  2, 299}, /* CJKUNIFIEDIDEOGRAPHSEXTENSIONC */
+    { 387,  2, 299}, /* CJKEXTC */
+    { 401,  2, 300}, /* CJKUNIFIEDIDEOGRAPHSEXTENSIOND */
+    { 388,  2, 300}, /* CJKEXTD */
+    { 402,  2, 301}, /* CJKUNIFIEDIDEOGRAPHSEXTENSIONE */
+    { 389,  2, 301}, /* CJKEXTE */
+    { 403,  2, 302}, /* CJKUNIFIEDIDEOGRAPHSEXTENSIONF */
+    { 390,  2, 302}, /* CJKEXTF */
+    { 382,  2, 303}, /* CJKCOMPATIBILITYIDEOGRAPHSSUPPLEMENT */
+    { 384,  2, 303}, /* CJKCOMPATIDEOGRAPHSSUP */
+    { 404,  2, 304}, /* CJKUNIFIEDIDEOGRAPHSEXTENSIONG */
+    { 391,  2, 304}, /* CJKEXTG */
+    {1303,  2, 305}, /* TAGS */
+    {1377,  2, 306}, /* VARIATIONSELECTORSSUPPLEMENT */
+    {1392,  2, 306}, /* VSSUP */
+    {1277,  2, 307}, /* SUPPLEMENTARYPRIVATEUSEAREAA */
+    {1279,  2, 307}, /* SUPPUAA */
+    {1278,  2, 308}, /* SUPPLEMENTARYPRIVATEUSEAREAB */
+    {1280,  2, 308}, /* SUPPUAB */
+    {1027,  3,   0}, /* NOTREORDERED */
+    {   1,  3,   0}, /* 0 */
+    {1028,  3,   0}, /* NR */
+    { 167,  3,   1}, /* ABOVE */
+    {  75,  3,   1}, /* 230 */
+    { 166,  3,   1}, /* A */
+    { 169,  3,   2}, /* ABOVERIGHT */
+    {  76,  3,   2}, /* 232 */
+    { 201,  3,   2}, /* AR */
+    { 253,  3,   3}, /* BELOW */
+    {  69,  3,   3}, /* 220 */
+    { 236,  3,   3}, /* B */
+    { 230,  3,   4}, /* ATTACHEDABOVERIGHT */
+    {  65,  3,   4}, /* 216 */
+    { 225,  3,   4}, /* ATAR */
+    { 231,  3,   5}, /* ATTACHEDBELOW */
+    {  62,  3,   5}, /* 202 */
+    { 226,  3,   5}, /* ATB */
+    {1096,  3,   6}, /* OVERLAY */
+    {   2,  3,   6}, /* 1 */
+    {1095,  3,   6}, /* OV */
+    { 726,  3,   7}, /* IOTASUBSCRIPT */
+    {  80,  3,   7}, /* 240 */
+    { 729,  3,   7}, /* IS */
+    { 512,  3,   8}, /* DOUBLEBELOW */
+    {  77,  3,   8}, /* 233 */
+    { 483,  3,   8}, /* DB */
+    { 511,  3,   9}, /* DOUBLEABOVE */
+    {  78,  3,   9}, /* 234 */
+    { 478,  3,   9}, /* DA */
+    { 255,  3,  10}, /* BELOWRIGHT */
+    {  70,  3,  10}, /* 222 */
+    { 283,  3,  10}, /* BR */
+    { 168,  3,  11}, /* ABOVELEFT */
+    {  73,  3,  11}, /* 228 */
+    { 181,  3,  11}, /* AL */
+    { 321,  3,  12}, /* CCC10 */
+    {  21,  3,  12}, /* 10 */
+    { 324,  3,  13}, /* CCC11 */
+    {  33,  3,  13}, /* 11 */
+    { 326,  3,  14}, /* CCC12 */
+    {  37,  3,  14}, /* 12 */
+    { 329,  3,  15}, /* CCC13 */
+    {  40,  3,  15}, /* 13 */
+    { 333,  3,  16}, /* CCC14 */
+    {  45,  3,  16}, /* 14 */
+    { 334,  3,  17}, /* CCC15 */
+    {  46,  3,  17}, /* 15 */
+    { 335,  3,  18}, /* CCC16 */
+    {  48,  3,  18}, /* 16 */
+    { 336,  3,  19}, /* CCC17 */
+    {  49,  3,  19}, /* 17 */
+    { 337,  3,  20}, /* CCC18 */
+    {  51,  3,  20}, /* 18 */
+    { 338,  3,  21}, /* CCC19 */
+    {  52,  3,  21}, /* 19 */
+    { 339,  3,  22}, /* CCC20 */
+    {  56,  3,  22}, /* 20 */
+    { 340,  3,  23}, /* CCC21 */
+    {  63,  3,  23}, /* 21 */
+    { 341,  3,  24}, /* CCC22 */
+    {  68,  3,  24}, /* 22 */
+    { 342,  3,  25}, /* CCC23 */
+    {  74,  3,  25}, /* 23 */
+    { 343,  3,  26}, /* CCC24 */
+    {  79,  3,  26}, /* 24 */
+    { 344,  3,  27}, /* CCC25 */
+    {  81,  3,  27}, /* 25 */
+    { 349,  3,  28}, /* CCC30 */
+    {  95,  3,  28}, /* 30 */
+    { 350,  3,  29}, /* CCC31 */
+    { 100,  3,  29}, /* 31 */
+    { 351,  3,  30}, /* CCC32 */
+    { 101,  3,  30}, /* 32 */
+    { 346,  3,  31}, /* CCC27 */
+    {  83,  3,  31}, /* 27 */
+    { 347,  3,  32}, /* CCC28 */
+    {  84,  3,  32}, /* 28 */
+    { 348,  3,  33}, /* CCC29 */
+    {  85,  3,  33}, /* 29 */
+    { 352,  3,  34}, /* CCC33 */
+    { 102,  3,  34}, /* 33 */
+    { 353,  3,  35}, /* CCC34 */
+    { 103,  3,  35}, /* 34 */
+    { 354,  3,  36}, /* CCC35 */
+    { 104,  3,  36}, /* 35 */
+    { 355,  3,  37}, /* CCC36 */
+    { 105,  3,  37}, /* 36 */
+    {1034,  3,  38}, /* NUKTA */
+    { 142,  3,  38}, /* 7 */
+    {1011,  3,  38}, /* NK */
+    {1383,  3,  39}, /* VIRAMA */
+    { 158,  3,  39}, /* 9 */
+    {1390,  3,  39}, /* VR */
+    { 356,  3,  40}, /* CCC84 */
+    { 157,  3,  40}, /* 84 */
+    { 357,  3,  41}, /* CCC91 */
+    { 165,  3,  41}, /* 91 */
+    { 322,  3,  42}, /* CCC103 */
+    {  31,  3,  42}, /* 103 */
+    { 323,  3,  43}, /* CCC107 */
+    {  32,  3,  43}, /* 107 */
+    { 325,  3,  44}, /* CCC118 */
+    {  36,  3,  44}, /* 118 */
+    { 327,  3,  45}, /* CCC122 */
+    {  38,  3,  45}, /* 122 */
+    { 328,  3,  46}, /* CCC129 */
+    {  39,  3,  46}, /* 129 */
+    { 330,  3,  47}, /* CCC130 */
+    {  42,  3,  47}, /* 130 */
+    { 331,  3,  48}, /* CCC132 */
+    {  43,  3,  48}, /* 132 */
+    { 229,  3,  49}, /* ATTACHEDABOVE */
+    {  64,  3,  49}, /* 214 */
+    { 224,  3,  49}, /* ATA */
+    { 254,  3,  50}, /* BELOWLEFT */
+    {  67,  3,  50}, /* 218 */
+    { 268,  3,  50}, /* BL */
+    { 811,  3,  51}, /* LEFT */
+    {  71,  3,  51}, /* 224 */
+    { 783,  3,  51}, /* L */
+    { 757,  3,  52}, /* KANAVOICING */
+    { 151,  3,  52}, /* 8 */
+    { 782,  3,  52}, /* KV */
+    { 345,  3,  53}, /* CCC26 */
+    {  82,  3,  53}, /* 26 */
+    { 667,  3,  54}, /* HANREADING */
+    { 136,  3,  54}, /* 6 */
+    { 666,  3,  54}, /* HANR */
+    {1172,  3,  55}, /* RIGHT */
+    {  72,  3,  55}, /* 226 */
+    {1164,  3,  55}, /* R */
+    { 332,  3,  56}, /* CCC133 */
+    {  44,  3,  56}, /* 133 */
+    { 232,  3,  57}, /* ATTACHEDBELOWLEFT */
+    {  57,  3,  57}, /* 200 */
+    { 227,  3,  57}, /* ATBL */
+    {1020,  4,   0}, /* NONE */
+    {1017,  4,   1}, /* NOBREAK */
+    { 994,  4,   1}, /* NB */
+    { 424,  4,   2}, /* COMPAT */
+    { 413,  4,   2}, /* COM */
+    {1267,  4,   3}, /* SUPER */
+    {1263,  4,   3}, /* SUP */
+    { 592,  4,   4}, /* FRACTION */
+    { 591,  4,   4}, /* FRA */
+    { 307,  4,   5}, /* CANONICAL */
+    { 304,  4,   5}, /* CAN */
+    {1258,  4,   6}, /* SUB */
+    { 589,  4,   7}, /* FONT */
+    { 374,  4,   8}, /* CIRCLE */
+    { 546,  4,   8}, /* ENC */
+    {1401,  4,   9}, /* WIDE */
+    {1381,  4,  10}, /* VERTICAL */
+    {1380,  4,  10}, /* VERT */
+    {1254,  4,  11}, /* SQUARE */
+    {1253,  4,  11}, /* SQR */
+    { 731,  4,  12}, /* ISOLATED */
+    { 730,  4,  12}, /* ISO */
+    { 584,  4,  13}, /* FINAL */
+    { 583,  4,  13}, /* FIN */
+    { 717,  4,  14}, /* INITIAL */
+    { 716,  4,  14}, /* INIT */
+    { 930,  4,  15}, /* MEDIAL */
+    { 927,  4,  15}, /* MED */
+    {1231,  4,  16}, /* SMALL */
+    {1236,  4,  16}, /* SML */
+    { 993,  4,  17}, /* NARROW */
+    { 991,  4,  17}, /* NAR */
+    { 998,  5,   0}, /* NEUTRAL */
+    { 984,  5,   0}, /* N */
+    { 993,  5,   1}, /* NARROW */
+    { 986,  5,   1}, /* NA */
+    { 193,  5,   2}, /* AMBIGUOUS */
+    { 166,  5,   2}, /* A */
+    {1401,  5,   3}, /* WIDE */
+    {1393,  5,   3}, /* W */
+    { 649,  5,   4}, /* HALFWIDTH */
+    { 643,  5,   4}, /* H */
+    { 594,  5,   5}, /* FULLWIDTH */
+    { 578,  5,   5}, /* F */
+    {1363,  6,   0}, /* UNASSIGNED */
+    { 410,  6,   0}, /* CN */
+    { 443,  6,   1}, /* CONTROL */
+    { 319,  6,   1}, /* CC */
+    { 411,  6,   1}, /* CNTRL */
+    {1248,  6,   2}, /* SPACESEPARATOR */
+    {1441,  6,   2}, /* ZS */
+    {1090,  6,   3}, /* OTHERPUNCTUATION */
+    {1133,  6,   3}, /* PO */
+    { 457,  6,   4}, /* CURRENCYSYMBOL */
+    {1199,  6,   4}, /* SC */
+    {1069,  6,   5}, /* OPENPUNCTUATION */
+    {1150,  6,   5}, /* PS */
+    { 408,  6,   6}, /* CLOSEPUNCTUATION */
+    {1115,  6,   6}, /* PE */
+    { 921,  6,   7}, /* MATHSYMBOL */
+    {1230,  6,   7}, /* SM */
+    { 482,  6,   8}, /* DASHPUNCTUATION */
+    {1112,  6,   8}, /* PD */
+    { 486,  6,   9}, /* DECIMALNUMBER */
+    { 997,  6,   9}, /* ND */
+    { 504,  6,   9}, /* DIGIT */
+    {1371,  6,  10}, /* UPPERCASELETTER */
+    { 851,  6,  10}, /* LU */
+    { 964,  6,  11}, /* MODIFIERSYMBOL */
+    {1229,  6,  11}, /* SK */
+    { 428,  6,  12}, /* CONNECTORPUNCTUATION */
+    {1110,  6,  12}, /* PC */
+    { 845,  6,  13}, /* LOWERCASELETTER */
+    { 838,  6,  13}, /* LL */
+    {1091,  6,  14}, /* OTHERSYMBOL */
+    {1237,  6,  14}, /* SO */
+    {1085,  6,  15}, /* OTHERLETTER */
+    { 840,  6,  15}, /* LO */
+    { 718,  6,  16}, /* INITIALPUNCTUATION */
+    {1130,  6,  16}, /* PI */
+    { 590,  6,  17}, /* FORMAT */
+    { 358,  6,  17}, /* CF */
+    {1089,  6,  18}, /* OTHERNUMBER */
+    {1015,  6,  18}, /* NO */
+    { 585,  6,  19}, /* FINALPUNCTUATION */
+    {1117,  6,  19}, /* PF */
+    {1342,  6,  20}, /* TITLECASELETTER */
+    { 850,  6,  20}, /* LT */
+    { 962,  6,  21}, /* MODIFIERLETTER */
+    { 839,  6,  21}, /* LM */
+    {1023,  6,  22}, /* NONSPACINGMARK */
+    { 960,  6,  22}, /* MN */
+    { 555,  6,  23}, /* ENCLOSINGMARK */
+    { 926,  6,  23}, /* ME */
+    {1249,  6,  24}, /* SPACINGMARK */
+    { 925,  6,  24}, /* MC */
+    { 822,  6,  25}, /* LETTERNUMBER */
+    {1014,  6,  25}, /* NL */
+    { 834,  6,  26}, /* LINESEPARATOR */
+    {1439,  6,  26}, /* ZL */
+    {1103,  6,  27}, /* PARAGRAPHSEPARATOR */
+    {1440,  6,  27}, /* ZP */
+    {1283,  6,  28}, /* SURROGATE */
+    { 453,  6,  28}, /* CS */
+    {1147,  6,  29}, /* PRIVATEUSE */
+    { 412,  6,  29}, /* CO */
+    {1079,  6,  30}, /* OTHER */
+    { 301,  6,  30}, /* C */
+    { 302,  6,  30}, /* C& */
+    { 820,  6,  31}, /* LETTER */
+    { 783,  6,  31}, /* L */
+    { 784,  6,  31}, /* L& */
+    { 914,  6,  32}, /* MARK */
+    { 860,  6,  32}, /* M */
+    { 419,  6,  32}, /* COMBININGMARK */
+    { 861,  6,  32}, /* M& */
+    {1035,  6,  33}, /* NUMBER */
+    { 984,  6,  33}, /* N */
+    { 985,  6,  33}, /* N& */
+    {1154,  6,  34}, /* PUNCTUATION */
+    {1098,  6,  34}, /* P */
+    {1153,  6,  34}, /* PUNCT */
+    {1099,  6,  34}, /* P& */
+    {1290,  6,  35}, /* SYMBOL */
+    {1188,  6,  35}, /* S */
+    {1189,  6,  35}, /* S& */
+    {1212,  6,  36}, /* SEPARATOR */
+    {1432,  6,  36}, /* Z */
+    {1433,  6,  36}, /* Z& */
+    { 315,  6,  37}, /* CASEDLETTER */
+    { 808,  6,  37}, /* LC */
+    { 222,  6,  38}, /* ASSIGNED */
+    {1079,  7,   0}, /* OTHER */
+    {1416,  7,   0}, /* XX */
+    { 443,  7,   1}, /* CONTROL */
+    { 410,  7,   1}, /* CN */
+    { 823,  7,   2}, /* LF */
+    { 452,  7,   3}, /* CR */
+    { 573,  7,   4}, /* EXTEND */
+    { 570,  7,   4}, /* EX */
+    {1144,  7,   5}, /* PREPEND */
+    {1141,  7,   5}, /* PP */
+    {1249,  7,   6}, /* SPACINGMARK */
+    {1230,  7,   6}, /* SM */
+    { 783,  7,   7}, /* L */
+    {1372,  7,   8}, /* V */
+    {1299,  7,   9}, /* T */
+    {1443,  7,  10}, /* ZWJ */
+    { 852,  7,  11}, /* LV */
+    { 854,  7,  12}, /* LVT */
+    {1166,  7,  13}, /* REGIONALINDICATOR */
+    {1171,  7,  13}, /* RI */
+    { 525,  7,  14}, /* EBASE */
+    { 524,  7,  14}, /* EB */
+    { 526,  7,  15}, /* EBASEGAZ */
+    { 527,  7,  15}, /* EBG */
+    { 538,  7,  16}, /* EMODIFIER */
+    { 536,  7,  16}, /* EM */
+    { 618,  7,  17}, /* GLUEAFTERZWJ */
+    { 597,  7,  17}, /* GAZ */
+    {1026,  8,   0}, /* NOTAPPLICABLE */
+    { 986,  8,   0}, /* NA */
+    { 810,  8,   1}, /* LEADINGJAMO */
+    { 783,  8,   1}, /* L */
+    {1389,  8,   2}, /* VOWELJAMO */
+    {1372,  8,   2}, /* V */
+    {1352,  8,   3}, /* TRAILINGJAMO */
+    {1299,  8,   3}, /* T */
+    { 853,  8,   4}, /* LVSYLLABLE */
+    { 852,  8,   4}, /* LV */
+    { 855,  8,   5}, /* LVTSYLLABLE */
+    { 854,  8,   5}, /* LVT */
+    { 986,  9,   0}, /* NA */
+    {1345,  9,   1}, /* TOP */
+    {1172,  9,   2}, /* RIGHT */
+    { 278,  9,   3}, /* BOTTOM */
+    { 811,  9,   4}, /* LEFT */
+    { 812,  9,   5}, /* LEFTANDRIGHT */
+    {1351,  9,   6}, /* TOPANDRIGHT */
+    {1349,  9,   7}, /* TOPANDLEFT */
+    {1350,  9,   8}, /* TOPANDLEFTANDRIGHT */
+    {1346,  9,   9}, /* TOPANDBOTTOM */
+    {1385,  9,  10}, /* VISUALORDERLEFT */
+    {1347,  9,  11}, /* TOPANDBOTTOMANDLEFT */
+    { 280,  9,  12}, /* BOTTOMANDRIGHT */
+    {1348,  9,  13}, /* TOPANDBOTTOMANDRIGHT */
+    {1097,  9,  14}, /* OVERSTRUCK */
+    { 279,  9,  15}, /* BOTTOMANDLEFT */
+    {1079, 10,   0}, /* OTHER */
+    { 436, 10,   1}, /* CONSONANTPLACEHOLDER */
+    {1035, 10,   2}, /* NUMBER */
+    {1287, 10,   3}, /* SYLLABLEMODIFIER */
+    { 266, 10,   4}, /* BINDU */
+    {1384, 10,   5}, /* VISARGA */
+    {1388, 10,   6}, /* VOWELINDEPENDENT */
+    { 429, 10,   7}, /* CONSONANT */
+    {1387, 10,   8}, /* VOWELDEPENDENT */
+    {1034, 10,   9}, /* NUKTA */
+    { 233, 10,  10}, /* AVAGRAHA */
+    {1383, 10,  11}, /* VIRAMA */
+    { 310, 10,  12}, /* CANTILLATIONMARK */
+    { 430, 10,  13}, /* CONSONANTDEAD */
+    { 600, 10,  14}, /* GEMINATIONMARK */
+    { 435, 10,  15}, /* CONSONANTMEDIAL */
+    { 966, 10,  16}, /* MODIFYINGLETTER */
+    { 441, 10,  17}, /* CONSONANTWITHSTACKER */
+    {1155, 10,  18}, /* PUREKILLER */
+    { 437, 10,  19}, /* CONSONANTPRECEDINGREPHA */
+    {1344, 10,  20}, /* TONEMARK */
+    { 434, 10,  21}, /* CONSONANTKILLER */
+    { 432, 10,  22}, /* CONSONANTHEADLETTER */
+    { 439, 10,  23}, /* CONSONANTSUBJOINED */
+    { 725, 10,  24}, /* INVISIBLESTACKER */
+    {1167, 10,  25}, /* REGISTERSHIFTER */
+    { 440, 10,  26}, /* CONSONANTSUCCEEDINGREPHA */
+    { 431, 10,  27}, /* CONSONANTFINAL */
+    {1386, 10,  28}, /* VOWEL */
+    {1343, 10,  29}, /* TONELETTER */
+    { 433, 10,  30}, /* CONSONANTINITIALPOSTFIXED */
+    {1021, 10,  31}, /* NONJOINER */
+    { 743, 10,  32}, /* JOINER */
+    { 286, 10,  33}, /* BRAHMIJOININGNUMBER */
+    {1037, 10,  34}, /* NUMBERJOINER */
+    { 438, 10,  35}, /* CONSONANTPREFIXED */
+    {1018, 11,   0}, /* NOJOININGGROUP */
+    {1418, 11,   1}, /* YEH */
+    { 185, 11,   2}, /* ALEF */
+    {1397, 11,   3}, /* WAW */
+    { 252, 11,   4}, /* BEH */
+    {1325, 11,   5}, /* TEHMARBUTA */
+    { 646, 11,   6}, /* HAH */
+    { 479, 11,   7}, /* DAL */
+    {1168, 11,   8}, /* REH */
+    {1206, 11,   9}, /* SEEN */
+    {1191, 11,  10}, /* SAD */
+    {1304, 11,  11}, /* TAH */
+    { 180, 11,  12}, /* AIN */
+    { 595, 11,  13}, /* GAF */
+    { 580, 11,  14}, /* FARSIYEH */
+    { 582, 11,  15}, /* FEH */
+    {1158, 11,  16}, /* QAF */
+    { 749, 11,  17}, /* KAF */
+    { 785, 11,  18}, /* LAM */
+    { 931, 11,  19}, /* MEEM */
+    {1025, 11,  20}, /* NOON */
+    { 675, 11,  21}, /* HEH */
+    {1285, 11,  22}, /* SWASHKAF */
+    {1044, 11,  23}, /* NYA */
+    { 780, 11,  24}, /* KNOTTEDHEH */
+    { 676, 11,  25}, /* HEHGOAL */
+    { 651, 11,  26}, /* HAMZAONHEHGOAL */
+    {1326, 11,  26}, /* TEHMARBUTAGOAL */
+    {1420, 11,  27}, /* YEHWITHTAIL */
+    {1419, 11,  28}, /* YEHBARREE */
+    { 182, 11,  29}, /* ALAPH */
+    { 258, 11,  30}, /* BETH */
+    { 596, 11,  31}, /* GAMAL */
+    { 480, 11,  32}, /* DALATHRISH */
+    { 671, 11,  33}, /* HE */
+    {1298, 11,  34}, /* SYRIACWAW */
+    {1434, 11,  35}, /* ZAIN */
+    { 677, 11,  36}, /* HETH */
+    {1331, 11,  37}, /* TETH */
+    {1430, 11,  38}, /* YUDH */
+    {1431, 11,  39}, /* YUDHHE */
+    { 762, 11,  40}, /* KAPH */
+    { 786, 11,  41}, /* LAMADH */
+    { 945, 11,  42}, /* MIM */
+    {1041, 11,  43}, /* NUN */
+    {1208, 11,  44}, /* SEMKATH */
+    { 586, 11,  45}, /* FINALSEMKATH */
+    { 520, 11,  46}, /* E */
+    {1115, 11,  47}, /* PE */
+    {1170, 11,  48}, /* REVERSEDPE */
+    {1192, 11,  49}, /* SADHE */
+    {1159, 11,  50}, /* QAPH */
+    {1218, 11,  51}, /* SHIN */
+    {1324, 11,  52}, /* TAW */
+    {1437, 11,  53}, /* ZHAIN */
+    { 768, 11,  54}, /* KHAPH */
+    { 581, 11,  55}, /* FE */
+    { 298, 11,  56}, /* BURUSHASKIYEHBARREE */
+    { 873, 11,  57}, /* MALAYALAMNGA */
+    { 870, 11,  58}, /* MALAYALAMJA */
+    { 876, 11,  59}, /* MALAYALAMNYA */
+    { 879, 11,  60}, /* MALAYALAMTTA */
+    { 874, 11,  61}, /* MALAYALAMNNA */
+    { 875, 11,  62}, /* MALAYALAMNNNA */
+    { 869, 11,  63}, /* MALAYALAMBHA */
+    { 877, 11,  64}, /* MALAYALAMRA */
+    { 871, 11,  65}, /* MALAYALAMLLA */
+    { 872, 11,  66}, /* MALAYALAMLLLA */
+    { 878, 11,  67}, /* MALAYALAMSSA */
+    {1183, 11,  68}, /* ROHINGYAYEH */
+    {1257, 11,  69}, /* STRAIGHTWAW */
+    { 173, 11,  70}, /* AFRICANFEH */
+    { 175, 11,  71}, /* AFRICANQAF */
+    { 174, 11,  72}, /* AFRICANNOON */
+    { 885, 11,  73}, /* MANICHAEANALEPH */
+    { 887, 11,  74}, /* MANICHAEANBETH */
+    { 891, 11,  75}, /* MANICHAEANGIMEL */
+    { 888, 11,  76}, /* MANICHAEANDALETH */
+    { 909, 11,  77}, /* MANICHAEANWAW */
+    { 911, 11,  78}, /* MANICHAEANZAYIN */
+    { 892, 11,  79}, /* MANICHAEANHETH */
+    { 906, 11,  80}, /* MANICHAEANTETH */
+    { 910, 11,  81}, /* MANICHAEANYODH */
+    { 894, 11,  82}, /* MANICHAEANKAPH */
+    { 895, 11,  83}, /* MANICHAEANLAMEDH */
+    { 889, 11,  84}, /* MANICHAEANDHAMEDH */
+    { 907, 11,  85}, /* MANICHAEANTHAMEDH */
+    { 896, 11,  86}, /* MANICHAEANMEM */
+    { 897, 11,  87}, /* MANICHAEANNUN */
+    { 903, 11,  88}, /* MANICHAEANSAMEKH */
+    { 886, 11,  89}, /* MANICHAEANAYIN */
+    { 899, 11,  90}, /* MANICHAEANPE */
+    { 902, 11,  91}, /* MANICHAEANSADHE */
+    { 900, 11,  92}, /* MANICHAEANQOPH */
+    { 901, 11,  93}, /* MANICHAEANRESH */
+    { 904, 11,  94}, /* MANICHAEANTAW */
+    { 898, 11,  95}, /* MANICHAEANONE */
+    { 890, 11,  96}, /* MANICHAEANFIVE */
+    { 905, 11,  97}, /* MANICHAEANTEN */
+    { 908, 11,  98}, /* MANICHAEANTWENTY */
+    { 893, 11,  99}, /* MANICHAEANHUNDRED */
+    { 664, 11, 100}, /* HANIFIROHINGYAPA */
+    { 663, 11, 101}, /* HANIFIROHINGYAKINNAYA */
+    {1022, 12,   0}, /* NONJOINING */
+    {1357, 12,   0}, /* U */
+    {1353, 12,   1}, /* TRANSPARENT */
+    {1299, 12,   1}, /* T */
+    { 517, 12,   2}, /* DUALJOINING */
+    { 477, 12,   2}, /* D */
+    {1173, 12,   3}, /* RIGHTJOINING */
+    {1164, 12,   3}, /* R */
+    { 741, 12,   4}, /* JOINCAUSING */
+    { 301, 12,   4}, /* C */
+    { 813, 12,   5}, /* LEFTJOINING */
+    { 783, 12,   5}, /* L */
+    {1367, 13,   0}, /* UNKNOWN */
+    {1416, 13,   0}, /* XX */
+    { 419, 13,   1}, /* COMBININGMARK */
+    { 409, 13,   1}, /* CM */
+    { 290, 13,   2}, /* BREAKAFTER */
+    { 238, 13,   2}, /* BA */
+    { 833, 13,   3}, /* LINEFEED */
+    { 823, 13,   3}, /* LF */
+    { 882, 13,   4}, /* MANDATORYBREAK */
+    { 267, 13,   4}, /* BK */
+    { 313, 13,   5}, /* CARRIAGERETURN */
+    { 452, 13,   5}, /* CR */
+    {1247, 13,   6}, /* SPACE */
+    {1246, 13,   6}, /* SP */
+    { 571, 13,   7}, /* EXCLAMATION */
+    { 570, 13,   7}, /* EX */
+    {1162, 13,   8}, /* QUOTATION */
+    {1161, 13,   8}, /* QU */
+    { 189, 13,   9}, /* ALPHABETIC */
+    { 181, 13,   9}, /* AL */
+    {1143, 13,  10}, /* PREFIXNUMERIC */
+    {1142, 13,  10}, /* PR */
+    {1140, 13,  11}, /* POSTFIXNUMERIC */
+    {1133, 13,  11}, /* PO */
+    {1069, 13,  12}, /* OPENPUNCTUATION */
+    {1068, 13,  12}, /* OP */
+    { 407, 13,  13}, /* CLOSEPARENTHESIS */
+    { 450, 13,  13}, /* CP */
+    { 714, 13,  14}, /* INFIXNUMERIC */
+    { 729, 13,  14}, /* IS */
+    { 693, 13,  15}, /* HYPHEN */
+    { 692, 13,  15}, /* HY */
+    { 293, 13,  16}, /* BREAKSYMBOLS */
+    {1286, 13,  16}, /* SY */
+    {1038, 13,  17}, /* NUMERIC */
+    {1033, 13,  17}, /* NU */
+    { 408, 13,  18}, /* CLOSEPUNCTUATION */
+    { 405, 13,  18}, /* CL */
+    {1002, 13,  19}, /* NEXTLINE */
+    {1014, 13,  19}, /* NL */
+    { 617, 13,  20}, /* GLUE */
+    { 612, 13,  20}, /* GL */
+    { 193, 13,  21}, /* AMBIGUOUS */
+    { 179, 13,  21}, /* AI */
+    { 291, 13,  22}, /* BREAKBEFORE */
+    { 250, 13,  22}, /* BB */
+    { 674, 13,  23}, /* HEBREWLETTER */
+    { 685, 13,  23}, /* HL */
+    { 426, 13,  24}, /* COMPLEXCONTEXT */
+    {1190, 13,  24}, /* SA */
+    { 739, 13,  25}, /* JL */
+    { 747, 13,  26}, /* JV */
+    { 746, 13,  27}, /* JT */
+    {1024, 13,  28}, /* NONSTARTER */
+    {1029, 13,  28}, /* NS */
+    {1444, 13,  29}, /* ZWSPACE */
+    {1442, 13,  29}, /* ZW */
+    {1443, 13,  30}, /* ZWJ */
+    { 292, 13,  31}, /* BREAKBOTH */
+    { 237, 13,  31}, /* B2 */
+    { 723, 13,  32}, /* INSEPARABLE */
+    { 709, 13,  32}, /* IN */
+    { 724, 13,  32}, /* INSEPERABLE */
+    {1405, 13,  33}, /* WORDJOINER */
+    {1402, 13,  33}, /* WJ */
+    { 698, 13,  34}, /* IDEOGRAPHIC */
+    { 694, 13,  34}, /* ID */
+    { 525, 13,  35}, /* EBASE */
+    { 524, 13,  35}, /* EB */
+    { 427, 13,  36}, /* CONDITIONALJAPANESESTARTER */
+    { 375, 13,  36}, /* CJ */
+    { 644, 13,  37}, /* H2 */
+    { 645, 13,  38}, /* H3 */
+    {1283, 13,  39}, /* SURROGATE */
+    {1213, 13,  39}, /* SG */
+    { 442, 13,  40}, /* CONTINGENTBREAK */
+    { 318, 13,  40}, /* CB */
+    {1166, 13,  41}, /* REGIONALINDICATOR */
+    {1171, 13,  41}, /* RI */
+    { 538, 13,  42}, /* EMODIFIER */
+    { 536, 13,  42}, /* EM */
+    {1015, 14,   0}, /* NO */
+    { 984, 14,   0}, /* N */
+    {1421, 14,   1}, /* YES */
+    {1417, 14,   1}, /* Y */
+    { 923, 14,   2}, /* MAYBE */
+    { 860, 14,   2}, /* M */
+    {1015, 15,   0}, /* NO */
+    { 984, 15,   0}, /* N */
+    {1421, 15,   1}, /* YES */
+    {1417, 15,   1}, /* Y */
+    {1020, 16,   0}, /* NONE */
+    { 485, 16,   1}, /* DECIMAL */
+    { 484, 16,   1}, /* DE */
+    { 504, 16,   2}, /* DIGIT */
+    { 496, 16,   2}, /* DI */
+    {1038, 16,   3}, /* NUMERIC */
+    {1033, 16,   3}, /* NU */
+    { 988, 17,   0}, /* NAN */
+    {   1, 17,   1}, /* 0 */
+    {   2, 17,   2}, /* 1 */
+    {  53, 17,   3}, /* 2 */
+    {  86, 17,   4}, /* 3 */
+    { 109, 17,   5}, /* 4 */
+    { 126, 17,   6}, /* 5 */
+    { 136, 17,   7}, /* 6 */
+    { 142, 17,   8}, /* 7 */
+    { 151, 17,   9}, /* 8 */
+    { 158, 17,  10}, /* 9 */
+    {  12, 17,  11}, /* 1/4 */
+    {   7, 17,  12}, /* 1/2 */
+    {  90, 17,  13}, /* 3/4 */
+    {   5, 17,  14}, /* 1/16 */
+    {  18, 17,  15}, /* 1/8 */
+    {  87, 17,  16}, /* 3/16 */
+    {  48, 17,  17}, /* 16 */
+    {  21, 17,  18}, /* 10 */
+    {  22, 17,  19}, /* 100 */
+    {  23, 17,  20}, /* 1000 */
+    {   6, 17,  21}, /* 1/160 */
+    {  13, 17,  22}, /* 1/40 */
+    {  94, 17,  23}, /* 3/80 */
+    {   8, 17,  24}, /* 1/20 */
+    {   3, 17,  25}, /* 1/10 */
+    {  89, 17,  26}, /* 3/20 */
+    {  14, 17,  27}, /* 1/5 */
+    {  88, 17,  28}, /* 3/2 */
+    { 128, 17,  29}, /* 5/2 */
+    { 144, 17,  30}, /* 7/2 */
+    { 159, 17,  31}, /* 9/2 */
+    {  35, 17,  32}, /* 11/2 */
+    {  41, 17,  33}, /* 13/2 */
+    {  47, 17,  34}, /* 15/2 */
+    {  50, 17,  35}, /* 17/2 */
+    {   0, 17,  36}, /* -1/2 */
+    {  56, 17,  37}, /* 20 */
+    {  95, 17,  38}, /* 30 */
+    { 111, 17,  39}, /* 40 */
+    { 131, 17,  40}, /* 50 */
+    { 137, 17,  41}, /* 60 */
+    { 146, 17,  42}, /* 70 */
+    { 152, 17,  43}, /* 80 */
+    { 160, 17,  44}, /* 90 */
+    {  24, 17,  45}, /* 10000 */
+    {  49, 17,  46}, /* 17 */
+    {  51, 17,  47}, /* 18 */
+    {  52, 17,  48}, /* 19 */
+    {  17, 17,  49}, /* 1/7 */
+    {  20, 17,  50}, /* 1/9 */
+    {   9, 17,  51}, /* 1/3 */
+    {  54, 17,  52}, /* 2/3 */
+    {  55, 17,  53}, /* 2/5 */
+    {  91, 17,  54}, /* 3/5 */
+    { 110, 17,  55}, /* 4/5 */
+    {  15, 17,  56}, /* 1/6 */
+    { 129, 17,  57}, /* 5/6 */
+    {  93, 17,  58}, /* 3/8 */
+    { 130, 17,  59}, /* 5/8 */
+    { 145, 17,  60}, /* 7/8 */
+    {  33, 17,  61}, /* 11 */
+    {  37, 17,  62}, /* 12 */
+    { 132, 17,  63}, /* 500 */
+    { 133, 17,  64}, /* 5000 */
+    { 134, 17,  65}, /* 50000 */
+    {  25, 17,  66}, /* 100000 */
+    {  40, 17,  67}, /* 13 */
+    {  45, 17,  68}, /* 14 */
+    {  46, 17,  69}, /* 15 */
+    {  63, 17,  70}, /* 21 */
+    {  68, 17,  71}, /* 22 */
+    {  74, 17,  72}, /* 23 */
+    {  79, 17,  73}, /* 24 */
+    {  81, 17,  74}, /* 25 */
+    {  82, 17,  75}, /* 26 */
+    {  83, 17,  76}, /* 27 */
+    {  84, 17,  77}, /* 28 */
+    {  85, 17,  78}, /* 29 */
+    { 100, 17,  79}, /* 31 */
+    { 101, 17,  80}, /* 32 */
+    { 102, 17,  81}, /* 33 */
+    { 103, 17,  82}, /* 34 */
+    { 104, 17,  83}, /* 35 */
+    { 105, 17,  84}, /* 36 */
+    { 106, 17,  85}, /* 37 */
+    { 107, 17,  86}, /* 38 */
+    { 108, 17,  87}, /* 39 */
+    { 116, 17,  88}, /* 41 */
+    { 117, 17,  89}, /* 42 */
+    { 118, 17,  90}, /* 43 */
+    { 120, 17,  91}, /* 44 */
+    { 121, 17,  92}, /* 45 */
+    { 122, 17,  93}, /* 46 */
+    { 123, 17,  94}, /* 47 */
+    { 124, 17,  95}, /* 48 */
+    { 125, 17,  96}, /* 49 */
+    {  28, 17,  97}, /* 100000000 */
+    {  30, 17,  98}, /* 1000000000000 */
+    {  57, 17,  99}, /* 200 */
+    {  96, 17, 100}, /* 300 */
+    { 112, 17, 101}, /* 400 */
+    { 138, 17, 102}, /* 600 */
+    { 147, 17, 103}, /* 700 */
+    { 153, 17, 104}, /* 800 */
+    { 161, 17, 105}, /* 900 */
+    {  58, 17, 106}, /* 2000 */
+    {  97, 17, 107}, /* 3000 */
+    { 113, 17, 108}, /* 4000 */
+    { 139, 17, 109}, /* 6000 */
+    { 148, 17, 110}, /* 7000 */
+    { 154, 17, 111}, /* 8000 */
+    { 162, 17, 112}, /* 9000 */
+    {  59, 17, 113}, /* 20000 */
+    {  98, 17, 114}, /* 30000 */
+    { 114, 17, 115}, /* 40000 */
+    { 140, 17, 116}, /* 60000 */
+    { 149, 17, 117}, /* 70000 */
+    { 155, 17, 118}, /* 80000 */
+    { 163, 17, 119}, /* 90000 */
+    {  34, 17, 120}, /* 11/12 */
+    {  60, 17, 121}, /* 200000 */
+    {  99, 17, 122}, /* 300000 */
+    { 115, 17, 123}, /* 400000 */
+    { 135, 17, 124}, /* 500000 */
+    { 141, 17, 125}, /* 600000 */
+    { 150, 17, 126}, /* 700000 */
+    { 156, 17, 127}, /* 800000 */
+    { 164, 17, 128}, /* 900000 */
+    {   4, 17, 129}, /* 1/12 */
+    { 127, 17, 130}, /* 5/12 */
+    { 143, 17, 131}, /* 7/12 */
+    {  11, 17, 132}, /* 1/320 */
+    {  19, 17, 133}, /* 1/80 */
+    {  16, 17, 134}, /* 1/64 */
+    {  10, 17, 135}, /* 1/32 */
+    {  92, 17, 136}, /* 3/64 */
+    {  66, 17, 137}, /* 216000 */
+    { 119, 17, 138}, /* 432000 */
+    {  26, 17, 139}, /* 1000000 */
+    {  29, 17, 140}, /* 10000000000 */
+    {  27, 17, 141}, /* 10000000 */
+    {  61, 17, 142}, /* 20000000 */
+    {1367, 18,   0}, /* UNKNOWN */
+    {1446, 18,   0}, /* ZZZZ */
+    { 421, 18,   1}, /* COMMON */
+    {1445, 18,   1}, /* ZYYY */
+    { 790, 18,   2}, /* LATIN */
+    { 806, 18,   2}, /* LATN */
+    { 275, 18,   3}, /* BOPOMOFO */
+    { 274, 18,   3}, /* BOPO */
+    { 715, 18,   4}, /* INHERITED */
+    {1438, 18,   4}, /* ZINH */
+    {1157, 18,   4}, /* QAAI */
+    { 631, 18,   5}, /* GREEK */
+    { 635, 18,   5}, /* GREK */
+    { 446, 18,   6}, /* COPTIC */
+    { 445, 18,   6}, /* COPT */
+    {1156, 18,   6}, /* QAAC */
+    { 466, 18,   7}, /* CYRILLIC */
+    { 476, 18,   7}, /* CYRL */
+    { 216, 18,   8}, /* ARMENIAN */
+    { 218, 18,   8}, /* ARMN */
+    { 673, 18,   9}, /* HEBREW */
+    { 672, 18,   9}, /* HEBR */
+    { 203, 18,  10}, /* ARABIC */
+    { 202, 18,  10}, /* ARAB */
+    {1295, 18,  11}, /* SYRIAC */
+    {1294, 18,  11}, /* SYRC */
+    {1335, 18,  12}, /* THAANA */
+    {1334, 18,  12}, /* THAA */
+    {1012, 18,  13}, /* NKO */
+    {1013, 18,  13}, /* NKOO */
+    {1193, 18,  14}, /* SAMARITAN */
+    {1194, 18,  14}, /* SAMR */
+    { 881, 18,  15}, /* MANDAIC */
+    { 880, 18,  15}, /* MAND */
+    { 493, 18,  16}, /* DEVANAGARI */
+    { 492, 18,  16}, /* DEVA */
+    { 257, 18,  17}, /* BENGALI */
+    { 256, 18,  17}, /* BENG */
+    { 641, 18,  18}, /* GURMUKHI */
+    { 642, 18,  18}, /* GURU */
+    { 638, 18,  19}, /* GUJARATI */
+    { 639, 18,  19}, /* GUJR */
+    {1071, 18,  20}, /* ORIYA */
+    {1074, 18,  20}, /* ORYA */
+    {1314, 18,  21}, /* TAMIL */
+    {1317, 18,  21}, /* TAML */
+    {1328, 18,  22}, /* TELUGU */
+    {1327, 18,  22}, /* TELU */
+    { 761, 18,  23}, /* KANNADA */
+    { 779, 18,  23}, /* KNDA */
+    { 868, 18,  24}, /* MALAYALAM */
+    { 959, 18,  24}, /* MLYM */
+    {1227, 18,  25}, /* SINHALA */
+    {1226, 18,  25}, /* SINH */
+    {1336, 18,  26}, /* THAI */
+    { 788, 18,  27}, /* LAO */
+    { 789, 18,  27}, /* LAOO */
+    {1337, 18,  28}, /* TIBETAN */
+    {1338, 18,  28}, /* TIBT */
+    { 978, 18,  29}, /* MYANMAR */
+    { 983, 18,  29}, /* MYMR */
+    { 607, 18,  30}, /* GEORGIAN */
+    { 606, 18,  30}, /* GEOR */
+    { 654, 18,  31}, /* HANGUL */
+    { 653, 18,  31}, /* HANG */
+    { 560, 18,  32}, /* ETHIOPIC */
+    { 559, 18,  32}, /* ETHI */
+    { 367, 18,  33}, /* CHEROKEE */
+    { 366, 18,  33}, /* CHER */
+    { 305, 18,  34}, /* CANADIANABORIGINAL */
+    { 309, 18,  34}, /* CANS */
+    {1050, 18,  35}, /* OGHAM */
+    {1049, 18,  35}, /* OGAM */
+    {1186, 18,  36}, /* RUNIC */
+    {1187, 18,  36}, /* RUNR */
+    {1300, 18,  37}, /* TAGALOG */
+    {1333, 18,  37}, /* TGLG */
+    { 668, 18,  38}, /* HANUNOO */
+    { 665, 18,  38}, /* HANO */
+    { 297, 18,  39}, /* BUHID */
+    { 296, 18,  39}, /* BUHD */
+    {1302, 18,  40}, /* TAGBANWA */
+    {1301, 18,  40}, /* TAGB */
+    { 772, 18,  41}, /* KHMER */
+    { 774, 18,  41}, /* KHMR */
+    { 968, 18,  42}, /* MONGOLIAN */
+    { 967, 18,  42}, /* MONG */
+    { 825, 18,  43}, /* LIMBU */
+    { 824, 18,  43}, /* LIMB */
+    {1305, 18,  44}, /* TAILE */
+    {1312, 18,  44}, /* TALE */
+    {1001, 18,  45}, /* NEWTAILUE */
+    {1313, 18,  45}, /* TALU */
+    { 295, 18,  46}, /* BUGINESE */
+    { 294, 18,  46}, /* BUGI */
+    {1306, 18,  47}, /* TAITHAM */
+    { 787, 18,  47}, /* LANA */
+    { 240, 18,  48}, /* BALINESE */
+    { 239, 18,  48}, /* BALI */
+    {1260, 18,  49}, /* SUNDANESE */
+    {1259, 18,  49}, /* SUND */
+    { 248, 18,  50}, /* BATAK */
+    { 249, 18,  50}, /* BATK */
+    { 819, 18,  51}, /* LEPCHA */
+    { 818, 18,  51}, /* LEPC */
+    {1054, 18,  52}, /* OLCHIKI */
+    {1055, 18,  52}, /* OLCK */
+    { 288, 18,  53}, /* BRAILLE */
+    { 287, 18,  53}, /* BRAI */
+    { 614, 18,  54}, /* GLAGOLITIC */
+    { 613, 18,  54}, /* GLAG */
+    {1339, 18,  55}, /* TIFINAGH */
+    {1332, 18,  55}, /* TFNG */
+    { 652, 18,  56}, /* HAN */
+    { 661, 18,  56}, /* HANI */
+    { 684, 18,  57}, /* HIRAGANA */
+    { 683, 18,  57}, /* HIRA */
+    { 763, 18,  58}, /* KATAKANA */
+    { 752, 18,  58}, /* KANA */
+    {1424, 18,  59}, /* YI */
+    {1425, 18,  59}, /* YIII */
+    { 835, 18,  60}, /* LISU */
+    {1373, 18,  61}, /* VAI */
+    {1374, 18,  61}, /* VAII */
+    { 242, 18,  62}, /* BAMUM */
+    { 241, 18,  62}, /* BAMU */
+    {1289, 18,  63}, /* SYLOTINAGRI */
+    {1288, 18,  63}, /* SYLO */
+    {1119, 18,  64}, /* PHAGSPA */
+    {1118, 18,  64}, /* PHAG */
+    {1197, 18,  65}, /* SAURASHTRA */
+    {1196, 18,  65}, /* SAUR */
+    { 767, 18,  66}, /* KAYAHLI */
+    { 751, 18,  66}, /* KALI */
+    {1169, 18,  67}, /* REJANG */
+    {1178, 18,  67}, /* RJNG */
+    { 737, 18,  68}, /* JAVANESE */
+    { 736, 18,  68}, /* JAVA */
+    { 360, 18,  69}, /* CHAM */
+    {1307, 18,  70}, /* TAIVIET */
+    {1323, 18,  70}, /* TAVT */
+    { 932, 18,  71}, /* MEETEIMAYEK */
+    { 973, 18,  71}, /* MTEI */
+    { 829, 18,  72}, /* LINEARB */
+    { 827, 18,  72}, /* LINB */
+    { 857, 18,  73}, /* LYCIAN */
+    { 856, 18,  73}, /* LYCI */
+    { 312, 18,  74}, /* CARIAN */
+    { 311, 18,  74}, /* CARI */
+    {1057, 18,  75}, /* OLDITALIC */
+    { 732, 18,  75}, /* ITAL */
+    { 622, 18,  76}, /* GOTHIC */
+    { 621, 18,  76}, /* GOTH */
+    {1059, 18,  77}, /* OLDPERMIC */
+    {1116, 18,  77}, /* PERM */
+    {1361, 18,  78}, /* UGARITIC */
+    {1360, 18,  78}, /* UGAR */
+    {1060, 18,  79}, /* OLDPERSIAN */
+    {1414, 18,  79}, /* XPEO */
+    { 491, 18,  80}, /* DESERET */
+    { 515, 18,  80}, /* DSRT */
+    {1216, 18,  81}, /* SHAVIAN */
+    {1217, 18,  81}, /* SHAW */
+    {1078, 18,  82}, /* OSMANYA */
+    {1077, 18,  82}, /* OSMA */
+    {1075, 18,  83}, /* OSAGE */
+    {1076, 18,  83}, /* OSGE */
+    { 533, 18,  84}, /* ELBASAN */
+    { 532, 18,  84}, /* ELBA */
+    { 317, 18,  85}, /* CAUCASIANALBANIAN */
+    { 176, 18,  85}, /* AGHB */
+    { 828, 18,  86}, /* LINEARA */
+    { 826, 18,  86}, /* LINA */
+    { 464, 18,  87}, /* CYPRIOT */
+    { 451, 18,  87}, /* CPRT */
+    { 708, 18,  88}, /* IMPERIALARAMAIC */
+    { 217, 18,  88}, /* ARMI */
+    {1102, 18,  89}, /* PALMYRENE */
+    {1101, 18,  89}, /* PALM */
+    { 987, 18,  90}, /* NABATAEAN */
+    { 995, 18,  90}, /* NBAT */
+    { 670, 18,  91}, /* HATRAN */
+    { 669, 18,  91}, /* HATR */
+    {1125, 18,  92}, /* PHOENICIAN */
+    {1124, 18,  92}, /* PHNX */
+    { 859, 18,  93}, /* LYDIAN */
+    { 858, 18,  93}, /* LYDI */
+    { 940, 18,  94}, /* MEROITICHIEROGLYPHS */
+    { 938, 18,  94}, /* MERO */
+    { 939, 18,  95}, /* MEROITICCURSIVE */
+    { 937, 18,  95}, /* MERC */
+    { 770, 18,  96}, /* KHAROSHTHI */
+    { 769, 18,  96}, /* KHAR */
+    {1062, 18,  97}, /* OLDSOUTHARABIAN */
+    {1195, 18,  97}, /* SARB */
+    {1058, 18,  98}, /* OLDNORTHARABIAN */
+    { 992, 18,  98}, /* NARB */
+    { 884, 18,  99}, /* MANICHAEAN */
+    { 883, 18,  99}, /* MANI */
+    { 234, 18, 100}, /* AVESTAN */
+    { 235, 18, 100}, /* AVST */
+    { 722, 18, 101}, /* INSCRIPTIONALPARTHIAN */
+    {1149, 18, 101}, /* PRTI */
+    { 721, 18, 102}, /* INSCRIPTIONALPAHLAVI */
+    {1122, 18, 102}, /* PHLI */
+    {1151, 18, 103}, /* PSALTERPAHLAVI */
+    {1123, 18, 103}, /* PHLP */
+    {1063, 18, 104}, /* OLDTURKIC */
+    {1072, 18, 104}, /* ORKH */
+    {1056, 18, 105}, /* OLDHUNGARIAN */
+    { 691, 18, 105}, /* HUNG */
+    { 662, 18, 106}, /* HANIFIROHINGYA */
+    {1182, 18, 106}, /* ROHG */
+    {1423, 18, 107}, /* YEZIDI */
+    {1422, 18, 107}, /* YEZI */
+    {1061, 18, 108}, /* OLDSOGDIAN */
+    {1241, 18, 108}, /* SOGO */
+    {1240, 18, 109}, /* SOGDIAN */
+    {1239, 18, 109}, /* SOGD */
+    { 371, 18, 110}, /* CHORASMIAN */
+    { 372, 18, 110}, /* CHRS */
+    { 535, 18, 111}, /* ELYMAIC */
+    { 534, 18, 111}, /* ELYM */
+    { 285, 18, 112}, /* BRAHMI */
+    { 284, 18, 112}, /* BRAH */
+    { 750, 18, 113}, /* KAITHI */
+    { 781, 18, 113}, /* KTHI */
+    {1243, 18, 114}, /* SORASOMPENG */
+    {1242, 18, 114}, /* SORA */
+    { 359, 18, 115}, /* CHAKMA */
+    { 303, 18, 115}, /* CAKM */
+    { 862, 18, 116}, /* MAHAJANI */
+    { 863, 18, 116}, /* MAHJ */
+    {1215, 18, 117}, /* SHARADA */
+    {1220, 18, 117}, /* SHRD */
+    { 776, 18, 118}, /* KHOJKI */
+    { 775, 18, 118}, /* KHOJ */
+    { 975, 18, 119}, /* MULTANI */
+    { 974, 18, 119}, /* MULT */
+    { 777, 18, 120}, /* KHUDAWADI */
+    {1224, 18, 120}, /* SIND */
+    { 624, 18, 121}, /* GRANTHA */
+    { 623, 18, 121}, /* GRAN */
+    { 999, 18, 122}, /* NEWA */
+    {1341, 18, 123}, /* TIRHUTA */
+    {1340, 18, 123}, /* TIRH */
+    {1222, 18, 124}, /* SIDDHAM */
+    {1221, 18, 124}, /* SIDD */
+    { 961, 18, 125}, /* MODI */
+    {1311, 18, 126}, /* TAKRI */
+    {1310, 18, 126}, /* TAKR */
+    { 178, 18, 127}, /* AHOM */
+    { 508, 18, 128}, /* DOGRA */
+    { 507, 18, 128}, /* DOGR */
+    {1396, 18, 129}, /* WARANGCITI */
+    {1395, 18, 129}, /* WARA */
+    { 506, 18, 130}, /* DIVESAKURU */
+    { 503, 18, 130}, /* DIAK */
+    { 990, 18, 131}, /* NANDINAGARI */
+    { 989, 18, 131}, /* NAND */
+    {1435, 18, 132}, /* ZANABAZARSQUARE */
+    {1436, 18, 132}, /* ZANB */
+    {1245, 18, 133}, /* SOYOMBO */
+    {1244, 18, 133}, /* SOYO */
+    {1109, 18, 134}, /* PAUCINHAU */
+    {1108, 18, 134}, /* PAUC */
+    { 259, 18, 135}, /* BHAIKSUKI */
+    { 260, 18, 135}, /* BHKS */
+    { 913, 18, 136}, /* MARCHEN */
+    { 912, 18, 136}, /* MARC */
+    { 915, 18, 137}, /* MASARAMGONDI */
+    { 620, 18, 137}, /* GONM */
+    { 640, 18, 138}, /* GUNJALAGONDI */
+    { 619, 18, 138}, /* GONG */
+    { 867, 18, 139}, /* MAKASAR */
+    { 866, 18, 139}, /* MAKA */
+    { 454, 18, 140}, /* CUNEIFORM */
+    {1415, 18, 140}, /* XSUX */
+    { 531, 18, 141}, /* EGYPTIANHIEROGLYPHS */
+    { 529, 18, 141}, /* EGYP */
+    { 195, 18, 142}, /* ANATOLIANHIEROGLYPHS */
+    { 686, 18, 142}, /* HLUW */
+    { 971, 18, 143}, /* MRO */
+    { 972, 18, 143}, /* MROO */
+    { 247, 18, 144}, /* BASSAVAH */
+    { 246, 18, 144}, /* BASS */
+    {1100, 18, 145}, /* PAHAWHHMONG */
+    { 687, 18, 145}, /* HMNG */
+    { 928, 18, 146}, /* MEDEFAIDRIN */
+    { 929, 18, 146}, /* MEDF */
+    { 941, 18, 147}, /* MIAO */
+    {1132, 18, 147}, /* PLRD */
+    {1319, 18, 148}, /* TANGUT */
+    {1318, 18, 148}, /* TANG */
+    {1042, 18, 149}, /* NUSHU */
+    {1030, 18, 149}, /* NSHU */
+    { 771, 18, 150}, /* KHITANSMALLSCRIPT */
+    { 778, 18, 150}, /* KITS */
+    { 519, 18, 151}, /* DUPLOYAN */
+    { 518, 18, 151}, /* DUPL */
+    {1223, 18, 152}, /* SIGNWRITING */
+    {1214, 18, 152}, /* SGNW */
+    {1045, 18, 153}, /* NYIAKENGPUACHUEHMONG */
+    { 688, 18, 153}, /* HMNP */
+    {1394, 18, 154}, /* WANCHO */
+    {1399, 18, 154}, /* WCHO */
+    { 936, 18, 155}, /* MENDEKIKAKUI */
+    { 935, 18, 155}, /* MEND */
+    { 170, 18, 156}, /* ADLAM */
+    { 171, 18, 156}, /* ADLM */
+    { 765, 18, 157}, /* KATAKANAORHIRAGANA */
+    { 689, 18, 157}, /* HRKT */
+    {1079, 19,   0}, /* OTHER */
+    {1416, 19,   0}, /* XX */
+    {1246, 19,   1}, /* SP */
+    { 823, 19,   2}, /* LF */
+    { 452, 19,   3}, /* CR */
+    {1256, 19,   4}, /* STERM */
+    {1255, 19,   4}, /* ST */
+    { 406, 19,   5}, /* CLOSE */
+    { 405, 19,   5}, /* CL */
+    {1200, 19,   6}, /* SCONTINUE */
+    {1199, 19,   6}, /* SC */
+    { 228, 19,   7}, /* ATERM */
+    { 223, 19,   7}, /* AT */
+    {1038, 19,   8}, /* NUMERIC */
+    {1033, 19,   8}, /* NU */
+    {1369, 19,   9}, /* UPPER */
+    {1368, 19,   9}, /* UP */
+    { 843, 19,  10}, /* LOWER */
+    { 840, 19,  10}, /* LO */
+    {1211, 19,  11}, /* SEP */
+    {1205, 19,  11}, /* SE */
+    { 590, 19,  12}, /* FORMAT */
+    { 588, 19,  12}, /* FO */
+    {1064, 19,  13}, /* OLETTER */
+    { 809, 19,  13}, /* LE */
+    { 573, 19,  14}, /* EXTEND */
+    { 570, 19,  14}, /* EX */
+    {1079, 20,   0}, /* OTHER */
+    {1416, 20,   0}, /* XX */
+    { 823, 20,   1}, /* LF */
+    {1000, 20,   2}, /* NEWLINE */
+    {1014, 20,   2}, /* NL */
+    { 452, 20,   3}, /* CR */
+    {1407, 20,   4}, /* WSEGSPACE */
+    { 513, 20,   5}, /* DOUBLEQUOTE */
+    { 514, 20,   5}, /* DQ */
+    {1225, 20,   6}, /* SINGLEQUOTE */
+    {1252, 20,   6}, /* SQ */
+    { 943, 20,   7}, /* MIDNUM */
+    { 960, 20,   7}, /* MN */
+    { 944, 20,   8}, /* MIDNUMLET */
+    { 924, 20,   8}, /* MB */
+    {1038, 20,   9}, /* NUMERIC */
+    {1033, 20,   9}, /* NU */
+    { 942, 20,  10}, /* MIDLETTER */
+    { 958, 20,  10}, /* ML */
+    { 186, 20,  11}, /* ALETTER */
+    { 809, 20,  11}, /* LE */
+    { 576, 20,  12}, /* EXTENDNUMLET */
+    { 570, 20,  12}, /* EX */
+    { 590, 20,  13}, /* FORMAT */
+    { 588, 20,  13}, /* FO */
+    { 573, 20,  14}, /* EXTEND */
+    { 674, 20,  15}, /* HEBREWLETTER */
+    { 685, 20,  15}, /* HL */
+    {1443, 20,  16}, /* ZWJ */
+    { 763, 20,  17}, /* KATAKANA */
+    { 748, 20,  17}, /* KA */
+    {1166, 20,  18}, /* REGIONALINDICATOR */
+    {1171, 20,  18}, /* RI */
+    { 525, 20,  19}, /* EBASE */
+    { 524, 20,  19}, /* EB */
+    { 526, 20,  20}, /* EBASEGAZ */
+    { 527, 20,  20}, /* EBG */
+    { 538, 20,  21}, /* EMODIFIER */
+    { 536, 20,  21}, /* EM */
+    { 618, 20,  22}, /* GLUEAFTERZWJ */
+    { 597, 20,  22}, /* GAZ */
 };
 
-/* property values: 6272 bytes. */
-
 /* Codepoints which expand on full case-folding. */
-
 RE_UINT16 re_expand_on_folding[] = {
       223,   304,   329,   496,   912,   944,  1415,  7830,
      7831,  7832,  7833,  7834,  7838,  8016,  8018,  8020,
@@ -3216,4231 +3254,9697 @@ RE_UINT16 re_expand_on_folding[] = {
      8131,  8132,  8134,  8135,  8140,  8146,  8147,  8150,
      8151,  8162,  8163,  8164,  8166,  8167,  8178,  8179,
      8180,  8182,  8183,  8188, 64256, 64257, 64258, 64259,
-    64260, 64261, 64262, 64275, 64276, 64277, 64278, 64279,
+    64260, 64261, 64262, 64275, 64276, 64277, 64278, 64279
 };
 
-/* expand_on_folding: 208 bytes. */
-
-/* General_Category. */
-
-static RE_UINT8 re_general_category_stage_1[] = {
-     0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15,
-    16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 26, 26, 26, 26, 26,
-    26, 26, 26, 26, 26, 26, 27, 26, 26, 26, 26, 26, 26, 26, 26, 26,
-    26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
-    26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 28,
-    29, 26, 30, 31, 32, 33, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
-    26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 34, 35, 35, 35, 35,
-    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 37, 38, 39, 40,
-    41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56,
-    26, 57, 58, 59, 59, 59, 59, 59, 26, 26, 60, 59, 59, 59, 59, 59,
-    59, 59, 26, 61, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 26, 62, 59, 63, 26, 26, 26, 26, 26, 26, 26, 26,
-    26, 26, 26, 64, 26, 65, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 66, 67, 59, 59, 59, 59, 68, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 69, 70, 71, 72, 73, 74, 59, 59,
-    75, 76, 59, 59, 77, 59, 78, 79, 80, 81, 73, 82, 83, 84, 59, 59,
-    26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
-    26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
-    26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
-    26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
-    26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
-    26, 26, 26, 85, 26, 26, 26, 26, 26, 26, 26, 86, 87, 26, 26, 26,
-    26, 26, 26, 26, 26, 26, 26, 88, 26, 26, 26, 26, 26, 26, 26, 26,
-    26, 26, 26, 26, 26, 89, 59, 59, 59, 59, 59, 59, 26, 90, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    91, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
-    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
-    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
-    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
-    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
-    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
-    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
-    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 92,
-    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
-    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
-    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
-    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
-    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
-    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
-    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
-    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 92,
+/* Alphabetic. */
+static RE_UINT8 re_alphabetic_table_1[] = {
+     0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 13, 13,
+    13, 13, 13, 14, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 15, 13, 16, 17, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 18, 10, 10, 10, 10, 10, 10, 10, 10, 19, 20,
+    21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 10, 10, 13, 31, 10, 10,
+    10, 32, 10, 10, 10, 10, 10, 10, 10, 10, 33, 34, 13, 13, 13, 13,
+    13, 35, 13, 36, 10, 10, 10, 10, 10, 10, 10, 10, 37, 10, 10, 38,
+    10, 10, 10, 10, 10, 39, 10, 10, 40, 10, 41, 42, 43, 10, 10, 10,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 44, 13, 13, 13, 45, 46, 13,
+    13, 13, 13, 47, 13, 13, 13, 13, 13, 13, 48, 10, 10, 10, 49, 10,
+    13, 13, 13, 13, 50, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10
 };
 
-static RE_UINT16 re_general_category_stage_2[] = {
-      0,   0,   1,   2,   3,   4,   5,   6,   0,   0,   7,   8,   9,  10,  11,  12,
-     13,  13,  13,  14,  15,  13,  13,  16,  17,  18,  19,  20,  21,  22,  13,  23,
-     13,  13,  13,  24,  25,  11,  11,  11,  11,  26,  11,  27,  28,  29,  30,  31,
-     32,  32,  32,  32,  32,  32,  32,  33,  34,  35,  36,  11,  37,  38,  13,  39,
-      9,   9,   9,  11,  11,  11,  13,  13,  40,  13,  13,  13,  41,  13,  13,  13,
-     13,  13,  13,  42,   9,  43,  11,  11,  44,  45,  32,  46,  47,  48,  49,  50,
-     51,  52,  48,  48,  53,  32,  54,  55,  48,  48,  48,  48,  48,  56,  57,  58,
-     59,  60,  48,  32,  61,  48,  48,  48,  48,  48,  62,  63,  64,  48,  65,  66,
-     48,  67,  68,  69,  48,  70,  71,  72,  72,  72,  48,  73,  72,  74,  75,  32,
-     76,  48,  48,  77,  78,  79,  80,  81,  82,  83,  84,  85,  86,  87,  88,  89,
-     90,  83,  84,  91,  92,  93,  94,  95,  96,  97,  84,  98,  99, 100,  88, 101,
-    102,  83,  84, 103, 104, 105,  88, 106, 107, 108, 109, 110, 111, 112,  94, 113,
-    114, 115,  84, 116, 117, 118,  88, 119, 120, 115,  84, 121, 122, 123,  88, 124,
-    125, 115,  48, 126, 127, 128,  88, 129, 130, 131,  48, 132, 133, 134,  94, 135,
-    136,  48,  48, 137, 138, 139,  72,  72, 140,  48, 141, 142, 143, 144,  72,  72,
-    145, 146, 147, 148, 149,  48, 150, 151, 152, 153,  32, 154, 155, 156,  72,  72,
-     48,  48, 157, 158, 159, 160, 161, 162, 163, 164,   9,   9, 165,  11,  11, 166,
-     48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,
-     48,  48,  48,  48, 167, 168,  48,  48, 167,  48,  48, 169, 170, 171,  48,  48,
-     48, 170,  48,  48,  48, 172, 173, 174,  48, 175,   9,   9,   9,   9,   9, 176,
-    177,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,
-     48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,
-     48,  48,  48,  48,  48,  48, 178,  48, 179, 180,  48,  48,  48,  48, 181, 182,
-    183, 184,  48, 185,  48, 186, 183, 187,  48,  48,  48, 188, 189, 190, 191, 192,
-    193, 191,  48,  48, 194,  48,  48, 195, 196,  48, 197,  48,  48,  48,  48, 198,
-     48, 199, 200, 201, 202,  48, 203, 204,  48,  48, 205,  48, 206, 207, 208, 208,
-     48, 209,  48,  48,  48, 210, 211, 212, 191, 191, 213, 214,  72,  72,  72,  72,
-    215,  48,  48, 216, 217, 159, 218, 219, 220,  48, 221,  64,  48,  48, 222, 223,
-     48,  48, 224, 225, 226,  64,  48, 227, 228,   9,   9, 229, 230, 231, 232, 233,
-     11,  11, 234,  27,  27,  27, 235, 236,  11, 237,  27,  27,  32,  32,  32, 238,
-     13,  13,  13,  13,  13,  13,  13,  13,  13, 239,  13,  13,  13,  13,  13,  13,
-    240, 241, 240, 240, 241, 242, 240, 243, 244, 244, 244, 245, 246, 247, 248, 249,
-    250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 260,  72, 261, 262, 263,
-    264, 265, 266, 267, 268, 269, 270, 270, 271, 272, 273, 208, 274, 275, 208, 276,
-    277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277,
-    278, 208, 279, 208, 208, 208, 208, 280, 208, 281, 277, 282, 208, 283, 284, 208,
-    208, 208, 285,  72, 286,  72, 269, 269, 269, 287, 208, 208, 208, 208, 288, 269,
-    208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 289, 290, 208, 208, 291,
-    208, 208, 208, 208, 208, 208, 292, 208, 208, 208, 208, 208, 208, 208, 208, 208,
-    208, 208, 208, 208, 208, 208, 293, 294, 269, 295, 208, 208, 296, 277, 297, 277,
-    208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208,
-    277, 277, 277, 277, 277, 277, 277, 277, 298, 299, 277, 277, 277, 300, 277, 301,
-    277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277,
-    208, 208, 208, 277, 302, 208, 208, 303, 208, 304, 208, 208, 208, 208, 208, 208,
-      9,   9, 305,  11,  11, 306, 307, 308,  13,  13,  13,  13,  13,  13, 309, 310,
-     11,  11, 311,  48,  48,  48, 312, 313,  48, 314, 315, 315, 315, 315,  32,  32,
-    316, 317, 318, 319, 320,  72,  72,  72, 208, 321, 208, 208, 208, 208, 208, 322,
-    208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 323,  72, 324,
-    325, 326, 327, 328, 136,  48,  48,  48,  48, 329, 177,  48,  48,  48,  48, 330,
-    331,  48,  48, 136,  48,  48,  48,  48, 199, 332,  48,  71, 208, 208, 322,  48,
-    208, 333, 334, 208, 335, 336, 208, 208, 334, 208, 208, 336, 208, 208, 208, 208,
-    208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208,
-     48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,
-     48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,
-     48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,
-     48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48, 198, 208, 208, 208, 208,
-     48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,
-     48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  72,
-     48, 337,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,
-     48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,
-     48,  48,  48,  48,  48,  48,  48,  48, 150, 208, 208, 208, 285,  48,  48, 227,
-     48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,
-    338,  48, 339,  72,  13,  13, 340, 341,  13, 342,  48,  48,  48,  48, 343, 344,
-     31, 345, 346, 347,  13,  13,  13, 348, 349, 350, 351, 352, 353,  72,  72, 354,
-    355,  48, 356, 357,  48,  48,  48, 358, 359,  48,  48, 360, 361, 191,  32, 362,
-     64,  48, 363,  48, 364, 365,  48, 150,  76,  48,  48, 366, 367, 368, 369, 370,
-     48,  48, 371, 372, 373, 374,  48, 375,  48,  48,  48, 376, 377, 378, 379, 380,
-    381, 382, 315,  11,  11, 383, 384,  11,  11,  11,  11,  11,  48,  48, 385, 191,
-     48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,
-     48,  48,  48,  48,  48,  48,  48,  48,  48,  48, 386,  48, 387,  48,  48, 205,
-    388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388,
-    388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388,
-    389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389,
-    389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389,
-    389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389,
-     48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,
-     48,  48,  48,  48,  48,  48, 203,  48,  48,  48,  48,  48,  48, 206,  72,  72,
-    390, 391, 392, 393, 394,  48,  48,  48,  48,  48,  48, 395, 396, 397,  48,  48,
-     48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,
-     48,  48,  48, 398,  72,  48,  48,  48,  48, 399,  48,  48, 400,  72,  72, 401,
-     32, 402,  32, 403, 404, 405, 406, 407,  48,  48,  48,  48,  48,  48,  48, 408,
-    409,   2,   3,   4,   5, 410, 411, 412,  48, 413,  48, 199, 414, 415, 416, 417,
-    418,  48, 171, 419, 203, 203,  72,  72,  48,  48,  48,  48,  48,  48,  48,  71,
-    420, 269, 269, 421, 270, 270, 270, 422, 423, 324, 424,  72,  72, 208, 208, 425,
-     72,  72,  72,  72,  72,  72,  72,  72,  48, 150,  48,  48,  48, 100, 426, 427,
-     48,  48, 428,  48, 429,  48,  48, 430,  48, 431,  48,  48, 432, 433,  72,  72,
-      9,   9, 434,  11,  11,  48,  48,  48,  48, 203, 191,   9,   9, 435,  11, 436,
-     48,  48, 400,  48,  48,  48, 437,  72,  72,  72,  72,  72,  72,  72,  72,  72,
-     48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,
-     48,  48,  48, 314,  48, 198, 400,  72,  72,  72,  72,  72,  72,  72,  72,  72,
-    438,  48,  48, 439,  48, 440,  48, 441,  48, 199, 442,  72,  72,  72,  48, 443,
-     48, 444,  48, 445,  72,  72,  72,  72,  48,  48,  48, 446, 269, 447, 269, 269,
-    448, 449,  48, 450, 451, 452,  48, 453,  48, 454,  72,  72, 455,  48, 456, 457,
-     48,  48,  48, 458,  48, 459,  48, 460,  48, 461, 462,  72,  72,  72,  72,  72,
-     48,  48,  48,  48, 195,  72,  72,  72,   9,   9,   9, 463,  11,  11,  11, 464,
-     48,  48, 465, 191,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,
-     72,  72,  72,  72,  72,  72, 269, 466,  72,  72,  72,  72,  72,  72,  72,  72,
-     48, 454, 467,  48,  62, 468,  72,  72,  72,  72,  72,  72,  72,  72,  48, 314,
-    469,  48,  48, 470, 471, 447, 472, 473, 220,  48,  48, 474, 475,  48, 195, 191,
-    476,  48, 477, 478, 479,  48,  48, 480, 220,  48,  48, 481, 482, 483, 484, 485,
-     48,  97, 486, 487,  72,  72,  72,  72, 488, 489, 490,  48,  48, 491, 492, 191,
-    493,  83,  84, 494, 495, 496, 497, 498,  72,  72,  72,  72,  72,  72,  72,  72,
-     48,  48,  48, 499, 500, 501,  72,  72,  48,  48,  48, 502, 503, 191,  72,  72,
-     72,  72,  72,  72,  72,  72,  72,  72,  48,  48, 504, 505, 506, 507,  72,  72,
-     48,  48,  48, 508, 509, 191, 510,  72,  48,  48, 511, 512, 191,  72,  72,  72,
-     48, 172, 513, 514,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,
-     48,  48, 486, 515,  72,  72,  72,  72,  72,  72,   9,   9,  11,  11, 147, 516,
-     72,  72,  72,  72,  72,  72,  72,  72,  72,  72, 517,  48,  48, 518, 519,  72,
-    520,  48,  48, 521, 522, 523,  48,  48, 524, 525, 526,  72,  48,  48,  48, 195,
-     72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,
-     84,  48, 504, 527, 528, 147, 174, 529,  48, 530, 531, 532,  72,  72,  72,  72,
-    533,  48,  48, 534, 535, 191, 536,  48, 537, 538, 191,  72,  72,  72,  72,  72,
-     72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  48, 539,
-     72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72, 269, 540, 541, 542,
-     48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,
-     48,  48,  48,  48,  48,  48,  48,  48,  48, 206,  72,  72,  72,  72,  72,  72,
-    270, 270, 270, 270, 270, 270, 543, 544,  48,  48,  48,  48,  48,  48,  48,  48,
-     48,  48,  48,  48, 386,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,
-     72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,
-     72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,
-     48,  48, 199, 545,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,
-     72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,
-     48,  48,  48,  48, 314,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,
-     72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,
-     48,  48,  48, 195,  48, 199, 368,  72,  72,  72,  72,  72,  72,  48, 203, 546,
-     48,  48,  48, 547, 548, 549, 550, 551,  48,  72,  72,  72,  72,  72,  72,  72,
-     72,  72,  72,  72,   9,   9,  11,  11, 269, 552,  72,  72,  72,  72,  72,  72,
-     48,  48,  48,  48, 553, 554, 555, 555, 556, 557,  72,  72,  72,  72, 558,  72,
-     48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,
-     48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48, 400,
-     48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48, 559,
-     72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,
-     48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,
-     48, 199,  72,  72,  72, 559, 560,  48,  48,  48,  48,  48,  48,  48,  48,  48,
-     48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48, 205,
-     72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,
-     48,  48,  48,  48,  48,  48,  71, 150, 195, 561, 562,  72,  72,  72,  72,  72,
-     72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,
-    208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 323,
-    208, 208, 563, 208, 208, 208, 564, 565, 566, 208, 567, 208, 208, 208, 568,  72,
-    208, 208, 208, 208, 569,  72,  72,  72,  72,  72,  72,  72,  72,  72, 269, 570,
-    208, 208, 208, 208, 208, 285, 269, 451,  72,  72,  72,  72,  72,  72,  72,  72,
-      9, 571,  11, 572, 573, 574, 240,   9, 575, 576, 577, 578, 579,   9, 571,  11,
-    580, 581,  11, 582, 583, 584, 585,   9, 586,  11,   9, 571,  11, 572, 573,  11,
-    240,   9, 575, 585,   9, 586,  11,   9, 571,  11, 587,   9, 588, 589, 590, 591,
-     11, 592,   9, 593, 594, 595, 596,  11, 597,   9, 598,  11, 599, 600, 600, 600,
-    208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208,
-    208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208,
-     32,  32,  32, 601,  32,  32, 602, 603, 604, 605,  45,  72,  72,  72,  72,  72,
-     72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,
-    606, 607, 608,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,
-     48,  48, 150, 609, 610,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,
-     72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  48,  48, 611, 612,
-     72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,
-     48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48, 613, 614,  72,  72,
-      9,   9, 575,  11, 615, 368,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,
-     72,  72,  72,  72,  72,  72,  72, 484, 269, 269, 616, 617,  72,  72,  72,  72,
-    484, 269, 618, 619,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,
-    620,  48, 621, 622, 623, 624, 625, 626, 627, 205, 628, 205,  72,  72,  72, 629,
-     72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,
-    208, 208, 324, 208, 208, 208, 208, 208, 208, 322, 333, 630, 630, 630, 208, 323,
-    174, 208, 208, 208, 208, 208, 631, 208, 208, 208, 631,  72,  72,  72, 632, 208,
-    633, 208, 208, 324, 568, 634, 323,  72,  72,  72,  72,  72,  72,  72,  72,  72,
-    208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 635,
-    208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 323, 631, 286,
-    208, 208, 208, 208, 208, 208, 208, 322, 208, 208, 208, 208, 208, 568, 324,  72,
-    324, 208, 208, 208, 636, 175, 208, 208, 636, 208, 637,  72,  72,  72,  72,  72,
-    638, 208, 208, 208, 208, 208, 208, 639, 208, 208, 640, 208, 641, 208, 208, 208,
-    208, 208, 208, 208, 208, 322, 637, 642, 633, 323,  72,  72,  72,  72,  72,  72,
-     72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,
-     48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48, 314,  72,  72,
-     48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,
-     48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,
-     48,  48,  48, 204,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,
-     48, 203,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,
-     48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,
-     48,  48,  48,  48,  48,  48,  48,  48,  48,  48, 643,  48,  48,  48,  48,  48,
-     48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,
-     48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,
-     48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48, 100,  72,
-     48, 203,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,
-     72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,
-    644,  72, 645, 645, 645, 645, 645, 645,  72,  72,  72,  72,  72,  72,  72,  72,
-     32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  72,
-    389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389,
-    389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 646,
+static RE_UINT8 re_alphabetic_table_2[] = {
+      0,   0,   1,   1,   0,   2,   3,   3,   4,   4,   4,   4,   4,   4,   4,   4,
+      4,   4,   4,   4,   4,   4,   5,   6,   0,   0,   7,   8,   9,  10,   4,  11,
+      4,   4,   4,   4,  12,   4,   4,   4,   4,  13,  14,   4,  15,  16,  17,  18,
+     19,   4,  20,  21,   4,   4,  22,  23,  24,   4,  25,   4,   4,  26,  27,  28,
+     29,  30,  31,  32,   0,  33,  34,  35,   4,  36,  37,  38,  39,  40,  41,  42,
+     43,  44,  45,  46,  47,  48,  49,  50,  51,  48,  52,  53,  54,  55,  56,   0,
+     57,  58,  59,  60,  57,  61,  62,  63,  64,  65,  66,  67,  68,  69,  70,  71,
+     72,  73,  74,   0,  75,  76,  77,   0,  78,   0,  79,  80,  81,  82,   0,   0,
+      4,  83,  24,   4,  84,   4,  85,  86,   4,   4,   4,   4,   4,   4,   4,   4,
+      4,   4,  87,   4,  88,  89,  90,   4,  91,   4,  73,   0,  92,   4,   4,  93,
+     72,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
+      4,   4,   4,  94,   1,   4,   4,  95,  96,  97,  97,  98,   4,  99, 100,   0,
+      0,   4,   4,  31,   4, 101,   4, 102, 103, 104,  24, 105,   4, 106, 107,   0,
+    108,   4, 103, 109,   0, 110,  78,   0,   4, 111, 112,   0,   4, 113,   4, 114,
+      4, 115, 116, 117, 118,  65,   0, 119,   4,   4,   4,   4,   4,   4,   0, 120,
+      4,   4,   4,   4,   4,   4,   4,   4,  93,   4, 121, 117,   4, 122, 123, 124,
+      0,   0,   0, 125, 126,   0,   0,   0, 127, 128, 129,   4,  15,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0, 130,   4, 107,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      4, 131, 103,   4,   4,   4,   4, 132,   4,  85,   4, 133, 115, 134, 134,   4,
+      0, 135,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    136, 137,  72,   4, 138,  72,   4,  86, 139,  13,   4,   4, 140,   4,   0,  24,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
+      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
+      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   0,   0,
+      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
+      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
+      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,  82,
+      4,   4,   4,   4,  30,   0,  24, 117,   4,   4,   4,   4,   4,   4,   4,   4,
+    141, 142,   4, 143,   4,   4,   4,  92, 144, 145,   4,   4, 146,   4, 147, 148,
+    149, 150,   4,  97,   4,   4, 151, 152,  27, 101, 153,  82,   4, 154, 135, 155,
+      4, 115, 156, 157,   4, 103, 158, 159, 160, 161,  86, 162,   4,   4,   4,  32,
+      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
+      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4, 163, 164, 108,
+      0,   0,   0,   0,   0,   0,   0,   0,   4,   4,   4,   4,   4,   4,   4,   4,
+      4,   4,   4, 165,   4,   4, 166,   0, 167, 168, 169,   4,   4,  26, 170,   4,
+      4,   4,   4,   4,   4,   4,   4,   4,   4, 117,  24,   4, 171,   4, 150, 172,
+      0,   0,   0, 173,   4,   4,   4,  82,   0,   1,   1, 174,   4, 103, 175,   0,
+    176, 177, 178,   0,   4,   4,   4,  73,   0,   0,   4, 179,   0,   0,   0,   0,
+      0,   0,   0,   0,  82,   4, 180,   0,   4,  25, 101,  73, 117,   4, 181,   0,
+      4,   4,   4,   4, 117,  24, 182, 108,   4, 183,   4,  60,   0,   0,   0,   0,
+      4,   4,   4,   4,   4,   4,   4,   4,   4, 115, 102, 150,   0,   0,   0,   0,
+    184, 185, 102, 115, 103,   0,   0, 186, 102, 166,   0,   0,   4, 187,   0,   0,
+    188, 102,   0,  82,  82,   0,  79, 189,   4, 102, 102, 153,  26,   0,   0,   0,
+      4,   4,  15,   0,   4, 153,   4, 153,   4, 150,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   4, 190,   0,   0,  82, 191, 192,   0,   0,  24, 189, 115,
+      4,   4, 192,   0, 145,  31,  24,  15,   4, 153, 193, 194,   4,   4, 195,   0,
+    196, 197,   0,   0, 198, 118,   4,  15,  39,  48, 199,  60,   0,   0,   0,   0,
+      4,   4, 200, 201,   4,   4, 202,   0,   0,   0,   0,   0,   4, 203, 204,   0,
+      4, 103, 205,   0,   4, 206,   0,   0,  65,  32,   0,   0,   0,   0,   0,   0,
+      4,  31,   0,   0,   0,   4,   4, 207, 208, 209, 210,   0,   0, 211,  29, 212,
+      4, 213,  24,   4, 214,   0,   4,  31,   0,   0,   0,   0,   0,   0,   0,   0,
+    215, 216,  78, 217, 171, 218,   0,   0, 219, 220, 221, 222, 223,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0, 115,   0,   0,   0,   0,   0, 224,   0,   0,
+      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
+      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4, 166,   0,   0,   0,
+      4,   4,   4, 140,   4,   4,   4,   4,   4,   4,  60,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      4, 140,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
+      4,   4, 225,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
+      4,  31, 103,   0,   0,   0,  24, 156,   4,  92,  60, 226,  92,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   4,   4,   0,   0,   0,   0,   4,   4, 227,   4, 228,   0,   0, 229,
+      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
+      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4, 230,
+      4,   4,   4,   4,   4,   4, 102,   0,  15,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      4,   4,   4,   4,   4,   4,   4,   4, 103,   0, 231, 193,   4,   4,   4,   4,
+      4,   4,   4,   4,   4,   4,   4, 108,   0,   0,   0,   0,   0,   0,   0,   0,
+      4,   4,   4, 232, 233,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      4,   4,  33,   4, 234, 235, 236,   4, 237, 238, 239,   4,   4,   4,   4,   4,
+      4,   4,   4,   4,   4, 240, 241,  86,  33,  33, 131, 131, 215, 215, 242,   0,
+    243, 244,   0,   0,   0,   0,   0,   0,   4, 245, 246,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   4, 247,   0,   0,   0,   0,   0,   0,   0,   0,
+      4,   4,   4,   4,   4,   4, 189,   0,   4,   4, 248,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    236, 249, 250, 251, 252, 253,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,  24, 162, 162, 107,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
+      4,   4,   4,   4,   4,   4, 117,   0,   4,   4,   4,   4,   4,   4,   4,   4,
+      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
+      4,   4,   4,   4,   4,   4,   4,   4,   4, 179,   4,   4,   4,   4,   4,   4,
+    117,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
+      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
+      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
+      4,   4,   4,   4,   4, 254,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
+      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
+      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,  78,
+      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
+    117,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
+      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,  32,   0,   0,   0,   0,   0
 };
 
-static RE_UINT8 re_general_category_stage_3[] = {
-      0,   0,   0,   0,   0,   0,   0,   0,   1,   2,   3,   2,   4,   5,   6,   2,
-      7,   7,   7,   7,   7,   2,   8,   9,  10,  11,  11,  11,  11,  11,  11,  11,
-     11,  11,  11,  11,  11,  12,  13,  14,  15,  16,  16,  16,  16,  16,  16,  16,
-     16,  16,  16,  16,  16,  17,  18,  19,   1,  20,  20,  21,  22,  23,  24,  25,
-     26,  27,  15,   2,  28,  29,  27,  30,  11,  11,  11,  11,  11,  11,  11,  11,
-     11,  11,  11,  31,  11,  11,  11,  32,  16,  16,  16,  16,  16,  16,  16,  16,
-     16,  16,  16,  33,  16,  16,  16,  16,  32,  32,  32,  32,  32,  32,  32,  32,
-     32,  32,  32,  32,  34,  34,  34,  34,  34,  34,  34,  34,  16,  32,  32,  32,
-     32,  32,  32,  32,  11,  34,  34,  16,  34,  32,  32,  11,  34,  11,  16,  11,
-     11,  34,  32,  11,  32,  16,  11,  34,  32,  32,  32,  11,  34,  16,  32,  11,
-     34,  11,  34,  34,  32,  35,  32,  16,  36,  36,  37,  34,  38,  37,  34,  34,
-     34,  34,  34,  34,  34,  34,  16,  32,  34,  38,  32,  11,  32,  32,  32,  32,
-     32,  32,  16,  16,  16,  11,  34,  32,  34,  34,  11,  32,  32,  32,  32,  32,
-     16,  16,  39,  16,  16,  16,  16,  16,  40,  40,  40,  40,  40,  40,  40,  40,
-     40,  41,  41,  40,  40,  40,  40,  40,  40,  41,  41,  41,  41,  41,  41,  41,
-     40,  40,  42,  41,  41,  41,  42,  42,  41,  41,  41,  41,  41,  41,  41,  41,
-     43,  43,  43,  43,  43,  43,  43,  43,  32,  32,  42,  32,  44,  45,  16,  10,
-     44,  44,  41,  46,  11,  47,  47,  11,  34,  11,  11,  11,  11,  11,  11,  11,
-     11,  48,  11,  11,  11,  11,  16,  16,  16,  16,  16,  16,  16,  16,  16,  34,
-     16,  11,  32,  16,  32,  32,  32,  32,  16,  16,  32,  49,  34,  32,  34,  11,
-     32,  50,  43,  43,  51,  32,  32,  32,  11,  34,  34,  34,  34,  34,  34,  16,
-     48,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  47,  52,   2,   2,   2,
-     16,  16,  16,  16,  53,  54,  55,  56,  57,  43,  43,  43,  43,  43,  43,  43,
-     43,  43,  43,  43,  43,  43,  43,  58,  59,  60,  43,  59,  44,  44,  44,  44,
-     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  61,  44,  62,
-     36,  63,  64,  44,  44,  44,  44,  44,  65,  65,  65,   8,   9,  66,   2,  67,
-     43,  43,  43,  43,  43,  60,  68,   2,  69,  36,  36,  36,  36,  70,  43,  43,
-      7,   7,   7,   7,   7,   2,   2,  36,  71,  36,  36,  36,  36,  36,  36,  36,
-     36,  36,  72,  43,  43,  43,  73,  50,  43,  43,  74,  75,  76,  43,  43,  36,
-      7,   7,   7,   7,   7,  36,  77,  78,   2,   2,   2,   2,   2,   2,   2,  79,
-     70,  36,  36,  36,  36,  36,  36,  36,  43,  43,  43,  43,  43,  80,  62,  36,
-     36,  36,  36,  43,  43,  43,  43,  43,  71,  44,  44,  44,  44,  44,  44,  44,
-      7,   7,   7,   7,   7,  36,  36,  36,  36,  36,  36,  36,  36,  70,  43,  43,
-     43,  43,  40,  21,   2,  81,  57,  20,  36,  36,  36,  43,  43,  75,  43,  43,
-     43,  43,  75,  43,  75,  43,  43,  44,   2,   2,   2,   2,   2,   2,   2,  64,
-     36,  36,  36,  36,  70,  43,  44,  64,  36,  36,  36,  36,  36,  61,  44,  44,
-     44,  44,  44,  44,  44,  44,  44,  44,  36,  36,  61,  36,  36,  36,  36,  44,
-     44,  57,  43,  43,  43,  43,  43,  43,  43,  82,  43,  43,  43,  43,  43,  43,
-     43,  83,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  83,  71,  84,
-     85,  43,  43,  43,  83,  84,  85,  84,  70,  43,  43,  43,  36,  36,  36,  36,
-     36,  43,   2,   7,   7,   7,   7,   7,  86,  36,  36,  36,  36,  36,  36,  36,
-     70,  84,  62,  36,  36,  36,  61,  62,  61,  62,  36,  36,  36,  36,  36,  36,
-     36,  36,  36,  36,  61,  36,  36,  36,  61,  61,  44,  36,  36,  44,  71,  84,
-     85,  43,  80,  87,  88,  87,  85,  61,  44,  44,  44,  87,  44,  44,  36,  62,
-     36,  43,  44,   7,   7,   7,   7,   7,  36,  20,  27,  27,  27,  56,  63,  80,
-     57,  83,  62,  36,  36,  61,  44,  62,  61,  36,  62,  61,  36,  44,  80,  84,
-     85,  80,  44,  57,  80,  57,  43,  44,  57,  44,  44,  44,  62,  36,  61,  61,
-     44,  44,  44,   7,   7,   7,   7,   7,  43,  36,  70,  64,  44,  44,  44,  44,
-     57,  83,  62,  36,  36,  36,  36,  62,  36,  62,  36,  36,  36,  36,  36,  36,
-     61,  36,  62,  36,  36,  44,  71,  84,  85,  43,  43,  57,  83,  87,  85,  44,
-     61,  44,  44,  44,  44,  44,  44,  44,  66,  44,  44,  44,  62,  43,  43,  43,
-     57,  84,  62,  36,  36,  36,  61,  62,  61,  36,  62,  36,  36,  44,  71,  85,
-     85,  43,  80,  87,  88,  87,  85,  44,  44,  44,  44,  83,  44,  44,  36,  62,
-     78,  27,  27,  27,  44,  44,  44,  44,  44,  71,  62,  36,  36,  61,  44,  36,
-     61,  36,  36,  44,  62,  61,  61,  36,  44,  62,  61,  44,  36,  61,  44,  36,
-     36,  36,  36,  36,  36,  44,  44,  84,  83,  88,  44,  84,  88,  84,  85,  44,
-     61,  44,  44,  87,  44,  44,  44,  44,  27,  89,  67,  67,  56,  90,  44,  44,
-     83,  84,  71,  36,  36,  36,  61,  36,  61,  36,  36,  36,  36,  36,  36,  36,
-     36,  36,  36,  36,  36,  44,  62,  43,  83,  84,  88,  43,  80,  43,  43,  44,
-     44,  44,  57,  80,  36,  61,  44,  44,  44,  44,  44,  91,  27,  27,  27,  89,
-     70,  84,  72,  36,  36,  36,  61,  36,  36,  36,  62,  36,  36,  44,  71,  85,
-     84,  84,  88,  83,  88,  84,  43,  44,  44,  44,  87,  88,  44,  44,  44,  61,
-     62,  61,  44,  44,  44,  44,  44,  44,  43,  84,  62,  36,  36,  36,  61,  36,
-     36,  36,  36,  36,  36,  70,  71,  84,  85,  43,  80,  84,  88,  84,  85,  77,
-     44,  44,  36,  92,  27,  27,  27,  93,  27,  27,  27,  27,  89,  36,  36,  36,
-     44,  84,  62,  36,  36,  36,  36,  36,  36,  36,  36,  61,  44,  36,  36,  36,
-     36,  62,  36,  36,  36,  36,  62,  44,  36,  36,  36,  61,  44,  80,  44,  87,
-     84,  43,  80,  80,  84,  84,  84,  84,  44,  84,  64,  44,  44,  44,  44,  44,
-     62,  36,  36,  36,  36,  36,  36,  36,  70,  36,  43,  43,  43,  80,  44,  94,
-     36,  36,  36,  75,  43,  43,  43,  60,   7,   7,   7,   7,   7,   2,  44,  44,
-     62,  61,  61,  36,  36,  61,  36,  36,  36,  36,  62,  62,  36,  36,  36,  36,
-     70,  36,  43,  43,  43,  43,  71,  44,  36,  36,  61,  81,  43,  43,  43,  44,
-      7,   7,   7,   7,   7,  44,  36,  36,  77,  67,   2,   2,   2,   2,   2,   2,
-      2,  95,  95,  67,  43,  67,  67,  67,   7,   7,   7,   7,   7,  27,  27,  27,
-     27,  27,  50,  50,  50,   4,   4,  84,  36,  36,  36,  36,  62,  36,  36,  36,
-     36,  36,  36,  36,  36,  36,  61,  44,  57,  43,  43,  43,  43,  43,  43,  83,
-     43,  43,  60,  43,  36,  36,  70,  43,  43,  43,  43,  43,  57,  43,  43,  43,
-     43,  43,  43,  43,  43,  43,  80,  67,  67,  67,  67,  76,  67,  67,  90,  67,
-      2,   2,  95,  67,  21,  64,  44,  44,  36,  36,  36,  36,  36,  92,  85,  43,
-     83,  43,  43,  43,  85,  83,  85,  71,   7,   7,   7,   7,   7,   2,   2,   2,
-     36,  36,  36,  84,  43,  36,  36,  43,  71,  84,  96,  92,  84,  84,  84,  36,
-     70,  43,  71,  36,  36,  36,  36,  36,  36,  83,  85,  83,  84,  84,  85,  92,
-      7,   7,   7,   7,   7,  84,  85,  67,  11,  11,  11,  48,  44,  44,  48,  44,
-     16,  16,  16,  16,  16,  53,  45,  16,  36,  36,  36,  36,  61,  36,  36,  44,
-     36,  36,  36,  61,  61,  36,  36,  44,  61,  36,  36,  44,  36,  36,  36,  61,
-     61,  36,  36,  44,  36,  36,  36,  36,  36,  36,  36,  61,  36,  36,  36,  36,
-     36,  36,  36,  36,  36,  61,  57,  43,   2,   2,   2,   2,  97,  27,  27,  27,
-     27,  27,  27,  27,  27,  27,  98,  44,  67,  67,  67,  67,  67,  44,  44,  44,
-     11,  11,  11,  44,  16,  16,  16,  44,  99,  36,  36,  36,  36,  36,  36,  36,
-     36,  36,  36,  36,  36,  36,  77,  72, 100,  36,  36,  36,  36,  36,  36,  36,
-     36,  36,  36,  36,  36, 101, 102,  44,  36,  36,  36,  36,  36,  63,   2, 103,
-    104,  36,  36,  36,  61,  44,  44,  44,  36,  36,  36,  36,  36,  36,  61,  36,
-     36,  43,  80,  44,  44,  44,  44,  44,  36,  43,  60,  64,  44,  44,  44,  44,
-     36,  43,  44,  44,  44,  44,  44,  44,  61,  43,  44,  44,  44,  44,  44,  44,
-     36,  36,  43,  85,  43,  43,  43,  84,  84,  84,  84,  83,  85,  43,  43,  43,
-     43,  43,   2,  86,   2,  66,  70,  44,   7,   7,   7,   7,   7,  44,  44,  44,
-     27,  27,  27,  27,  27,  44,  44,  44,   2,   2,   2, 105,   2,  59,  43,  68,
-     36, 106,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  61,  44,  44,  44,
-     36,  36,  70,  71,  36,  36,  36,  36,  36,  36,  36,  36,  70,  61,  44,  44,
-     36,  36,  36,  44,  44,  44,  44,  44,  36,  36,  36,  36,  36,  36,  36,  61,
-     43,  83,  84,  85,  83,  84,  44,  44,  84,  83,  84,  84,  85,  43,  44,  44,
-     90,  44,   2,   7,   7,   7,   7,   7,  36,  36,  36,  36,  36,  36,  36,  44,
-     36,  36,  61,  44,  44,  44,  44,  44,  36,  36,  36,  36,  36,  36,  44,  44,
-     36,  36,  36,  36,  36,  44,  44,  44,   7,   7,   7,   7,   7,  98,  44,  67,
-     67,  67,  67,  67,  67,  67,  67,  67,  36,  36,  36,  70,  83,  85,  44,   2,
-     36,  36,  92,  83,  43,  43,  43,  80,  83,  83,  85,  43,  43,  43,  83,  84,
-     84,  85,  43,  43,  43,  43,  80,  57,   2,   2,   2,  86,   2,   2,   2,  44,
-     43,  43,  43,  43,  43,  43,  43, 107,  43,  43,  96,  36,  36,  36,  36,  36,
-     36,  36,  83,  43,  43,  83,  83,  84,  84,  83,  96,  36,  36,  36,  44,  44,
-     95,  67,  67,  67,  67,  50,  43,  43,  43,  43,  67,  67,  67,  67,  90,  44,
-     43,  96,  36,  36,  36,  36,  36,  36,  92,  43,  43,  84,  43,  85,  43,  36,
-     36,  36,  36,  83,  43,  84,  85,  85,  43,  84,  44,  44,  44,  44,   2,   2,
-     36,  36,  84,  84,  84,  84,  43,  43,  43,  43,  84,  43,  44,  91,   2,   2,
-      7,   7,   7,   7,   7,  44,  62,  36,  36,  36,  36,  36,  40,  40,  40,   2,
-     16,  16,  16,  16, 108,  44,  44,  44,  11,  11,  11,  11,  11,  47,  48,  11,
-      2,   2,   2,   2,  44,  44,  44,  44,  43,  60,  43,  43,  43,  43,  43,  43,
-     83,  43,  43,  43,  71,  36,  70,  36,  36,  36,  71,  92,  43,  61,  44,  44,
-     16,  16,  16,  16,  16,  16,  40,  40,  40,  40,  40,  40,  40,  45,  16,  16,
-     16,  16,  16,  16,  45,  16,  16,  16,  16,  16,  16,  16,  16, 109,  40,  40,
-     43,  43,  43,  43,  43,  57,  43,  43,  32,  32,  32,  16,  16,  16,  16,  32,
-     16,  16,  16,  16,  11,  11,  11,  11,  16,  16,  16,  44,  11,  11,  11,  44,
-     16,  16,  16,  16,  48,  48,  48,  48,  16,  16,  16,  16,  16,  16,  16,  44,
-     16,  16,  16,  16, 110, 110, 110, 110,  16,  16, 108,  16,  11,  11, 111, 112,
-     41,  16, 108,  16,  11,  11, 111,  41,  16,  16,  44,  16,  11,  11, 113,  41,
-     16,  16,  16,  16,  11,  11, 114,  41,  44,  16, 108,  16,  11,  11, 111, 115,
-    116, 116, 116, 116, 116, 117,  65,  65, 118, 118, 118,   2, 119, 120, 119, 120,
-      2,   2,   2,   2, 121,  65,  65, 122,   2,   2,   2,   2, 123, 124,   2, 125,
-    126,   2, 127, 128,   2,   2,   2,   2,   2,   9, 126,   2,   2,   2,   2, 129,
-     65,  65,  68,  65,  65,  65,  65,  65, 130,  44,  27,  27,  27,   8, 127, 131,
-     27,  27,  27,  27,  27,   8, 127, 102,  40,  40,  40,  40,  40,  40,  81,  44,
-     20,  20,  20,  20,  20,  20,  20,  20,  43,  43,  43,  43,  43,  43, 132,  51,
-    133,  51, 133,  43,  43,  43,  43,  43,  80,  44,  44,  44,  44,  44,  44,  44,
-     67, 134,  67, 135,  67,  34,  11,  16,  11,  32, 135,  67,  49,  11,  11,  67,
-     67,  67, 134, 134, 134,  11,  11, 136,  11,  11,  35,  36,  39,  67,  16,  11,
-      8,   8,  49,  16,  16,  26,  67, 137,  27,  27,  27,  27,  27,  27,  27,  27,
-    103, 103, 103, 103, 103, 103, 103, 103, 103, 138, 139, 103, 140,  67,  44,  44,
-      8,   8, 141,  67,  67,   8,  67,  67, 141,  26,  67, 141,  67,  67,  67, 141,
-     67,  67,  67,  67,  67,  67,  67,   8,  67, 141, 141,  67,  67,  67,  67,  67,
-     67,  67,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,
-     67,  67,  67,  67,   4,   4,  67,  67,   8,  67,  67,  67, 142, 143,  67,  67,
-     67,  67,  67,  67,  67,  67, 141,  67,  67,  67,  67,  67,  67,  26,   8,   8,
-      8,   8,  67,  67,  67,  67,  67,  67,  67,  67,  67,  67,  67,  67,   8,   8,
-      8,  67,  67,  67,  67,  67,  67,  67,  67,  67,  67,  90,  44,  44,  44,  44,
-     67,  67,  67,  67,  67,  90,  44,  44,  27,  27,  27,  27,  27,  27,  67,  67,
-     67,  67,  67,  67,  67,  27,  27,  27,  67,  67,  67,  26,  67,  67,  67,  67,
-     26,  67,  67,  67,  67,  67,  67,  67,  67,  67,  67,  67,   8,   8,   8,   8,
-     67,  67,  67,  67,  67,  67,  67,  26,  67,  67,  67,  67,   4,   4,   4,   4,
-      4,   4,   4,  27,  27,  27,  27,  27,  27,  27,  67,  67,  67,  67,  67,  67,
-      8,   8, 127, 144,   8,   8,   8,   8,   8,   8,   8,   4,   4,   4,   4,   4,
-      8, 127, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 144,   8,   8,   8,
-      8,   8,   8,   8,   4,   4,   8,   8,   8,   8,   8,   8,   8,   8,   4,   8,
-      8,   8, 141,  26,   8,   8, 141,  67,  67,  67,  44,  67,  67,  67,  67,  67,
-     67,  67,  67,  44,  67,  67,  67,  67,  11,  11,  11,  11,  11,  11,  11,  47,
-     16,  16,  16,  16,  16,  16,  16, 108,  32,  11,  32,  34,  34,  34,  34,  11,
-     32,  32,  34,  16,  16,  16,  40,  11,  32,  32, 137,  67,  67, 135,  34, 146,
-     43,  32,  44,  44,  91,   2,  97,   2,  16,  16,  16, 147,  44,  44, 147,  44,
-     36,  36,  36,  36,  44,  44,  44,  52,  64,  44,  44,  44,  44,  44,  44,  57,
-     36,  36,  36,  61,  44,  44,  44,  44,  36,  36,  36,  61,  36,  36,  36,  61,
-      2, 119, 119,   2, 123, 124, 119,   2,   2,   2,   2,   6,   2, 105, 119,   2,
-    119,   4,   4,   4,   4,   2,   2,  86,   2,   2,   2,   2,   2, 118,   2,   2,
-    105, 148,   2,   2,   2,   2,   2,   2,  67,  67,  67,  67,  67,  55,  67,  67,
-     67,  67,  44,  44,  44,  44,  44,  44,  67,  67,  67,  44,  44,  44,  44,  44,
-     67,  67,  67,  67,  67,  67,  44,  44,   1,   2, 149, 150,   4,   4,   4,   4,
-      4,  67,   4,   4,   4,   4, 151, 152, 153, 103, 103, 103, 103,  43,  43,  84,
-    154,  40,  40,  67, 103, 155,  63,  67,  36,  36,  36,  61,  57, 156, 157,  69,
-     36,  36,  36,  36,  36,  63,  40,  69,  44,  44,  62,  36,  36,  36,  36,  36,
-     67,  27,  27,  67,  67,  67,  67,  67,  67,  67,  67,  67,  67,  67,  67,  90,
-     27,  27,  27,  27,  27,  67,  67,  67,  67,  67,  67,  67,  27,  27,  27,  27,
-    158,  27,  27,  27,  27,  27,  27,  27,  36,  36, 106,  36,  36,  36,  36,  36,
-     36,  36,  36,  36,  36,  36, 159,   2,   7,   7,   7,   7,   7,  36,  44,  44,
-     32,  32,  32,  32,  32,  32,  32,  70,  51, 160,  43,  43,  43,  43,  43,  86,
-     32,  32,  32,  32,  32,  32,  40,  43,  36,  36,  36, 103, 103, 103, 103, 103,
-     43,   2,   2,   2,  44,  44,  44,  44,  41,  41,  41, 157,  40,  40,  40,  40,
-     41,  32,  32,  32,  32,  32,  32,  32,  16,  32,  32,  32,  32,  32,  32,  32,
-     45,  16,  16,  16,  34,  34,  34,  32,  32,  32,  32,  32,  42, 161,  34,  35,
-     32,  32,  16,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  11,  11,  32,
-     11,  11,  32,  32,  32,  32,  32,  32,  44,  32,  11,  47,  44,  44,  44,  44,
-     44,  44,  44,  62,  40,  35,  36,  36,  36,  71,  36,  71,  36,  70,  36,  36,
-     36,  92,  85,  83,  67,  67,  44,  44,  27,  27,  27,  67, 162,  44,  44,  44,
-     36,  36,   2,   2,  44,  44,  44,  44,  84,  36,  36,  36,  36,  36,  36,  36,
-     36,  36,  84,  84,  84,  84,  84,  84,  84,  84,  43,  44,  44,  44,  44,   2,
-     43,  36,  36,  36,   2,  72,  72,  70,  36,  36,  36,  43,  43,  43,  43,   2,
-     36,  36,  36,  70,  43,  43,  43,  43,  43,  84,  44,  44,  44,  44,  44,  91,
-     36,  70,  84,  43,  43,  84,  43,  84, 163,   2,   2,   2,   2,   2,   2,  52,
-      7,   7,   7,   7,   7,  44,  44,   2,  36,  36,  70,  69,  36,  36,  36,  36,
-      7,   7,   7,   7,   7,  36,  36,  61,  36,  36,  36,  36,  70,  43,  43,  83,
-     85,  83,  85,  80,  44,  44,  44,  44,  36,  70,  36,  36,  36,  36,  83,  44,
-      7,   7,   7,   7,   7,  44,   2,   2,  69,  36,  36,  77,  67,  92,  83,  36,
-     71,  43,  71,  70,  71,  36,  36,  43,  70,  61,  44,  44,  44,  44,  44,  44,
-     44,  44,  44,  44,  44,  62, 106,   2,  36,  36,  36,  36,  36,  92,  43,  84,
-      2, 106, 164,  80,  44,  44,  44,  44,  62,  36,  36,  61,  62,  36,  36,  61,
-     62,  36,  36,  61,  44,  44,  44,  44,  16,  16,  16,  16,  16, 112,  40,  40,
-     16,  16,  16,  16,  44,  44,  44,  44,  36,  92,  85,  84,  83, 163,  85,  44,
-     36,  36,  44,  44,  44,  44,  44,  44,  36,  36,  36,  61,  44,  62,  36,  36,
-    165, 165, 165, 165, 165, 165, 165, 165, 166, 166, 166, 166, 166, 166, 166, 166,
-     16,  16,  16, 108,  44,  44,  44,  44,  44, 147,  16,  16,  44,  44,  62,  71,
-     36,  36,  36,  36, 167,  36,  36,  36,  36,  36,  36,  61,  36,  36,  61,  61,
-     36,  62,  61,  36,  36,  36,  36,  36,  36,  41,  41,  41,  41,  41,  41,  41,
-     41,  44,  44,  44,  44,  44,  44,  44,  44,  62,  36,  36,  36,  36,  36,  36,
-     36,  36,  36,  36,  36,  36,  36, 145,  44,  36,  36,  36,  36,  36,  36,  36,
-     36,  36,  36,  36,  44,  44,  44,  44,  36,  36,  36,  36,  36,  36, 162,  44,
-      2,   2,   2, 168, 128,  44,  44,  44,   6, 169, 170, 145, 145, 145, 145, 145,
-    145, 145, 128, 168, 128,   2, 125, 171,   2,  64,   2,   2, 151, 145, 145, 128,
-      2, 172,   8, 173,  66,   2,  44,  44,  36,  36,  61,  36,  36,  36,  36,  36,
-     36,  36,  36,  36,  36,  36,  61,  79,  91,   2,   3,   2,   4,   5,   6,   2,
-     16,  16,  16,  16,  16,  17,  18, 127, 128,   4,   2,  36,  36,  36,  36,  36,
-     69,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  40,
-     44,  36,  36,  36,  44,  36,  36,  36,  44,  36,  36,  36,  44,  36,  61,  44,
-     20, 174,  56, 175,  26,   8, 141,  90,  44,  44,  44,  44,  79,  65,  67,  44,
-     36,  36,  36,  36,  36,  36,  62,  36,  36,  36,  36,  36,  36,  61,  36,  62,
-      2,  64,  44, 176,  27,  27,  27,  27,  27,  27,  44,  55,  67,  67,  67,  67,
-    103, 103, 140,  27,  89,  67,  67,  67,  67,  67,  67,  67,  67,  27,  67,  90,
-     90,  44,  44,  44,  44,  44,  44,  44,  67,  67,  67,  67,  67,  67,  50,  44,
-    177,  27,  27,  27,  27,  27,  27,  27,  27,  27,  27,  27,  27,  27,  44,  44,
-     27,  27,  44,  44,  44,  44,  62,  36, 150,  36,  36,  36,  36, 178,  44,  44,
-     36,  36,  36,  43,  43,  80,  44,  44,  36,  36,  36,  36,  36,  36,  36,  91,
-     36,  36,  44,  44,  36,  36,  36,  36, 179, 103, 103,  44,  44,  44,  44,  44,
-     11,  11,  11,  11,  16,  16,  16,  16,  11,  11,  44,  44,  16,  16,  16,  16,
-     16,  16,  16,  16,  16,  16,  44,  44,  36,  36,  44,  44,  44,  44,  44,  91,
-     36,  36,  36,  44,  61,  36,  36,  36,  36,  36,  36,  62,  61,  44,  61,  62,
-     36,  36,  36,  91,  27,  27,  27,  27,  36,  36,  36,  77, 158,  27,  27,  27,
-     44,  44,  44, 176,  27,  27,  27,  27,  36,  61,  36,  44,  44, 176,  27,  27,
-     36,  36,  36,  27,  27,  27,  44,  91,  36,  36,  36,  36,  36,  44,  44,  91,
-     36,  36,  36,  36,  44,  44,  27,  36,  44,  27,  27,  27,  27,  27,  27,  27,
-     70,  43,  57,  80,  44,  44,  43,  43,  36,  36,  62,  36,  62,  36,  36,  36,
-     36,  36,  36,  44,  43,  80,  44,  57,  27,  27,  27,  27,  98,  44,  44,  44,
-      2,   2,   2,   2,  64,  44,  44,  44,  36,  36,  36,  36,  36,  36, 180,  30,
-     36,  36,  36,  36,  36,  36, 180,  27,  36,  36,  36,  36,  78,  36,  36,  36,
-     36,  36,  70,  80,  44, 176,  27,  27,   2,   2,   2,  64,  44,  44,  44,  44,
-     36,  36,  36,  44,  91,   2,   2,   2,  36,  36,  36,  44,  27,  27,  27,  27,
-     36,  61,  44,  44,  27,  27,  27,  27,  36,  44,  44,  44,  91,   2,  64,  44,
-     44,  44,  44,  44, 176,  27,  27,  27,  11,  47,  44,  44,  44,  44,  44,  44,
-     16, 108,  44,  44,  44,  27,  27,  27,  36,  36,  43,  43,  44,  44,  44,  44,
-     27,  27,  27,  27,  27,  27,  27,  98,  27,  27,  27,  93,  44,  44,  44,  44,
-    177,  27,  30,   2,   2,  44,  44,  44,  85,  96,  36,  36,  36,  36,  36,  36,
-     36,  36,  36,  36,  43,  43,  43,  43,  43,  43,  43,  60,   2,   2,   2,  44,
-     27,  27,  27,   7,   7,   7,   7,   7,  44,  44,  44,  44,  44,  44,  44,  57,
-     84,  85,  43,  83,  85,  60, 181,   2,   2,  44,  44,  44,  44,  44,  79,  44,
-     43,  71,  36,  36,  36,  36,  36,  36,  36,  36,  36,  70,  43,  43,  85,  43,
-     43,  43,  80,   7,   7,   7,   7,   7,   2,   2,  92,  88,  44,  44,  44,  44,
-     36,  70,   2,  61,  44,  44,  44,  44,  36,  92,  84,  43,  43,  43,  43,  83,
-     96,  36,  63,   2,  59,  43,  60,  44,   7,   7,   7,   7,   7,  63,  63,   2,
-    176,  27,  27,  27,  27,  27,  27,  27,  27,  27,  98,  44,  44,  44,  44,  44,
-     36,  36,  36,  36,  36,  36,  84,  85,  43,  84,  83,  43,   2,   2,   2,  80,
-     36,  36,  36,  61,  61,  36,  36,  62,  36,  36,  36,  36,  36,  36,  36,  62,
-     36,  36,  36,  36,  63,  44,  44,  44,  36,  36,  36,  36,  36,  36,  36,  70,
-     84,  85,  43,  43,  43,  80,  44,  44,  43,  84,  62,  36,  36,  36,  61,  62,
-     61,  36,  62,  36,  36,  57,  71,  84,  83,  84,  88,  87,  88,  87,  84,  44,
-     61,  44,  44,  87,  44,  44,  62,  36,  36,  84,  44,  43,  43,  43,  80,  44,
-     43,  43,  80,  44,  44,  44,  44,  44,  36,  36,  92,  84,  43,  43,  43,  43,
-     84,  43,  83,  71,  36,  63,   2,   2,   7,   7,   7,   7,   7,  91,  91,  71,
-     84,  85,  43,  43,  83,  83,  84,  85,  83,  43,  36,  72,  44,  44,  44,  44,
-     36,  36,  36,  36,  36,  36,  36,  92,  84,  43,  43,  44,  84,  84,  43,  85,
-     60,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,  36,  36,  43,  44,
-     84,  85,  43,  43,  43,  83,  85,  85,  60,   2,  61,  44,  44,  44,  44,  44,
-      2,   2,   2,   2,   2,   2,  64,  44,  36,  36,  36,  36,  36,  70,  85,  84,
-     43,  43,  43,  85,  61,  44,  44,  44,  84,  43,  43,  85,  43,  43,  44,  44,
-      7,   7,   7,   7,   7,  27,   2,  95,  43,  43,  43,  43,  85,  60,  44,  44,
-     27,  98,  44,  44,  44,  44,  44,  62,  36,  36,  36,  36,  44,  36,  36,  36,
-     92,  84,  43,  43,  44,  43,  84,  84,  71,  72,  88,  44,  44,  44,  44,  44,
-     70,  43,  43,  43,  43,  71,  36,  36,  36,  70,  43,  43,  83,  70,  43,  60,
-      2,   2,   2,  59,  44,  44,  44,  44,  70,  43,  43,  83,  85,  43,  36,  36,
-     36,  36,  36,  36,  36,  43,  43,  43,  43,  43,  43,  83,  43,   2,  72,   2,
-      2,  64,  44,  44,  44,  44,  44,  44,  43,  43,  43,  80,  43,  43,  43,  85,
-     63,   2,   2,  44,  44,  44,  44,  44,   2,  36,  36,  36,  36,  36,  36,  36,
-     44,  43,  43,  43,  43,  43,  43,  43,  43,  43,  43,  43,  87,  43,  43,  43,
-     83,  43,  85,  80,  44,  44,  44,  44,  36,  36,  36,  61,  36,  62,  36,  36,
-     70,  43,  43,  80,  44,  80,  43,  57,  43,  43,  43,  70,  44,  44,  44,  44,
-     36,  36,  36,  62,  61,  36,  36,  36,  36,  36,  36,  36,  36,  84,  84,  88,
-     43,  87,  85,  85,  61,  44,  44,  44,  36,  70,  83, 163,  64,  44,  44,  44,
-     27,  27,  89,  67,  67,  67,  56,  20, 162,  67,  67,  67,  67,  67,  67,  67,
-     67,  44,  44,  44,  44,  44,  44,  91, 103, 103, 103, 103, 103, 103, 103, 178,
-      2,   2,  64,  44,  44,  44,  44,  44,  65,  65,  65,  65,  68,  44,  44,  44,
-     43,  43,  60,  44,  44,  44,  44,  44,  43,  43,  43,  60,   2,   2,  67,  67,
-     40,  40,  95,  44,  44,  44,  44,  44,   7,   7,   7,   7,   7, 176,  27,  27,
-     27,  62,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  44,  44,  62,  36,
-     27,  27,  27,  30,   2,  64,  44,  44,  36,  36,  36,  36,  36,  61,  44,  57,
-     92,  84,  84,  84,  84,  84,  84,  84,  84,  84,  84,  84,  84,  84,  84,  84,
-     84,  84,  84,  84,  44,  44,  44,  57,  43,  74,  40,  40,  40,  40,  40,  40,
-     40,  86,  44,  44,  44,  44,  44,  44,  36,  61,  44,  44,  44,  44,  44,  44,
-     44,  44,  36,  36,  44,  44,  44,  44,  36,  36,  36,  36,  36,  44,  50,  60,
-     65,  65,  44,  44,  44,  44,  44,  44,  67,  67,  67,  90,  55,  67,  67,  67,
-     67,  67, 182,  85,  43,  67, 182,  84,  84, 183,  65,  65,  65,  82,  43,  43,
-     43,  76,  50,  43,  43,  43,  67,  67,  67,  67,  67,  67,  67,  43,  43,  67,
-     67,  67,  67,  67,  90,  44,  44,  44,  67,  43,  76,  44,  44,  44,  44,  44,
-     27,  27,  44,  44,  44,  44,  44,  44,  11,  11,  11,  11,  11,  16,  16,  16,
-     16,  16,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  16,
-     16,  16, 108,  16,  16,  16,  16,  16,  11,  16,  16,  16,  16,  16,  16,  16,
-     16,  16,  16,  16,  16,  16,  47,  11,  44,  47,  48,  47,  48,  11,  47,  11,
-     11,  11,  11,  16,  16, 147, 147,  16,  16,  16, 147,  16,  16,  16,  16,  16,
-     16,  16,  11,  48,  11,  47,  48,  11,  11,  11,  47,  11,  11,  11,  47,  16,
-     16,  16,  16,  16,  11,  48,  11,  47,  11,  11,  47,  47,  44,  11,  11,  11,
-     47,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  11,  11,
-     11,  11,  11,  16,  16,  16,  16,  16,  16,  16,  16,  44,  11,  11,  11,  11,
-     31,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  33,  16,  16,
-     16,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  31,  16,  16,
-     16,  16,  33,  16,  16,  16,  11,  11,  11,  11,  31,  16,  16,  16,  16,  16,
-     16,  16,  16,  16,  16,  16,  16,  33,  16,  16,  16,  11,  11,  11,  11,  11,
-     11,  11,  11,  11,  11,  11,  11,  31,  16,  16,  16,  16,  33,  16,  16,  16,
-     11,  11,  11,  11,  31,  16,  16,  16,  16,  33,  16,  16,  16,  32,  44,   7,
-      7,   7,   7,   7,   7,   7,   7,   7,  43,  43,  43,  76,  67,  50,  43,  43,
-     43,  43,  43,  43,  43,  43,  76,  67,  67,  67,  50,  67,  67,  67,  67,  67,
-     67,  67,  76,  21,   2,   2,  44,  44,  44,  44,  44,  44,  44,  57,  43,  43,
-     43,  43,  43,  80,  43,  43,  43,  43,  43,  43,  43,  43,  80,  57,  43,  43,
-     43,  57,  80,  43,  43,  80,  44,  44,  43,  43,  43,  74,  40,  40,  40,  44,
-      7,   7,   7,   7,   7,  44,  44,  77,  36,  36,  36,  36,  36,  36,  43,  43,
-      7,   7,   7,   7,   7,  44,  44,  94,  36,  36,  61, 176,  27,  27,  27,  27,
-     43,  43,  43,  80,  44,  44,  44,  44,  16,  16,  43,  43,  43,  74,  44,  44,
-     27,  27,  27,  27,  27,  27, 158,  27, 184,  27,  98,  44,  44,  44,  44,  44,
-     27,  27,  27,  27,  27,  27,  27, 158,  27,  27,  27,  27,  27,  27,  27,  44,
-     36,  36,  62,  36,  36,  36,  36,  36,  62,  61,  61,  62,  62,  36,  36,  36,
-     36,  61,  36,  36,  62,  62,  44,  44,  44,  61,  44,  62,  62,  62,  62,  36,
-     62,  61,  61,  62,  62,  62,  62,  62,  62,  61,  61,  62,  36,  61,  36,  36,
-     36,  61,  36,  36,  62,  36,  61,  61,  36,  36,  36,  36,  36,  62,  36,  36,
-     62,  36,  62,  36,  36,  62,  36,  36,   8,  44,  44,  44,  44,  44,  44,  44,
-     55,  67,  67,  67,  67,  67,  67,  67,  67,  67,  67,  67,  67,  67,  90,  44,
-     44,  44,  44,  67,  67,  67,  67,  67,  67,  90,  44,  44,  44,  44,  44,  44,
-     67,  44,  44,  44,  44,  44,  44,  44,  67,  67,  67,  67,  67,  25,  41,  41,
-     67,  67,  67,  67,  44,  44,  44,  44,  67,  67,  67,  67,  67,  67,  67,  44,
-     67,  67,  67,  67,  67,  67,  55,  67,  67,  55,  67,  90,  44,  67,  67,  67,
-     67,  90,  55,  67,  67,  90,  44,  67,  67,  67,  67,  67,  67,  90,  55,  67,
-     67,  67,  44,  44,  67,  90,  44,  44,  36,  44,  44,  44,  44,  44,  44,  44,
-     79,  44,  44,  44,  44,  44,  44,  44,  65,  65,  65,  65,  65,  65,  65,  65,
-    166, 166, 166, 166, 166, 166, 166,  44,
+static RE_UINT8 re_alphabetic_table_3[] = {
+      0,   0,   0,   0, 254, 255, 255,   7,   0,   4,  32,   4, 255, 255, 127, 255,
+    255, 255, 255, 255, 195, 255,   3,   0,  31,  80,   0,   0,  32,   0,   0,   0,
+      0,   0, 223, 188,  64, 215, 255, 255, 251, 255, 255, 255, 255, 255, 191, 255,
+      3, 252, 255, 255, 255, 255, 254, 255, 255, 255, 127,   2, 255,   1,   0,   0,
+      0,   0, 255, 191, 182,   0, 255, 255, 255, 135,   7,   0,   0,   0, 255,   7,
+    255, 255, 255, 254,   0, 192, 255, 255, 255, 255, 239,  31, 254, 225,   0, 156,
+      0,   0, 255, 255,   0, 224, 255, 255, 255, 255,   3,   0,   0, 252, 255, 255,
+    255,   7,  48,   4, 255, 255, 255, 252, 255,  31,   0,   0, 255, 255, 255,   1,
+    255,   7,   0,   0, 255, 255, 223, 255, 255,   0, 240, 255, 248,   3, 255, 255,
+    255, 255, 255, 239, 255, 223, 225, 255,  15,   0, 254, 255, 239, 159, 249, 255,
+    255, 253, 197, 227, 159,  89, 128, 176,  15,   0,   3,  16, 238, 135, 249, 255,
+    255, 253, 109, 195, 135,  25,   2,  94,   0,   0,  63,   0, 238, 191, 251, 255,
+    255, 253, 237, 227, 191,  27,   1,   0,  15,   0,   0,  30, 238, 159, 249, 255,
+    159,  25, 192, 176,  15,   0,   2,   0, 236, 199,  61, 214,  24, 199, 255, 195,
+    199,  29, 129,   0, 239, 223, 253, 255, 255, 253, 255, 227, 223,  29,  96,   7,
+     15,   0,   0,   0, 255, 253, 239, 227, 223,  29,  96,  64,  15,   0,   6,   0,
+    255, 223, 253, 255, 255, 255, 255, 231, 223,  93, 240, 128,  15,   0,   0, 252,
+    238, 255, 127, 252, 255, 255, 251,  47, 127, 128,  95, 255,   0,   0,  12,   0,
+    254, 255, 255, 255, 255, 255, 255,   7, 127,  32,   0,   0, 214, 247, 255, 255,
+    175, 255, 255,  59,  95,  32,   0, 240,   1,   0,   0,   0, 255, 254, 255, 255,
+    255,  31, 254, 255,   3, 255, 255, 254, 255, 255, 255,  31, 255, 255, 127, 249,
+    255, 255,   0,  60, 191,  32, 255, 255, 255, 255, 255, 247, 255,  61, 127,  61,
+    255,  61, 255, 255, 255, 255,  61, 127,  61, 255, 127, 255, 255, 255,  61, 255,
+    255, 255,   0,   0, 255, 255,  63,  63, 255, 159, 255, 255, 255, 199, 255,   1,
+    255, 223,  15,   0, 255, 255,  15,   0, 255, 223,  13,   0, 255, 255, 207, 255,
+    255,   1, 128,  16, 255,   7, 255, 255, 255, 255,  63,   0, 255, 255, 255, 127,
+    255,  15, 255,   1, 255,  63,  31,   0, 255,  15, 255, 255, 255,   3,   0,   0,
+    255, 255, 255,  15, 254, 255,  31,   0, 128,   0,   0, 128, 255, 255, 239, 255,
+    239,  15,   0,   0, 255, 243,   0, 252, 191, 255,   3,   0, 255, 255, 127,   0,
+      0, 224,   0, 252, 255, 255, 255,  63, 255,   1, 255, 255,   0, 222, 111,   4,
+    128, 255,  31,   0,  63,  63, 255, 170, 255, 255, 223,  95, 220,  31, 207,  15,
+    255,  31, 220,  31,   0,   0,   2, 128,   0,   0, 255,  31, 132, 252,  47,  62,
+     80, 189, 255, 243, 224,  67,   0,   0,   0,   0, 192, 255, 255, 127, 255, 255,
+     31, 120,  12,   0, 255, 128,   0,   0, 127, 127, 127, 127,   0, 128,   0,   0,
+    224,   0,   0,   0, 254,   3,  62,  31, 255, 255, 127, 224, 224, 255, 255, 255,
+    255, 127,   0,   0, 255,  31, 255, 255,   0,  12,   0,   0, 255, 127, 240, 143,
+      0,   0, 128, 255, 252, 255, 255, 255, 255, 249, 255, 255, 252,   7,   0,   0,
+      0,   0, 224, 255, 191, 255, 255, 255, 255,   0,   0,   0,  47,   0,   0,   0,
+      0,   0, 252, 232, 255, 255,   7,   0, 255, 255, 247, 255, 255, 255,   0, 124,
+    255,  63,   0,   0, 255, 255, 127, 252,   5,   0,   0,  56, 255, 255,  60,   0,
+    126, 126, 126,   0, 127, 127, 255, 255, 255,   3, 255, 255,  15,   0, 255, 255,
+    127, 248, 255, 255, 255,  63, 255, 255, 255, 255, 255,   3, 127,   0, 248, 224,
+    255, 253, 127,  95, 219, 255, 255, 255,   0,   0, 248, 255, 255, 255, 252, 255,
+      0,   0, 255,  15,   0,   0, 223, 255, 192, 255, 255, 255, 252, 252, 252,  28,
+    255, 239, 255, 255, 127, 255, 255, 183, 255,  63, 255,  63, 255, 255,  31,   0,
+    255, 255,   1,   0,  15, 255,  62,   0, 255, 255,  15, 255, 255,   0, 255, 255,
+     63, 253, 255, 255, 255, 255, 191, 145, 255, 255,  55,   0, 255, 255, 255, 192,
+    111, 240, 239, 254,  31,   0,   0,   0, 255,  27,   3,   0, 128,   0, 255, 255,
+     63,   0,   0,   0, 240,   0, 255, 255, 255, 255,  71,   0,  30, 192,   0,  20,
+    255, 255, 251, 255, 255, 255, 159,  64, 127, 189, 255, 191, 159,  25, 129, 224,
+    187,   7,   0, 128,   3,   0,   0,   0, 179,   0,   0,   0, 255, 255,  63, 127,
+      0,   0,   0,  63,  17,   0,   0,   0, 255, 255,  63,   1,   0,   0,   0, 128,
+    127, 242, 111, 255, 255, 255, 191, 153,   7,   0,   0,   0, 255, 252, 255, 255,
+     26,   0,   0,   0, 255, 255, 231, 127, 255, 255, 255,  32, 255, 253, 255, 255,
+    255, 255, 127, 127,   0,   0, 252, 255, 255, 254, 127,   0, 127, 251, 255, 255,
+    255, 255, 127, 180, 203,   0,   0,   0, 191, 253, 255, 255, 255, 127, 123,   1,
+      0,   0,   1,   0, 127,   0,   0,   0, 248, 255, 255, 224, 255, 135, 255, 255,
+    255, 128, 255, 255,  11,   0,   3,   0, 255, 255, 255,   0,   0,   0,   7,   0,
+    255,   7, 255,  31, 255,   1, 255,  67, 255, 255, 255, 223, 100, 222, 255, 235,
+    239, 255, 255, 255, 191, 231, 223, 223, 255, 255, 255, 123,  95, 252, 253, 255,
+     63, 255, 255, 255, 253, 255, 255, 247, 247,  15,   0,   0, 127, 255, 255, 249,
+    219,   7,   0,   0, 255,  31, 128,  63,   0,  64,   0,   0, 255,  15,   0,   0,
+    143,   8,   0,   0, 150, 254, 247,  10, 132, 234, 150, 170, 150, 247, 247,  94,
+    255, 251, 255,  15, 238, 251, 255,  15,   3,   0, 255, 255
 };
 
-static RE_UINT8 re_general_category_stage_4[] = {
-    15, 15, 12, 23, 23, 23, 25, 23, 20, 21, 23, 24, 23, 19,  9,  9,
-    24, 24, 24, 23, 23,  1,  1,  1,  1, 20, 23, 21, 26, 22, 26,  2,
-     2,  2,  2, 20, 24, 21, 24, 15, 25, 25, 27, 23, 26, 27,  5, 28,
-    24, 16, 27, 26, 27, 24, 11, 11, 26, 11,  5, 29, 11, 23,  1, 24,
-     1,  2,  2, 24,  2,  1,  2,  5,  5,  5,  1,  3,  3,  2,  5,  2,
-     4,  4, 26, 26,  4, 26,  6,  6,  0,  0,  4,  2,  1, 23,  1,  0,
-     0,  1, 24,  1, 27,  6,  7,  7,  0,  4,  2, 23, 19,  0,  0, 27,
-    27, 25,  0,  6, 19,  6, 23,  6,  6, 23,  5,  0,  0,  5,  5, 23,
-    23,  0, 16, 16, 23, 25, 27, 27, 16,  0,  4,  5,  5,  6,  6,  5,
-    23,  5,  6, 16,  6,  4,  4,  6,  6, 27,  5, 27, 27,  5,  0, 16,
-     6,  0,  4,  0, 16,  6,  6,  8,  8,  8,  8,  6, 23,  4,  0,  8,
-     8,  0, 11, 27, 27,  0,  0, 23,  5,  8, 11,  5,  0, 25, 23, 27,
-     8,  5, 23, 11, 11,  0, 19,  5, 12,  5,  5, 20, 21,  0, 10, 10,
-    10,  5, 19, 23,  5,  4,  7,  0,  2,  0,  2,  4,  3,  3,  3, 26,
-     2, 26,  0, 26,  1, 26, 26,  0, 12, 12, 12, 16, 19, 19, 28, 29,
-    20, 28, 13, 14, 16, 12, 23, 28, 29, 23, 23, 22, 22, 23, 24, 20,
-    21, 23, 23, 12, 11,  4, 21,  4,  6,  7,  7,  6,  1, 27, 27,  1,
-    27,  2,  2, 27, 10,  1,  2, 10, 10, 11, 24, 27, 27, 20, 21, 27,
-    21, 24, 21, 20,  2,  6,  0,  2, 20, 23, 27,  4,  5, 10, 19, 20,
-    21, 21, 27, 10, 19,  4, 10,  4,  6, 26, 26,  4, 27, 11,  4, 23,
-     7, 23, 26,  1, 25, 27,  8, 23,  4,  8, 18, 18, 17, 17,  5, 24,
-    23, 20, 19, 22, 22, 20, 22, 22, 24, 19, 24,  0, 24, 26, 25,  0,
-     0, 11,  6, 11, 10,  0, 23, 10,  5, 11, 23, 16, 27,  8,  8, 16,
-    25, 11,
-};
+RE_UINT32 re_get_alphabetic(RE_UINT32 codepoint) {
+    RE_UINT32 field_2;
+    RE_UINT32 field_1;
+    RE_UINT32 field_0;
+    RE_UINT32 offset;
+    RE_UINT32 v;
 
-/* General_Category: 13674 bytes. */
-
-RE_UINT32 re_get_general_category(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-
-    f = ch >> 9;
-    code = ch ^ (f << 9);
-    pos = (RE_UINT32)re_general_category_stage_1[f] << 5;
-    f = code >> 4;
-    code ^= f << 4;
-    pos = (RE_UINT32)re_general_category_stage_2[pos + f] << 3;
-    f = code >> 1;
-    code ^= f << 1;
-    pos = (RE_UINT32)re_general_category_stage_3[pos + f] << 1;
-    value = re_general_category_stage_4[pos + code];
-
-    return value;
-}
+    field_2 = codepoint >> 10;
+    field_1 = (codepoint >> 5) & 0x1F;
+    field_0 = (codepoint >> 3) & 0x3;
+    offset = codepoint & 0x7;
 
-/* Block. */
+    v = re_alphabetic_table_1[field_2];
+    v = re_alphabetic_table_2[(v << 5) | field_1];
+    v = re_alphabetic_table_3[(v << 2) | field_0];
 
-static RE_UINT8 re_block_stage_1[] = {
+    return (v >> offset) & 0x1;
+}
+
+/* Alphanumeric. */
+static RE_UINT8 re_alphanumeric_table_1[] = {
      0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 13, 13,
-    13, 13, 13, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-    15, 15, 15, 15, 15, 15, 15, 15, 16, 17, 18, 19, 19, 19, 19, 19,
-    19, 19, 19, 19, 19, 20, 21, 22, 23, 23, 23, 23, 23, 23, 24, 25,
-    26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 36, 37, 38, 36, 36,
-    36, 39, 36, 36, 36, 36, 36, 36, 36, 36, 40, 41, 42, 42, 42, 42,
-    42, 42, 43, 36, 36, 36, 36, 36, 36, 36, 36, 36, 44, 36, 36, 45,
-    36, 36, 36, 36, 46, 47, 48, 36, 49, 36, 50, 51, 52, 53, 54, 36,
-    55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
-    55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
-    55, 55, 55, 55, 55, 55, 55, 55, 55, 56, 57, 57, 57, 58, 59, 60,
-    60, 60, 60, 61, 62, 62, 62, 62, 62, 62, 63, 36, 36, 36, 64, 36,
-    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
-    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
-    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
-    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
-    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
-    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
-    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
-    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
-    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
-    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
-    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
-    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
-    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
-    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
-    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
-    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
-    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
-    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
-    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
-    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
-    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
-    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
-    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
-    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
-    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
-    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
-    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
-    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
-    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
-    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
-    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
-    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
-    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
-    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
-    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
-    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
-    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
-    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
-    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
-    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
-    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
-    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
-    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
-    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
-    65, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
-    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
-    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
-    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
-    66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66,
-    66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66,
-    66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66,
-    66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66,
-    67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67,
-    67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67,
-    67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67,
-    67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67,
-};
-
-static RE_UINT16 re_block_stage_2[] = {
-      0,   0,   0,   0,   1,   1,   1,   1,   2,   2,   2,   2,   3,   3,   3,   3,
-      3,   3,   4,   5,   5,   6,   7,   7,   8,   8,   8,   9,  10,  10,  10,  10,
-     11,  11,  11,  11,  11,  11,  11,  11,  12,  13,  14,  14,  15,  16,  16,  16,
-     17,  17,  17,  17,  17,  17,  17,  17,  18,  18,  19,  20,  21,  21,  22,  22,
-     23,  23,  24,  25,  26,  27,  27,  27,  28,  28,  28,  28,  29,  29,  29,  29,
-     30,  30,  30,  30,  31,  31,  31,  31,  32,  32,  32,  32,  33,  33,  33,  33,
-     34,  34,  34,  34,  35,  35,  35,  35,  36,  36,  36,  36,  37,  37,  37,  37,
-     38,  38,  38,  38,  39,  39,  39,  39,  40,  40,  40,  40,  40,  40,  40,  40,
-     41,  41,  41,  41,  41,  42,  42,  42,  43,  43,  43,  43,  43,  43,  43,  43,
-     44,  44,  44,  44,  44,  44,  44,  44,  44,  44,  44,  44,  45,  46,  46,  46,
-     47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,
-     47,  47,  47,  47,  48,  49,  49,  49,  50,  51,  52,  53,  54,  54,  54,  54,
-     55,  55,  55,  55,  55,  56,  57,  57,  58,  58,  59,  60,  61,  61,  61,  62,
-     63,  64,  64,  64,  64,  65,  66,  66,  67,  67,  67,  67,  68,  68,  69,  69,
-     70,  70,  71,  72,  73,  74,  75,  76,  77,  77,  77,  77,  78,  78,  79,  79,
-     80,  80,  80,  80,  80,  80,  80,  80,  81,  81,  81,  81,  81,  81,  81,  81,
-     82,  82,  82,  83,  84,  85,  86,  87,  88,  88,  89,  90,  91,  92,  92,  92,
-     93,  93,  93,  93,  93,  93,  93,  93,  94,  94,  94,  94,  94,  94,  94,  94,
-     95,  95,  96,  97,  97,  97,  97,  97,  98,  98,  98,  98,  99, 100, 100, 100,
-    101, 101, 101, 101, 101, 101, 101, 101, 102, 102, 102, 102, 102, 102, 103, 104,
-    105, 105, 105, 105, 105, 105, 105, 105, 106, 106, 106, 106, 107, 107, 107, 107,
-    108, 108, 108, 108, 108, 108, 108, 108, 109, 109, 109, 109, 109, 109, 109, 109,
-    110, 110, 110, 111, 112, 112, 112, 112, 113, 114, 115, 115, 116, 116, 116, 117,
-    118, 118, 118, 118, 119, 119, 119, 119, 120, 120, 120, 120, 120, 120, 120, 121,
-    122, 122, 123, 123, 123, 124, 124, 124, 125, 126, 127, 127, 128, 129, 130, 131,
-    132, 132, 132, 132, 132, 132, 132, 132, 133, 133, 133, 133, 133, 133, 133, 133,
-    134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-    134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-    134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 135, 135,
-    136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-    136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-    136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-    137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-    137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-    137, 137, 137, 137, 138, 139, 140, 141, 142, 142, 142, 142, 142, 142, 142, 142,
-    142, 142, 143, 143, 143, 144, 144, 144, 145, 146, 146, 146, 146, 146, 146, 146,
-    147, 148, 149, 149, 150, 150, 150, 151, 152, 153, 154, 155, 156, 156, 156, 157,
-    158, 158, 158, 159, 160, 160, 160, 161, 162, 163, 164, 165, 166, 166, 167, 167,
-    168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168,
-    168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168,
-    168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168,
-    168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 169, 170, 170,
-    171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171,
-    171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 172, 172, 172, 172,
-    173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173,
-    173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173,
-    174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174,
-    174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174,
-    174, 174, 174, 174, 174, 174, 174, 174, 175, 175, 175, 175, 175, 175, 175, 175,
-    175, 175, 175, 175, 175, 175, 175, 175, 176, 176, 177, 178, 178, 178, 178, 178,
-    178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-    179, 180, 181, 182, 183, 183, 183, 183, 184, 184, 184, 184, 184, 184, 184, 185,
-    186, 186, 186, 186, 187, 187, 187, 187, 188, 188, 189, 189, 190, 191, 192, 193,
-     26,  26,  26,  26, 194, 195, 195, 196, 197, 198, 199, 200, 201, 202, 202,  26,
-    203, 203, 204, 205, 206, 207, 208, 208, 209, 210, 211, 212,  26,  26,  26,  26,
-    213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213,  26,  26,  26,  26,
-    214, 214, 215, 216, 217, 218,  26, 219, 220, 221,  26,  26, 222, 223, 223, 223,
-    224, 224, 224, 225, 226,  26, 227, 227, 228, 228, 229, 230, 231, 232,  26,  26,
-    233, 233, 234,  26, 235, 235, 235, 235, 236, 236,  26,  26,  26,  26,  26,  26,
-     26,  26,  26, 237,  26,  26,  26,  26, 238, 239, 240, 241,  26,  26,  26, 242,
-    243, 243, 243, 243, 244, 244, 245, 246, 247, 247, 248, 249, 250, 250, 250, 251,
-    252, 252, 253,  26, 254, 255, 256, 256, 257, 257, 257, 257,  26,  26,  26,  26,
-    258, 258, 258, 258, 259, 259, 259,  26,  26,  26,  26,  26, 260, 260, 260, 260,
-    261, 261, 261, 262, 263, 263, 264,  26, 265, 265,  26,  26,  26,  26,  26,  26,
-    266, 266, 267,  26,  26, 268, 268, 268,  26,  26,  26,  26,  26, 269, 269, 269,
-    270, 270, 271, 272, 272, 273, 274, 274,  26,  26,  26,  26,  26,  26,  26,  26,
-    275, 275, 275, 276, 277, 277,  26,  26, 278, 278, 278, 279, 279, 280,  26,  26,
-     26,  26,  26,  26,  26,  26,  26, 281,  26,  26,  26,  26,  26,  26, 282, 282,
-    283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283,
-    283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283,
-    284, 284, 284, 284, 285, 285, 285, 285, 285, 285, 286,  26,  26,  26,  26,  26,
-     26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
-     26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
-     26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
-    287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287,
-    287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287,
-    287, 288,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
-     26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
-    289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289,
-    289, 289, 289, 289,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
-    290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290,
-    290, 290, 291, 292,  26,  26, 293, 294, 295, 295, 295, 295, 296,  26,  26,  26,
-     26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
-     26,  26, 297, 297, 297,  26,  26,  26, 298, 298, 298, 298, 298,  26,  26, 299,
-    300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300,
-    300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300,
-    301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301,
-    301, 301, 301, 301, 301, 301, 301, 301,  26,  26,  26,  26,  26,  26,  26,  26,
-    302, 302, 302, 302, 302, 302, 302, 302, 303, 304, 305, 306, 307, 307, 307, 307,
-    307, 307, 307, 307, 307, 307, 307, 307,  26,  26,  26,  26,  26,  26,  26,  26,
-    308, 308, 308, 308, 308, 309,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
-     26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
-    310, 310, 310, 310, 310, 310, 310, 310, 311, 311, 311, 311, 311, 311, 311, 311,
-    312, 312, 313,  26,  26,  26,  26, 314, 315, 315, 315, 316,  26,  26,  26,  26,
-    317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317,
-    317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317,
-    318, 318, 318, 318, 318, 318, 318, 318, 318, 318, 318, 318, 318, 318, 318, 318,
-    318, 318, 318, 318, 318, 319,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
-    320, 321,  26,  26,  26,  26,  26,  26, 322, 322, 323,  26,  26,  26,  26,  26,
-     26,  26,  26,  26,  26,  26, 324, 324,  26,  26,  26,  26,  26,  26,  26,  26,
-    325, 325, 325, 325, 325, 325, 325,  26, 326, 326, 326,  26,  26,  26,  26,  26,
-     26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
-     26,  26,  26, 327, 328, 328,  26,  26, 329, 329, 330,  26,  26,  26,  26,  26,
-    331, 331, 331, 331, 331, 331, 331, 331,  26,  26,  26,  26,  26,  26,  26,  26,
-    332, 333, 334, 334, 334, 335, 335, 335, 336, 336, 336, 336, 336, 336, 336, 336,
-    337, 337, 337, 337, 337, 337, 337, 337, 338, 338, 338, 338, 338, 338, 338, 338,
-    338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338,
-    339, 339, 340, 341, 342, 342, 342, 342, 343, 343, 343, 343, 344, 344, 344, 344,
-    345, 345, 345, 345, 345, 345, 345, 345, 346, 346, 346, 346, 346, 346, 346, 346,
-    347, 347, 347, 348, 349, 349, 349, 349,  26,  26,  26,  26,  26,  26,  26,  26,
-    350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350,
-    350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350,
-    350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350,
-    350, 350, 350, 350, 350, 350, 350,  26, 351, 351, 351, 351, 351, 351, 351, 351,
-    351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351,
-    351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351,
-    351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351,
-    351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 352, 352, 352, 352, 352, 352,
-    352, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353,
-    353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353,
-    353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353,
-    353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353,
-    353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353,
-    353, 353, 353, 353, 353, 354, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355,
-    355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355,
-    355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355,
-    355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355,
-    355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 356,
-    357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357,
-    357,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
-    358, 358, 358, 358,  26,  26,  26,  26, 359, 359, 359, 359, 359, 359, 359, 360,
-     26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
-    361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361,
-    361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361,
-    362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362,
-    362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362,
-};
-
-static RE_UINT16 re_block_stage_3[] = {
-      0,   0,   0,   0,   1,   1,   1,   1,   2,   2,   2,   2,   3,   3,   3,   3,
-      3,   3,   4,   4,   4,   4,   4,   4,   4,   4,   5,   5,   5,   5,   5,   5,
-      6,   6,   6,   6,   6,   6,   7,   7,   7,   7,   7,   7,   8,   8,   8,   8,
-      9,   9,   9,   9,   9,   9,  10,  10,  10,  10,  10,  10,  10,  10,  11,  11,
-     11,  11,  11,  11,  12,  12,  12,  12,  13,  13,  13,  13,  13,  13,  14,  14,
-     14,  14,  14,  14,  15,  15,  15,  15,  16,  16,  16,  16,  17,  17,  17,  17,
-     18,  18,  18,  18,  19,  19,  20,  20,  20,  20,  20,  20,  21,  21,  21,  21,
-     22,  22,  22,  22,  23,  23,  23,  23,  24,  24,  24,  24,  25,  25,  25,  25,
-     26,  26,  26,  26,  27,  27,  27,  27,  28,  28,  28,  28,  29,  29,  29,  29,
-     30,  30,  30,  30,  31,  31,  31,  31,  32,  32,  32,  32,  33,  33,  33,  33,
-     34,  34,  34,  34,  35,  35,  35,  35,  36,  36,  36,  36,  37,  37,  37,  37,
-     38,  38,  38,  38,  39,  39,  39,  39,  40,  40,  40,  40,  41,  41,  41,  41,
-     42,  42,  42,  42,  43,  43,  43,  43,  44,  44,  44,  44,  45,  45,  45,  45,
-     46,  46,  46,  46,  47,  47,  47,  47,  48,  48,  48,  48,  49,  49,  49,  49,
-     49,  49,  50,  50,  50,  50,  50,  50,  51,  51,  51,  51,  51,  51,  52,  52,
-     52,  52,  52,  52,  53,  53,  53,  53,  54,  54,  54,  54,  55,  55,  55,  55,
-     56,  56,  56,  56,  56,  56,  57,  57,  57,  57,  57,  57,  58,  58,  58,  58,
-     59,  59,  59,  59,  60,  60,  60,  60,  61,  61,  61,  61,  61,  61,  62,  62,
-     62,  62,  62,  62,  63,  63,  64,  64,  64,  64,  64,  64,  65,  65,  66,  66,
-     66,  66,  66,  66,  67,  67,  67,  67,  68,  68,  68,  68,  69,  69,  69,  69,
-     70,  70,  70,  70,  71,  71,  71,  71,  72,  72,  72,  72,  72,  72,  73,  73,
-     73,  73,  73,  73,  74,  74,  74,  74,  74,  74,  75,  75,  75,  75,  75,  75,
-     76,  76,  76,  76,  76,  76,  77,  77,  77,  77,  77,  77,  77,  77,  78,  78,
-     78,  78,  78,  78,  79,  79,  79,  79,  80,  80,  80,  80,  81,  81,  81,  81,
-     82,  82,  82,  82,  83,  83,  83,  83,  84,  84,  84,  84,  85,  85,  85,  85,
-     86,  86,  86,  86,  87,  87,  87,  87,  88,  88,  88,  88,  89,  89,  89,  89,
-     89,  89,  90,  90,  91,  91,  91,  91,  92,  92,  92,  92,  93,  93,  93,  93,
-     94,  94,  94,  94,  95,  95,  95,  95,  96,  96,  96,  96,  97,  97,  97,  97,
-     98,  98,  98,  98,  99,  99,  99,  99,  99,  99, 100, 100, 100, 100, 100, 100,
-    101, 101, 101, 101, 102, 102, 102, 102, 103, 103, 103, 103, 104, 104, 104, 104,
-    105, 105, 105, 105,  20,  20, 106, 106, 107, 107, 107, 107, 108, 108, 108, 108,
-    109, 109, 109, 109, 110, 110, 110, 110, 110, 110, 111, 111, 111, 111, 111, 111,
-    111, 111, 112, 112, 113, 113, 113, 113, 114, 114, 114, 114, 114, 114, 115, 115,
-    116, 116, 116, 116, 117, 117, 117, 117, 118, 118, 118, 118, 119, 119, 119, 119,
-    120, 120, 120, 120, 121, 121, 121, 121, 121, 121, 122, 122, 122, 122, 122, 122,
-    122, 122, 123, 123, 123, 123, 123, 123, 124, 124, 124, 124, 125, 125, 125, 125,
-    126, 126, 126, 126, 127, 127, 127, 127, 128, 128, 128, 128, 129, 129, 129, 129,
-    129, 129, 130, 130, 131, 131, 131, 131, 132, 132, 132, 132, 133, 133, 133, 133,
-    134, 134, 134, 134, 134, 134, 135, 135, 135, 135, 135, 135, 136, 136, 136, 136,
-    137, 137, 137, 137, 138, 138, 138, 138, 139, 139, 139, 139, 140, 140, 140, 140,
-    141, 141, 141, 141, 142, 142, 142, 142, 143, 143, 143, 143, 143, 143, 144, 144,
-    144, 144, 144, 144, 144, 144, 145, 145, 145, 145, 145, 145, 146, 146, 146, 146,
-    147, 147, 147, 147, 147, 147, 148, 148, 148, 148, 148, 148, 149, 149, 149, 149,
-    150, 150, 150, 150, 151, 151, 151, 151, 152, 152, 152, 152, 153, 153, 153, 153,
-    154, 154, 154, 154, 154, 154, 155, 155, 155, 155, 155, 155, 156, 156, 157, 157,
-    158, 158, 159, 159, 159, 159, 160, 160, 160, 160, 161, 161, 161, 161, 161, 161,
-    162, 162, 162, 162, 162, 162, 163, 163, 164, 164, 164, 164, 165, 165, 165, 165,
-    166, 166, 166, 166, 167, 167, 167, 167, 167, 167, 168, 168, 168, 168, 168, 168,
-    168, 168, 169, 169, 169, 169, 169, 169, 170, 170, 170, 170, 171, 171, 171, 171,
-    172, 172, 172, 172, 173, 173, 173, 173, 173, 173, 174, 174, 174, 174, 175, 175,
-    175, 175, 175, 175, 176, 176, 176, 176, 177, 177, 177, 177, 178, 178, 178, 178,
-    178, 178, 179, 179, 179, 179, 179, 179, 180, 180, 180, 180, 180, 180, 181, 181,
-    181, 181, 181, 181, 182, 182, 182, 182, 182, 182, 183, 183, 183, 183, 183, 183,
-    183, 183,  20,  20, 184, 184, 184, 184, 185, 185, 185, 185, 186, 186, 186, 186,
-    187, 187, 187, 187, 188, 188, 188, 188, 188, 188,  20,  20, 189, 189, 189, 189,
-    190, 190, 190, 190, 191, 191, 191, 191, 192, 192, 192, 192, 193, 193, 193, 193,
-    194, 194, 194, 194, 195, 195, 195, 195, 196, 196, 196, 196, 197, 197, 197, 197,
-    198, 198, 198, 198, 199, 199, 199, 199, 200, 200, 200, 200, 201, 201, 201, 201,
-    201, 201,  20,  20, 202, 202, 202, 202, 202, 202,  20,  20, 203, 203, 203, 203,
-    204, 204, 204, 204, 205, 205, 205, 205, 206, 206, 206, 206, 206, 206, 207, 207,
-    207, 207, 207, 207, 207, 207,  20,  20, 208, 208, 208, 208, 209, 209, 209, 209,
-    210, 210, 210, 210, 210, 210, 211, 211, 211, 211, 211, 211, 212, 212, 212, 212,
-    212, 212, 213, 213, 213, 213, 213, 213, 214, 214, 214, 214, 215, 215, 215, 215,
-    216, 216, 216, 216, 216, 216,  20,  20, 217, 217, 217, 217, 217, 217, 218, 218,
-    218, 218, 218, 218, 219, 219, 219, 219, 220, 220, 220, 220, 221, 221, 221, 221,
-    222, 222, 222, 222, 223, 223, 223, 223, 224, 224, 224, 224, 225, 225, 225, 225,
-    225, 225,  20,  20, 226, 226, 226, 226, 227, 227, 227, 227, 227, 227,  20,  20,
-    228, 228, 228, 228, 229, 229, 229, 229, 230, 230, 230, 230, 230, 230, 231, 231,
-    231, 231, 231, 231, 231, 231,  20,  20, 232, 232, 232, 232, 233, 233, 233, 233,
-    233, 233, 234, 234, 234, 234, 234, 234, 235, 235, 235, 235, 236, 236, 236, 236,
-    236, 236,  20,  20, 237, 237, 237, 237, 238, 238, 238, 238, 239, 239, 239, 239,
-    240, 240, 240, 240, 241, 241, 241, 241, 241, 241,  20,  20, 242, 242, 242, 242,
-    242, 242, 243, 243, 244, 244, 244, 244, 245, 245, 245, 245, 246, 246, 246, 246,
-    246, 246,  20,  20,  20,  20, 247, 247, 247, 247, 247, 247, 248, 248, 248, 248,
-    248, 248,  20,  20, 249, 249, 249, 249, 250, 250, 250, 250, 251, 251, 251, 251,
-    252, 252, 252, 252, 253, 253, 253, 253, 254, 254, 254, 254, 255, 255, 255, 255,
-    255, 255, 256, 256, 256, 256, 256, 256, 256, 256, 257, 257, 257, 257, 257, 257,
-    258, 258, 258, 258, 259, 259,  20,  20, 260, 260, 260, 260, 261, 261, 261, 261,
-    262, 262, 262, 262, 262, 262,  20,  20, 263, 263, 263, 263, 264, 264, 264, 264,
-    265, 265, 265, 265, 266, 266, 266, 266, 267, 267, 267, 267, 267, 267,  20,  20,
-    268, 268, 268, 268, 268, 268,  20,  20, 269, 269, 269, 269, 269, 269,  20,  20,
-    270, 270, 270, 270, 271, 271, 271, 271, 272, 272, 272, 272,  20,  20, 273, 273,
-    273, 273, 273, 273, 274, 274, 274, 274, 274, 274,  20,  20, 275, 275, 275, 275,
-    276, 276, 276, 276, 276, 276, 277, 277, 277, 277, 277, 277, 278, 278, 278, 278,
-    279, 279, 279, 279, 280, 280, 280, 280, 281, 281, 281, 281, 282, 282, 282, 282,
-    282, 282, 283, 283, 283, 283, 283, 283, 284, 284, 284, 284, 285, 285, 285, 285,
-    286, 286, 286, 286, 287, 287, 287, 287, 288, 288, 288, 288, 289, 289, 289, 289,
-    289, 289, 290, 290, 290, 290, 290, 290, 291, 291, 291, 291, 292, 292, 292, 292,
-    293, 293, 293, 293, 294, 294, 294, 294, 294, 294, 295, 295, 295, 295, 295, 295,
-    295, 295,  20,  20, 296, 296, 296, 296, 297, 297, 297, 297, 298, 298, 298, 298,
-    298, 298,  20,  20, 299, 299, 299, 299, 300, 300, 300, 300,
+    13, 13, 13, 14, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 15, 13, 16, 17, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 18, 10, 10, 10, 10, 10, 10, 10, 10, 19, 20,
+    21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 10, 10, 13, 31, 10, 10,
+    10, 32, 10, 10, 10, 10, 10, 10, 10, 10, 33, 34, 13, 13, 13, 13,
+    13, 35, 13, 36, 10, 10, 10, 10, 10, 10, 10, 10, 37, 10, 10, 38,
+    10, 10, 10, 10, 10, 39, 10, 10, 40, 10, 41, 42, 43, 10, 44, 10,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 45, 13, 13, 13, 46, 47, 13,
+    13, 13, 13, 48, 13, 13, 13, 13, 13, 13, 49, 10, 10, 10, 50, 10,
+    13, 13, 13, 13, 51, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10
 };
 
-static RE_UINT16 re_block_stage_4[] = {
-      1,   1,   1,   1,   1,   1,   1,   1,   2,   2,   2,   2,   2,   2,   2,   2,
-      3,   3,   3,   3,   3,   3,   3,   3,   4,   4,   4,   4,   4,   4,   4,   4,
-      5,   5,   5,   5,   5,   5,   5,   5,   6,   6,   6,   6,   6,   6,   6,   6,
-      7,   7,   7,   7,   7,   7,   7,   7,   8,   8,   8,   8,   8,   8,   8,   8,
-      9,   9,   9,   9,   9,   9,   9,   9,  10,  10,  10,  10,  10,  10,  10,  10,
-     11,  11,  11,  11,  11,  11,  11,  11,  12,  12,  12,  12,  12,  12,  12,  12,
-     13,  13,  13,  13,  13,  13,  13,  13,  14,  14,  14,  14,  14,  14,  14,  14,
-     15,  15,  15,  15,  15,  15,  15,  15,  16,  16,  16,  16,  16,  16,  16,  16,
-     17,  17,  17,  17,  17,  17,  17,  17,  18,  18,  18,  18,  18,  18,  18,  18,
-     19,  19,  19,  19,  19,  19,  19,  19,  20,  20,  20,  20,  20,  20,  20,  20,
-      0,   0,   0,   0,   0,   0,   0,   0,  21,  21,  21,  21,  21,  21,  21,  21,
-     22,  22,  22,  22,  22,  22,  22,  22,  23,  23,  23,  23,  23,  23,  23,  23,
-     24,  24,  24,  24,  24,  24,  24,  24,  25,  25,  25,  25,  25,  25,  25,  25,
-     26,  26,  26,  26,  26,  26,  26,  26,  27,  27,  27,  27,  27,  27,  27,  27,
-     28,  28,  28,  28,  28,  28,  28,  28,  29,  29,  29,  29,  29,  29,  29,  29,
-     30,  30,  30,  30,  30,  30,  30,  30,  31,  31,  31,  31,  31,  31,  31,  31,
-     32,  32,  32,  32,  32,  32,  32,  32,  33,  33,  33,  33,  33,  33,  33,  33,
-     34,  34,  34,  34,  34,  34,  34,  34,  35,  35,  35,  35,  35,  35,  35,  35,
-     36,  36,  36,  36,  36,  36,  36,  36,  37,  37,  37,  37,  37,  37,  37,  37,
-     38,  38,  38,  38,  38,  38,  38,  38,  39,  39,  39,  39,  39,  39,  39,  39,
-     40,  40,  40,  40,  40,  40,  40,  40,  41,  41,  41,  41,  41,  41,  41,  41,
-     42,  42,  42,  42,  42,  42,  42,  42,  43,  43,  43,  43,  43,  43,  43,  43,
-     44,  44,  44,  44,  44,  44,  44,  44,  45,  45,  45,  45,  45,  45,  45,  45,
-     46,  46,  46,  46,  46,  46,  46,  46,  47,  47,  47,  47,  47,  47,  47,  47,
-     48,  48,  48,  48,  48,  48,  48,  48,  49,  49,  49,  49,  49,  49,  49,  49,
-     50,  50,  50,  50,  50,  50,  50,  50,  51,  51,  51,  51,  51,  51,  51,  51,
-     52,  52,  52,  52,  52,  52,  52,  52,  53,  53,  53,  53,  53,  53,  53,  53,
-     54,  54,  54,  54,  54,  54,  54,  54,  55,  55,  55,  55,  55,  55,  55,  55,
-     56,  56,  56,  56,  56,  56,  56,  56,  57,  57,  57,  57,  57,  57,  57,  57,
-     58,  58,  58,  58,  58,  58,  58,  58,  59,  59,  59,  59,  59,  59,  59,  59,
-     60,  60,  60,  60,  60,  60,  60,  60,  61,  61,  61,  61,  61,  61,  61,  61,
-     62,  62,  62,  62,  62,  62,  62,  62,  63,  63,  63,  63,  63,  63,  63,  63,
-     64,  64,  64,  64,  64,  64,  64,  64,  65,  65,  65,  65,  65,  65,  65,  65,
-     66,  66,  66,  66,  66,  66,  66,  66,  67,  67,  67,  67,  67,  67,  67,  67,
-     68,  68,  68,  68,  68,  68,  68,  68,  69,  69,  69,  69,  69,  69,  69,  69,
-     70,  70,  70,  70,  70,  70,  70,  70,  71,  71,  71,  71,  71,  71,  71,  71,
-     72,  72,  72,  72,  72,  72,  72,  72,  73,  73,  73,  73,  73,  73,  73,  73,
-     74,  74,  74,  74,  74,  74,  74,  74,  75,  75,  75,  75,  75,  75,  75,  75,
-     76,  76,  76,  76,  76,  76,  76,  76,  77,  77,  77,  77,  77,  77,  77,  77,
-     78,  78,  78,  78,  78,  78,  78,  78,  79,  79,  79,  79,  79,  79,  79,  79,
-     80,  80,  80,  80,  80,  80,  80,  80,  81,  81,  81,  81,  81,  81,  81,  81,
-     82,  82,  82,  82,  82,  82,  82,  82,  83,  83,  83,  83,  83,  83,  83,  83,
-     84,  84,  84,  84,  84,  84,  84,  84,  85,  85,  85,  85,  85,  85,  85,  85,
-     86,  86,  86,  86,  86,  86,  86,  86,  87,  87,  87,  87,  87,  87,  87,  87,
-     88,  88,  88,  88,  88,  88,  88,  88,  89,  89,  89,  89,  89,  89,  89,  89,
-     90,  90,  90,  90,  90,  90,  90,  90,  91,  91,  91,  91,  91,  91,  91,  91,
-     92,  92,  92,  92,  92,  92,  92,  92,  93,  93,  93,  93,  93,  93,  93,  93,
-     94,  94,  94,  94,  94,  94,  94,  94,  95,  95,  95,  95,  95,  95,  95,  95,
-     96,  96,  96,  96,  96,  96,  96,  96,  97,  97,  97,  97,  97,  97,  97,  97,
-     98,  98,  98,  98,  98,  98,  98,  98,  99,  99,  99,  99,  99,  99,  99,  99,
-    100, 100, 100, 100, 100, 100, 100, 100, 101, 101, 101, 101, 101, 101, 101, 101,
-    102, 102, 102, 102, 102, 102, 102, 102, 103, 103, 103, 103, 103, 103, 103, 103,
-    104, 104, 104, 104, 104, 104, 104, 104, 105, 105, 105, 105, 105, 105, 105, 105,
-    106, 106, 106, 106, 106, 106, 106, 106, 107, 107, 107, 107, 107, 107, 107, 107,
-    108, 108, 108, 108, 108, 108, 108, 108, 109, 109, 109, 109, 109, 109, 109, 109,
-    110, 110, 110, 110, 110, 110, 110, 110, 111, 111, 111, 111, 111, 111, 111, 111,
-    112, 112, 112, 112, 112, 112, 112, 112, 113, 113, 113, 113, 113, 113, 113, 113,
-    114, 114, 114, 114, 114, 114, 114, 114, 115, 115, 115, 115, 115, 115, 115, 115,
-    116, 116, 116, 116, 116, 116, 116, 116, 117, 117, 117, 117, 117, 117, 117, 117,
-    118, 118, 118, 118, 118, 118, 118, 118, 119, 119, 119, 119, 119, 119, 119, 119,
-    120, 120, 120, 120, 120, 120, 120, 120, 121, 121, 121, 121, 121, 121, 121, 121,
-    122, 122, 122, 122, 122, 122, 122, 122, 123, 123, 123, 123, 123, 123, 123, 123,
-    124, 124, 124, 124, 124, 124, 124, 124, 125, 125, 125, 125, 125, 125, 125, 125,
-    126, 126, 126, 126, 126, 126, 126, 126, 127, 127, 127, 127, 127, 127, 127, 127,
-    128, 128, 128, 128, 128, 128, 128, 128, 129, 129, 129, 129, 129, 129, 129, 129,
-    130, 130, 130, 130, 130, 130, 130, 130, 131, 131, 131, 131, 131, 131, 131, 131,
-    132, 132, 132, 132, 132, 132, 132, 132, 133, 133, 133, 133, 133, 133, 133, 133,
-    134, 134, 134, 134, 134, 134, 134, 134, 135, 135, 135, 135, 135, 135, 135, 135,
-    136, 136, 136, 136, 136, 136, 136, 136, 137, 137, 137, 137, 137, 137, 137, 137,
-    138, 138, 138, 138, 138, 138, 138, 138, 139, 139, 139, 139, 139, 139, 139, 139,
-    140, 140, 140, 140, 140, 140, 140, 140, 141, 141, 141, 141, 141, 141, 141, 141,
-    142, 142, 142, 142, 142, 142, 142, 142, 143, 143, 143, 143, 143, 143, 143, 143,
-    144, 144, 144, 144, 144, 144, 144, 144, 145, 145, 145, 145, 145, 145, 145, 145,
-    146, 146, 146, 146, 146, 146, 146, 146, 147, 147, 147, 147, 147, 147, 147, 147,
-    148, 148, 148, 148, 148, 148, 148, 148, 149, 149, 149, 149, 149, 149, 149, 149,
-    150, 150, 150, 150, 150, 150, 150, 150, 151, 151, 151, 151, 151, 151, 151, 151,
-    152, 152, 152, 152, 152, 152, 152, 152, 153, 153, 153, 153, 153, 153, 153, 153,
-    154, 154, 154, 154, 154, 154, 154, 154, 155, 155, 155, 155, 155, 155, 155, 155,
-    156, 156, 156, 156, 156, 156, 156, 156, 157, 157, 157, 157, 157, 157, 157, 157,
-    158, 158, 158, 158, 158, 158, 158, 158, 159, 159, 159, 159, 159, 159, 159, 159,
-    160, 160, 160, 160, 160, 160, 160, 160, 161, 161, 161, 161, 161, 161, 161, 161,
-    162, 162, 162, 162, 162, 162, 162, 162, 163, 163, 163, 163, 163, 163, 163, 163,
-    164, 164, 164, 164, 164, 164, 164, 164, 165, 165, 165, 165, 165, 165, 165, 165,
-    166, 166, 166, 166, 166, 166, 166, 166, 167, 167, 167, 167, 167, 167, 167, 167,
-    168, 168, 168, 168, 168, 168, 168, 168, 169, 169, 169, 169, 169, 169, 169, 169,
-    170, 170, 170, 170, 170, 170, 170, 170, 171, 171, 171, 171, 171, 171, 171, 171,
-    172, 172, 172, 172, 172, 172, 172, 172, 173, 173, 173, 173, 173, 173, 173, 173,
-    174, 174, 174, 174, 174, 174, 174, 174, 175, 175, 175, 175, 175, 175, 175, 175,
-    176, 176, 176, 176, 176, 176, 176, 176, 177, 177, 177, 177, 177, 177, 177, 177,
-    178, 178, 178, 178, 178, 178, 178, 178, 179, 179, 179, 179, 179, 179, 179, 179,
-    180, 180, 180, 180, 180, 180, 180, 180, 181, 181, 181, 181, 181, 181, 181, 181,
-    182, 182, 182, 182, 182, 182, 182, 182, 183, 183, 183, 183, 183, 183, 183, 183,
-    184, 184, 184, 184, 184, 184, 184, 184, 185, 185, 185, 185, 185, 185, 185, 185,
-    186, 186, 186, 186, 186, 186, 186, 186, 187, 187, 187, 187, 187, 187, 187, 187,
-    188, 188, 188, 188, 188, 188, 188, 188, 189, 189, 189, 189, 189, 189, 189, 189,
-    190, 190, 190, 190, 190, 190, 190, 190, 191, 191, 191, 191, 191, 191, 191, 191,
-    192, 192, 192, 192, 192, 192, 192, 192, 193, 193, 193, 193, 193, 193, 193, 193,
-    194, 194, 194, 194, 194, 194, 194, 194, 195, 195, 195, 195, 195, 195, 195, 195,
-    196, 196, 196, 196, 196, 196, 196, 196, 197, 197, 197, 197, 197, 197, 197, 197,
-    198, 198, 198, 198, 198, 198, 198, 198, 199, 199, 199, 199, 199, 199, 199, 199,
-    200, 200, 200, 200, 200, 200, 200, 200, 201, 201, 201, 201, 201, 201, 201, 201,
-    202, 202, 202, 202, 202, 202, 202, 202, 203, 203, 203, 203, 203, 203, 203, 203,
-    204, 204, 204, 204, 204, 204, 204, 204, 205, 205, 205, 205, 205, 205, 205, 205,
-    206, 206, 206, 206, 206, 206, 206, 206, 207, 207, 207, 207, 207, 207, 207, 207,
-    208, 208, 208, 208, 208, 208, 208, 208, 209, 209, 209, 209, 209, 209, 209, 209,
-    210, 210, 210, 210, 210, 210, 210, 210, 211, 211, 211, 211, 211, 211, 211, 211,
-    212, 212, 212, 212, 212, 212, 212, 212, 213, 213, 213, 213, 213, 213, 213, 213,
-    214, 214, 214, 214, 214, 214, 214, 214, 215, 215, 215, 215, 215, 215, 215, 215,
-    216, 216, 216, 216, 216, 216, 216, 216, 217, 217, 217, 217, 217, 217, 217, 217,
-    218, 218, 218, 218, 218, 218, 218, 218, 219, 219, 219, 219, 219, 219, 219, 219,
-    220, 220, 220, 220, 220, 220, 220, 220, 221, 221, 221, 221, 221, 221, 221, 221,
-    222, 222, 222, 222, 222, 222, 222, 222, 223, 223, 223, 223, 223, 223, 223, 223,
-    224, 224, 224, 224, 224, 224, 224, 224, 225, 225, 225, 225, 225, 225, 225, 225,
-    226, 226, 226, 226, 226, 226, 226, 226, 227, 227, 227, 227, 227, 227, 227, 227,
-    228, 228, 228, 228, 228, 228, 228, 228, 229, 229, 229, 229, 229, 229, 229, 229,
-    230, 230, 230, 230, 230, 230, 230, 230, 231, 231, 231, 231, 231, 231, 231, 231,
-    232, 232, 232, 232, 232, 232, 232, 232, 233, 233, 233, 233, 233, 233, 233, 233,
-    234, 234, 234, 234, 234, 234, 234, 234, 235, 235, 235, 235, 235, 235, 235, 235,
-    236, 236, 236, 236, 236, 236, 236, 236, 237, 237, 237, 237, 237, 237, 237, 237,
-    238, 238, 238, 238, 238, 238, 238, 238, 239, 239, 239, 239, 239, 239, 239, 239,
-    240, 240, 240, 240, 240, 240, 240, 240, 241, 241, 241, 241, 241, 241, 241, 241,
-    242, 242, 242, 242, 242, 242, 242, 242, 243, 243, 243, 243, 243, 243, 243, 243,
-    244, 244, 244, 244, 244, 244, 244, 244, 245, 245, 245, 245, 245, 245, 245, 245,
-    246, 246, 246, 246, 246, 246, 246, 246, 247, 247, 247, 247, 247, 247, 247, 247,
-    248, 248, 248, 248, 248, 248, 248, 248, 249, 249, 249, 249, 249, 249, 249, 249,
-    250, 250, 250, 250, 250, 250, 250, 250, 251, 251, 251, 251, 251, 251, 251, 251,
-    252, 252, 252, 252, 252, 252, 252, 252, 253, 253, 253, 253, 253, 253, 253, 253,
-    254, 254, 254, 254, 254, 254, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255,
-    256, 256, 256, 256, 256, 256, 256, 256, 257, 257, 257, 257, 257, 257, 257, 257,
-    258, 258, 258, 258, 258, 258, 258, 258, 259, 259, 259, 259, 259, 259, 259, 259,
-    260, 260, 260, 260, 260, 260, 260, 260, 261, 261, 261, 261, 261, 261, 261, 261,
-    262, 262, 262, 262, 262, 262, 262, 262, 263, 263, 263, 263, 263, 263, 263, 263,
-    264, 264, 264, 264, 264, 264, 264, 264, 265, 265, 265, 265, 265, 265, 265, 265,
-    266, 266, 266, 266, 266, 266, 266, 266, 267, 267, 267, 267, 267, 267, 267, 267,
-    268, 268, 268, 268, 268, 268, 268, 268, 269, 269, 269, 269, 269, 269, 269, 269,
-    270, 270, 270, 270, 270, 270, 270, 270, 271, 271, 271, 271, 271, 271, 271, 271,
-    272, 272, 272, 272, 272, 272, 272, 272, 273, 273, 273, 273, 273, 273, 273, 273,
-    274, 274, 274, 274, 274, 274, 274, 274, 275, 275, 275, 275, 275, 275, 275, 275,
-    276, 276, 276, 276, 276, 276, 276, 276, 277, 277, 277, 277, 277, 277, 277, 277,
-    278, 278, 278, 278, 278, 278, 278, 278, 279, 279, 279, 279, 279, 279, 279, 279,
-    280, 280, 280, 280, 280, 280, 280, 280, 281, 281, 281, 281, 281, 281, 281, 281,
-    282, 282, 282, 282, 282, 282, 282, 282, 283, 283, 283, 283, 283, 283, 283, 283,
-    284, 284, 284, 284, 284, 284, 284, 284, 285, 285, 285, 285, 285, 285, 285, 285,
-    286, 286, 286, 286, 286, 286, 286, 286, 287, 287, 287, 287, 287, 287, 287, 287,
-    288, 288, 288, 288, 288, 288, 288, 288, 289, 289, 289, 289, 289, 289, 289, 289,
-    290, 290, 290, 290, 290, 290, 290, 290, 291, 291, 291, 291, 291, 291, 291, 291,
-    292, 292, 292, 292, 292, 292, 292, 292, 293, 293, 293, 293, 293, 293, 293, 293,
-    294, 294, 294, 294, 294, 294, 294, 294, 295, 295, 295, 295, 295, 295, 295, 295,
-    296, 296, 296, 296, 296, 296, 296, 296, 297, 297, 297, 297, 297, 297, 297, 297,
-    298, 298, 298, 298, 298, 298, 298, 298, 299, 299, 299, 299, 299, 299, 299, 299,
-    300, 300, 300, 300, 300, 300, 300, 300,
+static RE_UINT16 re_alphanumeric_table_2[] = {
+      0,   1,   2,   2,   0,   3,   4,   4,   5,   5,   5,   5,   5,   5,   5,   5,
+      5,   5,   5,   5,   5,   5,   6,   7,   0,   0,   8,   9,  10,  11,   5,  12,
+      5,   5,   5,   5,  13,   5,   5,   5,   5,  14,  15,   5,  16,  17,  18,  19,
+     20,   5,  21,  22,   5,   5,  23,  24,  25,   5,  26,   5,   5,  27,   5,  28,
+     29,  30,  31,  32,   0,  33,  34,  35,   5,  36,  37,  38,  39,  40,  41,  42,
+     43,  44,  45,  46,  47,  48,  49,  50,  51,  48,  52,  53,  54,  55,  56,  57,
+     58,  59,  60,  61,  58,  62,  63,  64,  65,  66,  67,  68,  69,  70,  71,  72,
+     73,  74,  75,   0,  76,  77,  78,   0,  79,  80,  81,  82,  83,  84,   0,   0,
+      5,  85,  86,   5,  87,   5,  88,  89,   5,   5,   5,   5,   5,   5,   5,   5,
+      5,   5,  90,   5,  91,  92,  93,   5,  94,   5,  74,   0,  95,   5,   5,  96,
+     73,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
+      5,   5,   5,  97,   2,   5,   5,  98,  99, 100, 100, 101,   5, 102, 103,  80,
+      1,   5,   5,  31,   5, 104,   5, 105, 106, 107, 108, 109,   5, 110, 111,   0,
+    112,   5, 106, 113, 111, 114,  79,   0,   5, 115, 116,   0,   5, 117,   5, 118,
+      5, 119, 120,  87, 121,  66,   0, 122,   5,   5,   5,   5,   5,   5,   0, 123,
+      5,   5,   5,   5,   5,   5,   5,   5,  96,   5, 124,  87,   5, 125, 126, 127,
+      0,   0,   0, 128, 129,   0,   0,   0, 130, 131, 132,   5,  16,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0, 133,   5,  80,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      5, 134, 106,   5,   5,   5,   5, 135,   5,  88,   5, 136, 119, 137, 137,   5,
+      0, 138,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    139, 140,  73,   5, 141,  73,   5,  89, 142,  14,   5,   5, 143,   5,   0,  25,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
+      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
+      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   0,   0,
+      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
+      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
+      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,  84,
+      5,   5,   5,   5,  30,   0,  25,  87,   5,   5,   5,   5,   5,   5,   5,   5,
+    144, 145,   5, 146,   5,   5,   5,  95, 147, 148,   5,   5, 149,   5, 150, 151,
+    152, 153,   5, 100,   5,   5, 154, 155,   5, 104, 156,  84,   5, 157, 158, 106,
+      5, 119, 159, 160,   5, 106, 161, 162, 163, 164,  89,  86,   5,   5,   5, 165,
+      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
+      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5, 166, 167, 112,
+      0,   0,   0,   0,   0,   0,   0,   0,   5,   5,   5,   5,   5,   5,   5,   5,
+      5,   5,   5, 168,   5,   5, 169,   0, 170, 171, 172,   5,   5,  27, 173,   5,
+      5,   5,   5,   5,   5,   5,   5,   5,   5,  87,  25,   5, 174,   5, 153, 175,
+      0,   0,   0, 176,   5,   5,   5,  84,   1,   2,   2, 108,   5, 106, 177,   0,
+    178, 179, 180,   0,   5,   5,   5,  74,   0,   0,   5, 181,   0,   0,   0,   0,
+      0,   0,   0,   0,  84,   5, 182,   0,   5,  26, 104,  74,  87,   5, 183,   0,
+      5,   5,   5,   5,  87,  86, 184, 112,   5, 185,   5, 186,   0,   0,   0,   0,
+      5,   5,   5,   5,   5,   5,   5,   5,   5, 119, 105, 153,   0,   0,   0,   0,
+    187, 188, 105, 119, 106,   0,   0, 189, 105, 169,   0,   0,   5, 190,   0,   0,
+    191, 105,   0,  84,  84,   0,  81, 192,   5, 105, 105, 156,  27,   0,   0,   0,
+      5,   5,  16,   0,   5, 156,   5, 156,   5, 193,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   5, 194,   0,   0,  84, 195, 196,   0,   0,  25, 192, 119,
+      5,   5, 196,  57, 148,  31,  25, 197,   5, 198, 199, 200,   5,   5, 201,   0,
+    202, 203,   0,   0, 204, 121,   5, 197,  39,  48, 205, 186,   0,   0,   0,   0,
+      5,   5, 206, 207,   5,   5, 208,   0,   0,   0,   0,   0,   5, 209, 210,   0,
+      5, 106, 211,   0,   5, 212,  80,   0,  66, 165,   0,   0,   0,   0,   0,   0,
+      5,  31,   0,   0,   0,   5,   5, 213, 214, 215, 216,   0,   0, 217,  29, 218,
+      5, 219,  25,   5, 220,   0,   5,  31,   0,   0,   0,   0,   0,   0,   0,   0,
+    221, 222, 223, 224, 174, 225,   0,   0, 226, 227, 228, 229, 230,  80,   0,   0,
+      0,   0,   0,   0,   0,   0,   0, 119,   0,   0,   0,   0,   0, 231,   0,   0,
+      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
+      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5, 169,   0,   0,   0,
+      5,   5,   5, 143,   5,   5,   5,   5,   5,   5, 186,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      5, 143,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
+      5,   5, 232,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
+      5,  31, 106,  80,   0,   0,  25, 233,   5,  95, 234, 235,  95,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   5,   5,   0,   0,   0,   0,   5,   5, 236,   5, 237,   0,   0, 238,
+      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
+      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5, 239,
+      5,   5,   5,   5,   5,   5, 105,   0,  16,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      5,   5,   5,   5,   5,   5,   5,   5, 106,   0, 240, 199,   5,   5,   5,   5,
+      5,   5,   5,   5,   5,   5,   5, 112,   0,   0,   0,   0,   0,   0,   0,   0,
+      5,   5,   5, 241, 242,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      5,   5,  33,   5, 243, 244, 245,   5, 246, 247, 248,   5,   5,   5,   5,   5,
+      5,   5,   5,   5,   5, 249, 250,  89,  33,  33, 134, 134, 221, 221, 251,   5,
+    252, 253,   0,   0,   0,   0,   0,   0,   5, 254, 255,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   5, 256,   0,   0,   0,   0,   0,   0,   0,   0,
+      5,   5,   5,   5,   5,   5, 192,   0,   5,   5, 257,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    245, 258, 259, 260, 261, 262,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,  25,  86,  86,  80,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,
+      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
+      5,   5,   5,   5,   5,   5,  87,   0,   5,   5,   5,   5,   5,   5,   5,   5,
+      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
+      5,   5,   5,   5,   5,   5,   5,   5,   5, 181,   5,   5,   5,   5,   5,   5,
+     87,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
+      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
+      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
+      5,   5,   5,   5,   5, 263,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
+      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
+      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,  79,
+      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
+     87,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
+      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,  32,   0,   0,   0,   0,   0
+};
+
+static RE_UINT8 re_alphanumeric_table_3[] = {
+      0,   0,   0,   0,   0,   0, 255,   3, 254, 255, 255,   7,   0,   4,  32,   4,
+    255, 255, 127, 255, 255, 255, 255, 255, 195, 255,   3,   0,  31,  80,   0,   0,
+     32,   0,   0,   0,   0,   0, 223, 188,  64, 215, 255, 255, 251, 255, 255, 255,
+    255, 255, 191, 255,   3, 252, 255, 255, 255, 255, 254, 255, 255, 255, 127,   2,
+    255,   1,   0,   0,   0,   0, 255, 191, 182,   0, 255, 255, 255, 135,   7,   0,
+      0,   0, 255,   7, 255, 255, 255, 254, 255, 195, 255, 255, 255, 255, 239,  31,
+    254, 225, 255, 159,   0,   0, 255, 255,   0, 224, 255, 255, 255, 255,   3,   0,
+    255,   7,  48,   4, 255, 255, 255, 252, 255,  31,   0,   0, 255, 255, 255,   1,
+    255,   7,   0,   0, 255, 255, 223, 255, 255,   0, 240, 255, 248,   3, 255, 255,
+    255, 255, 255, 239, 255, 223, 225, 255, 207, 255, 254, 255, 239, 159, 249, 255,
+    255, 253, 197, 227, 159,  89, 128, 176, 207, 255,   3,  16, 238, 135, 249, 255,
+    255, 253, 109, 195, 135,  25,   2,  94, 192, 255,  63,   0, 238, 191, 251, 255,
+    255, 253, 237, 227, 191,  27,   1,   0, 207, 255,   0,  30, 238, 159, 249, 255,
+    159,  25, 192, 176, 207, 255,   2,   0, 236, 199,  61, 214,  24, 199, 255, 195,
+    199,  29, 129,   0, 192, 255,   0,   0, 239, 223, 253, 255, 255, 253, 255, 227,
+    223,  29,  96,   7, 207, 255,   0,   0, 255, 253, 239, 227, 223,  29,  96,  64,
+    207, 255,   6,   0, 255, 223, 253, 255, 255, 255, 255, 231, 223,  93, 240, 128,
+    207, 255,   0, 252, 238, 255, 127, 252, 255, 255, 251,  47, 127, 128,  95, 255,
+    192, 255,  12,   0, 254, 255, 255, 255, 255, 255, 255,   7, 127,  32, 255,   3,
+    214, 247, 255, 255, 175, 255, 255,  59,  95,  32, 255, 243,   1,   0,   0,   0,
+    255,   3,   0,   0, 255, 254, 255, 255, 255,  31, 254, 255,   3, 255, 255, 254,
+    255, 255, 255,  31, 255, 255, 127, 249, 255,   3, 255, 255, 255, 255, 255,  63,
+    191,  32, 255, 255, 255, 255, 255, 247, 255,  61, 127,  61, 255,  61, 255, 255,
+    255, 255,  61, 127,  61, 255, 127, 255, 255, 255,  61, 255, 255, 255,   0,   0,
+    255, 255,  63,  63, 255, 159, 255, 255, 255, 199, 255,   1, 255, 223,  15,   0,
+    255, 255,  15,   0, 255, 223,  13,   0, 255, 255, 207, 255, 255,   1, 128,  16,
+    255,   7, 255, 255, 255, 255,  63,   0, 255, 255, 255, 127, 255,  15, 255,   1,
+    192, 255, 255, 255, 255,  63,  31,   0, 255,  15, 255, 255, 255,   3, 255,   3,
+    255, 255, 255,  15, 254, 255,  31,   0, 128,   0,   0, 128, 255, 255, 239, 255,
+    239,  15, 255,   3, 255, 243, 255, 255, 191, 255,   3,   0, 255, 255, 127,   0,
+    255, 227, 255, 255, 255,   1, 255, 255,   0, 222, 111,   4, 128, 255,  31,   0,
+     63,  63, 255, 170, 255, 255, 223,  95, 220,  31, 207,  15, 255,  31, 220,  31,
+      0,   0,   2, 128,   0,   0, 255,  31, 132, 252,  47,  62,  80, 189, 255, 243,
+    224,  67,   0,   0,   0,   0, 192, 255, 255, 127, 255, 255,  31, 120,  12,   0,
+    255, 128,   0,   0, 127, 127, 127, 127,   0, 128,   0,   0, 224,   0,   0,   0,
+    254,   3,  62,  31, 255, 255, 127, 224, 224, 255, 255, 255, 255, 127,   0,   0,
+    255,  31, 255, 255, 255,  15,   0,   0, 255, 127, 240, 143,   0,   0, 128, 255,
+    252, 255, 255, 255, 255, 249, 255, 255, 252,   7,   0,   0,   0,   0, 224, 255,
+    191, 255, 255, 255, 255,   0,   0,   0,  47,   0, 255,   3,   0,   0, 252, 232,
+    255, 255,   7,   0, 255, 255, 247, 255,   0, 128, 255,   3, 255,  63, 255,   3,
+    255, 255, 127, 252,   5,   0,   0,  56, 255, 255,  60,   0, 126, 126, 126,   0,
+    127, 127, 255, 255, 255,   7, 255,   3,  15,   0, 255, 255, 127, 248, 255, 255,
+    255,  63, 255, 255, 255, 255, 255,   3, 127,   0, 248, 224, 255, 253, 127,  95,
+    219, 255, 255, 255,   0,   0, 248, 255, 255, 255, 252, 255,   0,   0, 255,  15,
+      0,   0, 223, 255, 252, 252, 252,  28, 255, 239, 255, 255, 127, 255, 255, 183,
+    255,  63, 255,  63, 255, 255,  31,   0, 255, 255,   1,   0,  15, 255,  62,   0,
+    255, 255,  15, 255, 255,   0, 255, 255,  15,   0,   0,   0,  63, 253, 255, 255,
+    255, 255, 191, 145, 255, 255,  55,   0, 255, 255, 255, 192, 111, 240, 239, 254,
+     31,   0,   0,   0, 255,   0, 255,   3, 255,  27,   3,   0, 128,   0, 255, 255,
+     63,   0,   0,   0, 255,   1, 255,   3, 255, 255, 199, 255, 240,   0, 255, 255,
+    255, 255,  71,   0,  30, 192, 255,  23, 255, 255, 251, 255, 255, 255, 159,  64,
+    127, 189, 255, 191, 159,  25, 129, 224, 187,   7, 255, 131,   3,   0,   0,   0,
+    179,   0, 255,   3, 255, 255,  63, 127,   0,   0,   0,  63,  17,   0, 255,   3,
+    255, 255,  63,   1, 255,   3,   0, 128, 127, 242, 111, 255, 255, 255, 191, 153,
+      7,   0, 255,   3, 255, 252, 255, 255,  26,   0,   0,   0, 255, 255, 231, 127,
+    255, 255, 255,  32, 255, 253, 255, 255, 255, 255, 127, 127,   1,   0, 255,   3,
+      0,   0, 252, 255, 255, 254, 127,   0, 127, 251, 255, 255, 255, 255, 127, 180,
+    203,   0, 255,   3, 191, 253, 255, 255, 255, 127, 123,   1,   0,   0,   1,   0,
+    127,   0,   0,   0, 255,  63,   0,   0,  15,   0, 255,   3, 248, 255, 255, 224,
+    255, 135, 255, 255, 255, 128, 255, 255,  11,   0,   3,   0, 255, 255, 255,   0,
+      0,   0,   7,   0, 255,   7, 255,  31, 255,   1, 255,  67, 255, 255, 255, 223,
+    100, 222, 255, 235, 239, 255, 255, 255, 191, 231, 223, 223, 255, 255, 255, 123,
+     95, 252, 253, 255,  63, 255, 255, 255, 253, 255, 255, 247, 247, 207, 255, 255,
+    127, 255, 255, 249, 219,   7,   0,   0, 255,  31, 128,  63, 255,  67,   0,   0,
+    255,  15, 255,   3, 143,   8, 255,   3, 150, 254, 247,  10, 132, 234, 150, 170,
+    150, 247, 247,  94, 255, 251, 255,  15, 238, 251, 255,  15,   3,   0, 255, 255
 };
 
-/* Block: 13160 bytes. */
-
-RE_UINT32 re_get_block(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-
-    f = ch >> 10;
-    code = ch ^ (f << 10);
-    pos = (RE_UINT32)re_block_stage_1[f] << 5;
-    f = code >> 5;
-    code ^= f << 5;
-    pos = (RE_UINT32)re_block_stage_2[pos + f] << 2;
-    f = code >> 3;
-    code ^= f << 3;
-    pos = (RE_UINT32)re_block_stage_3[pos + f] << 3;
-    value = re_block_stage_4[pos + code];
-
-    return value;
-}
-
-/* Script. */
-
-static RE_UINT8 re_script_stage_1[] = {
-     0,  1,  2,  3,  4,  5,  6,  7,  7,  8,  7,  7,  7,  7,  7,  7,
-     7,  7,  7,  9, 10, 11, 12, 12, 12, 12, 13, 14, 14, 14, 14, 15,
-    16, 17, 18, 19, 20, 14, 21, 14, 22, 14, 14, 14, 14, 23, 24, 24,
-    25, 26, 14, 14, 14, 14, 27, 28, 14, 14, 29, 30, 31, 32, 33, 34,
-     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
-     7,  7,  7,  7, 35,  7, 36, 37,  7, 38,  7,  7,  7, 39, 14, 40,
-    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-    41, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-};
+RE_UINT32 re_get_alphanumeric(RE_UINT32 codepoint) {
+    RE_UINT32 field_2;
+    RE_UINT32 field_1;
+    RE_UINT32 field_0;
+    RE_UINT32 offset;
+    RE_UINT32 v;
 
-static RE_UINT8 re_script_stage_2[] = {
-      0,   1,   2,   2,   2,   3,   4,   5,   6,   7,   8,   9,  10,  11,  12,  13,
-     14,  15,  16,  17,  18,  19,  20,  21,  22,  23,  24,  25,  26,  27,  28,  29,
-     30,  31,  32,  32,  33,  34,  35,  36,  37,  37,  37,  37,  37,  38,  39,  40,
-     41,  42,  43,  44,  45,  46,  47,  48,  49,  50,  51,  52,   2,   2,  53,  54,
-     55,  56,  57,  58,  59,  59,  59,  59,  60,  59,  59,  59,  59,  59,  59,  59,
-     61,  61,  59,  59,  59,  59,  62,  63,  64,  65,  66,  67,  68,  69,  70,  71,
-     72,  73,  74,  75,  76,  77,  78,  59,  70,  70,  70,  70,  70,  70,  70,  70,
-     70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  70,
-     70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  79,  70,  70,  70,  70,
-     70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  80,
-     81,  81,  81,  81,  81,  81,  81,  81,  81,  82,  83,  83,  84,  85,  86,  87,
-     88,  89,  90,  91,  92,  93,  94,  95,  32,  32,  32,  32,  32,  32,  32,  32,
-     32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,
-     32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  96,
-     97,  97,  97,  97,  97,  97,  97,  97,  97,  97,  97,  97,  97,  97,  97,  97,
-     97,  97,  70,  70,  98,  99, 100, 101, 102, 102, 103, 104, 105, 106, 107, 108,
-    109, 110, 111, 112,  97, 113, 114, 115, 116, 117, 118,  97, 119, 119, 120,  97,
-    121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131,  97, 132,  97, 133, 134,
-    135, 136, 137, 138, 139, 140, 141,  97, 142, 143,  97, 144, 145, 146, 147,  97,
-    148, 149,  97, 150, 151, 152,  97,  97, 153, 154, 155, 156,  97, 157,  97, 158,
-    159, 159, 159, 159, 159, 159, 159, 160, 161, 159, 162,  97,  97,  97,  97,  97,
-    163, 163, 163, 163, 163, 163, 163, 163, 164,  97,  97,  97,  97,  97,  97,  97,
-     97,  97,  97,  97,  97,  97,  97,  97, 165, 165, 165, 165, 166,  97,  97,  97,
-    167, 167, 167, 167, 168, 169, 170, 171,  97,  97,  97,  97, 172, 173, 174, 175,
-    176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176,
-    176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 177,
-    176, 176, 176, 176, 176, 178,  97,  97,  97,  97,  97,  97,  97,  97,  97,  97,
-    179, 180, 181, 182, 182, 183,  97,  97,  97,  97,  97,  97,  97,  97,  97,  97,
-     97,  97,  97,  97,  97,  97,  97,  97, 184, 185,  97,  97,  97,  97,  97,  97,
-     59, 186, 187, 188, 189, 190, 191,  97, 192, 193, 194,  59,  59, 195,  59, 196,
-    197, 197, 197, 197, 197, 198,  97,  97,  97,  97,  97,  97,  97,  97,  97,  97,
-    199,  97, 200,  97,  97, 201,  97,  97,  97,  97,  97,  97,  97,  97,  97,  97,
-    202, 203, 204,  97,  97,  97,  97,  97, 205, 206, 207,  97, 208, 209,  97,  97,
-    210, 211, 212, 213, 214,  97,  59,  59,  59,  59,  59,  59,  59, 215, 216, 217,
-    218, 219, 220, 221, 222, 223,  97,  97,  97,  97,  97,  97,  97,  97,  97,  97,
-     70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  70, 224,  70,  70,
-     70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  70, 225,  70,
-    226,  70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  70,
-     70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  70, 227,  70,  70,
-     70,  70,  70,  70,  70,  70,  70, 228,  97,  97,  97,  97,  97,  97,  97,  97,
-     70,  70,  70,  70, 229,  97,  97,  97,  97,  97,  97,  97,  97,  97,  97,  97,
-    230,  97, 231, 232,  97,  97,  97,  97,  97,  97,  97,  97,  97,  97,  97,  97,
-};
+    field_2 = codepoint >> 10;
+    field_1 = (codepoint >> 5) & 0x1F;
+    field_0 = (codepoint >> 3) & 0x3;
+    offset = codepoint & 0x7;
 
-static RE_UINT16 re_script_stage_3[] = {
-      0,   0,   0,   0,   0,   0,   0,   0,   1,   2,   2,   3,   1,   2,   2,   3,
-      0,   0,   0,   0,   0,   4,   0,   4,   2,   2,   5,   2,   2,   2,   5,   2,
-      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
-      2,   2,   2,   2,   2,   2,   2,   6,   0,   0,   0,   0,   7,   8,   0,   0,
-      9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,  10,  11,
-     12,  13,  14,  14,  15,  14,  14,  14,  14,  14,  14,  14,  16,  17,  14,  14,
-     18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,
-     19,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,
-     18,  18,  18,  18,  18,  18,  20,  21,  21,  21,  22,  20,  21,  21,  21,  21,
-     21,  23,  24,  25,  25,  25,  25,  25,  25,  26,  25,  25,  25,  27,  28,  26,
-     29,  30,  31,  32,  31,  31,  31,  31,  33,  34,  35,  31,  31,  31,  36,  31,
-     31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  29,  31,  31,  31,  31,
-     37,  38,  37,  37,  37,  37,  37,  37,  37,  39,  31,  31,  31,  31,  31,  31,
-     40,  40,  40,  40,  40,  40,  41,  26,  42,  42,  42,  42,  42,  42,  42,  43,
-     44,  44,  44,  44,  44,  45,  44,  46,  47,  47,  47,  48,  37,  49,  26,  26,
-     26,  26,  26,  26,  31,  31,  50,  51,  26,  26,  52,  31,  53,  31,  31,  31,
-     54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  55,  54,  56,  54,  54,  54,
-     57,  58,  59,  60,  60,  61,  62,  63,  58,  64,  65,  66,  67,  60,  60,  68,
-     69,  70,  71,  72,  72,  73,  74,  75,  70,  76,  77,  78,  79,  72,  80,  26,
-     81,  82,  83,  84,  84,  85,  86,  87,  82,  88,  89,  26,  90,  84,  91,  92,
-     93,  94,  95,  96,  96,  97,  98,  99,  94, 100, 101, 102, 103,  96,  96,  26,
-    104, 105, 106, 107, 108, 105, 109, 110, 105, 106, 111,  26, 112, 109, 109, 113,
-    114, 115, 116, 114, 114, 116, 114, 117, 115, 118, 119, 120, 121, 114, 122, 114,
-    123, 124, 125, 123, 123, 125, 126, 127, 124, 128, 129, 130, 131, 123, 132,  26,
-    133, 134, 135, 136, 136, 136, 136, 136, 134, 135, 137, 136, 138, 136, 136, 136,
-    139, 140, 141, 142, 140, 140, 143, 144, 141, 145, 146, 140, 147, 140, 148,  26,
-    149, 150, 150, 150, 150, 150, 150, 151, 150, 150, 150, 152,  26,  26,  26,  26,
-    153, 154, 155, 155, 156, 155, 155, 157, 158, 157, 155, 159,  26,  26,  26,  26,
-    160, 160, 160, 160, 160, 160, 160, 160, 160, 161, 160, 160, 160, 162, 161, 160,
-    160, 160, 160, 161, 160, 160, 160, 163, 160, 163, 164, 165,  26,  26,  26,  26,
-    166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
-    166, 166, 166, 166, 167, 167, 167, 167, 168, 169, 167, 167, 167, 167, 167, 170,
-    171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171,
-    172, 172, 172, 172, 172, 172, 172, 172, 172, 173, 174, 173, 172, 172, 172, 172,
-    172, 173, 172, 172, 172, 172, 173, 174, 173, 172, 174, 172, 172, 172, 172, 172,
-    172, 172, 173, 172, 172, 172, 172, 172, 172, 172, 172, 175, 172, 172, 172, 176,
-    172, 172, 172, 177, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 179, 179,
-    180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180,
-    181, 181, 181, 182, 183, 183, 183, 183, 183, 183, 183, 183, 183, 184, 183, 185,
-    186, 187, 188,  26, 189, 189, 190,  26, 191, 191, 192,  26, 193, 194, 195,  26,
-    196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 197, 196, 198, 196, 198,
-    199, 200, 201, 202, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 203,
-    201, 201, 201, 201, 201, 204, 180, 180, 180, 180, 180, 180, 180, 180, 205,  26,
-    206, 206, 206, 207, 206, 208, 206, 208, 209, 206, 210, 210, 210, 211, 212,  26,
-    213, 213, 213, 213, 213, 214, 213, 213, 213, 215, 213, 216, 196, 196, 196, 196,
-    217, 217, 217, 218, 219, 219, 219, 219, 219, 219, 219, 220, 219, 219, 219, 221,
-    219, 222, 219, 222, 219, 223,   9, 224,  26,  26,  26,  26,  26,  26,  26,  26,
-    225, 225, 225, 225, 225, 225, 225, 225, 225, 226, 225, 225, 225, 225, 225, 227,
-    228, 228, 228, 228, 228, 228, 228, 228, 229, 229, 229, 229, 229, 229, 230, 231,
-    232, 232, 232, 232, 232, 232, 232, 233, 232, 234, 235, 235, 235, 235, 235, 235,
-     18, 236, 167, 167, 167, 167, 167, 237, 228,  26, 238,   9, 239, 240, 241, 242,
-      2,   2,   2,   2, 243, 244,   2,   2,   2,   2,   2, 245, 246, 247,   2, 248,
-      2,   2,   2,   2,   2,   2,   2, 249,   9,   9,   9,   9,   9,   9,   9, 250,
-     14,  14, 251, 251,  14,  14,  14,  14, 251, 251,  14, 252,  14,  14,  14, 251,
-     14,  14,  14,  14,  14,  14, 253,  14, 253,  14, 254, 255,  14,  14, 256, 257,
-      0, 258,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 259,   0, 260, 261,
-      0, 262,   2, 263,   0,   0,   0,   0,  26,  26,   9,   9,   9,   9, 264,  26,
-      0,   0,   0,   0, 265, 266,   4,   0,   0, 267,   0,   0,   2,   2,   2,   2,
-      2, 268,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0, 262,  26,  26,  26,   0, 269,  26,  26,   0,   0,   0,   0,
-    270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 271,   0,
-      0,   0, 272,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-    273, 273, 273, 273, 273, 274, 273, 273, 273, 273, 273, 274,   2,   2,   2,   2,
-     17,  17,  17,  17,  17,  17,  17,  17,  17,  17,  17,  17,  17,  17, 275, 276,
-    167, 167, 167, 167, 168, 169, 277, 277, 277, 277, 277, 277, 277, 278, 279, 278,
-    172, 172, 174,  26, 174, 174, 174, 174, 174, 174, 174, 174,  18,  18,  18,  18,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  26,  26,  26,  26,  26,  26,
-    280, 280, 280, 281, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 282,  26,
-    280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280,
-    280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 283,  26,  26,  26,   0, 284,
-    285,   0,   0,   0, 286, 287,   0, 288, 289, 290, 290, 290, 290, 290, 290, 290,
-    290, 290, 291, 292, 293, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 295,
-    296, 297, 297, 297, 297, 297, 298, 171, 171, 171, 171, 171, 171, 171, 171, 171,
-    171, 299,   0,   0, 297, 297, 297, 300,   0,   0,   0,   0, 284,  26, 294, 294,
-    171, 171, 171, 299,   0,   0,   0,   0,   0,   0,   0,   0, 171, 171, 171, 301,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 294, 294, 294, 294, 294, 302,
-    294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294,   0,   0,   0,   0,   0,
-    280, 280, 280, 280, 280, 280, 283,  26,   0,   0,   0,   0,   0,   0,   0,   0,
-    280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280,  26,  26,
-    303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303,
-    303, 304, 303, 303, 303, 303, 303, 303, 305,  26, 306, 306, 306, 306, 306, 306,
-    307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307,
-    307, 307, 307, 307, 307, 308,  26,  26,  18,  18,  18,  18,  18,  18,  18,  18,
-     18,  18,  18,  18, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309,  26,
-      0,   0,   0,   0, 310,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
-      2, 311,   2,   2,   2,   2,   2,   2, 312,  26,  26,  26,  26,  26, 313,   2,
-    314, 314, 314, 314, 314, 315,   0, 316, 317, 317, 317, 317, 317, 317, 317,  26,
-    318, 318, 318, 318, 318, 318, 318, 318, 319, 320, 318, 321,  54,  54,  54,  54,
-    322, 322, 322, 322, 322, 323, 324, 324, 324, 324, 325, 326, 171, 171, 171, 327,
-    328, 328, 328, 328, 328, 328, 328, 328, 328, 329, 328, 330, 166, 166, 166, 331,
-    332, 332, 332, 332, 332, 332, 333,  26, 332, 334, 332, 335, 166, 166, 166, 166,
-    336, 336, 336, 336, 336, 336, 336, 336, 337,  26,  26, 338, 339, 339, 340,  26,
-    341, 341, 341,  26, 174, 174,   2,   2,   2,   2,   2, 342, 343,  26, 178, 178,
-    178, 178, 178, 178, 178, 178, 178, 178, 339, 339, 339, 339, 339, 344, 339, 345,
-    171, 171, 171, 171, 346,  26, 171, 171, 299, 347, 171, 171, 171, 171, 171, 346,
-     26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
-    280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 283, 280, 280,
-    280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 348,  26,  26,  26,  26,
-    349,  26, 350, 351,  25,  25, 352, 353, 354,  25,  31,  31,  31,  31,  31,  31,
-     31,  31,  31,  31,  31,  31,  31,  31, 355,  26,  52,  31,  31,  31,  31,  31,
-     31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,
-     31,  31,  31,  31,  31,  31,  31, 356,  26,  26,  31,  31,  31,  31,  31,  31,
-     31,  31, 357,  31,  31,  31,  31,  31,  31,  26,  26,  26,  26,  26,  31,  51,
-      9,   9,   0, 316,   9, 358,   0,   0,   0,   0, 359,   0, 262, 284,  50,  31,
-     31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31, 360,
-    361,   0,   0,   0,   1,   2,   2,   3,   1,   2,   2,   3, 362, 294, 293, 294,
-    294, 294, 294, 363, 171, 171, 171, 299, 364, 364, 364, 365, 262, 262,  26, 366,
-    367, 368, 367, 367, 369, 367, 367, 370, 367, 371, 367, 371,  26,  26,  26,  26,
-    367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 372,
-    373,   0,   0,   0,   0,   0, 374,   0,  14,  14,  14,  14,  14,  14,  14,  14,
-     14, 257,   0, 284, 375,  26,  26,  26,  26,  26,   0,   0,   0,   0,   0, 376,
-    377, 377, 377, 378, 379, 379, 379, 379, 379, 379, 380,  26, 381,   0,   0, 284,
-    382, 382, 382, 382, 383, 384, 385, 385, 385, 386, 387, 387, 387, 387, 387, 388,
-    389, 389, 389, 390, 391, 391, 391, 391, 392, 391, 393,  26,  26,  26,  26,  26,
-    394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 395, 395, 395, 395, 395, 395,
-    396, 396, 396, 397, 396, 398, 399, 399, 399, 399, 400, 399, 399, 399, 399, 400,
-    401, 401, 401, 401, 401,  26, 402, 402, 402, 402, 402, 402, 403, 404,  26,  26,
-    405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405,
-    405, 405, 405, 405, 405, 405, 406,  26, 405, 405, 407,  26, 405,  26,  26,  26,
-    408, 409, 410, 410, 410, 410, 411, 412, 413, 413, 414, 413, 415, 415, 415, 415,
-    416, 416, 416, 417, 418, 416,  26,  26,  26,  26,  26,  26, 419, 419, 420, 421,
-    422, 422, 422, 423, 424, 424, 424, 425,  26,  26,  26,  26,  26,  26,  26,  26,
-    426, 426, 426, 426, 427, 427, 427, 428, 427, 427, 429, 427, 427, 427, 427, 427,
-    430, 431, 432, 433, 434, 434, 435, 436, 434, 437, 434, 437, 438, 438, 438, 438,
-    439, 439, 439, 439,  26,  26,  26,  26, 440, 440, 440, 440, 441, 442, 441,  26,
-    443, 443, 443, 443, 443, 443, 444, 445, 446, 446, 447, 446, 448, 448, 449, 448,
-    450, 450, 451, 452,  26, 453,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
-    454, 454, 454, 454, 454, 454, 454, 454, 454, 455,  26,  26,  26,  26,  26,  26,
-    456, 456, 456, 456, 456, 456, 457,  26, 456, 456, 456, 456, 456, 456, 457, 458,
-    459, 459, 459, 459, 459,  26, 459, 460,  26,  26,  26,  26,  26,  26,  26,  26,
-     26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  31,  31,  31, 461,
-    462, 462, 462, 462, 462,  26, 463, 463, 463, 463, 463, 464,  26,  26,  26,  26,
-     26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26, 465, 465, 466,  26,
-    467, 467, 467, 467, 467, 467, 467, 467, 467, 468, 469, 467, 467, 467,  26, 470,
-    471, 471, 471, 471, 471, 471, 471, 471, 472, 473, 474, 474, 474, 475, 474, 476,
-    477, 477, 477, 477, 477, 477, 478, 477, 479,  26, 480, 480, 480, 480, 481,  26,
-    482, 482, 482, 482, 482, 482, 482, 482, 482, 483, 482, 482, 484, 140, 485,  26,
-    486, 486, 487, 486, 486, 486, 486, 488,  26,  26,  26,  26,  26,  26,  26,  26,
-    489, 490, 491, 492, 491, 493, 494, 494, 494, 494, 494, 494, 494, 495, 494, 496,
-    497, 498, 499, 500, 500, 501, 502, 503, 498, 504, 505, 506, 507, 508, 508,  26,
-    509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 510,  26,  26,  26,  26,
-    511, 511, 511, 511, 511, 511, 511, 511, 511,  26, 511, 512,  26,  26,  26,  26,
-    513, 513, 513, 513, 513, 513, 514, 513, 513, 513, 513, 514,  26,  26,  26,  26,
-    515, 515, 515, 515, 515, 515, 515, 515, 516,  26, 515, 517, 201, 518,  26,  26,
-    519, 519, 519, 519, 519, 519, 519, 520, 519, 521,  26,  26,  26,  26,  26,  26,
-    522, 522, 522, 523, 522, 524, 522, 522,  26,  26,  26,  26,  26,  26,  26,  26,
-    525, 525, 525, 525, 525, 525, 525, 526,  26,  26,  26,  26,  26,  26,  26,  26,
-     26,  26,  26,  26, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 528, 529,
-     26,  26,  26,  26, 530, 531, 530, 530, 530, 530, 530, 531, 532,  26,  26,  26,
-    533, 533, 533, 533, 533, 533, 533, 533, 533,  26, 534, 534, 534, 534, 534, 534,
-    534, 534, 534, 534, 535,  26,  26,  26, 536, 536, 536, 536, 536, 536, 536, 537,
-    538, 539, 538, 538, 538, 538, 540, 538, 541,  26, 538, 538, 538, 542, 543, 543,
-    543, 543, 544, 543, 543, 545, 546,  26,  26,  26,  26,  26,  26,  26,  26,  26,
-    547, 548, 549, 549, 549, 549, 547, 550, 549,  26, 549, 551, 552, 553, 554, 554,
-    554, 555, 556, 557, 554, 558,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
-     26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26, 559, 559, 559, 560,
-     26,  26,  26,  26,  26,  26,  26,  26, 109, 109, 109, 109, 109, 109, 561, 562,
-    563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563,
-    563, 563, 563, 564,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
-    563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 565, 566,  26,
-    563, 563, 563, 563, 563, 563, 563, 563, 567,  26,  26,  26,  26,  26,  26,  26,
-    568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568,
-    568, 568, 568, 568, 568, 569, 568, 570,  26,  26,  26,  26,  26,  26,  26,  26,
-    571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571,
-    571, 571, 571, 571, 571, 571, 571, 571, 572,  26,  26,  26,  26,  26,  26,  26,
-    309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309,
-    309, 309, 309, 309, 309, 309, 309, 573, 574, 574, 574, 575, 574, 576,  26,  26,
-     26,  26,  26,  26,  26,  26,  26,  26,  26,  26, 577, 577, 577, 578, 578,  26,
-    579, 579, 579, 579, 579, 579, 579, 579, 580,  26, 579, 581, 581, 579, 579, 582,
-    579, 579,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
-     26,  26,  26,  26,  26,  26,  26,  26, 583, 583, 583, 583, 583, 583, 583, 583,
-    583, 583, 583, 584,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
-    585, 585, 585, 585, 585, 585, 585, 585, 585, 586, 585, 585, 585, 585, 585, 585,
-    585, 587, 585, 585,  26,  26,  26,  26,  26,  26,  26,  26, 588,  26,  26,  26,
-    589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589,
-    589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589,  26,
-    589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 590,  26,
-    591, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290,
-    290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290,
-    290, 290, 290, 291,  26,  26,  26,  26,  26,  26, 592,  26, 593,  26, 594, 594,
-    594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594,
-    594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 595,
-    596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 597, 596, 598,
-    596, 599, 596, 600, 284,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 272,  26,
-      0,   0,   0,   0, 262, 361,   0,   0,   0,   0,   0,   0, 601, 602,   0, 603,
-    604, 605,   0,   0,   0, 606,   0,   0,   0,   0,   0,   0,   0, 607,  26,  26,
-     14,  14,  14,  14,  14,  14,  14,  14, 251,  26,  26,  26,  26,  26,  26,  26,
-     26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,   0,   0, 284,  26,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 262,  26,   0,   0,   0, 607,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 259,   0,   0,   0,   0,   0,
-      0,   0,   0, 259, 608, 609,   0, 610, 611,   0,   0,   0,   0,   0,   0,   0,
-    612, 613, 259, 259,   0,   0,   0, 614, 615, 616, 617,   0,   0,   0,   0,   0,
-      0,   0,   0,   0, 272,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0, 271,   0,   0,   0,   0,   0,   0,
-    618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618,
-    618, 619,  26, 620, 621, 618,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
-    274, 273, 273, 622, 623, 624,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
-    625, 625, 625, 625, 625, 626, 625, 627, 625, 628,  26,  26,  26,  26,  26,  26,
-     26,  26,  26,  26,  26,  26,  26,  26, 629, 629, 629, 629, 629, 629, 629, 630,
-    631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631,
-    631, 631, 631, 631, 631, 631, 631, 631, 632, 631, 633,  26,  26,  26,  26,  26,
-    634, 634, 634, 634, 634, 634, 634, 634, 634, 635, 634, 636,  26,  26,  26,  26,
-     26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26, 361,   0,
-      0,   0,   0,   0,   0,   0, 637,  26,  26,  26,  26,  26,  26,  26,  26,  26,
-    361,   0,   0,   0,   0,   0,   0, 272,  26,  26,  26,  26,  26,  26,  26,  26,
-    638,  31,  31,  31, 639, 640, 641, 642, 643, 644, 639, 645, 639, 641, 641, 646,
-     31, 647,  31, 648, 649, 647,  31, 648,  26,  26,  26,  26,  26,  26, 355,  26,
-      0,   0,   0,   0,   0, 284,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0, 284,  26,   0, 262, 361,   0, 361,   0, 361,   0,   0,   0, 272,  26,
-      0, 637,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 637,   0,   0,
-      0,   0,   0,   0,   0, 637,  26,  26,  26,  26,  26,  26, 650,   0,   0,   0,
-    651,  26,   0,   0,   0,   0,   0, 284,   0, 607, 316,  26, 272,  26,  26,  26,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 272,  26,   0, 637,   0, 269,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 284,  26,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 607,   0, 284,  26,  26,
-      0, 284,   0,   0,   0,   0,   0,   0,   0,  26,   0, 316,   0,   0,   0,   0,
-      0,  26,   0,   0,   0, 272,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
-      0, 611,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 614, 616,
-      0,   0,   0,   0, 613, 652,   0,   0,   0, 613,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 284,  26,   0, 272, 284, 269,
-    269,  26, 272,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
-    280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 653,  26,  26,  26,  26,  26,
-    280, 280, 280, 280, 280, 280, 654,  26, 280, 280, 280, 280, 280, 280, 280, 280,
-    280, 280, 280, 283, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280,
-    280, 280, 280, 280, 348,  26, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280,
-    280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 655,  26,  26,  26,
-    280, 280, 280, 283,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
-    656,  26,  26,  26,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,
-      9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,  26,  26,
-};
+    v = re_alphanumeric_table_1[field_2];
+    v = re_alphanumeric_table_2[(v << 5) | field_1];
+    v = re_alphanumeric_table_3[(v << 2) | field_0];
 
-static RE_UINT8 re_script_stage_4[] = {
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   2,   2,   2,   2,   2,   2,   2,
-      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   1,   1,   1,   1,   1,
-      1,   1,   2,   1,   1,   1,   1,   1,   2,   2,   2,   2,   2,   2,   2,   1,
-      2,   1,   1,   1,   1,   1,   1,   1,   2,   2,   2,   2,   2,   1,   1,   1,
-      1,   1,  35,  35,   1,   1,   1,   1,  41,  41,  41,  41,  41,  41,  41,  41,
-      3,   3,   3,   3,   1,   3,   3,   3,   0,   0,   3,   3,   3,   3,   1,   3,
-      0,   0,   0,   0,   3,   1,   3,   1,   3,   3,   3,   0,   3,   0,   3,   3,
-      3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   0,   3,   3,   3,   3,   3,
-      3,   3,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,
-      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,  41,  41,   4,
-      0,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
-      5,   5,   5,   5,   5,   5,   5,   0,   5,   1,   5,   0,   0,   5,   5,   5,
-      0,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,
-      0,   0,   0,   0,   0,   0,   0,   0,   6,   6,   6,   0,   0,   0,   0,   6,
-      6,   6,   6,   6,   6,   0,   0,   0,   7,   7,   7,   7,   7,   1,   7,   7,
-      7,   7,   7,   7,   1,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
-      7,   7,   7,   1,   7,   0,   7,   1,   1,   7,   7,   7,   7,   7,   7,   7,
-      7,   7,   7,  41,  41,  41,  41,  41,  41,  41,  41,  41,  41,  41,   7,   7,
-     41,   7,   7,   7,   7,   7,   7,   7,   8,   8,   8,   8,   8,   8,   8,   8,
-      8,   8,   8,   8,   8,   8,   0,   8,   8,   8,   8,   0,   0,   8,   8,   8,
-      9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   0,   0,   0,   0,   0,   0,
-     66,  66,  66,  66,  66,  66,  66,  66,  66,  66,  66,   0,   0,  66,  66,  66,
-     82,  82,  82,  82,  82,  82,  82,  82,  82,  82,  82,  82,  82,  82,   0,   0,
-     82,  82,  82,  82,  82,  82,  82,   0,  95,  95,  95,  95,  95,  95,  95,  95,
-     95,  95,  95,  95,   0,   0,  95,   0,   8,   8,   8,   0,   0,   0,   0,   0,
-      7,   7,   7,   7,   7,   0,   7,   7,   7,   7,   7,   7,   7,   7,   0,   0,
-      0,   0,   0,   7,   7,   7,   7,   7,   7,   7,   1,   7,   7,   7,   7,   7,
-     10,  10,  10,  10,  10,  10,  10,  10,  10,  41,  41,  41,  41,  10,  10,  10,
-     10,  10,  10,  10,   1,   1,  10,  10,  11,  11,  11,  11,   0,  11,  11,  11,
-     11,  11,  11,  11,  11,   0,   0,  11,  11,   0,   0,  11,  11,  11,  11,  11,
-     11,  11,  11,  11,  11,  11,  11,  11,  11,   0,  11,  11,  11,  11,  11,  11,
-     11,   0,  11,   0,   0,   0,  11,  11,  11,  11,   0,   0,  11,  11,  11,  11,
-     11,   0,   0,  11,  11,  11,  11,   0,   0,   0,   0,   0,   0,   0,   0,  11,
-      0,   0,   0,   0,  11,  11,   0,  11,  11,  11,  11,  11,   0,   0,  11,  11,
-     11,  11,  11,  11,  11,  11,  11,   0,   0,  12,  12,  12,   0,  12,  12,  12,
-     12,  12,  12,   0,   0,   0,   0,  12,  12,   0,   0,  12,  12,  12,  12,  12,
-     12,  12,  12,  12,  12,  12,  12,  12,  12,   0,  12,  12,  12,  12,  12,  12,
-     12,   0,  12,  12,   0,  12,  12,   0,  12,  12,   0,   0,  12,   0,  12,  12,
-     12,   0,   0,  12,  12,  12,   0,   0,   0,  12,   0,   0,   0,   0,   0,   0,
-      0,  12,  12,  12,  12,   0,  12,   0,   0,   0,   0,   0,   0,   0,  12,  12,
-     12,  12,  12,  12,  12,  12,  12,   0,   0,  13,  13,  13,   0,  13,  13,  13,
-     13,  13,  13,  13,  13,  13,   0,  13,  13,  13,   0,  13,  13,  13,  13,  13,
-     13,  13,  13,  13,  13,  13,  13,  13,  13,   0,  13,  13,  13,  13,  13,  13,
-     13,   0,  13,  13,   0,  13,  13,  13,  13,  13,   0,   0,  13,  13,  13,  13,
-     13,  13,   0,  13,  13,  13,   0,   0,  13,   0,   0,   0,   0,   0,   0,   0,
-     13,  13,  13,  13,   0,   0,  13,  13,  13,  13,   0,   0,   0,   0,   0,   0,
-      0,  13,  13,  13,  13,  13,  13,  13,   0,  14,  14,  14,   0,  14,  14,  14,
-     14,  14,  14,  14,  14,   0,   0,  14,  14,   0,   0,  14,  14,  14,  14,  14,
-     14,  14,  14,  14,  14,  14,  14,  14,  14,   0,  14,  14,  14,  14,  14,  14,
-     14,   0,  14,  14,   0,  14,  14,  14,  14,  14,   0,   0,  14,  14,  14,  14,
-     14,   0,   0,  14,  14,  14,   0,   0,   0,   0,   0,   0,   0,   0,  14,  14,
-      0,   0,   0,   0,  14,  14,   0,  14,  14,  14,  14,  14,   0,   0,  14,  14,
-      0,   0,  15,  15,   0,  15,  15,  15,  15,  15,  15,   0,   0,   0,  15,  15,
-     15,   0,  15,  15,  15,  15,   0,   0,   0,  15,  15,   0,  15,   0,  15,  15,
-      0,   0,   0,  15,  15,   0,   0,   0,  15,  15,  15,  15,  15,  15,  15,  15,
-     15,  15,   0,   0,   0,   0,  15,  15,  15,   0,   0,   0,   0,   0,   0,  15,
-      0,   0,   0,   0,   0,   0,  15,  15,  15,  15,  15,   0,   0,   0,   0,   0,
-     16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,   0,  16,  16,
-     16,   0,  16,  16,  16,  16,  16,  16,  16,  16,   0,   0,   0,  16,  16,  16,
-     16,   0,  16,  16,  16,  16,   0,   0,   0,   0,   0,   0,   0,  16,  16,   0,
-     16,  16,  16,   0,   0,   0,   0,   0,  16,  16,  16,  16,   0,   0,  16,  16,
-      0,   0,   0,   0,   0,   0,   0,  16,  17,  17,  17,  17,  17,  17,  17,  17,
-     17,  17,  17,  17,  17,   0,  17,  17,  17,   0,  17,  17,  17,  17,  17,  17,
-     17,  17,  17,  17,   0,  17,  17,  17,  17,  17,   0,   0,  17,  17,  17,  17,
-     17,   0,  17,  17,  17,  17,   0,   0,   0,   0,   0,   0,   0,  17,  17,   0,
-      0,   0,   0,   0,   0,   0,  17,   0,  17,  17,  17,  17,   0,   0,  17,  17,
-      0,  17,  17,   0,   0,   0,   0,   0,  18,  18,  18,  18,   0,  18,  18,  18,
-     18,  18,  18,  18,  18,   0,  18,  18,  18,   0,  18,  18,  18,  18,  18,  18,
-     18,  18,  18,  18,  18,  18,  18,  18,   0,   0,   0,   0,  18,  18,  18,  18,
-     18,  18,  18,  18,   0,   0,  18,  18,   0,   0,  19,  19,   0,  19,  19,  19,
-     19,  19,  19,  19,  19,  19,  19,  19,  19,  19,  19,  19,  19,  19,  19,   0,
-      0,   0,  19,  19,  19,  19,  19,  19,  19,  19,   0,  19,  19,  19,  19,  19,
-     19,  19,  19,  19,   0,  19,   0,   0,   0,   0,  19,   0,   0,   0,   0,  19,
-     19,  19,  19,  19,  19,   0,  19,   0,   0,   0,   0,   0,   0,   0,  19,  19,
-      0,   0,  19,  19,  19,   0,   0,   0,   0,  20,  20,  20,  20,  20,  20,  20,
-     20,  20,  20,  20,  20,  20,  20,  20,  20,  20,  20,   0,   0,   0,   0,   1,
-     20,  20,  20,  20,   0,   0,   0,   0,   0,  21,  21,   0,  21,   0,  21,  21,
-     21,  21,  21,   0,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,
-     21,  21,  21,  21,   0,  21,   0,  21,  21,  21,  21,  21,  21,  21,   0,   0,
-     21,  21,  21,  21,  21,   0,  21,   0,  21,  21,   0,   0,  21,  21,  21,  21,
-     22,  22,  22,  22,  22,  22,  22,  22,   0,  22,  22,  22,  22,  22,  22,  22,
-     22,  22,  22,  22,  22,   0,   0,   0,  22,  22,  22,  22,  22,   0,  22,  22,
-     22,  22,  22,  22,  22,   1,   1,   1,   1,  22,  22,   0,   0,   0,   0,   0,
-     23,  23,  23,  23,  23,  23,  23,  23,  24,  24,  24,  24,  24,  24,  24,  24,
-     24,  24,  24,  24,  24,  24,   0,  24,   0,   0,   0,   0,   0,  24,   0,   0,
-     24,  24,  24,   1,  24,  24,  24,  24,  25,  25,  25,  25,  25,  25,  25,  25,
-     26,  26,  26,  26,  26,  26,  26,  26,  26,   0,  26,  26,  26,  26,   0,   0,
-     26,  26,  26,  26,  26,  26,  26,   0,  26,  26,  26,   0,   0,  26,  26,  26,
-     26,  26,  26,  26,  26,   0,   0,   0,  26,  26,   0,   0,   0,   0,   0,   0,
-     27,  27,  27,  27,  27,  27,  27,  27,  27,  27,  27,  27,  27,  27,   0,   0,
-     28,  28,  28,  28,  28,  28,  28,  28,  29,  29,  29,  29,  29,  29,  29,  29,
-     29,  29,  29,  29,  29,   0,   0,   0,  30,  30,  30,  30,  30,  30,  30,  30,
-     30,  30,  30,   1,   1,   1,  30,  30,  30,   0,   0,   0,   0,   0,   0,   0,
-     42,  42,  42,  42,  42,  42,  42,  42,  42,  42,  42,  42,  42,   0,  42,  42,
-     42,  42,  42,  42,  42,   0,   0,   0,  43,  43,  43,  43,  43,  43,  43,  43,
-     43,  43,  43,  43,  43,   1,   1,   0,  44,  44,  44,  44,  44,  44,  44,  44,
-     44,  44,  44,  44,   0,   0,   0,   0,  45,  45,  45,  45,  45,  45,  45,  45,
-     45,  45,  45,  45,  45,   0,  45,  45,  45,   0,  45,  45,   0,   0,   0,   0,
-     31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,   0,   0,
-     31,  31,   0,   0,   0,   0,   0,   0,  32,  32,   1,   1,  32,   1,  32,  32,
-     32,  32,  32,  32,  32,  32,  32,   0,  32,  32,  32,  32,  32,  32,  32,  32,
-     32,  32,   0,   0,   0,   0,   0,   0,  32,   0,   0,   0,   0,   0,   0,   0,
-     32,  32,  32,   0,   0,   0,   0,   0,  28,  28,  28,  28,  28,  28,   0,   0,
-     46,  46,  46,  46,  46,  46,  46,  46,  46,  46,  46,  46,  46,  46,  46,   0,
-     46,  46,  46,  46,   0,   0,   0,   0,  46,   0,   0,   0,  46,  46,  46,  46,
-     47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,   0,   0,
-     47,  47,  47,  47,  47,   0,   0,   0,  56,  56,  56,  56,  56,  56,  56,  56,
-     56,  56,  56,  56,   0,   0,   0,   0,  56,  56,   0,   0,   0,   0,   0,   0,
-     56,  56,  56,   0,   0,   0,  56,  56,  54,  54,  54,  54,  54,  54,  54,  54,
-     54,  54,  54,  54,   0,   0,  54,  54,  78,  78,  78,  78,  78,  78,  78,  78,
-     78,  78,  78,  78,  78,  78,  78,   0,  78,  78,  78,  78,  78,   0,   0,  78,
-     78,  78,   0,   0,   0,   0,   0,   0,  78,  78,  78,  78,  78,  78,   0,   0,
-     41,  41,  41,  41,  41,  41,  41,   0,  62,  62,  62,  62,  62,  62,  62,  62,
-     62,  62,  62,  62,   0,   0,   0,   0,  62,  62,  62,  62,  62,   0,   0,   0,
-     67,  67,  67,  67,  67,  67,  67,  67,  93,  93,  93,  93,  93,  93,  93,  93,
-     93,  93,  93,  93,   0,   0,   0,   0,   0,   0,   0,   0,  93,  93,  93,  93,
-     68,  68,  68,  68,  68,  68,  68,  68,   0,   0,   0,  68,  68,  68,  68,  68,
-     68,  68,   0,   0,   0,  68,  68,  68,  69,  69,  69,  69,  69,  69,  69,  69,
-      4,   0,   0,   0,   0,   0,   0,   0,  24,  24,  24,   0,   0,  24,  24,  24,
-     41,  41,  41,   1,  41,  41,  41,  41,  41,   1,  41,  41,  41,  41,  41,  41,
-     41,   1,   1,   1,   1,  41,   1,   1,   1,   1,   1,   1,  41,   1,   1,   1,
-     41,  41,   1,   0,   0,   0,   0,   0,   2,   2,   2,   2,   2,   2,   3,   3,
-      3,   3,   3,   4,   2,   2,   2,   2,   2,   2,   2,   2,   2,   3,   3,   3,
-      3,   3,   2,   2,   2,   2,   3,   3,   3,   3,   3,   2,   2,   2,   2,   2,
-      4,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   3,
-     41,  41,   0,  41,  41,  41,  41,  41,   3,   3,   3,   3,   3,   3,   0,   0,
-      0,   3,   0,   3,   0,   3,   0,   3,   3,   3,   3,   3,   3,   0,   3,   3,
-      3,   3,   3,   3,   0,   0,   3,   3,   3,   3,   3,   3,   0,   3,   3,   3,
-      0,   0,   3,   3,   3,   0,   3,   3,   3,   3,   3,   3,   3,   3,   3,   0,
-      1,   1,   1,   1,  41,  41,   1,   1,   1,   1,   1,   1,   1,   0,   1,   1,
-      1,   2,   0,   0,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   2,
-      1,   1,   1,   1,   1,   1,   1,   0,   2,   2,   2,   2,   2,   0,   0,   0,
-     41,   0,   0,   0,   0,   0,   0,   0,   1,   1,   1,   1,   1,   1,   3,   1,
-      1,   1,   2,   2,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   2,   1,
-      2,   1,   1,   1,   0,   0,   0,   0,   1,   1,   1,   0,   0,   0,   0,   0,
-     53,  53,  53,  53,  53,  53,  53,  53,   1,   1,   1,   1,   0,   0,   1,   1,
-      1,   1,   1,   1,   1,   1,   0,   0,  57,  57,  57,  57,  57,  57,  57,  57,
-     57,  57,  57,  57,  57,  57,  57,   0,  55,  55,  55,  55,   0,   0,   0,   0,
-      0,  55,  55,  55,  55,  55,  55,  55,  58,  58,  58,  58,  58,  58,  58,  58,
-      0,   0,   0,   0,   0,   0,   0,  58,  58,   0,   0,   0,   0,   0,   0,   0,
-     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,   0,  36,  36,  36,  36,  36,
-     36,  36,  36,  36,   0,   0,   0,   0,  36,  36,  36,  36,  36,  36,   0,   0,
-      1,   1,   1,   1,   0,   0,   0,   0,   1,   1,   1,   1,   1,  36,   1,  36,
-      1,  36,  36,  36,  36,  36,  36,  36,  36,  36,  41,  41,  41,  41,  25,  25,
-     36,  36,  36,  36,   1,   1,   1,   1,   0,  33,  33,  33,  33,  33,  33,  33,
-     33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,   0,
-      0,  41,  41,   1,   1,  33,  33,  33,   1,  34,  34,  34,  34,  34,  34,  34,
-     34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,   1,   1,  34,  34,  34,
-      0,   0,   0,   0,   0,  35,  35,  35,  35,  35,  35,  35,  35,  35,  35,  35,
-      0,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,   0,
-     35,  35,  35,   0,   0,   0,   0,   0,  25,  25,  25,  25,  25,  25,  25,   1,
-     34,  34,  34,  34,  34,  34,  34,   1,  37,  37,  37,  37,  37,  37,  37,  37,
-     37,  37,  37,  37,  37,   0,   0,   0,  37,  37,  37,  37,  37,  37,  37,   0,
-     83,  83,  83,  83,  83,  83,  83,  83,  70,  70,  70,  70,  70,  70,  70,  70,
-     70,  70,  70,  70,   0,   0,   0,   0,  84,  84,  84,  84,  84,  84,  84,  84,
-      1,   1,   2,   2,   2,   2,   2,   2,   1,   1,   1,   2,   2,   2,   2,   2,
-      0,   0,   2,   2,   2,   2,   2,   0,   0,   0,   0,   0,   0,   0,   0,   2,
-     59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,   0,   0,   0,   0,
-      1,   1,   0,   0,   0,   0,   0,   0,  65,  65,  65,  65,  65,  65,  65,  65,
-     71,  71,  71,  71,  71,  71,  71,  71,  71,  71,  71,  71,  71,  71,   0,   0,
-      0,   0,   0,   0,   0,   0,  71,  71,  71,  71,   0,   0,   0,   0,   0,   0,
-     72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,   1,  72,
-     73,  73,  73,  73,  73,  73,  73,  73,  73,  73,  73,  73,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,  73,  25,  25,  25,  25,  25,   0,   0,   0,
-     85,  85,  85,  85,  85,  85,  85,  85,  85,  85,  85,  85,  85,  85,   0,   1,
-     85,  85,   0,   0,   0,   0,  85,  85,  23,  23,  23,  23,  23,  23,  23,   0,
-     77,  77,  77,  77,  77,  77,  77,  77,  77,  77,  77,  77,  77,  77,  77,   0,
-     77,  77,  77,  77,  77,  77,   0,   0,  77,  77,   0,   0,  77,  77,  77,  77,
-     79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,   0,   0,   0,   0,   0,
-      0,   0,   0,  79,  79,  79,  79,  79,  86,  86,  86,  86,  86,  86,  86,  86,
-     86,  86,  86,  86,  86,  86,  86,   0,   0,  26,  26,  26,  26,  26,  26,   0,
-      2,   2,   2,   1,   2,   2,   2,   2,   2,   2,   2,   2,   2,   3,   2,   2,
-     86,  86,  86,  86,  86,  86,   0,   0,  86,  86,   0,   0,   0,   0,   0,   0,
-     25,  25,  25,  25,   0,   0,   0,   0,   0,   0,   0,  25,  25,  25,  25,  25,
-     36,  36,   0,   0,   0,   0,   0,   0,   2,   2,   2,   2,   2,   2,   2,   0,
-      0,   0,   0,   5,   5,   5,   5,   5,   0,   0,   0,   0,   0,   6,   6,   6,
-      6,   6,   6,   6,   6,   6,   6,   0,   6,   6,   6,   6,   6,   0,   6,   0,
-      6,   6,   0,   6,   6,   0,   6,   6,   7,   7,   0,   0,   0,   0,   0,   0,
-      7,   7,   7,   7,   7,   7,   1,   1,   0,   0,   7,   7,   7,   7,   7,   7,
-     41,  41,  41,  41,  41,  41,   4,   4,   1,   1,   1,   0,   1,   1,   1,   1,
-      7,   7,   7,   7,   7,   0,   0,   1,   0,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,  34,  34,  34,  34,  34,  34,  34,  34,   1,   1,
-      0,   0,  25,  25,  25,  25,  25,  25,   0,   0,  25,  25,  25,   0,   0,   0,
-      0,   1,   1,   1,   1,   1,   0,   0,  48,  48,  48,  48,  48,  48,  48,  48,
-     48,  48,  48,  48,   0,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,   0,
-     48,  48,  48,   0,  48,  48,   0,  48,  48,  48,  48,  48,  48,  48,   0,   0,
-     48,  48,  48,   0,   0,   0,   0,   0,   1,   1,   1,   0,   0,   0,   0,   1,
-      1,   1,   1,   1,   0,   0,   0,   1,   3,   0,   0,   0,   0,   0,   0,   0,
-      1,   1,   1,   1,   1,  41,   0,   0,  74,  74,  74,  74,  74,  74,  74,  74,
-     74,  74,  74,  74,  74,   0,   0,   0,  75,  75,  75,  75,  75,  75,  75,  75,
-     75,   0,   0,   0,   0,   0,   0,   0,  41,   1,   1,   1,   1,   1,   1,   1,
-     38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,  38,  38,  38,  39,  39,  39,  39,  39,  39,  39,  39,
-     39,  39,  39,   0,   0,   0,   0,   0, 120, 120, 120, 120, 120, 120, 120, 120,
-    120, 120, 120,   0,   0,   0,   0,   0,  49,  49,  49,  49,  49,  49,  49,  49,
-     49,  49,  49,  49,  49,  49,   0,  49,  60,  60,  60,  60,  60,  60,  60,  60,
-     60,  60,  60,  60,   0,   0,   0,   0,  60,  60,  60,  60,  60,  60,   0,   0,
-     40,  40,  40,  40,  40,  40,  40,  40,  50,  50,  50,  50,  50,  50,  50,  50,
-     51,  51,  51,  51,  51,  51,  51,  51,  51,  51,  51,  51,  51,  51,   0,   0,
-     51,  51,   0,   0,   0,   0,   0,   0, 136, 136, 136, 136, 136, 136, 136, 136,
-    136, 136, 136, 136,   0,   0,   0,   0, 106, 106, 106, 106, 106, 106, 106, 106,
-    103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0, 103, 110, 110, 110, 110, 110, 110, 110, 110,
-    110, 110, 110, 110, 110, 110, 110,   0, 110, 110, 110, 110, 110, 110,   0,   0,
-     52,  52,  52,  52,  52,  52,   0,   0,  52,   0,  52,  52,  52,  52,  52,  52,
-     52,  52,  52,  52,  52,  52,  52,  52,  52,  52,  52,  52,  52,  52,   0,  52,
-     52,   0,   0,   0,  52,   0,   0,  52,  87,  87,  87,  87,  87,  87,  87,  87,
-     87,  87,  87,  87,  87,  87,   0,  87, 118, 118, 118, 118, 118, 118, 118, 118,
-    117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117,   0,
-      0,   0,   0,   0,   0,   0,   0, 117, 128, 128, 128, 128, 128, 128, 128, 128,
-    128, 128, 128,   0, 128, 128,   0,   0,   0,   0,   0, 128, 128, 128, 128, 128,
-     64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,   0,   0,   0,  64,
-     76,  76,  76,  76,  76,  76,  76,  76,  76,  76,   0,   0,   0,   0,   0,  76,
-     98,  98,  98,  98,  98,  98,  98,  98,  97,  97,  97,  97,  97,  97,  97,  97,
-      0,   0,   0,   0,  97,  97,  97,  97,   0,   0,  97,  97,  97,  97,  97,  97,
-     61,  61,  61,  61,   0,  61,  61,   0,   0,   0,   0,   0,  61,  61,  61,  61,
-     61,  61,  61,  61,   0,  61,  61,  61,   0,  61,  61,  61,  61,  61,  61,  61,
-     61,  61,  61,  61,  61,  61,  61,  61,  61,  61,  61,  61,  61,  61,   0,   0,
-     61,  61,  61,   0,   0,   0,   0,  61,  61,   0,   0,   0,   0,   0,   0,   0,
-     88,  88,  88,  88,  88,  88,  88,  88, 116, 116, 116, 116, 116, 116, 116, 116,
-    112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112,   0,
-      0,   0,   0, 112, 112, 112, 112, 112,  80,  80,  80,  80,  80,  80,  80,  80,
-     80,  80,  80,  80,  80,  80,   0,   0,   0,  80,  80,  80,  80,  80,  80,  80,
-     89,  89,  89,  89,  89,  89,  89,  89,  89,  89,  89,  89,  89,  89,   0,   0,
-     90,  90,  90,  90,  90,  90,  90,  90,  90,  90,  90,   0,   0,   0,   0,   0,
-    121, 121, 121, 121, 121, 121, 121, 121, 121, 121,   0,   0,   0,   0,   0,   0,
-      0, 121, 121, 121, 121,   0,   0,   0,   0, 121, 121, 121, 121, 121, 121, 121,
-     91,  91,  91,  91,  91,  91,  91,  91,  91,   0,   0,   0,   0,   0,   0,   0,
-    130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130,   0,   0,   0,   0,   0,
-      0,   0, 130, 130, 130, 130, 130, 130, 146, 146, 146, 146, 146, 146, 146, 146,
-    146, 146,   0,   0,   0,   0,   0,   0,   7,   7,   7,   7,   7,   7,   7,   0,
-    148, 148, 148, 148, 148, 148, 148, 148, 147, 147, 147, 147, 147, 147, 147, 147,
-    147, 147,   0,   0,   0,   0,   0,   0, 149, 149, 149, 149, 149, 149, 149, 149,
-    149, 149, 149, 149, 149, 149, 149,   0,  94,  94,  94,  94,  94,  94,  94,  94,
-     94,  94,  94,  94,  94,  94,   0,   0,   0,   0,  94,  94,  94,  94,  94,  94,
-      0,   0,   0,   0,   0,   0,   0,  94,  92,  92,  92,  92,  92,  92,  92,  92,
-     92,  92,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  92,   0,   0,
-    101, 101, 101, 101, 101, 101, 101, 101, 101,   0,   0,   0,   0,   0,   0,   0,
-    101, 101,   0,   0,   0,   0,   0,   0,  96,  96,  96,  96,  96,  96,  96,  96,
-     96,  96,  96,  96,  96,   0,  96,  96,  96,  96,  96,  96,  96,  96,  96,   0,
-    111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111,   0,
-    100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100,   0,   0,
-      0,  19,  19,  19,  19,  19,  19,  19,  19,  19,  19,  19,  19,   0,   0,   0,
-    109, 109, 109, 109, 109, 109, 109, 109, 109, 109,   0, 109, 109, 109, 109, 109,
-    109, 109, 109, 109, 109, 109, 109,   0, 129, 129, 129, 129, 129, 129, 129,   0,
-    129,   0, 129, 129, 129, 129,   0, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-    129, 129, 129, 129, 129, 129,   0, 129, 129, 129,   0,   0,   0,   0,   0,   0,
-    123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123,   0,   0,   0,   0,   0,
-    123, 123,   0,   0,   0,   0,   0,   0, 107, 107, 107, 107,   0, 107, 107, 107,
-    107, 107, 107, 107, 107,   0,   0, 107, 107,   0,   0, 107, 107, 107, 107, 107,
-    107, 107, 107, 107, 107, 107, 107, 107, 107,   0, 107, 107, 107, 107, 107, 107,
-    107,   0, 107, 107,   0, 107, 107, 107, 107, 107,   0,  41, 107, 107, 107, 107,
-    107,   0,   0, 107, 107, 107,   0,   0, 107,   0,   0,   0,   0,   0,   0, 107,
-      0,   0,   0,   0,   0, 107, 107, 107, 107, 107, 107, 107,   0,   0, 107, 107,
-    107, 107, 107, 107, 107,   0,   0,   0, 135, 135, 135, 135, 135, 135, 135, 135,
-    135, 135,   0, 135,   0, 135, 135, 135, 124, 124, 124, 124, 124, 124, 124, 124,
-    124, 124,   0,   0,   0,   0,   0,   0, 122, 122, 122, 122, 122, 122, 122, 122,
-    122, 122, 122, 122, 122, 122,   0,   0, 114, 114, 114, 114, 114, 114, 114, 114,
-    114, 114, 114, 114, 114,   0,   0,   0, 114, 114,   0,   0,   0,   0,   0,   0,
-     32,  32,  32,  32,  32,   0,   0,   0, 102, 102, 102, 102, 102, 102, 102, 102,
-    102,   0,   0,   0,   0,   0,   0,   0, 102, 102,   0,   0,   0,   0,   0,   0,
-    126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126,   0,   0, 126, 126, 126,
-    126, 126, 126, 126,   0,   0,   0,   0, 142, 142, 142, 142, 142, 142, 142, 142,
-    142, 142, 142, 142,   0,   0,   0,   0, 125, 125, 125, 125, 125, 125, 125, 125,
-    125, 125, 125,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 125,
-    150, 150, 150, 150, 150, 150, 150, 150,   0,   0, 150, 150, 150, 150, 150, 150,
-    150, 150, 150, 150, 150,   0,   0,   0, 141, 141, 141, 141, 141, 141, 141, 141,
-    140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,   0,   0,   0,   0,   0,
-    119, 119, 119, 119, 119, 119, 119, 119, 119,   0,   0,   0,   0,   0,   0,   0,
-    133, 133, 133, 133, 133, 133, 133, 133, 133,   0, 133, 133, 133, 133, 133, 133,
-    133, 133, 133, 133, 133, 133, 133,   0, 133, 133, 133, 133, 133, 133,   0,   0,
-    133, 133, 133, 133, 133,   0,   0,   0, 134, 134, 134, 134, 134, 134, 134, 134,
-      0,   0, 134, 134, 134, 134, 134, 134,   0, 134, 134, 134, 134, 134, 134, 134,
-    134, 134, 134, 134, 134, 134, 134,   0, 138, 138, 138, 138, 138, 138, 138,   0,
-    138, 138,   0, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138,
-      0,   0, 138,   0, 138, 138,   0, 138, 138, 138,   0,   0,   0,   0,   0,   0,
-    143, 143, 143, 143, 143, 143,   0, 143, 143,   0, 143, 143, 143, 143, 143, 143,
-    143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143,   0,
-    143, 143,   0, 143, 143, 143, 143, 143, 143,   0,   0,   0,   0,   0,   0,   0,
-    143, 143,   0,   0,   0,   0,   0,   0, 144, 144, 144, 144, 144, 144, 144, 144,
-    144,   0,   0,   0,   0,   0,   0,   0,  15,  15,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,  15,  63,  63,  63,  63,  63,  63,  63,  63,
-     63,  63,   0,   0,   0,   0,   0,   0,  63,  63,  63,  63,  63,  63,  63,   0,
-     63,  63,  63,  63,  63,   0,   0,   0,  63,  63,  63,  63,   0,   0,   0,   0,
-     81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,   0,
-     81,   0,   0,   0,   0,   0,   0,   0, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127,   0,  84,   0,   0,   0,   0,   0,   0,   0,
-    115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115,   0,
-    115, 115,   0,   0,   0,   0, 115, 115, 104, 104, 104, 104, 104, 104, 104, 104,
-    104, 104, 104, 104, 104, 104,   0,   0, 108, 108, 108, 108, 108, 108, 108, 108,
-    108, 108, 108, 108, 108, 108,   0,   0, 108, 108,   0, 108, 108, 108, 108, 108,
-      0,   0,   0,   0,   0, 108, 108, 108, 145, 145, 145, 145, 145, 145, 145, 145,
-    145, 145, 145,   0,   0,   0,   0,   0,  99,  99,  99,  99,  99,  99,  99,  99,
-     99,  99,  99,   0,   0,   0,   0,  99,   0,   0,   0,   0,   0,   0,   0,  99,
-    137, 139,   1,   1,   0,   0,   0,   0, 137, 137, 137, 137, 137, 137, 137, 137,
-    137, 137, 137,   0,   0,   0,   0,   0,  34,  33,  33,  33,  33,  33,  33,  33,
-     33,  33,  33,   0,   0,   0,   0,   0,   0,   0,   0,   0,  34,  34,  34,  34,
-    139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139,   0,   0,   0,   0,
-    105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105,   0,   0,   0,   0,   0,
-    105, 105, 105, 105, 105,   0,   0,   0, 105,   0,   0,   0,   0,   0,   0,   0,
-    105, 105,   0,   0, 105, 105, 105, 105,   1,   1,   1,   1,   1,   1,   1,  41,
-     41,  41,   1,   1,   1,   1,   1,   1,   1,   1,   1,  41,  41,  41,  41,  41,
-     41,  41,  41,   1,   1,  41,  41,  41,  41,  41,  41,  41,   1,   1,   1,   1,
-      1,   1,  41,  41,  41,  41,   1,   1,   1,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   1,   0,   0,   1,   1,   0,   0,   1,   1,   1,   1,   0,   1,   1,
-      1,   1,   0,   1,   0,   1,   1,   1,   1,   1,   1,   1,   0,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   0,   1,   1,   1,   1,   0,   0,   1,   1,   1,
-      1,   1,   0,   1,   1,   1,   1,   0,   1,   1,   1,   1,   1,   0,   1,   0,
-      0,   0,   1,   1,   1,   1,   1,   1,   1,   0,   1,   1,   1,   1,   1,   1,
-    131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131,   0,   0,   0,   0,
-      0,   0,   0, 131, 131, 131, 131, 131,   0, 131, 131, 131, 131, 131, 131, 131,
-     57,   0,   0,  57,  57,  57,  57,  57,  57,  57,   0,  57,  57,   0,  57,  57,
-     57,  57,  57,   0,   0,   0,   0,   0, 151, 151, 151, 151, 151, 151, 151, 151,
-    151, 151, 151, 151, 151,   0,   0,   0, 151, 151, 151, 151, 151, 151,   0,   0,
-    151, 151,   0,   0,   0,   0, 151, 151, 152, 152, 152, 152, 152, 152, 152, 152,
-    152, 152,   0,   0,   0,   0,   0, 152, 113, 113, 113, 113, 113, 113, 113, 113,
-    113, 113, 113, 113, 113,   0,   0, 113, 113, 113, 113, 113, 113, 113, 113,   0,
-    132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132,   0,   0,   0,   0,
-    132, 132,   0,   0,   0,   0, 132, 132,   1,   1,   1,   1,   1,   0,   0,   0,
-      7,   7,   7,   7,   0,   7,   7,   7,   0,   7,   7,   0,   7,   0,   0,   7,
-      0,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   0,   7,   7,   7,   7,
-      0,   7,   0,   7,   0,   0,   0,   0,   0,   0,   7,   0,   0,   0,   0,   7,
-      0,   7,   0,   7,   0,   7,   7,   7,   0,   7,   0,   7,   0,   7,   0,   7,
-      0,   7,   7,   7,   7,   0,   7,   0,   7,   7,   0,   7,   7,   7,   7,   7,
-      7,   7,   7,   7,   0,   0,   0,   0,   0,   7,   7,   7,   0,   7,   7,   7,
-      0,   0,   0,   0,   0,   0,   1,   1,  33,   1,   1,   0,   0,   0,   0,   0,
-      1,   1,   1,   0,   0,   0,   1,   1,  36,  36,  36,  36,  36,  36,  36,   0,
-     36,  36,  36,  36,  36,   0,   0,   0,  36,   0,   0,   0,   0,   0,   0,   0,
-      0,   1,   0,   0,   0,   0,   0,   0,
-};
+    return (v >> offset) & 0x1;
+}
 
-/* Script: 13928 bytes. */
-
-RE_UINT32 re_get_script(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-
-    f = ch >> 11;
-    code = ch ^ (f << 11);
-    pos = (RE_UINT32)re_script_stage_1[f] << 4;
-    f = code >> 7;
-    code ^= f << 7;
-    pos = (RE_UINT32)re_script_stage_2[pos + f] << 4;
-    f = code >> 3;
-    code ^= f << 3;
-    pos = (RE_UINT32)re_script_stage_3[pos + f] << 3;
-    value = re_script_stage_4[pos + code];
-
-    return value;
+/* Any. */
+RE_UINT32 re_get_any(RE_UINT32 codepoint) {
+    return 1;
 }
 
-/* Script_Extensions. */
+/* ASCII_Hex_Digit. */
+RE_UINT32 re_get_ascii_hex_digit(RE_UINT32 codepoint) {
+    if (0x30 <= codepoint && codepoint <= 0x39)
+        return 1;
+    if (0x41 <= codepoint && codepoint <= 0x46)
+        return 1;
+    if (0x61 <= codepoint && codepoint <= 0x66)
+        return 1;
+
+    return 0;
+}
 
-static RE_UINT8 re_script_extensions_stage_1[] = {
-     0,  1,  2,  3,  4,  5,  6,  7,  7,  8,  7,  7,  7,  7,  7,  7,
-     7,  7,  7,  9, 10, 11, 12, 12, 12, 12, 13, 14, 14, 14, 14, 15,
-    16, 17, 18, 19, 20, 14, 21, 14, 22, 14, 14, 14, 14, 23, 24, 24,
-    25, 26, 14, 14, 14, 14, 27, 28, 14, 14, 29, 30, 31, 32, 33, 34,
-     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
-     7,  7,  7,  7, 35,  7, 36, 37,  7, 38,  7,  7,  7, 39, 14, 40,
-    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-    41, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-};
-
-static RE_UINT8 re_script_extensions_stage_2[] = {
-      0,   1,   2,   2,   2,   3,   4,   5,   6,   7,   8,   9,  10,  11,  12,  13,
-     14,  15,  16,  17,  18,  19,  20,  21,  22,  23,  24,  25,  26,  27,  28,  29,
-     30,  31,  32,  32,  33,  34,  35,  36,  37,  37,  37,  37,  37,  38,  39,  40,
-     41,  42,  43,  44,  45,  46,  47,  48,  49,  50,  51,  52,   2,   2,  53,  54,
-     55,  56,  57,  58,  59,  59,  59,  59,  60,  59,  59,  59,  59,  59,  59,  59,
-     61,  61,  59,  59,  59,  59,  62,  63,  64,  65,  66,  67,  68,  69,  70,  71,
-     72,  73,  74,  75,  76,  77,  78,  79,  70,  70,  70,  70,  70,  70,  70,  70,
-     70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  70,
-     70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  80,  70,  70,  70,  70,
-     70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  81,
-     82,  82,  82,  82,  82,  82,  82,  82,  82,  83,  84,  84,  85,  86,  87,  88,
-     89,  90,  91,  92,  93,  94,  95,  96,  32,  32,  32,  32,  32,  32,  32,  32,
-     32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,
-     32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  97,
-     98,  98,  98,  98,  98,  98,  98,  98,  98,  98,  98,  98,  98,  98,  98,  98,
-     98,  98,  70,  70,  99, 100, 101, 102, 103, 103, 104, 105, 106, 107, 108, 109,
-    110, 111, 112, 113,  98, 114, 115, 116, 117, 118, 119,  98, 120, 120, 121,  98,
-    122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132,  98, 133,  98, 134, 135,
-    136, 137, 138, 139, 140, 141, 142,  98, 143, 144,  98, 145, 146, 147, 148,  98,
-    149, 150,  98, 151, 152, 153,  98,  98, 154, 155, 156, 157,  98, 158,  98, 159,
-    160, 160, 160, 160, 160, 160, 160, 161, 162, 160, 163,  98,  98,  98,  98,  98,
-    164, 164, 164, 164, 164, 164, 164, 164, 165,  98,  98,  98,  98,  98,  98,  98,
-     98,  98,  98,  98,  98,  98,  98,  98, 166, 166, 166, 166, 167,  98,  98,  98,
-    168, 168, 168, 168, 169, 170, 171, 172,  98,  98,  98,  98, 173, 174, 175, 176,
-    177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177,
-    177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 178,
-    177, 177, 177, 177, 177, 179,  98,  98,  98,  98,  98,  98,  98,  98,  98,  98,
-    180, 181, 182, 183, 183, 184,  98,  98,  98,  98,  98,  98,  98,  98,  98,  98,
-     98,  98,  98,  98,  98,  98,  98,  98, 185, 186,  98,  98,  98,  98,  98,  98,
-     59, 187, 188, 189, 190, 191, 192,  98, 193, 194, 195,  59,  59, 196,  59, 197,
-    198, 198, 198, 198, 198, 199,  98,  98,  98,  98,  98,  98,  98,  98,  98,  98,
-    200,  98, 201,  98,  98, 202,  98,  98,  98,  98,  98,  98,  98,  98,  98,  98,
-    203, 204, 205,  98,  98,  98,  98,  98, 206, 207, 208,  98, 209, 210,  98,  98,
-    211, 212, 213, 214, 215,  98,  59,  59,  59,  59,  59,  59,  59, 216, 217, 218,
-    219, 220, 221, 222, 223, 224,  98,  98,  98,  98,  98,  98,  98,  98,  98,  98,
-     70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  70, 225,  70,  70,
-     70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  70, 226,  70,
-    227,  70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  70,
-     70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  70, 228,  70,  70,
-     70,  70,  70,  70,  70,  70,  70, 229,  98,  98,  98,  98,  98,  98,  98,  98,
-     70,  70,  70,  70, 230,  98,  98,  98,  98,  98,  98,  98,  98,  98,  98,  98,
-    231,  98, 232, 233,  98,  98,  98,  98,  98,  98,  98,  98,  98,  98,  98,  98,
-};
-
-static RE_UINT16 re_script_extensions_stage_3[] = {
-      0,   0,   0,   0,   0,   0,   0,   0,   1,   2,   2,   3,   1,   2,   2,   3,
-      0,   0,   0,   0,   0,   4,   0,   4,   2,   2,   5,   2,   2,   2,   5,   2,
-      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
-      2,   2,   2,   2,   2,   2,   2,   6,   0,   0,   0,   0,   7,   8,   0,   0,
-      9,   9,   9,   9,   9,   9,   9,   9,  10,   9,   9,   9,  11,   2,  12,  13,
-     14,  15,  16,  16,  17,  16,  16,  16,  16,  16,  16,  16,  18,  19,  16,  16,
-     20,  20,  20,  20,  20,  20,  20,  20,  20,  20,  20,  20,  20,  20,  20,  20,
-     21,  20,  20,  20,  20,  20,  20,  20,  20,  20,  20,  20,  20,  20,  20,  20,
-     20,  20,  20,  20,  20,  20,  22,  23,  23,  23,  24,  22,  23,  23,  23,  23,
-     23,  25,  26,  27,  27,  27,  27,  27,  27,  28,  27,  27,  27,  29,  30,  28,
-     31,  32,  33,  34,  33,  33,  33,  33,  35,  36,  37,  33,  38,  39,  40,  33,
-     33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  41,  31,  33,  33,  33,  33,
-     42,  43,  42,  42,  42,  42,  42,  42,  42,  44,  33,  33,  33,  33,  33,  33,
-     45,  45,  45,  45,  45,  45,  46,  28,  47,  47,  47,  47,  47,  47,  47,  48,
-     49,  49,  49,  49,  49,  50,  49,  51,  52,  52,  52,  53,  42,  54,  28,  28,
-     28,  28,  28,  28,  33,  33,  55,  56,  28,  28,  57,  33,  58,  33,  33,  33,
-     59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  60,  59,  61,  62,  59,  59,
-     63,  64,  65,  66,  66,  67,  68,  69,  64,  70,  71,  72,  73,  74,  66,  75,
-     76,  77,  78,  79,  79,  80,  81,  82,  77,  83,  84,  85,  86,  87,  88,  28,
-     89,  90,  91,  92,  92,  93,  94,  95,  90,  96,  97,  28,  98,  99, 100, 101,
-    102, 103, 104, 105, 105, 106, 107, 108, 103, 109, 110, 111, 112, 105, 105,  28,
-    113, 114, 115, 116, 117, 114, 118, 119, 114, 115, 120,  28, 121, 122, 123, 124,
-    125, 126, 127, 125, 125, 127, 125, 128, 126, 129, 130, 131, 132, 125, 133, 125,
-    134, 135, 136, 134, 134, 136, 137, 138, 135, 139, 140, 141, 142, 143, 144,  28,
-    145, 146, 147, 148, 148, 148, 148, 148, 146, 147, 149, 148, 150, 148, 148, 148,
-    151, 152, 153, 154, 152, 152, 155, 156, 153, 157, 158, 152, 159, 152, 160,  28,
-    161, 162, 162, 162, 162, 162, 162, 163, 162, 162, 162, 164,  28,  28,  28,  28,
-    165, 166, 167, 167, 168, 167, 167, 169, 170, 169, 167, 171,  28,  28,  28,  28,
-    172, 172, 172, 172, 172, 172, 172, 172, 172, 173, 172, 172, 172, 174, 173, 172,
-    172, 172, 172, 173, 172, 172, 172, 175, 172, 175, 176, 177,  28,  28,  28,  28,
-    178, 178, 178, 178, 178, 178, 178, 178, 179, 180, 178, 178, 178, 178, 178, 178,
-    178, 178, 178, 178, 181, 181, 181, 181, 182, 183, 181, 181, 181, 181, 181, 184,
-    185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185,
-    186, 186, 186, 186, 186, 186, 186, 186, 186, 187, 188, 187, 186, 186, 186, 186,
-    186, 187, 186, 186, 186, 186, 187, 188, 187, 186, 188, 186, 186, 186, 186, 186,
-    186, 186, 187, 186, 186, 186, 186, 186, 186, 186, 186, 189, 186, 186, 186, 190,
-    186, 186, 186, 191, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 193, 193,
-    194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194,
-    195, 195, 195, 196, 197, 197, 197, 197, 197, 197, 197, 197, 197, 198, 197, 199,
-    200, 201, 202,  28, 203, 203, 204,  28, 205, 205, 206,  28, 207, 208, 209,  28,
-    210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 211, 210, 212, 210, 212,
-    213, 214, 215, 216, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 217,
-    215, 215, 215, 215, 215, 218, 194, 194, 194, 194, 194, 194, 194, 194, 219,  28,
-    220, 220, 220, 221, 220, 222, 220, 222, 223, 220, 224, 224, 224, 225, 226,  28,
-    227, 227, 227, 227, 227, 228, 227, 227, 227, 229, 227, 230, 210, 210, 210, 210,
-    231, 231, 231, 232, 233, 233, 233, 233, 233, 233, 233, 234, 233, 233, 233, 235,
-    233, 236, 233, 236, 233, 237,   9, 238,  28,  28,  28,  28,  28,  28,  28,  28,
-    239, 239, 239, 239, 239, 239, 239, 239, 239, 240, 239, 239, 239, 239, 239, 241,
-    242, 242, 242, 242, 242, 242, 242, 242, 243, 243, 243, 243, 243, 243, 244, 245,
-    246, 246, 246, 246, 246, 246, 246, 247, 246, 248, 249, 249, 249, 249, 249, 249,
-     20, 250, 181, 181, 181, 181, 181, 251, 242,  28, 252, 253, 254, 255, 256, 257,
-      2,   2,   2,   2, 258, 259,   2,   2,   2,   2,   2, 260, 261, 262,   2, 263,
-      2,   2,   2,   2,   2,   2,   2, 264, 265,   9,   9,   9,   9,   9,   9, 266,
-     16,  16, 267, 267,  16,  16,  16,  16, 267, 267,  16, 268,  16,  16,  16, 267,
-     16,  16,  16,  16,  16,  16, 269,  16, 269,  16, 270, 271,  16,  16, 272, 273,
-      0, 274,   0,   0,   0, 275,   0,   0,   0,   0,   0,   0, 276,   0, 277, 278,
-      0, 279,   2, 280,   0,   0,   0,   0,  28,  28,   9,   9,   9,   9, 281,  28,
-      0,   0,   0,   0, 282, 283,   4,   0,   0, 284,   0,   0,   2,   2,   2,   2,
-      2, 285,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0, 279,  28,  28,  28,   0, 286,  28,  28,   0,   0,   0,   0,
-    287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 288,   0,
-      0,   0, 289,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-    290, 290, 290, 290, 290, 291, 290, 290, 290, 290, 290, 291,   2,   2,   2,   2,
-     19,  19,  19,  19,  19,  19,  19,  19,  19,  19,  19,  19,  19,  19, 292, 293,
-    181, 181, 181, 181, 182, 183, 294, 294, 294, 294, 294, 294, 294, 295, 296, 295,
-    186, 186, 188,  28, 188, 188, 188, 188, 188, 188, 188, 188,  20,  20,  20,  20,
-      0,   0,   0,   0,   0,   0,   0,   0, 297,   0,  28,  28,  28,  28,  28,  28,
-    298, 298, 298, 299, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 300,  28,
-    298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298,
-    298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 301,  28,  28,  28,   0, 302,
-    303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 312, 312, 312, 312, 312, 312,
-    312, 312, 313, 314, 315, 316, 316, 316, 316, 316, 316, 316, 316, 316, 316, 317,
-    318, 319, 319, 319, 319, 319, 320, 185, 185, 185, 185, 185, 185, 185, 185, 185,
-    185, 321, 298, 298, 319, 319, 319, 322, 298, 298, 298, 298, 300,  28, 316, 316,
-    185, 185, 185, 321, 298, 298, 298, 298, 298,   0,   0,   0, 185, 185, 185, 323,
-    298, 298, 298, 298, 298, 298, 324,   0, 298, 325, 316, 316, 316, 316, 316, 326,
-    316, 316, 316, 316, 316, 316, 316, 316, 316, 316, 316, 298, 298, 298, 324, 327,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 298, 298, 298, 328,
-    298, 298, 298, 298, 298, 298, 301,  28,   0,   0,   0,   0,   0,   0,   0,   0,
-    298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298,  28,  28,
-    329, 329, 329, 329, 329, 329, 329, 329, 329, 329, 329, 329, 329, 329, 329, 329,
-    329, 330, 329, 329, 329, 329, 329, 329, 331,  28, 332, 332, 332, 332, 332, 332,
-    333, 333, 333, 333, 333, 333, 333, 333, 333, 333, 333, 333, 333, 333, 333, 333,
-    333, 333, 333, 333, 333, 334,  28,  28,  20,  20,  20,  20,  20, 335,  20,  20,
-     20,  20,  20,  20, 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, 336,  28,
-      0,   0,   0,   0, 337,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
-      2, 338,   2,   2,   2,   2,   2,   2, 339,  28,  28,  28,  28,  28, 340,   2,
-    341, 341, 341, 341, 341, 342, 343, 344, 345, 345, 345, 345, 345, 345, 345,  28,
-    346, 346, 346, 346, 346, 346, 346, 346, 347, 348, 346, 349,  59,  59, 350,  59,
-    351, 351, 351, 351, 351, 352, 353, 353, 353, 353, 354, 355, 185, 185, 185, 356,
-    357, 357, 357, 357, 357, 357, 357, 357, 357, 358, 357, 359, 178, 178, 178, 360,
-    361, 361, 361, 361, 361, 361, 362,  28, 361, 363, 361, 364, 178, 178, 178, 178,
-    365, 365, 365, 365, 365, 365, 365, 365, 366,  28,  28, 367, 368, 368, 369,  28,
-    370, 370, 370,  28, 188, 188,   2,   2,   2,   2,   2, 371, 372,  28, 192, 192,
-    192, 192, 192, 192, 192, 192, 192, 192, 368, 368, 368, 368, 368, 373, 368, 374,
-    185, 185, 185, 185, 375,  28, 185, 185, 321, 376, 185, 185, 185, 185, 185, 375,
-     28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,
-    298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 301, 298, 298,
-    298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 377,  28,  28,  28,  28,
-    378,  28, 379, 380,  27,  27, 381, 382, 383,  27,  33,  33,  33,  33,  33,  33,
-     33,  33,  33,  33,  33,  33,  33,  33, 384,  28,  57,  33,  33,  33,  33,  33,
-     33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,
-     33,  33,  33,  33,  33,  33,  33, 385,  28,  28,  33,  33,  33,  33,  33,  33,
-     33,  33, 386,  33,  33,  33,  33,  33,  33,  28,  28,  28,  28,  28, 387, 388,
-      9,   9,   0, 389,   9, 390,   0,   0, 391,   0, 392,   0, 279, 302,  55,  33,
-     33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33, 393,
-    394,   0,   0,   0,   1,   2,   2,   3,   1,   2,   2,   3, 395, 316, 315, 316,
-    316, 316, 316, 396, 185, 185, 185, 321, 397, 397, 397, 398, 279, 279,  28, 399,
-    400, 401, 400, 400, 402, 400, 400, 403, 400, 404, 400, 404,  28,  28,  28,  28,
-    400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 405,
-    406, 407, 407, 407, 407, 407, 408, 409,  16,  16,  16,  16,  16,  16,  16,  16,
-     16, 273,   0, 302, 410,  28,  28,  28,  28,  28,   0,   0,   0,   0,   0, 411,
-    412, 412, 412, 413, 414, 414, 414, 414, 414, 414, 415,  28, 416, 416, 416, 417,
-    418, 418, 418, 418, 419, 420, 421, 421, 421, 422, 423, 423, 423, 423, 423, 424,
-    425, 425, 425, 426, 427, 427, 427, 427, 428, 427, 429,  28,  28,  28,  28,  28,
-    430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 431, 431, 431, 431, 431, 431,
-    432, 432, 432, 433, 432, 434, 435, 435, 435, 435, 436, 435, 435, 435, 435, 436,
-    437, 437, 437, 437, 437,  28, 438, 438, 438, 438, 438, 438, 439, 440,  28,  28,
-    441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441,
-    441, 441, 441, 441, 441, 441, 442,  28, 441, 441, 443,  28, 441,  28,  28,  28,
-    444, 445, 446, 446, 446, 446, 447, 448, 449, 449, 450, 449, 451, 451, 451, 451,
-    452, 452, 452, 453, 454, 452,  28,  28,  28,  28,  28,  28, 455, 455, 456, 457,
-    458, 458, 458, 459, 460, 460, 460, 461,  28,  28,  28,  28,  28,  28,  28,  28,
-    462, 462, 462, 462, 463, 463, 463, 464, 463, 463, 465, 463, 463, 463, 463, 463,
-    466, 467, 468, 469, 470, 470, 471, 472, 470, 473, 470, 473, 474, 474, 474, 474,
-    475, 475, 475, 475,  28,  28,  28,  28, 476, 476, 476, 476, 477, 478, 477,  28,
-    479, 479, 479, 479, 479, 479, 480, 481, 482, 482, 483, 482, 484, 484, 485, 484,
-    486, 486, 487, 488,  28, 489,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,
-    490, 490, 490, 490, 490, 490, 490, 490, 490, 491,  28,  28,  28,  28,  28,  28,
-    492, 492, 492, 492, 492, 492, 493,  28, 492, 492, 492, 492, 492, 492, 493, 494,
-    495, 495, 495, 495, 495,  28, 495, 496,  28,  28,  28,  28,  28,  28,  28,  28,
-     28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  33,  33,  33, 497,
-    498, 498, 498, 498, 498,  28, 499, 499, 499, 499, 499, 500,  28,  28,  28,  28,
-     28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28, 501, 501, 502,  28,
-    503, 503, 503, 503, 503, 503, 503, 503, 503, 504, 505, 503, 503, 503,  28, 506,
-    507, 507, 507, 507, 507, 507, 507, 507, 508, 509, 510, 510, 510, 511, 510, 512,
-    513, 513, 513, 513, 513, 513, 514, 513, 515,  28, 516, 516, 516, 516, 517,  28,
-    518, 518, 518, 518, 518, 518, 518, 518, 518, 519, 518, 518, 520, 152, 521,  28,
-    522, 522, 523, 522, 522, 522, 522, 524,  28,  28,  28,  28,  28,  28,  28,  28,
-    525, 526, 527, 528, 527, 529, 530, 530, 530, 530, 530, 530, 530, 531, 530, 532,
-    533, 534, 535, 536, 536, 537, 538, 539, 534, 540, 541, 542, 543, 544, 544,  28,
-    545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 546,  28,  28,  28,  28,
-    547, 547, 547, 547, 547, 547, 547, 547, 547,  28, 547, 548,  28,  28,  28,  28,
-    549, 549, 549, 549, 549, 549, 550, 549, 549, 549, 549, 550,  28,  28,  28,  28,
-    551, 551, 551, 551, 551, 551, 551, 551, 552,  28, 551, 553, 215, 554,  28,  28,
-    555, 555, 555, 555, 555, 555, 555, 556, 555, 557,  28,  28,  28,  28,  28,  28,
-    558, 558, 558, 559, 558, 560, 558, 558,  28,  28,  28,  28,  28,  28,  28,  28,
-    561, 561, 561, 561, 561, 561, 561, 562,  28,  28,  28,  28,  28,  28,  28,  28,
-     28,  28,  28,  28, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 564, 565,
-     28,  28,  28,  28, 566, 567, 566, 566, 566, 566, 566, 567, 568,  28,  28,  28,
-    569, 569, 569, 569, 569, 569, 569, 569, 569,  28, 570, 570, 570, 570, 570, 570,
-    570, 570, 570, 570, 571,  28,  28,  28, 572, 572, 572, 572, 572, 572, 572, 573,
-    574, 575, 574, 574, 574, 574, 576, 574, 577,  28, 574, 574, 574, 578, 579, 579,
-    579, 579, 580, 579, 579, 581, 582,  28,  28,  28,  28,  28,  28,  28,  28,  28,
-    583, 584, 585, 585, 585, 585, 583, 586, 585,  28, 585, 587, 588, 589, 590, 590,
-    590, 591, 592, 593, 590, 594,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,
-     28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28, 595, 595, 595, 596,
-     28,  28,  28,  28,  28,  28,  28,  28, 118, 118, 597, 118, 118, 118, 598, 599,
-    600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600,
-    600, 600, 600, 601,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,
-    600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 602, 603,  28,
-    600, 600, 600, 600, 600, 600, 600, 600, 604,  28,  28,  28,  28,  28,  28,  28,
-    605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605,
-    605, 605, 605, 605, 605, 606, 605, 607,  28,  28,  28,  28,  28,  28,  28,  28,
-    608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608,
-    608, 608, 608, 608, 608, 608, 608, 608, 609,  28,  28,  28,  28,  28,  28,  28,
-    336, 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, 336,
-    336, 336, 336, 336, 336, 336, 336, 610, 611, 611, 611, 612, 611, 613,  28,  28,
-     28,  28,  28,  28,  28,  28,  28,  28,  28,  28, 614, 614, 614, 615, 615,  28,
-    616, 616, 616, 616, 616, 616, 616, 616, 617,  28, 616, 618, 618, 616, 616, 619,
-    616, 616,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,
-     28,  28,  28,  28,  28,  28,  28,  28, 620, 620, 620, 620, 620, 620, 620, 620,
-    620, 620, 620, 621,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,
-    622, 622, 622, 622, 622, 622, 622, 622, 622, 623, 622, 622, 622, 622, 622, 622,
-    622, 624, 622, 622,  28,  28,  28,  28,  28,  28,  28,  28, 625,  28,  28,  28,
-    626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626,
-    626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626,  28,
-    626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 627,  28,
-    628, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312,
-    312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312,
-    312, 312, 312, 313,  28,  28,  28,  28,  28,  28, 629,  28, 630,  28, 631, 631,
-    631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631,
-    631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 632,
-    633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 634, 633, 635,
-    633, 636, 633, 637, 638,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 289,  28,
-      0,   0,   0,   0, 279, 394,   0,   0,   0,   0,   0,   0, 639, 640,   0, 641,
-    642, 643,   0,   0,   0, 644,   0,   0,   0,   0,   0,   0,   0, 645,  28,  28,
-     16,  16,  16,  16,  16,  16,  16,  16, 267,  28,  28,  28,  28,  28,  28,  28,
-     28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,   0,   0, 302,  28,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 279,  28, 298, 298, 646, 645,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 276,   0,   0,   0,   0,   0,
-      0,   0,   0, 276, 647, 648,   0, 649, 650,   0,   0,   0,   0,   0,   0,   0,
-    651, 652, 276, 276,   0,   0,   0, 653, 654, 655, 656,   0,   0,   0,   0,   0,
-      0,   0,   0,   0, 289,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0, 288,   0,   0,   0,   0,   0,   0,
-    657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657,
-    657, 658,  28, 659, 660, 657,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,
-    291, 290, 290, 661, 662, 663,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,
-    664, 664, 664, 664, 664, 665, 664, 666, 664, 667,  28,  28,  28,  28,  28,  28,
-     28,  28,  28,  28,  28,  28,  28,  28, 668, 668, 668, 668, 668, 668, 668, 669,
-    670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670,
-    670, 670, 670, 670, 670, 670, 670, 670, 671, 670, 672,  28,  28,  28,  28,  28,
-    673, 673, 673, 673, 673, 673, 673, 673, 673, 674, 673, 675,  28,  28,  28,  28,
-     28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28, 394,   0,
-      0,   0,   0,   0,   0,   0, 676,  28,  28,  28,  28,  28,  28,  28,  28,  28,
-    394,   0,   0,   0,   0,   0,   0, 289,  28,  28,  28,  28,  28,  28,  28,  28,
-    677,  33,  33,  33, 678, 679, 680, 681, 682, 683, 678, 684, 678, 680, 680, 685,
-     33, 686,  33, 687, 688, 686,  33, 687,  28,  28,  28,  28,  28,  28, 384,  28,
-      0,   0,   0,   0,   0, 302,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0, 302,  28,   0, 279, 394,   0, 394,   0, 394,   0,   0,   0, 289,  28,
-      0, 676,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 676,   0,   0,
-      0,   0,   0,   0,   0, 676,  28,  28,  28,  28,  28,  28, 689,   0,   0,   0,
-    690,  28,   0,   0,   0,   0,   0, 302,   0, 645, 377,  28, 289,  28,  28,  28,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 289,  28,   0, 676,   0, 286,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 302,  28,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 645,   0, 302,  28,  28,
-      0, 302,   0,   0,   0,   0,   0,   0,   0,  28,   0, 389,   0,   0,   0,   0,
-      0,  28,   0,   0,   0, 289,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,
-      0, 650,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 653, 655,
-      0,   0,   0,   0, 652, 691,   0,   0,   0, 652,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 302,  28,   0, 289, 302, 286,
-    286,  28, 289,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,
-    298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 692,  28,  28,  28,  28,  28,
-    298, 298, 298, 298, 298, 298, 693,  28, 298, 298, 298, 298, 298, 298, 298, 298,
-    298, 298, 298, 301, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298,
-    298, 298, 298, 298, 377,  28, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298,
-    298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 694,  28,  28,  28,
-    298, 298, 298, 301,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,
-    695,  28,  28,  28,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,
-      9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,  28,  28,
-};
-
-static RE_UINT8 re_script_extensions_stage_4[] = {
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   2,   2,   2,   2,   2,   2,   2,
-      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   1,   1,   1,   1,   1,
-      1,   1,   2,   1,   1,   1,   1,   1,   2,   2,   2,   2,   2,   2,   2,   1,
-      2,   1,   1,   1,   1,   1,   1,   1,   2,   2,   2,   2,   2,   1,   1,   1,
-      1,   1,  35,  35,   1,   1,   1,   1,  41,  41,  41,  41,  41,  41,  41,  41,
-     41,  41,   3,  41,  41,   3,  41,  41,  41,  41,  41,   2,   2,   2,   2,   2,
-      3,   3,   3,   3,   1,   3,   3,   3,   0,   0,   3,   3,   3,   3,   1,   3,
-      0,   0,   0,   0,   3,   1,   3,   1,   3,   3,   3,   0,   3,   0,   3,   3,
-      3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   0,   3,   3,   3,   3,   3,
-      3,   3,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,
-      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4, 164, 162, 163, 163, 162,
-      0,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
-      5,   5,   5,   5,   5,   5,   5,   0,   5, 157,   5,   0,   0,   5,   5,   5,
-      0,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,
-      0,   0,   0,   0,   0,   0,   0,   0,   6,   6,   6,   0,   0,   0,   0,   6,
-      6,   6,   6,   6,   6,   0,   0,   0,   7,   7,   7,   7,   7,   1,   7,   7,
-      7,   7,   7,   7, 185,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
-      7,   7,   7, 185, 177,   0,   7, 185, 192,   7,   7,   7,   7,   7,   7,   7,
-      7,   7,   7, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155,   7,   7,
-    156, 156, 156, 156, 156, 156, 156, 156, 156, 156,   7,   7,   7,   7,   7,   7,
-    155,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7, 154,   7,   7,   7,
-      8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   0,   8,
-      8,   8,   8,   0,   0,   8,   8,   8,   9,   9,   9,   9,   9,   9,   9,   9,
-      9,   9,   0,   0,   0,   0,   0,   0,  66,  66,  66,  66,  66,  66,  66,  66,
-     66,  66,  66,   0,   0,  66,  66,  66,  82,  82,  82,  82,  82,  82,  82,  82,
-     82,  82,  82,  82,  82,  82,   0,   0,  82,  82,  82,  82,  82,  82,  82,   0,
-     95,  95,  95,  95,  95,  95,  95,  95,  95,  95,  95,  95,   0,   0,  95,   0,
-      8,   8,   8,   0,   0,   0,   0,   0,   7,   7,   7,   7,   7,   0,   7,   7,
-      7,   7,   7,   7,   7,   7,   0,   0,   0,   0,   0,   7,   7,   7,   7,   7,
-      7,   7,   1,   7,   7,   7,   7,   7,  10,  10,  10,  10,  10,  10,  10,  10,
-     10, 196, 195,  41,  41,  10,  10,  10,  10,  10,  10,  10, 199, 200, 188, 188,
-    188, 188, 188, 188, 188, 188, 188, 188,  11,  11,  11,  11,   0,  11,  11,  11,
-     11,  11,  11,  11,  11,   0,   0,  11,  11,   0,   0,  11,  11,  11,  11,  11,
-     11,  11,  11,  11,  11,  11,  11,  11,  11,   0,  11,  11,  11,  11,  11,  11,
-     11,   0,  11,   0,   0,   0,  11,  11,  11,  11,   0,   0,  11,  11,  11,  11,
-     11,   0,   0,  11,  11,  11,  11,   0,   0,   0,   0,   0,   0,   0,   0,  11,
-      0,   0,   0,   0,  11,  11,   0,  11,  11,  11,  11,  11,   0,   0, 178, 178,
-    178, 178, 178, 178, 178, 178, 178, 178,  11,  11,  11,  11,  11,  11,  11,   0,
-      0,  12,  12,  12,   0,  12,  12,  12,  12,  12,  12,   0,   0,   0,   0,  12,
-     12,   0,   0,  12,  12,  12,  12,  12,  12,  12,  12,  12,  12,  12,  12,  12,
-     12,   0,  12,  12,  12,  12,  12,  12,  12,   0,  12,  12,   0,  12,  12,   0,
-     12,  12,   0,   0,  12,   0,  12,  12,  12,   0,   0,  12,  12,  12,   0,   0,
-      0,  12,   0,   0,   0,   0,   0,   0,   0,  12,  12,  12,  12,   0,  12,   0,
-      0,   0,   0,   0,   0,   0, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172,
-     12,  12,  12,  12,  12,  12,  12,   0,   0,  13,  13,  13,   0,  13,  13,  13,
-     13,  13,  13,  13,  13,  13,   0,  13,  13,  13,   0,  13,  13,  13,  13,  13,
-     13,  13,  13,  13,  13,  13,  13,  13,  13,   0,  13,  13,  13,  13,  13,  13,
-     13,   0,  13,  13,   0,  13,  13,  13,  13,  13,   0,   0,  13,  13,  13,  13,
-     13,  13,   0,  13,  13,  13,   0,   0,  13,   0,   0,   0,   0,   0,   0,   0,
-     13,  13,  13,  13,   0,   0, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171,
-     13,  13,   0,   0,   0,   0,   0,   0,   0,  13,  13,  13,  13,  13,  13,  13,
-      0,  14,  14,  14,   0,  14,  14,  14,  14,  14,  14,  14,  14,   0,   0,  14,
-     14,   0,   0,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,
-     14,   0,  14,  14,  14,  14,  14,  14,  14,   0,  14,  14,   0,  14,  14,  14,
-     14,  14,   0,   0,  14,  14,  14,  14,  14,   0,   0,  14,  14,  14,   0,   0,
-      0,   0,   0,   0,   0,   0,  14,  14,   0,   0,   0,   0,  14,  14,   0,  14,
-     14,  14,  14,  14,   0,   0,  14,  14,   0,   0,  15,  15,   0,  15,  15,  15,
-     15,  15,  15,   0,   0,   0,  15,  15,  15,   0,  15,  15,  15,  15,   0,   0,
-      0,  15,  15,   0,  15,   0,  15,  15,   0,   0,   0,  15,  15,   0,   0,   0,
-     15,  15,  15,  15,  15,  15,  15,  15,  15,  15,   0,   0,   0,   0,  15,  15,
-     15,   0,   0,   0,   0,   0,   0,  15,   0,   0,   0,   0,   0,   0, 170, 170,
-    170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170,  15,  15,  15,  15,
-     15,  15,  15,   0,   0,   0,   0,   0,  16,  16,  16,  16,  16,  16,  16,  16,
-     16,  16,  16,  16,  16,   0,  16,  16,  16,   0,  16,  16,  16,  16,  16,  16,
-     16,  16,   0,   0,   0,  16,  16,  16,  16,   0,  16,  16,  16,  16,   0,   0,
-      0,   0,   0,   0,   0,  16,  16,   0,  16,  16,  16,   0,   0,   0,   0,   0,
-     16,  16,  16,  16,   0,   0,  16,  16,   0,   0,   0,   0,   0,   0,   0,  16,
-     17,  17,  17,  17,  17,  17,  17,  17,  17,  17,  17,  17,  17,   0,  17,  17,
-     17,   0,  17,  17,  17,  17,  17,  17,  17,  17,  17,  17,   0,  17,  17,  17,
-     17,  17,   0,   0,  17,  17,  17,  17,  17,   0,  17,  17,  17,  17,   0,   0,
-      0,   0,   0,   0,   0,  17,  17,   0,   0,   0,   0,   0,   0,   0,  17,   0,
-     17,  17,  17,  17,   0,   0, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174,
-      0,  17,  17,   0,   0,   0,   0,   0,  18,  18,  18,  18,   0,  18,  18,  18,
-     18,  18,  18,  18,  18,   0,  18,  18,  18,   0,  18,  18,  18,  18,  18,  18,
-     18,  18,  18,  18,  18,  18,  18,  18,   0,   0,   0,   0,  18,  18,  18,  18,
-     18,  18,  18,  18,   0,   0,  18,  18,   0,   0,  19,  19,   0,  19,  19,  19,
-     19,  19,  19,  19,  19,  19,  19,  19,  19,  19,  19,  19,  19,  19,  19,   0,
-      0,   0,  19,  19,  19,  19,  19,  19,  19,  19,   0,  19,  19,  19,  19,  19,
-     19,  19,  19,  19,   0,  19,   0,   0,   0,   0,  19,   0,   0,   0,   0,  19,
-     19,  19,  19,  19,  19,   0,  19,   0,   0,   0,   0,   0,   0,   0,  19,  19,
-      0,   0,  19,  19,  19,   0,   0,   0,   0,  20,  20,  20,  20,  20,  20,  20,
-     20,  20,  20,  20,  20,  20,  20,  20,  20,  20,  20,   0,   0,   0,   0,   1,
-     20,  20,  20,  20,   0,   0,   0,   0,   0,  21,  21,   0,  21,   0,  21,  21,
-     21,  21,  21,   0,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,
-     21,  21,  21,  21,   0,  21,   0,  21,  21,  21,  21,  21,  21,  21,   0,   0,
-     21,  21,  21,  21,  21,   0,  21,   0,  21,  21,   0,   0,  21,  21,  21,  21,
-     22,  22,  22,  22,  22,  22,  22,  22,   0,  22,  22,  22,  22,  22,  22,  22,
-     22,  22,  22,  22,  22,   0,   0,   0,  22,  22,  22,  22,  22,   0,  22,  22,
-     22,  22,  22,  22,  22,   1,   1,   1,   1,  22,  22,   0,   0,   0,   0,   0,
-     23,  23,  23,  23,  23,  23,  23,  23, 179, 179, 179, 179, 179, 179, 179, 179,
-    179, 179,  23,  23,  23,  23,  23,  23,  24,  24,  24,  24,  24,  24,  24,  24,
-     24,  24,  24,  24,  24,  24,   0,  24,   0,   0,   0,   0,   0,  24,   0,   0,
-     24,  24,  24, 169,  24,  24,  24,  24,  25,  25,  25,  25,  25,  25,  25,  25,
-     26,  26,  26,  26,  26,  26,  26,  26,  26,   0,  26,  26,  26,  26,   0,   0,
-     26,  26,  26,  26,  26,  26,  26,   0,  26,  26,  26,   0,   0,  26,  26,  26,
-     26,  26,  26,  26,  26,   0,   0,   0,  26,  26,   0,   0,   0,   0,   0,   0,
-     27,  27,  27,  27,  27,  27,  27,  27,  27,  27,  27,  27,  27,  27,   0,   0,
-     28,  28,  28,  28,  28,  28,  28,  28,  29,  29,  29,  29,  29,  29,  29,  29,
-     29,  29,  29,  29,  29,   0,   0,   0,  30,  30,  30,  30,  30,  30,  30,  30,
-     30,  30,  30,   1,   1,   1,  30,  30,  30,   0,   0,   0,   0,   0,   0,   0,
-     42,  42,  42,  42,  42,  42,  42,  42,  42,  42,  42,  42,  42,   0,  42,  42,
-     42,  42,  42,  42,  42,   0,   0,   0,  43,  43,  43,  43,  43,  43,  43,  43,
-     43,  43,  43,  43,  43, 187, 187,   0,  44,  44,  44,  44,  44,  44,  44,  44,
-     44,  44,  44,  44,   0,   0,   0,   0,  45,  45,  45,  45,  45,  45,  45,  45,
-     45,  45,  45,  45,  45,   0,  45,  45,  45,   0,  45,  45,   0,   0,   0,   0,
-     31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,   0,   0,
-     31,  31,   0,   0,   0,   0,   0,   0,  32,  32, 176, 176,  32, 176,  32,  32,
-     32,  32,  32,  32,  32,  32,  32,   0,  32,  32,  32,  32,  32,  32,  32,  32,
-     32,  32,   0,   0,   0,   0,   0,   0,  32,   0,   0,   0,   0,   0,   0,   0,
-     32,  32,  32,   0,   0,   0,   0,   0,  28,  28,  28,  28,  28,  28,   0,   0,
-     46,  46,  46,  46,  46,  46,  46,  46,  46,  46,  46,  46,  46,  46,  46,   0,
-     46,  46,  46,  46,   0,   0,   0,   0,  46,   0,   0,   0,  46,  46,  46,  46,
-     47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,   0,   0,
-     47,  47,  47,  47,  47,   0,   0,   0,  56,  56,  56,  56,  56,  56,  56,  56,
-     56,  56,  56,  56,   0,   0,   0,   0,  56,  56,   0,   0,   0,   0,   0,   0,
-     56,  56,  56,   0,   0,   0,  56,  56,  54,  54,  54,  54,  54,  54,  54,  54,
-     54,  54,  54,  54,   0,   0,  54,  54,  78,  78,  78,  78,  78,  78,  78,  78,
-     78,  78,  78,  78,  78,  78,  78,   0,  78,  78,  78,  78,  78,   0,   0,  78,
-     78,  78,   0,   0,   0,   0,   0,   0,  78,  78,  78,  78,  78,  78,   0,   0,
-     41,  41,  41,  41,  41,  41,  41,   0,  62,  62,  62,  62,  62,  62,  62,  62,
-     62,  62,  62,  62,   0,   0,   0,   0,  62,  62,  62,  62,  62,   0,   0,   0,
-     67,  67,  67,  67,  67,  67,  67,  67,  93,  93,  93,  93,  93,  93,  93,  93,
-     93,  93,  93,  93,   0,   0,   0,   0,   0,   0,   0,   0,  93,  93,  93,  93,
-     68,  68,  68,  68,  68,  68,  68,  68,   0,   0,   0,  68,  68,  68,  68,  68,
-     68,  68,   0,   0,   0,  68,  68,  68,  69,  69,  69,  69,  69,  69,  69,  69,
-      4,   0,   0,   0,   0,   0,   0,   0,  24,  24,  24,   0,   0,  24,  24,  24,
-    186,  10, 186, 165,  10, 158, 158, 167, 158, 167, 191,  10, 167, 167,  10,  10,
-    167, 158,  10,  10,  10,  10,  10,  10,  10, 166, 158,  10,  10, 158,  10,  10,
-     10,  10, 193, 165, 181, 158, 158,  11, 165, 165, 150,   0,   0,   0,   0,   0,
-      2,   2,   2,   2,   2,   2,   3,   3,   3,   3,   3,   4,   2,   2,   2,   2,
-      2,   2,   2,   2,   2,   3,   3,   3,   3,   3,   2,   2,   2,   2,   3,   3,
-      3,   3,   3,   2,   2,   2,   2,   2,   4,   2,   2,   2,   2,   2,   2,   2,
-      2,   2,   2,   2,   2,   2,   2,   3,   3,   3,  41,  41,  41,  41,  41,  41,
-     41,  41,   0,  41,  41,  41,  41,  41,   3,   3,   3,   3,   3,   3,   0,   0,
-      0,   3,   0,   3,   0,   3,   0,   3,   3,   3,   3,   3,   3,   0,   3,   3,
-      3,   3,   3,   3,   0,   0,   3,   3,   3,   3,   3,   3,   0,   3,   3,   3,
-      0,   0,   3,   3,   3,   0,   3,   3,   3,   3,   3,   3,   3,   3,   3,   0,
-      1,   1,   1,   1,  41,  41,   1,   1,   1,   1,   1,   1,   1,   1,   1, 175,
-      1,   1,   1,   1,   1,   0,   1,   1,   1,   2,   0,   0,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   2,   1,   1,   1,   1,   1,   1,   1,   0,
-      2,   2,   2,   2,   2,   0,   0,   0, 182,   0,   0,   0,   0,   0,   0,   0,
-      1,   1,   1,   1,   1,   1,   3,   1,   1,   1,   2,   2,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   2,   1,   2,   1,   1,   1,   0,   0,   0,   0,
-      1,   1,   1,   0,   0,   0,   0,   0,  53,  53,  53,  53,  53,  53,  53,  53,
-      1,   1,   1,   1,   0,   0,   1,   1,   1,   1,   1,   1,   1,   1,   0,   0,
-     57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,   0,
-     55,  55,  55,  55,   0,   0,   0,   0,   0,  55,  55,  55,  55,  55,  55,  55,
-     58,  58,  58,  58,  58,  58,  58,  58,   0,   0,   0,   0,   0,   0,   0,  58,
-     58,   0,   0,   0,   0,   0,   0,   0,   1,   1,   1, 162,   1,   1,   1,   1,
-     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,   0,  36,  36,  36,  36,  36,
-     36,  36,  36,  36,   0,   0,   0,   0,  36,  36,  36,  36,  36,  36,   0,   0,
-      1,   1,   1,   1,   0,   0,   0,   0,   1, 190, 190, 189,   1,  36,  36,  36,
-    190, 190, 190, 190, 190, 190, 190, 190, 190, 190,   1, 189, 190, 190, 190, 190,
-    190, 190, 190, 190, 189, 189, 189, 189,   1,  36,  36,  36,  36,  36,  36,  36,
-     36,  36, 159, 159, 159, 159,  25,  25, 189, 173, 173, 173, 173, 173,   1, 189,
-     36,  36,  36,  36, 183, 183,  36,  36,   0,  33,  33,  33,  33,  33,  33,  33,
-     33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,   0,
-      0, 173, 173, 173, 173,  33,  33,  33, 173,  34,  34,  34,  34,  34,  34,  34,
-     34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34, 190, 173,  34,  34,  34,
-      0,   0,   0,   0,   0,  35,  35,  35,  35,  35,  35,  35,  35,  35,  35,  35,
-      0,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,   0,
-     35,  35,  35,   0,   0,   0,   0,   0,  25,  25,  25,  25,  25,  25,  25,   1,
-     36,   1,   1,   1,   1,   1,   1,   1,  36,  36,  36,  36,   1,   1,   1,   1,
-     34,  34,  34,  34,  34,  34,  34,  36,   1,   1,   1,  36,  36,  36,  36,  36,
-     36,  36,  36,  36,  36,  36,  36,   1,  37,  37,  37,  37,  37,  37,  37,  37,
-     37,  37,  37,  37,  37,   0,   0,   0,  37,  37,  37,  37,  37,  37,  37,   0,
-     83,  83,  83,  83,  83,  83,  83,  83,  70,  70,  70,  70,  70,  70,  70,  70,
-     70,  70,  70,  70,   0,   0,   0,   0,   4,   4,   4,   4,   4,   4,   4, 162,
-     84,  84,  84,  84,  84,  84,  84,  84,   1,   1,   2,   2,   2,   2,   2,   2,
-      1,   1,   1,   2,   2,   2,   2,   2,   0,   0,   2,   2,   2,   2,   2,   0,
-      0,   0,   0,   0,   0,   0,   0,   2,  59,  59,  59,  59,  59,  59,  59,  59,
-     59,  59,  59,  59,   0,   0,   0,   0, 198, 198, 198, 197, 197, 197, 194, 194,
-    194, 194,   0,   0,   0,   0,   0,   0,  65,  65,  65,  65,  65,  65,  65,  65,
-     71,  71,  71,  71,  71,  71,  71,  71,  71,  71,  71,  71,  71,  71,   0,   0,
-      0,   0,   0,   0,   0,   0,  71,  71,  71,  71,   0,   0,   0,   0,   0,   0,
-     10, 158,  10, 168,  10,  10,  10,  10,  72,  72,  72,  72,  72,  72,  72,  72,
-     72,  72,  72,  72,  72,  72, 184,  72,  73,  73,  73,  73,  73,  73,  73,  73,
-     73,  73,  73,  73,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  73,
-     25,  25,  25,  25,  25,   0,   0,   0,  85,  85,  85,  85,  85,  85,  85,  85,
-     85,  85,  85,  85,  85,  85,   0, 160,  85,  85,   0,   0,   0,   0,  85,  85,
-     23,  23,  23,  23,  23,  23,  23,   0,  77,  77,  77,  77,  77,  77,  77,  77,
-     77,  77,  77,  77,  77,  77,  77,   0,  77,  77,  77,  77,  77,  77,   0,   0,
-     77,  77,   0,   0,  77,  77,  77,  77,  79,  79,  79,  79,  79,  79,  79,  79,
-     79,  79,  79,   0,   0,   0,   0,   0,   0,   0,   0,  79,  79,  79,  79,  79,
-     86,  86,  86,  86,  86,  86,  86,  86,  86,  86,  86,  86,  86,  86,  86,   0,
-      0,  26,  26,  26,  26,  26,  26,   0,   2,   2,   2,   1,   2,   2,   2,   2,
-      2,   2,   2,   2,   2,   3,   2,   2,  86,  86,  86,  86,  86,  86,   0,   0,
-     86,  86,   0,   0,   0,   0,   0,   0,  25,  25,  25,  25,   0,   0,   0,   0,
-      0,   0,   0,  25,  25,  25,  25,  25,  36,  36,   0,   0,   0,   0,   0,   0,
-      2,   2,   2,   2,   2,   2,   2,   0,   0,   0,   0,   5,   5,   5,   5,   5,
-      0,   0,   0,   0,   0,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   0,
-      6,   6,   6,   6,   6,   0,   6,   0,   6,   6,   0,   6,   6,   0,   6,   6,
-      7,   7,   0,   0,   0,   0,   0,   0,   7,   7,   7,   7,   7,   7,   1,   1,
-      0,   0,   7,   7,   7,   7,   7,   7,   7,   7, 156,   7,   7,   7,   7,   7,
-      7,   7,   7,   7,   7, 156,   0,   0,   1,   1,   0,   0,   0,   0,   0,   0,
-     41,  41,  41,  41,  41,  41,   4,   4,   1,   1,   1,   1,   1, 189, 189,   1,
-      1,   1,   1,   0,   1,   1,   1,   1,   7,   7,   7,   7,   7,   0,   0,   1,
-      0,   1,   1,   1,   1,   1,   1,   1,   1, 190, 190, 190, 190, 190,  34,  34,
-     34,  34,  34,  34,  34,  34, 173, 173,   0,   0,  25,  25,  25,  25,  25,  25,
-      0,   0,  25,  25,  25,   0,   0,   0,   0,   1,   1,   1,   1,   1,   0,   0,
-     48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,   0,  48,  48,  48,
-     48,  48,  48,  48,  48,  48,  48,   0,  48,  48,  48,   0,  48,  48,   0,  48,
-     48,  48,  48,  48,  48,  48,   0,   0,  48,  48,  48,   0,   0,   0,   0,   0,
-    161, 161, 161,   0,   0,   0,   0, 180, 180, 180, 180, 180, 180, 180, 180, 180,
-    180, 180, 180, 180,   0,   0,   0, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-      3,   0,   0,   0,   0,   0,   0,   0,   1,   1,   1,   1,   1,  41,   0,   0,
-     74,  74,  74,  74,  74,  74,  74,  74,  74,  74,  74,  74,  74,   0,   0,   0,
-     75,  75,  75,  75,  75,  75,  75,  75,  75,   0,   0,   0,   0,   0,   0,   0,
-    153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153,   0,   0,   0,   0,
-     38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,  38,  38,  38,  39,  39,  39,  39,  39,  39,  39,  39,
-     39,  39,  39,   0,   0,   0,   0,   0, 120, 120, 120, 120, 120, 120, 120, 120,
-    120, 120, 120,   0,   0,   0,   0,   0,  49,  49,  49,  49,  49,  49,  49,  49,
-     49,  49,  49,  49,  49,  49,   0,  49,  60,  60,  60,  60,  60,  60,  60,  60,
-     60,  60,  60,  60,   0,   0,   0,   0,  60,  60,  60,  60,  60,  60,   0,   0,
-     40,  40,  40,  40,  40,  40,  40,  40,  50,  50,  50,  50,  50,  50,  50,  50,
-     51,  51,  51,  51,  51,  51,  51,  51,  51,  51,  51,  51,  51,  51,   0,   0,
-     51,  51,   0,   0,   0,   0,   0,   0, 136, 136, 136, 136, 136, 136, 136, 136,
-    136, 136, 136, 136,   0,   0,   0,   0, 106, 106, 106, 106, 106, 106, 106, 106,
-    103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0, 103, 110, 110, 110, 110, 110, 110, 110, 110,
-    110, 110, 110, 110, 110, 110, 110,   0, 110, 110, 110, 110, 110, 110,   0,   0,
-     52,  52,  52,  52,  52,  52,   0,   0,  52,   0,  52,  52,  52,  52,  52,  52,
-     52,  52,  52,  52,  52,  52,  52,  52,  52,  52,  52,  52,  52,  52,   0,  52,
-     52,   0,   0,   0,  52,   0,   0,  52,  87,  87,  87,  87,  87,  87,  87,  87,
-     87,  87,  87,  87,  87,  87,   0,  87, 118, 118, 118, 118, 118, 118, 118, 118,
-    117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117,   0,
-      0,   0,   0,   0,   0,   0,   0, 117, 128, 128, 128, 128, 128, 128, 128, 128,
-    128, 128, 128,   0, 128, 128,   0,   0,   0,   0,   0, 128, 128, 128, 128, 128,
-     64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,   0,   0,   0,  64,
-     76,  76,  76,  76,  76,  76,  76,  76,  76,  76,   0,   0,   0,   0,   0,  76,
-     98,  98,  98,  98,  98,  98,  98,  98,  97,  97,  97,  97,  97,  97,  97,  97,
-      0,   0,   0,   0,  97,  97,  97,  97,   0,   0,  97,  97,  97,  97,  97,  97,
-     61,  61,  61,  61,   0,  61,  61,   0,   0,   0,   0,   0,  61,  61,  61,  61,
-     61,  61,  61,  61,   0,  61,  61,  61,   0,  61,  61,  61,  61,  61,  61,  61,
-     61,  61,  61,  61,  61,  61,  61,  61,  61,  61,  61,  61,  61,  61,   0,   0,
-     61,  61,  61,   0,   0,   0,   0,  61,  61,   0,   0,   0,   0,   0,   0,   0,
-     88,  88,  88,  88,  88,  88,  88,  88, 116, 116, 116, 116, 116, 116, 116, 116,
-    112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112,   0,
-      0,   0,   0, 112, 112, 112, 112, 112,  80,  80,  80,  80,  80,  80,  80,  80,
-     80,  80,  80,  80,  80,  80,   0,   0,   0,  80,  80,  80,  80,  80,  80,  80,
-     89,  89,  89,  89,  89,  89,  89,  89,  89,  89,  89,  89,  89,  89,   0,   0,
-     90,  90,  90,  90,  90,  90,  90,  90,  90,  90,  90,   0,   0,   0,   0,   0,
-    121, 121, 121, 121, 121, 121, 121, 121, 121, 121,   0,   0,   0,   0,   0,   0,
-      0, 121, 121, 121, 121,   0,   0,   0,   0, 121, 121, 121, 121, 121, 121, 121,
-     91,  91,  91,  91,  91,  91,  91,  91,  91,   0,   0,   0,   0,   0,   0,   0,
-    130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130,   0,   0,   0,   0,   0,
-      0,   0, 130, 130, 130, 130, 130, 130, 146, 146, 146, 146, 146, 146, 146, 146,
-    146, 146,   0,   0,   0,   0,   0,   0,   7,   7,   7,   7,   7,   7,   7,   0,
-    148, 148, 148, 148, 148, 148, 148, 148, 147, 147, 147, 147, 147, 147, 147, 147,
-    147, 147,   0,   0,   0,   0,   0,   0, 149, 149, 149, 149, 149, 149, 149, 149,
-    149, 149, 149, 149, 149, 149, 149,   0,  94,  94,  94,  94,  94,  94,  94,  94,
-     94,  94,  94,  94,  94,  94,   0,   0,   0,   0,  94,  94,  94,  94,  94,  94,
-      0,   0,   0,   0,   0,   0,   0,  94,  92,  92,  92,  92,  92,  92,  92,  92,
-     92,  92,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  92,   0,   0,
-    101, 101, 101, 101, 101, 101, 101, 101, 101,   0,   0,   0,   0,   0,   0,   0,
-    101, 101,   0,   0,   0,   0,   0,   0,  96,  96,  96,  96,  96,  96,  96,  96,
-     96,  96,  96,  96,  96,   0,  96,  96,  96,  96,  96,  96,  96,  96,  96,   0,
-    111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111,   0,
-    100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100,   0,   0,
-      0,  19,  19,  19,  19,  19,  19,  19,  19,  19,  19,  19,  19,   0,   0,   0,
-    109, 109, 109, 109, 109, 109, 109, 109, 109, 109,   0, 109, 109, 109, 109, 109,
-    109, 109, 109, 109, 109, 109, 109,   0, 129, 129, 129, 129, 129, 129, 129,   0,
-    129,   0, 129, 129, 129, 129,   0, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-    129, 129, 129, 129, 129, 129,   0, 129, 129, 129,   0,   0,   0,   0,   0,   0,
-    123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123,   0,   0,   0,   0,   0,
-    123, 123,   0,   0,   0,   0,   0,   0, 107, 170, 107, 170,   0, 107, 107, 107,
-    107, 107, 107, 107, 107,   0,   0, 107, 107,   0,   0, 107, 107, 107, 107, 107,
-    107, 107, 107, 107, 107, 107, 107, 107, 107,   0, 107, 107, 107, 107, 107, 107,
-    107,   0, 107, 107,   0, 107, 107, 107, 107, 107,   0, 170, 170, 107, 107, 107,
-    107,   0,   0, 107, 107, 107,   0,   0, 107,   0,   0,   0,   0,   0,   0, 107,
-      0,   0,   0,   0,   0, 107, 107, 107, 107, 107, 107, 107,   0,   0, 107, 107,
-    107, 107, 107, 107, 107,   0,   0,   0, 135, 135, 135, 135, 135, 135, 135, 135,
-    135, 135,   0, 135,   0, 135, 135, 135, 124, 124, 124, 124, 124, 124, 124, 124,
-    124, 124,   0,   0,   0,   0,   0,   0, 122, 122, 122, 122, 122, 122, 122, 122,
-    122, 122, 122, 122, 122, 122,   0,   0, 114, 114, 114, 114, 114, 114, 114, 114,
-    114, 114, 114, 114, 114,   0,   0,   0, 114, 114,   0,   0,   0,   0,   0,   0,
-     32,  32,  32,  32,  32,   0,   0,   0, 102, 102, 102, 102, 102, 102, 102, 102,
-    102,   0,   0,   0,   0,   0,   0,   0, 102, 102,   0,   0,   0,   0,   0,   0,
-    126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126,   0,   0, 126, 126, 126,
-    126, 126, 126, 126,   0,   0,   0,   0, 142, 142, 142, 142, 142, 142, 142, 142,
-    142, 142, 142, 142,   0,   0,   0,   0, 125, 125, 125, 125, 125, 125, 125, 125,
-    125, 125, 125,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 125,
-    150, 150, 150, 150, 150, 150, 150, 150,   0,   0, 150, 150, 150, 150, 150, 150,
-    150, 150, 150, 150, 150,   0,   0,   0, 141, 141, 141, 141, 141, 141, 141, 141,
-    140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,   0,   0,   0,   0,   0,
-    119, 119, 119, 119, 119, 119, 119, 119, 119,   0,   0,   0,   0,   0,   0,   0,
-    133, 133, 133, 133, 133, 133, 133, 133, 133,   0, 133, 133, 133, 133, 133, 133,
-    133, 133, 133, 133, 133, 133, 133,   0, 133, 133, 133, 133, 133, 133,   0,   0,
-    133, 133, 133, 133, 133,   0,   0,   0, 134, 134, 134, 134, 134, 134, 134, 134,
-      0,   0, 134, 134, 134, 134, 134, 134,   0, 134, 134, 134, 134, 134, 134, 134,
-    134, 134, 134, 134, 134, 134, 134,   0, 138, 138, 138, 138, 138, 138, 138,   0,
-    138, 138,   0, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138,
-      0,   0, 138,   0, 138, 138,   0, 138, 138, 138,   0,   0,   0,   0,   0,   0,
-    143, 143, 143, 143, 143, 143,   0, 143, 143,   0, 143, 143, 143, 143, 143, 143,
-    143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143,   0,
-    143, 143,   0, 143, 143, 143, 143, 143, 143,   0,   0,   0,   0,   0,   0,   0,
-    143, 143,   0,   0,   0,   0,   0,   0, 144, 144, 144, 144, 144, 144, 144, 144,
-    144,   0,   0,   0,   0,   0,   0,   0, 170, 170,  15, 170,  15,  15,  15,  15,
-     15,  15,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  15,
-     63,  63,  63,  63,  63,  63,  63,  63,  63,  63,   0,   0,   0,   0,   0,   0,
-     63,  63,  63,  63,  63,  63,  63,   0,  63,  63,  63,  63,  63,   0,   0,   0,
-     63,  63,  63,  63,   0,   0,   0,   0,  81,  81,  81,  81,  81,  81,  81,  81,
-     81,  81,  81,  81,  81,  81,  81,   0,  81,   0,   0,   0,   0,   0,   0,   0,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,   0,
-     84,   0,   0,   0,   0,   0,   0,   0, 115, 115, 115, 115, 115, 115, 115, 115,
-    115, 115, 115, 115, 115, 115, 115,   0, 115, 115,   0,   0,   0,   0, 115, 115,
-    104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104,   0,   0,
-    108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108,   0,   0,
-    108, 108,   0, 108, 108, 108, 108, 108,   0,   0,   0,   0,   0, 108, 108, 108,
-    145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145,   0,   0,   0,   0,   0,
-     99,  99,  99,  99,  99,  99,  99,  99,  99,  99,  99,   0,   0,   0,   0,  99,
-      0,   0,   0,   0,   0,   0,   0,  99, 137, 139,   1,   1,   0,   0,   0,   0,
-    137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137,   0,   0,   0,   0,   0,
-     34,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,  34,  34,  34,  34, 139, 139, 139, 139, 139, 139, 139, 139,
-    139, 139, 139, 139,   0,   0,   0,   0, 105, 105, 105, 105, 105, 105, 105, 105,
-    105, 105, 105,   0,   0,   0,   0,   0, 105, 105, 105, 105, 105,   0,   0,   0,
-    105,   0,   0,   0,   0,   0,   0,   0, 105, 105,   0,   0, 105, 105, 105, 105,
-    105, 105, 105, 105,   0,   0,   0,   0,   1,   1,   1,   1,   1,   1,   1,  41,
-     41,  41,   1,   1,   1,   1,   1,   1,   1,   1,   1,  41,  41,  41,  41,  41,
-     41,  41,  41,   1,   1,  41,  41,  41,  41,  41,  41,  41,   1,   1,   1,   1,
-      1,   1,  41,  41,  41,  41,   1,   1,   1,   0,   0,   0,   0,   0,   0,   0,
-     36,  36,   1,   1,   1,   1,   1,   1,   0,   0,   1,   0,   0,   1,   1,   0,
-      0,   1,   1,   1,   1,   0,   1,   1,   1,   1,   0,   1,   0,   1,   1,   1,
-      1,   1,   1,   1,   0,   1,   1,   1,   1,   1,   1,   1,   1,   1,   0,   1,
-      1,   1,   1,   0,   0,   1,   1,   1,   1,   1,   0,   1,   1,   1,   1,   0,
-      1,   1,   1,   1,   1,   0,   1,   0,   0,   0,   1,   1,   1,   1,   1,   1,
-      1,   0,   1,   1,   1,   1,   1,   1, 131, 131, 131, 131, 131, 131, 131, 131,
-    131, 131, 131, 131,   0,   0,   0,   0,   0,   0,   0, 131, 131, 131, 131, 131,
-      0, 131, 131, 131, 131, 131, 131, 131,  57,   0,   0,  57,  57,  57,  57,  57,
-     57,  57,   0,  57,  57,   0,  57,  57,  57,  57,  57,   0,   0,   0,   0,   0,
-    151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151,   0,   0,   0,
-    151, 151, 151, 151, 151, 151,   0,   0, 151, 151,   0,   0,   0,   0, 151, 151,
-    152, 152, 152, 152, 152, 152, 152, 152, 152, 152,   0,   0,   0,   0,   0, 152,
-    113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113,   0,   0, 113,
-    113, 113, 113, 113, 113, 113, 113,   0, 132, 132, 132, 132, 132, 132, 132, 132,
-    132, 132, 132, 132,   0,   0,   0,   0, 132, 132,   0,   0,   0,   0, 132, 132,
-      1,   1,   1,   1,   1,   0,   0,   0,   7,   7,   7,   7,   0,   7,   7,   7,
-      0,   7,   7,   0,   7,   0,   0,   7,   0,   7,   7,   7,   7,   7,   7,   7,
-      7,   7,   7,   0,   7,   7,   7,   7,   0,   7,   0,   7,   0,   0,   0,   0,
-      0,   0,   7,   0,   0,   0,   0,   7,   0,   7,   0,   7,   0,   7,   7,   7,
-      0,   7,   0,   7,   0,   7,   0,   7,   0,   7,   7,   7,   7,   0,   7,   0,
-      7,   7,   0,   7,   7,   7,   7,   7,   7,   7,   7,   7,   0,   0,   0,   0,
-      0,   7,   7,   7,   0,   7,   7,   7,   0,   0,   0,   0,   0,   0,   1,   1,
-     33,   1,   1,   0,   0,   0,   0,   0,   1,   1,   1,   0,   0,   0,   1,   1,
-     36,  36,  36,  36,  36,  36,  36,   0,  36,  36,  36,  36,  36,   0,   0,   0,
-     36,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,
-};
-
-/* Script_Extensions: 14272 bytes. */
-
-static RE_ScriptExt re_scripts_extensions_table[] = {
-    {{  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{  1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{  2,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{  3,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{  4,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{  5,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{  6,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{  7,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{  8,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{  9,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 10,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 11,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 12,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 13,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 14,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 15,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 16,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 17,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 18,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 19,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 20,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 21,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 22,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 23,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 24,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 25,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 26,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 27,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 28,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 29,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 30,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 31,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 32,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 33,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 34,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 35,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 36,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 37,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 38,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 39,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 40,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 41,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 42,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 43,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 44,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 45,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 46,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 47,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 48,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 49,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 50,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 51,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 52,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 53,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 54,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 55,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 56,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 57,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 58,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 59,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 60,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 61,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 62,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 63,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 64,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 65,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 66,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 67,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 68,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 69,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 70,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 71,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 72,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 73,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 74,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 75,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 76,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 77,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 78,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 79,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 80,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 81,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 82,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 83,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 84,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 85,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 86,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 87,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 88,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 89,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 90,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 91,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 92,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 93,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 94,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 95,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 96,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 97,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 98,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 99,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{100,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{101,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{102,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{103,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{104,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{105,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{106,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{107,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{108,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{109,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{110,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{111,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{112,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{113,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{114,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{115,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{116,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{117,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{118,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{119,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{120,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{121,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{122,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{123,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{124,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{125,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{126,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{127,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{128,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{129,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{130,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{131,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{132,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{133,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{134,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{135,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{136,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{137,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{138,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{139,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{140,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{141,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{142,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{143,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{144,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{145,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{146,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{147,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{148,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{149,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{150,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{151,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{152,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{  7,  55,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{  7, 146,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{  7,   8,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{  7,   9,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{  5,  24,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 10,  11,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 35,  36,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 54,  85,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 48,  52,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{  4,  57,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{  2,   4,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{  4, 120,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 10, 107,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 10, 150,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 10, 100,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 10,  15,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{  2,  24,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 15, 107,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 13, 109,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 12, 129,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 33,  34,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 17, 150,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{  2,  32,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 32,  65,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{  7,   8,   9,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 11,  59,  96,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 23,  47,  96,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 48,  52, 110,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 10,  17, 107,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{  2,  10, 107,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 33,  34,  36,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{  2,  23,  72,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{  7,   8,   9, 146,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 10,  11,  17, 107,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 42,  43,  44,  45,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 10,  92, 111, 142,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 25,  33,  34,  35,  36,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 25,  33,  34,  35,  36,  37,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 10,  14,  15,  16,  17,  18,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{  7,   8,  95, 112, 121, 132, 146, 147,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 10,  11,  14,  16,  17, 107, 124, 150,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 10,  12,  13,  92, 102, 109, 111, 114, 123, 124, 142,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{  2,  10,  11,  12,  13,  14,  15,  16,  17,  18, 107, 124,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{  2,  10,  11,  12,  13,  14,  15,  16,  17,  18, 100, 107, 124,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 10,  12,  13,  17,  92, 102, 109, 111, 114, 123, 124, 142, 150,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 10,  12,  13,  17,  18,  92, 102, 109, 111, 114, 123, 124, 142, 150,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 10,  11,  12,  13,  14,  15,  16,  17,  18,  19,  59, 102, 107, 111, 123, 124, 138, 142, 143, 150,   0}},
-    {{ 10,  11,  12,  13,  14,  15,  16,  17,  18,  19,  46,  59, 102, 107, 111, 123, 124, 138, 142, 143, 150}}
-};
-
-int re_get_script_extensions(RE_UINT32 ch, RE_UINT8* scripts) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-    RE_UINT8* scr;
-    int count;
-
-    f = ch >> 11;
-    code = ch ^ (f << 11);
-    pos = (RE_UINT32)re_script_extensions_stage_1[f] << 4;
-    f = code >> 7;
-    code ^= f << 7;
-    pos = (RE_UINT32)re_script_extensions_stage_2[pos + f] << 4;
-    f = code >> 3;
-    code ^= f << 3;
-    pos = (RE_UINT32)re_script_extensions_stage_3[pos + f] << 3;
-    value = re_script_extensions_stage_4[pos + code];
-
-    scr = re_scripts_extensions_table[value].scripts;
-    scripts[0] = scr[0];
-    count = 1;
-
-    if (scr[0] != 0) {
-        while (count < RE_MAX_SCX && scr[count] != 0) {
-            scripts[count] = scr[count];
-            ++count;
-        }
-    }
-
-    return count;
-}
-
-/* Word_Break. */
-
-static RE_UINT8 re_word_break_stage_1[] = {
-     0,  1,  2,  3,  4,  4,  4,  4,  4,  4,  5,  6,  6,  7,  4,  8,
-     9, 10, 11, 12, 13,  4, 14,  4,  4,  4,  4, 15,  4, 16, 17, 18,
-     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
-     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
-     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
-     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
-     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
-     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
-     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
-     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
-     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
-     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
-     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
-     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
-    19,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
-     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
-     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
-};
-
-static RE_UINT8 re_word_break_stage_2[] = {
-      0,   1,   2,   2,   2,   3,   4,   5,   2,   6,   7,   8,   9,  10,  11,  12,
-     13,  14,  15,  16,  17,  18,  19,  20,  21,  22,  23,  24,  25,  26,  27,  28,
-     29,  30,   2,   2,  31,  32,  33,  34,  35,   2,   2,   2,  36,  37,  38,  39,
-     40,  41,  42,  43,  44,  45,  46,  47,  48,  49,   2,  50,   2,   2,  51,  52,
-     53,  54,  55,  56,  57,  57,  57,  57,  57,  58,  57,  57,  57,  57,  57,  57,
-     57,  57,  57,  57,  57,  57,  57,  57,  59,  60,  61,  62,  63,  57,  57,  57,
-     64,  65,  66,  67,  57,  68,  69,  57,  57,  57,  57,  57,  57,  57,  57,  57,
-     57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,
-     57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,
-     57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,
-      2,   2,   2,   2,   2,   2,   2,   2,   2,  70,   2,   2,  71,  72,  73,  74,
-     75,  76,  77,  78,  79,  80,  81,  82,   2,   2,   2,   2,   2,   2,   2,   2,
-      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
-      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
-      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,  83,
-     57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,
-     57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,
-     57,  57,  57,  57,  57,  57,  84,  85,   2,   2,  86,  87,  88,  89,  90,  91,
-     92,  93,  94,  95,  57,  96,  97,  98,   2,  99, 100,  57,   2,   2, 101,  57,
-    102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112,  57,  57,  57, 113, 114,
-    115, 116, 117, 118, 119, 120, 121,  57, 122, 123,  57, 124, 125, 126, 127,  57,
-    128, 129,  57, 130, 131, 132,  57,  57, 133, 134, 135, 136,  57, 137,  57,  57,
-      2,   2,   2,   2,   2,   2,   2, 138, 139,   2, 140,  57,  57,  57,  57,  57,
-     57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,
-      2,   2,   2,   2,   2,   2,   2,   2, 141,  57,  57,  57,  57,  57,  57,  57,
-     57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,
-     57,  57,  57,  57,  57,  57,  57,  57,   2,   2,   2,   2, 142,  57,  57,  57,
-     57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,
-     57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,
-      2,   2,   2,   2, 143, 144, 145, 146,  57,  57,  57,  57, 147,  57, 148, 149,
-    150,  57, 151,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,
-     57,  57,  57,  57,  57,  57,  57,  57, 152, 153,  57,  57,  57,  57,  57,  57,
-     57,  57, 154, 155, 156,  57,  57,  57, 157, 158, 159,   2,   2, 160, 161, 162,
-     57,  57,  57,  57, 163, 164,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,
-    165,  57, 166,  57,  57, 167,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,
-      2, 168, 169,  57,  57,  57,  57,  57,  57,  57,  57,  57, 170, 171,  57,  57,
-     57,  57, 172, 173,  57,  57,  57, 174,  57,  57,  57,  57,  57,  57,  57,  57,
-     57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,
-    175,  57, 176, 177,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,
-     57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,
-};
-
-static RE_UINT8 re_word_break_stage_3[] = {
-      0,   0,   1,   2,   0,   0,   0,   0,   3,   4,   0,   5,   6,   6,   7,   0,
-      8,   9,   9,   9,   9,   9,  10,  11,   8,   9,   9,   9,   9,   9,  10,   0,
-      0,  12,   0,   0,   0,   0,   0,   0,   0,   0,  13,  14,   0,  15,  13,   0,
-      9,   9,   9,   9,   9,  10,   9,   9,   9,   9,   9,   9,   9,  10,   9,   9,
-      9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,
-      9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,
-      9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,
-      9,   9,   9,   9,   9,   9,   0,  16,   9,  17,   0,   9,   9,   9,   9,   9,
-     18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,
-     18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,   9,  19,  16,  20,
-      0,  21,  10,  19,   9,   9,   9,   9,  22,   9,   9,   9,   9,   9,   9,   9,
-      9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,  22,   9,   9,
-     23,  18,  24,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,
-      9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,
-      9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   8,   9,   9,   9,
-      9,   9,   9,   9,   9,  10,  25,  26,   9,   9,   9,   9,   9,   9,   9,   9,
-      9,   9,  27,   0,  28,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  29,
-     30,  29,   0,   0,  31,  31,  31,  31,  31,  31,  32,  33,  34,  35,   0,   0,
-     36,  37,   0,  38,  18,  18,  39,  40,   9,   9,   9,   9,   9,   9,   9,   9,
-      9,   9,  41,  18,  18,  18,  18,  18,   6,   6,  42,  43,  44,   9,   9,   9,
-      9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,
-      9,   9,   9,   9,   9,  45,  18,  46,  18,  47,  48,  24,   6,   6,  49,  50,
-      0,   0,   0,  51,  52,   9,   9,   9,   9,   9,   9,   9,  18,  18,  18,  18,
-     18,  18,  39,   8,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,
-      9,   9,   9,   9,   9,   9,   9,   9,   9,  53,  18,  18,  54,   0,   0,   0,
-      6,   6,  49,   9,   9,   9,   9,   9,   9,   9,  41,  18,  18,  55,  56,  57,
-      9,   9,   9,   9,   9,  53,  58,  18,  18,  59,  59,  60,   0,   0,   0,   0,
-      9,   9,   9,   9,   9,   9,  59,   0,   9,   9,  10,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   9,   9,   9,   9,   9,  19,   9,  55,
-      0,   0,   0,   0,  61,  18,  18,  18,  62,  18,  18,  18,  18,  18,  18,  18,
-     18,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,  53,  63,
-     18,  18,  18,  18,  59,  18,   9,   9,  53,  64,   6,   6,   8,   9,   9,   9,
-     59,   8,   9,  50,  50,   9,   9,   9,   9,   9,  19,   9,  26,  16,  55,  63,
-     18,  65,  65,  66,   0,  61,   0,  22,  53,  64,   6,   6,  55,   0,   0,  67,
-     28,   8,  10,  68,  50,   9,   9,   9,   9,   9,  19,   9,  19,  69,  55,  48,
-     39,  61,  65,  60,  57,   0,   8,  26,   0,  64,   6,   6,  24,  70,   0,   0,
-     28,   8,   9,  22,  22,   9,   9,   9,   9,   9,  19,   9,  19,   8,  55,  63,
-     18,  29,  29,  60,  17,   0,   0,   0,  53,  64,   6,   6,   0,   0,  45,  18,
-     28,   8,   9,  50,  50,   9,   9,   9,   9,   9,  19,   9,  19,   8,  55,  63,
-     18,  65,  65,  60,   0,  71,   0,  22,  53,  64,   6,   6,  72,   0,   0,   0,
-     73,   8,  10,  16,  19,  55,  69,  19,  68,  17,  10,  16,   9,   9,  55,  71,
-     39,  71,  48,  60,  17,  61,   0,   0,   0,  64,   6,   6,   0,   0,   0,   0,
-     18,  44,   9,  19,  19,   9,   9,   9,   9,   9,  19,   9,   9,   9,  55,  45,
-     18,  48,  48,  60,   0,  30,  10,   0,  53,  64,   6,   6,   0,   0,   0,   0,
-     59,   8,   9,  19,  19,   9,   9,   9,   9,   9,  19,   9,   9,   8,  55,  63,
-     18,  48,  48,  60,   0,  30,   0,  13,  53,  64,   6,   6,  69,   0,   0,   0,
-     18,   8,   9,  19,  19,   9,   9,   9,   9,   9,   9,   9,   9,   9,  41,  63,
-     18,  48,  48,  66,   0,  41,   0,  68,  53,  64,   6,   6,   0,   0,  16,   9,
-     71,   8,   9,   9,   9,  10,  16,   9,   9,   9,   9,   9,  22,   9,   9,  72,
-      9,  10,  74,  61,  18,  75,  18,  18,   0,  64,   6,   6,  71,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  57,  18,  39,   0,
-      0,  61,  18,  39,   6,   6,  76,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  57,  18,  18,  77,
-      0,   0,  18,  60,   6,   6,  76,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     17,   0,   0,   0,   0,   0,  60,   0,   6,   6,  76,   0,   0,  78,  57,  71,
-      9,   9,   8,   9,   9,   9,   9,   9,   9,   9,   9,  17,  28,  18,  18,  18,
-     18,  48,   9,  59,  18,  18,  28,  18,  18,  18,  18,  18,  18,  18,  18,  77,
-      0,  74,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  61,  18,  18,  18,  18,  39,
-      6,   6,  76,   0,   0,  71,  60,  71,  48,  65,  18,  60,  28,  77,   0,   0,
-     71,  18,  18,  29,   6,   6,  79,  60,   9,   9,   9,   9,   9,   9,   9,   9,
-      9,  22,   0,  72,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,  10,   9,
-      9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,
-      9,   9,  19,  55,   9,  10,  19,  55,   9,   9,   9,   9,   9,   9,   9,   9,
-      9,   9,  19,  55,   9,   9,   9,   9,   9,   9,   9,   9,  19,  55,   9,  10,
-     19,  55,   9,   9,   9,  10,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,
-      9,   9,   9,   9,  19,  55,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,
-      9,   9,   9,   9,   9,   9,  10,  28,   0,   0,   0,   0,   0,   0,   0,   0,
-      9,   9,   9,   9,   0,   0,   0,   0,   9,   9,   9,   9,   9,   9,   9,   9,
-      9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,  55,   9,  55,
-      8,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,
-      9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,
-      9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,
-      9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,  50,   9,   9,   9,   9,
-     80,   9,   9,   9,   9,   9,  10,   0,   9,   9,   9,   9,   9,   9,   9,   9,
-      9,   9,   9,   9,   9,   9,   9,   9,   9,   9,  10,  16,   9,   9,  17,   0,
-      9,   9,   9,  19,  53,  77,   0,   0,   9,   9,   9,   9,  53,  77,   0,   0,
-      9,   9,   9,   9,  53,   0,   0,   0,   9,   9,   9,  19,  81,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  18,  18,  18,
-     18,  18,  18,  18,  18,   0,   0,  57,   6,   6,  76,   0,   0,   0,   0,   0,
-      0,   0,  61,  82,   6,   6,  76,   0,   9,   9,   9,   9,   9,   9,   9,   9,
-      9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,  17,   0,
-      9,  83,   9,   9,   9,   9,   9,   9,   9,   9,  84,   0,   9,   9,   9,   9,
-      9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,  55,   0,   0,
-      9,   9,   9,   9,   9,   9,   9,  10,  18,  18,  18,   0,  18,  18,  18,   0,
-      0,  64,   6,   6,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   6,   6,  76,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      9,   9,   9,   9,   9,  41,  18,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,  28,  18,  39,  18,  18,  18,  18,  18,  18,  18,  65,
-      6,   6,  76,   0,   6,   6,  76,   0,   0,   0,   0,   0,  18,  18,  18,  39,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     18,  44,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,  18,  18,  18,
-     18,  44,   9,   0,   6,   6,  76,   0,   0,   0,  61,  18,  18,   0,   0,   0,
-     85,   9,   9,   9,   9,   9,   9,   9,  59,  18,  18,  24,   6,   6,  49,   9,
-      9,   9,   9,   9,   9,   9,   9,   9,   9,  53,  18,  18,  18,   0,   0,   0,
-      9,   9,   9,   9,   9,   9,   9,   9,   9,  18,  18,  18,  18,  18,   0,   0,
-      6,   6,  76,   8,   6,   6,  49,   9,   9,   9,   9,   9,   9,   9,   9,  55,
-      9,   9,  17,   0,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,  10,   8,
-      0,   0,   0,   0,  39,  18,  18,  18,  18,  18,  44,  52,   9,  47,  66,   0,
-      9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,
-     18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  29,  18,
-      9,   9,   9,   9,   9,  55,   9,  55,   9,   9,   9,   9,   9,   9,   9,   9,
-      9,  55,   9,  55,   9,   9,  25,  25,   9,   9,   9,   9,   9,   9,   9,  55,
-      9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,  19,   9,  26,
-     16,  19,   9,  17,   9,  16,   9,   0,   9,   9,   9,  17,  16,  19,   9,  17,
-     86,  87,  87,  88,   0,   0,  89,   0,   0,  90,  91,  92,   0,   0,   0,  11,
-     93,  94,   0,   0,   0,  93,   0,  95,  36,  96,  36,  36,  72,   0,   0,  68,
-      0,   0,   0,   0,   9,   9,   9,  17,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,  18,  18,  18,  18,  18,  18,  18,  18,  77,   0,   0,   0,
-     13,  68,  16,   9,   9,  72,   8,  55,   0,  26,  19,  22,   9,   9,  55,   9,
-      0,   8,  55,  13,   0,   0,   0,   0,   9,   9,   9,   9,   9,   9,   9,   9,
-      9,   9,  17,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  16,   9,   9,
-      9,   9,   9,   9,   9,   9,   9,   9,   9,   9,  55,   0,   0,   0,   0,   0,
-      9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,  10,   9,   9,   9,   9,
-      9,   9,   9,   9,   9,   9,   9,  10,   9,   9,   9,   9,   9,   9,   9,   9,
-      9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,
-      9,   9,   9,   9,   9,   9,   9,   9,   9,  17,  68,  41,  24,   0,   0,   0,
-      9,   9,   9,   9,   9,   9,   9,   9,   9,  22,   0,  72,   9,   9,   9,   9,
-      9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   0,  68,   0,   0,   0,  61,
-      9,   9,   9,   9,   9,  10,   0,   0,   9,  10,   9,  10,   9,  10,   9,  10,
-      9,  10,   9,  10,   9,  10,   9,  10,  18,  18,  18,  18,  18,  18,  18,  18,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  68,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     97,  72,   0,   0,   0,   0,   0,   0,   0,   0,  71,  18,  98,  99,  68,  17,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0, 100, 101, 102, 102, 102, 102, 102, 102, 102, 102,
-    102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 103, 102,
-      0,   8,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   8,   9,   9,   9,
-      9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,
-      9,   9,   9,  10,   0,   0,   0,   0,   9,   9,   9,   9,   9,   9,  10,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 102, 102, 102, 102,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 103,
-    102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102,
-    102, 102, 102, 102, 102, 102,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      9,   9,   9,  17,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,  55,
-      9,   9,   9,  17,   9,   9,   9,   9,   6,   6,  49,   0,   0,   0,   0,   0,
-      9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,  41,  39,  18,  18, 104,
-      9,   9,   9,   9,   9,   9,   9,  53,   9,   9,   9,   9,   9,   9,   9,   9,
-      9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,  60,   0,   0,   0,
-      0,   0,   0,   0,   0,  68,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,
-      9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,
-      9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,
-     16,  10,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  68,   9,   9,
-    105, 105,  41,   9,   9,   9,   9,   9,  41,  18,   0,   0,   0,   0,   0,   0,
-      9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   0,   0,   0,
-     24,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,  18,  18,  18,
-     18,  60,   0,   0,   6,   6,  76,   0,  18,  18,  18,  18,  24,   9,  68, 106,
-      6,   6,  49,   9,   9,   9,   9,   9,   9,  53,  18,  60,   9,   9,   9,   9,
-      9,  41,  18,  18,  18,   0,   0,   0,   9,   9,   9,   9,   9,   9,   9,  17,
-     18,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,  41,  18,  18,  18,
-     77,   0,   0,  68,   6,   6,  76,   0,   0,  57,   0,   0,   6,   6,  76,   0,
-      9,   9,   9,   9,   9,   9,   9,   9,   9,   9,  59,  18,  18,  39,   0,   0,
-     41,   9,   9,  60,   6,   6,  76,   0,   0,   0,   0,   0,   0,   0,  61,  60,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  48,  65,  77,  71,
-     57,   0,   0,   0,   0,   0,   0,   0,   9,   9,  41,  18,  16, 107,   0,   0,
-      8,  10,   8,  10,   8,  10,   0,   0,   9,  10,   9,  10,   9,   9,   9,   9,
-      9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   0,   0,   9,   9,   9,   9,
-      9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,
-      9,   9,   9,   9,   9,   9,   9,   9,  41,  18,  39,  60,   6,   6,  76,   0,
-      9,   9,   9,   9,   9,   9,   9,   9,   9,   0,   0,   0,   9,   9,   9,   9,
-      9,  10,  68,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   0,
-      9,  10,   0,   0,  68,   9,   0, 108,  31,  31, 109,  31,  31,  32,  31, 110,
-    111, 109,  31,  31,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,
-      9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,  55,   0,   0,   0,
-      0,   0,   0,   0,  68,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,
-      9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,  55,
-      0,   0,   0,   0,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,
-      9,   9,   9,   9,  16,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,
-      9,   9,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   9,   9,   9,   0,
-     18,  18,  18,  18, 112,  94,   0,   0,  18,  18,  18,  18,  11,  93,   0,   0,
-      0,   0,   0, 113,   5, 114,   0,   0,   0,   0,   0,   0,   9,  19,   9,   9,
-      9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,
-      9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9, 115,
-      0, 116,   0,   5,   6,   6,   7,   0,   8,   9,   9,   9,   9,   9,  10,  11,
-      8,   9,   9,   9,   9,   9,  10,   0,   0, 117, 102, 102, 102, 102, 102, 102,
-    102, 102, 102, 102, 102, 102, 102, 118,   9,   9,   9,   9,   9,   9,   9,  10,
-     16,   9,  16,   9,  16,   9,  16,  17,   0,   0,   0,   0,   0,   0, 119,   0,
-      9,   9,   9,   8,   9,   9,   9,   9,   9,  10,   9,   9,   9,   9,  10,  22,
-      9,   9,   9,  55,   9,   9,   9,  55,   0,   0,   0,   0,   0,   0,   0,   0,
-      9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,
-      9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,  10,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,  17,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  57,
-      9,   9,   9,   9,   9,   9,   9,  17,   9,   9,   9,   9,   9,   9,   9,   9,
-      9,   9,   9,   9,  17,   0,   0,   0,  77,   0,   0,   0,   0,   0,   0,   0,
-      9,   9,   9,   9,   9,   9,   9,   9,   0,   0,   0,   8,   9,   9,   9,   9,
-      9,   9,  10,   0,   9,   9,   9,   9,   9,   9,   9,   9,   9,  53,  39,   0,
-      9,   9,   9,   9,   9,   9,   9,  55,   9,   9,   9,   9,   9,   9,   9,   9,
-      9,   0,   9,   9,   8,  55,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      9,   9,   9,   9,   9,   9,   9,  55,   6,   6,  76,   0,   9,   9,   9,   9,
-      9,   9,   9,   9,   9,   0,   9,   9,   9,   9,   9,   9,   9,   9,   9,   0,
-      9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   0,   0,   9,   9,   9,   9,
-      9,   9,   9,   9,   9,   9,   9,   9,   9,   0,   0,   0,   0,   0,   0,   0,
-      9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,  10,   0,   0,
-      9,   9,   9,   9,   9,  55,   0,   0,   9,   9,   0,   0,   0,   0,   0,   0,
-      9,  55,  19,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,  22,  17,  50,
-      9,   9,   9,   9,   9,  55,   0,   0,   9,   9,   9,   9,   9,  10,   0,   0,
-      9,   9,   9,   9,   9,   9,   9,  10,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   9,   9,   9,   9,  10,  55,   0,   0,
-      9,   9,   9,   9,   9,  55,   0,   0,   9,   9,   9,   9,   9,   9,  55,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   0,  16,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     59,  30,   0,  18,   9,   8,   8,   9,   9,   9,   9,   9,   9,  55,  39,  61,
-      0,   0,   0,   0,   0,   0,   0,   0,   9,   9,   9,   9,   9,   9,   9,  17,
-      9,   9,   9,   9,   9,   9,   9,  17,   0,   0,   0,   0,   0,   0,   0,   0,
-      9,   9,   8,   9,   9,   9,   9,   9,   9, 107,   0,   0,   0,   0,   0,   0,
-      9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,  55,   0,   0,
-      9,   9,   9,   9,   9,  55,   0,   0,   9,   9,   9,   9,  10,   0,   0,   0,
-      9,   9,   9,   9,  55,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,
-      9,   9,  17,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,  10,   0,   0,   0,
-      9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,  10,   0,   0,   0,
-      9,   9,   9,   9,   9,   9,   9,   9,   9,  18,   0,   0,   6,   6,  76,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      9,   9,   9,   9,   9,   9,   9,  17,   0,  68,   0,   0,   9,   9,   9,   9,
-      9,  53,  18,  18,  77,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   9,   9,   9,   9,   9,  10,   0,   0,
-     85,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,  18,  18,
-     18,  39,   0,   0,   0,   0,   0,   0,   0,  64,   6,   6,   0,   0,   0,  61,
-     85,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,  18,  18,  39,  14,
-      0,   0,   0,  14,   9,   9,   9,   9,   9,   9,  17,   0,   6,   6,  76,   0,
-     85,   9,   9,   9,   9,   9,   9,   9,   9,  41,  18,  18,  18, 120,   6,   6,
-      0, 107,   0,   0,   9,   9,   9,   9,   9,   9,   9,   9,  41,  13,   0,   0,
-     85,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,  41,  18,  18,  18,
-     44,  17,  28,  77,   6,   6, 121,  17,   0,   0,   0,   0,   0,   0,   0,   0,
-      9,   9,   9,   9,  22,   9,   9,   9,   9,   9,   9,  18,  18,  18,   0,  74,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      9,  10,  19,  22,   9,   9,   9,  22,   9,   9,  17,   0,   9,   9,   9,   9,
-      9,   9,   9,   9,   9,   9,   9,  41,  18,  18,  39,   0,   6,   6,  76,   0,
-     18,   8,   9,  50,  50,   9,   9,   9,   9,   9,  19,   9,  19,   8,  23,  63,
-     18,  65,  65,  60,  17,  61,   0,   8,  53,  71,  18,  77,  18,  77,   0,   0,
-      9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,  59,  18,  18,
-     18,  85,  10,   0,   6,   6,  76,  73,   0,   0,   0,   0,   0,   0,   0,   0,
-      9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,  18,  18,  18,  18,
-     18,  22,   0,   0,   6,   6,  76,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,  41,  18,  60,  18,  18,
-     77,   0,   0,   0,   0,   0,   9,  60,   0,   0,   0,   0,   0,   0,   0,   0,
-      9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,  18,  18,  18,  18,
-     77,  17,   0,   0,   6,   6,  76,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      9,   9,   9,   9,   9,   9,   9,   9,   9,   9,  41,  18,  18,  18,  17,   0,
-      6,   6,  76,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,  28,  18,  18,  18,   0,   6,   6,  76,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,  18,  18,  18,  39,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   9,   9,   9,   9,   9,   9,   9,   9,
-      9,   9,   9,   9,   9,   9,   9,   9,   6,   6,  76,   0,   0,   0,   0,  68,
-      0,   0,   0,   0,   0,   0,   0,   0,   9,   9,  16,   9,   9,   9,   9,   9,
-      9,   9,   9,   9,  59,  18,  71,  18, 122,  77,   0,   0,   0,   0,   0,   0,
-     59,  18,  85,   9,   9,   9,   9,   9,   9,   9,   9,   9,  41,  18,  58,  39,
-      0,  61,   0,   0,  59,  18,  18,   9,   9,   9,   9,   9,   9,   9,   9,   9,
-      9,   9,  53,  18,  18,  18,  60,  72,   0,   0,   0,   0,   0,   0,   0,   0,
-      9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,  17,   0,
-      9,   9,  19,   9,   9,   9,   9,   9,   9,   9,   9,  41,  18,  39,  18,  18,
-     17,   0,   0,   0,   6,   6,  76,   0,   0,   0,   0,   0,  16,   9,   9,   9,
-      9,   9,   9,   9,  71,  18,  18,  18,  18,  18,  28,  18,  18,  39,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      9,  10,  22,   9,   9,   9,   9,   9,   9,   9,   9,   9,  59,  39,  74,  29,
-     18,  58,   0,   0,   6,   6,  76,   0,   9,  22,  19,   9,   9,   9,   9,   9,
-      9,   9,  53,  39,  29,  18,  17,   0,   6,   6,  76,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   9,   9,   9,   9,  41,  39,   0,   0,
-      9,   9,   9,   9,   9,   9,  55,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,
-      9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,  10,   0,   0,   0,   0,
-      9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,
-      9,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,  10,  36,  36,  40,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,
-      9,  10,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,  17,   0,
-      9,   9,   9,   9,   9,   9,   9,  10,   6,   6,  76,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   9,   9,   9,   9,   9,   9,   9,  55,  18,  77,   0,   0,
-      9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,  18,  39,   0,   0,
-      9,   0,   0,   0,   6,   6,  76,   0,  68,   9,   9,   9,   9,   9,   0,   8,
-      9,   9,   9,   9,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,
-      9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,
-      9,   9,  10,  61,  59,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,
-     18,  18,   0,  61,  85,   9,   9,   9,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,  22,   0,   0,   0,   0,   0,   0,   0,
-    101,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0, 102,   0,   0,   0,   0,   0,   0,
-      9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,
-      9,   9,   9,   9,   9,   9,   9,   9,   9,   9,  10,   0,   9,   9,   9,  17,
-      9,   9,  17,   0,   9,   9,  55,  30,  36,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,  28,  60,  28, 123,  36, 124,  18,
-     39,  28,  18,   0,   0,   0,   0,   0,   0,   0,  71,  60,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     71,  77,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,
-      9,   9,   9,   9,   9,  19,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,
-      9,   9,   9,   9,   9,   9,   9,  19,  13,  69,   8,  19,   9,   9,  22,   8,
-      9,   8,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,
-      9,  22,  10,   8,   9,  19,   9,  19,   9,   9,   9,   9,   9,   9,  22,  10,
-      9,  26,  16,   9,  19,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,
-      9,   9,   9,   9,   9,   9,   9,   9,   9,  55,   9,   9,   9,   9,   9,   9,
-     19,   9,   9,   9,   9,   9,  10,   9,   9,   9,   9,   9,   9,   9,  10,   9,
-      9,   9,   9,   9,   9,  19,   9,   9,   9,   9,   9,   9,   9,  19,   9,   9,
-      9,   9,   9,  10,   9,   9,   9,   9,   9,   9,   9,  10,   9,   9,   9,   9,
-      9,   9,  19,   9,   9,   9,   9,   9,   9,   9,  19,   9,   9,   9,   9,   9,
-     10,   9,   9,  64,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,
-     18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  39,  61,  18,
-     18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  77,   0,  57,   0,   0,
-      0,  77,   0,   0,   0,   0,  61,  18,  28,  18,  18,  18,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     18,  39,  18,  18,  18,  18,  65,  18,  29,  48,  39,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,  17,  18,  85,   9,  55,
-      6,   6,  76,  13,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,  18,   6,   6,  76,   0,
-      9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,
-      9,  17,   0,   0,  18,  39,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,
-      9,  18,  85,   0,   6,   6,  76,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      9,   8,   9,   9,   9,   9,   9,   9,  69,  50,   8,   9,  10,   9,  25,   0,
-     13,  68,  25,   8,  69,  50,  25,  25,  69,  50,  10,   9,  10,   9,   8,  26,
-      9,   9,  22,   9,   9,   9,   9,   0,   8,   8,  22,   9,   9,   9,   9,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   9,   9,   9,   9,
-      9,   9,  55,   0,   9,   9,   9,   9,   9,   9,  55,   0,   9,   9,   9,   9,
-      9,   9,  55,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0, 125, 126, 126, 126, 126, 126, 126,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  61,  18,
-     14,   0,   0,   0,   0,   0,   0,   0,  18,  18,  18,  18,  18,  18,  18,  18,
-     18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,
-     18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,
-     18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,
-     18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,
-     18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,   0,   0,   0,   0,
-};
-
-static RE_UINT8 re_word_break_stage_4[] = {
-     0,  0,  0,  0,  0,  0,  5,  6,  6,  4,  0,  0, 18,  0,  1,  0,
-     0,  0,  0,  2, 13,  0, 14,  0, 15, 15, 15, 15, 15, 15, 12, 13,
-     0, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,  0,  0,  0,  0, 16,
-     0,  6,  0,  0,  0,  0, 11,  0,  0,  9,  0,  0,  0, 11,  0, 12,
-     0,  0, 11, 11, 11,  0,  0,  0,  7,  7,  7,  7, 11,  0, 11, 11,
-    11, 11, 13, 11,  0,  0, 11, 12, 11, 11,  0, 11, 11, 11,  0,  7,
-     7,  7, 11, 11,  0, 11,  0, 11, 11,  0, 11,  0, 11, 13,  0,  0,
-     0,  7,  7,  7,  7,  7,  0,  7,  0,  7,  7,  0,  3,  3,  3,  3,
-     3,  3,  3,  0,  0,  0,  0,  3,  3,  3,  3, 11, 12,  0,  0,  0,
-     9,  9,  9,  9,  9,  9,  0,  0, 13, 13,  0,  0,  7,  7,  7,  0,
-     9,  0,  0,  0, 11, 11, 11,  7, 15, 15,  0, 15, 13,  0, 11, 11,
-     7, 11, 11, 11,  0, 11,  7,  7,  7,  9,  0,  7,  7, 11, 11,  7,
-     7,  0,  7,  7, 15, 15, 11, 11, 11,  0,  0, 11,  0,  0,  0,  9,
-    11,  7, 11, 11, 11, 11,  7,  7,  7, 11,  0,  0, 11, 11,  0,  0,
-    13,  0, 11,  0,  0,  7,  0,  0,  7,  7, 11,  7, 11,  7,  7,  7,
-     7,  7,  0,  0,  0,  0,  0,  7,  7,  7,  9,  7,  7, 11,  7,  7,
-     0,  0, 15, 15,  7,  0,  0,  7,  7,  7, 11,  0, 11,  0,  7,  0,
-     0,  0,  0, 11,  0, 11, 11,  0, 11,  7,  0,  0,  0,  0,  7,  7,
-     0, 11,  0,  0,  0,  0,  7, 11,  0,  0,  7,  0,  7,  0,  7,  0,
-    15, 15,  0,  0,  7,  0,  0,  0,  0,  7,  0,  7, 15, 15,  7,  7,
-    18, 11, 11, 11, 11,  0,  7,  7,  7,  7,  9,  0, 11,  7,  7, 11,
-    11,  7, 11,  0,  7,  7,  7, 11, 18, 18, 18, 18, 18, 18, 18,  0,
-     7, 17,  9,  9, 14, 14,  0,  0, 14,  0,  0, 12,  6,  6,  9,  9,
-     9,  9,  9, 16, 16,  0,  0,  0, 13,  0,  0,  0,  0,  0,  0, 18,
-     9,  0,  9,  9, 18,  0,  0,  0,  0, 10, 10, 10, 10, 10,  0,  0,
-     0,  7,  7, 10, 10,  0,  0,  0, 10, 10, 10, 10, 10, 10, 10,  0,
-     7,  7,  0, 11, 11, 11,  7, 11,  0, 11, 11,  7, 11,  7,  7,  0,
-     0,  3,  7,  3,  3,  0,  3,  3,  3,  0,  3,  0,  3,  3,  0,  3,
-    13,  0,  0, 12,  0, 16, 16, 16, 13, 12,  0,  0, 11,  0,  0,  9,
-     0,  0,  0, 14,  0,  0, 10, 10, 10, 10,  7,  7,  0,  9,  9,  9,
-     7,  0, 15, 15, 15, 15, 11,  0,  7, 11,  0, 11,  7,  7,  7,  9,
-     9,  9,  9,  7,  0,  0,  8,  8,  8,  8,  8,  8,
-};
-
-/* Word_Break: 7116 bytes. */
-
-RE_UINT32 re_get_word_break(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-
-    f = ch >> 12;
-    code = ch ^ (f << 12);
-    pos = (RE_UINT32)re_word_break_stage_1[f] << 5;
-    f = code >> 7;
-    code ^= f << 7;
-    pos = (RE_UINT32)re_word_break_stage_2[pos + f] << 5;
-    f = code >> 2;
-    code ^= f << 2;
-    pos = (RE_UINT32)re_word_break_stage_3[pos + f] << 2;
-    value = re_word_break_stage_4[pos + code];
-
-    return value;
-}
-
-/* Grapheme_Cluster_Break. */
-
-static RE_UINT8 re_grapheme_cluster_break_stage_1[] = {
-     0,  1,  2,  3,  4,  4,  4,  4,  4,  4,  5,  6,  7,  8,  4,  9,
-    10, 11,  4, 12,  4,  4, 13,  4,  4,  4,  4, 14,  4, 15, 16, 17,
-     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
-     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
-     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
-     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
-     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
-     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
-     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
-     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
-     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
-     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
-     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
-     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
-    18,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
-     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
-     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
-};
-
-static RE_UINT8 re_grapheme_cluster_break_stage_2[] = {
-      0,   1,   2,   3,   3,   3,   3,   3,   3,   3,   3,   3,   4,   5,   3,   3,
-      3,   3,   6,   3,   3,   3,   7,   8,   9,  10,   3,  11,  12,  13,  14,  15,
-     16,  17,   3,  18,  19,  20,  21,  22,  23,  24,  23,  25,  26,  27,  28,  29,
-     30,  31,  32,  33,  34,  35,  36,  37,  38,  39,  40,  41,  42,  43,  44,  45,
-     46,  47,  48,   3,  49,  50,  51,  52,   3,   3,   3,   3,   3,  53,   3,   3,
-      3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,  54,  55,  56,  57,
-     58,   3,  59,   3,  60,   3,   3,   3,  61,  62,  63,   3,  64,  65,  66,  67,
-     68,   3,   3,  69,   3,   3,   3,  70,   3,   3,   3,   3,   3,   3,   3,   3,
-     71,  72,   3,  73,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,
-      3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,
-      3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,
-      3,   3,   3,  74,   3,  75,   3,  76,   3,   3,   3,   3,   3,   3,   3,   3,
-     77,   3,  78,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,
-      3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,
-      3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,
-      3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,
-      3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,
-      3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,
-      3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,
-      3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,
-      3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,
-      3,   3,   3,   3,   3,   3,   3,   3,   3,  79,  80,  81,   3,   3,   3,   3,
-     82,   3,  83,  84,  85,  86,  87,  88,  89,  90,  91,  92,   3,   3,   3,  93,
-     94,  95,  96,  97,  98,  99, 100,  94,  95,  96,  97,  98,  99, 100,  94,  95,
-     96,  97,  98,  99, 100,  94,  95,  96,  97,  98,  99, 100,  94,  95,  96,  97,
-     98,  99, 100,  94,  95,  96,  97,  98,  99, 100,  94,  95,  96,  97,  98,  99,
-    100,  94,  95,  96,  97,  98,  99, 100,  94,  95,  96,  97,  98,  99, 100,  94,
-     95,  96,  97,  98,  99, 100,  94,  95,  96,  97,  98,  99, 100,  94,  95,  96,
-     97,  98,  99, 100,  94,  95,  96,  97,  98,  99, 100,  94,  95,  96,  97,  98,
-     99, 100,  94,  95,  96,  97,  98,  99, 100,  94,  95,  96,  97,  98,  99, 100,
-     94,  95,  96,  97,  98,  99, 100,  94,  95,  96,  97,  98,  99, 100,  94,  95,
-     96,  97,  98,  99, 100,  94,  95,  96,  97,  98,  99, 100,  94,  95,  96,  97,
-     98,  99, 100,  94,  95,  96,  97,  98,  99, 100,  94,  95,  96,  97,  98,  99,
-    100,  94,  95,  96,  97,  98,  99, 100,  94,  95,  96,  97,  98,  99, 101, 102,
-      3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,
-      3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,
-      3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,
-      3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,
-      3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3, 103,   3,   3,   3,
-      3,   3,   3,   3,   3,   3,   3,   3, 104,   3,   3,   1,   3,   3,  80, 105,
-      3,   3,   3,   3,   3,   3,   3, 106,   3,   3,   3, 107,   3, 108,   3,   3,
-      3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,
-      3,   3,   3,   3,   3,   3,   3,   3, 109,   3,   3, 110,   3,   3,   3,   3,
-      3,   3,   3,   3, 111,   3,   3,   3,   3,   3,   3,   3,   3, 112,   3,   3,
-    113, 114, 115, 116, 117, 118, 119, 120, 121,   3,   3, 122,  34, 123,   3,   3,
-    124, 125, 126, 127,   3,   3, 128, 129, 130, 131, 132,   3, 133,   3,   3,   3,
-    134,   3,   3,   3,   3,   3,   3, 135, 136, 137, 138,   3,   3,   3,   3,   3,
-    139,   3, 140,   3, 141, 142, 143,   3,   3,   3,   3, 144,   3,   3,   3,   3,
-      3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,
-    145,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,
-      3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,
-      3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,
-      3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,
-      3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,
-      3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3, 146, 147,   3,   3,   3,
-      3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3, 148, 149,   3,
-      3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,
-      3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,
-      3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,
-      3,   3, 150,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,
-      3,   3,   3,   3,   3, 151, 152,   3,   3, 153,   3,   3,   3,   3,   3,   3,
-      3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,
-      3,   3,   3,   3,   3,   3,   3,   3, 154, 155, 156,   3,   3,   3,   3,   3,
-      3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,
-    157,   3,   3,   3, 147,   3,   3,   3,   3,   3,   3, 158,   3,   3,   3,   3,
-      3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,
-      3,   3,   3, 159,   3, 160,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,
-      3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,
-      3,   3,   3,   3,   3,   3,   3, 161,   3,   3,   3,   3,   3,   3,   3, 162,
-      3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,
-      3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,
-      3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,
-    163,   4, 164, 164,   4,   4,   4, 165, 164, 164, 164, 164, 164, 164, 164, 164,
-    164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-    164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-    164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-};
-
-static RE_UINT8 re_grapheme_cluster_break_stage_3[] = {
-      0,   1,   0,   0,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   3,
-      0,   0,   0,   0,   2,   4,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
-      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   2,   2,
-      6,   7,   2,   2,   2,   2,   2,   2,   2,   2,   8,   5,   5,   5,   5,   9,
-     10,   2,   2,   2,   2,   2,   2,   2,  11,   2,   5,  12,   2,   2,   2,   2,
-      2,   6,   5,   5,   2,   2,  13,   2,   2,   2,  14,  15,  16,  17,   2,   2,
-      2,  18,  19,   2,   2,   2,   5,   5,   5,  20,   2,   2,   2,   2,   2,   2,
-      2,   2,   2,   2,  14,   5,  13,   2,   2,   2,   2,   2,   2,   6,  21,  22,
-      2,   2,  14,  23,  24,  25,   2,   2,   2,   2,   2,  26,   2,   2,   2,   2,
-      2,   2,   6,   5,  27,   5,   5,   5,  28,   2,   2,   2,   2,   2,   2,  29,
-     30,  31,   8,   2,  32,   2,   2,   2,  33,   2,   2,   2,   2,   2,   2,  34,
-     35,  36,  37,   2,  32,   2,   2,  38,  39,   2,   2,   2,   2,   2,   2,  40,
-     41,  42,  19,   2,   2,   2,  43,   2,  44,  45,   2,   2,  32,   2,   2,  46,
-     33,   2,   2,   2,   2,   2,   2,  47,  35,  36,  14,   2,  32,   2,   2,   2,
-     48,   2,   2,   2,   2,   2,   2,  49,  50,  51,  37,   2,   2,   2,   2,   2,
-     52,   2,   2,   2,   2,   2,   2,  14,  53,  17,  54,   2,  32,   2,   2,   2,
-     33,   2,   2,   2,   2,   2,   2,  55,  56,  57,  54,   2,  32,   2,   2,   2,
-     58,   2,   2,   2,   2,   2,   2,  59,  60,  61,  37,   2,  32,   2,   2,   2,
-     62,   2,   2,   2,   2,   2,   2,   2,   2,  63,  64,  65,   2,   2,  62,   2,
-      2,   2,   2,   2,   2,   2,  66,  20,  37,  67,   2,   2,   2,   2,   2,   2,
-      2,   2,   2,   2,   2,   2,  66,  68,   2,  69,   2,   2,   2,   2,   2,   2,
-      2,   2,   2,   7,   2,   2,  70,  71,   2,   2,   2,   2,   2,   2,   8,  72,
-     73,  74,   5,   8,   5,   5,   5,  68,  38,   2,   2,   2,   2,   2,   2,   2,
-      2,   2,   2,   2,   2,  74,  75,  76,   2,   2,  77,  78,  13,   2,  79,   2,
-     80,  22,   2,  22,   2,   2,   2,   2,  81,  81,  81,  81,  81,  81,  81,  81,
-     81,  81,  81,  81,  82,  82,  82,  82,  82,  82,  82,  82,  82,  83,  83,  83,
-     83,  83,  83,  83,  83,  83,  83,  83,   2,   2,   2,  74,   2,   2,   2,   2,
-      2,   2,  84,   2,   2,   2,  84,   2,   2,   2,  32,   2,   2,   2,  32,   2,
-      2,   2,   2,   2,   2,   2,  85,  86,  87,  30,  21,  22,   2,   2,   2,   2,
-      2,  88,   2,   2,   2,   2,   2,   2,  54,   2,   2,   2,   2,  19,   2,   2,
-      2,   2,   2,   2,  89,  90,  91,  92,   2,   2,  37,  93,   2,   2,   2,   2,
-      2,   2,  94,  67,  95,  96,  97,  16,   2,   2,   2,   2,   2,   2,   5,  67,
-     98,   2,   2,   2,   2,   2,  99, 100, 101,   2,   2,   2,   2,   6,  21,   2,
-    102,   2,   2,   2, 103, 104,   2,   2,   2,   2,   2,   2,  49, 105,  58,   2,
-      2,   2,   2,   2, 106, 107, 108,   2,   2,   2, 109,   5,  75, 110, 111,   7,
-      5,   5,   5,   5,   5,   5,   5,  23,   2, 112,   2,   2,   2, 113,   2,   2,
-      2,   2,   2,   2,   0,   0,   2,   2,   2,   2,   5,   5,   5,   5,  13,   2,
-      2,   2,   2,   2,   2,  37,   7,   2,   2,   2,   2,   2,   2,   2,   2,  37,
-      2,   2,   2,   2,   5,   5,   5,   5,   2,   2,   2,   2,   2,  46,   2,   2,
-      2,   2,   2, 114,   2,   2,   2,   2,   2,   2,   2,   2,   2,  37, 109,  69,
-      2,   2,   2,  14,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   7,   2,
-    115, 116,   2,   2, 117,   2,   2,   2, 118,   2,   2,   2,   2,   2, 106, 119,
-    120,   2,   2,   2,   5,   5,   7,  37,   2,   2,   2,   2,  14,  69,   2,   2,
-     37,   5,  58,   2,  81,  81,  81, 121,  28,   2,   2,   2,   2,   2, 122, 123,
-    124,   2,   2,   2,  22,   2,   2,   2,   2,   2,   2,   2,   2, 125, 126,   2,
-    116, 127,   2,   2,   2,   2,   2, 128,   2,   2,   2,   2,   2,   2, 129, 130,
-     19,   2,   2,   2,   2, 131, 132,   2,   2,   2,   2,   2, 133, 134,   2,   2,
-    135, 136, 136, 137, 136, 136, 136, 135, 136, 136, 137, 136, 136, 136, 135, 136,
-    136, 137, 136, 136, 136, 135, 136, 136, 137, 136, 136, 136, 135, 136, 136, 137,
-    136, 136, 136, 135, 136, 136, 137, 136, 136, 136, 135, 136, 136, 137, 136, 136,
-    136, 135, 136, 136, 137, 136, 136, 136, 136, 135, 136, 136, 138,   2,  82,  82,
-    139, 140,  83,  83,  83,  83,  83, 141,   2,   2,   2,  38,   2,   2,   2,   2,
-      5,   5,   2,   2,   5,   5,   2,   2,   2,   2,   2,   2,   2,   2,   0, 142,
-      2,   2,   2,   2,   2,   2,   2,  22,   2,   2,   2,   2,  13,   2,   2,   2,
-      2,   2,   2,   2,   2,   2,  14,  20, 143,  99,   2,   2,   2,   2,   2, 144,
-      2,   2,   2,   2,  54,   2,   2,   2,   2,   2,   2,   2,  99,   2,   2,   2,
-     14,   5,  13,   2,   2,   2,   2,   2, 145,   2,   2,   2,   2,   2,   2,   5,
-     67,   2,   2,   2,   2,   2,   2,  37, 102,   2,   2,   2,   2,   2, 146, 147,
-      2, 148,   2,   2,   2,   2,   2,   2,  20,   2,   2,   2,  37, 149,  68,   2,
-    150,   2,   2,   2,   2,   2, 116,   2, 102,   2,   2,   2,   2,   2, 151,  72,
-    152,  79,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2, 153, 154,  38,
-      2,   2,   2,  37,  97,  20,   2,   2, 155, 156,  37,   2, 157,  68,  68,   2,
-      2,   2,   2,   2,   2,   2, 158,   5, 159,   2,   2,  38,   2,   2,   2,   2,
-      2,   2,   2,   2,   2,   2, 160, 161, 162,   2,   2,   2,   2,   2,   2,   2,
-      2,   2,   2,   2,   2,  37, 163, 164,  13,   2,   2, 165,   2,   2,   2,   2,
-      2,   2,   2,   2,   2,   2,  97, 166,  13,   2,   2,   2,   2,   2,   2,   2,
-      2,   2,   2,   2,   2, 167, 168,   2,   2,   2,   2,  74, 169,  21,   2,   2,
-      2,   2,   2,   2,   2, 153,   5, 170,   2,   2, 171, 172, 173,   2,   2,   2,
-      8,  20,   2,   2,   2,   2,   6, 174,  37,   2, 125,  92,   2,   2,   2,   2,
-    175, 176,  72,   7,   2,   2,   2,   2,   2,   2,   2,   2,   2, 177,  67, 168,
-      2,   2,  46,   5,   5, 178, 179,   2,   2,   2,   2,   2,   2,   2, 180, 181,
-    182,   2,   2,   2,   2,   2,   2,   2,   2, 183, 184,   2,   2,   2,   2,   2,
-      2,   2,   2,   2,   2,   2, 185,   2,   2,   2,   2,   2,   2,   2,   0, 186,
-      2,   2,   2,   2,   2,   2,  68,   2,   2,   2,   2,   2,   2,   2,  67,   2,
-      2,  37, 187, 119, 119, 119, 119, 119, 119,  37,  20,   2,   2,   2,   2,   2,
-      2,   2,   2,  54, 142,   2,   2,   2,   2,   2,   2,   2, 188, 189, 190, 191,
-    192,  21,   2,   2,   2, 193,   2,   2,  84,   2,   2,   2,   2,   2,   2,   2,
-      5,   5,   5,   5,   5,   5,  67,   6,   5,   5,   5,   5,   5,  68,  22,   2,
-    128,   2,   2,   6,   8,   5,   2,   2,  67,   5,   5, 194, 195,  20,   2,   2,
-      2,   2,   2,   2,   2,  99,   2,   2,   2,   2,  67,   2,   2,   2,   2,   2,
-     99,  20,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2, 196, 197, 197, 197,
-      2,   2,   2,   2,   2,   2,   2,   6,   0,   0,   0,   0,   5,   5,   5,   5,
-      0,   0,   0,   0,   0,   0,   0,   0,   5,   5,   5,   5,   5,   5,   0,   0,
-};
-
-static RE_UINT8 re_grapheme_cluster_break_stage_4[] = {
-     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  3,  4,  4,  2,  4,  4,
-     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  4,
-     0,  0,  0,  0,  0,  4,  0,  0,  5,  5,  5,  5,  5,  5,  5,  5,
-     0,  0,  0,  5,  5,  5,  5,  5,  5,  5,  0,  0,  0,  0,  0,  0,
-     0,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  0,  5,
-     0,  5,  5,  0,  5,  5,  0,  5,  1,  1,  1,  1,  1,  1,  0,  0,
-     5,  5,  5,  0,  4,  0,  0,  0,  5,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0,  5,  5,  5,  5,  5,  5,  5,  1,  0,  5,
-     5,  5,  5,  5,  5,  0,  0,  5,  5,  0,  5,  5,  5,  5,  0,  0,
-     0,  0,  0,  0,  0,  0,  0,  1,  0,  5,  0,  0,  0,  0,  0,  0,
-     5,  5,  5,  0,  0,  0,  0,  0,  5,  5,  5,  5,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  5,  0,  0,  5,  5,  0,  5,  5,  5,  5,  5,
-     5,  5,  5,  5,  0,  5,  5,  5,  0,  5,  5,  5,  5,  5,  0,  0,
-     0,  5,  5,  5,  0,  0,  0,  0,  5,  5,  1,  5,  5,  5,  5,  5,
-     5,  5,  5,  7,  0,  0,  0,  0,  0,  0,  5,  7,  5,  0,  7,  7,
-     7,  5,  5,  5,  5,  5,  5,  5,  5,  7,  7,  7,  7,  5,  7,  7,
-     0,  0,  5,  5,  0,  0,  0,  0,  0,  5,  7,  7,  0,  0,  0,  0,
-     0,  0,  0,  0,  5,  0,  5,  7,  7,  5,  5,  5,  5,  0,  0,  7,
-     7,  0,  0,  7,  7,  5,  0,  0,  0,  0,  0,  0,  0,  0,  0,  5,
-     0,  0,  0,  0,  0,  0,  5,  0,  0,  5,  5,  7,  0,  0,  0,  0,
-     0,  0,  0,  0,  5,  0,  7,  7,  7,  5,  5,  0,  0,  0,  0,  5,
-     5,  0,  0,  5,  5,  5,  0,  0,  5,  5,  0,  0,  0,  5,  0,  0,
-     7,  5,  5,  5,  5,  5,  0,  5,  5,  7,  0,  7,  7,  5,  0,  0,
-     0,  0,  5,  5,  5,  5,  5,  5,  0,  0,  0,  0,  5,  0,  5,  5,
-     0,  0,  5,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  5,  7,
-     5,  7,  7,  0,  0,  0,  7,  7,  7,  0,  7,  7,  7,  5,  0,  0,
-     5,  7,  7,  7,  5,  0,  0,  0,  5,  7,  7,  7,  7,  0,  5,  5,
-     0,  0,  0,  0,  0,  5,  5,  0,  0,  0,  0,  0,  5,  0,  7,  5,
-     7,  7,  5,  7,  7,  0,  5,  7,  7,  0,  7,  7,  5,  5,  0,  0,
-     5,  5,  7,  7,  0,  0,  0,  0,  0,  0,  0,  5,  5,  0,  5,  7,
-     7,  5,  5,  5,  5,  0,  7,  7,  7,  0,  7,  7,  7,  5,  1,  0,
-     0,  0,  7,  7,  0,  0,  0,  0,  0,  0,  5,  0,  0,  0,  0,  5,
-     7,  7,  5,  5,  5,  0,  5,  0,  7,  7,  7,  7,  7,  7,  7,  5,
-     0,  5,  0,  7,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  0,
-     5,  5,  5,  5,  5,  0,  0,  0,  5,  5,  5,  5,  5,  5,  0,  0,
-     0,  0,  0,  0,  0,  5,  0,  5,  0,  5,  0,  0,  0,  0,  7,  7,
-     5,  5,  5,  5,  5,  5,  5,  7,  5,  5,  5,  5,  5,  0,  5,  5,
-     0,  0,  0,  0,  0,  5,  5,  5,  5,  7,  5,  5,  5,  5,  5,  5,
-     0,  5,  5,  7,  7,  5,  5,  0,  0,  0,  0,  0,  0,  0,  7,  7,
-     5,  5,  0,  0,  0,  0,  5,  5,  0,  5,  5,  5,  5,  0,  0,  0,
-     0,  0,  5,  0,  7,  5,  5,  0,  8,  8,  8,  8,  8,  8,  8,  8,
-     9,  9,  9,  9,  9,  9,  9,  9, 10, 10, 10, 10, 10, 10, 10, 10,
-     0,  0,  5,  5,  5,  0,  0,  0,  0,  0,  0,  0,  5,  5,  7,  5,
-     5,  5,  5,  5,  5,  5,  7,  7,  7,  7,  7,  7,  7,  7,  5,  7,
-     0,  0,  0,  5,  5,  5,  4,  0,  5,  5,  5,  7,  7,  7,  7,  5,
-     5,  7,  7,  7,  0,  0,  0,  0,  7,  7,  5,  7,  7,  7,  7,  7,
-     7,  5,  5,  5,  0,  0,  0,  0,  5,  7,  7,  5,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  7,  5,  7,  5,  0,  5,  0,  0,  5,  5,  5,
-     5,  5,  5,  5,  5,  7,  7,  7,  7,  7,  7,  5,  5,  5,  5,  5,
-     5,  5,  5,  5,  7,  0,  0,  0,  0,  0,  0,  0,  5,  5,  5,  5,
-     5,  5,  5,  7,  5,  7,  7,  7,  7,  7,  5,  7,  7,  0,  0,  0,
-     5,  5,  7,  0,  0,  0,  0,  0,  0,  7,  5,  5,  5,  5,  7,  7,
-     5,  5,  7,  5,  5,  5,  0,  0,  5,  5,  7,  7,  7,  5,  7,  5,
-     0,  0,  0,  0,  7,  7,  7,  7,  7,  7,  7,  7,  5,  5,  5,  5,
-     5,  5,  5,  5,  7,  7,  5,  5,  5,  5,  5,  0,  5,  5,  5,  5,
-     5,  0,  0,  0,  0,  5,  0,  0,  0,  0,  0,  0,  5,  0,  0,  7,
-     0,  0,  0,  4,  5, 13,  4,  4,  4,  4,  4,  4,  4,  4,  4,  0,
-     0,  5,  5,  0,  0,  0,  0,  0,  0,  0,  5,  0,  0,  0,  5,  0,
-     0,  0,  0,  5,  0,  0,  0,  0,  0,  0,  0,  7,  7,  5,  5,  7,
-     7,  7,  0,  0,  0,  0,  0,  0,  7,  7,  7,  7,  7,  7,  7,  7,
-     7,  7,  7,  7,  5,  5,  0,  0,  8,  8,  8,  8,  8,  0,  0,  0,
-     0,  0,  0,  5,  7,  7,  5,  5,  5,  5,  7,  7,  5,  5,  7,  7,
-     7,  0,  0,  0,  0,  0,  0,  0,  0,  5,  5,  5,  5,  5,  5,  7,
-     7,  5,  5,  7,  7,  5,  5,  0,  0,  0,  0,  0,  5,  7,  0,  0,
-     0,  0,  0,  0,  5,  0,  0,  0,  5,  0,  5,  5,  5,  0,  0,  5,
-     5,  0,  0,  0,  0,  0,  5,  5,  0,  0,  0,  7,  5,  5,  7,  7,
-     0,  0,  0,  0,  0,  7,  5,  0,  0,  0,  0,  7,  7,  5,  7,  7,
-     5,  7,  7,  0,  7,  5,  0,  0, 11, 12, 12, 12, 12, 12, 12, 12,
-    12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 11, 12, 12, 12,
-    12, 12, 12, 12,  0,  0,  0,  0,  9,  9,  9,  9,  9,  9,  9,  0,
-     0,  0,  0, 10, 10, 10, 10, 10, 10, 10, 10, 10,  0,  0,  0,  0,
-     4,  4,  4,  4,  0,  0,  0,  0,  0,  5,  5,  5,  0,  5,  5,  0,
-     5,  5,  5,  0,  0,  0,  0,  5,  7,  5,  7,  0,  0,  0,  0,  0,
-     7,  7,  7,  5,  5,  5,  5,  7,  7,  5,  5,  0,  0,  1,  0,  0,
-     0,  0,  0,  0,  0,  1,  0,  0,  5,  5,  5,  5,  7,  5,  5,  5,
-     0,  0,  0,  0,  0,  7,  7,  0,  0,  0,  0,  7,  7,  7,  5,  5,
-     7,  0,  1,  1,  0,  0,  0,  0,  0,  0,  0,  0,  7,  7,  7,  5,
-     5,  5,  7,  7,  5,  7,  5,  5,  5,  7,  7,  7,  7,  0,  0,  7,
-     7,  0,  0,  7,  7,  7,  0,  0,  0,  0,  7,  7,  0,  0,  5,  5,
-     0,  0,  0,  0,  0,  7,  7,  7,  7,  7,  5,  5,  5,  7,  5,  0,
-     5,  7,  7,  5,  5,  5,  5,  5,  5,  7,  5,  7,  7,  5,  7,  5,
-     5,  7,  5,  5,  0,  0,  0,  0,  7,  7,  5,  5,  5,  5,  0,  0,
-     7,  7,  7,  7,  5,  5,  7,  5,  0,  0,  0,  0,  5,  5,  0,  0,
-     5,  5,  5,  7,  7,  5,  7,  5,  0,  0,  0,  5,  7,  5,  7,  7,
-     5,  5,  5,  5,  5,  5,  7,  5,  7,  7,  5,  5,  5,  5,  7,  5,
-     7,  5,  5,  0,  0,  0,  0,  0,  0,  7,  7,  7,  5,  5,  5,  5,
-     0,  0,  5,  5,  7,  7,  7,  7,  5,  0,  0,  0,  7,  0,  0,  0,
-     5,  7,  1,  5,  5,  5,  5,  0,  0,  0,  0,  0,  1,  1,  1,  1,
-     1,  1,  5,  5,  5,  5,  5,  5,  0,  0,  0,  0,  0,  0,  0,  7,
-     0,  7,  5,  5,  5,  5,  5,  5,  5,  7,  5,  5,  7,  5,  5,  0,
-     0,  5,  5,  5,  5,  5,  5,  0,  0,  0,  5,  0,  5,  5,  0,  5,
-     5,  5,  5,  5,  5,  5,  1,  5,  0,  0,  7,  7,  7,  7,  7,  0,
-     5,  5,  0,  7,  7,  5,  7,  5,  0,  0,  0,  5,  5,  7,  7,  0,
-     4,  0,  0,  0,  0,  0,  0,  0,  0,  7,  7,  7,  7,  7,  7,  7,
-     0,  0,  0,  0,  0,  5,  7,  5,  5,  5,  0,  0,  0,  7,  5,  5,
-     5,  5,  5,  4,  4,  4,  4,  4,  4,  4,  4,  5,  5,  5,  5,  5,
-     5,  5,  5,  0,  0,  5,  5,  5,  0,  0,  5,  5,  5,  5,  0,  0,
-     5,  0,  0,  5,  5,  5,  5,  5,  5,  5,  0,  5,  5,  0,  5,  5,
-     0,  0,  0,  0,  0,  0,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,
-};
-
-/* Grapheme_Cluster_Break: 4400 bytes. */
-
-RE_UINT32 re_get_grapheme_cluster_break(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-
-    f = ch >> 12;
-    code = ch ^ (f << 12);
-    pos = (RE_UINT32)re_grapheme_cluster_break_stage_1[f] << 6;
-    f = code >> 6;
-    code ^= f << 6;
-    pos = (RE_UINT32)re_grapheme_cluster_break_stage_2[pos + f] << 3;
-    f = code >> 3;
-    code ^= f << 3;
-    pos = (RE_UINT32)re_grapheme_cluster_break_stage_3[pos + f] << 3;
-    value = re_grapheme_cluster_break_stage_4[pos + code];
-
-    return value;
-}
-
-/* Sentence_Break. */
-
-static RE_UINT8 re_sentence_break_stage_1[] = {
-     0,  1,  2,  3,  4,  5,  6,  7,  7,  8,  7,  7,  7,  7,  7,  7,
-     7,  7,  7,  9, 10, 11,  7,  7,  7,  7, 12, 13, 13, 13, 13, 14,
-    15, 16, 17, 18, 19, 13, 20, 13, 21, 13, 13, 13, 13, 22,  7,  7,
-    23, 24, 13, 13, 13, 13, 25, 26, 13, 13, 27, 28, 29, 30, 31, 13,
-     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
-     7,  7,  7,  7, 32,  7, 33, 34,  7, 35,  7,  7,  7, 36, 13, 37,
+/* Bidi_Class. */
+static RE_UINT8 re_bidi_class_table_1[] = {
+     0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 13, 13,
+    13, 13, 13, 14, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 15, 16, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 17, 18,
+    19, 13, 20, 21, 22, 23, 24, 25, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 26, 27, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 28,
+    13, 13, 13, 13, 29, 30, 31, 13, 32, 13, 33, 34, 35, 36, 37, 38,
     13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
     13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
     13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 38,
     13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
     13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
     13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 38,
     13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
     13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
     13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 38,
     13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
     13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
     13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 38,
     13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
     13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
     13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 38,
     13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
     13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
     13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 38,
     13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
     13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
     13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 38,
     13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-    38, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
     13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
     13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 38,
     13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
     13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
     13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-};
-
-static RE_UINT8 re_sentence_break_stage_2[] = {
-      0,   1,   2,   3,   4,   5,   6,   7,   8,   9,  10,  11,  12,  13,  14,  15,
-     16,  17,  18,  19,  20,  21,  22,  23,  24,  25,  26,  27,  28,  29,  30,  31,
-     32,  33,  34,  34,  35,  36,  37,  38,  39,  34,  34,  34,  40,  41,  42,  43,
-     44,  45,  46,  47,  48,  49,  50,  51,  52,  53,  54,  55,  56,  57,  58,  59,
-     60,  61,  62,  63,  64,  64,  65,  64,  64,  66,  64,  64,  64,  64,  67,  68,
-     64,  64,  64,  69,  64,  64,  64,  64,  70,  71,  72,  73,  74,  64,  64,  64,
-     75,  76,  77,  78,  64,  64,  64,  64,  34,  34,  34,  34,  34,  34,  34,  34,
-     34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,
-     34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  79,  34,  34,  34,  34,
-     34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  80,
-     34,  34,  34,  34,  34,  34,  34,  34,  34,  81,  34,  34,  82,  83,  84,  85,
-     86,  87,  88,  89,  90,  91,  92,  93,  34,  34,  34,  34,  34,  34,  34,  34,
-     34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  94,
-     64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,
-     64,  64,  34,  34,  95,  96,  97,  98,  34,  34,  99, 100, 101, 102, 103, 104,
-    105, 106, 107, 108,  64, 109, 110, 111, 112, 113, 114,  64,  34,  34, 115,  64,
-    116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126,  64,  64,  64, 127, 128,
-    129, 130, 131, 132, 133, 134, 135,  64, 136, 137,  64, 138, 139, 140, 141,  64,
-    142, 143,  64, 144, 145, 146,  64,  64, 147, 148, 149, 150,  64, 151,  64,  64,
-     34,  34,  34,  34,  34,  34,  34, 152, 153,  34, 154,  64,  64,  64,  64,  64,
-     34,  34,  34,  34,  34,  34,  34,  34, 155,  64,  64,  64,  64,  64,  64,  64,
-     64,  64,  64,  64,  64,  64,  64,  64,  34,  34,  34,  34, 156,  64,  64,  64,
-     34,  34,  34,  34, 157, 158, 159, 160,  64,  64,  64,  64, 161, 162, 163, 164,
-     34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34, 165,
-     34,  34,  34,  34,  34, 166,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,
-     34,  34, 167,  34,  34, 168,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,
-     64,  64,  64,  64,  64,  64,  64,  64, 169, 170,  64,  64,  64,  64,  64,  64,
-     64,  64, 171, 172, 173,  64,  64,  64, 174, 175, 176, 177, 178, 179, 180, 181,
-     64,  64,  64,  64, 182, 183,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,
-    184,  64, 185,  64,  64, 186,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,
-     34, 187, 188,  64,  64,  64,  64,  64,  64,  64,  64,  64, 189, 190,  64,  64,
-     64,  64, 191, 192,  64,  64,  64,  64,  64,  64,  64,  64, 193,  64,  64,  64,
-     34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34, 194,  34,  34,
-     34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34, 195,  34,
-    196,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,
-     34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34, 197,  34,  34,
-     34,  34,  34,  34,  34,  34,  34, 198,  64,  64,  64,  64,  64,  64,  64,  64,
-     34,  34,  34,  34, 199,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,
-    200,  64, 201, 202,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,
-};
-
-static RE_UINT8 re_sentence_break_stage_3[] = {
-      0,   0,   1,   2,   0,   0,   0,   0,   3,   4,   5,   6,   7,   7,   8,   9,
-     10,  11,  11,  11,  11,  11,  12,  13,  14,  15,  15,  15,  15,  15,  16,  13,
-      0,  17,   0,   0,   0,   0,   0,   0,  18,   0,  19,  20,   0,  21,  19,   0,
-     11,  11,  11,  11,  11,  22,  11,  23,  15,  15,  15,  15,  15,  24,  15,  15,
-     25,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,  26,  26,
-     26,  26,  27,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,  28,  29,
-     30,  31,  32,  33,  28,  31,  34,  28,  25,  31,  29,  31,  32,  26,  35,  34,
-     36,  28,  31,  26,  26,  26,  26,  27,  25,  25,  25,  25,  30,  31,  25,  25,
-     25,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,  15,  33,  30,
-     26,  23,  25,  25,  15,  15,  15,  15,  15,  15,  15,  15,  15,  15,  15,  15,
-     15,  15,  15,  15,  15,  37,  15,  15,  15,  15,  15,  15,  15,  15,  38,  36,
-     39,  40,  36,  36,  41,   0,   0,   0,  15,  42,   0,  43,   0,   0,   0,   0,
-     44,  44,  44,  44,  44,  44,  44,  44,  44,  44,  44,  44,  44,  44,  44,  44,
-     44,  44,  44,  44,  44,  44,  44,  44,  44,  44,  44,  44,  25,  45,  46,  47,
-      0,  48,  22,  49,  32,  11,  11,  11,  50,  11,  11,  15,  15,  15,  15,  15,
-     15,  15,  15,  51,  33,  34,  25,  25,  25,  25,  25,  25,  15,  52,  30,  32,
-     11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  15,  15,  15,  15,
-     15,  15,  15,  15,  15,  15,  15,  15,  25,  25,  25,  25,  25,  25,  25,  25,
-     53,  44,  54,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,
-     28,  26,  26,  29,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,
-     25,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,  10,  11,  11,  11,
-     11,  11,  11,  11,  11,  22,  55,  56,  15,  15,  15,  15,  15,  15,  15,  15,
-     15,  15,  57,   0,  58,  44,  44,  44,  44,  44,  44,  44,  44,  44,  44,  59,
-     60,  59,   0,   0,  36,  36,  36,  36,  36,  36,  61,  62,  36,   0,   0,   0,
-     63,  64,   0,  65,  44,  44,  66,  67,  36,  36,  36,  36,  36,  36,  36,  36,
-     36,  36,  68,  44,  44,  44,  44,  44,   7,   7,  69,  70,  71,  36,  36,  36,
-     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,
-     36,  36,  36,  36,  36,  72,  44,  73,  44,  74,  75,  76,   7,   7,  77,  78,
-     79,   0,   0,  80,  81,  36,  36,  36,  36,  36,  36,  36,  44,  44,  44,  44,
-     44,  44,  66,  82,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,
-     36,  36,  36,  36,  36,  36,  36,  36,  36,  83,  44,  44,  84,   0,   0,   0,
-      7,   7,  77,  36,  36,  36,  36,  36,  36,  36,  68,  44,  44,  41,  85,  86,
-     36,  36,  36,  36,  36,  83,  87,  44,  44,  88,  88,  89,   0,   9,  90,  91,
-     36,  36,  36,  36,  36,  36,  88,   0,  36,  36,  61,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,  36,  36,  36,  36,  36,  92,  36,  41,
-      0,   0,   0,   0,  93,  44,  44,  44,  94,  44,  44,  44,  44,  44,  44,  44,
-     44,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  83,  95,
-     44,  44,  44,  44,  88,  44,  36,  36,  83,  96,   7,   7,  82,  36,  36,  36,
-     88,  82,  36,  78,  78,  36,  36,  36,  36,  36,  92,  36,  43,  40,  41,  95,
-     44,  97,  97,  98,   0,  93,   0,  99,  83, 100,   7,   7,  41,   0,   0, 101,
-     58,  82,  61,  62,  78,  36,  36,  36,  36,  36,  92,  36,  92, 102,  41,  75,
-     66,  93,  97,  89,  86,   0,  82,  43,   0, 100,   7,   7,  76, 103,   0,   0,
-     58,  82,  36,  99,  99,  36,  36,  36,  36,  36,  92,  36,  92,  82,  41,  95,
-     44,  59,  59,  89, 104,   0,   0,   0,  83, 100,   7,   7,   0,   0, 105,  44,
-     58,  82,  36,  78,  78,  36,  36,  36,  36,  36,  92,  36,  92,  82,  41,  95,
-     44,  97,  97,  89,   0, 106,   0,  99,  83, 100,   7,   7,  55,   0,   0,   0,
-    107,  82,  61,  40,  92,  41, 102,  92,  62, 104,  61,  40,  36,  36,  41, 106,
-     66, 106,  75,  89, 104,  93,   0,   0,   0, 100,   7,   7,   0,   0,   0,   0,
-     44,  71,  36,  92,  92,  36,  36,  36,  36,  36,  92,  36,  36,  36,  41, 105,
-     44,  75,  75,  89,   0,  60,  61,   0,  83, 100,   7,   7,   0,   0,   0,   0,
-     88,  82,  36,  92,  92,  36,  36,  36,  36,  36,  92,  36,  36,  82,  41,  95,
-     44,  75,  75,  89,   0,  60,   0, 108,  83, 100,   7,   7, 102,   0,   0,   0,
-     44,  82,  36,  92,  92,  36,  36,  36,  36,  36,  36,  36,  36,  36,  68,  95,
-     44,  75,  75,  98,   0,  68,   0,  62,  83, 100,   7,   7,   0,   0,  40,  36,
-    106,  82,  36,  36,  36,  61,  40,  36,  36,  36,  36,  36,  99,  36,  36,  55,
-     36,  61, 109,  93,  44, 110,  44,  44,   0, 100,   7,   7, 106,   0,   0,   0,
-     82,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  81,  44,  66,   0,
-     36,  68,  44,  66,   7,   7, 111,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-    102,  92,  61,  36,  36,  36,  36,  36,  36, 112,  36,  36,  81,  44,  44,  84,
-     36,  43,  44,  89,   7,   7, 111,  36,   0,   0,   0,   0,   0,   0,   0,   0,
-    104,   0,   0,   0,   0,   0,  89,   0,   7,   7, 111,   0,   0, 113, 114, 115,
-     36,  36,  82,  36,  36,  36,  36,  36,  36,  36,  36, 104,  58,  44,  44,  44,
-     44,  75,  36,  88,  44,  44,  58,  44,  44,  44,  44,  44,  44,  44,  44, 116,
-      0, 109,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  68,  44,  44,  44,  44, 117,
-      7,   7, 118,   0,  36,  83,  76,  83,  95,  74,  44,  76,  88,  71,  36,  36,
-     83,  44,  44,  87,   7,   7, 119,  89,  11,  11,  11,  11,  11,  11,  11,  11,
-     11,  50,   0, 120,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  61,  36,
-     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,
-     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,
-     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,
-     36,  36,  92,  41,  36,  61,  92,  41,  36,  36,  36,  36,  36,  36,  36,  36,
-     36,  36,  92,  41,  36,  36,  36,  36,  36,  36,  36,  36,  92,  41,  36,  61,
-     92,  41,  36,  36,  36,  61,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,
-     36,  36,  36,  36,  92,  41,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,
-     36,  36,  36,  36,  36,  36,  61,  58, 121,   9, 122,   0,   0,   0,   0,   0,
-     36,  36,  36,  36,   0,   0,   0,   0,  11,  11,  11,  11,  11,  11,  11,  11,
-     11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11, 123,  15,  39,
-     82,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,
-     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,
-     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,
-     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36, 124,  36,  36,  36,  36,
-    125,  36,  36,  36,  36,  36, 126, 127,  36,  36,  36,  36,  36,  36,  36,  36,
-     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  61,  40,  36,  36, 104,   0,
-     36,  36,  36,  92,  83, 116,   0,   0,  36,  36,  36,  36,  83, 128,   0,   0,
-     36,  36,  36,  36,  83,   0,   0,   0,  36,  36,  36,  92, 129,   0,   0,   0,
-     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  44,  44,  44,
-     44,  44,  44,  44,  44,  62,   0, 103,   7,   7, 111,   0,   0,   0,   0,   0,
-    130,   0, 131, 132,   7,   7, 111,   0,  36,  36,  36,  36,  36,  36,  36,  36,
-     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36, 104,   0,
-     36, 133,  36,  36,  36,  36,  36,  36,  36,  36, 134,   0,  36,  36,  36,  36,
-     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  41,   0,   0,
-     36,  36,  36,  36,  36,  36,  36,  61,  44,  44,  44,   0,  44,  44,  44,   0,
-      0,  96,   7,   7,  36,  36,  36,  36,  36,  36,  36,  41,  36, 104,   0,   0,
-     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,   0,  36,  36,  36,  36,
-     36,  36,  41,   0,   7,   7, 111,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     36,  36,  36,  36,  36,  68,  44,   0,  36,  36,  36,  36,  36,  36,  36,  36,
-     36,  36,  36,  36,  36,  88,  44,  66,  44,  44,  44,  44,  44,  44,  44,  97,
-      7,   7, 111,   0,   7,   7, 111,   0,   0,  62, 135,   0,  44,  44,  44,  66,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     44,  71,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  44,  44,  44,
-     44,  71,  36,   0,   7,   7, 118, 136,   0,   0,  93,  44,  44,   0,   0,   0,
-    117,  36,  36,  36,  36,  36,  36,  36,  88,  44,  44,  76,   7,   7,  77,  36,
-     36,  36,  36,  36,  36,  36,  36,  36,  36,  83,  44,  44,  44,   0,   0,   0,
-     36,  36,  36,  36,  36,  36,  36,  36,  36,  44,  44,  44,  44,  44,   9, 122,
-      7,   7, 111,  82,   7,   7,  77,  36,  36,  36,  36,  36,  36,  36,  36, 137,
-     15,  15,  42,   0,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  61,  82,
-      0,   0,   0,   0,  66,  44,  44,  44,  44,  44,  71,  81,  36,  74,  98,   0,
-     15,  15,  15,  15,  15,  15,  15,  15,  15,  15,  15,  15,  15,  15,  15,  15,
-     15,  15,  15,  15,  15,  15,  15,  15,  15,  15,  15,  15,  15,  15,  15,  15,
-     15,  15,  15,  15,  15,  15,  15,  15,  15,  15,  15,  15,  15,  15,  15,  15,
-     44,  44,  44,  44,  44,  44,  44,  44,  44,  44,  44,  44,  44,  44,  59,  44,
-     25,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,
-     25,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,
-     25,  25,  25,  25,  25,  34,  15,  27,  25,  25,  25,  25,  25,  25,  25,  25,
-     25,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,
-     15,  15,  11,  11,  15,  39,  11, 123,  15,  15,  11,  11,  15,  15,  11,  11,
-     15,  39,  11, 123,  15,  15, 138, 138,  15,  15,  11,  11,  15,  15,  15,  39,
-     15,  15,  11,  11,  15,  15,  11,  11,  15,  15,  11,  11,  15, 139,  11, 140,
-     46, 139,  11, 141,  15,  46,  11,   0,  15,  15,  11, 141,  46, 139,  11, 141,
-    142, 142, 143, 144, 145, 146, 147, 147,   0, 148, 149, 150,   0,   0, 151, 152,
-      0, 153, 152,   0,   0,   0,   0, 154,  63, 155,  63,  63,  21,   0,   0, 156,
-      0,   0,   0, 151,  15,  15,  15,  42,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,  44,  44,  44,  44,  44,  44,  44,  44, 116,   0,   0,   0,
-     48, 157, 158, 159,  23, 120,  10, 123,   0, 160,  49, 161,  11,  38, 162,  33,
-      0, 163,  39, 164,   0,   0,   0,   0,  11,  11,  11,  11,  15,  15,  15,  15,
-    165,  38, 104,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0, 147,   0,   0,   0,   0,   0,   0,   0, 151,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 166,  11,  11,
-     11,  11,  11,  11,  15,  15,  15,  15,  15,  15,  39,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   4, 147, 127,   0, 147, 147, 147,   5,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0, 151,   0,   0,   0,   0,   0,   0,   0, 167, 147, 147,   0,   0,   0,   0,
-      4, 147, 147, 147, 147, 147, 127,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0, 147,   0,   0,   0,   0,   0,   0,   0,   0,   5,
-     11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  22,  15,  15,  15,  15,
-     15,  15,  15,  15,  15,  15,  15,  24,  31, 168,  26,  32,  25,  29,  15,  33,
-     25,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,
-     25,  25,  25,  25,  25,  25,  25,  25,  25,  42, 157, 169,  54,   0,   0,   0,
-     15,  15,  15,  15,  15,  15,  15,  15,  15, 170,   0,  21,  36,  36,  36,  36,
-     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,   0,  62,   0,   0,   0,  93,
-     36,  36,  36,  36,  36,  61,   0,   0,  36,  61,  36,  61,  36,  61,  36,  61,
-     36,  61,  36,  61,  36,  61,  36,  61,  44,  44,  44,  44,  44,  44,  44,  44,
-    147, 147, 147,   5,   0,   0,   0,   5, 147, 147,   5, 171,   0,   0,   0, 122,
-    172,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-    173,  82, 147, 147,   5, 147, 147, 174,  82,  36,  83,  44,  82,  41,  36, 104,
-     82,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,
-     36,  36,  36,  36,  36,  61,  60,  82,  82,  36,  36,  36,  36,  36,  36,  36,
-     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  61,  36,
-      0,  82,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  82,  36,  36,  36,
-     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,
-     36,  36,  36,  61,   0,   0,   0,   0,  36,  36,  36,  36,  36,  36,  61,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  36,  36,  36,  36,
-     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  41,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,
-     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,   0,   0,   0,   0,
-     36,  36,  36, 104,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36, 175,
-     36,  36,  36, 176,  36,  36,  36,  36,   7,   7,  77,   0,   0,   0,   0,   0,
-     25,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25, 177,  66,  44,  44, 178,
-     25,  25,  25,  25,  25,  25,  25, 179,  36,  36,  36,  36,  36,  36,  36,  36,
-     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36, 180,   9,   0,   0,
-      0,   0,   0,   0,   0,  62,  36,  36, 181,  25,  25,  25,  27,  25,  25,  25,
-     25,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,  15,  15,  26,  30,
-     25,  25, 182, 183,  25,  27,  25,  25,  25,  25,  31,  23,  11,  25,  25,  25,
-    181,  22,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  62, 184,  36,
-    185, 185,  68,  36,  36,  36,  36,  36,  68,  44,   0,   0,   0,   0,   0,   0,
-     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36, 136,   0,   0,
-     76,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  44,  44,  44,
-     44,  89,   0, 136,   7,   7, 111,   0,  44,  44,  44,  44,  76,  36,  62, 186,
-      7,   7,  77,  36,  36,  36,  36,  36,  36,  83,  44, 180,  36,  36,  36,  36,
-     36,  68,  44,  44,  44,   0,   0,   0,  36,  36,  36,  36,  36,  36,  36, 104,
-     44,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  68,  44,  44,  44,
-    116,   0, 152,  62,   7,   7, 111,   0,  36,  81,  36,  36,   7,   7,  77,  61,
-     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  88,  44,  44,  66,   0,   0,
-     68,  36,  36,  89,   7,   7, 111, 187,  36,  36,  36,  36,  36,  61, 188,  76,
-     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  95,  74,  71,  83,
-    134,   0,   0,   0,   0,   0,  62,  41,  36,  36,  68,  44, 189, 190,   0,   0,
-     82,  61,  82,  61,  82,  61,   0,   0,  36,  61,  36,  61,  15,  15,  15,  15,
-     15,  15,  15,  15,  15,  15,  24,  15,  15,  15,   0,   0,  15,  15,  15,  15,
-     15,  15,  15,  15,  15,  15,  15,  15,  15,  15,  15,  15,  15,  15,  15,  15,
-     36,  36,  36,  36,  36,  36,  36,  36,  68,  44, 191,  89,   7,   7, 111,   0,
-     36,  36,  36,  36,  36,  36,  36,  36,  36,   0,   0,   0,  36,  36,  36,  36,
-     36,  61,  62,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,   0,
-     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,
-     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  41,  36,  36,  36,  36,
-     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,
-     36,  36,  36,  36,  36,  36,  41,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     15,  24,   0,   0, 192,  15,   0, 193,  36,  36,  92,  36,  36,  61,  36,  43,
-     99,  92,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,
-     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  41,   0,   0,   0,
-      0,   0,   0,   0,  62,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,
-     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36, 194,
-      0,   0,   0,   0,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,
-     36,  36,  36,  36,  40,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,
-     36,  36,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  36,  36,  36,   0,
-     44,  44,  44,  44, 195,   4, 127,   0,  44,  44,  44,  44, 196, 174, 147, 147,
-    147, 197, 127,   0,   6, 198, 199, 200, 145,   0,   0,   0,  36,  92,  36,  36,
-     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,
-     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36, 201,
-     90,   0,   5,   6,   7,   7,   8,   9,  10,  11,  11,  11,  11,  11,  12,  13,
-     14,  15,  15,  15,  15,  15,  16, 202, 203, 204,  36,  36,  36,  36,  36,  36,
-     36,  36,  36,  36,  36,  36,  36,  83,  36,  36,  36,  36,  36,  36,  36,  61,
-     40,  36,  40,  36,  40,  36,  40, 104,   0,   0,   0,   0,   0,   0, 205,   0,
-     36,  36,  36,  82,  36,  36,  36,  36,  36,  61,  36,  36,  36,  36,  61,  99,
-     36,  36,  36,  41,  36,  36,  36,  41,   0,   0,   0,   0,   0,   0,   0,   0,
-     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,
-     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  61,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36, 104,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  86,
-     36,  36,  36,  36,  36,  36,  36, 104,  36,  36,  36,  36,  36,  36,  36,  36,
-     36,  36,  36,  36, 104,   0,   0,   0, 116,   0,   0,   0,   0,   0,   0,   0,
-     36,  36,  36,  36,  36,  36,  36,  36,   0,   0,   0,  82,  36,  36,  36,  36,
-     36,  36,  61,   0,  36,  36,  36,  36,  36,  36,  36,  36,  36,  83,  66,   0,
-     36,  36,  36,  36,  36,  36,  36,  41,  36,  36,  36,  36,  36,  36,  36,  36,
-     36,   0,  36,  36,  82,  41,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  15,  15,  15,  15,  15,  15,
-     15,  15,  15,  15,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,
-     36,  36,  36,  36,  36,  36,  36,  41,   7,   7, 111,   0,  11,  11,  11,  11,
-     11,  11,  11,  11,  11,   0,  15,  15,  15,  15,  15,  15,  15,  15,  15,   0,
-     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,   0,   0,  36,  36,  36,  36,
-     36,  36,  36,  36,  36,  36,  36,  36,  36,   0,   0,   0,   0,   0,   0,   0,
-     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  61,   0,   0,
-     36,  36,  36,  36,  36,  41,   0,   0,  36,  36,   0,   0,   0,   0,   0,   0,
-     36,  41,  92,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  99, 104,  78,
-     36,  36,  36,  36,  36,  41,   0,   0,  36,  36,  36,  36,  36,  61,   0,   0,
-     36,  36,  36,  36,  36,  36,  36,  61,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,  36,  36,  36,  36,  61,  41,   0,   0,
-     36,  36,  36,  36,  36,  41,   0,   0,  36,  36,  36,  36,  36,  36,  41,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,   0,  40,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     88,  60,   0,  44,  36,  82,  82,  36,  36,  36,  36,  36,  36,  41,  66,  93,
-      0,   0,   0,   0,   0, 136,   0,   0,  36,  36,  36,  36,  36,  36,  36, 104,
-     36,  36,  36,  36,  36,  36,  36, 104,   0,   0,   0,   0,   0,   0,   0,   0,
-     36,  36,  82,  36,  36,  36,  36,  36,  36, 190,   0,   0,   0,   0,   0,   0,
-     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  41,   0,   0,
-     36,  36,  36,  36,  36,  41,   0,   0,  36,  36,  36,  36,  61,   0,   0,   0,
-     36,  36,  36,  36,  41,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,
-     36,  36, 104,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  22,   0,   0,   0,
-     15,  15,  15,  15,  15,  15,  15,  15,  15,  15,  15,  15,  24,   0,   0,   0,
-     36,  36,  36,  36,  36,  36,  36,  36,  36,  44,   0,   0,   7,   7, 111,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     36,  36,  36,  36,  36,  36,  36, 104,   0,  62,   0,   0,  36,  36,  36,  36,
-     36,  83,  44,  44, 116, 187, 152,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,  36,  36,  36,  36,  36,  61,   0,   0,
-    117,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  44,  44,
-     44, 191, 122,   0,   0,   0,   0,   0,   0, 100,   7,   7,   0,   0,   0,  93,
-    117,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  44,  44,  66, 206,
-    152,   0,   0,  20,  36,  36,  36,  36,  36,  36, 104,   0,   7,   7, 111,   0,
-    117,  36,  36,  36,  36,  36,  36,  36,  36,  68,  44,  44,  44, 207,   7,   7,
-    187, 190,   0,   0,  36,  36,  36,  36,  36,  36,  36,  36,  68, 108,   0,   0,
-    117,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  68,  44,  44,  44,
-     71, 208,  58, 209,   7,   7, 210, 176,   0,   0,   0,   0,   0,   0,   0,   0,
-     36,  36,  36,  36,  99,  36,  36,  36,  36,  36,  36,  44,  44,  44, 211, 212,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     36,  61,  92,  99,  36,  36,  36,  99,  36,  36, 213,   0,  36,  36,  36,  36,
-     36,  36,  36,  36,  36,  36,  36,  68,  44,  44,  66,   0,   7,   7, 111,   0,
-     44,  82,  36,  78,  78,  36,  36,  36,  36,  36,  92,  36,  92,  82, 214,  95,
-     44,  97,  97,  89, 104,  93,   0,  82,  83, 106,  44, 116,  44, 116,   0,   0,
-     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  88,  44,  44,
-     44, 117, 215, 122,   7,   7, 111, 107,   0,   0,   0,   0,   0,   0,   0,   0,
-     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  44,  44,  44,  44,
-     44,  99,   0,   0,   7,   7, 111,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  68,  44,  89,  44,  44,
-    216,   0, 187, 135, 135, 135,  36,  89,   0,   0,   0,   0,   0,   0,   0,   0,
-     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  44,  44,  44,  44,
-    128, 104,   0,   0,   7,   7, 111,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  68,  44,  44,  44, 104,   0,
-      7,   7, 111,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     36,  36,  36,  36,  36,  36,  61,  58,  44,  44,  44,   0,   7,   7, 111,  79,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  44,  44,  44,  66,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,  11,  11,  11,  11,  11,  11,  11,  11,
-     15,  15,  15,  15,  15,  15,  15,  15,   7,   7, 111,   0,   0,   0,   0,  62,
-      0,   0,   0,   0,   0,   0,   0,   0,  36,  36,  40,  36,  36,  36,  36,  36,
-     36,  36,  36,  36,  88,  44, 106,  44, 217, 116,   0,   0,   0,   0,   0,   0,
-     88,  44, 117,  36,  36,  36,  36,  36,  36,  36,  36,  36,  68,  44,  87,  66,
-    136,  93,   0,   0,  88,  44,  44,  36,  36,  36,  36,  36,  36,  36,  36,  36,
-     36,  36,  83,  44,  44,  44, 180, 218,   0,   0,   0,   0,   0,   0,   0,   0,
-     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36, 104,   0,
-     36,  36,  92,  36,  36,  36,  36,  36,  36,  36,  36,  68,  44,  66,  44,  44,
-    208,   0,   0,   0,   7,   7, 111,   0,   0,   0,   0,   0,  40,  36,  36,  36,
-     36,  36,  36,  36, 106,  44,  44,  44,  44,  44,  58,  44,  44,  66,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     36,  61,  99,  36,  36,  36,  36,  36,  36,  36,  36,  36,  88,  66, 109,  59,
-     44,  87,   0,   0,   7,   7, 111,   0,  36,  99,  92,  36,  36,  36,  36,  36,
-     36,  36,  83,  66,  59,  44, 104,   0,   7,   7, 111,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,  36,  36,  36,  36,  68, 191, 122,   0,
-     36,  36,  36,  36,  36,  36,  41,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,
-     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  61,   0,   0,   0,   0,
-     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,
-     36,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  61,  63,  63, 219,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 38,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 38,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 38,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 38,
+    39, 40, 40, 40, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 38,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 38,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 38
+};
+
+static RE_UINT16 re_bidi_class_table_2[] = {
+      0,   1,   2,   3,   4,   5,   6,   6,   7,   7,   7,   7,   7,   7,   7,   7,
+      7,   7,   7,   7,   7,   8,   9,  10,  11,  11,  11,  12,  13,   7,   7,  14,
+      7,   7,   7,   7,  15,   7,   7,   7,   7,   7,   7,   7,  16,  17,  18,  19,
+     20,  21,  22,  23,  21,  21,  24,  25,  26,  27,  28,  21,  21,  29,  19,  30,
+     31,  32,  33,  34,  19,  21,  35,  36,  37,  38,  39,  40,  41,  42,  43,  44,
+     45,  42,  46,  47,  45,  42,  48,  49,  41,  50,  51,  40,  52,   7,  53,  54,
+     55,  56,  57,  58,  41,  42,  59,  40,  60,  61,  43,  40,  41,   7,  62,   7,
+      7,  63,  64,   7,   7,  65,  66,   7,  67,  68,   7,  69,  70,  71,  72,   7,
+      7,  73,  74,  75,  76,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
+      7,   7,   7,   7,   7,   7,   7,   7,   7,   7,  77,   7,  78,   7,   7,   7,
+     79,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
+      7,   7,   7,   7,  80,   7,   7,   7,  81,  81,  82,  82,   7,  83,  84,  78,
+     85,   7,   7,   7,  86,  87,   7,   7,   7,  88,  89,   7,   7,   7,  90,  91,
+     92,   7,  93,  94,   7,  95,  96,   7,  97,  98,  52,  99,  60, 100,   7, 101,
+      7, 102,   7,   7,   7,   7, 103, 104,   7,   7,   7,   7,   7,   7,  11, 105,
+      7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7, 106, 107, 108,
+    109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119,   7, 120,  91,  91,  91,
+    121,  91,  91,  91,  91,  91,  91,  91,  91, 122,   7, 123, 124,  91,  91,  91,
+     91, 125, 126,  91, 127,   7,   7, 128,  91,  91,  91,  91,  91,  91,  91,  91,
+     91,  91,  91,  91,  91, 129,  91,  91,  91,  91,  91,  91,  91,  91,  91,  91,
+      7,   7,   7,   7,   7,   7,   7,   7,  91,  91,  91,  91,  91,  91,  91,  91,
+     91,  91,  91,  91,  91,  91,  91,  91,  91,  91,  91, 130, 131,  91,  91,  91,
+      7,   7,   7,   7,   7,   7,   7, 132,   7,   7,   7, 133,   7,   7,   7,  11,
+     91,  91, 134,   7, 135,  91,  91, 136,  91,  91,  91,  91,  91,  91, 122, 137,
+    138, 139,   7,   7, 140,  79,   7, 141,   7,   7,   7,   7,   7,   7,  91, 142,
+    143,   7, 144, 145,   7, 146, 147,   7,   7,   7,   7, 148,   7,   7,  90, 149,
+      7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
+      7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
+      7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,  91,  91,
+      7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
+      7,   7,   7,   7, 144,  91, 125,   7,   7,   7,   7,   7,   7,   7,   7,   7,
+    150,   7,   7, 151,  56,   7,   7, 152,  91, 153,   7,   7, 154,   7,   7,   7,
+    155, 156,   7, 157,   7,   7, 158, 159,   7, 160, 161,   7,  37, 162,   7, 163,
+      7, 164, 165,  42,   7, 166,  41, 167,   7,   7,   7, 168,   7,   7,   7, 169,
+      7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
+      7,   7,   7,   7,   7,   7,   7,   7, 170, 171, 172,  21,  21,  21,  21,  21,
+     21,  21,  21,  21,  21,  21,  21,  21,  21, 173,  21,  21,  21,  21, 174, 175,
+    176, 177, 178, 179,  21,  21,  21, 180, 181,   2,   2, 182,   7,   7,   7, 183,
+      7,   7,   7,   7,   7,   7,   7,   7, 184,   7,  91,  91, 185,  79,   7, 186,
+      7,   7,   7,   7,   7,   7,   7, 187,   7,   7,   7, 188,   7,   7,   7,   7,
+     19,  19,  19,  19,  19,  19,  19,  19, 189,  19,  19,  19,  19,  19,  19,  19,
+    190, 191,  19,  19,  19,  19,  19, 192,  19, 193,  19,  19,  19,  19,  19,  19,
+     19,  19,  19,  19,  19,  19,  19,  19,  21, 194,  19,  19,  19,  19,  19,  19,
+     19,  19,  19, 195,  19, 196,  19,  19,  19, 172,  29,  34,  19,  19,  19,  19,
+     41, 197, 198, 199,  60, 200,   7,   7,  37, 201,   7, 202,  60, 203, 204,   7,
+      7, 205,   7,   7,   7,   7, 133, 206,  60,  61,  96, 207,   7,   7,   7,   7,
+      7, 197, 208,   7,   7, 209, 210,   7,   7,   7,   7,   7,   7, 211, 212,   7,
+      7, 213,  96, 214,   7, 215,   7,   7,  77, 216,   7,   7,   7,   7,   7,   7,
+      7, 217,   7,   7,   7,   7,   7,   7,   7, 218, 219,   7,   7,   7, 220,  96,
+    221, 222, 223,   7, 224,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
+      7, 225,   7,   7, 226, 227,   7,   7,   7, 228, 229,   7, 230,   7,   7,   7,
+      7,   7,   7,   7,   7,   7,   7, 231,   7,   7,   7,   7,   7,   7, 232, 233,
+      7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
+      7,   7,   7,   7,   7,   7,   7, 234,   7, 235,   7,   7,   7,   7,   7,   7,
+      7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
+      7,   7,   7,   7,   7,   7,   7,   7,   7,   7, 236,   7, 237,   7,   7, 238,
+      7,   7,   7,   7, 239, 240,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
+      7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
+      7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7, 241, 242, 243,   7,   7,
+     91,  91, 244,   7,   7,   7,   7,   7,  91,  91, 245,   7,   7,   7,   7,   7,
+      7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
+      7,   7,   7,   7,   7,   7, 141,   7, 246,   7, 247,   7, 248,   7, 249, 250,
+      7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
+     11, 251,  11, 252, 253, 254,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
+    255, 256,   7,   7,   7,   7,   7,   7,   7, 235,   7,   7,   7,   7,   7,   7,
+      7,   7,   7,   7,   7,   7,   7, 257,   7,   7,   7,   7,   7,   7,   7,   7,
+     19,  19,  19,  19,  19,  19, 258,  19,  19,  19, 259,  19,  19,  19,  19,  19,
+     19,  19,  19,  19,  19,  19,  19,  19,  19,  19,  19,  19,  19,  19,  19,  19,
+     19,  19,  19, 172,  21,  21,  19,  19,  21,  21,  34,  19,  19,  19,  19,  19,
+     21,  21,  21,  21,  21,  21,  21, 260,  19,  19,  19,  19,  19,  19,  19,  19,
+     91, 261,  91,  91, 136, 262, 263, 122, 264, 247,   7, 265,   7, 266,   7,   7,
+      7,   7,   7, 182,   7,   7,   7,   7,  91,  91,  91,  91,  91,  91,  91,  91,
+     91,  91,  91,  91,  91,  91,  91,  91,  91,  91,  91,  91,  91,  91,  91,  91,
+     91,  91,  91,  91,  91,  91, 267, 185,  91,  91,  91, 136,  91,  91, 268, 269,
+    261,  91, 270,  91, 271, 272,   7,   7,  91,  91,  91, 273,  91,  91, 129,  91,
+     91,  91, 136, 274, 275, 276, 277,   7,  91,  91,  91,  91, 278,  91, 126, 279,
+      7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
+      7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7, 280,
+    281, 281, 281, 281, 281, 281, 281, 281,  11,  11,  11,  11,  11,  11,  11, 282,
+    281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281,
+    281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281,
+    281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281
+};
+
+static RE_UINT8 re_bidi_class_table_3[] = {
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  2,  3,  2,  4,  3,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  3,  3,  3,  2,
+     4,  5,  5,  6,  6,  6,  5,  5,  5,  5,  5,  7,  8,  7,  8,  8,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  8,  5,  5,  5,  5,  5,
+     5,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  5,  5,  5,  5,  5,
+     5,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  5,  5,  5,  5,  1,
+     1,  1,  1,  1,  1,  3,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     8,  5,  6,  6,  6,  6,  5,  5,  5,  5,  0,  5,  5,  1,  5,  5,
+     6,  6,  9,  9,  5,  0,  5,  5,  5,  9,  0,  5,  5,  5,  5,  5,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  5,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  5,  5,  0,  0,  0,  0,  0,
+     0,  0,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     0,  0,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     0,  0,  0,  0,  0,  5,  5,  5,  5,  5,  5,  5,  5,  5,  0,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+     0,  0,  0,  0,  5,  5,  0,  0,  0,  0,  0,  0,  0,  0,  5,  0,
+     0,  0,  0,  0,  5,  5,  0,  5,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  5,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0, 10, 10, 10, 10, 10, 10, 10,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  5,  0,  0,  5,  5,  6,
+    11, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 11, 10,
+    11, 10, 10, 11, 10, 10, 11, 10, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    12, 12, 12, 12, 12, 12,  5,  5, 13,  6,  6, 13,  8, 13,  5,  5,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    12, 12, 12, 12, 12, 12, 12, 12, 12, 12,  6, 12, 12, 13, 13, 13,
+    10, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 10, 10, 10, 10, 10, 10, 10, 12,  5, 10,
+    10, 10, 10, 10, 10, 13, 13, 10, 10,  5, 10, 10, 10, 10, 13, 13,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 10, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 11, 11,  5,  5,  5,  5, 11, 11, 11, 10, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 10, 10, 10, 10, 11, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 11, 10, 10, 10, 11, 10, 10, 10, 10, 10, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 10, 10, 10, 11, 11, 11, 11,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 12, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 10,  0, 10,  0,  0,  0,
+     0, 10, 10, 10, 10, 10, 10, 10, 10,  0,  0,  0,  0, 10,  0,  0,
+     0, 10, 10, 10, 10, 10, 10, 10,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0, 10, 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0, 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 10,  0,  0,  0,
+     0, 10, 10, 10, 10,  0,  0,  0,  0,  0,  0,  0,  0, 10,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0, 10, 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  6,  6,  0,  0,  0,  0,  0,  0,  0,  6,  0,  0, 10,  0,
+     0, 10, 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0, 10, 10,  0,  0,  0,  0, 10, 10,  0,  0, 10, 10, 10,  0,  0,
+     0, 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    10, 10,  0,  0,  0, 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0, 10, 10, 10, 10, 10,  0, 10, 10,  0,  0,  0,  0, 10,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0, 10, 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  6,  0,  0,  0,  0,  0,  0,  0,  0, 10, 10, 10, 10, 10, 10,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 10,  0,  0, 10,
+     0, 10, 10, 10, 10,  0,  0,  0,  0,  0,  0,  0,  0, 10,  0,  0,
+     0,  0,  0,  0,  0, 10, 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0, 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 10,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  5,  5,  5,  5,  5,  5,  6,  5,  0,  0,  0,  0,  0,
+    10,  0,  0,  0, 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 10, 10,
+    10,  0,  0,  0,  0,  0, 10, 10, 10,  0, 10, 10, 10, 10,  0,  0,
+     0,  0,  0,  0,  0, 10, 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0, 10, 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  5,  5,  5,  5,  5,  5,  5,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 10, 10,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    10, 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 10, 10,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 10,  0,  0,  0,  0,  0,
+     0,  0, 10, 10, 10,  0, 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0, 10,  0,  0, 10, 10, 10, 10, 10, 10, 10,  0,  0,  0,  0,  6,
+     0,  0,  0,  0,  0,  0,  0, 10, 10, 10, 10, 10, 10, 10, 10,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0, 10,  0,  0, 10, 10, 10, 10, 10, 10, 10, 10, 10,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0, 10, 10, 10, 10, 10, 10,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0, 10, 10,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0, 10,  0, 10,  0, 10,  5,  5,  5,  5,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,  0,
+    10, 10, 10, 10, 10,  0, 10, 10,  0,  0,  0,  0,  0, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10,  0, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,  0,  0,  0,
+     0,  0,  0,  0,  0,  0, 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 10, 10, 10,
+    10,  0, 10, 10, 10, 10, 10, 10,  0, 10, 10,  0,  0, 10, 10,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0, 10, 10,  0,  0,  0,  0, 10, 10,
+    10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0, 10, 10, 10, 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0, 10,  0,  0, 10, 10,  0,  0,  0,  0,  0,  0, 10,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 10,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 10, 10, 10,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  0,  0,  0,  0,  0,  0,
+     5,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     4,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  5,  5,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0, 10, 10, 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0, 10, 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0, 10, 10,  0, 10, 10, 10, 10, 10, 10, 10,  0,  0,
+     0,  0,  0,  0,  0,  0, 10,  0,  0, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10,  0,  0,  0,  0,  0,  0,  0,  6,  0, 10,  0,  0,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5, 10, 10, 10,  1,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0, 10, 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0, 10,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    10, 10, 10,  0,  0,  0,  0, 10, 10,  0,  0,  0,  0,  0,  0,  0,
+     0,  0, 10,  0,  0,  0,  0,  0,  0, 10, 10, 10,  0,  0,  0,  0,
+     5,  0,  0,  0,  5,  5,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0, 10, 10,  0,  0, 10,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0, 10,  0, 10, 10, 10, 10, 10, 10, 10,  0,
+    10,  0, 10,  0,  0, 10, 10, 10, 10, 10, 10, 10, 10,  0,  0,  0,
+     0,  0,  0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,  0,  0, 10,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    10, 10, 10, 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0, 10,  0, 10, 10, 10, 10, 10,  0, 10,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 10, 10, 10, 10, 10,
+    10, 10, 10, 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0, 10, 10, 10, 10,  0,  0, 10, 10,  0, 10, 10, 10,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0, 10,  0, 10, 10,  0,  0,  0, 10,  0, 10,
+    10, 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 10, 10, 10, 10,
+    10, 10, 10, 10,  0,  0, 10, 10,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    10, 10, 10,  0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10,  0, 10, 10, 10, 10, 10, 10, 10,  0,  0,  0,  0, 10,  0,  0,
+     0,  0,  0,  0, 10,  0,  0,  0, 10, 10,  0,  0,  0,  0,  0,  0,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10,  0, 10, 10, 10, 10, 10,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  5,  0,  5,
+     5,  5,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  5,  5,  5,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  5,  5,  5,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  5,  5,  5,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  5,  5,  0,
+     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  1,  1,  1,  0, 11,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  4,  3, 14, 15, 16, 17, 18,  8,
+     6,  6,  6,  6,  6,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  8,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  4,
+     1,  1,  1,  1,  1,  1, 19, 20, 21, 22,  1,  1,  1,  1,  1,  1,
+     9,  0,  0,  0,  9,  9,  9,  9,  9,  9,  7,  7,  5,  5,  5,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  7,  7,  5,  5,  5,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,
+     6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,
+     6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     5,  5,  0,  5,  5,  5,  5,  0,  5,  5,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  5,  0,  5,  5,  5,  0,  0,  0,  0,  0,  5,  5,
+     5,  5,  5,  5,  0,  5,  0,  5,  0,  5,  0,  0,  0,  0,  6,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  5,  5,  0,  0,  0,  0,
+     5,  5,  5,  5,  5,  0,  0,  0,  0,  0,  5,  5,  5,  5,  0,  0,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  5,  5,  5,  0,  0,  0,  0,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  7,  6,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  0,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     5,  5,  5,  5,  5,  5,  5,  5,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  0,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  0,  0,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  0,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     0,  0,  0,  0,  0,  5,  5,  5,  5,  5,  5,  0,  0,  0,  0, 10,
+    10, 10,  0,  0,  0,  0,  0,  0,  0,  5,  5,  5,  5,  5,  5,  5,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 10,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  0,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  0,  0,  0,  0,
+     4,  5,  5,  5,  5,  0,  0,  0,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  0,  0,  0,  0,  0,  0,  0,  0,  0, 10, 10, 10, 10,  0,  0,
+     5,  0,  0,  0,  0,  0,  5,  5,  0,  0,  0,  0,  0,  5,  5,  5,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0, 10, 10,  5,  5,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  5,  0,  0,  0,  0,
+     5,  5,  5,  5,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  5,  5,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  5,  5,  5,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  5,  5,  5,  5,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  5,  5,  5,  5,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  5,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  5,  5,  5,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 10,
+    10, 10, 10,  5, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,  5,  5,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    10, 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     5,  5,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  5,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0, 10,  0,  0,  0, 10,  0,  0,  0,  0, 10,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0, 10, 10,  0,  5,  5,  5,  5, 10,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  6,  6,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  5,  5,  5,  5,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0, 10, 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 10,
+     0,  0,  0,  0,  0,  0, 10, 10, 10, 10, 10, 10, 10, 10,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0, 10,  0,  0, 10, 10, 10, 10,  0,  0, 10, 10,  0,  0,
+     0,  0,  0,  0,  0, 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0, 10, 10, 10, 10, 10, 10,  0,
+     0, 10, 10,  0,  0, 10, 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0, 10,  0,  0,  0,  0,  0,  0,  0,  0, 10,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    10,  0, 10, 10, 10,  0,  0, 10, 10,  0,  0,  0,  0,  0, 10, 10,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 10, 10,  0,  0,
+     0,  0,  0,  0,  0,  0, 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  5,  5,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0, 10,  0,  0, 10,  0,  0,  0,  0, 10,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 11, 10, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11,  7, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,  5,  5,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,  5, 13, 13,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  0,  0,  0,  0,  0,  0,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     8,  5,  8,  0,  5,  8,  5,  5,  5,  5,  5,  5,  5,  5,  5,  6,
+     5,  5,  7,  7,  5,  5,  5,  0,  5,  6,  6,  5,  0,  0,  0,  0,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,  1,
+     0,  5,  5,  6,  6,  6,  5,  5,  5,  5,  5,  7,  8,  7,  8,  8,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  8,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     6,  6,  5,  5,  5,  6,  6,  0,  5,  5,  5,  5,  5,  5,  5,  0,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  5,  5,  5,  5,  5,  1,  1,
+     0,  5,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  0,  0,  0,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 10,  0,  0,
+    10,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0, 10, 10, 10, 10, 10,  0,  0,  0,  0,  0,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,  5,
+    11, 10, 10, 10, 11, 10, 10, 11, 11, 11, 11, 11, 10, 10, 10, 10,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 10, 10, 10, 11, 11, 11, 11, 10,
+    11, 11, 11, 11, 11, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11,  5,  5,  5,  5,  5,  5,  5,
+    13, 13, 13, 13, 10, 10, 10, 10, 13, 13, 13, 13, 13, 13, 13, 13,
+    12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, 13, 13,
+    12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+    12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 10, 10, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 10,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0, 10, 10, 10, 10,  0,  0, 10, 10,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0, 10, 10, 10, 10, 10,  0, 10, 10, 10,
+    10, 10, 10, 10, 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0, 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0, 10, 10, 10, 10, 10, 10, 10, 10, 10,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0, 10, 10, 10, 10,  0,  0, 10,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 10,
+    10, 10,  0,  0, 10,  0, 10, 10,  0,  0,  0,  0,  0,  0, 10,  0,
+     0,  0,  0, 10, 10, 10, 10, 10, 10, 10, 10,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0, 10, 10, 10, 10, 10, 10, 10,  0,  0,  0,
+    10, 10, 10, 10, 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0, 10, 10, 10,  0, 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 10,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0, 10, 10, 10, 10, 10, 10,  0, 10,  0,  0,  0,  0, 10,
+    10,  0, 10, 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0, 10, 10, 10, 10,  0,  0,  0,  0,  0,  0, 10, 10,  0, 10,
+    10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 10, 10,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0, 10, 10, 10, 10, 10, 10, 10, 10,  0,  0, 10,  0, 10,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 10,  0, 10,  0,  0,
+    10, 10, 10, 10, 10, 10,  0, 10,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0, 10, 10, 10, 10,  0, 10, 10, 10, 10, 10,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 10,
+    10, 10, 10, 10, 10, 10, 10, 10,  0, 10, 10,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 10, 10,  0, 10,  0,
+     0,  0,  0, 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0, 10, 10, 10, 10,  0,  0, 10, 10,  0,  0,  0,  0,
+     0, 10, 10, 10, 10, 10, 10,  0,  0, 10, 10,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0, 10, 10, 10, 10, 10, 10,  0,  0, 10, 10, 10, 10,  0,
+     0,  0,  0,  0,  0,  0,  0, 10,  0,  0,  0,  0,  0,  0,  0,  0,
+     0, 10, 10, 10, 10, 10, 10,  0,  0, 10, 10, 10,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10,  0, 10, 10,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    10, 10, 10, 10, 10, 10, 10,  0, 10, 10, 10, 10, 10, 10,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10,  0,  0, 10, 10, 10, 10, 10, 10,
+    10,  0, 10, 10,  0, 10, 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0, 10, 10, 10, 10, 10, 10,  0,  0,  0, 10,  0, 10, 10,  0, 10,
+    10, 10, 10, 10, 10, 10,  0, 10,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    10, 10,  0,  0,  0, 10,  0, 10,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0, 10, 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  5,  5,  5,  5,  5,  5,  5,  5,  6,  6,  6,
+     6,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    10, 10, 10, 10, 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    10, 10, 10, 10, 10, 10, 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 10,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 10,
+    10, 10, 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  5,  0, 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 10, 10,  0,
+     1,  1,  1,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0, 10, 10, 10,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  1,  1,  1,  1,  1,  1,  1,  1, 10, 10, 10, 10, 10,
+    10, 10, 10,  0,  0, 10, 10, 10, 10, 10, 10, 10,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 10, 10, 10, 10,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     5,  5, 10, 10, 10,  5,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  5,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  5,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  5,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  5,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10,  0,  0,  0,  0, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,  0,  0,  0,
+     0,  0,  0,  0,  0, 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0, 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 10, 10, 10, 10, 10,
+     0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    10, 10, 10, 10, 10, 10, 10,  0, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10,  0,  0, 10, 10, 10, 10, 10,
+    10, 10,  0, 10, 10,  0, 10, 10, 10, 10, 10,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 10, 10, 10, 10,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  6,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+     5,  5, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  0,  0,  0,  0,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  0,
+     0,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     0,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     0,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  5,  5,  5,  5,  5,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  5,  5,  5,  5,  5,  5,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  5,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  0,  0,  0,  0,  0,  0,  0,  0,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  0,  0,  0,  0,  0,  0,  0,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     5,  5,  5,  5,  5,  5,  5,  5,  0,  0,  0,  0,  0,  0,  0,  0,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  0,  0,  0,  0,  0,  0,
+     5,  5,  5,  5,  5,  5,  5,  5,  0,  0,  0,  0,  0,  0,  0,  0,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  0,  0,
+     5,  5,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  0,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  0,  0,
+     5,  5,  5,  5,  5,  0,  0,  0,  5,  5,  5,  0,  0,  0,  0,  0,
+     5,  5,  5,  5,  5,  5,  5,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  0,  0,  0,  0,  0,  0,  0,
+     5,  5,  5,  5,  5,  5,  5,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     5,  5,  5,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     5,  5,  5,  5,  5,  5,  5,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  0,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1
+};
+
+RE_UINT32 re_get_bidi_class(RE_UINT32 codepoint) {
+    RE_UINT32 field_2;
+    RE_UINT32 field_1;
+    RE_UINT32 field_0;
+    RE_UINT32 v;
+
+    field_2 = codepoint >> 10;
+    field_1 = (codepoint >> 5) & 0x1F;
+    field_0 = codepoint & 0x1F;
+
+    v = re_bidi_class_table_1[field_2];
+    v = re_bidi_class_table_2[(v << 5) | field_1];
+    v = re_bidi_class_table_3[(v << 5) | field_0];
+
+    return v;
+}
+
+/* Bidi_Control. */
+RE_UINT32 re_get_bidi_control(RE_UINT32 codepoint) {
+    if (codepoint == 0x061C)
+        return 1;
+    if (0x200E <= codepoint && codepoint <= 0x200F)
+        return 1;
+    if (0x202A <= codepoint && codepoint <= 0x202E)
+        return 1;
+    if (0x2066 <= codepoint && codepoint <= 0x2069)
+        return 1;
+
+    return 0;
+}
+
+/* Bidi_Mirrored. */
+static RE_UINT8 re_bidi_mirrored_table_1[] = {
+     0,  1,  1,  2,  1,  3,  1,  1,  4,  5,  6,  7,  8,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  9,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1, 10,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1
+};
+
+static RE_UINT8 re_bidi_mirrored_table_2[] = {
+     0,  1,  2,  2,  0,  3,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  4,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  5,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  6,  7,  8,  9,  0,  0,  0,  0,  0, 10,  0,  0,  0,  0,  0,
+    11, 12, 13, 14, 15, 16, 17, 18, 19, 20,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 21,  0,  0, 22, 23,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 24, 25, 26, 27,
+    28, 29, 30, 31, 32, 33, 34, 35,  0,  0,  0,  0,  0,  0,  0, 36,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    37, 38,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    39,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0, 40, 41,  0,  0,  0,  0,  1,  2, 42, 43,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0, 44,  0, 45,  0, 46,  0, 47,  0, 48,  0
+};
+
+static RE_UINT8 re_bidi_mirrored_table_3[] = {
+      0,   0,   0,   0,   0,   3,   0,  80,   0,   0,   0,  40,   0,   8,   0,   8,
+      0,   0,   0,  60,   0,   0,   0,  24,   0,   0,   0,   6,  96,   0,   0,   0,
+      0,   0,   0,  96,   0,  96,   0,   0,   1,   0,   0,   0,  30,  63,  98, 188,
+     87, 248,  15, 250, 255,  31,  60, 128, 245, 207, 255, 255, 255, 159,   7,   1,
+    204, 255, 255, 193,   0,  62, 195, 255, 255,  63, 255, 255,   0,  15,   0,   0,
+      3,   6,   0,   0,   0, 255,  63,   0, 121,  59, 120, 112, 252, 255,   0,   0,
+    248, 255, 255, 249, 253, 255,   0,   1,  63, 194,  55,  31,  58,   3, 240,  51,
+      0, 252, 255, 223,  83, 122,  48, 112,   0,   0, 128,   1,  48, 188,  25, 254,
+    255, 255, 255, 255, 207, 191, 255, 255, 255, 255, 127,  80, 124, 112, 136,  47,
+      0,   0,   0,  64,  60,  54,   0,  48, 255,   3,   0,   0,   0, 255, 243,  15,
+      0,   0,   0, 126,  48,   0,   0,   0,   0,   0,   0, 168,  13,   0,   0,   0,
+      0,   0,   0,   8,   0,   0,  32,   0,   0, 128,   0,   0,   0,   2,   0,   0,
+      8,   0,   0,   0
+};
+
+RE_UINT32 re_get_bidi_mirrored(RE_UINT32 codepoint) {
+    RE_UINT32 field_2;
+    RE_UINT32 field_1;
+    RE_UINT32 field_0;
+    RE_UINT32 offset;
+    RE_UINT32 v;
+
+    field_2 = codepoint >> 10;
+    field_1 = (codepoint >> 5) & 0x1F;
+    field_0 = (codepoint >> 3) & 0x3;
+    offset = codepoint & 0x7;
+
+    v = re_bidi_mirrored_table_1[field_2];
+    v = re_bidi_mirrored_table_2[(v << 5) | field_1];
+    v = re_bidi_mirrored_table_3[(v << 2) | field_0];
+
+    return (v >> offset) & 0x1;
+}
+
+/* Blank. */
+RE_UINT32 re_get_blank(RE_UINT32 codepoint) {
+    if (codepoint == 0x09)
+        return 1;
+    if (codepoint == 0x20)
+        return 1;
+    if (codepoint == 0xA0)
+        return 1;
+    if (codepoint == 0x1680)
+        return 1;
+    if (0x2000 <= codepoint && codepoint <= 0x200A)
+        return 1;
+    if (codepoint == 0x202F)
+        return 1;
+    if (codepoint == 0x205F)
+        return 1;
+    if (codepoint == 0x3000)
+        return 1;
+
+    return 0;
+}
+
+/* Block. */
+static RE_UINT8 re_block_table_1[] = {
+     0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 13, 13,
+    13, 13, 13, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 16, 17, 18, 19, 19, 19, 19, 19,
+    19, 19, 19, 19, 19, 20, 21, 22, 23, 23, 23, 23, 23, 23, 24, 25,
+    26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 36, 37, 38, 36, 36,
+    36, 39, 36, 36, 36, 36, 36, 36, 36, 36, 40, 41, 42, 42, 42, 42,
+    42, 42, 43, 44, 36, 36, 36, 36, 36, 36, 36, 36, 45, 36, 36, 46,
+    36, 36, 36, 36, 47, 48, 49, 36, 50, 36, 51, 52, 53, 54, 55, 36,
+    56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56,
+    56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56,
+    56, 56, 56, 56, 56, 56, 56, 56, 56, 57, 58, 58, 58, 59, 60, 61,
+    61, 61, 61, 62, 63, 63, 63, 63, 63, 63, 64, 36, 36, 36, 65, 36,
+    66, 66, 66, 66, 67, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
+    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
+    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
+    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
+    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
+    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
+    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
+    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
+    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
+    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
+    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
+    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
+    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
+    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
+    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
+    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
+    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
+    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
+    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
+    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
+    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
+    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
+    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
+    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
+    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
+    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
+    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
+    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
+    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
+    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
+    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
+    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
+    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
+    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
+    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
+    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
+    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
+    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
+    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
+    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
+    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
+    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
+    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
+    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
+    68, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
+    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
+    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
+    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
+    69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69,
+    69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69,
+    69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69,
+    69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69,
+    70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70,
+    70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70,
+    70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70,
+    70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70
+};
+
+static RE_UINT16 re_block_table_2[] = {
+      0,   0,   0,   0,   1,   1,   1,   1,   2,   2,   2,   2,   3,   3,   3,   3,
+      3,   3,   4,   5,   5,   6,   7,   7,   8,   8,   8,   9,  10,  10,  10,  10,
+     11,  11,  11,  11,  11,  11,  11,  11,  12,  13,  14,  14,  15,  16,  16,  16,
+     17,  17,  17,  17,  17,  17,  17,  17,  18,  18,  19,  20,  21,  21,  22,  22,
+     23,  23,  24,  25,  26,  27,  27,  27,  28,  28,  28,  28,  29,  29,  29,  29,
+     30,  30,  30,  30,  31,  31,  31,  31,  32,  32,  32,  32,  33,  33,  33,  33,
+     34,  34,  34,  34,  35,  35,  35,  35,  36,  36,  36,  36,  37,  37,  37,  37,
+     38,  38,  38,  38,  39,  39,  39,  39,  40,  40,  40,  40,  40,  40,  40,  40,
+     41,  41,  41,  41,  41,  42,  42,  42,  43,  43,  43,  43,  43,  43,  43,  43,
+     44,  44,  44,  44,  44,  44,  44,  44,  44,  44,  44,  44,  45,  46,  46,  46,
+     47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,
+     47,  47,  47,  47,  48,  49,  49,  49,  50,  51,  52,  53,  54,  54,  54,  54,
+     55,  55,  55,  55,  55,  56,  57,  57,  58,  58,  59,  60,  61,  61,  61,  62,
+     63,  64,  64,  64,  64,  65,  66,  66,  67,  67,  67,  67,  68,  68,  69,  69,
+     70,  70,  71,  72,  73,  74,  75,  76,  77,  77,  77,  77,  78,  78,  79,  79,
+     80,  80,  80,  80,  80,  80,  80,  80,  81,  81,  81,  81,  81,  81,  81,  81,
+     82,  82,  82,  83,  84,  85,  86,  87,  88,  88,  89,  90,  91,  92,  92,  92,
+     93,  93,  93,  93,  93,  93,  93,  93,  94,  94,  94,  94,  94,  94,  94,  94,
+     95,  95,  96,  97,  97,  97,  97,  97,  98,  98,  98,  98,  99, 100, 100, 100,
+    101, 101, 101, 101, 101, 101, 101, 101, 102, 102, 102, 102, 102, 102, 103, 104,
+    105, 105, 105, 105, 105, 105, 105, 105, 106, 106, 106, 106, 107, 107, 107, 107,
+    108, 108, 108, 108, 108, 108, 108, 108, 109, 109, 109, 109, 109, 109, 109, 109,
+    110, 110, 110, 111, 112, 112, 112, 112, 113, 114, 115, 115, 116, 116, 116, 117,
+    118, 118, 118, 118, 119, 119, 119, 119, 120, 120, 120, 120, 120, 120, 120, 121,
+    122, 122, 123, 123, 123, 124, 124, 124, 125, 126, 127, 127, 128, 129, 130, 131,
+    132, 132, 132, 132, 132, 132, 132, 132, 133, 133, 133, 133, 133, 133, 133, 133,
+    134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+    134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+    134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 135, 135,
+    136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+    136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+    136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+    137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+    137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+    137, 137, 137, 137, 138, 139, 140, 141, 142, 142, 142, 142, 142, 142, 142, 142,
+    142, 142, 143, 143, 143, 144, 144, 144, 145, 146, 146, 146, 146, 146, 146, 146,
+    147, 148, 149, 149, 150, 150, 150, 151, 152, 153, 154, 155, 156, 156, 156, 157,
+    158, 158, 158, 159, 160, 160, 160, 161, 162, 163, 164, 165, 166, 166, 167, 167,
+    168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168,
+    168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168,
+    168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168,
+    168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 169, 170, 170,
+    171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171,
+    171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 172, 172, 172, 172,
+    173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173,
+    173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173,
+    174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174,
+    174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174,
+    174, 174, 174, 174, 174, 174, 174, 174, 175, 175, 175, 175, 175, 175, 175, 175,
+    175, 175, 175, 175, 175, 175, 175, 175, 176, 176, 177, 178, 178, 178, 178, 178,
+    178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+    179, 180, 181, 182, 183, 183, 183, 183, 184, 184, 184, 184, 184, 184, 184, 185,
+    186, 186, 186, 186, 187, 187, 187, 187, 188, 188, 189, 189, 190, 191, 192, 193,
+     26,  26,  26,  26, 194, 195, 195, 196, 197, 198, 199, 200, 201, 202, 202,  26,
+    203, 203, 204, 205, 206, 207, 208, 208, 209, 210, 211, 212,  26,  26,  26,  26,
+    213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213,  26,  26,  26,  26,
+    214, 214, 215, 216, 217, 218,  26, 219, 220, 221,  26,  26, 222, 223, 223, 223,
+    224, 224, 224, 225, 226,  26, 227, 227, 228, 228, 229, 230, 231, 232,  26,  26,
+    233, 233, 234,  26, 235, 235, 235, 235, 236, 236,  26,  26,  26,  26,  26,  26,
+     26,  26,  26, 237, 238, 238,  26,  26, 239, 240, 241, 242,  26, 243, 244, 245,
+    246, 246, 246, 246, 247, 247, 248, 249, 250, 250, 251, 252, 253, 253, 253, 254,
+    255, 255, 256,  26, 257, 258, 259, 259, 260, 260, 260, 260,  26,  26,  26,  26,
+    261, 261, 261, 261, 262, 262, 262,  26,  26,  26,  26,  26, 263, 263, 263, 263,
+    264, 264, 264, 265, 266, 266, 267,  26, 268, 268,  26,  26,  26,  26,  26,  26,
+    269, 269, 270,  26,  26, 271, 271, 271, 272, 272, 272,  26,  26, 273, 273, 273,
+    274, 274, 275, 276, 276, 277, 278, 278,  26,  26,  26,  26,  26,  26,  26,  26,
+    279, 279, 279, 280, 281, 281,  26,  26, 282, 282, 282, 283, 283, 284,  26,  26,
+     26,  26,  26,  26,  26,  26,  26, 285,  26,  26,  26,  26,  26, 286, 287, 287,
+    288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288,
+    288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288,
+    289, 289, 289, 289, 290, 290, 290, 290, 290, 290, 291,  26,  26,  26,  26,  26,
+     26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
+     26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
+     26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
+    292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292,
+    292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292,
+    292, 293,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
+     26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
+    294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294,
+    294, 294, 294, 294,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
+    295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295,
+    295, 295, 296, 297,  26,  26, 298, 299, 300, 300, 300, 300, 301,  26,  26,  26,
+     26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
+     26,  26, 302, 302, 302,  26,  26,  26, 303, 303, 303, 303, 303,  26,  26, 304,
+    305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305,
+    305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305,
+    306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306,
+    306, 306, 306, 306, 306, 306, 306, 306, 307, 307, 307, 307, 307, 307, 307, 307,
+    307, 307, 307, 307, 307, 307, 307, 307, 308, 308, 308, 308, 309,  26,  26,  26,
+     26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
+    310, 310, 310, 310, 310, 310, 310, 310, 311, 312, 313, 314, 315, 315, 315, 315,
+    315, 315, 315, 315, 315, 315, 315, 315,  26,  26,  26,  26,  26,  26,  26,  26,
+    316, 316, 316, 316, 316, 317,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
+     26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
+    318, 318, 318, 318, 318, 318, 318, 318, 319, 319, 319, 319, 319, 319, 319, 319,
+    320, 320, 321,  26,  26,  26,  26, 322, 323, 323, 323, 324,  26,  26,  26,  26,
+    325, 325, 325, 325, 325, 325, 325, 325, 325, 325, 325, 325, 325, 325, 325, 325,
+    325, 325, 325, 325, 325, 325, 325, 325, 325, 325, 325, 325, 325, 325, 325, 325,
+    326, 326, 326, 326, 326, 326, 326, 326, 326, 326, 326, 326, 326, 326, 326, 326,
+    326, 326, 326, 326, 326, 327,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
+    328, 329,  26,  26,  26,  26,  26,  26, 330, 330, 331,  26,  26,  26,  26,  26,
+     26,  26,  26,  26,  26,  26, 332, 332,  26,  26,  26,  26,  26,  26,  26,  26,
+    333, 333, 333, 333, 333, 333, 333,  26, 334, 334, 334,  26,  26,  26,  26,  26,
+     26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
+     26,  26,  26, 335, 336, 336,  26,  26, 337, 337, 338,  26,  26,  26,  26,  26,
+    339, 339, 339, 339, 339, 339, 339, 339,  26,  26,  26,  26,  26,  26,  26,  26,
+    340, 341, 342, 342, 342, 343, 343, 343, 344, 344, 344, 344, 344, 344, 344, 344,
+    345, 345, 345, 345, 345, 345, 345, 345, 346, 346, 346, 346, 346, 346, 346, 346,
+    346, 346, 346, 346, 346, 346, 346, 346, 346, 346, 346, 346, 346, 346, 346, 346,
+    347, 347, 348, 349, 350, 350, 350, 350, 351, 351, 351, 351, 352, 352, 352, 352,
+    353, 353, 353, 353, 353, 353, 353, 353, 354, 354, 354, 354, 354, 354, 354, 354,
+    355, 355, 355, 356, 357, 357, 357, 357, 358, 358, 358, 358, 358, 358, 358, 358,
+    359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359,
+    359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359,
+    359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359,
+    359, 359, 359, 359, 359, 359, 359,  26, 360, 360, 360, 360, 360, 360, 360, 360,
+    360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360,
+    360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360,
+    360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360,
+    360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 361, 361, 361, 361, 361, 361,
+    361, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362,
+    362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362,
+    362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362,
+    362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362,
+    362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362,
+    362, 362, 362, 362, 362, 363, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364,
+    364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364,
+    364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364,
+    364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364,
+    364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 365,
+    366, 366, 366, 366, 366, 366, 366, 366, 366, 366, 366, 366, 366, 366, 366, 366,
+    366,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
+    367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367,
+    367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367,
+    367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367,
+    367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 368,  26,  26,  26,  26,  26,
+    369, 369, 369, 369,  26,  26,  26,  26, 370, 370, 370, 370, 370, 370, 370, 371,
+     26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
+    372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372,
+    372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372,
+    373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373,
+    373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373
+};
+
+static RE_UINT16 re_block_table_3[] = {
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
+      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
+      3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,
+      3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,
+      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
+      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
+      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
+      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
+      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
+      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
+      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
+      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,
+      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,
+      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,
+      7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
+      7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
+      7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
+      8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,
+      8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,
+      8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,
+      9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,
+      9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,
+     10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,
+     10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,
+     10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,
+     11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,
+     11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,
+     11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,
+     11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,
+     12,  12,  12,  12,  12,  12,  12,  12,  12,  12,  12,  12,  12,  12,  12,  12,
+     12,  12,  12,  12,  12,  12,  12,  12,  12,  12,  12,  12,  12,  12,  12,  12,
+     12,  12,  12,  12,  12,  12,  12,  12,  12,  12,  12,  12,  12,  12,  12,  12,
+     13,  13,  13,  13,  13,  13,  13,  13,  13,  13,  13,  13,  13,  13,  13,  13,
+     13,  13,  13,  13,  13,  13,  13,  13,  13,  13,  13,  13,  13,  13,  13,  13,
+     14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,
+     14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,
+     14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,
+     15,  15,  15,  15,  15,  15,  15,  15,  15,  15,  15,  15,  15,  15,  15,  15,
+     15,  15,  15,  15,  15,  15,  15,  15,  15,  15,  15,  15,  15,  15,  15,  15,
+     15,  15,  15,  15,  15,  15,  15,  15,  15,  15,  15,  15,  15,  15,  15,  15,
+     16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,
+     16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,
+     17,  17,  17,  17,  17,  17,  17,  17,  17,  17,  17,  17,  17,  17,  17,  17,
+     17,  17,  17,  17,  17,  17,  17,  17,  17,  17,  17,  17,  17,  17,  17,  17,
+     18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,
+     18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,
+     19,  19,  19,  19,  19,  19,  19,  19,  19,  19,  19,  19,  19,  19,  19,  19,
+     19,  19,  19,  19,  19,  19,  19,  19,  19,  19,  19,  19,  19,  19,  19,  19,
+     20,  20,  20,  20,  20,  20,  20,  20,  20,  20,  20,  20,  20,  20,  20,  20,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,
+     21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,
+     22,  22,  22,  22,  22,  22,  22,  22,  22,  22,  22,  22,  22,  22,  22,  22,
+     22,  22,  22,  22,  22,  22,  22,  22,  22,  22,  22,  22,  22,  22,  22,  22,
+     23,  23,  23,  23,  23,  23,  23,  23,  23,  23,  23,  23,  23,  23,  23,  23,
+     23,  23,  23,  23,  23,  23,  23,  23,  23,  23,  23,  23,  23,  23,  23,  23,
+     24,  24,  24,  24,  24,  24,  24,  24,  24,  24,  24,  24,  24,  24,  24,  24,
+     24,  24,  24,  24,  24,  24,  24,  24,  24,  24,  24,  24,  24,  24,  24,  24,
+     25,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,
+     25,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,
+     26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
+     26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
+     27,  27,  27,  27,  27,  27,  27,  27,  27,  27,  27,  27,  27,  27,  27,  27,
+     27,  27,  27,  27,  27,  27,  27,  27,  27,  27,  27,  27,  27,  27,  27,  27,
+     28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,
+     28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,
+     29,  29,  29,  29,  29,  29,  29,  29,  29,  29,  29,  29,  29,  29,  29,  29,
+     29,  29,  29,  29,  29,  29,  29,  29,  29,  29,  29,  29,  29,  29,  29,  29,
+     30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,
+     30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,
+     31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,
+     31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,
+     32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,
+     32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,
+     33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,
+     33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,
+     34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,
+     34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,
+     35,  35,  35,  35,  35,  35,  35,  35,  35,  35,  35,  35,  35,  35,  35,  35,
+     35,  35,  35,  35,  35,  35,  35,  35,  35,  35,  35,  35,  35,  35,  35,  35,
      36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,
-     36,  61,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36, 104,   0,
-     36,  36,  36,  36,  36,  36,  36,  61,   7,   7, 111, 136,   0,   0,   0,   0,
+     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,
+     37,  37,  37,  37,  37,  37,  37,  37,  37,  37,  37,  37,  37,  37,  37,  37,
+     37,  37,  37,  37,  37,  37,  37,  37,  37,  37,  37,  37,  37,  37,  37,  37,
+     38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,
+     38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,
+     39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,
+     39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,
+     40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,
+     40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,
+     41,  41,  41,  41,  41,  41,  41,  41,  41,  41,  41,  41,  41,  41,  41,  41,
+     41,  41,  41,  41,  41,  41,  41,  41,  41,  41,  41,  41,  41,  41,  41,  41,
+     42,  42,  42,  42,  42,  42,  42,  42,  42,  42,  42,  42,  42,  42,  42,  42,
+     42,  42,  42,  42,  42,  42,  42,  42,  42,  42,  42,  42,  42,  42,  42,  42,
+     43,  43,  43,  43,  43,  43,  43,  43,  43,  43,  43,  43,  43,  43,  43,  43,
+     43,  43,  43,  43,  43,  43,  43,  43,  43,  43,  43,  43,  43,  43,  43,  43,
+     44,  44,  44,  44,  44,  44,  44,  44,  44,  44,  44,  44,  44,  44,  44,  44,
+     44,  44,  44,  44,  44,  44,  44,  44,  44,  44,  44,  44,  44,  44,  44,  44,
+     45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,
+     45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,
+     46,  46,  46,  46,  46,  46,  46,  46,  46,  46,  46,  46,  46,  46,  46,  46,
+     46,  46,  46,  46,  46,  46,  46,  46,  46,  46,  46,  46,  46,  46,  46,  46,
+     47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,
+     47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,
+     48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,
+     48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,
+     49,  49,  49,  49,  49,  49,  49,  49,  49,  49,  49,  49,  49,  49,  49,  49,
+     49,  49,  49,  49,  49,  49,  49,  49,  49,  49,  49,  49,  49,  49,  49,  49,
+     49,  49,  49,  49,  49,  49,  49,  49,  49,  49,  49,  49,  49,  49,  49,  49,
+     50,  50,  50,  50,  50,  50,  50,  50,  50,  50,  50,  50,  50,  50,  50,  50,
+     50,  50,  50,  50,  50,  50,  50,  50,  50,  50,  50,  50,  50,  50,  50,  50,
+     50,  50,  50,  50,  50,  50,  50,  50,  50,  50,  50,  50,  50,  50,  50,  50,
+     51,  51,  51,  51,  51,  51,  51,  51,  51,  51,  51,  51,  51,  51,  51,  51,
+     51,  51,  51,  51,  51,  51,  51,  51,  51,  51,  51,  51,  51,  51,  51,  51,
+     51,  51,  51,  51,  51,  51,  51,  51,  51,  51,  51,  51,  51,  51,  51,  51,
+     52,  52,  52,  52,  52,  52,  52,  52,  52,  52,  52,  52,  52,  52,  52,  52,
+     52,  52,  52,  52,  52,  52,  52,  52,  52,  52,  52,  52,  52,  52,  52,  52,
+     52,  52,  52,  52,  52,  52,  52,  52,  52,  52,  52,  52,  52,  52,  52,  52,
+     53,  53,  53,  53,  53,  53,  53,  53,  53,  53,  53,  53,  53,  53,  53,  53,
+     53,  53,  53,  53,  53,  53,  53,  53,  53,  53,  53,  53,  53,  53,  53,  53,
+     54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,
+     54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,
+     55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,
+     55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,
+     56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,
+     56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,
+     56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,
+     57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,
+     57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,
+     57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,
+     58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,
+     58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,
+     59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,
+     59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,
+     60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,
+     60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,
+     61,  61,  61,  61,  61,  61,  61,  61,  61,  61,  61,  61,  61,  61,  61,  61,
+     61,  61,  61,  61,  61,  61,  61,  61,  61,  61,  61,  61,  61,  61,  61,  61,
+     61,  61,  61,  61,  61,  61,  61,  61,  61,  61,  61,  61,  61,  61,  61,  61,
+     62,  62,  62,  62,  62,  62,  62,  62,  62,  62,  62,  62,  62,  62,  62,  62,
+     62,  62,  62,  62,  62,  62,  62,  62,  62,  62,  62,  62,  62,  62,  62,  62,
+     62,  62,  62,  62,  62,  62,  62,  62,  62,  62,  62,  62,  62,  62,  62,  62,
+     63,  63,  63,  63,  63,  63,  63,  63,  63,  63,  63,  63,  63,  63,  63,  63,
+     64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,
+     64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,
+     64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,
+     65,  65,  65,  65,  65,  65,  65,  65,  65,  65,  65,  65,  65,  65,  65,  65,
+     66,  66,  66,  66,  66,  66,  66,  66,  66,  66,  66,  66,  66,  66,  66,  66,
+     66,  66,  66,  66,  66,  66,  66,  66,  66,  66,  66,  66,  66,  66,  66,  66,
+     66,  66,  66,  66,  66,  66,  66,  66,  66,  66,  66,  66,  66,  66,  66,  66,
+     67,  67,  67,  67,  67,  67,  67,  67,  67,  67,  67,  67,  67,  67,  67,  67,
+     67,  67,  67,  67,  67,  67,  67,  67,  67,  67,  67,  67,  67,  67,  67,  67,
+     68,  68,  68,  68,  68,  68,  68,  68,  68,  68,  68,  68,  68,  68,  68,  68,
+     68,  68,  68,  68,  68,  68,  68,  68,  68,  68,  68,  68,  68,  68,  68,  68,
+     69,  69,  69,  69,  69,  69,  69,  69,  69,  69,  69,  69,  69,  69,  69,  69,
+     69,  69,  69,  69,  69,  69,  69,  69,  69,  69,  69,  69,  69,  69,  69,  69,
+     70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  70,
+     70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  70,
+     71,  71,  71,  71,  71,  71,  71,  71,  71,  71,  71,  71,  71,  71,  71,  71,
+     71,  71,  71,  71,  71,  71,  71,  71,  71,  71,  71,  71,  71,  71,  71,  71,
+     72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,
+     72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,
+     72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,
+     73,  73,  73,  73,  73,  73,  73,  73,  73,  73,  73,  73,  73,  73,  73,  73,
+     73,  73,  73,  73,  73,  73,  73,  73,  73,  73,  73,  73,  73,  73,  73,  73,
+     73,  73,  73,  73,  73,  73,  73,  73,  73,  73,  73,  73,  73,  73,  73,  73,
+     74,  74,  74,  74,  74,  74,  74,  74,  74,  74,  74,  74,  74,  74,  74,  74,
+     74,  74,  74,  74,  74,  74,  74,  74,  74,  74,  74,  74,  74,  74,  74,  74,
+     74,  74,  74,  74,  74,  74,  74,  74,  74,  74,  74,  74,  74,  74,  74,  74,
+     75,  75,  75,  75,  75,  75,  75,  75,  75,  75,  75,  75,  75,  75,  75,  75,
+     75,  75,  75,  75,  75,  75,  75,  75,  75,  75,  75,  75,  75,  75,  75,  75,
+     75,  75,  75,  75,  75,  75,  75,  75,  75,  75,  75,  75,  75,  75,  75,  75,
+     76,  76,  76,  76,  76,  76,  76,  76,  76,  76,  76,  76,  76,  76,  76,  76,
+     76,  76,  76,  76,  76,  76,  76,  76,  76,  76,  76,  76,  76,  76,  76,  76,
+     76,  76,  76,  76,  76,  76,  76,  76,  76,  76,  76,  76,  76,  76,  76,  76,
+     77,  77,  77,  77,  77,  77,  77,  77,  77,  77,  77,  77,  77,  77,  77,  77,
+     77,  77,  77,  77,  77,  77,  77,  77,  77,  77,  77,  77,  77,  77,  77,  77,
+     77,  77,  77,  77,  77,  77,  77,  77,  77,  77,  77,  77,  77,  77,  77,  77,
+     77,  77,  77,  77,  77,  77,  77,  77,  77,  77,  77,  77,  77,  77,  77,  77,
+     78,  78,  78,  78,  78,  78,  78,  78,  78,  78,  78,  78,  78,  78,  78,  78,
+     78,  78,  78,  78,  78,  78,  78,  78,  78,  78,  78,  78,  78,  78,  78,  78,
+     78,  78,  78,  78,  78,  78,  78,  78,  78,  78,  78,  78,  78,  78,  78,  78,
+     79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,
+     79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,
+     80,  80,  80,  80,  80,  80,  80,  80,  80,  80,  80,  80,  80,  80,  80,  80,
+     80,  80,  80,  80,  80,  80,  80,  80,  80,  80,  80,  80,  80,  80,  80,  80,
+     81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,
+     81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,
+     82,  82,  82,  82,  82,  82,  82,  82,  82,  82,  82,  82,  82,  82,  82,  82,
+     82,  82,  82,  82,  82,  82,  82,  82,  82,  82,  82,  82,  82,  82,  82,  82,
+     83,  83,  83,  83,  83,  83,  83,  83,  83,  83,  83,  83,  83,  83,  83,  83,
+     83,  83,  83,  83,  83,  83,  83,  83,  83,  83,  83,  83,  83,  83,  83,  83,
+     84,  84,  84,  84,  84,  84,  84,  84,  84,  84,  84,  84,  84,  84,  84,  84,
+     84,  84,  84,  84,  84,  84,  84,  84,  84,  84,  84,  84,  84,  84,  84,  84,
+     85,  85,  85,  85,  85,  85,  85,  85,  85,  85,  85,  85,  85,  85,  85,  85,
+     85,  85,  85,  85,  85,  85,  85,  85,  85,  85,  85,  85,  85,  85,  85,  85,
+     86,  86,  86,  86,  86,  86,  86,  86,  86,  86,  86,  86,  86,  86,  86,  86,
+     86,  86,  86,  86,  86,  86,  86,  86,  86,  86,  86,  86,  86,  86,  86,  86,
+     87,  87,  87,  87,  87,  87,  87,  87,  87,  87,  87,  87,  87,  87,  87,  87,
+     87,  87,  87,  87,  87,  87,  87,  87,  87,  87,  87,  87,  87,  87,  87,  87,
+     88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,
+     88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,
+     89,  89,  89,  89,  89,  89,  89,  89,  89,  89,  89,  89,  89,  89,  89,  89,
+     89,  89,  89,  89,  89,  89,  89,  89,  89,  89,  89,  89,  89,  89,  89,  89,
+     89,  89,  89,  89,  89,  89,  89,  89,  89,  89,  89,  89,  89,  89,  89,  89,
+     90,  90,  90,  90,  90,  90,  90,  90,  90,  90,  90,  90,  90,  90,  90,  90,
+     91,  91,  91,  91,  91,  91,  91,  91,  91,  91,  91,  91,  91,  91,  91,  91,
+     91,  91,  91,  91,  91,  91,  91,  91,  91,  91,  91,  91,  91,  91,  91,  91,
+     92,  92,  92,  92,  92,  92,  92,  92,  92,  92,  92,  92,  92,  92,  92,  92,
+     92,  92,  92,  92,  92,  92,  92,  92,  92,  92,  92,  92,  92,  92,  92,  92,
+     93,  93,  93,  93,  93,  93,  93,  93,  93,  93,  93,  93,  93,  93,  93,  93,
+     93,  93,  93,  93,  93,  93,  93,  93,  93,  93,  93,  93,  93,  93,  93,  93,
+     94,  94,  94,  94,  94,  94,  94,  94,  94,  94,  94,  94,  94,  94,  94,  94,
+     94,  94,  94,  94,  94,  94,  94,  94,  94,  94,  94,  94,  94,  94,  94,  94,
+     95,  95,  95,  95,  95,  95,  95,  95,  95,  95,  95,  95,  95,  95,  95,  95,
+     95,  95,  95,  95,  95,  95,  95,  95,  95,  95,  95,  95,  95,  95,  95,  95,
+     96,  96,  96,  96,  96,  96,  96,  96,  96,  96,  96,  96,  96,  96,  96,  96,
+     96,  96,  96,  96,  96,  96,  96,  96,  96,  96,  96,  96,  96,  96,  96,  96,
+     97,  97,  97,  97,  97,  97,  97,  97,  97,  97,  97,  97,  97,  97,  97,  97,
+     97,  97,  97,  97,  97,  97,  97,  97,  97,  97,  97,  97,  97,  97,  97,  97,
+     98,  98,  98,  98,  98,  98,  98,  98,  98,  98,  98,  98,  98,  98,  98,  98,
+     98,  98,  98,  98,  98,  98,  98,  98,  98,  98,  98,  98,  98,  98,  98,  98,
+     99,  99,  99,  99,  99,  99,  99,  99,  99,  99,  99,  99,  99,  99,  99,  99,
+     99,  99,  99,  99,  99,  99,  99,  99,  99,  99,  99,  99,  99,  99,  99,  99,
+     99,  99,  99,  99,  99,  99,  99,  99,  99,  99,  99,  99,  99,  99,  99,  99,
+    100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100,
+    100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100,
+    100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100,
+    101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101,
+    101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101,
+    102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102,
+    102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102,
+    103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103,
+    103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103,
+    104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104,
+    104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104,
+    105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105,
+    105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106,
+    107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107,
+    107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107,
+    108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108,
+    108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108,
+    109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109,
+    109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109,
+    110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110,
+    110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110,
+    110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110,
+    111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111,
+    111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111,
+    111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111,
+    111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111,
+    112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112,
+    113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+    113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+    114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114,
+    114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114,
+    114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114,
+    115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115,
+    116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116,
+    116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116,
+    117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117,
+    117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117,
+    118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118,
+    118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118,
+    119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119,
+    119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119,
+    120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
+    120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
+    121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+    121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+    121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+    122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+    122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+    122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+    122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+    123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+    123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+    123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+    124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+    124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+    125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+    125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+    126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+    126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+    129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+    129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+    129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+    130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+    131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+    131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+    132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+    132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+    133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+    133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+    134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+    134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+    134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+    135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+    135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+    135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+    136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+    136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+    137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+    137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+    138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138,
+    138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138,
+    139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139,
+    139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139,
+    140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,
+    140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,
+    141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141,
+    141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141,
+    142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142,
+    142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142,
+    143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143,
+    143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143,
+    143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143,
+    144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144,
+    144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144,
+    144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144,
+    144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144,
+    145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145,
+    145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145,
+    145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145,
+    146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146,
+    146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146,
+    147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147,
+    147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147,
+    147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147,
+    148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148,
+    148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148,
+    148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148,
+    149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149,
+    149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149,
+    150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150,
+    150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150,
+    151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151,
+    151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151,
+    152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152,
+    152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152,
+    153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153,
+    153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153,
+    154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154,
+    154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154,
+    154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154,
+    155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155,
+    155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155,
+    155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155,
+    156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156,
+    157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157,
+    158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
+    159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+    159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+    160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+    160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+    161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+    161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+    161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+    162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+    162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+    162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+    163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+    164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+    164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+    165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+    165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+    166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
+    166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
+    167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167,
+    167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167,
+    167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167,
+    168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168,
+    168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168,
+    168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168,
+    168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168,
+    169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169,
+    169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169,
+    169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169,
+    170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170,
+    170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170,
+    171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171,
+    171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171,
+    172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172,
+    172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172,
+    173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173,
+    173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173,
+    173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173,
+    174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174,
+    174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174,
+    175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175,
+    175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175,
+    175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175,
+    176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176,
+    176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176,
+    177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177,
+    177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177,
+    178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+    178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+    178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+    179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179,
+    179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179,
+    179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179,
+    180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180,
+    180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180,
+    180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180,
+    181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181,
+    181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181,
+    181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181,
+    182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182,
+    182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182,
+    182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182,
+    183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183,
+    183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183,
+    183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183,
+    183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184,
+    184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184,
+    185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185,
+    185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185,
+    186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186,
+    186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186,
+    187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187,
+    187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187,
+    188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188,
+    188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188,
+    188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189,
+    189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189,
+    190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190,
+    190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190,
+    191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191,
+    191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191,
+    192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192,
+    192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192,
+    193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193,
+    193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193,
+    194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194,
+    194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194,
+    195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195,
+    195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195,
+    196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196,
+    196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196,
+    197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197,
+    197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197,
+    198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198,
+    198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198,
+    199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199,
+    199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199,
+    200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200,
+    200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200,
+    201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201,
+    201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201,
+    201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202,
+    202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202,
+    202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203,
+    203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203,
+    204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204,
+    204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204,
+    205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205,
+    205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205,
+    206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206,
+    206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206,
+    207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207,
+    207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207,
+    207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207,
+    208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208,
+    208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208,
+    208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208,
+    208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209,
+    209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209,
+    209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209,
+    210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210,
+    210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210,
+    211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211,
+    211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211,
+    212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212,
+    212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212,
+    212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212,
+    213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213,
+    213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213,
+    213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213,
+    214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214,
+    214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214,
+    214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214,
+    215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215,
+    215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215,
+    215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215,
+    216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216,
+    216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216,
+    217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217,
+    217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217,
+    218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218,
+    218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218,
+    218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219,
+    219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219,
+    219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219,
+    220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220,
+    220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220,
+    220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220,
+    221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221,
+    221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221,
+    222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222,
+    222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222,
+    223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223,
+    223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223,
+    224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224,
+    224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224,
+    225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225,
+    225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225,
+    226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226,
+    226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226,
+    227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227,
+    227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227,
+    227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228,
+    228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228,
+    229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229,
+    229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229,
+    229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230,
+    230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230,
+    231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231,
+    231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231,
+    232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232,
+    232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232,
+    233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233,
+    233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233,
+    233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233,
+    234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234,
+    234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234,
+    234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234,
+    234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235,
+    235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235,
+    236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236,
+    236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236,
+    236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236,
+    237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237,
+    237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237,
+    237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237,
+    238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238,
+    238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238,
+    239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239,
+    239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239,
+    239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240,
+    240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241,
+    242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242,
+    242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242,
+    243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243,
+    243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243,
+    244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244,
+    244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244,
+    245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245,
+    245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245,
+    245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246,
+    246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246,
+    246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246,
+    247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247,
+    248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248,
+    248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248,
+    249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249,
+    249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249,
+    250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250,
+    250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250,
+    250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251,
+    251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251,
+    251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251,
+    252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252,
+    252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252,
+    252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253,
+    253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253,
+    254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254,
+    254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254,
+    255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
+    255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
+    256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256,
+    256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256,
+    257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257,
+    257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257,
+    258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258,
+    258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258,
+    259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259,
+    259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259,
+    259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260,
+    260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260,
+    261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261,
+    261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261,
+    261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261,
+    262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262,
+    262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262,
+    262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262,
+    262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262,
+    263, 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, 263,
+    263, 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, 263,
+    263, 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, 263,
+    264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264,
+    264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264,
+    265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266,
+    266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266,
+    267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267,
+    267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267,
+    268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268,
+    268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268,
+    268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269,
+    269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269,
+    270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270,
+    270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270,
+    271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271,
+    271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271,
+    272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272,
+    272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272,
+    273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273,
+    273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273,
+    273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274,
+    274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274,
+    274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    275, 275, 275, 275, 275, 275, 275, 275, 275, 275, 275, 275, 275, 275, 275, 275,
+    275, 275, 275, 275, 275, 275, 275, 275, 275, 275, 275, 275, 275, 275, 275, 275,
+    275, 275, 275, 275, 275, 275, 275, 275, 275, 275, 275, 275, 275, 275, 275, 275,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+    276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+    277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277,
+    277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277,
+    278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278,
+    278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279,
+    279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279,
+    279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279,
+    280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280,
+    280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280,
+    280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281,
+    281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281,
+    282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282,
+    282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282,
+    282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282,
+    283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283,
+    283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283,
+    283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283,
+    284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284,
+    284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284,
+    285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285,
+    285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285,
+    286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286,
+    286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286,
+    287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287,
+    287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287,
+    288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288,
+    288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288,
+    288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288,
+    289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289,
+    289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289,
+    289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289,
+    290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290,
+    290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290,
+    291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291,
+    291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291,
+    292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292,
+    292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292,
+    293, 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, 293,
+    293, 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, 293,
+    294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294,
+    294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294,
+    295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295,
+    295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295,
+    295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295,
+    296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296,
+    296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296,
+    296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296,
+    297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297,
+    297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297,
+    298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298,
+    298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298,
+    299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299,
+    299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299,
+    300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300,
+    300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300,
+    301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301,
+    301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301,
+    301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301,
+    302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302,
+    302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302,
+    302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302,
+    302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303,
+    303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303,
+    304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304,
+    304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304,
+    304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305,
+    305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305,
+    306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306,
+    306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306,
+    306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307,
+    307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307,
+    308, 308, 308, 308, 308, 308, 308, 308, 308, 308, 308, 308, 308, 308, 308, 308,
+    308, 308, 308, 308, 308, 308, 308, 308, 308, 308, 308, 308, 308, 308, 308, 308
+};
+
+RE_UINT32 re_get_block(RE_UINT32 codepoint) {
+    RE_UINT32 field_2;
+    RE_UINT32 field_1;
+    RE_UINT32 field_0;
+    RE_UINT32 v;
+
+    field_2 = codepoint >> 10;
+    field_1 = (codepoint >> 5) & 0x1F;
+    field_0 = codepoint & 0x1F;
+
+    v = re_block_table_1[field_2];
+    v = re_block_table_2[(v << 5) | field_1];
+    v = re_block_table_3[(v << 5) | field_0];
+
+    return v;
+}
+
+/* Canonical_Combining_Class. */
+static RE_UINT8 re_canonical_combining_class_table_1[] = {
+     0,  1,  2,  3,  4,  5,  6,  7,  8,  9,  9, 10, 11,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9, 12, 13,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9, 14, 15,
+    16,  9, 17, 18, 19, 20, 21, 22,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9, 23, 24,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9, 25,
+     9,  9,  9,  9, 26,  9,  9,  9, 27,  9, 28,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9
+};
+
+static RE_UINT8 re_canonical_combining_class_table_2[] = {
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   1,   2,   3,   4,   0,   0,   0,   0,
+      0,   0,   0,   0,   5,   0,   0,   0,   0,   0,   0,   0,   6,   7,   8,   0,
+      9,   0,  10,  11,   0,   0,  12,  13,  14,  15,  16,   0,   0,   0,   0,  17,
+     18,  19,  20,   0,   0,   0,  21,  22,   0,  23,  24,   0,   0,  23,  25,  26,
+      0,  23,  25,   0,   0,  23,  25,   0,   0,  23,  25,   0,   0,   0,  25,   0,
+      0,   0,  27,   0,   0,  23,  25,   0,   0,  28,  25,   0,   0,   0,  29,   0,
+      0,  30,  31,   0,   0,  32,  33,   0,  34,  35,   0,  36,  37,   0,  38,   0,
+      0,  39,   0,   0,  40,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  41,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,  42,  42,   0,   0,   0,   0,  43,   0,
+      0,   0,   0,   0,   0,  44,   0,   0,   0,  45,   0,   0,   0,   0,   0,   0,
+     46,   0,   0,  47,   0,  48,  49,   0,   0,  50,  51,  52,   0,  53,   0,  54,
+      0,  55,   0,   0,   0,   0,  56,  57,   0,   0,   0,   0,   0,   0,  58,  59,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,  60,  61,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,  62,   0,   0,   0,  63,   0,   0,   0,  64,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,  65,   0,   0,  66,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,  67,  68,   0,   0,  69,   0,   0,   0,   0,   0,   0,   0,   0,
+     70,  71,   0,   0,   0,   0,  51,  72,   0,  73,  74,   0,   0,  75,  76,   0,
+      0,   0,   0,   0,   0,  77,  78,  79,   0,   0,   0,   0,   0,   0,   0,  25,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,  80,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,  81,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  82,
+      0,   0,   0,   0,   0,   0,   0,  49,   0,   0,   0,  83,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     84,  85,   0,   0,   0,   0,   0,  86,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,  87,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,  88,   0,   0,   0,   0,  89,   0,   0,   0,   0,   0,
+      0,   0,  70,  63,   0,  90,   0,   0,  91,  92,   0,  75,   0,   0,  93,   0,
+      0,  94,   0,   0,   0,   0,   0,  95,   0,  96,  25,  97,   0,   0,   0,   0,
+      0,   0,  98,   0,   0,   0,  99,   0,   0,   0,   0,   0,   0,  63, 100,   0,
+      0,  63,   0,   0,   0, 101,   0,   0,   0, 102,   0,   0,   0,   0,   0,   0,
+      0,  90,   0,   0,   0,   0,   0,   0,   0, 103, 104,   0,   0,   0,   0,  76,
+      0,  42, 105,   0, 106,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,  63,   0,   0,   0,   0,   0,   0,   0,   0, 107,   0, 108,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0, 109,   0, 110,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 111,
+      0,   0,   0,   0, 112,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 113, 114, 115,   0,   0,
+      0,   0, 116,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    117, 118,   0,   0,   0,   0,   0,   0,   0, 110,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0, 119,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0, 120,   0,   0,   0, 121,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0
+};
+
+static RE_UINT8 re_canonical_combining_class_table_3[] = {
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  2,  3,  3,  3,  3,  2,  4,  3,  3,  3,  3,
+     3,  5,  5,  3,  3,  3,  3,  5,  5,  3,  3,  3,  3,  3,  3,  3,
+     3,  3,  3,  3,  6,  6,  6,  6,  6,  3,  3,  3,  3,  1,  1,  1,
+     1,  1,  1,  1,  1,  7,  1,  3,  3,  3,  1,  1,  1,  3,  3,  0,
+     1,  1,  1,  3,  3,  3,  3,  1,  2,  3,  3,  1,  8,  9,  9,  8,
+     9,  9,  8,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  1,  1,  1,  1,  1,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  3,  1,  1,  1,  1,  3,  1,  1,  1, 10,  3,  1,  1,  1,  1,
+     1,  1,  3,  3,  3,  3,  3,  3,  1,  1,  3,  1,  1, 10, 11,  1,
+    12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 21, 22, 23, 24,  0, 25,
+     0, 26, 27,  0,  1,  3,  0, 20,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     1,  1,  1,  1,  1,  1,  1,  1, 28, 29, 30,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 31, 32, 33, 28, 29,
+    30, 34, 35,  1,  1,  3,  3,  1,  1,  1,  1,  1,  3,  1,  1,  3,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    36,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  1,  1,  1,  1,  1,  1,  1,  0,  0,  1,
+     1,  1,  1,  3,  1,  0,  0,  1,  1,  0,  3,  1,  1,  3,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0, 37,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     1,  3,  1,  1,  3,  1,  1,  3,  3,  3,  1,  3,  3,  1,  3,  1,
+     1,  1,  3,  1,  3,  1,  3,  1,  3,  1,  1,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  1,  1,  1,  1,
+     1,  1,  3,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  3,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  1,  1,  1,  1,  0,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  0,  1,  1,  1,  0,  1,  1,  1,  1,  1,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  3,  3,  3,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  3,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  0,  3,  1,  1,  3,  1,  1,  3,  1,  1,  1,  3,  3,  3,
+    31, 32, 33,  1,  1,  1,  3,  1,  1,  3,  3,  1,  1,  1,  1,  1,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 38,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 39,  0,  0,
+     0,  1,  3,  1,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 39,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 39,  0,  0,
+     0,  0,  0,  0,  0, 40, 41,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 39, 39,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 39,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0, 42, 42, 39,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0, 43, 43, 43, 43,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0, 44, 44, 39,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0, 45, 45, 45, 45,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  3,  3,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  3,  0,  3,  0,  4,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0, 46, 47,  0, 48,  0,  0,  0,  0,  0, 47, 47, 47, 47,  0,  0,
+    47,  0,  1,  1, 39,  0,  1,  1,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  3,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0, 38,  0, 39, 39,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  3,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  1,  1,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0, 39,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0, 39,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0, 11,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0, 10,  1,  3,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  1,  3,  0,  0,  0,  0,  0,  0,  0,
+    39,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  1,  1,  1,  1,  1,  1,  1,  1,  0,  0,  3,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     1,  1,  1,  1,  1,  3,  3,  3,  3,  3,  3,  1,  1,  3,  0,  3,
+     3,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0, 38,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0, 39,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  3,  1,  1,  1,
+     1,  1,  1,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 39, 39,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0, 38,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0, 39, 39,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0, 38,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     1,  1,  1,  0,  6,  3,  3,  3,  3,  3,  1,  1,  3,  3,  3,  3,
+     1,  0,  6,  6,  6,  6,  6,  6,  6,  0,  0,  0,  0,  3,  0,  0,
+     0,  0,  0,  0,  1,  0,  0,  0,  1,  1,  0,  0,  0,  0,  0,  0,
+     1,  1,  3,  1,  1,  1,  1,  1,  1,  1,  3,  1,  1,  9, 49,  3,
+     5,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  2, 11, 11,  3,  0,  1,  8,  3,  1,  3,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     1,  1,  6,  6,  1,  1,  1,  1,  6,  6,  6,  1,  1,  0,  0,  0,
+     0,  1,  0,  0,  0,  6,  6,  1,  3,  1,  6,  6,  3,  3,  3,  3,
+     1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,
+     1,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 39,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 50, 11,  2, 10, 51, 51,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0, 52, 52,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,
+     0,  0,  0,  0,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  1,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     1,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0, 39,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 39,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  3,  3,  3,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0, 39,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0, 38,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    39,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     1,  0,  1,  1,  3,  0,  0,  1,  1,  0,  0,  0,  0,  0,  1,  1,
+     0,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0, 39,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 53,  0,
+     1,  1,  1,  1,  1,  1,  1,  3,  3,  3,  3,  3,  3,  3,  1,  1,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  3,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  1,  1,  1,  1,  1,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  3,  0,  1,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  1,  6,  3,  0,  0,  0,  0, 39,
+     0,  0,  0,  0,  0,  1,  3,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  1,  1,  1,  1,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  1,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  3,  3,  1,  1,  1,  3,  1,  3,  3,  3,
+     3,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0, 39, 38,  0,  0,  0,  0,  0,
+     1,  1,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0, 39, 39,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    39,  0,  0,  0,  0,  0,  0,  0,  0,  0, 38,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0, 39, 38,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0, 38, 39,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 38, 38,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  1,  1,  1,  1,  1,  1,  1,  0,  0,  0,
+     1,  1,  1,  1,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0, 39,  0,  0,  0, 38,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  0,
+     0,  0, 39, 38,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    38,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0, 39, 38,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 39,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 39, 39,  0,
+     0,  0,  0, 38,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0, 39,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0, 39,  0,  0,  0,  0,  0,  0,
+     0,  0, 38,  0, 39, 39,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0, 39,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     6,  6,  6,  6,  6,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     1,  1,  1,  1,  1,  1,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    54, 54,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  6,  0,
+     0,  0,  0,  0,  0,  4,  4,  6,  6,  6,  0,  0,  0, 55,  4,  4,
+     4,  4,  4,  0,  0,  0,  0,  0,  0,  0,  0,  3,  3,  3,  3,  3,
+     3,  3,  3,  0,  0,  1,  1,  1,  1,  1,  3,  3,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  1,  1,  1,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  1,  1,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     1,  1,  1,  1,  1,  1,  1,  0,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  0,  0,  1,  1,  1,  1,  1,
+     1,  1,  0,  1,  1,  0,  1,  1,  1,  1,  1,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  1,  1,  1,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     3,  3,  3,  3,  3,  3,  3,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  1,  1,  1,  1,  1,  1, 38,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0
+};
+
+RE_UINT32 re_get_canonical_combining_class(RE_UINT32 codepoint) {
+    RE_UINT32 field_2;
+    RE_UINT32 field_1;
+    RE_UINT32 field_0;
+    RE_UINT32 v;
+
+    field_2 = codepoint >> 10;
+    field_1 = (codepoint >> 5) & 0x1F;
+    field_0 = codepoint & 0x1F;
+
+    v = re_canonical_combining_class_table_1[field_2];
+    v = re_canonical_combining_class_table_2[(v << 5) | field_1];
+    v = re_canonical_combining_class_table_3[(v << 5) | field_0];
+
+    return v;
+}
+
+/* Cased. */
+static RE_UINT8 re_cased_table_1[] = {
+     0,  1,  2,  2,  3,  2,  2,  4,  5,  6,  2,  7,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  8,  9,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2, 10, 11,
+     2, 12,  2, 13,  2,  2, 14,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2, 15,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2, 16,  2,  2,  2,  2, 17,  2, 18,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2
+};
+
+static RE_UINT8 re_cased_table_2[] = {
+     0,  0,  1,  1,  0,  2,  3,  3,  4,  4,  4,  4,  4,  5,  6,  4,
+     4,  4,  4,  4,  7,  8,  9, 10,  0,  0, 11, 12, 13, 14,  4, 15,
+     4,  4,  4,  4, 16,  4,  4,  4,  4, 17, 18,  4, 19,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  4, 20, 21,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  4,  4, 22,
+     0,  0,  0,  0, 23, 21,  0,  0,  4,  4,  4,  4,  4,  4,  0,  0,
+     4,  4,  4,  4,  4,  4,  4,  4, 22,  4, 24, 25,  4, 26, 27, 28,
+     0,  0,  0, 29, 30,  0,  0,  0, 31, 32, 33,  4, 34,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0, 35,  4, 36,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     4, 37, 38,  4,  4,  4,  4, 39,  4, 40,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  4, 41, 25,  0,  0,  0,  0, 42,  4,  4, 43,  4, 44, 45,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0, 46,  5, 23,  4,  4,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0, 47,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  1,  0,  0,  0,  0,  0,
+     4,  4, 48,  0,  0, 46, 49, 50,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  4, 51,  4, 51,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  4,  4,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  4,  4,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     4,  4, 52,  4, 53, 54, 55,  4, 56, 57, 58,  4,  4,  4,  4,  4,
+     4,  4,  4,  4,  4, 59, 60,  5, 52, 52, 37, 37, 61, 61, 62,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  4,  4, 63,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0, 46, 64, 64, 36,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0
+};
+
+static RE_UINT8 re_cased_table_3[] = {
+      0,   0,   0,   0, 254, 255, 255,   7,   0,   4,  32,   4, 255, 255, 127, 255,
+    255, 255, 255, 255, 255, 255, 255, 247, 240, 255, 255, 255, 255, 255, 239, 255,
+    255, 255, 255,   1,   3,   0,   0,   0,  31,   0,   0,   0,  32,   0,   0,   0,
+      0,   0, 207, 188,  64, 215, 255, 255, 251, 255, 255, 255, 255, 255, 191, 255,
+      3, 252, 255, 255, 255, 255, 254, 255, 255, 255, 127,   0, 255,   1,   0,   0,
+    191,  32, 255, 255, 255, 255, 255, 231, 255, 255,  63,  63, 255,   1, 255, 255,
+     63,  63, 255, 170, 255, 255, 255,  63, 255, 255, 223,  95, 220,  31, 207,  15,
+    255,  31, 220,  31,   0,   0,   2, 128,   0,   0, 255,  31, 132, 252,  47,  62,
+     80, 189,  31, 242, 224,  67,   0,   0,  24,   0,   0,   0,   0,   0, 192, 255,
+    255,   3,   0,   0, 255, 127, 255, 255, 255, 255, 255, 127,  31, 120,  12,   0,
+    191,  32,   0,   0, 255,  63,   0,   0, 252, 255, 255, 255, 255, 120, 255, 255,
+    252,   7,   0,   0,   0,   0,  96,   7,   0,   0, 255, 255, 127,   0, 248,   0,
+    255, 255,   0,   0, 255, 255,  15, 255, 255, 255, 255,  15, 255, 255,   7,   0,
+    255, 255, 223, 255, 255, 255, 255, 223, 100, 222, 255, 235, 239, 255, 255, 255,
+    191, 231, 223, 223, 255, 255, 255, 123,  95, 252, 253, 255,  63, 255, 255, 255,
+    253, 255, 255, 247, 255, 253, 255, 255, 247,  15,   0,   0,  15,   0,   0,   0,
+    255,   3, 255, 255
+};
+
+RE_UINT32 re_get_cased(RE_UINT32 codepoint) {
+    RE_UINT32 field_2;
+    RE_UINT32 field_1;
+    RE_UINT32 field_0;
+    RE_UINT32 offset;
+    RE_UINT32 v;
+
+    field_2 = codepoint >> 10;
+    field_1 = (codepoint >> 5) & 0x1F;
+    field_0 = (codepoint >> 3) & 0x3;
+    offset = codepoint & 0x7;
+
+    v = re_cased_table_1[field_2];
+    v = re_cased_table_2[(v << 5) | field_1];
+    v = re_cased_table_3[(v << 2) | field_0];
+
+    return (v >> offset) & 0x1;
+}
+
+/* Case_Ignorable. */
+static RE_UINT8 re_case_ignorable_table_1[] = {
+     0,  1,  2,  3,  4,  5,  6,  7,  8,  9,  9, 10, 11,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9, 12, 13, 14,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9, 15, 16,
+    17,  9, 18, 19, 20, 21, 22, 23,  9,  9,  9,  9,  9, 24,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9, 25, 26,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9, 27,
+     9,  9,  9,  9, 28,  9, 29,  9, 30,  9, 31,  9, 32,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+    33,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9
+};
+
+static RE_UINT8 re_case_ignorable_table_2[] = {
+      0,   1,   2,   3,   0,   4,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   5,   6,   6,   6,   6,   6,   7,   8,   0,   0,   0,
+      0,   0,   0,   0,   9,   0,   0,   0,   0,   0,  10,   0,  11,  12,  13,  14,
+     15,   0,  16,  17,   0,   0,  18,  19,  20,   5,  21,   0,   0,  22,   0,  23,
+     24,  25,  26,   0,   0,   0,  27,   6,  28,  29,  30,  31,  32,  33,  34,  35,
+     36,  33,  37,  38,  36,  33,  39,  40,  32,  41,  42,  43,  44,   0,  45,   0,
+     46,  47,  48,  43,  32,  41,  49,  43,  50,  51,  34,  43,  32,   0,  52,   0,
+      0,  53,  54,   0,   0,  55,  56,   0,  57,  58,   0,  59,  60,  61,  62,   0,
+      0,  63,  64,  65,  66,   0,   0,  33,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  67,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,  68,  68,  69,  69,   0,  70,  71,   0,
+     72,   0,  73,   0,  74,  75,   0,   0,   0,  76,   0,   0,   0,   0,   0,   0,
+     77,   0,  78,  79,   0,  80,   3,   0,  81,  82,  44,  83,  50,  84,   0,  85,
+      0,  86,   0,  87,   0,   0,  88,  89,   0,  90,   6,  91,  92,   6,   6,  93,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  94,  95,  96,
+     97,  98,   0,  99, 100,   0,   5, 101,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0, 102,   0,   0,   0, 103,   0,   0,   0, 104,   0,   0,   0,   6,
+      0, 105,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    106, 107,   0,   0, 108,   0,   0, 109,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    110,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,  87,   0,   0,   0,   0,   0,   0,   0,   0,
+    111,   0,   0, 112, 113,   0,   0, 114,   6,  50,   0,  17, 115,   0,   0,  57,
+    116, 117,   0,   0,   0,   0, 118, 119,   0, 120, 121,   0,  28, 122, 105,  74,
+      0, 123, 124, 125,   0, 126, 127, 128,   0,   0,  92, 129,   0,   0,   0, 130,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   0, 131,  50,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    132, 133, 134,   0,   0,   0,   0, 135,   1,   2,   3,  17,  47,   0,   0, 136,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 137,
+      0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0, 138,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    139, 140,   0,   0,   0,   0,   0,  74,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0, 141,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0, 142,   0,   0,   0,   0,  22,   0,   0,   0,   0,   0,
+     32, 143, 144, 135,  50, 145, 146,   0,  28, 147,   0, 148,  50, 149, 150,   0,
+      0, 151,   0,   0,   0,   0, 135, 152,  50,  51,   3, 153,   0,   0,   0,   0,
+      0, 143, 154,   0,   0, 155, 156,   0,   0,   0,   0,   0,   0, 157, 158,   0,
+      0, 159,   3,   0,   0, 160,   0,   0,  67, 161,   0,   0,   0,   0,   0,   0,
+      0, 162,   0,   0,   0,   0,   0,   0,   0, 163,  73,   0,   0,   0, 164,   3,
+    165, 166, 167,   0, 168,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0, 169,   0,   0, 131, 170,   0,   0,   0, 171, 172,   0, 173,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0, 174,   0,   0,   0,   0,   0,   0,   0,   0,
+      0, 175,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0, 176,   0, 177,  81,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 105,   0, 178,   0,   0, 179,
+      0,   0,   0,   0, 180,  81,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 181, 182, 183,   0,   0,
+      0,   0, 184,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      6, 185,   6, 186, 187, 188,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    189, 190,   0,   0,   0,   0,   0,   0,   0, 191,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0, 192,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0, 177,   0,   0,   0, 193,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  92,
+     32,   6,   6,   6,   0,   0,   0,   0,   6,   6,   6,   6,   6,   6,   6, 133,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0
+};
+
+static RE_UINT8 re_case_ignorable_table_3[] = {
+      0,   0,   0,   0, 128,  64,   0,   4,   0,   0,   0,  64,   1,   0,   0,   0,
+      0, 161, 144,   1,   0,   0, 255, 255, 255, 255, 255, 255, 255, 255,  48,   4,
+    176,   0,   0,   0, 248,   3,   0,   0,   0,   0,   0, 130,   0,   0, 254, 255,
+    255, 255, 255, 191, 182,   0,   0,   0,   0,   0,  16,   0,  63,   0, 255,  23,
+      1, 248, 255, 255,   0,   0,   1,   0,   0,   0, 192, 191, 255,  61,   0,   0,
+      0, 128,   2,   0, 255,   7,   0,   0, 192, 255,   1,   0,   0, 248,  63,  36,
+      0,   0, 192, 255, 255,  63,   0,   0,   0,   0,   0,  14,   0,   0, 248, 255,
+      7,   0,   0,   0,   0,   0,   0,  20, 254,  33, 254,   0,  12,   0,   2,   0,
+      2,   0,   0,   0,   0,   0,   0,  16,  30,  32,   0,   0,  12,   0,   0,  64,
+      6,   0,   0,   0, 134,  57,   2,   0,   0,   0,  35,   0, 190,  33,   0,   0,
+     12,   0,   0, 252,   0,   0,   0, 144,  30,  32,  96,   0,  12,   0,   0,   0,
+      4,   0,   0,   0,   1,  32,   0,   0,  17,   0,   0,   0,   0,   0,   0, 192,
+    193,  61,  96,   0,  64,  48,   0,   0,   3,   0,   0,   0,   0,   0,   0,  24,
+      0,   4,  92,   0,   0,   0, 242,   7, 192, 127,   0,   0,   0,   0, 242,  31,
+     64,  63,   0,   0,   0,   0,   0,   3,   0,   0, 160,   2,   0,   0, 254, 127,
+    223, 224, 255, 254, 255, 255, 255,  31,  64,   0,   0,   0,   0, 224, 253, 102,
+      0,   0,   0, 195,   1,   0,  30,   0, 100,  32,   0,  32,   0,   0,   0, 224,
+      0,   0,  28,   0,   0,   0,  12,   0,   0,   0, 176,  63,  64, 254, 143,  32,
+      0, 120,   0,   0,   8,   0,   0,   0,  96,   0,   0,   0,   0,   2,   0,   0,
+    135,   1,   4,  14,   0,   0, 128,   9,   0,   0,  64, 127, 229,  31, 248, 159,
+    128,   0, 255, 255,  15,   0,   0,   0,   0,   0, 208,  23,   0, 248,  15,   0,
+     60,  59,   0,   0,  64, 163,   3,   0,   0, 240, 207,   0,   0,   0,   0,  63,
+      0,   0, 247, 255, 253,  33,  16,   3,   0, 240, 255, 255, 255,   7,   0,   1,
+      0,   0,   0, 248, 255, 255, 255, 251,   0,   0,   0, 160,   3, 224,   0, 224,
+      0, 224,   0,  96,   0, 248,   0,   3, 144, 124,   0,   0, 223, 255,   2, 128,
+      0,   0, 255,  31, 255, 255,   1,   0,   0,   0,   0,  48,   0, 128,   3,   0,
+      0, 128,   0, 128,   0, 128,   0,   0,  32,   0,   0,   0,   0,  60,  62,   8,
+      0,   0,   0, 126,   0,   0,   0, 112,   0,   0,  32,   0,   0,  16,   0,   0,
+      0, 128, 247, 191,   0,   0,   0, 240,   0,   0,   3,   0,   0,   7,   0,   0,
+     68,   8,   0,   0,  96,  16,   0,   0,  48,   0,   0,   0, 255, 255,   3, 128,
+    192,  63,   0,   0, 128, 255,   3,   0,   0,   0, 200,  51,   0, 126, 102,   0,
+      8,  16,   0,   0,   0,   0,   1,  16,   0,   0, 157, 193,   2,   0,   0,  32,
+      0,  48,  88,   0,   0,  14,   0,   0,  32,  33,   0,   0,   0,   0, 252, 255,
+    255, 255,   8,   0, 255, 255,   0,   0,   0,   0,  36,   0,   0,   0,   0, 128,
+      8,   0,   0,  14,   0,   0,   0,  32,   0,   0, 192,   7, 110, 240,   0,   0,
+      0,   0,   0, 135, 240,   0,   0,   0,   0,  24,   0,   0,   0,   0,   0, 255,
+    127,   0,   0,   0,   0,   0, 120,  38,   0,  32,   0,   0, 128, 239,  31,   0,
+      0,   0,   8,   0,   0,   0, 192, 127,   0, 158,   0,   0,   0, 128, 211,  64,
+    248,   7,   0,   0, 192,  31,  31,   0,  92,   0,   0,  64,   0,   0, 248, 133,
+     13,   0,   0,   0,   0,   0,  60, 176,   1,   0,   0,  48,   0,   0, 248, 167,
+      0,  40, 191,   0, 188,  15,   0,   0,   0, 128, 255,   6,   0,   0,   0,  88,
+      0,   0, 240,  12, 254,   7,   0,   0,   0,   0, 248, 121, 128,   0, 126,  14,
+      0, 252, 127,   3,   0,   0, 127, 191, 255, 252, 109,   0,   0,   0, 126, 180,
+    191,   0,   0,   0,   0,   0, 163,   0,   0,   0,  24,   0,   0,   0, 255,   1,
+      0,   0,  31,   0,   0,   0, 127,   0,   0, 128, 255, 255,  27,   0,   0,   0,
+      0,   0,   0,  96, 128,   3, 248, 255, 231,  15,   0,   0,   0,  60,   0,   0,
+     28,   0,   0,   0, 255, 255, 127, 248, 255,  31,  32,   0,  16,   0,   0, 248,
+    254, 255,   0,   0, 127, 255, 255, 249, 219,   7,   0,   0,   0,   0, 255,  63,
+      0, 240,   0,   0, 240,  15,   0,   0
+};
+
+RE_UINT32 re_get_case_ignorable(RE_UINT32 codepoint) {
+    RE_UINT32 field_2;
+    RE_UINT32 field_1;
+    RE_UINT32 field_0;
+    RE_UINT32 offset;
+    RE_UINT32 v;
+
+    field_2 = codepoint >> 10;
+    field_1 = (codepoint >> 5) & 0x1F;
+    field_0 = (codepoint >> 3) & 0x3;
+    offset = codepoint & 0x7;
+
+    v = re_case_ignorable_table_1[field_2];
+    v = re_case_ignorable_table_2[(v << 5) | field_1];
+    v = re_case_ignorable_table_3[(v << 2) | field_0];
+
+    return (v >> offset) & 0x1;
+}
+
+/* Changes_When_Casefolded. */
+static RE_UINT8 re_changes_when_casefolded_table_1[] = {
+     0,  1,  2,  2,  3,  2,  2,  4,  5,  6,  2,  7,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  8,  9,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2, 10, 11,
+     2, 12,  2, 13,  2,  2, 14,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2, 15,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2, 16,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2
+};
+
+static RE_UINT8 re_changes_when_casefolded_table_2[] = {
+     0,  0,  1,  0,  0,  2,  3,  0,  4,  5,  6,  7,  8,  9, 10, 11,
+     4, 12, 13,  0,  0,  0,  0,  0,  0,  0, 14, 15, 16, 17, 18, 19,
+    20, 21,  0,  4, 22,  4, 23,  4,  4, 24, 25,  0, 26,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0, 20, 27,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 28,
+     0,  0,  0,  0, 29, 30,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     4,  4,  4,  4, 31,  4,  4,  4, 32, 33, 34, 35, 20, 36, 37, 38,
+     0,  0,  0,  0,  0,  0,  0,  0,  0, 39,  0, 21, 40,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0, 41, 21,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    20, 42,  0, 43,  4,  4,  4, 44,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  4, 45, 46,  0,  0,  0,  0, 47,  4, 48, 49, 50, 51,  2,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 52, 20, 20,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0, 53,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  0,  0,  0,  0,  0,  0,
+    20, 54,  0,  0,  0, 52, 55,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0, 20, 56,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0, 20,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0, 20,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0, 20, 57,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0
+};
+
+static RE_UINT8 re_changes_when_casefolded_table_3[] = {
+      0,   0,   0,   0, 254, 255, 255,   7,   0,   0,  32,   0, 255, 255, 127, 255,
+     85,  85,  85,  85,  85,  85,  85, 170, 170,  86,  85,  85,  85,  85,  85, 171,
+    214, 206, 219, 177, 213, 210, 174,  17, 176, 173, 170,  74,  85,  85, 214,  85,
+     85,  85,   5, 108, 122,  85,   0,   0,  32,   0,   0,   0,   0,   0,  69, 128,
+     64, 215, 254, 255, 251,  15,   0,   0,   4, 128,  99,  85,  85,  85, 179, 230,
+    255, 255, 255, 255, 255, 255,   0,   0,   1,  84,  85,  85, 171,  42,  85,  85,
+     85,  85, 254, 255, 255, 255, 127,   0, 128,   0,   0,   0, 191,  32,   0,   0,
+      0,   0,   0,  63, 255,   1, 255, 255, 255, 255, 255, 231,  85,  85,  21,  76,
+      0, 255,   0,  63,   0, 255,   0, 255,   0,  63,   0, 170,   0, 255,   0,   0,
+    255, 255, 156,  31, 156,  31,   0,  15,   0,  31, 156,  31,  64,  12,   4,   0,
+      8,   0,   0,   0,   0,   0, 192, 255, 255, 127,   0,   0, 157, 234,  37, 192,
+      5,  40,   4,   0,  85,  21,   0,   0,  85,  85,  85,   5,  84,  85,  84,  85,
+     85,  85,   0, 106,  85,  40,  69,  85,  85, 125,  95,  85, 244,   2,   0,   0,
+      0,   0, 255, 255, 127,   0, 248,   0, 255,   0,   0,   0, 255, 255,  15,   0,
+    255, 255,   7,   0,   3,   0,   0,   0
+};
+
+RE_UINT32 re_get_changes_when_casefolded(RE_UINT32 codepoint) {
+    RE_UINT32 field_2;
+    RE_UINT32 field_1;
+    RE_UINT32 field_0;
+    RE_UINT32 offset;
+    RE_UINT32 v;
+
+    field_2 = codepoint >> 10;
+    field_1 = (codepoint >> 5) & 0x1F;
+    field_0 = (codepoint >> 3) & 0x3;
+    offset = codepoint & 0x7;
+
+    v = re_changes_when_casefolded_table_1[field_2];
+    v = re_changes_when_casefolded_table_2[(v << 5) | field_1];
+    v = re_changes_when_casefolded_table_3[(v << 2) | field_0];
+
+    return (v >> offset) & 0x1;
+}
+
+/* Changes_When_Casemapped. */
+static RE_UINT8 re_changes_when_casemapped_table_1[] = {
+     0,  1,  2,  2,  3,  2,  2,  4,  5,  6,  2,  7,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  8,  9,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2, 10, 11,
+     2, 12,  2, 13,  2,  2, 14,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2, 15,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2, 16,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2
+};
+
+static RE_UINT8 re_changes_when_casemapped_table_2[] = {
+     0,  0,  1,  1,  0,  2,  3,  3,  4,  5,  4,  4,  6,  7,  8,  4,
+     4,  9, 10, 11, 12,  0,  0,  0,  0,  0, 13, 14, 15, 16, 17, 18,
+     4,  4,  4,  4, 19,  4,  4,  4,  4, 20, 21, 22, 23,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  4, 24, 25,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  4,  4, 26,
+     0,  0,  0,  0, 27, 25,  0,  0,  0,  0,  0, 28, 29,  0,  0,  0,
+     4,  4,  4,  4, 30,  4,  4,  4, 26,  4, 31, 32,  4, 33, 34, 35,
+     0,  0,  0,  0,  0,  0,  0,  0,  0, 36, 29,  4, 37,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0, 38,  4, 39,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     4, 40, 41, 42,  4,  4,  4, 43,  4, 44,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  4, 45, 46,  0,  0,  0,  0, 47,  4, 48, 49, 40, 50, 51,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 52, 53,  4,  4,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0, 54,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  1,  0,  0,  0,  0,  0,
+     4,  4, 55,  0,  0, 53, 56, 46,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  4, 57,  4, 57,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  4,  4,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  4,  4,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  4,  4, 58,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0
+};
+
+static RE_UINT8 re_changes_when_casemapped_table_3[] = {
+      0,   0,   0,   0, 254, 255, 255,   7,   0,   0,  32,   0, 255, 255, 127, 255,
+    255, 255, 255, 255, 255, 255, 255, 254, 255, 223, 255, 247, 255, 243, 255, 179,
+    240, 255, 255, 255, 253, 255,  15, 252, 255, 255, 223,  26, 107, 159,  38,  32,
+    141,  31,   4,  96,  32,   0,   0,   0,   0,   0, 207, 184,  64, 215, 255, 255,
+    251, 255, 255, 255, 255, 255, 227, 255, 255, 255, 191, 239,   3, 252, 255, 255,
+    255, 255, 254, 255, 255, 255, 127,   0, 254, 255, 255, 255, 255,   0,   0,   0,
+    191,  32, 255, 255, 255, 255, 255, 231, 255, 255,  63,  63, 255,   1, 255, 255,
+      0,   0,   0,  34,   0,  64,   0,   0, 255, 255, 255,  79,  63,  63, 255, 170,
+    255, 255, 255,  63, 255, 255, 223,  95, 220,  31, 207,  15, 255,  31, 220,  31,
+     64,  12,   4,   0,  24,   0,   0,   0,   0,   0, 192, 255, 255,   3,   0,   0,
+    255, 127, 255, 255, 255, 255, 255, 127, 255, 255, 109, 192,  15, 120,  12,   0,
+    191,  32,   0,   0, 255,  63,   0,   0, 255, 255, 255,  15, 252, 255, 252, 255,
+    255, 255,   0, 254, 255,  56, 223, 255, 252,   7,   0,   0,   0,   0,  96,   0,
+      0,   0,   8,   0,   0,   0, 255, 255, 127,   0, 248,   0, 255, 255,   0,   0,
+    255, 255,  15, 255, 255, 255,   7,   0,  15,   0,   0,   0
+};
+
+RE_UINT32 re_get_changes_when_casemapped(RE_UINT32 codepoint) {
+    RE_UINT32 field_2;
+    RE_UINT32 field_1;
+    RE_UINT32 field_0;
+    RE_UINT32 offset;
+    RE_UINT32 v;
+
+    field_2 = codepoint >> 10;
+    field_1 = (codepoint >> 5) & 0x1F;
+    field_0 = (codepoint >> 3) & 0x3;
+    offset = codepoint & 0x7;
+
+    v = re_changes_when_casemapped_table_1[field_2];
+    v = re_changes_when_casemapped_table_2[(v << 5) | field_1];
+    v = re_changes_when_casemapped_table_3[(v << 2) | field_0];
+
+    return (v >> offset) & 0x1;
+}
+
+/* Changes_When_Lowercased. */
+static RE_UINT8 re_changes_when_lowercased_table_1[] = {
+     0,  1,  2,  2,  3,  2,  2,  4,  5,  6,  2,  7,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  8,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  9,
+     2, 10,  2, 11,  2,  2, 12,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2, 13,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2, 14,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2
+};
+
+static RE_UINT8 re_changes_when_lowercased_table_2[] = {
+     0,  0,  1,  0,  0,  0,  2,  0,  3,  4,  5,  6,  7,  8,  9, 10,
+     3, 11, 12,  0,  0,  0,  0,  0,  0,  0,  0, 13, 14, 15, 16, 17,
+    18, 19,  0,  3, 20,  3, 21,  3,  3, 22, 23,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0, 18, 24,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 18, 18, 25,
+     0,  0,  0,  0, 26, 27,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     3,  3,  3,  3, 28,  3,  3,  3, 29, 30, 31, 32, 30, 33, 34, 35,
+     0,  0,  0,  0,  0,  0,  0,  0,  0, 36,  0, 19, 37,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0, 38, 19,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    18, 39,  0, 40,  3,  3,  3, 41,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  3, 42, 43,  0,  0,  0,  0, 44,  3, 45, 46, 47, 48, 49,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  0,  0,  0,  0,  0,  0,
+    18, 50,  0,  0,  0, 26, 51,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0, 18, 52,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0, 18,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0, 18,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0, 18, 53,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0
+};
+
+static RE_UINT8 re_changes_when_lowercased_table_3[] = {
+      0,   0,   0,   0, 254, 255, 255,   7, 255, 255, 127, 127,  85,  85,  85,  85,
+     85,  85,  85, 170, 170,  84,  85,  85,  85,  85,  85,  43, 214, 206, 219, 177,
+    213, 210, 174,  17, 176, 173, 170,  74,  85,  85, 214,  85,  85,  85,   5, 108,
+    122,  85,   0,   0,   0,   0,  69, 128,  64, 215, 254, 255, 251,  15,   0,   0,
+      0, 128,   0,  85,  85,  85, 144, 230, 255, 255, 255, 255, 255, 255,   0,   0,
+      1,  84,  85,  85, 171,  42,  85,  85,  85,  85, 254, 255, 255, 255, 127,   0,
+    191,  32,   0,   0, 255, 255,  63,   0,   0,   0, 255, 255, 255, 255, 255, 231,
+     85,  85,  21,  64,   0, 255,   0,  63,   0, 255,   0, 255,   0,  63,   0, 170,
+      0, 255,   0,   0,   0, 255,   0,  31,   0,  31,   0,  15,   0,  31,   0,  31,
+     64,  12,   4,   0,   8,   0,   0,   0,   0,   0, 192, 255, 255, 127,   0,   0,
+    157, 234,  37, 192,   5,  40,   4,   0,  85,  21,   0,   0,  85,  85,  85,   5,
+     84,  85,  84,  85,  85,  85,   0, 106,  85,  40,  69,  85,  85, 125,  95,  85,
+    244,   2,   0,   0,   0,   0,  32,   0, 255,   0,   0,   0, 255, 255,  15,   0,
+    255, 255,   7,   0,   3,   0,   0,   0
+};
+
+RE_UINT32 re_get_changes_when_lowercased(RE_UINT32 codepoint) {
+    RE_UINT32 field_2;
+    RE_UINT32 field_1;
+    RE_UINT32 field_0;
+    RE_UINT32 offset;
+    RE_UINT32 v;
+
+    field_2 = codepoint >> 10;
+    field_1 = (codepoint >> 5) & 0x1F;
+    field_0 = (codepoint >> 3) & 0x3;
+    offset = codepoint & 0x7;
+
+    v = re_changes_when_lowercased_table_1[field_2];
+    v = re_changes_when_lowercased_table_2[(v << 5) | field_1];
+    v = re_changes_when_lowercased_table_3[(v << 2) | field_0];
+
+    return (v >> offset) & 0x1;
+}
+
+/* Changes_When_Titlecased. */
+static RE_UINT8 re_changes_when_titlecased_table_1[] = {
+     0,  1,  2,  2,  3,  2,  2,  4,  5,  6,  2,  7,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  8,  9,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2, 10, 11,
+     2, 12,  2, 13,  2,  2, 14,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2, 15,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2, 16,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2
+};
+
+static RE_UINT8 re_changes_when_titlecased_table_2[] = {
+     0,  0,  0,  1,  0,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12,
+     5, 13, 14, 15, 16,  0,  0,  0,  0,  0, 17, 18, 19, 20, 21, 22,
+     0, 23, 24,  5, 25,  5, 26,  5,  5, 27,  0, 28, 29,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 30,
+     0,  0,  0,  0, 31,  0,  0,  0,  0,  0,  0, 32, 33,  0,  0,  0,
+     5,  5,  5,  5, 34,  5,  5,  5, 35, 36, 37, 38, 36, 39, 40, 41,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 33, 23, 42,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0, 23, 43,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0, 23, 44, 45,  5,  5,  5, 46, 24, 47,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  5, 48, 49,  0,  0,  0,  0, 50,  5, 51, 52, 53, 54, 55,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 56, 23, 24, 24,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0, 57,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  0,  0,  0,  0,  0,
+     0, 58, 59,  0,  0,  0, 60, 61,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0, 24, 62,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0, 24,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0, 24,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0, 63, 64,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0
+};
+
+static RE_UINT8 re_changes_when_titlecased_table_3[] = {
+      0,   0,   0,   0, 254, 255, 255,   7,   0,   0,  32,   0,   0,   0,   0, 128,
+    255, 255, 127, 255, 170, 170, 170, 170, 170, 170, 170,  84,  85, 171, 170, 170,
+    170, 170, 170, 212,  41,  17,  36,  70,  42,  33,  81, 162, 208,  86,  85, 181,
+    170, 170,  43, 170, 168, 170,  10, 144, 133, 170, 223,  26, 107, 159,  38,  32,
+    141,  31,   4,  96,  32,   0,   0,   0,   0,   0, 138,  56,   0,   0,   1,   0,
+      0, 240, 255, 255, 255, 127, 227, 170, 170, 170,  47,   9,   0,   0, 255, 255,
+    255, 255, 255, 255,   2, 168, 170, 170,  84, 213, 170, 170, 170, 170,   0,   0,
+    254, 255, 255, 255, 255,   0,   0,   0,   0,   0,   0,  63, 255,   1,   0,   0,
+      0,   0,   0,  34,   0,  64,   0,   0, 170, 170, 234,  15, 255,   0,  63,   0,
+    255,   0, 255,   0,  63,   0, 255,   0, 255,   0, 255,  63, 255,   0, 223,  64,
+    220,   0, 207,   0, 255,   0, 220,   0,  16,   0,   0,   0, 255,   3,   0,   0,
+    255, 255, 255, 127,  98,  21,  72,   0,  10,  80,   8,   0, 191,  32,   0,   0,
+    170,  42,   0,   0, 170, 170, 170,  10, 168, 170, 168, 170, 170, 170,   0, 148,
+    170,  16, 154, 170, 170,   2, 160, 170,   8,   5,   0,   0,   0,   0,  64,   0,
+      0,   0,   8,   0, 127,   0, 248,   0,   0, 255, 255, 255, 255, 255,   0,   0,
+      0,   0,   0, 255, 255, 255, 255,  15, 255, 255,   7,   0, 252, 255, 255, 255,
+     15,   0,   0,   0
+};
+
+RE_UINT32 re_get_changes_when_titlecased(RE_UINT32 codepoint) {
+    RE_UINT32 field_2;
+    RE_UINT32 field_1;
+    RE_UINT32 field_0;
+    RE_UINT32 offset;
+    RE_UINT32 v;
+
+    field_2 = codepoint >> 10;
+    field_1 = (codepoint >> 5) & 0x1F;
+    field_0 = (codepoint >> 3) & 0x3;
+    offset = codepoint & 0x7;
+
+    v = re_changes_when_titlecased_table_1[field_2];
+    v = re_changes_when_titlecased_table_2[(v << 5) | field_1];
+    v = re_changes_when_titlecased_table_3[(v << 2) | field_0];
+
+    return (v >> offset) & 0x1;
+}
+
+/* Changes_When_Uppercased. */
+static RE_UINT8 re_changes_when_uppercased_table_1[] = {
+     0,  1,  2,  2,  3,  2,  2,  4,  5,  6,  2,  7,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  8,  9,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2, 10, 11,
+     2, 12,  2, 13,  2,  2, 14,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2, 15,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2, 16,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2
+};
+
+static RE_UINT8 re_changes_when_uppercased_table_2[] = {
+     0,  0,  0,  1,  0,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12,
+     5, 13, 14, 15, 16,  0,  0,  0,  0,  0, 17, 18, 19, 20, 21, 22,
+     0, 23, 24,  5, 25,  5, 26,  5,  5, 27,  0, 28, 29,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0, 23, 30,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 31,
+     0,  0,  0,  0, 32,  0,  0,  0,  0,  0,  0, 33, 34,  0,  0,  0,
+     5,  5,  5,  5, 35,  5,  5,  5, 36, 37, 38, 39, 24, 40, 41, 42,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 34, 23, 43,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0, 23, 44,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0, 23, 45, 46,  5,  5,  5, 47, 24, 48,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  5, 49, 50,  0,  0,  0,  0, 51,  5, 52, 53, 54, 55, 56,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 57, 23, 24, 24,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0, 58,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  0,  0,  0,  0,  0,
+     0, 59, 60,  0,  0,  0, 61, 62,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0, 24, 63,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0, 24,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0, 24,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0, 64, 65,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0
+};
+
+static RE_UINT8 re_changes_when_uppercased_table_3[] = {
+      0,   0,   0,   0, 254, 255, 255,   7,   0,   0,  32,   0,   0,   0,   0, 128,
+    255, 255, 127, 255, 170, 170, 170, 170, 170, 170, 170,  84,  85, 171, 170, 170,
+    170, 170, 170, 212,  41,  17,  36,  70,  42,  33,  81, 162,  96,  91,  85, 181,
+    170, 170,  45, 170, 168, 170,  10, 144, 133, 170, 223,  26, 107, 159,  38,  32,
+    141,  31,   4,  96,  32,   0,   0,   0,   0,   0, 138,  56,   0,   0,   1,   0,
+      0, 240, 255, 255, 255, 127, 227, 170, 170, 170,  47,   9,   0,   0, 255, 255,
+    255, 255, 255, 255,   2, 168, 170, 170,  84, 213, 170, 170, 170, 170,   0,   0,
+    254, 255, 255, 255, 255,   0,   0,   0, 255, 255, 255, 231,   0,   0,   0,  63,
+    255,   1,   0,   0,   0,   0,   0,  34,   0,  64,   0,   0, 170, 170, 234,  15,
+    255,   0,  63,   0, 255,   0, 255,   0,  63,   0, 255,   0, 255,   0, 255,  63,
+    255, 255, 223,  80, 220,  16, 207,   0, 255,   0, 220,  16,  16,   0,   0,   0,
+    255,   3,   0,   0, 255, 255, 255, 127,  98,  21,  72,   0,  10,  80,   8,   0,
+    191,  32,   0,   0, 170,  42,   0,   0, 170, 170, 170,  10, 168, 170, 168, 170,
+    170, 170,   0, 148, 170,  16, 154, 170, 170,   2, 160, 170,   8,   5,   0,   0,
+      0,   0,  64,   0,   0,   0,   8,   0, 127,   0, 248,   0,   0, 255, 255, 255,
+    255, 255,   0,   0,   0,   0,   0, 255, 255, 255, 255,  15, 255, 255,   7,   0,
+    252, 255, 255, 255,  15,   0,   0,   0
+};
+
+RE_UINT32 re_get_changes_when_uppercased(RE_UINT32 codepoint) {
+    RE_UINT32 field_2;
+    RE_UINT32 field_1;
+    RE_UINT32 field_0;
+    RE_UINT32 offset;
+    RE_UINT32 v;
+
+    field_2 = codepoint >> 10;
+    field_1 = (codepoint >> 5) & 0x1F;
+    field_0 = (codepoint >> 3) & 0x3;
+    offset = codepoint & 0x7;
+
+    v = re_changes_when_uppercased_table_1[field_2];
+    v = re_changes_when_uppercased_table_2[(v << 5) | field_1];
+    v = re_changes_when_uppercased_table_3[(v << 2) | field_0];
+
+    return (v >> offset) & 0x1;
+}
+
+/* Dash. */
+static RE_UINT8 re_dash_table_1[] = {
+    0, 1, 2, 2, 2, 3, 4, 2, 5, 2, 2, 6, 7, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 8,
+    2, 2, 2, 9, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2
+};
+
+static RE_UINT8 re_dash_table_2[] = {
+     0,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  2,  3,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     4,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     5,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     6,  0,  7,  8,  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    11, 12,  4,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    13, 14,  0,  0,  0,  4,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0, 15, 16, 17,  0,  0,  0,  0,  1,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0
+};
+
+static RE_UINT8 re_dash_table_3[] = {
+      0,   0,   0,   0,   0,  32,   0,   0,   0,   4,   0,   0,   0,   0,   0,  64,
+      1,   0,   0,   0,  64,   0,   0,   0,   0,   0,  63,   0,   0,   0,   8,   0,
+      0,   0,   0,   8,   0,   8,   0,   0,   0,   0,   4,   0,   0,   0, 128,   4,
+      0,   0,   0,  12,   0,   0,   0,  16,   0,   0,   1,   0,   0,   0,   6,   0,
+      0,   0,   0,   1,   8,   0,   0,   0
+};
+
+RE_UINT32 re_get_dash(RE_UINT32 codepoint) {
+    RE_UINT32 field_2;
+    RE_UINT32 field_1;
+    RE_UINT32 field_0;
+    RE_UINT32 offset;
+    RE_UINT32 v;
+
+    field_2 = codepoint >> 10;
+    field_1 = (codepoint >> 5) & 0x1F;
+    field_0 = (codepoint >> 3) & 0x3;
+    offset = codepoint & 0x7;
+
+    v = re_dash_table_1[field_2];
+    v = re_dash_table_2[(v << 5) | field_1];
+    v = re_dash_table_3[(v << 2) | field_0];
+
+    return (v >> offset) & 0x1;
+}
+
+/* Decomposition_Type. */
+static RE_UINT8 re_decomposition_type_table_1[] = {
+     0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5, 13, 14, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 16,  5,  5,  5,  5,  5,  5,  5,  5, 17, 18,
+     5,  5,  5,  5, 19, 20, 21,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5, 22, 23,  5,  5,  5,  5,  5, 24, 25,  5, 26,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5, 27,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5
+};
+
+static RE_UINT8 re_decomposition_type_table_2[] = {
+      0,   0,   0,   0,   0,   1,   2,   3,   4,   5,   6,   7,   0,   8,   9,  10,
+     11,  12,   0,   0,   0,  13,  14,  15,   0,   0,  16,  17,  18,  19,  20,  21,
+     22,  23,  24,  25,   0,   0,  26,  27,   0,   0,   0,   0,  28,   0,   0,   0,
+      0,  29,   0,  30,   0,   0,  31,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,  32,  33,   0,   0,   0,  34,   0,
+      0,  35,  36,   0,   0,   0,   0,   0,   0,   0,  37,   0,  38,   0,  39,   0,
+      0,   0,  40,   0,   0,   0,  41,   0,   0,   0,  39,   0,   0,   0,  42,   0,
+      0,  43,   0,   0,   0,  43,  44,   0,  45,   0,  46,  47,  48,  49,   0,   0,
+      0,  50,   0,   0,   0,   0,   0,  51,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,  52,  53,  54,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,  55,  56,  57,  58,  59,   0,   0,
+     60,  60,  60,  60,  61,  60,  60,  62,  63,  60,  64,  65,  60,  66,  67,  68,
+     69,  70,  71,  72,  73,  74,   0,   0,  75,  76,  77,  78,  79,  80,  81,   0,
+     82,  83,  84,  85,  86,  87,   0,  88,   0,  89,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,  90,  78,  91,  92,  93,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     94,   0,   0,  95,   0,   0,  96,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,  97,   0,   0,   0,   0,   0,   0,   0,  98,   0,   0,   0,   0,
+      0,   0,   0,   0,  99,   0,   0,  43,  78,  78,  78,  78,  78,  78, 100,   0,
+    101, 102, 103, 104, 105, 103, 104, 106,   0, 107,  78,  78, 108,   0,   0,   0,
+    109,  78, 110, 111,  92,  92, 112, 113, 114, 114, 115, 116, 114, 114, 114, 117,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0, 118,   0,   0,   0,   0,   0,   0, 119,   0,   0,   0, 120,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 121, 122,   0,   0,   0,   0,
+     60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,
+     60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,
+     60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,
+     60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60, 123,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,  60,  60,  60,  60,  60,  60,  60,  60,
+    124, 125,  60, 126,  60,  60,  62,   0, 127, 128, 129, 130, 131, 132, 133, 134,
+    135, 135, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148,
+    149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 158, 159, 160, 161, 162, 163,
+      0,   0,   0,   0, 164, 165,   0,   0,   0, 166,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 167,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0, 168,   0,   0,   0,   0,   0,   0,   0, 169,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0, 170,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 171, 172,   0, 173, 174,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    175, 175, 176, 175, 177, 178, 179, 175, 180, 181, 182, 175, 175, 175, 175, 175,
+    175, 175, 175, 175, 175, 183, 175, 175, 175, 175, 175, 175, 175, 175, 184, 175,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    179, 185, 186, 187, 188, 189,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0, 190, 191, 192, 193, 194,   0,   0,   0,
+    195, 196, 197,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 198,
+     60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,
+     65,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0
+};
+
+static RE_UINT8 re_decomposition_type_table_3[] = {
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     1,  0,  0,  0,  0,  0,  0,  0,  2,  0,  3,  0,  0,  0,  0,  2,
+     0,  0,  3,  3,  2,  2,  0,  0,  2,  3,  3,  0,  4,  4,  4,  0,
+     5,  5,  5,  5,  5,  5,  0,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     0,  5,  5,  5,  5,  5,  5,  0,  0,  5,  5,  5,  5,  5,  0,  0,
+     5,  5,  5,  5,  5,  5,  0,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     0,  5,  5,  5,  5,  5,  5,  0,  0,  5,  5,  5,  5,  5,  0,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     0,  0,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  0,  0,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  0,  2,  2,  5,  5,  5,  5,  0,  5,  5,  5,  5,  5,  5,  2,
+     2,  0,  0,  5,  5,  5,  5,  5,  5,  2,  0,  0,  5,  5,  5,  5,
+     5,  5,  0,  0,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  0,  0,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  2,
+     5,  5,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  5,
+     5,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  2,  2,  2,  2,  2,  2,  2,  2,  2,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  0,  5,  5,
+     5,  5,  5,  5,  0,  0,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  2,  2,  2,  5,  5,  0,  0,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  0,  0,  5,  5,
+     0,  0,  0,  0,  0,  0,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  2,  2,  2,  2,  2,  2,  0,  0,
+     3,  3,  3,  3,  3,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     5,  5,  0,  5,  5,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  5,  0,  0,  0,  0,  0,  2,  0,  0,  0,  5,  0,
+     0,  0,  0,  0,  2,  5,  5,  5,  5,  5,  5,  0,  5,  0,  5,  5,
+     5,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  5,  5,  5,  5,  5,  5,
+     5,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  5,  5,  5,  5,  5,  0,
+     2,  2,  2,  5,  5,  2,  2,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     2,  2,  2,  0,  2,  2,  0,  0,  0,  2,  0,  0,  0,  0,  0,  0,
+     5,  5,  0,  5,  0,  0,  0,  5,  0,  0,  0,  0,  5,  5,  5,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  5,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  5,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     5,  5,  0,  5,  0,  0,  0,  5,  0,  0,  0,  0,  5,  5,  5,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  5,  5,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  5,  5,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     5,  5,  5,  5,  0,  0,  5,  5,  0,  0,  5,  5,  5,  5,  5,  5,
+     0,  0,  5,  5,  5,  5,  5,  5,  0,  0,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  0,  0,  5,  5,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  2,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  5,  5,  5,  5,  5,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  2,  2,  2,  2,  0,  0,  0,  0,  0,  0,  0,
+     5,  0,  5,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  5,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  5,  0,  0,  0,  0,  0,  0,
+     0,  5,  0,  0,  5,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  5,  5,  5,  5,  5,  5,  5,  5,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  5,  5,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  5,  5,  0,  5,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  5,  0,  0,  5,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  5,  5,  5,  0,  0,  5,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  5,  0,  0,  5,  5,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  5,  5,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  5,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  5,  5,  5,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  5,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     5,  0,  0,  0,  0,  0,  0,  5,  5,  0,  5,  5,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  5,  0,  5,  5,  5,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  2,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  2,  2,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  5,  0,  0,  0,  0,  0,  0,  0,  0,  0,  5,  0,  0,
+     0,  0,  5,  0,  0,  0,  0,  5,  0,  0,  0,  0,  5,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  5,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  5,  0,  5,  5,  2,  5,  2,  0,  0,  0,  0,  0,  0,
+     0,  5,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  5,  0,  0,  0,  0,  0,  0,  0,  0,  0,  5,  0,  0,
+     0,  0,  5,  0,  0,  0,  0,  5,  0,  0,  0,  0,  5,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  5,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  5,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  3,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  5,  0,  5,  0,  5,  0,  5,  0,  5,  0,
+     0,  0,  5,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  5,  0,  5,  0,  0,
+     5,  5,  0,  5,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  3,  3,  3,  0,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  0,  3,  3,  3,  3,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  0,  3,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+     3,  3,  6,  6,  6,  6,  6,  6,  6,  6,  6,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  3,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  3,  3,  3,  3,  3,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  2,  5,  0,  0,  0,  0,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  0,  0,  0,  0,  0,  0,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  0,  0,  5,  5,  5,  5,  5,  5,  0,  0,
+     5,  5,  5,  5,  5,  5,  0,  0,  5,  5,  5,  5,  5,  5,  0,  0,
+     5,  5,  5,  5,  5,  5,  5,  5,  0,  5,  0,  5,  0,  5,  0,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  0,  0,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  0,  5,  5,  5,  5,  5,  5,  5,  2,  5,  2,
+     2,  5,  5,  5,  5,  0,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  0,  0,  5,  5,  5,  5,  5,  5,  0,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     0,  0,  5,  5,  5,  0,  5,  5,  5,  5,  5,  5,  5,  5,  2,  0,
+     5,  5,  2,  2,  2,  2,  2,  1,  2,  2,  2,  0,  0,  0,  0,  0,
+     0,  1,  0,  0,  0,  0,  0,  2,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  2,  2,  2,  0,  0,  0,  0,  0,  0,  0,  0,  1,
+     0,  0,  0,  2,  2,  0,  2,  2,  0,  0,  0,  0,  2,  0,  2,  0,
+     0,  0,  0,  0,  0,  0,  0,  2,  2,  2,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  2,  0,  0,  0,  0,  0,  0,  0,  2,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     3,  3,  0,  0,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+     6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  0,
+     6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  2,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     2,  2,  7,  2,  0,  2,  2,  2,  0,  2,  7,  7,  7,  7,  7,  7,
+     7,  7,  7,  7,  0,  7,  2,  0,  0,  7,  7,  7,  7,  7,  0,  0,
+     3,  2,  3,  0,  7,  0,  5,  0,  7,  0,  5,  5,  7,  7,  0,  7,
+     7,  7,  0,  7,  7,  2,  2,  2,  2,  7,  0,  2,  7,  7,  7,  7,
+     7,  0,  0,  0,  0,  7,  7,  7,  7,  7,  0,  0,  0,  0,  0,  0,
+     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  4,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  5,  5,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  5,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  5,  5,  5,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  5,  0,  0,  0,  0,  5,  0,  0,  5,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  5,  0,  5,  0,  0,  0,  0,  0,  2,  2,  0,  2,
+     2,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  5,  0,  0,  5,  0,  0,  5,  0,  5,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     5,  0,  5,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  5,  5,  5,
+     5,  5,  0,  0,  5,  5,  0,  0,  5,  5,  0,  0,  0,  0,  0,  0,
+     5,  5,  0,  0,  5,  5,  0,  0,  5,  5,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  5,  5,  5,  5,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     5,  5,  5,  5,  0,  0,  0,  0,  0,  0,  5,  5,  5,  5,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  5,  5,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  2,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  2,  2,  2,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  5,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  6,  3,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  3,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  2,  0,  2,  2,  2,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  5,  0,  5,  0,
+     5,  0,  5,  0,  5,  0,  5,  0,  5,  0,  5,  0,  5,  0,  5,  0,
+     5,  0,  5,  0,  0,  5,  0,  5,  0,  5,  0,  0,  0,  0,  0,  0,
+     5,  5,  0,  5,  5,  0,  5,  5,  0,  5,  5,  0,  5,  5,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  5,  0,  0,  0,  0,  0,  0,  2,  2,  0,  5, 10,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  5,  0,  0,  5,  5,  5,  5,  0,  0,  0,  5, 10,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  0,
+     0,  0,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  0,
+     2,  2,  2,  2,  8,  8,  8,  8,  0,  0,  0,  0,  0,  0,  0,  0,
+    11,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  0,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2, 11, 11, 11, 11,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2, 11,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  3,  3,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     3,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  3,  3,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  3,  3,  3,  3,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  3,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     5,  5,  5,  5,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  0,  0,
+     5,  0,  5,  0,  0,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  0,
+     5,  0,  5,  0,  0,  5,  5,  0,  0,  0,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  0,  0,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     2,  2,  2,  2,  2,  2,  2,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  2,  2,  2,  2,  2,  0,  0,  0,  0,  0,  5,  0,  5,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  0,  5,  5,  5,  5,  5,  0,  5,  0,
+     5,  5,  0,  5,  5,  0,  5,  5,  5,  5,  5,  5,  5,  5,  5,  2,
+    12, 13, 12, 13, 14, 15, 12, 13, 14, 15, 12, 13, 14, 15, 12, 13,
+    14, 15, 12, 13, 14, 15, 12, 13, 14, 15, 12, 13, 14, 15, 12, 13,
+    14, 15, 12, 13, 14, 15, 12, 13, 14, 15, 12, 13, 14, 15, 12, 13,
+    14, 15, 12, 13, 12, 13, 12, 13, 12, 13, 12, 13, 12, 13, 12, 13,
+    14, 15, 12, 13, 14, 15, 12, 13, 14, 15, 12, 13, 14, 15, 12, 13,
+    12, 13, 14, 15, 12, 13, 12, 13, 14, 15, 12, 13, 14, 15, 12, 13,
+    12, 13,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0, 12, 13, 14, 15, 12, 13, 12, 13, 12, 13, 12, 12, 13,
+    12, 13, 12, 13, 12, 13, 14, 15, 14, 15, 12, 13, 12, 13, 12, 13,
+    12, 13, 12, 13, 12, 13, 12, 13, 14, 12, 13, 14, 12, 13, 14, 15,
+    12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+    12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+    12, 12, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+    12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+    12, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14,
+    14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, 13, 12,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    14, 13, 14, 14, 14, 14, 14, 14, 13, 14, 13, 13, 14, 14, 13, 13,
+    14, 14, 13, 14, 13, 14, 13, 13, 14, 13, 13, 14, 13, 14, 13, 13,
+    14, 13, 14, 14, 13, 13, 13, 14, 13, 13, 13, 13, 13, 14, 13, 13,
+    13, 13, 13, 14, 13, 13, 14, 13, 14, 14, 14, 13, 14, 14, 14, 14,
+     0,  0, 14, 14, 14, 14, 13, 13, 14, 13, 13, 13, 13, 14, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 14, 14, 13, 13, 14, 13, 14, 13, 13, 13, 13, 13,
+    13, 13, 13, 14, 14, 14, 13, 13,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10,  0,  0, 10, 10,  2,  2,  2,  2,  2,  2,  2,
+    16, 16, 16,  0, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+    16, 16, 16, 16, 16, 16, 16,  0, 16, 16, 16, 16,  0,  0,  0,  0,
+    12, 15, 12,  0, 12,  0, 12, 15, 12, 15, 12, 15, 12, 15, 12, 15,
+    12, 12, 13, 12, 13, 12, 13, 12, 13, 12, 13, 14, 15, 12, 13, 12,
+    13, 14, 15, 12, 13, 12, 13, 14, 15, 12, 13, 14, 15, 12, 13, 14,
+    15, 12, 13, 14, 15, 12, 13, 14, 15, 12, 13, 12, 13, 12, 13, 12,
+    13, 12, 13, 14, 15, 12, 13, 14, 15, 12, 13, 14, 15, 12, 13, 14,
+    15, 12, 13, 14, 15, 12, 13, 14, 15, 12, 13, 14, 15, 12, 13, 14,
+    15, 12, 13, 14, 15, 12, 13, 14, 15, 12, 13, 14, 15, 12, 13, 14,
+    15, 12, 13, 14, 15, 12, 13, 14, 15, 12, 13, 14, 15, 12, 13, 12,
+    13, 12, 13, 14, 15, 12, 13, 12, 13, 12, 13, 12, 13,  0,  0,  0,
+     0,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,  0,
+     0,  0, 17, 17, 17, 17, 17, 17,  0,  0, 17, 17, 17, 17, 17, 17,
+     0,  0, 17, 17, 17, 17, 17, 17,  0,  0, 17, 17, 17,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  0, 17, 17, 17, 17, 17, 17, 17,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  5,  0,  5,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  5,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  5,  5,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  5,  5,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  5,  5,  0,  5,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  5,  5,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  5,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  5,  5,
+     5,  5,  5,  5,  5,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  5,  5,  5,  5,  5,
+     5,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     7,  7,  7,  7,  7,  0,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  0,  7,  7,
+     0,  0,  7,  0,  0,  7,  7,  0,  0,  7,  7,  7,  7,  0,  7,  7,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  0,  7,  0,  7,  7,  7,
+     7,  7,  7,  7,  0,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     7,  7,  7,  7,  7,  7,  0,  7,  7,  7,  7,  0,  0,  7,  7,  7,
+     7,  7,  7,  7,  7,  0,  7,  7,  7,  7,  7,  7,  7,  0,  7,  7,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  0,  7,  7,  7,  7,  0,
+     7,  7,  7,  7,  7,  0,  7,  0,  0,  0,  7,  7,  7,  7,  7,  7,
+     7,  0,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     7,  7,  7,  7,  7,  7,  0,  0,  7,  7,  7,  7,  7,  7,  7,  7,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  0,  0,  7,  7,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     0,  7,  7,  0,  7,  0,  0,  7,  0,  7,  7,  7,  7,  7,  7,  7,
+     7,  7,  7,  0,  7,  7,  7,  7,  0,  7,  0,  7,  0,  0,  0,  0,
+     0,  0,  7,  0,  0,  0,  0,  7,  0,  7,  0,  7,  0,  7,  7,  7,
+     0,  7,  7,  0,  7,  0,  0,  7,  0,  7,  0,  7,  0,  7,  0,  7,
+     0,  7,  7,  0,  7,  0,  0,  7,  7,  7,  7,  0,  7,  7,  7,  7,
+     7,  7,  7,  0,  7,  7,  7,  7,  0,  7,  7,  7,  7,  0,  7,  0,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  0,  7,  7,  7,  7,  7,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  0,  0,  0,  0,
+     0,  7,  7,  7,  0,  7,  7,  7,  7,  7,  0,  7,  7,  7,  7,  7,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  0,  0,  0,  0,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  0,  0,  0,  0,  0,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  8,  8,  8,  8,  0,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  3,  3,  3,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    11,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    11, 11, 11,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,  0,  0,  0,  0,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  0,  0,  0,  0,  0,  0,  0,
+     8,  8,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  0,  0,  0,  0,  0,  0
+};
+
+RE_UINT32 re_get_decomposition_type(RE_UINT32 codepoint) {
+    RE_UINT32 field_2;
+    RE_UINT32 field_1;
+    RE_UINT32 field_0;
+    RE_UINT32 v;
+
+    field_2 = codepoint >> 10;
+    field_1 = (codepoint >> 5) & 0x1F;
+    field_0 = codepoint & 0x1F;
+
+    v = re_decomposition_type_table_1[field_2];
+    v = re_decomposition_type_table_2[(v << 5) | field_1];
+    v = re_decomposition_type_table_3[(v << 5) | field_0];
+
+    return v;
+}
+
+/* Default_Ignorable_Code_Point. */
+static RE_UINT8 re_default_ignorable_code_point_table_1[] = {
+     0,  1,  2,  2,  3,  4,  5,  2,  6,  2,  2,  2,  7,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  8,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  9,
+     2,  2,  2,  2, 10,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+    11, 11, 11, 11,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2
+};
+
+static RE_UINT8 re_default_ignorable_code_point_table_2[] = {
+     0,  0,  0,  0,  0,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  2,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     3,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  4,  5,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  6,  0,  0,
+     7,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     8,  9,  0, 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 11,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    10,  0,  0,  0,  0,  0,  0,  4,  0,  0,  0,  0,  0,  5,  0, 12,
+     0,  0,  0,  0,  0, 13,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 14,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15
+};
+
+static RE_UINT8 re_default_ignorable_code_point_table_3[] = {
+      0,   0,   0,   0,   0,  32,   0,   0,   0, 128,   0,   0,   0,   0,   0,  16,
+      0,   0,   0, 128,   1,   0,   0,   0,   0,   0,  48,   0,   0, 120,   0,   0,
+      0, 248,   0,   0,   0, 124,   0,   0, 255, 255,   0,   0,  16,   0,   0,   0,
+      0,   0, 255,   1,  15,   0,   0,   0,   0,   0, 248,   7, 255, 255, 255, 255
+};
+
+RE_UINT32 re_get_default_ignorable_code_point(RE_UINT32 codepoint) {
+    RE_UINT32 field_2;
+    RE_UINT32 field_1;
+    RE_UINT32 field_0;
+    RE_UINT32 offset;
+    RE_UINT32 v;
+
+    field_2 = codepoint >> 10;
+    field_1 = (codepoint >> 5) & 0x1F;
+    field_0 = (codepoint >> 3) & 0x3;
+    offset = codepoint & 0x7;
+
+    v = re_default_ignorable_code_point_table_1[field_2];
+    v = re_default_ignorable_code_point_table_2[(v << 5) | field_1];
+    v = re_default_ignorable_code_point_table_3[(v << 2) | field_0];
+
+    return (v >> offset) & 0x1;
+}
+
+/* Deprecated. */
+RE_UINT32 re_get_deprecated(RE_UINT32 codepoint) {
+    if (codepoint == 0x0149)
+        return 1;
+    if (codepoint == 0x0673)
+        return 1;
+    if (codepoint == 0x0F77)
+        return 1;
+    if (codepoint == 0x0F79)
+        return 1;
+    if (0x17A3 <= codepoint && codepoint <= 0x17A4)
+        return 1;
+    if (0x206A <= codepoint && codepoint <= 0x206F)
+        return 1;
+    if (0x2329 <= codepoint && codepoint <= 0x232A)
+        return 1;
+    if (codepoint == 0x0E0001)
+        return 1;
+
+    return 0;
+}
+
+/* Diacritic. */
+static RE_UINT8 re_diacritic_table_1[] = {
+     0,  1,  2,  3,  4,  5,  6,  7,  8,  8,  8,  9, 10,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8, 11, 12,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8, 13, 14,
+    15,  8, 16, 17, 18, 19, 20, 21,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8, 22, 23,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8, 24,  8,  8,  8, 25,  8, 26,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8
+};
+
+static RE_UINT8 re_diacritic_table_2[] = {
+      0,   0,   1,   2,   0,   3,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   4,   5,   5,   5,   5,   6,   7,   8,   0,   0,   0,
+      0,   0,   0,   0,   9,   0,   0,   0,   0,   0,  10,   0,  11,  12,  13,   0,
+      0,   0,  14,   0,   0,   0,  15,  16,   0,   4,  17,   0,   0,  18,   0,  19,
+     20,   0,   0,   0,   0,   0,   0,  21,   0,  22,  23,  24,   0,  22,  25,   0,
+      0,  22,  25,   0,   0,  22,  25,  26,   0,  22,  27,   0,   0,   0,  25,   0,
+      0,   0,  25,   0,   0,  22,  25,   0,   0,  28,  25,   0,   0,   0,  29,   0,
+      0,   0,  30,   0,   0,  31,  32,   0,  20,  33,   0,   0,  34,   0,  35,   0,
+      0,  36,   0,  37,  38,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  26,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  39,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,  40,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,  41,   0,  42,   0,   0,   0,  43,  44,  45,   0,  46,   0,   0,
+      0,  47,   0,  48,   0,   0,   4,  49,   0,  50,   5,  17,   0,   0,  51,  52,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  53,  54,  55,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,  56,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,  57,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,  58,   0,   0,  59,   0,   0,  22,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,  60,  61,   0,   0,  62,   5,  63,   0,   0,  64,   0,   0,  20,
+      0,   0,   0,   0,   0,   0,  44,  65,   0,  66,  67,   0,   0,  67,   2,  68,
+      0,   0,   0,  69,   0,  15,  70,  71,   0,   0,  72,  73,   0,   0,   0,  74,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,  75,   0,   0,   0,   0,   0,   0,   0,   1,   2,  76,  77,   0,   0,  78,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,  79,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,  80,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  18,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,  81,   0,   0,   0,  82,   0,  67,   0,   0,  83,   0,
+      0,  84,   0,   0,   0,   0,   0,  85,   0,  22,  25,  86,   0,   0,   0,   0,
+      0,   0,  87,   0,   0,   0,  88,   0,   0,   0,   0,   0,   0,  15,   2,   0,
+      0,  15,   0,   0,   0,  47,   0,   0,   0,  89,   0,   0,   0,   0,   0,   0,
+      0,  81,   0,   0,   0,   0,   0,   0,   0,  90,  78,   0,   0,   0,   0,   2,
+      0,  43,  91,   0,  10,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,  15,   0,   0,   0,   0,   0,   0,   0,   0,  92,   0,  93,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,  94,   0,  95,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  96,   0,   0,  62,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  97,  98,  99,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,  95,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0, 100,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,  95,   0,   0,   0, 101,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0
+};
+
+static RE_UINT8 re_diacritic_table_3[] = {
+      0,   0,   0,   0,   0,   0,   0,  64,   1,   0,   0,   0,   0, 129, 144,   1,
+      0,   0, 255, 255, 255, 255, 255, 255, 255, 127, 255, 224,   7,   0,  48,   4,
+     48,   0,   0,   0, 248,   0,   0,   0,   0,   0,   0,   2,   0,   0, 254, 255,
+    251, 255, 255, 191,  22,   0,   0,   0,   0, 248, 135,   1,   0,   0,   0, 128,
+     97,  28,   0,   0, 255,   7,   0,   0, 192, 255,   1,   0,   0, 248,  63,   0,
+      0,   0,   0,   3, 248, 255, 255, 127,   0,   0,   0,  16,   0,  32,  30,   0,
+      0,   0,   2,   0,   0,  32,   0,   0,   0,   0,   0, 224,   0,  32,  32,   0,
+      0,   0,   0,  24,   0,   4,   0,   0, 128,  95,   0,   0,   0,   0,   0,   4,
+      0,  31,   0,   0,   0,   0, 160, 194, 220,   0,   0,   0,  64,   0,   0,   0,
+      0,   0, 128,   6,  24,  62,   0,   0, 128, 191,   0,  12,   0, 254,  15,  32,
+      0,   0,   0,  14,   0,   0, 224, 159,   0,   0, 255,  63,   0,   0,  16,   0,
+     16,   0,   0,   0,   0, 248,  15,   0,   0,  12,   0,   0,   0,   0, 192,   0,
+      0,   0,   0,  63, 255,  33, 144,   3,   0, 240, 255, 255, 240, 255,   0,   0,
+      0,   0, 224, 227,   0,   0,   0, 160,   3, 224,   0, 224,   0, 224,   0,  96,
+      0, 128,   3,   0,   0, 128,   0,   0,   0, 252,   0,   0,   0,   0,   0,  30,
+      0, 128,   0, 176,   0,   0,   0,  48,   0,   0,   3,   0,   3,   0,   0,   0,
+      0,   7,   0,   0, 255, 255,   3,   0,   0, 120,   0,   0,   0,   0,   8,   0,
+     32,   0,   0,   0,   0,   0,   0,  56,   7,   0,   0,   0,   0,   0,  64,   0,
+      0,   0,   0, 248,   0,  14,   0,   0,   0,  48,   0,   0, 255, 255,   0,   0,
+      0,   0,   1,   0,   0,   0,   0, 192,   8,   0,   0,   0,  96,   0,   0,   0,
+    252,   0,   0,   0,   0,   0,   0,   6,   0,   0,  24,   0,   1,  28,   0,   0,
+      0,   0,  96,   0,   0,   6,   0,   0, 192,  31,  31,   0,  68,   0,   0,   0,
+     12,   0,   0,   0,   0,   8,   0,   0,   0,   0,   0,  96, 128,   0,   0,   0,
+     52,   0,   0,   0,   0,   0, 128,   0,   0,   0,  31,   0,   0,   0, 127,   0,
+      0, 128, 255, 255, 128, 227,   7, 248, 231,  15,   0,   0,   0,  60,   0,   0,
+      0, 240,   0,   0, 112,   7,   0,   0
+};
+
+RE_UINT32 re_get_diacritic(RE_UINT32 codepoint) {
+    RE_UINT32 field_2;
+    RE_UINT32 field_1;
+    RE_UINT32 field_0;
+    RE_UINT32 offset;
+    RE_UINT32 v;
+
+    field_2 = codepoint >> 10;
+    field_1 = (codepoint >> 5) & 0x1F;
+    field_0 = (codepoint >> 3) & 0x3;
+    offset = codepoint & 0x7;
+
+    v = re_diacritic_table_1[field_2];
+    v = re_diacritic_table_2[(v << 5) | field_1];
+    v = re_diacritic_table_3[(v << 2) | field_0];
+
+    return (v >> offset) & 0x1;
+}
+
+/* East_Asian_Width. */
+static RE_UINT8 re_east_asian_width_table_1[] = {
+     0,  1,  2,  2,  3,  2,  2,  2,  4,  5,  6,  7,  8,  9,  9,  9,
+     9,  9,  9, 10,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9, 11, 12,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9, 13,  2,  2, 14, 14, 14, 14, 14, 14, 15, 16,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2, 17,  9,  9,  9,  9,
+     9, 18,  9, 19,  2,  2,  2,  2,  2,  2,  2,  2, 20,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2, 21, 22, 23,  2,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9, 24,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9, 24,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+    25,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 26,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 26
+};
+
+static RE_UINT8 re_east_asian_width_table_2[] = {
+      0,   1,   1,   2,   0,   3,   4,   5,   6,   7,   8,   9,   0,   0,  10,   0,
+      0,   0,  11,  12,   0,   0,  13,   0,  14,  14,  14,  15,  16,  17,  18,   0,
+     19,  14,  20,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,  21,  21,  21,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     22,  23,   0,  24,  25,  26,   0,   0,  27,  28,  29,  30,  31,  32,  33,  34,
+     35,  36,  37,  38,  39,  40,   0,   0,  41,  42,   0,   0,   0,   0,   0,  43,
+      0,   0,   0,  14,  14,  14,  14,  44,  14,  14,  45,  46,  47,  48,  49,  50,
+     51,   0,  52,  53,  54,  55,  56,  57,  58,  59,  60,  61,  62,  63,   0,  64,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  65,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,  66,   0,  67,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,  68,  21,  21,  69,  21,  21,  21,  21,  21,  21,  70,  71,
+     72,  73,  74,  21,  75,  21,  21,  21,  76,  77,  21,  21,  78,  21,  21,  79,
+     73,  21,  80,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,
+     21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,
+     21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,
+     21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,   0,   0,
+     21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,
+     21,  21,  21,  21,  81,  21,  82,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  83,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,
+     21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  84,   0,   0,
+     14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,
+     14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,
+     14,  14,  14,  14,  14,  14,  14,  14,  21,  21,  21,  21,  21,  21,  21,  21,
+     21,  21,  21,  21,  21,  21,  21,  21,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     85,  86,  87,  88,   0,   0,   0,   0,  89,  90,  90,  91,  92,  93,  94,  95,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  96,
+     21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,
+     21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  97,
+     21,  21,  21,  21,  21,  21,  70,   0,  98,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     21,  21,  21,  21,  21,  21,  21,  21,  73,   0,  99, 100,  21,  21,  21,  21,
+     21,  21,  21,  21,  21,  21,  21, 101,   0,   0,   0,   0,   0,   0,   0,   0,
+    102,   0,   0,   0,   0,   0, 103,   0, 104, 105,  14, 106, 107, 108,   0,   0,
+    109, 101, 110, 111,   0,   0,   0,   0,  21, 112,  21, 113,  69,  21, 114, 115,
+     21,  73, 116,  21,  21,  21,  21, 117,  21, 118, 119, 120, 121, 102,   0, 122,
+     21,  21, 123,   0,  21,  21, 124, 125,   0,   0,   0,   0,   0,   0,   0, 126,
+      0,   0,   0,   0,   0,   0,   0,   0, 127, 128, 129, 130,  21,  21, 131,  21,
+      0,   0,   0, 132, 133, 134, 135,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,
+     21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21, 118,
+      0,   0,   0,   0,   0,   0,   0,   0,  14,  14,  14,  14,  14,  14,  14,  15,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,
+     14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14, 136
+};
+
+static RE_UINT8 re_east_asian_width_table_3[] = {
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0,
+    0, 2, 1, 1, 2, 1, 1, 2, 2, 0, 2, 0, 1, 2, 2, 1,
+    2, 2, 2, 2, 2, 0, 2, 2, 2, 2, 2, 0, 2, 2, 2, 2,
+    0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    2, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 0, 2, 2,
+    2, 2, 0, 0, 0, 0, 2, 0, 2, 2, 2, 0, 2, 2, 0, 0,
+    2, 0, 2, 2, 0, 0, 0, 2, 2, 2, 2, 0, 2, 0, 2, 0,
+    0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 2, 0, 2, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 2, 0, 0, 0, 0,
+    0, 2, 2, 2, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 2,
+    2, 2, 2, 0, 2, 0, 0, 0, 2, 2, 2, 2, 0, 2, 0, 0,
+    0, 0, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 2, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0,
+    2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 2, 0, 0, 2, 0, 2, 2, 2, 0, 2, 0, 0,
+    2, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 0, 2, 0, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 0, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0,
+    0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 0, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    2, 0, 0, 2, 2, 2, 2, 0, 2, 2, 0, 0, 2, 2, 0, 0,
+    2, 2, 2, 0, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0,
+    2, 0, 2, 2, 0, 2, 0, 0, 0, 0, 0, 2, 0, 0, 2, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2,
+    0, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 2, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 2, 0, 2, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 2, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 2, 2, 0, 0, 0, 2, 0, 0, 0, 0, 2, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 2, 2, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 0,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 2, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    2, 0, 2, 2, 0, 0, 0, 2, 2, 0, 0, 2, 0, 0, 0, 2,
+    0, 2, 0, 0, 0, 2, 0, 0, 0, 0, 2, 0, 0, 2, 2, 2,
+    2, 0, 0, 2, 0, 2, 0, 2, 2, 2, 2, 2, 2, 0, 2, 0,
+    0, 0, 0, 0, 2, 2, 2, 2, 0, 0, 0, 0, 2, 2, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0,
+    0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    2, 2, 0, 0, 2, 2, 2, 2, 0, 0, 2, 2, 0, 0, 2, 2,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 2, 2, 0, 0, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 3, 3, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 0, 0, 0,
+    3, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    0, 0, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    2, 2, 0, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0,
+    0, 0, 2, 2, 0, 0, 2, 2, 0, 0, 0, 0, 2, 2, 0, 0,
+    2, 2, 0, 0, 0, 0, 2, 2, 2, 0, 0, 2, 0, 0, 2, 2,
+    2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 0,
+    0, 0, 0, 0, 0, 2, 2, 0, 0, 2, 0, 0, 0, 0, 2, 2,
+    0, 0, 0, 0, 3, 3, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0,
+    2, 0, 2, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3,
+    3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    2, 2, 0, 2, 2, 2, 0, 2, 2, 2, 2, 0, 2, 2, 0, 2,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2,
+    0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 2,
+    0, 0, 0, 0, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 3, 2,
+    2, 2, 2, 2, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 0, 2, 0, 0, 0, 0, 2, 2, 3, 2, 2, 2, 2, 2,
+    2, 2, 3, 3, 2, 3, 2, 2, 2, 2, 3, 2, 2, 3, 2, 2,
+    0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 3, 3, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 3, 0,
+    0, 0, 0, 3, 3, 3, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+    0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    3, 0, 0, 0, 0, 3, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0,
+    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 3, 3, 3, 3, 3,
+    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+    3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+    3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0,
+    5, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0,
+    0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+    3, 3, 3, 3, 3, 3, 3, 0, 0, 3, 3, 3, 3, 3, 3, 3,
+    0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+    0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0,
+    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+    3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+    3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2,
+    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0,
+    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+    3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0,
+    3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+    3, 3, 3, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+    3, 3, 3, 3, 3, 3, 3, 0, 3, 3, 3, 3, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+    5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+    5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+    5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+    5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 0,
+    0, 0, 4, 4, 4, 4, 4, 4, 0, 0, 4, 4, 4, 4, 4, 4,
+    0, 0, 4, 4, 4, 4, 4, 4, 0, 0, 4, 4, 4, 0, 0, 0,
+    5, 5, 5, 5, 5, 5, 5, 0, 4, 4, 4, 4, 4, 4, 4, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0,
+    3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+    3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0,
+    3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0,
+    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0,
+    0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 2,
+    2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+    3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0,
+    3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3,
+    3, 3, 3, 3, 3, 3, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 3, 3,
+    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 3,
+    3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+    3, 0, 0, 0, 3, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3,
+    3, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 3,
+    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 0,
+    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+    3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3,
+    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,
+    3, 3, 3, 0, 0, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 0, 0, 0,
+    0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0,
+    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3,
+    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 3, 3, 3, 3,
+    3, 3, 3, 3, 3, 3, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+    3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 3, 3, 3, 3, 3, 3,
+    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 3, 3, 3,
+    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    3, 3, 3, 3, 3, 0, 0, 0, 3, 3, 3, 0, 0, 0, 0, 0,
+    3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+    3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0,
+    3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0
+};
+
+RE_UINT32 re_get_east_asian_width(RE_UINT32 codepoint) {
+    RE_UINT32 field_2;
+    RE_UINT32 field_1;
+    RE_UINT32 field_0;
+    RE_UINT32 v;
+
+    field_2 = codepoint >> 10;
+    field_1 = (codepoint >> 5) & 0x1F;
+    field_0 = codepoint & 0x1F;
+
+    v = re_east_asian_width_table_1[field_2];
+    v = re_east_asian_width_table_2[(v << 5) | field_1];
+    v = re_east_asian_width_table_3[(v << 5) | field_0];
+
+    return v;
+}
+
+/* Emoji. */
+static RE_UINT8 re_emoji_table_1[] = {
+    0, 1, 1, 1, 1, 1, 1, 1, 2, 3, 4, 1, 5, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 6, 7, 8, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
+};
+
+static RE_UINT8 re_emoji_table_2[] = {
+     0,  1,  0,  0,  0,  2,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  3,  4,  0,  0,  0,  0,  0,  0,  5,  0,  0,  6,  7,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  8,  9,  0,  0,  0,  0, 10, 11,
+     0,  0,  0,  0,  0,  0, 12,  0,  0,  0,  0,  0,  0, 13, 14, 15,
+    16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0, 30,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0, 31,  0, 32,  0,  0,  0,  0,  0,
+     0, 33,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0, 34,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    35,  0,  0,  0,  0,  0, 10,  0,  0,  0,  0, 36, 37,  0,  0, 38,
+    39, 40, 41,  0,  0,  0,  0,  0, 42, 43, 42, 42, 44, 42, 42, 45,
+    42, 42, 42, 42, 42, 42, 42, 46, 42, 47, 48, 49, 50, 51, 52, 53,
+    42, 42, 54,  0, 42, 42, 55, 56,  0,  0,  0,  0,  0,  0,  0, 57,
+     0,  0,  0,  0,  0,  0,  0,  0, 58, 59, 60, 61, 42, 42, 62, 42,
+     0,  0,  0, 63, 64, 65, 66,  0,  0,  0,  0,  0,  0,  0,  0,  0
+};
+
+static RE_UINT8 re_emoji_table_3[] = {
+      0,   0,   0,   0,   8,   4, 255,   3,   0,  66,   0,   0,   0,   0,   0,  16,
+      0,   2,   0,   0,   4,   0,   0,   2,   0,   0, 240,   3,   0,   6,   0,   0,
+      0,   0,   0,  12,   0,   1,   0,   0,   0, 128,   0,   0,   0, 254,  15,   7,
+      4,   0,   0,   0,   0,  12,  64,   0,   1,   0,   0,   0,   0,   0,   0, 120,
+     31,  64,  50,  33,  77, 196,   0,   7,   5, 255,  15, 128, 105,   1,   0, 200,
+      0,   0, 252,  26, 131,  12,   3,  96,  48, 193,  26,   0,   0,   6, 191,  39,
+     36, 191,  84,  32,   2,   1,  24,   0, 144,  80, 184,   0,  24,   0,   0,   0,
+      0,   0, 224,   0,   2,   0,   1, 128,   0,   0,  48,   0, 224,   0,   0,  24,
+      0,   0,  33,   0,   0,   0,   1,  32,   0,   0, 128,   2,  16,   0,   0,   0,
+      0,   0,   3, 192,   0,  64, 254,   7, 192, 255, 255, 255,   6,   0,   0,   4,
+      0, 128, 252,   7,   0,   0,   3,   0, 255, 255, 255, 255, 243, 255, 255, 255,
+    255, 255, 207, 206, 255, 255, 185, 255, 255, 255, 255, 191, 255, 255, 255,  63,
+      0, 126, 255, 255, 255, 128, 249,   7, 128,  60,  97,   0,  48,   1,   6,  16,
+     28,   0,  14, 112,  10, 129,   8, 252, 255, 255,   0,   0,  63, 248, 231,   0,
+     63,  26, 249,  31, 255,  15,   0,   0,   0, 240, 255, 255, 255, 255, 255, 247,
+    191, 255, 255, 255, 255, 255, 255, 253, 255, 239, 255, 255,   0,   0,  31,   7,
+    127,   0, 255, 255, 255,   1, 127,   0,   7,   0, 127,   0
+};
+
+RE_UINT32 re_get_emoji(RE_UINT32 codepoint) {
+    RE_UINT32 field_2;
+    RE_UINT32 field_1;
+    RE_UINT32 field_0;
+    RE_UINT32 offset;
+    RE_UINT32 v;
+
+    field_2 = codepoint >> 10;
+    field_1 = (codepoint >> 5) & 0x1F;
+    field_0 = (codepoint >> 3) & 0x3;
+    offset = codepoint & 0x7;
+
+    v = re_emoji_table_1[field_2];
+    v = re_emoji_table_2[(v << 5) | field_1];
+    v = re_emoji_table_3[(v << 2) | field_0];
+
+    return (v >> offset) & 0x1;
+}
+
+/* Emoji_Component. */
+static RE_UINT8 re_emoji_component_table_1[] = {
+    0, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, 1, 5, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
+};
+
+static RE_UINT8 re_emoji_component_table_2[] = {
+    0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    2, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 8, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+};
+
+static RE_UINT8 re_emoji_component_table_3[] = {
+      0,   0,   0,   0,   8,   4, 255,   3,   0,  32,   0,   0,   8,   0,   0,   0,
+      0, 128,   0,   0, 192, 255, 255, 255,   0,   0,   0, 248,   0,   0,  15,   0,
+    255, 255, 255, 255
+};
+
+RE_UINT32 re_get_emoji_component(RE_UINT32 codepoint) {
+    RE_UINT32 field_2;
+    RE_UINT32 field_1;
+    RE_UINT32 field_0;
+    RE_UINT32 offset;
+    RE_UINT32 v;
+
+    field_2 = codepoint >> 10;
+    field_1 = (codepoint >> 5) & 0x1F;
+    field_0 = (codepoint >> 3) & 0x3;
+    offset = codepoint & 0x7;
+
+    v = re_emoji_component_table_1[field_2];
+    v = re_emoji_component_table_2[(v << 5) | field_1];
+    v = re_emoji_component_table_3[(v << 2) | field_0];
+
+    return (v >> offset) & 0x1;
+}
+
+/* Emoji_Modifier. */
+RE_UINT32 re_get_emoji_modifier(RE_UINT32 codepoint) {
+    if (0x01F3FB <= codepoint && codepoint <= 0x01F3FF)
+        return 1;
+
+    return 0;
+}
+
+/* Emoji_Modifier_Base. */
+static RE_UINT8 re_emoji_modifier_base_table_1[] = {
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 4, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+};
+
+static RE_UINT8 re_emoji_modifier_base_table_2[] = {
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     1,  0,  0,  0,  0,  0,  0,  2,  3,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  4,  0,  5,  0,
+     0,  0,  6,  7,  8,  9,  0,  0,  0,  0,  0, 10, 11,  0,  0,  0,
+     0,  0, 12,  0,  0, 13, 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0, 15, 16,  0, 17,  0, 18, 19,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0
+};
+
+static RE_UINT8 re_emoji_modifier_base_table_3[] = {
+      0,   0,   0,   0,   0,   0,   0,  32,   0,   0,   0,   2,   0,  60,   0,   0,
+     32,   0,   0,   0, 156,  28,   0,   0, 204, 255,   1,   0, 192, 255, 255,  17,
+    238, 128,   2,   0,   0,   4,   0,   0,   0,   0,  48,   4,   0,   0,  97,   0,
+    224, 248,   0,   0,   8,   0, 112,   0,   1,  16,   0,   0,   0, 144,   0, 255,
+     64,   0, 255, 115,   0,   0, 128,   0,   0,   0,  96,  11,   0, 224, 254,  63
+};
+
+RE_UINT32 re_get_emoji_modifier_base(RE_UINT32 codepoint) {
+    RE_UINT32 field_2;
+    RE_UINT32 field_1;
+    RE_UINT32 field_0;
+    RE_UINT32 offset;
+    RE_UINT32 v;
+
+    field_2 = codepoint >> 10;
+    field_1 = (codepoint >> 5) & 0x1F;
+    field_0 = (codepoint >> 3) & 0x3;
+    offset = codepoint & 0x7;
+
+    v = re_emoji_modifier_base_table_1[field_2];
+    v = re_emoji_modifier_base_table_2[(v << 5) | field_1];
+    v = re_emoji_modifier_base_table_3[(v << 2) | field_0];
+
+    return (v >> offset) & 0x1;
+}
+
+/* Emoji_Presentation. */
+static RE_UINT8 re_emoji_presentation_table_1[] = {
+    0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 5, 6, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+};
+
+static RE_UINT8 re_emoji_presentation_table_2[] = {
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  1,  0,  0,  0,  0,  0,  0,  2,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  3,
+     4,  0,  5,  6,  7,  8,  9, 10, 11, 12, 13,  0, 14, 15,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0, 16,  0, 17,  0,  0,  0,  0,  0,
+    18,  0,  0,  0,  0,  0, 19,  0,  0,  0,  0,  0, 20,  0,  0, 21,
+    22, 23, 24,  0,  0,  0,  0,  0, 25, 26, 25, 27, 28, 25, 29, 30,
+    25, 31, 32, 25, 25, 25, 25, 33, 25, 34, 35, 36, 37, 18,  0, 38,
+    25, 25, 39,  0, 25, 25, 40, 41,  0,  0,  0,  0,  0,  0,  0, 42,
+     0,  0,  0,  0,  0,  0,  0,  0, 43, 44, 45, 46, 25, 25, 47, 25,
+     0,  0,  0, 48, 49, 50, 51,  0,  0,  0,  0,  0,  0,  0,  0,  0
+};
+
+static RE_UINT8 re_emoji_presentation_table_3[] = {
+      0,   0,   0,   0,   0,   0,   0,  12,   0,  30,   9,   0,   0,   0,   0,  96,
+      0,   0,  48,   0,   0, 255,  15,   0,   0,   0,   0, 128,   0,   0,   8,   0,
+      2,  12,   0,  96,  48,  64,  16,   0,   0,   4,  44,  36,  32,  12,   0,   0,
+      0,   1,   0,   0,   0,  80, 184,   0,   0,   0, 224,   0,   0,   0,   1, 128,
+      0,   0,   0,  24,   0,   0,  33,   0,  16,   0,   0,   0,   0, 128,   0,   0,
+      0,  64, 254,   7, 192, 255, 255, 255,   2,   0,   0,   4,   0, 128, 124,   7,
+      0,   0,   3,   0, 255, 255, 255, 255,   1, 224, 191, 255, 255, 255, 255, 223,
+    255, 255,  15,   0, 255, 135,  15,   0, 255, 255,  17, 255, 255, 255, 255, 127,
+    253, 255, 255, 255, 255, 255, 255, 159, 255, 255, 255,  63,   0, 120, 255, 255,
+    255,   0,   0,   4,   0,   0,  96,   0,   0,   0,   0, 248, 255, 255,   0,   0,
+     63,  16, 231,   0,   0,  24, 240,  31, 255,  15,   0,   0,   0, 240, 255, 255,
+    255, 255, 255, 247, 191, 255, 255, 255, 255, 255, 255, 253, 255, 239, 255, 255,
+      0,   0,  31,   7, 127,   0, 255, 255, 255,   1, 127,   0,   7,   0, 127,   0
+};
+
+RE_UINT32 re_get_emoji_presentation(RE_UINT32 codepoint) {
+    RE_UINT32 field_2;
+    RE_UINT32 field_1;
+    RE_UINT32 field_0;
+    RE_UINT32 offset;
+    RE_UINT32 v;
+
+    field_2 = codepoint >> 10;
+    field_1 = (codepoint >> 5) & 0x1F;
+    field_0 = (codepoint >> 3) & 0x3;
+    offset = codepoint & 0x7;
+
+    v = re_emoji_presentation_table_1[field_2];
+    v = re_emoji_presentation_table_2[(v << 5) | field_1];
+    v = re_emoji_presentation_table_3[(v << 2) | field_0];
+
+    return (v >> offset) & 0x1;
+}
+
+/* Extended_Pictographic. */
+static RE_UINT8 re_extended_pictographic_table_1[] = {
+    0, 1, 1, 1, 1, 1, 1, 1, 2, 3, 4, 1, 5, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 6, 7, 8, 9,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
+};
+
+static RE_UINT8 re_extended_pictographic_table_2[] = {
+     0,  0,  0,  0,  0,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  2,  3,  0,  0,  0,  0,  0,  0,  4,  0,  0,  5,  6,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  7,  8,  0,  0,  8,  0,  9, 10,
+     0,  0,  0,  0,  0,  0, 11,  0,  0,  0,  0,  0,  0, 12, 13, 14,
+    15, 16, 16, 16, 17, 16, 16, 16, 18, 19, 20, 21, 22, 23,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0, 24,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0, 25,  0, 26,  0,  0,  0,  0,  0,
+     0, 27,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0, 28,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    16, 16, 16, 16, 16, 16, 16, 16, 29,  9,  0, 30, 31, 32, 16, 33,
+    34, 35, 36, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 37,
+    16, 16, 16, 16, 16, 16, 16, 16, 16, 38, 39, 16, 16, 16, 16, 16,
+    16, 16, 40,  0, 16, 16, 16, 16,  0,  0,  0, 41,  0,  0, 42, 16,
+    43,  0, 44,  0, 45, 46, 16, 16, 47, 48, 49, 16, 16, 16, 16, 16,
+    16, 16, 16, 16, 16, 16, 16, 16,  0,  0,  0,  0,  0,  0,  0,  0,
+    16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+    16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 38
+};
+
+static RE_UINT8 re_extended_pictographic_table_3[] = {
+      0,   0,   0,   0,   0,  66,   0,   0,   0,   0,   0,  16,   0,   2,   0,   0,
+      4,   0,   0,   2,   0,   0, 240,   3,   0,   6,   0,   0,   0,   0,   0,  12,
+      0,   1,   0,   0,   0, 128,   0,   0,   0, 254,  15,   7,   4,   0,   0,   0,
+      0,  12,  64,   0,   1,   0,   0,   0,   0,   0,   0, 120, 191, 255, 247, 255,
+    255, 255, 255, 255,  63,   0, 255, 255,  63, 255,  87,  32,   2,   1,  24,   0,
+    144,  80, 184,   0, 248,   0,   0,   0,   0,   0, 224,   0,   2,   0,   1, 128,
+      0,   0,  48,   0, 224,   0,   0,  24,   0,   0,  33,   0,   0,   0,   1,  32,
+      0,   0, 128,   2,   0, 224,   0,   0,   0, 240,   3, 192,   0,  64, 254,   7,
+      0, 224, 255, 255,  63,   0,   0,   0, 254, 255,   0,   4,   0, 128, 252, 247,
+      0, 254, 255, 255, 255, 255, 255,   7, 255, 255, 255,  63, 192, 255, 255, 255,
+    255, 255,   0,   0,   0,   0, 240, 255,   0,   0, 224, 255,   0, 240,   0,   0,
+      0, 255,   0, 252,   0, 255,   0,   0,   0, 192, 255, 255,   0, 240, 255, 255,
+    255, 255, 255, 247, 191, 255, 255, 255
+};
+
+RE_UINT32 re_get_extended_pictographic(RE_UINT32 codepoint) {
+    RE_UINT32 field_2;
+    RE_UINT32 field_1;
+    RE_UINT32 field_0;
+    RE_UINT32 offset;
+    RE_UINT32 v;
+
+    field_2 = codepoint >> 10;
+    field_1 = (codepoint >> 5) & 0x1F;
+    field_0 = (codepoint >> 3) & 0x3;
+    offset = codepoint & 0x7;
+
+    v = re_extended_pictographic_table_1[field_2];
+    v = re_extended_pictographic_table_2[(v << 5) | field_1];
+    v = re_extended_pictographic_table_3[(v << 2) | field_0];
+
+    return (v >> offset) & 0x1;
+}
+
+/* Extender. */
+static RE_UINT8 re_extender_table_1[] = {
+     0,  1,  2,  3,  4,  4,  5,  6,  4,  4,  4,  4,  7,  4,  4,  4,
+     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
+     4,  4,  4,  4,  4,  4,  4,  4,  8,  9, 10,  4,  4,  4,  4,  4,
+     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4, 11,
+     4,  4,  4,  4, 12, 13, 14,  4,  4,  4,  4,  4,  4,  4,  4,  4,
+     4,  4,  4,  4,  4,  4,  4,  4,  4,  4, 15, 16,  4,  4,  4,  4,
+     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
+     4,  4,  4,  4,  4,  4,  4,  4, 17,  4, 18,  4,  4,  4,  4,  4,
+     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
+     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
+     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
+     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
+     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
+     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
+     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
+     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
+     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
+     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
+     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
+     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
+     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
+     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
+     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
+     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
+     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
+     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
+     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
+     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
+     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
+     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
+     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
+     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
+     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
+     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
+     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
+     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
+     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
+     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
+     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
+     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
+     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
+     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
+     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
+     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
+     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
+     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
+     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
+     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
+     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
+     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
+     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
+     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
+     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
+     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
+     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
+     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
+     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
+     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
+     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
+     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
+     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
+     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
+     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
+     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
+     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
+     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
+     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
+     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4
+};
+
+static RE_UINT8 re_extender_table_2[] = {
+     0,  0,  0,  0,  0,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  2,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  3,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  4,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  5,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  6,  0,  0,  0,  6,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     7,  0,  8,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0, 10,  0, 11,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    12, 13,  0,  0, 14,  0,  0, 15,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     5,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    16,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 17,  6,
+     0,  0,  0, 18,  0,  0, 19, 20,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 18,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 19,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 21,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0, 22,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 23,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 24,
+     0,  0,  0,  0,  0,  0,  0,  0,  0, 25,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 26,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0
+};
+
+static RE_UINT8 re_extender_table_3[] = {
+      0,   0,   0,   0,   0,   0, 128,   0,   0,   0,   3,   0,   1,   0,   0,   0,
+      0,   0,   0,   4,   0,   0,  32,   0,  64,   0,   0,   0,   0,   4,   0,   0,
+      8,   0,   0,   0, 128,   0,   0,   0,   0,   0,  64,   0,   0,   0,   0,   8,
+     32,   0,   0,   0,   0,   0,  62,   0,   0,   0,   0,  96,   0,   0,   0, 112,
+      0,  16,   0,   0,   0, 128,   0,   0,   0,   0,   1,   0,   0,   0,   0,  32,
+      0,   0,  24,   0, 192,   1,   0,   0,   0,   0,   0,   1,  12,   0,   0,   0,
+     11,   0,   0,   0,   0,   0,   0,  48, 112,   0,   0,   0
+};
+
+RE_UINT32 re_get_extender(RE_UINT32 codepoint) {
+    RE_UINT32 field_2;
+    RE_UINT32 field_1;
+    RE_UINT32 field_0;
+    RE_UINT32 offset;
+    RE_UINT32 v;
+
+    field_2 = codepoint >> 10;
+    field_1 = (codepoint >> 5) & 0x1F;
+    field_0 = (codepoint >> 3) & 0x3;
+    offset = codepoint & 0x7;
+
+    v = re_extender_table_1[field_2];
+    v = re_extender_table_2[(v << 5) | field_1];
+    v = re_extender_table_3[(v << 2) | field_0];
+
+    return (v >> offset) & 0x1;
+}
+
+/* General_Category. */
+static RE_UINT8 re_general_category_table_1[] = {
+     0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 13, 13,
+    13, 13, 13, 14, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 15, 16, 17, 18, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 19, 20, 20, 21, 21, 21, 21, 21, 21, 22, 23,
+    24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 34, 13, 35, 34, 34,
+    34, 36, 34, 34, 34, 34, 34, 34, 34, 34, 37, 38, 13, 13, 13, 13,
+    13, 39, 13, 40, 34, 34, 34, 34, 34, 34, 34, 34, 41, 34, 34, 42,
+    34, 34, 34, 34, 43, 44, 45, 34, 46, 34, 47, 48, 49, 50, 51, 34,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 52, 13, 13, 13, 53, 54, 13,
+    13, 13, 13, 55, 13, 13, 13, 13, 13, 13, 56, 34, 34, 34, 57, 34,
+    13, 13, 13, 13, 58, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    59, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 60,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 60
+};
+
+static RE_UINT16 re_general_category_table_2[] = {
+      0,   1,   2,   3,   0,   4,   5,   6,   7,   8,   9,  10,  11,  12,  13,  14,
+      7,  15,  16,  17,  18,  19,  20,  21,  22,  22,  22,  23,  24,  25,  26,  27,
+     28,  29,  17,   7,  30,   7,  31,   7,   7,  32,  33,  17,  34,  35,  36,  37,
+     38,  39,  40,  41,  39,  39,  42,  43,  44,  45,  46,  39,  39,  47,  48,  49,
+     50,  51,  52,  53,  54,  55,  56,  57,  58,  59,  60,  61,  62,  63,  64,  65,
+     66,  67,  68,  69,  70,  71,  72,  73,  74,  75,  76,  77,  78,  79,  80,  81,
+     82,  83,  84,  85,  86,  87,  88,  89,  90,  91,  92,  93,  94,  95,  96,  97,
+     98,  99, 100,  54, 101, 102, 103,  54, 104, 105, 106, 107, 108, 109, 110,  54,
+     39, 111, 112, 113, 114,  28, 115, 116,  39,  39,  39,  39,  39,  39,  39,  39,
+     39,  39, 117,  39, 118, 119, 120,  39, 121,  39, 122, 123, 124,  28,  28, 125,
+    126,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,
+     39,  39,  39, 127, 128,  39,  39, 129, 130, 131, 132, 133,  39, 134, 135, 136,
+    137,  39, 138, 139, 140, 141,  39, 142, 143, 144, 145, 146,  39, 147, 148, 149,
+    150,  39, 151, 152, 153, 154, 155,  54, 156, 157, 158, 159, 160, 161,  39, 162,
+     39, 163, 164, 165, 166, 167, 168, 169,  17, 170, 171, 172, 173, 171,  22, 174,
+      7,   7,   7,   7, 175,   7,   7,   7, 176, 177, 178, 179, 180, 181, 182, 183,
+    184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199,
+    200, 200, 200, 200, 200, 200, 200, 200, 201, 202, 149, 203, 204, 205, 206, 207,
+    149, 208, 209, 210, 211, 149, 149, 212, 149, 149, 149, 149, 149, 213, 214, 215,
+    149, 149, 149, 216, 149, 149, 149, 149, 149, 149, 149, 217, 218, 149, 219, 220,
+    149, 149, 149, 149, 149, 149, 149, 149, 200, 200, 200, 200, 221, 200, 222, 223,
+    200, 200, 200, 200, 200, 200, 200, 200, 149, 224, 225, 226, 227, 149, 149, 149,
+     28, 228, 229, 230,   7,   7,   7, 231,  17, 232,  39, 233, 234, 235, 235,  22,
+    236, 237, 238,  54, 239, 149, 149, 240, 149, 149, 149, 149, 149, 149, 241, 242,
+    243, 244,  98,  39, 245, 126,  39, 246, 247, 248,  39,  39, 249,  39, 149, 250,
+    251, 252, 253, 149, 252, 254, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149,
+     39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,
+     39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,
+     39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39, 149, 149,
+     39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,
+     39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,
+     39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39, 255,
+    256,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,
+     39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,
+     39,  39,  39,  39, 257, 149, 258, 165,  39,  39,  39,  39,  39,  39,  39,  39,
+    259, 260,   7, 261, 262,  39,  39, 263, 264, 265,   7, 266, 267, 268, 269, 270,
+    271, 272,  39, 273, 274, 275, 276, 277,  48, 278, 279, 255,  58, 280, 281, 282,
+     39, 283, 284, 285,  39, 286, 287, 288, 289, 290, 291, 292,  17,  17,  39, 293,
+     39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,
+     39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39, 294, 295, 296,
+    297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297,
+    297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297,
+    298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298,
+    298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298,
+    298, 298, 298, 298, 298, 298, 298, 298,  39,  39,  39,  39,  39,  39,  39,  39,
+     39,  39,  39, 299,  39,  39, 300,  54, 301, 302, 303,  39,  39, 304, 305,  39,
+     39,  39,  39,  39,  39,  39,  39,  39,  39, 306, 307,  39, 308,  39, 309, 310,
+    311, 312, 313, 314,  39,  39,  39, 315, 316,   2, 317, 318, 319, 143, 320, 321,
+    322, 323, 324,  54,  39,  39,  39, 325, 326, 327, 195, 328, 329, 330, 331, 332,
+     54,  54,  54,  54, 255,  39, 333, 334,  39, 335, 336, 337, 338,  39, 339,  54,
+     28, 340, 341,  39, 342, 343, 344, 345,  39, 346,  39, 347,  54,  54,  54,  54,
+     39,  39,  39,  39,  39,  39,  39,  39,  39, 234, 142, 309,  54,  54,  54,  54,
+    348, 349, 350, 351, 143, 352,  54, 353, 354, 355,  54,  54,  39, 356, 357, 210,
+    358, 359, 360, 361, 362,  54, 363, 364,  39, 365, 366, 367, 368, 369,  54,  54,
+     39,  39, 370,  54,  28, 371,  17, 372,  39, 373,  54,  54,  54,  54,  54,  54,
+     54,  54,  54, 374,  39, 375,  54,  54, 362, 376, 377,  54,  54, 307, 378, 234,
+    379, 380, 381, 382, 160, 383, 384, 385, 386, 387, 388, 389, 160, 390, 391, 392,
+    393, 394,  54,  54, 395, 396, 397, 398, 399, 400, 401, 402,  54,  54,  54,  54,
+     39, 403, 404, 405,  39, 406, 407,  54,  54,  54,  54,  54,  39, 408, 409,  54,
+     39, 410, 411, 412,  39, 413, 414,  54, 122, 415,  54,  54,  54,  54,  54,  54,
+     39, 416,  54,  54,  54,  28,  17, 417, 418, 419, 420,  54,  54, 421, 422, 423,
+    424, 425, 426,  39, 427, 428,  39, 139,  54,  54,  54,  54,  54,  54,  54,  54,
+    429, 430, 431, 432, 433, 434,  54,  54, 435, 436, 437, 438, 439, 414,  54,  54,
+     54,  54,  54,  54,  54,  54,  54, 440,  54,  54,  54,  54,  54, 441, 442, 443,
+     39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,
+     39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39, 300,  54,  54,  54,
+    195, 195, 195, 444,  39,  39,  39,  39,  39,  39, 445,  54,  54,  54,  54,  54,
+     54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,
+     54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,
+     54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,
+     39, 446,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,
+     54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,
+     39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,
+     39,  39, 447,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,
+     39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,
+     39, 139, 143, 448,  54,  54, 307, 449,  39, 450, 451, 452, 453,  54,  54,  54,
+     54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,
+     54,  54,  28,  17, 454,  54,  54,  54,  39,  39, 455, 456, 457,  54,  54, 458,
+     39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,
+     39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39, 459,
+     39,  39,  39,  39,  39,  39, 142,  54, 370,  54,  54,  54,  54,  54,  54,  54,
+     54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,
+     39,  39,  39,  39,  39,  39,  39,  39, 143,  54, 460, 461,  39,  39,  39,  39,
+     39,  39,  39,  39,  39,  39,  39, 296,  54,  54,  54,  54,  54,  54,  54,  54,
+     39,  39,  39, 462, 463, 464,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,
+     54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,
+    149, 149, 149, 149, 149, 149, 149, 241, 149, 465, 149, 466, 467, 468, 149, 469,
+    149, 149, 470,  54,  54,  54,  54, 471, 149, 149, 472, 473,  54,  54,  54,  54,
+    474, 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, 474, 475, 487,
+    477, 488, 489, 490, 481, 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, 501,
+    149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149,
+     22, 502,  22, 503, 504, 505,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,
+    506, 507,  54,  54,  54,  54,  54,  54,  39, 508, 509,  54,  54,  54,  54,  54,
+     54,  54,  54,  54,  54,  54,  39, 510,  54,  54,  54,  54,  54,  54,  54,  54,
+     39,  39,  39,  39,  39,  39, 511,  54,  28, 512, 513,  54,  54,  54,  54,  54,
+     54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,
+     54,  54,  54, 514, 210, 515,  54,  54, 516, 517,  54,  54,  54,  54,  54,  54,
+    518, 519, 520, 521, 522, 523,  54, 524,  54,  54,  54,  54,  54,  54,  54,  54,
+    149, 525, 149, 149, 240, 526, 527, 241, 528, 149, 149, 149, 149, 529,  54, 530,
+    531, 532, 533, 534,  54,  54,  54,  54, 149, 149, 149, 149, 149, 149, 149, 535,
+    149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149,
+    149, 149, 149, 149, 149, 149, 536, 537, 149, 149, 149, 240, 149, 149, 538, 539,
+    525, 149, 540, 149, 541, 542,  54,  54, 149, 149, 149, 543, 149, 149, 544, 149,
+    149, 149, 240, 545, 546, 547, 548,  54, 149, 149, 149, 149, 549, 149, 209, 550,
+     39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,
+     39,  39,  39,  39,  39,  39, 342,  54,  39,  39,  39,  39,  39,  39,  39,  39,
+     39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,
+     39,  39,  39,  39,  39,  39,  39,  39,  39, 551,  39,  39,  39,  39,  39,  39,
+    342,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,
+     39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,
+     39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,
+     39,  39,  39,  39,  39, 552,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,
+     39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,
+     39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39, 553,
+     39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,
+    342,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,
+     39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,
+     39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  53,  54,  54,  54,  54,  54,
+    554, 555, 555, 555,  54,  54,  54,  54,  22,  22,  22,  22,  22,  22,  22, 556,
+     54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,
+    298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298,
+    298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 557
+};
+
+static RE_UINT8 re_general_category_table_3[] = {
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     2,  3,  3,  3,  4,  3,  3,  3,  5,  6,  3,  7,  3,  8,  3,  3,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  3,  3,  7,  7,  7,  3,
+     3, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,  5,  3,  6, 11, 12,
+    11, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,  5,  7,  6,  7,  1,
+     2,  3,  4,  4,  4,  4, 14,  3, 11, 14, 15, 16,  7, 17, 14, 11,
+    14,  7, 18, 18, 11, 13,  3,  3, 11, 18, 15, 19, 18, 18, 18,  3,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10,  7, 10, 10, 10, 10, 10, 10, 10, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13,  7, 13, 13, 13, 13, 13, 13, 13, 13,
+    10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13,
+    10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13,
+    10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13,
+    10, 13, 10, 13, 10, 13, 10, 13, 13, 10, 13, 10, 13, 10, 13, 10,
+    13, 10, 13, 10, 13, 10, 13, 10, 13, 13, 10, 13, 10, 13, 10, 13,
+    10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13,
+    10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13,
+    10, 13, 10, 13, 10, 13, 10, 13, 10, 10, 13, 10, 13, 10, 13, 13,
+    13, 10, 10, 13, 10, 13, 10, 10, 13, 10, 10, 10, 13, 13, 10, 10,
+    10, 10, 13, 10, 10, 13, 10, 10, 10, 13, 13, 13, 10, 10, 13, 10,
+    10, 13, 10, 13, 10, 13, 10, 10, 13, 10, 13, 13, 10, 13, 10, 10,
+    13, 10, 10, 10, 13, 10, 13, 10, 10, 13, 13, 15, 10, 13, 13, 13,
+    15, 15, 15, 15, 10, 20, 13, 10, 20, 13, 10, 20, 13, 10, 13, 10,
+    13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 13, 10, 13,
+    10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13,
+    13, 10, 20, 13, 10, 13, 10, 10, 10, 13, 10, 13, 10, 13, 10, 13,
+    10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13,
+    10, 13, 10, 13, 13, 13, 13, 13, 13, 13, 10, 10, 13, 10, 10, 13,
+    13, 10, 13, 10, 10, 10, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 15, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 11, 11, 11, 11, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    21, 21, 21, 21, 21, 11, 11, 11, 11, 11, 11, 11, 21, 11, 21, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
+    22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
+    22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
+    10, 13, 10, 13, 21, 11, 10, 13,  0,  0, 21, 13, 13, 13,  3, 10,
+     0,  0,  0,  0, 11, 11, 10,  3, 10, 10, 10,  0, 10,  0, 10, 10,
+    13, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10,  0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 10,
+    13, 13, 10, 10, 10, 13, 13, 13, 10, 13, 10, 13, 10, 13, 10, 13,
+    10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13,
+    13, 13, 13, 13, 10, 13,  7, 10, 13, 10, 10, 13, 13, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    10, 13, 14, 22, 22, 22, 22, 22, 23, 23, 10, 13, 10, 13, 10, 13,
+    10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13,
+    10, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 13,
+    10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13,
+    10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13,
+     0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10,  0,  0, 21,  3,  3,  3,  3,  3,  3,
+    13, 13, 13, 13, 13, 13, 13, 13, 13,  3,  8,  0,  0, 14, 14,  4,
+     0, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
+    22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
+    22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,  8, 22,
+     3, 22, 22,  3, 22, 22,  3, 22,  0,  0,  0,  0,  0,  0,  0,  0,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,  0,  0,  0,  0, 15,
+    15, 15, 15,  3,  3,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    17, 17, 17, 17, 17, 17,  7,  7,  7,  3,  3,  4,  3,  3, 14, 14,
+    22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,  3, 17,  0,  3,  3,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    21, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 22, 22, 22, 22, 22,
+    22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  3,  3,  3,  3, 15, 15,
+    22, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15,  3, 15, 22, 22, 22, 22, 22, 22, 22, 17, 14, 22,
+    22, 22, 22, 22, 22, 21, 21, 22, 22, 14, 22, 22, 22, 22, 15, 15,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9, 15, 15, 15, 14, 14, 15,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  0, 17,
+    15, 22, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
+    22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,  0,  0, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
+    22, 15,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 22, 22, 22, 22, 22,
+    22, 22, 22, 22, 21, 21, 14,  3,  3,  3, 21,  0,  0, 22,  4,  4,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 22, 22, 22, 22, 21, 22, 22, 22, 22, 22,
+    22, 22, 22, 22, 21, 22, 22, 22, 21, 22, 22, 22, 22, 22,  0,  0,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  0,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 22, 22, 22,  0,  0,  3,  0,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15,  0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
+    22, 22, 17, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
+    22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
+    22, 22, 22, 24, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 22, 24, 22, 15, 24, 24,
+    24, 22, 22, 22, 22, 22, 22, 22, 22, 24, 24, 24, 24, 22, 24, 24,
+    15, 22, 22, 22, 22, 22, 22, 22, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 22, 22,  3,  3,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     3, 21, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 22, 24, 24,  0, 15, 15, 15, 15, 15, 15, 15, 15,  0,  0, 15,
+    15,  0,  0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15,  0, 15, 15, 15, 15, 15, 15,
+    15,  0, 15,  0,  0,  0, 15, 15, 15, 15,  0,  0, 22, 15, 24, 24,
+    24, 22, 22, 22, 22,  0,  0, 24, 24,  0,  0, 24, 24, 22, 15,  0,
+     0,  0,  0,  0,  0,  0,  0, 24,  0,  0,  0,  0, 15, 15,  0, 15,
+    15, 15, 22, 22,  0,  0,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+    15, 15,  4,  4, 18, 18, 18, 18, 18, 18, 14,  4, 15,  3, 22,  0,
+     0, 22, 22, 24,  0, 15, 15, 15, 15, 15, 15,  0,  0,  0,  0, 15,
+    15,  0,  0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15,  0, 15, 15, 15, 15, 15, 15,
+    15,  0, 15, 15,  0, 15, 15,  0, 15, 15,  0,  0, 22,  0, 24, 24,
+    24, 22, 22,  0,  0,  0,  0, 22, 22,  0,  0, 22, 22, 22,  0,  0,
+     0, 22,  0,  0,  0,  0,  0,  0,  0, 15, 15, 15, 15,  0, 15,  0,
+     0,  0,  0,  0,  0,  0,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+    22, 22, 15, 15, 15, 22,  3,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0, 22, 22, 24,  0, 15, 15, 15, 15, 15, 15, 15, 15, 15,  0, 15,
+    15, 15,  0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15,  0, 15, 15, 15, 15, 15, 15,
+    15,  0, 15, 15,  0, 15, 15, 15, 15, 15,  0,  0, 22, 15, 24, 24,
+    24, 22, 22, 22, 22, 22,  0, 22, 22, 24,  0, 24, 24, 22,  0,  0,
+    15,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    15, 15, 22, 22,  0,  0,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     3,  4,  0,  0,  0,  0,  0,  0,  0, 15, 22, 22, 22, 22, 22, 22,
+     0, 22, 24, 24,  0, 15, 15, 15, 15, 15, 15, 15, 15,  0,  0, 15,
+    15,  0,  0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15,  0, 15, 15, 15, 15, 15, 15,
+    15,  0, 15, 15,  0, 15, 15, 15, 15, 15,  0,  0, 22, 15, 24, 22,
+    24, 22, 22, 22, 22,  0,  0, 24, 24,  0,  0, 24, 24, 22,  0,  0,
+     0,  0,  0,  0,  0, 22, 22, 24,  0,  0,  0,  0, 15, 15,  0, 15,
+    15, 15, 22, 22,  0,  0,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+    14, 15, 18, 18, 18, 18, 18, 18,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0, 22, 15,  0, 15, 15, 15, 15, 15, 15,  0,  0,  0, 15, 15,
+    15,  0, 15, 15, 15, 15,  0,  0,  0, 15, 15,  0, 15,  0, 15, 15,
+     0,  0,  0, 15, 15,  0,  0,  0, 15, 15, 15,  0,  0,  0, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15,  0,  0,  0,  0, 24, 24,
+    22, 24, 24,  0,  0,  0, 24, 24, 24,  0, 24, 24, 24, 22,  0,  0,
+    15,  0,  0,  0,  0,  0,  0, 24,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+    18, 18, 18, 14, 14, 14, 14, 14, 14,  4, 14,  0,  0,  0,  0,  0,
+    22, 24, 24, 24, 22, 15, 15, 15, 15, 15, 15, 15, 15,  0, 15, 15,
+    15,  0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15,  0, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15,  0,  0,  0, 15, 22, 22,
+    22, 24, 24, 24, 24,  0, 22, 22, 22,  0, 22, 22, 22, 22,  0,  0,
+     0,  0,  0,  0,  0, 22, 22,  0, 15, 15, 15,  0,  0,  0,  0,  0,
+    15, 15, 22, 22,  0,  0,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     0,  0,  0,  0,  0,  0,  0,  3, 18, 18, 18, 18, 18, 18, 18, 14,
+    15, 22, 24, 24,  3, 15, 15, 15, 15, 15, 15, 15, 15,  0, 15, 15,
+    15,  0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15,  0, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15,  0, 15, 15, 15, 15, 15,  0,  0, 22, 15, 24, 22,
+    24, 24, 24, 24, 24,  0, 22, 24, 24,  0, 24, 24, 22, 22,  0,  0,
+     0,  0,  0,  0,  0, 24, 24,  0,  0,  0,  0,  0,  0,  0, 15,  0,
+    15, 15, 22, 22,  0,  0,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     0, 15, 15,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    22, 22, 24, 24, 15, 15, 15, 15, 15, 15, 15, 15, 15,  0, 15, 15,
+    15,  0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 22, 22, 15, 24, 24,
+    24, 22, 22, 22, 22,  0, 24, 24, 24,  0, 24, 24, 24, 22, 15, 14,
+     0,  0,  0,  0, 15, 15, 15, 24, 18, 18, 18, 18, 18, 18, 18, 15,
+    15, 15, 22, 22,  0,  0,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 14, 15, 15, 15, 15, 15, 15,
+     0, 22, 24, 24,  0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15,  0,  0,  0, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15,  0, 15, 15, 15, 15, 15, 15, 15, 15, 15,  0, 15,  0,  0,
+    15, 15, 15, 15, 15, 15, 15,  0,  0,  0, 22,  0,  0,  0,  0, 24,
+    24, 24, 22, 22, 22,  0, 22,  0, 24, 24, 24, 24, 24, 24, 24, 24,
+     0,  0,  0,  0,  0,  0,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     0,  0, 24, 24,  3,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 22, 15, 15, 22, 22, 22, 22, 22, 22, 22,  0,  0,  0,  0,  4,
+    15, 15, 15, 15, 15, 15, 21, 22, 22, 22, 22, 22, 22, 22, 22,  3,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  3,  3,  0,  0,  0,  0,
+     0, 15, 15,  0, 15,  0, 15, 15, 15, 15, 15,  0, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15,  0, 15,  0, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 22, 15, 15, 22, 22, 22, 22, 22, 22, 22, 22, 22, 15,  0,  0,
+    15, 15, 15, 15, 15,  0, 21,  0, 22, 22, 22, 22, 22, 22,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0, 15, 15, 15, 15,
+    15, 14, 14, 14,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+     3,  3,  3, 14,  3, 14, 14, 14, 22, 22, 14, 14, 14, 14, 14, 14,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 14, 22, 14, 22, 14, 22,  5,  6,  5,  6, 24, 24,
+    15, 15, 15, 15, 15, 15, 15, 15,  0, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,  0,  0,  0,
+     0, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 24,
+    22, 22, 22, 22, 22,  3, 22, 22, 15, 15, 15, 15, 15, 22, 22, 22,
+    22, 22, 22, 22, 22, 22, 22, 22,  0, 22, 22, 22, 22, 22, 22, 22,
+    22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
+    22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,  0, 14, 14,
+    14, 14, 14, 14, 14, 14, 22, 14, 14, 14, 14, 14, 14,  0, 14, 14,
+     3,  3,  3,  3,  3, 14, 14, 14, 14,  3,  3,  0,  0,  0,  0,  0,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 24, 24, 22, 22, 22,
+    22, 24, 22, 22, 22, 22, 22, 22, 24, 22, 22, 24, 24, 22, 22, 15,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  3,  3,  3,  3,  3,  3,
+    15, 15, 15, 15, 15, 15, 24, 24, 22, 22, 15, 15, 15, 15, 22, 22,
+    22, 15, 24, 24, 24, 15, 15, 24, 24, 24, 24, 24, 24, 24, 15, 15,
+    15, 22, 22, 22, 22, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 22, 24, 24, 22, 22, 24, 24, 24, 24, 24, 24, 22, 15, 24,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9, 24, 24, 24, 22, 14, 14,
+    10, 10, 10, 10, 10, 10,  0, 10,  0,  0,  0,  0,  0, 10,  0,  0,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,  3, 21, 13, 13, 13,
+    15, 15, 15, 15, 15, 15, 15, 15, 15,  0, 15, 15, 15, 15,  0,  0,
+    15, 15, 15, 15, 15, 15, 15,  0, 15,  0, 15, 15, 15, 15,  0,  0,
+    15, 15, 15, 15, 15, 15, 15, 15, 15,  0, 15, 15, 15, 15,  0,  0,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15,  0, 15, 15, 15, 15,  0,  0, 15, 15, 15, 15, 15, 15, 15,  0,
+    15,  0, 15, 15, 15, 15,  0,  0, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15,  0, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15,  0, 15, 15, 15, 15,  0,  0, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,  0,  0, 22, 22, 22,
+     3,  3,  3,  3,  3,  3,  3,  3,  3, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,  0,  0,  0,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14,  0,  0,  0,  0,  0,  0,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10,  0,  0, 13, 13, 13, 13, 13, 13,  0,  0,
+     8, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 14,  3, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+     2, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,  5,  6,  0,  0,  0,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,  3,  3,  3, 25, 25,
+    25, 15, 15, 15, 15, 15, 15, 15, 15,  0,  0,  0,  0,  0,  0,  0,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,  0, 15, 15,
+    15, 15, 22, 22, 22,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 22, 22, 22,  3,  3,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 22, 22,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,  0, 15, 15,
+    15,  0, 22, 22,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 22, 22, 24, 22, 22, 22, 22, 22, 22, 22, 24, 24,
+    24, 24, 24, 24, 24, 24, 22, 24, 24, 22, 22, 22, 22, 22, 22, 22,
+    22, 22, 22, 22,  3,  3,  3, 21,  3,  3,  3,  4, 15, 22,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,  0,  0,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18,  0,  0,  0,  0,  0,  0,
+     3,  3,  3,  3,  3,  3,  8,  3,  3,  3,  3, 22, 22, 22, 17,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,  0,  0,
+    15, 15, 15, 21, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15,  0,  0,  0,  0,  0,  0,  0,
+    15, 15, 15, 15, 15, 22, 22, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 22, 15,  0,  0,  0,  0,  0,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,  0,
+    22, 22, 22, 24, 24, 24, 24, 22, 22, 24, 24, 24,  0,  0,  0,  0,
+    24, 24, 22, 24, 24, 24, 24, 24, 24, 22, 22, 22,  0,  0,  0,  0,
+    14,  0,  0,  0,  3,  3,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,  0,  0,
+    15, 15, 15, 15, 15,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,  0,  0,  0,  0,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15,  0,  0,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9, 18,  0,  0,  0, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 22, 22, 24, 24, 22,  0,  0,  3,  3,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 24, 22, 24, 22, 22, 22, 22, 22, 22, 22,  0,
+    22, 24, 22, 24, 24, 22, 22, 22, 22, 22, 22, 22, 22, 24, 24, 24,
+    24, 24, 24, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,  0,  0, 22,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,  0,  0,
+     3,  3,  3,  3,  3,  3,  3, 21,  3,  3,  3,  3,  3,  3,  0,  0,
+    22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 23, 22,
+    22,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    22, 22, 22, 22, 24, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 22, 24, 22, 22, 22, 22, 22, 24, 22, 24, 24, 24,
+    24, 24, 22, 24, 24, 15, 15, 15, 15, 15, 15, 15,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  3,  3,  3,  3,  3,  3,
+     3, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 22, 22, 22, 22, 22,
+    22, 22, 22, 22, 14, 14, 14, 14, 14, 14, 14, 14, 14,  0,  0,  0,
+    22, 22, 24, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 24, 22, 22, 22, 22, 24, 24, 22, 22, 24, 22, 22, 22, 15, 15,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 22, 24, 22, 22, 24, 24, 24, 22, 24, 22,
+    22, 22, 24, 24,  0,  0,  0,  0,  0,  0,  0,  0,  3,  3,  3,  3,
+    15, 15, 15, 15, 24, 24, 24, 24, 24, 24, 24, 24, 22, 22, 22, 22,
+    22, 22, 22, 22, 24, 24, 22, 22,  0,  0,  0,  3,  3,  3,  3,  3,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0, 15, 15, 15,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 21, 21, 21, 21, 21, 21,  3,  3,
+    13, 13, 13, 13, 13, 13, 13, 13, 13,  0,  0,  0,  0,  0,  0,  0,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,  0,  0, 10, 10, 10,
+     3,  3,  3,  3,  3,  3,  3,  3,  0,  0,  0,  0,  0,  0,  0,  0,
+    22, 22, 22,  3, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
+    22, 24, 22, 22, 22, 22, 22, 22, 22, 15, 15, 15, 15, 22, 15, 15,
+    15, 15, 15, 15, 22, 15, 15, 24, 22, 22, 15,  0,  0,  0,  0,  0,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 21, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 21, 21, 21, 21, 21,
+    22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
+    22, 22, 22, 22, 22, 22, 22, 22, 22, 22,  0, 22, 22, 22, 22, 22,
+    10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13,
+    10, 13, 10, 13, 10, 13, 13, 13, 13, 13, 13, 13, 13, 13, 10, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 10, 10, 10, 10, 10, 10, 10, 10,
+    13, 13, 13, 13, 13, 13,  0,  0, 10, 10, 10, 10, 10, 10,  0,  0,
+    13, 13, 13, 13, 13, 13, 13, 13, 10, 10, 10, 10, 10, 10, 10, 10,
+    13, 13, 13, 13, 13, 13, 13, 13, 10, 10, 10, 10, 10, 10, 10, 10,
+    13, 13, 13, 13, 13, 13,  0,  0, 10, 10, 10, 10, 10, 10,  0,  0,
+    13, 13, 13, 13, 13, 13, 13, 13,  0, 10,  0, 10,  0, 10,  0, 10,
+    13, 13, 13, 13, 13, 13, 13, 13, 10, 10, 10, 10, 10, 10, 10, 10,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,  0,  0,
+    13, 13, 13, 13, 13, 13, 13, 13, 20, 20, 20, 20, 20, 20, 20, 20,
+    13, 13, 13, 13, 13, 13, 13, 13, 20, 20, 20, 20, 20, 20, 20, 20,
+    13, 13, 13, 13, 13, 13, 13, 13, 20, 20, 20, 20, 20, 20, 20, 20,
+    13, 13, 13, 13, 13,  0, 13, 13, 10, 10, 10, 10, 20, 11, 13, 11,
+    11, 11, 13, 13, 13,  0, 13, 13, 10, 10, 10, 10, 20, 11, 11, 11,
+    13, 13, 13, 13,  0,  0, 13, 13, 10, 10, 10, 10,  0, 11, 11, 11,
+    13, 13, 13, 13, 13, 13, 13, 13, 10, 10, 10, 10, 10, 11, 11, 11,
+     0,  0, 13, 13, 13,  0, 13, 13, 10, 10, 10, 10, 20, 11, 11,  0,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2, 17, 17, 17, 17, 17,
+     8,  8,  8,  8,  8,  8,  3,  3, 16, 19,  5, 16, 16, 19,  5, 16,
+     3,  3,  3,  3,  3,  3,  3,  3, 26, 27, 17, 17, 17, 17, 17,  2,
+     3,  3,  3,  3,  3,  3,  3,  3,  3, 16, 19,  3,  3,  3,  3, 12,
+    12,  3,  3,  3,  7,  5,  6,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+     3,  3,  7,  3, 12,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  2,
+    17, 17, 17, 17, 17,  0, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+    18, 21,  0,  0, 18, 18, 18, 18, 18, 18,  7,  7,  7,  5,  6, 21,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18,  7,  7,  7,  5,  6,  0,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,  0,  0,  0,
+     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
+     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 23, 23, 23,
+    23, 22, 23, 23, 23, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
+    22,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    14, 14, 10, 14, 14, 14, 14, 10, 14, 14, 13, 10, 10, 10, 13, 13,
+    10, 10, 10, 13, 14, 10, 14, 14,  7, 10, 10, 10, 10, 10, 14, 14,
+    14, 14, 14, 14, 10, 14, 10, 14, 10, 14, 10, 10, 10, 10, 14, 13,
+    10, 10, 10, 10, 13, 15, 15, 15, 15, 13, 14, 14, 13, 13, 10, 10,
+     7,  7,  7,  7,  7, 10, 13, 13, 13, 13, 14,  7, 14, 14, 13, 14,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+    25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+    25, 25, 25, 10, 13, 25, 25, 25, 25, 18, 14, 14,  0,  0,  0,  0,
+     7,  7,  7,  7,  7, 14, 14, 14, 14, 14,  7,  7, 14, 14, 14, 14,
+     7, 14, 14,  7, 14, 14,  7, 14, 14, 14, 14, 14, 14, 14,  7, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,  7,  7,
+    14, 14,  7, 14,  7, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+    14, 14, 14, 14, 14, 14, 14, 14,  5,  6,  5,  6, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+     7,  7, 14, 14, 14, 14, 14, 14, 14,  5,  6, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,  7, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,  7,  7,  7,  7,  7,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     7,  7,  7,  7, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,  7,  7,  7,  7,
+     7,  7, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14,  7, 14, 14, 14, 14, 14, 14, 14, 14,
+    14,  7, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14,  7,  7,  7,  7,  7,  7,  7,  7,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,  7,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14,  5,  6,  5,  6,  5,  6,  5,  6,
+     5,  6,  5,  6,  5,  6, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+     7,  7,  7,  7,  7,  5,  6,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     7,  7,  7,  7,  7,  7,  5,  6,  5,  6,  5,  6,  5,  6,  5,  6,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     7,  7,  7,  5,  6,  5,  6,  5,  6,  5,  6,  5,  6,  5,  6,  5,
+     6,  5,  6,  5,  6,  5,  6,  5,  6,  7,  7,  7,  7,  7,  7,  7,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     7,  7,  7,  7,  7,  7,  7,  7,  5,  6,  5,  6,  7,  7,  7,  7,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  5,  6,  7,  7,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     7,  7,  7,  7,  7, 14, 14,  7,  7,  7,  7,  7,  7, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14,  0,  0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14,  0, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,  0,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,  0,
+    10, 13, 10, 10, 10, 13, 13, 10, 13, 10, 13, 10, 13, 10, 10, 10,
+    10, 13, 10, 13, 13, 10, 13, 13, 13, 13, 13, 13, 21, 21, 10, 10,
+    10, 13, 10, 13, 13, 14, 14, 14, 14, 14, 14, 10, 13, 10, 13, 22,
+    22, 22, 10, 13,  0,  0,  0,  0,  0,  3,  3,  3,  3, 18,  3,  3,
+    13, 13, 13, 13, 13, 13,  0, 13,  0,  0,  0,  0,  0, 13,  0,  0,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15,  0,  0,  0,  0,  0,  0,  0, 21,
+     3,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 22,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    15, 15, 15, 15, 15, 15, 15,  0, 15, 15, 15, 15, 15, 15, 15,  0,
+    15, 15, 15, 15, 15, 15, 15,  0, 15, 15, 15, 15, 15, 15, 15,  0,
+     3,  3, 16, 19, 16, 19,  3,  3,  3, 16, 19,  3, 16, 19,  3,  3,
+     3,  3,  3,  3,  3,  3,  3,  8,  3,  3,  8,  3, 16, 19,  3,  3,
+    16, 19,  5,  6,  5,  6,  5,  6,  5,  6,  3,  3,  3,  3,  3, 21,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  8,  8,  3,  3,  3,  3,
+     8,  3,  5,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+    14, 14,  3,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14,  0, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,  0,  0,  0,  0,
+     2,  3,  3,  3, 14, 21, 15, 25,  5,  6,  5,  6,  5,  6,  5,  6,
+     5,  6, 14, 14,  5,  6,  5,  6,  5,  6,  5,  6,  8,  5,  6,  6,
+    14, 25, 25, 25, 25, 25, 25, 25, 25, 25, 22, 22, 22, 22, 24, 24,
+     8, 21, 21, 21, 21, 21, 14, 14, 25, 25, 25, 21, 15,  3, 14, 14,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15,  0,  0, 22, 22, 11, 11, 21, 21, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,  3, 21, 21, 21, 15,
+     0,  0,  0,  0,  0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+     0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,  0,
+    14, 14, 18, 18, 18, 18, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,  0,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 18, 18, 18, 18, 18, 18, 18, 18,
+    14, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,  0,  0,  0,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 21, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,  0,  0,  0,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 21,  3,  3,  3,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9, 15, 15,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 15, 22,
+    23, 23, 23,  3, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,  3, 21,
+    10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13,
+    10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 21, 21, 22, 22,
+    15, 15, 15, 15, 15, 15, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+    22, 22,  3,  3,  3,  3,  3,  3,  0,  0,  0,  0,  0,  0,  0,  0,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    11, 11, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13,
+    13, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13,
+    10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13,
+    21, 13, 13, 13, 13, 13, 13, 13, 13, 10, 13, 10, 13, 10, 10, 13,
+    10, 13, 10, 13, 10, 13, 10, 13, 21, 11, 11, 10, 13, 10, 13, 15,
+    10, 13, 10, 13, 13, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13,
+    10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 10, 10, 10, 10, 13,
+    10, 10, 10, 10, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13,
+     0,  0, 10, 13, 10, 10, 10, 10, 13, 10, 13,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0, 10, 13, 15, 21, 21, 13, 15, 15, 15, 15, 15,
+    15, 15, 22, 15, 15, 15, 22, 15, 15, 15, 15, 22, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 24, 24, 22, 22, 24, 14, 14, 14, 14, 22,  0,  0,  0,
+    18, 18, 18, 18, 18, 18, 14, 14,  4, 14,  0,  0,  0,  0,  0,  0,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15,  3,  3,  3,  3,  0,  0,  0,  0,  0,  0,  0,  0,
+    24, 24, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
+    24, 24, 24, 24, 22, 22,  0,  0,  0,  0,  0,  0,  0,  0,  3,  3,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,  0,  0,
+    22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
+    22, 22, 15, 15, 15, 15, 15, 15,  3,  3,  3, 15,  3, 15, 15, 22,
+    15, 15, 15, 15, 15, 15, 22, 22, 22, 22, 22, 22, 22, 22,  3,  3,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 22, 22, 22, 22, 22, 22, 22, 22, 22,
+    22, 22, 24, 24,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  3,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 22, 24, 24, 22, 22, 22, 22, 24, 24, 22, 22, 24, 24,
+    24,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  0, 21,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,  3,  3,
+    15, 15, 15, 15, 15, 22, 21, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9, 15, 15, 15, 15, 15,  0,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 22, 22, 22, 22, 22, 22, 24,
+    24, 22, 22, 24, 24, 22, 22,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    15, 15, 15, 22, 15, 15, 15, 15, 15, 15, 15, 15, 22, 24,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  3,  3,  3,  3,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    21, 15, 15, 15, 15, 15, 15, 14, 14, 14, 15, 24, 22, 24, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    22, 15, 22, 22, 22, 15, 15, 22, 22, 15, 15, 15, 15, 15, 22, 22,
+    15, 22, 15,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 15, 15, 21,  3,  3,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 24, 22, 22, 24, 24,
+     3,  3, 15, 21, 21, 24, 22,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0, 15, 15, 15, 15, 15, 15,  0,  0, 15, 15, 15, 15, 15, 15,  0,
+     0, 15, 15, 15, 15, 15, 15,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    15, 15, 15, 15, 15, 15, 15,  0, 15, 15, 15, 15, 15, 15, 15,  0,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 11, 21, 21, 21, 21,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 21, 11, 11,  0,  0,  0,  0,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    15, 15, 15, 24, 24, 22, 24, 24, 22, 24, 24,  3, 24, 22,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,  0,  0,
+    15, 15, 15, 15,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15,  0,  0,  0,  0, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,  0,  0,  0,  0,
+    28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,
+    28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,
+    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
+    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,  0,  0,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15,  0,  0,  0,  0,  0,  0,
+    13, 13, 13, 13, 13, 13, 13,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0, 13, 13, 13, 13, 13,  0,  0,  0,  0,  0, 15, 22, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15,  7, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15,  0, 15, 15, 15, 15, 15,  0, 15,  0,
+    15, 15,  0, 15, 15,  0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,  6,  5,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+     0,  0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,  4, 14,  0,  0,
+    22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
+     3,  3,  3,  3,  3,  3,  3,  5,  6,  3,  0,  0,  0,  0,  0,  0,
+    22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
+     3,  8,  8, 12, 12,  5,  6,  5,  6,  5,  6,  5,  6,  5,  6,  5,
+     6,  5,  6,  5,  6,  3,  3,  5,  6,  3,  3,  3,  3, 12, 12, 12,
+     3,  3,  3,  0,  3,  3,  3,  3,  8,  5,  6,  5,  6,  5,  6,  3,
+     3,  3,  7,  8,  7,  7,  7,  0,  3,  4,  3,  3,  0,  0,  0,  0,
+    15, 15, 15, 15, 15,  0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,  0,  0, 17,
+     0,  3,  3,  3,  4,  3,  3,  3,  5,  6,  3,  7,  3,  8,  3,  3,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  3,  3,  7,  7,  7,  3,
+    11, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,  5,  7,  6,  7,  5,
+     6,  3,  5,  6,  3,  3, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    21, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 21, 21,
+     0,  0, 15, 15, 15, 15, 15, 15,  0,  0, 15, 15, 15, 15, 15, 15,
+     0,  0, 15, 15, 15, 15, 15, 15,  0,  0, 15, 15, 15,  0,  0,  0,
+     4,  4,  7, 11, 14,  4,  4,  0, 14,  7,  7,  7,  7, 14, 14,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0, 17, 17, 17, 14, 14,  0,  0,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,  0, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15,  0, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,  0, 15, 15,  0, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,  0,  0,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,  0,  0,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,  0,  0,  0,  0,  0,
+     3,  3,  3,  0,  0,  0,  0, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18,  0,  0,  0, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+    25, 25, 25, 25, 25, 18, 18, 18, 18, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 18, 18, 14, 14, 14,  0,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,  0,  0,  0,
+    14,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 22,  0,  0,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    22, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,  0,  0,  0,  0,
+    18, 18, 18, 18,  0,  0,  0,  0,  0,  0,  0,  0,  0, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 25, 15, 15, 15, 15, 15, 15, 15, 15, 25,  0,  0,  0,  0,  0,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 22, 22, 22, 22, 22,  0,  0,  0,  0,  0,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,  0,  3,
+    15, 15, 15, 15,  0,  0,  0,  0, 15, 15, 15, 15, 15, 15, 15, 15,
+     3, 25, 25, 25, 25, 25,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    10, 10, 10, 10, 10, 10, 10, 10, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,  0,  0,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10,  0,  0,  0,  0, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,  0,  0,  0,  0,
+    15, 15, 15, 15, 15, 15, 15, 15,  0,  0,  0,  0,  0,  0,  0,  0,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  3,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    15, 15, 15, 15, 15, 15,  0,  0, 15,  0, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15,  0, 15, 15,  0,  0,  0, 15,  0,  0, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15,  0,  3, 18, 18, 18, 18, 18, 18, 18, 18,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 14, 14, 18, 18, 18, 18, 18, 18, 18,
+     0,  0,  0,  0,  0,  0,  0, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15,  0, 15, 15,  0,  0,  0,  0,  0, 18, 18, 18, 18, 18,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 18, 18, 18, 18, 18, 18,  0,  0,  0,  3,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15,  0,  0,  0,  0,  0,  3,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15,  0,  0,  0,  0, 18, 18, 15, 15,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+     0,  0, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    15, 22, 22, 22,  0, 22, 22,  0,  0,  0,  0,  0, 22, 22, 22, 22,
+    15, 15, 15, 15,  0, 15, 15, 15,  0, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15,  0,  0, 22, 22, 22,  0,  0,  0,  0, 22,
+    18, 18, 18, 18, 18, 18, 18, 18, 18,  0,  0,  0,  0,  0,  0,  0,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  0,  0,  0,  0,  0,  0,  0,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 18, 18,  3,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 18, 18, 18,
+    15, 15, 15, 15, 15, 15, 15, 15, 14, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 22, 22,  0,  0,  0,  0, 18, 18, 18, 18, 18,
+     3,  3,  3,  3,  3,  3,  3,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15,  0,  0,  0,  3,  3,  3,  3,  3,  3,  3,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15,  0,  0, 18, 18, 18, 18, 18, 18, 18, 18,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15,  0,  0,  0,  0,  0, 18, 18, 18, 18, 18, 18, 18, 18,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15,  0,  0,  0,  0,  0,  0,  0,  3,  3,  3,  3,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0, 18, 18, 18, 18, 18, 18, 18,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    15, 15, 15, 15, 15, 15, 15, 15, 15,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13,  0,  0,  0,  0,  0,  0,  0, 18, 18, 18, 18, 18, 18,
+    15, 15, 15, 15, 22, 22, 22, 22,  0,  0,  0,  0,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,  0,  0,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,  0,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15,  0, 22, 22,  8,  0,  0,
+    15, 15,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    18, 18, 18, 18, 18, 18, 18, 15,  0,  0,  0,  0,  0,  0,  0,  0,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
+    22, 18, 18, 18, 18,  3,  3,  3,  3,  3,  0,  0,  0,  0,  0,  0,
+    15, 15, 15, 15, 15, 18, 18, 18, 18, 18, 18, 18,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    24, 22, 24, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 22, 22, 22, 22, 22, 22, 22, 22,
+    22, 22, 22, 22, 22, 22, 22,  3,  3,  3,  3,  3,  3,  3,  0,  0,
+     0,  0, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 22,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    24, 24, 24, 22, 22, 22, 22, 24, 24, 22, 22,  3,  3, 17,  3,  3,
+     3,  3,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 17,  0,  0,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15,  0,  0,  0,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,  0,  0,
+    22, 22, 22, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 22, 22, 22, 22, 22, 24, 22, 22, 22,
+    22, 22, 22, 22, 22,  0,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     3,  3,  3,  3, 15, 24, 24, 15,  0,  0,  0,  0,  0,  0,  0,  0,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 22,  3,  3, 15,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 24, 24, 24, 22, 22, 22, 22, 22, 22, 22, 22, 22, 24,
+    24, 15, 15, 15, 15,  3,  3,  3,  3, 22, 22, 22, 22,  3, 24, 22,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9, 15,  3, 15,  3,  3,  3,
+     0, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15,  0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 24, 24, 24, 22,
+    22, 22, 24, 24, 22, 24, 22, 22,  3,  3,  3,  3,  3,  3, 22,  0,
+    15, 15, 15, 15, 15, 15, 15,  0, 15,  0, 15, 15, 15, 15,  0, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,  0, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15,  3,  0,  0,  0,  0,  0,  0,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 22,
+    24, 24, 24, 22, 22, 22, 22, 22, 22, 22, 22,  0,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,  0,  0,
+    22, 22, 24, 24,  0, 15, 15, 15, 15, 15, 15, 15, 15,  0,  0, 15,
+    15,  0,  0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15,  0, 15, 15, 15, 15, 15, 15,
+    15,  0, 15, 15,  0, 15, 15, 15, 15, 15,  0, 22, 22, 15, 24, 24,
+    22, 24, 24, 24, 24,  0,  0, 24, 24,  0,  0, 24, 24, 24,  0,  0,
+    15,  0,  0,  0,  0,  0,  0, 24,  0,  0,  0,  0,  0, 15, 15, 15,
+    15, 15, 24, 24,  0,  0, 22, 22, 22, 22, 22, 22, 22,  0,  0,  0,
+    22, 22, 22, 22, 22,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 24, 24, 24, 22, 22, 22, 22, 22, 22, 22, 22,
+    24, 24, 22, 22, 22, 24, 22, 15, 15, 15, 15,  3,  3,  3,  3,  3,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  3,  3,  0,  3, 22, 15,
+    15, 15,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    24, 24, 24, 22, 22, 22, 22, 22, 22, 24, 22, 24, 24, 24, 24, 22,
+    22, 24, 22, 22, 15, 15,  3, 15,  0,  0,  0,  0,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,  0,  0,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 24,
+    24, 24, 22, 22, 22, 22,  0,  0, 24, 24, 24, 24, 22, 22, 24, 22,
+    22,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+     3,  3,  3,  3,  3,  3,  3,  3, 15, 15, 15, 15, 22, 22,  0,  0,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    24, 24, 24, 22, 22, 22, 22, 22, 22, 22, 22, 24, 24, 22, 24, 22,
+    22,  3,  3,  3, 15,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,  0,  0,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 22, 24, 22, 24, 24,
+    22, 22, 22, 22, 22, 22, 24, 22, 15,  0,  0,  0,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    24, 24, 22, 22, 22, 22, 24, 22, 22, 22, 22, 22,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9, 18, 18,  3,  3,  3, 14,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 24, 24, 24, 22,
+    22, 22, 22, 22, 22, 22, 22, 22, 24, 22, 22,  3,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9, 18, 18, 18, 18, 18, 18,
+    18, 18, 18,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 15,
+    15, 15, 15, 15, 15, 15, 15,  0,  0, 15,  0,  0, 15, 15, 15, 15,
+    15, 15, 15, 15,  0, 15, 15,  0, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    24, 24, 24, 24, 24, 24,  0, 24, 24,  0,  0, 22, 22, 24, 22, 15,
+    24, 15, 24, 22,  3,  3,  3,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,  0,  0,
+    15, 15, 15, 15, 15, 15, 15, 15,  0,  0, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 24, 24, 24, 22, 22, 22, 22,  0,  0, 22, 22, 24, 24, 24, 24,
+    22, 15,  3, 15, 24,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    15, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 22, 22, 22, 22, 22, 22, 24, 15, 22, 22, 22, 22,  3,
+     3,  3,  3,  3,  3,  3,  3, 22,  0,  0,  0,  0,  0,  0,  0,  0,
+    15, 22, 22, 22, 22, 22, 22, 24, 24, 22, 22, 22, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 22, 22, 22, 22, 22, 22,
+    22, 22, 22, 22, 22, 22, 22, 24, 22, 22,  3,  3,  3, 15,  3,  3,
+     3,  3,  3,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    15, 15, 15, 15, 15, 15, 15, 15, 15,  0, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 24,
+    22, 22, 22, 22, 22, 22, 22,  0, 22, 22, 22, 22, 22, 22, 24, 22,
+    15,  3,  3,  3,  3,  3,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,  0,  0,  0,
+     3,  3, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+     0,  0, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
+    22, 22, 22, 22, 22, 22, 22, 22,  0, 24, 22, 22, 22, 22, 22, 22,
+    22, 24, 22, 22, 24, 22, 22,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    15, 15, 15, 15, 15, 15, 15,  0, 15, 15,  0, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 22, 22, 22, 22, 22, 22,  0,  0,  0, 22,  0, 22, 22,  0, 22,
+    22, 22, 22, 22, 22, 22, 15, 22,  0,  0,  0,  0,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,  0,  0,
+    15, 15, 15, 15, 15, 15,  0, 15, 15,  0, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 24, 24, 24, 24, 24,  0,
+    22, 22,  0, 24, 24, 22, 24, 22, 15,  0,  0,  0,  0,  0,  0,  0,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 22, 22, 24, 24,  3,  3,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    15,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 14, 14, 14, 14, 14, 14, 14, 14,  4,  4,  4,
+     4, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  3,
+    25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,  0,
+     3,  3,  3,  3,  3,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    15, 15, 15, 15,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,  0,
+    17, 17, 17, 17, 17, 17, 17, 17, 17,  0,  0,  0,  0,  0,  0,  0,
+    15, 15, 15, 15, 15, 15, 15,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,  3,  3,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,  0,  0,
+    22, 22, 22, 22, 22,  3,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    22, 22, 22, 22, 22, 22, 22,  3,  3,  3,  3,  3, 14, 14, 14, 14,
+    21, 21, 21, 21,  3, 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0, 18, 18, 18, 18, 18,
+    18, 18,  0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15,  0,  0,  0,  0,  0, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18,  3,  3,  3,  3,  0,  0,  0,  0,  0,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,  0,  0,  0,  0, 22,
+    15, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
+    24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
+    24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
+    24, 24, 24, 24, 24, 24, 24, 24,  0,  0,  0,  0,  0,  0,  0, 22,
+    22, 22, 22, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21,  3, 21, 22,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    24, 24,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    15, 15, 15,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0, 15, 15, 15, 15,  0,  0,  0,  0,  0,  0,  0,  0,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,  0,  0,  0,  0,  0,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,  0,  0,  0,
+    15, 15, 15, 15, 15, 15, 15, 15, 15,  0,  0,  0,  0,  0,  0,  0,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15,  0,  0, 14, 22, 22,  3,
+    17, 17, 17, 17,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    14, 14, 14, 14, 14, 14, 14,  0,  0, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 24, 24, 22, 22, 22, 14, 14, 14, 24, 24, 24,
+    24, 24, 24, 17, 17, 17, 17, 17, 17, 17, 17, 22, 22, 22, 22, 22,
+    22, 22, 22, 14, 14, 22, 22, 22, 22, 22, 22, 22, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 22, 22, 22, 22, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    14, 14, 22, 22, 22, 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18,  0,  0,  0,  0,  0,  0,  0,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 13, 13,
+    13, 13, 13, 13, 13,  0, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 10,  0, 10, 10,
+     0,  0, 10,  0,  0, 10, 10,  0,  0, 10, 10, 10, 10,  0, 10, 10,
+    10, 10, 10, 10, 10, 10, 13, 13, 13, 13,  0, 13,  0, 13, 13, 13,
+    13, 13, 13, 13,  0, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 10, 10,  0, 10, 10, 10, 10,  0,  0, 10, 10, 10,
+    10, 10, 10, 10, 10,  0, 10, 10, 10, 10, 10, 10, 10,  0, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 10, 10,  0, 10, 10, 10, 10,  0,
+    10, 10, 10, 10, 10,  0, 10,  0,  0,  0, 10, 10, 10, 10, 10, 10,
+    10,  0, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    10, 10, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    13, 13, 13, 13, 13, 13,  0,  0, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10,  7, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,  7, 13, 13, 13, 13,
+    13, 13, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,  7, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13,  7, 13, 13, 13, 13, 13, 13, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10,  7, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,  7,
+    13, 13, 13, 13, 13, 13, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,  7,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13,  7, 13, 13, 13, 13, 13, 13,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10,  7, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13,  7, 13, 13, 13, 13, 13, 13, 10, 13,  0,  0,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+    22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
+    22, 22, 22, 22, 22, 22, 22, 14, 14, 14, 14, 22, 22, 22, 22, 22,
+    22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 14, 14, 14,
+    14, 14, 14, 14, 14, 22, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 22, 14, 14,  3,  3,  3,  3,  3,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 22, 22, 22, 22, 22,
+     0, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    22, 22, 22, 22, 22, 22, 22,  0, 22, 22, 22, 22, 22, 22, 22, 22,
+    22, 22, 22, 22, 22, 22, 22, 22, 22,  0,  0, 22, 22, 22, 22, 22,
+    22, 22,  0, 22, 22,  0, 22, 22, 22, 22, 22,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,  0,  0,  0,
+    22, 22, 22, 22, 22, 22, 22, 21, 21, 21, 21, 21, 21, 21,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0, 15, 14,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 22, 22, 22, 22,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,  0,  4,
+    15, 15, 15, 15, 15,  0,  0, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    22, 22, 22, 22, 22, 22, 22,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    10, 10, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 22, 22, 22, 22, 22, 22, 22, 21,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,  3,  3,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 14, 18, 18, 18,
+     4, 18, 18, 18, 18,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 14, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,  0,  0,
+    15, 15, 15, 15,  0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+     0, 15, 15,  0, 15,  0,  0, 15,  0, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15,  0, 15, 15, 15, 15,  0, 15,  0, 15,  0,  0,  0,  0,
+     0,  0, 15,  0,  0,  0,  0, 15,  0, 15,  0, 15,  0, 15, 15, 15,
+     0, 15, 15,  0, 15,  0,  0, 15,  0, 15,  0, 15,  0, 15,  0, 15,
+     0, 15, 15,  0, 15,  0,  0, 15, 15, 15, 15,  0, 15, 15, 15, 15,
+    15, 15, 15,  0, 15, 15, 15, 15,  0, 15, 15, 15, 15,  0, 15,  0,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15,  0, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,  0,  0,  0,  0,
+     0, 15, 15, 15,  0, 15, 15, 15, 15, 15,  0, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     7,  7,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,  0,  0,  0,  0,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,  0,
+     0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+     0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+     0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,  0,  0,  0,  0,
+    14, 14, 14, 14, 14, 14, 14, 14, 14,  0,  0,  0,  0,  0,  0,  0,
+    14, 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    14, 14, 14, 14, 14, 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 11, 11, 11, 11, 11,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14,  0,  0,  0,  0,  0,  0,  0,  0,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,  0,  0,  0,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,  0,  0,  0,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14,  0,  0,  0,  0,  0,  0,  0,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    14, 14, 14, 14, 14, 14, 14, 14,  0,  0,  0,  0,  0,  0,  0,  0,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14,  0,  0,  0,  0,  0,  0,
+    14, 14, 14, 14, 14, 14, 14, 14,  0,  0,  0,  0,  0,  0,  0,  0,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,  0,  0,
+    14, 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14,  0, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,  0, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,  0,  0,
+    14, 14, 14, 14, 14,  0,  0,  0, 14, 14, 14,  0,  0,  0,  0,  0,
+    14, 14, 14, 14, 14, 14, 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14,  0,  0,  0,  0,  0,  0,  0,
+    14, 14, 14, 14, 14, 14, 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    14, 14, 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    14, 14, 14, 14, 14, 14, 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14,  0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,  0,  0,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    15, 15,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0, 17,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+    22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
+    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,  0,  0
+};
+
+RE_UINT32 re_get_general_category(RE_UINT32 codepoint) {
+    RE_UINT32 field_2;
+    RE_UINT32 field_1;
+    RE_UINT32 field_0;
+    RE_UINT32 v;
+
+    field_2 = codepoint >> 10;
+    field_1 = (codepoint >> 5) & 0x1F;
+    field_0 = codepoint & 0x1F;
+
+    v = re_general_category_table_1[field_2];
+    v = re_general_category_table_2[(v << 5) | field_1];
+    v = re_general_category_table_3[(v << 5) | field_0];
+
+    return v;
+}
+
+/* Graph. */
+static RE_UINT8 re_graph_table_1[] = {
+     0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 14, 13, 15, 16, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 17, 18, 18, 13, 13, 13, 13, 13, 13, 19, 20,
+    21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 18, 18, 13, 31, 18, 18,
+    18, 32, 18, 18, 18, 18, 18, 18, 18, 18, 33, 34, 13, 13, 13, 13,
+    13, 35, 13, 36, 18, 18, 18, 18, 18, 18, 18, 18, 37, 18, 18, 38,
+    18, 18, 18, 18, 39, 40, 41, 18, 42, 18, 43, 44, 45, 46, 47, 18,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 48, 13, 13, 13, 49, 50, 13,
+    13, 13, 13, 51, 13, 13, 13, 13, 13, 13, 52, 18, 18, 18, 53, 18,
+    13, 13, 13, 13, 54, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    55, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 56,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 56
+};
+
+static RE_UINT16 re_graph_table_2[] = {
+      0,   1,   2,   3,   0,   1,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
+      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   4,   5,   6,   2,   2,
+      2,   2,   2,   2,   2,   2,   2,   2,   2,   7,   8,   2,   9,   2,  10,  11,
+     12,   2,   2,   2,   2,   2,   2,   2,  13,   2,  14,   2,   2,  15,   2,  16,
+      2,  17,  18,  19,   0,  20,  21,   2,   2,   2,   2,   2,  22,  23,  24,  25,
+     26,  27,  28,  29,  30,  31,  32,  33,  34,  31,  35,  36,  37,  38,  39,  40,
+     41,  42,  43,  44,  41,  45,  46,  47,  41,   2,  48,  49,  50,  51,  52,  53,
+      1,  54,  55,   0,  56,  57,  58,   0,   2,   2,  59,  60,  61,  12,  62,   0,
+      2,   2,   2,   2,   2,   2,  63,   2,   2,   2,   2,   2,   2,   2,   2,   2,
+      2,   2,  64,   2,  65,  66,  67,   2,  68,   2,  16,  69,  70,   2,   2,  71,
+      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
+      2,   2,   2,   2,  72,   2,   2,  73,  74,  75,  76,  77,   2,   2,  78,  79,
+     80,   2,   2,  73,   2,  81,   2,  82,   3,  83,  84,  85,   2,  86,  87,   2,
+     88,   2,   3,  89,  79,  90,  91,   0,   2,   2,  86,  69,   2,   2,   2,  92,
+      2,  93,  94,   2,  95,  16,  10,  96,   2,   2,   2,   2,   2,   2,   2,  97,
+      2,   2,   2,   2,   2,   2,   2,   2,  71,   2,  98,  78,   2,  20,  99, 100,
+    101, 102,   3, 103, 104,   2, 105, 106,   2,   2,   2,   2,  86,   2,   2,   2,
+      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
+      2, 107,  19,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
+      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
+      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
+      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2, 108, 109,   2,   2,   2,
+      2, 110,   3,   2,   2,   2,   2, 111,   2,  63,   2, 112,  75, 113, 113,   2,
+      2,   2, 114,   0,  97,   2,   2,  76,   2,   2,   2,   2,   2,   2,  82, 115,
+      1,   2,   1,   2,   8,   2,   2,   2, 116,   7,   2,   2, 110,   2,   2, 117,
+      3,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
+      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
+      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
+      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
+      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,  69,
+      2,   2,   2,   2, 118,   2, 119,   2,   2,   2,   2,   2,   2,   2,   2,   2,
+      2, 120,   2,   2,   2,   2,   2, 121,   2,   2,   2,   2,   2,   2, 122, 123,
+      2, 124,   2, 121,   2,   2, 125,   2,   2,   2, 126,  69,   2,   2, 127,   3,
+      2,  75, 128,   2,   2,   2, 129,  75, 130, 131,   2,  86,   2,   2,   2, 132,
+      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
+      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2, 117, 133,  55,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
+      2,   2,   2,  90,   2,   2,  70,   0, 134, 135, 136,   2,   2,   2, 137,   2,
+      2,   2,   2,   2,   2,   2,   2,   2,   2,   2, 105,   2, 138,   2, 139, 140,
+     70,   2, 141, 142,   2,   2,   2,  89,   1,   2,   2,   2,   2,   3, 143, 144,
+    145, 146, 147,   0,   2,   2,   2,  96, 148, 149,   2,   2, 104,  91, 105,  78,
+      0,   0,   0,   0,  69,   2, 106,  55,   2, 150,  81,  96, 151,   2, 152,   0,
+      2,   2,   2,   2,  78, 153, 154,  55,   2,  10,   2, 155,   0,   0,   0,   0,
+      2,   2,   2,   2,   2,   2,   2,   2,   2,  75,  82, 139,   0,   0,   0,   0,
+    156, 157, 109,   2,   3, 158,   0, 159, 160, 161,   0,   0,   2, 162, 138,   2,
+    163, 164, 165,   2,   2,   0,   2, 166,   2, 167, 168, 169, 170, 171,   0,   0,
+      2,   2, 172,   0,   2, 114,   2, 173,   2, 174,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   3,   2, 175,   0,   0,   2,  10,  70,   0,   0, 105, 120,  75,
+      2,   2, 176, 177,   2,   2, 178, 179,   2,  20,  10,  75,   2,   2,   2, 180,
+    181,   3,   0,   0, 182, 153,   2, 183,  22, 184, 185, 186,   0,   0,   0,   0,
+      2,   2, 187, 188,   2,   2, 174,   0,   0,   0,   0,   0,   2, 168,  78,   0,
+      2,   2, 189, 190,   2,  73, 191,   0,  16,  86,   0,   0,   0,   0,   0,   0,
+      2,  55,   0,   0,   0,   2,   2, 192, 193, 194, 195,   0,   0, 196,   4, 197,
+      2,   2,  10,   2,   2, 198,   2,  73,   0,   0,   0,   0,   0,   0,   0,   0,
+    199, 200, 201, 118, 138, 202,   0,   0, 203, 204, 174, 205, 206, 191,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,  73,   0,   0,   0,   0,   0, 207,   2, 208,
+      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
+      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,  70,   0,   0,   0,
+      2,   2,   2, 209,   2,   2,   2,   2,   2,   2, 210,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      2, 211,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
+      2,   2, 107,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
+      2,  73,   3, 212,   0,   0, 105, 213,   2,   2, 214, 215, 216,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   2,   2,  96,   0,   0,   0,   2,   2, 217,   2, 218,   0,   0, 219,
+      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
+      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2, 121,
+      2,   2,   2,   2,   2,   2,  82,   0, 172,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      2,   2,   2,   2,   2,   2,   2,   2,   3,   0, 220, 221,   2,   2,   2,   2,
+      2,   2,   2,   2,   2,   2,   2,  55,   0,   0,   0,   0,   0,   0,   0,   0,
+      2,   2,   2, 222, 223, 210,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      2,   2,   2,   2,   2,   2,   2,  82,   2, 224,   2,   2,   2,   2,   2, 172,
+      2,   2, 225,   0,   0,   0,   0,  76,   2,   2,  75,  73,   0,   0,   0,   0,
+      2,   2,  20,   2,  12, 226, 227,   2, 228, 229, 230,   2,   2,   2,   2,   2,
+      2,   2,   2,   2,   2, 231,   2,   2,   2,   2,   2,   2,   2,   2, 232,   2,
+      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
+      2,   2,   2,   2, 233, 234,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    235, 236,   0,   0,   0,   0,   0,   0,   2, 237, 212,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   2, 161,   0,   0,   0,   0,   0,   0,   0,   0,
+      2,   2,   2,   2,   2,   2, 238,   0,   2,   2, 239,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0, 240,   2, 241,   0,   0,   1,  78,   0,   0,   0,   0,   0,   0,
+    227, 242, 243, 244, 245, 246,   0, 247,   0,   0,   0,   0,   0,   0,   0,   0,
+      2,  86,   2,   2,  76, 248, 249,  82,   2,   2,   2,   2,   2, 250,   0, 251,
+    252,  55, 253, 225,   0,   0,   0,   0,   2,   2,   2,   2,   2,   2,   2,   2,
+      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
+      2,   2,   2,   2,   2,   2, 121, 254,   2,   2,   2,  76,   2,   2,  73, 120,
+     86,   2, 174,   2,  10, 255,   0,   0,   2,   2,   2, 256,   2,   2, 145,   2,
+      2,   2,  76, 257, 119, 258, 259,   0,   2,   2,   2,   2, 141,   2,  19, 260,
+      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
+      2,   2,   2,   2,   2,   2,  78,   0,   2,   2,   2,   2,   2,   2,   2,   2,
+      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
+      2,   2,   2,   2,   2,   2,   2,   2,   2, 241,   2,   2,   2,   2,   2,   2,
+     78,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
+      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
+      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
+      2,   2,   2,   2,   2, 261,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
+      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
+      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,  91,
+      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
+     78,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
+      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,  19,   0,   0,   0,   0,   0,
+    262,   2,   2,   2,   0,   0,   0,   0,   2,   2,   2,   2,   2,   2,   2, 216,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
+      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,  78
+};
+
+static RE_UINT8 re_graph_table_3[] = {
+      0,   0,   0,   0, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 127,
+    255, 255, 255, 252, 240, 215, 255, 255, 251, 255, 255, 255, 255, 255, 254, 255,
+    255, 255, 127, 254, 255, 231, 254, 255, 255,   0, 255, 255, 255, 135,  31,   0,
+    255, 255, 255, 223, 255, 191, 255, 255, 255, 231, 255, 255, 255, 255,   3,   0,
+    255, 255, 255, 231, 255,  63, 255, 127, 255, 255, 255,  79, 255,   7,   0,   0,
+    255, 255, 223, 255, 255,   0, 248, 255, 239, 159, 249, 255, 255, 253, 197, 243,
+    159, 121, 128, 176, 207, 255, 255, 127, 238, 135, 249, 255, 255, 253, 109, 211,
+    135,  57,   2,  94, 192, 255, 127,   0, 238, 191, 251, 255, 255, 253, 237, 243,
+    191,  59,   1,   0, 207, 255,   3, 254, 238, 159, 249, 255, 159,  57, 224, 176,
+    207, 255, 255,   0, 236, 199,  61, 214,  24, 199, 255, 195, 199,  61, 129,   0,
+    192, 255, 255,   7, 255, 223, 253, 255, 255, 253, 255, 227, 223,  61,  96,   7,
+    207, 255, 128, 255, 255, 253, 239, 243, 223,  61,  96,  64, 207, 255,   6,   0,
+    223, 253, 240, 255, 207, 255, 255, 255, 238, 255, 127, 252, 255, 255, 251,  47,
+    127, 132,  95, 255, 192, 255,  28,   0, 255, 255, 255, 135, 255, 255, 255,  15,
+    214, 247, 255, 255, 175, 255, 255,  63,  95,  63, 255, 243, 255, 254, 255, 255,
+    255,  31, 254, 255, 255, 255, 255, 254, 255, 223, 255,   7, 191,  32, 255, 255,
+    255,  61, 127,  61, 255,  61, 255, 255, 255, 255,  61, 127,  61, 255, 127, 255,
+    255, 255,  61, 255, 255, 255, 255,  31, 255, 255, 255,   3, 255, 255,  63,  63,
+    254, 255, 255,  31, 255, 255, 255,   1, 255, 223,  31,   0, 255, 255, 127,   0,
+    255, 255,  15,   0, 255, 223,  13,   0, 255, 255, 255,  63, 255,   3, 255,   3,
+    255, 127, 255,   3, 255,   7, 255, 255, 255, 255,  63,   0, 255,  15, 255,  15,
+    241, 255, 255, 255, 255,  63,  31,   0, 255,  15, 255, 255, 255,   3, 255, 199,
+    255, 255, 255, 207, 255, 255, 255, 159, 255,  63, 255, 255,   1,   0,   0,   0,
+    255, 255,  15, 240, 255, 255, 255, 248, 255, 227, 255, 255, 255,   1, 255, 255,
+    255, 255, 255,   7, 255, 255, 255, 251,  63,  63, 255, 170, 223, 255, 207, 239,
+    255, 255, 220, 127,   0, 248, 255, 255, 255, 124, 255, 255, 223, 255, 243, 255,
+    255, 127, 255,  31,   0,   0, 255, 255, 255, 255,   1,   0, 127,   0,   0,   0,
+    255, 255, 207, 255, 255, 255, 191, 255, 255, 127, 255, 255, 255, 255,  15, 254,
+    255, 128,   1, 128, 127, 127, 127, 127, 255, 255,   7,   0,   0,   0, 255,  15,
+    224, 255, 255, 255,  15,   0, 255, 255, 255,  31, 255, 255, 127,   0, 255, 255,
+    255,  15,   0,   0, 255, 255, 255,   0, 252,   7,   0,   0,   0,   0, 224, 255,
+    255,  31, 255,   3,  63, 192, 255,   3, 255, 255,  15, 128, 255, 191, 255, 195,
+    255,  63, 255, 243,   7,   0,   0, 248, 126, 126, 126,   0, 127, 127, 255, 255,
+    255,  63, 255,   3, 127, 248, 255, 255, 127,   0, 248, 224, 255, 255, 127,  95,
+    219, 255, 255, 255,   3,   0, 248, 255, 255, 255, 252, 255, 255,   0,   0,   0,
+      0,   0, 255,  63, 255, 255, 247, 255, 127,  15, 223, 255, 252, 252, 252,  28,
+    127, 127,   0,  62, 255, 239, 255, 255, 127, 255, 255, 183, 255,  63, 255,  63,
+    135, 255, 255, 255, 255, 255, 143, 255,  15, 224, 255, 255, 255, 255, 255, 191,
+     15, 255,  63,   0, 255,   3, 255, 255, 255, 255,  15, 255,  15, 128,   0,   0,
+     63, 253, 255, 255, 255, 255, 191, 145, 128, 255,   0,   0, 255, 255,  55, 248,
+    255, 255, 255, 143, 255, 255, 255, 131, 255, 255, 255, 240, 111, 240, 239, 254,
+    255, 255,  63, 135, 255,   1, 255,   1, 127, 248, 127,   0, 255, 255,  63, 254,
+    255, 255,  63, 255, 255, 255,   7, 255, 255, 255,   3,  30,   0, 254,   0,   0,
+    255,   1,   0,   0, 255, 255,   7, 252, 255,   0, 255,   3, 255,  59,   3,   0,
+    255,  63, 252, 255, 255, 255,   0, 128,   3,  32, 255, 255, 255,   1, 255,   3,
+    254, 255,  31,   0, 255, 255, 251, 255, 127, 189, 255, 191, 255,   7, 255,   3,
+    255, 253, 237, 251, 159,  57, 129, 224, 207,  31,  31,   0, 255, 255, 255, 239,
+      3,   0,   0,   0,  31,   0, 255,   3, 255,  31,   0,   0, 255,   3,   0,   0,
+    255, 255,   7, 128, 127, 242, 111, 255, 255, 255, 191, 249, 127,   0, 255,   3,
+    255, 252, 255, 255,  31,   0,   0,   0,   7,   0,   0,   0, 255, 253, 255, 255,
+    255, 255, 127, 255,  63,   0, 255, 255, 255, 254, 127,   0, 127, 251, 255, 255,
+    255, 255, 127, 180, 191, 253, 255, 255, 255, 127, 251,   1,   0,   0,   1,   0,
+    255, 255,   3, 128, 255, 127,  31,   0,  15,   0,   0,   0, 255, 127, 255,   1,
+    255, 195,   0,   0, 255,  63,  63,   0,  63,   0, 255, 251, 251, 255, 255, 224,
+    255, 255,   0,   0, 255, 135, 255, 255, 255, 128, 255, 255,  31,   0,   3,   0,
+      0,   0,   7,   0, 240,   0, 255, 255, 255,   7, 255,  31, 255,   1, 255, 243,
+    127, 254, 255, 255,  63,   0,   0,   0, 100, 222, 255, 235, 239, 255, 255, 255,
+    191, 231, 223, 223, 255, 255, 255, 123,  95, 252, 253, 255,  63, 255, 255, 255,
+    255, 207, 255, 255, 255,  15,   0, 248, 254, 255,   0,   0, 127, 255, 255, 249,
+    219,   7,   0,   0, 255,  31, 255,  63, 159, 255, 127,   0, 255,  15, 255, 195,
+      0,   0, 254, 255, 255, 255,  31,   0, 150, 254, 247,  10, 132, 234, 150, 170,
+    150, 247, 247,  94, 255, 251, 255,  15, 238, 251, 255,  15,   0,   0,   3,   0,
+    255, 127, 254, 255, 254, 255, 254, 255, 255,  63,   0,   0, 192, 255, 255, 255,
+      7,   0, 255, 255, 255,   1,   3,   0, 255,  31, 255,  31, 255,  63,   3,   0,
+    255, 255, 255, 253, 255,  63,  31,   7, 255,   1, 127,   0,   7,   0, 127,   0,
+      0,   0, 255,   3,   3,   0, 255, 255,   2,   0,   0,   0
+};
+
+RE_UINT32 re_get_graph(RE_UINT32 codepoint) {
+    RE_UINT32 field_2;
+    RE_UINT32 field_1;
+    RE_UINT32 field_0;
+    RE_UINT32 offset;
+    RE_UINT32 v;
+
+    field_2 = codepoint >> 10;
+    field_1 = (codepoint >> 5) & 0x1F;
+    field_0 = (codepoint >> 3) & 0x3;
+    offset = codepoint & 0x7;
+
+    v = re_graph_table_1[field_2];
+    v = re_graph_table_2[(v << 5) | field_1];
+    v = re_graph_table_3[(v << 2) | field_0];
+
+    return (v >> offset) & 0x1;
+}
+
+/* Grapheme_Base. */
+static RE_UINT8 re_grapheme_base_table_1[] = {
+     0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 14, 13, 15, 16, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 17, 18, 18, 18, 18, 18, 18, 18, 18, 19, 20,
+    21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 18, 18, 13, 31, 18, 18,
+    18, 32, 18, 18, 18, 18, 18, 18, 18, 18, 33, 34, 13, 13, 13, 13,
+    13, 35, 13, 36, 18, 18, 18, 18, 18, 18, 18, 18, 37, 18, 18, 38,
+    18, 18, 18, 18, 39, 40, 41, 18, 42, 18, 43, 44, 45, 46, 47, 18,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 48, 13, 13, 13, 49, 50, 13,
+    13, 13, 13, 51, 13, 13, 13, 13, 13, 13, 52, 18, 18, 18, 53, 18,
+    13, 13, 13, 13, 54, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18
+};
+
+static RE_UINT16 re_grapheme_base_table_2[] = {
+      0,   1,   1,   2,   0,   3,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   0,   0,   0,   4,   5,   6,   1,   1,
+      1,   1,   1,   1,   7,   1,   1,   1,   1,   8,   9,   1,  10,  11,  12,  13,
+     14,   1,  15,   8,   1,   1,  16,  17,  18,  19,  20,   1,   1,  21,   1,  22,
+     23,  24,  25,  15,   0,  26,  27,   0,  28,  29,  30,  31,  32,  33,  34,  35,
+     36,  37,  38,  39,  40,  41,  42,  43,  44,  45,  46,  47,  48,  49,  50,  51,
+     52,  53,  54,  55,  56,  57,  58,  59,  60,  61,  62,  63,  64,  65,  66,  67,
+     68,  69,  70,   0,  71,  72,  73,   0,  74,  75,  76,  77,  78,  79,  80,   0,
+      1,  81,  82,  83,  84,   1,  85,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,  86,   1,  87,  88,  89,   1,  90,   1,  91,  92,  93,   1,   1,  94,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,  92,   1,   1,  95,  96,  97,  98,  99,   1, 100, 101, 102,
+    103,   1,   1,  95, 104, 105,   1, 106,   2, 107, 108, 109,   1, 110, 111,   1,
+    112,   1, 113, 114, 102, 115,   0,   0, 116, 117, 118, 119, 120, 121,   1, 122,
+      1, 123, 124,   1, 125, 126, 127, 128,   1,   1,   1,   1,   1,   1,   0,   0,
+      1,   1,   1,   1,   1,   1,   1,   1,  94,   1, 129, 130,   1,  26, 131, 132,
+    133, 134,   1, 135, 136,   1,   0,   0,   1,   1,   1,   1, 110,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1, 137,  15,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1, 138, 139,   1,   1,   1,
+      1, 140,   2,   1,   1,   1,   1, 141,   1,  85,   1, 142, 143, 144, 144,   0,
+      1,   1, 145,   0, 146,   1,   1, 147,   1,   1,   1,   1,   1,   1, 106, 148,
+      1, 149,  68,   1, 150,   1,   1,   1, 151,   8,   1,   1, 140,   1,   1, 152,
+      2,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,  92,
+      1,   1,   1,   1, 153,   1, 154,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1, 155,   1, 156, 130,   1,   1, 157,   1,   1,   1,   1,   1,   1, 158, 159,
+    160, 161,   1, 162,   1,   1, 163, 164,   1, 165, 166,  92,  28, 167, 168, 169,
+      1, 170, 171, 172,   1, 173, 174, 175, 176, 177,   1, 110,   1,   1,   1, 178,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1, 152, 179, 180,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1, 181,   1,   1,  93,   0, 182, 183, 184,   1,   1,   1, 185,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1, 186,   1, 187,   1,  27, 188,
+    189, 186, 190, 191,   1,   1,   1,  92,  68,   1,   1,   1, 130,   2, 192, 193,
+    194, 195, 196,   0,   1,   1,   1,  91, 197, 198,   1,   1, 136, 199, 186,  92,
+      0,   0,   0,   0,  92,   1, 200, 201,   1, 202, 133, 106, 203,   1, 204,   0,
+      1,   1,   1,   1, 130, 149, 205, 180,   1, 206,   1, 207,   0,   0,   0,   0,
+      1,   1,   1,   1,   1,   1,   1,   1,   1, 143, 106,  27,   0,   0,   0,   0,
+    208, 209, 139,   1,   2, 210,   0, 211, 212, 213,   0,   0,   1, 214, 187,   1,
+    215, 106, 216,   1,   1,   0,   1, 217,   1, 218, 219, 220, 221, 222,   0,   0,
+      1,   1, 223,   0,   1, 145,   1, 224,   1, 225,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   2,   1, 226,   0,   0,   1, 206, 227,   0,   0, 186, 155, 143,
+    228, 162, 229,  19, 120, 230, 231, 232,  28, 233, 206, 234, 120, 235, 236, 237,
+    238, 239,   0,   0, 240, 149,   2, 241,  44, 242, 243, 244,   0,   0,   0,   0,
+      1, 162, 245, 246,   1, 247, 248,   0,   0,   0,   0,   0,   1, 249, 201,   0,
+      1, 250, 251, 252,   1, 253, 254,   0,  91, 255,   0,   0,   0,   0,   0,   0,
+      1, 256,   0,   0,   0,   1,   1, 257, 258, 259, 260,   0,   0, 261, 262, 263,
+    264, 265, 266,   1, 267, 268,   1,  95,   0,   0,   0,   0,   0,   0,   0,   0,
+    269, 270, 271, 153,  19, 272,   0,   0, 273, 200, 274, 275, 276, 254,   0,   0,
+      0,   0,   0,   0,   0,   0,   0, 277,   0,   0,   0,   0,   0, 278,   1, 279,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,  93,   0,   0,   0,
+      1,   1,   1, 280,   1,   1,   1,   1,   1,   1, 244,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      1, 281,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1, 137,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,  95,   2, 282,   0,   0, 186, 283,   1, 284, 285, 286,  19,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   1,   1,  91,   0,   0,   0,   1,   1, 133,   1, 287,   0,   0, 288,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1, 162,
+      1,   1,   1,   1,   1,   1, 106,   0, 223,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      1,   1,   1,   1,   1,   1,   1,   1,   2,   0, 289, 290,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1, 180,   0,   0,   0,   0,   0,   0,   0,   0,
+      1,   1,   1, 291, 292,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      1,   1,   1,   1,   1,   1,   1, 106,   1, 293,   1, 294, 295, 296,   1, 223,
+      1,   1, 297,   0,   0,   0,   0, 147,   1,   1, 143,  95,   0,   0,   0,   0,
+      1,   1,  26,   1, 298, 299, 300,   1, 301, 302, 303,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1, 304,   1,   1,   1,   1,   1,   1,   1,   1, 305,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      0, 306,   0, 307, 308,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   1, 309, 282,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   1, 310,   0,   0,   0,   0,   0,   0,   0,   0,
+      1,   1,   1,   1,   1,   1, 311,   0,   1,   1, 312,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0, 313,   1, 314,   0,   0,  68, 130,   0,   0,   0,   0,   0,   0,
+    300, 315, 316, 317, 318, 319,   0, 320,   0,   0,   0,   0,   0,   0,   0,   0,
+      1, 110,   1,   1, 147, 321, 322, 106,   1,   1,   1,   1,   1, 115,   0, 323,
+    324, 180, 325, 326,   0,   0,   0,   0,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1, 162, 327,   1,   1,   1, 147,   1,   1,  95, 155,
+    110,   1, 328,   1, 206, 329,   0,   0,   1,   1,   1, 330,   1,   1, 194,   1,
+      1,   1, 147, 331, 154, 332, 333,   0,   1,   1,   1,   1, 190,   1,  15, 189,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1, 130,   0,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1, 314,   1,   1,   1,   1,   1,   1,
+    130,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1, 231,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1, 199,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+    130,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,  15,   0,   0,   0,   0,   0
+};
+
+static RE_UINT8 re_grapheme_base_table_3[] = {
+      0,   0,   0,   0, 255, 255, 255, 255, 255, 255, 255, 127, 255, 223, 255, 255,
+      0,   0, 255, 252, 240, 215, 255, 255, 251, 255, 255, 255,   7, 252, 255, 255,
+    255, 255, 254, 255, 255, 255, 127, 254, 255, 231,   0,   0,   0,   0,   0,  64,
+     73,   0, 255, 255, 255, 135,  31,   0, 192, 255,   0, 200, 255,   7,   0,   0,
+    255, 255,  63,  64,  96, 194, 255, 255, 255,  63, 253, 255, 255, 255,   0,   0,
+      0, 224, 255, 255,  63,   0,   2,   0, 255,   7, 240, 199, 255, 255,  63,   4,
+     16,   1, 255, 127, 255, 255, 255,  65, 255, 255, 223, 255, 255,   0,   0,   0,
+    248, 255, 255, 255, 255, 255, 255, 235,   1, 222,   1, 255, 243, 255, 255, 255,
+    237, 159, 249, 255, 255, 253, 197, 163, 129,  89,   0, 176, 195, 255, 255,  63,
+    232, 135, 249, 255, 255, 253, 109, 195,   1,   0,   0,  94, 192, 255,  92,   0,
+    232, 191, 251, 255, 255, 253, 237, 227,   1,  26,   1,   0, 195, 255,   3,   2,
+    236, 159, 249, 255, 255, 253, 237,  35, 129,  25,   0, 176, 195, 255, 255,   0,
+    232, 199,  61, 214,  24, 199, 255, 131, 198,  29,   1,   0, 192, 255, 255,   7,
+    238, 223, 253, 255, 255, 253, 255,  35,  30,   0,   0,   7, 195, 255, 128, 255,
+    253, 223, 253, 255, 255, 253, 239,  99, 155,  13,   0,  64, 195, 255,   6,   0,
+    252, 223, 253, 255, 255, 255, 255, 167, 193, 221, 112, 255, 195, 255, 255, 255,
+    236, 255, 127, 252, 255, 255, 251,  47, 127,   0,   3, 127, 192, 255,  28,   0,
+    254, 255, 255, 255, 255, 255,  13, 128, 127, 128, 255,  15, 214, 247, 255, 255,
+    175, 255,  13,  32,  95,   0, 255, 243, 255, 255, 255, 252, 255, 255,  95, 253,
+    255, 254, 255, 255, 255,  31,   0, 128,  32,  31,   0,   0,   0,   0,   0, 192,
+    191, 223, 255,   7, 255,  31,   2, 153, 255, 255, 255,  60, 254, 255, 225, 255,
+    155, 223, 255, 223, 191,  32, 255, 255, 255,  61, 127,  61, 255,  61, 255, 255,
+    255, 255,  61, 127,  61, 255, 127, 255, 255, 255,  61, 255, 255, 255, 255,   7,
+    255, 255, 255,  31, 255, 255, 255,   3, 255, 255,  63,  63, 255, 255, 255,   1,
+    255, 223,   3,   0, 255, 255,  99,   0, 255, 255,   3,   0, 255, 223,   1,   0,
+    255, 255,  79, 192, 191,   1, 240,  31, 255,   3, 255,   3, 255,   7, 255,   3,
+    159, 255, 255, 255, 255,   5, 255, 255, 255, 255,  63,   0, 120,  14, 251,   1,
+    241, 255, 255, 255, 255,  63,  31,   0, 255,  15, 255, 255, 255,   3, 255, 199,
+    255, 255, 127, 198, 255, 255, 191,   0,  26, 224,   7,   0, 255,  63,   0,   0,
+    240, 255, 255, 255, 255, 255,  15, 232, 251,  15, 255, 255, 255,   7, 240,  31,
+    252, 255, 255, 255, 195, 196, 255, 255, 191,  92,  12, 240, 255,  15,  48, 248,
+    255, 227, 255, 255, 255,   1, 255, 255, 255, 255, 255, 231, 255,   0,   8,   0,
+      2, 222, 239,   4,  63,  63, 255, 170, 255, 255, 255,  63, 223, 255, 207, 239,
+    255, 255, 220, 127, 255,   7, 255, 255, 255, 128, 255, 255,   0,   0, 243, 255,
+    255, 127, 255,  31, 127,   0,   0,   0, 255, 255, 207, 255, 255, 255, 191, 255,
+    255, 127, 255, 255, 255, 127,  12, 254, 255, 128,   1,   0, 255, 255, 127,   0,
+    127, 127, 127, 127, 255, 255,   7,   0, 255, 255, 255, 251, 255, 255,  15,   0,
+      0,   0, 255,  15, 255,   3, 255, 255, 255, 255, 127, 248, 224, 255, 255, 255,
+     15,   0, 255, 255, 255,  31, 255, 255, 127,   0, 255, 255, 255,  15,   0,   0,
+    255, 127,   8, 192, 255, 255, 252,   0, 252,   7,   0,   0,   0,   0, 224, 255,
+    187, 247, 255, 255, 159,  15, 255,   3, 255, 255, 255,   0,  15, 192, 255,   3,
+      0,   0, 252, 127,  63, 192, 255, 255, 127,   0,  12, 128, 255, 255,  55, 204,
+    255, 191, 255, 195, 223, 255, 255, 127, 255, 129,  25,   0, 247,  47, 255, 243,
+    255, 255, 255, 239, 255, 255,  98,  62,   5,   0,   0, 248, 255, 207,  63,   0,
+    126, 126, 126,   0, 127, 127, 255, 255, 223,  30, 255,   3, 127, 248, 255, 255,
+    255, 255, 255,  15, 255,  63, 255, 255, 127,   0, 248, 160, 255, 255, 127,  95,
+    219, 255, 255, 255,   3,   0, 248, 255,   0,   0, 255, 255, 255, 255, 252, 255,
+      0,   0, 255,  63,   0,   0, 255,   3, 255, 255, 247, 255, 127,  15, 223, 255,
+    252, 252, 252,  28, 127, 127,   0,  48, 255, 239, 255, 255, 127, 255, 255, 183,
+    255,  63, 255,  63, 135, 255, 255, 255, 255, 255, 143, 255,   1,   0,   0,   0,
+    255, 255,   1,   0, 254, 255, 255,  15,  15, 224, 255, 255, 255, 255, 255, 191,
+     15, 255,  63,   0, 255, 255,  15, 255, 255,   0, 255, 255,  15, 128,   0,   0,
+     63, 253, 255, 255, 255, 255, 191, 145, 128, 255,   0,   0, 255, 255,  55, 248,
+    255, 255, 255, 143, 255, 255, 255, 131, 255, 255, 255, 240,   1,   0, 239, 254,
+    255,   1, 255,   1,  31, 248, 127,   0, 255, 255,  63, 254, 255, 255,  63, 255,
+    255, 255,   7, 255, 255, 255,   3,  30,   0, 254,   0,   0, 255,   1,   0,   0,
+    255, 255,   7, 252,  15,   0, 255,   3, 255,  35,   3,   0,  63,   0, 254,   3,
+    253, 255, 255, 255, 128,  63, 252, 255, 255, 255, 135, 217,   3,   0, 255, 255,
+    255,   1, 255,   3, 127,  16, 192, 255, 255, 255, 119,   0, 255, 255,  63, 128,
+    255,  97, 255, 255, 254, 255,  31,   0, 255, 255, 251, 255, 255, 127,  44,  63,
+    127, 189, 255, 191,   7,   0, 255,   3, 255, 253, 237, 163, 158,  57,   1, 224,
+     15,   0,   0,   0, 163, 255, 255, 175,   3,   0,   0,   0, 255, 255,   6,  90,
+    242,   0, 255,   3, 255, 127,   3,  79, 255, 255,   7,  88,  30,   0, 255,   3,
+    255,  31,   0,   0, 255, 215,  64,   1, 255,   3,   0,   0,  67,   0, 255, 255,
+    255, 127,   0,   9, 255, 255,   7, 128, 127, 242, 111, 255, 255, 255, 190, 161,
+    119,   0, 255,   3, 255, 252, 255, 255, 255, 255,  15, 240,  30,   0,   0,   0,
+      1, 248, 255, 255, 255, 255,   7, 134, 127,   0, 129, 241, 255,   3, 128, 252,
+      7,   0,   0,   0, 255, 253, 255, 255, 255, 255,   0,  64,  63,   0, 255, 255,
+      0,   2,  18,   0, 127, 251, 255, 255,  64,   0, 255,   3, 191, 253, 255, 255,
+    255, 127,  88,   1, 255, 255, 231,   1,   0,   0,   1,   0, 255, 255,   3, 128,
+    255, 127,  31,   0, 255, 127,   0,   0, 255, 195,   0,   0, 255,  63,  32,   0,
+    255, 255, 128, 255,  63,   0, 255, 251, 251, 255, 255, 224, 255,   0, 248, 255,
+     15,   0,   3,   0,   0,   0,   7,   0, 240,   0, 255, 255, 255,   7, 255,  31,
+    255,   1, 255, 147, 127, 254, 255, 255,  95,  60,   0,   0,  24, 240, 255, 255,
+    255, 195, 255, 255,  35,   0,   0,   0, 255, 255, 255, 223, 100, 222, 255, 235,
+    239, 255, 255, 255, 191, 231, 223, 223, 255, 255, 255, 123,  95, 252, 253, 255,
+     63, 255, 255, 255, 255, 207, 255, 255,   0,   0, 128,   7,   0, 224, 223, 255,
+    239,  15,   0,   0, 255,  31, 128,  63, 255,  15, 255, 131, 159, 255,   0,   0,
+     15,   8, 255, 195,   0,   0, 254, 255, 255, 255,  31,   0, 150, 254, 247,  10,
+    132, 234, 150, 170, 150, 247, 247,  94, 255, 251, 255,  15, 238, 251, 255,  15,
+      0,   0,   3,   0, 255, 127, 254, 255, 254, 255, 254, 255, 192, 255, 255, 255,
+      7,   0, 255, 255, 255,   1,   3,   0,  63,   0,   0,   0, 255,  31, 255,  31,
+    255,   0, 255,   3, 255,  63,   3,   0, 255, 255, 255, 253, 255,  63,  31,   7,
+    255,   1, 127,   0,   7,   0, 127,   0
+};
+
+RE_UINT32 re_get_grapheme_base(RE_UINT32 codepoint) {
+    RE_UINT32 field_2;
+    RE_UINT32 field_1;
+    RE_UINT32 field_0;
+    RE_UINT32 offset;
+    RE_UINT32 v;
+
+    field_2 = codepoint >> 10;
+    field_1 = (codepoint >> 5) & 0x1F;
+    field_0 = (codepoint >> 3) & 0x3;
+    offset = codepoint & 0x7;
+
+    v = re_grapheme_base_table_1[field_2];
+    v = re_grapheme_base_table_2[(v << 5) | field_1];
+    v = re_grapheme_base_table_3[(v << 2) | field_0];
+
+    return (v >> offset) & 0x1;
+}
+
+/* Grapheme_Cluster_Break. */
+static RE_UINT8 re_grapheme_cluster_break_table_1[] = {
+     0,  1,  2,  3,  4,  5,  6,  7,  8,  9,  9, 10, 11,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9, 12, 13, 14, 15, 16, 17, 18,
+    19, 20, 14, 15, 16, 21,  9,  9,  9,  9,  9,  9,  9,  9, 22, 23,
+    24,  9, 25, 26, 27, 28, 29, 30,  9,  9,  9,  9,  9, 31,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9, 32, 33,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9, 34,
+     9,  9,  9,  9, 35,  9, 36,  9, 37,  9, 38,  9, 39,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+    40, 41, 41, 41,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9
+};
+
+static RE_UINT8 re_grapheme_cluster_break_table_2[] = {
+      0,   1,   1,   2,   3,   4,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   5,   5,   5,   6,   1,   1,   1,   1,
+      1,   1,   1,   1,   7,   1,   1,   1,   1,   1,   1,   1,   8,   9,  10,   1,
+     11,   1,  12,  13,   1,   1,  14,  15,  16,  17,  18,   1,   1,  19,   1,  20,
+     21,  22,  23,   1,   1,   1,  24,  25,  26,  27,  28,  29,  30,  31,  32,  33,
+     34,  35,  36,  37,  34,  35,  38,  39,  30,  40,  41,  29,  42,  43,  44,   1,
+     45,  46,  47,  29,  30,  48,  49,  29,  50,  51,  52,  29,  30,   1,  53,  54,
+      1,  55,  56,   1,   1,  57,  58,   1,  59,  60,   1,  61,  62,  63,  64,   1,
+      1,  65,  66,  67,  68,   1,   1,   1,  69,  69,  69,  70,  70,  71,  72,  72,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,  73,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,  74,  74,  75,  75,   1,  76,  77,   1,
+     78,   1,   1,   1,  79,  80,   1,   1,   1,  81,   1,   1,   1,   1,   1,   1,
+     82,   1,  83,  84,   1,  17,  85,   1,  86,  87,  88,  89,  90,  91,   1,  92,
+      1,  93,   1,   1,   1,   1,  94,  95,   1,   1,   1,   1,   1,   1,   5,  96,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+     97,  98,   1,  99,   1,   1,  17, 100,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1, 101,   1,   1,   1, 102,   1,   1,   1,   5,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1, 103,   1,   1, 104,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1, 105,  46,   1,   1, 106,   1,   1,   1,   1,   1,   1,   1,   1,
+    107, 108,   1,   1, 109, 110, 111, 112,   1, 113, 114, 115,  26, 116, 117, 118,
+      1, 119, 120, 121,   1, 122, 123, 124,   1,   1,   1,   1,   1,   1,   1, 125,
+    126, 127, 128, 129, 130, 131, 132, 126, 127, 128, 129, 130, 131, 132, 126, 127,
+    128, 129, 130, 131, 132, 126, 127, 128, 129, 130, 131, 132, 126, 127, 128, 129,
+    130, 131, 132, 126, 127, 128, 129, 130, 131, 132, 126, 127, 128, 129, 130, 131,
+    132, 126, 127, 128, 129, 130, 131, 132, 126, 127, 128, 129, 130, 131, 132, 126,
+    127, 128, 129, 130, 131, 132, 126, 127, 128, 129, 130, 131, 132, 126, 127, 128,
+    129, 130, 131, 132, 126, 127, 128, 129, 130, 131, 132, 126, 127, 128, 129, 130,
+    131, 132, 126, 127, 128, 129, 130, 131, 132, 126, 127, 128, 129, 130, 131, 132,
+    126, 127, 128, 129, 130, 131, 132, 126, 127, 128, 129, 130, 131, 132, 126, 127,
+    128, 129, 130, 131, 132, 126, 127, 128, 129, 130, 131, 132, 126, 127, 128, 129,
+    130, 131, 132, 126, 127, 128, 129, 130, 131, 132, 126, 127, 128, 129, 130, 131,
+    132, 126, 127, 128, 129, 130, 131, 132, 126, 127, 128, 129, 130, 131, 132, 126,
+    127, 128, 129, 130, 131, 132, 126, 127, 128, 129, 130, 131, 132, 126, 127, 128,
+    129, 130, 131, 132, 126, 127, 128, 129, 130, 131, 132, 126, 127, 128, 129, 130,
+    131, 132, 126, 127, 128, 129, 130, 131, 132, 126, 127, 128, 129, 130, 131, 132,
+    131, 132, 126, 127, 128, 129, 130, 131, 132, 126, 127, 128, 129, 130, 131, 132,
+    126, 127, 128, 129, 130, 131, 132, 126, 127, 128, 129, 130, 131, 133, 134, 135,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1, 136,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      6,   6,   1,   1,   1,   1,   1,   2,   1,   1,   1,   1,  46,   1,   1, 137,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1, 138,
+      1,   1,   1,   1,   1,   1,   1,  85,   1,   1,   1, 139,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+    140, 141,   1,   1,   1,   1,   1,  79,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1, 142,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1, 143,   1,   1,   1,   1,  19,   1,   1,   1,   1,   1,
+    144, 145, 146, 102,  90, 147, 148,   1, 149, 150, 151, 152,  90, 153, 154,   1,
+      1, 155,   1,   1,   1,   1, 102, 156,  50,  51, 157, 158,   1,   1,   1,   1,
+      1, 159, 160,   1,   1, 161, 162,   1,   1,   1,   1,   1,   1, 163, 164,   1,
+      1, 165,  85,   1,   1, 166,   1,   1,  73, 167,   1,   1,   1,   1,   1,   1,
+      1, 168,   1,   1,   1,   1,   1,   1,   1, 169, 170,   1,   1,   1, 171, 172,
+    173, 174, 175,   1, 176,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1, 177,   1,   1, 178, 179,   1,   1,   1, 180, 181,   1, 182,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1, 183,   1,   1,   1,   1,   1,   1,   1,   1,
+      1, 184,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1, 185,   1, 186,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1, 187, 188, 189,   1,   1, 190,
+      1,   1,   1,   1, 191, 192,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1, 193, 194, 195,   1,   1,
+      1,   1, 196,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      5, 197,   5, 198, 199, 200,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+    201, 202,   1,   1,   1,   1,   1,   1,   1, 186,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1, 203,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1, 186,   1,   1,   1, 204,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1, 205,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1, 206,
+      3,   5,   5,   5,   3,   3,   3,   3,   5,   5,   5,   5,   5,   5,   5, 207,
+      3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,
+      3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,
+      3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3
+};
+
+static RE_UINT8 re_grapheme_cluster_break_table_3[] = {
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  2,  1,  1,  3,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
+     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
+     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  4,  4,  4,  4,  4,  4,  4,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
+     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
+     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  0,  4,
+     0,  4,  4,  0,  4,  4,  0,  4,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     5,  5,  5,  5,  5,  5,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  0,  1,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  4,  4,  4,  4,  4,
+     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     4,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  4,  4,  4,  4,  4,  4,  4,  5,  0,  4,
+     4,  4,  4,  4,  4,  0,  0,  4,  4,  0,  4,  4,  4,  4,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  5,
+     0,  4,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
+     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
+     4,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  4,  4,  4,  4,  4,
+     4,  4,  4,  4,  0,  0,  0,  0,  0,  0,  0,  0,  0,  4,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  4,  4,  4,  4,  0,  4,  4,  4,  4,  4,
+     4,  4,  4,  4,  0,  4,  4,  4,  0,  4,  4,  4,  4,  4,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  4,  4,  4,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
+     4,  4,  5,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
+     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
+     4,  4,  4,  6,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  4,  6,  4,  0,  6,  6,
+     6,  4,  4,  4,  4,  4,  4,  4,  4,  6,  6,  6,  6,  4,  6,  6,
+     0,  4,  4,  4,  4,  4,  4,  4,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  4,  4,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  4,  6,  6,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  4,  0,  4,  6,
+     6,  4,  4,  4,  4,  0,  0,  6,  6,  0,  0,  6,  6,  4,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  4,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  4,  4,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  4,  0,
+     0,  4,  4,  6,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  4,  0,  6,  6,
+     6,  4,  4,  0,  0,  0,  0,  4,  4,  0,  0,  4,  4,  4,  0,  0,
+     0,  4,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     4,  4,  0,  0,  0,  4,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     6,  4,  4,  4,  4,  4,  0,  4,  4,  6,  0,  6,  6,  4,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  4,  4,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  4,  4,  4,  4,  4,  4,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  4,  0,  4,  4,
+     6,  4,  4,  4,  4,  0,  0,  6,  6,  0,  0,  6,  6,  4,  0,  0,
+     0,  0,  0,  0,  0,  4,  4,  4,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  4,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  4,  6,
+     4,  6,  6,  0,  0,  0,  6,  6,  6,  0,  6,  6,  6,  4,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  4,  0,  0,  0,  0,  0,  0,  0,  0,
+     4,  6,  6,  6,  4,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  4,  4,
+     4,  6,  6,  6,  6,  0,  4,  4,  4,  0,  4,  4,  4,  4,  0,  0,
+     0,  0,  0,  0,  0,  4,  4,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  4,  0,  6,  4,
+     6,  6,  4,  6,  6,  0,  4,  6,  6,  0,  6,  6,  4,  4,  0,  0,
+     0,  0,  0,  0,  0,  4,  4,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     4,  4,  6,  6,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  4,  4,  0,  4,  6,
+     6,  4,  4,  4,  4,  0,  6,  6,  6,  0,  6,  6,  6,  4,  5,  0,
+     0,  0,  0,  0,  0,  0,  0,  4,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  4,  0,  0,  0,  0,  4,
+     6,  6,  4,  4,  4,  0,  4,  0,  6,  6,  6,  6,  6,  6,  6,  4,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  6,  6,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  4,  0,  6,  4,  4,  4,  4,  4,  4,  4,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  4,  4,  4,  4,  4,  4,  4,  4,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  4,  0,  6,  4,  4,  4,  4,  4,  4,  4,  4,  4,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  4,  4,  4,  4,  4,  4,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  4,  4,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  4,  0,  4,  0,  4,  0,  0,  0,  0,  6,  6,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  6,
+     4,  4,  4,  4,  4,  0,  4,  4,  0,  0,  0,  0,  0,  4,  4,  4,
+     4,  4,  4,  4,  4,  4,  4,  4,  0,  4,  4,  4,  4,  4,  4,  4,
+     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
+     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  4,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  4,  4,  4,
+     4,  6,  4,  4,  4,  4,  4,  4,  0,  4,  4,  6,  6,  4,  4,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  6,  6,  4,  4,  0,  0,  0,  0,  4,  4,
+     4,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  4,  4,  4,  4,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  4,  0,  6,  4,  4,  0,  0,  0,  0,  0,  0,  4,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  4,  0,  0,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  4,  4,  4,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  4,  4,  4,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  4,  4,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  4,  4,  6,  4,  4,  4,  4,  4,  4,  4,  6,  6,
+     6,  6,  6,  6,  6,  6,  4,  6,  6,  4,  4,  4,  4,  4,  4,  4,
+     4,  4,  4,  4,  0,  0,  0,  0,  0,  0,  0,  0,  0,  4,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  4,  4,  4,  1,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  4,  4,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  4,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     4,  4,  4,  6,  6,  6,  6,  4,  4,  6,  6,  6,  0,  0,  0,  0,
+     6,  6,  4,  6,  6,  6,  6,  6,  6,  4,  4,  4,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  4,  4,  6,  6,  4,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  6,  4,  6,  4,  4,  4,  4,  4,  4,  4,  0,
+     4,  0,  4,  0,  0,  4,  4,  4,  4,  4,  4,  4,  4,  6,  6,  6,
+     6,  6,  6,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  0,  0,  4,
+     4,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     4,  4,  4,  4,  6,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  4,  4,  4,  4,  4,  4,  4,  6,  4,  6,  6,  6,
+     6,  6,  4,  6,  6,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  4,  4,  4,  4,  4,
+     4,  4,  4,  4,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     4,  4,  6,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  6,  4,  4,  4,  4,  6,  6,  4,  4,  6,  4,  4,  4,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  4,  6,  4,  4,  6,  6,  6,  4,  6,  4,
+     4,  4,  6,  6,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  6,  6,  6,  6,  6,  6,  6,  6,  4,  4,  4,  4,
+     4,  4,  4,  4,  6,  6,  4,  4,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     4,  4,  4,  0,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
+     4,  6,  4,  4,  4,  4,  4,  4,  4,  0,  0,  0,  0,  4,  0,  0,
+     0,  0,  0,  0,  4,  0,  0,  6,  4,  4,  0,  0,  0,  0,  0,  0,
+     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
+     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  0,  4,  4,  4,  4,  4,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  4, 10,  1,  1,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  1,  1,  1,  1,  1,  1,  1,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
+     4,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  4,
+     4,  4,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  4,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  4,  4,  4,  4,  4,  4,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  4,  4,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  4,
+     4,  4,  4,  0,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     4,  4,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  4,  0,  0,  0,  4,  0,  0,  0,  0,  4,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  6,  6,  4,  4,  6,  0,  0,  0,  0,  4,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     6,  6,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,
+     6,  6,  6,  6,  4,  4,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
+     4,  4,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  4,
+     0,  0,  0,  0,  0,  0,  4,  4,  4,  4,  4,  4,  4,  4,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  4,  4,  4,  4,  4,  4,  4,  4,  4,
+     4,  4,  6,  6,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  4,  6,  6,  4,  4,  4,  4,  6,  6,  4,  4,  6,  6,
+     6,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  4,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  4,  4,  4,  4,  4,  4,  6,
+     6,  4,  4,  6,  6,  4,  4,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  4,  0,  0,  0,  0,  0,  0,  0,  0,  4,  6,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  4,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     4,  0,  4,  4,  4,  0,  0,  4,  4,  0,  0,  0,  0,  0,  4,  4,
+     0,  4,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  6,  4,  4,  6,  6,
+     0,  0,  0,  0,  0,  6,  4,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  6,  6,  4,  6,  6,  4,  6,  6,  0,  6,  4,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+    12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 11, 12, 12, 12,
+    12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+    12, 12, 12, 12, 12, 12, 12, 12, 11, 12, 12, 12, 12, 12, 12, 12,
+    12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+    12, 12, 12, 12, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+    12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+    11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+    12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 11, 12, 12, 12,
+    12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+    12, 12, 12, 12, 12, 12, 12, 12, 11, 12, 12, 12, 12, 12, 12, 12,
+    12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+    12, 12, 12, 12, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+    12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+    12, 12, 12, 12,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  0,  0,  0,  0,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  4,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  4,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  4,  4,  4,  4,  4,  0,  0,  0,  0,  0,
+     0,  4,  4,  4,  0,  4,  4,  0,  0,  0,  0,  0,  4,  4,  4,  4,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  4,  4,  4,  0,  0,  0,  0,  4,
+     0,  0,  0,  0,  4,  4,  4,  4,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  4,  4,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     6,  4,  6,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  4,  4,  4,  4,  4,  4,  4,  4,
+     4,  4,  4,  4,  4,  4,  4,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     6,  6,  6,  4,  4,  4,  4,  6,  6,  4,  4,  0,  0,  5,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  5,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     4,  4,  4,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  4,  4,  4,  4,  4,  6,  4,  4,  4,
+     4,  4,  4,  4,  4,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  6,  6,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  4,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  6,  6,  6,  4,  4,  4,  4,  4,  4,  4,  4,  4,  6,
+     6,  0,  5,  5,  0,  0,  0,  0,  0,  4,  4,  4,  4,  0,  6,  4,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  6,  6,  6,  4,
+     4,  4,  6,  6,  4,  6,  4,  4,  0,  0,  0,  0,  0,  0,  4,  0,
+     6,  6,  6,  4,  4,  4,  4,  4,  4,  4,  4,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     4,  6,  6,  6,  6,  0,  0,  6,  6,  0,  0,  6,  6,  6,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  4,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  6,  6,  0,  0,  4,  4,  4,  4,  4,  4,  4,  0,  0,  0,
+     4,  4,  4,  4,  4,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  6,  6,  6,  4,  4,  4,  4,  4,  4,  4,  4,
+     6,  6,  4,  4,  4,  6,  4,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  4,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     4,  6,  6,  4,  4,  4,  4,  4,  4,  6,  4,  6,  6,  4,  6,  4,
+     4,  6,  4,  4,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  4,
+     6,  6,  4,  4,  4,  4,  0,  0,  6,  6,  6,  6,  4,  4,  6,  4,
+     4,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  4,  4,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     6,  6,  6,  4,  4,  4,  4,  4,  4,  4,  4,  6,  6,  4,  6,  4,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  4,  6,  4,  6,  6,
+     4,  4,  4,  4,  4,  4,  6,  4,  0,  0,  0,  0,  0,  0,  0,  0,
+     6,  6,  4,  4,  4,  4,  6,  4,  4,  4,  4,  4,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  6,  6,  6,  4,
+     4,  4,  4,  4,  4,  4,  4,  4,  6,  4,  4,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     4,  6,  6,  6,  6,  6,  0,  6,  6,  0,  0,  4,  4,  6,  4,  5,
+     6,  5,  6,  4,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  6,  6,  6,  4,  4,  4,  4,  0,  0,  4,  4,  6,  6,  6,  6,
+     4,  0,  0,  0,  6,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  4,  4,  4,  4,  4,  4,  6,  5,  4,  4,  4,  4,  0,
+     0,  0,  0,  0,  0,  0,  0,  4,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  4,  4,  4,  4,  4,  4,  6,  6,  4,  4,  4,  0,  0,  0,  0,
+     0,  0,  0,  0,  5,  5,  5,  5,  5,  5,  4,  4,  4,  4,  4,  4,
+     4,  4,  4,  4,  4,  4,  4,  6,  4,  4,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  6,
+     4,  4,  4,  4,  4,  4,  4,  0,  4,  4,  4,  4,  4,  4,  6,  4,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
+     4,  4,  4,  4,  4,  4,  4,  4,  0,  6,  4,  4,  4,  4,  4,  4,
+     4,  6,  4,  4,  6,  4,  4,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  4,  4,  4,  4,  4,  4,  0,  0,  0,  4,  0,  4,  4,  0,  4,
+     4,  4,  4,  4,  4,  4,  5,  4,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  6,  6,  6,  6,  6,  0,
+     4,  4,  0,  6,  6,  4,  6,  4,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  4,  4,  6,  6,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     4,  4,  4,  4,  4,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     4,  4,  4,  4,  4,  4,  4,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  4,
+     0,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,
+     6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,
+     6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,
+     6,  6,  6,  6,  6,  6,  6,  6,  0,  0,  0,  0,  0,  0,  0,  4,
+     4,  4,  4,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  4,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     6,  6,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  4,  4,  0,
+     1,  1,  1,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  4,  6,  4,  4,  4,  0,  0,  0,  6,  4,  4,
+     4,  4,  4,  1,  1,  1,  1,  1,  1,  1,  1,  4,  4,  4,  4,  4,
+     4,  4,  4,  0,  0,  4,  4,  4,  4,  4,  4,  4,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  4,  4,  4,  4,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  4,  4,  4,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
+     4,  4,  4,  4,  4,  4,  4,  0,  0,  0,  0,  4,  4,  4,  4,  4,
+     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  0,  0,  0,
+     0,  0,  0,  0,  0,  4,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  4,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  4,  4,  4,  4,  4,
+     0,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     4,  4,  4,  4,  4,  4,  4,  0,  4,  4,  4,  4,  4,  4,  4,  4,
+     4,  4,  4,  4,  4,  4,  4,  4,  4,  0,  0,  4,  4,  4,  4,  4,
+     4,  4,  0,  4,  4,  0,  4,  4,  4,  4,  4,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  4,  4,  4,  4,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  4,  4,  4,  4,  4,  4,  4,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  4,  4,  4,  4,  4,
+     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1
+};
+
+RE_UINT32 re_get_grapheme_cluster_break(RE_UINT32 codepoint) {
+    RE_UINT32 field_2;
+    RE_UINT32 field_1;
+    RE_UINT32 field_0;
+    RE_UINT32 v;
+
+    field_2 = codepoint >> 10;
+    field_1 = (codepoint >> 5) & 0x1F;
+    field_0 = codepoint & 0x1F;
+
+    v = re_grapheme_cluster_break_table_1[field_2];
+    v = re_grapheme_cluster_break_table_2[(v << 5) | field_1];
+    v = re_grapheme_cluster_break_table_3[(v << 5) | field_0];
+
+    return v;
+}
+
+/* Grapheme_Extend. */
+static RE_UINT8 re_grapheme_extend_table_1[] = {
+     0,  1,  2,  3,  4,  5,  6,  7,  8,  9,  9, 10, 11,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9, 12, 13,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9, 14, 15,
+    16,  9, 17, 18, 19, 20, 21, 22,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9, 23, 24,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9, 25,
+     9,  9,  9,  9, 26,  9, 27,  9, 28,  9, 29,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+    30,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9
+};
+
+static RE_UINT8 re_grapheme_extend_table_2[] = {
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   1,   1,   1,   2,   0,   0,   0,   0,
+      0,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   4,   5,   6,   0,
+      7,   0,   8,   9,   0,   0,  10,  11,  12,  13,  14,   0,   0,  15,   0,  16,
+     17,  18,  19,   0,   0,   0,  20,  21,  22,  23,  24,  25,  26,  27,  28,  29,
+     30,  31,  32,  33,  30,  31,  34,  35,  26,  36,  37,  25,  38,  39,  40,   0,
+     41,  42,  43,  25,  26,  44,  45,  25,  46,  47,  28,  25,  26,   0,  48,   0,
+      0,  49,  50,   0,   0,  51,  52,   0,  53,  54,   0,  55,  56,  57,  58,   0,
+      0,  59,  60,  61,  62,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  63,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,  64,  64,  65,  65,   0,  66,  67,   0,
+     68,   0,   0,   0,  69,  70,   0,   0,   0,  71,   0,   0,   0,   0,   0,   0,
+     72,   0,  73,  74,   0,  13,  75,   0,  76,  77,  38,  78,  46,  79,   0,  80,
+      0,  81,   0,   0,   0,   0,  82,  83,   0,   0,   0,   0,   0,   0,   1,  84,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     85,   0,   0,   0,   0,   0,  13,  86,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,  87,   0,   0,   0,  88,   0,   0,   0,   1,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,  89,   0,   0,  90,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,  91,  42,   0,   0,  92,   0,   0,   0,   0,   0,   0,   0,   0,
+     93,  94,   0,   0,   0,   0,  95,  96,   0,  97,  98,   0,  22,  99,   0, 100,
+      0, 101, 102,  31,   0, 103,  26, 104,   0,   0,   0,   0,   0,   0,   0, 105,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,  39,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      2,   2,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  42,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 106,
+      0,   0,   0,   0,   0,   0,   0,  75,   0,   0,   0, 107,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    108, 109,   0,   0,   0,   0,   0,  69,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0, 110,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0, 111,   0,   0,   0,   0,  15,   0,   0,   0,   0,   0,
+     26, 112, 113,  88,  46, 114,   0,   0,  22, 115,   0, 116,  46, 117, 118,   0,
+      0, 119,   0,   0,   0,   0,  88, 120,  46,  47, 121, 122,   0,   0,   0,   0,
+      0, 112, 123,   0,   0, 124, 125,   0,   0,   0,   0,   0,   0, 126, 127,   0,
+      0, 128,  75,   0,   0, 129,   0,   0,  63, 130,   0,   0,   0,   0,   0,   0,
+      0, 131,   0,   0,   0,   0,   0,   0,   0, 132, 133,   0,   0,   0, 134,  75,
+    135, 136, 137,   0, 138,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0, 139,   0,   0, 140, 141,   0,   0,   0, 142, 143,   0, 144,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0, 145,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0, 146,   0, 147,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 148,   0, 149,   0,   0, 150,
+      0,   0,   0,   0, 151,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 152, 153, 154,   0,   0,
+      0,   0, 155,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      1, 156,   1, 157, 158, 159,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    160, 161,   0,   0,   0,   0,   0,   0,   0, 147,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0, 162,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0, 147,   0,   0,   0, 163,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   1,   1,   1,   0,   0,   0,   0,   1,   1,   1,   1,   1,   1,   1,   2,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0
+};
+
+static RE_UINT8 re_grapheme_extend_table_3[] = {
+      0,   0,   0,   0, 255, 255, 255, 255, 255, 255,   0,   0, 248,   3,   0,   0,
+      0,   0, 254, 255, 255, 255, 255, 191, 182,   0,   0,   0,   0,   0, 255,   7,
+      0, 248, 255, 255,   0,   0,   1,   0,   0,   0, 192, 159, 159,  61,   0,   0,
+      0,   0,   2,   0,   0,   0, 255, 255, 255,   7,   0,   0, 192, 255,   1,   0,
+      0, 248,  15,  32,   0,   0, 192, 251, 239,  62,   0,   0,   0,   0,   0,  14,
+      0,   0, 248, 255, 251, 255, 255, 255,   7,   0,   0,   0,   0,   0,   0,  20,
+    254,  33, 254,   0,  12,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,  80,
+     30,  32, 128,   0,  12,   0,   0,  64,   6,   0,   0,   0,   0,   0,   0,  16,
+    134,  57,   2,   0,   0,   0,  35,   0, 190,  33,   0,   0,  12,   0,   0, 252,
+      0,   0,   0, 208,  30,  32, 224,   0,   4,   0,   0,   0,   0,   0,   0,  64,
+      1,  32, 128,   0,  17,   0,   0,   0,   0,   0,   0, 192, 193,  61,  96,   0,
+      0,   0,   0, 144,  68,  48,  96,   0,   3,   0,   0,   0,   0,   0,   0,  88,
+      0, 132,  92, 128,   0,   0, 242,   7, 128, 127,   0,   0,   0,   0, 242,  31,
+      0,  63,   0,   0,   0,   0,   0,   3,   0,   0, 160,   2,   0,   0, 254, 127,
+    223, 224, 255, 254, 255, 255, 255,  31,  64,   0,   0,   0,   0, 224, 253, 102,
+      0,   0,   0, 195,   1,   0,  30,   0, 100,  32,   0,  32,   0,   0,   0, 224,
+      0,   0,  28,   0,   0,   0,  12,   0,   0,   0, 176,  63,  64, 254,  15,  32,
+      0,  56,   0,   0,  96,   0,   0,   0,   0,   2,   0,   0, 135,   1,   4,  14,
+      0,   0, 128,   9,   0,   0,  64, 127, 229,  31, 248, 159,   1,   0,   0,   0,
+     15,   0,   0,   0,   0,   0, 240,  23,   0, 248,  15,   0,  60,  59,   0,   0,
+     64, 163,   3,   0,   0, 240, 207,   0,   0,   0, 247, 255, 253,  33,  16,   3,
+    255, 255, 255, 251,   0,  16,   0,   0, 255, 255,   1,   0,   0, 128,   3,   0,
+      0,   0,   0, 128,   0, 252,   0,   0,   0,   0,   0,   6,   0, 128, 247,  63,
+      0,   0,   3,   0,  68,   8,   0,   0,  96,  16,   0,   0,  48,   0,   0,   0,
+    255, 255,   3, 128, 192,  63,   0,   0, 128, 255,   3,   0,   0,   0, 200,  51,
+     32,   0,   0,   0,   0, 126, 102,   0,   8,  16,   0,   0,   0,   0, 157, 193,
+      0,  48,  64,   0,  32,  33,   0,   0,   0,   0,   0,  32,   0,   0, 192,   7,
+    110, 240,   0,   0,   0,   0,   0, 135, 240,   0,   0,   0,   0,  24,   0,   0,
+      0,   0,   0, 255, 127,   0,   0,   0,   0,   0, 120,   6, 128, 239,  31,   0,
+      0,   0,   8,   0,   0,   0, 192, 127,   0, 158,   0,   0,   0, 128, 211,  64,
+    248,   7,   0,   0,   1,   0, 128,   0, 192,  31,  31,   0,  92,   0,   0,  64,
+      0,   0, 249, 165,  13,   0,   0,   0,   0, 128,  60, 176,   1,   0,   0,  48,
+      0,   0, 248, 167,   0,  40, 191,   0, 188,  15,   0,   0,   0, 128, 255,   6,
+      0,   0,   1,  88,   8,   0,   0,   0,   0,   0, 240,  12, 254,   7,   0,   0,
+      0,   0, 248, 121, 128,   0, 126,  14,   0, 252, 127,   3,   0,   0, 127, 191,
+      0,   0, 252, 255, 255, 252, 109,   0,   0,   0, 126, 180, 191,   0,   0,   0,
+      0,   0, 163,   0,   0,   0,  24,   0,   0,   0,  31,   0,   0,   0, 127,   0,
+      0, 128,   0,   0,   0, 128,   7,   0,  16,   0,   0,   0,   0,   0,   0,  96,
+    160, 195,   7, 248, 231,  15,   0,   0,   0,  60,   0,   0,  28,   0,   0,   0,
+    255, 255, 127, 248, 255,  31,  32,   0,  16,   0,   0, 248, 254, 255,   0,   0,
+    127, 255, 255, 249, 219,   7,   0,   0,   0, 240,   0,   0, 240,   7,   0,   0
+};
+
+RE_UINT32 re_get_grapheme_extend(RE_UINT32 codepoint) {
+    RE_UINT32 field_2;
+    RE_UINT32 field_1;
+    RE_UINT32 field_0;
+    RE_UINT32 offset;
+    RE_UINT32 v;
+
+    field_2 = codepoint >> 10;
+    field_1 = (codepoint >> 5) & 0x1F;
+    field_0 = (codepoint >> 3) & 0x3;
+    offset = codepoint & 0x7;
+
+    v = re_grapheme_extend_table_1[field_2];
+    v = re_grapheme_extend_table_2[(v << 5) | field_1];
+    v = re_grapheme_extend_table_3[(v << 2) | field_0];
+
+    return (v >> offset) & 0x1;
+}
+
+/* Grapheme_Link. */
+static RE_UINT8 re_grapheme_link_table_1[] = {
+     0,  0,  1,  2,  3,  4,  5,  0,  0,  0,  0,  6,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  7,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  8,  0,  9, 10, 11, 12,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0
+};
+
+static RE_UINT8 re_grapheme_link_table_2[] = {
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  0,  0,  0,  1,  0,
+     0,  0,  1,  0,  0,  0,  1,  0,  0,  0,  1,  0,  0,  0,  1,  0,
+     0,  0,  1,  0,  0,  0,  1,  0,  0,  2,  1,  0,  0,  0,  3,  0,
+     0,  4,  0,  0,  0,  4,  0,  0,  0,  0,  0,  0,  5,  0,  0,  0,
+     0,  6,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  7,  7,  0,  0,  0,  0,  8,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  9,  0,  0,  0,  0,  0,  0,  5,  0,  0, 10,  0, 11,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 12,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    13, 14,  0,  0,  0,  0,  5,  0,  0,  0, 15,  0,  0,  0,  9,  0,
+     0,  0,  0,  0,  0,  0,  0, 16,  0,  0,  0,  0,  0,  0,  0,  1,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0, 12,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0, 13, 12,  0, 17,  0,  0,  0, 18,  0,  0,  0,  0,  9,  0,
+     0, 19,  0,  0,  0,  0,  0,  3,  0,  0,  1,  0,  0,  0,  0,  0,
+     0,  0, 20,  0,  0,  0, 20,  0,  0,  0,  0,  0,  0, 12,  0,  0,
+     0, 12,  0,  0,  0, 16,  0,  0,  0, 21,  0,  0,  0,  0,  0,  0,
+     0, 17,  0,  0,  0,  0,  0,  0,  0, 22,  0,  0,  0,  0,  0,  9,
+     0,  7, 23,  0, 17,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0, 12,  0,  0,  0,  0,  0,  0,  0,  0, 24,  0, 25,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0
+};
+
+static RE_UINT8 re_grapheme_link_table_3[] = {
+      0,   0,   0,   0,   0,  32,   0,   0,   0,   0,   0,  24,   0,   4,   0,   0,
+      0,   0,   0,   4,  16,   0,   0,   0,   0,   0,   0,   6,   0,   0,  16,   0,
+      0,   0,   4,   0,   1,   0,   0,   0,   0,  12,   0,   0,   0,   0,  12,   0,
+      0,   0,   0, 128,  64,   0,   0,   0,   0,  16,   0,   0,   0,   0,   8,   0,
+      0,   0,  64,   0,   0,   0,   0,   2,   0,   0,  24,   0,   0,   0,  32,   0,
+      4,   0,   0,   0,   0,   8,   0,   0,   0,   0,   0,  96, 128,   0,   0,   0,
+     48,   0,   0,   0,   0,   0, 128,   0
+};
+
+RE_UINT32 re_get_grapheme_link(RE_UINT32 codepoint) {
+    RE_UINT32 field_2;
+    RE_UINT32 field_1;
+    RE_UINT32 field_0;
+    RE_UINT32 offset;
+    RE_UINT32 v;
+
+    field_2 = codepoint >> 10;
+    field_1 = (codepoint >> 5) & 0x1F;
+    field_0 = (codepoint >> 3) & 0x3;
+    offset = codepoint & 0x7;
+
+    v = re_grapheme_link_table_1[field_2];
+    v = re_grapheme_link_table_2[(v << 5) | field_1];
+    v = re_grapheme_link_table_3[(v << 2) | field_0];
+
+    return (v >> offset) & 0x1;
+}
+
+/* Hangul_Syllable_Type. */
+static RE_UINT8 re_hangul_syllable_type_table_1[] = {
+     0,  0,  0,  0,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  2,  3,  4,  5,  6,  7,
+     8,  9,  3,  4,  5, 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0
+};
+
+static RE_UINT8 re_hangul_syllable_type_table_2[] = {
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  1,  1,  1,  2,  2,  3,  4,  4,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  5,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     6,  7,  8,  9, 10, 11, 12,  6,  7,  8,  9, 10, 11, 12,  6,  7,
+     8,  9, 10, 11, 12,  6,  7,  8,  9, 10, 11, 12,  6,  7,  8,  9,
+    10, 11, 12,  6,  7,  8,  9, 10, 11, 12,  6,  7,  8,  9, 10, 11,
+    12,  6,  7,  8,  9, 10, 11, 12,  6,  7,  8,  9, 10, 11, 12,  6,
+     7,  8,  9, 10, 11, 12,  6,  7,  8,  9, 10, 11, 12,  6,  7,  8,
+     9, 10, 11, 12,  6,  7,  8,  9, 10, 11, 12,  6,  7,  8,  9, 10,
+    11, 12,  6,  7,  8,  9, 10, 11, 12,  6,  7,  8,  9, 10, 11, 12,
+     6,  7,  8,  9, 10, 11, 12,  6,  7,  8,  9, 10, 11, 12,  6,  7,
+     8,  9, 10, 11, 12,  6,  7,  8,  9, 10, 11, 12,  6,  7,  8,  9,
+    10, 11, 12,  6,  7,  8,  9, 10, 11, 12,  6,  7,  8,  9, 10, 11,
+    12,  6,  7,  8,  9, 10, 11, 12,  6,  7,  8,  9, 10, 11, 12,  6,
+     7,  8,  9, 10, 11, 12,  6,  7,  8,  9, 10, 11, 12,  6,  7,  8,
+     9, 10, 11, 12,  6,  7,  8,  9, 10, 11, 12,  6,  7,  8,  9, 10,
+    11, 12,  6,  7,  8,  9, 10, 11, 12,  6,  7,  8,  9, 10, 11, 12,
+    11, 12,  6,  7,  8,  9, 10, 11, 12,  6,  7,  8,  9, 10, 11, 12,
+     6,  7,  8,  9, 10, 11, 12,  6,  7,  8,  9, 10, 11, 13, 14, 15
+};
+
+static RE_UINT8 re_hangul_syllable_type_table_3[] = {
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3,
+    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0,
+    4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+    5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 4, 5, 5, 5,
+    5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+    5, 5, 5, 5, 5, 5, 5, 5, 4, 5, 5, 5, 5, 5, 5, 5,
+    5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+    5, 5, 5, 5, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+    5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+    4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+    5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 4, 5, 5, 5,
+    5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+    5, 5, 5, 5, 5, 5, 5, 5, 4, 5, 5, 5, 5, 5, 5, 5,
+    5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+    5, 5, 5, 5, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+    5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+    5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 3, 3, 3, 3, 3,
+    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0
+};
+
+RE_UINT32 re_get_hangul_syllable_type(RE_UINT32 codepoint) {
+    RE_UINT32 field_2;
+    RE_UINT32 field_1;
+    RE_UINT32 field_0;
+    RE_UINT32 v;
+
+    field_2 = codepoint >> 10;
+    field_1 = (codepoint >> 5) & 0x1F;
+    field_0 = codepoint & 0x1F;
+
+    v = re_hangul_syllable_type_table_1[field_2];
+    v = re_hangul_syllable_type_table_2[(v << 5) | field_1];
+    v = re_hangul_syllable_type_table_3[(v << 5) | field_0];
+
+    return v;
+}
+
+/* Hex_Digit. */
+RE_UINT32 re_get_hex_digit(RE_UINT32 codepoint) {
+    if (0x30 <= codepoint && codepoint <= 0x39)
+        return 1;
+    if (0x41 <= codepoint && codepoint <= 0x46)
+        return 1;
+    if (0x61 <= codepoint && codepoint <= 0x66)
+        return 1;
+    if (0xFF10 <= codepoint && codepoint <= 0xFF19)
+        return 1;
+    if (0xFF21 <= codepoint && codepoint <= 0xFF26)
+        return 1;
+    if (0xFF41 <= codepoint && codepoint <= 0xFF46)
+        return 1;
+
+    return 0;
+}
+
+/* Hyphen. */
+static RE_UINT8 re_hyphen_table_1[] = {
+    0, 1, 2, 2, 2, 2, 3, 2, 4, 2, 2, 5, 6, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 7,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2
+};
+
+static RE_UINT8 re_hyphen_table_2[] = {
+    0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 7, 0, 0, 0, 0, 1, 0, 0, 8, 0, 0, 0, 0
+};
+
+static RE_UINT8 re_hyphen_table_3[] = {
+      0,   0,   0,   0,   0,  32,   0,   0,   0,   4,   0,   0,  64,   0,   0,   0,
+      0,   0,   3,   0,   0,   0, 128,   0,   0,   0,   0,   8,   8,   0,   0,   0,
+     32,   0,   0,   0
+};
+
+RE_UINT32 re_get_hyphen(RE_UINT32 codepoint) {
+    RE_UINT32 field_2;
+    RE_UINT32 field_1;
+    RE_UINT32 field_0;
+    RE_UINT32 offset;
+    RE_UINT32 v;
+
+    field_2 = codepoint >> 10;
+    field_1 = (codepoint >> 5) & 0x1F;
+    field_0 = (codepoint >> 3) & 0x3;
+    offset = codepoint & 0x7;
+
+    v = re_hyphen_table_1[field_2];
+    v = re_hyphen_table_2[(v << 5) | field_1];
+    v = re_hyphen_table_3[(v << 2) | field_0];
+
+    return (v >> offset) & 0x1;
+}
+
+/* ID_Continue. */
+static RE_UINT8 re_id_continue_table_1[] = {
+     0,  1,  2,  3,  4,  5,  6,  7,  8,  9,  9, 10, 11, 12, 12, 12,
+    12, 12, 12, 13, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+    12, 12, 12, 12, 12, 12, 12, 14, 12, 15, 16, 12, 12, 12, 12, 12,
+    12, 12, 12, 12, 12, 17,  9,  9,  9,  9,  9,  9,  9,  9, 18, 19,
+    20, 21, 22, 23, 24, 25, 26, 27, 28, 29,  9,  9, 12, 30,  9,  9,
+     9, 31,  9,  9,  9,  9,  9,  9,  9,  9, 32, 33, 12, 12, 12, 12,
+    12, 34, 12, 35,  9,  9,  9,  9,  9,  9,  9,  9, 36,  9,  9, 37,
+     9,  9,  9,  9, 38, 39, 40,  9, 41,  9, 42, 43,  9,  9, 44,  9,
+    12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+    12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+    12, 12, 12, 12, 12, 12, 12, 12, 12, 45, 12, 12, 12, 46, 47, 12,
+    12, 12, 12, 48, 12, 12, 12, 12, 12, 12, 49,  9,  9,  9, 50,  9,
+    12, 12, 12, 12, 51,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+    52,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9
+};
+
+static RE_UINT16 re_id_continue_table_2[] = {
+      0,   1,   2,   3,   0,   4,   5,   5,   6,   6,   6,   6,   6,   6,   6,   6,
+      6,   6,   6,   6,   6,   6,   7,   8,   6,   6,   6,   9,  10,  11,   6,  12,
+      6,   6,   6,   6,  13,   6,   6,   6,   6,  14,  15,   6,  16,  17,  18,  19,
+     20,   6,   6,  21,   6,   6,  22,  23,  24,   6,  25,   6,   6,  26,   6,  27,
+      6,  28,  29,  30,   0,  31,  32,  11,   6,   6,   6,  33,  34,  35,  36,  37,
+     38,  39,  40,  41,  42,  43,  44,  45,  46,  43,  47,  48,  49,  50,  51,  52,
+     53,  54,  55,  56,  57,  58,  59,  60,  53,   6,  61,  62,  63,  64,  65,  66,
+     67,  68,  69,   0,  70,  71,  72,   0,  73,  74,  75,  76,  77,  78,  79,   0,
+      6,   6,  80,   6,  81,   6,  82,  83,   6,   6,   6,   6,   6,   6,   6,   6,
+      6,   6,  84,   6,  85,  86,  87,   6,  88,   6,  89,  90,  91,   6,   6,  92,
+     67,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,
+      6,   6,   6,  93,   3,   6,   6,  94,  95,  96,  97,  98,   6,   6,  99, 100,
+    101,   6,   6, 102,   6, 103,   6, 104, 105, 106, 107, 108,   6, 109, 110,   0,
+     29,   6, 105, 111, 112, 113, 114,   0,   6,   6, 115, 116,   6,   6,   6,  97,
+      6, 117, 118,  81, 119,  89, 120,  68,   6,   6,   6,   6,   6,   6,   6, 121,
+      6,   6,   6,   6,   6,   6,   6,   6,  92,   6, 122,  81,   6, 123, 124, 125,
+      0, 126, 127, 128, 129,   0, 129, 130, 131, 132, 133,   6, 134,   0,   0,   0,
       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,  36,  36,  36,  36,  36,  36,  36,  41,  44, 209,   0,   0,
-     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  44, 191, 122,   0,
-     36, 122,   0,   0,   7,   7, 111,   0,  62,  36,  36,  36,  36,  36,   0,  82,
-     36,  36,  36,  36,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     11,  11,  11,  11,  11,  11,  11,  11,  15,  15,  15,  15,  15,  15,  15,  15,
-      0,   0,   0,   0,   0,   0, 122,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      6, 135, 105,   6,   6,   6,   6, 136,   6,  82,   6, 137, 138, 139, 139,   6,
       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,
-     36,  36,  61,  93,  88,  44,  44,  44,  44,  44,  44,  44,  44,  44,  44,  44,
-     44,  44,   0,  93, 117,  36,  36,  36,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,  99,   0,   0,   0,   0,   0,   0,   0,
-     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,
-     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,   0,   0,
-     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,
-     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  61,   0,   0,   0,
-     36,  36,  36,  36,  36,  36,  36,  61,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,  61,   0,   0,   0,   0,  36,   0,   0,  36,  36,  36,  36,
-     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,
-     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,   0,
-     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,
-     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  61,   0,  36,  36,  36, 104,
-     36,  36, 104,   0,  36,  36,  41, 220,  63,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,  58,  89,  58, 221,  63, 222,  44,
-     66,  58,  44,   0,   0,   0,   0,   0,   0,   0, 106,  89,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-    106, 116,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     11,  11,  11,  11,  11,  11, 159,  15,  15,  15,  15,  15,  15,  11,  11,  11,
-     11,  11,  11, 159,  15, 139,  15,  15,  15,  15,  11,  11,  11,  11,  11,  11,
-    159,  15,  15,  15,  15,  15,  15,  49,  48, 223,  10,  49,  11, 159, 170,  14,
-     15,  14,  15,  15,  11,  11,  11,  11,  11,  11, 159,  15,  15,  15,  15,  15,
-     15,  50,  22,  10,  11,  49,  11, 224,  15,  15,  15,  15,  15,  15,  50,  22,
-     11, 160, 166,  11, 224,  15,  15,  15,  15,  15,  15,  11,  11,  11,  11,  11,
-     11, 159,  15,  15,  15,  15,  15,  15,  11,  11,  11,  11,  11,  11, 159,  15,
-     15,  15,  15,  15,  15,  11,  11,  11,  11,  11,  11, 159,  15,  15,  15,  15,
-     15,  15,  11,  11,  11,  11,  11,  11, 159,  15,  15,  15,  15,  15,  15,  11,
-     11,  11,  11,  11,  11, 159,  15,  15,  15,  15,  15,  15,  11,  11,  11,  11,
-     11,  11, 159,  15,  15,  15,  15,  15,  15,  39,  11,  11,  11,  11,  11,  11,
-    224,  15,  15,  15,  15,  15,  24,  15,  33,  11,  11,  11,  11,  11,  22,  15,
-     15,  15,  15,  15,  15, 139,  15,  11,  11,  11,  11,  11,  11, 224,  15,  15,
-     15,  15,  15,  24,  15,  33,  11,  11,  11,  11,  11,  22,  15,  15,  15,  15,
-     15,  15, 139,  15,  11,  11,  11,  11,  11,  11, 224,  15,  15,  15,  15,  15,
-     24,  15,  27, 100,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
-     44,  44,  44,  44,  44,  44,  44,  44,  44,  44,  44,  44,  44,  66,  93,  44,
-     44,  44,  44,  44,  44,  44,  44,  44,  44,  44,  44, 116,   0,  86,   0,   0,
-      0, 116, 122,   0,   0,   0,  93,  44,  58,  44,  44,  44,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     44,  66,  44,  44,  44,  44,  97,  44,  59,  75,  66,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36, 104,  44, 117,  36,  41,
-      7,   7, 111, 108,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  44,   7,   7, 111,   0,
-     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,
-     36, 104,   0,   0,  44,  66,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     11,  11,  11,  11,  11,  11,  11,  11, 159,  15,  15,  15,  15,  15,  15,  15,
-     15,  44, 117,   0,   7,   7, 111,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     36,  82,  36,  36,  36,  36,  36,  36, 102,  78,  82,  36,  61,  36, 112,   0,
-    108,  62, 112,  82, 102,  78, 112, 112, 102,  78,  61,  36,  61,  36,  82,  43,
-     36,  36,  99,  36,  36,  36,  36,   0,  82,  82,  99,  36,  36,  36,  36,   0,
+    140, 141,  67,   6, 142,  67,   6,  83, 143,  14,   6,   6, 144,   6,   0,  24,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,
+      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,
+      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   0,   0,
+      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,
+      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,
+      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,  78,
+      6,   6,   6,   6, 145,   0,  24,  81,   6,   6,   6,   6,   6,   6,   6,   6,
+    146, 147,   6, 148,   6,   6,   6,  26, 149, 150,   6,   6, 151,   6, 152, 153,
+      6, 154,   6,  97,   6,   6, 155, 156,   6, 157,  97,  78,   6,   6, 158, 105,
+      6, 138, 159, 160,   6,   6, 161, 162, 163, 164,  83,  80,   6,   6,   6, 165,
+      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,
+      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6, 166, 167,  29,
+      0,   0,   0,   0,   0,   0,   0,   0,   6,   6,   6,   6,   6,   6,   6,   6,
+      6,   6,   6, 157,   6,   6, 168,   0, 169, 170, 171,   6,   6,  26, 172,   6,
+      6,   6,   6,   6,   6,   6,   6,   6,   6,  81,  24,   6, 173,   6, 174, 175,
+     91, 176, 177, 178,   6,   6,   6,  78,   1,   2,   3, 107,   6, 105, 179,   0,
+    180, 181, 182,   0,   6,   6,   6,  68,   0,   0,   6,  96,   0,   0,   0, 183,
+      0,   0,   0,   0,  78,   6, 184, 114,   6, 185, 103,  68,  81,   6, 186,   0,
+      6,   6,   6,   6,  81,  80, 187,  29,   6, 188,   6, 189,   0,   0,   0,   0,
+      6,   6,   6,   6,   6,   6,   6,   6,   6, 138, 104, 174,   0,   0,   0,   0,
+    190, 191, 104, 138, 105,   0,   0, 192, 104, 168,   0,   0,   6, 193,   0,   0,
+    194, 195,   0,  78,  78,   0,  75, 196,   6, 104, 104, 197,  26,   0,   0,   0,
+      6,   6, 134,   0,   6, 197,   6, 197,   6, 198,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   6, 199,   0,   0,  78, 200, 184,   0,   0,  24, 201, 138,
+      6,   6, 196, 202,   6,  68,  24, 203,   6,  31, 204, 205,   6,   6, 206,   0,
+    207, 208,   0,   0, 209, 119,   6, 210,  34, 211, 212, 213,   0,   0,   0,   0,
+      6,   6, 214, 215,   6,   6, 216,   0,   0,   0,   0,   0,   6, 217, 218,   0,
+      6,   6, 219,   0,   6, 102, 100,   0,  89, 115,   0,   0,   0,   0,   0,   0,
+      6,  68,   0,   0,   0,   6,   6, 220, 221, 222, 223,   0,   0, 224, 225, 226,
+      6, 105, 200,   6, 227,   0,   6, 102,   0,   0,   0,   0,   0,   0,   0,   0,
+    228,   5, 229, 230, 173, 231,   0,   0, 232, 233, 198, 234, 235, 100,   0,   0,
+      0,   0,   0,   0,   0,   0,   0, 138,   0,   0,   0,   0,   0, 236,   0,   0,
+      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,
+      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6, 168,   0,   0,   0,
+      6,   6,   6, 144,   6,   6,   6,   6,   6,   6, 189,   0,   0,   0,   0,   0,
       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  11,  11,  11,  11,
-     11,  11, 123,   0,  11,  11,  11,  11,  11,  11, 123,   0,  11,  11,  11,  11,
-     11,  11, 123,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      6, 144,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,
+      6,   6, 196,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,
+      6, 102, 105, 100,   0,   0,  24, 108,   6, 138, 223, 237,  91,   0,   0,   0,
       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 167, 127,   0,
-     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,
-     36,  36,  36,  36,  36,  61,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36, 104,   0,   0,
-     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,
-     36,  36,  36,  36,  36,  36,  36,  41,  36,  36,  36,  36,  36,  36,  36,  36,
-     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,
-     36,  36,  36,  36,  36,  36,  36,  36,  41,   0,   0,   0,  36,  36,  36,  36,
-     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,
-     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,
-     36,  36,  36,  36,  36,  36,  36,  36, 104,   0,   0,   0,   0,   0,   0,   0,
-     36,  36,  36,  36,  36,  36,  36,  41,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   6,   6,   0,   0,   0,   0,   6,   6, 238,   6, 239,   0,   0, 240,
+      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,
+      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6, 117,
+      6,   6,   6,   6,   6,   6, 104,   0, 134,   0,   0,   0,   0,   0,   0,   0,
       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     20,   0,   0,   0,   0,   0,   0,   0,  44,  44,  44,  44,  44,  44,  44,  44,
-     44,  44,  44,  44,  44,  44,  44,  44,  44,  44,  44,  44,  44,  44,  44,  44,
-     44,  44,  44,  44,  44,  44,  44,  44,  44,  44,  44,  44,  44,  44,  44,  44,
-     44,  44,  44,  44,  44,  44,  44,  44,  44,  44,  44,  44,  44,  44,  44,  44,
-     44,  44,  44,  44,  44,  44,  44,  44,  44,  44,  44,  44,  44,  44,  44,  44,
-     44,  44,  44,  44,  44,  44,  44,  44,  44,  44,  44,  44,   0,   0,   0,   0,
+      6,   6,   6,   6,   6,   6,   6,   6, 105,   0, 241, 204,   6,   6,   6,   6,
+      6,   6,   6,   6,   6,   6,   6,  29,   0,   0,   0,   0,   0,   0,   0,   0,
+      6,   6,   6, 242, 243,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 244, 245, 246,   0,   0,
+      0,   0, 247,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      6,   6,  31,   6, 248, 249, 250,   6, 251, 252, 253,   6,   6,   6,   6,   6,
+      6,   6,   6,   6,   6, 254, 255,  83,  31,  31, 135, 135, 228, 228, 256,   6,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      6, 257,   6, 258, 259, 260,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    261, 262,   0,   0,   0,   0,   0,   0,   6, 263, 264,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   6, 168,   0,   0,   0,   0,   0,   0,   0,   0,
+      6,   6,   6,   6,   6,   6, 265,   0,   6,   6, 115,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    250, 266, 267, 268, 269, 270,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,
+      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,
+      6,   6,   6,   6,   6,   6,  81,   0,   6,   6,   6,   6,   6,   6,   6,   6,
+      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,
+      6,   6,   6,   6,   6,   6,   6,   6,   6,  96,   6,   6,   6,   6,   6,   6,
+     81,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,
+      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,
+      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,
+      6,   6,   6,   6,   6, 271,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,
+      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,
+      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6, 114,
+      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,
+     81,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,
+      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,  30,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   6,   6,   6,   6,   6,   6,   6,  91,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0
+};
+
+static RE_UINT8 re_id_continue_table_3[] = {
+      0,   0,   0,   0,   0,   0, 255,   3, 254, 255, 255, 135, 254, 255, 255,   7,
+      0,   4, 160,   4, 255, 255, 127, 255, 255, 255, 255, 255, 195, 255,   3,   0,
+     31,  80,   0,   0, 255, 255, 223, 188, 192, 215, 255, 255, 251, 255, 255, 255,
+    255, 255, 191, 255, 251, 252, 255, 255, 255, 255, 254, 255, 255, 255, 127,   2,
+    255,   1, 254, 255, 255, 255, 255, 191, 182,   0, 255, 255, 255, 135,   7,   0,
+      0,   0, 255,   7, 255, 195, 255, 255, 255, 255, 239, 159, 255, 253, 255, 159,
+      0,   0, 255, 255, 255, 231, 255, 255, 255, 255,   3,   0, 255, 255,  63,  36,
+    255,  63,   0,   0, 255, 255, 255,  15, 255,   7,   0,   0, 255, 255, 223, 255,
+    255,   0, 248, 255, 207, 255, 254, 255, 239, 159, 249, 255, 255, 253, 197, 243,
+    159, 121, 128, 176, 207, 255,   3,  80, 238, 135, 249, 255, 255, 253, 109, 211,
+    135,  57,   2,  94, 192, 255,  63,   0, 238, 191, 251, 255, 255, 253, 237, 243,
+    191,  59,   1,   0, 207, 255,   0, 254, 238, 159, 249, 255, 159,  57, 224, 176,
+    207, 255,   2,   0, 236, 199,  61, 214,  24, 199, 255, 195, 199,  61, 129,   0,
+    192, 255,   0,   0, 255, 223, 253, 255, 255, 253, 255, 227, 223,  61,  96,   7,
+    207, 255,   0,   0, 239, 223, 253, 255, 255, 253, 239, 243, 223,  61,  96,  64,
+    207, 255,   6,   0, 223, 125, 240, 128, 207, 255,   0, 252, 238, 255, 127, 252,
+    255, 255, 251,  47, 127, 132,  95, 255, 192, 255,  12,   0, 254, 255, 255, 255,
+    255, 255, 255,   7, 255, 127, 255,   3, 214, 247, 255, 255, 175, 255, 255,  63,
+     95,  63, 255, 243,   1,   0,   0,   3, 255,   3, 160, 194, 255, 254, 255, 255,
+    255,  31, 254, 255, 223, 255, 255, 254, 255, 255, 255,  31,  64,   0,   0,   0,
+    255,   3, 255, 255, 255, 255, 255,  63, 191,  32, 255, 255, 255, 255, 255, 247,
+    255,  61, 127,  61, 255,  61, 255, 255, 255, 255,  61, 127,  61, 255, 127, 255,
+    255, 255,  61, 255, 255, 255, 255, 231,   0, 254,   3,   0, 255, 255,   0,   0,
+    255, 255,  63,  63, 255, 159, 255, 255, 255, 199, 255,   1, 255, 223,  31,   0,
+    255, 255,  31,   0, 255, 255,  15,   0, 255, 223,  13,   0, 255, 255, 143,  48,
+    255,   3,   0,   0,   0,  56, 255,   3, 255, 255, 255,   1, 255,   7, 255, 255,
+    255, 255,  63,   0, 255, 255, 255, 127, 255,  15, 255,  15, 192, 255, 255, 255,
+    255,  63,  31,   0, 255,  15, 255, 255, 255,   3, 255,   7, 255, 255, 255, 159,
+    255,   3, 255,   3, 128,   0, 255, 191,   1,   0,   0,   0, 255,  15, 255,   3,
+      0, 248,  15,   0, 255, 255, 255,   0, 255, 227, 255, 255, 255,   1, 255, 255,
+      0,   0, 247, 255, 255, 255, 255, 251,  63,  63, 255, 170, 255, 255, 223,  95,
+    220,  31, 207,  15, 255,  31, 220,  31,   0,   0,   0, 128,   1,   0,  16,   0,
+      0,   0,   2, 128,   0,   0, 255,  31, 226, 255,   1,   0, 132, 252,  47,  63,
+     80, 253, 255, 243, 224,  67,   0,   0, 255,   1,   0,   0, 255, 127, 255, 255,
+     31, 248,  15,   0, 255, 128,   0, 128, 255, 255, 127,   0, 127, 127, 127, 127,
+    224,   0,   0,   0, 254, 255,  62,  31, 255, 255, 127, 254, 224, 255, 255, 255,
+    255, 127,   0,   0, 255,  31,   0,   0, 255,  31, 255, 255, 255,  15,   0,   0,
+    255, 255, 240, 191,   0,   0, 128, 255, 252, 255, 255, 255, 255, 249, 255, 255,
+    252,   7,   0,   0,   0,   0, 224, 255, 255,  16,   0,   0,  63,   0, 255,   3,
+    255, 255, 255, 232, 255,  63, 255, 255,   1, 128, 255,   3, 255,  63, 255,   3,
+    255, 255, 127, 252,   7,   0,   0,  56, 255, 255, 124,   0, 126, 126, 126,   0,
+    127, 127, 255, 255, 255,  55, 255,   3,  15,   0, 255, 255, 127, 248, 255, 255,
+    255, 255, 255,   3, 127,   0, 248, 224, 255, 253, 127,  95, 219, 255, 255, 255,
+      0,   0, 248, 255, 255, 255, 252, 255, 255,   0,   0,   0,   0,   0, 255,  15,
+    255, 255,  24,   0,   0, 224,   0,   0,   0,   0, 223, 255, 252, 252, 252,  28,
+    255, 239, 255, 255, 127, 255, 255, 183, 255,  63, 255,  63,   0,   0,   0,  32,
+    255, 255,   1,   0,   0, 224, 255, 255,  15, 255,  62,   0, 255, 255,  15, 255,
+    255,   0, 255, 255,  15,   0,   0,   0,  63, 253, 255, 255, 255, 255, 191, 145,
+    255, 255,  55,   0, 255, 255, 255, 192, 111, 240, 239, 254, 255, 255,  63, 135,
+    127,   0,   0,   0, 255, 255,   7,   0, 255,   0, 255,   3, 255,  27,   3,   0,
+    128,   0, 255, 255,  31,   0,   0,   0, 192, 255,   0, 128, 255,   1, 255,   3,
+    240,   0, 255, 255, 255, 255,  79,   0,  31, 222, 255,  23, 255, 255, 251, 255,
+    255, 255, 255,  64, 127, 189, 255, 191, 255,   7, 255,   3, 255, 253, 237, 251,
+    159,  57, 129, 224, 207,  31,  31,   0, 255,   7, 255, 195,   3,   0,   0,   0,
+    191,   0, 255,   3, 255, 255,  63, 255,   1,   0,   0,  63,  17,   0, 255,   3,
+    255,   3,   0, 128, 127, 242, 111, 255, 255, 255, 191, 249,  15,   0, 255,   3,
+    255, 252, 255, 255, 255, 255, 255, 252,  27,   0,   0,   0, 255, 255, 255,  35,
+    255, 253, 255, 255,   1,   0, 255,   3,   0,   0, 252, 255, 255, 254, 127,   0,
+    127, 251, 255, 255, 255, 255, 127, 180, 191, 253, 255, 255, 255, 127, 251,   1,
+      0,   0,   1,   0, 248, 255, 255, 224, 255, 135, 255, 255, 255, 128, 255, 255,
+     27,   0,   3,   0,   0,   0,   7,   0, 255,   7, 255,  31, 255,   1, 255,  99,
+    224, 227,   7, 248, 231,  15,   0,   0,   0,  60,   0,   0,  28,   0,   0,   0,
+    255, 255, 255, 223, 100, 222, 255, 235, 239, 255, 255, 255, 191, 231, 223, 223,
+    255, 255, 255, 123,  95, 252, 253, 255,  63, 255, 255, 255, 253, 255, 255, 247,
+    247, 207, 255, 255, 255, 255, 127, 248, 255,  31,  32,   0,  16,   0,   0, 248,
+    254, 255,   0,   0, 127, 255, 255, 249, 219,   7,   0,   0, 255,  31, 255,  63,
+    255,  67,   0,   0,  31,   0, 127,   0, 150, 254, 247,  10, 132, 234, 150, 170,
+    150, 247, 247,  94, 255, 251, 255,  15, 238, 251, 255,  15,   3,   0, 255, 255
 };
 
-static RE_UINT8 re_sentence_break_stage_4[] = {
-     0,  0,  0,  0,  0,  6,  2,  6,  6,  1,  0,  0,  6, 12, 13,  0,
-     0,  0,  0, 13, 13, 13,  0,  0, 14, 14, 11,  0, 10, 10, 10, 10,
-    10, 10, 14,  0,  0,  0,  0, 12,  0,  8,  8,  8,  8,  8,  8,  8,
-     8,  8,  8, 13,  0, 13,  0,  0,  0,  7,  7,  7,  7,  7,  7,  7,
-     7,  7,  7, 13,  0,  4,  0,  0,  6,  0,  0,  0,  0,  0,  7, 13,
-     0,  5,  0,  0,  0,  7,  0,  0,  8,  8,  8,  0,  8,  8,  8,  7,
-     7,  7,  7,  0,  8,  7,  8,  7,  7,  8,  7,  8,  7,  7,  8,  7,
-     8,  8,  7,  8,  7,  8,  7,  7,  7,  8,  8,  7,  8,  7,  8,  8,
-     7,  8,  8,  8,  7,  7,  8,  8,  8,  7,  7,  7,  8,  7,  7,  9,
-     9,  9,  9,  9,  9,  7,  7,  7,  7,  9,  9,  9,  7,  7,  0,  0,
-     0,  0,  9,  9,  9,  9,  0,  0,  7,  0,  0,  0,  9,  0,  9,  0,
-     3,  3,  3,  3,  9,  0,  8,  7,  0,  0,  7,  7,  7,  7,  0,  8,
-     0,  0,  8,  0,  8,  0,  8,  8,  8,  8,  0,  8,  7,  7,  7,  8,
-     8,  7,  0,  8,  8,  7,  0,  3,  3,  3,  8,  7,  0,  9,  0,  0,
-     0, 14,  0,  0,  7, 12,  0,  0,  0,  3,  3,  3,  3,  3,  0,  3,
-     0,  3,  3,  0,  9,  9,  9,  0,  0,  0,  0,  9,  5,  5,  5,  5,
-     5,  5,  0,  0, 14, 14,  0,  0,  3,  3,  3,  0,  5,  0, 12, 12,
-     9,  9,  9,  3, 10, 10,  0, 10, 10,  0,  9,  9,  3,  9,  9,  9,
-    12,  9,  3,  3,  3,  5,  0,  3,  3,  9,  9,  3,  3,  0,  3,  3,
-     3,  3,  9,  9, 10, 10,  9,  9,  9,  0,  0,  9, 12, 12, 12,  0,
-     0,  0,  0,  5,  9,  3,  9,  9,  0,  9,  9,  9,  9,  9,  3,  3,
-     3,  9,  0,  0, 14, 12,  9,  0,  0,  3,  0,  0,  3,  3,  9,  3,
-     9,  3,  3,  3,  3,  3,  0,  0,  0, 12,  0,  0,  0, 12, 12,  0,
-     9,  0,  9,  9,  0,  0,  0,  3,  3,  3,  5,  3,  3,  9,  3,  3,
-    12, 12, 10, 10,  3,  0,  0,  3,  3,  3,  9,  0,  9,  9,  0,  9,
-     0,  0, 10, 10,  9,  0,  3,  0,  0,  9,  9,  0,  9,  3,  0,  0,
-     9,  0,  0,  0,  0,  9,  3,  3,  0,  0,  3,  3,  0,  0,  3,  9,
-     0,  0,  9,  0,  0,  0,  3,  0,  3,  0,  3,  0, 10, 10,  0,  0,
-     0,  9,  0,  9,  0,  3,  0,  3,  0,  3, 13, 13, 13, 13,  3,  3,
-     3,  0,  0,  0,  3,  3,  3,  9, 10, 10, 12, 12, 10, 10,  3,  3,
-     0,  8,  0,  0,  0,  0, 12,  0, 12,  0,  0,  0,  8,  8,  0,  0,
-     9,  0, 12,  9,  6,  9,  9,  9,  9,  9,  9, 13, 13,  0,  0,  0,
-     3, 12, 12,  0,  9,  0,  3,  3,  0,  0, 14, 12, 14, 12,  0,  3,
-     3,  3,  5,  0,  9,  3,  3,  9,  9,  3,  9,  0, 12, 12, 12, 12,
-     0,  0, 12, 12,  9,  9, 12, 12,  0,  8,  0,  8,  7,  0,  7,  7,
-     8,  0,  7,  0,  8,  0,  0,  0,  6,  6,  6,  6,  6,  6,  6,  5,
-     3,  3,  5,  5,  0,  0,  0, 14, 14,  0,  0,  0, 13, 13, 13, 13,
-    11,  0,  0,  0,  4,  4,  5,  5,  5,  5,  5,  6,  0, 13, 13,  0,
-    12, 12,  0,  0,  0, 13, 13, 12,  0,  0,  0,  6,  5,  0,  5,  5,
-     0, 13, 13,  7,  0,  0,  0,  8,  0,  0,  7,  8,  8,  8,  7,  7,
-     8,  0,  8,  0,  8,  8,  0,  7,  9,  7,  0,  0,  0,  8,  7,  7,
-     0,  0,  7,  0,  9,  9,  9,  8,  0,  0,  8,  8,  0,  0, 13, 13,
-     8,  7,  7,  8,  7,  8,  7,  3,  7,  7,  0,  7,  0,  0, 12,  9,
-     0,  0, 13,  0,  6, 14, 12,  0,  0, 13, 13, 13,  9,  9,  0, 12,
-     9,  0, 12, 12,  8,  7,  9,  3,  3,  3,  0,  9,  7,  7,  3,  3,
-     3,  3,  0, 12,  0,  0,  8,  7,  9,  0,  0,  8,  7,  8,  7,  9,
-     7,  7,  7,  9,  9,  9,  3,  9,  0,  9,  9,  3,  0, 12, 12, 12,
-     0,  0,  9,  3, 12, 12,  9,  9,  9,  3,  3,  0,  3,  3,  3, 12,
-     0,  0,  0,  7,  0,  9,  3,  9,  9,  9, 13, 13, 14, 14,  0, 14,
-     0, 14, 14,  0, 13,  0,  0, 13,  0, 14, 12, 12, 14, 13, 13, 13,
-    13, 13, 13,  0,  9,  0,  0,  5,  0, 13,  0, 13, 13, 12, 13, 13,
-    14,  0,  9,  9,  0,  5,  5,  5,  0,  5, 12, 12,  3,  0, 10, 10,
-     9, 12, 12,  0,  3, 12,  0,  0, 10, 10,  9,  0, 12, 12,  0, 12,
-    12,  0,  3,  0,  9, 12,  0,  0,  9,  9,  0,  3,  9,  9,  9, 12,
-     3,  0, 12, 12,  3,  9,  0,  9, 12,  9,  0,  0,  5,  0,  0,  0,
-     0,  3,  3, 12,  3,  3,  3,  5,  5,  5,  5,  3,  0,  8,  8,  0,
-     8,  0,  7,  7,
-};
+RE_UINT32 re_get_id_continue(RE_UINT32 codepoint) {
+    RE_UINT32 field_2;
+    RE_UINT32 field_1;
+    RE_UINT32 field_0;
+    RE_UINT32 offset;
+    RE_UINT32 v;
 
-/* Sentence_Break: 8564 bytes. */
-
-RE_UINT32 re_get_sentence_break(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-
-    f = ch >> 11;
-    code = ch ^ (f << 11);
-    pos = (RE_UINT32)re_sentence_break_stage_1[f] << 4;
-    f = code >> 7;
-    code ^= f << 7;
-    pos = (RE_UINT32)re_sentence_break_stage_2[pos + f] << 5;
-    f = code >> 2;
-    code ^= f << 2;
-    pos = (RE_UINT32)re_sentence_break_stage_3[pos + f] << 2;
-    value = re_sentence_break_stage_4[pos + code];
-
-    return value;
-}
+    field_2 = codepoint >> 10;
+    field_1 = (codepoint >> 5) & 0x1F;
+    field_0 = (codepoint >> 3) & 0x3;
+    offset = codepoint & 0x7;
 
-/* Math. */
+    v = re_id_continue_table_1[field_2];
+    v = re_id_continue_table_2[(v << 5) | field_1];
+    v = re_id_continue_table_3[(v << 2) | field_0];
 
-static RE_UINT8 re_math_stage_1[] = {
-    0, 1, 1, 2, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1,
-};
+    return (v >> offset) & 0x1;
+}
 
-static RE_UINT8 re_math_stage_2[] = {
-    0, 1, 2, 2, 2, 2, 2, 2, 3, 4, 5, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 6, 7,
-    2, 2, 2, 2, 2, 8, 2, 2, 2, 2, 2, 9, 2, 2, 2, 2,
+/* Ideographic. */
+static RE_UINT8 re_ideographic_table_1[] = {
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  2,  2,  2,
+     2,  2,  2,  3,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  4,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  5,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  6,  2,  2,  2,  2,
+     2,  7,  2,  8,  0,  0,  0,  0,  0,  0,  0,  0,  9,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2, 10,  2,  2,  2, 11, 12,  2,
+     2,  2,  2, 13,  2,  2,  2,  2,  2,  2, 14,  0,  0,  0, 15,  0,
+     2,  2,  2,  2, 16,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0
 };
 
-static RE_UINT8 re_math_stage_3[] = {
-     0,  1,  2,  3,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  5,
-     4,  4,  4,  4,  4,  4,  4,  4,  6,  4,  4,  4,  4,  4,  4,  4,
-     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
-     7,  8,  9, 10, 11, 12, 13, 14, 15, 15, 15, 15, 16, 17, 18, 19,
-     4,  4,  4,  4,  4,  4, 20, 21, 22, 23,  4,  4,  4,  4,  4, 15,
-     4,  4,  4,  4, 15, 15, 15, 15, 15, 15, 15, 15, 24, 25,  4,  4,
-     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4, 26,  4,  4,  4,
-     4,  4,  4,  4,  4,  4,  4,  4,  4, 27,  4,  4, 28, 29,  4, 30,
-    15, 31, 32, 33, 34, 35, 15, 15, 15, 15, 36, 15, 15, 15, 15, 37,
-     4,  4,  4,  4,  4,  4,  4,  4, 38, 39, 40, 41,  4,  4,  4,  4,
+static RE_UINT8 re_ideographic_table_2[] = {
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     1,  2,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  0,  0,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  4,
+     0,  0,  0,  0,  0,  0,  0,  0,  3,  3,  3,  3,  3,  3,  3,  3,
+     3,  3,  3,  5,  3,  3,  6,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  7,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  8,
+     3,  3,  3,  3,  3,  3,  9,  0, 10,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 11,  3,  3,  3,  3,
+     3,  3,  3,  3,  3,  3,  3, 12,  0,  0,  0,  0,  0,  0,  0,  0,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+     3,  3,  3,  3,  3,  3, 13,  0,  3,  3,  3,  3,  3,  3,  3,  3,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+     3,  3,  3,  3,  3,  3,  3,  3,  3, 14,  3,  3,  3,  3,  3,  3,
+    13,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+     3,  3,  3,  3,  3, 15,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3, 16,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+    13,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  3, 17,  0,  0,  0,  0,  0
 };
 
-static RE_UINT8 re_math_stage_4[] = {
-      0,   0,   0,   0,   0,   8,   0, 112,   0,   0,   0,  64,   0,   0,   0,  80,
-      0,   0,   0,   0,   0,  16,   2,   0,   0,   0, 128,   0,   0,   0, 128,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  39,   0,   0,   0, 115,   0,
-    192,   1,   0,   0,   0,   0,   0,   0,   0,   0,  64,   0,   0,   0,  28,   0,
-     17,   0,   4,   0,  30,   0,   0, 124,   0, 124,   0,   0,   0,   0,   0,   0,
-      0,   0, 255,  31,  98, 248,   0,   0, 132, 252,  47,  63,  16, 179, 251, 241,
-    255,  11,   0,   0,   0,   0,   0,   0,   0,   0, 255, 255, 255, 126, 195, 240,
-    255, 255, 255,  47,  48,   0, 240, 255, 255, 255, 255, 255, 255, 255, 255, 255,
-      0,  15,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  16,
-      0,   0,   0, 248, 255, 255, 191,   0,   0,   0,   1, 240,   7,   0,   0,   0,
-      0,   0,   0,   0,   3, 192, 255, 240, 195, 140,  15,   0, 148,  31,   0, 255,
-     96,   0,   0,   0,   0,   0,   0,   0,   5,   0,   0,   0,  15, 224,   0,   0,
-      0,   0,   0,   0,   0,   0, 255, 255, 159,  31,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0, 126,   1,   0,   0,
-      0,   8,   0, 112,   0,   0,   0,  80,   0,   0,   0,  80,   0,   0,   0,   0,
-      0,   0,   0,   0,   4,  30,   0,   0, 255, 255, 223, 255, 255, 255, 255, 255,
-    255, 255, 255, 223, 100, 222, 255, 235, 239, 255, 255, 255, 255, 255, 255, 255,
-    191, 231, 223, 223, 255, 255, 255, 123,  95, 252, 253, 255, 255, 255, 255, 255,
-    255, 255, 255, 255,  63, 255, 255, 255, 255, 207, 255, 255, 255, 255, 255, 255,
-    239, 255, 255, 255, 150, 254, 247,  10, 132, 234, 150, 170, 150, 247, 247,  94,
-    255, 251, 255,  15, 238, 251, 255,  15,   0,   0,   0,   0,   0,   0,   3,   0,
+static RE_UINT8 re_ideographic_table_3[] = {
+      0,   0,   0,   0, 192,   0,   0,   0, 254,   3,   0,   7, 255, 255, 255, 255,
+    255, 255, 255,  31, 255,  63, 255, 255, 255, 255, 255,   3,  16,   0,   0,   0,
+    255, 255, 255,   0, 255, 255,  63,   0, 255,   1,   0,   0,   0,   0, 255, 255,
+    255, 255, 255,  15, 255, 255, 255,  63, 255, 255,  31,   0,   3,   0, 255, 255,
+      1,   0,   0,   0, 255,   7,   0,   0
 };
 
-/* Math: 628 bytes. */
-
-RE_UINT32 re_get_math(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-
-    f = ch >> 14;
-    code = ch ^ (f << 14);
-    pos = (RE_UINT32)re_math_stage_1[f] << 4;
-    f = code >> 10;
-    code ^= f << 10;
-    pos = (RE_UINT32)re_math_stage_2[pos + f] << 4;
-    f = code >> 6;
-    code ^= f << 6;
-    pos = (RE_UINT32)re_math_stage_3[pos + f] << 6;
-    pos += code;
-    value = (re_math_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1;
-
-    return value;
+RE_UINT32 re_get_ideographic(RE_UINT32 codepoint) {
+    RE_UINT32 field_2;
+    RE_UINT32 field_1;
+    RE_UINT32 field_0;
+    RE_UINT32 offset;
+    RE_UINT32 v;
+
+    field_2 = codepoint >> 10;
+    field_1 = (codepoint >> 5) & 0x1F;
+    field_0 = (codepoint >> 3) & 0x3;
+    offset = codepoint & 0x7;
+
+    v = re_ideographic_table_1[field_2];
+    v = re_ideographic_table_2[(v << 5) | field_1];
+    v = re_ideographic_table_3[(v << 2) | field_0];
+
+    return (v >> offset) & 0x1;
 }
 
-/* Alphabetic. */
+/* IDS_Binary_Operator. */
+RE_UINT32 re_get_ids_binary_operator(RE_UINT32 codepoint) {
+    if (0x2FF0 <= codepoint && codepoint <= 0x2FF1)
+        return 1;
+    if (0x2FF4 <= codepoint && codepoint <= 0x2FFB)
+        return 1;
+
+    return 0;
+}
 
-static RE_UINT8 re_alphabetic_stage_1[] = {
-     0,  1,  2,  3,  4,  5,  5,  5,  5,  6,  7,  5,  5,  8,  9, 10,
-    11, 12, 13, 14, 15,  9, 16,  5, 17,  9,  9, 18,  9, 19, 20, 21,
-     5,  5,  5,  5,  5,  5,  5,  5,  5,  5, 22, 23, 24,  5, 25, 26,
+/* ID_Start. */
+static RE_UINT8 re_id_start_table_1[] = {
+     0,  1,  2,  3,  4,  5,  6,  7,  8,  9,  9, 10, 11, 12, 12, 12,
+    12, 12, 12, 13, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+    12, 12, 12, 12, 12, 12, 12, 14, 12, 15, 16, 12, 12, 12, 12, 12,
+    12, 12, 12, 12, 12, 17,  9,  9,  9,  9,  9,  9,  9,  9, 18, 19,
+    20, 21, 22, 23, 24, 25, 26, 27, 28, 29,  9,  9, 12, 30,  9,  9,
+     9, 31,  9,  9,  9,  9,  9,  9,  9,  9, 32, 33, 12, 12, 12, 12,
+    12, 34, 12, 35,  9,  9,  9,  9,  9,  9,  9,  9, 36,  9,  9, 37,
+     9,  9,  9,  9,  9, 38,  9,  9, 39,  9, 40, 41,  9,  9,  9,  9,
+    12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+    12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+    12, 12, 12, 12, 12, 12, 12, 12, 12, 42, 12, 12, 12, 43, 44, 12,
+    12, 12, 12, 45, 12, 12, 12, 12, 12, 12, 46,  9,  9,  9, 47,  9,
+    12, 12, 12, 12, 48,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
@@ -7455,3134 +12959,5435 @@ static RE_UINT8 re_alphabetic_stage_1[] = {
      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9
 };
 
-static RE_UINT8 re_alphabetic_stage_2[] = {
-      0,   1,   2,   3,   4,   5,   6,   7,   8,   9,  10,  11,  12,  13,  14,  15,
-     16,   1,  17,  18,  19,   1,  20,  21,  22,  23,  24,  25,  26,  27,   1,  28,
-     29,  30,  31,  31,  32,  31,  31,  31,  31,  31,  31,  31,  33,  34,  35,  31,
-     36,  37,  31,  31,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,  38,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,  39,
-      1,   1,   1,   1,  40,   1,  41,  42,  43,  44,  45,  46,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,  47,  31,  31,  31,  31,  31,  31,  31,  31,
-     31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,
-     31,  31,  31,  31,  31,  31,  31,  31,  31,   1,  48,  49,   1,  50,  51,  52,
-     53,  54,  55,  56,  57,  58,   1,  59,  60,  61,  62,  63,  64,  65,  31,  66,
-     67,  68,  69,  70,  71,  72,  73,  74,  75,  76,  77,  31,  78,  79,  80,  31,
-      1,   1,   1,  81,  82,  83,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,
-      1,   1,   1,   1,  84,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,
-     31,  31,  31,  31,   1,   1,  85,  31,  31,  31,  31,  31,  31,  31,  31,  31,
-     31,  31,  31,  31,  31,  31,  31,  31,   1,   1,  86,  87,  31,  31,  88,  89,
-      1,   1,   1,   1,   1,   1,   1,  90,   1,   1,  91,  31,  31,  31,  31,  31,
-      1,  92,  93,  31,  31,  31,  31,  31,  31,  31,  31,  31,  94,  31,  31,  31,
-     31,  31,  31,  31,  95,  96,  97,  98,  31,  31,  31,  31,  31,  31,  31,  31,
-     99, 100, 101,  31,  31,  31,  31,  31, 102, 103,  31,  31,  31,  31, 104,  31,
-     31, 105,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,
-      1,   1,   1,   1,   1,   1, 106,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1, 107, 108,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1, 109,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1, 110,  31,  31,  31,  31,
-     31,  31,  31,  31,  31,  31,  31,  31,   1,   1, 111,  31,  31,  31,  31,  31,
-};
-
-static RE_UINT8 re_alphabetic_stage_3[] = {
+static RE_UINT8 re_id_start_table_2[] = {
       0,   0,   1,   1,   0,   2,   3,   3,   4,   4,   4,   4,   4,   4,   4,   4,
-      4,   4,   4,   4,   4,   4,   5,   6,   0,   0,   7,   8,   9,  10,   4,  11,
-      4,   4,   4,   4,  12,   4,   4,   4,   4,  13,  14,   4,  15,  16,  17,  18,
-     19,   4,  20,  21,   4,   4,  22,  23,  24,   4,  25,   4,   4,  26,  27,  28,
-     29,  30,  31,  32,   0,  33,  34,  35,   4,  36,  37,  38,  39,  40,  41,  42,
-     43,  44,  45,  46,  47,  48,  49,  50,  51,  48,  52,  53,  54,  55,  56,   0,
-     57,  58,  59,  60,  57,  61,  62,  63,  57,  64,  65,  66,  67,  68,  69,  70,
-     71,  72,  73,   0,  74,  75,  76,   0,  77,   0,  78,  79,  80,  81,   0,   0,
-      4,  82,  24,   4,  83,   4,  84,  85,   4,   4,  86,   4,  87,  88,  89,   4,
-     90,   4,  72,   0,  91,   4,   4,  92,  71,   4,   4,   4,   4,   4,   4,   4,
-      4,   4,   4,  93,   1,   4,   4,  94,  95,  96,  96,  97,   4,  98,  99,   0,
-      0,   4,   4,  31,   4, 100,   4, 101, 102, 103,  24, 104,   4, 105, 106,   0,
-    107,   4, 102, 108,   0, 109,   0,   0,   4, 110, 111,   0,   4, 112,   4, 113,
-      4, 114, 115, 116, 117,  64,   0, 118,   4,   4,   4,   4,   4,   4,   0, 119,
-     92,   4, 120, 116,   4, 121, 122, 123,   0,   0,   0, 124, 125,   0,   0,   0,
-    126, 127, 128,   4,  15,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0, 129,   4, 106,   4, 130, 102,   4,   4,   4,   4, 131,
-      4,  84,   4, 132, 114, 133, 133,   4,   0, 134,   0,   0,   0,   0,   0,   0,
-    135, 136,  71,   4, 137,  71,   4,  85, 138,  13,   4,   4, 139,  72,   0,  24,
-      4,   4,   4,   4,   4, 101,   0,   0,   4,   4,   4,   4,   4,   4,   4,  91,
-      4,   4,   4,   4,  30,   0,  24, 116, 140, 141,   4, 142,   4,   4,   4,  91,
-    143, 144,   4,   4, 145,   4, 146, 143, 147, 148,   4,  96,   4,   4, 149, 150,
-     27, 100, 151,  81,   4, 152, 134, 153,   4, 114, 154, 155,   4, 102, 156, 157,
-    158, 159,  85, 160,   4,   4,   4,  32,   4,   4,   4,   4,   4, 161, 162, 107,
-      4,   4,   4, 163,   4,   4, 164,   0, 165, 166, 167,   4,   4,  26, 168,   4,
-      4, 116,  24,   4, 169,   4, 148, 170,   0,   0,   0, 171,   4,   4,   4,  81,
-      0,   1,   1, 172,   4, 102, 173,   0, 174, 175, 176,   0,   4,   4,   4,  72,
-      0,   0,   4, 177,   0,   0,   0,   0,   0,   0,   0,   0,  81,   4, 178,   0,
-      4,  25, 100,  72, 116,   4, 179,   0,   4,   4,   4,   4, 116,  24, 180, 107,
-      4, 160,   4,  60,   0,   0,   0,   0,   4, 114, 101, 148,   0,   0,   0,   0,
-    181, 182, 101, 114, 102,   0,   0, 183, 101, 164,   0,   0,   4, 184,   0,   0,
-    185, 101,   0,  81,  81,   0,  78, 186,   4, 101, 101, 151,  26,   0,   0,   0,
-      4,   4,  15,   0,   4, 151,   4, 151,   4, 148,   0,   0,   0,   0,   0,   0,
-     81, 187, 188,   0,   0,   0,   0, 114,   4,   4, 188,   0, 144,  31,  24,  15,
-      4, 151, 189, 190,   4,   4, 191,   0, 192, 193,   0,   0, 194, 117,   4,  15,
-     39,  48, 195,  60,   0,   0,   0,   0,   4,   4, 196,   0,   4,   4, 197,   0,
-      0,   0,   0,   0,   4, 198, 199,   0,   4, 102, 200,   0,   4, 201,   0,   0,
-     64,  32,   0,   0,   0,   0,   0,   0,   4,  31,   0,   0,   0,   4,   4, 202,
-      0,   0,   0,   0,   0, 203,  29, 204,   4, 205,  24,   4, 206,   0,   4,  31,
-    207, 208,  77, 209, 169, 210,   0,   0, 211, 212, 213, 214, 215,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0, 114,   4,   4,   4,   4, 164,   0,   0,   0,
-      4,   4,   4, 139,   4,   4,   4,   4,   4,   4,  60,   0,   0,   0,   0,   0,
-      4, 139,   0,   0,   0,   0,   0,   0,   4,   4, 216,   0,   0,   0,   0,   0,
-      4,  31, 102,   0,   0,   0,  24, 154,   4,  91,  60, 217,  91,   0,   0,   0,
-      0,   0,   4,   4,   0,   0,   0,   0,   4,   4, 218,   4, 219,   0,   0, 220,
-      4,   4,   4,   4,   4,   4,   4, 221,   4,   4,   4,   4,   4,   4,   4, 151,
-    102,   0, 222, 223,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4, 107,
-      4,   4,   4, 224, 225,   0,   0,   0,   4,   4, 226,   4, 227, 228, 229,   4,
-    230, 231, 232,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4, 233, 234,  85,
-    226, 226, 130, 130, 207, 207, 235,   0, 236, 237,   0,   0,   0,   0,   0,   0,
-      4, 238, 239,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   4, 240,
-      4,   4,   4,   4,   4,   4, 186,   0,   4,   4, 241,   0,   0,   0,   0,   0,
-    229, 242, 243, 244, 245, 246,   0,   0,   0,  24, 247, 247, 106,   0,   0,   0,
-      4,   4,   4,   4,   4,   4, 114,   0,   4, 177,   4,   4,   4,   4,   4,   4,
-    116,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4, 248,   4,   4,
-      4,   4,   4,   4,   4,   4,   4,  77, 116,   0,   0,   0,   0,   0,   0,   0,
+      4,   4,   4,   4,   4,   4,   5,   6,   0,   0,   0,   7,   8,   9,   4,  10,
+      4,   4,   4,   4,  11,   4,   4,   4,   4,  12,  13,   4,  14,   0,  15,  16,
+      0,   4,  17,  18,   4,   4,  19,  20,  21,  22,  23,   4,   4,  24,  25,  26,
+     27,  28,  29,  17,   0,  30,  31,   0,  32,  33,  34,  35,  36,  37,  38,  39,
+     40,  41,  42,  43,  44,  45,  46,  47,  48,  45,  49,  50,  51,  52,  46,   0,
+     53,  54,  55,  56,  57,  58,  59,  60,  61,  62,  63,  64,  65,  66,  67,   0,
+     68,  69,  67,   0,  70,  71,  72,   0,  73,   0,  74,  75,  76,   0,   0,   0,
+      4,  77,  78,  79,  80,   4,  81,  82,   4,   4,   4,   4,   4,   4,   4,   4,
+      4,   4,  83,   4,  84,  85,  86,   4,  87,   4,  88,   0,  22,   4,   4,  89,
+     68,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
+      4,   4,   4,  90,   1,   4,   4,  91,  92,  93,  93,  94,   4,  95,  96,   0,
+      0,   4,   4,  29,   4,  97,   4,  98,  99,   0,  15, 100,   4, 101, 102,   0,
+    103,   4, 104,   0,   0, 105,   0,   0, 106,  95, 107,   0, 108, 109,   4, 110,
+      4, 111, 112, 113, 114, 115,   0, 116,   4,   4,   4,   4,   4,   4,   0,   0,
+      4,   4,   4,   4,   4,   4,   4,   4,  89,   4, 117, 113,   4, 118, 119, 120,
+      0,   0,   0, 121, 122,   0,   0,   0, 123, 124, 125,   4,  14,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      4, 126,  99,   4,   4,   4,   4, 127,   4,  81,   4, 128, 103, 129, 129,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    130, 131,  68,   4, 132,  68,   4,  82, 106,  12,   4,   4, 133,   4,   0,  15,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
+      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
+      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   0,   0,
+      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
+      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
+      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4, 134,
+      4,   4,   4,   4,  75,   0,  15, 113,   4,   4,   4,   4,   4,   4,   4,   4,
+    135, 136,   4, 137, 113,   4,   4,  22, 138, 139,   4,   4, 140,   4, 141, 142,
+    143, 144,   4,  95, 139,  95,   0, 145,  25, 146,  67, 134,  32, 147, 148, 149,
+      4,  14, 150, 151,   4, 152, 153, 154, 155, 156,  82, 157,   4,   4,   4, 144,
+      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
+      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4, 158, 159, 160,
+      0,   0,   0,   0,   0,   0,   0,   0,   4,   4,   4,   4,   4,   4,   4,   4,
+      4,   4,   4, 161,   4,   4, 162,   0, 163, 164, 165,   4,   4,  93, 166,   4,
+      4,   4,   4,   4,   4,   4,   4,   4,   4, 113,  15,   4, 167,   4,  31, 168,
+      0,   0,   0, 169,   4,   4,   4, 134,   0,   1,   1, 170,   4,  99, 171,   0,
+    172, 173, 174,   0,   4,   4,   4,  88,   0,   0,   4, 104,   0,   0,   0,   0,
+      0,   0,   0,   0, 134,   4, 175,   0,   4,  23, 176,  98, 113,   4, 177,   0,
+      4,   4,   4,   4, 113,  15, 178, 160,   4, 179,   4, 111,   0,   0,   0,   0,
+      4,   4,   4,   4,   4,   4,   4,   4,   4, 103,  98,  31,   0,   0,   0,   0,
+    180, 181,  98, 103,  99,   0,   0, 182,  98, 162,   0,   0,   4, 183,   0,   0,
+    184,  98,   0, 134, 134,   0,  74, 185,   4,  98,  98, 147,  93,   0,   0,   0,
+      4,   4,  14,   0,   4, 147,   4, 147,   4, 111,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   4, 186,   0,   0, 134, 187, 110,   0,   0,  15, 185, 103,
+    108, 188,   0,   0, 108,  22,  15,  14, 108,  67, 189, 190, 108, 147, 191,   0,
+    192, 193,   0,   0, 194, 114,  99,   0,  48,  45, 195,  56,   0,   0,   0,   0,
+      4, 104, 196,  56,   4,  22, 197,   0,   0,   0,   0,   0,   4, 133, 198,   0,
+      4,  22, 199,   0,   4, 200,   0,   0,  88,   0,   0,   0,   0,   0,   0,   0,
+      4, 193,   0,   0,   0,   4,   4, 201, 202, 203, 204,   0,   0, 205, 175, 206,
+    207, 208, 209,   4, 210,   0,   4,  29,   0,   0,   0,   0,   0,   0,   0,   0,
+    211, 133,  73, 212,  22,   0,   0,   0, 213, 175, 214, 215, 216,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0, 147,   0,   0,   0,   0,   0,  46,   0,   0,
+      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
+      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4, 162,   0,   0,   0,
+      4,   4,   4, 133,   4,   4,   4,   4,   4,   4, 111,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      4, 133,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
+      4,   4,  67,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
+      4,  29,  99,   0,   0,   0,  15, 217,   4,  22, 111, 218,  22,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   4,   4,   0,   0,   0,   0,   4,   4, 219,   0, 166,   0,   0, 220,
+      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
+      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4, 188,
+      4,   4,   4,   4,   4,   4,  98,   0,  14,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      4,   4,   4,   4,   4,   4,   4,   4,  99,   0, 221, 222,   4,   4,   4,   4,
+      4,   4,   4,   4,   4,   4,   4, 160,   0,   0,   0,   0,   0,   0,   0,   0,
+      4,   4,   4, 223, 224,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      4,   4,  30,   4, 225, 226, 227,   4, 228, 229, 230,   4,   4,   4,   4,   4,
+      4,   4,   4,   4,   4, 231, 232,  82,  30,  30, 126, 126, 211, 211, 150,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   4, 233, 234,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   4, 193,   0,   0,   0,   0,   0,   0,   0,   0,
+      4,   4,   4,   4,   4,   4, 185,   0,   4,   4, 235,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    227, 236, 237, 238, 239, 240,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
+      4,   4,   4,   4,   4,   4, 113,   0,   4,   4,   4,   4,   4,   4,   4,   4,
+      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
+      4,   4,   4,   4,   4,   4,   4,   4,   4, 104,   4,   4,   4,   4,   4,   4,
+    113,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
+      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
+      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
+      4,   4,   4,   4,   4, 241,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
+      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
+      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,  73,
+      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
+    113,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
+      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,  17,   0,   0,   0,   0,   0
 };
 
-static RE_UINT8 re_alphabetic_stage_4[] = {
+static RE_UINT8 re_id_start_table_3[] = {
       0,   0,   0,   0, 254, 255, 255,   7,   0,   4,  32,   4, 255, 255, 127, 255,
-    255, 255, 255, 255, 195, 255,   3,   0,  31,  80,   0,   0,  32,   0,   0,   0,
-      0,   0, 223, 188,  64, 215, 255, 255, 251, 255, 255, 255, 255, 255, 191, 255,
-      3, 252, 255, 255, 255, 255, 254, 255, 255, 255, 127,   2, 255,   1,   0,   0,
-      0,   0, 255, 191, 182,   0, 255, 255, 255, 135,   7,   0,   0,   0, 255,   7,
-    255, 255, 255, 254,   0, 192, 255, 255, 255, 255, 239,  31, 254, 225,   0, 156,
-      0,   0, 255, 255,   0, 224, 255, 255, 255, 255,   3,   0,   0, 252, 255, 255,
-    255,   7,  48,   4, 255, 255, 255, 252, 255,  31,   0,   0, 255, 255, 255,   1,
-    255,   7,   0,   0, 255, 255, 223,  63,   0,   0, 240, 255, 248,   3, 255, 255,
-    255, 255, 255, 239, 255, 223, 225, 255,  15,   0, 254, 255, 239, 159, 249, 255,
-    255, 253, 197, 227, 159,  89, 128, 176,  15,   0,   3,  16, 238, 135, 249, 255,
-    255, 253, 109, 195, 135,  25,   2,  94,   0,   0,  63,   0, 238, 191, 251, 255,
-    255, 253, 237, 227, 191,  27,   1,   0,  15,   0,   0,  30, 238, 159, 249, 255,
-    159,  25, 192, 176,  15,   0,   2,   0, 236, 199,  61, 214,  24, 199, 255, 195,
-    199,  29, 129,   0, 239, 223, 253, 255, 255, 253, 255, 227, 223,  29,  96,   7,
-     15,   0,   0,   0, 255, 253, 239, 227, 223,  29,  96,  64,  15,   0,   6,   0,
-    255, 255, 255, 231, 223,  93, 240, 128,  15,   0,   0, 252, 236, 255, 127, 252,
-    255, 255, 251,  47, 127, 128,  95, 255,   0,   0,  12,   0, 254, 255, 255, 255,
-    255, 255, 255,   7, 127,  32,   0,   0, 214, 247, 255, 255, 175, 255, 255,  59,
-     95,  32,   0, 240,   1,   0,   0,   0, 255, 254, 255, 255, 255,  31, 254, 255,
-      3, 255, 255, 254, 255, 255, 255,  31, 255, 255, 127, 249, 255, 255,   0,  60,
-    191,  32, 255, 255, 255, 255, 255, 247, 255,  61, 127,  61, 255,  61, 255, 255,
-    255, 255,  61, 127,  61, 255, 127, 255, 255, 255,  61, 255, 255, 255,   0,   0,
-    255, 255,  63,  63, 255, 159, 255, 255, 255, 199, 255,   1, 255, 223,  15,   0,
-    255, 255,  15,   0, 255, 223,  13,   0, 255, 255, 207, 255, 255,   1, 128,  16,
-    255,   7, 255, 255, 255, 255,  63,   0, 255, 255, 255, 127, 255,  15, 255,   1,
-    255,  63,  31,   0, 255,  15, 255, 255, 255,   3,   0,   0, 255, 255, 255,  15,
-    254, 255,  31,   0, 128,   0,   0,   0, 255, 255, 239, 255, 239,  15,   0,   0,
-    255, 243,   0, 252, 191, 255,   3,   0, 255, 255, 127,   0,   0, 224,   0, 252,
-    255, 255, 255,  63, 255,   1, 255, 255,   0, 222, 111,   4, 128, 255,  31,   0,
-     63,  63, 255, 170, 255, 255, 223,  95, 220,  31, 207,  15, 255,  31, 220,  31,
-      0,   0,   2, 128,   0,   0, 255,  31, 132, 252,  47,  62,  80, 189, 255, 243,
-    224,  67,   0,   0,   0,   0, 192, 255, 255, 127, 255, 255,  31, 120,  12,   0,
-    255, 128,   0,   0, 127, 127, 127, 127,   0, 128,   0,   0, 224,   0,   0,   0,
-    254,   3,  62,  31, 255, 255, 127, 224, 224, 255, 255, 255, 255, 127,   0,   0,
-    255,  31, 255, 255,   0,  12,   0,   0, 255, 127, 240, 143,   0,   0, 128, 255,
-    252, 255, 255, 255, 255, 249, 255, 255, 124,   0,   0,   0, 191, 255, 255, 255,
-    255,   0,   0,   0,  47,   0,   0,   0,   0,   0, 252, 232, 255, 255,   7,   0,
-    255, 255, 247, 255, 255, 255,   0, 124, 255,  63,   0,   0, 255, 255, 127, 252,
-      5,   0,   0,  56, 255, 255,  60,   0, 126, 126, 126,   0, 127, 127, 255, 255,
-    255,   0, 255, 255,  15,   0, 255, 255, 127, 248, 255, 255, 255,  63, 255, 255,
-    255, 255, 255,   3, 127,   0, 248, 224, 255, 253, 127,  95, 219, 255, 255, 255,
-      0,   0, 248, 255, 255, 255, 252, 255,   0,   0, 255,  15,   0,   0, 223, 255,
-    192, 255, 255, 255, 252, 252, 252,  28, 255, 239, 255, 255, 127, 255, 255, 183,
-    255,  63, 255,  63, 255, 255,  31,   0, 255, 255,   1,   0,  15, 255,  62,   0,
-    255, 255,  15, 255,  63, 253, 255, 255, 255, 255, 191, 145, 255, 255,  55,   0,
-    255, 255, 255, 192, 111, 240, 239, 254,  31,   0,   0,   0, 128,   0, 255, 255,
-     63,   0,   0,   0, 112,   0, 255, 255, 255, 255,  71,   0,  30,   0,   0,  20,
-    255, 255, 251, 255, 255, 255, 159,  64, 127, 189, 255, 191, 159,  25, 129, 224,
-    187,   7,   0, 128, 179,   0,   0,   0, 255, 255,  63, 127,   0,   0,   0,  63,
-     17,   0,   0,   0, 255, 255,  63,   1,   0,   0,   0, 128, 255, 252, 255, 255,
-     26,   0,   0,   0, 255, 255, 231, 127, 255, 255, 255,  32, 255, 253, 255, 255,
-    255, 255, 127, 127,   0,   0, 252, 255, 255, 254, 127,   0, 127, 251, 255, 255,
-    255, 255, 127, 180, 203,   0,   0,   0, 191, 253, 255, 255, 255, 127, 123,   1,
-    127,   0,   0,   0, 248, 255, 255, 224, 255, 135, 255, 255, 255, 128, 255, 255,
-     11,   0,   0,   0, 255, 255, 255,   0,   0,   0,   7,   0, 240,   0, 255, 255,
-    255,   7, 255,  31, 255,   1, 255,  67, 255, 255, 223, 255, 255, 255, 255, 223,
-    100, 222, 255, 235, 239, 255, 255, 255, 191, 231, 223, 223, 255, 255, 255, 123,
-     95, 252, 253, 255,  63, 255, 255, 255, 253, 255, 255, 247, 247,  15,   0,   0,
-    127, 255, 255, 249, 219,   7,   0,   0, 255,  31, 128,  63,   0,  64,   0,   0,
-    255,  15,   0,   0, 143,   8,   0,   0, 150, 254, 247,  10, 132, 234, 150, 170,
-    150, 247, 247,  94, 255, 251, 255,  15, 238, 251, 255,  15, 255,   3, 255, 255,
-      3,   0, 255, 255,
-};
-
-/* Alphabetic: 2596 bytes. */
-
-RE_UINT32 re_get_alphabetic(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-
-    f = ch >> 12;
-    code = ch ^ (f << 12);
-    pos = (RE_UINT32)re_alphabetic_stage_1[f] << 4;
-    f = code >> 8;
-    code ^= f << 8;
-    pos = (RE_UINT32)re_alphabetic_stage_2[pos + f] << 3;
-    f = code >> 5;
-    code ^= f << 5;
-    pos = (RE_UINT32)re_alphabetic_stage_3[pos + f] << 5;
-    pos += code;
-    value = (re_alphabetic_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1;
-
-    return value;
+    255, 255, 255, 255, 195, 255,   3,   0,  31,  80,   0,   0,   0,   0, 223, 188,
+     64, 215, 255, 255, 251, 255, 255, 255, 255, 255, 191, 255,   3, 252, 255, 255,
+    255, 255, 254, 255, 255, 255, 127,   2, 255,   1,   0,   0,   0,   0, 255, 255,
+    255, 135,   7,   0, 255,   7,   0,   0,   0, 192, 254, 255, 255, 255,  47,   0,
+     96, 192,   0, 156,   0,   0, 253, 255, 255, 255,   0,   0,   0, 224, 255, 255,
+     63,   0,   2,   0,   0, 252, 255, 255, 255,   7,  48,   4, 255, 255,  63,   4,
+     16,   1,   0,   0, 255, 255, 255,   1, 255, 255, 223, 255, 255,   0,   0,   0,
+    240, 255, 255, 255, 255, 255, 255,  35,   0,   0,   1, 255,   3,   0, 254, 255,
+    225, 159, 249, 255, 255, 253, 197,  35,   0,  64,   0, 176,   3,   0,   3,  16,
+    224, 135, 249, 255, 255, 253, 109,   3,   0,   0,   0,  94,   0,   0,  28,   0,
+    224, 191, 251, 255, 255, 253, 237,  35,   0,   0,   1,   0,   3,   0,   0,   2,
+    224, 159, 249, 255,   0,   0,   0, 176,   3,   0,   2,   0, 232, 199,  61, 214,
+     24, 199, 255,   3, 224, 223, 253, 255, 255, 253, 255,  35,   0,   0,   0,   7,
+      3,   0,   0,   0, 225, 223, 253, 255, 255, 253, 239,  35,   0,   0,   0,  64,
+      3,   0,   6,   0, 240, 223, 253, 255, 255, 255, 255,  39,   0,  64, 112, 128,
+      3,   0,   0, 252, 224, 255, 127, 252, 255, 255, 251,  47, 127,   0,   0,   0,
+    254, 255, 255, 255, 255, 255,  13,   0, 214, 247, 255, 255, 175, 255,  13,  32,
+     95,   0,   0, 240,   1,   0,   0,   0, 255, 254, 255, 255, 255,  31,   0,   0,
+      0,  31,   0,   0, 255,   7,   0, 128,   0,   0,  63,  60,  98, 192, 225, 255,
+      3,  64,   0,   0, 191,  32, 255, 255, 255, 255, 255, 247, 255,  61, 127,  61,
+    255,  61, 255, 255, 255, 255,  61, 127,  61, 255, 127, 255, 255, 255,  61, 255,
+    255, 255, 255,   7, 255, 255,  63,  63, 255, 159, 255, 255, 255, 199, 255,   1,
+    255, 223,   3,   0, 255, 255,   3,   0, 255, 223,   1,   0, 255, 255,  15,   0,
+      0,   0, 128,  16, 255,   5, 255, 255, 255, 255,  63,   0, 255, 255, 255, 127,
+    255,  63,  31,   0, 255,  15, 255, 255, 255,   3,   0,   0, 255, 255, 127,   0,
+    255, 255,  31,   0, 128,   0,   0,   0, 224, 255, 255, 255, 224,  15,   0,   0,
+    248, 255, 255, 255,   1, 192,   0, 252,  63,   0,   0,   0,  15,   0,   0,   0,
+      0, 224,   0, 252, 255, 255, 255,  63, 255,   1, 255, 255, 255, 255, 255, 231,
+      0, 222, 111,   4,  63,  63, 255, 170, 255, 255, 223,  95, 220,  31, 207,  15,
+    255,  31, 220,  31,   0,   0,   2, 128,   0,   0, 255,  31, 132, 252,  47,  63,
+     80, 253, 255, 243, 224,  67,   0,   0, 255, 127, 255, 255,  31, 120,  12,   0,
+    255, 128,   0,   0, 127, 127, 127, 127, 224,   0,   0,   0, 254,   3,  62,  31,
+    255, 255, 127, 248, 255, 127,   0,   0, 255, 255, 255,  31, 255,  31, 255, 255,
+      0,  12,   0,   0, 255, 127,   0, 128,   0,   0, 128, 255, 252, 255, 255, 255,
+    255, 249, 255, 255, 252,   7,   0,   0,   0,   0, 224, 255, 187, 247, 255, 255,
+      7,   0,   0,   0,   0,   0, 252, 104,  63,   0, 255, 255, 255, 255,   7,   0,
+      0, 128,   0,   0, 223, 255,   0, 124, 247,  15,   0,   0, 255, 255, 127, 196,
+    255, 255,  98,  62,   5,   0,   0,  56, 255,   7,  28,   0, 126, 126, 126,   0,
+    127, 127, 255, 255, 255,   3, 255, 255,  15,   0, 255, 255, 127, 248, 255, 255,
+    255, 255, 255,  15, 255,  63, 255, 255, 255, 255, 255,   3, 127,   0, 248, 160,
+    255, 253, 127,  95, 219, 255, 255, 255,   0,   0, 248, 255, 255, 255, 252, 255,
+      0,   0, 255,  15,   0,   0, 223, 255, 192, 255, 255, 255, 252, 252, 252,  28,
+    255, 239, 255, 255, 127, 255, 255, 183, 255,  63, 255,  63, 255, 255,   1,   0,
+    255,   7, 255, 255,  15, 255,  62,   0, 255, 255,  15, 255, 255,   0, 255, 255,
+     63, 253, 255, 255, 255, 255, 191, 145, 255, 255,  55,   0, 255, 255, 255, 192,
+      1,   0, 239, 254,  31,   0,   0,   0, 255,   3,   3,   0, 128,   0, 255, 255,
+    255, 255, 255,   0, 144,   0, 255, 255, 255, 255,  71,   0,  30,   0,   0,  20,
+    255, 255, 251, 255, 255,  15,   0,   0, 127, 189, 255, 191,   0,   0,   1, 224,
+    128,   7,   0, 128, 176,   0,   0,   0,   0,   0,   0,  15,  16,   0,   0,   0,
+    255,   7,   0,   1,   0,   0,   0, 128, 127, 242, 111, 255, 255, 255,   0, 128,
+      2,   0,   0,   0, 255, 252, 255, 255,  10,   0,   0,   0,   1, 248, 255, 255,
+    255, 255,   7,   4,   0,   0,   1, 240, 255,   3,   0,  32, 255, 253, 255, 255,
+      0,   0, 252, 255, 127, 251, 255, 255,  64,   0,   0,   0, 191, 253, 255, 255,
+    255,   3,   0,   1, 255,  63,   0,   0, 248, 255, 255, 224, 255,   7,   1,   0,
+     11,   0,   0,   0,   0,   0,   7,   0, 240,   0, 255, 255, 255,   7, 255,  31,
+    255,   1, 255,   3, 255, 255, 255, 223, 100, 222, 255, 235, 239, 255, 255, 255,
+    191, 231, 223, 223, 255, 255, 255, 123,  95, 252, 253, 255,  63, 255, 255, 255,
+    253, 255, 255, 247, 255,  31, 128,  63,   0,  64,   0,   0,  15,   8,   0,   0,
+    150, 254, 247,  10, 132, 234, 150, 170, 150, 247, 247,  94, 255, 251, 255,  15,
+    238, 251, 255,  15,   3,   0, 255, 255
+};
+
+RE_UINT32 re_get_id_start(RE_UINT32 codepoint) {
+    RE_UINT32 field_2;
+    RE_UINT32 field_1;
+    RE_UINT32 field_0;
+    RE_UINT32 offset;
+    RE_UINT32 v;
+
+    field_2 = codepoint >> 10;
+    field_1 = (codepoint >> 5) & 0x1F;
+    field_0 = (codepoint >> 3) & 0x3;
+    offset = codepoint & 0x7;
+
+    v = re_id_start_table_1[field_2];
+    v = re_id_start_table_2[(v << 5) | field_1];
+    v = re_id_start_table_3[(v << 2) | field_0];
+
+    return (v >> offset) & 0x1;
 }
 
-/* Lowercase. */
-
-static RE_UINT8 re_lowercase_stage_1[] = {
-    0, 1, 2, 2, 2, 3, 2, 4, 5, 2, 2, 6, 2, 2, 7, 8,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2,
-};
-
-static RE_UINT8 re_lowercase_stage_2[] = {
-     0,  1,  2,  3,  3,  3,  3,  3,  4,  5,  3,  3,  3,  3,  6,  7,
-     8,  3,  9,  3,  3,  3, 10,  3,  3,  3,  3,  3,  3,  3,  3,  3,
-     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
-     3,  3,  3, 11,  3, 12,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
-     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3, 13,  3, 14,
-     3,  3, 15,  3,  3,  3, 16,  3,  3,  3,  3,  3, 17,  3,  3,  3,
-     3,  3,  3,  3,  3,  3,  3, 18,  3,  3,  3,  3,  3,  3,  3,  3,
-     3,  3,  3,  3,  3,  3,  3,  3,  3,  3, 19, 20,  3,  3,  3,  3,
-     3,  3,  3,  3, 21,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
-};
-
-static RE_UINT8 re_lowercase_stage_3[] = {
-     0,  0,  0,  1,  0,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12,
-     5, 13, 14, 15, 16, 17, 18, 19,  0,  0, 20, 21, 22, 23, 24, 25,
-     0, 26, 15,  5, 27,  5, 28,  5,  5, 29,  0, 15, 30,  0,  0,  0,
-     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0, 26, 31,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 32,
-     0,  0,  0,  0, 30,  0,  0,  0, 15, 15, 15, 15, 15, 15,  0,  0,
-     5,  5,  5,  5, 33,  5,  5,  5, 34, 35, 36, 37, 35, 38, 39, 40,
-     0,  0,  0, 41, 42,  0,  0,  0, 43, 44, 45, 26, 46,  0,  0,  0,
-     0,  0,  0,  0,  0,  0, 26, 47,  0,  0,  0,  0,  0,  0,  0,  0,
-     0, 26, 48, 49,  5,  5,  5, 50, 15, 51,  0,  0,  0,  0,  0,  0,
-     0,  0,  5, 52, 53,  0,  0,  0,  0, 54,  5, 55, 56, 57, 58, 59,
-     0,  0,  0,  0,  0,  0,  0,  0,  0, 26, 60, 61, 15, 15,  0,  0,
-     0,  0,  0,  0,  0,  0,  0,  0, 62,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  0,  0,  0,  0,  0,
-     0, 63, 64,  0,  0,  0, 65, 66,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0, 15, 67,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0, 15,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0, 15,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 68, 69, 81,
-    71, 72, 82, 64, 75, 83, 84, 85, 86, 82, 87, 26, 88, 75, 89,  0,
-     0,  0,  0,  0,  0,  0,  0,  0,  0, 90, 91,  0,  0,  0,  0,  0,
-};
-
-static RE_UINT8 re_lowercase_stage_4[] = {
-      0,   0,   0,   0, 254, 255, 255,   7,   0,   4,  32,   4,   0,   0,   0, 128,
-    255, 255, 127, 255, 170, 170, 170, 170, 170, 170, 170,  85,  85, 171, 170, 170,
-    170, 170, 170, 212,  41,  49,  36,  78,  42,  45,  81, 230,  64,  82,  85, 181,
-    170, 170,  41, 170, 170, 170, 250, 147, 133, 170, 255, 255, 255, 255, 255, 255,
-    255, 255, 239, 255, 255, 255, 255,   1,   3,   0,   0,   0,  31,   0,   0,   0,
-     32,   0,   0,   0,   0,   0, 138,  60,   0,   0,   1,   0,   0, 240, 255, 255,
-    255, 127, 227, 170, 170, 170,  47,  25,   0,   0, 255, 255,   2, 168, 170, 170,
-     84, 213, 170, 170, 170, 170,   0,   0, 255,   1,   0,   0, 255, 255, 255, 231,
-      0,   0,   0,  63, 170, 170, 234, 191, 255,   0,  63,   0, 255,   0, 255,   0,
-     63,   0, 255,   0, 255,   0, 255,  63, 255,   0, 223,  64, 220,   0, 207,   0,
-    255,   0, 220,   0,   0,   0,   2, 128,   0,   0, 255,  31,   0, 196,   8,   0,
-      0, 128,  16,  50, 192,  67,   0,   0,  16,   0,   0,   0, 255,   3,   0,   0,
-    255, 255, 255, 127,  98,  21, 218,  63,  26,  80,   8,   0, 191,  32,   0,   0,
-    170,  42,   0,   0, 170, 170, 170,  58, 168, 170, 171, 170, 170, 170, 255, 149,
-    170,  80, 186, 170, 170, 130, 160, 170,   8,   0,   0,   0,   0,   0,   0,   7,
-    255, 255, 255, 247, 255,   0, 255, 255, 127,   0, 248,   0,   0, 255, 255, 255,
-    255, 255,   0,   0,   0,   0,   0, 255, 255, 255, 255,  15, 255, 255,   7,   0,
-      0,   0,   0, 252, 255, 255,  15,   0,   0, 192, 223, 255, 255,   0,   0,   0,
-    252, 255, 255,  15,   0,   0, 192, 235, 239, 255,   0,   0,   0, 252, 255, 255,
-     15,   0,   0, 192, 255, 255, 255,   0,   0,   0, 252, 255, 255,  15,   0,   0,
-    192, 255, 255, 255,   0, 192, 255, 255,   0,   0, 192, 255,  63,   0,   0,   0,
-    252, 255, 255, 247,   3,   0,   0, 240, 255, 255, 223,  15, 255, 127,  63,   0,
-    255, 253,   0,   0, 247,  11,   0,   0, 252, 255, 255, 255,  15,   0,   0,   0,
-};
+/* IDS_Trinary_Operator. */
+RE_UINT32 re_get_ids_trinary_operator(RE_UINT32 codepoint) {
+    if (0x2FF2 <= codepoint && codepoint <= 0x2FF3)
+        return 1;
 
-/* Lowercase: 1000 bytes. */
-
-RE_UINT32 re_get_lowercase(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-
-    f = ch >> 13;
-    code = ch ^ (f << 13);
-    pos = (RE_UINT32)re_lowercase_stage_1[f] << 4;
-    f = code >> 9;
-    code ^= f << 9;
-    pos = (RE_UINT32)re_lowercase_stage_2[pos + f] << 4;
-    f = code >> 5;
-    code ^= f << 5;
-    pos = (RE_UINT32)re_lowercase_stage_3[pos + f] << 5;
-    pos += code;
-    value = (re_lowercase_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1;
-
-    return value;
+    return 0;
 }
 
-/* Uppercase. */
-
-static RE_UINT8 re_uppercase_stage_1[] = {
-    0, 1, 2, 2, 2, 3, 2, 4, 5, 2, 2, 6, 2, 2, 7, 8,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2,
-};
-
-static RE_UINT8 re_uppercase_stage_2[] = {
-     0,  1,  2,  3,  3,  3,  3,  3,  4,  5,  3,  3,  3,  3,  6,  7,
-     8,  3,  9,  3,  3,  3, 10,  3,  3,  3,  3,  3,  3,  3,  3,  3,
-     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
-     3,  3,  3, 11,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
-     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3, 12,
-     3,  3, 13,  3,  3,  3, 14,  3,  3,  3,  3,  3, 15,  3,  3,  3,
-     3,  3,  3,  3,  3,  3,  3, 16,  3,  3,  3,  3,  3,  3,  3,  3,
-     3,  3,  3,  3,  3,  3,  3,  3,  3,  3, 17, 18,  3,  3,  3,  3,
-     3,  3,  3,  3, 19,  3,  3,  3, 20,  3,  3,  3,  3,  3,  3,  3,
-};
-
-static RE_UINT8 re_uppercase_stage_3[] = {
-     0,  0,  1,  0,  0,  0,  2,  0,  3,  4,  5,  6,  7,  8,  9, 10,
-     3, 11, 12,  0,  0,  0,  0,  0,  0,  0,  0, 13, 14, 15, 16, 17,
-    18, 19,  0,  3, 20,  3, 21,  3,  3, 22, 23,  0,  0,  0,  0,  0,
+/* Indic_Positional_Category. */
+static RE_UINT8 re_indic_positional_category_table_1[] = {
+     0,  0,  1,  2,  3,  4,  5,  6,  7,  0,  0,  0,  0,  0,  0,  0,
      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0, 18, 24,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 18, 18, 25,
-     0,  0,  0,  0, 26, 27,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     3,  3,  3,  3, 28,  3,  3,  3, 29, 30, 31, 32,  0, 33, 34, 35,
-     0,  0,  0,  0,  0,  0,  0,  0, 36, 37, 38, 19, 39,  0,  0,  0,
-     0,  0,  0,  0,  0, 40, 19,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    18, 41,  0, 42,  3,  3,  3, 43,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  3, 44, 45,  0,  0,  0,  0, 46,  3, 47, 48, 49, 50,  0,
-     0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  0,  0,  0,  0,  0,  0,
-    18, 51,  0,  0,  0, 26, 52,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0, 18, 53,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0, 18,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0, 18,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    54, 55, 56, 57, 58, 59, 26, 60, 61, 62, 63, 64, 65, 54, 55, 56,
-    57, 66, 25, 26, 60, 57, 67, 68, 69, 70, 40, 41, 26, 71, 72,  0,
-     0,  0,  0,  0,  0,  0,  0,  0, 18, 73,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0,  0,  0,  0, 26, 74, 74, 60,  0,  0,  0,
-};
-
-static RE_UINT8 re_uppercase_stage_4[] = {
-      0,   0,   0,   0, 254, 255, 255,   7, 255, 255, 127, 127,  85,  85,  85,  85,
-     85,  85,  85, 170, 170,  84,  85,  85,  85,  85,  85,  43, 214, 206, 219, 177,
-    213, 210, 174,  17, 144, 164, 170,  74,  85,  85, 210,  85,  85,  85,   5, 108,
-    122,  85,   0,   0,   0,   0,  69, 128,  64, 215, 254, 255, 251,  15,   0,   0,
-      0, 128,  28,  85,  85,  85, 144, 230, 255, 255, 255, 255, 255, 255,   0,   0,
-      1,  84,  85,  85, 171,  42,  85,  85,  85,  85, 254, 255, 255, 255, 127,   0,
-    191,  32,   0,   0, 255, 255,  63,   0,   0,   0, 255, 255, 255, 255, 255, 231,
-     85,  85,  21,  64,   0, 255,   0,  63,   0, 255,   0, 255,   0,  63,   0, 170,
-      0, 255,   0,   0,   0,   0,   0,  15,   0,  15,   0,  15,   0,  31,   0,  15,
-    132,  56,  39,  62,  80,  61,  15, 192,  32,   0,   0,   0,   8,   0,   0,   0,
-      0,   0, 192, 255, 255, 127,   0,   0, 157, 234,  37, 192,   5,  40,   4,   0,
-     85,  21,   0,   0,  85,  85,  85,   5,  84,  85,  84,  85,  85,  85,   0, 106,
-     85,  40,  69,  85,  85, 125,  95,  85, 116,   0,   0,   0, 255,   0,   0,   0,
-    255, 255,  15,   0, 255, 255,   7,   0, 255, 255, 255,   3,   0,   0, 240, 255,
-    255,  63,   0,   0,   0, 255, 255, 255,   3,   0,   0, 208, 100, 222,  63,   0,
-    255,   3,   0,   0, 176, 231, 223,  31,   0,   0,   0, 123,  95, 252,   1,   0,
-      0, 240, 255, 255,  63,   0,   0,   0,   3,   0,   0, 240,   1,   0,   0,   0,
-    252, 255, 255,   7,   0,   0,   0, 240, 255, 255,  31,   0, 255,   1,   0,   0,
-      0,   4,   0,   0,   3,   0,   0,   0, 255,   3, 255, 255,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  8,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  9,  0, 10, 11, 12, 13,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0
 };
 
-/* Uppercase: 916 bytes. */
-
-RE_UINT32 re_get_uppercase(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-
-    f = ch >> 13;
-    code = ch ^ (f << 13);
-    pos = (RE_UINT32)re_uppercase_stage_1[f] << 4;
-    f = code >> 9;
-    code ^= f << 9;
-    pos = (RE_UINT32)re_uppercase_stage_2[pos + f] << 4;
-    f = code >> 5;
-    code ^= f << 5;
-    pos = (RE_UINT32)re_uppercase_stage_3[pos + f] << 5;
-    pos += code;
-    value = (re_uppercase_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1;
-
-    return value;
-}
-
-/* Cased. */
-
-static RE_UINT8 re_cased_stage_1[] = {
-    0, 1, 2, 2, 2, 3, 2, 4, 5, 2, 2, 6, 2, 2, 7, 8,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2,
+static RE_UINT8 re_indic_positional_category_table_2[] = {
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   1,   2,   3,   4,   5,   6,   7,   8,
+      9,   6,  10,  11,   9,   6,  12,  13,   5,  14,  15,   4,  16,  17,  18,   0,
+     19,  20,  21,   4,   5,  14,  22,   4,  23,  24,  25,   4,   5,   0,  26,  27,
+      0,  28,  29,   0,   0,  30,  31,   0,  32,  33,   0,  34,  35,  36,  37,   0,
+      0,  38,  39,  40,  41,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,  42,  42,  43,  43,   0,  44,  45,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,  46,   0,   0,   0,  47,  48,   0,
+     49,   0,  50,  51,   0,   0,   0,   0,  52,  53,  54,  55,  56,  57,   0,  58,
+      0,  59,   0,   0,   0,   0,  60,  61,   0,   0,   0,   0,   0,   0,   0,  62,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,  63,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     64,  65,   0,   0,  66,  67,  68,  69,   0,  70,  71,   0,   1,  72,  73,  74,
+      0,  75,  76,  77,   0,  78,  79,  80,   0,   0,   0,   0,   0,   0,   0,  81,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     82,  83,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     84,  85,  86,   0,  56,  87,   0,   0,  88,  89,  90,  91,  56,  92,  93,   0,
+      0,  94,   0,   0,   0,   0,  95,  96,  23,  97,  98,  99,   0,   0,   0,   0,
+      0, 100, 101,   0,   0, 102, 103,   0,   0,   0,   0,   0,   0, 104, 105,   0,
+      0, 106, 107,   0,   0, 108,   0,   0, 109, 110,   0,   0,   0,   0,   0,   0,
+      0, 111,   0,   0,   0,   0,   0,   0,   0, 112, 113,   0,   0,   0, 114, 115,
+    116, 117, 118,   0, 119,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0, 120,   0,   0, 121, 122,   0,   0,   0, 123, 124,   0, 125,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0, 126,   0,   0,   0,   0,   0,   0,   0,   0
 };
 
-static RE_UINT8 re_cased_stage_2[] = {
-     0,  1,  2,  3,  3,  3,  3,  3,  4,  5,  3,  3,  3,  3,  6,  7,
-     8,  3,  9,  3,  3,  3, 10,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+static RE_UINT8 re_indic_positional_category_table_3[] = {
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     1,  1,  1,  2,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  2,  3,  0,  2,  4,
+     2,  3,  3,  3,  3,  1,  1,  1,  1,  2,  2,  2,  2,  3,  4,  2,
+     0,  1,  3,  1,  1,  1,  3,  3,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  3,  3,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  1,  2,  2,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  3,  0,  2,  4,
+     2,  3,  3,  3,  3,  0,  0,  4,  4,  0,  0,  5,  5,  3,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  2,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  3,  3,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  0,
+     0,  1,  1,  2,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     2,  3,  3,  0,  0,  0,  0,  1,  1,  0,  0,  1,  1,  3,  0,  0,
+     0,  3,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     1,  1,  0,  0,  0,  3,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     2,  3,  3,  3,  3,  1,  0,  1,  1,  6,  0,  2,  2,  3,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  3,  3,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  1,  1,  1,  1,  1,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  3,  0,  2,  1,
+     2,  3,  3,  3,  3,  0,  0,  4,  7,  0,  0,  5,  8,  3,  0,  0,
+     0,  0,  0,  0,  0,  1,  1,  6,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  2,  2,
+     1,  2,  2,  0,  0,  0,  4,  4,  4,  0,  5,  5,  5,  1,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  2,  0,  0,  0,  0,  0,  0,  0,  0,
+     1,  2,  2,  2,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  1,
+     1,  2,  2,  2,  2,  0,  1,  1,  9,  0,  1,  1,  1,  1,  0,  0,
+     0,  0,  0,  0,  0,  1,  3,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     6,  2,  2,  2,  2,  0,  1,  6,  6,  0,  6,  6,  1,  1,  0,  0,
+     0,  0,  0,  0,  0,  2,  2,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     1,  1,  2,  2,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  1,  0,  2,  2,
+     2,  2,  2,  3,  3,  0,  4,  4,  4,  0,  5,  5,  5,  1,  1,  0,
+     0,  0,  0,  0,  0,  0,  0,  2,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  0,  0,  0,  0,  2,
+     2,  2,  1,  1,  3,  0,  3,  0,  2,  4,  7,  4,  5,  8,  5,  2,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  2,  2,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     2,  1,  2,  2,  1,  1,  1,  1,  3,  3,  3,  0,  0,  0,  0,  0,
+    10, 10, 10, 10, 10,  2,  0,  1,  1,  1,  1,  1,  1,  1,  1,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     2,  1,  2,  2,  1,  1,  1,  1,  3,  3,  3,  1,  3,  0,  0,  0,
+    10, 10, 10, 10, 10,  0,  0,  0,  1,  1,  1,  1,  1,  1,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  3,  3,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  3,  0,  3,  0,  1,  0,  0,  0,  0,  2,  4,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  3,  1,  9,  3,  3,  9,  9,  9,  9,  1,  1,  1,  1,  1,  2,
+     1,  9,  1,  1,  3,  0,  1,  1,  0,  0,  0,  0,  0,  3,  3,  3,
+     3,  3,  3,  3,  3,  3,  3,  3,  0,  3,  3,  3,  3,  3,  3,  3,
      3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
-     3,  3,  3, 11,  3, 12,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
-     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3, 13,  3, 14,
-     3,  3, 15,  3,  3,  3, 16,  3,  3,  3,  3,  3, 17,  3,  3,  3,
-     3,  3,  3,  3,  3,  3,  3, 18,  3,  3,  3,  3,  3,  3,  3,  3,
-     3,  3,  3,  3,  3,  3,  3,  3,  3,  3, 19, 20,  3,  3,  3,  3,
-     3,  3,  3,  3, 21,  3,  3,  3, 22,  3,  3,  3,  3,  3,  3,  3,
-};
-
-static RE_UINT8 re_cased_stage_3[] = {
-     0,  0,  1,  1,  0,  2,  3,  3,  4,  4,  4,  4,  4,  5,  6,  4,
-     4,  4,  4,  4,  7,  8,  9, 10,  0,  0, 11, 12, 13, 14,  4, 15,
-     4,  4,  4,  4, 16,  4,  4,  4,  4, 17, 18,  4, 19,  0,  0,  0,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  3,  0,  0,  0,  0,  0,  0,  0,  0,  0,
      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  4, 20, 21,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  4,  4, 22,
-     0,  0,  0,  0, 23, 21,  0,  0,  4,  4,  4,  4,  4,  4,  0,  0,
-     4,  4,  4,  4,  4,  4,  4,  4, 22,  4, 24, 25,  4, 26, 27, 28,
-     0,  0,  0, 29, 30,  0,  0,  0, 31, 32, 33,  4, 34,  0,  0,  0,
-     0,  0,  0,  0,  0, 35,  4, 36,  0,  0,  0,  0,  0,  0,  0,  0,
-     4, 37, 38,  4,  4,  4,  4, 39,  4, 40,  0,  0,  0,  0,  0,  0,
-     0,  0,  4, 41, 25,  0,  0,  0,  0, 42,  4,  4, 43,  4, 44, 45,
-     0,  0,  0,  0,  0,  0,  0,  0,  0, 46,  5, 47,  4,  4,  0,  0,
-     0,  0,  0,  0,  0,  0,  0,  0, 48,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  1,  0,  0,  0,  0,  0,
-     4,  4, 49,  0,  0, 46, 50, 51,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  4, 52,  4, 52,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  4,  4,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  4,  4,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     4,  4, 53,  4, 54, 55, 56,  4, 57, 58, 59,  4,  4,  4,  4,  4,
-     4,  4,  4,  4,  4, 60, 61,  5, 53, 53, 37, 37, 62, 62, 63,  0,
-     0,  0,  0,  0,  0,  0,  0,  0,  4,  4, 64,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0,  0,  0,  0, 46, 65, 65, 36,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  2,  2,  1,  1,  3,
+     3,  4,  1,  1,  1,  1,  1,  3,  2,  0,  1,  2, 11,  3,  3,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  2,  2,  3,  3,  0,  0,  0,  0,  3,  3,
+     3,  0,  2,  2,  2,  0,  0,  2,  2,  2,  2,  2,  2,  2,  0,  0,
+     0,  1,  1,  1,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  3,  2,  4,  1,  1,  2,  2,  2,  2,  2,  2,  3,  0,  2,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  2,  2,  2,  1,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  1,  3,  3,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  1,  3,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  2,  1,  1,  1,  1,  3,  3,  3,  7,  8,
+     5,  4,  4,  4,  5,  5,  1,  2,  2,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  0,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  0,  0,
+     1,  1,  3,  2,  2,  6,  6,  1,  1,  2,  2,  2,  0,  0,  0,  0,
+     2,  2,  3,  2,  2,  2,  2,  2,  2,  3,  1,  3,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     2,  2,  2,  2,  2, 10, 10, 10,  2,  2, 10,  2,  2,  2,  2,  2,
+     2,  0,  0,  0,  0,  0,  0,  0,  2,  2,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  1,  3,  4,  2,  1,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  4,  3,  2,  1,  1,  1,  3,  3,  3,  3,  0,
+     0,  2,  1,  2,  2,  1,  1,  1,  1,  3,  3,  1,  3,  2,  4,  4,
+     4,  4,  4,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  0,  0,  3,
+     1,  1,  1,  1,  2,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  1,  2,  1,  1,  3,  3,  3, 12,  9, 13,  4,  4,
+     5,  5,  1,  6,  2,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  3,  1,  1,  1,
+     1,  1,  1,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     1,  1,  2,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  2,  3,  3,  1,  3,  4,  2,  1,  1,  2,  0,  3,  3,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  1,  2,  1,  1,  2,  2,  2,  1,  2,  1,
+     1,  1,  2,  2,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  2,  2,  2,  4,  4,  7,  2,  2,  3,  1,  1,  1,
+     1,  1,  1,  1,  4,  4,  1,  3,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     1,  1,  1,  0, 14,  3,  3,  3,  3,  3,  1,  1,  3,  3,  3,  3,
+     1,  2, 14, 14, 14, 14, 14, 14, 14,  0,  0,  0,  0,  3,  0,  0,
+     0,  0,  0,  0,  1,  0,  0,  2,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  1,  0,  0,  0,  1,  0,  0,  0,  0,  1,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  2,  2,  3,  1,  2,  0,  0,  0,  0,  3,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     2,  2,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  3,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  3,  3,  3,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  3,  3,  3,  1,  3,  3,  3,  3,  1,
+     1,  1,  2,  2,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  1,  2,  2,  1,  1,  3,  3,  4,  4,  1,  3, 12, 15,
+    12,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  1,  1,  1,  3,  1,  4,
+     4,  1,  3,  2,  4,  3,  3,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  1,  0,  0,  0,  0,  0,  0,  0,  0,  1,  2,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  2,  1,  2,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     1,  2,  1,  1,  3, 10, 10,  1,  1, 10,  2, 10, 10,  2,  1,  1,
+     0,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  4,  3,  1,  4,  2,
+     0,  0,  0,  0,  0,  2,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  2,  2,  1,  2,  2,  3,  2,  2,  0,  2,  3,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0, 14,  3,  3,  0,  1, 14,  0,  0,  0,  0,  0,  3,  3,  3,  1,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  1,  3,  3,  0,  0,  0,  0,  0,
+     2,  1,  2,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  1,  1,  1,  1,  3,  3,  3,  3,
+     3,  3,  1,  1,  1,  1,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     2,  4,  2,  3,  3,  1,  1,  2,  2,  3,  3,  0,  0,  0,  0,  0,
+     1,  1,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  1,  1,  1,  3,  3,  4,  1,  9,  9,
+     1,  3,  3,  0,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  2,  2,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  3,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  2,  4,  2,  3,  3,  3,  3,  3,  3,  1,  1,  1,  6,
+     2,  0,  1,  1,  0,  0,  0,  0,  0,  3,  3,  1,  3,  0,  4,  1,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  2,  2,  2,  3,
+     1,  1,  6,  6,  1,  2,  1,  1,  0,  0,  0,  0,  0,  0,  1,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,
+     2,  4,  2,  3,  3,  1,  1,  1,  1,  3,  3,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  3,  3,  0,  2,  2,
+     1,  2,  2,  2,  2,  0,  0,  4,  4,  0,  0,  5,  5,  2,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  2,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  2,  2,  0,  0,  1,  1,  1,  1,  1,  1,  1,  0,  0,  0,
+     1,  1,  1,  1,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  2,  4,  2,  3,  3,  3,  3,  3,  3,  1,  1,
+     2,  2,  3,  1,  1,  2,  3,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     2,  4,  2,  3,  3,  3,  3,  3,  3,  4,  1,  7,  5,  2,  5,  1,
+     1,  2,  3,  3,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  2,
+     4,  2,  3,  3,  3,  3,  0,  0,  4,  7,  5,  8,  1,  1,  2,  3,
+     3,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  3,  3,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     2,  2,  2,  3,  3,  3,  3,  3,  3,  1,  1,  2,  2,  1,  2,  3,
+     1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  2,  1,  4,  2,
+     3,  3,  1,  1,  1,  1,  2,  3,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  3, 11,  1,
+     2,  2,  1,  1,  3,  3,  4,  1,  3,  1,  1,  1,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  2,  4,  2,  3,
+     3,  3,  3,  1,  1,  1,  1,  1,  2,  3,  3,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     2,  2,  2,  2,  2,  4,  0,  4,  5,  0,  0,  1,  1,  2,  0,  1,
+     2,  1, 12,  3,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  2,  4,  2,  3,  3,  3,  3,  0,  0,  1,  1,  2,  2,  2,  2,
+     3,  0,  0,  0,  4,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  1,  3,  3,  1,  1,  1,  1,  1,  1,  3,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  3,  3,  1,  1,  1,  1,  2,  1,  3,  3,  3,  3,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  1,  3,  3,  1,  1,  1,  2,  2,  3,  3,  3,  0,  0,  0,  0,
+     0,  0,  0,  0,  1,  1,  1,  1,  1,  1,  3,  3,  3,  3,  3,  3,
+     3,  3,  3,  3,  3,  3,  1,  2,  1,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  2,
+     1,  1,  3,  3,  3,  3,  3,  0,  1,  1,  1,  1,  1,  1,  2,  3,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+     3,  3,  3,  3,  3,  3,  3,  3,  0,  2,  3,  3,  3,  3,  3,  3,
+     3,  4,  3,  1,  2,  1,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  1,  1,  1,  1,  1,  3,  0,  0,  0,  1,  0,  1,  1,  0,  1,
+     1,  1,  3,  1,  3,  0,  2,  3,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  2,  2,  2,  2,  2,  0,
+     1,  1,  0,  2,  2,  1,  2,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  1,  3,  4,  2,  0,  0,  0,  0,  0,  0,  0,  0,  0
 };
 
-static RE_UINT8 re_cased_stage_4[] = {
-      0,   0,   0,   0, 254, 255, 255,   7,   0,   4,  32,   4, 255, 255, 127, 255,
-    255, 255, 255, 255, 255, 255, 255, 247, 240, 255, 255, 255, 255, 255, 239, 255,
-    255, 255, 255,   1,   3,   0,   0,   0,  31,   0,   0,   0,  32,   0,   0,   0,
-      0,   0, 207, 188,  64, 215, 255, 255, 251, 255, 255, 255, 255, 255, 191, 255,
-      3, 252, 255, 255, 255, 255, 254, 255, 255, 255, 127,   0, 255,   1,   0,   0,
-    191,  32, 255, 255, 255, 255, 255, 231, 255, 255,  63,  63, 255,   1, 255, 255,
-     63,  63, 255, 170, 255, 255, 255,  63, 255, 255, 223,  95, 220,  31, 207,  15,
-    255,  31, 220,  31,   0,   0,   2, 128,   0,   0, 255,  31, 132, 252,  47,  62,
-     80, 189,  31, 242, 224,  67,   0,   0,  24,   0,   0,   0,   0,   0, 192, 255,
-    255,   3,   0,   0, 255, 127, 255, 255, 255, 255, 255, 127,  31, 120,  12,   0,
-    191,  32,   0,   0, 255,  63,   0,   0, 252, 255, 255, 255, 255, 120, 255, 255,
-    124,   0,   0,   0,   0,   0,   0,   7,   0,   0, 255, 255, 255,   0, 255, 255,
-    127,   0, 248,   0, 255, 255,   0,   0, 255, 255,  15, 255, 255, 255, 255,  15,
-    255, 255,   7,   0, 255, 255, 223, 255, 255, 255, 255, 223, 100, 222, 255, 235,
-    239, 255, 255, 255, 191, 231, 223, 223, 255, 255, 255, 123,  95, 252, 253, 255,
-     63, 255, 255, 255, 253, 255, 255, 247, 255, 253, 255, 255, 247,  15,   0,   0,
-     15,   0,   0,   0, 255,   3, 255, 255,
-};
+RE_UINT32 re_get_indic_positional_category(RE_UINT32 codepoint) {
+    RE_UINT32 field_2;
+    RE_UINT32 field_1;
+    RE_UINT32 field_0;
+    RE_UINT32 v;
 
-/* Cased: 912 bytes. */
-
-RE_UINT32 re_get_cased(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-
-    f = ch >> 13;
-    code = ch ^ (f << 13);
-    pos = (RE_UINT32)re_cased_stage_1[f] << 4;
-    f = code >> 9;
-    code ^= f << 9;
-    pos = (RE_UINT32)re_cased_stage_2[pos + f] << 4;
-    f = code >> 5;
-    code ^= f << 5;
-    pos = (RE_UINT32)re_cased_stage_3[pos + f] << 5;
-    pos += code;
-    value = (re_cased_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1;
-
-    return value;
-}
+    field_2 = codepoint >> 10;
+    field_1 = (codepoint >> 5) & 0x1F;
+    field_0 = codepoint & 0x1F;
 
-/* Case_Ignorable. */
+    v = re_indic_positional_category_table_1[field_2];
+    v = re_indic_positional_category_table_2[(v << 5) | field_1];
+    v = re_indic_positional_category_table_3[(v << 5) | field_0];
 
-static RE_UINT8 re_case_ignorable_stage_1[] = {
-     0,  1,  2,  2,  2,  3,  2,  4,  5,  6,  2,  7,  2,  8,  9, 10,
-     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
-     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
-     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
-     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
-     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
-     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
-    11,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
-     2,  2,  2,  2,  2,  2,  2,  2,
-};
+    return v;
+}
 
-static RE_UINT8 re_case_ignorable_stage_2[] = {
-     0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15,
-    16,  1,  1, 17,  1,  1,  1, 18, 19, 20, 21, 22, 23, 24,  1, 25,
-    26,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1, 27, 28, 29,  1,
-    30,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+/* Indic_Syllabic_Category. */
+static RE_UINT8 re_indic_syllabic_category_table_1[] = {
+     0,  1,  2,  3,  4,  5,  6,  7,  8,  9,  1,  1,  1,  1,  1,  1,
      1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1, 10,  1,  1,  1,  1,  1,
      1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
-    31,  1,  1,  1, 32,  1, 33, 34, 35, 36, 37, 38,  1,  1,  1,  1,
+     1,  1, 11,  1, 12, 13, 14, 15,  1,  1,  1,  1,  1,  1,  1,  1,
      1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
      1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
-     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1, 39,  1,  1, 40, 41,
-     1, 42, 43, 44,  1,  1,  1,  1,  1,  1, 45,  1,  1, 46,  1, 47,
-    48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58,  1, 59, 60, 61,  1,
      1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
-     1,  1,  1,  1, 62,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
-     1,  1,  1,  1,  1,  1,  1,  1,  1,  1, 63, 64,  1,  1,  1, 65,
      1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
      1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
-     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1, 66,  1,  1,  1,
      1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
-     1, 67, 68,  1,  1,  1,  1,  1,  1,  1, 69,  1,  1,  1,  1,  1,
-    70, 71, 72,  1,  1,  1,  1,  1, 73, 74,  1,  1,  1,  1,  1,  1,
-     1,  1,  1, 75,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
-    76, 77,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
      1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1
 };
 
-static RE_UINT8 re_case_ignorable_stage_3[] = {
-      0,   1,   2,   3,   0,   4,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   5,   6,   6,   6,   6,   6,   7,   8,   0,   0,   0,
-      0,   0,   0,   0,   9,   0,   0,   0,   0,   0,  10,   0,  11,  12,  13,  14,
-     15,   0,  16,  17,   0,   0,  18,  19,  20,   5,  21,   0,   0,  22,   0,  23,
-     24,  25,  26,   0,   0,   0,  27,   6,  28,  29,  30,  31,  32,  33,  34,  35,
-     36,  33,  37,  38,  36,  33,  39,  40,  32,  41,  42,  43,  44,   0,  45,   0,
-     46,  47,  48,  43,  32,  41,  49,  43,  50,  51,  34,  43,   0,   0,  52,   0,
-      0,  53,  54,   0,   0,  55,  56,   0,  57,  58,   0,  59,  60,  61,  62,   0,
-      0,  63,  64,  65,  66,   0,   0,  33,   0,   0,  67,   0,   0,   0,   0,   0,
-     68,  68,  69,  69,   0,  70,  71,   0,  72,   0,  73,   0,  74,  75,   0,   0,
-      0,  76,   0,   0,   0,   0,   0,   0,  77,   0,  78,  79,   0,  80,   0,   0,
-     81,  82,  44,  83,  50,  84,   0,  85,   0,  86,   0,  87,   0,   0,  88,  89,
-      0,  90,   6,  91,  92,   6,   6,  93,   0,   0,   0,   0,   0,  94,  95,  96,
-     97,  98,   0,  99, 100,   0,   5, 101,   0,   0,   0, 102,   0,   0,   0, 103,
-      0,   0,   0, 104,   0,   0,   0,   6,   0, 105,   0,   0,   0,   0,   0,   0,
-    106, 107,   0,   0, 108,   0,   0, 109, 110,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,  87, 111,   0,   0, 112, 113,   0,   0, 114,
-      6,  50,   0,  17, 115,   0,   0,  57, 116,  74,   0,   0,   0,   0, 117, 118,
-      0, 119, 120,   0,  28, 121, 105,  74,   0, 122, 123, 124,   0, 125, 126, 127,
-      0,   0,  92,   0,   0,   0,   0, 128,   2,   0,   0,   0,   0, 129,  50,   0,
-    130, 131, 132,   0,   0,   0,   0, 133,   1,   2,   3,  17,  47,   0,   0, 134,
-      0,   0,   0,   0,   0,   0,   0, 135,   0,   0,   0,   0,   0,   0,   0,   3,
-      0,   0,   0, 136,   0,   0,   0,   0, 137, 138,   0,   0,   0,   0,   0,  74,
-      0, 139,   0,   0,   0,   0,   0,   0,   0,   0,  22,   0,   0,   0,   0,   0,
-     32, 140, 141, 133,  50, 142, 143,   0,  28, 144,   0, 145,  50, 146, 147,   0,
-      0, 148,   0,   0,   0,   0, 133, 149,  50,  51,   3, 150,   0,   0,   0,   0,
-      0, 140, 151,   0,   0, 152, 153,   0,   0,   0,   0,   0,   0, 154, 155,   0,
-      0, 156,   3,   0,   0, 157,   0,   0,  67, 158,   0,   0,   0,   0,   0,   0,
-      0, 159,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 160,   3,
-    161, 162, 163,   0, 164,   0,   0,   0,   0, 165,   0,   0, 129, 166,   0,   0,
-      0, 167, 168,   0, 169,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 170,
-      0, 171,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 172,
-      0, 173,  81,   0,   0,   0,   0,   0,   0,   0, 105,   0, 174,   0,   0, 175,
-      0,   0,   0,   0, 176,  81,   0,   0,   0,   0,   0, 177, 178, 179,   0,   0,
-      0,   0, 180,   0,   0,   0,   0,   0,   6, 181,   6, 182, 183, 184,   0,   0,
-    185, 186,   0,   0,   0,   0,   0,   0,   0, 187,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0, 188,   0,   0,   0,   0,   0,   0, 173,   0,
-      0,   0, 189,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  92,
-     32,   6,   6,   6,   0,   0,   0,   0,   6,   6,   6,   6,   6,   6,   6, 131,
-};
-
-static RE_UINT8 re_case_ignorable_stage_4[] = {
-      0,   0,   0,   0, 128,  64,   0,   4,   0,   0,   0,  64,   1,   0,   0,   0,
-      0, 161, 144,   1,   0,   0, 255, 255, 255, 255, 255, 255, 255, 255,  48,   4,
-    176,   0,   0,   0, 248,   3,   0,   0,   0,   0,   0,   2,   0,   0, 254, 255,
-    255, 255, 255, 191, 182,   0,   0,   0,   0,   0,  16,   0,  63,   0, 255,  23,
-      1, 248, 255, 255,   0,   0,   1,   0,   0,   0, 192, 191, 255,  61,   0,   0,
-      0, 128,   2,   0, 255,   7,   0,   0, 192, 255,   1,   0,   0, 248,  63,  36,
-      0,   0, 192, 255, 255,  63,   0,   0,   0,   0,   0,  14,   0,   0, 248, 255,
-      7,   0,   0,   0,   0,   0,   0,  20, 254,  33, 254,   0,  12,   0,   2,   0,
-      2,   0,   0,   0,   0,   0,   0,  16,  30,  32,   0,   0,  12,   0,   0,  64,
-      6,   0,   0,   0, 134,  57,   2,   0,   0,   0,  35,   0, 190,  33,   0,   0,
-     12,   0,   0, 252,   0,   0,   0, 144,  30,  32,  64,   0,  12,   0,   0,   0,
-      4,   0,   0,   0,   1,  32,   0,   0,  17,   0,   0,   0,   0,   0,   0, 192,
-    193,  61,  96,   0,  64,  48,   0,   0,   3,   0,   0,   0,   0,   0,   0,  24,
-      0,   4,  92,   0,   0,   0, 242,   7, 192, 127,   0,   0,   0,   0, 242,  31,
-     64,  63,   0,   0,   0,   0,   0,   3,   0,   0, 160,   2,   0,   0, 254, 127,
-    223, 224, 255, 254, 255, 255, 255,  31,  64,   0,   0,   0,   0, 224, 253, 102,
-      0,   0,   0, 195,   1,   0,  30,   0, 100,  32,   0,  32,   0,   0,   0, 224,
-      0,   0,  28,   0,   0,   0,  12,   0,   0,   0, 176,  63,  64, 254, 143,  32,
-      0, 120,   0,   0,   8,   0,   0,   0,  96,   0,   0,   0,   0,   2,   0,   0,
-    135,   1,   4,  14,   0,   0, 128,   9,   0,   0,  64, 127, 229,  31, 248, 159,
-    128,   0, 255, 127,  15,   0,   0,   0,   0,   0, 208,  23,   0, 248,  15,   0,
-     60,  59,   0,   0,  64, 163,   3,   0,   0, 240, 207,   0,   0,   0,   0,  63,
-      0,   0, 247, 255, 253,  33,  16,   3,   0, 240, 255, 255, 255,   7,   0,   1,
-      0,   0,   0, 248, 255, 255, 255, 251,   0,   0,   0, 160,   3, 224,   0, 224,
-      0, 224,   0,  96,   0, 248,   0,   3, 144, 124,   0,   0, 223, 255,   2, 128,
-      0,   0, 255,  31, 255, 255,   1,   0,   0,   0,   0,  48,   0, 128,   3,   0,
-      0, 128,   0, 128,   0, 128,   0,   0,  32,   0,   0,   0,   0,  60,  62,   8,
-      0,   0,   0, 126,   0,   0,   0, 112,   0,   0,  32,   0,   0,  16,   0,   0,
-      0, 128, 247, 191,   0,   0,   0, 240,   0,   0,   3,   0,   0,   7,   0,   0,
-     68,   8,   0,   0,  48,   0,   0,   0, 255, 255,   3, 128, 192,  63,   0,   0,
-    128, 255,   3,   0,   0,   0, 200,  51,   0, 126, 102,   0,   8,  16,   0,   0,
-      0,   0,   1,  16,   0,   0, 157, 193,   2,   0,   0,  32,   0,  48,  88,   0,
-     32,  33,   0,   0,   0,   0, 252, 255, 255, 255,   8,   0, 255, 255,   0,   0,
-      0,   0,  36,   0,   0,   0,   0, 128,   8,   0,   0,  14,   0,   0,   0,  32,
-      0,   0, 192,   7, 110, 240,   0,   0,   0,   0,   0, 135, 240,   0,   0,   0,
-      0,   0,   0, 255, 127,   0,   0,   0,   0,   0, 120,  38,   0,  32,   0,   0,
-    128, 239,  31,   0,   0,   0,   8,   0,   0,   0, 192, 127,   0,  30,   0,   0,
-      0, 128, 211,  64, 248,   7,   0,   0, 192,  31,  31,   0,  92,   0,   0,  64,
-      0,   0, 248, 133,  13,   0,   0,   0,   0,   0,  60, 176,   1,   0,   0,  48,
-      0,   0, 248, 167,   0,  40, 191,   0, 188,  15,   0,   0,   0, 128, 255,   6,
-      0,   0, 240,  12, 254,   7,   0,   0,   0,   0, 248, 121, 128,   0, 126,  14,
-      0, 252, 127,   3,   0,   0, 127, 191, 255, 252, 109,   0,   0,   0, 126, 180,
-    191,   0,   0,   0,   0,   0, 163,   0,   0,   0,  24,   0,   0,   0, 255,   1,
-      0,   0,  31,   0,   0,   0, 127,   0,   0, 128, 255, 255,  11,   0,   0,   0,
-      0,   0,   0,  96, 128,   3, 248, 255, 231,  15,   0,   0,   0,  60,   0,   0,
-     28,   0,   0,   0, 255, 255, 127, 248, 255,  31,  32,   0,  16,   0,   0, 248,
-    254, 255,   0,   0, 127, 255, 255, 249, 219,   7,   0,   0,   0,   0, 255,  63,
-      0, 240,   0,   0, 240,  15,   0,   0,
-};
-
-/* Case_Ignorable: 1904 bytes. */
-
-RE_UINT32 re_get_case_ignorable(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-
-    f = ch >> 13;
-    code = ch ^ (f << 13);
-    pos = (RE_UINT32)re_case_ignorable_stage_1[f] << 5;
-    f = code >> 8;
-    code ^= f << 8;
-    pos = (RE_UINT32)re_case_ignorable_stage_2[pos + f] << 3;
-    f = code >> 5;
-    code ^= f << 5;
-    pos = (RE_UINT32)re_case_ignorable_stage_3[pos + f] << 5;
-    pos += code;
-    value = (re_case_ignorable_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1;
-
-    return value;
-}
-
-/* Changes_When_Lowercased. */
-
-static RE_UINT8 re_changes_when_lowercased_stage_1[] = {
-    0, 1, 2, 2, 2, 3, 2, 4, 5, 2, 2, 6, 2, 2, 2, 7,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2,
-};
-
-static RE_UINT8 re_changes_when_lowercased_stage_2[] = {
-     0,  1,  2,  3,  3,  3,  3,  3,  4,  5,  3,  3,  3,  3,  6,  7,
-     8,  3,  9,  3,  3,  3, 10,  3,  3,  3,  3,  3,  3,  3,  3,  3,
-     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
-     3,  3,  3, 11,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
-     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3, 12,
-     3,  3, 13,  3,  3,  3, 14,  3,  3,  3,  3,  3, 15,  3,  3,  3,
-     3,  3,  3,  3,  3,  3,  3, 16,  3,  3,  3,  3,  3,  3,  3,  3,
-     3,  3,  3,  3, 17,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+static RE_UINT8 re_indic_syllabic_category_table_2[] = {
+      0,   1,   0,   0,   0,   2,   3,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   4,   5,   6,   7,   8,   9,  10,  11,
+     12,  13,  14,  15,  16,  17,  18,  19,  20,  17,  21,  22,  23,  24,  25,  26,
+     27,  28,  29,  30,  31,  32,  33,  34,  27,  35,  36,  37,  38,  39,  40,  41,
+     42,  43,  44,   0,  45,  46,  47,   0,   0,  48,  49,  50,  51,  52,  53,   0,
+     54,  55,  56,  57,  58,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,  59,  60,  61,  62,  54,  63,  64,  65,
+      0,   0,   0,   0,   0,   0,   0,   0,  66,  67,  68,  69,  54,  70,  71,   0,
+     72,  54,  73,  74,  75,   0,   0,   0,  76,  77,  78,   0,  79,  80,  54,  81,
+     54,  82,  83,   0,   0,   0,  84,  85,   0,   0,   0,   0,   0,   0,   0,  86,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     87,   0,   0,  88,  89,   0,   0,  90,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  91,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     92,  93,  94,  95,  96,  97,  98,  99, 100, 101, 102,   0, 103, 104, 105, 106,
+    107, 108, 109, 110,  54, 111, 112, 113,   0,   0,   0,   0,   0,   0, 114, 115,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    116, 117, 118,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    119, 120, 121, 122, 123, 124,   0,   0, 125, 126, 127, 128, 129, 130, 131, 132,
+    133, 134,   0,   0, 135, 136, 137, 138, 139, 140, 141, 142,   0,   0,   0,   0,
+    143, 144, 145, 146, 147, 148, 149,   0,   0,   0,   0,   0, 143, 150, 151,   0,
+    143, 152, 153,   0, 154, 155,  65,   0, 156, 157,   0,   0,   0,   0,   0,   0,
+    154, 158,   0,   0,   0,   0,   0,   0, 159, 160, 161,   0,   0, 162, 163, 164,
+    165, 166, 167,  54, 168,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    169, 170, 171, 172, 173, 174,   0,   0, 175, 176, 177, 178, 179,  65,   0,   0,
+      0,   0,   0,   0,   0,   0,   0, 180,   0,   0,   0,   0,   0,   0,   0,   0
 };
 
-static RE_UINT8 re_changes_when_lowercased_stage_3[] = {
-     0,  0,  1,  0,  0,  0,  2,  0,  3,  4,  5,  6,  7,  8,  9, 10,
-     3, 11, 12,  0,  0,  0,  0,  0,  0,  0,  0, 13, 14, 15, 16, 17,
-    18, 19,  0,  3, 20,  3, 21,  3,  3, 22, 23,  0,  0,  0,  0,  0,
+static RE_UINT8 re_indic_syllabic_category_table_3[] = {
      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0, 18, 24,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 18, 18, 25,
-     0,  0,  0,  0, 26, 27,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     3,  3,  3,  3, 28,  3,  3,  3, 29, 30, 31, 32, 30, 33, 34, 35,
-     0,  0,  0,  0,  0,  0,  0,  0,  0, 36,  0, 19, 37,  0,  0,  0,
-     0,  0,  0,  0,  0, 38, 19,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    18, 39,  0, 40,  3,  3,  3, 41,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  3, 42, 43,  0,  0,  0,  0, 44,  3, 45, 46, 47, 48,  0,
-     0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  0,  0,  0,  0,  0,  0,
-    18, 49,  0,  0,  0, 26, 50,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0, 18, 51,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0, 18,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0, 18,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0,  0,  0, 18, 52,  0,  0,  0,  0,  0,  0,
-};
-
-static RE_UINT8 re_changes_when_lowercased_stage_4[] = {
-      0,   0,   0,   0, 254, 255, 255,   7, 255, 255, 127, 127,  85,  85,  85,  85,
-     85,  85,  85, 170, 170,  84,  85,  85,  85,  85,  85,  43, 214, 206, 219, 177,
-    213, 210, 174,  17, 176, 173, 170,  74,  85,  85, 214,  85,  85,  85,   5, 108,
-    122,  85,   0,   0,   0,   0,  69, 128,  64, 215, 254, 255, 251,  15,   0,   0,
-      0, 128,   0,  85,  85,  85, 144, 230, 255, 255, 255, 255, 255, 255,   0,   0,
-      1,  84,  85,  85, 171,  42,  85,  85,  85,  85, 254, 255, 255, 255, 127,   0,
-    191,  32,   0,   0, 255, 255,  63,   0,   0,   0, 255, 255, 255, 255, 255, 231,
-     85,  85,  21,  64,   0, 255,   0,  63,   0, 255,   0, 255,   0,  63,   0, 170,
-      0, 255,   0,   0,   0, 255,   0,  31,   0,  31,   0,  15,   0,  31,   0,  31,
-     64,  12,   4,   0,   8,   0,   0,   0,   0,   0, 192, 255, 255, 127,   0,   0,
-    157, 234,  37, 192,   5,  40,   4,   0,  85,  21,   0,   0,  85,  85,  85,   5,
-     84,  85,  84,  85,  85,  85,   0, 106,  85,  40,  69,  85,  85, 125,  95,  85,
-    116,   0,   0,   0, 255,   0,   0,   0, 255, 255,  15,   0, 255, 255,   7,   0,
-      3,   0,   0,   0,
-};
-
-/* Changes_When_Lowercased: 764 bytes. */
-
-RE_UINT32 re_get_changes_when_lowercased(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-
-    f = ch >> 13;
-    code = ch ^ (f << 13);
-    pos = (RE_UINT32)re_changes_when_lowercased_stage_1[f] << 4;
-    f = code >> 9;
-    code ^= f << 9;
-    pos = (RE_UINT32)re_changes_when_lowercased_stage_2[pos + f] << 4;
-    f = code >> 5;
-    code ^= f << 5;
-    pos = (RE_UINT32)re_changes_when_lowercased_stage_3[pos + f] << 5;
-    pos += code;
-    value = (re_changes_when_lowercased_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1;
-
-    return value;
-}
-
-/* Changes_When_Uppercased. */
-
-static RE_UINT8 re_changes_when_uppercased_stage_1[] = {
-    0, 1, 2, 2, 2, 3, 2, 4, 5, 2, 2, 6, 2, 2, 2, 7,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  0,  0,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  0,  0,  0,  0,  0,  0,
+     1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  3,  3,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  1,  0,  0,  0,  0,  0,  0,  0,  0,
+     4,  4,  4,  5,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,
+     6,  6,  6,  6,  6,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  8,  8,  9, 10,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8, 11,  8,  8,
+     0, 12, 12,  0,  0,  8,  8,  8,  7,  7,  7,  7,  7,  7,  7,  7,
+     6,  6,  8,  8,  0,  0,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     0,  0,  6,  6,  6,  6,  6,  6,  7,  7,  7,  7,  7,  7,  7,  7,
+     1,  4,  4,  5,  0,  6,  6,  6,  6,  6,  6,  6,  6,  0,  0,  6,
+     6,  0,  0,  6,  6,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  0,  7,  7,  7,  7,  7,  7,
+     7,  0,  7,  0,  0,  0,  7,  7,  7,  7,  0,  0,  9, 10,  8,  8,
+     8,  8,  8,  8,  8,  0,  0,  8,  8,  0,  0,  8,  8, 11, 13,  0,
+     0,  0,  0,  0,  0,  0,  0,  8,  0,  0,  0,  0,  7,  7,  0,  7,
+     6,  6,  8,  8,  0,  0,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     7,  7,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  4,  0,  3,  0,
+     0,  4,  4,  5,  0,  6,  6,  6,  6,  6,  6,  0,  0,  0,  0,  6,
+     6,  0,  0,  6,  6,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  0,  7,  7,  7,  7,  7,  7,
+     7,  0,  7,  7,  0,  7,  7,  0,  7,  7,  0,  0,  9,  0,  8,  8,
+     8,  8,  8,  0,  0,  0,  0,  8,  8,  0,  0,  8,  8, 11,  0,  0,
+     0, 12,  0,  0,  0,  0,  0,  0,  0,  7,  7,  7,  7,  0,  7,  0,
+     0,  0,  0,  0,  0,  0,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     4, 14,  1,  1,  0, 15,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  4,  4,  5,  0,  6,  6,  6,  6,  6,  6,  6,  6,  6,  0,  6,
+     6,  6,  0,  6,  6,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  0,  7,  7,  7,  7,  7,  7,
+     7,  0,  7,  7,  0,  7,  7,  7,  7,  7,  0,  0,  9, 10,  8,  8,
+     8,  8,  8,  8,  8,  8,  0,  8,  8,  8,  0,  8,  8, 11,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     6,  6,  8,  8,  0,  0,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  7, 12, 12, 12,  9,  9,  9,
+     0,  4,  4,  5,  0,  6,  6,  6,  6,  6,  6,  6,  6,  0,  0,  6,
+     6,  0,  0,  6,  6,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     8,  8,  8,  8,  8,  0,  0,  8,  8,  0,  0,  8,  8, 11,  0,  0,
+     0,  0,  0,  0,  0,  8,  8,  8,  0,  0,  0,  0,  7,  7,  0,  7,
+     6,  6,  8,  8,  0,  0,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     0,  7,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  4, 16,  0,  6,  6,  6,  6,  6,  6,  0,  0,  0,  6,  6,
+     6,  0,  6,  6,  6,  7,  0,  0,  0,  7,  7,  0,  7,  0,  7,  7,
+     0,  0,  0,  7,  7,  0,  0,  0,  7,  7,  7,  0,  0,  0,  7,  7,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  0,  0,  0,  0,  8,  8,
+     8,  8,  8,  0,  0,  0,  8,  8,  8,  0,  8,  8,  8, 11,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  8,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     4,  4,  4,  5,  4,  6,  6,  6,  6,  6,  6,  6,  6,  0,  6,  6,
+     6,  0,  6,  6,  6,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  0,  7,  7,  7,  7,  7,  7,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  0,  0,  0, 10,  8,  8,
+     8,  8,  8,  8,  8,  0,  8,  8,  8,  0,  8,  8,  8, 11,  0,  0,
+     0,  0,  0,  0,  0,  8,  8,  0,  7,  7,  7,  0,  0,  0,  0,  0,
+     6,  6,  8,  8,  0,  0,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     4,  4,  4,  5,  0,  6,  6,  6,  6,  6,  6,  6,  6,  0,  6,  6,
+     6,  0,  6,  6,  6,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  0,  7,  7,  7,  7,  7,  7,
+     7,  7,  7,  7,  0,  7,  7,  7,  7,  7,  0,  0,  9, 10,  8,  8,
+     8,  8,  8,  8,  8,  0,  8,  8,  8,  0,  8,  8,  8, 11,  0,  0,
+     0,  0,  0,  0,  0,  8,  8,  0,  0,  0,  0,  0,  0,  0,  7,  0,
+     6,  6,  8,  8,  0,  0,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     0, 17, 17,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7, 18, 18, 10,  8,  8,
+     8,  8,  8,  8,  8,  0,  8,  8,  8,  0,  8,  8,  8, 11, 19,  0,
+     0,  0,  0,  0, 13, 13, 13,  8,  0,  0,  0,  0,  0,  0,  0,  6,
+     6,  6,  8,  8,  0,  0,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 13, 13, 13, 13, 13, 13,
+     0,  4,  4,  5,  0,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,
+     6,  6,  6,  6,  6,  6,  6,  0,  0,  0,  7,  7,  7,  7,  7,  7,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     7,  7,  0,  7,  7,  7,  7,  7,  7,  7,  7,  7,  0,  7,  0,  0,
+     7,  7,  7,  7,  7,  7,  7,  0,  0,  0, 11,  0,  0,  0,  0,  8,
+     8,  8,  8,  8,  8,  0,  8,  0,  8,  8,  8,  8,  8,  8,  8,  8,
+     0,  0,  0,  0,  0,  0,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     0,  0,  8,  8,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  0,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8, 18,  0,  0,  0,  0,  0,
+     8,  8,  8,  8,  8,  8,  0,  8, 20, 20, 20, 20, 21,  4, 18,  0,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  0,  0,  0,  0,  0,  0,
+     0,  7,  7,  0,  7,  0,  7,  7,  7,  7,  7,  0,  7,  7,  7,  7,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     7,  7,  7,  7,  0,  7,  0,  7,  7,  7,  7,  7,  7,  7,  7,  0,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8, 18,  8, 15, 15,  0,  0,
+     8,  8,  8,  8,  8,  0,  0,  0, 20, 20, 20, 20,  0,  4,  0,  0,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  0,  0,  7,  7,  7,  7,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  0,  3,  0,  3,  0,  9,  0,  0,  0,  0,  0,  0,
+     7,  7,  7,  7,  7,  7,  7,  7,  0,  7,  7,  7,  7,  7,  7,  7,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  0,  0,  0,
+     0,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  4,  5,
+     8,  8,  4,  4, 18, 10,  0,  0, 22, 22, 22, 22, 22, 23, 23, 23,
+    23, 23, 23, 23, 23, 23, 23, 23,  0, 23, 23, 23, 23, 23, 23, 23,
+    23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
+    23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  3,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     7,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  4, 20,  5, 24, 18, 15, 15, 15, 15,  7,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  0,  1,  0,  0,  1,  0,
+     7,  7,  6,  6,  6,  6,  8,  8,  8,  8,  7,  7,  7,  7, 15, 15,
+    15,  7,  8, 20, 20,  7,  7,  8,  8, 20, 20, 20, 20, 20,  7,  7,
+     7,  8,  8,  8,  8,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     7,  7, 15,  8,  8,  8,  8, 20, 20, 20, 20, 20, 20, 20,  7, 20,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2, 20, 20,  8,  8,  0,  0,
+     6,  6,  6,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  0,  7,  7,
+     7,  7,  8,  8, 18,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     6,  6,  6,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     7,  7,  8,  8, 18,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     6,  6,  6,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     7,  7,  8,  8,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     6,  6,  6,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  0,  7,  7,
+     7,  0,  8,  8,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     7,  7,  7,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,
+     6,  6,  6,  6,  0,  0,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  4,  5,  8, 25, 25,  3, 26, 21,  3,  3,
+     3, 18, 24,  3,  0,  0,  0,  0,  0,  0,  0,  0, 10,  3,  0,  0,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     1,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  0,
+     8,  8,  8,  8,  8,  8,  8,  8,  8, 23, 23, 23,  0,  0,  0,  0,
+    27, 27,  4, 27, 27, 27, 27, 27, 27, 27,  8,  3,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     7,  7,  7, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,  0,  0,
+    29, 29, 29, 29, 29,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  0,  0,  0,  0,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8, 27, 27, 27, 27, 27, 27, 27, 20, 20,  0,  0,  0,  0,  0,  0,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  0,  0,  0,  0,  0,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     7,  7,  7,  7,  7,  7,  7,  8,  8,  8,  8,  8,  0,  0,  0,  0,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  6,  6,  6,
+     6,  6,  6,  7,  7, 15, 15, 23, 27, 27, 30, 23, 23, 23, 23,  0,
+    24,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  4, 20, 20, 20, 20, 20, 18,  3,  3,  0,  0,  3,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  0,  0,  0,  0,  0,  0,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  0,  0,  0,  0,  0,  0,
+     4,  4,  4, 26,  5,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,
+     6,  6,  6,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     7,  7,  7,  7,  9,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8, 11,  7,  7,  7,  7,  7,  7,  7,  0,  0,  0,  0,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  0,  0,  0,  0,  0,  0,
+     4, 26,  5,  6,  6,  6,  6,  6,  6,  6,  7,  7,  7,  7,  7,  7,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     7, 23, 23, 23,  8,  8,  8,  8,  8,  8, 18, 24, 23, 23,  7,  7,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2, 10,  7,  7,  7, 27, 27,
+     7,  7,  7,  7,  6,  6,  9,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+    27, 27, 18, 18,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     7,  7,  7,  7, 23, 23,  8,  8,  8,  8,  8,  8,  8, 27, 27, 27,
+    27, 27, 27, 27,  4,  4,  3,  9,  0,  0,  0,  0,  0,  0,  0,  0,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  0,  0,  0,  7,  7,  7,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    12, 12, 12,  0, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+    12, 12,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0, 13, 13, 12, 17, 17, 12, 12, 12,  1,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  3,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 31, 32,  0,  0,
+     1,  1,  1,  1,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  3,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  3,  3,  3,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    12,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     6,  6,  8,  6,  6,  6, 11,  7,  7,  7,  7,  4,  7,  7,  7,  7,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     7,  7,  7,  8,  8,  8,  8,  8,  0,  0,  0,  0, 18,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7, 28, 28,
+    28, 28,  7,  7,  7,  7, 28, 23, 23,  7,  7,  7,  7,  7,  7,  7,
+     7, 23,  7,  4,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     4,  5,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,
+     6,  6,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     7,  7,  7,  7, 15,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8, 11,  4,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  0,  0,  0,  0,  0,  0,
+    12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+    12, 12,  4,  4,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  6,  8,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  7,  7,  7,  7,  7,  7,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     7,  7, 28, 28, 28, 28, 28, 28, 28, 28, 28, 20, 20, 20,  0,  0,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     7,  7,  7,  7,  7,  7,  7,  8,  8,  8,  8,  8,  8,  8,  8, 27,
+    27, 27, 27, 18,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     4,  4, 26,  5,  6,  6,  6,  6,  6,  7,  7,  7,  6,  6,  6,  7,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     7,  7,  7,  9,  8,  8,  8,  8,  8,  8,  8,  8,  8, 15, 15, 15,
+    11,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  0,  0,  0,  0,  0,  0,
+     7,  7,  7,  7,  7,  8,  0,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  7,  7,  7,  7,  7,  0,
+     6,  6,  6,  6,  6,  6,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8, 15, 15, 15, 15,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,  0,  0,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  0,  0,  0,  0,  0,  0,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     0,  7,  7,  7,  1,  1,  1,  0,  0,  0,  7, 20, 20, 20,  7,  7,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8, 20,
+    29, 20, 29,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     6,  6,  7,  7,  7,  7,  7,  7,  7,  7,  7,  8,  8,  8,  8,  8,
+     0,  0,  0,  0,  0,  5, 24,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  6,  6,
+     7,  6,  7,  7,  7,  7,  7,  7,  7,  7,  7, 27, 27, 27, 27, 27,
+    27, 27, 27,  8,  8,  8,  8,  8,  8,  8,  8,  0, 20, 18,  0,  0,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  0,  0,  0,  0,  0,  0,
+     7,  8,  8,  8,  0,  8,  8,  0,  0,  0,  0,  0,  8,  8,  4,  5,
+     7,  7,  7,  7,  0,  7,  7,  7,  0,  7,  7,  7,  7,  7,  7,  7,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     7,  7,  7,  7,  7,  7,  0,  0,  9,  9,  9,  0,  0,  0,  0, 24,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     4,  4,  5, 17, 17,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,
+     6,  6,  6,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     7,  7,  7,  7,  7,  7,  7,  7,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8, 11,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33,
+    33, 33, 33, 33, 33, 33,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 34,
+     4,  4,  5,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  7,  7,  7,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     8,  8,  8,  8,  8,  8,  8,  8,  8, 11,  9,  0,  0,  0,  0,  0,
+     4,  4,  5,  6,  6,  6,  6,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     7,  7,  7,  7,  7,  7,  7,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8, 24, 18,  0,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     0,  0,  0,  0,  7,  8,  8,  7,  0,  0,  0,  0,  0,  0,  0,  0,
+    28, 28, 28, 28, 28,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     7,  7,  7,  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     4,  4,  5,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,
+     6,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     7,  7,  7,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+    11, 10, 35, 35,  0,  0,  0,  0,  0,  3,  9,  8,  8,  0,  8,  4,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  0,  0,  0,  0,  0,  0,
+     0,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     6,  6,  6,  6,  6,  6,  6,  6,  7,  7,  7,  7,  7,  7,  7,  7,
+     7,  7,  0,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  8,  8,  8,  8,
+     8,  8,  8,  8,  4, 11,  9, 14,  0,  0,  0,  0,  0,  0, 12,  0,
+     6,  6,  6,  6,  7,  7,  7,  0,  7,  0,  7,  7,  7,  7,  0,  7,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  0,  7,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  0,  0,  0,  0,  0,  0,  0,
+     6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  7,  7,  7,  7,  7,  7,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  4,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  9, 18,  0,  0,  0,  0,  0,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  0,  0,  0,  0,  0,  0,
+     4,  4,  4,  5,  0,  6,  6,  6,  6,  6,  6,  6,  6,  0,  0,  6,
+     6,  0,  0,  6,  6,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  0,  7,  7,  7,  7,  7,  7,
+     7,  0,  7,  7,  0,  7,  7,  7,  7,  7,  0,  9,  9, 10,  8,  8,
+     8,  8,  8,  8,  8,  0,  0,  8,  8,  0,  0,  8,  8, 11,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  8,  0,  0,  0,  0,  0,  0,  4,  4,
+     6,  6,  8,  8,  0,  0, 12, 12, 12, 12, 12, 12, 12,  0,  0,  0,
+    12, 12, 12, 12, 12,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  7,  7,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     7,  7,  7,  7,  7,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8, 11,  4,  4,  5,  9, 10,  0,  0,  0,  0,  0,  0,  0,  0,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  0,  0,  0,  0,  3,  4,
+    17, 17,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  7,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  4,
+     4,  5, 11,  9, 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  0,  0,  0,  0,  0,  0,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  8,
+     8,  8,  8,  8,  8,  8,  0,  0,  8,  8,  8,  8,  4,  4,  5, 11,
+     9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  6,  6,  6,  6,  8,  8,  0,  0,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  4,  5, 11,
+     8,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  0,  0,  0,  0,  0,  0,
+     6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  7,  7,  7,  7,  7,  7,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  4,  5,  8,  8,  8,
+     8,  8,  8,  8,  8,  8, 11,  9,  7,  0,  0,  0,  0,  0,  0,  0,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  0,  0, 15, 15, 15,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8, 18,  0,  0,  0,  0,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  0,  0,  0,  0,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  4,  5, 11,  9,  0,  0,  0,  0,  0,
+     6,  6,  6,  6,  6,  6,  6,  0,  0,  6,  0,  0,  7,  7,  7,  7,
+     7,  7,  7,  7,  0,  7,  7,  0,  7,  7,  7,  7,  7,  7,  7,  7,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     8,  8,  8,  8,  8,  8,  0,  8,  8,  0,  0,  4,  4, 18, 24, 35,
+    15, 19, 15,  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  0,  0,  0,  0,  0,  0,
+     6,  6,  6,  6,  6,  6,  6,  6,  0,  0,  6,  6,  6,  6,  7,  7,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     7,  8,  8,  8,  8,  8,  8,  8,  0,  0,  8,  8,  8,  8,  4,  5,
+    11, 10,  0,  0,  8,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     6,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  7,  7,  7,  7,  7,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     7,  7,  7,  3, 18,  4,  4,  4,  4,  5, 35, 15, 15, 15, 15,  1,
+     0,  0,  0,  0,  0,  1,  0, 24,  0,  0,  0,  0,  0,  0,  0,  0,
+     6,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  7,  7,  7,  7,
+     7,  7,  7,  7, 35, 35, 35, 35, 35, 35, 27, 27, 27, 27, 27, 27,
+    27, 27, 27, 27, 27, 27,  4,  5, 14, 24,  0,  0,  0, 10,  0,  0,
+     6,  6,  6,  6,  6,  6,  6,  6,  6,  0,  6,  6,  6,  6,  7,  7,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  8,
+     8,  8,  8,  8,  8,  8,  8,  0,  8,  8,  8,  8,  4,  4,  5, 11,
+    10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  0,  0,  0,
+     0,  0,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     0,  0, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
+    23, 23, 23, 23, 23, 23, 23, 23,  0, 23, 23, 23, 23, 23, 23, 23,
+     8,  8,  8,  8,  8,  4,  4,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     6,  6,  6,  6,  6,  6,  6,  0,  6,  6,  0,  6,  7,  7,  7,  7,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     7,  8,  8,  8,  8,  8,  8,  0,  0,  0,  8,  0,  8,  8,  0,  8,
+     4,  5,  9,  8, 18, 24, 19, 15,  0,  0,  0,  0,  0,  0,  0,  0,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  0,  0,  0,  0,  0,  0,
+     6,  6,  6,  6,  6,  6,  0,  6,  6,  0,  6,  6,  7,  7,  7,  7,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  8,  8,  8,  8,  8,  0,
+     8,  8,  0,  8,  8,  4,  5, 24,  0,  0,  0,  0,  0,  0,  0,  0,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     7,  7,  1,  8,  8,  8,  8,  0,  0,  0,  0,  0,  0,  0,  0,  0
 };
 
-static RE_UINT8 re_changes_when_uppercased_stage_2[] = {
-     0,  1,  2,  3,  3,  3,  3,  3,  4,  5,  3,  3,  3,  3,  6,  7,
-     8,  3,  9,  3,  3,  3, 10,  3,  3,  3,  3,  3,  3,  3,  3,  3,
-     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
-     3,  3,  3, 11,  3, 12,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
-     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3, 13,  3, 14,
-     3,  3, 15,  3,  3,  3, 16,  3,  3,  3,  3,  3, 17,  3,  3,  3,
-     3,  3,  3,  3,  3,  3,  3, 18,  3,  3,  3,  3,  3,  3,  3,  3,
-     3,  3,  3,  3, 19,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
-};
+RE_UINT32 re_get_indic_syllabic_category(RE_UINT32 codepoint) {
+    RE_UINT32 field_2;
+    RE_UINT32 field_1;
+    RE_UINT32 field_0;
+    RE_UINT32 v;
 
-static RE_UINT8 re_changes_when_uppercased_stage_3[] = {
-     0,  0,  0,  1,  0,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12,
-     5, 13, 14, 15, 16,  0,  0,  0,  0,  0, 17, 18, 19, 20, 21, 22,
-     0, 23, 24,  5, 25,  5, 26,  5,  5, 27,  0, 28, 29,  0,  0,  0,
-     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0, 23, 30,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 31,
-     0,  0,  0,  0, 32,  0,  0,  0,  0,  0,  0, 33, 34,  0,  0,  0,
-     5,  5,  5,  5, 35,  5,  5,  5, 36, 37, 38, 39, 24, 40, 41, 42,
-     0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 34, 23, 43,  0,  0,  0,
-     0,  0,  0,  0,  0,  0, 23, 44,  0,  0,  0,  0,  0,  0,  0,  0,
-     0, 23, 45, 46,  5,  5,  5, 47, 24, 48,  0,  0,  0,  0,  0,  0,
-     0,  0,  5, 49, 50,  0,  0,  0,  0, 51,  5, 52, 53, 54, 55,  0,
-     0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 56, 23, 24, 24,  0,  0,
-     0,  0,  0,  0,  0,  0,  0,  0, 57,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  0,  0,  0,  0,  0,
-     0, 58, 59,  0,  0,  0, 60, 61,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0, 24, 62,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0, 24,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0, 24,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0,  0,  0,  0, 63, 64,  0,  0,  0,  0,  0,
-};
+    field_2 = codepoint >> 10;
+    field_1 = (codepoint >> 5) & 0x1F;
+    field_0 = codepoint & 0x1F;
 
-static RE_UINT8 re_changes_when_uppercased_stage_4[] = {
-      0,   0,   0,   0, 254, 255, 255,   7,   0,   0,  32,   0,   0,   0,   0, 128,
-    255, 255, 127, 255, 170, 170, 170, 170, 170, 170, 170,  84,  85, 171, 170, 170,
-    170, 170, 170, 212,  41,  17,  36,  70,  42,  33,  81, 162,  96,  91,  85, 181,
-    170, 170,  45, 170, 168, 170,  10, 144, 133, 170, 223,  26, 107, 159,  38,  32,
-    141,  31,   4,  96,  32,   0,   0,   0,   0,   0, 138,  56,   0,   0,   1,   0,
-      0, 240, 255, 255, 255, 127, 227, 170, 170, 170,  47,   9,   0,   0, 255, 255,
-    255, 255, 255, 255,   2, 168, 170, 170,  84, 213, 170, 170, 170, 170,   0,   0,
-    254, 255, 255, 255, 255,   0,   0,   0, 255, 255, 255, 231,   0,   0,   0,  63,
-    255,   1,   0,   0,   0,   0,   0,  34,   0,  64,   0,   0, 170, 170, 234,  15,
-    255,   0,  63,   0, 255,   0, 255,   0,  63,   0, 255,   0, 255,   0, 255,  63,
-    255, 255, 223,  80, 220,  16, 207,   0, 255,   0, 220,  16,  16,   0,   0,   0,
-    255,   3,   0,   0, 255, 255, 255, 127,  98,  21,  72,   0,  10,  80,   8,   0,
-    191,  32,   0,   0, 170,  42,   0,   0, 170, 170, 170,  10, 168, 170, 168, 170,
-    170, 170,   0, 148, 170,  16, 154, 170, 170,   2, 160, 170,   8,   0,   0,   0,
-      0,   0,   8,   0, 127,   0, 248,   0,   0, 255, 255, 255, 255, 255,   0,   0,
-      0,   0,   0, 255, 255, 255, 255,  15, 255, 255,   7,   0, 252, 255, 255, 255,
-     15,   0,   0,   0,
-};
+    v = re_indic_syllabic_category_table_1[field_2];
+    v = re_indic_syllabic_category_table_2[(v << 5) | field_1];
+    v = re_indic_syllabic_category_table_3[(v << 5) | field_0];
 
-/* Changes_When_Uppercased: 844 bytes. */
-
-RE_UINT32 re_get_changes_when_uppercased(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-
-    f = ch >> 13;
-    code = ch ^ (f << 13);
-    pos = (RE_UINT32)re_changes_when_uppercased_stage_1[f] << 4;
-    f = code >> 9;
-    code ^= f << 9;
-    pos = (RE_UINT32)re_changes_when_uppercased_stage_2[pos + f] << 4;
-    f = code >> 5;
-    code ^= f << 5;
-    pos = (RE_UINT32)re_changes_when_uppercased_stage_3[pos + f] << 5;
-    pos += code;
-    value = (re_changes_when_uppercased_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1;
-
-    return value;
+    return v;
 }
 
-/* Changes_When_Titlecased. */
-
-static RE_UINT8 re_changes_when_titlecased_stage_1[] = {
-    0, 1, 2, 2, 2, 3, 2, 4, 5, 2, 2, 6, 2, 2, 2, 7,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2,
-};
+/* Join_Control. */
+RE_UINT32 re_get_join_control(RE_UINT32 codepoint) {
+    if (0x200C <= codepoint && codepoint <= 0x200D)
+        return 1;
 
-static RE_UINT8 re_changes_when_titlecased_stage_2[] = {
-     0,  1,  2,  3,  3,  3,  3,  3,  3,  4,  3,  3,  3,  3,  5,  6,
-     7,  3,  8,  3,  3,  3,  9,  3,  3,  3,  3,  3,  3,  3,  3,  3,
-     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
-     3,  3,  3, 10,  3, 11,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
-     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3, 12,  3, 13,
-     3,  3, 14,  3,  3,  3, 15,  3,  3,  3,  3,  3, 16,  3,  3,  3,
-     3,  3,  3,  3,  3,  3,  3, 17,  3,  3,  3,  3,  3,  3,  3,  3,
-     3,  3,  3,  3, 18,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
-};
+    return 0;
+}
 
-static RE_UINT8 re_changes_when_titlecased_stage_3[] = {
-     0,  0,  0,  1,  0,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12,
-     5, 13, 14, 15, 16,  0,  0,  0,  0,  0, 17, 18, 19, 20, 21, 22,
-     0, 23, 24,  5, 25,  5, 26,  5,  5, 27,  0, 28, 29,  0,  0,  0,
+/* Joining_Group. */
+static RE_UINT8 re_joining_group_table_1[] = {
+    0, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 3, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+};
+
+static RE_UINT8 re_joining_group_table_2[] = {
      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 30,
-     0,  0,  0,  0, 31,  0,  0,  0,  0,  0,  0, 32, 33,  0,  0,  0,
-     5,  5,  5,  5, 34,  5,  5,  5, 35, 36, 37, 38, 36, 39, 40, 41,
-     0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 33, 23, 42,  0,  0,  0,
-     0,  0,  0,  0,  0,  0, 23, 43,  0,  0,  0,  0,  0,  0,  0,  0,
-     0, 23, 44, 45,  5,  5,  5, 46, 24, 47,  0,  0,  0,  0,  0,  0,
-     0,  0,  5, 48, 49,  0,  0,  0,  0, 50,  5, 51, 52, 53, 54,  0,
-     0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 55, 23, 24, 24,  0,  0,
-     0,  0,  0,  0,  0,  0,  0,  0, 56,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  0,  0,  0,  0,  0,
-     0, 57, 58,  0,  0,  0, 59, 60,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0, 24, 61,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0, 24,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0, 24,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0,  0,  0,  0, 62, 63,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11,  0,  0,  0,  0,
+     0,  0,  0, 12,  0, 13, 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0, 15, 16,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0, 17, 18,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0
 };
 
-static RE_UINT8 re_changes_when_titlecased_stage_4[] = {
-      0,   0,   0,   0, 254, 255, 255,   7,   0,   0,  32,   0,   0,   0,   0, 128,
-    255, 255, 127, 255, 170, 170, 170, 170, 170, 170, 170,  84,  85, 171, 170, 170,
-    170, 170, 170, 212,  41,  17,  36,  70,  42,  33,  81, 162, 208,  86,  85, 181,
-    170, 170,  43, 170, 168, 170,  10, 144, 133, 170, 223,  26, 107, 159,  38,  32,
-    141,  31,   4,  96,  32,   0,   0,   0,   0,   0, 138,  56,   0,   0,   1,   0,
-      0, 240, 255, 255, 255, 127, 227, 170, 170, 170,  47,   9,   0,   0, 255, 255,
-    255, 255, 255, 255,   2, 168, 170, 170,  84, 213, 170, 170, 170, 170,   0,   0,
-    254, 255, 255, 255, 255,   0,   0,   0,   0,   0,   0,  63, 255,   1,   0,   0,
-      0,   0,   0,  34,   0,  64,   0,   0, 170, 170, 234,  15, 255,   0,  63,   0,
-    255,   0, 255,   0,  63,   0, 255,   0, 255,   0, 255,  63, 255,   0, 223,  64,
-    220,   0, 207,   0, 255,   0, 220,   0,  16,   0,   0,   0, 255,   3,   0,   0,
-    255, 255, 255, 127,  98,  21,  72,   0,  10,  80,   8,   0, 191,  32,   0,   0,
-    170,  42,   0,   0, 170, 170, 170,  10, 168, 170, 168, 170, 170, 170,   0, 148,
-    170,  16, 154, 170, 170,   2, 160, 170,   8,   0,   0,   0,   0,   0,   8,   0,
-    127,   0, 248,   0,   0, 255, 255, 255, 255, 255,   0,   0,   0,   0,   0, 255,
-    255, 255, 255,  15, 255, 255,   7,   0, 252, 255, 255, 255,  15,   0,   0,   0,
+static RE_UINT8 re_joining_group_table_3[] = {
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      1,   0,   2,   2,   3,   2,   1,   2,   4,   5,   4,   4,   6,   6,   6,   7,
+      7,   8,   8,   9,   9,  10,  10,  11,  11,  12,  12,  13,  13,  14,  14,  14,
+      0,  15,  16,  17,  18,  19,  20,  21,   3,   1,   1,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   4,  16,
+      0,   2,   2,   2,   0,   2,   3,   3,   1,   4,   4,   4,   4,   4,   4,   4,
+      4,   6,   6,   6,   6,   6,   6,   6,   7,   7,   7,   7,   7,   7,   7,   7,
+      7,   8,   8,   8,   8,   8,   8,   8,   8,   8,   9,   9,   9,  10,  10,  11,
+     12,  15,  15,  15,  15,  15,  15,  16,  16,  13,  22,  13,  17,  17,  17,  13,
+     13,  13,  13,  13,  13,  18,  18,  18,  18,  20,  20,  20,  20,  23,  24,   6,
+      5,  25,  25,  26,   3,   3,   3,   3,   3,   3,   3,   3,  14,  27,  14,   3,
+      1,   1,  28,  28,   0,   5,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   7,   8,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   9,  10,  12,   0,   0,  24,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     29,   0,  30,  31,  31,  32,  32,  33,  34,  35,  36,  37,  37,  38,  39,  40,
+     41,  42,  43,  44,  45,  46,  47,  48,  49,  50,  32,  51,  52,  30,  31,  32,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  53,  54,  55,
+      4,   4,   4,   4,   4,   4,   4,   6,   6,   7,   7,   8,   9,  12,  12,  12,
+     15,  15,  13,  13,  13,  19,  19,  20,  20,  20,  18,   8,   8,   9,   6,   6,
+      9,   8,   6,   2,   2,  14,  14,   1,   3,   3,  56,  56,   6,   9,   9,  17,
+     57,  58,  59,  60,  61,  62,  63,  64,  65,  66,  67,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      4,   4,   6,  11,  15,  16,  18,  19,   1,   1,   8,   3,  68,   0,   7,  10,
+     13,  69,   8,  12,  17,   0,   4,   4,   4,   8,   1,  70,  71,  72,   4,   4,
+      4,   6,  13,  12,  71,   6,   6,  18,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     73,  74,  74,  75,  75,  76,   0,  77,   0,  78,  78,   0,   0,  79,  80,  81,
+     82,  82,  82,  83,  84,  85,  86,  87,  88,  89,  89,  90,  90,  91,  92,  92,
+     92,  93,   0,   0,  94,   0,   0,   0,   0,   0,   0,  95,  96,  97,  98,  99,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0, 100,   0,   0,   0,   0,   0,   0, 100,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0, 101,   0,   0, 100,   0, 101,   0,
+    101,   0,   0, 101,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0
 };
 
-/* Changes_When_Titlecased: 824 bytes. */
-
-RE_UINT32 re_get_changes_when_titlecased(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-
-    f = ch >> 13;
-    code = ch ^ (f << 13);
-    pos = (RE_UINT32)re_changes_when_titlecased_stage_1[f] << 4;
-    f = code >> 9;
-    code ^= f << 9;
-    pos = (RE_UINT32)re_changes_when_titlecased_stage_2[pos + f] << 4;
-    f = code >> 5;
-    code ^= f << 5;
-    pos = (RE_UINT32)re_changes_when_titlecased_stage_3[pos + f] << 5;
-    pos += code;
-    value = (re_changes_when_titlecased_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1;
-
-    return value;
-}
+RE_UINT32 re_get_joining_group(RE_UINT32 codepoint) {
+    RE_UINT32 field_2;
+    RE_UINT32 field_1;
+    RE_UINT32 field_0;
+    RE_UINT32 v;
 
-/* Changes_When_Casefolded. */
+    field_2 = codepoint >> 10;
+    field_1 = (codepoint >> 5) & 0x1F;
+    field_0 = codepoint & 0x1F;
 
-static RE_UINT8 re_changes_when_casefolded_stage_1[] = {
-    0, 1, 2, 2, 2, 3, 2, 4, 5, 2, 2, 6, 2, 2, 2, 7,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2,
-};
+    v = re_joining_group_table_1[field_2];
+    v = re_joining_group_table_2[(v << 5) | field_1];
+    v = re_joining_group_table_3[(v << 5) | field_0];
 
-static RE_UINT8 re_changes_when_casefolded_stage_2[] = {
-     0,  1,  2,  3,  3,  3,  3,  3,  4,  5,  3,  3,  3,  3,  6,  7,
-     8,  3,  9,  3,  3,  3, 10,  3,  3,  3,  3,  3,  3,  3,  3,  3,
-     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
-     3,  3,  3, 11,  3, 12,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
-     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3, 13,  3, 14,
-     3,  3, 15,  3,  3,  3, 16,  3,  3,  3,  3,  3, 17,  3,  3,  3,
-     3,  3,  3,  3,  3,  3,  3, 18,  3,  3,  3,  3,  3,  3,  3,  3,
-     3,  3,  3,  3, 19,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
-};
+    return v;
+}
 
-static RE_UINT8 re_changes_when_casefolded_stage_3[] = {
-     0,  0,  1,  0,  0,  2,  3,  0,  4,  5,  6,  7,  8,  9, 10, 11,
-     4, 12, 13,  0,  0,  0,  0,  0,  0,  0, 14, 15, 16, 17, 18, 19,
-    20, 21,  0,  4, 22,  4, 23,  4,  4, 24, 25,  0, 26,  0,  0,  0,
-     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0, 20, 27,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 28,
-     0,  0,  0,  0, 29, 30,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     4,  4,  4,  4, 31,  4,  4,  4, 32, 33, 34, 35, 20, 36, 37, 38,
-     0,  0,  0,  0,  0,  0,  0,  0,  0, 39,  0, 21, 40,  0,  0,  0,
-     0,  0,  0,  0,  0, 41, 21,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    20, 42,  0, 43,  4,  4,  4, 44,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  4, 45, 46,  0,  0,  0,  0, 47,  4, 48, 49, 50, 51,  0,
-     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 52, 20, 20,  0,  0,
-     0,  0,  0,  0,  0,  0,  0,  0, 53,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  0,  0,  0,  0,  0,  0,
-    20, 54,  0,  0,  0, 52, 55,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0, 20, 56,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0, 20,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0, 20,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0,  0,  0, 20, 57,  0,  0,  0,  0,  0,  0,
+/* Joining_Type. */
+static RE_UINT8 re_joining_type_table_1[] = {
+     0,  1,  2,  3,  4,  5,  6,  7,  8,  9,  9, 10, 11,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9, 12, 13,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9, 14, 15,
+    16,  9, 17, 18, 19, 20, 21, 22,  9,  9,  9,  9,  9, 23,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9, 24, 25,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9, 26,
+     9,  9,  9,  9, 27,  9, 28,  9, 29,  9, 30,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+    31,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9
 };
 
-static RE_UINT8 re_changes_when_casefolded_stage_4[] = {
-      0,   0,   0,   0, 254, 255, 255,   7,   0,   0,  32,   0, 255, 255, 127, 255,
-     85,  85,  85,  85,  85,  85,  85, 170, 170,  86,  85,  85,  85,  85,  85, 171,
-    214, 206, 219, 177, 213, 210, 174,  17, 176, 173, 170,  74,  85,  85, 214,  85,
-     85,  85,   5, 108, 122,  85,   0,   0,  32,   0,   0,   0,   0,   0,  69, 128,
-     64, 215, 254, 255, 251,  15,   0,   0,   4, 128,  99,  85,  85,  85, 179, 230,
-    255, 255, 255, 255, 255, 255,   0,   0,   1,  84,  85,  85, 171,  42,  85,  85,
-     85,  85, 254, 255, 255, 255, 127,   0, 128,   0,   0,   0, 191,  32,   0,   0,
-      0,   0,   0,  63, 255,   1, 255, 255, 255, 255, 255, 231,  85,  85,  21,  76,
-      0, 255,   0,  63,   0, 255,   0, 255,   0,  63,   0, 170,   0, 255,   0,   0,
-    255, 255, 156,  31, 156,  31,   0,  15,   0,  31, 156,  31,  64,  12,   4,   0,
-      8,   0,   0,   0,   0,   0, 192, 255, 255, 127,   0,   0, 157, 234,  37, 192,
-      5,  40,   4,   0,  85,  21,   0,   0,  85,  85,  85,   5,  84,  85,  84,  85,
-     85,  85,   0, 106,  85,  40,  69,  85,  85, 125,  95,  85, 116,   0,   0,   0,
-      0,   0, 255, 255, 127,   0, 248,   0, 255,   0,   0,   0, 255, 255,  15,   0,
-    255, 255,   7,   0,   3,   0,   0,   0,
+static RE_UINT8 re_joining_type_table_2[] = {
+      0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   2,   2,   2,   3,   0,   0,   0,   0,
+      0,   0,   0,   0,   4,   0,   0,   0,   0,   0,   0,   0,   5,   6,   7,   0,
+      8,   9,  10,  11,  12,  13,  14,  15,  16,  17,  18,  19,   0,  20,  21,  22,
+     23,  24,  25,  26,   0,  27,  28,  29,  30,  31,  32,  33,  34,  35,  36,  37,
+     38,  35,  39,  40,  38,  35,  41,  42,  34,  43,  44,  33,  45,   0,  46,   0,
+     47,  48,  49,  33,  34,  43,  50,  33,  51,  52,  36,  33,  34,   0,  53,   0,
+      0,  54,  55,   0,   0,  56,  57,   0,  58,  59,   0,  60,  61,  62,  63,   0,
+      0,  64,  65,  66,  67,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  68,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,  69,  69,  70,  70,   0,  71,  72,   0,
+     73,  13,  13,  74,  75,  76,   0,   0,   0,  77,   0,   0,   0,   0,   0,   0,
+     78,   0,  79,  80,   0,  81,  82,   0,  83,  84,  45,  85,  51,  86,   0,  87,
+      0,  88,   0,   0,   0,   0,  89,  90,   0,   0,   0,   0,   0,   0,   2,  91,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     92,  93,   0,  94,   0,   0,  81,  95,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,  96,   0,   0,   0,  97,   0,   0,   0,   2,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,  98,   0,   0,  99,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0, 100,  48,   0,   0, 101,   0,   0,   0,   0,   0,   0,   0,   0,
+    102, 103,  13, 104,   0,   0, 105, 106,   0, 107, 108,   0,  30, 109,   0, 110,
+      0, 111, 112,  35,   0, 113,  34, 114,   0,   0,   0,   0,   0,   0,   0, 115,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0, 116,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      3,   3,   0,   0,   0,   0,   0,  97,   0,   0,   0,   0,   0,   0,   0, 117,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 118,
+      0,   0,   0,   0,   0,   0,   0,  82,   0,   0,   0, 119,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    120, 121,   0,   0,   0,   0, 122, 123,   0,   0,   0,   0, 124, 125,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0, 126, 127,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0, 128,   0,   0,   0, 129, 130,   0,   0, 131, 132,   0,
+     34, 133, 134,  97,  51, 135,   0,   0,  30, 136,   0, 137,  51, 138, 139,   0,
+      0, 140,   0,   0,   0,   0,  97, 141,  51,  52,  82, 142,   0,   0,   0,   0,
+      0, 133, 143,   0,   0, 144, 145,   0,   0,   0,   0,   0,   0, 146, 147,   0,
+      0, 148,  82,   0,   0, 149,   0,   0,  68, 150,   0,   0,   0,   0,   0,   0,
+      0, 151,   0,   0,   0,   0,   0,   0,   0, 152, 153,   0,   0,   0, 154,  82,
+    155, 156, 157,   0, 158,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0, 159,   0,   0, 160, 161,   0,   0,   0, 162, 163,   0, 164,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0, 165,   0,   0,   0,   0,   0,   0,   0,   0,
+      0, 166,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0, 167,   0, 168,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 169,   0, 170,   0,   0, 171,
+      0,   0,   0,   0, 172,  83,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 173, 174,  98,   0,   0,
+      0,   0, 175,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      2, 176,   2, 177, 178, 179,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    180, 181,   0,   0,   0,   0,   0,   0,   0, 168,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0, 182,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0, 168,   0,  13,  13, 183,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     34,   2,   2,   2,   0,   0,   0,   0,   2,   2,   2,   2,   2,   2,   2,   3,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0
 };
 
-/* Changes_When_Casefolded: 816 bytes. */
-
-RE_UINT32 re_get_changes_when_casefolded(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-
-    f = ch >> 13;
-    code = ch ^ (f << 13);
-    pos = (RE_UINT32)re_changes_when_casefolded_stage_1[f] << 4;
-    f = code >> 9;
-    code ^= f << 9;
-    pos = (RE_UINT32)re_changes_when_casefolded_stage_2[pos + f] << 4;
-    f = code >> 5;
-    code ^= f << 5;
-    pos = (RE_UINT32)re_changes_when_casefolded_stage_3[pos + f] << 5;
-    pos += code;
-    value = (re_changes_when_casefolded_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1;
-
-    return value;
-}
-
-/* Changes_When_Casemapped. */
-
-static RE_UINT8 re_changes_when_casemapped_stage_1[] = {
-    0, 1, 2, 2, 2, 3, 2, 4, 5, 2, 2, 6, 2, 2, 2, 7,
+static RE_UINT8 re_joining_type_table_3[] = {
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1,
+    0, 1, 1, 0, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0,
+    2, 0, 3, 3, 3, 3, 2, 3, 2, 3, 2, 2, 2, 2, 2, 3,
+    3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    4, 2, 2, 2, 2, 2, 2, 2, 3, 2, 2, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2,
+    1, 3, 3, 3, 0, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3,
+    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2,
     2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
     2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    3, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 3, 2, 3,
+    2, 2, 3, 3, 0, 3, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1,
+    1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 1, 3, 3,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 0, 0, 2,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
+    3, 1, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 2, 2, 3, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 3, 2, 3, 2, 3, 2, 2, 3,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 3, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 2, 2, 2,
+    2, 3, 2, 3, 3, 2, 2, 2, 3, 3, 2, 2, 2, 2, 2, 2,
+    0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2,
     2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 4, 0, 0, 1, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    3, 2, 2, 2, 2, 2, 3, 3, 2, 3, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 3, 2, 3, 3, 3, 1, 1, 1, 0, 0, 0, 0,
+    2, 0, 2, 2, 2, 2, 0, 3, 2, 3, 3, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 0, 3, 2,
+    2, 3, 3, 2, 2, 0, 2, 2, 2, 3, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0,
+    0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0,
+    0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,
+    0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0,
+    0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0,
+    0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
+    0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0,
+    0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1,
+    1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0,
+    0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0,
+    0, 0, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0,
+    1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1,
+    1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 1, 1, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1,
+    1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0,
+    0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 4, 1, 1, 1, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
     2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2,
     2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0,
+    1, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0,
+    0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 1, 0, 1,
+    1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1,
+    1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0,
+    0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 4, 1, 1,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
+    1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
+    1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
     2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
+    0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0,
+    0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0,
+    0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    1, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0,
+    0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0,
+    0, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1,
+    2, 2, 2, 2, 2, 3, 0, 3, 0, 3, 3, 0, 0, 5, 3, 3,
+    3, 3, 3, 2, 2, 2, 2, 5, 2, 2, 2, 2, 2, 3, 2, 2,
+    2, 3, 0, 0, 3, 1, 1, 0, 0, 0, 0, 2, 2, 2, 2, 3,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    2, 3, 2, 3, 3, 3, 2, 2, 2, 3, 2, 2, 3, 2, 3, 3,
+    2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 2, 2, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    5, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
     2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 3, 2, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    2, 2, 2, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 2, 2, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    2, 0, 2, 2, 3, 3, 3, 0, 2, 3, 3, 2, 2, 3, 2, 2,
+    0, 2, 3, 3, 2, 0, 0, 0, 0, 3, 2, 5, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1,
+    1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
+    1, 1, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0,
+    0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0,
+    1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 1,
+    1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1,
+    1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 1,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0,
+    1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0,
+    0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0,
+    0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0,
+    0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1,
+    1, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 1, 1, 0, 1,
+    1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    1, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
+    1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0,
+    0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0,
+    0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1,
+    0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1,
+    1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
 };
 
-static RE_UINT8 re_changes_when_casemapped_stage_2[] = {
-     0,  1,  2,  3,  3,  3,  3,  3,  4,  5,  3,  3,  3,  3,  6,  7,
-     8,  3,  9,  3,  3,  3, 10,  3,  3,  3,  3,  3,  3,  3,  3,  3,
-     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
-     3,  3,  3, 11,  3, 12,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
-     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3, 13,  3, 14,
-     3,  3, 15,  3,  3,  3, 16,  3,  3,  3,  3,  3, 17,  3,  3,  3,
-     3,  3,  3,  3,  3,  3,  3, 18,  3,  3,  3,  3,  3,  3,  3,  3,
-     3,  3,  3,  3, 19,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
-};
+RE_UINT32 re_get_joining_type(RE_UINT32 codepoint) {
+    RE_UINT32 field_2;
+    RE_UINT32 field_1;
+    RE_UINT32 field_0;
+    RE_UINT32 v;
 
-static RE_UINT8 re_changes_when_casemapped_stage_3[] = {
-     0,  0,  1,  1,  0,  2,  3,  3,  4,  5,  4,  4,  6,  7,  8,  4,
-     4,  9, 10, 11, 12,  0,  0,  0,  0,  0, 13, 14, 15, 16, 17, 18,
-     4,  4,  4,  4, 19,  4,  4,  4,  4, 20, 21, 22, 23,  0,  0,  0,
-     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  4, 24, 25,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  4,  4, 26,
-     0,  0,  0,  0, 27, 25,  0,  0,  0,  0,  0, 28, 29,  0,  0,  0,
-     4,  4,  4,  4, 30,  4,  4,  4, 26,  4, 31, 32,  4, 33, 34, 35,
-     0,  0,  0,  0,  0,  0,  0,  0,  0, 36, 29,  4, 37,  0,  0,  0,
-     0,  0,  0,  0,  0, 38,  4, 39,  0,  0,  0,  0,  0,  0,  0,  0,
-     4, 40, 41, 42,  4,  4,  4, 43,  4, 44,  0,  0,  0,  0,  0,  0,
-     0,  0,  4, 45, 46,  0,  0,  0,  0, 47,  4, 48, 49, 40, 50,  0,
-     0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 51, 52,  4,  4,  0,  0,
-     0,  0,  0,  0,  0,  0,  0,  0, 53,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  1,  0,  0,  0,  0,  0,
-     4,  4, 54,  0,  0, 52, 55, 46,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  4, 56,  4, 56,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  4,  4,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  4,  4,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0,  0,  0,  4,  4, 57,  0,  0,  0,  0,  0,
-};
+    field_2 = codepoint >> 10;
+    field_1 = (codepoint >> 5) & 0x1F;
+    field_0 = codepoint & 0x1F;
 
-static RE_UINT8 re_changes_when_casemapped_stage_4[] = {
-      0,   0,   0,   0, 254, 255, 255,   7,   0,   0,  32,   0, 255, 255, 127, 255,
-    255, 255, 255, 255, 255, 255, 255, 254, 255, 223, 255, 247, 255, 243, 255, 179,
-    240, 255, 255, 255, 253, 255,  15, 252, 255, 255, 223,  26, 107, 159,  38,  32,
-    141,  31,   4,  96,  32,   0,   0,   0,   0,   0, 207, 184,  64, 215, 255, 255,
-    251, 255, 255, 255, 255, 255, 227, 255, 255, 255, 191, 239,   3, 252, 255, 255,
-    255, 255, 254, 255, 255, 255, 127,   0, 254, 255, 255, 255, 255,   0,   0,   0,
-    191,  32, 255, 255, 255, 255, 255, 231, 255, 255,  63,  63, 255,   1, 255, 255,
-      0,   0,   0,  34,   0,  64,   0,   0, 255, 255, 255,  79,  63,  63, 255, 170,
-    255, 255, 255,  63, 255, 255, 223,  95, 220,  31, 207,  15, 255,  31, 220,  31,
-     64,  12,   4,   0,  24,   0,   0,   0,   0,   0, 192, 255, 255,   3,   0,   0,
-    255, 127, 255, 255, 255, 255, 255, 127, 255, 255, 109, 192,  15, 120,  12,   0,
-    191,  32,   0,   0, 255,  63,   0,   0, 255, 255, 255,  15, 252, 255, 252, 255,
-    255, 255,   0, 254, 255,  56, 223, 255, 124,   0,   0,   0,   0,   0,   8,   0,
-      0,   0, 255, 255, 127,   0, 248,   0, 255, 255,   0,   0, 255, 255,  15, 255,
-    255, 255,   7,   0,  15,   0,   0,   0,
-};
+    v = re_joining_type_table_1[field_2];
+    v = re_joining_type_table_2[(v << 5) | field_1];
+    v = re_joining_type_table_3[(v << 5) | field_0];
 
-/* Changes_When_Casemapped: 816 bytes. */
-
-RE_UINT32 re_get_changes_when_casemapped(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-
-    f = ch >> 13;
-    code = ch ^ (f << 13);
-    pos = (RE_UINT32)re_changes_when_casemapped_stage_1[f] << 4;
-    f = code >> 9;
-    code ^= f << 9;
-    pos = (RE_UINT32)re_changes_when_casemapped_stage_2[pos + f] << 4;
-    f = code >> 5;
-    code ^= f << 5;
-    pos = (RE_UINT32)re_changes_when_casemapped_stage_3[pos + f] << 5;
-    pos += code;
-    value = (re_changes_when_casemapped_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1;
-
-    return value;
+    return v;
 }
 
-/* ID_Start. */
-
-static RE_UINT8 re_id_start_stage_1[] = {
-     0,  1,  2,  3,  4,  5,  5,  5,  5,  6,  7,  5,  5,  8,  9, 10,
-    11, 12, 13, 14, 15,  9, 16,  5, 17,  9,  9, 18,  9, 19, 20,  9,
-     5,  5,  5,  5,  5,  5,  5,  5,  5,  5, 21, 22, 23,  5, 24, 25,
+/* Line_Break. */
+static RE_UINT8 re_line_break_table_1[] = {
+     0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 13, 13,
+    13, 13, 13, 14, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 15, 16, 17, 18, 19, 20, 21, 22,
+    23, 24, 18, 19, 20, 25, 26, 26, 27, 27, 27, 27, 27, 27, 28, 29,
+    30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 27, 27, 40, 41, 27, 27,
+    27, 42, 27, 27, 27, 27, 27, 27, 27, 27, 43, 44, 13, 13, 13, 13,
+    13, 45, 46, 47, 27, 27, 27, 27, 27, 27, 27, 27, 48, 27, 27, 49,
+    27, 27, 27, 27, 50, 51, 52, 27, 53, 27, 54, 55, 56, 57, 58, 59,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 59,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 59,
+    27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
+    27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
+    27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
+    27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
+    27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
+    27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
+    27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
+    27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
+    27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
+    27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
+    27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
+    27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
+    27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
+    27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
+    27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
+    27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
+    27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
+    27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
+    27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
+    27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
+    27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
+    27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
+    27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
+    27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
+    27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
+    27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
+    27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
+    27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
+    27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
+    27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
+    27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
+    27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
+    27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
+    27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
+    27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
+    27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
+    27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
+    27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
+    27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
+    27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
+    60, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
+    27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
+    27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
+    27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
+    27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
+    27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
+    27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
+    27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
+    27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
+    27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
+    27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
+    27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27
+};
+
+static RE_UINT16 re_line_break_table_2[] = {
+      0,   1,   2,   3,   4,   5,   6,   6,   7,   7,   7,   7,   7,   7,   7,   7,
+      7,   7,   7,   7,   7,   7,   8,   7,   9,   9,  10,  11,  12,  13,   7,   7,
+      7,   7,   7,   7,  14,   7,   7,   7,   7,  15,  16,   7,  17,  18,  19,  20,
+     21,   7,  22,  23,   7,   7,  24,  25,  26,  27,  28,   7,   7,  29,  30,  31,
+     32,  33,  34,  35,  36,  37,  38,  39,  40,  41,  42,  43,  44,  45,  46,  47,
+     48,  49,  50,  51,  52,  53,  54,  55,  56,  53,  57,  58,  59,  60,  61,  62,
+     63,  64,  65,  66,  67,  68,  69,  70,  71,  72,  73,  74,  75,  76,  77,  78,
+     79,  80,  81,  36,  82,  83,  84,  36,  85,  86,  87,  88,  89,  90,  91,  36,
+     92,  92,  93,  92,  94,   7,  95,   7,  96,  96,  96,  97,  97,  98,  99,  99,
+      7,   7, 100,   7, 101, 102, 103,   7, 104,   7, 105, 106, 107,   7,   7, 108,
+    109,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
+      7,   7,   7,   7, 110,   7,   7, 111, 112, 113, 114, 115,  92,  92, 116, 117,
+    118,   7,   7, 119, 120, 121,   7, 122, 123, 124, 125, 126,  92, 127, 128,   7,
+    129,  92, 130, 131, 132, 133, 134,  36, 135, 136, 137, 138, 139, 140,   7, 141,
+      7, 142, 143, 144, 145, 146, 147, 148,   7,   7,   7,   7,   7,   7,   9, 149,
+      7,   7,   7,   7,   7,   7,   7,   7, 108,   7, 150, 151,   7,  37, 152, 153,
+    154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166,   7, 167,   7,
+    168, 169, 170, 171, 172, 173,   7, 174, 175, 176,   7,   7,   7,   7,   7, 177,
+      7, 178,  35, 179, 179, 179, 179, 180, 179, 179, 181, 182, 183, 184, 185, 186,
+    187, 188, 189, 190, 191, 192, 193, 194, 195,   7, 196, 197, 198,   7, 199, 200,
+      7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7, 201,   7, 202, 203,
+      7,   7,   7,   7,   7,   7,   7,   7,   7,   7, 204, 205, 206,   7,   7,   7,
+      7, 207, 123,   7,   7,   7,   7, 208,   7,  95,   7, 209, 210, 211, 211,   9,
+    212, 213, 214,  36, 215, 216, 216, 217, 216, 216, 216, 216, 216, 216, 218, 219,
+    220, 221, 222, 223, 224, 225, 223, 226, 227, 228, 216, 216, 229, 216, 216, 230,
+    231, 216, 232, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216,
+    216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216,
+    216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216,
+    216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216,   7,   7,
+    216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216,
+    233, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216,
+    216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216,
+    216, 216, 216, 216, 234, 216, 235, 144,   7,   7,   7,   7,   7,   7,   7,   7,
+    236, 237,   7, 238, 239,   7,   7, 240,   7,   7,   7,   7,   7,   7, 241, 242,
+    243, 244,   7, 245, 246, 136, 247, 248,  30, 249, 250, 251,  40, 252, 253, 254,
+      7, 255, 256,  92,  92,  92, 257, 258, 259, 260,   7, 261,   7,   7,   7, 262,
+    263, 264, 265, 266, 267, 268, 269, 263, 264, 265, 266, 267, 268, 269, 263, 264,
+    265, 266, 267, 268, 269, 263, 264, 265, 266, 267, 268, 269, 263, 264, 265, 266,
+    267, 268, 269, 263, 264, 265, 266, 267, 268, 269, 263, 264, 265, 266, 267, 268,
+    269, 263, 264, 265, 266, 267, 268, 269, 263, 264, 265, 266, 267, 268, 269, 263,
+    264, 265, 266, 267, 268, 269, 263, 264, 265, 266, 267, 268, 269, 263, 264, 265,
+    266, 267, 268, 269, 263, 264, 265, 266, 267, 268, 269, 263, 264, 265, 266, 267,
+    268, 269, 263, 264, 265, 266, 267, 268, 269, 263, 264, 265, 266, 267, 268, 269,
+    263, 264, 265, 266, 267, 268, 269, 263, 264, 265, 266, 267, 268, 269, 263, 264,
+    265, 266, 267, 268, 269, 263, 264, 265, 266, 267, 268, 269, 263, 264, 265, 266,
+    267, 268, 269, 263, 264, 265, 266, 267, 268, 269, 263, 264, 265, 266, 267, 268,
+    269, 263, 264, 265, 266, 267, 268, 269, 263, 264, 265, 266, 267, 268, 269, 263,
+    264, 265, 266, 267, 268, 269, 263, 264, 265, 266, 267, 268, 269, 263, 264, 265,
+    266, 267, 268, 269, 263, 264, 265, 266, 267, 268, 269, 263, 264, 265, 266, 267,
+    268, 269, 263, 264, 265, 266, 267, 268, 269, 263, 264, 265, 266, 267, 268, 269,
+    268, 269, 263, 264, 265, 266, 267, 268, 269, 263, 264, 265, 266, 267, 268, 269,
+    263, 264, 265, 266, 267, 268, 269, 263, 264, 265, 266, 267, 268, 270, 271, 272,
+    273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273,
+    273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273,
+     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,
+     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,
+     36,  36,  36,  36,  36,  36,  36,  36, 216, 216, 216, 216, 216, 216, 216, 216,
+    216, 216, 216, 216, 216, 216, 216, 216, 274, 275, 276,   7,   7,   7, 277,   7,
+      7,   7,   7,   7,   7,   7,   7,   7,   7, 278, 279,   7, 280,   7, 281, 282,
+    283, 284, 285, 286,   7,   7,   7, 287, 288, 289, 290, 291, 292, 231, 293, 294,
+    295, 296, 297,  36,   7,   7,   7, 298, 299, 300,   7,   7, 301, 302, 279, 303,
+     36,  36,  36,  36, 304,   7, 305, 306,   7, 307, 308, 309, 310,   7, 311,  36,
+      7,   7,   7,   7, 151, 312, 313, 314,   7, 315,   7, 316,  36,  36,  36,  36,
+      7,   7,   7,   7,   7,   7,   7,   7,   7, 210, 122, 281,  36,  36,  36,  36,
+    317, 318, 319,   7, 123, 320,  36, 321, 322, 323,  36,  36,   7, 324, 280,   7,
+    325, 326, 327,   7,   7,  36,   7, 328,   7, 329, 330, 331, 332, 333,  36,  36,
+      7,   7, 334,  36,   7, 335,   7, 336,   7, 337,  36,  36,  36,  36,  36,  36,
+     36,  36,  36, 123,   7, 338,  36,  36,   7, 315, 339,  36,  36, 279, 340, 210,
+    139, 341, 342, 343, 139, 344, 345, 346, 139, 347, 348, 349, 139, 252, 350, 351,
+    352, 353,  36,  36, 354, 355, 356, 357, 358, 359, 360, 361,  36,  36,  36,  36,
+      7, 362, 363, 364,   7,  27, 365,  36,  36,  36,  36,  36,   7, 366, 367,  36,
+      7,  27, 368, 369,   7, 370, 371,  36, 372, 373,  36,  36,  36,  36,  36,  36,
+      7, 374,  36,  36,  36,   7,   7, 375, 376, 377, 378,  36,  36, 379, 380, 381,
+    382, 383, 384,   7, 385, 386,   7, 119,  36,  36,  36,  36,  36,  36,  36,  36,
+    387, 388, 389, 390, 391, 392,  36,  36, 393, 394, 395, 396, 397, 371,  36,  36,
+     36,  36,  36,  36,  36,  36,  36, 398,  36,  36,  36,  36,  36, 399, 400, 401,
+      7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
+      7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7, 107,  36,  36,  36,
+      7,   7,   7, 402,   7,   7,   7,   7,   7,   7, 403,  36,  36,  36,  36,  36,
+     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,
+      7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
+      7,   7, 404,   7, 405,   7,   7,   7,   7,   7,   7, 406,   7,   7,   7,   7,
+      7, 407,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,
+     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,
+      7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7, 408,   7,
+      7,   7, 178,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,
+      7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
+      7, 119, 123, 409,  36,  36, 279, 410,   7, 411, 412, 413, 414,  36,  36,  36,
+     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,
+     36,  36,   7,   7, 415,  36,  36,  36,   7,   7, 416,   9, 417,  36,  36, 418,
+    216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216,
+    216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 419,
+    216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216,
+    216, 216, 216, 216, 216, 216, 216, 216,   7,   7,   7,   7,   7,   7,   7,   7,
+      7,   7,   7,   7,   7,   7, 122,  36, 420,  36,  36,  36,  36,  36,  36,  36,
+     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,
+    216, 216, 216, 216, 216, 216, 216, 216, 231,  36, 421, 422, 216, 216, 216, 216,
+    216, 216, 216, 216, 216, 216, 216, 423,  36,  36,  36,  36,  36,  36,  36,  36,
+      7,   7,   7, 424, 425, 426,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,
+     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,
+      7,   7,   7,   7,   7,   7,   7, 122,   7, 427,   7, 428, 429, 430,   7, 334,
+      7,   7, 431,  36,  36,  36,  36, 432,   7,   7, 210, 119,  36,  36,  36,  36,
+      7,   7,  37,   7, 433, 434, 435,   7, 436, 437, 438,   7,   7,   7,   7,   7,
+      7,   7,   7,   7,   7, 439,   7,   7,   7,   7,   7,   7,   7,   7, 440, 441,
+      7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
+      9, 442,   9, 443, 444, 445,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,
+    446, 447,  36,  36,  36,  36,  36,  36,   7, 448, 449,  36,  36,  36,  36,  36,
+     36,  36,  36,  36,  36,  36,   7, 450,  36,  36,  36,  36,  36,  36,  36,  36,
+      7,   7,   7,   7,   7,   7, 451,  36,   7,   7, 452,  36,  36,  36,  36,  36,
+     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,
+     36,  36,  36, 453,   7, 454,  36,  36, 455, 151,  36,  36,  36,  36,  36,  36,
+    435, 456, 457, 458, 459, 460,  36, 461,  36,  36,  36,  36,  36,  36,  36,  36,
+    216, 216, 216, 216, 216, 216, 216, 216, 462, 463, 179, 464, 179, 465, 216, 466,
+    216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 467, 468, 469, 470,
+    216, 216, 471, 472, 473, 474, 216, 216, 475, 476, 477, 478, 479, 216, 480, 481,
+    216, 216, 482, 483, 216, 484, 485, 216,   7,   7,   7, 486,   7,   7, 487, 216,
+    488,   7, 489,   7, 490, 491, 216, 216, 492, 493, 216, 494, 216, 495, 496, 216,
+      7,   7, 486, 216, 216, 216, 216, 216,   7,   7,   7,   7, 497,   7,  35, 498,
+    216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216,
+    216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 499,
+    500,   9,   9,   9,  36,  36,  36,  36,   9,   9,   9,   9,   9,   9,   9, 501,
+     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36
+};
+
+static RE_UINT8 re_line_break_table_3[] = {
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  2,  3,  4,  4,  5,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     6,  7,  8,  9, 10, 11,  9,  8, 12, 13,  9, 10, 14, 15, 14, 16,
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 14, 14,  9,  9,  9,  7,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9, 12, 10, 13,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9, 12,  2, 18,  9,  1,
+     1,  1,  1,  1,  1, 19,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+    20, 12, 11, 10, 10, 10,  9, 21, 21,  9, 21,  8,  9,  2,  9,  9,
+    11, 10, 21, 21, 22,  9, 21, 21, 21, 21, 21,  8, 21, 21, 21, 12,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9, 21,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9, 21, 22, 21, 21, 21, 22, 21,  9,  9,
+    21,  9,  9,  9,  9,  9,  9,  9, 21, 21, 21, 21,  9, 21,  9, 22,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1, 20,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1, 20, 20, 20, 20,
+    20, 20, 20,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  9,  9,  9,  9, 14,  9,
+     0,  0,  0,  0,  9,  9,  9,  9,  9,  9,  9,  0,  9,  0,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  0,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  1,  1,  1,  1,  1,  1,  1,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     0,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  0,  0,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9, 14,  2,  0,  0,  9,  9, 10,
+     0,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  2,  1,
+     9,  1,  1,  9,  1,  1,  7,  1,  0,  0,  0,  0,  0,  0,  0,  0,
+    23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
+    23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,  0,  0,  0,  0, 23,
+    23, 23, 23,  9,  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9, 11, 11, 11, 14, 14,  9,  9,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  7,  1,  0,  7,  7,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 11, 17, 17,  9,  9,  9,
+     1,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  7,  9,  1,  1,  1,  1,  1,  1,  1,  9,  9,  1,
+     1,  1,  1,  1,  1,  9,  9,  1,  1,  9,  1,  1,  1,  1,  9,  9,
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  9,
+     9,  1,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  0,  0,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  9,  9,  9,  9, 14,  7,  9,  0,  0,  1, 10, 10,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  1,  1,  1,  1,  9,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  9,  1,  1,  1,  9,  1,  1,  1,  1,  1,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  1,  1,  1,  0,  0,  9,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  0,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  9,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  1,  1,  1,  9,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     9,  1,  1,  1,  1,  1,  1,  1,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  1,  1,  2,  2, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  1,  1,  1,  0,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  9,
+     9,  0,  0,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  9,  9,  9,  9,  9,  9,
+     9,  0,  9,  0,  0,  0,  9,  9,  9,  9,  0,  0,  1,  9,  1,  1,
+     1,  1,  1,  1,  1,  0,  0,  1,  1,  0,  0,  1,  1,  1,  9,  0,
+     0,  0,  0,  0,  0,  0,  0,  1,  0,  0,  0,  0,  9,  9,  0,  9,
+     9,  9,  1,  1,  0,  0, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+     9,  9, 11, 11,  9,  9,  9,  9,  9, 11,  9, 10,  9,  9,  1,  0,
+     0,  1,  1,  1,  0,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,  9,
+     9,  0,  0,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  9,  9,  9,  9,  9,  9,
+     9,  0,  9,  9,  0,  9,  9,  0,  9,  9,  0,  0,  1,  0,  1,  1,
+     1,  1,  1,  0,  0,  0,  0,  1,  1,  0,  0,  1,  1,  1,  0,  0,
+     0,  1,  0,  0,  0,  0,  0,  0,  0,  9,  9,  9,  9,  0,  9,  0,
+     0,  0,  0,  0,  0,  0, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+     1,  1,  9,  9,  9,  1,  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  1,  1,  1,  0,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  9,
+     9,  9,  0,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  9,  9,  9,  9,  9,  9,
+     9,  0,  9,  9,  0,  9,  9,  9,  9,  9,  0,  0,  1,  9,  1,  1,
+     1,  1,  1,  1,  1,  1,  0,  1,  1,  1,  0,  1,  1,  1,  0,  0,
+     9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     9,  9,  1,  1,  0,  0, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+     9, 10,  0,  0,  0,  0,  0,  0,  0,  9,  1,  1,  1,  1,  1,  1,
+     0,  1,  1,  1,  0,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  9,
+     9,  0,  0,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     1,  1,  1,  1,  1,  0,  0,  1,  1,  0,  0,  1,  1,  1,  0,  0,
+     0,  0,  0,  0,  0,  1,  1,  1,  0,  0,  0,  0,  9,  9,  0,  9,
+     9,  9,  1,  1,  0,  0, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+     9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  1,  9,  0,  9,  9,  9,  9,  9,  9,  0,  0,  0,  9,  9,
+     9,  0,  9,  9,  9,  9,  0,  0,  0,  9,  9,  0,  9,  0,  9,  9,
+     0,  0,  0,  9,  9,  0,  0,  0,  9,  9,  9,  0,  0,  0,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,  1,  1,
+     1,  1,  1,  0,  0,  0,  1,  1,  1,  0,  1,  1,  1,  1,  0,  0,
+     9,  0,  0,  0,  0,  0,  0,  1,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+     9,  9,  9,  9,  9,  9,  9,  9,  9, 10,  9,  0,  0,  0,  0,  0,
+     1,  1,  1,  1,  1,  9,  9,  9,  9,  9,  9,  9,  9,  0,  9,  9,
+     9,  0,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  9,  1,  1,
+     1,  1,  1,  1,  1,  0,  1,  1,  1,  0,  1,  1,  1,  1,  0,  0,
+     0,  0,  0,  0,  0,  1,  1,  0,  9,  9,  9,  0,  0,  0,  0,  0,
+     9,  9,  1,  1,  0,  0, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+     0,  0,  0,  0,  0,  0,  0, 22,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  1,  1,  1, 22,  9,  9,  9,  9,  9,  9,  9,  9,  0,  9,  9,
+     9,  0,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  0,  9,  9,  9,  9,  9,  0,  0,  1,  9,  1,  1,
+     1,  1,  1,  1,  1,  0,  1,  1,  1,  0,  1,  1,  1,  1,  0,  0,
+     0,  0,  0,  0,  0,  1,  1,  0,  0,  0,  0,  0,  0,  0,  9,  0,
+     9,  9,  1,  1,  0,  0, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+     0,  9,  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     1,  1,  1,  1,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  9,  9,
+     9,  0,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  1,  1,  9,  1,  1,
+     1,  1,  1,  1,  1,  0,  1,  1,  1,  0,  1,  1,  1,  1,  9,  9,
+     0,  0,  0,  0,  9,  9,  9,  1,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  1,  1,  0,  0, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+     9,  9,  9,  9,  9,  9,  9,  9,  9, 11,  9,  9,  9,  9,  9,  9,
+     0,  1,  1,  1,  0,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  0,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  9,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  1,  0,  0,  0,  0,  1,
+     1,  1,  1,  1,  1,  0,  1,  0,  1,  1,  1,  1,  1,  1,  1,  1,
+     0,  0,  0,  0,  0,  0, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+     0,  0,  1,  1,  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
+    24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
+    24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
+    24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,  0,  0,  0,  0, 10,
+    24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,  9,
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17,  2,  2,  0,  0,  0,  0,
+     0, 24, 24,  0, 24,  0, 24, 24, 24, 24, 24,  0, 24, 24, 24, 24,
+    24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
+    24, 24, 24, 24,  0, 24,  0, 24, 24, 24, 24, 24, 24, 24, 24, 24,
+    24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,  0,  0,
+    24, 24, 24, 24, 24,  0, 24,  0, 24, 24, 24, 24, 24, 24,  0,  0,
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17,  0,  0, 24, 24, 24, 24,
+     9, 22, 22, 22, 22,  9, 22, 22, 20, 22, 22,  2, 20,  7,  7,  7,
+     7,  7, 20,  9,  7,  9,  9,  9,  1,  1,  9,  9,  9,  9,  9,  9,
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  2,  1,  9,  1,  9,  1, 12, 18, 12, 18,  1,  1,
+     9,  9,  9,  9,  9,  9,  9,  9,  0,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,
+     0,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  2,
+     1,  1,  1,  1,  1,  2,  1,  1,  9,  9,  9,  9,  9,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  0,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  0,  2,  2,
+     9,  9,  9,  9,  9,  9,  1,  9,  9,  9,  9,  9,  9,  0,  9,  9,
+    22, 22,  2, 22,  9,  9,  9,  9,  9, 20, 20,  0,  0,  0,  0,  0,
+    24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
+    24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17,  2,  2,  9,  9,  9,  9,
+    24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
+    24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 24, 24, 24, 24, 24, 24,
+     9,  9,  9,  9,  9,  9,  0,  9,  0,  0,  0,  0,  0,  9,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+    25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+    25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+    26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
+    26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
+    26, 26, 26, 26, 26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 27,
+    27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
+    27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
+    27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  9,  9,  9,  9,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  0,  9,  0,  9,  9,  9,  9,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  9,  9,  9,  9,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  0,  9,  9,  9,  9,  0,  0,  9,  9,  9,  9,  9,  9,  9,  0,
+     9,  0,  9,  9,  9,  9,  0,  0,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  0,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  0,  9,  9,  9,  9,  0,  0,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  1,  1,  1,
+     9,  2,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  0,  0,  9,  9,  9,  9,  9,  9,  0,  0,
+     2,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     2,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9, 12, 18,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  2,  2,  2,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  9,  9,
+     9,  9,  1,  1,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  1,  1,  1,  2,  2,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  1,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  9,  9,
+     9,  0,  1,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
+    24, 24, 24, 24,  2,  2, 28, 24,  2,  9,  2, 10, 24, 24,  0,  0,
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17,  0,  0,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,  0,  0,
+     9,  9,  7,  7,  2,  2, 22,  9,  7,  7,  9,  1,  1,  1, 20,  0,
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17,  0,  0,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  1,  1,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  1,  9,  0,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  0,  0,  0,  0,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  0,  0,  0,  0,
+     9,  0,  0,  0,  7,  7, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+    24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
+    24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,  0,  0,
+    24, 24, 24, 24, 24,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,  0,  0,  0,  0,
+    24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
+    24, 24, 24, 24, 24, 24, 24, 24, 24, 24,  0,  0,  0,  0,  0,  0,
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 24,  0,  0,  0, 24, 24,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  1,  1,  1,  1,  1,  0,  0,  9,  9,
+    24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
+    24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,  0,
+    24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
+    24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,  0,  0,  1,
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17,  0,  0,  0,  0,  0,  0,
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17,  0,  0,  0,  0,  0,  0,
+    24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,  0,  0,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     1,  1,  1,  1,  1,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17,  2,  2,  9,  2,  2,  2,
+     2,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,
+     1,  1,  1,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  9,  9,
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  0,  0,  0,  0,  0,  0,  0,  0,  9,  9,  9,  9,
+     9,  9,  9,  9,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  0,  0,  0,  2,  2,  2,  2,  2,
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17,  0,  0,  0,  9,  9,  9,
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  2,  2,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,  0,  0,  0,  0,
+     1,  1,  1,  9,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  9,  9,  9,  9,  1,  9,  9,
+     9,  9,  9,  9,  1,  9,  9,  1,  1,  1,  9,  0,  0,  0,  0,  0,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  0,  1,  1,  1,  1,  1,
+     9,  9,  9,  9,  9,  9,  0,  0,  9,  9,  9,  9,  9,  9,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  0,  9,  0,  9,  0,  9,  0,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,
+     9,  9,  9,  9,  9,  0,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  0,  0,  9,  9,  9,  9,  9,  9,  0,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     0,  0,  9,  9,  9,  0,  9,  9,  9,  9,  9,  9,  9, 22,  9,  0,
+     2,  2,  2,  2,  2,  2,  2, 20,  2,  2,  2, 29,  1, 30,  1,  1,
+     2, 20,  2,  2, 31, 21, 21,  9,  8,  8, 12,  8,  8,  8, 12,  8,
+    21, 21,  9,  9, 32, 32, 32,  2,  4,  4,  1,  1,  1,  1,  1, 20,
+    11, 11, 11, 11, 11, 11, 11, 11,  9,  8,  8, 21, 28, 28,  9,  9,
+     9,  9,  9,  9, 14, 12, 18, 28, 28, 28,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  2,  9,  2,  2,  2,  2,  9,  2,  2,  2,
+    33,  9,  9,  9,  9,  0,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     9,  9,  0,  0, 21,  9,  9,  9,  9,  9,  9,  9,  9, 12, 18, 21,
+     9, 21, 21, 21, 21,  9,  9,  9,  9,  9,  9,  9,  9, 12, 18,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,
+    10, 10, 10, 10, 10, 10, 10, 11, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 11, 10, 10, 10, 10, 11, 10, 10, 11, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     9,  9,  9, 11,  9, 21,  9,  9,  9, 11,  9,  9,  9,  9,  9,  9,
+     9,  9,  9, 21,  9,  9, 10,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9, 21, 21,  9,  9,  9,  9,  9,  9,  9,  9, 21,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9, 21, 21,  9,  9,  9,  9,  9, 21,  9,  9, 21,  9,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,  9,  9,  9,  9,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9, 21,  9,  9,  0,  0,  0,  0,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9, 21,  9, 21,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+    21,  9, 21, 21,  9,  9,  9, 21, 21,  9,  9, 21,  9,  9,  9, 21,
+     9, 21, 10, 10,  9, 21,  9,  9,  9,  9, 21,  9,  9, 21, 21, 21,
+    21,  9,  9, 21,  9, 21,  9, 21, 21, 21, 21, 21, 21,  9, 21,  9,
+     9,  9,  9,  9, 21, 21, 21, 21,  9,  9,  9,  9, 21, 21,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9, 21,  9,  9,  9, 21,  9,  9,  9,
+     9,  9, 21,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+    21, 21,  9,  9, 21, 21, 21, 21,  9,  9, 21, 21,  9,  9, 21, 21,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9, 21, 21,  9,  9, 21, 21,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9, 21,  9,  9,  9, 21,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9, 21,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9, 21,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9, 32,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9, 12, 18, 12, 18,  9,  9,  9,  9,
+     9,  9, 21,  9,  9,  9,  9,  9,  9,  9, 34, 34,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9, 12, 18,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+    34, 34, 34, 34,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,  9,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,  9,  9,  9,  9,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+     9,  9, 21, 21, 21, 21,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+    21, 21,  9, 21, 21, 21, 21, 21, 21, 21,  9,  9,  9,  9,  9,  9,
+     9,  9, 21, 21,  9,  9, 21, 21,  9,  9,  9,  9, 21, 21,  9,  9,
+    21, 21,  9,  9,  9,  9, 21, 21, 21,  9,  9, 21,  9,  9, 21, 21,
+    21, 21,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9, 21, 21, 21, 21,  9,  9,  9,  9,  9,  9,  9,  9,  9, 21,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+    34, 34, 34, 34,  9, 21, 21,  9,  9, 21,  9,  9,  9,  9, 21, 21,
+     9,  9,  9,  9, 34, 34, 21, 21, 34,  9, 34, 34, 34, 35, 34, 34,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9, 34, 34, 34,  9,  9,  9,  9,
+    21,  9, 21,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+    21, 21,  9, 21, 21, 21,  9, 21, 34, 21, 21,  9, 21, 21,  9, 21,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9, 34,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9, 21, 21,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9, 34, 34, 34,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 21, 21, 21, 21, 34,  9, 34,
+    34, 34, 21, 34, 34, 21, 21, 21, 34, 34, 21, 21, 34, 21, 21, 34,
+    34, 34,  9, 21,  9,  9,  9,  9, 21, 21, 34, 21, 21, 21, 21, 21,
+    21, 34, 34, 34, 34, 34, 21, 34, 34, 35, 34, 21, 21, 34, 34, 34,
+    34, 34, 34, 34, 34,  9,  9,  9, 34, 34, 35, 35, 35, 35,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9, 21,  9,  9,  9,  8,  8,  8,  8,  8,
+     8,  9,  7,  7, 34,  9,  9,  9, 12, 18, 12, 18, 12, 18, 12, 18,
+    12, 18, 12, 18, 12, 18, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9, 12, 18,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9, 12, 18, 12, 18, 12, 18, 12, 18, 12, 18,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9, 12, 18, 12, 18, 12, 18, 12, 18, 12, 18, 12, 18, 12,
+    18, 12, 18, 12, 18, 12, 18, 12, 18,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9, 12, 18, 12, 18,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9, 12, 18,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9, 21, 21, 21, 21, 21,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  0,  0,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  0,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  1,
+     1,  1,  9,  9,  0,  0,  0,  0,  0,  7,  2,  2,  2,  9,  7,  2,
+     9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,  0,  0,  0,  9,
+     2,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  0,  9,  9,  9,  9,  9,  9,  9,  0,
+     9,  9,  9,  9,  9,  9,  9,  0,  9,  9,  9,  9,  9,  9,  9,  0,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  2,  2,
+     2,  2,  2,  2,  2,  2,  9,  2, 12,  2,  9,  9,  8,  8,  9,  9,
+     8,  8, 12, 18, 12, 18, 12, 18, 12, 18,  2,  2,  2,  2,  7,  9,
+     2,  2,  9,  2,  2,  9,  9,  9,  9,  9, 31, 31,  2,  2,  2,  9,
+     2,  2, 12,  2,  2,  2,  2,  2,  2,  2,  2,  9,  2,  9,  2,  2,
+     9,  9,  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34,  0, 34, 34, 34, 34, 34,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    34, 34, 34, 34,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    34, 34, 34, 34, 34, 34,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,  0,  0,  0,  0,
+     2, 18, 18, 34, 34, 28, 34, 34, 12, 18, 12, 18, 12, 18, 12, 18,
+    12, 18, 34, 34, 12, 18, 12, 18, 12, 18, 12, 18, 28, 12, 18, 18,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34,  1,  1,  1,  1,  1,  1,
+    34, 34, 34, 34, 34,  1, 34, 34, 34, 34, 34, 28, 28, 34, 34, 34,
+     0, 36, 34, 36, 34, 36, 34, 36, 34, 36, 34, 34, 34, 34, 34, 34,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    34, 34, 34, 36, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    34, 34, 34, 36, 34, 36, 34, 36, 34, 34, 34, 34, 34, 34, 36, 34,
+    34, 34, 34, 34, 34, 36, 36,  0,  0,  1,  1, 28, 28, 28, 28, 34,
+    28, 36, 34, 36, 34, 36, 34, 36, 34, 36, 34, 34, 34, 34, 34, 34,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    34, 34, 34, 36, 34, 36, 34, 36, 34, 34, 34, 34, 34, 34, 36, 34,
+    34, 34, 34, 34, 34, 36, 36, 34, 34, 34, 34, 28, 36, 28, 28, 34,
+     0,  0,  0,  0,  0, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+     0, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,  0,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    34, 34, 34, 34,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,  0,
+    34, 34, 34, 34, 34, 34, 34, 34, 21, 21, 21, 21, 21, 21, 21, 21,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    34, 34, 34, 34, 34, 28, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,  0,  0,  0,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    34, 34, 34, 34, 34, 34, 34,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  2,  7,  2,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17,  9,  9,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  1,
+     1,  1,  1,  9,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  1,  1,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     1,  1,  9,  2,  2,  2,  2,  2,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  1,  9,  9,  9,  1,  9,  9,  9,  9,  1,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  1,  1,  1,  1,  1,  9,  9,  9,  9,  1,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9, 11,  9,  0,  0,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9, 22, 22,  7,  7,  0,  0,  0,  0,  0,  0,  0,  0,
+     1,  1,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     1,  1,  1,  1,  1,  1,  0,  0,  0,  0,  0,  0,  0,  0,  2,  2,
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17,  0,  0,  0,  0,  0,  0,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9, 22,  9,  9,  1,
+     9,  9,  9,  9,  9,  9,  1,  1,  1,  1,  1,  1,  1,  1,  2,  2,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  9,
+    25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+    25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  9,  9,  9,  9,  9,  9,  2,  2,  2,  9,  9,  9,  9,  0,  9,
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17,  0,  0,  0,  0,  9,  9,
+    24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 24, 24, 24, 24, 24,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     9,  9,  9,  1,  9,  9,  9,  9,  9,  9,  9,  9,  1,  1,  0,  0,
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17,  0,  0,  9,  2,  2,  2,
+    24, 24, 24,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 24, 24, 24, 24, 24,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  1,  1,  1,  1,  1,
+     2,  2,  9,  9,  9,  1,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  9,  9,  9,  9,  9,  9,  0,  0,  9,  9,  9,  9,  9,  9,  0,
+     0,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  0,  9,  9,  9,  9,  9,  9,  9,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  1,  1,  1,  1,  1,  1,  1,  1,  2,  1,  1,  0,  0,
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17,  0,  0,  0,  0,  0,  0,
+    37, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38,
+    38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 37, 38, 38, 38,
+    38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38,
+    38, 38, 38, 38, 38, 38, 38, 38, 37, 38, 38, 38, 38, 38, 38, 38,
+    38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38,
+    38, 38, 38, 38, 37, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38,
+    38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38,
+    37, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38,
+    38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 37, 38, 38, 38,
+    38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38,
+    38, 38, 38, 38, 38, 38, 38, 38, 37, 38, 38, 38, 38, 38, 38, 38,
+    38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38,
+    38, 38, 38, 38, 37, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38,
+    38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38,
+    38, 38, 38, 38,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
+    26, 26, 26, 26, 26, 26, 26,  0,  0,  0,  0, 27, 27, 27, 27, 27,
+    27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
+    27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
+    27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,  0,  0,  0,  0,
+    39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39,
+    39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39,
+     9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  9,  9,  9,  9,  9,  0,  0,  0,  0,  0, 23,  1, 23,
+    23, 23, 23, 23, 23, 23, 23, 23, 23,  9, 23, 23, 23, 23, 23, 23,
+    23, 23, 23, 23, 23, 23, 23,  0, 23, 23, 23, 23, 23,  0, 23,  0,
+    23, 23,  0, 23, 23,  0, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9, 18, 12,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     0,  0,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9, 11,  9,  0,  0,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+    14, 18, 18, 14, 14,  7,  7, 12, 18, 32,  0,  0,  0,  0,  0,  0,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+    34, 34, 34, 34, 34, 12, 18, 12, 18, 12, 18, 12, 18, 12, 18, 12,
+    18, 12, 18, 12, 18, 34, 34, 12, 18, 34, 34, 34, 34, 34, 34, 34,
+    18, 34, 18,  0, 28, 28,  7,  7, 34, 12, 18, 12, 18, 12, 18, 34,
+    34, 34, 34, 34, 34, 34, 34,  0, 34, 10, 11, 34,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  0,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0, 33,
+     0,  7, 34, 34, 10, 11, 34, 34, 12, 18, 34, 34, 18, 34, 18, 34,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 28, 28, 34, 34, 34,  7,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 12, 34, 18, 34, 34,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 12, 34, 18, 34, 12,
+    18, 18, 12, 18, 18, 28, 34, 36, 36, 36, 36, 36, 36, 36, 36, 36,
+    36, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 28, 28,
+     0,  0, 34, 34, 34, 34, 34, 34,  0,  0, 34, 34, 34, 34, 34, 34,
+     0,  0, 34, 34, 34, 34, 34, 34,  0,  0, 34, 34, 34,  0,  0,  0,
+    11, 10, 34, 34, 34, 10, 10,  0,  9,  9,  9,  9,  9,  9,  9,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  1,  1, 40, 21,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  0,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  9,  9,  0,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,  0,
+     2,  2,  2,  0,  0,  0,  0,  9,  9,  9,  9,  9,  9,  9,  9,  9,
      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  0,  0,  0,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,
+     9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  1,  0,  0,
      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,
      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     1,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,
+     9,  9,  9,  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  9,  9,  9,
      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,  0,
      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  1,  1,  1,  1,  1,  0,  0,  0,  0,  0,
      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  2,
+     9,  9,  9,  9,  0,  0,  0,  0,  9,  9,  9,  9,  9,  9,  9,  9,
+     2,  9,  9,  9,  9,  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17,  0,  0,  0,  0,  0,  0,
      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  0,  0,  0,  0,  9,  9,  9,  9,  9,  9,  9,  9,
      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,  0,  0,  0,  0,
      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  9,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  0,  0,  9,  0,  9,  9,  9,  9,  9,  9,
      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
-};
-
-static RE_UINT8 re_id_start_stage_2[] = {
-      0,   1,   2,   3,   4,   5,   6,   7,   8,   9,  10,  11,  12,  13,  14,  15,
-     16,   1,  17,  18,  19,   1,  20,  21,  22,  23,  24,  25,  26,  27,   1,  28,
-     29,  30,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  32,  33,  31,  31,
-     34,  35,  31,  31,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,  36,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,  37,
-      1,   1,   1,   1,  38,   1,  39,  40,  41,  42,  43,  44,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,  45,  31,  31,  31,  31,  31,  31,  31,  31,
-     31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,
-     31,  31,  31,  31,  31,  31,  31,  31,  31,   1,  46,  47,   1,  48,  49,  50,
-     51,  52,  53,  54,  55,  56,   1,  57,  58,  59,  60,  61,  62,  63,  31,  64,
-     65,  66,  67,  68,  69,  70,  71,  72,  73,  74,  75,  31,  76,  77,  78,  31,
-      1,   1,   1,  79,  80,  81,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,
-      1,   1,   1,   1,  82,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,
-     31,  31,  31,  31,   1,   1,  83,  31,  31,  31,  31,  31,  31,  31,  31,  31,
-     31,  31,  31,  31,  31,  31,  31,  31,   1,   1,  84,  85,  31,  31,  86,  87,
-      1,   1,   1,   1,   1,   1,   1,  88,   1,   1,  89,  31,  31,  31,  31,  31,
-      1,  90,  91,  31,  31,  31,  31,  31,  31,  31,  31,  31,  92,  31,  31,  31,
-     31,  31,  31,  31,  93,  94,  95,  96,  31,  31,  31,  31,  31,  31,  31,  31,
-     31,  97,  98,  31,  31,  31,  31,  31,  99, 100,  31,  31,  31,  31, 101,  31,
-      1,   1,   1,   1,   1,   1, 102,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1, 103, 104,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1, 105,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1, 106,  31,  31,  31,  31,
-     31,  31,  31,  31,  31,  31,  31,  31,   1,   1, 107,  31,  31,  31,  31,  31,
-};
-
-static RE_UINT8 re_id_start_stage_3[] = {
-      0,   0,   1,   1,   0,   2,   3,   3,   4,   4,   4,   4,   4,   4,   4,   4,
-      4,   4,   4,   4,   4,   4,   5,   6,   0,   0,   0,   7,   8,   9,   4,  10,
-      4,   4,   4,   4,  11,   4,   4,   4,   4,  12,  13,   4,  14,   0,  15,  16,
-      0,   4,  17,  18,   4,   4,  19,  20,  21,  22,  23,   4,   4,  24,  25,  26,
-     27,  28,  29,  17,   0,  30,   0,   0,  31,  32,  33,  34,  35,  36,  37,  38,
-     39,  40,  41,  42,  43,  44,  45,  46,  47,  44,  48,  49,  50,  51,  45,   0,
-     52,  53,  54,  55,  56,  57,  58,  59,  52,  60,  61,  62,  63,  64,  65,   0,
-     66,  67,  65,   0,  68,  69,  70,   0,  71,   0,  72,  73,  74,   0,   0,   0,
-      4,  75,  76,  77,  78,   4,  79,  80,   4,   4,  81,   4,  82,  83,  84,   4,
-     85,   4,  86,   0,  22,   4,   4,  87,  66,   4,   4,   4,   4,   4,   4,   4,
-      4,   4,   4,  88,   1,   4,   4,  89,  90,  91,  91,  92,   4,  93,  94,   0,
-      0,   4,   4,  29,   4,  95,   4,  96,  97,   0,  15,  98,   4,  99, 100,   0,
-    101,   4, 102,   0,   0, 103,   0,   0, 104,  93, 105,   0, 106, 107,   4, 108,
-      4, 109, 110, 111, 112, 113,   0, 114,   4,   4,   4,   4,   4,   4,   0,   0,
-     87,   4, 115, 111,   4, 116, 117, 118,   0,   0,   0, 119, 120,   0,   0,   0,
-    121, 122, 123,   4,  14,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      4, 124,  97,   4,   4,   4,   4, 125,   4,  79,   4, 126, 101, 127, 127,   0,
-    128, 129,  66,   4, 130,  66,   4,  80, 104,  12,   4,   4, 131,  86,   0,  15,
-      4,   4,   4,   4,   4,  96,   0,   0,   4,   4,   4,   4,   4,   4,   4,  22,
-      4,   4,   4,   4,  73,   0,  15, 111, 132, 133,   4, 134, 111,   4,   4,  22,
-    135, 136,   4,   4, 137,   4, 138, 135, 139, 140,   4,  93, 136,  93,   0, 141,
-     25, 142,  65, 143,  31, 144, 145, 146,   4,  14, 147, 148,   4, 149, 150, 151,
-    152, 153,  80, 154,   4,   4,   4, 140,   4,   4,   4,   4,   4, 155, 156, 157,
-      4,   4,   4, 158,   4,   4, 159,   0, 160, 161, 162,   4,   4,  91, 163,   4,
-      4, 111,  15,   4, 164,   4, 165, 166,   0,   0,   0, 167,   4,   4,   4, 143,
-      0,   1,   1, 168,   4,  97, 169,   0, 170, 171, 172,   0,   4,   4,   4,  86,
-      0,   0,   4, 102,   0,   0,   0,   0,   0,   0,   0,   0, 143,   4, 173,   0,
-      4,  23, 174,  96, 111,   4, 175,   0,   4,   4,   4,   4, 111,  15, 176, 157,
-      4, 154,   4, 109,   0,   0,   0,   0,   4, 101,  96, 165,   0,   0,   0,   0,
-    177, 178,  96, 101,  97,   0,   0, 179,  96, 159,   0,   0,   4, 180,   0,   0,
-    181,  96,   0, 143, 143,   0,  72, 182,   4,  96,  96, 144,  91,   0,   0,   0,
-      4,   4,  14,   0,   4, 144,   4, 144,   4, 109,   0,   0,   0,   0,   0,   0,
-    143, 183, 108,   0,   0,   0,   0, 101, 106, 184,   0,   0, 106,  22,  15,  14,
-    106,  65, 185, 186, 106, 144, 187,   0, 188, 189,   0,   0, 190, 112,  97,   0,
-     47,  44, 191,  55,   0,   0,   0,   0,   4, 102, 192,   0,   4,  22, 193,   0,
-      0,   0,   0,   0,   4, 131, 194,   0,   4,  22, 195,   0,   4, 196,   0,   0,
-     86,   0,   0,   0,   0,   0,   0,   0,   4, 189,   0,   0,   0,   4,   4, 197,
-      0,   0,   0,   0,   0, 198, 173, 199, 200, 201, 202,   4, 203,   0,   4,  29,
-    204, 131,  71, 205,  22,   0,   0,   0, 206, 173, 207, 208, 209,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0, 144,   4,   4,   4,   4, 159,   0,   0,   0,
-      4,   4,   4, 131,   4,   4,   4,   4,   4,   4, 109,   0,   0,   0,   0,   0,
-      4, 131,   0,   0,   0,   0,   0,   0,   4,   4,  65,   0,   0,   0,   0,   0,
-      4,  29,  97,   0,   0,   0,  15, 210,   4,  22, 109, 211,  22,   0,   0,   0,
-      0,   0,   4,   4,   0,   0,   0,   0,   4,   4, 212,   0, 163,   0,   0, 213,
-      4,   4,   4,   4,   4,   4,   4, 184,   4,   4,   4,   4,   4,   4,   4, 144,
-     97,   0, 214, 215,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4, 157,
-      4,   4,   4, 216, 217,   0,   0,   0,   4,   4, 218,   4, 219, 220, 221,   4,
-    222, 223, 224,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4, 225, 226,  80,
-    218, 218, 124, 124, 204, 204, 147,   0,   4, 227, 228,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   4, 189,   4,   4,   4,   4,   4,   4, 182,   0,
-      4,   4, 229,   0,   0,   0,   0,   0, 221, 230, 231, 232, 233, 234,   0,   0,
-      4,   4,   4,   4,   4,   4, 101,   0,   4, 102,   4,   4,   4,   4,   4,   4,
-    111,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4, 235,   4,   4,
-      4,   4,   4,   4,   4,   4,   4,  71, 111,   0,   0,   0,   0,   0,   0,   0,
-};
-
-static RE_UINT8 re_id_start_stage_4[] = {
-      0,   0,   0,   0, 254, 255, 255,   7,   0,   4,  32,   4, 255, 255, 127, 255,
-    255, 255, 255, 255, 195, 255,   3,   0,  31,  80,   0,   0,   0,   0, 223, 188,
-     64, 215, 255, 255, 251, 255, 255, 255, 255, 255, 191, 255,   3, 252, 255, 255,
-    255, 255, 254, 255, 255, 255, 127,   2, 255,   1,   0,   0,   0,   0, 255, 255,
-    255, 135,   7,   0, 255,   7,   0,   0,   0, 192, 254, 255, 255, 255,  47,   0,
-     96, 192,   0, 156,   0,   0, 253, 255, 255, 255,   0,   0,   0, 224, 255, 255,
-     63,   0,   2,   0,   0, 252, 255, 255, 255,   7,  48,   4, 255, 255,  63,   4,
-     16,   1,   0,   0, 255, 255, 255,   1, 255, 255, 223,  63, 240, 255, 255, 255,
-    255, 255, 255,  35,   0,   0,   1, 255,   3,   0, 254, 255, 225, 159, 249, 255,
-    255, 253, 197,  35,   0,  64,   0, 176,   3,   0,   3,  16, 224, 135, 249, 255,
-    255, 253, 109,   3,   0,   0,   0,  94,   0,   0,  28,   0, 224, 191, 251, 255,
-    255, 253, 237,  35,   0,   0,   1,   0,   3,   0,   0,   2, 224, 159, 249, 255,
-      0,   0,   0, 176,   3,   0,   2,   0, 232, 199,  61, 214,  24, 199, 255,   3,
-    224, 223, 253, 255, 255, 253, 255,  35,   0,   0,   0,   7,   3,   0,   0,   0,
-    225, 223, 253, 255, 255, 253, 239,  35,   0,   0,   0,  64,   3,   0,   6,   0,
-    255, 255, 255,  39,   0,  64, 112, 128,   3,   0,   0, 252, 224, 255, 127, 252,
-    255, 255, 251,  47, 127,   0,   0,   0, 254, 255, 255, 255, 255, 255,  13,   0,
-    214, 247, 255, 255, 175, 255,  13,  32,  95,   0,   0, 240,   1,   0,   0,   0,
-    255, 254, 255, 255, 255,  31,   0,   0,   0,  31,   0,   0, 255,   7,   0, 128,
-      0,   0,  63,  60,  98, 192, 225, 255,   3,  64,   0,   0, 191,  32, 255, 255,
-    255, 255, 255, 247, 255,  61, 127,  61, 255,  61, 255, 255, 255, 255,  61, 127,
-     61, 255, 127, 255, 255, 255,  61, 255, 255, 255, 255,   7, 255, 255,  63,  63,
-    255, 159, 255, 255, 255, 199, 255,   1, 255, 223,   3,   0, 255, 255,   3,   0,
-    255, 223,   1,   0, 255, 255,  15,   0,   0,   0, 128,  16, 255,   5, 255, 255,
-    255, 255,  63,   0, 255, 255, 255, 127, 255,  63,  31,   0, 255,  15, 255, 255,
-    255,   3,   0,   0, 255, 255, 127,   0, 255, 255,  31,   0, 128,   0,   0,   0,
-    224, 255, 255, 255, 224,  15,   0,   0, 248, 255, 255, 255,   1, 192,   0, 252,
-     63,   0,   0,   0,  15,   0,   0,   0,   0, 224,   0, 252, 255, 255, 255,  63,
-    255,   1, 255, 255, 255, 255, 255, 231,   0, 222, 111,   4,  63,  63, 255, 170,
-    255, 255, 223,  95, 220,  31, 207,  15, 255,  31, 220,  31,   0,   0,   2, 128,
-      0,   0, 255,  31, 132, 252,  47,  63,  80, 253, 255, 243, 224,  67,   0,   0,
-    255, 127, 255, 255,  31, 120,  12,   0, 255, 128,   0,   0, 127, 127, 127, 127,
-    224,   0,   0,   0, 254,   3,  62,  31, 255, 255, 127, 248, 255, 127,   0,   0,
-    255,  31, 255, 255,   0,  12,   0,   0, 255, 127,   0, 128,   0,   0, 128, 255,
-    252, 255, 255, 255, 255, 249, 255, 255, 124,   0,   0,   0, 187, 247, 255, 255,
-      7,   0,   0,   0,   0,   0, 252, 104,  63,   0, 255, 255, 255, 255, 255,  31,
-    255, 255,   7,   0,   0, 128,   0,   0, 223, 255,   0, 124, 247,  15,   0,   0,
-    255, 255, 127, 196, 255, 255,  98,  62,   5,   0,   0,  56, 255,   7,  28,   0,
-    126, 126, 126,   0, 127, 127, 255, 255, 255,   0, 255, 255,  15,   0, 255, 255,
-    127, 248, 255, 255, 255, 255, 255,  15, 255,  63, 255, 255, 255, 255, 255,   3,
-    127,   0, 248, 160, 255, 253, 127,  95, 219, 255, 255, 255,   0,   0, 248, 255,
-    255, 255, 252, 255, 255,   0,   0,   0,   0,   0, 255,  15,   0,   0, 223, 255,
-    192, 255, 255, 255, 252, 252, 252,  28, 255, 239, 255, 255, 127, 255, 255, 183,
-    255,  63, 255,  63, 255, 255,   1,   0, 255,   7, 255, 255,  15, 255,  62,   0,
-    255, 255,  15, 255,  63, 253, 255, 255, 255, 255, 191, 145, 255, 255,  55,   0,
-    255, 255, 255, 192,   1,   0, 239, 254,  31,   0,   0,   0, 128,   0, 255, 255,
-    255, 255, 255,   0,  16,   0, 255, 255, 255, 255,  71,   0,  30,   0,   0,  20,
-    255, 255, 251, 255, 255,  15,   0,   0, 127, 189, 255, 191,   0,   0,   1, 224,
-    128,   7,   0, 128, 176,   0,   0,   0,   0,   0,   0,  15,  16,   0,   0,   0,
-    255,   7,   0,   1,   0,   0,   0, 128, 255, 252, 255, 255,  10,   0,   0,   0,
-      1, 248, 255, 255, 255, 255,   7,   4,   0,   0,   1, 240, 255,   3,   0,  32,
-    255, 253, 255, 255,   0,   0, 252, 255, 127, 251, 255, 255,  64,   0,   0,   0,
-    191, 253, 255, 255, 255,   3,   0,   1, 255,  63,   0,   0, 248, 255, 255, 224,
-    255,   7,   1,   0,  11,   0,   0,   0,   0,   0,   7,   0, 240,   0, 255, 255,
-    255,   7, 255,  31, 255,   1, 255,   3, 255, 255, 223, 255, 255, 255, 255, 223,
-    100, 222, 255, 235, 239, 255, 255, 255, 191, 231, 223, 223, 255, 255, 255, 123,
-     95, 252, 253, 255,  63, 255, 255, 255, 253, 255, 255, 247, 255,  31, 128,  63,
-      0,  64,   0,   0,  15,   8,   0,   0, 150, 254, 247,  10, 132, 234, 150, 170,
-    150, 247, 247,  94, 255, 251, 255,  15, 238, 251, 255,  15,   3,   0, 255, 255,
-};
-
-/* ID_Start: 2496 bytes. */
-
-RE_UINT32 re_get_id_start(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-
-    f = ch >> 12;
-    code = ch ^ (f << 12);
-    pos = (RE_UINT32)re_id_start_stage_1[f] << 4;
-    f = code >> 8;
-    code ^= f << 8;
-    pos = (RE_UINT32)re_id_start_stage_2[pos + f] << 3;
-    f = code >> 5;
-    code ^= f << 5;
-    pos = (RE_UINT32)re_id_start_stage_3[pos + f] << 5;
-    pos += code;
-    value = (re_id_start_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1;
-
-    return value;
-}
-
-/* ID_Continue. */
-
-static RE_UINT8 re_id_continue_stage_1[] = {
-     0,  1,  2,  3,  4,  5,  5,  5,  5,  6,  7,  5,  5,  8,  9, 10,
-    11, 12, 13, 14, 15,  9, 16,  5, 17,  9,  9, 18,  9, 19, 20,  9,
-     5,  5,  5,  5,  5,  5,  5,  5,  5,  5, 21, 22, 23,  5, 24, 25,
      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  0,  9,  9,  0,  0,  0,  9,  0,  0,  9,
      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  0,  2,  9,  9,  9,  9,  9,  9,  9,  9,
+     0,  0,  0,  0,  0,  0,  0,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  0,  9,  9,  0,  0,  0,  0,  0,  9,  9,  9,  9,  9,
      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  2,
      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,  0,  9,
      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,  9,  9,  9,  9,
+     9,  1,  1,  1,  0,  1,  1,  0,  0,  0,  0,  0,  1,  1,  1,  1,
+     9,  9,  9,  9,  0,  9,  9,  9,  0,  9,  9,  9,  9,  9,  9,  9,
      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  0,  0,  1,  1,  1,  0,  0,  0,  0,  1,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,  0,  0,  0,
+     2,  2,  2,  2,  2,  2,  2,  2,  9,  0,  0,  0,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  1,  1,  0,  0,  0,  0,  9,  9,  9,  9,  9,
+     2,  2,  2,  2,  2,  2, 32,  0,  0,  0,  0,  0,  0,  0,  0,  0,
      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  0,  0,  0,  2,  2,  2,  2,  2,  2,  2,
      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  0,  0,  9,  9,  9,  9,  9,  9,  9,  9,
      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  0,  0,  0,  0,  0,  9,  9,  9,  9,  9,  9,  9,  9,
      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
-    26,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  0,  0,  0,  0,  0,  0,  0,  9,  9,  9,  9,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  9,  9,  9,  9,  9,  9,  9,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
-};
-
-static RE_UINT8 re_id_continue_stage_2[] = {
-      0,   1,   2,   3,   4,   5,   6,   7,   8,   9,  10,  11,  12,  13,  14,  15,
-     16,   1,  17,  18,  19,   1,  20,  21,  22,  23,  24,  25,  26,  27,   1,  28,
-     29,  30,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  32,  33,  31,  31,
-     34,  35,  31,  31,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,  36,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,  37,
-      1,   1,   1,   1,  38,   1,  39,  40,  41,  42,  43,  44,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,  45,  31,  31,  31,  31,  31,  31,  31,  31,
-     31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,
-     31,  31,  31,  31,  31,  31,  31,  31,  31,   1,  46,  47,   1,  48,  49,  50,
-     51,  52,  53,  54,  55,  56,   1,  57,  58,  59,  60,  61,  62,  63,  31,  64,
-     65,  66,  67,  68,  69,  70,  71,  72,  73,  74,  75,  31,  76,  77,  78,  31,
-      1,   1,   1,  79,  80,  81,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,
-      1,   1,   1,   1,  82,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,
-     31,  31,  31,  31,   1,   1,  83,  31,  31,  31,  31,  31,  31,  31,  31,  31,
-     31,  31,  31,  31,  31,  31,  31,  31,   1,   1,  84,  85,  31,  31,  86,  87,
-      1,   1,   1,   1,   1,   1,   1,  88,   1,   1,  89,  31,  31,  31,  31,  31,
-      1,  90,  91,  31,  31,  31,  31,  31,  31,  31,  31,  31,  92,  31,  31,  31,
-     31,  93,  94,  31,  95,  96,  97,  98,  31,  31,  99,  31,  31,  31,  31,  31,
-    100, 101, 102,  31,  31,  31,  31,  31, 103, 104,  31,  31,  31,  31, 105,  31,
-      1,   1,   1,   1,   1,   1, 106,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1, 107, 108,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1, 109,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1, 110,  31,  31,  31,  31,
-     31,  31,  31,  31,  31,  31,  31,  31,   1,   1, 111,  31,  31,  31,  31,  31,
-     31,  37,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,
-};
-
-static RE_UINT8 re_id_continue_stage_3[] = {
-      0,   0,   0,   1,   2,   3,   2,   4,   0,   0,   5,   6,   7,   8,   7,   8,
-      7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
-      7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   9,  10,  11,   0,
-      7,   7,   7,   7,   7,   7,   7,  12,  13,   7,  14,   7,   7,   7,   7,  15,
-      7,   7,   7,   7,   7,   7,   7,   7,  16,   7,   7,   7,   7,   7,   7,   7,
-      7,   7,   7,   2,   7,  17,   7,   7,  18,   2,   7,  19,  20,   7,   3,  21,
-      0,   4,   7,   7,   7,   7,  22,   7,   7,   7,   7,   7,   7,  23,  24,  25,
-      0,   7,   7,   7,  26,   7,   7,   7,   7,   7,   7,  10,   7,   7,   7,  27,
-      7,   7,  28,   0,   7,  29,   4,   0,   0,   0,   7,  30,   0,  31,  14,   7,
-      7,   7,   7,   7,   7,   7,  32,   2,  23,  33,  24,  34,  35,  36,  32,  37,
-     38,  33,  24,  39,  40,  41,  42,  43,  44,  14,  24,  45,  46,  47,  32,  48,
-     49,  33,  24,  45,  50,  51,  32,  52,  53,  54,  55,  22,  56,  57,  42,   0,
-     58,  59,  24,  60,  61,  62,  32,   0,  63,  59,  24,  64,  61,  65,  32,  66,
-     63,  59,   7,   7,  67,  68,  32,  69,  70,  71,   7,  72,  73,  74,  42,  75,
-      2,   7,   7,   4,  76,   1,   0,   0,  77,   7,  78,  28,  79,  80,   0,   0,
-     47,  81,   1,  82,  83,   7,  84,   2,  85,  83,   7,  84,  86,   0,   0,   0,
-      7,   7,   7,   7,   1,   7,   7,   7,   7,  28,   7,   7,  87,   7,   7,  88,
-      7,   7,   7,   7,  89,  90,   7,   7,  89,   7,   7,  91,  92,   8,   7,   7,
-      7,  92,   7,   7,   7,  26,  48,  10,   7,   0,   7,   7,   7,   7,   7,  93,
-      2,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
-      7,   7,   7,   7,   7,   7,  25,   7,   2,   4,   7,   7,   7,   7,  94,  18,
-     58,  95,   7,  95,   7,  96,  58,  97,   7,   7,   7,   7,   7,  98,   1,   0,
-     99,   1,   7,   7,   7,   7,   7,  18,   7,   7,   4,   7,   7,   7,   7,  43,
-      7,  76,  29,  29,  42,   7,  28,  95,   7,   7,  29,   7,   1,   4,   0,   0,
-      7,  29,   7,   7,   7,  76,   7,  25,   1,   1, 100,  28,   0,   0,   0,   0,
-      7,   7,   7,   7,  29,   1, 101,  96,   7,   7,   7,   7,   7,   7,   7,  96,
-      7,   7,   7, 102,  60,   7,   7,  28,  18,   7,   7,  26,   0, 103,   7,   4,
-      7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7, 104,
-      7,  93,   7,   7,  93, 105,   7,  28,   7,   7,   7, 106, 107, 108,  84, 107,
-      0,   0,   0, 109,  47, 110,   0, 111,   0,  84,   0,   0,   0,  84, 112,  47,
-    113, 114, 115,  80, 116,   0,   7,   7,  18,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      7,   7,  76,   7,   7,  76,   7,   7,   7,   7,   7,   7,   7,   7, 117,  96,
-      7,   7,  87,   7,   7,   7, 118, 109,   7, 119, 120, 120, 120, 120,   7,   7,
-    121,   0,   2, 122,   2,   7,   7,   7,   7, 123,   2,   7,   7,   7,   7,  88,
-    124,   7,   7,   2,   7,   7,   7,   7,  76,   0,   7,   4,   0,   0,   0,   7,
-      7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,  43,   0,   0,   0,   0,
-      7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   0,
-      7,   7,   7,   7,   7,   7,   7,   7,  84,   0,   0,   0,   0,   7,   7,  28,
-     84,   7,  29,   0,   7,   7,   7, 125,   7,   7,   7,   7,   7,   7,   7,  10,
-      0, 126, 127,   7,   7,   7,   7,   7, 128,   7,   7,   7, 129,   0,   0, 126,
-      7,   7, 102,   0,   7,   7,   7,  96,   7,   7,   7,   7,  43,   1,   7, 130,
-      7,   7,  28,   7,   7,  96,   7,  84,   7,   7,   7,   7, 131,   1,   7,  76,
-      7,   7,   7, 119,  28,   1,   7,  71,   7,   7,   7,   7,  21,  99,   7, 129,
-    132, 133, 120,   7,   7,  88, 102,   7,   7,   7,   7,   7,   7,   7, 134,   1,
-      7,   7,   7,   7,   7,   7,   7,   7,   7,   7,  96,   7, 135,   7,   7,  29,
-      7,   7,   7,   7,   7,   7,  28,   7,   7,   7,   7,   7,   7,   1,   0,   0,
-    119, 136,  24, 137, 138,   7,   7,   7,   7,   7,   7,  10,   0,  31,   7,   7,
-      7,   7,   7,  28,   0,   7,   7,   7,   7, 127,   7,   7, 102,   0,   0,  29,
-      7,   0,   7, 139, 140,   0,   0,  85,   7,   7,   7,   7,   7,   7,   7,  84,
-      0,   1,   2,   3,   2,   4,  42,   7,   7,   7,   7,  76, 141, 142,   0,   0,
-    143,   7,   8, 144,  28,  28,   0,   0,   7,   7,   7,   7,   7,   7,   7,   4,
-      0,   0,   0,   0,   7,   7,   7,  95,   0,   0,   0,   0,   0,   0,   0, 145,
-      0,   0,   0,   0,   0,   0,   0,   0,   7,  84,   7,   7,   7,  47,  47,   0,
-      7,   7, 140,   7,   4,   7,   7,   4,   7,  28,   7,   7, 146, 147,   0,   0,
-      7,   7,   7,   7,   7,   7,   7,   7,   7,  28,   1,   7,   7, 146,   7,  29,
-      7,   7, 102,   7,   7,   7,  96,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      7,   7,   7, 119,   7,  43, 102,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-    148,   7,   7, 149,   7,  43,   7, 119,   7,  76,   0,   0,   0,   0,   7, 150,
-      7,  43,   7,   1,   0,   0,   0,   0,   7,   7,   7, 151,   0,   0,   0,   0,
-    152, 153,   7, 154,   0,   0,   7,  84,   7,  84,   0,   0,  83,   7, 119,   0,
-      7,   7,   7,  43,   7,  43,   7,  21,   7,  10,   0,   0,   0,   0,   0,   0,
-      7,   7,   7,   7,  18,   0,   0,   0,   7,   7,   7,  21,   7,   7,   7,  21,
-      7,   7, 102,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      7,  84, 100,   7,   7,  47,   0,   0,   0,   0,   0,   0,   0,   0,   7, 119,
-      7,   7,   7,   7, 119,   0,  42, 109,   7,   7,   7,   4,   0,   7,  18,   1,
-      7,   7,   7,  85, 155,   7,   7, 156,   7,   7,   7,   7, 157, 158,   0,   0,
-      7,  14,   7, 159,   0,   0,   0,   0, 160,  19,  18,   7,   7,   7,   4,   1,
-     23,  33,  24, 161,  50, 162, 163,  95,   0,   0,   0,   0,   0,   0,   0,   0,
-      7,   7,   7,   7,   4,  22,   0,   0,   7,   7,   7,   7, 164,   1,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   7,   7,   7, 165,  47, 166,   0,   0,
-      7,   7,   7,   7, 167,   1,   0,   0,   7,   7,   7,  18,   1,   0,   0,   0,
-      7,  26,  29,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      7,   7,   7,   4,   0,   0,   0,   0,   0,   0,   7,   7,   7,   7,   1, 109,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 168,   7,   7, 168, 169,   0,
-      7,   7,   7,  76, 100,   7,   7,   7,   7, 170,   0,   0,   7,   7,   7,  18,
-     24,   7,   7,   8,  47,   1,   0, 127,   7, 127,  83, 119,   0,   0,   0,   0,
-    171,   7,   7, 172, 102,   1, 173,   7,  76, 174,   1,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   7, 119,
-      7,   7,   7,   7,   7,   7,   7,   7,   7,   1,   0,   0,   0,   0,   0,   0,
-      7,   7,   7,   7,   7,   7,  76,   0,   7,   7,   7,   7,   7,   7,   7,   7,
-      7,   7,   7,   7,  96,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      7,   7,  76,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      7,   7,   7,   7, 119,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      7,   7,   7,  18,   7,  76,   1,   0,   0,   0,   0,   0,   0,   7,  28,  95,
-      7,   7,   7, 119,  96,   1,  31, 175,   7,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   7,   7,   7,   7,   0,   0,   0,   0,   0,   0,   0,   0,
-      7,   7,   7,   7,   3,   7,   7,   7, 118,   7,   0,   0,   0,   0, 176,   0,
-      7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7, 102,
-      7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,  21,
-      7,  76,   0,   0,   0,  21, 177,   7,   7,   7,   7,   7,   7,   7,   7,   7,
-      7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,  29,
-      7,   7,   7,   7,   7,   7,   4,  84,  18, 178,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0, 179, 180, 181,   0, 182,   0,   0,   0,   0,   0,
-      0,   0,   0,   0, 183,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      7,   7,   7,   7,   7,  85,   7,   7,   7,  58, 184, 185, 186,   7,   7,   7,
-    187, 188,   7, 189, 190,  59,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
-      7,   7,   7,   7,   7,   7,   7,   7,   7,   7, 165,   7,  59,  88,   7,  88,
-      7,  85,   7,  85,  76,   7,  76,   7,  24,   7,  24,   7, 191,   7,   7,   7,
-      7,   7,   7, 135,   7,   7,  84, 192, 110, 101,   2,   0,   0,   0,   0,   0,
-      8, 128, 193,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      7,   7,  84,  28, 194,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   7,   7,   7,   1,
-      7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,  95, 119,   0,   0,
-      7,   7,   7,   7,  29,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-    186,   7, 195, 196, 197, 198, 199, 200, 104,  29, 201,  29,   0,   0,   0,   0,
-      7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7, 119,   0,   0,
-      7,   7,   7,  95,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
-      7,  28,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
-      7,   7,   7,   7,   7,   7,   7,   7,   7,   7,  10,   7,   7,   7,   7,   7,
-      7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,  47,   0,
-      7,  28,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-};
-
-static RE_UINT8 re_id_continue_stage_4[] = {
-      0,   0, 255,   3, 254, 255, 255, 135, 255,   7,   0,   4, 160,   4, 255, 255,
-    127, 255, 195, 255,   3,   0,  31,  80, 223, 188, 192, 215, 251, 255, 191, 255,
-    251, 252, 127,   2, 255,   1, 255, 191, 182,   0,   7,   0, 255, 195, 239, 159,
-    255, 253, 255, 159, 255, 231,  63,  36, 255,  63, 255,  15, 223,  63, 248, 255,
-    207, 255, 249, 255, 197, 243, 159, 121, 128, 176,   3,  80, 238, 135, 109, 211,
-    135,  57,   2,  94, 192, 255,  63,   0, 238, 191, 237, 243, 191,  59,   1,   0,
-      0, 254, 238, 159, 159,  57, 192, 176,   2,   0, 236, 199,  61, 214,  24, 199,
-    199,  61, 129,   0, 255, 223, 253, 255, 255, 227, 223,  61,  96,   7, 239, 223,
-    239, 243,  96,  64,   6,   0, 223, 125, 240, 128,   0, 252, 236, 255, 127, 252,
-    251,  47, 127, 132,  95, 255,  12,   0, 255, 127, 214, 247, 175, 255,  95,  63,
-    255, 243,   0,   3, 160, 194, 255, 254, 255,  31, 223, 255,  64,   0, 191,  32,
-    255, 247, 255,  61, 127,  61,  61, 127,  61, 255,  63,  63, 255, 199,  31,   0,
-     15,   0,  13,   0, 143,  48,   0,  56, 128,   0,   0, 248, 255,   0, 247, 255,
-    255, 251, 255, 170, 223,  95, 220,  31, 207,  15,   0, 128,  16,   0,   2, 128,
-    226, 255, 132, 252,  47,  63,  80, 253, 224,  67,  31, 248, 255, 128, 127,   0,
-    127, 127, 224,   0,  62,  31, 127, 254, 224, 255, 240, 191, 128, 255, 252, 255,
-    255, 249, 124,   0, 255, 232,   1, 128, 126, 126, 126,   0, 255,  55, 127, 248,
-    248, 224, 127,  95, 219, 255,  24,   0,   0, 224, 252, 252, 252,  28, 255, 239,
-    255, 183,   0,  32,  15, 255,  62,   0,  63, 253, 191, 145,  55,   0, 255, 192,
-    111, 240, 239, 254,  63, 135, 112,   0,  79,   0,  31,  30, 255,  23, 255,  64,
-    127, 189, 237, 251, 129, 224, 207,  31, 191,   0,  63, 255,   0,  63,  17,   0,
-    255, 252,  27,   0, 255,  35, 127, 251, 127, 180, 191, 253, 251,   1, 255, 224,
-     11,   0, 240,   0, 255,  99, 224, 227,   7, 248, 231,  15,   0,  60,  28,   0,
-    100, 222, 255, 235, 239, 255, 191, 231, 223, 223, 255, 123,  95, 252, 247, 207,
-     32,   0, 219,   7, 255,  67, 150, 254, 247,  10, 132, 234, 150, 170, 150, 247,
-    247,  94, 238, 251,
-};
-
-/* ID_Continue: 2900 bytes. */
-
-RE_UINT32 re_get_id_continue(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-
-    f = ch >> 12;
-    code = ch ^ (f << 12);
-    pos = (RE_UINT32)re_id_continue_stage_1[f] << 4;
-    f = code >> 8;
-    code ^= f << 8;
-    pos = (RE_UINT32)re_id_continue_stage_2[pos + f] << 4;
-    f = code >> 4;
-    code ^= f << 4;
-    pos = (RE_UINT32)re_id_continue_stage_3[pos + f] << 4;
-    pos += code;
-    value = (re_id_continue_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1;
-
-    return value;
-}
-
-/* XID_Start. */
-
-static RE_UINT8 re_xid_start_stage_1[] = {
-     0,  1,  2,  3,  4,  5,  5,  5,  5,  6,  7,  5,  5,  8,  9, 10,
-    11, 12, 13, 14, 15,  9, 16,  5, 17,  9,  9, 18,  9, 19, 20,  9,
-     5,  5,  5,  5,  5,  5,  5,  5,  5,  5, 21, 22, 23,  5, 24, 25,
+     9,  9,  9,  0,  0,  0,  0,  0,  0,  0,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  1,  1,  1,  1,  0,  0,  0,  0,  0,  0,  0,  0,
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17,  0,  0,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  1,  1,  2,  0,  0,
+     9,  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  2,  2,  9,  9,  9,  9,  9,  0,  0,
+     0,  0,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,
      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  9,  9,  9,  2,  2,
+     2,  2,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  9,  0,  0,
      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,  0,  0,  0,
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17,  0,  0,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  0, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+     2,  2,  2,  2,  9,  1,  1,  9,  0,  0,  0,  0,  0,  0,  0,  0,
      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  1,  9, 22,  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     1,  9,  9,  9,  9,  2,  2,  9,  2,  1,  1,  1,  1,  9,  1,  1,
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17,  9, 22,  9,  2,  2,  2,
+     0,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  0,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  2,  2,  9,  2,  2,  9,  1,  0,
+     9,  9,  9,  9,  9,  9,  9,  0,  9,  0,  9,  9,  9,  9,  0,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  2,  0,  0,  0,  0,  0,  0,
      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  0,  0,  0,  0,  0,
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17,  0,  0,  0,  0,  0,  0,
+     1,  1,  1,  1,  0,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  9,
+     9,  0,  0,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  9,  9,  9,  9,  9,  9,
+     9,  0,  9,  9,  0,  9,  9,  9,  9,  9,  0,  1,  1,  9,  1,  1,
+     1,  1,  1,  1,  1,  0,  0,  1,  1,  0,  0,  1,  1,  1,  0,  0,
+     9,  0,  0,  0,  0,  0,  0,  1,  0,  0,  0,  0,  0,  9,  9,  9,
+     9,  9,  1,  1,  0,  0,  1,  1,  1,  1,  1,  1,  1,  0,  0,  0,
+     1,  1,  1,  1,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  9,  9,  9,  9,  2,  2,  2,  2,  9,
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17,  2,  2,  0,  9,  1,  9,
+     9,  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     1,  1,  1,  1,  9,  9,  9,  9,  0,  0,  0,  0,  0,  0,  0,  0,
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17,  0,  0,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  1,
+     1,  1,  1,  1,  1,  1,  0,  0,  1,  1,  1,  1,  1,  1,  1,  1,
+     1, 22,  2,  2,  7,  7,  9,  9,  9,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  9,  9,  9,  9,  1,  1,  0,  0,
+     1,  2,  2,  9,  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17,  0,  0,  0,  0,  0,  0,
+    22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  9,  0,  0,  0,  0,  0,  0,  0,
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
+    24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,  0,  0, 24, 24, 24,
+    24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,  0,  0,  0,  0,
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 24, 24,  2,  2,  2, 24,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  9,  0,  0,  0,  0,
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  9,
+     9,  9,  9,  9,  9,  9,  9,  0,  0,  9,  0,  0,  9,  9,  9,  9,
+     9,  9,  9,  9,  0,  9,  9,  0,  9,  9,  9,  9,  9,  9,  9,  9,
      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     1,  1,  1,  1,  1,  1,  0,  1,  1,  0,  0,  1,  1,  1,  1,  9,
+     1,  9,  1,  1,  2,  2,  2,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17,  0,  0,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  9,  9,  9,  9,  9,  9,
      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  1,  1,  1,  1,  1,  1,  1,  0,  0,  1,  1,  1,  1,  1,  1,
+     1,  9, 22,  9,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     9,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  9,  9,  9,  9,  9,
      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
-};
-
-static RE_UINT8 re_xid_start_stage_2[] = {
-      0,   1,   2,   3,   4,   5,   6,   7,   8,   9,  10,  11,  12,  13,  14,  15,
-     16,   1,  17,  18,  19,   1,  20,  21,  22,  23,  24,  25,  26,  27,   1,  28,
-     29,  30,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  32,  33,  31,  31,
-     34,  35,  31,  31,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,  36,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,  37,
-      1,   1,   1,   1,  38,   1,  39,  40,  41,  42,  43,  44,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,  45,  31,  31,  31,  31,  31,  31,  31,  31,
-     31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,
-     31,  31,  31,  31,  31,  31,  31,  31,  31,   1,  46,  47,  48,  49,  50,  51,
-     52,  53,  54,  55,  56,  57,   1,  58,  59,  60,  61,  62,  63,  64,  31,  65,
-     66,  67,  68,  69,  70,  71,  72,  73,  74,  75,  76,  31,  77,  78,  79,  31,
-      1,   1,   1,  80,  81,  82,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,
-      1,   1,   1,   1,  83,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,
-     31,  31,  31,  31,   1,   1,  84,  31,  31,  31,  31,  31,  31,  31,  31,  31,
-     31,  31,  31,  31,  31,  31,  31,  31,   1,   1,  85,  86,  31,  31,  87,  88,
-      1,   1,   1,   1,   1,   1,   1,  89,   1,   1,  90,  31,  31,  31,  31,  31,
-      1,  91,  92,  31,  31,  31,  31,  31,  31,  31,  31,  31,  93,  31,  31,  31,
-     31,  31,  31,  31,  94,  95,  96,  97,  31,  31,  31,  31,  31,  31,  31,  31,
-     31,  98,  99,  31,  31,  31,  31,  31, 100, 101,  31,  31,  31,  31, 102,  31,
-      1,   1,   1,   1,   1,   1, 103,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1, 104, 105,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1, 106,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1, 107,  31,  31,  31,  31,
-     31,  31,  31,  31,  31,  31,  31,  31,   1,   1, 108,  31,  31,  31,  31,  31,
-};
-
-static RE_UINT8 re_xid_start_stage_3[] = {
-      0,   0,   1,   1,   0,   2,   3,   3,   4,   4,   4,   4,   4,   4,   4,   4,
-      4,   4,   4,   4,   4,   4,   5,   6,   0,   0,   0,   7,   8,   9,   4,  10,
-      4,   4,   4,   4,  11,   4,   4,   4,   4,  12,  13,   4,  14,   0,  15,  16,
-      0,   4,  17,  18,   4,   4,  19,  20,  21,  22,  23,   4,   4,  24,  25,  26,
-     27,  28,  29,  17,   0,  30,   0,   0,  31,  32,  33,  34,  35,  36,  37,  38,
-     39,  40,  41,  42,  43,  44,  45,  46,  47,  44,  48,  49,  50,  51,  45,   0,
-     52,  53,  54,  55,  56,  57,  58,  59,  52,  60,  61,  62,  63,  64,  65,   0,
-     66,  67,  65,   0,  68,  69,  70,   0,  71,   0,  72,  73,  74,   0,   0,   0,
-      4,  75,  76,  77,  78,   4,  79,  80,   4,   4,  81,   4,  82,  83,  84,   4,
-     85,   4,  86,   0,  22,   4,   4,  87,  66,   4,   4,   4,   4,   4,   4,   4,
-      4,   4,   4,  88,   1,   4,   4,  89,  90,  91,  91,  92,   4,  93,  94,   0,
-      0,   4,   4,  29,   4,  95,   4,  96,  97,   0,  15,  98,   4,  99, 100,   0,
-    101,   4, 102,   0,   0, 103,   0,   0, 104,  93, 105,   0, 106, 107,   4, 108,
-      4, 109, 110, 111, 112, 113,   0, 114,   4,   4,   4,   4,   4,   4,   0,   0,
-     87,   4, 115, 111,   4, 116, 117, 118,   0,   0,   0, 119, 120,   0,   0,   0,
-    121, 122, 123,   4,  14,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      4, 124,  97,   4,   4,   4,   4, 125,   4,  79,   4, 126, 101, 127, 127,   0,
-    128, 129,  66,   4, 130,  66,   4,  80, 104,  12,   4,   4, 131,  86,   0,  15,
-      4,   4,   4,   4,   4,  96,   0,   0,   4,   4,   4,   4,   4,   4,   4,  22,
-      4,   4,   4,   4,  73,   0,  15, 111, 132, 133,   4, 134, 111,   4,   4,  22,
-    135, 136,   4,   4, 137,   4, 138, 135, 139, 140,   4,  93, 136,  93,   0, 141,
-     25, 142,  65, 143,  31, 144, 145, 146,   4,  14, 147, 148,   4, 149, 150, 151,
-    152, 153,  80, 154,   4,   4,   4, 140,   4,   4,   4,   4,   4, 155, 156, 157,
-      4,   4,   4, 158,   4,   4, 159,   0, 160, 161, 162,   4,   4,  91, 163,   4,
-      4,   4, 111,  31,   4,   4,   4,   4,   4, 111,  15,   4, 164,   4, 165, 166,
-      0,   0,   0, 167,   4,   4,   4, 143,   0,   1,   1, 168, 111,  97, 169,   0,
-    170, 171, 172,   0,   4,   4,   4,  86,   0,   0,   4, 102,   0,   0,   0,   0,
-      0,   0,   0,   0, 143,   4, 173,   0,   4,  23, 174,  96, 111,   4, 175,   0,
-      4,   4,   4,   4, 111,  15, 176, 157,   4, 154,   4, 109,   0,   0,   0,   0,
-      4, 101,  96, 165,   0,   0,   0,   0, 177, 178,  96, 101,  97,   0,   0, 179,
-     96, 159,   0,   0,   4, 180,   0,   0, 181,  96,   0, 143, 143,   0,  72, 182,
-      4,  96,  96, 144,  91,   0,   0,   0,   4,   4,  14,   0,   4, 144,   4, 144,
-      4, 109,   0,   0,   0,   0,   0,   0, 143, 183, 108,   0,   0,   0,   0, 101,
-    106, 184,   0,   0, 106,  22,  15,  14, 106,  65, 185, 186, 106, 144, 187,   0,
-    188, 189,   0,   0, 190, 112,  97,   0,  47,  44, 191,  55,   0,   0,   0,   0,
-      4, 102, 192,   0,   4,  22, 193,   0,   0,   0,   0,   0,   4, 131, 194,   0,
-      4,  22, 195,   0,   4, 196,   0,   0,  86,   0,   0,   0,   0,   0,   0,   0,
-      4, 189,   0,   0,   0,   4,   4, 197,   0,   0,   0,   0,   0, 198, 173, 199,
-    200, 201, 202,   4, 203,   0,   4,  29, 204, 131,  71, 205,  22,   0,   0,   0,
-    206, 173, 207, 208, 209,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 144,
-      4,   4,   4,   4, 159,   0,   0,   0,   4,   4,   4, 131,   4,   4,   4,   4,
-      4,   4, 109,   0,   0,   0,   0,   0,   4, 131,   0,   0,   0,   0,   0,   0,
-      4,   4,  65,   0,   0,   0,   0,   0,   4,  29,  97,   0,   0,   0,  15, 210,
-      4,  22, 109, 211,  22,   0,   0,   0,   0,   0,   4,   4,   0,   0,   0,   0,
-      4,   4, 212,   0, 163,   0,   0, 213,   4,   4,   4,   4,   4,   4,   4, 184,
-      4,   4,   4,   4,   4,   4,   4, 144,  97,   0, 214, 215,   4,   4,   4,   4,
-      4,   4,   4,   4,   4,   4,   4, 157,   4,   4,   4, 216, 217,   0,   0,   0,
-      4,   4, 218,   4, 219, 220, 221,   4, 222, 223, 224,   4,   4,   4,   4,   4,
-      4,   4,   4,   4,   4, 225, 226,  80, 218, 218, 124, 124, 204, 204, 147,   0,
-      4, 227, 228,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   4, 189,
-      4,   4,   4,   4,   4,   4, 182,   0,   4,   4, 229,   0,   0,   0,   0,   0,
-    221, 230, 231, 232, 233, 234,   0,   0,   4,   4,   4,   4,   4,   4, 101,   0,
-      4, 102,   4,   4,   4,   4,   4,   4, 111,   4,   4,   4,   4,   4,   4,   4,
-      4,   4,   4,   4,   4, 235,   4,   4,   4,   4,   4,   4,   4,   4,   4,  71,
-    111,   0,   0,   0,   0,   0,   0,   0,
-};
-
-static RE_UINT8 re_xid_start_stage_4[] = {
-      0,   0,   0,   0, 254, 255, 255,   7,   0,   4,  32,   4, 255, 255, 127, 255,
-    255, 255, 255, 255, 195, 255,   3,   0,  31,  80,   0,   0,   0,   0, 223, 184,
-     64, 215, 255, 255, 251, 255, 255, 255, 255, 255, 191, 255,   3, 252, 255, 255,
-    255, 255, 254, 255, 255, 255, 127,   2, 255,   1,   0,   0,   0,   0, 255, 255,
-    255, 135,   7,   0, 255,   7,   0,   0,   0, 192, 254, 255, 255, 255,  47,   0,
-     96, 192,   0, 156,   0,   0, 253, 255, 255, 255,   0,   0,   0, 224, 255, 255,
-     63,   0,   2,   0,   0, 252, 255, 255, 255,   7,  48,   4, 255, 255,  63,   4,
-     16,   1,   0,   0, 255, 255, 255,   1, 255, 255, 223,  63, 240, 255, 255, 255,
-    255, 255, 255,  35,   0,   0,   1, 255,   3,   0, 254, 255, 225, 159, 249, 255,
-    255, 253, 197,  35,   0,  64,   0, 176,   3,   0,   3,  16, 224, 135, 249, 255,
-    255, 253, 109,   3,   0,   0,   0,  94,   0,   0,  28,   0, 224, 191, 251, 255,
-    255, 253, 237,  35,   0,   0,   1,   0,   3,   0,   0,   2, 224, 159, 249, 255,
-      0,   0,   0, 176,   3,   0,   2,   0, 232, 199,  61, 214,  24, 199, 255,   3,
-    224, 223, 253, 255, 255, 253, 255,  35,   0,   0,   0,   7,   3,   0,   0,   0,
-    225, 223, 253, 255, 255, 253, 239,  35,   0,   0,   0,  64,   3,   0,   6,   0,
-    255, 255, 255,  39,   0,  64, 112, 128,   3,   0,   0, 252, 224, 255, 127, 252,
-    255, 255, 251,  47, 127,   0,   0,   0, 254, 255, 255, 255, 255, 255,   5,   0,
-    214, 247, 255, 255, 175, 255,   5,  32,  95,   0,   0, 240,   1,   0,   0,   0,
-    255, 254, 255, 255, 255,  31,   0,   0,   0,  31,   0,   0, 255,   7,   0, 128,
-      0,   0,  63,  60,  98, 192, 225, 255,   3,  64,   0,   0, 191,  32, 255, 255,
-    255, 255, 255, 247, 255,  61, 127,  61, 255,  61, 255, 255, 255, 255,  61, 127,
-     61, 255, 127, 255, 255, 255,  61, 255, 255, 255, 255,   7, 255, 255,  63,  63,
-    255, 159, 255, 255, 255, 199, 255,   1, 255, 223,   3,   0, 255, 255,   3,   0,
-    255, 223,   1,   0, 255, 255,  15,   0,   0,   0, 128,  16, 255,   5, 255, 255,
-    255, 255,  63,   0, 255, 255, 255, 127, 255,  63,  31,   0, 255,  15, 255, 255,
-    255,   3,   0,   0, 255, 255, 127,   0, 255, 255,  31,   0, 128,   0,   0,   0,
-    224, 255, 255, 255, 224,  15,   0,   0, 248, 255, 255, 255,   1, 192,   0, 252,
-     63,   0,   0,   0,  15,   0,   0,   0,   0, 224,   0, 252, 255, 255, 255,  63,
-    255,   1, 255, 255, 255, 255, 255, 231,   0, 222, 111,   4,  63,  63, 255, 170,
-    255, 255, 223,  95, 220,  31, 207,  15, 255,  31, 220,  31,   0,   0,   2, 128,
-      0,   0, 255,  31, 132, 252,  47,  63,  80, 253, 255, 243, 224,  67,   0,   0,
-    255, 127, 255, 255,  31, 120,  12,   0, 255, 128,   0,   0, 127, 127, 127, 127,
-    224,   0,   0,   0, 254,   3,  62,  31, 255, 255, 127, 224, 255, 127,   0,   0,
-    255,  31, 255, 255,   0,  12,   0,   0, 255, 127,   0, 128,   0,   0, 128, 255,
-    252, 255, 255, 255, 255, 249, 255, 255, 124,   0,   0,   0, 187, 247, 255, 255,
-      7,   0,   0,   0,   0,   0, 252, 104,  63,   0, 255, 255, 255, 255, 255,  31,
-    255, 255,   7,   0,   0, 128,   0,   0, 223, 255,   0, 124, 247,  15,   0,   0,
-    255, 255, 127, 196, 255, 255,  98,  62,   5,   0,   0,  56, 255,   7,  28,   0,
-    126, 126, 126,   0, 127, 127, 255, 255, 255,   0, 255, 255,  15,   0, 255, 255,
-    127, 248, 255, 255, 255, 255, 255,  15, 255,  63, 255, 255, 255, 255, 255,   3,
-    127,   0, 248, 160, 255, 253, 127,  95, 219, 255, 255, 255,   0,   0, 248, 255,
-    255, 255, 252, 255, 255,   0,   0,   0,   0,   0, 255,   3,   0,   0, 138, 170,
-    192, 255, 255, 255, 252, 252, 252,  28, 255, 239, 255, 255, 127, 255, 255, 183,
-    255,  63, 255,  63, 255, 255,   1,   0, 255,   7, 255, 255,  15, 255,  62,   0,
-    255, 255,  15, 255,  63, 253, 255, 255, 255, 255, 191, 145, 255, 255,  55,   0,
-    255, 255, 255, 192,   1,   0, 239, 254,  31,   0,   0,   0, 128,   0, 255, 255,
-    255, 255, 255,   0,  16,   0, 255, 255, 255, 255,  71,   0,  30,   0,   0,  20,
-    255, 255, 251, 255, 255,  15,   0,   0, 127, 189, 255, 191,   0,   0,   1, 224,
-    128,   7,   0, 128, 176,   0,   0,   0,   0,   0,   0,  15,  16,   0,   0,   0,
-    255,   7,   0,   1,   0,   0,   0, 128, 255, 252, 255, 255,  10,   0,   0,   0,
-      1, 248, 255, 255, 255, 255,   7,   4,   0,   0,   1, 240, 255,   3,   0,  32,
-    255, 253, 255, 255,   0,   0, 252, 255, 127, 251, 255, 255,  64,   0,   0,   0,
-    191, 253, 255, 255, 255,   3,   0,   1, 255,  63,   0,   0, 248, 255, 255, 224,
-    255,   7,   1,   0,  11,   0,   0,   0,   0,   0,   7,   0, 240,   0, 255, 255,
-    255,   7, 255,  31, 255,   1, 255,   3, 255, 255, 223, 255, 255, 255, 255, 223,
-    100, 222, 255, 235, 239, 255, 255, 255, 191, 231, 223, 223, 255, 255, 255, 123,
-     95, 252, 253, 255,  63, 255, 255, 255, 253, 255, 255, 247, 255,  31, 128,  63,
-      0,  64,   0,   0,  15,   8,   0,   0, 150, 254, 247,  10, 132, 234, 150, 170,
-    150, 247, 247,  94, 255, 251, 255,  15, 238, 251, 255,  15,   3,   0, 255, 255,
-};
-
-/* XID_Start: 2504 bytes. */
-
-RE_UINT32 re_get_xid_start(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-
-    f = ch >> 12;
-    code = ch ^ (f << 12);
-    pos = (RE_UINT32)re_xid_start_stage_1[f] << 4;
-    f = code >> 8;
-    code ^= f << 8;
-    pos = (RE_UINT32)re_xid_start_stage_2[pos + f] << 3;
-    f = code >> 5;
-    code ^= f << 5;
-    pos = (RE_UINT32)re_xid_start_stage_3[pos + f] << 5;
-    pos += code;
-    value = (re_xid_start_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1;
-
-    return value;
-}
-
-/* XID_Continue. */
-
-static RE_UINT8 re_xid_continue_stage_1[] = {
-     0,  1,  2,  3,  4,  5,  5,  5,  5,  6,  7,  5,  5,  8,  9, 10,
-    11, 12, 13, 14, 15,  9, 16,  5, 17,  9,  9, 18,  9, 19, 20,  9,
-     5,  5,  5,  5,  5,  5,  5,  5,  5,  5, 21, 22, 23,  5, 24, 25,
+     9,  9,  9,  1,  1,  1,  1,  1,  1,  1,  9,  1,  1,  1,  1, 22,
+     9,  2,  2,  2,  2, 22,  9,  1,  0,  0,  0,  0,  0,  0,  0,  0,
+     9,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  2,  2,  2,  9, 22, 22,
+    22,  2,  2,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  1,
+     1,  1,  1,  1,  1,  1,  1,  0,  1,  1,  1,  1,  1,  1,  1,  1,
+     9,  2,  2,  2,  2,  2,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,
+    22,  7,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     0,  0,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  0,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  0,  9,  9,  0,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  1,  1,  1,  1,  1,  1,  0,  0,  0,  1,  0,  1,  1,  0,  1,
+     1,  1,  1,  1,  1,  1,  9,  1,  0,  0,  0,  0,  0,  0,  0,  0,
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17,  0,  0,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  0,  9,  9,  0,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  1,  1,  1,  1,  1,  0,
+     1,  1,  0,  1,  1,  1,  1,  1,  9,  0,  0,  0,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  1,  1,  1,  1,  9,  9,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9, 11, 11, 11,
+    11,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  2,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,
+     2,  2,  2,  2,  2,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     9,  9,  9,  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9, 12, 12, 12, 18, 18, 18,  9,  9,
+     9,  9, 18,  9,  9,  9, 12, 18, 12, 18,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9, 12, 18, 18,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,
+    20, 20, 20, 20, 20, 20, 20, 12, 18,  0,  0,  0,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9, 12, 18,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17,  0,  0,  0,  0,  2,  2,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,
+     1,  1,  1,  1,  1,  2,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     1,  1,  1,  1,  1,  1,  1,  2,  2,  2,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  2,  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17,  0,  9,  9,  9,  9,  9,
+     9,  9,  0,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,  0,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  2,  2,  9,  9,  0,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,  1,
+     9,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  0,  0,  0,  0,  0,  0,  0,  1,
+     1,  1,  1,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+    28, 28, 28, 28, 20,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     1,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    34, 34, 34, 34, 34, 34, 34, 34,  0,  0,  0,  0,  0,  0,  0,  0,
+    34, 34, 34, 34, 34, 34, 34, 34, 34,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    36, 36, 36,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0, 36, 36, 36, 36,  0,  0,  0,  0,  0,  0,  0,  0,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  9,  1,  1,  2,
+     1,  1,  1,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  0,  0,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  1,  1,  1,  1,  1,  9,  9,  9,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  9,  9,  1,  1,  1,  1,  1,  1,  1,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  1,  1,  1,  1,  9,  9,
      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  1,  1,  1,  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  9,  9,
+     0,  0,  9,  0,  0,  9,  9,  0,  0,  9,  9,  9,  9,  0,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  9,  0,  9,  9,  9,
+     9,  9,  9,  9,  0,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  0,  9,  9,  9,  9,  0,  0,  9,  9,  9,
+     9,  9,  9,  9,  9,  0,  9,  9,  9,  9,  9,  9,  9,  0,  9,  9,
      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  9,  9,  9,  9,  0,
+     9,  9,  9,  9,  9,  0,  9,  0,  0,  0,  9,  9,  9,  9,  9,  9,
+     9,  0,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  0,  0,  9,  9,  9,  9,  9,  9,  9,  9,
      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0, 17, 17,
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  9,  9,  9,  9,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  9,  9,  9,
+     9,  9,  9,  9,  9,  1,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  1,  9,  9,  2,  2,  2,  2,  9,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  1,  1,  1,  1,
+     0,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     1,  1,  1,  1,  1,  1,  1,  0,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  0,  0,  1,  1,  1,  1,  1,
+     1,  1,  0,  1,  1,  0,  1,  1,  1,  1,  1,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,
+     1,  1,  1,  1,  1,  1,  1,  9,  9,  9,  9,  9,  9,  9,  0,  0,
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17,  0,  0,  0,  0,  9,  9,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  1,  1,  1,  1,
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17,  0,  0,  0,  0,  0, 10,
+     9,  9,  9,  9,  9,  0,  0,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     1,  1,  1,  1,  1,  1,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     9,  9,  9,  9,  1,  1,  1,  1,  1,  1,  1,  9,  0,  0,  0,  0,
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17,  0,  0,  0,  0, 12, 12,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9, 11,  9,  9,  9,
+    11,  9,  9,  9,  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     0,  9,  9,  0,  9,  0,  0,  9,  0,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  0,  9,  9,  9,  9,  0,  9,  0,  9,  0,  0,  0,  0,
+     0,  0,  9,  0,  0,  0,  0,  9,  0,  9,  0,  9,  0,  9,  9,  9,
+     0,  9,  9,  0,  9,  0,  0,  9,  0,  9,  0,  9,  0,  9,  0,  9,
+     0,  9,  9,  0,  9,  0,  0,  9,  9,  9,  9,  0,  9,  9,  9,  9,
+     9,  9,  9,  0,  9,  9,  9,  9,  0,  9,  9,  9,  9,  0,  9,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,
+     0,  9,  9,  9,  0,  9,  9,  9,  9,  9,  0,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     9,  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 34, 34, 34,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,  9,  9,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21,  9,  9,  9, 34, 34, 34,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 34, 34, 34,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    34, 34, 34, 34, 34, 34, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41,
+    41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41,
+    34, 34, 34, 34, 34, 35, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,  9,  9, 34, 34,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    34, 34, 34, 34, 34,  9,  9, 34, 34, 34, 34, 34,  9, 34, 34, 34,
+    34, 34, 35, 35, 35, 34, 34, 35, 34, 34, 35, 35, 35, 34, 34, 34,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 42, 42, 42, 42, 42,
+    34, 34, 35, 35, 34, 34, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+    35, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    34, 34, 34, 34, 34, 34, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+    35, 35, 35, 35, 35, 35, 35, 35, 35, 34, 34, 34, 35, 34, 34, 34,
+    34, 35, 35, 35, 34, 35, 35, 35, 34, 34, 34, 34, 34, 34, 34, 35,
+    34, 35, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+     9, 34,  9, 34,  9, 34, 34, 34, 34, 34, 35, 34, 34, 34, 34,  9,
+    34,  9,  9, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+     9,  9,  9,  9,  9,  9,  9, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    34, 34, 34, 34, 34, 34, 34,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    34, 34,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9, 34, 34, 34, 34, 34, 34,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    34, 34, 34, 34, 35, 35, 34, 34, 34, 34, 35, 34, 34, 34, 34, 34,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    35, 34, 34, 34, 34, 35, 35, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    34, 34, 34, 34,  9,  9,  9,  9,  9,  9,  9,  9, 34, 34, 34, 34,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    34, 34, 34, 34,  9,  9,  9,  9,  9,  9, 34, 34, 34, 34, 34, 34,
+    34, 34, 34, 34, 34, 35, 35, 35, 34, 34, 34, 35, 35, 35, 35, 35,
      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  8,  8,  8, 28, 28, 28,  9,  9,  9,  9,
+    34, 34, 34, 35, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    34, 34, 34, 34, 35, 35, 35, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    35, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 35, 34, 34, 34,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9, 34, 34, 34, 34,
      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
-    26,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9, 34, 34, 34, 34, 34, 34, 34, 34,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9, 34, 34, 34, 34, 34, 34,
+     9,  9,  9,  9,  9,  9,  9,  9, 34, 34, 34, 34, 34, 34, 34, 34,
      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9, 34, 34,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9, 35, 34, 34, 35,
+    34, 34, 34, 34, 34, 34, 34, 34, 35, 35, 35, 35, 35, 35, 35, 35,
+    34, 34, 34, 34, 34, 34, 35, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 34, 34, 35, 35, 35, 34,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    34, 34, 34, 34, 34, 34, 34, 35, 34, 34, 34, 34, 34, 34, 34, 34,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    34, 34, 34, 34, 34, 35, 35, 34, 35, 35, 34, 35, 34, 34, 34, 34,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 35, 35, 35,
+    34, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 34, 34,
      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  0,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17,  0,  0,  0,  0,  0,  0,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,  0,  0,
+     0,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0
 };
 
-static RE_UINT8 re_xid_continue_stage_2[] = {
-      0,   1,   2,   3,   4,   5,   6,   7,   8,   9,  10,  11,  12,  13,  14,  15,
-     16,   1,  17,  18,  19,   1,  20,  21,  22,  23,  24,  25,  26,  27,   1,  28,
-     29,  30,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  32,  33,  31,  31,
-     34,  35,  31,  31,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,  36,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,  37,
-      1,   1,   1,   1,  38,   1,  39,  40,  41,  42,  43,  44,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,  45,  31,  31,  31,  31,  31,  31,  31,  31,
-     31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,
-     31,  31,  31,  31,  31,  31,  31,  31,  31,   1,  46,  47,  48,  49,  50,  51,
-     52,  53,  54,  55,  56,  57,   1,  58,  59,  60,  61,  62,  63,  64,  31,  65,
-     66,  67,  68,  69,  70,  71,  72,  73,  74,  75,  76,  31,  77,  78,  79,  31,
-      1,   1,   1,  80,  81,  82,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,
-      1,   1,   1,   1,  83,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,
-     31,  31,  31,  31,   1,   1,  84,  31,  31,  31,  31,  31,  31,  31,  31,  31,
-     31,  31,  31,  31,  31,  31,  31,  31,   1,   1,  85,  86,  31,  31,  87,  88,
-      1,   1,   1,   1,   1,   1,   1,  89,   1,   1,  90,  31,  31,  31,  31,  31,
-      1,  91,  92,  31,  31,  31,  31,  31,  31,  31,  31,  31,  93,  31,  31,  31,
-     31,  94,  95,  31,  96,  97,  98,  99,  31,  31, 100,  31,  31,  31,  31,  31,
-    101, 102, 103,  31,  31,  31,  31,  31, 104, 105,  31,  31,  31,  31, 106,  31,
-      1,   1,   1,   1,   1,   1, 107,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1, 108, 109,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1, 110,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1, 111,  31,  31,  31,  31,
-     31,  31,  31,  31,  31,  31,  31,  31,   1,   1, 112,  31,  31,  31,  31,  31,
-     31,  37,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,
+RE_UINT32 re_get_line_break(RE_UINT32 codepoint) {
+    RE_UINT32 field_2;
+    RE_UINT32 field_1;
+    RE_UINT32 field_0;
+    RE_UINT32 v;
+
+    field_2 = codepoint >> 10;
+    field_1 = (codepoint >> 5) & 0x1F;
+    field_0 = codepoint & 0x1F;
+
+    v = re_line_break_table_1[field_2];
+    v = re_line_break_table_2[(v << 5) | field_1];
+    v = re_line_break_table_3[(v << 5) | field_0];
+
+    return v;
+}
+
+/* Logical_Order_Exception. */
+RE_UINT32 re_get_logical_order_exception(RE_UINT32 codepoint) {
+    if (0x0E40 <= codepoint && codepoint <= 0x0E44)
+        return 1;
+    if (0x0EC0 <= codepoint && codepoint <= 0x0EC4)
+        return 1;
+    if (0x19B5 <= codepoint && codepoint <= 0x19B7)
+        return 1;
+    if (codepoint == 0x19BA)
+        return 1;
+    if (0xAAB5 <= codepoint && codepoint <= 0xAAB6)
+        return 1;
+    if (codepoint == 0xAAB9)
+        return 1;
+    if (0xAABB <= codepoint && codepoint <= 0xAABC)
+        return 1;
+
+    return 0;
+}
+
+/* Lowercase. */
+static RE_UINT8 re_lowercase_table_1[] = {
+     0,  1,  2,  2,  3,  2,  2,  4,  5,  6,  2,  7,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  8,  9,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2, 10, 11,
+     2, 12,  2, 13,  2,  2, 14,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2, 15,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2, 16,  2,  2,  2,  2, 17,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2
+};
+
+static RE_UINT8 re_lowercase_table_2[] = {
+     0,  0,  0,  1,  0,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12,
+     5, 13, 14, 15, 16, 17, 18, 19,  0,  0, 20, 21, 22, 23, 24, 25,
+     0, 26, 15,  5, 27,  5, 28,  5,  5, 29,  0, 15, 30,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0, 26, 31,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 32,
+     0,  0,  0,  0, 30,  0,  0,  0, 15, 15, 15, 15, 15, 15,  0,  0,
+     5,  5,  5,  5, 33,  5,  5,  5, 34, 35, 36, 37, 35, 38, 39, 40,
+     0,  0,  0, 41, 42,  0,  0,  0, 43, 44, 45, 26, 46,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0, 26, 47,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0, 26, 48, 49,  5,  5,  5, 50, 15, 51,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  5, 52, 53,  0,  0,  0,  0, 54,  5, 55, 56, 57, 58, 59,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0, 26, 60, 61, 15, 15,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0, 62,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  0,  0,  0,  0,  0,
+     0, 63, 64,  0,  0,  0, 65, 66,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0, 15, 67,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0, 15,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0, 15,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 68, 69, 81,
+    71, 72, 82, 64, 75, 83, 84, 85, 86, 82, 87, 26, 88, 75, 89,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0, 90, 91,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0
+};
+
+static RE_UINT8 re_lowercase_table_3[] = {
+      0,   0,   0,   0, 254, 255, 255,   7,   0,   4,  32,   4,   0,   0,   0, 128,
+    255, 255, 127, 255, 170, 170, 170, 170, 170, 170, 170,  85,  85, 171, 170, 170,
+    170, 170, 170, 212,  41,  49,  36,  78,  42,  45,  81, 230,  64,  82,  85, 181,
+    170, 170,  41, 170, 170, 170, 250, 147, 133, 170, 255, 255, 255, 255, 255, 255,
+    255, 255, 239, 255, 255, 255, 255,   1,   3,   0,   0,   0,  31,   0,   0,   0,
+     32,   0,   0,   0,   0,   0, 138,  60,   0,   0,   1,   0,   0, 240, 255, 255,
+    255, 127, 227, 170, 170, 170,  47,  25,   0,   0, 255, 255,   2, 168, 170, 170,
+     84, 213, 170, 170, 170, 170,   0,   0, 255,   1,   0,   0, 255, 255, 255, 231,
+      0,   0,   0,  63, 170, 170, 234, 191, 255,   0,  63,   0, 255,   0, 255,   0,
+     63,   0, 255,   0, 255,   0, 255,  63, 255,   0, 223,  64, 220,   0, 207,   0,
+    255,   0, 220,   0,   0,   0,   2, 128,   0,   0, 255,  31,   0, 196,   8,   0,
+      0, 128,  16,  50, 192,  67,   0,   0,  16,   0,   0,   0, 255,   3,   0,   0,
+    255, 255, 255, 127,  98,  21, 218,  63,  26,  80,   8,   0, 191,  32,   0,   0,
+    170,  42,   0,   0, 170, 170, 170,  58, 168, 170, 171, 170, 170, 170, 255, 149,
+    170,  80, 186, 170, 170, 130, 160, 170,   8,   5,   0,   0,   0,   0,  64,   7,
+    255, 255, 255, 247, 255,   1, 255, 255, 127,   0, 248,   0,   0, 255, 255, 255,
+    255, 255,   0,   0,   0,   0,   0, 255, 255, 255, 255,  15, 255, 255,   7,   0,
+      0,   0,   0, 252, 255, 255,  15,   0,   0, 192, 223, 255, 255,   0,   0,   0,
+    252, 255, 255,  15,   0,   0, 192, 235, 239, 255,   0,   0,   0, 252, 255, 255,
+     15,   0,   0, 192, 255, 255, 255,   0,   0,   0, 252, 255, 255,  15,   0,   0,
+    192, 255, 255, 255,   0, 192, 255, 255,   0,   0, 192, 255,  63,   0,   0,   0,
+    252, 255, 255, 247,   3,   0,   0, 240, 255, 255, 223,  15, 255, 127,  63,   0,
+    255, 253,   0,   0, 247,  11,   0,   0, 252, 255, 255, 255,  15,   0,   0,   0
 };
 
-static RE_UINT8 re_xid_continue_stage_3[] = {
-      0,   0,   0,   1,   2,   3,   2,   4,   0,   0,   5,   6,   7,   8,   7,   8,
-      7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
-      7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   9,  10,  11,   0,
-      7,   7,   7,   7,   7,   7,   7,  12,  13,   7,  14,   7,   7,   7,   7,  15,
-      7,   7,   7,   7,   7,   7,   7,   7,  16,   7,   7,   7,   7,   7,   7,   7,
-      7,   7,   7,   2,   7,  17,   7,   7,  18,   2,   7,  19,  20,   7,   3,  21,
-      0,   4,   7,   7,   7,   7,  22,   7,   7,   7,   7,   7,   7,  23,  24,  25,
-      0,   7,   7,   7,  26,   7,   7,   7,   7,   7,   7,  10,   7,   7,   7,  27,
-      7,   7,  28,   0,   7,  29,   4,   0,   0,   0,   7,  30,   0,  31,  14,   7,
-      7,   7,   7,   7,   7,   7,  32,   2,  23,  33,  24,  34,  35,  36,  32,  37,
-     38,  33,  24,  39,  40,  41,  42,  43,  44,  14,  24,  45,  46,  47,  32,  48,
-     49,  33,  24,  45,  50,  51,  32,  52,  53,  54,  55,  22,  56,  57,  42,   0,
-     58,  59,  24,  60,  61,  62,  32,   0,  63,  59,  24,  64,  61,  65,  32,  66,
-     63,  59,   7,   7,  67,  68,  32,  69,  70,  71,   7,  72,  73,  74,  42,  75,
-      2,   7,   7,   4,  76,   1,   0,   0,  77,   7,  78,  28,  79,  80,   0,   0,
-     47,  81,   1,  82,  83,   7,  84,   2,  85,  83,   7,  84,  86,   0,   0,   0,
-      7,   7,   7,   7,   1,   7,   7,   7,   7,  28,   7,   7,  87,   7,   7,  88,
-      7,   7,   7,   7,  89,  90,   7,   7,  89,   7,   7,  91,  92,   8,   7,   7,
-      7,  92,   7,   7,   7,  26,  48,  10,   7,   0,   7,   7,   7,   7,   7,  93,
-      2,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
-      7,   7,   7,   7,   7,   7,  25,   7,   2,   4,   7,   7,   7,   7,  94,  18,
-     58,  95,   7,  95,   7,  96,  58,  97,   7,   7,   7,   7,   7,  98,   1,   0,
-     99,   1,   7,   7,   7,   7,   7,  18,   7,   7,   4,   7,   7,   7,   7,  43,
-      7,  76,  29,  29,  42,   7,  28,  95,   7,   7,  29,   7,   1,   4,   0,   0,
-      7,  29,   7,   7,   7,  76,   7,  25,   1,   1, 100,  28,   0,   0,   0,   0,
-      7,   7,   7,   7,  29,   1, 101,  96,   7,   7,   7,   7,   7,   7,   7,  96,
-      7,   7,   7, 102,  60,   7,   7,  28,  18,   7,   7,  26,   0, 103,   7,   4,
-      7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7, 104,
-      7,  93,   7,   7,  93, 105,   7,  28,   7,   7,   7, 106, 107, 108,  84, 107,
-      0,   0,   0, 109,  47, 110,   0, 111,   0,  84,   0,   0,   0,  84, 112,  47,
-    113, 114, 115,  80, 116,   0,   7,   7,  18,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      7,   7,  76,   7,   7,  76,   7,   7,   7,   7,   7,   7,   7,   7, 117,  96,
-      7,   7,  87,   7,   7,   7, 118, 109,   7, 119, 120, 120, 120, 120,   7,   7,
-    121,   0,   2, 122,   2,   7,   7,   7,   7, 123,   2,   7,   7,   7,   7,  88,
-    124,   7,   7,   2,   7,   7,   7,   7,  76,   0,   7,   4,   0,   0,   0,   7,
-      7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,  43,   0,   0,   0,   0,
-      7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   0,
-      7,   7,   7,   7,   7,   7,   7,   7,  84,   0,   0,   0,   0,   7,   7,  28,
-     84,   7,  29,   0,   7,   7,   7, 125,   7,   7,   7,   7,   7,   7,   7,  10,
-      0, 126, 127,   7,   7,   7,   7,   7, 128,   7,   7,   7, 129,   0,   0, 126,
-      7,   7, 102,   0,   7,   7,   7,  96,   7,   7,   7,   7,  43,   1,   7, 130,
-      7,   7,  28,   7,   7,  96,   7,  84,   7,   7,   7,   7, 131,   1,   7,  76,
-      7,   7,   7, 119,  28,   1,   7,  71,   7,   7,   7,   7,  21,  99,   7, 129,
-    132, 133, 120,   7,   7,  88, 102,   7,   7,   7,   7,   7,   7,   7, 134,   1,
-      7,   7,   7,   7,   7,   7,   7,   7,   7,   7,  96,   7, 135,   7,   7,  29,
-      7,   7,   7,   7,   7,   7,  28,   7,   7,   7,   7,   7,   7,   1,   0,   0,
-    119, 136,  24, 137, 138,   7,   7,   7,   7,   7,   7,  10,   0,  31,   7,   7,
-      7,   7,   7,   7,   7,  28, 139,   7,   7,   7,   7,   7,   7,   7,   7,   7,
-      7,   7,   7,  28,   0,   7,   7,   7,   7, 127,   7,   7, 102,   0,   0,   1,
-      7,   0,   7, 140, 141,   0,   0, 142,   7,   7,   7,   7,   7,   7,   7,  84,
-      0,   1,   2,   3,   2,   4,  42,   7,   7,   7,   7,  76, 143, 144,   0,   0,
-    145,   7,   8, 146,  28,  28,   0,   0,   7,   7,   7,   7,   7,   7,   7,   4,
-      0,   0,   0,   0,   7,   7,   7,  95,   0,   0,   0,   0,   0,   0,   0, 147,
-      0,   0,   0,   0,   0,   0,   0,   0,   7,  84,   7,   7,   7,  47,  47,   0,
-      7,   7, 141,   7,   4,   7,   7,   4,   7,  28,   7,   7, 148, 149,   0,   0,
-      7,   7,   7,   7,   7,   7,   7,   7,   7,  28,   1,   7,   7, 148,   7,  29,
-      7,   7, 102,   7,   7,   7,  96,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      7,   7,   7, 119,   7,  43, 102,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-    150,   7,   7, 151,   7,  43,   7, 119,   7,  76,   0,   0,   0,   0,   7, 152,
-      7,  43,   7,   1,   0,   0,   0,   0,   7,   7,   7, 153,   0,   0,   0,   0,
-    154, 155,   7, 156,   0,   0,   7,  84,   7,  84,   0,   0,  83,   7, 119,   0,
-      7,   7,   7,  43,   7,  43,   7,  21,   7,  10,   0,   0,   0,   0,   0,   0,
-      7,   7,   7,   7,  18,   0,   0,   0,   7,   7,   7,  21,   7,   7,   7,  21,
-      7,   7, 102,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      7,  84, 100,   7,   7,  47,   0,   0,   0,   0,   0,   0,   0,   0,   7, 119,
-      7,   7,   7,   7, 119,   0,  42, 109,   7,   7,   7,   4,   0,   7,  18,   1,
-      7,   7,   7,  85, 157,   7,   7, 158,   7,   7,   7,   7, 159, 160,   0,   0,
-      7,  14,   7, 161,   0,   0,   0,   0, 162,  19,  18,   7,   7,   7,   4,   1,
-     23,  33,  24, 163,  50, 164, 165,  95,   0,   0,   0,   0,   0,   0,   0,   0,
-      7,   7,   7,   7,   4,  22,   0,   0,   7,   7,   7,   7, 166,   1,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   7,   7,   7, 167,  47, 168,   0,   0,
-      7,   7,   7,   7, 169,   1,   0,   0,   7,   7,   7,  18,   1,   0,   0,   0,
-      7,  26,  29,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      7,   7,   7,   4,   0,   0,   0,   0,   0,   0,   7,   7,   7,   7,   1, 109,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 170,   7,   7, 170, 171,   0,
-      7,   7,   7,  76, 100,   7,   7,   7,   7, 172,   0,   0,   7,   7,   7,  18,
-     24,   7,   7,   8,  47,   1,   0, 127,   7, 127,  83, 119,   0,   0,   0,   0,
-    173,   7,   7, 174, 102,   1, 175,   7,  76, 176,   1,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   7, 119,
-      7,   7,   7,   7,   7,   7,   7,   7,   7,   1,   0,   0,   0,   0,   0,   0,
-      7,   7,   7,   7,   7,   7,  76,   0,   7,   7,   7,   7,   7,   7,   7,   7,
-      7,   7,   7,   7,  96,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      7,   7,  76,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      7,   7,   7,   7, 119,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      7,   7,   7,  18,   7,  76,   1,   0,   0,   0,   0,   0,   0,   7,  28,  95,
-      7,   7,   7, 119,  96,   1,  31, 177,   7,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   7,   7,   7,   7,   0,   0,   0,   0,   0,   0,   0,   0,
-      7,   7,   7,   7,   3,   7,   7,   7, 118,   7,   0,   0,   0,   0, 178,   0,
-      7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7, 102,
-      7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,  21,
-      7,  76,   0,   0,   0,  21, 179,   7,   7,   7,   7,   7,   7,   7,   7,   7,
-      7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,  29,
-      7,   7,   7,   7,   7,   7,   4,  84,  18, 180,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0, 181, 182, 183,   0, 184,   0,   0,   0,   0,   0,
-      0,   0,   0,   0, 185,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      7,   7,   7,   7,   7,  85,   7,   7,   7,  58, 186, 187, 188,   7,   7,   7,
-    189, 190,   7, 191, 192,  59,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
-      7,   7,   7,   7,   7,   7,   7,   7,   7,   7, 167,   7,  59,  88,   7,  88,
-      7,  85,   7,  85,  76,   7,  76,   7,  24,   7,  24,   7, 193,   7,   7,   7,
-      7,   7,   7, 135,   7,   7,  84, 194, 110, 101,   2,   0,   0,   0,   0,   0,
-      8, 128, 195,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      7,   7,  84,  28, 196,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   7,   7,   7,   1,
-      7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,  95, 119,   0,   0,
-      7,   7,   7,   7,  29,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-    188,   7, 197, 198, 199, 200, 201, 202, 104,  29, 203,  29,   0,   0,   0,   0,
-      7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7, 119,   0,   0,
-      7,   7,   7,  95,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
-      7,  28,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
-      7,   7,   7,   7,   7,   7,   7,   7,   7,   7,  10,   7,   7,   7,   7,   7,
-      7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,  47,   0,
-      7,  28,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-};
+RE_UINT32 re_get_lowercase(RE_UINT32 codepoint) {
+    RE_UINT32 field_2;
+    RE_UINT32 field_1;
+    RE_UINT32 field_0;
+    RE_UINT32 offset;
+    RE_UINT32 v;
 
-static RE_UINT8 re_xid_continue_stage_4[] = {
-      0,   0, 255,   3, 254, 255, 255, 135, 255,   7,   0,   4, 160,   4, 255, 255,
-    127, 255, 195, 255,   3,   0,  31,  80, 223, 184, 192, 215, 251, 255, 191, 255,
-    251, 252, 127,   2, 255,   1, 255, 191, 182,   0,   7,   0, 255, 195, 239, 159,
-    255, 253, 255, 159, 255, 231,  63,  36, 255,  63, 255,  15, 223,  63, 248, 255,
-    207, 255, 249, 255, 197, 243, 159, 121, 128, 176,   3,  80, 238, 135, 109, 211,
-    135,  57,   2,  94, 192, 255,  63,   0, 238, 191, 237, 243, 191,  59,   1,   0,
-      0, 254, 238, 159, 159,  57, 192, 176,   2,   0, 236, 199,  61, 214,  24, 199,
-    199,  61, 129,   0, 255, 223, 253, 255, 255, 227, 223,  61,  96,   7, 239, 223,
-    239, 243,  96,  64,   6,   0, 223, 125, 240, 128,   0, 252, 236, 255, 127, 252,
-    251,  47, 127, 132,  95, 255,  12,   0, 255, 127, 214, 247, 175, 255,  95,  63,
-    255, 243,   0,   3, 160, 194, 255, 254, 255,  31, 223, 255,  64,   0, 191,  32,
-    255, 247, 255,  61, 127,  61,  61, 127,  61, 255,  63,  63, 255, 199,  31,   0,
-     15,   0,  13,   0, 143,  48,   0,  56, 128,   0,   0, 248, 255,   0, 247, 255,
-    255, 251, 255, 170, 223,  95, 220,  31, 207,  15,   0, 128,  16,   0,   2, 128,
-    226, 255, 132, 252,  47,  63,  80, 253, 224,  67,  31, 248, 255, 128, 127,   0,
-    127, 127, 224,   0,  62,  31, 127, 230, 224, 255, 240, 191, 128, 255, 252, 255,
-    255, 249, 124,   0, 255, 232,   1, 128, 126, 126, 126,   0, 255,  55, 127, 248,
-    248, 224, 127,  95, 219, 255, 240, 255,  24,   0,   0, 224, 138, 170, 252, 252,
-    252,  28, 255, 239, 255, 183,   0,  32,  15, 255,  62,   0,  63, 253, 191, 145,
-     55,   0, 255, 192, 111, 240, 239, 254,  63, 135, 112,   0,  79,   0,  31,  30,
-    255,  23, 255,  64, 127, 189, 237, 251, 129, 224, 207,  31, 191,   0,  63, 255,
-      0,  63,  17,   0, 255, 252,  27,   0, 255,  35, 127, 251, 127, 180, 191, 253,
-    251,   1, 255, 224,  11,   0, 240,   0, 255,  99, 224, 227,   7, 248, 231,  15,
-      0,  60,  28,   0, 100, 222, 255, 235, 239, 255, 191, 231, 223, 223, 255, 123,
-     95, 252, 247, 207,  32,   0, 219,   7, 255,  67, 150, 254, 247,  10, 132, 234,
-    150, 170, 150, 247, 247,  94, 238, 251,
-};
+    field_2 = codepoint >> 10;
+    field_1 = (codepoint >> 5) & 0x1F;
+    field_0 = (codepoint >> 3) & 0x3;
+    offset = codepoint & 0x7;
 
-/* XID_Continue: 2920 bytes. */
-
-RE_UINT32 re_get_xid_continue(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-
-    f = ch >> 12;
-    code = ch ^ (f << 12);
-    pos = (RE_UINT32)re_xid_continue_stage_1[f] << 4;
-    f = code >> 8;
-    code ^= f << 8;
-    pos = (RE_UINT32)re_xid_continue_stage_2[pos + f] << 4;
-    f = code >> 4;
-    code ^= f << 4;
-    pos = (RE_UINT32)re_xid_continue_stage_3[pos + f] << 4;
-    pos += code;
-    value = (re_xid_continue_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1;
-
-    return value;
-}
+    v = re_lowercase_table_1[field_2];
+    v = re_lowercase_table_2[(v << 5) | field_1];
+    v = re_lowercase_table_3[(v << 2) | field_0];
 
-/* Default_Ignorable_Code_Point. */
+    return (v >> offset) & 0x1;
+}
 
-static RE_UINT8 re_default_ignorable_code_point_stage_1[] = {
-    0, 1, 2, 2, 2, 2, 2, 3, 2, 2, 2, 2, 2, 4, 5, 2,
+/* Math. */
+static RE_UINT8 re_math_table_1[] = {
+    0, 1, 2, 2, 2, 2, 2, 2, 3, 4, 5, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 6, 7,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 8, 2, 2, 2, 2, 2, 9, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
     2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
     2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
     2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
     2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
     2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
     2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    6, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2
 };
 
-static RE_UINT8 re_default_ignorable_code_point_stage_2[] = {
-     0,  1,  2,  3,  2,  2,  2,  2,  4,  2,  2,  5,  6,  2,  2,  2,
-     7,  2,  2,  2,  2,  2,  2,  2,  8,  2,  2,  2,  2,  2,  2,  2,
-     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
-     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  9,
-     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2, 10,  2,
-     2,  2,  2,  2,  2,  2,  2,  2, 11,  2,  2,  2,  2,  2,  2,  2,
-    12, 12, 12, 12, 12, 12, 12, 12,  2,  2,  2,  2,  2,  2,  2,  2,
+static RE_UINT8 re_math_table_2[] = {
+     0,  1,  2,  3,  0,  4,  5,  5,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  6,  7,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     8,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     9, 10, 11, 12, 13,  0, 14, 15, 16, 17, 18,  0, 19, 20, 21, 22,
+    23, 23, 23, 23, 23, 23, 23, 23, 24, 25,  0, 26, 27, 28, 29, 30,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 31, 32, 33,
+    34,  0, 35, 36,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 23, 23,
+     0,  0,  0,  0,  0,  0,  0,  0, 23, 23, 23, 23, 23, 23, 23, 23,
+    23, 23, 23, 23, 23, 23, 23, 23,  0, 19, 37,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0, 38,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0, 39,  0,  0,  0,  0,  1,  3,  3,  0,  0,  0,  0, 40,
+    23, 23, 41, 23, 42, 43, 44, 23, 45, 46, 47, 23, 23, 23, 23, 23,
+    23, 23, 23, 23, 23, 48, 23, 23, 23, 23, 23, 23, 23, 23, 49, 23,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    44, 50, 51, 52, 53, 54,  0, 55,  0,  0,  0,  0,  0,  0,  0,  0
 };
 
-static RE_UINT8 re_default_ignorable_code_point_stage_3[] = {
-     0,  0,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  2,  0,  0,
-     0,  0,  0,  0,  0,  0,  0,  0,  3,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  4,  0,  0,  0,  0,  0,  0,  0,  0,  5,  0,
-     6,  0,  0,  0,  0,  0,  0,  0,  7,  8,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  9,  0,  0, 10,  0,  0, 11,  0,  0, 12, 13,
-     0,  0, 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 15,  0,  0,
-    16, 16, 16, 16, 16, 16, 16, 16,
+static RE_UINT8 re_math_table_3[] = {
+      0,   0,   0,   0,   0,   8,   0, 112,   0,   0,   0,  64,   0,   0,   0,  80,
+      0,  16,   2,   0,   0,   0, 128,   0,   0,   0,  39,   0,   0,   0, 115,   0,
+    192,   1,   0,   0,   0,   0,  64,   0,   0,   0,  28,   0,  17,   0,   4,   0,
+     30,   0,   0, 124,   0, 124,   0,   0,   0,   0, 255,  31,  98, 248,   0,   0,
+    132, 252,  47,  63,  16, 179, 251, 241, 255,  11,   0,   0,   0,   0, 255, 255,
+    255, 126, 195, 240, 255, 255, 255,  47,  48,   0, 240, 255, 255, 255, 255, 255,
+      0,  15,   0,   0,   3,   0,   0,   0,   0,   0,   0,  16,   0,   0,   0, 248,
+    255, 255, 191,   0,   0,   0,   1, 240,   7,   0,   0,   0,   3, 192, 255, 240,
+    195, 140,  15,   0, 148,  31,   0, 255,  96,   0,   0,   0,   5,   0,   0,   0,
+     15, 224,   0,   0, 159,  31,   0,   0,   0,   2,   0,   0, 126,   1,   0,   0,
+      4,  30,   0,   0, 255, 255, 223, 255, 255, 255, 255, 223, 100, 222, 255, 235,
+    239, 255, 255, 255, 191, 231, 223, 223, 255, 255, 255, 123,  95, 252, 253, 255,
+     63, 255, 255, 255, 255, 207, 255, 255, 150, 254, 247,  10, 132, 234, 150, 170,
+    150, 247, 247,  94, 255, 251, 255,  15, 238, 251, 255,  15,   0,   0,   3,   0
 };
 
-static RE_UINT8 re_default_ignorable_code_point_stage_4[] = {
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  32,   0,   0,
-      0, 128,   0,   0,   0,   0,   0,   0,   0,   0,   0,  16,   0,   0,   0,   0,
-      0,   0,   0, 128,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,  48,   0,
-      0, 120,   0,   0,   0,   0,   0,   0,   0, 248,   0,   0,   0, 124,   0,   0,
-      0,   0,   0,   0, 255, 255,   0,   0,   0,   0,   0,   0,  16,   0,   0,   0,
-    255, 255,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 128,
-      0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0, 255,   1,
-      0,   0,   0,   0,  15,   0,   0,   0,   0,   0,   0,   0,   0,   0, 248,   7,
-    255, 255, 255, 255, 255, 255, 255, 255,
-};
+RE_UINT32 re_get_math(RE_UINT32 codepoint) {
+    RE_UINT32 field_2;
+    RE_UINT32 field_1;
+    RE_UINT32 field_0;
+    RE_UINT32 offset;
+    RE_UINT32 v;
+
+    field_2 = codepoint >> 10;
+    field_1 = (codepoint >> 5) & 0x1F;
+    field_0 = (codepoint >> 3) & 0x3;
+    offset = codepoint & 0x7;
+
+    v = re_math_table_1[field_2];
+    v = re_math_table_2[(v << 5) | field_1];
+    v = re_math_table_3[(v << 2) | field_0];
 
-/* Default_Ignorable_Code_Point: 488 bytes. */
-
-RE_UINT32 re_get_default_ignorable_code_point(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-
-    f = ch >> 13;
-    code = ch ^ (f << 13);
-    pos = (RE_UINT32)re_default_ignorable_code_point_stage_1[f] << 4;
-    f = code >> 9;
-    code ^= f << 9;
-    pos = (RE_UINT32)re_default_ignorable_code_point_stage_2[pos + f] << 3;
-    f = code >> 6;
-    code ^= f << 6;
-    pos = (RE_UINT32)re_default_ignorable_code_point_stage_3[pos + f] << 6;
-    pos += code;
-    value = (re_default_ignorable_code_point_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1;
-
-    return value;
+    return (v >> offset) & 0x1;
 }
 
-/* Grapheme_Extend. */
+/* NFC_Quick_Check. */
+static RE_UINT8 re_nfc_quick_check_table_1[] = {
+     0,  1,  2,  3,  4,  5,  6,  7,  8,  5,  9,  5, 10,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5, 11,  5,
+     5,  5,  5,  5, 12, 13, 14,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5, 15,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5, 16,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5
+};
 
-static RE_UINT8 re_grapheme_extend_stage_1[] = {
-     0,  1,  2,  2,  2,  3,  2,  4,  5,  2,  2,  6,  2,  7,  8,  9,
-     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
-     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
-     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
-     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
-     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
-     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
-    10,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
-     2,  2,  2,  2,  2,  2,  2,  2,
+static RE_UINT8 re_nfc_quick_check_table_2[] = {
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  1,  2,  3,  4,  5,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  6,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  7,  8,  0,  0,  9, 10,  0,
+     0, 11, 12,  0,  0,  0,  0,  0,  0,  9, 13,  0,  0,  9, 14,  0,
+     0,  0, 15,  0,  0,  0, 16,  0,  0,  9, 14,  0,  0,  0, 17,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 18, 19, 20, 21,  0,  0,
+     0, 22,  0,  0,  0,  0,  0,  0,  0,  0,  0, 23,  0, 24, 25,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0, 26,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 27,  0, 28, 29, 30,
+    31,  0,  0,  0,  0,  0,  0,  0,  0, 32,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0, 33,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0, 34,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0, 35,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0, 36, 36, 36, 36, 36, 36, 36, 36,
+    37, 38, 36, 39, 36, 36, 40,  0, 41, 42, 43,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0, 44,  0,  0,  0, 45,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  9, 14,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0, 46,  0,  0,  0,  0,  0,  0,  0, 47,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0, 48,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 49, 50,  0, 51, 52,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
+    53,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0
+};
+
+static RE_UINT8 re_nfc_quick_check_table_3[] = {
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 2,
+    1, 2, 1, 2, 2, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1,
+    1, 1, 1, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 2, 2, 1,
+    2, 2, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1,
+    0, 0, 2, 0, 0, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1,
+    1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 0, 0, 1, 0,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 2, 2, 1, 1, 1, 1, 0, 0, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2,
+    1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1,
+    1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1,
+    1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1,
+    1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1,
+    1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1,
+    1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1,
+    0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 1, 1, 1, 1, 1,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1,
+    0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
+    0, 1, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1,
+    0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 2, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0,
+    0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0,
+    0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1
 };
 
-static RE_UINT8 re_grapheme_extend_stage_2[] = {
-     0,  0,  0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13,
-    14,  0,  0, 15,  0,  0,  0, 16, 17, 18, 19, 20, 21, 22,  0,  0,
-    23,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 24, 25,  0,  0,
-    26,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+RE_UINT32 re_get_nfc_quick_check(RE_UINT32 codepoint) {
+    RE_UINT32 field_2;
+    RE_UINT32 field_1;
+    RE_UINT32 field_0;
+    RE_UINT32 v;
+
+    field_2 = codepoint >> 10;
+    field_1 = (codepoint >> 5) & 0x1F;
+    field_0 = codepoint & 0x1F;
+
+    v = re_nfc_quick_check_table_1[field_2];
+    v = re_nfc_quick_check_table_2[(v << 5) | field_1];
+    v = re_nfc_quick_check_table_3[(v << 5) | field_0];
+
+    return v;
+}
+
+/* NFD_Quick_Check. */
+static RE_UINT8 re_nfd_quick_check_table_1[] = {
+     0,  1,  2,  3,  4,  5,  6,  7,  8,  5,  9,  5, 10,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 12,  5,  5,  5,  5,  5,  5,  5,  5, 13,  5,
+     5,  5,  5,  5, 14, 15, 16,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5, 17,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5, 18,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5
+};
+
+static RE_UINT8 re_nfd_quick_check_table_2[] = {
+     0,  0,  0,  0,  0,  0,  1,  2,  3,  4,  5,  6,  0,  7,  8,  9,
+    10, 11,  0,  0,  0,  0,  0,  0,  0,  0, 12, 13, 14, 15, 16,  0,
+    17, 18, 19, 20,  0,  0, 21, 22,  0,  0,  0,  0,  0,  0,  0,  0,
+     0, 23,  0,  0,  0,  0, 24,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0, 25, 26,  0,  0,  0, 27,  0,
+     0, 28, 29,  0,  0,  0,  0,  0,  0,  0, 30,  0, 31,  0, 32,  0,
+     0,  0, 33,  0,  0,  0, 34,  0,  0,  0, 32,  0,  0,  0, 35,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 36, 37, 38, 39,  0,  0,
+     0, 40,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0, 27,  0, 28, 29, 30, 31,  0,  0,  0,  0,
      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 32,  0,  0, 33, 34,
-     0, 35, 36, 37,  0,  0,  0,  0,  0,  0, 38,  0,  0, 39,  0, 40,
-    41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51,  0, 52, 53, 54,  0,
-     0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 55, 56,  0,  0,  0, 57,
+     0,  0,  0,  0,  0,  0,  0,  0, 41, 42, 43,  0,  0,  0,  0,  0,
      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    44, 44, 44, 44, 45, 44, 44, 46, 47, 44, 48, 49, 44, 50, 51, 52,
+    53,  0,  0,  0,  0,  0,  0,  0,  0, 54,  0,  0, 55, 56, 57,  0,
+    58, 59, 60, 61, 62, 63,  0, 64,  0, 65,  0,  0,  0,  0,  0,  0,
      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 58,  0,  0,  0,
+     0,  0,  0,  0,  0,  0, 66,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0, 67, 68, 13, 67, 68, 69,  0,  0,  0,  0,  0,  0,  0,  0,
      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0, 59, 60,  0,  0,  0,  0,  0,  0,  0, 61,  0,  0,  0,  0,  0,
-    62, 56, 63,  0,  0,  0,  0,  0, 64, 65,  0,  0,  0,  0,  0,  0,
+    44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44,
+    44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44,
+    44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44,
+    44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 70,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0, 44, 44, 44, 44, 44, 44, 44, 44,
+    71, 72, 44, 73, 44, 44, 46,  0, 74, 75, 76,  0,  0,  0,  0,  0,
+     0,  0,  0,  0, 77, 78,  0,  0,  0, 79,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 80,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0, 81,  0,  0,  0,  0,  0,  0,  0, 55,  0,  0,
      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    66, 67,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0, 82,  0,  0,  0,  0,  0,  0,
      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-};
-
-static RE_UINT8 re_grapheme_extend_stage_3[] = {
-      0,   0,   0,   0,   0,   0,   0,   0,   1,   1,   1,   2,   0,   0,   0,   0,
-      0,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   4,   5,   6,   0,
-      7,   0,   8,   9,   0,   0,  10,  11,  12,  13,  14,   0,   0,  15,   0,  16,
-     17,  18,  19,   0,   0,   0,  20,  21,  22,  23,  24,  25,  26,  27,  28,  29,
-     30,  31,  32,  33,  30,  31,  34,  35,  26,  36,  37,  25,  38,  39,  40,   0,
-     41,  42,  43,  25,  26,  44,  45,  25,  46,  47,  28,  25,   0,   0,  48,   0,
-      0,  49,  50,   0,   0,  51,  52,   0,  53,  54,   0,  55,  56,  57,  58,   0,
-      0,  59,  60,  61,  62,   0,   0,   0,   0,   0,  63,   0,   0,   0,   0,   0,
-     64,  64,  65,  65,   0,  66,  67,   0,  68,   0,   0,   0,  69,  70,   0,   0,
-      0,  71,   0,   0,   0,   0,   0,   0,  72,   0,  73,  74,   0,  75,   0,   0,
-     76,  77,  38,  78,  46,  79,   0,  80,   0,  81,   0,   0,   0,   0,  82,  83,
-      0,   0,   0,   0,   0,   0,   1,  84,  85,   0,   0,   0,   0,   0,  13,  86,
-      0,   0,   0,   0,   0,   0,   0,  87,   0,   0,   0,  88,   0,   0,   0,   1,
-      0,  89,   0,   0,  90,   0,   0,   0,   0,   0,   0,  91,  42,   0,   0,  92,
-     93,  69,   0,   0,   0,   0,  94,  95,   0,  96,  97,   0,  22,  98,   0,  99,
-      0, 100, 101,  31,   0, 102,  26, 103,   0,   0,   0,   0,   0,   0,   0, 104,
-     39,   0,   0,   0,   0,   0,   0,   0,   2,   2,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,  42,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 105,
-      0,   0,   0,   0,   0,   0,   0, 106,   0,   0,   0, 107,   0,   0,   0,   0,
-    108, 109,   0,   0,   0,   0,   0,  69,   0, 110,   0,   0,   0,   0,   0,   0,
-      0,   0,  15,   0,   0,   0,   0,   0,  26, 111, 112,  88,  46, 113,   0,   0,
-     22, 114,   0, 115,  46, 116, 117,   0,   0, 118,   0,   0,   0,   0,  88, 119,
-     46,  47, 120, 121,   0,   0,   0,   0,   0, 111, 122,   0,   0, 123, 124,   0,
-      0,   0,   0,   0,   0, 125, 126,   0,   0, 127, 106,   0,   0, 128,   0,   0,
-     63, 129,   0,   0,   0,   0,   0,   0,   0, 130,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0, 131, 106, 132, 133, 134,   0, 135,   0,   0,   0,
-      0, 136,   0,   0, 137, 138,   0,   0,   0, 139, 140,   0, 141,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0, 142,   0,   0,   0,   0,   0,   0,   0, 143,
-      0, 144,   0,   0,   0,   0,   0,   0,   0,   0, 145,   0, 146,   0,   0,   0,
-      0,   0,   0,   0, 147,   0,   0,   0,   0,   0,   0, 148, 149, 150,   0,   0,
-      0,   0, 151,   0,   0,   0,   0,   0,   1, 152,   1, 153, 154, 155,   0,   0,
-    156, 157,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 158,
-      0,   0,   0,   0,   0,   0, 144,   0,   0,   0, 159,   0,   0,   0,   0,   0,
-      0,   1,   1,   1,   0,   0,   0,   0,   1,   1,   1,   1,   1,   1,   1,   2,
-};
-
-static RE_UINT8 re_grapheme_extend_stage_4[] = {
-      0,   0,   0,   0, 255, 255, 255, 255, 255, 255,   0,   0, 248,   3,   0,   0,
-      0,   0, 254, 255, 255, 255, 255, 191, 182,   0,   0,   0,   0,   0, 255,   7,
-      0, 248, 255, 255,   0,   0,   1,   0,   0,   0, 192, 159, 159,  61,   0,   0,
-      0,   0,   2,   0,   0,   0, 255, 255, 255,   7,   0,   0, 192, 255,   1,   0,
-      0, 248,  15,  32,   0,   0, 192, 251, 239,  62,   0,   0,   0,   0,   0,  14,
-      0,   0, 248, 255, 251, 255, 255, 255,   7,   0,   0,   0,   0,   0,   0,  20,
-    254,  33, 254,   0,  12,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,  80,
-     30,  32, 128,   0,  12,   0,   0,  64,   6,   0,   0,   0,   0,   0,   0,  16,
-    134,  57,   2,   0,   0,   0,  35,   0, 190,  33,   0,   0,  12,   0,   0, 252,
-      0,   0,   0, 208,  30,  32, 192,   0,   4,   0,   0,   0,   0,   0,   0,  64,
-      1,  32, 128,   0,  17,   0,   0,   0,   0,   0,   0, 192, 193,  61,  96,   0,
-      0,   0,   0, 144,  68,  48,  96,   0,   3,   0,   0,   0,   0,   0,   0,  88,
-      0, 132,  92, 128,   0,   0, 242,   7, 128, 127,   0,   0,   0,   0, 242,  31,
-      0,  63,   0,   0,   0,   0,   0,   3,   0,   0, 160,   2,   0,   0, 254, 127,
-    223, 224, 255, 254, 255, 255, 255,  31,  64,   0,   0,   0,   0, 224, 253, 102,
-      0,   0,   0, 195,   1,   0,  30,   0, 100,  32,   0,  32,   0,   0,   0, 224,
-      0,   0,  28,   0,   0,   0,  12,   0,   0,   0, 176,  63,  64, 254,  15,  32,
-      0,  56,   0,   0,  96,   0,   0,   0,   0,   2,   0,   0, 135,   1,   4,  14,
-      0,   0, 128,   9,   0,   0,  64, 127, 229,  31, 248, 159,   0,   0, 255, 127,
-     15,   0,   0,   0,   0,   0, 240,  23,   0, 248,  15,   0,  60,  59,   0,   0,
-     64, 163,   3,   0,   0, 240, 207,   0,   0,   0, 247, 255, 253,  33,  16,   3,
-    255, 255, 255, 251,   0,  16,   0,   0, 255, 255,   1,   0,   0, 128,   3,   0,
-      0,   0,   0, 128,   0, 252,   0,   0,   0,   0,   0,   6,   0, 128, 247,  63,
-      0,   0,   3,   0,  68,   8,   0,   0,  48,   0,   0,   0, 255, 255,   3, 128,
-    192,  63,   0,   0, 128, 255,   3,   0,   0,   0, 200,  51,  32,   0,   0,   0,
-      0, 126, 102,   0,   8,  16,   0,   0,   0,   0, 157, 193,   0,  48,  64,   0,
-     32,  33,   0,   0,   0,   0,   0,  32,   1,   0,   0,   0,   0,   0, 192,   7,
-    110, 240,   0,   0,   0,   0,   0, 135, 240,   0,   0,   0,   0,   0,   0, 255,
-    127,   0,   0,   0,   0,   0, 120,   6, 128, 239,  31,   0,   0,   0,   8,   0,
-      0,   0, 192, 127,   0,  30,   0,   0,   0, 128, 211,  64, 248,   7,   0,   0,
-      1,   0, 128,   0, 192,  31,  31,   0,  92,   0,   0,  64,   0,   0, 249, 165,
-     13,   0,   0,   0,   0, 128,  60, 176,   1,   0,   0,  48,   0,   0, 248, 167,
-      0,  40, 191,   0, 188,  15,   0,   0,   0, 128, 255,   6,   0,   0, 240,  12,
-    254,   7,   0,   0,   0,   0, 248, 121, 128,   0, 126,  14,   0, 252, 127,   3,
-      0,   0, 127, 191,   0,   0, 252, 255, 255, 252, 109,   0,   0,   0, 126, 180,
-    191,   0,   0,   0,   0,   0, 163,   0,   0,   0,  24,   0,   0,   0,  31,   0,
-      0,   0, 127,   0,   0, 128,   0,   0,   0, 128,   7,   0,   0,   0,   0,  96,
-    160, 195,   7, 248, 231,  15,   0,   0,   0,  60,   0,   0,  28,   0,   0,   0,
-    255, 255, 127, 248, 255,  31,  32,   0,  16,   0,   0, 248, 254, 255,   0,   0,
-    127, 255, 255, 249, 219,   7,   0,   0,   0, 240,   0,   0, 240,   7,   0,   0,
-};
-
-/* Grapheme_Extend: 1672 bytes. */
-
-RE_UINT32 re_get_grapheme_extend(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-
-    f = ch >> 13;
-    code = ch ^ (f << 13);
-    pos = (RE_UINT32)re_grapheme_extend_stage_1[f] << 5;
-    f = code >> 8;
-    code ^= f << 8;
-    pos = (RE_UINT32)re_grapheme_extend_stage_2[pos + f] << 3;
-    f = code >> 5;
-    code ^= f << 5;
-    pos = (RE_UINT32)re_grapheme_extend_stage_3[pos + f] << 5;
-    pos += code;
-    value = (re_grapheme_extend_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1;
-
-    return value;
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 83, 84,  0, 85, 86,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44,
+    49,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0
+};
+
+static RE_UINT8 re_nfd_quick_check_table_3[] = {
+    255, 255, 255, 255,  64,   0, 129, 193,  64,   0, 129,  65,   0,   0,   3,   0,
+    192,   0,  14, 129,   7,  14,  12,   0, 192,   0,   0, 128, 252, 127, 254, 255,
+    255,  31,   0,  32,  48,   0, 206,   0,   0,   0,   0,  48,  63,   0, 240, 255,
+    228, 255, 255, 255, 255, 255, 239, 191,  31,  40, 254, 255, 255,   3, 254, 255,
+    255, 131, 231, 255, 116, 143, 255, 253, 255, 255, 255, 253, 255, 255, 116, 143,
+    255, 255,  63, 255, 249, 255,  48,   3,   3,   3, 192, 252, 131, 255, 255, 255,
+    250, 255, 247, 255, 255, 253, 237, 255, 255, 255, 255,   0, 255, 231, 255,  79,
+    255, 255, 183, 255, 255, 255, 255, 177, 255, 230, 255, 207, 255, 255, 239, 255,
+    255, 227, 255, 255, 255, 254, 255, 255, 126, 242, 255, 255, 255, 255, 255, 139,
+    247, 223, 123, 239, 255, 253, 151, 254, 253, 255, 247, 223, 123, 239, 255, 253,
+    191, 255, 255, 255, 191, 170, 251, 255, 255, 255, 255, 215, 244, 255, 255, 255,
+      0,   0,   0,   0,   0,   0,   0, 244,   0,   0,   0, 252,   0,   0, 192, 192,
+    192, 192,   0,  85,   0,   0,   0, 192,   0,   0,  32, 160,  33,   0,  48,  16,
+      0,   0,  35, 192, 252, 255, 255, 255, 191, 243, 255, 255, 255, 255, 255, 243,
+    255, 191, 255, 255, 255,  31, 255, 255, 239, 237, 255, 255, 175, 255, 255, 255,
+    109, 253, 255, 255, 250,  31, 204, 252, 204, 252, 255, 255, 255,  15, 255, 255,
+    240, 195, 255, 255, 255, 249, 255, 255, 255, 255, 255, 239, 255, 175, 170, 170,
+     90, 253,  36, 201, 255, 255, 111, 184, 240, 255, 255, 255,   0, 192,  26, 128,
+    154,   3,   0,   0,   0, 192,   0,   0, 255, 255, 255,  95, 255,   3, 128, 160,
+     36, 128, 255, 255, 255, 255, 255, 235, 255, 247, 255, 255, 255,  63, 255, 255,
+    255, 231, 255, 255, 255, 255, 255, 167, 255, 255, 255, 254, 255, 255, 255,  63,
+    224, 255, 255, 255, 255, 255, 255,   7, 254, 255, 255, 255
+};
+
+RE_UINT32 re_get_nfd_quick_check(RE_UINT32 codepoint) {
+    RE_UINT32 field_2;
+    RE_UINT32 field_1;
+    RE_UINT32 field_0;
+    RE_UINT32 offset;
+    RE_UINT32 v;
+
+    field_2 = codepoint >> 10;
+    field_1 = (codepoint >> 5) & 0x1F;
+    field_0 = (codepoint >> 3) & 0x3;
+    offset = codepoint & 0x7;
+
+    v = re_nfd_quick_check_table_1[field_2];
+    v = re_nfd_quick_check_table_2[(v << 5) | field_1];
+    v = re_nfd_quick_check_table_3[(v << 2) | field_0];
+
+    return (v >> offset) & 0x1;
 }
 
-/* Grapheme_Base. */
-
-static RE_UINT8 re_grapheme_base_stage_1[] = {
-    0, 1, 2, 3, 4, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
-    6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
-    6, 6,
-};
-
-static RE_UINT8 re_grapheme_base_stage_2[] = {
-     0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 13, 13,
-    13, 13, 13, 14, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-    13, 13, 13, 13, 13, 13, 13, 15, 13, 16, 17, 13, 13, 13, 13, 13,
-    13, 13, 13, 13, 13, 18, 19, 19, 19, 19, 19, 19, 19, 19, 20, 21,
-    22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 19, 19, 13, 32, 19, 19,
-    19, 33, 19, 19, 19, 19, 19, 19, 19, 19, 34, 35, 13, 13, 13, 13,
-    13, 36, 37, 19, 19, 19, 19, 19, 19, 19, 19, 19, 38, 19, 19, 39,
-    19, 19, 19, 19, 40, 41, 42, 19, 43, 19, 44, 45, 46, 47, 48, 19,
-    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-    13, 13, 13, 13, 13, 13, 13, 13, 13, 49, 13, 13, 13, 50, 51, 13,
-    13, 13, 13, 52, 13, 13, 13, 13, 13, 13, 53, 19, 19, 19, 54, 19,
-    19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
-    19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
-};
-
-static RE_UINT8 re_grapheme_base_stage_3[] = {
-      0,   1,   2,   2,   2,   2,   3,   4,   2,   5,   6,   7,   8,   9,  10,  11,
-     12,  13,  14,  15,  16,  17,  18,  19,  20,  21,  22,  23,  24,  25,  26,  27,
-     28,  29,   2,   2,  30,  31,  32,  33,   2,   2,   2,   2,   2,  34,  35,  36,
-     37,  38,  39,  40,  41,  42,  43,  44,  45,  46,   2,  47,   2,   2,  48,  49,
-     50,  51,   2,  52,   2,   2,   2,   2,  53,   2,   2,   2,   2,   2,   2,   2,
-      2,   2,   2,   2,   2,   2,  54,  55,  56,  57,  58,  59,  60,  61,   2,  62,
-     63,  64,  65,  66,  67,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
-      2,   2,   2,  68,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,  69,
-      2,  70,   2,   2,  71,  72,   2,  73,  74,  75,  76,  77,  78,  79,  80,  81,
-      2,   2,   2,   2,   2,   2,   2,  82,  83,  83,  83,  83,  83,  83,  83,  83,
-     83,  83,   2,   2,  84,  85,  86,  87,   2,   2,  88,  89,  90,  91,  92,  93,
-     94,  95,  96,  97,  83,  98,  99, 100,   2, 101, 102,  83,   2,   2, 103,  83,
-    104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114,  83, 115,  83, 116, 117,
-    118, 119, 120, 121, 122, 123, 124,  83, 125, 126,  83, 127, 128, 129, 130,  83,
-    131, 132,  83, 133, 134, 135,  83,  83, 136, 137, 138, 139,  83, 140,  83, 141,
-      2,   2,   2,   2,   2,   2,   2, 142, 143,   2, 144,  83,  83,  83,  83,  83,
-    145,  83,  83,  83,  83,  83,  83,  83,   2,   2,   2,   2, 146,  83,  83,  83,
-      2,   2,   2,   2, 147, 148, 149, 150,  83,  83,  83,  83, 151, 152, 153, 154,
-      2,   2,   2,   2,   2,   2,   2, 155,   2,   2,   2,   2,   2, 156,  83,  83,
-      2,   2, 157,   2,   2, 158,  83,  83, 159, 160,  83,  83,  83,  83,  83,  83,
-      2, 161, 162, 163, 164, 165, 166,  83, 167, 168, 169,   2,   2, 170,   2, 171,
-      2,   2,   2,   2, 172, 173,  83,  83,  83,  83, 174,  83,  83, 175,  83,  83,
-      2, 176, 177,  83,  83,  83,  83,  83, 178, 179, 180,  83, 181, 182,  83,  83,
-    183, 184, 185, 186, 187,  83,   2,   2,   2,   2,   2,   2,   2, 188, 189, 190,
-    191, 192, 193, 194, 195, 196,  83,  83,   2,   2,   2,   2,   2, 197,   2,   2,
-      2,   2,   2,   2,   2,   2, 198,   2, 199,   2,   2,   2,   2,   2,   2,   2,
-      2,   2,   2,   2,   2, 200,   2,   2,   2,   2,   2,   2,   2,   2,   2, 201,
-      2,   2,   2,   2, 202,  83,  83,  83,
+/* NFKC_Quick_Check. */
+static RE_UINT8 re_nfkc_quick_check_table_1[] = {
+     0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5, 13, 14,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5, 15, 16,
+     5,  5,  5,  5, 17, 18, 19,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5, 20, 21,  5,  5,  5,  5,  5, 22, 23,  5, 24,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5, 25,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5
 };
 
-static RE_UINT8 re_grapheme_base_stage_4[] = {
-      0,   0,   0,   0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 127,
-      0,   0,   0,   0, 255, 223, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
-    255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 255, 252,
-    240, 215, 255, 255, 251, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
-      7, 252, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
-    255, 255, 255, 255, 255, 255, 254, 255, 255, 255, 127, 254, 255, 255, 255, 255,
-    255, 231,   0,   0,   0,   0,   0,  64,  73,   0, 255, 255, 255, 135,  31,   0,
-    192, 255,   0, 200, 255, 255, 255, 255, 255,   7,   0,   0, 255, 255, 254, 255,
-    255, 255, 255, 255, 255, 255, 255, 255, 255, 255,  63,  64,  96, 194, 255, 255,
-    255,  63, 253, 255, 255, 255,   0,   0,   0, 224, 255, 255, 255, 255, 255, 255,
-    255, 255, 255, 255,  63,   0,   2,   0, 255, 255, 255, 255, 255,   7, 240, 199,
-    255, 255,  63,   4,  16,   1, 255, 127, 255, 255, 255,  65, 255,   7,   0,   0,
-      0,   0,   0,   0, 255, 255, 223,  63,   0,   0,   0,   0,   0,   0,   0,   0,
-    248, 255, 255, 255, 255, 255, 255, 235,   1, 222,   1, 255, 243, 255, 255, 255,
-    237, 159, 249, 255, 255, 253, 197, 163, 129,  89,   0, 176, 195, 255, 255,  63,
-    232, 135, 249, 255, 255, 253, 109, 195,   1,   0,   0,  94, 192, 255,  92,   0,
-    232, 191, 251, 255, 255, 253, 237, 227,   1,  26,   1,   0, 195, 255,   3,   2,
-    236, 159, 249, 255, 255, 253, 237,  35, 129,  25,   0, 176, 195, 255, 255,   0,
-    232, 199,  61, 214,  24, 199, 255, 131, 198,  29,   1,   0, 192, 255, 255,   7,
-    238, 223, 253, 255, 255, 253, 255,  35,  30,   0,   0,   7, 195, 255, 128, 255,
-    253, 223, 253, 255, 255, 253, 239,  99, 155,  13,   0,  64, 195, 255,   6,   0,
-    236, 223, 253, 255, 255, 255, 255, 167, 193, 221, 112, 255, 195, 255, 255, 255,
-    236, 255, 127, 252, 255, 255, 251,  47, 127,   0,   3, 127, 192, 255,  28,   0,
-    254, 255, 255, 255, 255, 255,  13, 128, 127, 128, 255,  15,   0,   0,   0,   0,
-    214, 247, 255, 255, 175, 255,  13,  32,  95,   0, 255, 243,   0,   0,   0,   0,
-    255, 255, 255, 252, 255, 255,  95, 253, 255, 254, 255, 255, 255,  31,   0, 128,
-     32,  31,   0,   0,   0,   0,   0, 192, 191, 223, 255,   7,   0,   0,   0,   0,
-    255, 255, 255, 255, 255,  31,   2, 153, 255, 255, 255,  60, 254, 255, 225, 255,
-    155, 223, 255, 223, 255, 255, 255, 255, 191,  32, 255, 255, 255, 255, 255, 255,
-    255, 255, 255, 255, 255, 255, 255, 255, 255,  61, 127,  61, 255, 255, 255, 255,
-    255,  61, 255, 255, 255, 255,  61, 127,  61, 255, 127, 255, 255, 255, 255, 255,
-    255, 255,  61, 255, 255, 255, 255, 255, 255, 255, 255,   7, 255, 255, 255,  31,
-    255, 255, 255,   3, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,  63,  63,
-    255, 255, 255,  31, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,   1,
-    255, 223,   3,   0, 255, 255,  99,   0, 255, 255,   3,   0, 255, 223,   1,   0,
-    255, 255, 255, 255, 255, 255,  79, 192, 191,   1, 240,  31, 255,   3, 255,   3,
-    255,   7, 255,   3, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,   1,
-    159, 255, 255, 255, 255,   5, 255, 255, 255, 255, 255, 255, 255, 255,  63,   0,
-    255, 255, 255, 127, 120,  14, 251,   1, 241, 255, 255, 255, 255,  63,  31,   0,
-    255, 255, 255, 255, 255,  15, 255, 255, 255,   3, 255, 199, 255, 255, 255, 255,
-    255, 255, 127, 198, 255, 255, 255, 255, 255, 255, 191,   0,  26, 224,   7,   0,
-    255,   3, 255,   3, 255,  63,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-    240, 255, 255, 255, 255, 255,  15, 232, 251,  15, 255, 255, 255,   7, 240,  31,
-    252, 255, 255, 255, 195, 196, 255, 255, 255, 255, 255, 255, 191,  92,  12, 240,
-    255, 255, 255, 255, 255,  15,  48, 248, 255, 227, 255, 255, 255, 255, 255, 255,
-    255,   1, 255, 255, 255, 255, 255, 231, 255,   0,   8,   0,   2, 222, 239,   4,
-    255, 255, 255, 255, 255, 255, 255, 255,   0,   0,   0,   0,   0,   0,   0,   0,
-    255, 255,  63,  63, 255, 255, 255, 255,  63,  63, 255, 170, 255, 255, 255,  63,
-    255, 255, 255, 255, 255, 255, 223, 255, 223, 255, 207, 239, 255, 255, 220, 127,
-    255,   7, 255, 255, 255, 128, 255, 255, 255, 255, 255, 255,   0,   0, 243, 255,
-    255, 127, 255,  31, 255, 255, 255, 255,   0,   0,   0,   0,   0,   0,   0,   0,
-    255,  15, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
-    255, 255, 255, 255, 127,   0,   0,   0, 255,   7,   0,   0, 255, 255, 255, 255,
-    255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 207, 255,
-    255, 255,  63, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
-    255, 255, 255, 255, 255, 127, 255, 255, 255, 255, 255, 127, 255, 255, 255, 255,
-    255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 127,  12, 254,
-    255, 255, 255, 255, 191,  32, 255, 255, 255, 255, 255, 255, 255, 128,   1,   0,
-    255, 255, 127,   0, 127, 127, 127, 127, 127, 127, 127, 127,   0,   0,   0,   0,
-    255, 255, 255, 255, 255, 255, 255, 255, 255, 255,   0,   0,   0,   0,   0,   0,
-    255, 255, 255, 251, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,  15,   0,
-    255, 255, 255, 255, 255, 255, 255, 255, 255, 255,  63,   0,   0,   0, 255,  15,
-    255, 255, 255, 255, 255,   3, 255, 255, 254, 255, 255, 255, 255, 255, 255, 255,
-    255, 255, 127, 248, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
-    224, 255, 255, 255, 255, 255, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255,
-    255, 127, 255, 255, 255, 255, 255,   7, 255, 255, 255, 255,  15,   0, 255, 255,
-    255, 255, 255, 127, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
-    255, 255, 255, 255, 255, 255,  63,   0, 255, 255, 255, 255, 255, 255, 255, 255,
-    255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,   0,   0,
-    255,  31, 255, 255, 255, 255, 255, 255, 127,   0, 255, 255, 255, 255, 255, 255,
-    255, 255, 255, 255, 255,  15,   0,   0, 255, 255, 255, 255, 255, 127,   8, 192,
-    255, 255, 255,  63, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 252,   0,
-    255, 255, 255, 255, 255, 255, 255, 255, 124,   0,   0,   0,   0,   0, 128, 255,
-    187, 247, 255, 255, 159,  15, 255,   3, 255, 255, 255, 255, 255, 255, 255,   0,
-    255, 255, 255, 255, 255, 255, 255, 255,  15, 192, 255,   3,   0,   0, 252, 127,
-    255, 255, 255, 255,  63, 192, 255, 255, 127,   0,  12, 128, 255, 255, 255,  31,
-    248, 255, 255, 255, 255, 255,  55, 204, 255, 191, 255, 195, 223, 255, 255, 127,
-    255, 255, 255, 255, 255, 129,  25,   0, 247,  47, 255, 243, 255, 255, 255, 239,
-    255, 255, 255, 255, 255, 255,  98,  62,   5,   0,   0, 248, 255, 207,  63,   0,
-    126, 126, 126,   0, 127, 127, 255, 255, 255, 255, 255, 255, 255,   0, 255, 255,
-    255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 223,  30, 255,   3,
-    255, 255, 255, 255,  15,   0, 255, 255, 127, 248, 255, 255, 255, 255, 255,  15,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-    255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,  63, 255, 255,
-    255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,   3,   0,   0,   0,   0,
-    127,   0, 248, 160, 255, 255, 127,  95, 219, 255, 255, 255, 255, 255, 255, 255,
-    255, 255, 255, 255, 255, 255, 255, 255,   3,   0, 248, 255, 255, 255, 255, 255,
-    255, 255, 255, 255, 255, 255, 255, 255,   0,   0, 255, 255, 255, 255, 255, 255,
-    255, 255, 252, 255, 255, 255, 255, 255, 255,   0,   0,   0,   0,   0, 255,  63,
-      0,   0, 255,   3,   0,   0, 255, 255, 255, 255, 247, 255, 127,  15, 223, 255,
-    255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,  31,
-    254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
-    255, 255, 255,  63, 255, 255, 255, 127, 252, 252, 252,  28, 127, 127,   0,  48,
-    255, 239, 255, 255, 127, 255, 255, 183, 255,  63, 255,  63,   0,   0,   0,   0,
-    255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,   7,
-    135, 255, 255, 255, 255, 255, 143, 255, 255, 255, 255, 255, 255, 255, 255, 255,
-    255, 127, 255,  15,   1,   0,   0,   0,   0,   0, 255, 255, 255, 255, 255,  31,
-    255, 255, 255,  31, 255, 255, 255, 255, 255, 255,   1,   0, 254, 255, 255,  15,
-    255, 255, 255, 255,  15, 224, 255, 255, 255,   7, 255, 255, 255, 255,  63,   0,
-    255, 255, 255, 191, 255, 255, 255, 255,  15, 255,  63,   0,   0,   0,   0,   0,
-    255, 255, 255,  63, 255,   3, 255, 255, 255, 255,  15, 255, 255, 255, 255,  15,
-    255, 255, 255, 255, 255,   0, 255, 255, 255, 255, 255, 255,  15, 128,   0,   0,
-    255, 255, 255, 255, 255, 255, 127,   0, 255, 255,  63,   0, 255,   0,   0,   0,
-     63, 253, 255, 255, 255, 255, 191, 145, 255, 255, 191, 255, 255, 255, 255, 255,
-    255, 255, 255, 127, 128, 255,   0,   0,   0,   0,   0,   0, 255, 255,  55, 248,
-    255, 255, 255, 143, 255, 255, 255, 131,   0,   0,   0,   0,   0,   0,   0,   0,
-    255, 255, 255, 255, 255, 255, 255, 240, 255, 255, 252, 255, 255, 255, 255, 255,
-      1,   0, 239, 254, 255, 255,  63,   0, 255,   1, 255,   1, 255, 255, 255, 255,
-    255, 255, 255, 255,   0,   0,   0,   0, 255, 255, 255, 255,  31, 248, 127,   0,
-    255, 255, 255, 255, 255, 255,  63, 254, 255, 255,  63, 255, 255, 255,   7, 255,
-    255, 255,   3,  30,   0, 254,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-    255, 255, 255, 255, 255, 255, 255, 255, 255,   1,   0,   0,   0,   0,   0,   0,
-    255, 255, 255, 255, 255, 255,   7,   0, 255, 255, 255, 255, 255, 255,   7, 252,
-    255, 255, 255, 255,  15,   0, 255,   3,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 255, 255, 255, 127,
-    255, 255, 255, 255, 255,   0, 255, 255,  63,   0, 254,   3,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 255, 255, 127,   0,
-    253, 255, 255, 255, 255, 255, 255,   0, 128,  63, 252, 255, 255, 255,   0,   0,
-    252, 255, 255, 255, 255, 255, 135, 217,   3,   0, 255, 255, 255,   1, 255,   3,
-    248, 255, 255, 255, 127,  16, 192, 255, 127,   0, 255, 255, 255, 255, 119,   0,
-    252, 255, 255, 255, 255, 255,  63, 128, 255,  33, 255, 255, 254, 255,  31,   0,
-    255, 255, 251, 255, 255, 127,  44,  63,   0,   0,   0,   0,   0,   0,   0,   0,
-    127, 189, 255, 191, 255,   3, 255, 255, 255, 255, 255, 127,   7,   0, 255,   3,
-    236, 159, 249, 255, 255, 253, 237, 163, 158,  57,   1, 224,  15,   0,   0,   0,
-    255, 255, 255, 255, 255, 255, 255,   0, 163, 255, 255, 171,   0,   0,   0,   0,
-    255, 255, 255, 255, 255, 255,   6,  90, 242,   0, 255,   3,   0,   0,   0,   0,
-    255, 255, 255, 255, 255, 127,   3,  79, 254, 255, 255,  15,   0,   0,   0,   0,
-    255, 255, 255, 255, 255, 255,   7,  88,  30,   0, 255,   3, 255,  31,   0,   0,
-    255, 255, 255, 255, 255, 215,  64,   1, 255,   3,   0,   0,   0,   0,   0,   0,
-    255, 255, 255,   7,  67,   0, 255, 255,   0,   0,   0,   0,   0,   0,   0,   0,
-    255, 255, 255, 255, 255, 127,   0,   9,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,   7, 128,
-      0,   0,   0,   0, 255, 252, 255, 255, 255, 255,  15, 240,  30,   0,   0,   0,
-      1, 248, 255, 255, 255, 255,   7, 134, 127,   0, 129, 241, 255, 255, 255, 255,
-    255,   3, 128, 252,   7,   0,   0,   0, 255, 255, 255, 255, 255, 255, 255,   1,
-    255, 253, 255, 255, 255, 255,   0,  64,  63,   0, 255, 255, 255,  31, 255, 255,
-    255, 255,   0,   0,   0,   2,  18,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-    127, 251, 255, 255, 255, 255,   1,   0,  64,   0, 255,   3, 191, 253, 255, 255,
-    255, 127,  88,   1, 255,   3,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 255, 255, 231,   1,
-      0,   0,   0,   0,   0,   0,   0,   0, 255, 255, 255, 255, 255, 255,   3, 128,
-    255, 255, 255,   3,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-    255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 127,  31,   0,
-    255, 255, 255, 255, 255, 255, 255, 255,  15,   0,   0,   0,   0,   0,   0,   0,
-    255, 255, 255, 255, 255, 127,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-    255, 255, 255, 255, 255, 255, 255, 255, 127,   0,   0,   0,   0,   0,   0,   0,
-    255, 255, 255, 255, 255, 255, 255,   1, 255, 255, 255, 127, 255, 195,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 255, 255, 255,  63,  32,   0,
-    255, 255, 255, 255, 255, 255, 128, 255,  63,   0, 255, 251, 251, 255, 255, 224,
-    255, 255,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0, 255, 255, 255, 255, 255, 255, 255, 255,
-    255, 255, 255,   7,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-    255, 255, 255, 255, 255, 255, 255, 255, 255,   7, 255, 255, 255, 255, 255, 255,
-    255,   0, 248, 255,   0,   0,   0,   0,   0,   0,   0,   0,  15,   0,   0,   0,
-    255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,   0,
-    255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,   7,   0,
-    255, 255, 255, 127,   0,   0,   0,   0,   0,   0,   7,   0, 240,   0, 255, 255,
-    255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,  15,
-    255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,   7, 255,  31,
-    255,   1, 255, 147,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-    255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,  63,   0,
-    255, 255, 255, 255, 127, 254, 255, 255, 255, 255, 255, 255,  95,  60,   0,   0,
-     24, 240, 255, 255, 255, 195, 255, 255, 255, 255, 255, 255, 255,   1,   0,   0,
-    255, 255, 255, 255, 255, 255, 255, 255,  35,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 255, 255,  15,   0,
-    255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 127,   0, 255, 255, 255,   1,
-    255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 223, 255, 255, 255, 255, 255,
-    255, 255, 255, 223, 100, 222, 255, 235, 239, 255, 255, 255, 255, 255, 255, 255,
-    191, 231, 223, 223, 255, 255, 255, 123,  95, 252, 253, 255, 255, 255, 255, 255,
-    255, 255, 255, 255,  63, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
-    255, 255, 255, 255, 255, 255, 255, 255, 255, 207, 255, 255, 255, 255, 255, 255,
-      0,   0,   0,   0,   0,   0, 128,   7,   0,   0,   0,   0,   0, 224, 223, 255,
-    239,  15,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-    255, 255, 255, 255, 255,  31, 128,  63, 255, 195,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0, 255, 255, 255, 255, 255,  15, 255, 131,
-    255, 255, 255, 255, 255, 255, 255, 255, 159, 255,   0,   0,   0,   0,   0,   0,
-    255, 255, 255, 255, 255, 255, 255, 255,  15,   8, 255, 195,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 254, 255,
-    255, 255, 255, 255, 255, 255,  31,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-    254, 255, 255, 255, 255, 255, 255,  63,   0,   0,   0,   0,   0,   0,   0,   0,
-    239, 255, 255, 255, 150, 254, 247,  10, 132, 234, 150, 170, 150, 247, 247,  94,
-    255, 251, 255,  15, 238, 251, 255,  15,   0,   0,   0,   0,   0,   0,   3,   0,
-    255, 255, 255, 255, 255,  15, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
-    255, 255,  15,   0, 255, 127, 254, 255, 254, 255, 254, 255, 255, 255,  63,   0,
-    255,  31, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,  31, 255, 255,
-    255, 255, 255, 255, 255,  31,   0,   0,   0,   0,   0,   0, 192, 255, 255, 255,
-      7,   0, 255, 255, 255, 255, 255,  15, 255,   1,   3,   0,  63,   0,   0,   0,
-    255, 255, 255, 255, 255, 255, 255, 255, 255, 255,  63,   0, 255,  31, 255,   7,
-    255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,  15,   0,
-    255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,   1, 255,  15,   0,   0,
-    255,  15, 255, 255, 255, 255, 255, 255, 255,   0, 255,   3, 255, 255, 255, 255,
-    255,   0, 255, 255, 255,  63,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-    255, 239, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 123, 252,
-    255, 255, 255, 255, 231, 199, 255, 255, 255, 231, 255, 255, 255, 255, 255, 255,
-    255, 255, 255, 255, 255, 255, 255, 255, 255, 255,  15,   0, 255,  63,  15,   7,
-      7,   0,  63,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-    255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 127,   0,   0,   0,   0,   0,
-    255, 255, 255, 255, 255, 255,  31,   0, 255, 255, 255, 255, 255, 255, 255, 255,
-    255, 255, 255,  63, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
-    255, 255, 255, 255,   3,   0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
-    255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,   1,   0,   0,   0,
-    255, 255, 255,  63,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+static RE_UINT8 re_nfkc_quick_check_table_2[] = {
+      0,   0,   0,   0,   0,   1,   0,   0,   0,   2,   3,   4,   0,   0,   5,   6,
+      0,   0,   0,   0,   0,   7,   8,   9,  10,  11,  12,  13,  14,   0,  15,  16,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  17,   0,   0,   0,
+      0,   0,  18,  19,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,  20,  21,   0,   0,  22,  23,   0,
+      0,  24,  25,   0,   0,   0,   0,   0,   0,  22,  26,   0,   0,  22,  27,   0,
+      0,   0,  28,   0,   0,   0,  29,   0,   0,  22,  27,   0,   0,   0,  30,   0,
+      0,  31,   0,   0,   0,  31,  32,   0,  33,   0,  34,  35,  36,  37,   0,   0,
+      0,  38,   0,   0,   0,   0,   0,  39,   0,   0,   0,  40,   0,  41,  42,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,  43,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,  44,  45,  46,  47,  48,   0,   0,
+      0,   0,   0,   0,  49,   0,   0,   0,   0,   0,   0,  50,   0,  51,  52,  53,
+     54,  55,  56,  57,  58,  59,   0,   0,  60,  61,  62,  48,  63,   0,   0,   0,
+      0,  64,   0,   0,   0,   0,   0,   0,   0,  65,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,  48,  48,  48,  48,  66,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     33,   0,   0,  67,   0,   0,  39,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,  32,   0,   0,   0,   0,   0,   0,   0,  68,   0,   0,   0,   0,
+      0,   0,   0,   0,   4,   0,   0,  31,  48,  48,  48,  48,  48,  48,  69,   0,
+     70,  71,   0,   0,  72,   0,   0,   4,   0,  73,  48,  48,  74,   0,   0,   0,
+     75,  48,  76,  75,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,  32,   0,   0,   0,   0,   0,   0,  77,   0,   0,   0,  78,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  79,  63,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,  48,  48,  48,  48,  48,  48,  48,  48,
+     80,  81,  48,  82,  48,  48,  83,   0,  84,  85,  86,  48,  48,  87,  88,  48,
+     48,  48,  48,  48,  48,  48,  48,  48,  48,  89,  90,  48,  91,  48,  92,  93,
+     94,  90,  95,  96,  48,  48,  48,  97,  98,  48,  48,  48,  48,  75,  99, 100,
+      0,   0,   0,   0,   0, 101,   0,   0,   0, 102,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,  22,  27,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0, 103,   0,   0,   0,   0,   0,   0,   0, 104,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0, 105,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 106,   9,   0,  47,  70,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     48,  48, 107,  48, 108, 109, 110,  48, 111, 112, 113,  48,  48,  48,  48,  48,
+     48,  48,  48,  48,  48, 114,  48,  48,  48,  48,  48,  48,  48,  48, 115,  48,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    110, 116, 117, 118, 119, 120,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0, 121, 122, 123, 124,  77,   0,   0,   0,
+    125, 126, 127,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  94,
+     48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,
+     89,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0
 };
 
-/* Grapheme_Base: 3946 bytes. */
-
-RE_UINT32 re_get_grapheme_base(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-
-    f = ch >> 15;
-    code = ch ^ (f << 15);
-    pos = (RE_UINT32)re_grapheme_base_stage_1[f] << 5;
-    f = code >> 10;
-    code ^= f << 10;
-    pos = (RE_UINT32)re_grapheme_base_stage_2[pos + f] << 3;
-    f = code >> 7;
-    code ^= f << 7;
-    pos = (RE_UINT32)re_grapheme_base_stage_3[pos + f] << 7;
-    pos += code;
-    value = (re_grapheme_base_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1;
-
-    return value;
-}
-
-/* Grapheme_Link. */
-
-static RE_UINT8 re_grapheme_link_stage_1[] = {
-    0, 1, 2, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+static RE_UINT8 re_nfkc_quick_check_table_3[] = {
     1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
     1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 0,
+    1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1,
     1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1,
-};
-
-static RE_UINT8 re_grapheme_link_stage_2[] = {
-     0,  0,  1,  2,  3,  4,  5,  0,  0,  0,  0,  6,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  7,  0,  0,  0,  0,  0,
-     0,  0,  8,  0,  9, 10, 11, 12,  0,  0,  0,  0,  0,  0,  0,  0,
-};
-
-static RE_UINT8 re_grapheme_link_stage_3[] = {
-     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  1,  0,  1,  0,  1,  0,  1,  0,  1,  0,  1,
-     0,  1,  0,  1,  2,  1,  0,  3,  4,  0,  4,  0,  0,  0,  5,  0,
-     6,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  7,  0,  0,  8,
-     0,  0,  0,  0,  0,  0,  0,  0,  0,  9,  0,  0,  0,  5, 10, 11,
-     0,  0,  0,  0,  0, 12,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    13,  0,  0,  5,  0, 14,  0, 15,  0,  0,  0, 16,  0,  0,  0, 17,
-     0,  0,  0,  0,  0,  0,  0,  0, 12,  0,  0,  0,  0,  0,  0,  0,
-     0, 18, 19,  0, 20,  0,  0, 15, 21,  0,  0, 22,  0,  1,  0,  0,
-     0, 23,  0, 23,  0,  0, 12,  0, 12,  0, 16,  0, 24,  0,  0,  0,
-    19,  0,  0,  0,  0,  0,  0,  9, 25, 26, 27,  0,  0,  0,  0,  0,
-    12,  0,  0,  0,  0, 28, 29,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-};
-
-static RE_UINT8 re_grapheme_link_stage_4[] = {
-      0,   0,   0,   0,   0,   0,   0,   0,   0,  32,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,  24,   0,   4,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   4,  16,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   6,   0,   0,  16,   0,   0,   0,  16,   0,
-      0,   0,   4,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,
-      0,   0,   0,   0,   0,  12,   0,   0,   0,   0,   0,   0,   0,   0,  12,   0,
-      0,   0,   0,   0,   0,   0,   0, 128,  64,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   8,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,  64,   0,   0,   0,   0,   0,   0,  32,   0,   0,
-     64,   0,   0,   0,   0,   0,   0, 128,   0,   0,   0,   0,   0,   0,   0,   2,
-      0,   0,   0,   0,   0,   0,  24,   0,   0,   0,   0,   0,   0,   0,  32,   0,
-      0,   0,   0,   0,   0,   4,   0,   0,   4,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   8,   0,   0,   0,   0,   0,   0,   0,   0,  16,   0,
-    128,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   0,
-     48,   0,   0,   0,   0,   0,   0,   0,   0,   0, 128,   0,   0,   0,   0,   0,
-};
-
-/* Grapheme_Link: 580 bytes. */
-
-RE_UINT32 re_get_grapheme_link(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-
-    f = ch >> 14;
-    code = ch ^ (f << 14);
-    pos = (RE_UINT32)re_grapheme_link_stage_1[f] << 4;
-    f = code >> 10;
-    code ^= f << 10;
-    pos = (RE_UINT32)re_grapheme_link_stage_2[pos + f] << 4;
-    f = code >> 6;
-    code ^= f << 6;
-    pos = (RE_UINT32)re_grapheme_link_stage_3[pos + f] << 6;
-    pos += code;
-    value = (re_grapheme_link_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1;
-
-    return value;
-}
-
-/* White_Space. */
-
-static RE_UINT8 re_white_space_stage_1[] = {
+    1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0,
+    0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0,
+    1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1,
+    0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 2,
+    1, 2, 1, 2, 2, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1,
+    1, 1, 1, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 2, 2, 1,
+    2, 2, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1,
+    0, 0, 2, 0, 0, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1,
+    1, 1, 1, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 0, 0, 1, 0,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 2, 2, 1, 1, 1, 1, 0, 0, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1,
+    1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1,
+    1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1,
+    1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1,
+    1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0,
+    0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 0, 0,
+    1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0,
+    1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 0, 1,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1,
+    1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0,
+    1, 1, 1, 0, 0, 1, 0, 0, 1, 1, 1, 1, 0, 1, 0, 1,
+    1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1,
+    0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0,
+    0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0,
+    0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0,
+    0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
     0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
     1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1,
-};
-
-static RE_UINT8 re_white_space_stage_2[] = {
-    0, 1, 1, 1, 1, 2, 1, 1, 3, 1, 1, 1, 4, 1, 1, 1,
     1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1,
     1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 0, 0, 1, 1, 0,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
+    1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
+    0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
     1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-};
-
-static RE_UINT8 re_white_space_stage_3[] = {
-    0, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 3, 2, 2, 4, 2, 2, 2, 2, 2, 2, 2,
-    3, 2, 2, 2, 2, 2, 2, 2,
-};
-
-static RE_UINT8 re_white_space_stage_4[] = {
-      0,  62,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     32,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-    255,   7,   0,   0,   0, 131,   0,   0,   0,   0,   0, 128,   0,   0,   0,   0,
-};
-
-/* White_Space: 218 bytes. */
-
-RE_UINT32 re_get_white_space(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-
-    f = ch >> 15;
-    code = ch ^ (f << 15);
-    pos = (RE_UINT32)re_white_space_stage_1[f] << 5;
-    f = code >> 10;
-    code ^= f << 10;
-    pos = (RE_UINT32)re_white_space_stage_2[pos + f] << 3;
-    f = code >> 7;
-    code ^= f << 7;
-    pos = (RE_UINT32)re_white_space_stage_3[pos + f] << 7;
-    pos += code;
-    value = (re_white_space_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1;
-
-    return value;
-}
-
-/* Bidi_Control. */
-
-static RE_UINT8 re_bidi_control_stage_1[] = {
     0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
     1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1,
-};
-
-static RE_UINT8 re_bidi_control_stage_2[] = {
-    0, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1,
     1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-};
-
-static RE_UINT8 re_bidi_control_stage_3[] = {
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1,
+    0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
+    0, 1, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0,
     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-};
-
-static RE_UINT8 re_bidi_control_stage_4[] = {
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,  16,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0, 192,   0,   0,   0, 124,   0,   0,   0,   0,   0,   0, 192,   3,   0,   0,
-};
-
-/* Bidi_Control: 162 bytes. */
-
-RE_UINT32 re_get_bidi_control(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-
-    f = ch >> 15;
-    code = ch ^ (f << 15);
-    pos = (RE_UINT32)re_bidi_control_stage_1[f] << 4;
-    f = code >> 11;
-    code ^= f << 11;
-    pos = (RE_UINT32)re_bidi_control_stage_2[pos + f] << 4;
-    f = code >> 7;
-    code ^= f << 7;
-    pos = (RE_UINT32)re_bidi_control_stage_3[pos + f] << 7;
-    pos += code;
-    value = (re_bidi_control_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1;
-
-    return value;
-}
-
-/* Join_Control. */
-
-static RE_UINT8 re_join_control_stage_1[] = {
-    0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1,
+    0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1,
+    0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
     1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1,
-};
-
-static RE_UINT8 re_join_control_stage_2[] = {
-    0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-};
-
-static RE_UINT8 re_join_control_stage_3[] = {
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-};
-
-static RE_UINT8 re_join_control_stage_4[] = {
-     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0, 48,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-};
-
-/* Join_Control: 130 bytes. */
-
-RE_UINT32 re_get_join_control(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-
-    f = ch >> 15;
-    code = ch ^ (f << 15);
-    pos = (RE_UINT32)re_join_control_stage_1[f] << 4;
-    f = code >> 11;
-    code ^= f << 11;
-    pos = (RE_UINT32)re_join_control_stage_2[pos + f] << 4;
-    f = code >> 7;
-    code ^= f << 7;
-    pos = (RE_UINT32)re_join_control_stage_3[pos + f] << 7;
-    pos += code;
-    value = (re_join_control_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1;
-
-    return value;
-}
-
-/* Dash. */
-
-static RE_UINT8 re_dash_stage_1[] = {
-    0, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1,
     1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
     1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1,
     1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1,
-};
-
-static RE_UINT8 re_dash_stage_2[] = {
-    0, 1, 2, 1, 1, 1, 1, 1, 1, 1, 3, 1, 4, 1, 1, 1,
-    5, 6, 1, 1, 1, 1, 1, 7, 8, 1, 1, 1, 1, 1, 1, 1,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1,
+    0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1,
+    0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1,
+    1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0,
+    1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1,
+    0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1,
     1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
     1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1,
     1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 9,
-};
-
-static RE_UINT8 re_dash_stage_3[] = {
-     0,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
-     1,  1,  1,  1,  1,  1,  2,  1,  3,  1,  1,  1,  1,  1,  1,  1,
-     4,  1,  1,  1,  1,  1,  1,  1,  5,  6,  7,  1,  1,  1,  1,  1,
-     8,  1,  1,  1,  1,  1,  1,  1,  9,  3,  1,  1,  1,  1,  1,  1,
-    10,  1, 11,  1,  1,  1,  1,  1, 12, 13,  1,  1, 14,  1,  1,  1,
-};
-
-static RE_UINT8 re_dash_stage_4[] = {
-      0,   0,   0,   0,   0,  32,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   4,   0,   0,   0,   0,   0,  64,   1,   0,   0,   0,   0,   0,   0,   0,
-     64,   0,   0,   0,   0,   0,   0,   0,   0,   0,  63,   0,   0,   0,   0,   0,
-      0,   0,   8,   0,   0,   0,   0,   8,   0,   8,   0,   0,   0,   0,   0,   0,
-      0,   0,   4,   0,   0,   0,   0,   0,   0,   0, 128,   4,   0,   0,   0,  12,
-      0,   0,   0,  16,   0,   0,   1,   0,   0,   0,   0,   0,   1,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   6,   0,   0,   0,   0,   1,   8,   0,   0,   0,
-      0,  32,   0,   0,   0,   0,   0,   0,
-};
-
-/* Dash: 364 bytes. */
-
-RE_UINT32 re_get_dash(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-
-    f = ch >> 14;
-    code = ch ^ (f << 14);
-    pos = (RE_UINT32)re_dash_stage_1[f] << 5;
-    f = code >> 9;
-    code ^= f << 9;
-    pos = (RE_UINT32)re_dash_stage_2[pos + f] << 3;
-    f = code >> 6;
-    code ^= f << 6;
-    pos = (RE_UINT32)re_dash_stage_3[pos + f] << 6;
-    pos += code;
-    value = (re_dash_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1;
-
-    return value;
-}
-
-/* Hyphen. */
-
-static RE_UINT8 re_hyphen_stage_1[] = {
-    0, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
     1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 2, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2,
     1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
     1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1,
-};
-
-static RE_UINT8 re_hyphen_stage_2[] = {
-    0, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1,
-    4, 1, 1, 1, 1, 1, 1, 5, 6, 1, 1, 1, 1, 1, 1, 1,
+    2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
     1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0,
+    1, 1, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0,
+    0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0,
+    0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1,
+    0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0,
+    0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 1,
+    1, 1, 0, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0,
+    1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0,
+    1, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0,
+    0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1,
+    1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
     1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1,
     1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 7,
+    0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1,
+    0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
 };
 
-static RE_UINT8 re_hyphen_stage_3[] = {
-    0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 2, 1, 3, 1, 1, 1, 1, 1, 1, 1,
-    4, 1, 1, 1, 1, 1, 1, 1, 5, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 6, 1, 1, 1, 1, 1, 7, 1, 1, 8, 9, 1, 1,
-};
+RE_UINT32 re_get_nfkc_quick_check(RE_UINT32 codepoint) {
+    RE_UINT32 field_2;
+    RE_UINT32 field_1;
+    RE_UINT32 field_0;
+    RE_UINT32 v;
 
-static RE_UINT8 re_hyphen_stage_4[] = {
-      0,   0,   0,   0,   0,  32,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   4,   0,   0,   0,   0,   0,   0,  64,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   3,   0,   0,   0,   0,   0,   0,   0, 128,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   8,   0,   0,   0,   0,   8,   0,   0,   0,
-      0,  32,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  32,   0,   0,   0,
-};
+    field_2 = codepoint >> 10;
+    field_1 = (codepoint >> 5) & 0x1F;
+    field_0 = codepoint & 0x1F;
 
-/* Hyphen: 308 bytes. */
-
-RE_UINT32 re_get_hyphen(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-
-    f = ch >> 14;
-    code = ch ^ (f << 14);
-    pos = (RE_UINT32)re_hyphen_stage_1[f] << 5;
-    f = code >> 9;
-    code ^= f << 9;
-    pos = (RE_UINT32)re_hyphen_stage_2[pos + f] << 3;
-    f = code >> 6;
-    code ^= f << 6;
-    pos = (RE_UINT32)re_hyphen_stage_3[pos + f] << 6;
-    pos += code;
-    value = (re_hyphen_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1;
-
-    return value;
-}
+    v = re_nfkc_quick_check_table_1[field_2];
+    v = re_nfkc_quick_check_table_2[(v << 5) | field_1];
+    v = re_nfkc_quick_check_table_3[(v << 5) | field_0];
 
-/* Quotation_Mark. */
+    return v;
+}
 
-static RE_UINT8 re_quotation_mark_stage_1[] = {
-    0, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1,
+/* NFKD_Quick_Check. */
+static RE_UINT8 re_nfkd_quick_check_table_1[] = {
+     0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5, 13, 14, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 16,  5,  5,  5,  5,  5,  5,  5,  5, 17, 18,
+     5,  5,  5,  5, 19, 20, 21,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5, 22, 23,  5,  5,  5,  5,  5, 24, 25,  5, 26,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5, 27,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5
 };
 
-static RE_UINT8 re_quotation_mark_stage_2[] = {
-    0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    2, 1, 1, 1, 1, 1, 1, 3, 4, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 5,
+static RE_UINT8 re_nfkd_quick_check_table_2[] = {
+      0,   0,   0,   0,   0,   1,   2,   3,   4,   5,   6,   7,   0,   8,   9,  10,
+     11,  12,   0,   0,   0,  13,  14,  15,   0,   0,  16,  17,  18,  19,  20,  21,
+     22,  23,  24,  25,   0,   0,  26,  27,   0,   0,   0,   0,  28,   0,   0,   0,
+      0,  29,   0,  30,   0,   0,  31,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,  32,  33,   0,   0,   0,  34,   0,
+      0,  35,  36,   0,   0,   0,   0,   0,   0,   0,  37,   0,  38,   0,  39,   0,
+      0,   0,  40,   0,   0,   0,  41,   0,   0,   0,  39,   0,   0,   0,  42,   0,
+      0,  43,   0,   0,   0,  43,  44,   0,  45,   0,  46,  47,  48,  49,   0,   0,
+      0,  50,   0,   0,   0,   0,   0,  51,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,  52,  53,  54,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,  55,  56,  57,  58,  59,   0,   0,
+     59,  59,  59,  59,  60,  59,  59,  61,  62,  59,  63,  64,  59,  65,  66,  67,
+     68,  69,  70,  71,  72,  40,   0,   0,  73,  74,  75,  59,  76,  77,  78,   0,
+     79,  80,  81,  82,  83,  84,   0,  85,   0,  86,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,  59,  59,  59,  59,  87,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     45,   0,   0,  88,   0,   0,  51,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,  44,   0,   0,   0,   0,   0,   0,   0,  89,   0,   0,   0,   0,
+      0,   0,   0,   0,  90,   0,   0,  43,  59,  59,  59,  59,  59,  59,  91,   0,
+     92,  93,  94,  95,  96,  94,  95,  97,   0,  98,  59,  59,  99,   0,   0,   0,
+    100,  59, 101, 100,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,  44,   0,   0,   0,   0,   0,   0, 102,   0,   0,   0, 103,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 104, 105,   0,   0,   0,   0,
+     59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,
+     59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,
+     59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,
+     59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59, 106,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,  59,  59,  59,  59,  59,  59,  59,  59,
+    107, 108,  59, 109,  59,  59,  61,   0, 110, 111, 112,  59,  59, 113, 114,  59,
+     59,  59,  59,  59,  59,  59,  59,  59,  59,  64, 115,  59,   4,  59, 116, 117,
+    118, 115, 119, 120,  59,  59,  59, 121, 122,  59,  59,  59,  59, 100, 123, 124,
+      0,   0,   0,   0, 125, 126,   0,   0,   0, 127,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 128,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0, 129,   0,   0,   0,   0,   0,   0,   0, 130,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0, 131,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 132,  15,   0,  58,  92,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     59,  59,  65,  59, 133, 134, 135,  59, 136, 137, 138,  59,  59,  59,  59,  59,
+     59,  59,  59,  59,  59,   7,  59,  59,  59,  59,  59,  59,  59,  59, 139,  59,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    135, 140, 141, 142, 143, 144,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0, 145, 146, 147,  39, 102,   0,   0,   0,
+    148,  60, 149,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 118,
+     59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,
+     64,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0
+};
+
+static RE_UINT8 re_nfkd_quick_check_table_3[] = {
+    255, 255, 255, 255, 254, 122, 195, 136,  64,   0, 129, 193,  64,   0, 129,  65,
+      0,   0,   3,   0, 192,   0,   2,   1,   6,  12,  12,   0, 192,   0,   0,   0,
+    252, 127, 254, 255,  15,   0,   0,  32,  48,   0, 192,   0,   0,   0,   0,  48,
+     63,   0, 240, 255, 255, 255,   0, 254, 255, 255, 255, 192, 224, 255, 255, 255,
+    228, 255, 255, 255, 255, 255, 239, 187,  15,  40, 254, 255, 255,   3, 254, 255,
+    255, 131, 128, 255, 255, 255, 200, 253, 116, 143, 255, 253, 255, 255, 255, 253,
+    255, 255, 116, 143, 255, 255,  63, 255, 249, 255,  48,   3,   3,   3, 192, 252,
+    127, 255, 255, 255, 131, 255, 255, 255, 255, 255,  31, 254, 250, 255, 247, 255,
+    255, 253, 237, 255, 255, 255, 255,   0, 255, 231, 255,  79, 255, 255, 183, 255,
+    255, 255, 255, 177, 255, 230, 255, 207, 255, 255, 239, 255, 255, 227, 255, 255,
+    255, 254, 255, 255, 126, 242, 255, 255, 255, 255, 255, 139, 255, 255, 247, 255,
+    255, 255, 255, 207, 255, 239, 255, 255, 247, 223, 123, 239, 255, 253,  23, 252,
+    253, 255, 247, 223, 123, 239, 255, 253, 191, 255, 255, 255, 255, 255, 255, 239,
+    191, 170, 251, 255, 255, 255, 255, 215, 244, 255, 255, 255, 255, 143,   0,   8,
+      0,  64,   0,   0,   0, 248, 255, 254, 255, 255, 255,   7,   0,   0,   0,   0,
+      0,   0,   0, 240,   0,   0,   0, 252,   0,   0, 192, 192, 192, 192,   0,  85,
+      0,   0,   0, 192,   0,   0,  32,   0,  32,   0,  48,  16,   0,   0,  35, 128,
+      0, 248, 125, 255, 143, 127,  39, 175, 127, 252, 127, 127, 255, 255,  12,   0,
+      0, 128,   0, 224,  16,   1, 144, 193, 168,  66,   4,   4,  30, 252,   0,   0,
+    255, 253, 255, 243, 255, 191, 255, 255, 255,  31, 255, 255, 239, 237, 255, 255,
+    175,  79, 254, 255, 109, 253, 255, 255, 250,  31, 204, 252, 204, 252, 255, 255,
+    255,  15, 255, 255, 240, 195, 255, 255, 255, 249, 255, 255,   0, 248, 255, 255,
+    255, 255, 143, 255, 255, 127, 255, 255, 255, 255, 255, 127,   0,   0, 192, 255,
+    254, 255, 255, 255, 255, 255, 191, 248, 255, 175, 170, 170,  90, 253,  36, 201,
+    255, 255, 239,  39, 255, 255, 111,  56, 255, 255,   1,   0,   0, 128,   3,   0,
+      0,   0,   0, 128,   0, 255,   0,   0, 255, 255, 254, 255, 255, 255, 255, 252,
+    255, 255, 255,  15, 255, 253, 255, 255, 240, 255, 255, 255,   0, 192,  26, 128,
+    154,   3,   0,   0,   0, 192,   0,   0, 128, 255,   7,  95,   0,   0, 128, 160,
+     36,   0,   0,   0,   0,   0, 252, 255, 255, 255,   7,   0, 255, 255,   0,   0,
+      0, 255, 255, 255, 255, 255,   0, 224, 255, 255,   0, 252,  96,   0,   8,   0,
+    128, 240,  40,   0,   0,   0,   0, 224,   1,   0,   0,   0,   3,   3,   3, 227,
+    128, 128, 255, 255, 255, 255, 255, 235, 255, 247, 255, 255, 255,  63, 255, 255,
+    255, 231, 255, 255, 255, 255, 255, 167, 255, 255, 255, 243, 255, 255, 255, 254,
+    255, 255, 255,  63,   0,   0,   0,  32, 155,  33,   0,  20,  16,   0,   0,   0,
+     64,  24,  32,  32,   0,   0,   0, 132, 160,   3,   2,   0,   0,  48,   0,   0,
+    105,   1,   8, 245, 123,  21, 105,  85, 105,   8,   8, 161,   0,   4,   0, 240,
+     17,   4,   0, 240,   0, 248,   0,   0,   0, 128,   0,   0,   0,   0, 255, 255,
+    248, 255,   0,   0,   0, 254, 252, 255
+};
+
+RE_UINT32 re_get_nfkd_quick_check(RE_UINT32 codepoint) {
+    RE_UINT32 field_2;
+    RE_UINT32 field_1;
+    RE_UINT32 field_0;
+    RE_UINT32 offset;
+    RE_UINT32 v;
+
+    field_2 = codepoint >> 10;
+    field_1 = (codepoint >> 5) & 0x1F;
+    field_0 = (codepoint >> 3) & 0x3;
+    offset = codepoint & 0x7;
+
+    v = re_nfkd_quick_check_table_1[field_2];
+    v = re_nfkd_quick_check_table_2[(v << 5) | field_1];
+    v = re_nfkd_quick_check_table_3[(v << 2) | field_0];
+
+    return (v >> offset) & 0x1;
+}
+
+/* Noncharacter_Code_Point. */
+static RE_UINT8 re_noncharacter_code_point_table_1[] = {
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2
 };
 
-static RE_UINT8 re_quotation_mark_stage_3[] = {
-    0, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    3, 1, 1, 1, 1, 1, 1, 1, 1, 4, 1, 1, 1, 1, 1, 1,
-    5, 1, 1, 1, 1, 1, 1, 1, 1, 6, 1, 1, 7, 8, 1, 1,
+static RE_UINT8 re_noncharacter_code_point_table_2[] = {
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3
 };
 
-static RE_UINT8 re_quotation_mark_stage_4[] = {
-      0,   0,   0,   0, 132,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   8,   0,   8,   0,   0,   0, 255,   0,   0,   0,   6,
-      4,   0,   0,   0,   0,   0,   0,   0,   0, 240,   0, 224,   0,   0,   0,   0,
-     30,   0,   0,   0,   0,   0,   0,   0, 132,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,  12,   0,   0,   0,
+static RE_UINT8 re_noncharacter_code_point_table_3[] = {
+      0,   0,   0,   0,   0,   0, 255, 255, 255, 255,   0,   0,   0,   0,   0, 192
 };
 
-/* Quotation_Mark: 284 bytes. */
-
-RE_UINT32 re_get_quotation_mark(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-
-    f = ch >> 14;
-    code = ch ^ (f << 14);
-    pos = (RE_UINT32)re_quotation_mark_stage_1[f] << 5;
-    f = code >> 9;
-    code ^= f << 9;
-    pos = (RE_UINT32)re_quotation_mark_stage_2[pos + f] << 3;
-    f = code >> 6;
-    code ^= f << 6;
-    pos = (RE_UINT32)re_quotation_mark_stage_3[pos + f] << 6;
-    pos += code;
-    value = (re_quotation_mark_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1;
-
-    return value;
-}
+RE_UINT32 re_get_noncharacter_code_point(RE_UINT32 codepoint) {
+    RE_UINT32 field_2;
+    RE_UINT32 field_1;
+    RE_UINT32 field_0;
+    RE_UINT32 offset;
+    RE_UINT32 v;
 
-/* Terminal_Punctuation. */
+    field_2 = codepoint >> 10;
+    field_1 = (codepoint >> 5) & 0x1F;
+    field_0 = (codepoint >> 3) & 0x3;
+    offset = codepoint & 0x7;
 
-static RE_UINT8 re_terminal_punctuation_stage_1[] = {
-    0, 1, 2, 2, 2, 3, 2, 4, 5, 6, 2, 7, 2, 8, 9, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2,
-};
+    v = re_noncharacter_code_point_table_1[field_2];
+    v = re_noncharacter_code_point_table_2[(v << 5) | field_1];
+    v = re_noncharacter_code_point_table_3[(v << 2) | field_0];
 
-static RE_UINT8 re_terminal_punctuation_stage_2[] = {
-     0,  1,  1,  2,  1,  3,  4,  5,  6,  7,  1,  1,  1,  1,  8,  9,
-    10,  1,  1, 11,  1,  1, 12, 13, 14, 15, 16, 17, 18,  1,  1,  1,
-    19,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1, 20,  1,
-    21,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
-     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
-     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
-     1,  1,  1,  1, 22,  1, 23,  1, 24, 25, 26, 27,  1,  1,  1,  1,
-     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
-     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
-     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1, 28, 29,
-     1,  1,  1, 30,  1,  1,  1,  1, 31, 32, 33, 34,  1,  1,  1, 35,
-    36, 37, 38,  1, 39, 40, 41, 42,  1,  1, 43,  1, 44,  1, 45,  1,
-     1,  1,  1,  1, 46,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
-     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
-     1,  1,  1,  1,  1,  1,  1,  1,  1,  1, 47, 48,  1,  1, 49,  1,
-     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
-     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
-     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1, 50,  1,  1,  1,
-     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
-     1,  1,  1,  1,  1,  1,  1,  1,  1,  1, 51,  1,  1,  1,  1,  1,
-};
+    return (v >> offset) & 0x1;
+}
 
-static RE_UINT8 re_terminal_punctuation_stage_3[] = {
-     0,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  2,  3,  0,  0,  0,  0,  0,  0,  0,  4,  0,  5,  0,
-     6,  0,  0,  0,  0,  0,  7,  0,  8,  0,  0,  0,  0,  0,  0,  9,
-     0, 10,  2,  0,  0,  0,  0,  0,  0,  0,  0, 11,  0,  0,  0,  0,
-     0,  0, 12,  0,  0,  0,  0,  0, 13,  0,  0,  0,  0,  0,  0,  0,
-     0,  0, 14,  0,  0,  0,  0,  0,  0,  0,  0, 15,  0,  0,  0,  0,
-     0,  0,  0, 16,  0,  0,  0, 17,  0, 18,  0,  0,  0,  0, 19,  0,
-    20,  0,  0,  0,  0,  0,  0,  0,  0,  0, 11,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0, 21,  0,  0,  0,  0, 22,  0,  0,  0,  0,  0,
-     0, 23,  0, 24,  0,  0,  0,  0,  0, 25, 26,  0,  0,  0,  0,  0,
-     0, 27, 28,  0,  0,  0,  0,  0, 29,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0,  0, 24, 30,  0,  0,  0,  0,  0,  0, 31,
-     0,  0,  0, 32,  0,  0, 33,  0,  0, 34,  0,  0,  0,  0, 26,  0,
-     0,  0, 35,  0,  0,  0, 36, 37,  0,  0,  0,  0,  0,  0,  0, 38,
-     0,  0, 39,  0,  0,  0,  0,  0,  1,  0,  0, 40,  0,  0,  0,  0,
-     0,  0,  0,  0, 36,  0, 41,  0,  0,  0, 42,  0,  0,  0,  0,  0,
-    36,  0,  0,  0,  0,  0,  0,  0,  0,  0, 32,  0,  0,  0,  0, 43,
-     0, 44,  0,  0, 45,  0,  0,  0,  0,  0, 46,  0,  0,  0,  0,  0,
-     0,  0, 47,  0,  0, 24, 48,  0,  0,  0, 49,  0,  0,  0, 50,  0,
-     0, 51,  0,  0,  0,  4,  0,  0,  0,  0, 52,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0, 53,  0,  0,  0, 29,  0,  0,  0,  0,  0,
-     0, 54,  0,  0,  0,  0,  0,  0,  0,  0, 55,  0, 56, 29,  0,  0,
-     0,  0, 49, 57,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 58,
-     0,  0,  0, 59,  0,  0,  0,  0,  0,  0,  0, 33,  0,  0,  0, 60,
-     0, 61, 62,  0,  0,  0,  0,  0,  0,  0,  0,  0, 58,  0,  0,  0,
-     0,  0,  0,  0, 36,  0,  0,  0,  0,  0,  0,  0, 63,  0,  0,  0,
+/* Numeric_Type. */
+static RE_UINT8 re_numeric_type_table_1[] = {
+     0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 10,
+    10, 10, 10, 15, 16, 17, 18, 19, 20, 21, 10, 22, 23, 24, 10, 10,
+    25, 26, 10, 27, 10, 28, 10, 10, 10, 29, 30, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 31, 32,
+    33, 34, 35, 36, 37, 38, 39, 40, 10, 41, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 42, 43, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 44, 45, 10, 10, 46, 10, 47, 48, 49, 10, 50, 10,
+    51, 10, 52, 10, 10, 10, 10, 10, 53, 10, 54, 10, 10, 10, 55, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 56, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 57, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10
 };
 
-static RE_UINT8 re_terminal_punctuation_stage_4[] = {
-      0,   0,   0,   0,   2,  80,   0, 140,   0,   0,   0,  64, 128,   0,   0,   0,
-      0,   2,   0,   0,   8,   0,   0,   0,   0,  16,   0, 200,   0,   0,  16,   0,
-    255,  23,   0,   0,   0,   0,   0,   3,   0,   0, 255, 127,  48,   0,   0,   0,
-      0,   0,   0,  12,   0, 225,   7,   0,   0,  12,   0,   0, 254,   1,   0,   0,
-      0,  64,   0,   0,   0,  56,   0,   0,   0,   0,  96,   0,   0,   0, 112,   4,
-     60,   3,   0,   0,   0,  15,   0,   0,   0,   0,   0, 236,   0,   0,   0, 248,
-      0,   0,   0, 192,   0,   0,   0,  48, 128,   3,   0,   0,   0,  64,   0,  16,
-      2, 208,   0,   0,   6,   0,   0,   0,   0, 224,   0,   0,   0,   0, 248,   0,
-      0,   0, 192,   0,   0, 192,   0,   0,   0, 128,   0,   0,   0,   0,   0, 224,
-      0,   0,   0, 128,   0,   0,   3,   0,   0,   8,   0,   0,   0,   0, 247,   0,
-     18,   0,   0,   0,   0,   0,   1,   0,   0,   0, 128,   0,   0,   0,  63,   0,
-      0,   0,   0, 252,   0,   0,   0,  30,   0,   0, 224,   3, 128,  63,   0,   0,
-      3,   0,   0,   0,  14,   0,   0,   0,  96,  32,   0, 192,   0,   0,   0,  31,
-      0,  56,   0,   8,  60, 254, 255,   0,   0,   0,   0, 112,  12,   0,   0,   0,
-      0,   0,   0,  24,   0,   0,   2,   0,   0,   0, 128,   1,   0,   0,  31,   0,
-      0,   0,  32,   0,   0,   0, 128,   3,  16,   0,   0,   0, 128,   7,   0,   0,
+static RE_UINT8 re_numeric_type_table_2[] = {
+      0,   1,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   3,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   3,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   4,   0,   0,   0,   5,
+      0,   0,   0,   4,   0,   0,   0,   4,   0,   0,   0,   6,   0,   0,   0,   7,
+      0,   0,   0,   8,   0,   0,   0,   4,   0,   0,   9,  10,   0,   0,   0,   4,
+      0,   0,   1,   0,   0,   0,   1,   0,   0,  11,   0,   0,   0,   0,   0,   0,
+      0,   0,   3,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  12,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,  13,   0,   0,   0,   0,   0,   0,   0,  14,
+      1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   4,   0,   0,   0,  15,   0,
+      0,   0,   0,   0,  16,   0,   0,   0,   0,   0,   1,   0,   0,   1,   0,   0,
+      0,   0,  16,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,  17,  18,   0,   0,   0,   0,   0,  19,  20,  21,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,  22,  23,   0,   0,  24,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  25,  26,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,  27,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     28,  29,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  30,   0,   0,   0,
+      0,  31,  32,   0,  31,  33,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     34,   0,   0,   0,  35,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,  36,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  37,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     38,   0,  27,   0,  39,  40,  41,  42,  37,   0,   0,  43,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,  44,   0,  45,  46,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  47,   0,   0,   0,  48,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,  49,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,  50,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,  51,   0,   0,   0,  52,  53,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,  54,   0,   0,  55,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  56,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,  45,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  57,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,  54,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,  45,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,  55,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,  58,   0,   0,   0,  43,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,  59,  60,  61,   0,   0,   0,  57,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   3,   0,   0,   0,   0,   0,  62,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,  63,   0,   0,   0,   0,   1,   0,   3,   0,   0,   0,   0,   0,   1,   1,
+      0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  64,   0,  56,  65,  27,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,  66,  67,  20,  68,  69,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,  70,   0,  71,  72,   0,   0,   0,  73,   0,
+      0,   0,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,  74,  75,   0,  76,   0,  77,  78,   0,   0,   0,   0,  79,  80,  20,
+      0,   0,  81,  82,  83,   0,   0,  84,   0,   0,  74,  74,   0,  85,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,  86,   0,   1,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,  87,   0,   0,   0,   0,  83,  88,  89,   0,   0,   0,  90,   0,
+      0,   0,  91,  92,   0,   0,   0,   1,   0,  93,   0,   0,   0,   0,   1,  94,
+      0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   1,   0,   0,   0,   3,   0,   0,  95,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,  96,   0,   0,   1,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,  97,  98,   0,   0,   0,   0,   0,   0,   1,   0,   0,   3,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  99,   0,
+     20,  20,  20, 100,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   3,   0,   0,   0,   0,   0,   0, 101, 102,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0, 103,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,  67,   0,   0,   0,  68,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 104, 105,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,  76,   0,   0,   0,   1,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,  33,  20, 106,   0,   0, 107, 108,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0, 109,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,
+     59,   0,   0,  44,   0,   0,   0, 110,   0,  59,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,  36,   0,   0, 111,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0, 112, 113,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  43,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  61,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,  49,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,  37,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,  43,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0
 };
 
-/* Terminal_Punctuation: 1128 bytes. */
-
-RE_UINT32 re_get_terminal_punctuation(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-
-    f = ch >> 13;
-    code = ch ^ (f << 13);
-    pos = (RE_UINT32)re_terminal_punctuation_stage_1[f] << 5;
-    f = code >> 8;
-    code ^= f << 8;
-    pos = (RE_UINT32)re_terminal_punctuation_stage_2[pos + f] << 3;
-    f = code >> 5;
-    code ^= f << 5;
-    pos = (RE_UINT32)re_terminal_punctuation_stage_3[pos + f] << 5;
-    pos += code;
-    value = (re_terminal_punctuation_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1;
-
-    return value;
-}
-
-/* Other_Math. */
-
-static RE_UINT8 re_other_math_stage_1[] = {
-    0, 1, 1, 2, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1,
+static RE_UINT8 re_numeric_type_table_3[] = {
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 2, 2, 0, 0, 0, 0, 0, 2, 0, 0, 3, 3, 3, 0,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    0, 0, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 0,
+    0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 3, 3, 3, 3, 3,
+    3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3,
+    3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0,
+    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 0, 0, 0, 0, 0,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    2, 0, 0, 0, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+    3, 3, 3, 0, 0, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3,
+    3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3,
+    3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 3, 3, 3, 3,
+    3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 2,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3,
+    0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+    0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    3, 0, 0, 3, 0, 0, 0, 3, 0, 3, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,
+    0, 0, 0, 0, 3, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+    3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+    0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 3, 0, 3, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 3, 0, 3, 3, 3, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 3, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 0,
+    3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0,
+    0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 3, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0,
+    0, 0, 0, 3, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 3, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+    3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+    3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0,
+    3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3,
+    0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 0, 0,
+    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+    0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+    2, 2, 2, 2, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3,
+    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0,
+    3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3,
+    3, 3, 3, 3, 3, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+    3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 3, 0, 0, 0, 0,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 3, 3, 3, 3, 3,
+    3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 3, 3, 3, 3, 3,
+    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+    3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 3, 3, 3, 3, 3,
+    3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+    3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1,
     1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
     1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
     1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1,
+    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 3, 3, 3,
+    0, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 3,
+    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0
 };
 
-static RE_UINT8 re_other_math_stage_2[] = {
-    0, 1, 1, 1, 1, 1, 1, 1, 2, 3, 4, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 5,
-    1, 1, 1, 1, 1, 6, 1, 1, 1, 1, 1, 7, 1, 1, 1, 1,
-};
+RE_UINT32 re_get_numeric_type(RE_UINT32 codepoint) {
+    RE_UINT32 field_2;
+    RE_UINT32 field_1;
+    RE_UINT32 field_0;
+    RE_UINT32 v;
 
-static RE_UINT8 re_other_math_stage_3[] = {
-     0,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  2,
-     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     3,  4,  5,  6,  7,  8,  9, 10,  0,  0,  0,  0, 11,  0, 12, 13,
-     0,  0,  0,  0,  0,  0, 14, 15, 16, 17,  0,  0,  0,  0,  0, 18,
-     0,  0,  0,  0,  0,  0, 19, 20,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0,  0,  0,  0, 21,  0,  0, 22,  0,  0,  0,
-    23, 24, 25, 26, 27, 28, 23, 23, 23, 23, 29, 30, 31, 32, 33, 34,
-     0,  0,  0,  0,  0,  0,  0,  0, 35, 36, 37,  0,  0,  0,  0,  0,
-};
+    field_2 = codepoint >> 10;
+    field_1 = (codepoint >> 5) & 0x1F;
+    field_0 = codepoint & 0x1F;
 
-static RE_UINT8 re_other_math_stage_4[] = {
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  64,   0,   0,   0,   0,
-      0,   0,  39,   0,   0,   0,  51,   0,   0,   0,  64,   0,   0,   0,  28,   0,
-      1,   0,   0,   0,  30,   0,   0,  96,   0,  96,   0,   0,   0,   0,   0,   0,
-      0,   0, 255,  31,  98, 248,   0,   0, 132, 252,  47,  62,  16, 179, 251, 241,
-    224,   3,   0,   0,   0,   0,   0,   0,   0,   0, 224, 243, 182,  62, 195, 240,
-    255,  63, 235,  47,  48,   0,   0,   0,   0,  15,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0, 176,   0,   0,   0,   1,   0,   4,   0,   0,   0,
-      0,   0,   0,   0,   3, 192, 127, 240, 193, 140,  15,   0, 148,  31,   0,   0,
-     96,   0,   0,   0,   0,   0,   0,   0,   5,   0,   0,   0,  15,  96,   0,   0,
-     96,   0,   0,   0, 192, 255,   0,   0, 248, 255, 255,   1,   0,   0,   0,   0,
-      0,   0,   0,  15,   0,   0,   0,  48,   0,   0,   0,   0,  10,   1,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,  80, 255, 255, 255, 255, 255, 255, 255, 255,
-    255, 255, 223, 255, 255, 255, 255, 255, 255, 255, 255, 223, 100, 222, 255, 235,
-    239, 255, 255, 255, 255, 255, 255, 255, 191, 231, 223, 223, 255, 255, 255, 123,
-     95, 252, 253, 255, 255, 255, 255, 255, 255, 255, 255, 255,  63, 255, 255, 255,
-    253, 255, 255, 247, 255, 255, 255, 247, 255, 255, 223, 255, 255, 255, 223, 255,
-    255, 127, 255, 255, 255, 127, 255, 255, 255, 253, 255, 255, 255, 253, 255, 255,
-    247, 207, 255, 255, 255, 255, 255, 255, 239, 255, 255, 255, 150, 254, 247,  10,
-    132, 234, 150, 170, 150, 247, 247,  94, 255, 251, 255,  15, 238, 251, 255,  15,
-};
+    v = re_numeric_type_table_1[field_2];
+    v = re_numeric_type_table_2[(v << 5) | field_1];
+    v = re_numeric_type_table_3[(v << 5) | field_0];
 
-/* Other_Math: 564 bytes. */
-
-RE_UINT32 re_get_other_math(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-
-    f = ch >> 14;
-    code = ch ^ (f << 14);
-    pos = (RE_UINT32)re_other_math_stage_1[f] << 4;
-    f = code >> 10;
-    code ^= f << 10;
-    pos = (RE_UINT32)re_other_math_stage_2[pos + f] << 4;
-    f = code >> 6;
-    code ^= f << 6;
-    pos = (RE_UINT32)re_other_math_stage_3[pos + f] << 6;
-    pos += code;
-    value = (re_other_math_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1;
-
-    return value;
+    return v;
 }
 
-/* Hex_Digit. */
-
-static RE_UINT8 re_hex_digit_stage_1[] = {
-    0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1,
-};
-
-static RE_UINT8 re_hex_digit_stage_2[] = {
-    0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-};
-
-static RE_UINT8 re_hex_digit_stage_3[] = {
-    0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1,
+/* Numeric_Value. */
+static RE_UINT8 re_numeric_value_table_1[] = {
+     0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 10,
+    10, 10, 10, 15, 16, 17, 18, 19, 20, 21, 10, 22, 23, 24, 10, 10,
+    25, 26, 10, 27, 10, 28, 10, 10, 10, 29, 30, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 31, 32,
+    33, 34, 35, 36, 37, 38, 39, 40, 10, 41, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 42, 43, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 44, 45, 10, 10, 46, 10, 47, 48, 49, 10, 50, 10,
+    51, 10, 52, 10, 10, 10, 10, 10, 53, 10, 54, 10, 10, 10, 55, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 56, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 57, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10
 };
 
-static RE_UINT8 re_hex_digit_stage_4[] = {
-      0,   0,   0,   0,   0,   0, 255,   3, 126,   0,   0,   0, 126,   0,   0,   0,
+static RE_UINT8 re_numeric_value_table_2[] = {
+      0,   1,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0, 255,   3, 126,   0,   0,   0, 126,   0,   0,   0,   0,   0,   0,   0,
-};
-
-/* Hex_Digit: 177 bytes. */
-
-RE_UINT32 re_get_hex_digit(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-
-    f = ch >> 16;
-    code = ch ^ (f << 16);
-    pos = (RE_UINT32)re_hex_digit_stage_1[f] << 5;
-    f = code >> 11;
-    code ^= f << 11;
-    pos = (RE_UINT32)re_hex_digit_stage_2[pos + f] << 4;
-    f = code >> 7;
-    code ^= f << 7;
-    pos = (RE_UINT32)re_hex_digit_stage_3[pos + f] << 7;
-    pos += code;
-    value = (re_hex_digit_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1;
-
-    return value;
-}
-
-/* ASCII_Hex_Digit. */
-
-static RE_UINT8 re_ascii_hex_digit_stage_1[] = {
-    0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1,
-};
-
-static RE_UINT8 re_ascii_hex_digit_stage_2[] = {
-    0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-};
-
-static RE_UINT8 re_ascii_hex_digit_stage_3[] = {
-    0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-};
-
-static RE_UINT8 re_ascii_hex_digit_stage_4[] = {
-      0,   0,   0,   0,   0,   0, 255,   3, 126,   0,   0,   0, 126,   0,   0,   0,
       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   3,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   3,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   4,   0,   0,   0,   5,
+      0,   0,   0,   4,   0,   0,   0,   4,   0,   0,   0,   6,   0,   0,   0,   7,
+      0,   0,   0,   8,   0,   0,   0,   4,   0,   0,   9,  10,   0,   0,   0,   4,
+      0,   0,   1,   0,   0,   0,   1,   0,   0,  11,   0,   0,   0,   0,   0,   0,
+      0,   0,   3,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  12,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,  13,   0,   0,   0,   0,   0,   0,   0,  14,
+      1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   4,   0,   0,   0,  15,   0,
+      0,   0,   0,   0,  14,   0,   0,   0,   0,   0,   1,   0,   0,   1,   0,   0,
+      0,   0,  14,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,  16,   3,   0,   0,   0,   0,   0,  17,  18,  19,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,  20,  21,   0,   0,  22,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  23,  24,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,  25,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     26,  27,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  28,   0,   0,   0,
+      0,  29,  30,   0,  29,  31,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     32,   0,   0,   0,  33,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,  34,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  35,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     36,   0,  37,   0,  38,  39,  40,  41,  42,   0,   0,  43,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,  44,   0,  45,  46,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  47,   0,   0,   0,  48,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,  49,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,  50,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,  51,   0,   0,   0,  52,  53,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,  54,   0,   0,  55,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  56,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,  57,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  58,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,  59,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,  60,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,  61,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,  62,   0,   0,   0,  63,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,  64,  65,  66,   0,   0,   0,  67,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   3,   0,   0,   0,   0,   0,  68,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,  69,   0,   0,   0,   0,   1,   0,   3,   0,   0,   0,   0,   0,   1,   1,
+      0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  70,   0,  71,  72,  73,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,  74,  75,  76,  77,  78,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,  79,   0,  80,  81,   0,   0,   0,  82,   0,
+      0,   0,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,  83,  84,   0,  85,   0,  86,  87,   0,   0,   0,   0,  88,  89,  90,
+      0,   0,  91,  92,  93,   0,   0,  94,   0,   0,  95,  95,   0,  96,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,  97,   0,   1,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,  98,   0,   0,   0,   0,  99, 100, 101,   0,   0,   0, 102,   0,
+      0,   0, 103, 104,   0,   0,   0,   1,   0, 105,   0,   0,   0,   0,   1, 106,
+      0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   1,   0,   0,   0,   3,   0,   0, 107,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0, 108,   0,   0,   1,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0, 109, 110,   0,   0,   0,   0,   0,   0,   1,   0,   0,   3,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 111,   0,
+    112, 113, 114, 115,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   3,   0,   0,   0,   0,   0,   0, 116, 117,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0, 118,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0, 119,   0,   0,   0, 120,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 121, 122,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0, 123,   0,   0,   0,   1,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0, 124, 125, 126,   0,   0, 127, 128,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0, 129,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,
+    130,   0,   0, 131,   0,   0,   0, 132,   0, 133,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0, 134,   0,   0, 135,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0, 136, 137,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  63,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 138,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0, 139,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0, 140,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0, 141,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0
 };
 
-/* ASCII_Hex_Digit: 130 bytes. */
-
-RE_UINT32 re_get_ascii_hex_digit(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-
-    f = ch >> 15;
-    code = ch ^ (f << 15);
-    pos = (RE_UINT32)re_ascii_hex_digit_stage_1[f] << 4;
-    f = code >> 11;
-    code ^= f << 11;
-    pos = (RE_UINT32)re_ascii_hex_digit_stage_2[pos + f] << 4;
-    f = code >> 7;
-    code ^= f << 7;
-    pos = (RE_UINT32)re_ascii_hex_digit_stage_3[pos + f] << 7;
-    pos += code;
-    value = (re_ascii_hex_digit_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1;
-
-    return value;
-}
-
-/* Other_Alphabetic. */
-
-static RE_UINT8 re_other_alphabetic_stage_1[] = {
-    0, 1, 2, 2, 2, 3, 2, 4, 5, 2, 2, 6, 2, 7, 2, 8,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2,
+static RE_UINT8 re_numeric_value_table_3[] = {
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      1,   2,   3,   4,   5,   6,   7,   8,   9,  10,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   3,   4,   0,   0,   0,   0,   0,   2,   0,   0,  11,  12,  13,   0,
+      1,   2,   3,   4,   5,   6,   7,   8,   9,  10,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   1,   2,   3,   4,   5,   6,   7,   8,   9,  10,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   1,   2,   3,   4,   5,   6,   7,   8,   9,  10,
+      0,   0,   0,   0,  14,  15,  16,  11,  13,  17,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   1,   2,   3,   4,   5,   6,   7,   8,   9,  10,
+      0,   0,  11,  12,  13,  14,  15,  16,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   1,   2,   3,   4,   5,   6,   7,   8,   9,  10,
+     18,  19,  20,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   1,   2,   3,   4,   5,   6,   7,   8,   9,  10,
+      0,   0,   0,   0,   0,   0,   0,   0,   1,   2,   3,   4,   2,   3,   4,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,  21,  22,  23,  24,  25,  26,  27,   0,
+      0,   0,   0,   0,   0,   0,   1,   2,   3,   4,   5,   6,   7,   8,   9,  10,
+     18,  19,  20,  11,  12,  13,  14,  15,  16,   0,   0,   0,   0,   0,   0,   0,
+      1,   2,   3,   4,   5,   6,   7,   8,   9,  10,  12,  28,  29,  30,  31,  32,
+     33,  34,  35,  36,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   3,   4,   5,   6,   7,   8,
+      9,  10,  18,  37,  38,  39,  40,  41,  42,  43,  44,  19,  45,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  46,  47,
+     48,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      1,   2,   3,   4,   5,   6,   7,   8,   9,  10,   0,   0,   0,   0,   0,   0,
+      1,   2,   3,   4,   5,   6,   7,   8,   9,  10,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      1,   2,   3,   4,   5,   6,   7,   8,   9,  10,   2,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      1,   0,   0,   0,   5,   6,   7,   8,   9,  10,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     49,  50,  25,  51,  52,  27,  53,  54,  55,  56,  57,  15,  58,  59,  60,   2,
+      2,   3,   4,   5,   6,   7,   8,   9,  10,  18,  61,  62,  40,  19,  63,  20,
+      2,   3,   4,   5,   6,   7,   8,   9,  10,  18,  61,  62,  40,  19,  63,  20,
+     20,  64,  45,   0,   0,   7,  40,  65,  66,   1,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      2,   3,   4,   5,   6,   7,   8,   9,  10,  18,  61,  62,  67,  68,  69,  17,
+     46,  47,  48,  37,   2,   3,   4,   5,   6,   7,   8,   9,  10,  18,  61,  62,
+     67,  68,  69,  17,  46,  47,  48,  37,   2,   3,   4,   5,   6,   7,   8,   9,
+     10,  18,  61,  62,  67,  68,  69,  17,  46,  47,  48,  37,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,  61,  62,  67,  68,  69,
+     17,  46,  47,  48,  37,   2,   3,   4,   5,   6,   7,   8,   9,  10,  18,   1,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   2,   3,   4,   5,   6,   7,   8,   9,  10,  18,
+      2,   3,   4,   5,   6,   7,   8,   9,  10,  18,   2,   3,   4,   5,   6,   7,
+      8,   9,  10,  18,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  12,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   2,   3,   4,   5,   6,   7,   8,   9,  10,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,  18,  37,  38,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   2,   3,   4,   5,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      2,   3,   4,   5,   6,   7,   8,   9,  10,  18,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,  18,  37,  38,  39,  40,  41,  42,  43,
+      0,  70,  71,  72,  73,  74,  75,  76,  77,  78,  38,  79,  80,  81,  82,  83,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,  84,  85,  86,  87,  39,  88,  89,  90,  91,  92,  93,  94,  95,  96,  40,
+      0,   0,   0,   0,   0,   6,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   6,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   8,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      2,   0,   0,   8,   0,   0,   0,  45,   0,   4,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  10,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,
+      0,   0,   0,   0,   6,   0,   5,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  97,
+     18,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  20,
+      0,   0,   0,   0,   0,   0,   0,   0,   4,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   6,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     19,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,  97,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,  98,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   9,   0,   7,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,  18,   0,  20,  37,  38,   0,   0,   0,   0,   0,   0,  39,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   4,   4,   4,   4,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   5,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   2,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  10,  37,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   3,   4,   0,
+      3,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  18,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   9,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   8,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   8,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,  10,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  19,   0,
+      0,   0,   0,   0,   0,   0,   5,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  45,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,
+      0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      3,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,  20,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   7,   0,   0,   0,   0,   0,  19,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   7,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   2,   3,   4,   5,   6,   7,   8,   9,  10,   1,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     11,  12,  13,  14,  15,  16,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   4,   0,   0,   0,   0,
+      0,   0,   0,  18,   0,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   7,   0,   7,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  18,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   2,   3,   4,   5,   6,   7,   8,   9,  10,
+     18,  37,  38,  39,  40,  41,  42,  43,  44,  19,  99, 100, 101,  63, 102, 103,
+    104, 105,  20, 106, 107, 108,  64, 109, 110, 111, 112,  45, 113, 114, 115,  65,
+    116, 117, 118, 119,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     11,  12,   2,   6,  40,  63,  64,  65,   6,  18,  40,  19,  63,  20,  64,   6,
+     18,  40,  19,  63,  20,  45,  65,  18,   2,   2,   2,   3,   3,   3,   3,   6,
+     18,  18,  18,  18,  18,  38,  40,  40,  40,  40,  19, 100,  63,  63,  63,  63,
+     63,  20,  64,   6,  40,  12,  12,  52,  13,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,  11,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   2,   3,   4,   5,   6,   7,   8,   9,  10,  18,  37,  38,  39,  40,  41,
+     42,  43,  44,  19,  99, 100, 101,  63, 102, 103, 104, 105,   0,   0,   0,   0,
+      2,   6,  18,  40,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,  44,   0,   0,   0,   0,   0,   0,   0,   0, 105,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   2,   3,  18,  37,  19,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   2,   3,   4,  18,  37,  19,  20,  45,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   3,   4,   5,   6,  18,  37,
+      0,   0,   0,   0,   0,   0,   0,   2,   3,   4,   5,   5,   6,  18,  37,  19,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   6,  18,  37,  19,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   2,  18,  37,  19,   3,   4,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 120,  12,   0,   0,
+      2,   3,   4,   5,   6,   7,   8,   9,  10,  18,  37,  38,  39,  40,  41,  42,
+      0,   0,  19,  99, 100, 101,  63, 102, 103, 104, 105,  20, 106, 107, 108,  64,
+    109, 110, 111, 112,  45, 113, 114, 115,  65, 116, 117, 118, 119,  66, 121, 122,
+    123, 124, 125, 126, 127, 128, 129,  56,  11,  51, 130,  12, 131,  52,  13,  57,
+      2,   3,   4,   5,  18,  37,  19,  20,  12,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,  40,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,  18,  37,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   6,  18,  37,  19,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   2,   3,   4,   5,  18,  37,  19,  20,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   3,   4,   5,  18,  37,  19,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   6,  18,  40,  19,  20,
+      2,   3,   4,   5,   6,   7,   8,   9,  10,  18,  37,  38,  39,  40,  41,  42,
+     43,  44,  19,  99, 100, 101,  63, 102, 103, 104, 105,  12,  11,  51,  52,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   3,   4,
+      5,   6,  18,  37,  38,  19,  12,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   2,  18,  37,  19,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   2,   3,   4,   5,  18,  37,  19,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   2,   3,   4,   5,   6,   7,   8,   9,  10,  18,  37,  38,  39,  40,
+     41,  42,  43,  44,  19,  20,   1,   2,   3,   4,   5,   6,   7,   8,   9,  10,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   1,   2,   3,   4,   5,   6,   7,   8,   9,  10,
+      0,   2,   3,   4,   5,   6,   7,   8,   9,  10,  18,  37,  38,  39,  40,  41,
+     42,  43,  44,  19,  20,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      1,   2,   3,   4,   5,   6,   7,   8,   9,  10,  18,  37,   0,   0,   0,   0,
+      1,   2,   3,   4,   5,   6,   7,   8,   9,  10,  18,  37,  38,  39,  40,  41,
+     42,  43,  44,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      1,   2,   3,   4,   5,   6,   7,   8,   9,  10,   2,   3,   4,   5,   6,   7,
+      8,   9,  10,  18,  37,  38,  39,  40,  41,  42,  43,  44,  19,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    132,  21, 133, 134,  22, 135,  23, 136,  24,  14,  14,  25,  15,  26,  16,  27,
+     11,  12,  12,  13, 132,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      3,   4,   5,   6,   7,   8,   9,  10,   4,   5,   6,   7,   8,   9,  10,   5,
+      6,   7,   8,   9,  10,   2,   3,   4,   5,   6,   7,   8,   9,  10,   2,   3,
+      4,   5,   6,   3,   4,   4,   5,   6,   7,   8,   9,  10,   2,   3,   4,   4,
+      5,   6, 137, 138,   2,   3,   4,   4,   5,   6,   4,   4,   5,   5,   5,   5,
+      7,   8,   8,   8,   9,   9,  10,  10,  10,  10,   3,   4,   5,   6,   7,   2,
+      3,   4,   5,   5,   6,   6,   3,   4,   2,   3,  51,  52,  57,  51,  52,  15,
+     11,  56,  11,  11,  12,  51,  52,  39,  40,   5,   6,   7,   8,   9,  10,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      1,   2,   3,   4,   5,   6,   7,   8,   9,  10,   0,  18,  19,  45, 139,  97,
+    140,  98,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      1,   2,   3,   4,   5,   6,   7,   8,   9,  10,  18,  61,  62,  67,  68,  69,
+     17,  46,  47,  48,   2,   3,   4,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      1,   2,   3,   4,   5,   6,   7,   8,   9,  10,  18,  61,  62,  67,  68,  69,
+     17,  46,  47,  48,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      2,   3,   4,   5,   6,   7,   8,   9,  10,  18,  37,  38,  39,  40,  41,  42,
+     43,  44,   2,   3,   4,   5,   6,   2,   6,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   2,
+      3,   4,   5,   6,   7,   8,   9,  10,   1,   2,   3,   4,   5,   6,   7,   8,
+      9,  10,   1,   2,   3,   4,   5,   6,   7,   8,   9,  10,   1,   2,   3,   4,
+      5,   6,   7,   8,   9,  10,   1,   2,   3,   4,   5,   6,   7,   8,   9,  10,
+      0,   0,   0,   0,   0,   0,   0,   2,   3,   4,   5,   6,   7,   8,   9,  10,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   2,   3,   4,   5,   6,   7,   8,   9,  10,  18,  37,  38,  39,  40,  41,
+     42,  43,  44,  19,  99, 100, 101,  63, 102, 103, 104, 105,  20, 106, 107, 108,
+     64, 109, 110, 111, 112,  45, 113, 114, 115,  65, 116, 117, 118, 119,  66, 121,
+     66, 141, 142,   2,   3,   4,   5,   6,   7,   8,   9,  10,   0,  11,  12,  13,
+      0,   2,   3,  45,  66,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   2,   3,   4,   5,   6,   7,   8,   9,  10,  18,  37,  38,  39,  40,  41,
+     42,  43,  44,  19,  99, 100, 101,  63, 102, 103, 104, 105,  20, 106, 107, 108,
+     64, 109, 110, 111, 112,  45, 113, 114, 115,  65, 116, 117, 118, 119,   0,   3,
+      4,   5,   6,   7,   8,   9,  10,  18, 101, 102, 106,  45,  12,  56,   0,   0,
+      1,   1,   2,   3,   4,   5,   6,   7,   8,   9,  10,   1,   1,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   8,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   5,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   5,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   6,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,  38,   0,   0,   0,   0,   0,   0,   0,   0,  39,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  39,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   7,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   4,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   4,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   4,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   4,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   5,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     10,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0
 };
 
-static RE_UINT8 re_other_alphabetic_stage_2[] = {
-     0,  0,  0,  1,  0,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12,
-    13,  0,  0,  0,  0,  0,  0, 14, 15, 16, 17, 18, 19, 20,  0,  0,
-     0,  0,  0,  0, 21,  0,  0,  0,  0,  0,  0,  0,  0, 22,  0,  0,
-     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0, 23,  0, 24, 25, 26, 27,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 28,  0,  0,  0,  0,
-     0,  0,  0, 29,  0,  0,  0,  0,  0,  0, 30,  0,  0, 31,  0,  0,
-    32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42,  0, 43, 44, 45,  0,
-     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 46,
-     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 47,  0,  0,  0,
-    48,  0,  0,  0,  0,  0,  0,  0,  0, 49,  0,  0,  0,  0,  0,  0,
-     0, 50,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+RE_UINT32 re_get_numeric_value(RE_UINT32 codepoint) {
+    RE_UINT32 field_2;
+    RE_UINT32 field_1;
+    RE_UINT32 field_0;
+    RE_UINT32 v;
+
+    field_2 = codepoint >> 10;
+    field_1 = (codepoint >> 5) & 0x1F;
+    field_0 = codepoint & 0x1F;
+
+    v = re_numeric_value_table_1[field_2];
+    v = re_numeric_value_table_2[(v << 5) | field_1];
+    v = re_numeric_value_table_3[(v << 5) | field_0];
+
+    return v;
+}
+
+/* Other_Alphabetic. */
+static RE_UINT8 re_other_alphabetic_table_1[] = {
+     0,  1,  2,  3,  4,  5,  6,  7,  8,  9,  8, 10,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8, 11, 12,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8, 13,  8,
+    14,  8, 15, 16, 17, 18, 19, 20,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8, 21,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8, 22,
+     8,  8,  8,  8,  8,  8,  8,  8, 23,  8, 24,  8, 25,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8
 };
 
-static RE_UINT8 re_other_alphabetic_stage_3[] = {
+static RE_UINT8 re_other_alphabetic_table_2[] = {
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   2,   3,   0,   4,   0,   5,   6,   0,   0,   7,   8,
-      9,  10,   0,   0,   0,  11,   0,   0,  12,  13,   0,   0,   0,   0,  14,  15,
-     16,  17,  18,  19,  20,  21,  22,  19,  20,  21,  23,  24,  20,  21,  25,  26,
-     20,  21,  27,  19,  28,  21,  29,   0,  16,  21,  30,  19,  20,  21,  30,  19,
-     16,  21,  31,  19,  19,   0,  32,  33,   0,  34,  35,   0,   0,  36,  35,   0,
-      0,   0,   0,  37,  38,  39,   0,   0,   0,  40,  41,  42,  43,   0,   0,   0,
-     33,  33,  33,  33,   0,  44,  45,   0,   0,   0,   0,   0,  46,  47,   0,   0,
-      0,  48,   0,   0,   0,   0,   0,   0,  49,   0,  50,  51,   0,   0,   0,   0,
-     52,  53,  16,   0,  54,  55,   0,  56,   0,  57,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,  58,   0,   0,   0,   0,   0,  44,  59,  60,
-      0,   0,   0,   0,   0,   0,   0,  59,   0,   0,   0,  61,  21,   0,   0,   0,
-     62,  63,   0,   0,  64,  14,  65,  66,   0,  67,  68,   0,  16,  14,   0,   1,
-      0,  69,  70,  71,   0,  72,   0,  73,   0,   0,   0,   0,   0,   0,   0,  74,
-     75,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  76,   0,   0,   0,   0,
-     77,   0,   0,   0,   0,   0,   0,   0,   0,  78,   0,   0,   0,   0,   0,   0,
-     54,  79,  80,   0,  28,  81,   0,   0,  54,  68,  46,   0,  54,  82,   0,   0,
-      0,  83,   0,   0,   0,   0,  66,  45,  16,  21,  22,  19,   0,   0,   0,   0,
-      0,  53,  84,   0,   0,  10,  64,   0,   0,   0,   0,   0,   0,  85,  86,   0,
-      0,  87,  88,   0,   0,  89,   0,   0,  90,  91,   0,   0,   0,   0,   0,   0,
-      0,  92,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  93,  94,
-     95,  96,  97,   0,  98,   0,   0,   0,   0,  99,   0,   0, 100, 101,   0,   0,
-      0, 102, 103,   0, 104,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 105,
-      0,   0, 106,  59, 107,   0,   0,   0,   0,   0,   0,   0,  75,   0,   0,   0,
-    108, 109,   0,   0,   0,   0,   0,   0,   0,   0, 110,   0,   0,   0,   0,   0,
-      0,  10, 111, 111,  60,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   3,   0,
+      4,   0,   5,   6,   0,   0,   7,   8,   9,  10,   0,   0,   0,  11,   0,   0,
+     12,  13,   0,   0,   0,   0,  14,  15,  16,  17,  18,  19,  20,  21,  22,  19,
+     20,  21,  23,  24,  20,  21,  25,  26,  20,  21,  27,  19,  28,  21,  29,   0,
+     16,  21,  30,  19,  20,  21,  30,  19,  16,  21,  31,  19,  20,   0,  32,  33,
+      0,  34,  35,   0,   0,  36,  35,   0,   0,   0,   0,  37,  38,  39,   0,   0,
+      0,  40,  41,  42,  43,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,  33,  33,  33,  33,   0,  44,  45,   0,
+      0,   0,   0,   0,  46,  47,   0,   0,   0,  48,   0,   0,   0,   0,   0,   0,
+     49,   0,  50,  51,   0,  52,  53,   0,  54,  55,  16,   0,  56,  57,   0,  58,
+      0,  59,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  60,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,  44,  61,  62,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  61,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,  63,  21,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     64,  65,   0,   0,  66,  14,  67,  52,   0,  68,  69,   0,  16,  14,   0,   1,
+      0,  70,  71,  72,   0,  73,   0,  74,   0,   0,   0,   0,   0,   0,   0,  75,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,  76,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  77,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     78,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,  79,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,  80,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     56,  81,  82,   0,  28,  83,   0,   0,  56,  69,  46,   0,  56,  84,  85,   0,
+      0,  86,   0,   0,   0,   0,  52,  45,  16,  21,  22,  19,   0,   0,   0,   0,
+      0,  55,  87,   0,   0,  10,  66,   0,   0,   0,   0,   0,   0,  88,  89,   0,
+      0,  90,  53,   0,   0,  91,   0,   0,  92,  93,   0,   0,   0,   0,   0,   0,
+      0,  94,   0,   0,   0,   0,   0,   0,   0,  95,  96,   0,   0,   0,  97,  98,
+     99, 100, 101,   0, 102,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0, 103,   0,   0, 104, 105,   0,   0,   0, 106, 107,   0, 108,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0, 109,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 110,  61, 111,   0,   0, 112,
+      0,   0,   0,   0,  76,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    113, 114,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 115,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,  10, 116, 116,  62,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0
 };
 
-static RE_UINT8 re_other_alphabetic_stage_4[] = {
+static RE_UINT8 re_other_alphabetic_table_3[] = {
       0,   0,   0,   0,  32,   0,   0,   0,   0,   0, 255, 191, 182,   0,   0,   0,
       0,   0, 255,   7,   0, 248, 255, 254,   0,   0,   1,   0,   0,   0, 192,  31,
     158,  33,   0,   0,   0,   0,   2,   0,   0,   0, 255, 255, 192, 255,   1,   0,
@@ -10596,5620 +18401,7541 @@ static RE_UINT8 re_other_alphabetic_stage_4[] = {
       0, 248, 127, 121,   0,   0, 192, 195, 157,  63,  30,   0, 252, 191,   0,  60,
       0,   0, 192, 255, 255,   1,   0,   0,  96,   0,   0,   0,   0,   2,   0,   0,
     255,  15, 255,   1,   0,   0, 128,  15,   0,   0, 224, 127, 254, 255,  31,   0,
-     31,   0,   0,   0,   0,   0, 224, 255,   7,   0,   0,   0, 254,  51,   0,   0,
-    128, 255,   3,   0, 240, 255, 127,   0, 128, 255,  31,   0, 255, 255, 255, 255,
-    255,   3,   0,   0,   0,   0, 240,  15,   4,   8,   0,   0, 248,   0,   0,   0,
-      3,   0,   0,   0,  47,   0,   0,   0,   0,   0,   0, 128, 192,   7,   0,   0,
-    128, 255,   7,   0,   0, 254, 127,   0,   8,  48,   0,   0,   0,   0,   0,  56,
-      0,   0, 157,  65,   0, 248,  32,   0, 248,   7,   0,   0,   0,   0,   0,  64,
-      0,   0, 192,   7, 110, 240,   0,   0, 240,   0,   0,   0,   0,   0,   0, 255,
-     63,   0,   0,   0,   0,   0, 255,   1,   0,   0, 248, 255,   0, 240, 159,  64,
-     59,   0,   0,   0,   0, 128,  63, 127,   0,   0,   0,  48,   0,   0, 255, 127,
-      1,   0,   0,   0,   0, 248,  63,   0,   0,   0,   0, 224, 255,   7,   0,   0,
-      0, 240, 255,   1,   0,   0, 254, 252,  16,   0,   0,   0, 254,   7,   0,   0,
+      0,   0,   0, 128,   1,   0,   0,   0,  31,   0,   0,   0,   0,   0, 224, 255,
+      7,   0,   0,   0, 254,  51,   0,   0, 128, 255,   3,   0, 240, 255, 127,   0,
+    128, 255,  31,   0, 255, 255, 255, 255, 255,   3,   0,   0,   0,   0, 240,  15,
+      4,   8,   0,   0, 248,   0,   0,   0,   3,   0,   0,   0,  47,   0,   0,   0,
+    192,   7,   0,   0, 128, 255,   7,   0,   0, 254, 127,   0,   8,  48,   0,   0,
+      0,   0,   0,  56,   0,   0, 157,  65,   0, 248,  32,   0, 248,   7,   0,   0,
+      0,   0,   0,  64,   0,   0, 192,   7, 110, 240,   0,   0, 240,   0,   0,   0,
+      0,  24,   0,   0,   0,   0,   0, 255,  63,   0,   0,   0,   0,   0, 255,   1,
+      0,   0, 248, 255,   0, 192,   0,   0,   0, 240, 159,  64,  59,   0,   0,   0,
+      0, 128,  63, 127,   0,   0,   0,  48,   0,   0, 255, 127,   0, 248,  63,   0,
+      0,   0,   0, 224, 255,   7,   0,   0,   0, 240, 255,   1,   0,   0, 191,  25,
+      5,   0,   0,   0,   0,   0, 254, 252,  16,   0,   0,   0, 254,   7,   0,   0,
       0,   0, 224, 123,   0,   0, 254,  15,   0, 252, 255,   0,   0, 128, 127, 127,
       0,   0, 252, 255, 255, 254, 127,   0,   0,   0, 126, 180, 139,   0,   0,   0,
       0, 124, 123,   0,   0,   0, 120,   0,   0, 128, 254, 255, 255, 128,   7,   0,
-    127, 255, 255, 249, 219,   7,   0,   0, 128,   0,   0,   0, 255,   3, 255, 255,
-};
-
-/* Other_Alphabetic: 1280 bytes. */
-
-RE_UINT32 re_get_other_alphabetic(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-
-    f = ch >> 13;
-    code = ch ^ (f << 13);
-    pos = (RE_UINT32)re_other_alphabetic_stage_1[f] << 5;
-    f = code >> 8;
-    code ^= f << 8;
-    pos = (RE_UINT32)re_other_alphabetic_stage_2[pos + f] << 3;
-    f = code >> 5;
-    code ^= f << 5;
-    pos = (RE_UINT32)re_other_alphabetic_stage_3[pos + f] << 5;
-    pos += code;
-    value = (re_other_alphabetic_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1;
-
-    return value;
-}
-
-/* Ideographic. */
-
-static RE_UINT8 re_ideographic_stage_1[] = {
-     0,  1,  2,  3,  4,  0,  0,  5,  0,  0,  0,  6,  7,  8,  0,  0,
-     3,  3,  3,  3,  3,  9, 10, 11,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0,  0,  0,
-};
-
-static RE_UINT8 re_ideographic_stage_2[] = {
-     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0,  0,  0,  1,  0,  2,  2,  2,  2,  2,  2,
-     2,  2,  2,  2,  2,  2,  3,  2,  2,  2,  2,  2,  2,  2,  2,  2,
-     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
-     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  4,
-     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  5,  6,  0,  0,
-     0,  0,  0,  0,  0,  0,  0,  0,  2,  2,  2,  2,  2,  2,  2,  2,
-     2,  2,  2,  7,  2,  8,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0,  0,  0,  9, 10,  0,  0,  0,  0,  0,  0,
-     2,  2,  2, 11,  2,  2,  2,  2,  2,  2,  2, 12, 13,  2,  2,  2,
-     2,  2,  2,  2,  2,  2,  2, 14,  2,  2,  2,  2,  2,  2,  2,  2,
-     2,  2,  2,  2,  2, 15,  0,  0,  0,  0,  0,  0,  2, 16,  0,  0,
-};
-
-static RE_UINT8 re_ideographic_stage_3[] = {
-     0,  0,  0,  0,  0,  0,  0,  0,  1,  0,  0,  0,  0,  0,  0,  0,
-     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  3,  0,
-     2,  2,  2,  2,  2,  2,  2,  4,  0,  0,  0,  0,  2,  2,  2,  2,
-     2,  5,  2,  6,  0,  0,  0,  0,  2,  2,  2,  2,  2,  2,  2,  7,
-     2,  2,  2,  8,  0,  0,  0,  0,  0,  0,  0,  0,  0,  9,  2,  2,
-     2,  2,  2, 10,  0,  0,  0,  0,  2,  2,  2, 11,  2,  2,  2,  2,
-     2,  2,  2,  2, 12,  2,  2,  2, 13,  2,  2,  2,  2,  2,  2,  2,
-     2,  2, 14,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2, 15,
-    16,  0,  0,  0,  0,  0,  0,  0,
-};
-
-static RE_UINT8 re_ideographic_stage_4[] = {
-      0,   0,   0,   0,   0,   0,   0,   0, 192,   0,   0,   0, 254,   3,   0,   7,
-    255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,  63,   0,
-    255, 255, 255, 255, 255, 255,   0,   0, 255, 255, 255, 255, 255,  63, 255, 255,
-    255, 255, 255,   3,   0,   0,   0,   0, 255, 255, 255, 255, 255, 255, 255,   0,
-    255, 255, 255, 255, 255, 255,   7,   0,   0,   0,   0,   0,   0,   0, 255, 255,
-    255, 255, 255, 255, 255, 255, 255,  15, 255, 255, 127,   0,   0,   0,   0,   0,
-    255, 255, 255, 255, 255, 255,  31,   0, 255, 255, 255,  63, 255, 255, 255, 255,
-    255, 255, 255, 255,   3,   0, 255, 255, 255, 255, 255, 255,   1,   0,   0,   0,
-    255, 255, 255,  63,   0,   0,   0,   0,
-};
-
-/* Ideographic: 600 bytes. */
-
-RE_UINT32 re_get_ideographic(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-
-    f = ch >> 13;
-    code = ch ^ (f << 13);
-    pos = (RE_UINT32)re_ideographic_stage_1[f] << 4;
-    f = code >> 9;
-    code ^= f << 9;
-    pos = (RE_UINT32)re_ideographic_stage_2[pos + f] << 3;
-    f = code >> 6;
-    code ^= f << 6;
-    pos = (RE_UINT32)re_ideographic_stage_3[pos + f] << 6;
-    pos += code;
-    value = (re_ideographic_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1;
-
-    return value;
-}
-
-/* Diacritic. */
-
-static RE_UINT8 re_diacritic_stage_1[] = {
-    0, 1, 2, 2, 2, 3, 2, 4, 5, 2, 2, 6, 2, 2, 7, 8,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2,
-};
-
-static RE_UINT8 re_diacritic_stage_2[] = {
-     0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15,
-    16,  1,  1, 17,  1,  1,  1, 18,  1, 19, 20, 21, 22, 23,  1, 24,
-     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1, 25,  1, 26,  1,
-    27,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
-     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
-     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
-     1,  1,  1,  1,  1,  1, 28, 29, 30, 31, 32, 33,  1,  1,  1,  1,
-     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
-     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
-     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1, 34,  1,  1, 35, 36,
-     1,  1, 37,  1,  1,  1,  1,  1,  1,  1, 38,  1,  1, 39,  1, 40,
-    41, 42, 43, 44, 45, 46, 47, 48, 49, 37, 50,  1, 51, 52,  1,  1,
-     1,  1,  1,  1,  1,  1,  1,  1,  1,  1, 53, 54,  1,  1,  1, 55,
-     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
-     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
-     1, 56,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
-     1, 54, 57,  1,  1,  1,  1,  1, 58, 59,  1,  1,  1,  1,  1,  1,
-     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
-};
-
-static RE_UINT8 re_diacritic_stage_3[] = {
-     0,  0,  1,  2,  0,  3,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  4,  5,  5,  5,  5,  6,  7,  8,  0,  0,  0,
-     0,  0,  0,  0,  9,  0,  0,  0,  0,  0, 10,  0, 11, 12, 13,  0,
-     0,  0, 14,  0,  0,  0, 15, 16,  0,  4, 17,  0,  0, 18,  0, 19,
-    20,  0,  0,  0,  0,  0,  0, 21,  0, 22, 23, 24,  0, 22, 25,  0,
-     0, 22, 25,  0,  0, 22, 25, 26,  0, 22, 25,  0,  0,  0, 25,  0,
-     0,  0, 25,  0,  0, 22, 25,  0,  0, 27, 25,  0,  0,  0, 28,  0,
-     0,  0, 29,  0,  0, 30, 31,  0, 20, 32,  0,  0, 33,  0, 34,  0,
-     0, 35,  0, 36, 37,  0,  0,  0,  0,  0, 26,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0, 38,  0,  0, 39,  0,  0,  0,  0,  0,  0,
-     0,  0,  0, 40,  0, 41,  0,  0,  0, 42, 43, 44,  0, 45,  0,  0,
-     0, 46,  0, 47,  0,  0,  4, 48,  0, 49,  5, 17,  0,  0, 50, 51,
-     0,  0,  0,  0,  0, 52, 53, 54,  0,  0,  0,  0,  0,  0,  0, 55,
-     0, 56,  0,  0,  0,  0,  0,  0,  0, 57,  0,  0, 58,  0,  0, 22,
-     0,  0,  0, 59, 60,  0,  0, 61,  5, 62,  0,  0, 63,  0,  0, 20,
-     0,  0,  0,  0,  0,  0, 43, 64,  0, 65, 66,  0,  0, 66,  2, 67,
-     0,  0,  0, 68,  0, 15, 69, 70,  0,  0, 71,  0,  0,  0,  0, 72,
-     1,  0,  0,  0,  0,  0,  0,  0,  0, 73,  0,  0,  0,  0,  0,  0,
-     0,  1,  2, 74, 75,  0,  0, 76,  0,  0,  0,  0,  0,  0,  0,  2,
-     0,  0,  0,  0,  0,  0,  0, 77,  0, 78,  0,  0,  0,  0,  0,  0,
-     0,  0, 18,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 79,  0,  0,
-     0, 80,  0, 66,  0,  0, 81,  0,  0, 82,  0,  0,  0,  0,  0, 83,
-     0, 22, 25, 84,  0,  0,  0,  0,  0,  0, 85,  0,  0,  0, 86,  0,
-     0,  0,  0,  0,  0, 15,  2,  0,  0, 15,  0,  0,  0, 46,  0,  0,
-     0, 87,  0,  0,  0,  0,  0,  0,  0, 79,  0,  0,  0,  0,  0,  0,
-     0, 42, 88,  0, 10,  0,  0,  0,  0, 15,  0,  0,  0,  0,  0,  0,
-     0,  0, 89,  0, 90,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 91,
-     0, 92,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 93,  0,  0,  0,
-     0,  0,  0, 94, 95, 96,  0,  0,  0,  0,  0,  0,  0,  0,  0, 97,
-     0,  0,  0,  0,  0,  0, 92,  0,  0,  0, 98,  0,  0,  0,  0,  0,
-};
-
-static RE_UINT8 re_diacritic_stage_4[] = {
-      0,   0,   0,   0,   0,   0,   0,  64,   1,   0,   0,   0,   0, 129, 144,   1,
-      0,   0, 255, 255, 255, 255, 255, 255, 255, 127, 255, 224,   7,   0,  48,   4,
-     48,   0,   0,   0, 248,   0,   0,   0,   0,   0,   0,   2,   0,   0, 254, 255,
-    251, 255, 255, 191,  22,   0,   0,   0,   0, 248, 135,   1,   0,   0,   0, 128,
-     97,  28,   0,   0, 255,   7,   0,   0, 192, 255,   1,   0,   0, 248,  63,   0,
-      0,   0,   0,   3, 248, 255, 255, 127,   0,   0,   0,  16,   0,  32,  30,   0,
-      0,   0,   2,   0,   0,  32,   0,   0,   0,   0,   0, 224,   0,   0,   0,  24,
-      0,   4,   0,   0, 128,  95,   0,   0,   0,   0,   0,   4,   0,  31,   0,   0,
-      0,   0, 160, 194, 220,   0,   0,   0,  64,   0,   0,   0,   0,   0, 128,   6,
-     24,  62,   0,   0, 128, 191,   0,  12,   0, 254,  15,  32,   0,   0,   0,  14,
-      0,   0, 224, 159,   0,   0, 255,  63,   0,   0,  16,   0,  16,   0,   0,   0,
-      0, 248,  15,   0,   0,  12,   0,   0,   0,   0, 192,   0,   0,   0,   0,  63,
-    255,  33, 144,   3,   0, 240, 255, 255, 240, 255,   0,   0,   0,   0, 224, 227,
-      0,   0,   0, 160,   3, 224,   0, 224,   0, 224,   0,  96,   0, 128,   3,   0,
-      0, 128,   0,   0,   0, 252,   0,   0,   0,   0,   0,  30,   0, 128,   0, 176,
-      0,   0,   0,  48,   0,   0,   3,   0,   3,   0,   0,   0,   0,   7,   0,   0,
-    255, 255,   3,   0,   0, 120,   0,   0,   0,   0,   8,   0,  32,   0,   0,   0,
-      0,   0,   0,  56,   7,   0,   0,   0,   0,   0,  64,   0,   0,   0,   0, 248,
-      0,  48,   0,   0, 255, 255,   0,   0,   0,   0,   1,   0,   0,   0,   0, 192,
-      8,   0,   0,   0,  96,   0,   0,   0, 252,   0,   0,   0,   0,   0,   0,   6,
-      0,   0,  24,   0,   1,  28,   0,   0,   0,   0,  96,   0,   0,   6,   0,   0,
-    192,  31,  31,   0,  68,   0,   0,   0,  12,   0,   0,   0,   0,   8,   0,   0,
-    128,   0,   0,   0,  52,   0,   0,   0,   0,   0, 128,   0,   0,   0,  31,   0,
-      0,   0, 127,   0,   0, 128, 255, 255, 128, 227,   7, 248, 231,  15,   0,   0,
-      0,  60,   0,   0,   0, 240,   0,   0, 112,   7,   0,   0,
-};
-
-/* Diacritic: 1300 bytes. */
-
-RE_UINT32 re_get_diacritic(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-
-    f = ch >> 13;
-    code = ch ^ (f << 13);
-    pos = (RE_UINT32)re_diacritic_stage_1[f] << 5;
-    f = code >> 8;
-    code ^= f << 8;
-    pos = (RE_UINT32)re_diacritic_stage_2[pos + f] << 3;
-    f = code >> 5;
-    code ^= f << 5;
-    pos = (RE_UINT32)re_diacritic_stage_3[pos + f] << 5;
-    pos += code;
-    value = (re_diacritic_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1;
-
-    return value;
-}
-
-/* Extender. */
-
-static RE_UINT8 re_extender_stage_1[] = {
-    0, 1, 2, 2, 2, 3, 2, 4, 5, 2, 2, 6, 2, 2, 2, 7,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2,
+      0,   0,   3,   0, 127, 255, 255, 249, 219,   7,   0,   0, 128,   0,   0,   0,
+    255,   3, 255, 255
 };
 
-static RE_UINT8 re_extender_stage_2[] = {
-     0,  1,  2,  3,  2,  2,  2,  4,  2,  2,  2,  2,  5,  6,  7,  2,
-     2,  2,  2,  2,  2,  2,  2,  2,  8,  2,  2,  2,  2,  2,  2,  2,
-     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
-     9,  2,  2, 10, 11, 12,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
-     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2, 13,
-     2,  2,  2,  2,  2,  2,  2,  2,  2, 14, 15,  2,  2, 16,  2,  2,
-     2,  2,  2,  2,  2, 17,  2, 18,  2,  2,  2,  2,  2,  2,  2,  2,
-    19,  2,  2,  2, 20,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
-};
+RE_UINT32 re_get_other_alphabetic(RE_UINT32 codepoint) {
+    RE_UINT32 field_2;
+    RE_UINT32 field_1;
+    RE_UINT32 field_0;
+    RE_UINT32 offset;
+    RE_UINT32 v;
 
-static RE_UINT8 re_extender_stage_3[] = {
-     0,  0,  1,  0,  0,  0,  0,  0,  0,  0,  0,  2,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0,  0,  0,  0,  3,  0,  0,  0,  0,  0,  4,
-     0,  5,  0,  5,  0,  0,  0,  0,  6,  7,  0,  0,  0,  0,  0,  0,
-     0,  0,  8,  0,  0,  0,  0,  0,  9, 10,  0,  0,  0,  0,  0,  0,
-    11,  0, 12, 13,  0,  0,  0,  0, 14,  0,  0,  0,  0,  0,  0,  0,
-    15,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 16,
-     0, 17,  0, 18,  0,  0,  0,  0,  0,  0,  0,  0,  0, 17,  0,  0,
-     0,  0,  0,  0,  0, 19,  0,  0,  0,  0,  0,  0,  0,  0,  0, 20,
-     0,  0, 21,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 22,  0,  0,
-     0,  0,  0,  0,  0,  0,  0, 23,  0,  0,  0,  0, 24,  0,  0,  0,
-     0,  0,  0,  0,  0, 25,  0,  0,
-};
+    field_2 = codepoint >> 10;
+    field_1 = (codepoint >> 5) & 0x1F;
+    field_0 = (codepoint >> 3) & 0x3;
+    offset = codepoint & 0x7;
 
-static RE_UINT8 re_extender_stage_4[] = {
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 128,   0,
-      0,   0,   3,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   4,  64,   0,   0,   0,   0,   0,   0,   0,
-      0,   4,   0,   0,   0,   0,   0,   0,   8,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0, 128,   0,   0,   0,   0,   0,   0,   0,   0,   0,  64,   0,
-      0,   0,   0,   0,   0,   0,   0,   8,  32,   0,   0,   0,   0,   0,  62,   0,
-      0,   0,   0,  96,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 112,
-      0,   0,  32,   0,   0,   0,   0,   0,   0,  16,   0,   0,   0,   0,   0,   0,
-      0, 128,   0,   0,  64,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,
-      0,   0,   0,  32,   0,   0,  24,   0,   0,   0,   0,  32,   0,   0,   0,   0,
-    192,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,
-     12,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  11,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,  48, 112,   0,   0,   0,   0,   0,   0,   0,
-};
+    v = re_other_alphabetic_table_1[field_2];
+    v = re_other_alphabetic_table_2[(v << 5) | field_1];
+    v = re_other_alphabetic_table_3[(v << 2) | field_0];
 
-/* Extender: 640 bytes. */
-
-RE_UINT32 re_get_extender(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-
-    f = ch >> 13;
-    code = ch ^ (f << 13);
-    pos = (RE_UINT32)re_extender_stage_1[f] << 4;
-    f = code >> 9;
-    code ^= f << 9;
-    pos = (RE_UINT32)re_extender_stage_2[pos + f] << 3;
-    f = code >> 6;
-    code ^= f << 6;
-    pos = (RE_UINT32)re_extender_stage_3[pos + f] << 6;
-    pos += code;
-    value = (re_extender_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1;
-
-    return value;
+    return (v >> offset) & 0x1;
 }
 
-/* Other_Lowercase. */
-
-static RE_UINT8 re_other_lowercase_stage_1[] = {
-    0, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+/* Other_Default_Ignorable_Code_Point. */
+static RE_UINT8 re_other_default_ignorable_code_point_table_1[] = {
+    0, 1, 1, 1, 2, 3, 1, 1, 4, 1, 1, 1, 5, 1, 1, 1,
     1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
     1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 6,
     1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1,
-};
-
-static RE_UINT8 re_other_lowercase_stage_2[] = {
-    0, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 2,
-    4, 2, 5, 2, 2, 2, 6, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 7, 2, 8, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-};
-
-static RE_UINT8 re_other_lowercase_stage_3[] = {
-     0,  0,  1,  0,  0,  0,  0,  0,  0,  0,  2,  3,  0,  4,  0,  0,
-     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  5,  6,  7,  0,
-     0,  8,  9,  0,  0, 10,  0,  0,  0,  0,  0, 11,  0,  0,  0,  0,
-     0, 12,  0,  0,  0,  0,  0,  0,  0,  0, 13,  0,  0, 14,  0, 15,
-     0,  0,  0,  0,  0, 16,  0,  0,
-};
-
-static RE_UINT8 re_other_lowercase_stage_4[] = {
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   4,   0,   4,
-      0,   0,   0,   0,   0,   0, 255,   1,   3,   0,   0,   0,  31,   0,   0,   0,
-     32,   0,   0,   0,   0,   0,   0,   4,   0,   0,   0,   0,   0, 240, 255, 255,
-    255, 255, 255, 255, 255,   7,   0,   1,   0,   0,   0, 248, 255, 255, 255, 255,
-      0,   0,   0,   0,   0,   0,   2, 128,   0,   0, 255,  31,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0, 255, 255,   0,   0, 255, 255, 255,   3,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,  48,   0,   0,   0,  48,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   3,
-      0,   0,   0, 240,   0,   0,   0,   0,
-};
-
-/* Other_Lowercase: 372 bytes. */
-
-RE_UINT32 re_get_other_lowercase(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-
-    f = ch >> 14;
-    code = ch ^ (f << 14);
-    pos = (RE_UINT32)re_other_lowercase_stage_1[f] << 5;
-    f = code >> 9;
-    code ^= f << 9;
-    pos = (RE_UINT32)re_other_lowercase_stage_2[pos + f] << 3;
-    f = code >> 6;
-    code ^= f << 6;
-    pos = (RE_UINT32)re_other_lowercase_stage_3[pos + f] << 6;
-    pos += code;
-    value = (re_other_lowercase_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1;
-
-    return value;
-}
-
-/* Other_Uppercase. */
-
-static RE_UINT8 re_other_uppercase_stage_1[] = {
-    0, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
     1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1,
-};
-
-static RE_UINT8 re_other_uppercase_stage_2[] = {
-    0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0,
-};
-
-static RE_UINT8 re_other_uppercase_stage_3[] = {
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 1, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0,
-    0, 0, 3, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    7, 8, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
 };
 
-static RE_UINT8 re_other_uppercase_stage_4[] = {
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 255, 255,   0,   0,
-      0,   0,   0,   0,   0,   0, 192, 255, 255, 255,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0, 255, 255, 255,   3, 255, 255, 255,   3, 255, 255,
-    255,   3,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+static RE_UINT8 re_other_default_ignorable_code_point_table_2[] = {
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  2,  3,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  4,  0,  0,
+     0,  0,  0,  5,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  6,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  3,  0,  7,
+     8,  0,  0,  0,  9,  9,  9,  9,  0,  0,  0,  0,  0,  0,  0, 10,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9
 };
 
-/* Other_Uppercase: 210 bytes. */
-
-RE_UINT32 re_get_other_uppercase(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-
-    f = ch >> 15;
-    code = ch ^ (f << 15);
-    pos = (RE_UINT32)re_other_uppercase_stage_1[f] << 4;
-    f = code >> 11;
-    code ^= f << 11;
-    pos = (RE_UINT32)re_other_uppercase_stage_2[pos + f] << 4;
-    f = code >> 7;
-    code ^= f << 7;
-    pos = (RE_UINT32)re_other_uppercase_stage_3[pos + f] << 7;
-    pos += code;
-    value = (re_other_uppercase_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1;
-
-    return value;
-}
-
-/* Noncharacter_Code_Point. */
-
-static RE_UINT8 re_noncharacter_code_point_stage_1[] = {
-    0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1,
+static RE_UINT8 re_other_default_ignorable_code_point_table_3[] = {
+      0,   0,   0,   0,   0, 128,   0,   0,   0,   0,   0, 128,   1,   0,   0,   0,
+      0,   0,  48,   0,  32,   0,   0,   0,  16,   0,   0,   0,   0,   0, 255,   1,
+    253, 255, 255, 255, 255, 255, 255, 255,   0,   0, 255, 255
 };
 
-static RE_UINT8 re_noncharacter_code_point_stage_2[] = {
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2,
-};
+RE_UINT32 re_get_other_default_ignorable_code_point(RE_UINT32 codepoint) {
+    RE_UINT32 field_2;
+    RE_UINT32 field_1;
+    RE_UINT32 field_0;
+    RE_UINT32 offset;
+    RE_UINT32 v;
 
-static RE_UINT8 re_noncharacter_code_point_stage_3[] = {
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 2,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2,
-};
+    field_2 = codepoint >> 10;
+    field_1 = (codepoint >> 5) & 0x1F;
+    field_0 = (codepoint >> 3) & 0x3;
+    offset = codepoint & 0x7;
 
-static RE_UINT8 re_noncharacter_code_point_stage_4[] = {
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 255, 255, 255, 255,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 192,
-};
+    v = re_other_default_ignorable_code_point_table_1[field_2];
+    v = re_other_default_ignorable_code_point_table_2[(v << 5) | field_1];
+    v = re_other_default_ignorable_code_point_table_3[(v << 2) | field_0];
 
-/* Noncharacter_Code_Point: 177 bytes. */
-
-RE_UINT32 re_get_noncharacter_code_point(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-
-    f = ch >> 16;
-    code = ch ^ (f << 16);
-    pos = (RE_UINT32)re_noncharacter_code_point_stage_1[f] << 5;
-    f = code >> 11;
-    code ^= f << 11;
-    pos = (RE_UINT32)re_noncharacter_code_point_stage_2[pos + f] << 4;
-    f = code >> 7;
-    code ^= f << 7;
-    pos = (RE_UINT32)re_noncharacter_code_point_stage_3[pos + f] << 7;
-    pos += code;
-    value = (re_noncharacter_code_point_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1;
-
-    return value;
+    return (v >> offset) & 0x1;
 }
 
 /* Other_Grapheme_Extend. */
-
-static RE_UINT8 re_other_grapheme_extend_stage_1[] = {
-    0, 1, 1, 2, 3, 1, 1, 4, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 5, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1,
-};
-
-static RE_UINT8 re_other_grapheme_extend_stage_2[] = {
+static RE_UINT8 re_other_grapheme_extend_table_1[] = {
      0,  0,  1,  2,  0,  0,  3,  0,  4,  0,  0,  0,  5,  0,  0,  0,
      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  6,
-     0,  0,  0,  0,  7,  8,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  7,  8,  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0, 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    11,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0
 };
 
-static RE_UINT8 re_other_grapheme_extend_stage_3[] = {
-     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  0,  0,  1,  1,
-     0,  2,  1,  3,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  4,  0,
-     5,  0,  0,  0,  0,  0,  0,  0,  6,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0,  0,  7,  0,  0,  0,  0,  0,  0,  1,  0,
-     0,  8,  0,  9,  0,  0,  0,  0,  0,  0, 10,  0,  0,  0,  0,  0,
-    11,  0,  0,  0,  0,  0,  0,  0,
+static RE_UINT8 re_other_grapheme_extend_table_2[] = {
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  2,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  2,  0,  0,  1,  2,  0,
+     0,  0,  0,  0,  0,  0,  3,  0,  0,  1,  2,  0,  0,  0,  4,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  5,  0,  0,  0,  0,  0,  0,
+     6,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  7,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  8,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  2,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  9,  0,  0,  0,  0,  0,  0,  0, 10,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0, 11,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 12,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0, 13, 13, 13,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0
 };
 
-static RE_UINT8 re_other_grapheme_extend_stage_4[] = {
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,  64,   0,   0, 128,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   4,   0,  96,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0, 128,   0, 128,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,  32,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,  16,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0, 192,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0, 192,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   1,  32,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0, 128,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  32, 192,   7,   0,
-      0,   0,   0,   0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
+static RE_UINT8 re_other_grapheme_extend_table_3[] = {
+      0,   0,   0,   0,   0,   0,   0,  64,   0,   0, 128,   0,   4,   0,  96,   0,
+      0, 128,   0, 128,   0,   0,  32,   0,   0,  16,   0,   0,   0, 192,   0,   0,
+      0,   0,   0, 192,   0,   0,   1,  32,   0, 128,   0,   0,   0,   0,   1,   0,
+     32, 192,   7,   0, 255, 255, 255, 255
 };
 
-/* Other_Grapheme_Extend: 444 bytes. */
-
-RE_UINT32 re_get_other_grapheme_extend(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-
-    f = ch >> 14;
-    code = ch ^ (f << 14);
-    pos = (RE_UINT32)re_other_grapheme_extend_stage_1[f] << 4;
-    f = code >> 10;
-    code ^= f << 10;
-    pos = (RE_UINT32)re_other_grapheme_extend_stage_2[pos + f] << 3;
-    f = code >> 7;
-    code ^= f << 7;
-    pos = (RE_UINT32)re_other_grapheme_extend_stage_3[pos + f] << 7;
-    pos += code;
-    value = (re_other_grapheme_extend_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1;
-
-    return value;
+RE_UINT32 re_get_other_grapheme_extend(RE_UINT32 codepoint) {
+    RE_UINT32 field_2;
+    RE_UINT32 field_1;
+    RE_UINT32 field_0;
+    RE_UINT32 offset;
+    RE_UINT32 v;
+
+    field_2 = codepoint >> 10;
+    field_1 = (codepoint >> 5) & 0x1F;
+    field_0 = (codepoint >> 3) & 0x3;
+    offset = codepoint & 0x7;
+
+    v = re_other_grapheme_extend_table_1[field_2];
+    v = re_other_grapheme_extend_table_2[(v << 5) | field_1];
+    v = re_other_grapheme_extend_table_3[(v << 2) | field_0];
+
+    return (v >> offset) & 0x1;
 }
 
-/* IDS_Binary_Operator. */
+/* Other_ID_Continue. */
+RE_UINT32 re_get_other_id_continue(RE_UINT32 codepoint) {
+    if (codepoint == 0xB7)
+        return 1;
+    if (codepoint == 0x0387)
+        return 1;
+    if (0x1369 <= codepoint && codepoint <= 0x1371)
+        return 1;
+    if (codepoint == 0x19DA)
+        return 1;
+
+    return 0;
+}
 
-static RE_UINT8 re_ids_binary_operator_stage_1[] = {
-    0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+/* Other_ID_Start. */
+RE_UINT32 re_get_other_id_start(RE_UINT32 codepoint) {
+    if (0x1885 <= codepoint && codepoint <= 0x1886)
+        return 1;
+    if (codepoint == 0x2118)
+        return 1;
+    if (codepoint == 0x212E)
+        return 1;
+    if (0x309B <= codepoint && codepoint <= 0x309C)
+        return 1;
+
+    return 0;
+}
+
+/* Other_Lowercase. */
+static RE_UINT8 re_other_lowercase_table_1[] = {
+    0, 1, 1, 1, 1, 1, 1, 2, 3, 4, 1, 5, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 6, 7, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
     1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
 };
 
-static RE_UINT8 re_ids_binary_operator_stage_2[] = {
-    0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+static RE_UINT8 re_other_lowercase_table_2[] = {
+     0,  0,  0,  0,  0,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  2,  3,  4,  0,  0,  5,  6,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  7,  8,  9, 10,  8,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0, 11, 12,  0,  0,  0,  0,  0,  0, 13,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0, 13, 14,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0, 15,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0, 15,  0,  0,  0,  0,  0,  0, 16,  0,  0,  0, 17,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 18,  0,  0,  0,  0,  0
 };
 
-static RE_UINT8 re_ids_binary_operator_stage_3[] = {
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
+static RE_UINT8 re_other_lowercase_table_3[] = {
+      0,   0,   0,   0,   0,   4,   0,   4,   0,   0, 255,   1,   3,   0,   0,   0,
+     31,   0,   0,   0,  32,   0,   0,   0,   0,   0,   0,   4,   0, 240, 255, 255,
+    255, 255, 255, 255, 255,   7,   0,   1,   0,   0,   0, 248,   0,   0,   2, 128,
+      0,   0, 255,  31,   0,   0, 255, 255, 255,   3,   0,   0,   0,   0,   0,  48,
+      0,   0,   1,   0,   0,   0,   0,   3,   0,   0,   0, 240
 };
 
-static RE_UINT8 re_ids_binary_operator_stage_4[] = {
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 243,  15,
-};
+RE_UINT32 re_get_other_lowercase(RE_UINT32 codepoint) {
+    RE_UINT32 field_2;
+    RE_UINT32 field_1;
+    RE_UINT32 field_0;
+    RE_UINT32 offset;
+    RE_UINT32 v;
 
-/* IDS_Binary_Operator: 130 bytes. */
-
-RE_UINT32 re_get_ids_binary_operator(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-
-    f = ch >> 15;
-    code = ch ^ (f << 15);
-    pos = (RE_UINT32)re_ids_binary_operator_stage_1[f] << 4;
-    f = code >> 11;
-    code ^= f << 11;
-    pos = (RE_UINT32)re_ids_binary_operator_stage_2[pos + f] << 4;
-    f = code >> 7;
-    code ^= f << 7;
-    pos = (RE_UINT32)re_ids_binary_operator_stage_3[pos + f] << 7;
-    pos += code;
-    value = (re_ids_binary_operator_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1;
-
-    return value;
-}
+    field_2 = codepoint >> 10;
+    field_1 = (codepoint >> 5) & 0x1F;
+    field_0 = (codepoint >> 3) & 0x3;
+    offset = codepoint & 0x7;
 
-/* IDS_Trinary_Operator. */
+    v = re_other_lowercase_table_1[field_2];
+    v = re_other_lowercase_table_2[(v << 5) | field_1];
+    v = re_other_lowercase_table_3[(v << 2) | field_0];
 
-static RE_UINT8 re_ids_trinary_operator_stage_1[] = {
-    0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    return (v >> offset) & 0x1;
+}
+
+/* Other_Math. */
+static RE_UINT8 re_other_math_table_1[] = {
+    0, 1, 1, 1, 1, 1, 1, 1, 2, 3, 4, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 5,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 6, 1, 1, 1, 1, 1, 7, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
     1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1,
-};
-
-static RE_UINT8 re_ids_trinary_operator_stage_2[] = {
-    0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-};
-
-static RE_UINT8 re_ids_trinary_operator_stage_3[] = {
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
 };
 
-static RE_UINT8 re_ids_trinary_operator_stage_4[] = {
+static RE_UINT8 re_other_math_table_2[] = {
+     0,  0,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  2,  3,
      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 12,  0,
-};
-
-/* IDS_Trinary_Operator: 130 bytes. */
-
-RE_UINT32 re_get_ids_trinary_operator(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-
-    f = ch >> 15;
-    code = ch ^ (f << 15);
-    pos = (RE_UINT32)re_ids_trinary_operator_stage_1[f] << 4;
-    f = code >> 11;
-    code ^= f << 11;
-    pos = (RE_UINT32)re_ids_trinary_operator_stage_2[pos + f] << 4;
-    f = code >> 7;
-    code ^= f << 7;
-    pos = (RE_UINT32)re_ids_trinary_operator_stage_3[pos + f] << 7;
-    pos += code;
-    value = (re_ids_trinary_operator_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1;
-
-    return value;
-}
-
-/* Radical. */
-
-static RE_UINT8 re_radical_stage_1[] = {
-    0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     4,  5,  6,  7,  8,  0,  9, 10, 11, 12, 13,  0, 14, 15, 16, 17,
+     0,  0,  0,  0,  0,  0,  0,  0, 18,  0,  0,  0,  0, 19, 20, 21,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 22, 23, 24,
+    25,  0, 26, 27,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 25, 28,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 29,  0, 30, 31,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0, 32,  0,  0,  0,  0,  0, 33,  0,  0,  0,  0,  0,  0,
+    34, 34, 35, 34, 36, 37, 38, 34, 39, 40, 41, 34, 34, 34, 34, 34,
+    34, 34, 34, 34, 34, 42, 43, 44, 35, 35, 45, 45, 46, 46, 47, 34,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    38, 48, 49, 50, 51, 52,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0
+};
+
+static RE_UINT8 re_other_math_table_3[] = {
+      0,   0,   0,   0,   0,   0,   0,  64,   0,   0,  39,   0,   0,   0,  51,   0,
+      0,   0,  64,   0,   0,   0,  28,   0,   1,   0,   0,   0,  30,   0,   0,  96,
+      0,  96,   0,   0,   0,   0, 255,  31,  98, 248,   0,   0, 132, 252,  47,  62,
+     16, 179, 251, 241, 224,   3,   0,   0,   0,   0, 224, 243, 182,  62, 195, 240,
+    255,  63, 235,  47,  48,   0,   0,   0,   0,  15,   0,   0,   0,   0, 176,   0,
+      0,   0,   1,   0,   4,   0,   0,   0,   3, 192, 127, 240, 193, 140,  15,   0,
+    148,  31,   0,   0,  96,   0,   0,   0,   5,   0,   0,   0,  15,  96,   0,   0,
+    192, 255,   0,   0, 248, 255, 255,   1,   0,   0,   0,  15,   0,   0,   0,  48,
+     10,   1,   0,   0,   0,   0,   0,  80, 255, 255, 255, 255, 255, 255, 223, 255,
+    255, 255, 255, 223, 100, 222, 255, 235, 239, 255, 255, 255, 191, 231, 223, 223,
+    255, 255, 255, 123,  95, 252, 253, 255,  63, 255, 255, 255, 253, 255, 255, 247,
+    255, 255, 255, 247, 255, 127, 255, 255, 255, 253, 255, 255, 247, 207, 255, 255,
+    150, 254, 247,  10, 132, 234, 150, 170, 150, 247, 247,  94, 255, 251, 255,  15,
+    238, 251, 255,  15
 };
 
-static RE_UINT8 re_radical_stage_2[] = {
-    0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-};
+RE_UINT32 re_get_other_math(RE_UINT32 codepoint) {
+    RE_UINT32 field_2;
+    RE_UINT32 field_1;
+    RE_UINT32 field_0;
+    RE_UINT32 offset;
+    RE_UINT32 v;
 
-static RE_UINT8 re_radical_stage_3[] = {
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3,
-};
+    field_2 = codepoint >> 10;
+    field_1 = (codepoint >> 5) & 0x1F;
+    field_0 = (codepoint >> 3) & 0x3;
+    offset = codepoint & 0x7;
 
-static RE_UINT8 re_radical_stage_4[] = {
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-    255, 255, 255, 251, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,  15,   0,
-    255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
-    255, 255, 255, 255, 255, 255, 255, 255, 255, 255,  63,   0,   0,   0,   0,   0,
-};
+    v = re_other_math_table_1[field_2];
+    v = re_other_math_table_2[(v << 5) | field_1];
+    v = re_other_math_table_3[(v << 2) | field_0];
 
-/* Radical: 162 bytes. */
-
-RE_UINT32 re_get_radical(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-
-    f = ch >> 15;
-    code = ch ^ (f << 15);
-    pos = (RE_UINT32)re_radical_stage_1[f] << 4;
-    f = code >> 11;
-    code ^= f << 11;
-    pos = (RE_UINT32)re_radical_stage_2[pos + f] << 4;
-    f = code >> 7;
-    code ^= f << 7;
-    pos = (RE_UINT32)re_radical_stage_3[pos + f] << 7;
-    pos += code;
-    value = (re_radical_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1;
-
-    return value;
+    return (v >> offset) & 0x1;
 }
 
-/* Unified_Ideograph. */
-
-static RE_UINT8 re_unified_ideograph_stage_1[] = {
-    0, 1, 2, 2, 3, 4, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2,
-};
+/* Other_Uppercase. */
+RE_UINT32 re_get_other_uppercase(RE_UINT32 codepoint) {
+    if (0x2160 <= codepoint && codepoint <= 0x216F)
+        return 1;
+    if (0x24B6 <= codepoint && codepoint <= 0x24CF)
+        return 1;
+    if (0x01F130 <= codepoint && codepoint <= 0x01F149)
+        return 1;
+    if (0x01F150 <= codepoint && codepoint <= 0x01F169)
+        return 1;
+    if (0x01F170 <= codepoint && codepoint <= 0x01F189)
+        return 1;
+
+    return 0;
+}
 
-static RE_UINT8 re_unified_ideograph_stage_2[] = {
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1,
-    1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+/* Pattern_Syntax. */
+static RE_UINT8 re_pattern_syntax_table_1[] = {
+    0, 1, 1, 1, 1, 1, 1, 1, 2, 3, 4, 5, 6, 1, 1, 1,
     1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
     1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 5, 1, 1, 1, 6, 7, 1,
-    1, 1, 1, 8, 1, 1, 1, 1, 1, 1, 9, 0, 0, 0, 0, 0,
-};
-
-static RE_UINT8 re_unified_ideograph_stage_3[] = {
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 7,
     1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 2, 0, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3,
-    0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 5, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 6, 1, 1, 1,
-    7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 8, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 9,
-};
-
-static RE_UINT8 re_unified_ideograph_stage_4[] = {
-      0,   0,   0,   0,   0,   0,   0,   0, 255, 255, 255, 255, 255, 255, 255, 255,
-    255, 255, 255, 255, 255, 255,  63,   0, 255, 255, 255, 255, 255, 255,   0,   0,
-      0, 192,  26, 128, 154,   3,   0,   0, 255, 255, 127,   0,   0,   0,   0,   0,
-    255, 255, 255, 255, 255, 255,  31,   0, 255, 255, 255,  63, 255, 255, 255, 255,
-    255, 255, 255, 255,   3,   0, 255, 255, 255, 255, 255, 255,   1,   0,   0,   0,
-};
-
-/* Unified_Ideograph: 434 bytes. */
-
-RE_UINT32 re_get_unified_ideograph(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-
-    f = ch >> 15;
-    code = ch ^ (f << 15);
-    pos = (RE_UINT32)re_unified_ideograph_stage_1[f] << 5;
-    f = code >> 10;
-    code ^= f << 10;
-    pos = (RE_UINT32)re_unified_ideograph_stage_2[pos + f] << 4;
-    f = code >> 6;
-    code ^= f << 6;
-    pos = (RE_UINT32)re_unified_ideograph_stage_3[pos + f] << 6;
-    pos += code;
-    value = (re_unified_ideograph_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1;
-
-    return value;
-}
-
-/* Other_Default_Ignorable_Code_Point. */
-
-static RE_UINT8 re_other_default_ignorable_code_point_stage_1[] = {
-    0, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
     1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
     1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1,
-};
-
-static RE_UINT8 re_other_default_ignorable_code_point_stage_2[] = {
-    0, 1, 0, 0, 0, 0, 0, 0, 2, 0, 0, 3, 0, 0, 0, 0,
-    4, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6,
-    7, 8, 8, 8, 8, 8, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-};
-
-static RE_UINT8 re_other_default_ignorable_code_point_stage_3[] = {
-     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  0,  0,
-     0,  0,  0,  0,  0,  2,  0,  0,  0,  0,  0,  0,  0,  0,  3,  0,
-     0,  4,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  5,  0,  0,
-     0,  0,  0,  0,  0,  0,  6,  7,  8,  0,  9,  9,  0,  0,  0, 10,
-     9,  9,  9,  9,  9,  9,  9,  9,
-};
-
-static RE_UINT8 re_other_default_ignorable_code_point_stage_4[] = {
-      0,   0,   0,   0,   0,   0,   0,   0,   0, 128,   0,   0,   0,   0,   0,   0,
-      0,   0,   0, 128,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,  48,   0,
-      0,   0,   0,   0,  32,   0,   0,   0,   0,   0,   0,   0,  16,   0,   0,   0,
-      0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0, 255,   1,
-    253, 255, 255, 255,   0,   0,   0,   0, 255, 255, 255, 255, 255, 255, 255, 255,
-      0,   0,   0,   0,   0,   0, 255, 255,
-};
-
-/* Other_Default_Ignorable_Code_Point: 356 bytes. */
-
-RE_UINT32 re_get_other_default_ignorable_code_point(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-
-    f = ch >> 14;
-    code = ch ^ (f << 14);
-    pos = (RE_UINT32)re_other_default_ignorable_code_point_stage_1[f] << 5;
-    f = code >> 9;
-    code ^= f << 9;
-    pos = (RE_UINT32)re_other_default_ignorable_code_point_stage_2[pos + f] << 3;
-    f = code >> 6;
-    code ^= f << 6;
-    pos = (RE_UINT32)re_other_default_ignorable_code_point_stage_3[pos + f] << 6;
-    pos += code;
-    value = (re_other_default_ignorable_code_point_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1;
-
-    return value;
-}
-
-/* Deprecated. */
-
-static RE_UINT8 re_deprecated_stage_1[] = {
-    0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
     1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
     1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1,
-};
-
-static RE_UINT8 re_deprecated_stage_2[] = {
-    0, 1, 1, 2, 1, 1, 1, 3, 1, 1, 1, 4, 1, 1, 1, 1,
-    5, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
     1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
     1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
     1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-};
-
-static RE_UINT8 re_deprecated_stage_3[] = {
-    0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0,
-    0, 0, 0, 0, 0, 0, 4, 0, 0, 5, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 6, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0,
-};
-
-static RE_UINT8 re_deprecated_stage_4[] = {
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   8,   0,   0,   0,   0,   0,   0,   0, 128,   2,
-      0,   0,   0,   0,  24,   0,   0,   0,   0,   0,   0,   0,   0, 252,   0,   0,
-      0,   0,   0,   0,   0,   6,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,
-};
-
-/* Deprecated: 292 bytes. */
-
-RE_UINT32 re_get_deprecated(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-
-    f = ch >> 14;
-    code = ch ^ (f << 14);
-    pos = (RE_UINT32)re_deprecated_stage_1[f] << 5;
-    f = code >> 9;
-    code ^= f << 9;
-    pos = (RE_UINT32)re_deprecated_stage_2[pos + f] << 3;
-    f = code >> 6;
-    code ^= f << 6;
-    pos = (RE_UINT32)re_deprecated_stage_3[pos + f] << 6;
-    pos += code;
-    value = (re_deprecated_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1;
-
-    return value;
-}
-
-/* Soft_Dotted. */
-
-static RE_UINT8 re_soft_dotted_stage_1[] = {
-    0, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1,
     1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
     1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
     1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1,
-};
-
-static RE_UINT8 re_soft_dotted_stage_2[] = {
-    0, 1, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 5,
-    6, 3, 3, 3, 3, 3, 7, 3, 3, 3, 3, 3, 3, 3, 3, 3,
-    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
-    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
-    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 8, 9, 3, 3, 3, 3,
-    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
 };
 
-static RE_UINT8 re_soft_dotted_stage_3[] = {
-     0,  0,  0,  1,  0,  0,  0,  0,  0,  2,  0,  0,  0,  0,  0,  0,
-     0,  0,  3,  4,  5,  6,  0,  0,  0,  0,  0,  0,  0,  0,  0,  7,
-     0,  0,  8,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+static RE_UINT8 re_pattern_syntax_table_2[] = {
+     0,  1,  2,  2,  0,  3,  4,  4,  0,  0,  0,  0,  0,  0,  0,  0,
      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  9, 10, 11,  0,  0,
-     0, 12,  0,  0,  0,  0, 13,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0, 14,  0,  0,  0,  0,  0,  0, 15,  0,  0,  0,  0,  0,
-     0,  0,  0, 16,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0, 17, 18,  0, 19, 20,  0, 21,  0, 22, 23,  0, 24,  0, 17, 18,
-     0, 19, 20,  0, 21,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-};
-
-static RE_UINT8 re_soft_dotted_stage_4[] = {
-      0,   0,   0,   0,   0,   6,   0,   0,   0, 128,   0,   0,   0,   2,   0,   0,
-      0,   1,   0,   0,   0,   0,   0,  32,   0,   0,   4,   0,   0,   0,   8,   0,
-      0,   0,  64,   1,   4,   0,   0,   0,   0,   0,  64,   0,  16,   1,   0,   0,
-      0,  32,   0,   0,   0,   8,   0,   0,   0,   0,   2,   0,   0,   3,   0,   0,
-      0,   0,   0,  16,  12,   0,   0,   0,   0,   0, 192,   0,   0,  12,   0,   0,
-      0,   0,   0, 192,   0,   0,  12,   0, 192,   0,   0,   0,   0,   0,   0,  12,
-      0, 192,   0,   0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     5,  6,  7,  0,  0,  0,  0,  0,  0,  0,  0,  0,  5,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  0,  0,  0,  0,  0,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  9, 10,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     8,  8,  8,  8,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    11, 12,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0, 13,  0,  0,  0,  0,  0,  0,
+     0,  0, 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0
 };
 
-/* Soft_Dotted: 424 bytes. */
-
-RE_UINT32 re_get_soft_dotted(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-
-    f = ch >> 14;
-    code = ch ^ (f << 14);
-    pos = (RE_UINT32)re_soft_dotted_stage_1[f] << 5;
-    f = code >> 9;
-    code ^= f << 9;
-    pos = (RE_UINT32)re_soft_dotted_stage_2[pos + f] << 4;
-    f = code >> 5;
-    code ^= f << 5;
-    pos = (RE_UINT32)re_soft_dotted_stage_3[pos + f] << 5;
-    pos += code;
-    value = (re_soft_dotted_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1;
-
-    return value;
-}
-
-/* Logical_Order_Exception. */
-
-static RE_UINT8 re_logical_order_exception_stage_1[] = {
-    0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1,
+static RE_UINT8 re_pattern_syntax_table_3[] = {
+      0,   0,   0,   0, 254, 255,   0, 252,   1,   0,   0, 120, 254,  90,  67, 136,
+      0,   0, 128,   0,   0,   0, 255, 255, 255,   0, 255, 127, 254, 255, 239, 127,
+    255, 255, 255, 255, 255, 255,  63,   0,   0,   0, 240, 255,  14, 255, 255, 255,
+      1,   0,   1,   0,   0,   0,   0, 192,  96,   0,   0,   0
 };
 
-static RE_UINT8 re_logical_order_exception_stage_2[] = {
-    0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-};
+RE_UINT32 re_get_pattern_syntax(RE_UINT32 codepoint) {
+    RE_UINT32 field_2;
+    RE_UINT32 field_1;
+    RE_UINT32 field_0;
+    RE_UINT32 offset;
+    RE_UINT32 v;
 
-static RE_UINT8 re_logical_order_exception_stage_3[] = {
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0,
-    0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-};
+    field_2 = codepoint >> 10;
+    field_1 = (codepoint >> 5) & 0x1F;
+    field_0 = (codepoint >> 3) & 0x3;
+    offset = codepoint & 0x7;
 
-static RE_UINT8 re_logical_order_exception_stage_4[] = {
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,  31,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0, 224,   4,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,  96,  26,   0,   0,   0,   0,   0,   0,   0,   0,
-};
+    v = re_pattern_syntax_table_1[field_2];
+    v = re_pattern_syntax_table_2[(v << 5) | field_1];
+    v = re_pattern_syntax_table_3[(v << 2) | field_0];
 
-/* Logical_Order_Exception: 209 bytes. */
-
-RE_UINT32 re_get_logical_order_exception(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-
-    f = ch >> 16;
-    code = ch ^ (f << 16);
-    pos = (RE_UINT32)re_logical_order_exception_stage_1[f] << 5;
-    f = code >> 11;
-    code ^= f << 11;
-    pos = (RE_UINT32)re_logical_order_exception_stage_2[pos + f] << 4;
-    f = code >> 7;
-    code ^= f << 7;
-    pos = (RE_UINT32)re_logical_order_exception_stage_3[pos + f] << 7;
-    pos += code;
-    value = (re_logical_order_exception_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1;
-
-    return value;
+    return (v >> offset) & 0x1;
 }
 
-/* Other_ID_Start. */
-
-static RE_UINT8 re_other_id_start_stage_1[] = {
-    0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1,
-};
-
-static RE_UINT8 re_other_id_start_stage_2[] = {
-    0, 0, 0, 0, 0, 0, 1, 0, 2, 0, 0, 0, 3, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-};
-
-static RE_UINT8 re_other_id_start_stage_3[] = {
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-};
+/* Pattern_White_Space. */
+RE_UINT32 re_get_pattern_white_space(RE_UINT32 codepoint) {
+    if (0x09 <= codepoint && codepoint <= 0x0D)
+        return 1;
+    if (codepoint == 0x20)
+        return 1;
+    if (codepoint == 0x85)
+        return 1;
+    if (0x200E <= codepoint && codepoint <= 0x200F)
+        return 1;
+    if (0x2028 <= codepoint && codepoint <= 0x2029)
+        return 1;
+
+    return 0;
+}
 
-static RE_UINT8 re_other_id_start_stage_4[] = {
-     0,  0,  0,  0,  0,  0,  0,  0, 96,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  1,  0, 64,  0,  0,  0,  0,  0, 24,  0,  0,  0,  0,
+/* Posix_AlNum. */
+static RE_UINT8 re_posix_alnum_table_1[] = {
+     0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 13, 13,
+    13, 13, 13, 14, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 15, 13, 16, 17, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 18, 10, 10, 10, 10, 10, 10, 10, 10, 19, 20,
+    21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 10, 10, 13, 31, 10, 10,
+    10, 32, 10, 10, 10, 10, 10, 10, 10, 10, 33, 34, 13, 13, 13, 13,
+    13, 35, 13, 36, 10, 10, 10, 10, 10, 10, 10, 10, 37, 10, 10, 38,
+    10, 10, 10, 10, 10, 39, 10, 10, 40, 10, 41, 42, 43, 10, 10, 10,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 44, 13, 13, 13, 45, 46, 13,
+    13, 13, 13, 47, 13, 13, 13, 13, 13, 13, 48, 10, 10, 10, 49, 10,
+    13, 13, 13, 13, 50, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10
 };
 
-/* Other_ID_Start: 194 bytes. */
-
-RE_UINT32 re_get_other_id_start(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-
-    f = ch >> 15;
-    code = ch ^ (f << 15);
-    pos = (RE_UINT32)re_other_id_start_stage_1[f] << 5;
-    f = code >> 10;
-    code ^= f << 10;
-    pos = (RE_UINT32)re_other_id_start_stage_2[pos + f] << 4;
-    f = code >> 6;
-    code ^= f << 6;
-    pos = (RE_UINT32)re_other_id_start_stage_3[pos + f] << 6;
-    pos += code;
-    value = (re_other_id_start_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1;
-
-    return value;
-}
-
-/* Other_ID_Continue. */
-
-static RE_UINT8 re_other_id_continue_stage_1[] = {
-    0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1,
+static RE_UINT8 re_posix_alnum_table_2[] = {
+      0,   1,   2,   2,   0,   3,   4,   4,   5,   5,   5,   5,   5,   5,   5,   5,
+      5,   5,   5,   5,   5,   5,   6,   7,   0,   0,   8,   9,  10,  11,   5,  12,
+      5,   5,   5,   5,  13,   5,   5,   5,   5,  14,  15,   5,  16,  17,  18,  19,
+     20,   5,  21,  22,   5,   5,  23,  24,  25,   5,  26,   5,   5,  27,  28,  29,
+     30,  31,  32,  33,   0,  34,  35,  36,   5,  37,  38,  39,  40,  41,  42,  43,
+     44,  45,  46,  47,  48,  49,  50,  51,  52,  49,  53,  54,  55,  56,  57,   0,
+     58,  59,  60,  61,  58,  62,  63,  64,  65,  66,  67,  68,  69,  70,  71,  72,
+     73,  74,  75,   0,  76,  77,  78,   0,  79,   0,  80,  81,  82,  83,   0,   0,
+      5,  84,  25,   5,  85,   5,  86,  87,   5,   5,   5,   5,   5,   5,   5,   5,
+      5,   5,  88,   5,  89,  90,  91,   5,  92,   5,  74,   0,  93,   5,   5,  94,
+     73,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
+      5,   5,   5,  95,   2,   5,   5,  96,  97,  98,  98,  99,   5, 100, 101,   0,
+      0,   5,   5,  32,   5, 102,   5, 103, 104, 105,  25, 106,   5, 107, 108,   0,
+    109,   5, 104, 110,   0, 111,  79,   0,   5, 112, 113,   0,   5, 114,   5, 115,
+      5, 116, 117, 118, 119,  66,   0, 120,   5,   5,   5,   5,   5,   5,   0, 121,
+      5,   5,   5,   5,   5,   5,   5,   5,  94,   5, 122, 118,   5, 123, 124, 125,
+      0,   0,   0, 126, 127,   0,   0,   0, 128, 129, 130,   5,  16,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0, 131,   5, 108,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      5, 132, 104,   5,   5,   5,   5, 133,   5,  86,   5, 134, 116, 135, 135,   5,
+      0, 136,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    137, 138,  73,   5, 139,  73,   5,  87, 140,  14,   5,   5, 141,   5,   0,  25,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
+      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
+      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   0,   0,
+      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
+      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
+      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,  83,
+      5,   5,   5,   5,  31,   0,  25, 118,   5,   5,   5,   5,   5,   5,   5,   5,
+    142, 143,   5, 144,   5,   5,   5,  93, 145, 146,   5,   5, 147,   5, 148, 149,
+    150, 151,   5,  98,   5,   5, 152, 153,  28, 102, 154,  83,   5, 155, 136, 156,
+      5, 116, 157, 158,   5, 104, 159, 160, 161, 162,  87, 163,   5,   5,   5,  33,
+      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
+      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5, 164, 165, 109,
+      0,   0,   0,   0,   0,   0,   0,   0,   5,   5,   5,   5,   5,   5,   5,   5,
+      5,   5,   5, 166,   5,   5, 167,   0, 168, 169, 170,   5,   5,  27, 171,   5,
+      5,   5,   5,   5,   5,   5,   5,   5,   5, 118,  25,   5, 172,   5, 151, 173,
+      0,   0,   0, 174,   5,   5,   5,  83,   0,   2,   2, 175,   5, 104, 176,   0,
+    177, 178, 179,   0,   5,   5,   5,  74,   0,   0,   5, 180,   0,   0,   0,   0,
+      0,   0,   0,   0,  83,   5, 181,   0,   5,  26, 102,  74, 118,   5, 182,   0,
+      5,   5,   5,   5, 118,  25, 183, 109,   5, 184,   5,  61,   0,   0,   0,   0,
+      5,   5,   5,   5,   5,   5,   5,   5,   5, 116, 103, 151,   0,   0,   0,   0,
+    185, 186, 103, 116, 104,   0,   0, 187, 103, 167,   0,   0,   5, 188,   0,   0,
+    189, 103,   0,  83,  83,   0,  80, 190,   5, 103, 103, 154,  27,   0,   0,   0,
+      5,   5,  16,   0,   5, 154,   5, 154,   5, 151,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   5, 191,   0,   0,  83, 192, 193,   0,   0,  25, 190, 116,
+      5,   5, 193,   0, 146,  32,  25,  16,   5, 154, 194, 195,   5,   5, 196,   0,
+    197, 198,   0,   0, 199, 119,   5,  16,  40,  49, 200,  61,   0,   0,   0,   0,
+      5,   5, 201, 202,   5,   5, 203,   0,   0,   0,   0,   0,   5, 204, 205,   0,
+      5, 104, 206,   0,   5, 207,   0,   0,  66,  33,   0,   0,   0,   0,   0,   0,
+      5,  32,   0,   0,   0,   5,   5, 208, 209, 210, 211,   0,   0, 212,  30, 213,
+      5, 214,  25,   5, 215,   0,   5,  32,   0,   0,   0,   0,   0,   0,   0,   0,
+    216, 217,  79, 218, 172, 219,   0,   0, 220, 221, 222, 223, 224,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0, 116,   0,   0,   0,   0,   0, 225,   0,   0,
+      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
+      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5, 167,   0,   0,   0,
+      5,   5,   5, 141,   5,   5,   5,   5,   5,   5,  61,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      5, 141,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
+      5,   5, 226,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
+      5,  32, 104,   0,   0,   0,  25, 157,   5,  93,  61, 227,  93,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   5,   5,   0,   0,   0,   0,   5,   5, 228,   5, 229,   0,   0, 230,
+      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
+      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5, 231,
+      5,   5,   5,   5,   5,   5, 103,   0,  16,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      5,   5,   5,   5,   5,   5,   5,   5, 104,   0, 232, 194,   5,   5,   5,   5,
+      5,   5,   5,   5,   5,   5,   5, 109,   0,   0,   0,   0,   0,   0,   0,   0,
+      5,   5,   5, 233, 234,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      5,   5,  34,   5, 235, 236, 237,   5, 238, 239, 240,   5,   5,   5,   5,   5,
+      5,   5,   5,   5,   5, 241, 242,  87,  34,  34, 132, 132, 216, 216, 243,   0,
+    244, 245,   0,   0,   0,   0,   0,   0,   5, 246, 247,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   5, 248,   0,   0,   0,   0,   0,   0,   0,   0,
+      5,   5,   5,   5,   5,   5, 190,   0,   5,   5, 249,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    237, 250, 251, 252, 253, 254,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,  25, 163, 163, 108,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
+      5,   5,   5,   5,   5,   5, 118,   0,   5,   5,   5,   5,   5,   5,   5,   5,
+      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
+      5,   5,   5,   5,   5,   5,   5,   5,   5, 180,   5,   5,   5,   5,   5,   5,
+    118,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
+      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
+      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
+      5,   5,   5,   5,   5, 255,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
+      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
+      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,  79,
+      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
+    118,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
+      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,  33,   0,   0,   0,   0,   0
+};
+
+static RE_UINT8 re_posix_alnum_table_3[] = {
+      0,   0,   0,   0,   0,   0, 255,   3, 254, 255, 255,   7,   0,   4,  32,   4,
+    255, 255, 127, 255, 255, 255, 255, 255, 195, 255,   3,   0,  31,  80,   0,   0,
+     32,   0,   0,   0,   0,   0, 223, 188,  64, 215, 255, 255, 251, 255, 255, 255,
+    255, 255, 191, 255,   3, 252, 255, 255, 255, 255, 254, 255, 255, 255, 127,   2,
+    255,   1,   0,   0,   0,   0, 255, 191, 182,   0, 255, 255, 255, 135,   7,   0,
+      0,   0, 255,   7, 255, 255, 255, 254,   0, 192, 255, 255, 255, 255, 239,  31,
+    254, 225,   0, 156,   0,   0, 255, 255,   0, 224, 255, 255, 255, 255,   3,   0,
+      0, 252, 255, 255, 255,   7,  48,   4, 255, 255, 255, 252, 255,  31,   0,   0,
+    255, 255, 255,   1, 255,   7,   0,   0, 255, 255, 223, 255, 255,   0, 240, 255,
+    248,   3, 255, 255, 255, 255, 255, 239, 255, 223, 225, 255,  15,   0, 254, 255,
+    239, 159, 249, 255, 255, 253, 197, 227, 159,  89, 128, 176,  15,   0,   3,  16,
+    238, 135, 249, 255, 255, 253, 109, 195, 135,  25,   2,  94,   0,   0,  63,   0,
+    238, 191, 251, 255, 255, 253, 237, 227, 191,  27,   1,   0,  15,   0,   0,  30,
+    238, 159, 249, 255, 159,  25, 192, 176,  15,   0,   2,   0, 236, 199,  61, 214,
+     24, 199, 255, 195, 199,  29, 129,   0, 239, 223, 253, 255, 255, 253, 255, 227,
+    223,  29,  96,   7,  15,   0,   0,   0, 255, 253, 239, 227, 223,  29,  96,  64,
+     15,   0,   6,   0, 255, 223, 253, 255, 255, 255, 255, 231, 223,  93, 240, 128,
+     15,   0,   0, 252, 238, 255, 127, 252, 255, 255, 251,  47, 127, 128,  95, 255,
+      0,   0,  12,   0, 254, 255, 255, 255, 255, 255, 255,   7, 127,  32,   0,   0,
+    214, 247, 255, 255, 175, 255, 255,  59,  95,  32,   0, 240,   1,   0,   0,   0,
+    255, 254, 255, 255, 255,  31, 254, 255,   3, 255, 255, 254, 255, 255, 255,  31,
+    255, 255, 127, 249, 255, 255,   0,  60, 191,  32, 255, 255, 255, 255, 255, 247,
+    255,  61, 127,  61, 255,  61, 255, 255, 255, 255,  61, 127,  61, 255, 127, 255,
+    255, 255,  61, 255, 255, 255,   0,   0, 255, 255,  63,  63, 255, 159, 255, 255,
+    255, 199, 255,   1, 255, 223,  15,   0, 255, 255,  15,   0, 255, 223,  13,   0,
+    255, 255, 207, 255, 255,   1, 128,  16, 255,   7, 255, 255, 255, 255,  63,   0,
+    255, 255, 255, 127, 255,  15, 255,   1, 255,  63,  31,   0, 255,  15, 255, 255,
+    255,   3,   0,   0, 255, 255, 255,  15, 254, 255,  31,   0, 128,   0,   0, 128,
+    255, 255, 239, 255, 239,  15,   0,   0, 255, 243,   0, 252, 191, 255,   3,   0,
+    255, 255, 127,   0,   0, 224,   0, 252, 255, 255, 255,  63, 255,   1, 255, 255,
+      0, 222, 111,   4, 128, 255,  31,   0,  63,  63, 255, 170, 255, 255, 223,  95,
+    220,  31, 207,  15, 255,  31, 220,  31,   0,   0,   2, 128,   0,   0, 255,  31,
+    132, 252,  47,  62,  80, 189, 255, 243, 224,  67,   0,   0,   0,   0, 192, 255,
+    255, 127, 255, 255,  31, 120,  12,   0, 255, 128,   0,   0, 127, 127, 127, 127,
+      0, 128,   0,   0, 224,   0,   0,   0, 254,   3,  62,  31, 255, 255, 127, 224,
+    224, 255, 255, 255, 255, 127,   0,   0, 255,  31, 255, 255,   0,  12,   0,   0,
+    255, 127, 240, 143,   0,   0, 128, 255, 252, 255, 255, 255, 255, 249, 255, 255,
+    252,   7,   0,   0,   0,   0, 224, 255, 191, 255, 255, 255, 255,   0,   0,   0,
+     47,   0,   0,   0,   0,   0, 252, 232, 255, 255,   7,   0, 255, 255, 247, 255,
+    255, 255,   0, 124, 255,  63,   0,   0, 255, 255, 127, 252,   5,   0,   0,  56,
+    255, 255,  60,   0, 126, 126, 126,   0, 127, 127, 255, 255, 255,   3, 255, 255,
+     15,   0, 255, 255, 127, 248, 255, 255, 255,  63, 255, 255, 255, 255, 255,   3,
+    127,   0, 248, 224, 255, 253, 127,  95, 219, 255, 255, 255,   0,   0, 248, 255,
+    255, 255, 252, 255,   0,   0, 255,  15,   0,   0, 223, 255, 192, 255, 255, 255,
+    252, 252, 252,  28, 255, 239, 255, 255, 127, 255, 255, 183, 255,  63, 255,  63,
+    255, 255,  31,   0, 255, 255,   1,   0,  15, 255,  62,   0, 255, 255,  15, 255,
+    255,   0, 255, 255,  63, 253, 255, 255, 255, 255, 191, 145, 255, 255,  55,   0,
+    255, 255, 255, 192, 111, 240, 239, 254,  31,   0,   0,   0, 255,  27,   3,   0,
+    128,   0, 255, 255,  63,   0,   0,   0, 240,   0, 255, 255, 255, 255,  71,   0,
+     30, 192,   0,  20, 255, 255, 251, 255, 255, 255, 159,  64, 127, 189, 255, 191,
+    159,  25, 129, 224, 187,   7,   0, 128,   3,   0,   0,   0, 179,   0,   0,   0,
+    255, 255,  63, 127,   0,   0,   0,  63,  17,   0,   0,   0, 255, 255,  63,   1,
+      0,   0,   0, 128, 127, 242, 111, 255, 255, 255, 191, 153,   7,   0,   0,   0,
+    255, 252, 255, 255,  26,   0,   0,   0, 255, 255, 231, 127, 255, 255, 255,  32,
+    255, 253, 255, 255, 255, 255, 127, 127,   0,   0, 252, 255, 255, 254, 127,   0,
+    127, 251, 255, 255, 255, 255, 127, 180, 203,   0,   0,   0, 191, 253, 255, 255,
+    255, 127, 123,   1,   0,   0,   1,   0, 127,   0,   0,   0, 248, 255, 255, 224,
+    255, 135, 255, 255, 255, 128, 255, 255,  11,   0,   3,   0, 255, 255, 255,   0,
+      0,   0,   7,   0, 255,   7, 255,  31, 255,   1, 255,  67, 255, 255, 255, 223,
+    100, 222, 255, 235, 239, 255, 255, 255, 191, 231, 223, 223, 255, 255, 255, 123,
+     95, 252, 253, 255,  63, 255, 255, 255, 253, 255, 255, 247, 247,  15,   0,   0,
+    127, 255, 255, 249, 219,   7,   0,   0, 255,  31, 128,  63,   0,  64,   0,   0,
+    255,  15,   0,   0, 143,   8,   0,   0, 150, 254, 247,  10, 132, 234, 150, 170,
+    150, 247, 247,  94, 255, 251, 255,  15, 238, 251, 255,  15,   3,   0, 255, 255
 };
 
-static RE_UINT8 re_other_id_continue_stage_2[] = {
-    0, 1, 1, 1, 2, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-};
+RE_UINT32 re_get_posix_alnum(RE_UINT32 codepoint) {
+    RE_UINT32 field_2;
+    RE_UINT32 field_1;
+    RE_UINT32 field_0;
+    RE_UINT32 offset;
+    RE_UINT32 v;
 
-static RE_UINT8 re_other_id_continue_stage_3[] = {
-    0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0,
-};
+    field_2 = codepoint >> 10;
+    field_1 = (codepoint >> 5) & 0x1F;
+    field_0 = (codepoint >> 3) & 0x3;
+    offset = codepoint & 0x7;
 
-static RE_UINT8 re_other_id_continue_stage_4[] = {
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 128,   0,
-    128,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 254,   3,   0,
-      0,   0,   0,   4,   0,   0,   0,   0,
-};
+    v = re_posix_alnum_table_1[field_2];
+    v = re_posix_alnum_table_2[(v << 5) | field_1];
+    v = re_posix_alnum_table_3[(v << 2) | field_0];
 
-/* Other_ID_Continue: 202 bytes. */
-
-RE_UINT32 re_get_other_id_continue(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-
-    f = ch >> 15;
-    code = ch ^ (f << 15);
-    pos = (RE_UINT32)re_other_id_continue_stage_1[f] << 5;
-    f = code >> 10;
-    code ^= f << 10;
-    pos = (RE_UINT32)re_other_id_continue_stage_2[pos + f] << 4;
-    f = code >> 6;
-    code ^= f << 6;
-    pos = (RE_UINT32)re_other_id_continue_stage_3[pos + f] << 6;
-    pos += code;
-    value = (re_other_id_continue_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1;
-
-    return value;
+    return (v >> offset) & 0x1;
 }
 
-/* Sentence_Terminal. */
+/* Posix_Digit. */
+RE_UINT32 re_get_posix_digit(RE_UINT32 codepoint) {
+    if (0x30 <= codepoint && codepoint <= 0x39)
+        return 1;
 
-static RE_UINT8 re_sentence_terminal_stage_1[] = {
-    0, 1, 2, 2, 2, 3, 2, 4, 5, 2, 2, 6, 2, 7, 8, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2,
-};
+    return 0;
+}
 
-static RE_UINT8 re_sentence_terminal_stage_2[] = {
-     0,  1,  1,  1,  1,  2,  3,  4,  5,  6,  1,  1,  1,  1,  1,  1,
-     7,  1,  1,  8,  1,  1,  9, 10, 11, 12, 13, 14, 15,  1,  1,  1,
-    16,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1, 17,  1,
-    18,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
-     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
-     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
-     1,  1,  1,  1, 19,  1, 20,  1, 21, 22, 23, 24,  1,  1,  1,  1,
-     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
-     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
-     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1, 25, 26,
-     1,  1,  1,  1,  1,  1,  1,  1,  1,  1, 27,  1,  1,  1,  1, 28,
-    29, 30, 31,  1, 32, 33, 34, 35,  1,  1, 36,  1, 34,  1, 37,  1,
-     1,  1,  1,  1,  1,  1,  1,  1,  1,  1, 38, 39,  1,  1, 40,  1,
-     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
-     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
-     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1, 41,  1,  1,  1,
-     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
-     1,  1,  1,  1,  1,  1,  1,  1,  1,  1, 42,  1,  1,  1,  1,  1,
+/* Posix_Punct. */
+static RE_UINT8 re_posix_punct_table_1[] = {
+     0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 13, 13,
+    13, 13, 13, 14, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 15, 16, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 17, 18,
+    19, 20, 21, 22, 23, 24, 25, 26, 13, 27, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 28, 29, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 30,
+    13, 13, 13, 13, 31, 32, 33, 13, 34, 13, 35, 36, 37, 38, 39, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13
 };
 
-static RE_UINT8 re_sentence_terminal_stage_3[] = {
-     0,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  2,  0,  0,  0,  3,  0,  0,  0,  0,  0,  4,  0,
-     5,  0,  0,  0,  0,  0,  0,  6,  0,  7,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  8,  0,  0,  0,  0,  0,  0,  9,  0,  0,  0,  0,  0,
-     0,  0,  0, 10,  0,  0,  0,  0,  0,  0,  0, 11,  0,  0,  0,  0,
-     0, 12,  0,  0,  0,  0,  0,  0, 13,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  8,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 14,  0,  0,
-     0,  0, 15,  0,  0,  0,  0,  0,  0, 16,  0,  3,  0,  0,  0,  0,
-     0, 17, 18,  0,  0,  0,  0,  0,  0, 19,  0,  0,  0,  0,  0,  0,
-    20,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 21,
-    22,  0,  0,  0,  0,  0,  0, 23,  0,  0,  0, 24,  0,  0, 22,  0,
-     0, 25,  0,  0,  0,  0, 26,  0,  0,  0, 27,  0,  0,  0,  0, 28,
-     0,  0,  0,  0,  0,  0,  0, 29,  0,  0, 30,  0,  0,  0,  0,  0,
-     1,  0,  0, 31,  0,  0,  0,  0,  0,  0, 24,  0,  0,  0,  0,  0,
-     0,  0, 32,  0,  0,  0,  0,  0,  0,  0, 33,  0,  0,  3, 34,  0,
-     0,  0, 35,  0,  0,  0, 36,  0,  0, 37,  0,  0,  0,  2,  0,  0,
-     0,  0, 38,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 39,  0,
-     0,  0, 40,  0,  0,  0,  0,  0,  0, 41,  0,  0,  0,  0,  0,  0,
-     0,  0, 42,  0, 16,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 43,
-     0,  0,  0, 22,  0,  0,  0, 44,  0, 43, 45,  0,  0,  0,  0,  0,
-     0,  0,  0,  0, 46,  0,  0,  0,  0,  0,  0,  0, 21,  0,  0,  0,
-     0,  0,  0,  0, 47,  0,  0,  0,
-};
+static RE_UINT8 re_posix_punct_table_2[] = {
+      0,   1,   2,   3,   0,   4,   5,   5,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   6,   7,   0,   0,   0,   8,   9,   0,   0,  10,
+      0,   0,   0,   0,  11,   0,   0,   0,   0,   0,  12,   0,  13,  14,  15,  16,
+     17,   0,   0,  18,   0,   0,  19,  20,  21,   0,   0,   0,   0,   0,   0,  22,
+      0,  23,  14,   0,   0,   0,   0,   0,   0,   0,   0,  24,   0,   0,   0,  25,
+      0,   0,   0,  10,   0,   0,   0,  26,   0,   0,   0,  27,   0,   0,   0,  28,
+      0,   0,   0,  29,  30,   0,   0,   0,   0,   0,  31,  32,   0,   0,   0,  33,
+      0,  34,  35,   0,   0,   0,   0,   0,  36,  37,   0,   0,  38,  39,  40,   0,
+      0,   0,  41,   0,  39,   0,   0,  42,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  43,  44,   0,   0,   0,
+     45,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,  46,  47,   0,   0,  48,   0,  49,   0,   0,   0,   0,  50,   0,
+     51,   0,   0,   0,   0,   0,   0,   0,   0,   0,  52,   0,   0,   0,  39,  53,
+     39,   0,   0,   0,   0,  54,   0,   0,   0,   0,  12,  55,   0,   0,   0,  56,
+      0,  57,   0,  39,   0,   0,  58,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  59,  60,  61,
+     62,  63,  64,  65,  66,  53,   0,   0,  67,  68,  69,   0,  70,  53,  53,  53,
+     53,  53,  53,  53,  53,  53,  53,  53,  53,  53,  53,  53,  53,  53,  53,  53,
+     53,  71,  51,   0,  56,  72,   0,   0,  53,  53,  53,  53,  53,  53,  53,  53,
+     53,  53,  53,  53,  53,  53,  53,  53,  53,  53,  53,  72,  73,  53,  53,  53,
+     53,  53,  53,  53,  53,  53,  53,  53,  53,  53,  53,  53,  53,  53,  53,  53,
+     53,  53,  53,  53,  53,  53,  53,  53,  53,  53,  53,  74,  75,  53,  53,  53,
+      0,   0,   0,   0,   0,   0,   0,  76,   0,   0,   0,  27,   0,   0,   0,   0,
+     53,  77,  78,   0,  79,  53,  53,  80,  53,  53,  53,  53,  53,  53,  72,  81,
+     82,  83,   0,   0,  47,  45,   0,  42,   0,   0,   0,   0,  84,   0,  53,  85,
+     64,  86,  87,  53,  86,  88,  53,  53,  53,  53,  53,  53,  53,  53,  53,  53,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  53,  53,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,  62,  53,  71,  39,   0,   0,   0,   0,   0,   0,   0,   0,
+     89,   0,   0,  90,   0,   0,   0,  91,  92,  93,   0,   0,  94,   0,   0,   0,
+      0,  95,   0,  96,   0,   0,  97,  98,   0,  97,  34,   0,   0,   0,  99,   0,
+      0,   0,  56, 100,   0,   0,  39,  26,   0,   0,  42, 101,   0,   0,   0, 102,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0, 103,   0,   0,   0, 104,  93,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,  39,   0,   0,   0,   0,   0, 105,
+     44,  62, 106, 107,   0,   0,   0,   0,   1,   2,   2, 108,   0,   0,   0, 109,
+      0,   0,   0,   0,   0,   0,   0,   0, 110, 111,   0, 112, 113,  45,  62, 114,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  34,   0,  27,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  31,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   5, 115,   0,   0,   0,   0,  34,  34,   0,   0,   0,   0,   0,   0,
+      0,   0, 116,  34,   0,   0, 117, 118,   0, 112,   0,   0, 119,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0, 120,   0,   0,   0,   0, 121,   0,   0,   0,   0,   0,
+      0,   0, 122,   0,   0, 123,  93,   0,   0,   0,  85, 124,   0,   0, 125,   0,
+      0, 126,   0,   0,   0, 103,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0, 127,   0,   0,   0, 128,   0,   0,   0,   0,   0,   0,   0, 129,   0,
+      0,   0, 130, 131,   0,   0,   0,   0,   0,  56,   0,   0,   0,   0,   0,   0,
+      0,  42,   0,   0,   0,   0,   0,   0,   0,   0, 132,   0,   0,   0,   0,  11,
+      0,  34,  71,   0, 133, 110,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0, 134,  26,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0, 115,   0,   0,   0,   0,   0,   0, 135, 136,
+      0,   0,   0, 137,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,  97,   0,   0,   0, 138,   0, 111, 139,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0, 140,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  11,
+      0,   0,   0,   0, 141,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     53,  53,  53,  53,  53,  53,  53,  72,  53, 142,  53, 143, 144, 145,  53,  43,
+     53,  53, 146,   0,   0,   0,   0,   0,  53,  53,  92,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0, 147,  42, 138, 138,  31,  31, 103, 103, 148,   0,
+     53,  53,  53,  53,  53,  53,  53,  53,  53,  53,  53,  53,  53,  53,  53,  53,
+      0, 140,   0, 149, 150,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  31,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,  34,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  39,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0, 151,   0,   0,   0, 152,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,  26,   0,   0,   0,   0,   0,   0,   0,   0,
+     53, 153,  53,  53,  80, 154, 155,  72, 156, 157,  41,  41,  86,  21,   0, 158,
+    159, 160, 161, 108,   0,   0,   0,   0,  53,  53,  53,  53,  53,  53,  53,  53,
+     53,  53,  53,  53,  53,  53,  53,  53,  53,  53,  53,  53,  53,  53,  53,  53,
+     53,  53,  53,  53,  53,  53, 162, 163,  53,  53,  53,  80,  53,  53, 164, 165,
+    153,  53, 166,  53,  63, 167,   0,   0,  53,  53,  53, 168,  53,  53, 169,  53,
+     53,  53,  80, 170, 171, 172, 173,   0,  53,  53,  53,  53, 106,  53,  51,   0
+};
+
+static RE_UINT8 re_posix_punct_table_3[] = {
+      0,   0,   0,   0, 254, 255,   0, 252,   1,   0,   0, 248,   1,   0,   0, 120,
+    254, 219, 211, 137,   0,   0, 128,   0,  60,   0, 252, 255, 224, 175, 255, 255,
+      0,   0,  32,  64, 176,   0,   0,   0,   0,   0,  64,   0,   4,   0,   0,   0,
+      0,   0,   0, 252,   0, 230,   0,   0,   0,   0,   0,  64,  73,   0,   0,   0,
+      0,   0,  24,   0, 192, 255,   0, 200,   0,  60,   0,   0,   0,   0,  16,  64,
+      0,   2,   0,  96, 255,  63,   0,   0,   0,   0, 192, 195,   0,   0, 255, 127,
+     48,   0,   1,   0,   0,   0,  12,  44,   0,   0,   3,   0,   0,   0,   1,   0,
+      0,   0, 248,   7,   0,   0, 128, 128,  16,   0,   0,   0,   0, 128,   0,   0,
+      0,   0,   0,   2,   0,   0,  16,   0,   0,   0,   0, 128,   0, 128,   0,  12,
+    254, 255, 255, 252,   0,   0,  80,  61,  32,   0,   0,   0,   0,   0,   0, 192,
+    191, 223, 255,   7,   0, 252,   0,   0,   0,   0,   0,   8, 255,   1,   0,   0,
+      0,   0, 255,   3,   1,   0,   0,   0,   0,  96,   0,   0,   0,   0,   0,  24,
+      0,  56,   0,   0,   0,   0,  96,   0,   0,   0, 112,  15, 255,   7,   0,   0,
+     49,   0,   0,   0, 255, 255, 255, 255, 127,  63,   0,   0, 255,   7, 240,  31,
+      0,   0,   0, 240,   0,   0,   0, 248, 255,   0,   8,   0,   0,   0,   0, 160,
+      3, 224,   0, 224,   0, 224,   0,  96,   0,   0, 255, 255, 255,   0, 255, 255,
+    255, 255, 255, 127,   0,   0,   0, 124,   0, 124,   0,   0, 123,   3, 208, 193,
+    175,  66,   0,  12,  31, 188,   0,   0,   0,  12, 255, 255, 127,   0,   0,   0,
+    255, 255,  63,   0,   0,   0, 240, 255, 255, 255, 207, 255, 255, 255, 191, 255,
+    224,   7,   0, 222, 255, 127, 255, 255, 255, 255,   7,   0, 255, 255, 255, 251,
+    255, 255,  15,   0,   0,   0, 255,  15,  30, 255, 255, 255,   1,   0, 193, 224,
+      0,   0, 195, 255,  15,   0,   0,   0,   0, 252, 255, 255, 255,   0,   1,   0,
+    255, 255,   1,   0,   0, 224,   0,   0,   0,   0,   8,  64,   0,   0, 252,   0,
+    255, 255, 127,   0,   3,   0,   0,   0,   0,   6,   0,   0,   0,  15, 192,   3,
+      0,   0, 240,   0,   0, 192,   0,   0,   0,   0,   0,  23, 254,  63,   0, 192,
+      0,   0, 128,   3,   0,  12,   0,   0,   0,   8,   0,   0,   0,   2,   0,   0,
+      0,   0, 252, 255,   0,   0,   0,  48, 255, 255, 247, 255, 127,  15,   0,   0,
+     63,   0,   0,   0, 127, 127,   0,  48,   7,   0,   0,   0,   0,   0, 128, 255,
+      0,   0,   0, 254, 255, 115, 255,  31, 255, 255, 255,  31,   0,   0, 128,   1,
+      0,   0, 255,   1,   0,   1,   0,   0,   0,   0, 127,   0,   0,   0,   0,  30,
+      0,  32,   0,   0,   0,   0, 224,   3, 128,  63,   0,   0,   0,   0,   0, 216,
+      0,   0,  48,   0, 224,  33,   0, 232,   0,   0,   0,  63,   0, 248,   0,  44,
+     64,   0,   0,   0, 254, 255, 255,   0,  14,   0,   0,   0, 255,  31,   0,   0,
+    112,   0,   0,   0,   0,   0,   0, 220,  62,   0,   0,   0,   0,   0, 224, 255,
+    255, 255,   3, 128,   0,   0,  31,   0,   0,   0,  32,   0,  48,   0,   0,   0,
+      0,   0, 128,   7,   0,   0,   0, 144, 127, 254, 255, 255,  31,  28,   0,   0,
+     24, 240, 255, 255, 255, 195, 255, 255,  35,   0,   0,   0,   2,   0,   0,   8,
+      8,   0,   0,   0,   0, 224, 223, 255, 239,  15,   0,   0,   0,  16,   1,   0,
+      0,  64,   0,   0, 255,  15, 255, 255, 255, 127, 254, 255, 254, 255, 254, 255,
+      0, 224, 255, 255, 255, 255,   0,   0, 192, 255, 255, 255,   7,   0, 255, 255,
+    255, 255, 255,  15, 255,   1,   3,   0, 255, 255, 255,   0, 255,  31, 255,  31,
+    255, 255, 255,   1, 255,  15,   0,   0, 255,   0, 255,   3, 255,  63,   3,   0,
+    255, 255, 255, 253, 255, 239, 255, 255, 255,  63,  31,   7, 127,   0, 255, 255,
+    255,   1, 127,   0,   7,   0, 127,   0
+};
+
+RE_UINT32 re_get_posix_punct(RE_UINT32 codepoint) {
+    RE_UINT32 field_2;
+    RE_UINT32 field_1;
+    RE_UINT32 field_0;
+    RE_UINT32 offset;
+    RE_UINT32 v;
+
+    field_2 = codepoint >> 10;
+    field_1 = (codepoint >> 5) & 0x1F;
+    field_0 = (codepoint >> 3) & 0x3;
+    offset = codepoint & 0x7;
+
+    v = re_posix_punct_table_1[field_2];
+    v = re_posix_punct_table_2[(v << 5) | field_1];
+    v = re_posix_punct_table_3[(v << 2) | field_0];
+
+    return (v >> offset) & 0x1;
+}
 
-static RE_UINT8 re_sentence_terminal_stage_4[] = {
-      0,   0,   0,   0,   2,  64,   0, 128,   0,   2,   0,   0,   0,   0,   0, 192,
-      0,   0,  16,   0,   7,   0,   0,   0,   0,   0,   0,   2,   0,   0, 128,  98,
-     48,   0,   0,   0,   0,  12,   0,   0, 132,   1,   0,   0,   0,  64,   0,   0,
-      0,   0,  96,   0,   8,   2,   0,   0,   0,  15,   0,   0,   0,   0,   0, 204,
-      0,   0,   0,  24,   0,   0,   0,  48, 128,   3,   0,   0,   0,  64,   0,  16,
-      4,   0,   0,   0,   0,   0,   0, 128,   0, 192,   0,   0,   0,   0, 136,   0,
-      0,   0, 192,   0,   0, 128,   0,   0,   0,   3,   0,   0,   0,   0,   0, 224,
-      0,   0,   3,   0,   0,   8,   0,   0,   0,   0, 196,   0,   2,   0,   0,   0,
-      0,   0, 224,   3, 128,   1,   0,   0,   3,   0,   0,   0,  14,   0,   0,   0,
-     96,  32,   0, 192,   0,   0,   0,  27,   0,  24,   0,   0,  12, 254, 255,   0,
-      6,   0,   0,   0,   0,   0,   0, 112,  12,   0,   0,   0,   0,   0, 128,   1,
-      0,   0,  32,   0,  16,   0,   0,   0,   0,   0,   0,   1,   0,   1,   0,   0,
-};
+/* Posix_XDigit. */
+RE_UINT32 re_get_posix_xdigit(RE_UINT32 codepoint) {
+    if (0x30 <= codepoint && codepoint <= 0x39)
+        return 1;
+    if (0x41 <= codepoint && codepoint <= 0x46)
+        return 1;
+    if (0x61 <= codepoint && codepoint <= 0x66)
+        return 1;
+
+    return 0;
+}
 
-/* Sentence_Terminal: 960 bytes. */
-
-RE_UINT32 re_get_sentence_terminal(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-
-    f = ch >> 13;
-    code = ch ^ (f << 13);
-    pos = (RE_UINT32)re_sentence_terminal_stage_1[f] << 5;
-    f = code >> 8;
-    code ^= f << 8;
-    pos = (RE_UINT32)re_sentence_terminal_stage_2[pos + f] << 3;
-    f = code >> 5;
-    code ^= f << 5;
-    pos = (RE_UINT32)re_sentence_terminal_stage_3[pos + f] << 5;
-    pos += code;
-    value = (re_sentence_terminal_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1;
-
-    return value;
+/* Prepended_Concatenation_Mark. */
+RE_UINT32 re_get_prepended_concatenation_mark(RE_UINT32 codepoint) {
+    if (0x0600 <= codepoint && codepoint <= 0x0605)
+        return 1;
+    if (codepoint == 0x06DD)
+        return 1;
+    if (codepoint == 0x070F)
+        return 1;
+    if (codepoint == 0x08E2)
+        return 1;
+    if (codepoint == 0x0110BD)
+        return 1;
+    if (codepoint == 0x0110CD)
+        return 1;
+
+    return 0;
 }
 
-/* Variation_Selector. */
+/* Print. */
+static RE_UINT8 re_print_table_1[] = {
+     0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 14, 13, 15, 16, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 17, 18, 18, 13, 13, 13, 13, 13, 13, 19, 20,
+    21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 18, 18, 13, 31, 18, 18,
+    18, 32, 18, 18, 18, 18, 18, 18, 18, 18, 33, 34, 13, 13, 13, 13,
+    13, 35, 13, 36, 18, 18, 18, 18, 18, 18, 18, 18, 37, 18, 18, 38,
+    18, 18, 18, 18, 39, 40, 41, 18, 42, 18, 43, 44, 45, 46, 47, 18,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 48, 13, 13, 13, 49, 50, 13,
+    13, 13, 13, 51, 13, 13, 13, 13, 13, 13, 52, 18, 18, 18, 53, 18,
+    13, 13, 13, 13, 54, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    55, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 56,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 56
+};
 
-static RE_UINT8 re_variation_selector_stage_1[] = {
-    0, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1,
+static RE_UINT16 re_print_table_2[] = {
+      0,   1,   1,   2,   0,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   3,   4,   5,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   6,   7,   1,   8,   1,   9,  10,
+     11,   1,   1,   1,   1,   1,   1,   1,  12,   1,  13,   1,   1,  14,   1,  15,
+      1,  16,  17,  18,   0,  19,  20,   1,   1,   1,   1,   1,  21,  22,  23,  24,
+     25,  26,  27,  28,  29,  30,  31,  32,  33,  30,  34,  35,  36,  37,  38,  39,
+     40,  41,  42,  43,  40,  44,  45,  46,  40,   1,  47,  48,  49,  50,  51,  52,
+     53,  54,  55,   0,  56,  57,  58,   0,   1,   1,  59,  60,  61,  11,  62,   0,
+      1,   1,   1,   1,   1,   1,  63,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,  64,   1,  65,  66,  67,   1,  68,   1,  15,  69,  70,   1,   1,  71,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,  69,   1,   1,  72,  73,  74,  75,  76,   1,   1,  77,  78,
+     79,   1,   1,  72,   1,  80,   1,  81,   2,  82,  83,  84,   1,  85,  86,   1,
+     87,   1,   2,  88,  78,  89,  90,   0,   1,   1,  85,  69,   1,   1,   1,  91,
+      1,  92,  93,   1,  94,  15,   9,  95,   1,   1,   1,   1,   1,   1,   1,  96,
+      1,   1,   1,   1,   1,   1,   1,   1,  71,   1,  97,  77,   1,  19,  98,  99,
+      1, 100,   1, 101, 102,   1, 103, 104,   1,   1,   1,   1,  85,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1, 105,  18,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1, 106, 107,   1,   1,   1,
+      1, 108,   2,   1,   1,   1,   1, 109,   1,  63,   1, 110,  74, 111, 111,   1,
+      1,   1, 112,   0,  96,   1,   1,  75,   1,   1,   1,   1,   1,   1,  81, 113,
+      1,   1,  53,   1,   7,   1,   1,   1, 114,   6,   1,   1, 108,   1,   1, 115,
+      2,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,  69,
+      1,   1,   1,   1, 116,   1, 117,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1, 118,   1,   1,   1,   1,   1, 119,   1,   1,   1,   1,   1,   1, 120, 121,
+      1, 122,   1, 119,   1,   1, 123,   1,   1,   1, 124,  69,   1,   1, 125,   2,
+      1,  74, 126,   1,   1,   1, 127,  74, 128, 129,   1,  85,   1,   1,   1, 130,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1, 115, 131,  55,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,  89,   1,   1,  70,   0, 132, 133, 134,   1,   1,   1, 135,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1, 103,   1, 136,   1, 137, 138,
+     70,   1, 139, 140,   1,   1,   1,  88,  53,   1,   1,   1,   1,   2, 141, 142,
+    143, 144, 145,   0,   1,   1,   1,  95, 146, 147,   1,   1, 102,  90, 103,  77,
+      0,   0,   0,   0,  69,   1, 104,  55,   1, 148,  80,  95, 149,   1, 150,   0,
+      1,   1,   1,   1,  77, 151, 152,  55,   1,   9,   1, 153,   0,   0,   0,   0,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,  74,  81, 137,   0,   0,   0,   0,
+    154, 155, 107,   1,   2, 156,   0, 157, 158, 159,   0,   0,   1, 160, 136,   1,
+    161, 162, 163,   1,   1,   0,   1, 164,   1, 165, 166, 167, 168, 169,   0,   0,
+      1,   1, 170,   0,   1, 112,   1, 171,   1, 172,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   2,   1, 173,   0,   0,   1,   9,  70,   0,   0, 103, 118,  74,
+      1,   1, 174, 175,   1,   1, 176, 177,   1,  19,   9,  74,   1,   1,   1, 178,
+    179,   2,   0,   0, 180, 151,   1, 181,  21, 182, 183, 184,   0,   0,   0,   0,
+      1,   1, 185, 186,   1,   1, 172,   0,   0,   0,   0,   0,   1, 166,  77,   0,
+      1,   1, 187, 188,   1,  72, 189,   0,  15,  85,   0,   0,   0,   0,   0,   0,
+      1,  55,   0,   0,   0,   1,   1, 190, 191, 192, 193,   0,   0, 100,   3, 194,
+      1,   1,   9,   1,   1, 195,   1,  72,   0,   0,   0,   0,   0,   0,   0,   0,
+    196, 197, 198, 116, 136, 199,   0,   0, 200, 201, 172, 202, 203, 189,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,  72,   0,   0,   0,   0,   0, 204,   1, 205,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,  70,   0,   0,   0,
+      1,   1,   1, 206,   1,   1,   1,   1,   1,   1, 207,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      1, 208,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1, 105,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,  72,   2, 209,   0,   0, 103, 210,   1,   1, 211, 212, 213,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   1,   1,  95,   0,   0,   0,   1,   1, 214,   1, 215,   0,   0, 216,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1, 119,
+      1,   1,   1,   1,   1,   1,  81,   0, 170,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      1,   1,   1,   1,   1,   1,   1,   1,   2,   0, 217, 218,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,  55,   0,   0,   0,   0,   0,   0,   0,   0,
+      1,   1,   1, 219, 220, 207,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      1,   1,   1,   1,   1,   1,   1,  81,   1, 221,   1,   1,   1,   1,   1, 170,
+      1,   1, 222,   0,   0,   0,   0,  75,   1,   1,  74,  72,   0,   0,   0,   0,
+      1,   1,  19,   1,  11, 223, 224,   1, 225, 226, 227,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1, 228,   1,   1,   1,   1,   1,   1,   1,   1, 229,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1, 230, 231,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    232, 233,   0,   0,   0,   0,   0,   0,   1, 234, 209,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   1, 159,   0,   0,   0,   0,   0,   0,   0,   0,
+      1,   1,   1,   1,   1,   1, 235,   0,   1,   1, 236,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0, 237,   1, 238,   0,   0,  53,  77,   0,   0,   0,   0,   0,   0,
+    224, 239, 240, 241, 242, 243,   0, 244,   0,   0,   0,   0,   0,   0,   0,   0,
+      1,  85,   1,   1,  75, 245, 246,  81,   1,   1,   1,   1,   1, 247,   0, 248,
+    249,  55, 250, 222,   0,   0,   0,   0,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1, 119, 251,   1,   1,   1,  75,   1,   1,  72, 118,
+     85,   1, 172,   1,   9, 252,   0,   0,   1,   1,   1, 253,   1,   1, 143,   1,
+      1,   1,  75, 254, 117, 255, 256,   0,   1,   1,   1,   1, 139,   1,  18, 257,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,  77,   0,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1, 238,   1,   1,   1,   1,   1,   1,
+     77,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1, 258,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,  90,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+     77,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,  18,   0,   0,   0,   0,   0,
+    259,   1,   1,   1,   0,   0,   0,   0,   1,   1,   1,   1,   1,   1,   1, 213,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,  77
 };
 
-static RE_UINT8 re_variation_selector_stage_2[] = {
-    0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2,
-    3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+static RE_UINT8 re_print_table_3[] = {
+      0,   0,   0,   0, 255, 255, 255, 255, 255, 255, 255, 127, 255, 255, 255, 252,
+    240, 215, 255, 255, 251, 255, 255, 255, 255, 255, 254, 255, 255, 255, 127, 254,
+    255, 231, 254, 255, 255,   0, 255, 255, 255, 135,  31,   0, 255, 255, 255, 223,
+    255, 191, 255, 255, 255, 231, 255, 255, 255, 255,   3,   0, 255, 255, 255, 231,
+    255,  63, 255, 127, 255, 255, 255,  79, 255,   7,   0,   0, 255, 255, 223, 255,
+    255,   0, 248, 255, 239, 159, 249, 255, 255, 253, 197, 243, 159, 121, 128, 176,
+    207, 255, 255, 127, 238, 135, 249, 255, 255, 253, 109, 211, 135,  57,   2,  94,
+    192, 255, 127,   0, 238, 191, 251, 255, 255, 253, 237, 243, 191,  59,   1,   0,
+    207, 255,   3, 254, 238, 159, 249, 255, 159,  57, 224, 176, 207, 255, 255,   0,
+    236, 199,  61, 214,  24, 199, 255, 195, 199,  61, 129,   0, 192, 255, 255,   7,
+    255, 223, 253, 255, 255, 253, 255, 227, 223,  61,  96,   7, 207, 255, 128, 255,
+    255, 253, 239, 243, 223,  61,  96,  64, 207, 255,   6,   0, 223, 253, 240, 255,
+    207, 255, 255, 255, 238, 255, 127, 252, 255, 255, 251,  47, 127, 132,  95, 255,
+    192, 255,  28,   0, 254, 255, 255, 255, 255, 255, 255, 135, 255, 255, 255,  15,
+    214, 247, 255, 255, 175, 255, 255,  63,  95,  63, 255, 243, 255, 254, 255, 255,
+    255,  31, 254, 255, 255, 255, 255, 254, 255, 223, 255,   7, 191,  32, 255, 255,
+    255,  61, 127,  61, 255,  61, 255, 255, 255, 255,  61, 127,  61, 255, 127, 255,
+    255, 255,  61, 255, 255, 255, 255,  31, 255, 255, 255,   3, 255, 255,  63,  63,
+    255, 255, 255,   1, 255, 223,  31,   0, 255, 255, 127,   0, 255, 255,  15,   0,
+    255, 223,  13,   0, 255, 255, 255,  63, 255,   3, 255,   3, 255, 127, 255,   3,
+    255,   7, 255, 255, 255, 255,  63,   0, 255,  15, 255,  15, 241, 255, 255, 255,
+    255,  63,  31,   0, 255,  15, 255, 255, 255,   3, 255, 199, 255, 255, 255, 207,
+    255, 255, 255, 159, 255,  63, 255, 255,   1,   0,   0,   0, 255, 255,  15, 240,
+    255, 255, 255, 248, 255, 227, 255, 255, 255,   1, 255, 255, 255, 255, 255,   7,
+    255, 255, 255, 251,  63,  63, 255, 170, 223, 255, 207, 239, 255, 255, 220, 127,
+    255, 252, 255, 255, 223, 255, 243, 255, 255, 127, 255,  31,   0,   0, 255, 255,
+    255, 255,   1,   0, 127,   0,   0,   0, 255, 255, 207, 255, 255, 255, 191, 255,
+    255, 127, 255, 255, 255, 255,  15, 254, 255, 128,   1, 128, 127, 127, 127, 127,
+    255, 255,   7,   0,   0,   0, 255,  15, 224, 255, 255, 255,  15,   0, 255, 255,
+    255,  31, 255, 255, 127,   0, 255, 255, 255,  15,   0,   0, 255, 255, 255,   0,
+    252,   7,   0,   0,   0,   0, 224, 255, 255,  31, 255,   3,  63, 192, 255,   3,
+    255, 255,  15, 128, 255, 191, 255, 195, 255,  63, 255, 243,   7,   0,   0, 248,
+    126, 126, 126,   0, 127, 127, 255, 255, 255,  63, 255,   3, 127, 248, 255, 255,
+    127,   0, 248, 224, 255, 255, 127,  95, 219, 255, 255, 255,   3,   0, 248, 255,
+    255, 255, 252, 255, 255,   0,   0,   0,   0,   0, 255,  63, 255, 255, 247, 255,
+    127,  15, 223, 255, 252, 252, 252,  28, 127, 127,   0,  62, 255, 239, 255, 255,
+    127, 255, 255, 183, 255,  63, 255,  63, 135, 255, 255, 255, 255, 255, 143, 255,
+     15, 224, 255, 255, 255, 255, 255, 191,  15, 255,  63,   0, 255,   3, 255, 255,
+    255, 255,  15, 255,  15, 128,   0,   0,  63, 253, 255, 255, 255, 255, 191, 145,
+    128, 255,   0,   0, 255, 255,  55, 248, 255, 255, 255, 143, 255, 255, 255, 131,
+    255, 255, 255, 240, 111, 240, 239, 254, 255, 255,  63, 135, 255,   1, 255,   1,
+    127, 248, 127,   0, 255, 255,  63, 254, 255, 255,  63, 255, 255, 255,   7, 255,
+    255, 255,   3,  30,   0, 254,   0,   0, 255,   1,   0,   0, 255, 255,   7, 252,
+    255,   0, 255,   3, 255,  59,   3,   0, 255,  63, 252, 255, 255, 255,   0, 128,
+      3,  32, 255, 255, 255,   1, 255,   3, 254, 255,  31,   0, 255, 255, 251, 255,
+    127, 189, 255, 191, 255,   7, 255,   3, 255, 253, 237, 251, 159,  57, 129, 224,
+    207,  31,  31,   0, 255, 255, 255, 239,   3,   0,   0,   0,  31,   0, 255,   3,
+    255,  31,   0,   0, 255,   3,   0,   0, 255, 255,   7, 128, 127, 242, 111, 255,
+    255, 255, 191, 249, 127,   0, 255,   3,  31,   0,   0,   0,   7,   0,   0,   0,
+    255, 253, 255, 255, 255, 255, 127, 255,  63,   0, 255, 255, 255, 254, 127,   0,
+    127, 251, 255, 255, 255, 255, 127, 180, 191, 253, 255, 255, 255, 127, 251,   1,
+      0,   0,   1,   0, 255, 255,   3, 128, 255, 127,  31,   0,  15,   0,   0,   0,
+    255, 127, 255,   1, 255, 195,   0,   0, 255,  63,  63,   0,  63,   0, 255, 251,
+    251, 255, 255, 224, 255, 255,   0,   0, 255, 135, 255, 255, 255, 128, 255, 255,
+     31,   0,   3,   0,   0,   0,   7,   0, 240,   0, 255, 255, 255,   7, 255,  31,
+    255,   1, 255, 243, 127, 254, 255, 255,  63,   0,   0,   0, 100, 222, 255, 235,
+    239, 255, 255, 255, 191, 231, 223, 223, 255, 255, 255, 123,  95, 252, 253, 255,
+     63, 255, 255, 255, 255, 207, 255, 255, 255,  15,   0, 248, 254, 255,   0,   0,
+    127, 255, 255, 249, 219,   7,   0,   0, 255,  31, 255,  63, 159, 255, 127,   0,
+    255,  15, 255, 195,   0,   0, 254, 255, 255, 255,  31,   0, 150, 254, 247,  10,
+    132, 234, 150, 170, 150, 247, 247,  94, 255, 251, 255,  15, 238, 251, 255,  15,
+      0,   0,   3,   0, 255, 127, 254, 255, 254, 255, 254, 255, 255,  63,   0,   0,
+    192, 255, 255, 255,   7,   0, 255, 255, 255,   1,   3,   0, 255,  31, 255,  31,
+    255,  63,   3,   0, 255, 255, 255, 253, 255,  63,  31,   7, 255,   1, 127,   0,
+      7,   0, 127,   0,   0,   0, 255,   3,   3,   0, 255, 255,   2,   0,   0,   0
 };
 
-static RE_UINT8 re_variation_selector_stage_3[] = {
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 3, 3, 3, 4, 0, 0, 0, 0, 0, 0, 0, 0,
-};
+RE_UINT32 re_get_print(RE_UINT32 codepoint) {
+    RE_UINT32 field_2;
+    RE_UINT32 field_1;
+    RE_UINT32 field_0;
+    RE_UINT32 offset;
+    RE_UINT32 v;
 
-static RE_UINT8 re_variation_selector_stage_4[] = {
-      0,   0,   0,   0,   0,   0,   0,   0,   0,  56,   0,   0,   0,   0,   0,   0,
-    255, 255,   0,   0,   0,   0,   0,   0, 255, 255, 255, 255, 255, 255, 255, 255,
-    255, 255, 255, 255, 255, 255,   0,   0,
-};
+    field_2 = codepoint >> 10;
+    field_1 = (codepoint >> 5) & 0x1F;
+    field_0 = (codepoint >> 3) & 0x3;
+    offset = codepoint & 0x7;
 
-/* Variation_Selector: 236 bytes. */
-
-RE_UINT32 re_get_variation_selector(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-
-    f = ch >> 14;
-    code = ch ^ (f << 14);
-    pos = (RE_UINT32)re_variation_selector_stage_1[f] << 4;
-    f = code >> 10;
-    code ^= f << 10;
-    pos = (RE_UINT32)re_variation_selector_stage_2[pos + f] << 4;
-    f = code >> 6;
-    code ^= f << 6;
-    pos = (RE_UINT32)re_variation_selector_stage_3[pos + f] << 6;
-    pos += code;
-    value = (re_variation_selector_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1;
-
-    return value;
-}
+    v = re_print_table_1[field_2];
+    v = re_print_table_2[(v << 5) | field_1];
+    v = re_print_table_3[(v << 2) | field_0];
 
-/* Pattern_White_Space. */
+    return (v >> offset) & 0x1;
+}
 
-static RE_UINT8 re_pattern_white_space_stage_1[] = {
-    0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+/* Quotation_Mark. */
+static RE_UINT8 re_quotation_mark_table_1[] = {
+    0, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 3, 4, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 5,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
     1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1,
-};
-
-static RE_UINT8 re_pattern_white_space_stage_2[] = {
-    0, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1,
     1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
     1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
     1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-};
-
-static RE_UINT8 re_pattern_white_space_stage_3[] = {
-    0, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
     1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-};
-
-static RE_UINT8 re_pattern_white_space_stage_4[] = {
-      0,  62,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     32,   0,   0,   0,   0,   0,   0,   0,   0, 192,   0,   0,   0,   3,   0,   0,
-};
-
-/* Pattern_White_Space: 178 bytes. */
-
-RE_UINT32 re_get_pattern_white_space(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-
-    f = ch >> 15;
-    code = ch ^ (f << 15);
-    pos = (RE_UINT32)re_pattern_white_space_stage_1[f] << 5;
-    f = code >> 10;
-    code ^= f << 10;
-    pos = (RE_UINT32)re_pattern_white_space_stage_2[pos + f] << 4;
-    f = code >> 6;
-    code ^= f << 6;
-    pos = (RE_UINT32)re_pattern_white_space_stage_3[pos + f] << 6;
-    pos += code;
-    value = (re_pattern_white_space_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1;
-
-    return value;
-}
-
-/* Pattern_Syntax. */
-
-static RE_UINT8 re_pattern_syntax_stage_1[] = {
-    0, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
     1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
     1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
     1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1,
-};
-
-static RE_UINT8 re_pattern_syntax_stage_2[] = {
-    0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    2, 3, 4, 5, 3, 3, 1, 6, 7, 1, 1, 1, 1, 1, 1, 1,
     1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
     1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
     1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 8, 9,
-};
-
-static RE_UINT8 re_pattern_syntax_stage_3[] = {
-     0,  1,  2,  3,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
-     5,  6,  4,  4,  4,  4,  7,  8,  8,  8,  8,  8,  8,  8,  8,  8,
-     8,  9,  4,  4,  8,  8,  8,  8,  8,  8,  8,  8,  8, 10, 11,  8,
-     8,  8,  4,  4,  4,  4,  4,  4, 12,  4,  4,  4,  4,  4,  4,  4,
-     4,  4,  4,  4, 13,  4,  4,  4,  4, 14,  4,  4,  4,  4,  4,  4,
-};
-
-static RE_UINT8 re_pattern_syntax_stage_4[] = {
-      0,   0,   0,   0, 254, 255,   0, 252,   1,   0,   0, 120,   1,   0,   0, 120,
-      0,   0,   0,   0, 254,  90,  67, 136,   0,   0, 128,   0,   0,   0, 128,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 255, 255, 255,   0, 255, 127,
-    254, 255, 239, 127,   0,   0,   0,   0,   0,   0, 255, 255, 255, 255, 255, 255,
-    255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,   0,   0,   0,   0,
-    255, 255, 255, 255, 255, 255,  63,   0,   0,   0, 240, 255, 255, 255, 255, 255,
-     14, 255, 255, 255,   1,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0, 192,
-     96,   0,   0,   0,   0,   0,   0,   0,
-};
-
-/* Pattern_Syntax: 364 bytes. */
-
-RE_UINT32 re_get_pattern_syntax(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-
-    f = ch >> 14;
-    code = ch ^ (f << 14);
-    pos = (RE_UINT32)re_pattern_syntax_stage_1[f] << 5;
-    f = code >> 9;
-    code ^= f << 9;
-    pos = (RE_UINT32)re_pattern_syntax_stage_2[pos + f] << 3;
-    f = code >> 6;
-    code ^= f << 6;
-    pos = (RE_UINT32)re_pattern_syntax_stage_3[pos + f] << 6;
-    pos += code;
-    value = (re_pattern_syntax_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1;
-
-    return value;
-}
-
-/* Prepended_Concatenation_Mark. */
-
-static RE_UINT8 re_prepended_concatenation_mark_stage_1[] = {
-    0, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
     1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
     1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
     1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
 };
 
-static RE_UINT8 re_prepended_concatenation_mark_stage_2[] = {
-    0, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+static RE_UINT8 re_quotation_mark_table_2[] = {
+    0, 1, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-};
-
-static RE_UINT8 re_prepended_concatenation_mark_stage_3[] = {
     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 2, 3, 0, 0, 0,
-    0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 5, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-};
-
-static RE_UINT8 re_prepended_concatenation_mark_stage_4[] = {
-      0,   0,   0,   0,   0,   0,   0,   0,  63,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,  32,   0,   0,   0,   0,   0, 128,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   4,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  32,
-      0,  32,   0,   0,   0,   0,   0,   0,
-};
-
-/* Prepended_Concatenation_Mark: 236 bytes. */
-
-RE_UINT32 re_get_prepended_concatenation_mark(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-
-    f = ch >> 14;
-    code = ch ^ (f << 14);
-    pos = (RE_UINT32)re_prepended_concatenation_mark_stage_1[f] << 4;
-    f = code >> 10;
-    code ^= f << 10;
-    pos = (RE_UINT32)re_prepended_concatenation_mark_stage_2[pos + f] << 4;
-    f = code >> 6;
-    code ^= f << 6;
-    pos = (RE_UINT32)re_prepended_concatenation_mark_stage_3[pos + f] << 6;
-    pos += code;
-    value = (re_prepended_concatenation_mark_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1;
-
-    return value;
-}
-
-/* Regional_Indicator. */
-
-static RE_UINT8 re_regional_indicator_stage_1[] = {
-    0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0,
-};
-
-static RE_UINT8 re_regional_indicator_stage_2[] = {
+    3, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0,
-};
-
-static RE_UINT8 re_regional_indicator_stage_3[] = {
     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 7, 0, 0, 0, 0, 0, 1, 0, 0, 8, 0, 0, 0, 0
 };
 
-static RE_UINT8 re_regional_indicator_stage_4[] = {
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 192, 255, 255, 255,
+static RE_UINT8 re_quotation_mark_table_3[] = {
+      0,   0,   0,   0, 132,   0,   0,   0,   0,   8,   0,   8,   0,   0,   0, 255,
+      0,   0,   0,   6,   4,   0,   0,   0,   0, 240,   0, 224,  30,   0,   0,   0,
+     12,   0,   0,   0
 };
 
-/* Regional_Indicator: 130 bytes. */
-
-RE_UINT32 re_get_regional_indicator(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-
-    f = ch >> 15;
-    code = ch ^ (f << 15);
-    pos = (RE_UINT32)re_regional_indicator_stage_1[f] << 4;
-    f = code >> 11;
-    code ^= f << 11;
-    pos = (RE_UINT32)re_regional_indicator_stage_2[pos + f] << 4;
-    f = code >> 7;
-    code ^= f << 7;
-    pos = (RE_UINT32)re_regional_indicator_stage_3[pos + f] << 7;
-    pos += code;
-    value = (re_regional_indicator_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1;
-
-    return value;
-}
-
-/* Hangul_Syllable_Type. */
-
-static RE_UINT8 re_hangul_syllable_type_stage_1[] = {
-    0, 1, 1, 1, 1, 2, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1,
-};
+RE_UINT32 re_get_quotation_mark(RE_UINT32 codepoint) {
+    RE_UINT32 field_2;
+    RE_UINT32 field_1;
+    RE_UINT32 field_0;
+    RE_UINT32 offset;
+    RE_UINT32 v;
 
-static RE_UINT8 re_hangul_syllable_type_stage_2[] = {
-     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0,  0,  0,  0,  2,  0,  0,  3,  4,  5,  6,
-     7,  8,  9,  3,  4,  5,  6,  7,  8,  9,  3,  4,  5,  6,  7,  8,
-     9,  3,  4,  5,  6,  7,  8,  9,  3,  4,  5,  6,  7,  8,  9,  3,
-     4,  5,  6,  7,  8,  9,  3, 10,  0,  0,  0,  0,  0,  0,  0,  0,
-};
+    field_2 = codepoint >> 10;
+    field_1 = (codepoint >> 5) & 0x1F;
+    field_0 = (codepoint >> 3) & 0x3;
+    offset = codepoint & 0x7;
 
-static RE_UINT8 re_hangul_syllable_type_stage_3[] = {
-     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     1,  1,  1,  1,  1,  1,  2,  2,  2,  2,  3,  4,  4,  4,  4,  4,
-     0,  0,  0,  0,  0,  0,  1,  5,  0,  0,  0,  0,  0,  0,  0,  0,
-     6,  7,  8,  9,  8, 10,  8,  6,  7,  8,  9,  8, 10,  8,  6,  7,
-     8,  9,  8, 10,  8,  6,  7,  8,  9,  8, 10,  8,  6,  7,  8,  9,
-     8, 10,  8,  6,  7,  8,  9,  8, 10,  8,  6,  7,  8,  9,  8, 10,
-     8,  6,  7,  8,  9,  8, 10,  8,  6,  7,  8,  9,  8, 10,  8,  6,
-     7,  8,  9,  8, 10,  8,  6,  7,  8,  9,  8, 10,  8,  6,  7,  8,
-     9,  8, 10,  8,  6,  7,  8,  9,  8, 10,  8,  6,  7,  8,  9,  8,
-    10,  8,  6,  7,  8,  9,  8, 10,  8,  6,  7,  8,  9,  8, 10,  8,
-     8,  9,  8, 10,  8,  6,  7,  8,  9,  8, 11,  2, 12,  4,  4, 13,
-};
+    v = re_quotation_mark_table_1[field_2];
+    v = re_quotation_mark_table_2[(v << 5) | field_1];
+    v = re_quotation_mark_table_3[(v << 2) | field_0];
 
-static RE_UINT8 re_hangul_syllable_type_stage_4[] = {
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3,
-    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0,
-    4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
-    5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 4, 5, 5, 5,
-    5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
-    5, 5, 5, 5, 5, 5, 5, 5, 4, 5, 5, 5, 5, 5, 5, 5,
-    5, 5, 5, 5, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
-    5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 3, 3, 3, 3, 3,
-    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0,
-};
+    return (v >> offset) & 0x1;
+}
 
-/* Hangul_Syllable_Type: 664 bytes. */
-
-RE_UINT32 re_get_hangul_syllable_type(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-
-    f = ch >> 13;
-    code = ch ^ (f << 13);
-    pos = (RE_UINT32)re_hangul_syllable_type_stage_1[f] << 5;
-    f = code >> 8;
-    code ^= f << 8;
-    pos = (RE_UINT32)re_hangul_syllable_type_stage_2[pos + f] << 4;
-    f = code >> 4;
-    code ^= f << 4;
-    pos = (RE_UINT32)re_hangul_syllable_type_stage_3[pos + f] << 4;
-    value = re_hangul_syllable_type_stage_4[pos + code];
-
-    return value;
+/* Radical. */
+RE_UINT32 re_get_radical(RE_UINT32 codepoint) {
+    if (0x2E80 <= codepoint && codepoint <= 0x2E99)
+        return 1;
+    if (0x2E9B <= codepoint && codepoint <= 0x2EF3)
+        return 1;
+    if (0x2F00 <= codepoint && codepoint <= 0x2FD5)
+        return 1;
+
+    return 0;
 }
 
-/* Bidi_Class. */
+/* Regional_Indicator. */
+RE_UINT32 re_get_regional_indicator(RE_UINT32 codepoint) {
+    if (0x01F1E6 <= codepoint && codepoint <= 0x01F1FF)
+        return 1;
 
-static RE_UINT8 re_bidi_class_stage_1[] = {
-     0,  1,  2,  3,  4,  5,  5,  5,  5,  5,  6,  5,  5,  5,  5,  7,
-     8,  9,  5,  5,  5,  5, 10,  5,  5,  5,  5, 11,  5, 12, 13, 14,
-     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5, 15,
-     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5, 15,
-     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5, 15,
-     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5, 15,
-     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5, 15,
-     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5, 15,
-     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5, 15,
-     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5, 15,
-     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5, 15,
-     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5, 15,
-     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5, 15,
-     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5, 15,
-    16,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5, 15,
-     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5, 15,
-     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5, 15,
-};
+    return 0;
+}
 
-static RE_UINT8 re_bidi_class_stage_2[] = {
-      0,   1,   2,   3,   4,   4,   4,   4,   4,   4,   5,   6,   7,   8,   9,  10,
-      4,   4,  11,   4,   4,   4,  12,  13,  14,  15,  16,  17,  18,  19,  20,  21,
-     22,  23,  24,  25,  26,  27,  28,  29,  30,  31,  30,  32,  33,  34,  35,  36,
-     37,  38,  28,  39,  40,  41,   4,  42,  43,  44,  45,  46,  47,  48,  49,  50,
-     51,  52,  53,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,  54,  55,   4,
-     56,   4,   4,   4,   4,   4,   4,   4,   4,   4,  57,   4,  58,  59,  60,  61,
-     62,   4,  63,   4,  64,  65,   4,  66,  67,  68,  69,   4,  70,  71,  72,  73,
-     74,   4,   4,  75,   4,   4,   4,  76,   4,   4,   4,   4,   4,   4,  77,  78,
-     79,  80,  81,  82,  83,  84,  85,  86,  87,  86,  86,  86,  88,  89,  90,  86,
-     91,  92,  93,  94,  86,  86,  86,  86,  86,  86,  95,  86,  86,  86,  86,  86,
-      4,   4,   4,   4,  86,  86,  86,  86,  86,  86,  86,  86,  86,  96,  97,  86,
-      4,   4,   4,  98,   4,  99,   4, 100,  86, 101, 102, 103,  86,  86,  86, 104,
-    105,   4, 106, 107,   4,   4,   4, 108, 109, 110, 111, 112,   4, 113,   4, 114,
-      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
-      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
-      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
-      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
-      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
-      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
-      4,   4,   4,   4,   4,   4,   4,  86,   4,   4,   4,   4,   4,   4,   4,   4,
-      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
-      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
-      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
-      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
-      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
-      4,   4, 115, 116,   4,   4,   4,   4, 117, 118, 119, 120, 121,   4, 122,   4,
-    123, 124,   4, 125, 126, 127, 128, 129, 130, 131, 132, 133,   4,   4,   4, 134,
-      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
-      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
-      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
-      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4, 135, 136,  16,  16,
-     16,  16,  16,  16, 137,  16,  16, 138, 139, 140,  16, 141, 142, 143,   4, 144,
-      4,   4,   4,   4, 145,  86, 146, 147,   4,   4,   4, 148,   4, 149,   4,   4,
-      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
-    150, 150, 150, 150, 151, 150, 150, 150, 152, 150, 150, 153, 154, 150, 150, 150,
-    150, 150, 150, 150, 155, 150, 150, 150, 150, 156, 150, 150, 157, 158, 150, 150,
-    159, 160, 161,   4, 162, 163, 164, 165, 166,   4,   4, 167,  40, 168,   4,   4,
-    169, 170, 171, 172,   4,   4, 173, 174, 175, 176, 177,   4, 178,   4,   4,   4,
-    179,   4,   4,   4,   4,   4,   4, 180, 181, 182, 183,   4,   4,   4,   4,   4,
-    184,   4, 185,   4, 186, 187, 188,   4,   4,   4,   4, 189,   4,   4,   4, 190,
-      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
-      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
-      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4, 191, 192,   4,   4,   4,
-      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4, 193, 194, 195,
-      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
-      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
-      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
-      4,   4, 196,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
-      4,   4,   4,   4,   4, 197, 198,   4,  86, 199,   4,   4,  86, 200,   4,   4,
-      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4, 201, 202, 203, 204, 205,
-      4,   4,   4,   4,   4,   4,   4,   4, 206, 207, 208,   4,   4,   4,   4,   4,
-      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
-    209,   4,   4,   4, 192,   4,   4,   4,   4,   4,   4, 210,   4,   4,   4,   4,
-      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
-    150, 150, 150, 211, 150, 212, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150,
-    150, 157,  16, 150,  16, 213, 150, 150,  16,  16,  16, 214, 150, 150, 150, 150,
-    215,  86, 216, 217, 218, 219,   4,   4,   4, 220,   4,   4,  86,  86,  86,  86,
-     86,  86,  86,  86,  86,  86,  86,  86,  86,  86,  86, 221,  86, 103,  86, 222,
-    223, 224, 225,   4, 226, 227, 228, 229,  86, 230, 231,   4,   4,   4,   4,   4,
-      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4, 232,
+/* Script. */
+static RE_UINT8 re_script_table_1[] = {
+     0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 13, 13,
+    13, 13, 13, 14, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 15, 16, 17, 18, 19, 19, 19, 19, 19,
+    19, 19, 19, 19, 19, 20, 21, 21, 21, 21, 21, 21, 21, 21, 22, 23,
+    24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 21, 21, 34, 35, 21, 21,
+    21, 36, 21, 21, 21, 21, 21, 21, 21, 21, 37, 38, 39, 39, 39, 39,
+    39, 40, 41, 42, 21, 21, 21, 21, 21, 21, 21, 21, 43, 21, 21, 44,
+    21, 21, 21, 21, 45, 46, 47, 21, 48, 21, 49, 50, 51, 52, 53, 21,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 54, 13, 13, 13, 55, 56, 13,
+    13, 13, 13, 57, 13, 13, 13, 13, 13, 13, 58, 21, 21, 21, 59, 21,
+    13, 13, 13, 13, 60, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    61, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21
+};
+
+static RE_UINT16 re_script_table_2[] = {
+      0,   0,   1,   1,   0,   2,   3,   3,   4,   4,   4,   4,   4,   4,   4,   4,
+      4,   4,   4,   4,   4,   5,   0,   6,   7,   7,   7,   8,   9,  10,  11,  12,
+     13,  13,  13,  13,  14,  13,  13,  13,  13,  15,  16,  17,  18,  19,  20,  21,
+     22,  23,  24,  25,  23,  23,  26,  23,  27,  28,  29,  23,  30,  31,  32,  33,
+     34,  35,  36,  37,  38,  39,  40,  41,  42,  42,  43,  44,  45,  46,  47,  48,
+     49,  50,  51,  52,  53,  54,  55,  56,  57,  58,  59,  60,  61,  62,  63,  64,
+     65,  66,  67,  68,  69,  70,  71,  72,  73,  74,  75,  76,  77,  78,  79,  80,
+     81,  82,  83,  38,  84,  85,  86,  38,  87,  87,  88,  89,  90,  91,  92,  38,
+     93,  93,  93,  93,  93,  94,  95,  96,  97,  97,  97,  97,  97,  97,  97,  97,
+     98,  98,  99,  98, 100, 101, 102,  98, 103,  98, 104, 105, 106, 107, 107, 108,
+    109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109,
+    109, 109, 109, 109, 110, 111, 111, 112, 113, 114, 115, 116, 117, 117, 118, 119,
+    120, 121, 121, 122, 121, 123, 109, 124, 125, 126, 127, 128, 129, 130, 131, 117,
+    132, 133, 134, 135, 136, 137, 138,  38, 139, 139, 140, 141, 142, 142, 143, 144,
+    145, 146, 147, 148, 149, 150, 151, 152,   4, 153, 154, 155,   4, 156,   7, 157,
+      4,   4,   4,   4,   4,   4,   4,   4, 158,  11, 159, 160,  11, 161, 162, 163,
+    164,   0,   0, 165, 166,   0, 167, 168,   0, 169, 170,   4, 171,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0, 172, 173,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    174, 174, 174, 174, 174, 174, 174, 174,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 175, 176,   0,   0,   0,
+    177, 178, 179,   4, 180, 180, 180, 181,  94, 182, 183, 184, 185, 186, 186,  13,
+      0,   0, 187,  38, 188, 189, 189, 190, 189, 189, 189, 189, 189, 189, 191, 192,
+    193, 194, 195, 196, 197, 198, 199, 200, 201, 202,  97,  97, 203, 204,   0, 205,
+    206,   0,   0, 207,   0,   0, 208, 209, 199, 199, 210,   0,   0,   0,   0,   0,
+    189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189,
+    189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189,
+    189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189,   0,   0,
+    189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189,
+    189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189,
+    189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 211,
+    212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212,
+    212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212,
+    212, 212, 212, 212, 213, 212, 214, 215, 216, 216, 216, 216, 216, 216, 216, 216,
+    216, 217,  13,  13,  13, 218, 218, 219,   0, 220,   4,   4, 221,   4, 222, 223,
+    224, 225, 226, 227, 228, 228, 229,  42, 230, 231, 232, 233, 234, 234, 235, 236,
+    237, 238, 239,  93, 240, 240, 241, 242, 243, 244, 245, 246, 107, 107, 247, 248,
+     97,  97,  97,  97,  97,  97,  97,  97,  97,  97,  97,  97,  97,  97,  97,  97,
+     97,  97,  97,  97,  97,  97,  97,  97,  97,  97,  97,  97,  97,  97,  97,  97,
+     97,  97,  97,  97,  97,  97,  97,  97,  97,  97,  97,  97,  97,  97,  97,  97,
+     97,  97,  97,  97,  97,  97,  97,  97,  97,  97,  97,  97,  97, 249, 250, 251,
+     38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,
+     38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,
+     38,  38,  38,  38,  38,  38,  38,  38, 189, 189, 189, 189, 189, 189, 189, 189,
+    189, 189, 189, 252, 189, 189, 253,  38, 254, 255, 256,  23,  23,  23, 257,  23,
+     23,  23,  23,  23,  23,  23,  23,  23,  23, 258, 259,  23, 260,  23, 261, 262,
+    263, 264, 265, 266,  23,  23,  23, 267, 268,   1,   1, 269, 270, 206, 271, 272,
+    273, 274, 275,  38, 276, 276, 276, 277, 278, 279,  11,  11, 280, 281, 282, 283,
+     38,  38,  38,  38, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294,  38,
+    295, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305,  38,  38,  38,  38,
+    306, 306, 306, 306, 306, 306, 306, 306, 306, 307, 308, 309,  38,  38,  38,  38,
+    310, 311, 312, 313, 314, 315,  38, 316, 317, 318,  38,  38, 319, 320, 321, 322,
+    323, 324, 325, 326, 327,  38, 328, 329, 330, 331, 332, 333, 334, 335,  38,  38,
+    336, 336, 337,  38, 338, 339, 338, 340, 341, 342,  38,  38,  38,  38,  38,  38,
+     38,  38,  38, 343, 344, 345,  38,  38, 346, 347, 348,  38,  38, 349, 350, 351,
+    352, 352, 353, 354, 355, 355, 356, 357, 358, 359, 360, 361, 362, 362, 362, 363,
+    364, 365,  38,  38, 366, 367, 368, 369, 370, 371, 372, 373,  38,  38,  38,  38,
+    374, 374, 375, 376, 377, 377, 378,  38,  38,  38,  38,  38, 379, 380, 381,  38,
+    382, 382, 383, 384, 385, 386, 387,  38, 388, 389,  38,  38,  38,  38,  38,  38,
+    390, 391,  38,  38,  38, 392, 392, 393, 394, 395, 396,  38,  38, 397, 398, 399,
+    400, 400, 401, 402, 402, 403, 404, 405,  38,  38,  38,  38,  38,  38,  38,  38,
+    406, 407, 408, 409, 410, 411,  38,  38, 412, 413, 414, 415, 416, 417,  38,  38,
+     38,  38,  38,  38,  38,  38,  38, 418,  38,  38,  38,  38,  38, 419, 420, 421,
+    422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422,
+    422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 423,  38,  38,  38,
+    422, 422, 422, 424, 422, 422, 422, 422, 422, 422, 425,  38,  38,  38,  38,  38,
+     38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,
+    426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426,
+    426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426,
+    426, 427,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,
+     38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,
+    428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428,
+    428, 428, 429,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,
+    218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218,
+    218, 430, 431, 432,  38,  38, 433, 434, 435, 435, 436, 437, 438,  38,  38,  38,
+     38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,
+     38,  38, 439, 439, 440,  38,  38,  38, 441, 441, 442, 441, 443,  38,  38, 444,
+    445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445,
+    445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445,
+    445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445,
+    445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 446,
+    445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445,
+    445, 445, 445, 445, 445, 445, 445, 445, 447, 447, 447, 447, 447, 447, 447, 447,
+    447, 447, 447, 447, 447, 447, 448,  38, 449,  38,  38,  38,  38,  38,  38,  38,
+     38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,
+    450, 196, 196, 196, 196, 196, 196, 196, 451,  38, 452, 453, 454, 454, 454, 454,
+    454, 454, 454, 454, 454, 454, 454, 455,  38,  38,  38,  38,  38,  38,  38,  38,
+    456, 456, 456, 457, 458, 459,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,
+     38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,
+      0,   0,   0,   0,   0,   0,   0, 460,   0, 461,   0, 462, 463, 464,   0, 465,
+     11,  11, 466,  38,  38,  38,  38, 467,   0,   0, 468, 469,  38,  38,  38,  38,
+      0,   0, 470,   0, 471, 472, 473,   0, 474, 475, 476,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0, 477,   0,   0,   0,   0,   0,   0,   0,   0, 478,   0,
+    479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479,
+    479, 479, 479, 479, 480, 481,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,
+    482, 483,  38,  38,  38,  38,  38,  38, 484, 485, 486,  38,  38,  38,  38,  38,
+     38,  38,  38,  38,  38,  38, 487, 488,  38,  38,  38,  38,  38,  38,  38,  38,
+    489, 489, 489, 489, 489, 489, 490,  38, 491, 491, 492,  38,  38,  38,  38,  38,
+     38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,
+     38,  38,  38, 493,   0, 494,  38,  38, 268, 495,  38,  38,  38,  38,  38,  38,
+    496, 497, 498, 499, 500, 501,  38, 502,  38,  38,  38,  38,  38,  38,  38,  38,
+      0, 503,   0,   0, 467, 504, 505, 460,   0,   0,   0,   0,   0, 506,  38, 507,
+    508, 509, 510, 511,  38,  38,  38,  38,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0, 512, 513,   0,   0,   0, 467,   0,   0, 469, 514,
+    503,   0, 515,   0, 516, 517,  38,  38,   0,   0,   0, 518,   0,   0, 519,   0,
+      0,   0, 467, 520, 521, 522, 523,  38,   0,   0,   0,   0, 265,   0, 173, 524,
+    189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189,
+    189, 189, 189, 189, 189, 189, 525,  38, 189, 189, 189, 189, 189, 189, 189, 189,
+    189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189,
+    189, 189, 189, 189, 189, 189, 189, 189, 189, 526, 189, 189, 189, 189, 189, 189,
+    525, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189,
+    189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189,
+    189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189,
+    189, 189, 189, 189, 189, 527, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189,
+    189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189,
+    189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 528,
+    189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189,
+    525,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,
+    189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189,
+    189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 529,  38,  38,  38,  38,  38,
+    530,   0,   0,   0,  38,  38,  38,  38,   7,   7,   7,   7,   7,   7,   7, 531,
+     38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38
+};
+
+static RE_UINT8 re_script_table_3[] = {
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
+      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   2,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   2,   1,   1,   1,   1,   1,
+      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
+      2,   2,   2,   2,   2,   2,   2,   1,   2,   2,   2,   2,   2,   2,   2,   2,
+      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
+      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
+      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
+      2,   2,   2,   2,   2,   2,   2,   2,   2,   1,   1,   1,   1,   1,   1,   1,
+      2,   2,   2,   2,   2,   1,   1,   1,   1,   1,   3,   3,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
       4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
       4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
       4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
-      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4, 232,
-    233, 233, 233, 233,   7,   7,   7, 234, 233, 233, 233, 233, 233, 233, 233, 233,
-    233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233,
-    233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233,
-    233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233,
-};
-
-static RE_UINT8 re_bidi_class_stage_3[] = {
-      0,   1,   0,   2,   3,   4,   5,   6,   7,   8,   8,   9,   7,   8,   8,  10,
-     11,   0,   0,   0,  12,  13,  14,  15,   8,   8,  16,   8,   8,   8,  16,   8,
-      8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,  17,
-     18,  19,  18,  19,  20,  21,  19,  19,  22,  22,  22,  22,  22,  22,  22,  22,
-     22,  22,  22,  22,  22,  22,  23,  24,  25,   8,   8,   8,   8,   8,   8,   8,
-      8,   8,   8,   8,   8,   8,  24,   8,  26,  27,   8,   8,   8,   8,   8,   8,
-      8,  28,  29,  22,  22,  22,  22,  30,  31,  32,  32,  32,  32,  32,  32,  32,
-     33,  34,  22,  35,  36,  36,  36,  36,  36,  37,  22,  22,  38,  39,  40,  36,
-     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  41,  42,  43,  44,   5,  45,
-     36,  36,  46,  36,  36,  36,  22,  22,  22,  35,  36,  36,  36,  36,  36,  36,
-     36,  36,  36,  36,  41,  22,  40,  36,  32,  32,  32,  32,  32,  47,  48,  49,
-     32,  32,  50,  51,  52,  53,  32,  32,  32,  32,  32,  54,  36,  36,  32,  32,
-     32,  32,  32,  32,  36,  36,  36,  36,  36,  36,  37,  22,  55,  22,  22,  22,
-     56,   8,   8,   8,   8,   8,   8,  57,  58,  59,  58,   8,  60,   8,   8,   8,
-     61,   8,   8,   8,   8,   8,   8,  62,  63,  64,   8,   8,  60,   8,  65,  66,
-     67,   8,   8,   8,   8,   8,   8,  62,  68,  69,  61,   8,   8,   8,  70,   8,
-     71,  59,   8,   8,  60,   8,  72,  73,  61,   8,   8,   8,   8,   8,   8,  74,
-     63,  64,  75,   8,  60,   8,   8,   8,  76,   8,   8,   8,   8,   8,   8,   8,
-     77,  64,   8,   8,   8,   8,   9,  78,  79,   8,   8,   8,   8,   8,   8,  80,
-     81,  82,  83,   8,  60,   8,   8,  84,   8,  85,   8,   8,  60,   8,   8,   8,
-     27,   8,   8,   8,   8,   8,   8,  86,  63,  64,   8,   8,  60,   8,   8,   8,
-      8,  76,  87,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,  88,  89,
-     90,  91,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,  88,  92,
-      8,  93,   8,   8,   8,   8,   8,   8,   8,   8,   8,  27,   8,   8,  94,  95,
-      8,   8,   8,   8,   8,   8,  58,  91,  96,  97,  22,  58,  22,  22,  22,  92,
-     75,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,  97,  98,  99,
-      8,   8,   8, 100,  77,   8,  63,   8, 101,  64,   8,  64,   8,   8,   8,   8,
-      8,   8,   8,  97,   8,   8,   8,   8,   8,   8,  19, 102,   8,   8,   8,   8,
-      7,   8,   8,   8,   8,   8,   8,   8, 103,   8,   8, 104,   8,   8,   8,   8,
-      8,   8, 105,   8,   8,   8, 105,   8,   8,   8,  60,   8,   8,   8,  60,   8,
-      8,   8,   8,   8,   8,   8, 106,  93,  75,  58, 107, 108,   8,   8,  19, 102,
-     19, 109,   8,   8,   8,   8,   8,   8,  83,   8,   8,   8,   8,  61,   8,   8,
-      8,   8,   8,   8, 110,  77,  76, 111, 112,   8,   8,   8,   8,   8,   8,   8,
-      8,   8,   8, 113,  19,  19,  19,  19,   8,   8,  90, 114,   8,   8,   8,   8,
-      8,   8,  75,  91, 115,  92,  26, 116,   8,   8,   8,   8,   8,   8,  22,  91,
-    107,   8,   8,   8,   8,   8, 117, 118,  76,   8,   8,   8,   8,  26, 107,   8,
-     27,   8,   8,   8, 119, 120,   8,   8,   8,   8,   8,   8,  75, 121,  27,   8,
-      8,   8,   8,   8,   8, 122, 123,   8,   8,   8, 124,  22,  98,  59,  62,  27,
-     22,  22,  22,  22,  22,  22,  22, 125,   8,   8,   8,   8,   8,   8,   8, 126,
-    102,  20,   8,  20,   8,  20,   8, 127, 128, 129,  19,  19,  19, 130, 131,  19,
-    132,  19,  19, 133, 134, 135, 136, 137,   5, 137,   8,   8, 138, 138, 138, 138,
-    138, 138,  22,  22,  22,  22,  77,   8, 139, 102, 140, 141, 142, 143,   8, 144,
-    145, 146,  19,  19,   8,   8,   8,   8,   8, 147,  19,  19,  19,  19,  19,  19,
-     19,  19,  19,  19,  19,  19,  19,  19,  19,  19, 148,  19,  19,  19,  19,  19,
-     19,  19,  19,  19,  19,  19, 149,   8,   8,   8,   8,   8,   8,   8,   8,   9,
-     19,  19, 150,  19,  19,  19,  19,  19,  19,  19,  19,  19,  84,   8,   8,   8,
-     19, 151,   8,   8,  19,  19,  19,  19,  19,   5,   5, 152,   8,   8,   8,   8,
-      8,   8,   8,   8,   8,  18,  19,  19,  19,  19,  19,  19,  19, 153,  19,  19,
-     19,  19,  19,  19,  19,  19, 154,  19,  19,  19, 149,  19,  19,  19,  19,  19,
-      8,   8,   8,   8,  20, 155,  27, 156,   8,   8,   8,   8,   8,   8,   8,  90,
-      8,   8,   8,   8,  22,  22,  22,  22,  19,  19,   8,   8,   8,   8,   8,   8,
-     19,  19,  19, 157,  19,  19,  19,  19,  19,  19,  19,  19,  19,  19, 158,   8,
-     19,  19, 149,   8,   8,   8,  19, 158, 159,  19,  19,  19,   7, 119, 141,  20,
-      8,   8,   8, 160,   7,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8, 161,
-     19,  19,  19,  19, 158,   8,   8,   8,   8,   8,   8, 127,   8,   8,   8,   8,
-      8,   8,  19,  19,   8,   8,   8, 162,   8,   8,   8,   8,   8,   8, 156,  19,
-      8, 163,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,  16, 151,
-      8,   8,   8, 113,   8,   8,   8,  16,   8,   8,  19,  19,  19,  19,  19,  19,
-     84,   8,   8,   8,   8,   8,   8,   8,   8,  20,   8,   8,   8,   8,   8,   8,
-      8,   8,   8,   8,   8,  90, 164, 165,   8,   8,   8,  80,   8,   8,   8,   8,
-      8,   8,   8,   8,   8,   8,  27,   8,  19,  19,  19,  19, 102,   8,   8,   8,
-      8,   7,   8,   8,   8,   8,   8,   8, 166, 167,   8,   8,  83, 158,   8, 168,
-      8,   8,   8,   8,   8,   8, 163,   8,  85,   8,   8,   8,  22,  22,  27,  90,
-      8,   8,   8,   8,  80,  93,   8,   8,  90,  22,  27,   8,   8,   8,   8,   8,
-     56,   8,   8,   8,   8,   8, 169, 170,   8,   8,   8,   8,  64,   8,   8,   8,
-      8,   8,   8,   8,   8, 171,  99,   8, 167,  62,   8,   8,   8,   8,   8,  62,
-      8,   8,   8,   8,   8,   8, 172,  81,  61,   8,   8,   8,   8,  85,  75,   8,
-      8,   8,   8,   8,  64,  59,   8,   8,   8,   8,   8, 173,  32, 174,  32,  32,
-     32,  32,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36, 175,
-     36,  36,   0,   0,   0,   0,  36, 176,  22,  22,  19, 102,  22,  22,  19,  19,
-     19,  19, 177, 178, 179, 180,  36,  36,  36,  36,  36,  36,  36,  36,  36, 181,
-    182,   4,   5,   6,   7,   8,   8,   9,   7,   8,   8,   9, 149,   8,   8,   8,
-      8,   8,   8,   8, 183,  84,   0, 184, 185,   8,   8,   8,   8,   8,   8,   8,
-     19, 145,  19, 158,   7,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,  64,
-      8,   8,   8,   8, 186,   5,   5, 152,   8,   8,   8,   8,   8,   8,  80,  56,
-     32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32, 187,  32,  32,  32,  32,
-    188, 189,  32,  32,  32,  32,  32, 190,  32,  32,  32,  32, 191,  32,  32,  32,
-     32,  32,  32,  32,  32,  32,  32, 192,  36,  36,  36,  36, 193,  36,  38, 194,
-     32,  32,  32,  32,  38,  38,  38, 195,  32,  32,  32,  32,  32,  32,  36,  36,
-     41,  22,  40,  36,  36,  36,  32,  32,  61,   8,   8,   8,   8,   8,   8,  22,
-     91,   8,  18,  19, 149,   8,   8,  90,  27,   8,   8,   8,   8,   8, 196,  67,
-     56,   8,   8,   8,  90, 197,  92,   8,   8,   8,   8,   8,   8,   8, 167,   8,
-     27,   8,   8,   8,   8,   8,  80,  91,   8,  63,   8,   8,   8,   8,   8,   8,
-      8,   8,   8,   8,   8,  90, 198,  75,   8,   8,   8,  90,  26,  56,   8,   8,
-     77,   8,   8,   8,  80,  92,  92,   8,   8,   8,   8,   8,   8,   8,   8,  22,
-     87,   8,   8,  75,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,  26, 199,
-    200,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8, 119, 106,
-     77,   8,   8,  85,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,  26, 201,
-     77,   8,   8,   8,  19, 145,   8,   8,   8,   8,   8,   8,   8, 202, 203,   8,
-      8,   8,   8,  97, 204, 107,   8,   8,   8,   8,   8,   8,   8,  90,  22,  67,
-      8,   8, 122,  60,  77,   8,   8,   8, 171,  67,   8,   8,   8,   8,  26, 205,
-     90,   8, 171, 111,   8,   8,   8,   8,   8,  73,  91,  27,   8,   8,   8,   8,
-      8,   8,   8,   8,   8,   8,  91,  93,   8,   8,  73,  22,  22,  73, 206,   8,
-      8,   8,   8,   8,   8,   8, 171, 207, 203,   8,   8,   8,   8,   8,   8,   8,
-      8,   8, 121,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,  86,   8,
-      8,   8,  20, 208, 209,  19, 102,   8,   8,   8,   8,   8,   8,   8,  92,   8,
-      8,   8,   8,   8,   8,   8,  91,   8,   8,  90,   8,   8,   8,   8,   8,   8,
-      8,  90,  56,   8,   8,   8,   8,   8,   8,   8,   8,   8, 210,   8,   8,   8,
-      8,   8,   8,  83, 211,   8,   8,   8,   8,   8,   8,   8,  90,  27, 212, 213,
-    214, 107,   8,   8,   8, 119,   8,   8, 215,   8,   8,   8,   8,   8,   8,   8,
-     19,  19,  84,   8,   8,   8,   8,   8,   8,   8,   8, 161,   8,   8,   8,   8,
-      8,   8, 216,   8,   8,   8,   8,   8,   8,  16,   8,   8,   8,   8,   8,   8,
-      8, 185,   8,   8,   8,   8,   8,   8, 161, 217,   5,   5,   5,   5,   5,   5,
-     22,  22,  22,  22,  22,  22,  91,  26,  22,  22,  22,  22,  22,  92,  64,   8,
-     62,   8,   8,  26,  58,  22,   8,   8,  91,  22,  22, 218, 219,  56,   8,   8,
-      8,   8,   8,   8,   8, 122,   8, 220,  32,  32, 221,  32,  32,  32,  32,  32,
-    189, 222,  32,  32,  32,  32,  32,  32,  36,  36,  32,  32,  32,  32,  32,  32,
-     36,  36,  36,  36,  36,  36, 223,  36,  19,  19,  19,  19,  19, 158,  19,  19,
-     19,  19, 158,   8,  19,  84, 156,  19, 156,  19, 156,  19,  19,  19, 149,   8,
-      5, 224,   8,   8,   8,  16,   8,   8,   8,   8,   8,   8,   8, 225,   8,   8,
-      8,   8,   8,   8, 149,   8,   8,   8,  19,  19, 149,   8,  19, 145,  19, 151,
-     19,  19,  19,   7,  19, 158,   8,   8,  19, 158,  19,  19,  19,  19,  19,  19,
-     19,   8,  19, 102,  19,  19,  19,  19,  19,   8,  19,  19,  19, 149,   8,   8,
-     19, 153,  19,  19,  19,  19,  19,  19,  19,  19,  19,  19,  19,  19, 139,  18,
-     19,  19,  19,  19, 226, 227,  19,  19,  19, 226,  19,  19,  19,  19,  19,  19,
-     19,  19, 158,   8,  19, 149, 158, 151, 151,   8, 149,   8,   8,   8,   8,   8,
-      8,   8,   8,   8,   8,   8,   8, 228,   0,   0,   0,   0,   0,   0,   0,   0,
-     22,  22,  22,  22,  22,  22,   0,   0,
-};
-
-static RE_UINT8 re_bidi_class_stage_4[] = {
-    11, 11, 11, 11, 11, 11, 11, 11, 11,  8,  7,  8,  9,  7, 11, 11,
-    11, 11, 11, 11,  7,  7,  7,  8,  9, 10, 10,  4,  4,  4, 10, 10,
-    10, 10, 10,  3,  6,  3,  6,  6,  2,  2,  2,  2,  2,  2,  2,  2,
-     2,  2,  6, 10, 10, 10, 10, 10, 10,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 10, 10, 10, 10, 10,
-     0,  0,  0, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11,  7, 11, 11,
-     6, 10,  4,  4,  4,  4, 10, 10, 10, 10,  0, 10, 10, 11, 10, 10,
-     4,  4,  2,  2, 10,  0, 10, 10, 10,  2,  0, 10, 10, 10, 10, 10,
-     0,  0,  0,  0,  0,  0,  0, 10,  0, 10, 10,  0,  0,  0,  0,  0,
-     0,  0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
-     0,  0,  0,  0,  0, 10, 10, 10, 10, 10, 10, 10, 10, 10,  0, 10,
-    12, 12, 12, 12, 12, 12, 12, 12,  0,  0,  0,  0, 10, 10,  0,  0,
-     0,  0,  0,  0,  0,  0, 10,  0,  0,  0,  0,  0, 10, 10,  0, 10,
-     0,  0,  0, 12, 12, 12, 12, 12, 12, 12,  0,  0,  0,  0,  0,  0,
-     0,  0, 10,  0,  0, 10, 10,  4,  1, 12, 12, 12, 12, 12, 12, 12,
-    12, 12, 12, 12, 12, 12,  1, 12,  1, 12, 12,  1, 12, 12,  1, 12,
-     1,  1,  1,  1,  1,  1,  1,  1,  5,  5,  5,  5,  5,  5, 10, 10,
-    13,  4,  4, 13,  6, 13, 10, 10, 12, 12, 12, 13, 13, 13, 13, 13,
-    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 12, 12, 12, 12, 12,
-     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  4,  5,  5, 13, 13, 13,
-    12, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 12, 12,
-    12, 12, 12, 12, 12,  5, 10, 12, 12, 12, 12, 12, 12, 13, 13, 12,
-    12, 10, 12, 12, 12, 12, 13, 13,  2,  2, 13, 13, 13, 13, 13, 13,
-    13, 12, 13, 13, 13, 13, 13, 13,  1,  1,  1, 12, 12, 12, 12, 12,
-    12, 12, 12, 12,  1,  1, 10, 10, 10, 10,  1,  1,  1, 12,  1,  1,
-     1,  1,  1,  1,  1,  1, 12, 12, 12, 12,  1, 12, 12, 12, 12, 12,
-    12, 12, 12, 12,  1, 12, 12, 12,  1, 12, 12, 12, 12, 12,  1,  1,
-     1, 12, 12, 12,  1,  1,  1,  1, 12, 12,  5, 12, 12, 12, 12, 12,
-    12, 12, 12,  0,  0,  0,  0,  0,  0,  0, 12,  0, 12,  0,  0,  0,
-     0, 12, 12, 12, 12, 12, 12, 12, 12,  0,  0,  0,  0, 12,  0,  0,
-     0,  0, 12, 12,  0,  0,  0,  0,  0, 12,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0, 12,  0,  0,  0,  0, 12, 12, 12, 12,  0,  0,  0,
-     0,  0,  0,  0,  0, 12,  0,  0,  0,  0,  4,  4,  0,  0,  0,  0,
-     0,  0,  0,  4,  0,  0, 12,  0,  0, 12, 12,  0,  0,  0,  0,  0,
-     0, 12, 12,  0,  0,  0,  0, 12, 12,  0,  0, 12, 12, 12,  0,  0,
-    12, 12,  0,  0,  0, 12,  0,  0,  0, 12, 12, 12, 12, 12,  0, 12,
-     0,  4,  0,  0,  0,  0,  0,  0,  0,  0, 12, 12, 12, 12, 12, 12,
-     0,  0,  0,  0, 12,  0,  0, 12,  0,  0,  0,  0,  0,  0, 12,  0,
-     0,  0, 12,  0,  0,  0,  0,  0, 12,  0,  0,  0,  0,  0,  0,  0,
-    10,  4, 10,  0,  0,  0,  0,  0, 12,  0,  0,  0, 12,  0,  0,  0,
-     0,  0,  0,  0,  0,  0, 12, 12, 12,  0,  0,  0,  0,  0, 12, 12,
-    12,  0, 12, 12, 12, 12,  0,  0,  0,  0,  0,  0,  0, 12, 12,  0,
-    10, 10, 10, 10, 10, 10, 10,  0,  0,  0,  0,  0, 12, 12,  0,  0,
-     0,  0,  0, 12, 12,  0,  0,  0,  0,  0, 12, 12, 12,  0, 12,  0,
-     0, 12,  0,  0, 12, 12, 12, 12, 12, 12, 12,  0,  0,  0,  0,  4,
-     0,  0,  0,  0,  0,  0,  0, 12, 12, 12, 12, 12, 12, 12, 12,  0,
-    12, 12, 12, 12, 12,  0,  0,  0, 12, 12, 12, 12, 12, 12,  0,  0,
-     0,  0,  0,  0,  0, 12,  0, 12,  0, 12, 10, 10, 10, 10,  0,  0,
-    12, 12, 12, 12, 12,  0, 12, 12,  0,  0,  0,  0,  0, 12, 12, 12,
-    12,  0, 12, 12, 12, 12, 12, 12,  0, 12, 12,  0,  0, 12, 12,  0,
-    12, 12,  0,  0,  0,  0, 12, 12,  0,  0, 12,  0,  0, 12, 12,  0,
-    10, 10,  0,  0,  0,  0,  0,  0,  9,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0, 10, 10,  0,  0,  0,  0,  0, 12, 12, 12,  0,  0,  0,
-     0,  0,  0,  0, 12, 12,  0, 12, 12, 12, 12, 12,  0,  0,  0,  0,
-     0,  0,  0,  4,  0, 12,  0,  0, 10, 10, 10, 12, 12, 12, 11,  0,
-    12, 12, 12,  0,  0,  0,  0, 12,  0, 12, 12, 12,  0,  0,  0,  0,
-    10,  0,  0,  0, 10, 10,  0,  0,  0,  0,  0,  0,  0,  0, 10, 10,
-    12,  0,  0, 12,  0,  0,  0,  0, 12,  0, 12,  0,  0, 12, 12, 12,
-    12, 12, 12, 12, 12,  0,  0, 12,  0,  0,  0,  0, 12,  0, 12, 12,
-    12, 12, 12,  0, 12,  0,  0,  0,  0,  0, 12, 12, 12, 12,  0,  0,
-    12, 12,  0, 12, 12, 12,  0,  0, 12, 12,  0,  0,  0, 12,  0, 12,
-     0,  0,  0,  0, 12, 12, 12, 12, 12, 12, 12, 12,  0,  0, 12, 12,
-    12, 12, 12,  0, 12, 12, 12, 12, 12, 12,  0, 12, 12, 12, 12, 12,
-     0,  0,  0,  0,  0, 10,  0, 10,  0,  0,  0,  0,  0, 10, 10,  0,
-     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9, 11, 11, 11,  0,  1,
-     9,  7, 16, 17, 18, 14, 15,  6,  4,  4,  4,  4,  4, 10, 10, 10,
-    10, 10, 10, 10,  6, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,  9,
-    11, 11, 11, 11, 11, 11, 19, 20, 21, 22, 11, 11, 11, 11, 11, 11,
-     2,  0,  0,  0,  2,  2,  2,  2,  2,  2,  3,  3, 10, 10, 10,  0,
-     4,  4,  4,  4,  4,  4,  4,  4, 10, 10,  0, 10, 10, 10, 10,  0,
-     0,  0,  0,  0, 10,  0, 10, 10, 10,  0,  0,  0,  0,  0, 10, 10,
-    10, 10, 10, 10,  0, 10,  0, 10,  0, 10,  0,  0,  0,  0,  4,  0,
-     0,  0, 10, 10,  0,  0,  0,  0, 10, 10, 10, 10, 10,  0,  0,  0,
-     0,  0, 10, 10, 10, 10,  0,  0,  0, 10, 10, 10,  0,  0,  0,  0,
-    10, 10,  3,  4, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,  0,  0,
-    10, 10, 10, 10, 10,  0, 10, 10, 10, 10, 10,  0,  0,  0,  0,  0,
-     2,  2,  2,  2,  0,  0,  0,  0, 10, 10, 10, 10,  0, 10, 10, 10,
-    10, 10, 10, 10,  0,  0, 10, 10, 10, 10, 10,  0,  0,  0,  0, 12,
-     0, 10, 10, 10, 10, 10, 10, 10, 10, 10,  0, 10, 10, 10, 10, 10,
-    10, 10, 10, 10,  0,  0,  0,  0,  9, 10, 10, 10, 10,  0,  0,  0,
-     0, 12, 12, 10, 10,  0,  0,  0,  0,  0,  0, 10,  0,  0,  0,  0,
-     0,  0,  0,  0, 10, 10, 10,  0,  0,  0,  0,  0, 10, 10, 10, 10,
-    12, 12, 12, 10, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 10, 10,
-     0,  0, 12,  0,  0,  0, 12,  0,  0,  0,  0, 12,  0,  0,  0,  0,
-     4,  4,  0,  0,  0,  0,  0,  0,  0,  0,  0, 12,  0,  0, 12, 12,
-    12, 12,  0,  0, 12, 12,  0,  0,  0, 12, 12, 12, 12, 12, 12,  0,
-    12,  0, 12, 12, 12,  0,  0, 12,  0,  0,  0,  0,  0,  1, 12,  1,
-     1,  3,  1,  1,  1,  1,  1,  1, 13, 13, 13, 13, 13, 13, 10, 10,
-    13, 13, 13, 13, 13, 10, 13, 13,  6, 10,  6,  0, 10,  6, 10, 10,
-    10, 10, 10, 10, 10, 10, 10,  4, 10, 10,  3,  3, 10, 10, 10,  0,
-    10,  4,  4, 10,  0,  0,  0,  0, 13, 13, 13, 13, 13, 13, 13, 11,
-     0, 10, 10,  4,  4,  4, 10, 10,  4,  4, 10, 10, 10,  4,  4,  0,
-    11, 10, 10, 10, 10, 10, 11, 11,  0, 10,  0,  0,  0,  0,  0,  0,
-    12,  2,  2,  2,  2,  2,  2,  2,  1,  1,  1,  1,  1,  1,  1, 10,
-     1, 12, 12, 12,  1, 12, 12,  1,  1,  1,  1,  1, 12, 12, 12, 12,
-    12, 12, 12,  1,  1,  1,  1, 12,  1,  1,  1,  1,  1, 12, 12,  1,
-     1, 10, 10, 10, 10, 10, 10, 10, 13, 13, 13, 13, 12, 12, 12, 12,
-     5,  5, 13, 13, 13, 13, 13, 13,  5,  5,  5,  5,  5,  5,  5,  1,
-     0,  0,  0, 12, 12, 12, 12,  0, 12, 12, 12, 12,  0, 12, 12, 12,
-    12, 12,  0,  0, 12,  0, 12, 12, 12,  0, 12,  0,  0,  0,  0, 12,
-    12,  0, 12, 12,  0,  0,  0,  0, 12, 12, 12,  0,  0, 12,  0, 12,
-     0,  0,  0, 12,  0, 12,  0,  0, 12, 12, 12, 12, 12, 12,  0, 12,
-     0,  0, 12, 12, 12, 12,  0, 12, 12,  0,  0, 12, 12, 12, 12,  0,
-    12,  0, 12, 12,  0, 12, 12,  0,  0,  0, 12,  0, 12, 12,  0, 12,
-    10, 10, 10, 10, 10,  4,  4,  4,  4, 10, 10, 10, 10, 10, 10, 10,
-     0,  0, 10,  0,  0,  0,  0,  0, 11, 11, 11, 11,  0,  0,  0,  0,
-     0,  0,  0, 11, 11, 11, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12,
-    12, 12, 12,  0,  0, 12, 12, 12, 10, 10, 12, 12, 12, 10,  0,  0,
-     0,  0,  0,  0,  0, 10,  0,  0,  0,  0,  0,  0,  0,  0,  2,  2,
-    12,  0,  0, 12, 12, 12, 12, 12, 12, 12,  0, 12, 12,  0, 12, 12,
-     0,  0,  0,  0,  0,  0,  0,  4, 12, 12, 12, 12, 12, 12, 12,  1,
-    12, 12, 12,  1,  1,  1,  1,  1, 10, 10, 13, 13, 13, 13, 13, 13,
-     2,  2,  2, 10, 10,  0,  0,  0,  0,  0, 10, 10, 10,  0,  0,  0,
-    10, 10, 10,  0,  0, 10, 10, 10, 10, 10, 10,  0,  0,  0, 10, 10,
-     0,  0,  0,  0,  0,  0, 11, 11,
-};
-
-/* Bidi_Class: 5072 bytes. */
-
-RE_UINT32 re_get_bidi_class(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-
-    f = ch >> 12;
-    code = ch ^ (f << 12);
-    pos = (RE_UINT32)re_bidi_class_stage_1[f] << 6;
-    f = code >> 6;
-    code ^= f << 6;
-    pos = (RE_UINT32)re_bidi_class_stage_2[pos + f] << 3;
-    f = code >> 3;
-    code ^= f << 3;
-    pos = (RE_UINT32)re_bidi_class_stage_3[pos + f] << 3;
-    value = re_bidi_class_stage_4[pos + code];
-
-    return value;
-}
-
-/* Canonical_Combining_Class. */
-
-static RE_UINT8 re_canonical_combining_class_stage_1[] = {
-     0,  1,  2,  3,  4,  4,  4,  4,  4,  4,  5,  4,  4,  4,  4,  6,
-     7,  8,  4,  4,  4,  4,  9,  4,  4,  4,  4, 10,  4, 11, 12,  4,
-     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
-     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
-     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
-     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
-     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
-     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
-     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
-     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
-     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
-     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
-     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
-     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
-     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
-     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
-     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
-};
-
-static RE_UINT8 re_canonical_combining_class_stage_2[] = {
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   2,   0,   0,
-      0,   0,   3,   0,   0,   0,   4,   5,   6,   7,   0,   8,   9,  10,   0,  11,
-     12,  13,   0,  14,  15,  16,  15,  17,  15,  18,  15,  18,  15,  18,   0,  18,
-      0,  19,  15,  18,  20,  18,   0,  21,  22,  23,  24,  25,  26,  27,  28,  29,
-     30,   0,  31,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  32,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  33,   0,   0,  34,
-      0,   0,  35,   0,  36,   0,   0,   0,  37,  38,  39,   0,  40,  41,  42,  43,
-     44,   0,   0,  45,   0,   0,   0,  46,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,  47,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,  48,   0,  49,   0,  50,   0,   0,   0,   0,   0,   0,   0,   0,
-     51,   0,  52,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      5,   5,   5,   5,   1,   5,   5,   5,   0,   0,   5,   5,   5,   5,   1,   5,
+      0,   0,   0,   0,   5,   1,   5,   1,   5,   5,   5,   0,   5,   0,   5,   5,
+      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
+      5,   5,   0,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
+      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
+      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
+      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
+      5,   5,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,
+      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
+      7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
+      7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
+      7,   7,   7,   7,   7,   4,   4,   7,   7,   7,   7,   7,   7,   7,   7,   7,
+      7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
+      7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
+      0,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,
+      8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,
+      8,   8,   8,   8,   8,   8,   8,   0,   0,   8,   8,   8,   8,   8,   8,   8,
+      8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,
+      8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,
+      8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   0,   0,   8,   8,   8,
+      0,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,
+      9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,
+      9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,
+      9,   9,   9,   9,   9,   9,   9,   9,   0,   0,   0,   0,   0,   0,   0,   0,
+      9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,
+      9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   0,   0,   0,   0,   9,
+      9,   9,   9,   9,   9,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     10,  10,  10,  10,  10,   1,  10,  10,  10,  10,  10,  10,   1,  10,  10,  10,
+     10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,   1,  10,   0,  10,   1,
+     10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,
+     10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,
+      1,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,   4,   4,   4,   4,   4,
+      4,   4,   4,   4,   4,   4,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,
+     10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,
+      4,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,
+     10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,
+     10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,   1,  10,  10,
+     11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,   0,  11,
+     11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,
+     11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,
+     11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,
+     11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,   0,   0,  11,  11,  11,
+     10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,
+     12,  12,  12,  12,  12,  12,  12,  12,  12,  12,  12,  12,  12,  12,  12,  12,
+     12,  12,  12,  12,  12,  12,  12,  12,  12,  12,  12,  12,  12,  12,  12,  12,
+     12,  12,  12,  12,  12,  12,  12,  12,  12,  12,  12,  12,  12,  12,  12,  12,
+     12,  12,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     13,  13,  13,  13,  13,  13,  13,  13,  13,  13,  13,  13,  13,  13,  13,  13,
+     13,  13,  13,  13,  13,  13,  13,  13,  13,  13,  13,  13,  13,  13,  13,  13,
+     13,  13,  13,  13,  13,  13,  13,  13,  13,  13,  13,  13,  13,  13,  13,  13,
+     13,  13,  13,  13,  13,  13,  13,  13,  13,  13,  13,   0,   0,  13,  13,  13,
+     14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,
+     14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,
+     14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,   0,   0,
+     14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,   0,
+     15,  15,  15,  15,  15,  15,  15,  15,  15,  15,  15,  15,  15,  15,  15,  15,
+     15,  15,  15,  15,  15,  15,  15,  15,  15,  15,  15,  15,   0,   0,  15,   0,
+     11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,
+     10,  10,  10,  10,  10,   0,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,
+     10,  10,  10,  10,  10,  10,  10,  10,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,
+     10,  10,   1,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,
+     10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,
+     16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,
+     16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,
+     16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,
+     16,   4,   4,   4,   4,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,
+     16,  16,  16,  16,   1,   1,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,
+     16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,
+     17,  17,  17,  17,   0,  17,  17,  17,  17,  17,  17,  17,  17,   0,   0,  17,
+     17,   0,   0,  17,  17,  17,  17,  17,  17,  17,  17,  17,  17,  17,  17,  17,
+     17,  17,  17,  17,  17,  17,  17,  17,  17,   0,  17,  17,  17,  17,  17,  17,
+     17,   0,  17,   0,   0,   0,  17,  17,  17,  17,   0,   0,  17,  17,  17,  17,
+     17,  17,  17,  17,  17,   0,   0,  17,  17,   0,   0,  17,  17,  17,  17,   0,
+      0,   0,   0,   0,   0,   0,   0,  17,   0,   0,   0,   0,  17,  17,   0,  17,
+     17,  17,  17,  17,   0,   0,  17,  17,  17,  17,  17,  17,  17,  17,  17,  17,
+     17,  17,  17,  17,  17,  17,  17,  17,  17,  17,  17,  17,  17,  17,  17,   0,
+      0,  18,  18,  18,   0,  18,  18,  18,  18,  18,  18,   0,   0,   0,   0,  18,
+     18,   0,   0,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,
+     18,  18,  18,  18,  18,  18,  18,  18,  18,   0,  18,  18,  18,  18,  18,  18,
+     18,   0,  18,  18,   0,  18,  18,   0,  18,  18,   0,   0,  18,   0,  18,  18,
+     18,  18,  18,   0,   0,   0,   0,  18,  18,   0,   0,  18,  18,  18,   0,   0,
+      0,  18,   0,   0,   0,   0,   0,   0,   0,  18,  18,  18,  18,   0,  18,   0,
+      0,   0,   0,   0,   0,   0,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,
+     18,  18,  18,  18,  18,  18,  18,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,  19,  19,  19,   0,  19,  19,  19,  19,  19,  19,  19,  19,  19,   0,  19,
+     19,  19,   0,  19,  19,  19,  19,  19,  19,  19,  19,  19,  19,  19,  19,  19,
+     19,  19,  19,  19,  19,  19,  19,  19,  19,   0,  19,  19,  19,  19,  19,  19,
+     19,   0,  19,  19,   0,  19,  19,  19,  19,  19,   0,   0,  19,  19,  19,  19,
+     19,  19,  19,  19,  19,  19,   0,  19,  19,  19,   0,  19,  19,  19,   0,   0,
+     19,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     19,  19,  19,  19,   0,   0,  19,  19,  19,  19,  19,  19,  19,  19,  19,  19,
+     19,  19,   0,   0,   0,   0,   0,   0,   0,  19,  19,  19,  19,  19,  19,  19,
+      0,  20,  20,  20,   0,  20,  20,  20,  20,  20,  20,  20,  20,   0,   0,  20,
+     20,   0,   0,  20,  20,  20,  20,  20,  20,  20,  20,  20,  20,  20,  20,  20,
+     20,  20,  20,  20,  20,  20,  20,  20,  20,   0,  20,  20,  20,  20,  20,  20,
+     20,   0,  20,  20,   0,  20,  20,  20,  20,  20,   0,   0,  20,  20,  20,  20,
+     20,  20,  20,  20,  20,   0,   0,  20,  20,   0,   0,  20,  20,  20,   0,   0,
+      0,   0,   0,   0,   0,  20,  20,  20,   0,   0,   0,   0,  20,  20,   0,  20,
+     20,  20,  20,  20,   0,   0,  20,  20,  20,  20,  20,  20,  20,  20,  20,  20,
+     20,  20,  20,  20,  20,  20,  20,  20,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,  21,  21,   0,  21,  21,  21,  21,  21,  21,   0,   0,   0,  21,  21,
+     21,   0,  21,  21,  21,  21,   0,   0,   0,  21,  21,   0,  21,   0,  21,  21,
+      0,   0,   0,  21,  21,   0,   0,   0,  21,  21,  21,   0,   0,   0,  21,  21,
+     21,  21,  21,  21,  21,  21,  21,  21,  21,  21,   0,   0,   0,   0,  21,  21,
+     21,  21,  21,   0,   0,   0,  21,  21,  21,   0,  21,  21,  21,  21,   0,   0,
+     21,   0,   0,   0,   0,   0,   0,  21,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,
+     21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,   0,   0,   0,   0,   0,
+     22,  22,  22,  22,  22,  22,  22,  22,  22,  22,  22,  22,  22,   0,  22,  22,
+     22,   0,  22,  22,  22,  22,  22,  22,  22,  22,  22,  22,  22,  22,  22,  22,
+     22,  22,  22,  22,  22,  22,  22,  22,  22,   0,  22,  22,  22,  22,  22,  22,
+     22,  22,  22,  22,  22,  22,  22,  22,  22,  22,   0,   0,   0,  22,  22,  22,
+     22,  22,  22,  22,  22,   0,  22,  22,  22,   0,  22,  22,  22,  22,   0,   0,
+      0,   0,   0,   0,   0,  22,  22,   0,  22,  22,  22,   0,   0,   0,   0,   0,
+     22,  22,  22,  22,   0,   0,  22,  22,  22,  22,  22,  22,  22,  22,  22,  22,
+      0,   0,   0,   0,   0,   0,   0,  22,  22,  22,  22,  22,  22,  22,  22,  22,
+     23,  23,  23,  23,  23,  23,  23,  23,  23,  23,  23,  23,  23,   0,  23,  23,
+     23,   0,  23,  23,  23,  23,  23,  23,  23,  23,  23,  23,  23,  23,  23,  23,
+     23,  23,  23,  23,  23,  23,  23,  23,  23,   0,  23,  23,  23,  23,  23,  23,
+     23,  23,  23,  23,   0,  23,  23,  23,  23,  23,   0,   0,  23,  23,  23,  23,
+     23,  23,  23,  23,  23,   0,  23,  23,  23,   0,  23,  23,  23,  23,   0,   0,
+      0,   0,   0,   0,   0,  23,  23,   0,   0,   0,   0,   0,   0,   0,  23,   0,
+     23,  23,  23,  23,   0,   0,  23,  23,  23,  23,  23,  23,  23,  23,  23,  23,
+      0,  23,  23,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     24,  24,  24,  24,  24,  24,  24,  24,  24,  24,  24,  24,  24,   0,  24,  24,
+     24,   0,  24,  24,  24,  24,  24,  24,  24,  24,  24,  24,  24,  24,  24,  24,
+     24,  24,  24,  24,  24,  24,  24,  24,  24,  24,  24,  24,  24,  24,  24,  24,
+     24,  24,  24,  24,  24,  24,  24,  24,  24,  24,  24,  24,  24,  24,  24,  24,
+     24,  24,  24,  24,  24,   0,  24,  24,  24,   0,  24,  24,  24,  24,  24,  24,
+      0,   0,   0,   0,  24,  24,  24,  24,  24,  24,  24,  24,  24,  24,  24,  24,
+     24,  24,  24,  24,   0,   0,  24,  24,  24,  24,  24,  24,  24,  24,  24,  24,
+     24,  24,  24,  24,  24,  24,  24,  24,  24,  24,  24,  24,  24,  24,  24,  24,
+      0,  25,  25,  25,   0,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,
+     25,  25,  25,  25,  25,  25,  25,   0,   0,   0,  25,  25,  25,  25,  25,  25,
+     25,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,
+     25,  25,   0,  25,  25,  25,  25,  25,  25,  25,  25,  25,   0,  25,   0,   0,
+     25,  25,  25,  25,  25,  25,  25,   0,   0,   0,  25,   0,   0,   0,   0,  25,
+     25,  25,  25,  25,  25,   0,  25,   0,  25,  25,  25,  25,  25,  25,  25,  25,
+      0,   0,   0,   0,   0,   0,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,
+      0,   0,  25,  25,  25,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
+     26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
+     26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
+     26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,   0,   0,   0,   0,   1,
+     26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
+     26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,   0,   0,   0,   0,
+      0,  27,  27,   0,  27,   0,  27,  27,  27,  27,  27,   0,  27,  27,  27,  27,
+     27,  27,  27,  27,  27,  27,  27,  27,  27,  27,  27,  27,  27,  27,  27,  27,
+     27,  27,  27,  27,   0,  27,   0,  27,  27,  27,  27,  27,  27,  27,  27,  27,
+     27,  27,  27,  27,  27,  27,  27,  27,  27,  27,  27,  27,  27,  27,   0,   0,
+     27,  27,  27,  27,  27,   0,  27,   0,  27,  27,  27,  27,  27,  27,   0,   0,
+     27,  27,  27,  27,  27,  27,  27,  27,  27,  27,   0,   0,  27,  27,  27,  27,
+     28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,
+     28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,
+     28,  28,  28,  28,  28,  28,  28,  28,   0,  28,  28,  28,  28,  28,  28,  28,
+     28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,
+     28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,   0,   0,   0,
+      0,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,
+     28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,
+     28,  28,  28,  28,  28,  28,  28,  28,   0,  28,  28,  28,  28,  28,  28,  28,
+     28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,
+     28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,   0,  28,  28,
+     28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,   0,  28,  28,
+     28,  28,  28,  28,  28,   1,   1,   1,   1,  28,  28,   0,   0,   0,   0,   0,
+     29,  29,  29,  29,  29,  29,  29,  29,  29,  29,  29,  29,  29,  29,  29,  29,
+     29,  29,  29,  29,  29,  29,  29,  29,  29,  29,  29,  29,  29,  29,  29,  29,
+     30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,
+     30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,
+     30,  30,  30,  30,  30,  30,   0,  30,   0,   0,   0,   0,   0,  30,   0,   0,
+     30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,
+     30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,
+     30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,   1,  30,  30,  30,  30,
+     31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,
+     31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,
+     32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,
+     32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,
+     32,  32,  32,  32,  32,  32,  32,  32,  32,   0,  32,  32,  32,  32,   0,   0,
+     32,  32,  32,  32,  32,  32,  32,   0,  32,   0,  32,  32,  32,  32,   0,   0,
+     32,  32,  32,  32,  32,  32,  32,  32,  32,   0,  32,  32,  32,  32,   0,   0,
+     32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,
+     32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,
+     32,   0,  32,  32,  32,  32,   0,   0,  32,  32,  32,  32,  32,  32,  32,   0,
+     32,   0,  32,  32,  32,  32,   0,   0,  32,  32,  32,  32,  32,  32,  32,  32,
+     32,  32,  32,  32,  32,  32,  32,   0,  32,  32,  32,  32,  32,  32,  32,  32,
+     32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,
+     32,   0,  32,  32,  32,  32,   0,   0,  32,  32,  32,  32,  32,  32,  32,  32,
+     32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,
+     32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,   0,   0,  32,  32,  32,
+     32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,
+     32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,   0,   0,   0,
+     32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,
+     32,  32,  32,  32,  32,  32,  32,  32,  32,  32,   0,   0,   0,   0,   0,   0,
+     33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,
+     33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,
+     33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,
+     33,  33,  33,  33,  33,  33,   0,   0,  33,  33,  33,  33,  33,  33,   0,   0,
+     34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,
+     34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,
+     35,  35,  35,  35,  35,  35,  35,  35,  35,  35,  35,  35,  35,  35,  35,  35,
+     35,  35,  35,  35,  35,  35,  35,  35,  35,  35,  35,  35,  35,   0,   0,   0,
+     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,
+     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,
+     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,   1,   1,   1,  36,  36,
+     36,  36,  36,  36,  36,  36,  36,  36,  36,   0,   0,   0,   0,   0,   0,   0,
+     37,  37,  37,  37,  37,  37,  37,  37,  37,  37,  37,  37,  37,   0,  37,  37,
+     37,  37,  37,  37,  37,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,
+     38,  38,  38,  38,  38,   1,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,
+     39,  39,  39,  39,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,   0,  40,  40,
+     40,   0,  40,  40,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     41,  41,  41,  41,  41,  41,  41,  41,  41,  41,  41,  41,  41,  41,  41,  41,
+     41,  41,  41,  41,  41,  41,  41,  41,  41,  41,  41,  41,  41,  41,  41,  41,
+     41,  41,  41,  41,  41,  41,  41,  41,  41,  41,  41,  41,  41,  41,  41,  41,
+     41,  41,  41,  41,  41,  41,  41,  41,  41,  41,  41,  41,  41,  41,   0,   0,
+     41,  41,  41,  41,  41,  41,  41,  41,  41,  41,   0,   0,   0,   0,   0,   0,
+     41,  41,  41,  41,  41,  41,  41,  41,  41,  41,   0,   0,   0,   0,   0,   0,
+     42,  42,   1,   1,  42,   1,  42,  42,  42,  42,  42,  42,  42,  42,  42,   0,
+     42,  42,  42,  42,  42,  42,  42,  42,  42,  42,   0,   0,   0,   0,   0,   0,
+     42,  42,  42,  42,  42,  42,  42,  42,  42,  42,  42,  42,  42,  42,  42,  42,
+     42,  42,  42,  42,  42,  42,  42,  42,  42,  42,  42,  42,  42,  42,  42,  42,
+     42,  42,  42,  42,  42,  42,  42,  42,  42,  42,  42,  42,  42,  42,  42,  42,
+     42,  42,  42,  42,  42,  42,  42,  42,  42,   0,   0,   0,   0,   0,   0,   0,
+     42,  42,  42,  42,  42,  42,  42,  42,  42,  42,  42,   0,   0,   0,   0,   0,
+     34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,
+     34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,
+     34,  34,  34,  34,  34,  34,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     43,  43,  43,  43,  43,  43,  43,  43,  43,  43,  43,  43,  43,  43,  43,  43,
+     43,  43,  43,  43,  43,  43,  43,  43,  43,  43,  43,  43,  43,  43,  43,   0,
+     43,  43,  43,  43,  43,  43,  43,  43,  43,  43,  43,  43,   0,   0,   0,   0,
+     43,  43,  43,  43,  43,  43,  43,  43,  43,  43,  43,  43,   0,   0,   0,   0,
+     43,   0,   0,   0,  43,  43,  43,  43,  43,  43,  43,  43,  43,  43,  43,  43,
+     44,  44,  44,  44,  44,  44,  44,  44,  44,  44,  44,  44,  44,  44,  44,  44,
+     44,  44,  44,  44,  44,  44,  44,  44,  44,  44,  44,  44,  44,  44,   0,   0,
+     44,  44,  44,  44,  44,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,
+     45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,
+     45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,   0,   0,   0,   0,
+     45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,
+     45,  45,  45,  45,  45,  45,  45,  45,  45,  45,   0,   0,   0,   0,   0,   0,
+     45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,   0,   0,   0,  45,  45,
+     46,  46,  46,  46,  46,  46,  46,  46,  46,  46,  46,  46,  46,  46,  46,  46,
+     46,  46,  46,  46,  46,  46,  46,  46,  46,  46,  46,  46,   0,   0,  46,  46,
+     47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,
+     47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,
+     47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,
+     47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,   0,
+     47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,
+     47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,   0,   0,  47,
+     47,  47,  47,  47,  47,  47,  47,  47,  47,  47,   0,   0,   0,   0,   0,   0,
+     47,  47,  47,  47,  47,  47,  47,  47,  47,  47,   0,   0,   0,   0,   0,   0,
+     47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,   0,   0,
+      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
+      4,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,
+     48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,
+     48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,   0,   0,   0,   0,
+     48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,
+     48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,
+     48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,   0,   0,   0,
+     49,  49,  49,  49,  49,  49,  49,  49,  49,  49,  49,  49,  49,  49,  49,  49,
+     49,  49,  49,  49,  49,  49,  49,  49,  49,  49,  49,  49,  49,  49,  49,  49,
+     50,  50,  50,  50,  50,  50,  50,  50,  50,  50,  50,  50,  50,  50,  50,  50,
+     50,  50,  50,  50,  50,  50,  50,  50,  50,  50,  50,  50,  50,  50,  50,  50,
+     50,  50,  50,  50,  50,  50,  50,  50,  50,  50,  50,  50,  50,  50,  50,  50,
+     50,  50,  50,  50,   0,   0,   0,   0,   0,   0,   0,   0,  50,  50,  50,  50,
+     51,  51,  51,  51,  51,  51,  51,  51,  51,  51,  51,  51,  51,  51,  51,  51,
+     51,  51,  51,  51,  51,  51,  51,  51,  51,  51,  51,  51,  51,  51,  51,  51,
+     51,  51,  51,  51,  51,  51,  51,  51,  51,  51,  51,  51,  51,  51,  51,  51,
+     51,  51,  51,  51,  51,  51,  51,  51,   0,   0,   0,  51,  51,  51,  51,  51,
+     51,  51,  51,  51,  51,  51,  51,  51,  51,  51,   0,   0,   0,  51,  51,  51,
+     52,  52,  52,  52,  52,  52,  52,  52,  52,  52,  52,  52,  52,  52,  52,  52,
+     52,  52,  52,  52,  52,  52,  52,  52,  52,  52,  52,  52,  52,  52,  52,  52,
+     52,  52,  52,  52,  52,  52,  52,  52,  52,  52,  52,  52,  52,  52,  52,  52,
+      7,   7,   7,   7,   7,   7,   7,   7,   7,   0,   0,   0,   0,   0,   0,   0,
+     30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,
+     30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,
+     30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,   0,   0,  30,  30,  30,
+     49,  49,  49,  49,  49,  49,  49,  49,   0,   0,   0,   0,   0,   0,   0,   0,
+      4,   4,   4,   1,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
+      4,   1,   4,   4,   4,   4,   4,   4,   4,   1,   1,   1,   1,   4,   1,   1,
+      1,   1,   1,   1,   4,   1,   1,   1,   4,   4,   1,   0,   0,   0,   0,   0,
+      2,   2,   2,   2,   2,   2,   5,   5,   5,   5,   5,   7,   2,   2,   2,   2,
+      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
+      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
+      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   5,   5,   5,
+      5,   5,   2,   2,   2,   2,   5,   5,   5,   5,   5,   2,   2,   2,   2,   2,
+      2,   2,   2,   2,   2,   2,   2,   2,   7,   2,   2,   2,   2,   2,   2,   2,
+      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
+      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   5,
+      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
+      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   0,   4,   4,   4,   4,   4,
+      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
+      5,   5,   5,   5,   5,   5,   0,   0,   5,   5,   5,   5,   5,   5,   0,   0,
+      5,   5,   5,   5,   5,   5,   0,   0,   5,   5,   5,   5,   5,   5,   0,   0,
+      5,   5,   5,   5,   5,   5,   5,   5,   0,   5,   0,   5,   0,   5,   0,   5,
+      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
+      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   0,   0,
+      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
+      5,   5,   5,   5,   5,   0,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
+      5,   5,   5,   5,   5,   0,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
+      5,   5,   5,   5,   0,   0,   5,   5,   5,   5,   5,   5,   0,   5,   5,   5,
+      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
+      0,   0,   5,   5,   5,   0,   5,   5,   5,   5,   5,   5,   5,   5,   5,   0,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   4,   4,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   0,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   2,   0,   0,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   2,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   0,
+      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   0,   0,   0,
       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
+      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
+      4,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      1,   1,   1,   1,   1,   1,   5,   1,   1,   1,   2,   2,   1,   1,   1,   1,
+      1,   1,   2,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   2,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      2,   2,   2,   2,   2,   2,   2,   2,   2,   1,   1,   1,   0,   0,   0,   0,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,
       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   0,   0,   0,   0,   0,
       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     53,  53,  53,  53,  53,  53,  53,  53,  53,  53,  53,  53,  53,  53,  53,  53,
+     53,  53,  53,  53,  53,  53,  53,  53,  53,  53,  53,  53,  53,  53,  53,  53,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   0,   0,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   0,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+     54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,
+     54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,
+     54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,   0,
+     54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,
+     54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,
+     54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,   0,
+      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,
+      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,
+      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,
+      6,   6,   6,   6,   0,   0,   0,   0,   0,   6,   6,   6,   6,   6,   6,   6,
+     30,  30,  30,  30,  30,  30,   0,  30,   0,   0,   0,   0,   0,  30,   0,   0,
+     55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,
+     55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,
+     55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,
+     55,  55,  55,  55,  55,  55,  55,  55,   0,   0,   0,   0,   0,   0,   0,  55,
+     55,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  55,
+     32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,
+     32,  32,  32,  32,  32,  32,  32,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     32,  32,  32,  32,  32,  32,  32,   0,  32,  32,  32,  32,  32,  32,  32,   0,
+     32,  32,  32,  32,  32,  32,  32,   0,  32,  32,  32,  32,  32,  32,  32,   0,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,
+     56,  56,  56,  56,  56,  56,  56,  56,  56,  56,   0,  56,  56,  56,  56,  56,
+     56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,
+     56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,
+     56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,
+     56,  56,  56,  56,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,
+     56,  56,  56,  56,  56,  56,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   0,   0,   0,   0,
+      1,   1,   1,   1,   1,  56,   1,  56,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,  56,  56,  56,  56,  56,  56,  56,  56,  56,   4,   4,   4,   4,  31,  31,
+      1,   1,   1,   1,   1,   1,   1,   1,  56,  56,  56,  56,   1,   1,   1,   1,
+      0,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,
+     57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,
+     57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,
+     57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,
+     57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,
+     57,  57,  57,  57,  57,  57,  57,   0,   0,   4,   4,   1,   1,  57,  57,  57,
+      1,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,
+     58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,
+     58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,
+     58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,
+     58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,
+     58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,   1,   1,  58,  58,  58,
+      0,   0,   0,   0,   0,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,
+      3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,
+      3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,
+      0,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,
+     31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,   0,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,
+      3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,
+      1,   1,   1,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,
+     31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,
+     31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,   0,
+     31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,
+     31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+     58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,
+     58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,
+     58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,   1,
+     58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,
+     58,  58,  58,  58,  58,  58,  58,  58,   1,   1,   1,   1,   1,   1,   1,   1,
+     56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,
+     56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,   0,   0,   0,
+     59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,
+     59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,
+     59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,   0,   0,   0,
+     59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,
+     59,  59,  59,  59,  59,  59,  59,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,
+     60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,
+     60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,
+     61,  61,  61,  61,  61,  61,  61,  61,  61,  61,  61,  61,  61,  61,  61,  61,
+     61,  61,  61,  61,  61,  61,  61,  61,  61,  61,  61,  61,  61,  61,  61,  61,
+     61,  61,  61,  61,  61,  61,  61,  61,  61,  61,  61,  61,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     62,  62,  62,  62,  62,  62,  62,  62,  62,  62,  62,  62,  62,  62,  62,  62,
+     62,  62,  62,  62,  62,  62,  62,  62,  62,  62,  62,  62,  62,  62,  62,  62,
+     62,  62,  62,  62,  62,  62,  62,  62,  62,  62,  62,  62,  62,  62,  62,  62,
+     62,  62,  62,  62,  62,  62,  62,  62,   0,   0,   0,   0,   0,   0,   0,   0,
+      1,   1,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
+      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
+      2,   2,   2,   2,   2,   2,   2,   2,   1,   1,   1,   2,   2,   2,   2,   2,
+      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
+      0,   0,   2,   2,   2,   2,   2,   2,   2,   2,   2,   0,   0,   0,   0,   0,
       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
+     63,  63,  63,  63,  63,  63,  63,  63,  63,  63,  63,  63,  63,  63,  63,  63,
+     63,  63,  63,  63,  63,  63,  63,  63,  63,  63,  63,  63,  63,  63,  63,  63,
+     63,  63,  63,  63,  63,  63,  63,  63,  63,  63,  63,  63,  63,   0,   0,   0,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   0,   0,   0,   0,   0,   0,
+     64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,
+     64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,
+     64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,
+     64,  64,  64,  64,  64,  64,  64,  64,   0,   0,   0,   0,   0,   0,   0,   0,
+     65,  65,  65,  65,  65,  65,  65,  65,  65,  65,  65,  65,  65,  65,  65,  65,
+     65,  65,  65,  65,  65,  65,  65,  65,  65,  65,  65,  65,  65,  65,  65,  65,
+     65,  65,  65,  65,  65,  65,   0,   0,   0,   0,   0,   0,   0,   0,  65,  65,
+     65,  65,  65,  65,  65,  65,  65,  65,  65,  65,   0,   0,   0,   0,   0,   0,
+     66,  66,  66,  66,  66,  66,  66,  66,  66,  66,  66,  66,  66,  66,  66,  66,
+     66,  66,  66,  66,  66,  66,  66,  66,  66,  66,  66,  66,  66,  66,  66,  66,
+     66,  66,  66,  66,  66,  66,  66,  66,  66,  66,  66,  66,  66,  66,   1,  66,
+     67,  67,  67,  67,  67,  67,  67,  67,  67,  67,  67,  67,  67,  67,  67,  67,
+     67,  67,  67,  67,  67,  67,  67,  67,  67,  67,  67,  67,  67,  67,  67,  67,
+     67,  67,  67,  67,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  67,
+     31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,
+     31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,   0,   0,   0,
+     68,  68,  68,  68,  68,  68,  68,  68,  68,  68,  68,  68,  68,  68,  68,  68,
+     68,  68,  68,  68,  68,  68,  68,  68,  68,  68,  68,  68,  68,  68,  68,  68,
+     68,  68,  68,  68,  68,  68,  68,  68,  68,  68,  68,  68,  68,  68,   0,   1,
+     68,  68,  68,  68,  68,  68,  68,  68,  68,  68,   0,   0,   0,   0,  68,  68,
+     29,  29,  29,  29,  29,  29,  29,  29,  29,  29,  29,  29,  29,  29,  29,  29,
+     29,  29,  29,  29,  29,  29,  29,  29,  29,  29,  29,  29,  29,  29,  29,   0,
+     69,  69,  69,  69,  69,  69,  69,  69,  69,  69,  69,  69,  69,  69,  69,  69,
+     69,  69,  69,  69,  69,  69,  69,  69,  69,  69,  69,  69,  69,  69,  69,  69,
+     69,  69,  69,  69,  69,  69,  69,  69,  69,  69,  69,  69,  69,  69,  69,  69,
+     69,  69,  69,  69,  69,  69,  69,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     69,  69,  69,  69,  69,  69,  69,  69,  69,  69,  69,  69,  69,  69,   0,   0,
+     69,  69,  69,  69,  69,  69,  69,  69,  69,  69,   0,   0,  69,  69,  69,  69,
+     70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  70,
+     70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  70,
+     70,  70,  70,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  70,  70,  70,  70,  70,
+     71,  71,  71,  71,  71,  71,  71,  71,  71,  71,  71,  71,  71,  71,  71,  71,
+     71,  71,  71,  71,  71,  71,  71,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,  32,  32,  32,  32,  32,  32,   0,   0,  32,  32,  32,  32,  32,  32,   0,
+      0,  32,  32,  32,  32,  32,  32,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     32,  32,  32,  32,  32,  32,  32,   0,  32,  32,  32,  32,  32,  32,  32,   0,
+      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
+      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
+      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   1,   2,   2,   2,   2,
+      2,   2,   2,   2,   2,   5,   2,   2,   2,   2,   1,   1,   0,   0,   0,   0,
+     33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,
+     71,  71,  71,  71,  71,  71,  71,  71,  71,  71,  71,  71,  71,  71,  71,  71,
+     71,  71,  71,  71,  71,  71,  71,  71,  71,  71,  71,  71,  71,  71,  71,  71,
+     71,  71,  71,  71,  71,  71,  71,  71,  71,  71,  71,  71,  71,  71,   0,   0,
+     71,  71,  71,  71,  71,  71,  71,  71,  71,  71,   0,   0,   0,   0,   0,   0,
+     31,  31,  31,  31,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,
+     31,  31,  31,  31,  31,  31,  31,   0,   0,   0,   0,  31,  31,  31,  31,  31,
+     31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,
+     31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,
+     31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,   0,   0,   0,   0,
+     56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,   0,   0,
+     56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,
+     56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,
+     56,  56,  56,  56,  56,  56,  56,  56,  56,  56,   0,   0,   0,   0,   0,   0,
+      2,   2,   2,   2,   2,   2,   2,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   8,   8,   8,   8,   8,   0,   0,   0,   0,   0,   9,   9,   9,
+      9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,
+      9,   9,   9,   9,   9,   9,   9,   0,   9,   9,   9,   9,   9,   0,   9,   0,
+      9,   9,   0,   9,   9,   0,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,
+     10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,
+     10,  10,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,
+     10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,
+     10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,   1,   1,
       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,  53,  54,  55,   0,   0,   0,   0,
-     56,   0,   0,  57,  58,  59,  60,  61,   0,   0,  62,  63,   0,   0,   0,  64,
+     10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,
+     10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,
+      0,   0,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,
+     10,  10,  10,  10,  10,  10,  10,  10,   0,   0,   0,   0,   0,   0,   0,   0,
       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,   0,   0,
+      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   0,   0,   0,   0,   0,   0,
+      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   7,   7,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   0,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   0,   1,   1,   1,   1,   0,   0,   0,   0,
+     10,  10,  10,  10,  10,   0,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,
+     10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,
+     10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,   0,   0,   1,
+      0,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,
+      1,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,
+     58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,
+     58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,   1,   1,
+      0,   0,  31,  31,  31,  31,  31,  31,   0,   0,  31,  31,  31,  31,  31,  31,
+      0,   0,  31,  31,  31,  31,  31,  31,   0,   0,  31,  31,  31,   0,   0,   0,
+      1,   1,   1,   1,   1,   1,   1,   0,   1,   1,   1,   1,   1,   1,   1,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   1,   1,   1,   1,   0,   0,
+     72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,   0,  72,  72,  72,
+     72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,
+     72,  72,  72,  72,  72,  72,  72,   0,  72,  72,  72,  72,  72,  72,  72,  72,
+     72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,   0,  72,  72,   0,  72,
+     72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,   0,   0,
+     72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,   0,   0,
+     72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,
+     72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,
+     72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,
+     72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,   0,   0,   0,   0,   0,
+      1,   1,   1,   0,   0,   0,   0,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   0,   0,   0,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   0,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   0,   0,   0,
+      5,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  65,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,  66,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,  67,   0,   0,   0,  68,   0,  69,   0,   0,
       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,  70,   0,   0,  71,   0,   0,   0,   0,
-      0,   0,   0,   0,  72,   0,   0,   0,   0,   0,   0,   0,   0,  73,   0,   0,
-      0,  74,  75,   0,  76,  60,   0,  77,  78,   0,   0,  79,  80,  81,   0,   0,
-      0,  82,   0,  83,   0,   0,  49,  84,  49,   0,  85,   0,  86,   0,   0,   0,
-     75,   0,   0,   0,   0,   0,   0,  87,  88,  89,  90,   0,   0,   0,   0,   0,
-     49,   0,   0,   0,   0,  91,  92,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   4,   0,   0,
+     73,  73,  73,  73,  73,  73,  73,  73,  73,  73,  73,  73,  73,  73,  73,  73,
+     73,  73,  73,  73,  73,  73,  73,  73,  73,  73,  73,  73,  73,   0,   0,   0,
+     74,  74,  74,  74,  74,  74,  74,  74,  74,  74,  74,  74,  74,  74,  74,  74,
+     74,  74,  74,  74,  74,  74,  74,  74,  74,  74,  74,  74,  74,  74,  74,  74,
+     74,  74,  74,  74,  74,  74,  74,  74,  74,  74,  74,  74,  74,  74,  74,  74,
+     74,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      4,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   0,   0,   0,   0,
+     75,  75,  75,  75,  75,  75,  75,  75,  75,  75,  75,  75,  75,  75,  75,  75,
+     75,  75,  75,  75,  75,  75,  75,  75,  75,  75,  75,  75,  75,  75,  75,  75,
+     75,  75,  75,  75,   0,   0,   0,   0,   0,   0,   0,   0,   0,  75,  75,  75,
+     76,  76,  76,  76,  76,  76,  76,  76,  76,  76,  76,  76,  76,  76,  76,  76,
+     76,  76,  76,  76,  76,  76,  76,  76,  76,  76,  76,   0,   0,   0,   0,   0,
+     77,  77,  77,  77,  77,  77,  77,  77,  77,  77,  77,  77,  77,  77,  77,  77,
+     77,  77,  77,  77,  77,  77,  77,  77,  77,  77,  77,  77,  77,  77,  77,  77,
+     77,  77,  77,  77,  77,  77,  77,  77,  77,  77,  77,   0,   0,   0,   0,   0,
+     78,  78,  78,  78,  78,  78,  78,  78,  78,  78,  78,  78,  78,  78,  78,  78,
+     78,  78,  78,  78,  78,  78,  78,  78,  78,  78,  78,  78,  78,  78,   0,  78,
+     79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,
+     79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,
+     79,  79,  79,  79,   0,   0,   0,   0,  79,  79,  79,  79,  79,  79,  79,  79,
+     79,  79,  79,  79,  79,  79,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     80,  80,  80,  80,  80,  80,  80,  80,  80,  80,  80,  80,  80,  80,  80,  80,
+     80,  80,  80,  80,  80,  80,  80,  80,  80,  80,  80,  80,  80,  80,  80,  80,
+     80,  80,  80,  80,  80,  80,  80,  80,  80,  80,  80,  80,  80,  80,  80,  80,
+     81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,
+     81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,
+     81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,
+     82,  82,  82,  82,  82,  82,  82,  82,  82,  82,  82,  82,  82,  82,  82,  82,
+     82,  82,  82,  82,  82,  82,  82,  82,  82,  82,  82,  82,  82,  82,   0,   0,
+     82,  82,  82,  82,  82,  82,  82,  82,  82,  82,   0,   0,   0,   0,   0,   0,
+     83,  83,  83,  83,  83,  83,  83,  83,  83,  83,  83,  83,  83,  83,  83,  83,
+     83,  83,  83,  83,  83,  83,  83,  83,  83,  83,  83,  83,  83,  83,  83,  83,
+     83,  83,  83,  83,   0,   0,   0,   0,  83,  83,  83,  83,  83,  83,  83,  83,
+     83,  83,  83,  83,  83,  83,  83,  83,  83,  83,  83,  83,  83,  83,  83,  83,
+     83,  83,  83,  83,  83,  83,  83,  83,  83,  83,  83,  83,   0,   0,   0,   0,
+     84,  84,  84,  84,  84,  84,  84,  84,  84,  84,  84,  84,  84,  84,  84,  84,
+     84,  84,  84,  84,  84,  84,  84,  84,  84,  84,  84,  84,  84,  84,  84,  84,
+     84,  84,  84,  84,  84,  84,  84,  84,   0,   0,   0,   0,   0,   0,   0,   0,
+     85,  85,  85,  85,  85,  85,  85,  85,  85,  85,  85,  85,  85,  85,  85,  85,
+     85,  85,  85,  85,  85,  85,  85,  85,  85,  85,  85,  85,  85,  85,  85,  85,
+     85,  85,  85,  85,  85,  85,  85,  85,  85,  85,  85,  85,  85,  85,  85,  85,
+     85,  85,  85,  85,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  85,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     86,  86,  86,  86,  86,  86,  86,  86,  86,  86,  86,  86,  86,  86,  86,  86,
+     86,  86,  86,  86,  86,  86,  86,  86,  86,  86,  86,  86,  86,  86,  86,  86,
+     86,  86,  86,  86,  86,  86,  86,  86,  86,  86,  86,  86,  86,  86,  86,  86,
+     86,  86,  86,  86,  86,  86,  86,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     86,  86,  86,  86,  86,  86,  86,  86,  86,  86,  86,  86,  86,  86,  86,  86,
+     86,  86,  86,  86,  86,  86,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     86,  86,  86,  86,  86,  86,  86,  86,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     87,  87,  87,  87,  87,  87,   0,   0,  87,   0,  87,  87,  87,  87,  87,  87,
+     87,  87,  87,  87,  87,  87,  87,  87,  87,  87,  87,  87,  87,  87,  87,  87,
+     87,  87,  87,  87,  87,  87,  87,  87,  87,  87,  87,  87,  87,  87,  87,  87,
+     87,  87,  87,  87,  87,  87,   0,  87,  87,   0,   0,   0,  87,   0,   0,  87,
+     88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,
+     88,  88,  88,  88,  88,  88,   0,  88,  88,  88,  88,  88,  88,  88,  88,  88,
+     89,  89,  89,  89,  89,  89,  89,  89,  89,  89,  89,  89,  89,  89,  89,  89,
+     89,  89,  89,  89,  89,  89,  89,  89,  89,  89,  89,  89,  89,  89,  89,  89,
+     90,  90,  90,  90,  90,  90,  90,  90,  90,  90,  90,  90,  90,  90,  90,  90,
+     90,  90,  90,  90,  90,  90,  90,  90,  90,  90,  90,  90,  90,  90,  90,   0,
+      0,   0,   0,   0,   0,   0,   0,  90,  90,  90,  90,  90,  90,  90,  90,  90,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     91,  91,  91,  91,  91,  91,  91,  91,  91,  91,  91,  91,  91,  91,  91,  91,
+     91,  91,  91,   0,  91,  91,   0,   0,   0,   0,   0,  91,  91,  91,  91,  91,
+     92,  92,  92,  92,  92,  92,  92,  92,  92,  92,  92,  92,  92,  92,  92,  92,
+     92,  92,  92,  92,  92,  92,  92,  92,  92,  92,  92,  92,   0,   0,   0,  92,
+     93,  93,  93,  93,  93,  93,  93,  93,  93,  93,  93,  93,  93,  93,  93,  93,
+     93,  93,  93,  93,  93,  93,  93,  93,  93,  93,   0,   0,   0,   0,   0,  93,
+     94,  94,  94,  94,  94,  94,  94,  94,  94,  94,  94,  94,  94,  94,  94,  94,
+     94,  94,  94,  94,  94,  94,  94,  94,  94,  94,  94,  94,  94,  94,  94,  94,
+     95,  95,  95,  95,  95,  95,  95,  95,  95,  95,  95,  95,  95,  95,  95,  95,
+     95,  95,  95,  95,  95,  95,  95,  95,   0,   0,   0,   0,  95,  95,  95,  95,
+     95,  95,  95,  95,  95,  95,  95,  95,  95,  95,  95,  95,  95,  95,  95,  95,
+      0,   0,  95,  95,  95,  95,  95,  95,  95,  95,  95,  95,  95,  95,  95,  95,
+     95,  95,  95,  95,  95,  95,  95,  95,  95,  95,  95,  95,  95,  95,  95,  95,
+     95,  95,  95,  95,  95,  95,  95,  95,  95,  95,  95,  95,  95,  95,  95,  95,
+     96,  96,  96,  96,   0,  96,  96,   0,   0,   0,   0,   0,  96,  96,  96,  96,
+     96,  96,  96,  96,   0,  96,  96,  96,   0,  96,  96,  96,  96,  96,  96,  96,
+     96,  96,  96,  96,  96,  96,  96,  96,  96,  96,  96,  96,  96,  96,  96,  96,
+     96,  96,  96,  96,  96,  96,   0,   0,  96,  96,  96,   0,   0,   0,   0,  96,
+     96,  96,  96,  96,  96,  96,  96,  96,  96,   0,   0,   0,   0,   0,   0,   0,
+     96,  96,  96,  96,  96,  96,  96,  96,  96,   0,   0,   0,   0,   0,   0,   0,
+     97,  97,  97,  97,  97,  97,  97,  97,  97,  97,  97,  97,  97,  97,  97,  97,
+     97,  97,  97,  97,  97,  97,  97,  97,  97,  97,  97,  97,  97,  97,  97,  97,
+     98,  98,  98,  98,  98,  98,  98,  98,  98,  98,  98,  98,  98,  98,  98,  98,
+     98,  98,  98,  98,  98,  98,  98,  98,  98,  98,  98,  98,  98,  98,  98,  98,
+     99,  99,  99,  99,  99,  99,  99,  99,  99,  99,  99,  99,  99,  99,  99,  99,
+     99,  99,  99,  99,  99,  99,  99,  99,  99,  99,  99,  99,  99,  99,  99,  99,
+     99,  99,  99,  99,  99,  99,  99,   0,   0,   0,   0,  99,  99,  99,  99,  99,
+     99,  99,  99,  99,  99,  99,  99,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100,
+    100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100,
+    100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100,
+    100, 100, 100, 100, 100, 100,   0,   0,   0, 100, 100, 100, 100, 100, 100, 100,
+    101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101,
+    101, 101, 101, 101, 101, 101,   0,   0, 101, 101, 101, 101, 101, 101, 101, 101,
+    102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102,
+    102, 102, 102,   0,   0,   0,   0,   0, 102, 102, 102, 102, 102, 102, 102, 102,
+    103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103,
+    103, 103,   0,   0,   0,   0,   0,   0,   0, 103, 103, 103, 103,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0, 103, 103, 103, 103, 103, 103, 103,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104,
+    104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104,
+    104, 104, 104, 104, 104, 104, 104, 104, 104,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105,
+    105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105,
+    105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105,
+    105, 105, 105,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105,
+    105, 105, 105,   0,   0,   0,   0,   0,   0,   0, 105, 105, 105, 105, 105, 105,
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106,
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106,
+    106, 106, 106, 106, 106, 106, 106, 106,   0,   0,   0,   0,   0,   0,   0,   0,
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106,   0,   0,   0,   0,   0,   0,
+     10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,
+     10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,   0,
+    107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107,
+    107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107,
+    107, 107, 107, 107, 107, 107, 107, 107, 107, 107,   0, 107, 107, 107,   0,   0,
+    107, 107,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108,
+    108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108,
+    108, 108, 108, 108, 108, 108, 108, 108,   0,   0,   0,   0,   0,   0,   0,   0,
+    109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109,
+    109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109,
+    109, 109, 109, 109, 109, 109, 109, 109, 109, 109,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110,
+    110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111,
+    111, 111, 111, 111, 111, 111, 111,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112,
+    112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112,
+    112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112,   0,   0,
+      0,   0, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112,
+    112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 112,
+    113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+    113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+    113, 113,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 113,   0,   0,
+    114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114,
+    114, 114, 114, 114, 114, 114, 114, 114, 114,   0,   0,   0,   0,   0,   0,   0,
+    114, 114, 114, 114, 114, 114, 114, 114, 114, 114,   0,   0,   0,   0,   0,   0,
+    115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115,
+    115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115,
+    115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115,
+    115, 115, 115, 115, 115,   0, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115,
+    115, 115, 115, 115, 115, 115, 115, 115,   0,   0,   0,   0,   0,   0,   0,   0,
+    116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116,
+    116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116,
+    116, 116, 116, 116, 116, 116, 116,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117,
+    117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117,
+      0,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,
+     25,  25,  25,  25,  25,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118,
+    118, 118,   0, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118,
+    118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118,
+    118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118,   0,
+    119, 119, 119, 119, 119, 119, 119,   0, 119,   0, 119, 119, 119, 119,   0, 119,
+    119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119,   0, 119,
+    119, 119, 119, 119, 119, 119, 119, 119, 119, 119,   0,   0,   0,   0,   0,   0,
+    120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
+    120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
+    120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
+    120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,   0,   0,   0,   0,   0,
+    120, 120, 120, 120, 120, 120, 120, 120, 120, 120,   0,   0,   0,   0,   0,   0,
+    121, 121, 121, 121,   0, 121, 121, 121, 121, 121, 121, 121, 121,   0,   0, 121,
+    121,   0,   0, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+    121, 121, 121, 121, 121, 121, 121, 121, 121,   0, 121, 121, 121, 121, 121, 121,
+    121,   0, 121, 121,   0, 121, 121, 121, 121, 121,   0,   4, 121, 121, 121, 121,
+    121, 121, 121, 121, 121,   0,   0, 121, 121,   0,   0, 121, 121, 121,   0,   0,
+    121,   0,   0,   0,   0,   0,   0, 121,   0,   0,   0,   0,   0, 121, 121, 121,
+    121, 121, 121, 121,   0,   0, 121, 121, 121, 121, 121, 121, 121,   0,   0,   0,
+    121, 121, 121, 121, 121,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+    122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+    122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+    122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122,   0, 122, 122, 122,
+    122, 122,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+    123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+    123, 123, 123, 123, 123, 123, 123, 123,   0,   0,   0,   0,   0,   0,   0,   0,
+    123, 123, 123, 123, 123, 123, 123, 123, 123, 123,   0,   0,   0,   0,   0,   0,
+    124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+    124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+    124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+    124, 124, 124, 124, 124, 124,   0,   0, 124, 124, 124, 124, 124, 124, 124, 124,
+    124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+    124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,   0,   0,
+    125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+    125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+    125, 125, 125, 125, 125,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    125, 125, 125, 125, 125, 125, 125, 125, 125, 125,   0,   0,   0,   0,   0,   0,
+     42,  42,  42,  42,  42,  42,  42,  42,  42,  42,  42,  42,  42,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+    126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+    126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+    126, 126, 126, 126, 126, 126, 126, 126, 126,   0,   0,   0,   0,   0,   0,   0,
+    126, 126, 126, 126, 126, 126, 126, 126, 126, 126,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,   0,   0, 127, 127, 127,
+    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,   0,   0,   0,   0,
+    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,   0,   0,   0,   0,
+    129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+    129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+    129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+    129, 129, 129,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 129,
+    130, 130, 130, 130, 130, 130, 130,   0,   0, 130,   0,   0, 130, 130, 130, 130,
+    130, 130, 130, 130,   0, 130, 130,   0, 130, 130, 130, 130, 130, 130, 130, 130,
+    130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+    130, 130, 130, 130, 130, 130,   0, 130, 130,   0,   0, 130, 130, 130, 130, 130,
+    130, 130, 130, 130, 130, 130, 130,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    130, 130, 130, 130, 130, 130, 130, 130, 130, 130,   0,   0,   0,   0,   0,   0,
+    131, 131, 131, 131, 131, 131, 131, 131,   0,   0, 131, 131, 131, 131, 131, 131,
+    131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+    131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+    131, 131, 131, 131, 131, 131, 131, 131,   0,   0, 131, 131, 131, 131, 131, 131,
+    131, 131, 131, 131, 131,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+    132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+    132, 132, 132, 132, 132, 132, 132, 132,   0,   0,   0,   0,   0,   0,   0,   0,
+    133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+    133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+    133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+    133, 133, 133,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+    134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+    134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+    134, 134, 134, 134, 134, 134, 134, 134, 134,   0,   0,   0,   0,   0,   0,   0,
+    135, 135, 135, 135, 135, 135, 135, 135, 135,   0, 135, 135, 135, 135, 135, 135,
+    135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+    135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+    135, 135, 135, 135, 135, 135, 135,   0, 135, 135, 135, 135, 135, 135, 135, 135,
+    135, 135, 135, 135, 135, 135,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+    135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135,   0,   0,   0,
+    136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+    136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+      0,   0, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+    136, 136, 136, 136, 136, 136, 136, 136,   0, 136, 136, 136, 136, 136, 136, 136,
+    136, 136, 136, 136, 136, 136, 136,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    137, 137, 137, 137, 137, 137, 137,   0, 137, 137,   0, 137, 137, 137, 137, 137,
+    137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+    137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+    137, 137, 137, 137, 137, 137, 137,   0,   0,   0, 137,   0, 137, 137,   0, 137,
+    137, 137, 137, 137, 137, 137, 137, 137,   0,   0,   0,   0,   0,   0,   0,   0,
+    137, 137, 137, 137, 137, 137, 137, 137, 137, 137,   0,   0,   0,   0,   0,   0,
+    138, 138, 138, 138, 138, 138,   0, 138, 138,   0, 138, 138, 138, 138, 138, 138,
+    138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138,
+    138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138,   0,
+    138, 138,   0, 138, 138, 138, 138, 138, 138,   0,   0,   0,   0,   0,   0,   0,
+    138, 138, 138, 138, 138, 138, 138, 138, 138, 138,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139,
+    139, 139, 139, 139, 139, 139, 139, 139, 139,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     60,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,
+     21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,
+     21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,
+     21,  21,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  21,
+    140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,
+    140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,
+    140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,
+    140, 140, 140, 140, 140, 140, 140, 140, 140, 140,   0,   0,   0,   0,   0,   0,
+    140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,   0,
+    140, 140, 140, 140, 140,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    140, 140, 140, 140,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141,
+    141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141,
+    141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141,   0,
+    141, 141, 141, 141, 141, 141, 141, 141, 141,   0,   0,   0,   0,   0,   0,   0,
+    142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142,
+    142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142,
+    142, 142, 142, 142, 142, 142, 142,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     62,  62,  62,  62,  62,  62,  62,  62,  62,  62,  62,  62,  62,  62,  62,  62,
+     62,  62,  62,  62,  62,  62,  62,  62,  62,   0,   0,   0,   0,   0,   0,   0,
+    143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143,
+    143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143,   0,
+    143, 143, 143, 143, 143, 143, 143, 143, 143, 143,   0,   0,   0,   0, 143, 143,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144,
+    144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144,   0,   0,
+    144, 144, 144, 144, 144, 144,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145,
+    145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145,
+    145, 145, 145, 145, 145, 145,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    145, 145, 145, 145, 145, 145, 145, 145, 145, 145,   0, 145, 145, 145, 145, 145,
+    145, 145,   0, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145,
+    145, 145, 145, 145, 145, 145, 145, 145,   0,   0,   0,   0,   0, 145, 145, 145,
+    145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146,
+    146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146,
+    146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146,
+    146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146,   0,   0,   0,   0,   0,
+    147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147,
+    147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147,
+    147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147,   0,   0,   0,   0, 147,
+    147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147,
+    147, 147, 147, 147, 147, 147, 147, 147,   0,   0,   0,   0,   0,   0,   0, 147,
+    147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147,
+    148, 149,   1,   1, 150,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     56,  56,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148,
+    148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148,
+    148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148,
+    148, 148, 148, 148, 148, 148, 148, 148,   0,   0,   0,   0,   0,   0,   0,   0,
+    150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150,
+    150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150,
+    150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150,
+    150, 150, 150, 150, 150, 150,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    148, 148, 148, 148, 148, 148, 148, 148, 148,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     58,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,
+     57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,
+     57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,
+     57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,   0,
       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  93,  94,   0,   0,   0,
+     57,  57,  57,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,  58,  58,  58,  58,   0,   0,   0,   0,   0,   0,   0,   0,
+    149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149,
+    149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149,
+    149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149,
+    149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149,
+    149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149,   0,   0,   0,   0,
+    151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151,
+    151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151,
+    151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151,   0,   0,   0,   0,   0,
+    151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151,   0,   0,   0,
+    151, 151, 151, 151, 151, 151, 151, 151, 151,   0,   0,   0,   0,   0,   0,   0,
+    151, 151, 151, 151, 151, 151, 151, 151, 151, 151,   0,   0, 151, 151, 151, 151,
+      1,   1,   1,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      1,   1,   1,   1,   1,   1,   1,   0,   0,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   4,   4,   4,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   4,   4,   4,   4,   4,
+      4,   4,   4,   1,   1,   4,   4,   4,   4,   4,   4,   4,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   4,   4,   4,   4,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   0,   0,   0,   0,   0,   0,   0,
       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      5,   5,   5,   5,   5,   5,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   0,   0,   0,   0,   0,   0,   0,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   0,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   0,   1,   1,
+      0,   0,   1,   0,   0,   1,   1,   0,   0,   1,   1,   1,   1,   0,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   0,   1,   0,   1,   1,   1,
+      1,   1,   1,   1,   0,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   0,   1,   1,   1,   1,   0,   0,   1,   1,   1,
+      1,   1,   1,   1,   1,   0,   1,   1,   1,   1,   1,   1,   1,   0,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   0,   1,   1,   1,   1,   0,
+      1,   1,   1,   1,   1,   0,   1,   0,   0,   0,   1,   1,   1,   1,   1,   1,
+      1,   0,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   0,   0,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   0,   0,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+    152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152,
+    152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152,
+    152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 152, 152, 152, 152, 152,
+      0, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     54,  54,  54,  54,  54,  54,  54,   0,  54,  54,  54,  54,  54,  54,  54,  54,
+     54,  54,  54,  54,  54,  54,  54,  54,  54,   0,   0,  54,  54,  54,  54,  54,
+     54,  54,   0,  54,  54,   0,  54,  54,  54,  54,  54,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153,
+    153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153,
+    153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153,   0,   0,   0,
+    153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153,   0,   0,
+    153, 153, 153, 153, 153, 153, 153, 153, 153, 153,   0,   0,   0,   0, 153, 153,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154,
+    154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154,
+    154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154,
+    154, 154, 154, 154, 154, 154, 154, 154, 154, 154,   0,   0,   0,   0,   0, 154,
+    155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155,
+    155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155,
+    155, 155, 155, 155, 155,   0,   0, 155, 155, 155, 155, 155, 155, 155, 155, 155,
+    155, 155, 155, 155, 155, 155, 155,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156,
+    156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156,
+    156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156,   0,   0,   0,   0,
+    156, 156, 156, 156, 156, 156, 156, 156, 156, 156,   0,   0,   0,   0, 156, 156,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   0,   0,
+     10,  10,  10,  10,   0,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,
+     10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,
+      0,  10,  10,   0,  10,   0,   0,  10,   0,  10,  10,  10,  10,  10,  10,  10,
+     10,  10,  10,   0,  10,  10,  10,  10,   0,  10,   0,  10,   0,   0,   0,   0,
+      0,   0,  10,   0,   0,   0,   0,  10,   0,  10,   0,  10,   0,  10,  10,  10,
+      0,  10,  10,   0,  10,   0,   0,  10,   0,  10,   0,  10,   0,  10,   0,  10,
+      0,  10,  10,   0,  10,   0,   0,  10,  10,  10,  10,   0,  10,  10,  10,  10,
+     10,  10,  10,   0,  10,  10,  10,  10,   0,  10,  10,  10,  10,   0,  10,   0,
+     10,  10,  10,  10,  10,  10,  10,  10,  10,  10,   0,  10,  10,  10,  10,  10,
+     10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,   0,   0,   0,   0,
+      0,  10,  10,  10,   0,  10,  10,  10,  10,  10,   0,  10,  10,  10,  10,  10,
+     10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     10,  10,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   0,   0,   0,   0,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   0,
+      0,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      0,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      0,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   0,   0,
       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,  95,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,  96,  97,   0,   0,  98,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+     57,   1,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   0,   0,   0,   0,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   0,   0,   0,   0,   0,   0,   0,
+      1,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      1,   1,   1,   1,   1,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   0,   0,   0,   0,   0,   0,   0,   0,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   0,   0,   0,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   0,   0,   0,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      1,   1,   1,   1,   1,   1,   1,   1,   0,   0,   0,   0,   0,   0,   0,   0,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   0,   0,   0,   0,   0,   0,
+      1,   1,   1,   1,   1,   1,   1,   1,   0,   0,   0,   0,   0,   0,   0,   0,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   0,   0,
+      1,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   0,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   0,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   0,   0,
+      1,   1,   1,   1,   1,   0,   0,   0,   1,   1,   1,   0,   0,   0,   0,   0,
+      1,   1,   1,   1,   1,   1,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   0,   0,   0,   0,   0,   0,   0,
+      1,   1,   1,   1,   1,   1,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      1,   1,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      1,   1,   1,   1,   1,   1,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,
       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   0,   0,   0,   0,   0,   0,
+     56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,
+     56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,   0,   0,
+     56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,
+     56,  56,  56,  56,  56,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     56,  56,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,
+     56,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     99,   0,   0,   0,  94,   0,   0,   0,   0,   0,   0, 100,   0,   0,   0,   0,
+     56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,   0,   0,   0,   0,   0,
       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0, 101,   0, 102,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0
 };
 
-static RE_UINT8 re_canonical_combining_class_stage_3[] = {
-      0,   0,   0,   0,   0,   0,   0,   0,   1,   1,   2,   3,   4,   5,   6,   7,
-      8,   9,  10,  11,  12,   1,   0,   0,  13,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,  14,  15,  16,  17,  18,  19,  20,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   1,  21,   0,   0,   0,   0,   0,  22,  23,  24,   0,   0,  25,   0,
-      0,   0,  26,  27,  28,  29,   0,   0,   0,   0,  30,   0,   0,   0,  31,  32,
-     33,  34,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  13,  35,  36,
-      0,   0,  26,  37,  38,  39,   0,   0,   0,   0,   0,  40,   0,   0,   0,   0,
-      0,   0,  41,   1,  42,  43,  44,  45,   0,   0,   0,   0,   0,   0,   0,  46,
-      0,  47,  48,   0,   0,   0,   0,   0,   0,  47,   0,   0,   0,   0,   0,  49,
-      0,  47,   0,   0,   0,   0,   0,   0,   0,  47,  50,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,  51,   0,  52,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,  53,   0,  54,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,  55,   0,  56,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,  57,   0,   0,  58,  59,   0,   0,   0,   0,   0,   0,  60,  61,
-     62,   0,   0,   0,   0,   0,   0,   0,  63,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,  64,  65,   0,  36,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,  66,   0,   0,   0,   0,   0,   0,  67,   0,   0,   0,  67,   0,
-      0,   0,  52,  68,   0,   0,   0,   0,   0,   0,   0,   0,   0,  69,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,  70,   0,   0,  71,  72,   0,   0,   0,   0,
-      0,   0,   0,   0,  73,   0,  66,  74,   0,   0,   0,   0,   0,   0,  75,  76,
-      0,   0,   0,   0,   0,   0,  46,   0,  67,   0,   0,   0,   0,  77,  78,   0,
-      0,   0,   0,   0,   0,  79,   0,   0,   0,   0,   0,   0,  80,   0,  79,   0,
-      0,   0,   0,   0,   0,   0,  64,   0,   0,   0,  81,  82,  83,  84,  85,  86,
-     87,  88,  89,   1,   1,   1,  90,  91,   0,   0,  92,  93,  94,  95,  96,   0,
-      0,   0,   0,   0,   0,  71,  86,   0,   0,   0,   0,   0,   0,   0,   0,  97,
-      0,   0,   0,   0,   1,   1,   1,   1,   0,   0,   0,   0,   0,  98,   0,   0,
-      0,   0,   0,  99,   0,   0,   0,   0,   0,   0,   0,   0,   0,  71, 100, 101,
-      0,   0,   0,  26,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  86,   0,
-    102,   0,   0,   0,   0,   0,   0,   0,  67,   0,   0,   0,   1,   1,  86,   0,
-      0,   0,   0,   0,   0, 103,   0,   0,   0,   0, 104,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0, 105,   0,  73,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0, 106, 107, 108,   0,   0,   0,   0,   0, 102,   0,
-      0,   0,   0,   0,   0,  47,   0,   0,   0,   0,   0, 109,   0,   0,   0,   0,
-      0,   0,   0,   0, 110, 111,   0,   0,   0,   0,   0,   0,   0,   0,   0,  36,
-      0,   0,   0,   0,  72,   0,   0,   0,   0,   0,   0,   0,   0,   0,  26, 112,
-      0, 113,   0,   0,   0,   0,   0, 114,   0,   0,   0,   0, 115,   0,   0,   0,
-      0,   0,   0,   0, 100,   0,   0,   0, 116, 117,  72,   0,   0,   0,   0,   0,
-    102,   0,   0,   0,   0,   0,   0,  97,   0,   0,   0,   0,   0,   0,   0, 118,
-    112,   0,   0,   0,   0,   0,  51,   0,  73, 119,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0, 120,   0,   0,   0,   0,   0,   0, 121,   0,   0,
-      0,   0,   0,   0,   0,   0,   0, 122,   0,  47,   0,   0,  26, 123, 123,   0,
-    124,   0,   0,  49,   0,   0,   0,   0, 125,   0,   0,   0,   0,   0,   0,   0,
-    126,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 127,   0,
-      0,   0,   0,   0,   0, 104,   0,   0,   0,   0,   0,   0,  73,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,  67,   0,  97,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0, 128,   0,   0,   0,   0, 129,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,  97,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 130,   0,
-      0,   0,   0,   0,   0,   0, 131,   0,   0,   0,   0, 132,   0,   0,   0,   0,
-      0,   0,   0,   0, 133, 134, 135, 136, 137, 138,   0,   0,   0, 139,   0,   0,
-    140,   0,   0,   0,   0,   0,   0,   0, 131,   1,   1, 141, 142, 112,   0,   0,
-      0,   0,   0,   0,   0, 100,   0,   0,   0,   0, 143,   0,   0,   0,   0,   0,
-    100, 144,   0,   0,   0,   0,   0,   0,
-};
-
-static RE_UINT8 re_canonical_combining_class_stage_4[] = {
-     0,  0,  0,  0,  0,  0,  0,  0, 50, 50, 50, 50, 50, 50, 50, 50,
-    50, 50, 50, 50, 50, 51, 45, 45, 45, 45, 51, 43, 45, 45, 45, 45,
-    45, 41, 41, 45, 45, 45, 45, 41, 41, 45, 45, 45, 45, 45, 45, 45,
-    45, 45, 45, 45,  1,  1,  1,  1,  1, 45, 45, 45, 45, 50, 50, 50,
-    50, 50, 50, 50, 50, 54, 50, 45, 45, 45, 50, 50, 50, 45, 45,  0,
-    50, 50, 50, 45, 45, 45, 45, 50, 51, 45, 45, 50, 52, 53, 53, 52,
-    53, 53, 52, 50, 50, 50, 50, 50,  0,  0,  0, 50, 50, 50, 50, 50,
-     0, 45, 50, 50, 50, 50, 45, 50, 50, 50, 46, 45, 50, 50, 50, 50,
-    50, 50, 45, 45, 45, 45, 45, 45, 50, 50, 45, 50, 50, 46, 49, 50,
-     5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 14, 15, 16, 17,  0, 18,
-     0, 19, 20,  0, 50, 45,  0, 13, 25, 26, 27,  0,  0,  0,  0,  0,
-     0,  0,  0, 22, 23, 24, 25, 26, 27, 28, 29, 50, 50, 45, 45, 50,
-    50, 50, 50, 50, 45, 50, 50, 45, 30,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0, 50, 50, 50, 50, 50, 50, 50,  0,  0, 50,
-    50, 50, 50, 45, 50,  0,  0, 50, 50,  0, 45, 50, 50, 45,  0,  0,
-     0, 31,  0,  0,  0,  0,  0,  0, 50, 45, 50, 50, 45, 50, 50, 45,
-    45, 45, 50, 45, 45, 50, 45, 50, 50, 50, 45, 50, 45, 50, 45, 50,
-    45, 50, 50,  0,  0,  0,  0,  0, 50, 50, 45, 50,  0,  0,  0,  0,
-     0,  0,  0,  0,  0, 45,  0,  0, 50, 50,  0, 50, 50, 50, 50, 50,
-    50, 50, 50, 50,  0, 50, 50, 50,  0, 50, 50, 50, 50, 50,  0,  0,
-     0, 45, 45, 45,  0,  0,  0,  0,  0,  0,  0, 45, 50, 50, 50, 50,
-    50, 50,  0, 45, 50, 50, 45, 50, 50, 45, 50, 50, 50, 45, 45, 45,
-    22, 23, 24, 50, 50, 50, 45, 50, 50, 45, 45, 50, 50, 50, 50, 50,
-     0,  0,  0,  0,  2,  0,  0,  0,  0,  0,  0,  0,  0,  4,  0,  0,
-     0, 50, 45, 50, 50,  0,  0,  0,  0,  0,  0,  0,  0,  0, 50,  0,
-     0,  0,  0,  0,  0, 32, 33,  0,  0,  0,  0,  4,  4,  0,  0,  0,
-     0,  0,  4,  0,  0,  0,  0,  0, 34, 34,  4,  0,  0,  0,  0,  0,
-    35, 35, 35, 35,  0,  0,  0,  0, 36, 36,  4,  0,  0,  0,  0,  0,
-    37, 37, 37, 37,  0,  0,  0,  0, 45, 45,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0, 45,  0, 45,  0, 43,  0,  0,  0,  0,  0,  0,
-     0, 38, 39,  0, 40,  0,  0,  0,  0,  0, 39, 39, 39, 39,  0,  0,
-    39,  0, 50, 50,  4,  0, 50, 50,  0,  0,  0,  0,  0,  0, 45,  0,
-     0,  0,  0,  0,  0,  0,  0,  2,  0,  4,  4,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0, 50, 50, 50,  0,  0,  0,  0,  4,  0,  0,  0,
-     0,  0,  0,  0,  0, 50,  0,  0,  0, 49,  0,  0,  0,  0,  0,  0,
-     0, 46, 50, 45,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 50,
-    45,  0,  0,  0,  0,  0,  0,  0,  4,  0,  0,  0,  0,  0,  0,  0,
-    50, 50, 50, 50, 50,  0,  0, 45, 50, 50, 50, 50, 50, 45, 45, 45,
-    45, 45, 45, 50, 50, 45,  0,  0,  0,  0,  0, 50, 45, 50, 50, 50,
-    50, 50, 50, 50,  0,  0,  0,  0,  0,  0,  4,  4,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0,  2,  0, 50, 50, 50,  0,  1, 45, 45, 45,
-    45, 45, 50, 50, 45, 45, 45, 45, 50,  0,  1,  1,  1,  1,  1,  1,
-     1,  0,  0,  0,  0, 45,  0,  0,  0,  0,  0,  0, 50,  0,  0,  0,
-    50, 50,  0,  0,  0,  0,  0,  0, 50, 50, 45, 50, 50, 50, 50, 50,
-    50, 50, 45, 50, 50, 53, 42, 45, 41, 50, 50, 50, 50, 50, 50, 50,
-    50, 50, 50, 50, 50, 50, 51, 49, 49, 45,  0, 50, 52, 45, 50, 45,
-    50, 50,  1,  1, 50, 50, 50, 50,  1,  1,  1, 50, 50,  0,  0,  0,
-     0, 50,  0,  0,  0,  1,  1, 50, 45, 50,  1,  1, 45, 45, 45, 45,
-    50,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  4,
-     0,  0, 44, 49, 51, 46, 47, 47,  0,  3,  3,  0,  0,  0,  0,  0,
-     0,  0,  0,  0, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,  0,  0,
-     0,  0,  0,  0,  0,  0,  4,  0,  0,  0,  0, 45, 45, 45,  0,  0,
-     0,  0,  0,  4,  0,  0,  0,  0,  0,  0,  0,  2,  0,  0,  0,  0,
-    50,  0, 50, 50, 45,  0,  0, 50, 50,  0,  0,  0,  0,  0, 50, 50,
-     0, 50,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 21,  0,
-    50, 50, 50, 50, 50, 50, 50, 45, 45, 45, 45, 45, 45, 45, 50, 50,
-    50, 50, 50,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 45,  0, 50,
-    50,  1, 45,  0,  0,  0,  0,  4,  0,  0,  0,  0,  0, 50, 45,  0,
-     0,  0,  0,  0,  0,  0, 45, 45, 50, 50, 50, 45, 50, 45, 45, 45,
-     0,  4,  2,  0,  0,  0,  0,  0,  0,  0,  2,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  4,  2,  0,  0,  2,  4,  0,  0,  0,  0,  0,
-     0,  0,  0,  2,  2,  0,  0,  0, 50, 50, 50, 50, 50,  0,  0,  0,
-     0,  0,  4,  0,  0,  0,  2,  0,  0,  0,  4,  2,  0,  0,  0,  0,
-     2,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  4,  2,
-     0,  4,  0,  0,  0,  0,  0,  0,  0,  0,  2,  0,  4,  4,  0,  0,
-     1,  1,  1,  1,  1,  0,  0,  0, 50, 50, 50, 50, 50, 50, 50,  0,
-     0,  0,  0,  0,  0,  0,  1,  0,  0,  0,  0,  0,  0, 43, 43,  1,
-     1,  1,  0,  0,  0, 48, 43, 43, 43, 43, 43,  0,  0,  0,  0,  0,
-     0,  0,  0, 45, 45, 45, 45, 45, 45, 45, 45,  0,  0, 50, 50, 50,
-    50, 50, 45, 45,  0,  0,  0,  0,  0,  0, 50, 50, 50, 50,  0,  0,
-     0,  0, 50, 50, 50,  0,  0,  0, 50,  0,  0, 50, 50, 50, 50, 50,
-    50, 50,  0, 50, 50,  0, 50, 50, 45, 45, 45, 45, 45, 45, 45,  0,
-    50, 50,  2,  0,  0,  0,  0,  0,
-};
+RE_UINT32 re_get_script(RE_UINT32 codepoint) {
+    RE_UINT32 field_2;
+    RE_UINT32 field_1;
+    RE_UINT32 field_0;
+    RE_UINT32 v;
 
-/* Canonical_Combining_Class: 3088 bytes. */
-
-RE_UINT32 re_get_canonical_combining_class(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-
-    f = ch >> 12;
-    code = ch ^ (f << 12);
-    pos = (RE_UINT32)re_canonical_combining_class_stage_1[f] << 6;
-    f = code >> 6;
-    code ^= f << 6;
-    pos = (RE_UINT32)re_canonical_combining_class_stage_2[pos + f] << 3;
-    f = code >> 3;
-    code ^= f << 3;
-    pos = (RE_UINT32)re_canonical_combining_class_stage_3[pos + f] << 3;
-    value = re_canonical_combining_class_stage_4[pos + code];
-
-    return value;
-}
+    field_2 = codepoint >> 10;
+    field_1 = (codepoint >> 5) & 0x1F;
+    field_0 = codepoint & 0x1F;
 
-/* Decomposition_Type. */
+    v = re_script_table_1[field_2];
+    v = re_script_table_2[(v << 5) | field_1];
+    v = re_script_table_3[(v << 5) | field_0];
 
-static RE_UINT8 re_decomposition_type_stage_1[] = {
-     0,  1,  2,  3,  4,  5,  6,  7,  7,  7,  7,  7,  7,  7,  7,  7,
-     7,  7,  7,  7,  8,  9, 10, 10, 10, 10, 11,  7,  7,  7,  7, 12,
-     7,  7, 13,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
-     7,  7,  7,  7,  7,  7,  7,  7,  7,  7, 14,  7,  7, 15, 16,  7,
-     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
-     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7, 17,
-     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
-     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
-     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
-     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
-     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
-     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
-     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
-     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
-     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
-     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
-     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
-     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
-     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
-     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
-     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
-     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
-     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
-     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
-     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
-     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
-     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
-     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
-     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
-     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
-     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
-     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
-     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
-     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
-};
+    return v;
+}
 
-static RE_UINT8 re_decomposition_type_stage_2[] = {
-      0,   0,   0,   0,   0,   1,   2,   3,   4,   5,   6,   7,   0,   8,   9,  10,
-     11,  12,   0,   0,   0,  13,  14,  15,   0,   0,  16,  17,  18,  19,  20,  21,
-     22,  23,  24,  25,   0,   0,  26,  27,   0,   0,   0,   0,  28,   0,   0,   0,
-      0,  29,   0,  30,   0,   0,  31,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,  32,  33,   0,   0,   0,  34,   0,
-      0,  35,  36,   0,   0,   0,   0,   0,   0,   0,  37,   0,  38,   0,  39,   0,
-      0,   0,  40,   0,   0,   0,  41,   0,   0,   0,  39,   0,   0,   0,  42,   0,
-      0,  43,   0,   0,   0,  43,  44,   0,  45,   0,  46,  47,  48,  49,   0,   0,
-      0,  50,   0,   0,   0,   0,   0,  51,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+/* Script_Extensions. */
+static RE_UINT8 script_extensions_table_1[] = {
+     0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 13, 13,
+    13, 13, 13, 14, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 15, 16, 17, 18, 19, 19, 19, 19, 19,
+    19, 19, 19, 19, 19, 20, 21, 21, 21, 21, 21, 21, 21, 21, 22, 23,
+    24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 21, 21, 34, 35, 21, 21,
+    21, 36, 21, 21, 21, 21, 21, 21, 21, 21, 37, 38, 39, 39, 39, 39,
+    39, 40, 41, 42, 21, 21, 21, 21, 21, 21, 21, 21, 43, 21, 21, 44,
+    21, 21, 21, 21, 45, 46, 47, 21, 48, 21, 49, 50, 51, 52, 53, 21,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 54, 13, 13, 13, 55, 56, 13,
+    13, 13, 13, 57, 13, 13, 13, 13, 13, 13, 58, 21, 21, 21, 59, 21,
+    13, 13, 13, 13, 60, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    61, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21
+};
+static RE_UINT16 script_extensions_table_2[] = {
+      0,   0,   1,   1,   0,   2,   3,   3,   4,   4,   4,   4,   4,   4,   4,   4,
+      4,   4,   4,   4,   4,   5,   0,   6,   7,   7,   8,   9,  10,  11,  12,  13,
+     14,  14,  14,  14,  15,  14,  14,  14,  14,  16,  17,  18,  19,  20,  21,  22,
+     23,  24,  25,  26,  24,  24,  27,  24,  28,  29,  30,  24,  31,  32,  33,  34,
+     35,  36,  37,  38,  39,  40,  41,  42,  43,  43,  44,  45,  46,  47,  48,  49,
+     50,  51,  52,  53,  54,  55,  56,  57,  58,  59,  60,  61,  62,  63,  64,  65,
+     66,  67,  68,  69,  70,  71,  72,  73,  74,  75,  76,  77,  78,  79,  80,  81,
+     82,  83,  84,  39,  85,  86,  87,  39,  88,  88,  89,  90,  91,  92,  93,  39,
+     94,  94,  95,  94,  94,  96,  97,  98,  99,  99,  99,  99,  99,  99,  99,  99,
+    100, 100, 101, 100, 102, 103, 104, 100, 105, 100, 106, 107, 108, 109, 109, 110,
+    111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111,
+    111, 111, 111, 111, 112, 113, 113, 114, 115, 116, 117, 118, 119, 119, 120, 121,
+    122, 123, 123, 124, 123, 125, 111, 126, 127, 128, 129, 130, 131, 132, 133, 119,
+    134, 135, 136, 137, 138, 139, 140,  39, 141, 141, 142, 143, 144, 144, 145, 146,
+    147, 148, 149, 150, 151, 152, 153, 154,   4, 155, 156, 157,   4, 158, 159, 160,
+      4,   4,   4,   4,   4,   4,   4,   4, 161,  12, 162, 163,  12, 164, 165, 166,
+    167, 168,   0, 169, 170,   0, 171, 172,   0, 173, 174,   4, 175,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0, 176, 177,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    178, 178, 178, 178, 178, 178, 178, 178,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 179, 180,   0,   0,   0,
+    181, 182, 183,   4, 184, 184, 184, 185,  96, 186, 187, 188, 189, 190, 190,  14,
+      0,   0, 191,  39, 192, 193, 193, 194, 193, 193, 193, 193, 193, 193, 195, 196,
+    197, 198, 199, 200, 201, 202, 203, 204, 205, 206,  99,  99, 207, 208, 209, 210,
+    211, 209, 212, 213, 209, 214, 215, 216, 203, 203, 217, 218,   0,   0,   0, 219,
+    193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193,
+    193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193,
+    193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193,   0,   0,
+    193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193,
+    193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193,
+    193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 220,
+    221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221,
+    221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221,
+    221, 221, 221, 221, 222, 221, 223, 224, 225, 225, 225, 225, 225, 225, 225, 225,
+    225, 226,  14, 227,  14, 228, 228, 229, 230, 231,   4,   4, 232,   4, 233, 234,
+    235, 236, 237, 238, 239, 239, 240, 241, 242, 243, 244, 245, 246, 246, 247, 248,
+    249, 250, 251,  94, 252, 252, 253, 254, 255, 256, 257, 258, 109, 109, 259, 260,
+     99,  99,  99,  99,  99,  99,  99,  99,  99,  99,  99,  99,  99,  99,  99,  99,
+     99,  99,  99,  99,  99,  99,  99,  99,  99,  99,  99,  99,  99,  99,  99,  99,
+     99,  99,  99,  99,  99,  99,  99,  99,  99,  99,  99,  99,  99,  99,  99,  99,
+     99,  99,  99,  99,  99,  99,  99,  99,  99,  99,  99,  99,  99, 261, 262, 263,
+     39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,
+     39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,
+     39,  39,  39,  39,  39,  39,  39,  39, 193, 193, 193, 193, 193, 193, 193, 193,
+    193, 193, 193, 264, 193, 193, 265,  39, 266, 267, 268,  24,  24,  24, 269,  24,
+     24,  24,  24,  24,  24,  24,  24,  24,  24, 270, 271,  24, 272,  24, 273, 274,
+    275, 276, 277, 278,  24,  24,  24, 279, 280,   1,   1, 281, 282, 211, 283, 284,
+    285, 286, 287,  39, 288, 288, 288, 289, 290, 291,  12,  12, 292, 293, 294, 295,
+     39,  39,  39,  39, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306,  39,
+    307, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317,  39,  39,  39,  39,
+    318, 318, 318, 318, 318, 318, 318, 318, 318, 319, 320, 321,  39,  39,  39,  39,
+    322, 323, 324, 325, 326, 327,  39, 328, 329, 330,  39,  39, 331, 332, 333, 334,
+    335, 336, 337, 338, 339,  39, 340, 341, 342, 343, 344, 345, 346, 347,  39,  39,
+    348, 348, 349,  39, 350, 351, 350, 352, 353, 354,  39,  39,  39,  39,  39,  39,
+     39,  39,  39, 355, 356, 357,  39,  39, 358, 359, 360,  39,  39, 361, 362, 363,
+    364, 364, 365, 366, 367, 367, 368, 369, 370, 371, 372, 373, 374, 374, 374, 375,
+    376, 377,  39,  39, 378, 379, 380, 381, 382, 383, 384, 385,  39,  39,  39,  39,
+    386, 386, 387, 388, 389, 389, 390,  39,  39,  39,  39,  39, 391, 392, 393,  39,
+    394, 394, 395, 396, 397, 398, 399,  39, 400, 401,  39,  39,  39,  39,  39,  39,
+    402, 403,  39,  39,  39, 404, 404, 405, 406, 407, 408,  39,  39, 409, 410, 411,
+    412, 412, 413, 414, 414, 415, 416, 417,  39,  39,  39,  39,  39,  39,  39,  39,
+    418, 419, 420, 421, 422, 423,  39,  39, 424, 425, 426, 427, 428, 429,  39,  39,
+     39,  39,  39,  39,  39,  39,  39, 430,  39,  39,  39,  39,  39, 431, 432, 433,
+    434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434,
+    434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 435,  39,  39,  39,
+    434, 434, 434, 436, 434, 434, 434, 434, 434, 434, 437,  39,  39,  39,  39,  39,
+     39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,
+    438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438,
+    438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438,
+    438, 439,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,
+     39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,
+    440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440,
+    440, 440, 441,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,
+    228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228,
+    228, 442, 443, 444,  39,  39, 445, 446, 447, 447, 448, 449, 450,  39,  39,  39,
+     39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,
+     39,  39, 451, 451, 452,  39,  39,  39, 453, 453, 454, 453, 455,  39,  39, 456,
+    457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457,
+    457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457,
+    457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457,
+    457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 458,
+    457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457,
+    457, 457, 457, 457, 457, 457, 457, 457, 459, 459, 459, 459, 459, 459, 459, 459,
+    459, 459, 459, 459, 459, 459, 460,  39, 461,  39,  39,  39,  39,  39,  39,  39,
+     39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,
+    462, 200, 200, 200, 200, 200, 200, 200, 463,  39, 464, 465, 466, 466, 466, 466,
+    466, 466, 466, 466, 466, 466, 466, 467,  39,  39,  39,  39,  39,  39,  39,  39,
+    468, 468, 468, 469, 470, 471,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,
+     39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,
+      0,   0,   0,   0,   0,   0,   0, 472,   0, 473,   0, 474, 475, 476,   0, 477,
+     12,  12, 478,  39,  39,  39,  39, 479,   0,   0, 480, 481,  39,  39,  39,  39,
+      0,   0, 482,   0, 483, 484, 485,   0, 486, 487, 488,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0, 489,   0,   0,   0,   0,   0,   0,   0,   0, 490,   0,
+    491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491,
+    491, 491, 491, 491, 492, 493,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,
+    494, 495,  39,  39,  39,  39,  39,  39, 496, 497, 498,  39,  39,  39,  39,  39,
+     39,  39,  39,  39,  39,  39, 499, 500,  39,  39,  39,  39,  39,  39,  39,  39,
+    501, 501, 501, 501, 501, 501, 502,  39, 503, 503, 504,  39,  39,  39,  39,  39,
+     39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,
+     39,  39,  39, 505,   0, 506,  39,  39, 280, 507,  39,  39,  39,  39,  39,  39,
+    508, 509, 510, 511, 512, 513,  39, 514,  39,  39,  39,  39,  39,  39,  39,  39,
+      0, 515,   0,   0, 479, 516, 517, 472,   0,   0,   0,   0,   0, 518,  39, 519,
+    520, 521, 522, 523,  39,  39,  39,  39,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0, 524, 525,   0,   0,   0, 479,   0,   0, 526, 527,
+    515,   0, 528,   0, 529, 530,  39,  39,   0,   0,   0, 531,   0,   0, 532,   0,
+      0,   0, 479, 533, 534, 535, 536,  39,   0,   0,   0,   0, 537,   0, 177, 538,
+    193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193,
+    193, 193, 193, 193, 193, 193, 539,  39, 193, 193, 193, 193, 193, 193, 193, 193,
+    193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193,
+    193, 193, 193, 193, 193, 193, 193, 193, 193, 540, 193, 193, 193, 193, 193, 193,
+    539, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193,
+    193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193,
+    193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193,
+    193, 193, 193, 193, 193, 541, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193,
+    193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193,
+    193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 542,
+    193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193,
+    539,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,
+    193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193,
+    193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 543,  39,  39,  39,  39,  39,
+    544,   0,   0,   0,  39,  39,  39,  39,   7,   7,   7,   7,   7,   7,   7, 545,
+     39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39
+};
+static RE_UINT8 script_extensions_table_3[] = {
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
+      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   2,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   2,   1,   1,   1,   1,   1,
+      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
+      2,   2,   2,   2,   2,   2,   2,   1,   2,   2,   2,   2,   2,   2,   2,   2,
+      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
+      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
+      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
+      2,   2,   2,   2,   2,   2,   2,   2,   2,   1,   1,   1,   1,   1,   1,   1,
+      2,   2,   2,   2,   2,   1,   1,   1,   1,   1,   3,   3,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
+      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
+      4,   4, 158,   4,   4, 158,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
+      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
+      4,   4,   4, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+      5,   5,   5,   5,   1,   5,   5,   5,   0,   0,   5,   5,   5,   5,   1,   5,
+      0,   0,   0,   0,   5,   1,   5,   1,   5,   5,   5,   0,   5,   0,   5,   5,
+      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
+      5,   5,   0,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
+      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
+      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
+      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
+      5,   5,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,
+      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
+      7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
+      7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
+      7,   7,   7, 160, 161, 162, 162, 161,   7,   7,   7,   7,   7,   7,   7,   7,
+      7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
+      7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
+      0,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,
+      8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,
+      8,   8,   8,   8,   8,   8,   8,   0,   0,   8,   8,   8,   8,   8,   8,   8,
+      8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,
+      8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,
+      8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   0,   0,   8,   8,   8,
+      0,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,
+      9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,
+      9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,
+      9,   9,   9,   9,   9,   9,   9,   9,   0,   0,   0,   0,   0,   0,   0,   0,
+      9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,
+      9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   0,   0,   0,   0,   9,
+      9,   9,   9,   9,   9,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     10,  10,  10,  10,  10,   1,  10,  10,  10,  10,  10,  10, 163,  10,  10,  10,
+     10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10, 163, 164,   0,  10, 163,
+     10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,
+     10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,
+    165,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10, 166, 166, 166, 166, 166,
+    166, 166, 166, 166, 166, 166,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,
+    167, 167, 167, 167, 167, 167, 167, 167, 167, 167,  10,  10,  10,  10,  10,  10,
+    166,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,
+     10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,
+     10,  10,  10,  10, 168,  10,  10,  10,  10,  10,  10,  10,  10,   1,  10,  10,
+     11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,   0,  11,
+     11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,
+     11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,
+     11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,
+     11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,   0,   0,  11,  11,  11,
+     10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,
+     12,  12,  12,  12,  12,  12,  12,  12,  12,  12,  12,  12,  12,  12,  12,  12,
+     12,  12,  12,  12,  12,  12,  12,  12,  12,  12,  12,  12,  12,  12,  12,  12,
+     12,  12,  12,  12,  12,  12,  12,  12,  12,  12,  12,  12,  12,  12,  12,  12,
+     12,  12,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     13,  13,  13,  13,  13,  13,  13,  13,  13,  13,  13,  13,  13,  13,  13,  13,
+     13,  13,  13,  13,  13,  13,  13,  13,  13,  13,  13,  13,  13,  13,  13,  13,
+     13,  13,  13,  13,  13,  13,  13,  13,  13,  13,  13,  13,  13,  13,  13,  13,
+     13,  13,  13,  13,  13,  13,  13,  13,  13,  13,  13,   0,   0,  13,  13,  13,
+     14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,
+     14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,
+     14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,   0,   0,
+     14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,   0,
+     15,  15,  15,  15,  15,  15,  15,  15,  15,  15,  15,  15,  15,  15,  15,  15,
+     15,  15,  15,  15,  15,  15,  15,  15,  15,  15,  15,  15,   0,   0,  15,   0,
+     11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,
+     10,  10,  10,  10,  10,   0,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,
+     10,  10,  10,  10,  10,  10,  10,  10,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,
+     10,  10,   1,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,
+     10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,
+     16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,
+     16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,
+     16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,
+     16, 169, 170,   4,   4,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,
+     16,  16,  16,  16, 171, 172, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173,
+     16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,
+     17,  17,  17,  17,   0,  17,  17,  17,  17,  17,  17,  17,  17,   0,   0,  17,
+     17,   0,   0,  17,  17,  17,  17,  17,  17,  17,  17,  17,  17,  17,  17,  17,
+     17,  17,  17,  17,  17,  17,  17,  17,  17,   0,  17,  17,  17,  17,  17,  17,
+     17,   0,  17,   0,   0,   0,  17,  17,  17,  17,   0,   0,  17,  17,  17,  17,
+     17,  17,  17,  17,  17,   0,   0,  17,  17,   0,   0,  17,  17,  17,  17,   0,
+      0,   0,   0,   0,   0,   0,   0,  17,   0,   0,   0,   0,  17,  17,   0,  17,
+     17,  17,  17,  17,   0,   0, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174,
+     17,  17,  17,  17,  17,  17,  17,  17,  17,  17,  17,  17,  17,  17,  17,   0,
+      0,  18,  18,  18,   0,  18,  18,  18,  18,  18,  18,   0,   0,   0,   0,  18,
+     18,   0,   0,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,
+     18,  18,  18,  18,  18,  18,  18,  18,  18,   0,  18,  18,  18,  18,  18,  18,
+     18,   0,  18,  18,   0,  18,  18,   0,  18,  18,   0,   0,  18,   0,  18,  18,
+     18,  18,  18,   0,   0,   0,   0,  18,  18,   0,   0,  18,  18,  18,   0,   0,
+      0,  18,   0,   0,   0,   0,   0,   0,   0,  18,  18,  18,  18,   0,  18,   0,
+      0,   0,   0,   0,   0,   0, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175,
+     18,  18,  18,  18,  18,  18,  18,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,  19,  19,  19,   0,  19,  19,  19,  19,  19,  19,  19,  19,  19,   0,  19,
+     19,  19,   0,  19,  19,  19,  19,  19,  19,  19,  19,  19,  19,  19,  19,  19,
+     19,  19,  19,  19,  19,  19,  19,  19,  19,   0,  19,  19,  19,  19,  19,  19,
+     19,   0,  19,  19,   0,  19,  19,  19,  19,  19,   0,   0,  19,  19,  19,  19,
+     19,  19,  19,  19,  19,  19,   0,  19,  19,  19,   0,  19,  19,  19,   0,   0,
+     19,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     19,  19,  19,  19,   0,   0, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176,
+     19,  19,   0,   0,   0,   0,   0,   0,   0,  19,  19,  19,  19,  19,  19,  19,
+      0,  20,  20,  20,   0,  20,  20,  20,  20,  20,  20,  20,  20,   0,   0,  20,
+     20,   0,   0,  20,  20,  20,  20,  20,  20,  20,  20,  20,  20,  20,  20,  20,
+     20,  20,  20,  20,  20,  20,  20,  20,  20,   0,  20,  20,  20,  20,  20,  20,
+     20,   0,  20,  20,   0,  20,  20,  20,  20,  20,   0,   0,  20,  20,  20,  20,
+     20,  20,  20,  20,  20,   0,   0,  20,  20,   0,   0,  20,  20,  20,   0,   0,
+      0,   0,   0,   0,   0,  20,  20,  20,   0,   0,   0,   0,  20,  20,   0,  20,
+     20,  20,  20,  20,   0,   0,  20,  20,  20,  20,  20,  20,  20,  20,  20,  20,
+     20,  20,  20,  20,  20,  20,  20,  20,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,  21,  21,   0,  21,  21,  21,  21,  21,  21,   0,   0,   0,  21,  21,
+     21,   0,  21,  21,  21,  21,   0,   0,   0,  21,  21,   0,  21,   0,  21,  21,
+      0,   0,   0,  21,  21,   0,   0,   0,  21,  21,  21,   0,   0,   0,  21,  21,
+     21,  21,  21,  21,  21,  21,  21,  21,  21,  21,   0,   0,   0,   0,  21,  21,
+     21,  21,  21,   0,   0,   0,  21,  21,  21,   0,  21,  21,  21,  21,   0,   0,
+     21,   0,   0,   0,   0,   0,   0,  21,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177,
+    177, 177, 177, 177,  21,  21,  21,  21,  21,  21,  21,   0,   0,   0,   0,   0,
+     22,  22,  22,  22,  22,  22,  22,  22,  22,  22,  22,  22,  22,   0,  22,  22,
+     22,   0,  22,  22,  22,  22,  22,  22,  22,  22,  22,  22,  22,  22,  22,  22,
+     22,  22,  22,  22,  22,  22,  22,  22,  22,   0,  22,  22,  22,  22,  22,  22,
+     22,  22,  22,  22,  22,  22,  22,  22,  22,  22,   0,   0,   0,  22,  22,  22,
+     22,  22,  22,  22,  22,   0,  22,  22,  22,   0,  22,  22,  22,  22,   0,   0,
+      0,   0,   0,   0,   0,  22,  22,   0,  22,  22,  22,   0,   0,   0,   0,   0,
+     22,  22,  22,  22,   0,   0,  22,  22,  22,  22,  22,  22,  22,  22,  22,  22,
+      0,   0,   0,   0,   0,   0,   0,  22,  22,  22,  22,  22,  22,  22,  22,  22,
+     23,  23,  23,  23,  23,  23,  23,  23,  23,  23,  23,  23,  23,   0,  23,  23,
+     23,   0,  23,  23,  23,  23,  23,  23,  23,  23,  23,  23,  23,  23,  23,  23,
+     23,  23,  23,  23,  23,  23,  23,  23,  23,   0,  23,  23,  23,  23,  23,  23,
+     23,  23,  23,  23,   0,  23,  23,  23,  23,  23,   0,   0,  23,  23,  23,  23,
+     23,  23,  23,  23,  23,   0,  23,  23,  23,   0,  23,  23,  23,  23,   0,   0,
+      0,   0,   0,   0,   0,  23,  23,   0,   0,   0,   0,   0,   0,   0,  23,   0,
+     23,  23,  23,  23,   0,   0, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+      0,  23,  23,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     24,  24,  24,  24,  24,  24,  24,  24,  24,  24,  24,  24,  24,   0,  24,  24,
+     24,   0,  24,  24,  24,  24,  24,  24,  24,  24,  24,  24,  24,  24,  24,  24,
+     24,  24,  24,  24,  24,  24,  24,  24,  24,  24,  24,  24,  24,  24,  24,  24,
+     24,  24,  24,  24,  24,  24,  24,  24,  24,  24,  24,  24,  24,  24,  24,  24,
+     24,  24,  24,  24,  24,   0,  24,  24,  24,   0,  24,  24,  24,  24,  24,  24,
+      0,   0,   0,   0,  24,  24,  24,  24,  24,  24,  24,  24,  24,  24,  24,  24,
+     24,  24,  24,  24,   0,   0,  24,  24,  24,  24,  24,  24,  24,  24,  24,  24,
+     24,  24,  24,  24,  24,  24,  24,  24,  24,  24,  24,  24,  24,  24,  24,  24,
+      0,  25,  25,  25,   0,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,
+     25,  25,  25,  25,  25,  25,  25,   0,   0,   0,  25,  25,  25,  25,  25,  25,
+     25,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,
+     25,  25,   0,  25,  25,  25,  25,  25,  25,  25,  25,  25,   0,  25,   0,   0,
+     25,  25,  25,  25,  25,  25,  25,   0,   0,   0,  25,   0,   0,   0,   0,  25,
+     25,  25,  25,  25,  25,   0,  25,   0,  25,  25,  25,  25,  25,  25,  25,  25,
+      0,   0,   0,   0,   0,   0,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,
+      0,   0,  25,  25,  25,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
+     26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
+     26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
+     26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,   0,   0,   0,   0,   1,
+     26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
+     26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,   0,   0,   0,   0,
+      0,  27,  27,   0,  27,   0,  27,  27,  27,  27,  27,   0,  27,  27,  27,  27,
+     27,  27,  27,  27,  27,  27,  27,  27,  27,  27,  27,  27,  27,  27,  27,  27,
+     27,  27,  27,  27,   0,  27,   0,  27,  27,  27,  27,  27,  27,  27,  27,  27,
+     27,  27,  27,  27,  27,  27,  27,  27,  27,  27,  27,  27,  27,  27,   0,   0,
+     27,  27,  27,  27,  27,   0,  27,   0,  27,  27,  27,  27,  27,  27,   0,   0,
+     27,  27,  27,  27,  27,  27,  27,  27,  27,  27,   0,   0,  27,  27,  27,  27,
+     28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,
+     28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,
+     28,  28,  28,  28,  28,  28,  28,  28,   0,  28,  28,  28,  28,  28,  28,  28,
+     28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,
+     28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,   0,   0,   0,
+      0,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,
+     28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,
+     28,  28,  28,  28,  28,  28,  28,  28,   0,  28,  28,  28,  28,  28,  28,  28,
+     28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,
+     28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,   0,  28,  28,
+     28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,   0,  28,  28,
+     28,  28,  28,  28,  28,   1,   1,   1,   1,  28,  28,   0,   0,   0,   0,   0,
+     29,  29,  29,  29,  29,  29,  29,  29,  29,  29,  29,  29,  29,  29,  29,  29,
+     29,  29,  29,  29,  29,  29,  29,  29,  29,  29,  29,  29,  29,  29,  29,  29,
+    179, 179, 179, 179, 179, 179, 179, 179, 179, 179,  29,  29,  29,  29,  29,  29,
+     29,  29,  29,  29,  29,  29,  29,  29,  29,  29,  29,  29,  29,  29,  29,  29,
+     30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,
+     30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,
+     30,  30,  30,  30,  30,  30,   0,  30,   0,   0,   0,   0,   0,  30,   0,   0,
+     30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,
+     30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,
+     30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30, 180,  30,  30,  30,  30,
+     31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,
+     31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,
+     32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,
+     32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,
+     32,  32,  32,  32,  32,  32,  32,  32,  32,   0,  32,  32,  32,  32,   0,   0,
+     32,  32,  32,  32,  32,  32,  32,   0,  32,   0,  32,  32,  32,  32,   0,   0,
+     32,  32,  32,  32,  32,  32,  32,  32,  32,   0,  32,  32,  32,  32,   0,   0,
+     32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,
+     32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,
+     32,   0,  32,  32,  32,  32,   0,   0,  32,  32,  32,  32,  32,  32,  32,   0,
+     32,   0,  32,  32,  32,  32,   0,   0,  32,  32,  32,  32,  32,  32,  32,  32,
+     32,  32,  32,  32,  32,  32,  32,   0,  32,  32,  32,  32,  32,  32,  32,  32,
+     32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,
+     32,   0,  32,  32,  32,  32,   0,   0,  32,  32,  32,  32,  32,  32,  32,  32,
+     32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,
+     32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,   0,   0,  32,  32,  32,
+     32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,
+     32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,   0,   0,   0,
+     32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,
+     32,  32,  32,  32,  32,  32,  32,  32,  32,  32,   0,   0,   0,   0,   0,   0,
+     33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,
+     33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,
+     33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,
+     33,  33,  33,  33,  33,  33,   0,   0,  33,  33,  33,  33,  33,  33,   0,   0,
+     34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,
+     34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,
+     35,  35,  35,  35,  35,  35,  35,  35,  35,  35,  35,  35,  35,  35,  35,  35,
+     35,  35,  35,  35,  35,  35,  35,  35,  35,  35,  35,  35,  35,   0,   0,   0,
+     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,
+     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,
+     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,   1,   1,   1,  36,  36,
+     36,  36,  36,  36,  36,  36,  36,  36,  36,   0,   0,   0,   0,   0,   0,   0,
+     37,  37,  37,  37,  37,  37,  37,  37,  37,  37,  37,  37,  37,   0,  37,  37,
+     37,  37,  37,  37,  37,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,
+     38,  38,  38,  38,  38, 181, 181,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,
+     39,  39,  39,  39,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,   0,  40,  40,
+     40,   0,  40,  40,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     41,  41,  41,  41,  41,  41,  41,  41,  41,  41,  41,  41,  41,  41,  41,  41,
+     41,  41,  41,  41,  41,  41,  41,  41,  41,  41,  41,  41,  41,  41,  41,  41,
+     41,  41,  41,  41,  41,  41,  41,  41,  41,  41,  41,  41,  41,  41,  41,  41,
+     41,  41,  41,  41,  41,  41,  41,  41,  41,  41,  41,  41,  41,  41,   0,   0,
+     41,  41,  41,  41,  41,  41,  41,  41,  41,  41,   0,   0,   0,   0,   0,   0,
+     41,  41,  41,  41,  41,  41,  41,  41,  41,  41,   0,   0,   0,   0,   0,   0,
+     42,  42, 182, 182,  42, 182,  42,  42,  42,  42,  42,  42,  42,  42,  42,   0,
+     42,  42,  42,  42,  42,  42,  42,  42,  42,  42,   0,   0,   0,   0,   0,   0,
+     42,  42,  42,  42,  42,  42,  42,  42,  42,  42,  42,  42,  42,  42,  42,  42,
+     42,  42,  42,  42,  42,  42,  42,  42,  42,  42,  42,  42,  42,  42,  42,  42,
+     42,  42,  42,  42,  42,  42,  42,  42,  42,  42,  42,  42,  42,  42,  42,  42,
+     42,  42,  42,  42,  42,  42,  42,  42,  42,   0,   0,   0,   0,   0,   0,   0,
+     42,  42,  42,  42,  42,  42,  42,  42,  42,  42,  42,   0,   0,   0,   0,   0,
+     34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,
+     34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,
+     34,  34,  34,  34,  34,  34,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     43,  43,  43,  43,  43,  43,  43,  43,  43,  43,  43,  43,  43,  43,  43,  43,
+     43,  43,  43,  43,  43,  43,  43,  43,  43,  43,  43,  43,  43,  43,  43,   0,
+     43,  43,  43,  43,  43,  43,  43,  43,  43,  43,  43,  43,   0,   0,   0,   0,
+     43,  43,  43,  43,  43,  43,  43,  43,  43,  43,  43,  43,   0,   0,   0,   0,
+     43,   0,   0,   0,  43,  43,  43,  43,  43,  43,  43,  43,  43,  43,  43,  43,
+     44,  44,  44,  44,  44,  44,  44,  44,  44,  44,  44,  44,  44,  44,  44,  44,
+     44,  44,  44,  44,  44,  44,  44,  44,  44,  44,  44,  44,  44,  44,   0,   0,
+     44,  44,  44,  44,  44,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,
+     45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,
+     45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,   0,   0,   0,   0,
+     45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,
+     45,  45,  45,  45,  45,  45,  45,  45,  45,  45,   0,   0,   0,   0,   0,   0,
+     45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,   0,   0,   0,  45,  45,
+     46,  46,  46,  46,  46,  46,  46,  46,  46,  46,  46,  46,  46,  46,  46,  46,
+     46,  46,  46,  46,  46,  46,  46,  46,  46,  46,  46,  46,   0,   0,  46,  46,
+     47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,
+     47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,
+     47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,
+     47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,   0,
+     47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,
+     47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,   0,   0,  47,
+     47,  47,  47,  47,  47,  47,  47,  47,  47,  47,   0,   0,   0,   0,   0,   0,
+     47,  47,  47,  47,  47,  47,  47,  47,  47,  47,   0,   0,   0,   0,   0,   0,
+     47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,   0,   0,
+      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
+      4,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,
+     48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,
+     48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,   0,   0,   0,   0,
+     48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,
+     48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,
+     48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,   0,   0,   0,
+     49,  49,  49,  49,  49,  49,  49,  49,  49,  49,  49,  49,  49,  49,  49,  49,
+     49,  49,  49,  49,  49,  49,  49,  49,  49,  49,  49,  49,  49,  49,  49,  49,
+     50,  50,  50,  50,  50,  50,  50,  50,  50,  50,  50,  50,  50,  50,  50,  50,
+     50,  50,  50,  50,  50,  50,  50,  50,  50,  50,  50,  50,  50,  50,  50,  50,
+     50,  50,  50,  50,  50,  50,  50,  50,  50,  50,  50,  50,  50,  50,  50,  50,
+     50,  50,  50,  50,   0,   0,   0,   0,   0,   0,   0,   0,  50,  50,  50,  50,
+     51,  51,  51,  51,  51,  51,  51,  51,  51,  51,  51,  51,  51,  51,  51,  51,
+     51,  51,  51,  51,  51,  51,  51,  51,  51,  51,  51,  51,  51,  51,  51,  51,
+     51,  51,  51,  51,  51,  51,  51,  51,  51,  51,  51,  51,  51,  51,  51,  51,
+     51,  51,  51,  51,  51,  51,  51,  51,   0,   0,   0,  51,  51,  51,  51,  51,
+     51,  51,  51,  51,  51,  51,  51,  51,  51,  51,   0,   0,   0,  51,  51,  51,
+     52,  52,  52,  52,  52,  52,  52,  52,  52,  52,  52,  52,  52,  52,  52,  52,
+     52,  52,  52,  52,  52,  52,  52,  52,  52,  52,  52,  52,  52,  52,  52,  52,
+     52,  52,  52,  52,  52,  52,  52,  52,  52,  52,  52,  52,  52,  52,  52,  52,
+      7,   7,   7,   7,   7,   7,   7,   7,   7,   0,   0,   0,   0,   0,   0,   0,
+     30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,
+     30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,
+     30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,   0,   0,  30,  30,  30,
+     49,  49,  49,  49,  49,  49,  49,  49,   0,   0,   0,   0,   0,   0,   0,   0,
+    183, 184, 183, 185, 184, 186, 186, 187, 186, 187, 188, 184, 187, 187, 184, 184,
+    187, 186, 184, 184, 184, 184, 184, 184, 184, 189, 186, 184, 184, 186, 184, 184,
+    184, 184, 190, 185, 191, 186, 186, 192, 185, 185, 193,   0,   0,   0,   0,   0,
+      2,   2,   2,   2,   2,   2,   5,   5,   5,   5,   5,   7,   2,   2,   2,   2,
+      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
+      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
+      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   5,   5,   5,
+      5,   5,   2,   2,   2,   2,   5,   5,   5,   5,   5,   2,   2,   2,   2,   2,
+      2,   2,   2,   2,   2,   2,   2,   2,   7,   2,   2,   2,   2,   2,   2,   2,
+      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
+      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   5,
+    158, 158,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
+      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
+      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
+      4,   4,   4,   4,   4,   4,   4,   4, 194,   4,   0,   4,   4,   4,   4,   4,
+      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
+      5,   5,   5,   5,   5,   5,   0,   0,   5,   5,   5,   5,   5,   5,   0,   0,
+      5,   5,   5,   5,   5,   5,   0,   0,   5,   5,   5,   5,   5,   5,   0,   0,
+      5,   5,   5,   5,   5,   5,   5,   5,   0,   5,   0,   5,   0,   5,   0,   5,
+      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
+      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   0,   0,
+      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
+      5,   5,   5,   5,   5,   0,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
+      5,   5,   5,   5,   5,   0,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
+      5,   5,   5,   5,   0,   0,   5,   5,   5,   5,   5,   5,   0,   5,   5,   5,
+      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
+      0,   0,   5,   5,   5,   0,   5,   5,   5,   5,   5,   5,   5,   5,   5,   0,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   4,   4,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1, 195,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   0,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   2,   0,   0,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   2,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   0,
+      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   0,   0,   0,
       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
+      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
+    196,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      1,   1,   1,   1,   1,   1,   5,   1,   1,   1,   2,   2,   1,   1,   1,   1,
+      1,   1,   2,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   2,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      2,   2,   2,   2,   2,   2,   2,   2,   2,   1,   1,   1,   0,   0,   0,   0,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,
       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,  52,  53,  54,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,  55,  56,  57,  58,  59,   0,   0,
-     60,  60,  60,  60,  61,  60,  60,  62,  63,  60,  64,  65,  60,  66,  67,  68,
-     69,  70,  71,  72,  73,  74,   0,   0,  75,  76,  77,  78,  79,  80,  81,   0,
-     82,  83,  84,  85,  86,  87,   0,  88,   0,  89,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,  90,  78,  91,  92,  93,   0,   0,   0,   0,   0,   0,   0,   0,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   0,   0,   0,   0,   0,
       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     53,  53,  53,  53,  53,  53,  53,  53,  53,  53,  53,  53,  53,  53,  53,  53,
+     53,  53,  53,  53,  53,  53,  53,  53,  53,  53,  53,  53,  53,  53,  53,  53,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   0,   0,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   0,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+     54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,
+     54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,
+     54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,   0,
+     54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,
+     54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,
+     54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,   0,
+      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,
+      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,
+      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,
+      6,   6,   6,   6,   0,   0,   0,   0,   0,   6,   6,   6,   6,   6,   6,   6,
+     30,  30,  30,  30,  30,  30,   0,  30,   0,   0,   0,   0,   0,  30,   0,   0,
+     55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,
+     55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,
+     55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,
+     55,  55,  55,  55,  55,  55,  55,  55,   0,   0,   0,   0,   0,   0,   0,  55,
+     55,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  55,
+     32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,
+     32,  32,  32,  32,  32,  32,  32,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     32,  32,  32,  32,  32,  32,  32,   0,  32,  32,  32,  32,  32,  32,  32,   0,
+     32,  32,  32,  32,  32,  32,  32,   0,  32,  32,  32,  32,  32,  32,  32,   0,
+      1,   1,   1, 161,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,
+     56,  56,  56,  56,  56,  56,  56,  56,  56,  56,   0,  56,  56,  56,  56,  56,
+     56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,
+     56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,
+     56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,
+     56,  56,  56,  56,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,
+     56,  56,  56,  56,  56,  56,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   0,   0,   0,   0,
+      1, 197, 197, 198,   1,  56, 199,  56, 197, 197, 197, 197, 197, 197, 197, 197,
+    197, 197,   1, 198, 197, 197, 197, 197, 197, 197, 197, 197, 198, 198, 198, 198,
+      1,  56,  56,  56,  56,  56,  56,  56,  56,  56, 200, 200, 200, 200,  31,  31,
+    198, 201, 201, 201, 201, 201,   1, 198,  56,  56,  56,  56, 202, 202, 199, 199,
+      0,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,
+     57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,
+     57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,
+     57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,
+     57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,
+     57,  57,  57,  57,  57,  57,  57,   0,   0, 201, 201, 201, 201,  57,  57,  57,
+    201,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,
+     58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,
+     58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,
+     58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,
+     58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,
+     58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58, 197, 201,  58,  58,  58,
+      0,   0,   0,   0,   0,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,
+      3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,
+      3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,
+      0,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,
+     31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,   0,
+    199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199,
+      3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,
+      3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,
+    199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199,
+    199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199,
+    199, 199, 199, 199,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,
+     31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,
+     31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,   0,
+    199, 199, 199, 199, 199, 199, 199, 199,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+     31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,
+     31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,   1,
+    199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199,
+    199,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+    199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199,   1,   1,   1,   1,
+     58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,
+     58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,
+     58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58, 199,
+     58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,
+     58,  58,  58,  58,  58,  58,  58,  58, 199, 199, 199, 199, 199, 199, 199, 199,
+    199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199,
+    199,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1, 199, 199, 199, 199, 199,
+    199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199,
+    199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199,   1,
+     56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,
+     56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,   0,   0,   0,
+     59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,
+     59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,
+     59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,   0,   0,   0,
+     59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,
+     59,  59,  59,  59,  59,  59,  59,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,
+     60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,
+     60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,
+     61,  61,  61,  61,  61,  61,  61,  61,  61,  61,  61,  61,  61,  61,  61,  61,
+     61,  61,  61,  61,  61,  61,  61,  61,  61,  61,  61,  61,  61,  61,  61,  61,
+     61,  61,  61,  61,  61,  61,  61,  61,  61,  61,  61,  61,   0,   0,   0,   0,
       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     94,   0,   0,  95,   0,   0,  96,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,  97,   0,   0,   0,   0,   0,   0,   0,  98,   0,   0,   0,   0,
-      0,   0,   0,   0,  99,   0,   0,  43,  78,  78,  78,  78,  78,  78, 100,   0,
-    101, 102, 103, 104, 105, 103, 104, 106,   0, 107,  78,  78, 108,   0,   0,   0,
-    109,  78, 110, 111,  92,  92, 112, 113, 114, 114, 115, 116, 114, 114, 114, 117,
+      7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7, 161,
+      7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
+     62,  62,  62,  62,  62,  62,  62,  62,  62,  62,  62,  62,  62,  62,  62,  62,
+     62,  62,  62,  62,  62,  62,  62,  62,  62,  62,  62,  62,  62,  62,  62,  62,
+     62,  62,  62,  62,  62,  62,  62,  62,  62,  62,  62,  62,  62,  62,  62,  62,
+     62,  62,  62,  62,  62,  62,  62,  62,   0,   0,   0,   0,   0,   0,   0,   0,
+    203, 203, 203, 203, 203, 203, 203, 203,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
+      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
+      2,   2,   2,   2,   2,   2,   2,   2,   1,   1,   1,   2,   2,   2,   2,   2,
+      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
+      0,   0,   2,   2,   2,   2,   2,   2,   2,   2,   2,   0,   0,   0,   0,   0,
       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
+     63,  63,  63,  63,  63,  63,  63,  63,  63,  63,  63,  63,  63,  63,  63,  63,
+     63,  63,  63,  63,  63,  63,  63,  63,  63,  63,  63,  63,  63,  63,  63,  63,
+     63,  63,  63,  63,  63,  63,  63,  63,  63,  63,  63,  63,  63,   0,   0,   0,
+    204, 204, 204, 205, 205, 205, 206, 206, 206, 206,   0,   0,   0,   0,   0,   0,
+     64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,
+     64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,
+     64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,
+     64,  64,  64,  64,  64,  64,  64,  64,   0,   0,   0,   0,   0,   0,   0,   0,
+     65,  65,  65,  65,  65,  65,  65,  65,  65,  65,  65,  65,  65,  65,  65,  65,
+     65,  65,  65,  65,  65,  65,  65,  65,  65,  65,  65,  65,  65,  65,  65,  65,
+     65,  65,  65,  65,  65,  65,   0,   0,   0,   0,   0,   0,   0,   0,  65,  65,
+     65,  65,  65,  65,  65,  65,  65,  65,  65,  65,   0,   0,   0,   0,   0,   0,
+     16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,
+     16, 186,  16, 207,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,
+     66,  66,  66,  66,  66,  66,  66,  66,  66,  66,  66,  66,  66,  66,  66,  66,
+     66,  66,  66,  66,  66,  66,  66,  66,  66,  66,  66,  66,  66,  66,  66,  66,
+     66,  66,  66,  66,  66,  66,  66,  66,  66,  66,  66,  66,  66,  66, 208,  66,
+     67,  67,  67,  67,  67,  67,  67,  67,  67,  67,  67,  67,  67,  67,  67,  67,
+     67,  67,  67,  67,  67,  67,  67,  67,  67,  67,  67,  67,  67,  67,  67,  67,
+     67,  67,  67,  67,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  67,
+     31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,
+     31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,   0,   0,   0,
+     68,  68,  68,  68,  68,  68,  68,  68,  68,  68,  68,  68,  68,  68,  68,  68,
+     68,  68,  68,  68,  68,  68,  68,  68,  68,  68,  68,  68,  68,  68,  68,  68,
+     68,  68,  68,  68,  68,  68,  68,  68,  68,  68,  68,  68,  68,  68,   0, 209,
+     68,  68,  68,  68,  68,  68,  68,  68,  68,  68,   0,   0,   0,   0,  68,  68,
+     29,  29,  29,  29,  29,  29,  29,  29,  29,  29,  29,  29,  29,  29,  29,  29,
+     29,  29,  29,  29,  29,  29,  29,  29,  29,  29,  29,  29,  29,  29,  29,   0,
+     69,  69,  69,  69,  69,  69,  69,  69,  69,  69,  69,  69,  69,  69,  69,  69,
+     69,  69,  69,  69,  69,  69,  69,  69,  69,  69,  69,  69,  69,  69,  69,  69,
+     69,  69,  69,  69,  69,  69,  69,  69,  69,  69,  69,  69,  69,  69,  69,  69,
+     69,  69,  69,  69,  69,  69,  69,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     69,  69,  69,  69,  69,  69,  69,  69,  69,  69,  69,  69,  69,  69,   0,   0,
+     69,  69,  69,  69,  69,  69,  69,  69,  69,  69,   0,   0,  69,  69,  69,  69,
+     70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  70,
+     70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  70,
+     70,  70,  70,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  70,  70,  70,  70,  70,
+     71,  71,  71,  71,  71,  71,  71,  71,  71,  71,  71,  71,  71,  71,  71,  71,
+     71,  71,  71,  71,  71,  71,  71,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,  32,  32,  32,  32,  32,  32,   0,   0,  32,  32,  32,  32,  32,  32,   0,
+      0,  32,  32,  32,  32,  32,  32,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     32,  32,  32,  32,  32,  32,  32,   0,  32,  32,  32,  32,  32,  32,  32,   0,
+      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
+      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
+      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   1,   2,   2,   2,   2,
+      2,   2,   2,   2,   2,   5,   2,   2,   2,   2,   1,   1,   0,   0,   0,   0,
+     33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,
+     71,  71,  71,  71,  71,  71,  71,  71,  71,  71,  71,  71,  71,  71,  71,  71,
+     71,  71,  71,  71,  71,  71,  71,  71,  71,  71,  71,  71,  71,  71,  71,  71,
+     71,  71,  71,  71,  71,  71,  71,  71,  71,  71,  71,  71,  71,  71,   0,   0,
+     71,  71,  71,  71,  71,  71,  71,  71,  71,  71,   0,   0,   0,   0,   0,   0,
+     31,  31,  31,  31,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,
+     31,  31,  31,  31,  31,  31,  31,   0,   0,   0,   0,  31,  31,  31,  31,  31,
+     31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,
+     31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,
+     31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,   0,   0,   0,   0,
+     56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,   0,   0,
+     56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,
+     56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,
+     56,  56,  56,  56,  56,  56,  56,  56,  56,  56,   0,   0,   0,   0,   0,   0,
+      2,   2,   2,   2,   2,   2,   2,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   8,   8,   8,   8,   8,   0,   0,   0,   0,   0,   9,   9,   9,
+      9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,
+      9,   9,   9,   9,   9,   9,   9,   0,   9,   9,   9,   9,   9,   0,   9,   0,
+      9,   9,   0,   9,   9,   0,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,
+     10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,
+     10,  10,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,
+     10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,
+     10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,   1,   1,
       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,
+     10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,
+      0,   0,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,
+     10,  10,  10,  10,  10,  10,  10,  10,   0,   0,   0,   0,   0,   0,   0,   0,
       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     10,  10, 210,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10, 210,   0,   0,
+      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   0,   0,   0,   0,   0,   0,
+      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   7,   7,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1, 198, 198,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   0,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   0,   1,   1,   1,   1,   0,   0,   0,   0,
+     10,  10,  10,  10,  10,   0,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,
+     10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,
+     10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,   0,   0,   1,
+      0,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1, 197, 197, 197, 197, 197,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,
+    201,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,
+     58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,
+     58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58, 201, 201,
+      0,   0,  31,  31,  31,  31,  31,  31,   0,   0,  31,  31,  31,  31,  31,  31,
+      0,   0,  31,  31,  31,  31,  31,  31,   0,   0,  31,  31,  31,   0,   0,   0,
+      1,   1,   1,   1,   1,   1,   1,   0,   1,   1,   1,   1,   1,   1,   1,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   1,   1,   1,   1,   0,   0,
+     72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,   0,  72,  72,  72,
+     72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,
+     72,  72,  72,  72,  72,  72,  72,   0,  72,  72,  72,  72,  72,  72,  72,  72,
+     72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,   0,  72,  72,   0,  72,
+     72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,   0,   0,
+     72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,   0,   0,
+     72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,
+     72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,
+     72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,
+     72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,   0,   0,   0,   0,   0,
+    211, 211, 211,   0,   0,   0,   0, 212, 212, 212, 212, 212, 212, 212, 212, 212,
+    212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212,
+    212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212,
+    212, 212, 212, 212,   0,   0,   0, 211, 211, 211, 211, 211, 211, 211, 211, 211,
+      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   0,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   0,   0,   0,
+      5,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   4,   0,   0,
+     73,  73,  73,  73,  73,  73,  73,  73,  73,  73,  73,  73,  73,  73,  73,  73,
+     73,  73,  73,  73,  73,  73,  73,  73,  73,  73,  73,  73,  73,   0,   0,   0,
+     74,  74,  74,  74,  74,  74,  74,  74,  74,  74,  74,  74,  74,  74,  74,  74,
+     74,  74,  74,  74,  74,  74,  74,  74,  74,  74,  74,  74,  74,  74,  74,  74,
+     74,  74,  74,  74,  74,  74,  74,  74,  74,  74,  74,  74,  74,  74,  74,  74,
+     74,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213,
+    213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213,   0,   0,   0,   0,
+     75,  75,  75,  75,  75,  75,  75,  75,  75,  75,  75,  75,  75,  75,  75,  75,
+     75,  75,  75,  75,  75,  75,  75,  75,  75,  75,  75,  75,  75,  75,  75,  75,
+     75,  75,  75,  75,   0,   0,   0,   0,   0,   0,   0,   0,   0,  75,  75,  75,
+     76,  76,  76,  76,  76,  76,  76,  76,  76,  76,  76,  76,  76,  76,  76,  76,
+     76,  76,  76,  76,  76,  76,  76,  76,  76,  76,  76,   0,   0,   0,   0,   0,
+     77,  77,  77,  77,  77,  77,  77,  77,  77,  77,  77,  77,  77,  77,  77,  77,
+     77,  77,  77,  77,  77,  77,  77,  77,  77,  77,  77,  77,  77,  77,  77,  77,
+     77,  77,  77,  77,  77,  77,  77,  77,  77,  77,  77,   0,   0,   0,   0,   0,
+     78,  78,  78,  78,  78,  78,  78,  78,  78,  78,  78,  78,  78,  78,  78,  78,
+     78,  78,  78,  78,  78,  78,  78,  78,  78,  78,  78,  78,  78,  78,   0,  78,
+     79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,
+     79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,
+     79,  79,  79,  79,   0,   0,   0,   0,  79,  79,  79,  79,  79,  79,  79,  79,
+     79,  79,  79,  79,  79,  79,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     80,  80,  80,  80,  80,  80,  80,  80,  80,  80,  80,  80,  80,  80,  80,  80,
+     80,  80,  80,  80,  80,  80,  80,  80,  80,  80,  80,  80,  80,  80,  80,  80,
+     80,  80,  80,  80,  80,  80,  80,  80,  80,  80,  80,  80,  80,  80,  80,  80,
+     81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,
+     81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,
+     81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,
+     82,  82,  82,  82,  82,  82,  82,  82,  82,  82,  82,  82,  82,  82,  82,  82,
+     82,  82,  82,  82,  82,  82,  82,  82,  82,  82,  82,  82,  82,  82,   0,   0,
+     82,  82,  82,  82,  82,  82,  82,  82,  82,  82,   0,   0,   0,   0,   0,   0,
+     83,  83,  83,  83,  83,  83,  83,  83,  83,  83,  83,  83,  83,  83,  83,  83,
+     83,  83,  83,  83,  83,  83,  83,  83,  83,  83,  83,  83,  83,  83,  83,  83,
+     83,  83,  83,  83,   0,   0,   0,   0,  83,  83,  83,  83,  83,  83,  83,  83,
+     83,  83,  83,  83,  83,  83,  83,  83,  83,  83,  83,  83,  83,  83,  83,  83,
+     83,  83,  83,  83,  83,  83,  83,  83,  83,  83,  83,  83,   0,   0,   0,   0,
+     84,  84,  84,  84,  84,  84,  84,  84,  84,  84,  84,  84,  84,  84,  84,  84,
+     84,  84,  84,  84,  84,  84,  84,  84,  84,  84,  84,  84,  84,  84,  84,  84,
+     84,  84,  84,  84,  84,  84,  84,  84,   0,   0,   0,   0,   0,   0,   0,   0,
+     85,  85,  85,  85,  85,  85,  85,  85,  85,  85,  85,  85,  85,  85,  85,  85,
+     85,  85,  85,  85,  85,  85,  85,  85,  85,  85,  85,  85,  85,  85,  85,  85,
+     85,  85,  85,  85,  85,  85,  85,  85,  85,  85,  85,  85,  85,  85,  85,  85,
+     85,  85,  85,  85,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  85,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     86,  86,  86,  86,  86,  86,  86,  86,  86,  86,  86,  86,  86,  86,  86,  86,
+     86,  86,  86,  86,  86,  86,  86,  86,  86,  86,  86,  86,  86,  86,  86,  86,
+     86,  86,  86,  86,  86,  86,  86,  86,  86,  86,  86,  86,  86,  86,  86,  86,
+     86,  86,  86,  86,  86,  86,  86,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     86,  86,  86,  86,  86,  86,  86,  86,  86,  86,  86,  86,  86,  86,  86,  86,
+     86,  86,  86,  86,  86,  86,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     86,  86,  86,  86,  86,  86,  86,  86,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     87,  87,  87,  87,  87,  87,   0,   0,  87,   0,  87,  87,  87,  87,  87,  87,
+     87,  87,  87,  87,  87,  87,  87,  87,  87,  87,  87,  87,  87,  87,  87,  87,
+     87,  87,  87,  87,  87,  87,  87,  87,  87,  87,  87,  87,  87,  87,  87,  87,
+     87,  87,  87,  87,  87,  87,   0,  87,  87,   0,   0,   0,  87,   0,   0,  87,
+     88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,
+     88,  88,  88,  88,  88,  88,   0,  88,  88,  88,  88,  88,  88,  88,  88,  88,
+     89,  89,  89,  89,  89,  89,  89,  89,  89,  89,  89,  89,  89,  89,  89,  89,
+     89,  89,  89,  89,  89,  89,  89,  89,  89,  89,  89,  89,  89,  89,  89,  89,
+     90,  90,  90,  90,  90,  90,  90,  90,  90,  90,  90,  90,  90,  90,  90,  90,
+     90,  90,  90,  90,  90,  90,  90,  90,  90,  90,  90,  90,  90,  90,  90,   0,
+      0,   0,   0,   0,   0,   0,   0,  90,  90,  90,  90,  90,  90,  90,  90,  90,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     91,  91,  91,  91,  91,  91,  91,  91,  91,  91,  91,  91,  91,  91,  91,  91,
+     91,  91,  91,   0,  91,  91,   0,   0,   0,   0,   0,  91,  91,  91,  91,  91,
+     92,  92,  92,  92,  92,  92,  92,  92,  92,  92,  92,  92,  92,  92,  92,  92,
+     92,  92,  92,  92,  92,  92,  92,  92,  92,  92,  92,  92,   0,   0,   0,  92,
+     93,  93,  93,  93,  93,  93,  93,  93,  93,  93,  93,  93,  93,  93,  93,  93,
+     93,  93,  93,  93,  93,  93,  93,  93,  93,  93,   0,   0,   0,   0,   0,  93,
+     94,  94,  94,  94,  94,  94,  94,  94,  94,  94,  94,  94,  94,  94,  94,  94,
+     94,  94,  94,  94,  94,  94,  94,  94,  94,  94,  94,  94,  94,  94,  94,  94,
+     95,  95,  95,  95,  95,  95,  95,  95,  95,  95,  95,  95,  95,  95,  95,  95,
+     95,  95,  95,  95,  95,  95,  95,  95,   0,   0,   0,   0,  95,  95,  95,  95,
+     95,  95,  95,  95,  95,  95,  95,  95,  95,  95,  95,  95,  95,  95,  95,  95,
+      0,   0,  95,  95,  95,  95,  95,  95,  95,  95,  95,  95,  95,  95,  95,  95,
+     95,  95,  95,  95,  95,  95,  95,  95,  95,  95,  95,  95,  95,  95,  95,  95,
+     95,  95,  95,  95,  95,  95,  95,  95,  95,  95,  95,  95,  95,  95,  95,  95,
+     96,  96,  96,  96,   0,  96,  96,   0,   0,   0,   0,   0,  96,  96,  96,  96,
+     96,  96,  96,  96,   0,  96,  96,  96,   0,  96,  96,  96,  96,  96,  96,  96,
+     96,  96,  96,  96,  96,  96,  96,  96,  96,  96,  96,  96,  96,  96,  96,  96,
+     96,  96,  96,  96,  96,  96,   0,   0,  96,  96,  96,   0,   0,   0,   0,  96,
+     96,  96,  96,  96,  96,  96,  96,  96,  96,   0,   0,   0,   0,   0,   0,   0,
+     96,  96,  96,  96,  96,  96,  96,  96,  96,   0,   0,   0,   0,   0,   0,   0,
+     97,  97,  97,  97,  97,  97,  97,  97,  97,  97,  97,  97,  97,  97,  97,  97,
+     97,  97,  97,  97,  97,  97,  97,  97,  97,  97,  97,  97,  97,  97,  97,  97,
+     98,  98,  98,  98,  98,  98,  98,  98,  98,  98,  98,  98,  98,  98,  98,  98,
+     98,  98,  98,  98,  98,  98,  98,  98,  98,  98,  98,  98,  98,  98,  98,  98,
+     99,  99,  99,  99,  99,  99,  99,  99,  99,  99,  99,  99,  99,  99,  99,  99,
+     99,  99,  99,  99,  99,  99,  99,  99,  99,  99,  99,  99,  99,  99,  99,  99,
+     99,  99,  99,  99,  99,  99,  99,   0,   0,   0,   0,  99,  99,  99,  99,  99,
+     99,  99,  99,  99,  99,  99,  99,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100,
+    100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100,
+    100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100,
+    100, 100, 100, 100, 100, 100,   0,   0,   0, 100, 100, 100, 100, 100, 100, 100,
+    101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101,
+    101, 101, 101, 101, 101, 101,   0,   0, 101, 101, 101, 101, 101, 101, 101, 101,
+    102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102,
+    102, 102, 102,   0,   0,   0,   0,   0, 102, 102, 102, 102, 102, 102, 102, 102,
+    103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103,
+    103, 103,   0,   0,   0,   0,   0,   0,   0, 103, 103, 103, 103,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0, 103, 103, 103, 103, 103, 103, 103,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104,
+    104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104,
+    104, 104, 104, 104, 104, 104, 104, 104, 104,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105,
+    105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105,
+    105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105,
+    105, 105, 105,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105,
+    105, 105, 105,   0,   0,   0,   0,   0,   0,   0, 105, 105, 105, 105, 105, 105,
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106,
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106,
+    106, 106, 106, 106, 106, 106, 106, 106,   0,   0,   0,   0,   0,   0,   0,   0,
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106,   0,   0,   0,   0,   0,   0,
+     10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,
+     10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,   0,
+    107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107,
+    107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107,
+    107, 107, 107, 107, 107, 107, 107, 107, 107, 107,   0, 107, 107, 107,   0,   0,
+    107, 107,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108,
+    108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108,
+    108, 108, 108, 108, 108, 108, 108, 108,   0,   0,   0,   0,   0,   0,   0,   0,
+    109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109,
+    109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109,
+    109, 109, 109, 109, 109, 109, 109, 109, 109, 109,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110,
+    110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111,
+    111, 111, 111, 111, 111, 111, 111,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112,
+    112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112,
+    112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112,   0,   0,
+      0,   0, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112,
+    112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 112,
+    113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+    113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+    113, 113,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 113,   0,   0,
+    114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114,
+    114, 114, 114, 114, 114, 114, 114, 114, 114,   0,   0,   0,   0,   0,   0,   0,
+    114, 114, 114, 114, 114, 114, 114, 114, 114, 114,   0,   0,   0,   0,   0,   0,
+    115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115,
+    115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115,
+    115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115,
+    115, 115, 115, 115, 115,   0, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115,
+    115, 115, 115, 115, 115, 115, 115, 115,   0,   0,   0,   0,   0,   0,   0,   0,
+    116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116,
+    116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116,
+    116, 116, 116, 116, 116, 116, 116,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117,
+    117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117,
+      0,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,
+     25,  25,  25,  25,  25,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118,
+    118, 118,   0, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118,
+    118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118,
+    118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118,   0,
+    119, 119, 119, 119, 119, 119, 119,   0, 119,   0, 119, 119, 119, 119,   0, 119,
+    119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119,   0, 119,
+    119, 119, 119, 119, 119, 119, 119, 119, 119, 119,   0,   0,   0,   0,   0,   0,
+    120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
+    120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
+    120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
+    120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,   0,   0,   0,   0,   0,
+    120, 120, 120, 120, 120, 120, 120, 120, 120, 120,   0,   0,   0,   0,   0,   0,
+    121, 177, 121, 177,   0, 121, 121, 121, 121, 121, 121, 121, 121,   0,   0, 121,
+    121,   0,   0, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+    121, 121, 121, 121, 121, 121, 121, 121, 121,   0, 121, 121, 121, 121, 121, 121,
+    121,   0, 121, 121,   0, 121, 121, 121, 121, 121,   0, 177, 177, 121, 121, 121,
+    121, 121, 121, 121, 121,   0,   0, 121, 121,   0,   0, 121, 121, 121,   0,   0,
+    121,   0,   0,   0,   0,   0,   0, 121,   0,   0,   0,   0,   0, 121, 121, 121,
+    121, 121, 121, 121,   0,   0, 121, 121, 121, 121, 121, 121, 121,   0,   0,   0,
+    121, 121, 121, 121, 121,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+    122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+    122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+    122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122,   0, 122, 122, 122,
+    122, 122,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+    123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+    123, 123, 123, 123, 123, 123, 123, 123,   0,   0,   0,   0,   0,   0,   0,   0,
+    123, 123, 123, 123, 123, 123, 123, 123, 123, 123,   0,   0,   0,   0,   0,   0,
+    124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+    124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+    124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+    124, 124, 124, 124, 124, 124,   0,   0, 124, 124, 124, 124, 124, 124, 124, 124,
+    124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+    124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,   0,   0,
+    125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+    125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+    125, 125, 125, 125, 125,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    125, 125, 125, 125, 125, 125, 125, 125, 125, 125,   0,   0,   0,   0,   0,   0,
+     42,  42,  42,  42,  42,  42,  42,  42,  42,  42,  42,  42,  42,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+    126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+    126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+    126, 126, 126, 126, 126, 126, 126, 126, 126,   0,   0,   0,   0,   0,   0,   0,
+    126, 126, 126, 126, 126, 126, 126, 126, 126, 126,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,   0,   0, 127, 127, 127,
+    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,   0,   0,   0,   0,
+    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,   0,   0,   0,   0,
+    129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+    129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+    129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+    129, 129, 129,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 129,
+    130, 130, 130, 130, 130, 130, 130,   0,   0, 130,   0,   0, 130, 130, 130, 130,
+    130, 130, 130, 130,   0, 130, 130,   0, 130, 130, 130, 130, 130, 130, 130, 130,
+    130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+    130, 130, 130, 130, 130, 130,   0, 130, 130,   0,   0, 130, 130, 130, 130, 130,
+    130, 130, 130, 130, 130, 130, 130,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    130, 130, 130, 130, 130, 130, 130, 130, 130, 130,   0,   0,   0,   0,   0,   0,
+    131, 131, 131, 131, 131, 131, 131, 131,   0,   0, 131, 131, 131, 131, 131, 131,
+    131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+    131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+    131, 131, 131, 131, 131, 131, 131, 131,   0,   0, 131, 131, 131, 131, 131, 131,
+    131, 131, 131, 131, 131,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+    132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+    132, 132, 132, 132, 132, 132, 132, 132,   0,   0,   0,   0,   0,   0,   0,   0,
+    133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+    133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+    133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+    133, 133, 133,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+    134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+    134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+    134, 134, 134, 134, 134, 134, 134, 134, 134,   0,   0,   0,   0,   0,   0,   0,
+    135, 135, 135, 135, 135, 135, 135, 135, 135,   0, 135, 135, 135, 135, 135, 135,
+    135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+    135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+    135, 135, 135, 135, 135, 135, 135,   0, 135, 135, 135, 135, 135, 135, 135, 135,
+    135, 135, 135, 135, 135, 135,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+    135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135,   0,   0,   0,
+    136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+    136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+      0,   0, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+    136, 136, 136, 136, 136, 136, 136, 136,   0, 136, 136, 136, 136, 136, 136, 136,
+    136, 136, 136, 136, 136, 136, 136,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    137, 137, 137, 137, 137, 137, 137,   0, 137, 137,   0, 137, 137, 137, 137, 137,
+    137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+    137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+    137, 137, 137, 137, 137, 137, 137,   0,   0,   0, 137,   0, 137, 137,   0, 137,
+    137, 137, 137, 137, 137, 137, 137, 137,   0,   0,   0,   0,   0,   0,   0,   0,
+    137, 137, 137, 137, 137, 137, 137, 137, 137, 137,   0,   0,   0,   0,   0,   0,
+    138, 138, 138, 138, 138, 138,   0, 138, 138,   0, 138, 138, 138, 138, 138, 138,
+    138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138,
+    138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138,   0,
+    138, 138,   0, 138, 138, 138, 138, 138, 138,   0,   0,   0,   0,   0,   0,   0,
+    138, 138, 138, 138, 138, 138, 138, 138, 138, 138,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139,
+    139, 139, 139, 139, 139, 139, 139, 139, 139,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     60,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,
+    177, 177,  21, 177,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,
+     21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,
+     21,  21,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  21,
+    140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,
+    140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,
+    140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,
+    140, 140, 140, 140, 140, 140, 140, 140, 140, 140,   0,   0,   0,   0,   0,   0,
+    140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,   0,
+    140, 140, 140, 140, 140,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    140, 140, 140, 140,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141,
+    141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141,
+    141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141,   0,
+    141, 141, 141, 141, 141, 141, 141, 141, 141,   0,   0,   0,   0,   0,   0,   0,
+    142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142,
+    142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142,
+    142, 142, 142, 142, 142, 142, 142,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     62,  62,  62,  62,  62,  62,  62,  62,  62,  62,  62,  62,  62,  62,  62,  62,
+     62,  62,  62,  62,  62,  62,  62,  62,  62,   0,   0,   0,   0,   0,   0,   0,
+    143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143,
+    143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143,   0,
+    143, 143, 143, 143, 143, 143, 143, 143, 143, 143,   0,   0,   0,   0, 143, 143,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144,
+    144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144,   0,   0,
+    144, 144, 144, 144, 144, 144,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145,
+    145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145,
+    145, 145, 145, 145, 145, 145,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    145, 145, 145, 145, 145, 145, 145, 145, 145, 145,   0, 145, 145, 145, 145, 145,
+    145, 145,   0, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145,
+    145, 145, 145, 145, 145, 145, 145, 145,   0,   0,   0,   0,   0, 145, 145, 145,
+    145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146,
+    146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146,
+    146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146,
+    146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146,   0,   0,   0,   0,   0,
+    147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147,
+    147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147,
+    147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147,   0,   0,   0,   0, 147,
+    147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147,
+    147, 147, 147, 147, 147, 147, 147, 147,   0,   0,   0,   0,   0,   0,   0, 147,
+    147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147,
+    148, 149,   1,   1, 150,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     56,  56,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148,
+    148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148,
+    148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148,
+    148, 148, 148, 148, 148, 148, 148, 148,   0,   0,   0,   0,   0,   0,   0,   0,
+    150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150,
+    150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150,
+    150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150,
+    150, 150, 150, 150, 150, 150,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    148, 148, 148, 148, 148, 148, 148, 148, 148,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     58,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,
+     57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,
+     57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,
+     57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,   0,
       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0, 118,   0,   0,   0,   0,   0,   0, 119,   0,   0,   0, 120,
+     57,  57,  57,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,  58,  58,  58,  58,   0,   0,   0,   0,   0,   0,   0,   0,
+    149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149,
+    149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149,
+    149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149,
+    149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149,
+    149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149,   0,   0,   0,   0,
+    151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151,
+    151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151,
+    151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151,   0,   0,   0,   0,   0,
+    151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151,   0,   0,   0,
+    151, 151, 151, 151, 151, 151, 151, 151, 151,   0,   0,   0,   0,   0,   0,   0,
+    151, 151, 151, 151, 151, 151, 151, 151, 151, 151,   0,   0, 151, 151, 151, 151,
+    214, 214, 214, 214,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 121,   0,   0,   0,   0,   0,
-     60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,
-     60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,
-     60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,
-     60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,
-     60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,
-     60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,
-     60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,
-     60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,
-     60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,
-     60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60, 122,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,  60,  60,  60,  60,  60,  60,  60,  60,
-    123, 124,  60, 125,  60,  60,  62,   0, 126, 127, 128, 129, 130, 131, 132, 133,
-    134, 134, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147,
-    148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 157, 158, 159, 160, 161, 162,
-      0,   0,   0,   0, 163, 164,   0,   0,   0, 165,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 166,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0, 167,   0,   0,   0,   0,   0,   0,   0, 168,   0,   0,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      1,   1,   1,   1,   1,   1,   1,   0,   0,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   4,   4,   4,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   4,   4,   4,   4,   4,
+      4,   4,   4,   1,   1,   4,   4,   4,   4,   4,   4,   4,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   4,   4,   4,   4,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   0,   0,   0,   0,   0,   0,   0,
       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 169, 170,   0, 171, 172,   0,
+      5,   5,   5,   5,   5,   5,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-    173, 173, 174, 173, 175, 176, 177, 173, 178, 179, 180, 173, 173, 173, 173, 173,
-    173, 173, 173, 173, 173, 181, 173, 173, 173, 173, 173, 173, 173, 173, 182, 173,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199,
+    199, 199,   1,   1,   1,   1,   1,   1,   1,   0,   0,   0,   0,   0,   0,   0,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   0,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   0,   1,   1,
+      0,   0,   1,   0,   0,   1,   1,   0,   0,   1,   1,   1,   1,   0,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   0,   1,   0,   1,   1,   1,
+      1,   1,   1,   1,   0,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   0,   1,   1,   1,   1,   0,   0,   1,   1,   1,
+      1,   1,   1,   1,   1,   0,   1,   1,   1,   1,   1,   1,   1,   0,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   0,   1,   1,   1,   1,   0,
+      1,   1,   1,   1,   1,   0,   1,   0,   0,   0,   1,   1,   1,   1,   1,   1,
+      1,   0,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   0,   0,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   0,   0,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+    152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152,
+    152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152,
+    152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 152, 152, 152, 152, 152,
+      0, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     54,  54,  54,  54,  54,  54,  54,   0,  54,  54,  54,  54,  54,  54,  54,  54,
+     54,  54,  54,  54,  54,  54,  54,  54,  54,   0,   0,  54,  54,  54,  54,  54,
+     54,  54,   0,  54,  54,   0,  54,  54,  54,  54,  54,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153,
+    153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153,
+    153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153,   0,   0,   0,
+    153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153,   0,   0,
+    153, 153, 153, 153, 153, 153, 153, 153, 153, 153,   0,   0,   0,   0, 153, 153,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154,
+    154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154,
+    154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154,
+    154, 154, 154, 154, 154, 154, 154, 154, 154, 154,   0,   0,   0,   0,   0, 154,
+    155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155,
+    155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155,
+    155, 155, 155, 155, 155,   0,   0, 155, 155, 155, 155, 155, 155, 155, 155, 155,
+    155, 155, 155, 155, 155, 155, 155,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156,
+    156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156,
+    156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156,   0,   0,   0,   0,
+    156, 156, 156, 156, 156, 156, 156, 156, 156, 156,   0,   0,   0,   0, 156, 156,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   0,   0,
+     10,  10,  10,  10,   0,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,
+     10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,
+      0,  10,  10,   0,  10,   0,   0,  10,   0,  10,  10,  10,  10,  10,  10,  10,
+     10,  10,  10,   0,  10,  10,  10,  10,   0,  10,   0,  10,   0,   0,   0,   0,
+      0,   0,  10,   0,   0,   0,   0,  10,   0,  10,   0,  10,   0,  10,  10,  10,
+      0,  10,  10,   0,  10,   0,   0,  10,   0,  10,   0,  10,   0,  10,   0,  10,
+      0,  10,  10,   0,  10,   0,   0,  10,  10,  10,  10,   0,  10,  10,  10,  10,
+     10,  10,  10,   0,  10,  10,  10,  10,   0,  10,  10,  10,  10,   0,  10,   0,
+     10,  10,  10,  10,  10,  10,  10,  10,  10,  10,   0,  10,  10,  10,  10,  10,
+     10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,   0,   0,   0,   0,
+      0,  10,  10,  10,   0,  10,  10,  10,  10,  10,   0,  10,  10,  10,  10,  10,
+     10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     10,  10,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   0,   0,   0,   0,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   0,
+      0,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      0,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      0,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   0,   0,
       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+     57,   1,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   0,   0,   0,   0,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   0,   0,   0,   0,   0,   0,   0,
+    199, 199,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      1,   1,   1,   1,   1,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   0,   0,   0,   0,   0,   0,   0,   0,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   0,   0,   0,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   0,   0,   0,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   0,   0,   0,   0,   0,   0,   0,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   0,   0,   0,   0,
       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-    177, 183, 184, 185, 186, 187,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0, 188, 189, 190, 191, 192,   0,   0,   0,
-    193, 194, 195,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      1,   1,   1,   1,   1,   1,   1,   1,   0,   0,   0,   0,   0,   0,   0,   0,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   0,   0,   0,   0,   0,   0,
+      1,   1,   1,   1,   1,   1,   1,   1,   0,   0,   0,   0,   0,   0,   0,   0,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   0,   0,
+      1,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   0,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   0,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   0,   0,
+      1,   1,   1,   1,   1,   0,   0,   0,   1,   1,   1,   0,   0,   0,   0,   0,
+      1,   1,   1,   1,   1,   1,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   0,   0,   0,   0,   0,   0,   0,
+      1,   1,   1,   1,   1,   1,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      1,   1,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      1,   1,   1,   1,   1,   1,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   0,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   0,   0,   0,   0,   0,   0,
+     56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,
+     56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,   0,   0,
+     56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,
+     56,  56,  56,  56,  56,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     56,  56,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,
+     56,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,
-     65,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,   0,   0,   0,   0,   0,
       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-};
+      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0
+};
+static RE_UINT16 script_extensions_table_4[] = {
+      0,   2,   4,   7,  10,  13,  19,  23,  32,  35,  39,  42,  56,  69,  90, 112,
+    117, 121, 124, 127, 130, 133, 137, 140, 145, 148, 153, 155, 158, 161, 164, 171,
+    174, 183, 187, 189, 191, 194, 197, 201, 208, 214, 216, 219, 222, 226, 229, 244,
+    258, 270, 273, 277, 280, 283, 286, 290, 293
+};
+static RE_UINT8 script_extensions_table_5[] = {
+      5,   0,   2,   0,   7,  77,   0,   7,  54,   0,   7,   2,   0,  10, 106,  11,
+     12, 107,   0,  10,  11,  12,   0, 156,  10,  15,  99, 103, 106, 109,  11,   0,
+     10,  11,   0,  10,  12, 107,   0,  10, 106,   0,  17,  16, 121,  19,  18,  23,
+      2,  24,  20, 117,  21,  22, 123,   0,  17,  16, 121,  19,  18,  23,   2,  24,
+     20,  21,  22, 123,   0,  17,  16, 128, 138, 137, 121,  19,  18,  23, 116,  24,
+    131,  20, 120,  25,  63, 126,  21,  22, 123,   0,  17,  16, 128, 138, 137, 121,
+     19,  18,  23,  43, 116,  24, 131,  20, 120,  25,  63, 126,  21,  22, 123,   0,
+     16, 128, 113, 116,   0,  17, 115,  63,   0,  18, 119,   0,  19, 118,   0, 121,
+     21,   0,  23, 131,   0, 115,  29,  44,   0,  30,   2,   0,  39,  38,  40,  37,
+      0,  42,  64,   0,  17,  16, 121,  23,   0,  16,   0,  16, 121,   0,  17,  16,
+      0,  16, 117,   0,  16,  23,  24,  20,  21,  22,   0,  16, 131,   0,  17,  16,
+    121,  23, 131,  20,  22, 123,   0,  16, 121,  23,   0,  17,   0, 131,   0,   7,
+     11,   0,   2,  42,   0,  16, 121,   2,   0,   3,  31,  56,  57,  58,  59,   0,
+      3,  31,  56,  57,  58,   0,  56,   0,   3,  56,   0,  57,  58,   0,  56,  57,
+     58,   0,  56,   2,   0,  16, 128,  19,  18, 118,  23, 113, 116,  24, 125, 131,
+    120, 126, 123,   0,  16, 128,  19,  18, 118,  23, 113, 116, 125, 131, 120, 126,
+    123,   0,  16, 128,  19,  18, 118, 113, 116, 125, 120, 126, 123,   0,  16,  21,
+      0,  66,   2,  29,   0,  46,  68,   0,  10,  12,   0,  87,  72,   0,  87,  86,
+     72,   0,  10,   6,   0, 151,   0
+};
+
+int re_get_script_extensions(RE_UINT32 codepoint, RE_UINT8* scripts) {
+    RE_UINT32 field_2;
+    RE_UINT32 field_1;
+    RE_UINT32 field_0;
+    RE_UINT32 v;
+    int offset;
+    int count;
 
-static RE_UINT8 re_decomposition_type_stage_3[] = {
-      0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   2,   3,   4,   5,   6,   7,
-      8,   9,   8,   8,  10,  11,  10,  12,   8,   9,   8,   8,  10,  11,  10,   9,
-      8,   8,   8,   8,  13,   8,   8,   8,   8,  12,   8,   8,  14,   8,  10,  15,
-     16,   8,  17,   8,  12,   8,   8,   8,   8,  12,   8,   8,   8,   8,   8,  15,
-     12,   0,   0,  18,  19,   0,   0,   0,   0,  20,  20,  21,   8,   8,   8,  22,
-      8,  13,   8,   8,  23,  12,   8,   8,   8,   8,   8,   8,   8,   8,   8,  13,
-      0,  13,   8,   8,   8,   0,   0,   0,   0,   0,   0,   0,  24,  24,  25,   0,
-      0,   0,   0,   0,   0,   0,  20,   5,  24,  25,   0,   0,   0,   0,   0,   0,
-      9,  19,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  19,  26,  27,
-      0,  21,  11,  22,  19,   0,   0,   0,   0,   0,  13,   8,  19,   0,   0,   0,
-      0,   0,  13,  11,  28,  29,   0,   0,   0,   0,   0,   0,  30,   5,  31,   0,
-      9,  18,   0,  11,   0,   0,  32,   0,   0,   0,   0,   0,   0,   0,  32,   0,
-      0,   0,   0,   0,   9,  18,   0,  11,   0,   0,   0,   0,   0,  13,   0,   0,
-     33,   0,   0,   0,   8,  13,  13,   8,  13,   8,  13,   8,   8,  12,  12,   0,
-      0,   3,   0,   0,   0,   0,   0,   0,  13,  11,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,  34,  35,   0,  36,   0,   0,   0,  18,   0,   0,   0,
-      0,   0,  32,   0,  32,  19,   0,   0,   0,   0,   0,   0,   0,   0,   8,   8,
-      0,   0,  18,  19,   0,   0,   0,   9,   0,   0,   0,   0,  18,  27,   0,   0,
-      0,   0,   0,   0,   0,   0,  10,  27,   0,   0,  37,  19,   0,   0,   0,  12,
-      0,   0,   0,   0,   0,  19,   0,   0,   0,   0,  13,  19,   0,   0,   0,   0,
-      0,   0,  19,   0,   0,   0,   0,   0,  19,  18,  22,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,  27,  11,   0,   0,   0,   0,   3,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   5,   0,   0,   0,   1,   0,   0,   0,   0,
-     18,   0,   0,  32,  27,  18,   0,  19,   0,   0,  32,   0,  18,  38,  17,   0,
-     32,   0,   0,   0,  18,   0,   0,  32,  27,  18,   0,  19,   0,   0,  32,   0,
-      0,  27,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  25,
-      0,  27,  36,  36,  27,   0,   0,   0,   0,   0,   0,   0,   0,   0,  18,  32,
-      9,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  39,  24,  24,  39,  24,
-     24,  24,  24,  40,  24,  24,  24,  24,  41,  42,  43,   0,   0,   0,  25,   0,
-      0,   0,   0,   0,   0,   0,  44,  24,  24,  24,  24,  24,  24,  24,  24,  24,
-      8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,  45,   0,
-      8,   8,   8,   8,   8,   8,  12,   0,   8,   8,   8,   8,   8,  12,   8,  12,
-      8,  12,   8,  12,   8,   8,  46,  46,   8,   8,   8,   8,   8,   8,   8,  12,
-      8,   8,   8,   8,   8,  22,   8,  47,  21,  22,   8,   8,   8,  13,   8,  10,
-      8,   8,   8,   8,  13,  22,   8,  48,  49,  50,  30,   0,  51,   3,   0,   0,
-      0,  30,   0,  52,   3,  53,   0,  54,   0,   3,   5,   0,   0,   3,   0,   3,
-      0,   0,   0,   0,  55,  24,  24,  24,  42,  42,  42,  43,  42,  42,  42,  56,
-      0,   0,  35,   0,   0,   0,   0,   0,  57,  34,  58,  59,  59,  60,  61,  62,
-     63,  64,  65,  66,  66,  67,  68,  59,  69,  61,  62,   0,  70,  70,  70,  70,
-     20,  20,  20,  20,  20,  20,  20,  20,   0,   0,  71,   0,   0,   0,  13,   0,
-      0,   0,   0,  27,   0,   0,   0,   0,   0,   0,   0,  10,   0,   0,   0,   0,
-      0,  19,  32,  19,   0,   0,   0,   0,   0,  36,   0,  72,  35,   0,   0,   0,
-     32,  37,  32,   0,   0,   0,   0,   0,  36,   0,   0,  10,  12,  12,  12,   0,
-     12,  12,  12,   0,   0,   0,   0,   0,   0,   0,   0,   8,   0,   0,   0,   0,
-      8,   0,  13,  12,   0,   0,   0,   0,   0,   0,  33,   0,   0,   0,   0,   0,
-     73,  73,  73,  73,  73,  20,  20,  20,  20,  20,  20,  20,  20,  74,  73,  73,
-     73,  73,  73,  73,  73,  73,  73,  73,  73,  73,  75,   0,   0,   0,   0,   0,
-      0,   0,   0,  35,   0,   0,   0,   0,   0,   0,   0,   0,   0,  30,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,  19,   0,   0,   0,   0,   0,   0,   0,  76,
-      0,   0,   0,  44,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,
-     20,  20,  20,  20,  20,   5,   0,   0,  77,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,  26,  30,   0,   0,   0,   0,  36,  36,  36,  36,  36,
-     36,  46,  32,   0,   9,  22,  33,  12,   0,   0,   0,   0,   0,  19,   3,  78,
-      0,   0,   0,   0,   0,  37,  11,  79,   0,   0,   0,   0,  34,  20,  20,  20,
-     20,  20,  20,  30,   4,  24,  24,  24,  20,  20,  20,  20,  20,  20,  20,  30,
-     20,  73,   0,   0,  80,  73,  73,  73,  73,  73,  73,  73,  73,  73,  73,  75,
-     20,  20,  20,  81,  73,  73,  73,  73,  73,  73,  73,  73,  73,  73,  73,  82,
-     81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  20,  20,
-     20,  20,  20,  20,  83,  81,  81,  81,  20,  20,  20,  20,  20,  20,  20,  84,
-      0,   0,   0,   0,   0,   0,   0,  55,   0,   0,   0,   0,  25,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,  55,   0,   0,   0,   0,   0,   0,   0,   0,  24,
-      8,   0,   0,   0,   0,   0,   0,   0,   8,   8,   8,  12,  36,  10,   8,  11,
-     36,  33,  13,   8,   8,   8,   8,   8,   8,   8,   8,  12,   8,   8,   8,   8,
-     20,  30,   0,   0,   3,  20,   0,  46,  59,  59,  85,   8,   8,  11,   8,  36,
-      9,  22,   8,  15,  86,  87,  87,  87,  87,  87,  87,  87,  87,  87,  87,  87,
-     87,  86,  86,  86,  87,  87,  87,  87,  88,  86,  87,  87,  89,   0,   0,   0,
-      0,   0,   0,   0,  90,  91,  92,  93,  86,  88,  87,  86,  86,  86,  94,  88,
-     95,  95,  95,  95,  95,  95,  95,  95,  95,  96,  96,  96,  96,  96,  96,  96,
-     96,  96,  96,  96,  96,  97,  98,  98,  98,  98,  98,  98,  98,  98,  98,  98,
-     98,  98,  98,  98,  98,  98,  98,  99, 100, 100, 100, 100, 100, 101,  95,  95,
-     95,  95,  95,  95, 102,  96,  96,  96,  96,  96,  96, 103,  98, 100, 100, 104,
-      0,   0,   0,   0, 105,  98, 106, 107, 108, 106, 109, 106, 105,  97,  96, 106,
-     97, 110, 111,  98, 112, 107, 113, 106,  96,  96,  96,  96,  96, 107, 114,  96,
-     97, 107,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  95,  95,  95, 115,
-      0,   0,   0,   0, 116, 116, 117,   0,   0,   0,   0,   0, 116, 116, 116, 116,
-    116, 118, 119,  20, 120, 121, 121, 121, 121, 120, 121,   0, 122, 123, 124, 124,
-    125,  92, 126, 127,  91, 126, 128, 128, 128, 128, 127,  92, 126, 128, 128, 128,
-    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 127, 126, 127,  92, 129,
-    130, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-    132, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-    133, 133, 133, 133, 133, 133, 133, 134, 135, 133, 135, 133, 135, 133, 135, 136,
-    131, 137, 133, 134,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  27,  19,
-      0,   0,  18,   0,   0,   0,   0,   0,   0,   0,   0,  13,   0,   0,   0,   0,
-      0,   0,  18,  19,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  18,  36,
-      0,   0,   0,   0,   0,   0,  13,   0,   0,   0,   0,   0,   0,   0,   0,  13,
-      8,  19,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  18,   8,
-     19,   0,   0,   0,   0,   0,   0,   0,  59,  59,  59,  59,  59,  59,  59,  59,
-     59,  59,  59,  59,  59, 138,  59,  59,  59,  59,  59,  59,  59,  59,  59, 138,
-    139, 140,  61, 138,  59,  59,  66,  61,  59,  61,  59,  59,  59,  59,  59,  59,
-     59,  66, 141,  61,  59, 138,  59, 138,  59,  59,  59,  59,  59,  59,  66, 141,
-     59, 142, 143,  59, 138,  59,  59,  59,  59,  62,  59,  59,  59,  59,  59,  59,
-     59,  59,  59, 143,  59,  59,  59,  59, 140, 144,  61,  59, 141,  59, 145,   0,
-    139, 146, 145,  61, 140, 144, 145, 145, 140, 144, 141,  59, 141,  59,  61, 142,
-     59,  59,  66,  59,  59,  59,  59,   0,  61,  61,  66,  59,  59,  59,  59,   0,
-     20,  20,  30,   0,  20,  20,  20,  20,  20,  20, 147,  75,  81,  81,  81,  81,
-     81,  81,  81,  81,   0,   0,   0,   0,   0,   0,   4,  25,   0,   0,   0,   0,
-      0,   0,   0,   0, 148,   0,   0,   0, 149,   0,   0,   0,  81,  81,  81,  81,
-     81,  81,  81,  81,  81,  81,  81,   0,  20,  20,  35,   0, 150,   0,   0,   0,
-};
+    field_2 = codepoint >> 10;
+    field_1 = (codepoint >> 5) & 0x1F;
+    field_0 = codepoint & 0x1F;
 
-static RE_UINT8 re_decomposition_type_stage_4[] = {
-     0,  0,  0,  0,  4,  0,  0,  0,  2,  0, 10,  0,  0,  0,  0,  2,
-     0,  0, 10, 10,  2,  2,  0,  0,  2, 10, 10,  0, 17, 17, 17,  0,
-     1,  1,  1,  1,  1,  1,  0,  1,  0,  1,  1,  1,  1,  1,  1,  0,
-     1,  1,  0,  0,  0,  0,  1,  1,  1,  0,  2,  2,  1,  1,  1,  2,
-     2,  0,  0,  1,  1,  2,  0,  0,  0,  0,  0,  1,  1,  0,  0,  0,
-     2,  2,  2,  2,  2,  1,  1,  1,  1,  0,  1,  1,  1,  2,  2,  2,
-    10, 10, 10, 10, 10,  0,  0,  0,  0,  0,  2,  0,  0,  0,  1,  0,
-     2,  2,  2,  1,  1,  2,  2,  0,  2,  2,  2,  0,  0,  2,  0,  0,
-     0,  1,  0,  0,  0,  1,  1,  0,  0,  2,  2,  2,  2,  0,  0,  0,
-     1,  0,  1,  0,  1,  0,  0,  1,  0,  1,  1,  2, 10, 10, 10,  0,
-    10, 10,  0, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11,  0,
-     0,  0,  0, 10,  1,  1,  2,  1,  0,  1,  0,  1,  1,  2,  1,  2,
-     1,  1,  2,  0,  1,  1,  2,  2,  2,  2,  2,  4,  0,  4,  0,  0,
-     0,  0,  0,  4,  2,  0,  2,  2,  2,  0,  2,  0, 10, 10,  0,  0,
-    11,  0,  0,  0,  2,  2,  3,  2,  0,  2,  3,  3,  3,  3,  3,  3,
-     0,  3,  2,  0,  0,  3,  3,  3,  3,  3,  0,  0, 10,  2, 10,  0,
-     3,  0,  1,  0,  3,  0,  1,  1,  3,  3,  0,  3,  3,  2,  2,  2,
-     2,  3,  0,  2,  3,  0,  0,  0, 17, 17, 17, 17,  0, 17,  0,  0,
-     2,  2,  0,  2,  9,  9,  9,  9,  2,  2,  9,  9,  9,  9,  9,  0,
-    11, 10,  0,  0, 13,  0,  0,  0,  2,  0,  1, 12,  0,  0,  1, 12,
-    16,  9,  9,  9, 16, 16, 16, 16,  9,  9,  9, 16,  2, 16, 16, 16,
-     2,  2,  2, 16,  3,  3,  1,  1,  8,  7,  8,  7,  5,  6,  8,  7,
-     8,  7,  5,  6,  8,  7,  0,  0,  0,  0,  0,  8,  7,  5,  6,  8,
-     7,  8,  7,  8,  7,  8,  8,  7,  5,  8,  7,  5,  8,  8,  8,  8,
-     7,  7,  7,  7,  7,  7,  7,  5,  5,  5,  5,  5,  5,  5,  5,  6,
-     6,  6,  6,  6,  6,  8,  8,  8,  8,  7,  7,  7,  7,  5,  5,  5,
-     7,  8,  0,  0,  5,  7,  5,  5,  7,  5,  7,  7,  5,  5,  7,  7,
-     5,  5,  7,  5,  5,  7,  7,  5,  7,  7,  5,  7,  5,  5,  5,  7,
-     0,  0,  5,  5,  5,  7,  7,  7,  5,  7,  5,  7,  8,  0,  0,  0,
-    12, 12, 12, 12, 12, 12,  0,  0, 12,  0,  0, 12, 12,  2,  2,  2,
-    15, 15, 15,  0, 15, 15, 15, 15,  8,  6,  8,  0,  8,  0,  8,  6,
-     8,  6,  8,  6,  8,  8,  7,  8,  7,  8,  7,  5,  6,  8,  7,  8,
-     6,  8,  7,  5,  7,  0,  0,  0,  0, 13, 13, 13, 13, 13, 13, 13,
-    13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,  0,  0,  0, 14, 14,
-    14,  0,  0,  0, 13, 13, 13,  0,  3,  0,  3,  3,  0,  0,  3,  0,
-     0,  3,  3,  0,  3,  3,  3,  0,  3,  0,  3,  0,  0,  0,  3,  3,
-     3,  0,  0,  3,  0,  3,  0,  3,  0,  0,  0,  3,  2,  2,  2,  9,
-    16,  0,  0,  0, 16, 16, 16,  0,  9,  9,  0,  0,
-};
+    v = script_extensions_table_1[field_2];
+    v = script_extensions_table_2[(v << 5) | field_1];
+    v = script_extensions_table_3[(v << 5) | field_0];
+
+    if (v < 158) {
+        scripts[0] = v;
 
-/* Decomposition_Type: 3868 bytes. */
-
-RE_UINT32 re_get_decomposition_type(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-
-    f = ch >> 11;
-    code = ch ^ (f << 11);
-    pos = (RE_UINT32)re_decomposition_type_stage_1[f] << 6;
-    f = code >> 5;
-    code ^= f << 5;
-    pos = (RE_UINT32)re_decomposition_type_stage_2[pos + f] << 3;
-    f = code >> 2;
-    code ^= f << 2;
-    pos = (RE_UINT32)re_decomposition_type_stage_3[pos + f] << 2;
-    value = re_decomposition_type_stage_4[pos + code];
-
-    return value;
+        return 1;
+    }
+
+    offset = script_extensions_table_4[v - 158];
+    count = 0;
+
+    do {
+        scripts[count] = script_extensions_table_5[offset + count];
+        ++count;
+    } while (script_extensions_table_5[offset + count] != 0);
+
+    return count;
 }
 
-/* East_Asian_Width. */
+/* Sentence_Break. */
+static RE_UINT8 re_sentence_break_table_1[] = {
+     0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 13, 13,
+    13, 13, 13, 14, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 15, 13, 16, 17, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 18, 19, 19, 19, 19, 19, 19, 19, 19, 20, 21,
+    22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 19, 19, 13, 32, 19, 19,
+    19, 33, 19, 19, 19, 19, 19, 19, 19, 19, 34, 35, 13, 13, 13, 13,
+    13, 36, 13, 37, 19, 19, 19, 19, 19, 19, 19, 19, 38, 19, 19, 39,
+    19, 19, 19, 19, 40, 41, 42, 19, 43, 19, 44, 45, 46, 47, 48, 19,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 49, 13, 13, 13, 50, 51, 13,
+    13, 13, 13, 52, 13, 13, 13, 13, 13, 13, 53, 19, 19, 19, 54, 19,
+    13, 13, 13, 13, 55, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+    19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+    19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+    19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+    19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+    19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+    19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+    19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+    19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+    19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+    19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+    19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+    19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+    19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+    19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+    19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+    19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+    19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+    19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+    19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+    19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+    19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+    19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+    19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+    19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+    19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+    19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+    19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+    19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+    19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+    19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+    19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+    19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+    19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+    19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+    19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+    19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+    19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+    19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+    19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+    19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+    19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+    19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+    19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+    56, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+    19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+    19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+    19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+    19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+    19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+    19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+    19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+    19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+    19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+    19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+    19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19
+};
 
-static RE_UINT8 re_east_asian_width_stage_1[] = {
-     0,  1,  2,  3,  4,  5,  5,  5,  5,  5,  6,  5,  5,  7,  8,  9,
-    10, 10, 10, 10, 10, 10, 11,  5, 12, 10, 10, 13, 10, 10, 10, 14,
-     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5, 15,
-     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5, 15,
+static RE_UINT16 re_sentence_break_table_2[] = {
+      0,   1,   2,   3,   4,   5,   6,   7,   8,   9,  10,  11,  12,  13,  14,  15,
+      8,  16,  17,  18,  19,  20,  21,  22,  23,  23,  23,  24,  25,  26,  27,  28,
+     29,  30,  18,   8,  31,   8,  32,   8,   8,  33,  34,  18,  35,  36,  37,  38,
+     39,  40,  41,  42,  40,  40,  43,  44,  45,  46,  47,  40,  40,  48,  49,  50,
+     51,  52,  53,  54,  55,  56,  57,  58,  59,  60,  61,  62,  63,  64,  65,  66,
+     67,  68,  69,  70,  71,  72,  73,  74,  75,  72,  76,  77,  78,  79,  80,  81,
+     82,  83,  84,  85,  86,  87,  88,  89,  90,  91,  92,  93,  94,  95,  96,  97,
+     98,  99, 100,  55, 101, 102, 103,  55, 104, 105, 106, 107, 108, 109, 110,  55,
+     40, 111, 112, 113, 114,  29, 115, 116,  40,  40,  40,  40,  40,  40,  40,  40,
+     40,  40, 117,  40, 118, 119, 120,  40, 121,  40, 122, 123, 124,  29,  29, 125,
+     98,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,
+     40,  40,  40, 126, 127,  40,  40, 128, 129, 130, 131, 132,  40, 133, 134, 135,
+    136,  40,  40, 137, 138, 139,  40, 140, 141, 142, 143, 144,  40, 145, 146,  55,
+    147,  40, 148, 149, 150, 151, 152,  55, 153, 133, 154, 155, 156, 157,  40, 158,
+     40, 159, 160, 161, 162, 163, 164, 165,  18,  18,  18,  18,  18,  18,  23, 166,
+      8,   8,   8,   8, 167,   8,   8,   8, 168, 169, 170, 171, 169, 172, 173, 174,
+    175, 176, 177, 178, 179,  55, 180, 181, 182, 183, 184,  30, 185,  55,  55,  55,
+     55,  55,  55,  55,  55,  55,  55,  55, 186, 187,  55,  55,  55,  55,  55,  55,
+     55,  55,  55,  55,  55, 188,  30, 189,  55,  55,  55,  55,  55,  55,  55,  55,
+     55,  55,  55,  55,  55,  55,  55,  55,  55,  55, 190, 191,  55,  55, 192, 193,
+     55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55, 194,  55, 195, 196,
+     55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,
+     29, 197, 198, 199,   8,   8,   8, 200,  18, 201,  40, 202, 203, 204, 204,  23,
+    205, 206, 207,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,
+    208, 209,  98,  40, 210,  98,  40, 116, 211, 212,  40,  40, 213,  40,  55, 214,
+     55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,
+     40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,
+     40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,
+     40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  55,  55,
+     40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,
+     40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,
+     40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40, 215,
+     40,  40,  40,  40, 216,  55, 214, 217,  40,  40,  40,  40,  40,  40,  40,  40,
+    218, 219,   8, 220, 221,  40,  40, 222, 223, 224,   8, 225, 226, 227, 228, 229,
+    230, 231,  40, 232, 233, 133, 234, 235,  49, 236, 237, 215,  59, 238, 239, 240,
+     40, 241, 242, 243,  40, 244, 245, 246, 247, 248, 249, 250,  18,  18,  40, 251,
+     40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,
+     40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40, 252, 253, 254,
+     55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,
+     55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,
+     55,  55,  55,  55,  55,  55,  55,  55,  40,  40,  40,  40,  40,  40,  40,  40,
+     40,  40,  40, 255,  40,  40, 256,  55, 257, 258, 259,  40,  40, 260, 261,  40,
+     40,  40,  40,  40,  40,  40,  40,  40,  40, 262, 214,  40, 263,  40, 264, 265,
+    266, 267, 268, 269,  40,  40,  40, 270, 271,   2, 272, 273, 274, 141, 275, 276,
+    277, 278, 279,  55,  40,  40,  40, 280,  55,  55,  40, 281,  55,  55,  55, 282,
+     55,  55,  55,  55, 215,  40, 283, 152,  40, 284, 285, 286, 287,  40, 288,  55,
+     29, 289, 290,  40, 287, 291, 292, 293,  40, 294,  40, 295,  55,  55,  55,  55,
+     40,  40,  40,  40,  40,  40,  40,  40,  40, 203, 140, 264,  55,  55,  55,  55,
+    296, 297, 140, 203, 141,  55,  55, 298, 140, 256,  55,  55,  40, 299,  55,  55,
+    300, 301, 302, 215, 215,  55, 106, 303,  40, 140, 140, 304, 260,  55,  55,  55,
+     40,  40, 305,  55,  29, 306,  18, 307,  40, 308,  55,  55,  55,  55,  55,  55,
+     55,  55,  55,  55,  40, 309,  55,  55, 215, 310, 311,  55,  55, 214, 312, 203,
+    156, 313, 314, 315, 156, 316, 317, 318, 156, 319, 320, 321, 156, 238, 322,  55,
+    323, 324,  55,  55, 325, 326, 327, 328, 329, 330, 331, 332,  55,  55,  55,  55,
+     40, 333, 334, 335,  40,  46, 336,  55,  55,  55,  55,  55,  40, 337, 338,  55,
+     40,  46, 339,  55,  40, 340, 135,  55, 122, 341,  55,  55,  55,  55,  55,  55,
+     40, 342,  55,  55,  55,  29,  18, 343, 344, 345, 346,  55,  55, 347, 348, 349,
+    350, 351, 352,  40, 353,  55,  40, 137,  55,  55,  55,  55,  55,  55,  55,  55,
+    354, 355, 356, 357, 358, 359,  55,  55, 360, 361, 362, 363, 364, 135,  55,  55,
+     55,  55,  55,  55,  55,  55,  55, 365,  55,  55,  55,  55,  55, 366,  55,  55,
+     40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,
+     40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40, 256,  55,  55,  55,
+     40,  40,  40, 213,  40,  40,  40,  40,  40,  40, 295,  55,  55,  55,  55,  55,
+     55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,
+     40, 367,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,
+     55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,
+     40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,
+     40,  40, 368,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,
+     40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,
+     40, 137, 141, 369,  55,  55, 214, 370,  40, 371, 372, 373, 124,  55,  55,  55,
+     55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,
+     55,  55,  29,  18, 374,  55,  55,  55,  40,  40, 375,  23, 376,  55,  55, 377,
+     40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,
+     40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40, 378,
+     40,  40,  40,  40,  40,  40, 140,  55, 305,  55,  55,  55,  55,  55,  55,  55,
+     55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,
+     40,  40,  40,  40,  40,  40,  40,  40, 141,  55, 379, 380,  40,  40,  40,  40,
+     40,  40,  40,  40,  40,  40,  40, 254,  55,  55,  55,  55,  55,  55,  55,  55,
+     40,  40,  40, 381, 382, 383,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,
+     55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,
+     55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55, 384, 385, 386,  55,  55,
+     55,  55, 387,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,
+    388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, 388, 389, 401,
+    391, 402, 403, 404, 395, 405, 406, 407, 408, 409, 410, 197, 411, 412, 413, 414,
+     55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,
+     23, 415,  23, 416, 417, 418,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,
+    419, 420,  55,  55,  55,  55,  55,  55,  40, 421, 422,  55,  55,  55,  55,  55,
+     55,  55,  55,  55,  55,  55,  40, 423,  55,  55,  55,  55,  55,  55,  55,  55,
+     40,  40,  40,  40,  40,  40, 424,  55,  29, 425, 426,  55,  55,  55,  55,  55,
+     55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,
+     55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,
+    427, 428, 429, 430, 431, 432,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,
+     55,  55,  55,  55,  55,  55,  55,  55,  55, 433, 434, 434, 435,  55,  55,  55,
+     55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,
+     55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,
+     55,  55,  55, 436,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,
+     55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,
+     55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55, 437,
+     40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,
+     40,  40,  40,  40,  40,  40, 287,  55,  40,  40,  40,  40,  40,  40,  40,  40,
+     40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,
+     40,  40,  40,  40,  40,  40,  40,  40,  40, 281,  40,  40,  40,  40,  40,  40,
+    287,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,
+     40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,
+     40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,
+     40,  40,  40,  40,  40, 438,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,
+     40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,
+     40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40, 439,
+     40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,
+    287,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,
+     40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,
+     40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  54,  55,  55,  55,  55,  55,
+    440,  23,  23,  23,  55,  55,  55,  55,  23,  23,  23,  23,  23,  23,  23, 441,
+     55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55
+};
+
+static RE_UINT8 re_sentence_break_table_3[] = {
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  2,  1,  1,  3,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     1,  4,  5,  0,  0,  0,  0,  5,  5,  5,  0,  0,  6,  6,  7,  0,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  6,  0,  0,  0,  0,  4,
+     0,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  5,  0,  5,  0,  0,
+     0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,  5,  0,  5,  0,  0,
+     0,  0,  0,  0,  0, 11,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     1,  0,  0,  0,  0,  0,  0,  0,  0,  0, 10,  5,  0, 12,  0,  0,
+     0,  0,  0,  0,  0, 10,  0,  0,  0,  0, 10,  5,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  0,  9,  9,  9,  9,  9,  9,  9, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10,  0, 10, 10, 10, 10, 10, 10, 10, 10,
+     9, 10,  9, 10,  9, 10,  9, 10,  9, 10,  9, 10,  9, 10,  9, 10,
+     9, 10,  9, 10,  9, 10,  9, 10,  9, 10,  9, 10,  9, 10,  9, 10,
+     9, 10,  9, 10,  9, 10,  9, 10,  9, 10,  9, 10,  9, 10,  9, 10,
+     9, 10,  9, 10,  9, 10,  9, 10, 10,  9, 10,  9, 10,  9, 10,  9,
+    10,  9, 10,  9, 10,  9, 10,  9, 10, 10,  9, 10,  9, 10,  9, 10,
+     9, 10,  9, 10,  9, 10,  9, 10,  9, 10,  9, 10,  9, 10,  9, 10,
+     9, 10,  9, 10,  9, 10,  9, 10,  9, 10,  9, 10,  9, 10,  9, 10,
+     9, 10,  9, 10,  9, 10,  9, 10,  9,  9, 10,  9, 10,  9, 10, 10,
+    10,  9,  9, 10,  9, 10,  9,  9, 10,  9,  9,  9, 10, 10,  9,  9,
+     9,  9, 10,  9,  9, 10,  9,  9,  9, 10, 10, 10,  9,  9, 10,  9,
+     9, 10,  9, 10,  9, 10,  9,  9, 10,  9, 10, 10,  9, 10,  9,  9,
+    10,  9,  9,  9, 10,  9, 10,  9,  9, 10, 10, 13,  9, 10, 10, 10,
+    13, 13, 13, 13,  9,  9, 10,  9,  9, 10,  9,  9, 10,  9, 10,  9,
+    10,  9, 10,  9, 10,  9, 10,  9, 10,  9, 10,  9, 10, 10,  9, 10,
+     9, 10,  9, 10,  9, 10,  9, 10,  9, 10,  9, 10,  9, 10,  9, 10,
+    10,  9,  9, 10,  9, 10,  9,  9,  9, 10,  9, 10,  9, 10,  9, 10,
+     9, 10,  9, 10,  9, 10,  9, 10,  9, 10,  9, 10,  9, 10,  9, 10,
+     9, 10,  9, 10, 10, 10, 10, 10, 10, 10,  9,  9, 10,  9,  9, 10,
+    10,  9, 10,  9,  9,  9,  9, 10,  9, 10,  9, 10,  9, 10,  9, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 13, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 13, 13, 13, 13, 13, 13, 13,
+    10, 10,  0,  0,  0,  0, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    10, 10, 10, 10, 10,  0,  0,  0,  0,  0,  0,  0, 13,  0, 13,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+     9, 10,  9, 10, 13,  0,  9, 10,  0,  0, 10, 10, 10, 10,  0,  9,
+     0,  0,  0,  0,  0,  0,  9,  0,  9,  9,  9,  0,  9,  0,  9,  9,
+    10,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  0,  9,  9,  9,  9,  9,  9,  9,  9,  9, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,  9,
+    10, 10,  9,  9,  9, 10, 10, 10,  9, 10,  9, 10,  9, 10,  9, 10,
+     9, 10,  9, 10,  9, 10,  9, 10,  9, 10,  9, 10,  9, 10,  9, 10,
+    10, 10, 10, 10,  9, 10,  0,  9, 10,  9,  9, 10, 10,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+     9, 10,  0, 14, 14, 14, 14, 14, 14, 14,  9, 10,  9, 10,  9, 10,
+     9, 10,  9, 10,  9, 10,  9, 10,  9, 10,  9, 10,  9, 10,  9, 10,
+     9,  9, 10,  9, 10,  9, 10,  9, 10,  9, 10,  9, 10,  9, 10, 10,
+     9, 10,  9, 10,  9, 10,  9, 10,  9, 10,  9, 10,  9, 10,  9, 10,
+     9, 10,  9, 10,  9, 10,  9, 10,  9, 10,  9, 10,  9, 10,  9, 10,
+     0,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  0,  0, 13,  0,  0,  0,  6,  0,  0,
+    10, 10, 10, 10, 10, 10, 10, 10, 10,  4,  0,  0,  0,  0,  0,  0,
+     0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,  0, 14,
+     0, 14, 14,  0, 14, 14,  0, 14,  0,  0,  0,  0,  0,  0,  0,  0,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,  0,  0,  0,  0, 13,
+    13, 13, 13, 13,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    12, 12, 12, 12, 12, 12,  0,  0,  0,  0,  0,  0,  6,  6,  0,  0,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,  0, 12,  0,  4,  4,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  0,  8,  8,  0, 13, 13,
+    14, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13,  4, 13, 14, 14, 14, 14, 14, 14, 14, 12,  0, 14,
+    14, 14, 14, 14, 14, 13, 13, 14, 14,  0, 14, 14, 14, 14, 13, 13,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8, 13, 13, 13,  0,  0, 13,
+     4,  4,  4,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 12,
+    13, 14, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,  0,  0, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 13,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 13, 13,  0,  0,  6,  4, 13,  0,  0, 14,  0,  0,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 13, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 13, 14, 14, 14, 13, 14, 14, 14, 14, 14,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  4,  0,  4,  0,  0,  0,  4,  4,  0,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14,  0,  0,  0,  0,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13,  0, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 12, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 13, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    13, 14, 14, 14, 14, 14, 14, 14, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 14, 14,  4,  4,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     0, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 14, 14, 14,  0, 13, 13, 13, 13, 13, 13, 13, 13,  0,  0, 13,
+    13,  0,  0, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13,  0, 13, 13, 13, 13, 13, 13,
+    13,  0, 13,  0,  0,  0, 13, 13, 13, 13,  0,  0, 14, 13, 14, 14,
+    14, 14, 14, 14, 14,  0,  0, 14, 14,  0,  0, 14, 14, 14, 13,  0,
+     0,  0,  0,  0,  0,  0,  0, 14,  0,  0,  0,  0, 13, 13,  0, 13,
+    13, 13, 14, 14,  0,  0,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+    13, 13,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 13,  0, 14,  0,
+     0, 14, 14, 14,  0, 13, 13, 13, 13, 13, 13,  0,  0,  0,  0, 13,
+    13,  0,  0, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13,  0, 13, 13, 13, 13, 13, 13,
+    13,  0, 13, 13,  0, 13, 13,  0, 13, 13,  0,  0, 14,  0, 14, 14,
+    14, 14, 14,  0,  0,  0,  0, 14, 14,  0,  0, 14, 14, 14,  0,  0,
+     0, 14,  0,  0,  0,  0,  0,  0,  0, 13, 13, 13, 13,  0, 13,  0,
+     0,  0,  0,  0,  0,  0,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+    14, 14, 13, 13, 13, 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0, 14, 14, 14,  0, 13, 13, 13, 13, 13, 13, 13, 13, 13,  0, 13,
+    13, 13,  0, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13,  0, 13, 13, 13, 13, 13, 13,
+    13,  0, 13, 13,  0, 13, 13, 13, 13, 13,  0,  0, 14, 13, 14, 14,
+    14, 14, 14, 14, 14, 14,  0, 14, 14, 14,  0, 14, 14, 14,  0,  0,
+    13,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    13, 13, 14, 14,  0,  0,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     0,  0,  0,  0,  0,  0,  0,  0,  0, 13, 14, 14, 14, 14, 14, 14,
+     0, 14, 14, 14,  0, 13, 13, 13, 13, 13, 13, 13, 13,  0,  0, 13,
+    13,  0,  0, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    14, 14, 14, 14, 14,  0,  0, 14, 14,  0,  0, 14, 14, 14,  0,  0,
+     0,  0,  0,  0,  0, 14, 14, 14,  0,  0,  0,  0, 13, 13,  0, 13,
+    13, 13, 14, 14,  0,  0,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     0, 13,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0, 14, 13,  0, 13, 13, 13, 13, 13, 13,  0,  0,  0, 13, 13,
+    13,  0, 13, 13, 13, 13,  0,  0,  0, 13, 13,  0, 13,  0, 13, 13,
+     0,  0,  0, 13, 13,  0,  0,  0, 13, 13, 13,  0,  0,  0, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13,  0,  0,  0,  0, 14, 14,
+    14, 14, 14,  0,  0,  0, 14, 14, 14,  0, 14, 14, 14, 14,  0,  0,
+    13,  0,  0,  0,  0,  0,  0, 14,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    14, 14, 14, 14, 14, 13, 13, 13, 13, 13, 13, 13, 13,  0, 13, 13,
+    13,  0, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13,  0, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13,  0,  0,  0, 13, 14, 14,
+    14, 14, 14, 14, 14,  0, 14, 14, 14,  0, 14, 14, 14, 14,  0,  0,
+     0,  0,  0,  0,  0, 14, 14,  0, 13, 13, 13,  0,  0,  0,  0,  0,
+    13, 13, 14, 14,  0,  0,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    13, 14, 14, 14,  0, 13, 13, 13, 13, 13, 13, 13, 13,  0, 13, 13,
+    13,  0, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13,  0, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13,  0, 13, 13, 13, 13, 13,  0,  0, 14, 13, 14, 14,
+    14, 14, 14, 14, 14,  0, 14, 14, 14,  0, 14, 14, 14, 14,  0,  0,
+     0,  0,  0,  0,  0, 14, 14,  0,  0,  0,  0,  0,  0,  0, 13,  0,
+    13, 13, 14, 14,  0,  0,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     0, 13, 13,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    14, 14, 14, 14, 13, 13, 13, 13, 13, 13, 13, 13, 13,  0, 13, 13,
+    13,  0, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 13, 14, 14,
+    14, 14, 14, 14, 14,  0, 14, 14, 14,  0, 14, 14, 14, 14, 13,  0,
+     0,  0,  0,  0, 13, 13, 13, 14,  0,  0,  0,  0,  0,  0,  0, 13,
+    13, 13, 14, 14,  0,  0,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 13, 13, 13, 13, 13, 13,
+     0, 14, 14, 14,  0, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13,  0,  0,  0, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13,  0, 13, 13, 13, 13, 13, 13, 13, 13, 13,  0, 13,  0,  0,
+    13, 13, 13, 13, 13, 13, 13,  0,  0,  0, 14,  0,  0,  0,  0, 14,
+    14, 14, 14, 14, 14,  0, 14,  0, 14, 14, 14, 14, 14, 14, 14, 14,
+     0,  0,  0,  0,  0,  0,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     0,  0, 14, 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 14, 13, 13, 14, 14, 14, 14, 14, 14, 14,  0,  0,  0,  0,  0,
+    13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14,  0,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  0,  0,  0,  0,  0,  0,
+     0, 13, 13,  0, 13,  0, 13, 13, 13, 13, 13,  0, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13,  0, 13,  0, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 14, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 13,  0,  0,
+    13, 13, 13, 13, 13,  0, 13,  0, 14, 14, 14, 14, 14, 14,  0,  0,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  0,  0, 13, 13, 13, 13,
+    13,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0, 14, 14,  0,  0,  0,  0,  0,  0,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0, 14,  0, 14,  0, 14,  5,  5,  5,  5, 14, 14,
+    13, 13, 13, 13, 13, 13, 13, 13,  0, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,  0,  0,  0,
+     0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14,  0, 14, 14, 13, 13, 13, 13, 13, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14,  0, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,  0,  0,  0,
+     0,  0,  0,  0,  0,  0, 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 13,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  4,  4,  0,  0,  0,  0,
+    13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 13, 13, 13, 13, 14, 14,
+    14, 13, 14, 14, 14, 13, 13, 14, 14, 14, 14, 14, 14, 14, 13, 13,
+    13, 14, 14, 14, 14, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 13, 14,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8, 14, 14, 14, 14,  0,  0,
+     9,  9,  9,  9,  9,  9,  0,  9,  0,  0,  0,  0,  0,  9,  0,  0,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,  0, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13,  0, 13, 13, 13, 13,  0,  0,
+    13, 13, 13, 13, 13, 13, 13,  0, 13,  0, 13, 13, 13, 13,  0,  0,
+    13, 13, 13, 13, 13, 13, 13, 13, 13,  0, 13, 13, 13, 13,  0,  0,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13,  0, 13, 13, 13, 13,  0,  0, 13, 13, 13, 13, 13, 13, 13,  0,
+    13,  0, 13, 13, 13, 13,  0,  0, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13,  0, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13,  0, 13, 13, 13, 13,  0,  0, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,  0,  0, 14, 14, 14,
+     0,  0,  4,  0,  0,  0,  0,  4,  4,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  0,  0, 10, 10, 10, 10, 10, 10,  0,  0,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,  0,  4, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+     1, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,  5,  5,  0,  0,  0,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,  0,  0,  0, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13,  0,  0,  0,  0,  0,  0,  0,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,  0, 13, 13,
+    13, 13, 14, 14, 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 14, 14, 14,  4,  4,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 14, 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,  0, 13, 13,
+    13,  0, 14, 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14,  0,  0,  0, 13,  0,  0,  0,  0, 13, 14,  0,  0,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  6,  4,  0,  0,  0,  0,  6,  4,  0, 14, 14, 14, 12,  0,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  0,  0,  0,  0,  0,  0,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13,  0,  0,  0,  0,  0,  0,  0,
+    13, 13, 13, 13, 13, 14, 14, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 13,  0,  0,  0,  0,  0,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,  0,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,  0,  0,  0,  0,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,  0,  0,  0,  0,
+     0,  0,  0,  0,  4,  4,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,  0,  0,
+    13, 13, 13, 13, 13,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,  0,  0,  0,  0,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13,  0,  0,  0,  0,  0,  0,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  0,  0,  0,  0,  0,  0,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14,  0,  0,  0,  0,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,  0,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,  0,  0, 14,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  0,  0,  0,  0,  0,  0,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0, 13,  4,  4,  4,  4,  0,  0,  0,  0,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    14, 14, 14, 14, 14, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    14, 14, 14, 14, 14, 13, 13, 13, 13, 13, 13, 13,  0,  0,  0,  0,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  4,  4,  0,  0,  4,  4,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 14, 14, 14, 14, 14,
+    14, 14, 14, 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    14, 14, 14, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 13, 13,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14,  0,  0,  0,  4,  4,  0,  0,  0,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  0,  0,  0, 13, 13, 13,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,  4,  4,
+    10, 10, 10, 10, 10, 10, 10, 10, 10,  0,  0,  0,  0,  0,  0,  0,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,  0,  0, 13, 13, 13,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    14, 14, 14,  0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 13, 13, 13, 13, 14, 13, 13,
+    13, 13, 13, 13, 14, 13, 13, 14, 14, 14, 13,  0,  0,  0,  0,  0,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14,  0, 14, 14, 14, 14, 14,
+     9, 10,  9, 10,  9, 10,  9, 10,  9, 10,  9, 10,  9, 10,  9, 10,
+     9, 10,  9, 10,  9, 10, 10, 10, 10, 10, 10, 10, 10, 10,  9, 10,
+    10, 10, 10, 10, 10, 10, 10, 10,  9,  9,  9,  9,  9,  9,  9,  9,
+    10, 10, 10, 10, 10, 10,  0,  0,  9,  9,  9,  9,  9,  9,  0,  0,
+    10, 10, 10, 10, 10, 10, 10, 10,  9,  9,  9,  9,  9,  9,  9,  9,
+    10, 10, 10, 10, 10, 10, 10, 10,  9,  9,  9,  9,  9,  9,  9,  9,
+    10, 10, 10, 10, 10, 10,  0,  0,  9,  9,  9,  9,  9,  9,  0,  0,
+    10, 10, 10, 10, 10, 10, 10, 10,  0,  9,  0,  9,  0,  9,  0,  9,
+    10, 10, 10, 10, 10, 10, 10, 10,  9,  9,  9,  9,  9,  9,  9,  9,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,  0,  0,
+    10, 10, 10, 10, 10, 10, 10, 10,  9,  9,  9,  9,  9,  9,  9,  9,
+    10, 10, 10, 10, 10,  0, 10, 10,  9,  9,  9,  9,  9,  0, 10,  0,
+     0,  0, 10, 10, 10,  0, 10, 10,  9,  9,  9,  9,  9,  0,  0,  0,
+    10, 10, 10, 10,  0,  0, 10, 10,  9,  9,  9,  9,  0,  0,  0,  0,
+    10, 10, 10, 10, 10, 10, 10, 10,  9,  9,  9,  9,  9,  0,  0,  0,
+     0,  0, 10, 10, 10,  0, 10, 10,  9,  9,  9,  9,  9,  0,  0,  0,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1, 12, 14, 14, 12, 12,
+     0,  0,  0,  6,  6,  0,  0,  0,  5,  5,  5,  5,  5,  5,  5,  5,
+     0,  0,  0,  0,  7,  0,  0,  0, 11, 11, 12, 12, 12, 12, 12,  1,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  5,  5,  0,  4,  4,  0,  0,
+     0,  0,  0,  0,  0,  5,  5,  4,  4,  4,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,
+    12, 12, 12, 12, 12,  0, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+     0, 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  5,  5, 10,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  5,  5,  0,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  9,  0,  0,  0,  0,  9,  0,  0, 10,  9,  9,  9, 10, 10,
+     9,  9,  9, 10,  0,  9,  0,  0,  0,  9,  9,  9,  9,  9,  0,  0,
+     0,  0,  0,  0,  9,  0,  9,  0,  9,  0,  9,  9,  9,  9,  0, 10,
+     9,  9,  9,  9, 10, 13, 13, 13, 13, 10,  0,  0, 10, 10,  9,  9,
+     0,  0,  0,  0,  0,  9, 10, 10, 10, 10,  0,  0,  0,  0, 10,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    13, 13, 13,  9, 10, 13, 13, 13, 13,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  5,  5,  5,  5,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  5,  5,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  5,  5,  5,  5,  5,
+     5,  0,  0,  0,  0,  0,  0,  0,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  5,  5,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  5,  5,  5,  5,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  5,  5,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,  0,
+     9, 10,  9,  9,  9, 10, 10,  9, 10,  9, 10,  9, 10,  9,  9,  9,
+     9, 10,  9, 10, 10,  9, 10, 10, 10, 10, 10, 10, 10, 10,  9,  9,
+     9, 10,  9, 10, 10,  0,  0,  0,  0,  0,  0,  9, 10,  9, 10, 14,
+    14, 14,  9, 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    10, 10, 10, 10, 10, 10,  0, 10,  0,  0,  0,  0,  0, 10,  0,  0,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13,  0,  0,  0,  0,  0,  0,  0, 13,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 14,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    13, 13, 13, 13, 13, 13, 13,  0, 13, 13, 13, 13, 13, 13, 13,  0,
+    13, 13, 13, 13, 13, 13, 13,  0, 13, 13, 13, 13, 13, 13, 13,  0,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  5,  5,  0,  0,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  0,  0,  0,  0,  4, 13,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  4,  0,  0,  0,
+     0,  0,  5,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     1,  6,  4,  0,  0, 13, 13, 13,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  0,  0,  5,  5,  5,  5,  5,  5,  5,  5,  0,  5,  5,  5,
+     0, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14,
+     0, 13, 13, 13, 13, 13,  0,  0, 13, 13, 13, 13, 13,  0,  0,  0,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13,  0,  0, 14, 14,  0,  0, 13, 13, 13,
+     0,  0,  0,  0,  0, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+     0, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,  0,  0,  0,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,  0,  4,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,  0,  4,  4,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8, 13, 13,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     9, 10,  9, 10,  9, 10,  9, 10,  9, 10,  9, 10,  9, 10, 13, 14,
+    14, 14, 14,  0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,  0, 13,
+     9, 10,  9, 10,  9, 10,  9, 10,  9, 10,  9, 10,  9, 10,  9, 10,
+     9, 10,  9, 10,  9, 10,  9, 10,  9, 10,  9, 10, 10, 10, 14, 14,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    14, 14,  0,  4,  0,  0,  0,  4,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+     0,  0,  9, 10,  9, 10,  9, 10,  9, 10,  9, 10,  9, 10,  9, 10,
+    10, 10,  9, 10,  9, 10,  9, 10,  9, 10,  9, 10,  9, 10,  9, 10,
+     9, 10,  9, 10,  9, 10,  9, 10,  9, 10,  9, 10,  9, 10,  9, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10,  9, 10,  9, 10,  9,  9, 10,
+     9, 10,  9, 10,  9, 10,  9, 10, 13,  0,  0,  9, 10,  9, 10, 13,
+     9, 10,  9, 10, 10, 10,  9, 10,  9, 10,  9, 10,  9, 10,  9, 10,
+     9, 10,  9, 10,  9, 10,  9, 10,  9, 10,  9,  9,  9,  9,  9, 10,
+     9,  9,  9,  9,  9, 10,  9, 10,  9, 10,  9, 10,  9, 10,  9, 10,
+     0,  0,  9, 10,  9,  9,  9,  9, 10,  9, 10,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  9, 10, 13, 10, 10, 10, 13, 13, 13, 13, 13,
+    13, 13, 14, 13, 13, 13, 14, 13, 13, 13, 13, 14, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 14, 14, 14, 14, 14,  0,  0,  0,  0, 14,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13,  0,  0,  4,  4,  0,  0,  0,  0,  0,  0,  0,  0,
+    14, 14, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    14, 14, 14, 14, 14, 14,  0,  0,  0,  0,  0,  0,  0,  0,  4,  4,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  0,  0,  0,  0,  0,  0,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 13, 13, 13, 13, 13, 13,  0,  0,  0, 13,  0, 13, 13, 14,
+    13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14,  0,  4,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14,  0,  0,  0,  0,  0,  0,  0,  4,  4,  0,  0,  0,  0,  0, 13,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  0,  0,  0,  0,  0,  0,
+    13, 13, 13, 13, 13, 14, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8, 13, 13, 13, 13, 13,  0,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    13, 13, 13, 14, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14,  0,  0,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  0,  0,  0,  4,  4,  4,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13,  0,  0,  0, 13, 14, 14, 14, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    14, 13, 14, 14, 14, 13, 13, 14, 14, 13, 13, 13, 13, 13, 14, 14,
+    13, 14, 13,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 13, 13, 13,  0,  0,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14,
+     4,  4, 13, 13, 13, 14, 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0, 13, 13, 13, 13, 13, 13,  0,  0, 13, 13, 13, 13, 13, 13,  0,
+     0, 13, 13, 13, 13, 13, 13,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    13, 13, 13, 13, 13, 13, 13,  0, 13, 13, 13, 13, 13, 13, 13,  0,
     10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
     10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,  0, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 13,  0,  0,  0,  0,  0,  0,
     10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14,  4, 14, 14,  0,  0,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  0,  0,  0,  0,  0,  0,
+    13, 13, 13, 13,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13,  0,  0,  0,  0, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,  0,  0,  0,  0,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,  0,  0,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13,  0,  0,  0,  0,  0,  0,
+    10, 10, 10, 10, 10, 10, 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0, 10, 10, 10, 10, 10,  0,  0,  0,  0,  0, 13, 14, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13,  0, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13,  0, 13, 13, 13, 13, 13,  0, 13,  0,
+    13, 13,  0, 13, 13,  0, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,  5,  5,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+     0,  0, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,  0,  0,  0,  0,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+     6,  6,  0,  6,  0,  0,  0,  5,  5,  0,  0,  0,  0,  0,  0,  0,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+     0,  6,  6,  0,  0,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  0,  0,  5,  5,  0,  0,  0,  0,  0,  0,  0,
+     6,  6,  7,  0,  0,  6,  4,  4,  6,  5,  5,  5,  5,  5,  5,  0,
+     0,  0,  0,  6,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    13, 13, 13, 13, 13,  0, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,  0,  0, 12,
+     0,  4,  0,  0,  0,  0,  0,  0,  5,  5,  0,  0,  6,  6,  7,  0,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  6,  0,  0,  0,  0,  4,
+     0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,  5,  0,  5,  0,  5,
+     5,  4,  5,  5,  6,  0, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14,
+     0,  0, 13, 13, 13, 13, 13, 13,  0,  0, 13, 13, 13, 13, 13, 13,
+     0,  0, 13, 13, 13, 13, 13, 13,  0,  0, 13, 13, 13,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0, 12, 12, 12,  0,  0,  0,  0,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,  0, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13,  0, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,  0, 13, 13,  0, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,  0,  0,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,  0,  0,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,  0,  0,  0,  0,  0,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 14,  0,  0,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,  0,  0,  0,  0,  0,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14,  0,  0,  0,  0,  0,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,  0,  0,
+    13, 13, 13, 13,  0,  0,  0,  0, 13, 13, 13, 13, 13, 13, 13, 13,
+     0, 13, 13, 13, 13, 13,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9, 10, 10, 10, 10, 10, 10, 10, 10,
     10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
     10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  0,  0,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  0,  0,  0,  0, 10, 10, 10, 10, 10, 10, 10, 10,
     10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,  0,  0,  0,  0,
+    13, 13, 13, 13, 13, 13, 13, 13,  0,  0,  0,  0,  0,  0,  0,  0,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    13, 13, 13, 13, 13, 13,  0,  0, 13,  0, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13,  0, 13, 13,  0,  0,  0, 13,  0,  0, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13,  0, 13, 13,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13,  0,  0,  0,  0,  0,  0, 13, 13,
+    13, 14, 14, 14,  0, 14, 14,  0,  0,  0,  0,  0, 14, 14, 14, 14,
+    13, 13, 13, 13,  0, 13, 13, 13,  0, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13,  0,  0, 14, 14, 14,  0,  0,  0,  0, 14,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  4,  4,  0,  0,  0,  0,  0,  0,  0,  0,
+    13, 13, 13, 13, 13, 14, 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    13, 13, 13, 13, 13, 13, 13, 13, 13,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
     10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    13, 13, 13, 13, 14, 14, 14, 14,  0,  0,  0,  0,  0,  0,  0,  0,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  0,  0,  0,  0,  0,  0,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13,  0, 14, 14,  0,  0,  0,
+    13, 13,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0, 13,  0,  0,  0,  0,  0,  0,  0,  0,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14,  0,  0,  0,  0,  4,  4,  4,  4,  4,  0,  0,  0,  0,  0,  0,
+    13, 13, 13, 13, 13,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14,  4,  4,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 14,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,  0,  0, 12,  4,  4,
+     4,  4,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 12,  0,  0,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13,  0,  0,  0,  0,  0,  0,  0,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  0,  0,  0,  0,  0,  0,
+    13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14,  0,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     0,  4,  4,  4, 13, 14, 14, 13,  0,  0,  0,  0,  0,  0,  0,  0,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 14,  0,  0, 13,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    14, 13, 13, 13, 13,  4,  4,  0,  0, 14, 14, 14, 14,  4, 14, 14,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8, 13,  0, 13,  0,  4,  4,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13,  0, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14,  4,  4,  0,  4,  4,  0, 14,  0,
+    13, 13, 13, 13, 13, 13, 13,  0, 13,  0, 13, 13, 13, 13,  0, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,  0, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13,  4,  0,  0,  0,  0,  0,  0,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,  0,  0,  0,  0,  0,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  0,  0,  0,  0,  0,  0,
+    14, 14, 14, 14,  0, 13, 13, 13, 13, 13, 13, 13, 13,  0,  0, 13,
+    13,  0,  0, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13,  0, 13, 13, 13, 13, 13, 13,
+    13,  0, 13, 13,  0, 13, 13, 13, 13, 13,  0, 14, 14, 13, 14, 14,
+    14, 14, 14, 14, 14,  0,  0, 14, 14,  0,  0, 14, 14, 14,  0,  0,
+    13,  0,  0,  0,  0,  0,  0, 14,  0,  0,  0,  0,  0, 13, 13, 13,
+    13, 13, 14, 14,  0,  0, 14, 14, 14, 14, 14, 14, 14,  0,  0,  0,
+    14, 14, 14, 14, 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 13, 13, 13, 13,  4,  4,  0,  0,  0,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  0,  0,  0,  0, 14, 13,
+    13, 13,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    14, 14, 14, 14, 13, 13,  0, 13,  0,  0,  0,  0,  0,  0,  0,  0,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  0,  0,  0,  0,  0,  0,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14,
+    14, 14, 14, 14, 14, 14,  0,  0, 14, 14, 14, 14, 14, 14, 14, 14,
+    14,  0,  4,  4,  0,  0,  0,  0,  0,  4,  4,  4,  4,  4,  4,  4,
+     4,  4,  4,  4,  4,  4,  4,  4, 13, 13, 13, 13, 14, 14,  0,  0,
+    14,  4,  4,  0, 13,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  0,  0,  0,  0,  0,  0,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 13,  0,  0,  0,  0,  0,  0,  0,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,  0,  0,  0,  0,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  0,  0,  4,  4,  4,  0,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,  0,  0,  0,  0,  0,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 13,
+    13, 13, 13, 13, 13, 13, 13,  0,  0, 13,  0,  0, 13, 13, 13, 13,
+    13, 13, 13, 13,  0, 13, 13,  0, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    14, 14, 14, 14, 14, 14,  0, 14, 14,  0,  0, 14, 14, 14, 14, 13,
+    14, 13, 14, 14,  4,  0,  4,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  0,  0,  0,  0,  0,  0,
+    13, 13, 13, 13, 13, 13, 13, 13,  0,  0, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 14, 14, 14, 14, 14, 14, 14,  0,  0, 14, 14, 14, 14, 14, 14,
+    14, 13,  0, 13, 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 13, 14, 14, 14, 14,  0,
+     0,  0,  4,  4,  0,  0,  0, 14,  0,  0,  0,  0,  0,  0,  0,  0,
+    13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14,  0,  4,  4, 13,  0,  0,
+    13, 13, 13, 13, 13, 13, 13, 13, 13,  0, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14,
+    14, 14, 14, 14, 14, 14, 14,  0, 14, 14, 14, 14, 14, 14, 14, 14,
+    13,  4,  4,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+     0,  0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14,  0, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    13, 13, 13, 13, 13, 13, 13,  0, 13, 13,  0, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 14, 14, 14, 14, 14, 14,  0,  0,  0, 14,  0, 14, 14,  0, 14,
+    14, 14, 14, 14, 14, 14, 13, 14,  0,  0,  0,  0,  0,  0,  0,  0,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  0,  0,  0,  0,  0,  0,
+    13, 13, 13, 13, 13, 13,  0, 13, 13,  0, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14,  0,
+    14, 14,  0, 14, 14, 14, 14, 14, 13,  0,  0,  0,  0,  0,  0,  0,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 14, 14, 14, 14,  4,  4,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    13,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,  0,
+    12, 12, 12, 12, 12, 12, 12, 12, 12,  0,  0,  0,  0,  0,  0,  0,
+    13, 13, 13, 13, 13, 13, 13,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  0,  0,  0,  0,  4,  4,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,  0,  0,
+    14, 14, 14, 14, 14,  4,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    14, 14, 14, 14, 14, 14, 14,  4,  4,  0,  0,  0,  0,  0,  0,  0,
+    13, 13, 13, 13,  4,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  0,  0,  0,  0,  0,  0,
+     0,  0,  0, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13,  0,  0,  0,  0,  0, 13, 13, 13,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  4,  0,  0,  0,  0,  0,  0,  0,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,  0,  0,  0,  0, 14,
+    13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14,  0,  0,  0,  0,  0,  0,  0, 14,
+    14, 14, 14, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13,  0, 13, 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    14, 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    13, 13, 13,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0, 13, 13, 13, 13,  0,  0,  0,  0,  0,  0,  0,  0,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,  0,  0,  0,  0,  0,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,  0,  0,  0,
+    13, 13, 13, 13, 13, 13, 13, 13, 13,  0,  0,  0,  0,  0,  0,  0,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13,  0,  0,  0, 14, 14,  4,
+    12, 12, 12, 12,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0, 14, 14, 14, 14, 14,  0,  0,  0, 14, 14, 14,
+    14, 14, 14, 12, 12, 12, 12, 12, 12, 12, 12, 14, 14, 14, 14, 14,
+    14, 14, 14,  0,  0, 14, 14, 14, 14, 14, 14, 14,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 14, 14, 14, 14,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0, 14, 14, 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9, 10, 10, 10, 10, 10, 10,
     10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9, 10, 10,
+    10, 10, 10, 10, 10,  0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,  9,  0,  9,  9,
+     0,  0,  9,  0,  0,  9,  9,  0,  0,  9,  9,  9,  9,  0,  9,  9,
+     9,  9,  9,  9,  9,  9, 10, 10, 10, 10,  0, 10,  0, 10, 10, 10,
+    10, 10, 10, 10,  0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9, 10, 10, 10, 10, 10, 10,
     10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10,  9,  9,  0,  9,  9,  9,  9,  0,  0,  9,  9,  9,
+     9,  9,  9,  9,  9,  0,  9,  9,  9,  9,  9,  9,  9,  0, 10, 10,
     10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
-    16, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
-     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8, 17,
-     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8, 17,
-};
-
-static RE_UINT8 re_east_asian_width_stage_2[] = {
-     0,  1,  2,  3,  4,  5,  6,  7,  8,  9,  9,  9,  9,  9,  9,  9,
+    10, 10, 10, 10, 10, 10, 10, 10,  9,  9,  0,  9,  9,  9,  9,  0,
+     9,  9,  9,  9,  9,  0,  9,  0,  0,  0,  9,  9,  9,  9,  9,  9,
+     9,  0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,  9,  9,  9,  9,
      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
-     9,  9, 10,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+     9,  9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,  9,  9,  9,  9,
      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
-    11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26,
-     9,  9,  9, 27,  9,  9, 28,  9,  9,  9,  9,  9,  9, 29, 30, 31,
-    32, 33, 34, 35, 36, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30,
-    30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30,
-    30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30,
-    30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 37, 30, 30, 30, 30,
-    30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30,
-    30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30,
-    30, 30, 30, 30, 30, 30, 30, 30, 30, 38,  9,  9,  9,  9,  9,  9,
-     9,  9, 39,  9,  9,  9,  9,  9, 30, 30, 30, 30, 30, 30, 30, 30,
-    30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 40,
+     9,  9,  9,  9,  9,  9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
-    41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41,
-    41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41,
-    41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41,
-    41, 41, 30, 30, 30, 30,  9,  9,  9,  9,  9,  9, 42,  9, 43, 44,
+    10, 10, 10, 10, 10, 10,  0,  0,  9,  9,  9,  9,  9,  9,  9,  9,
      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,  0, 10, 10, 10, 10,
+    10, 10,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10,  0, 10, 10, 10, 10, 10, 10,  9,  9,  9,  9,
      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,  0,
+    10, 10, 10, 10, 10, 10,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+    10, 10, 10, 10, 10, 10, 10, 10, 10,  0, 10, 10, 10, 10, 10, 10,
      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
-     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9, 45,
-    30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 46,
-    30, 30, 30, 30, 30, 47,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
-    30, 30, 48, 30, 30, 49,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  0, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10,  0, 10, 10, 10, 10, 10, 10,  9, 10,  0,  0,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14,  0,  0,  0,  0, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,  0,  0,  0,
+     0,  0,  0,  0,  0, 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0, 14,  0,  0,  0,  4,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 14, 14, 14, 14, 14,
+     0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    14, 14, 14, 14, 14, 14, 14,  0, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14,  0,  0, 14, 14, 14, 14, 14,
+    14, 14,  0, 14, 14,  0, 14, 14, 14, 14, 14,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,  0,  0,  0,
+    14, 14, 14, 14, 14, 14, 14, 13, 13, 13, 13, 13, 13, 13,  0,  0,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  0,  0,  0,  0, 13,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  0,  0,  0,  0,  0,  0,
+    13, 13, 13, 13, 13,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    14, 14, 14, 14, 14, 14, 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     9,  9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 14, 14, 14, 14, 14, 14, 14, 13,  0,  0,  0,  0,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  0,  0,  0,  0,  0,  0,
+    13, 13, 13, 13,  0, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+     0, 13, 13,  0, 13,  0,  0, 13,  0, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13,  0, 13, 13, 13, 13,  0, 13,  0, 13,  0,  0,  0,  0,
+     0,  0, 13,  0,  0,  0,  0, 13,  0, 13,  0, 13,  0, 13, 13, 13,
+     0, 13, 13,  0, 13,  0,  0, 13,  0, 13,  0, 13,  0, 13,  0, 13,
+     0, 13, 13,  0, 13,  0,  0, 13, 13, 13, 13,  0, 13, 13, 13, 13,
+    13, 13, 13,  0, 13, 13, 13, 13,  0, 13, 13, 13, 13,  0, 13,  0,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13,  0, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,  0,  0,  0,  0,
+     0, 13, 13, 13,  0, 13, 13, 13, 13, 13,  0, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
-    50, 51, 52, 53, 54,  9, 55, 56, 57, 58, 59, 60, 61, 62,  9, 63,
-     9,  9, 64, 65, 66, 67,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
-    30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30,
-    30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 68,
-     9,  9, 41,  6,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,  0,  0,
      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
-    41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41,
-    41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 69,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  5,  5,  5,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  0,  0,  0,  0,  0,  0,
+    13, 13,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0, 12,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0
+};
+
+RE_UINT32 re_get_sentence_break(RE_UINT32 codepoint) {
+    RE_UINT32 field_2;
+    RE_UINT32 field_1;
+    RE_UINT32 field_0;
+    RE_UINT32 v;
+
+    field_2 = codepoint >> 10;
+    field_1 = (codepoint >> 5) & 0x1F;
+    field_0 = codepoint & 0x1F;
+
+    v = re_sentence_break_table_1[field_2];
+    v = re_sentence_break_table_2[(v << 5) | field_1];
+    v = re_sentence_break_table_3[(v << 5) | field_0];
+
+    return v;
+}
+
+/* Sentence_Terminal. */
+static RE_UINT8 re_sentence_terminal_table_1[] = {
+     0,  1,  2,  3,  4,  5,  6,  7,  8,  3,  3,  9, 10,  3,  3,  3,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+     3,  3,  3,  3,  3,  3,  3,  3,  3, 11, 12,  3,  3,  3,  3,  3,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3, 13,
+     3,  3, 14, 15, 16, 17, 18, 19,  3,  3,  3,  3,  3,  3,  3,  3,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  3, 20, 21,  3,  3,  3,  3,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3, 22,
+     3,  3,  3,  3,  3,  3, 23,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3
 };
 
-static RE_UINT8 re_east_asian_width_stage_3[] = {
-      0,   0,   0,   0,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   2,
-      0,   0,   0,   0,   3,   4,   5,   6,   7,   0,   8,   9,  10,  11,  12,  13,
-     14,   0,  15,  16,  17,  16,  18,   8,  19,  20,  21,   0,  17,  16,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   7,  22,  23,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  14,   0,  14,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,  24,  25,  26,  27,   0,   0,   0,   0,
-     28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,   0,   0,
-      0,   0,  29,  28,  30,  31,  29,  28,  30,  31,   0,   0,   0,   0,   0,   0,
-     14,   0,  28,  28,  28,  28,  28,  28,  28,  28,  14,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,   0,   0,   0,   0,
-      0,   0,  33,  34,   6,   0,  35,  36,   0,   0,   0,   0,   0,   0,  37,  38,
-     39,   0,   0,   0,   0,  40,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     41,  14,  36,   0,  42,  16,   0,   0,   0,   0,  43,  44,  28,  45,  28,  31,
-      0,  14,  28,  31,   0,   0,   0,  31,   0,   0,  46,   0,  38,   0,   0,   0,
-     12,  47,  48,  49,  50,  51,  52,  53,   0,  54,  55,   0,  56,  57,   0,   0,
-     57,   0,  58,  14,  58,   0,   0,  38,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,  55,  59,   0,  60,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  61,  62,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  28,  28,  28,  28,
-     28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  30,  28,  28,
-     28,  28,  28,  28,  28,  28,  28,  28,  28,  45,  28,  28,  28,  28,  45,   0,
-     28,  28,  63,   0,  30,  31,  57,  53,  64,  65,  31,   0,  63,  38,   0,  66,
-     67,  68,  69,  70,   0,   0,   0,   0,  71,  32,  72,   0,  73,  74,   0,  75,
-      0,   0,  76,  17,  77,  59,   0,  78,  79,  80,  81,  28,  82,  83,  84,  85,
-     86,  59,   0,   0,   0,  87,   0,  58,   0,  88,  89,   0,   0,   0,  17,  28,
-      0,   0,  90,   0,   0,   0,  87,  75,   0,   0,   0,   0,  91,  92,   0,   0,
-     93,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,  94,   0,   0,   0,   0,   0,   0,  95,  31,   0,   0,   0,   0,
-     32,  32,  32,  96,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  72,   0,
-     32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,
-     32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  97,   0,   0,   0,  32,  72,
-     98,  32,  32,  32,  32,  32,  32,  99, 100,  32,  32,  32,  32,  32,  32,  32,
-     32,  32,  99, 100,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,
-     90,  32,  32,  32,  32,  32, 100,  32,  32,  32,  32,  32,  32,  32,  32,  32,
-     32,  99,  32,  32,  32,  32,  32, 101,  32,  32,  32,  32,  72,   0,  32,  32,
-     32,  32,  32,  99,  32,  32,  32,  32,  32,  28,  32,  32,  32,  32,  32,  32,
-     32,  32,  32,  32,  32,  32,  32,  32,   0,   0,   0,   0,   0,   0,   0,   0,
-     32, 102,  32,  32,  32,  32,  32,  32,  99,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  32,  32,  32, 102,
-     32,  32,  32,  32,  72,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,
-     28,  28,  32, 103,   0,   0,  32,  32,  32,  32, 104,  32,  99,  72,   0,   0,
-    105, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 107, 108, 108, 108,
-    108, 108, 108, 108, 108, 108, 108, 109, 110, 110, 110, 111, 112, 109,   0,  58,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  72,   0,   0,   0,
-     32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,   0,
-     32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32, 101,   0,
-     32,  32,  32,  99,   0,   0,   0,   0,   0,   0, 101,   0, 113,   0,  32,  32,
-     32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  72,
-    114,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,  75,   0,   0,   0,   0,   0,   0,
-     28, 115,  28,  28,  28, 116,  28,  28,  28,  28,  28,  28,  28,  31,  28,  28,
-     28,  80, 117, 118,  28, 119,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-    101,   0,  32,  32,  32,  32,  32,  72,  32,  87, 103,   0,  97,   0,   0,   0,
-     32,  32,  32,  32,  87,  90, 120,  32,  32,  32,  32,  32,  32,  32,  32, 121,
-     32,  32,  72,   0,  32,  32,  32,  32,  32, 122,  72,   0,  32,  32, 123,  32,
-     32,  32,  32,  32,  32,  32,  32,  99, 124,  32,  32,  32,  32,  32,  32,  32,
-     32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32, 125,
-     32,  32,  32,  32,  32,  32,  32,  97,   0, 126,  32,  32,  32,   0,   0, 127,
-      0,   0,  66,   0, 114,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 128,
-     32,  32,  32,  32,  32,  32,  32,  32,  32,  32,   0,   0,   0,   0,   0,   0,
-     32,  32,  32,  32,  32,  32,  32,  32,  97, 114, 129,   0,   0,  94, 113, 101,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  32,  72,   0,   0,
-      0,  90,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32, 130, 131,
-     32,  32,  32,  32, 132, 133,  32,  32,  32, 132,  32,  32,  32,  32,  32,  32,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  72, 101,
-    101,   0,  97,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  97,
-     28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28, 116,
+static RE_UINT8 re_sentence_terminal_table_2[] = {
+     0,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  2,  0,  0,  0,
+     3,  0,  0,  0,  0,  0,  4,  0,  5,  0,  0,  0,  0,  0,  0,  6,
+     0,  7,  0,  0,  0,  0,  0,  0,  0,  0,  0,  8,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 10,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0, 11,  0,  0,  0,  0,  0, 12,  0,  0,  0,  0,  0,  0,
+    13,  0,  0,  0,  0,  0,  0,  0,  0,  0,  8,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0, 14,  0,  0,  0,  0, 15,  0,  0,  0,  0,  0,
+     0, 16,  0,  3,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0, 17, 18,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0, 19,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    20,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0, 21,  0,  0,  0,  0,  0,  0,  0,  0,
+    22,  0,  0,  0,  0,  0,  0, 23,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0, 24,  0,  0, 22,  0,  0, 25,  0,  0,  0,  0, 26,  0,
+     0,  0, 27,  0,  0,  0,  0, 28,  0,  0,  0,  0,  0,  0,  0, 29,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0, 30,  0,  0,  0,  0,  0,  1,  0,  0, 31,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0, 24,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 32,  0,  0,  0,  0,  0,
+     0,  0, 33,  0,  0,  3, 34,  0,  0,  0, 35,  0,  0,  0, 36,  0,
+     0, 37,  0,  0,  0,  2,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0, 38,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 39,  0,
+     0,  0, 40,  0,  0,  0,  0,  0,  0, 41,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 42,  0,  0,  0,  0,  0,
+     0,  0, 43,  0, 16,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0, 40,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0, 44,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0, 22,  0,  0,  0, 45,  0, 44, 46,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0, 47,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0, 21,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0, 48,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0
 };
 
-static RE_UINT8 re_east_asian_width_stage_4[] = {
-    0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5,
-    5, 5, 5, 5, 5, 5, 5, 0, 0, 1, 5, 5, 1, 5, 5, 1,
-    1, 0, 1, 0, 5, 1, 1, 5, 1, 1, 1, 1, 1, 0, 1, 1,
-    1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0,
-    1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1,
-    1, 1, 0, 0, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 0, 0,
-    1, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 1, 0, 1, 0,
-    0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0,
-    0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1,
-    0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 1, 0, 0, 0,
-    1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0,
-    1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0,
-    0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1, 0, 0,
-    1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 0, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0,
-    3, 3, 3, 3, 3, 3, 3, 3, 1, 0, 0, 1, 1, 1, 1, 0,
-    1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0,
-    0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0,
-    0, 2, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0,
-    0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0,
-    0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0,
-    0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1,
-    0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1,
-    1, 0, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0,
-    0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0,
-    1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0,
-    1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1,
-    0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 3, 3, 0, 0, 0, 0,
-    0, 3, 3, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 0, 0, 0,
-    3, 0, 0, 3, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0,
-    1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 1, 1,
-    0, 0, 0, 0, 0, 3, 3, 0, 0, 0, 0, 0, 0, 1, 1, 0,
-    0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 3, 3, 0, 0,
-    0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0,
-    3, 3, 3, 3, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 0, 1,
-    1, 1, 1, 0, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 3,
-    0, 0, 0, 3, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 3, 3, 1, 0, 0, 0, 0, 3, 3, 1, 1,
-    1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 3, 1, 1, 1,
-    1, 1, 0, 1, 0, 0, 0, 0, 1, 1, 3, 1, 1, 1, 1, 1,
-    1, 1, 3, 3, 1, 3, 1, 1, 1, 1, 3, 1, 1, 3, 1, 1,
-    0, 0, 0, 0, 0, 3, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 3, 0, 3, 0, 0, 0, 0, 3, 3, 3, 0, 3,
-    0, 0, 0, 0, 0, 3, 3, 3, 0, 0, 0, 0, 0, 0, 5, 5,
-    5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 5, 5, 0,
-    0, 0, 0, 3, 3, 0, 0, 0, 3, 0, 0, 0, 0, 3, 1, 1,
-    3, 3, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0,
-    4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0,
-    0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0,
-    3, 3, 3, 3, 3, 0, 0, 0, 3, 3, 0, 0, 0, 0, 0, 0,
-    3, 3, 3, 0, 3, 3, 3, 3, 0, 4, 4, 4, 4, 4, 4, 4,
-    4, 4, 4, 4, 4, 4, 4, 4, 4, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0,
-    0, 0, 2, 2, 2, 2, 2, 2, 0, 0, 2, 2, 2, 0, 0, 0,
-    4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 3, 3, 3, 3,
-    0, 0, 0, 0, 3, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0,
-    1, 1, 1, 1, 1, 1, 0, 0, 1, 3, 3, 3, 3, 3, 3, 3,
-    3, 3, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0,
-    3, 3, 3, 3, 3, 3, 0, 3, 3, 3, 3, 3, 3, 0, 3, 3,
-    3, 3, 3, 0, 0, 0, 0, 3, 3, 0, 0, 0, 3, 0, 0, 0,
-    3, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 3,
-    0, 0, 0, 3, 3, 3, 3, 0, 0, 0, 3, 0, 0, 0, 0, 0,
-    0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 3, 0, 0,
-    3, 3, 0, 3, 3, 3, 3, 0, 0, 0, 3, 3, 3, 3, 3, 3,
-    3, 3, 3, 0, 0, 3, 3, 3, 3, 3, 3, 0, 0, 0, 3, 3,
+static RE_UINT8 re_sentence_terminal_table_3[] = {
+      0,   0,   0,   0,   2,  64,   0, 128,   0,   2,   0,   0,   0,   0,   0, 192,
+      0,   0,  16,   0,   7,   0,   0,   0,   0,   0,   0,   2,   0,   0, 128,  98,
+     48,   0,   0,   0,   0,  12,   0,   0, 132,   1,   0,   0,   0,  64,   0,   0,
+      0,   0,  96,   0,   8,   2,   0,   0,   0,  15,   0,   0,   0,   0,   0, 204,
+      0,   0,   0,  24,   0,   0,   0,  48, 128,   3,   0,   0,   0,  64,   0,  16,
+      4,   0,   0,   0,   0,   0,   0, 128,   0, 192,   0,   0,   0,   0, 136,   0,
+      0,   0, 192,   0,   0, 128,   0,   0,   0,   3,   0,   0,   0,   0,   0, 224,
+      0,   0,   3,   0,   0,   8,   0,   0,   0,   0, 196,   0,   2,   0,   0,   0,
+      0,   0, 224,   3, 128,   1,   0,   0,   3,   0,   0,   0,  14,   0,   0,   0,
+     96,  32,   0, 192,   0,   0,   0,  27,   0,  24,   0,   0,  12, 254, 255,   0,
+      6,   0,   0,   0,   0,   0,   0, 112,  80,   0,   0,   0,  12,   0,   0,   0,
+      0,   0, 128,   1,   0,   0,  32,   0,  16,   0,   0,   0,   0,   0,   0,   1,
+      0,   1,   0,   0
 };
 
-/* East_Asian_Width: 3040 bytes. */
-
-RE_UINT32 re_get_east_asian_width(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-
-    f = ch >> 12;
-    code = ch ^ (f << 12);
-    pos = (RE_UINT32)re_east_asian_width_stage_1[f] << 5;
-    f = code >> 7;
-    code ^= f << 7;
-    pos = (RE_UINT32)re_east_asian_width_stage_2[pos + f] << 4;
-    f = code >> 3;
-    code ^= f << 3;
-    pos = (RE_UINT32)re_east_asian_width_stage_3[pos + f] << 3;
-    value = re_east_asian_width_stage_4[pos + code];
-
-    return value;
-}
+RE_UINT32 re_get_sentence_terminal(RE_UINT32 codepoint) {
+    RE_UINT32 field_2;
+    RE_UINT32 field_1;
+    RE_UINT32 field_0;
+    RE_UINT32 offset;
+    RE_UINT32 v;
 
-/* Joining_Group. */
+    field_2 = codepoint >> 10;
+    field_1 = (codepoint >> 5) & 0x1F;
+    field_0 = (codepoint >> 3) & 0x3;
+    offset = codepoint & 0x7;
 
-static RE_UINT8 re_joining_group_stage_1[] = {
-    0, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1,
-};
+    v = re_sentence_terminal_table_1[field_2];
+    v = re_sentence_terminal_table_2[(v << 5) | field_1];
+    v = re_sentence_terminal_table_3[(v << 2) | field_0];
 
-static RE_UINT8 re_joining_group_stage_2[] = {
-    0, 0, 0, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 3, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    return (v >> offset) & 0x1;
+}
+
+/* Soft_Dotted. */
+static RE_UINT8 re_soft_dotted_table_1[] = {
+    0, 1, 2, 2, 2, 2, 2, 3, 4, 2, 2, 5, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 6, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2
 };
 
-static RE_UINT8 re_joining_group_stage_3[] = {
+static RE_UINT8 re_soft_dotted_table_2[] = {
+     0,  0,  0,  1,  0,  0,  0,  0,  0,  2,  0,  0,  0,  0,  0,  0,
+     0,  0,  3,  4,  5,  6,  0,  0,  0,  0,  0,  0,  0,  0,  0,  7,
+     0,  0,  8,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  1,  2,  3,  0,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13,
-     0, 14, 15,  0, 16, 17, 18, 19,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0, 20,  0,  0,  0, 21, 22,  0,  0,  0,  0,
      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 23, 24, 25,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  9, 10, 11,  0,  0,
+     0, 12,  0,  0,  0,  0, 13,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0, 14,  0,  0,  0,  0,  0,  0, 15,  0,  0,  0,  0,  0,
      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0, 16,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    26, 27, 28,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-};
-
-static RE_UINT8 re_joining_group_stage_4[] = {
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     45,   0,   3,   3,  43,   3,  45,   3,   4,  41,   4,   4,  13,  13,  13,   6,
-      6,  31,  31,  35,  35,  33,  33,  39,  39,   1,   1,  11,  11,  55,  55,  55,
-      0,   9,  29,  19,  22,  24,  26,  16,  43,  45,  45,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   4,  29,
-      0,   3,   3,   3,   0,   3,  43,  43,  45,   4,   4,   4,   4,   4,   4,   4,
-      4,  13,  13,  13,  13,  13,  13,  13,   6,   6,   6,   6,   6,   6,   6,   6,
-      6,  31,  31,  31,  31,  31,  31,  31,  31,  31,  35,  35,  35,  33,  33,  39,
-      1,   9,   9,   9,   9,   9,   9,  29,  29,  11,  38,  11,  19,  19,  19,  11,
-     11,  11,  11,  11,  11,  22,  22,  22,  22,  26,  26,  26,  26,  56,  21,  13,
-     41,  17,  17,  14,  43,  43,  43,  43,  43,  43,  43,  43,  55,  47,  55,  43,
-     45,  45,  46,  46,   0,  41,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   6,  31,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  35,  33,   1,   0,   0,  21,
-      2,   0,   5,  12,  12,   7,   7,  15,  44,  50,  18,  42,  42,  48,  49,  20,
-     23,  25,  27,  36,  10,   8,  28,  32,  34,  30,   7,  37,  40,   5,  12,   7,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  51,  52,  53,
-      4,   4,   4,   4,   4,   4,   4,  13,  13,   6,   6,  31,  35,   1,   1,   1,
-      9,   9,  11,  11,  11,  24,  24,  26,  26,  26,  22,  31,  31,  35,  13,  13,
-     35,  31,  13,   3,   3,  55,  55,  45,  43,  43,  54,  54,  13,  35,  35,  19,
-     89,  90,  91,  92,  93,  94,  95,  96,  97,  98,  99,   0,   0,   0,   0,   0,
-      4,   4,  13,  39,   9,  29,  22,  24,  45,  45,  31,  43,  57,   0,   6,  33,
-     11,  58,  31,   1,  19,   0,   4,   4,   4,  31,  45,  86,  87,  88,   0,   0,
-     59,  61,  61,  65,  65,  62,   0,  83,   0,  85,  85,   0,   0,  66,  80,  84,
-     68,  68,  68,  69,  63,  81,  70,  71,  77,  60,  60,  73,  73,  76,  74,  74,
-     74,  75,   0,   0,  78,   0,   0,   0,   0,   0,   0,  72,  64,  79,  82,  67,
-      0,   0, 100,   0,   0,   0,   0,   0,   0, 100,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0, 101,   0,   0, 100,   0, 101,   0,
-    101,   0,   0, 101,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     0, 17, 18,  0, 19, 20,  0, 21,  0, 22, 23,  0, 24,  0, 17, 18,
+     0, 19, 20,  0, 21,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0
 };
 
-/* Joining_Group: 788 bytes. */
-
-RE_UINT32 re_get_joining_group(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-
-    f = ch >> 14;
-    code = ch ^ (f << 14);
-    pos = (RE_UINT32)re_joining_group_stage_1[f] << 5;
-    f = code >> 9;
-    code ^= f << 9;
-    pos = (RE_UINT32)re_joining_group_stage_2[pos + f] << 5;
-    f = code >> 4;
-    code ^= f << 4;
-    pos = (RE_UINT32)re_joining_group_stage_3[pos + f] << 4;
-    value = re_joining_group_stage_4[pos + code];
-
-    return value;
-}
-
-/* Joining_Type. */
-
-static RE_UINT8 re_joining_type_stage_1[] = {
-     0,  1,  2,  3,  4,  4,  4,  4,  4,  4,  5,  4,  4,  4,  4,  6,
-     7,  8,  4,  9,  4,  4, 10,  4,  4,  4,  4, 11,  4, 12, 13,  4,
-     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
-     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
-     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
-     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
-     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
-     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
-     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
-     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
-     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
-     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
-     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
-     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
-    14,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
-     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
-     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
+static RE_UINT8 re_soft_dotted_table_3[] = {
+      0,   0,   0,   0,   0,   6,   0,   0,   0, 128,   0,   0,   0,   2,   0,   0,
+      0,   1,   0,   0,   0,   0,   0,  32,   0,   0,   4,   0,   0,   0,   8,   0,
+      0,   0,  64,   1,   4,   0,   0,   0,   0,   0,  64,   0,  16,   1,   0,   0,
+      0,  32,   0,   0,   0,   8,   0,   0,   0,   0,   2,   0,   0,   3,   0,   0,
+      0,   0,   0,  16,  12,   0,   0,   0,   0,   0, 192,   0,   0,  12,   0,   0,
+      0,   0,   0, 192,   0,   0,  12,   0, 192,   0,   0,   0,   0,   0,   0,  12,
+      0, 192,   0,   0
 };
 
-static RE_UINT8 re_joining_type_stage_2[] = {
-      0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   3,   0,   0,
-      0,   0,   4,   0,   0,   0,   5,   6,   7,   8,   9,  10,  11,  12,  13,  14,
-     15,  16,  17,  18,  19,  20,  21,  22,  23,  24,  23,  25,  26,  27,  28,  29,
-     30,  31,  26,  32,  33,  34,   0,  35,  36,  37,  38,  39,  40,  41,  42,  43,
-     44,  45,  46,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  47,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  48,  49,  50,  51,
-     52,  53,  54,   0,  55,   0,   0,   0,  56,  57,  58,   0,  59,  60,  61,  62,
-     63,   0,   0,  64,   0,   0,   0,  65,   0,   0,   0,   0,   0,   0,   0,   0,
-     66,  67,   0,  68,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,  69,   0,  70,   0,  71,   0,   0,   0,   0,   0,   0,   0,   0,
-     72,   0,  73,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,  74,  75,  76,   0,   0,   0,   0,
-     77,  78,   0,  79,  80,  81,  82,  83,  84,  85,  86,  87,   0,   0,   0,  88,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  89,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,  90,   0,   0,  70,   0,   0,   0,  91,
-      0,   0,   0,   0,   0,   0,   0,  92,   0,   0,   0,  93,   0,  94,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,  95,   0,   0,  96,   0,   0,  97,   0,
-      0,   0,   0,   0,  98,   0,   0,   0,   0,   0,   0,   0,  99, 100,   0,   0,
-    101, 102, 103,   0, 104, 105, 106, 107, 108,   0,   0, 109,  33, 110,   0,   0,
-    111, 112, 113, 114,   0,   0, 115, 116, 117, 118, 119,   0, 120,   0,   0,   0,
-    121,   0,   0,   0,   0,   0,   0, 122, 123, 124, 125,   0,   0,   0,   0,   0,
-    126,   0, 127,   0, 128, 129, 130,   0,   0,   0,   0, 131,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-    132,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 133, 134,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 135, 136,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0, 137,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0, 138, 139,   0,   0, 140,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0, 141, 142, 143,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-    144,   0,   0,   0, 134,   0,   0,   0,   0,   0,   0, 145,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0, 146, 147, 148,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-    149,   2,   0,   0,   2,   2,   2,   3,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-};
+RE_UINT32 re_get_soft_dotted(RE_UINT32 codepoint) {
+    RE_UINT32 field_2;
+    RE_UINT32 field_1;
+    RE_UINT32 field_0;
+    RE_UINT32 offset;
+    RE_UINT32 v;
 
-static RE_UINT8 re_joining_type_stage_3[] = {
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,
-      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   0,   0,
-      3,   4,   0,   0,   0,   0,   0,   0,   0,   0,   5,   2,   2,   2,   2,   6,
-      7,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   8,   9,  10,  11,  12,
-     13,  14,   2,   2,   0,  15,  16,  12,  12,  17,  17,  18,  12,  12,  12,  12,
-     19,  20,  21,  22,  22,  23,   0,  24,   0,  25,  26,  27,  12,  28,   2,   2,
-      2,  29,  12,  30,  12,  31,  32,  18,   0,   0,   0,   0,  33,   2,  34,   0,
-      0,  35,  12,  12,  12,  36,  37,  38,   0,   0,  33,  39,  40,  41,   0,   0,
-     42,  43,  44,  45,  46,  47,   0,   0,   0,   0,   0,   0,  12,  48,  49,  50,
-      0,   0,   3,   2,  39,   2,   2,   2,  51,   0,   0,   0,   0,   0,   0,  52,
-      5,  53,   5,   0,  54,   0,   0,   0,  55,   0,   0,   0,   0,   0,   0,  56,
-     57,   1,   0,   0,  54,   0,   0,  58,  59,   0,   0,   0,   0,   0,   0,  56,
-     60,  61,  55,   0,   0,   0,  62,   0,  63,  53,   0,   0,  54,   0,   0,  64,
-     55,   0,   0,   0,   0,   0,   0,  65,  57,   1,  58,   0,  54,   0,   0,   0,
-     66,   0,   0,   0,   0,   0,   0,   0,  34,   1,   0,   0,   0,   0,   0,   0,
-     67,   0,   0,   0,   0,   0,   0,  33,  68,  69,  70,   0,  54,   0,   0,   0,
-     58,  71,   0,   0,  54,   0,   0,   0,   4,   0,   0,   0,   0,   0,   0,  72,
-     57,   1,   0,   0,  54,   0,   0,   0,   0,  66,  73,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,  74,  51,  25,  75,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,  74,  76,   0,  77,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   4,   0,   0,  78,  55,   0,   0,   0,   0,   0,   0,   5,  75,
-     79,  80,   2,   5,   2,   2,   2,  76,  58,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,  80,  81,  82,   0,   0,   0,  83,  34,   0,  57,   0,
-     84,   1,   0,   1,   0,   0,   0,   0,   0,   0,   0,  80,   0,   0,   0,   0,
-      0,   0,  85,   0,   0,   0,  85,   0,   0,   0,  54,   0,   0,   0,  54,   0,
-      0,   0,   0,   0,   0,   0,  86,  77,  58,   5,  37,   1,   0,   0,   0,   0,
-     87,  88,   0,   0,  12,  12,  12,  12,  12,  12,  12,  12,  12,  12,  12,  89,
-     90,  12,  12,  12,  12,  91,   0,   0,   0,   0,   0,   0,  92,  34,  66,  45,
-      0,   0,  25,  93,   0,   0,   0,   0,   0,   0,  58,  75,  94,  76,   3,  22,
-      0,   0,   0,   0,   0,   0,   2,  75,  37,   0,   0,   0,   0,   0,  95,   8,
-     66,   0,   0,   0,   0,   3,  37,   0,   4,   0,   0,   0,  96,  97,   0,   0,
-      0,   0,   0,   0,  58,  98,   4,   0,   0,   0,   0,   0,   0,  99, 100,   0,
-      0,   0, 101,   2,  81,  53,  56,   4,   2,   2,   2,   2,   2,   2,   2,  39,
-      0, 102,   0,   0,   0, 103,   0,   0,   0,   0,   0,   0,  76,  64,   0,   0,
-      0,   0,   2,   2,   2,   2,  34,   0,   0,   0,   0,   0,   0,  25,   4,   0,
-      0,   0,   0,   0,   0,   0,   0,  25,   0,   0,   0,   0,   2,   2,   2,   2,
-      0,   0,   0,   0,   0,  96,   0,   0,   0,   0,   0,  59,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,  25, 101,  77,   0,   0,   0,  33,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   4,   0, 104, 105,   0,   0,  70,   0,   0,   0,
-     12,  12,  12,  12,  12,  12, 106,   0,  71,   0,   0,   0,   2,   2,   4,  25,
-      0,   0,   0,   0,  33,  77,   0,   0,  25,   2,   4,   0,   0,   0,   0,   0,
-     51,   0,   0,   0,   0,   0, 107, 108,   0,   0,   0,   0,   1,   0,   0,   0,
-      0,   0,   0,   0,   0, 109,  82,   0, 105,  56,   0,   0,   0,   0,   0,  56,
-      0,   0,   0,   0,   0,   0, 110,  68,  55,   0,   0,   0,   0,  71,  58,   0,
-      0,   0,   0,   0,   1,  53,   0,   0,   0,   0,   0,  58,   0,   0,   0,   0,
-      2,   2,   0,   0,   2,   2,   0,   0,   0,   0,   0,   0,   0,   0,   0,  45,
-      0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,  34,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,  33,  51, 111,  99,   0,   0,   0,   0,   0,  92,
-    112, 113, 114, 115, 116, 117,   0,   0, 118, 119, 120,   0,   0, 121,   0,   0,
-    122,  12,  12,  12, 123,   0,   0,   0,   0,   0,   0,   0,   0,   0, 124,  12,
-    125,   2, 126,   0,   0,   0,   0,   0,  55,   0,   0,   0,   0,   0,   0,   2,
-     75,   0,   0,   0,   0,   0,   0,  25,   4,   0,   0,   0,   0,   0, 127,  59,
-     51,   0,   0,   0,  25,  40,  76,   0,   0,   0,   0,   0,   0,   0, 105,   0,
-      4,   0,   0,   0,   0,   0,  33,  75,   0,  57,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,  25, 128,  58,   0,   0,   0,  25,   3,  51,   0,   0,
-     34,   0,   0,   0,  33,  76,  76,   0,   0,   0,   0,   0,   0,   0,   0,   2,
-     73,   0,   0,  58,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3, 129,
-    130,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  96,  86,
-     34,   0,   0,  71,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3, 131,
-     34,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 132,   6,   0,
-      0,   0,   0,  80, 133,  37,   0,   0,   0,   0,   0,   0,   0,  25,   2,  59,
-      0,   0,  99,  54,  34,   0,   0,   0,   5,  51,   0,   0,   0,   0,   3, 134,
-     25,   0, 109,  45,   0,   0,   0,   0,   0,  64,  75,   4,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,  75,   6,   0,   0,  64,   2,   2,  64, 135,   0,
-      0,   0,   0,   0,   0,   0, 109, 136,   6,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,  98,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  72,   0,
-      0,   0,   0,   0,   0,   0,   2,  34,   0,   0,   0,   0,   0,   0,  76,   0,
-      0,   0,   0,   0,   0,   0,  75,   0,   0,  25,   0,   0,   0,   0,   0,   0,
-      0,  25,  51,   0,   0,   0,   0,   0,   0,   0,   0,  70,  37,   0,   0,   0,
-      0,   0,   0,   0,  25,   4,   3,   2, 137,  37,   0,   0,   0,  96,   0,   0,
-     85,   0,   0,   0,   0,   0,   0,   0,   2,   2,   2,   2,   2,   2,  75,   3,
-      2,   2,   2,   2,   2,  76,   1,   0,  56,   0,   0,   3,   5,   2,   0,   0,
-     75,   2,   2, 138, 139,  51,   0,   0,   0,   0,   0,   0,   0,  99,   0,   0,
-      0,   0,  75,   0,   0,   0,   0,   0,  12,  12,  12,  12,  12,  12,  12,  12,
-    140,  37,   0,   0,   0,   0,   0,   0,  55,   0,   0,   0,   2,   2,   2,   2,
-};
+    field_2 = codepoint >> 10;
+    field_1 = (codepoint >> 5) & 0x1F;
+    field_0 = (codepoint >> 3) & 0x3;
+    offset = codepoint & 0x7;
 
-static RE_UINT8 re_joining_type_stage_4[] = {
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0,
-    5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 5, 5, 5, 5, 5,
-    5, 5, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5,
-    5, 5, 5, 5, 5, 5, 0, 5, 0, 5, 5, 0, 5, 5, 0, 5,
-    5, 5, 5, 0, 5, 0, 0, 0, 2, 0, 3, 3, 3, 3, 2, 3,
-    2, 3, 2, 2, 2, 2, 2, 3, 3, 3, 3, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2,
-    3, 2, 2, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 2, 2,
-    5, 3, 3, 3, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
-    3, 3, 2, 2, 2, 2, 2, 2, 3, 2, 2, 3, 3, 3, 3, 3,
-    3, 3, 3, 3, 2, 3, 2, 3, 2, 2, 3, 3, 0, 3, 5, 5,
-    5, 5, 5, 5, 5, 0, 0, 5, 5, 0, 5, 5, 5, 5, 3, 3,
-    0, 0, 2, 2, 2, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 5,
-    3, 5, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 2, 2, 3, 2,
-    3, 2, 3, 2, 3, 2, 2, 3, 5, 5, 5, 0, 0, 3, 2, 2,
-    2, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 3, 3, 2, 2, 2,
-    2, 3, 2, 3, 3, 2, 2, 2, 0, 0, 0, 0, 0, 0, 5, 5,
-    5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0,
-    0, 0, 1, 0, 0, 5, 0, 0, 5, 5, 0, 5, 5, 5, 5, 5,
-    5, 5, 5, 5, 0, 5, 5, 5, 0, 5, 5, 5, 5, 5, 0, 0,
-    3, 2, 2, 2, 2, 2, 3, 3, 2, 3, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 3, 2, 0, 0, 0, 5, 5, 5, 0, 0, 0, 0,
-    2, 0, 2, 2, 2, 2, 0, 3, 2, 3, 3, 0, 0, 0, 0, 0,
-    2, 2, 3, 3, 3, 0, 3, 2, 2, 3, 3, 2, 2, 0, 2, 2,
-    2, 3, 2, 2, 2, 2, 0, 0, 5, 5, 5, 0, 0, 0, 0, 0,
-    0, 0, 5, 0, 5, 0, 0, 0, 5, 0, 0, 0, 0, 5, 0, 0,
-    0, 0, 5, 5, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 5, 0, 0, 0, 0, 5, 5, 5, 5, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 5, 0, 0, 5, 5, 0, 0, 0, 0, 0,
-    0, 5, 5, 0, 0, 0, 0, 5, 5, 0, 0, 5, 5, 5, 0, 0,
-    5, 5, 0, 0, 0, 5, 0, 0, 0, 5, 5, 5, 5, 5, 0, 5,
-    0, 0, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 5, 0, 0, 5,
-    0, 0, 5, 0, 0, 0, 0, 0, 5, 0, 0, 0, 5, 0, 0, 0,
-    5, 0, 0, 0, 0, 0, 5, 5, 5, 0, 5, 5, 5, 5, 0, 0,
-    0, 0, 0, 0, 0, 5, 5, 0, 0, 0, 0, 0, 5, 5, 0, 0,
-    0, 0, 0, 5, 5, 0, 0, 0, 0, 0, 5, 5, 5, 0, 5, 0,
-    0, 5, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0,
-    5, 5, 5, 5, 5, 0, 0, 0, 5, 5, 5, 5, 5, 5, 0, 0,
-    0, 0, 0, 0, 0, 5, 0, 5, 5, 5, 5, 5, 5, 0, 5, 5,
-    0, 0, 0, 0, 0, 5, 5, 5, 5, 0, 5, 5, 5, 5, 5, 5,
-    0, 5, 5, 0, 0, 5, 5, 0, 5, 5, 0, 0, 0, 0, 5, 5,
-    0, 0, 5, 0, 0, 5, 5, 0, 0, 0, 5, 5, 5, 0, 0, 0,
-    0, 0, 0, 0, 5, 5, 0, 5, 0, 0, 0, 0, 0, 0, 0, 2,
-    0, 0, 1, 5, 5, 5, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 5, 5, 2, 2, 5, 2, 0, 0, 0, 0, 0,
-    5, 5, 5, 0, 0, 0, 0, 5, 5, 0, 0, 5, 0, 0, 0, 0,
-    5, 0, 5, 0, 0, 5, 5, 5, 0, 0, 0, 0, 5, 0, 5, 5,
-    0, 0, 5, 5, 5, 5, 0, 0, 5, 5, 0, 5, 5, 5, 0, 0,
-    5, 5, 0, 0, 0, 5, 0, 5, 0, 0, 0, 0, 5, 5, 5, 5,
-    5, 5, 5, 5, 0, 0, 5, 5, 5, 5, 5, 0, 5, 5, 5, 5,
-    0, 0, 0, 5, 0, 1, 5, 5, 0, 0, 5, 5, 5, 5, 5, 0,
-    0, 0, 5, 0, 0, 0, 5, 0, 0, 0, 0, 5, 0, 0, 0, 0,
-    2, 2, 4, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 5, 5,
-    5, 5, 0, 0, 5, 5, 0, 0, 0, 5, 5, 5, 5, 5, 5, 0,
-    5, 0, 5, 5, 5, 0, 0, 5, 0, 5, 5, 5, 0, 5, 5, 0,
-    2, 2, 2, 2, 2, 3, 0, 3, 0, 3, 3, 0, 0, 4, 3, 3,
-    3, 3, 3, 2, 2, 2, 2, 4, 2, 2, 2, 2, 2, 3, 2, 2,
-    2, 3, 0, 0, 3, 5, 5, 0, 0, 0, 0, 2, 2, 2, 2, 3,
-    2, 3, 2, 3, 3, 3, 2, 2, 2, 3, 2, 2, 3, 2, 3, 3,
-    2, 3, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 2, 2, 0,
-    4, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 2, 5, 5, 5, 5,
-    2, 2, 2, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 5, 5,
-    5, 2, 2, 2, 3, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 0,
-    5, 5, 0, 0, 5, 0, 5, 5, 5, 0, 5, 0, 0, 0, 0, 5,
-    5, 0, 5, 5, 0, 0, 0, 0, 5, 5, 5, 0, 0, 5, 0, 5,
-    0, 0, 0, 5, 0, 5, 0, 0, 0, 0, 5, 5, 5, 5, 0, 5,
-    5, 0, 0, 5, 5, 5, 5, 0, 5, 0, 5, 5, 0, 5, 5, 0,
-    0, 0, 5, 0, 5, 5, 0, 5, 5, 5, 5, 0, 0, 5, 5, 5,
-    5, 0, 0, 5, 5, 5, 5, 5, 5, 5, 0, 5, 5, 0, 5, 5,
-    2, 2, 2, 2, 5, 5, 5, 5,
-};
+    v = re_soft_dotted_table_1[field_2];
+    v = re_soft_dotted_table_2[(v << 5) | field_1];
+    v = re_soft_dotted_table_3[(v << 2) | field_0];
 
-/* Joining_Type: 3560 bytes. */
-
-RE_UINT32 re_get_joining_type(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-
-    f = ch >> 12;
-    code = ch ^ (f << 12);
-    pos = (RE_UINT32)re_joining_type_stage_1[f] << 6;
-    f = code >> 6;
-    code ^= f << 6;
-    pos = (RE_UINT32)re_joining_type_stage_2[pos + f] << 3;
-    f = code >> 3;
-    code ^= f << 3;
-    pos = (RE_UINT32)re_joining_type_stage_3[pos + f] << 3;
-    value = re_joining_type_stage_4[pos + code];
-
-    return value;
+    return (v >> offset) & 0x1;
 }
 
-/* Line_Break. */
-
-static RE_UINT8 re_line_break_stage_1[] = {
-     0,  1,  2,  3,  4,  5,  5,  5,  5,  5,  6,  7,  8,  9, 10, 11,
-    12, 13, 14, 15, 16, 10, 17,  5, 18, 10, 10, 19, 10, 20, 21, 22,
-     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5, 23,
-     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5, 23,
-    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
-    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
-    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
-    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
-    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
-    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
-    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
-    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
-    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
-    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
-    24, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
-    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
-    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
-};
-
-static RE_UINT8 re_line_break_stage_2[] = {
-      0,   1,   2,   2,   2,   3,   4,   5,   2,   6,   7,   8,   9,  10,  11,  12,
-     13,  14,  15,  16,  17,  18,  19,  20,  21,  22,  23,  24,  25,  26,  27,  28,
-     29,  30,  31,  32,  33,  34,  35,  36,  37,   2,   2,   2,   2,  38,  39,  40,
-     41,  42,  43,  44,  45,  46,  47,  48,  49,  50,   2,  51,   2,   2,  52,  53,
-     54,  55,  56,  57,  58,  59,  60,  61,  62,  63,  64,  65,  66,  67,  68,  69,
-      2,   2,   2,  70,   2,   2,  71,  72,  73,  74,  75,  76,  77,  78,  79,  80,
-     81,  82,  83,  84,  85,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,
-     79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,
-     79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,
-     79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  86,  79,  79,  79,  79,
-     79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,
-     79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,
-     87,  79,  79,  79,  79,  79,  79,  79,  79,  88,   2,   2,  89,  90,   2,  91,
-     92,  93,  94,  95,  96,  97,  98,  99, 100, 101, 102, 103, 104, 105, 106, 100,
-    101, 102, 103, 104, 105, 106, 100, 101, 102, 103, 104, 105, 106, 100, 101, 102,
-    103, 104, 105, 106, 100, 101, 102, 103, 104, 105, 106, 100, 101, 102, 103, 104,
-    105, 106, 100, 101, 102, 103, 104, 105, 106, 100, 101, 102, 103, 104, 105, 106,
-    100, 101, 102, 103, 104, 105, 106, 100, 101, 102, 103, 104, 105, 106, 100, 101,
-    102, 103, 104, 105, 106, 100, 101, 102, 103, 104, 105, 106, 100, 101, 102, 107,
-    108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108,
-    109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109,
-    109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109,
-    109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109,
-    109, 109,  79,  79,  79,  79, 110, 111,   2,   2, 112, 113, 114, 115, 116, 117,
-    118, 119, 120, 121, 109, 122, 123, 124,   2, 125, 126, 109,   2,   2, 127, 109,
-    128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 109, 139, 109, 140, 141,
-    142, 143, 144, 145, 146, 147, 148, 109, 149, 150, 109, 151, 152, 153, 154, 109,
-    155, 156, 109, 157, 158, 159, 109, 109, 160, 161, 162, 163, 109, 164, 109, 165,
-      2,   2,   2,   2,   2,   2,   2, 166, 167,   2, 168, 109, 109, 109, 109, 109,
-    109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109,
-      2,   2,   2,   2, 169, 170, 171,   2, 172, 109, 109, 109, 109, 109, 109, 109,
-    109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109,
-    109, 109, 109, 109, 109, 109, 109, 109,   2,   2,   2, 173, 174, 109, 109, 109,
-    109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109,
-    109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109,
-      2,   2,   2,   2, 175, 176, 177, 178, 109, 109, 109, 109, 179, 180, 181, 182,
-     79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79, 183,
-     79,  79,  79,  79,  79, 184, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109,
-     79,  79, 185,  79,  79, 186, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109,
-    109, 109, 109, 109, 109, 109, 109, 109, 187, 188, 109, 109, 109, 109, 109, 109,
-      2, 189, 190, 191, 192, 193, 194, 109, 195, 196, 197,   2,   2, 198,   2, 199,
-      2,   2,   2,   2, 200, 201, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109,
-    202, 109, 203, 109, 109, 204, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109,
-      2, 205, 206, 109, 109, 109, 109, 109, 207, 208, 209, 109, 210, 211, 109, 109,
-     79,  79, 212, 213,  79,  79,  79, 214, 215, 216, 217, 218, 219, 220, 221, 222,
-    223, 224, 225, 226, 227,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79, 228,
-     79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,
-     79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79, 228,
-    229, 109, 230, 231, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109,
-    109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109,
-};
-
-static RE_UINT16 re_line_break_stage_3[] = {
-      0,   1,   0,   0,   2,   3,   4,   5,   6,   6,   6,   7,   6,   6,   6,   8,
-      9,   0,   0,   0,  10,  11,  12,  13,   6,   6,  14,   6,   6,   6,  14,   6,
-      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,
-      6,   6,   6,   6,   6,   6,   6,   6,  14,  15,  16,  17,   6,   6,   6,   6,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,  18,   0,  19,  20,   0,   6,  21,
-     22,  23,   6,   6,  24,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,
-     25,  26,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,
-      6,   6,   6,   6,   6,   6,  27,   6,   6,   6,  28,  27,   6,   6,   6,   6,
-      6,  29,  30,   0,   0,   0,   0,  31,  32,  33,  34,  34,  34,  35,  36,  33,
-      6,  37,   0,  38,   6,   6,   6,   6,   6,  25,   0,   0,   4,  39,  40,   6,
-      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,  41,  42,  42,  43,   4,  44,
-      6,  45,  46,   6,   6,   6,   0,   0,   0,  47,   6,   6,   6,   6,   6,   6,
-      6,   6,   6,   6,  48,   0,  49,  33,   4,  44,   6,   6,   6,  25,  50,  51,
-      6,   6,  48,  52,  53,  54,   6,  28,   6,   6,   6,  55,   6,  56,  33,  33,
-     33,  33,  33,  33,   6,   6,  57,  58,  33,  33,  59,   0,  52,   0,   0,   0,
-     50,   6,   6,   6,   6,   6,   6,  60,   0,   0,  61,   6,  62,   4,   6,   6,
-     63,  64,  65,   6,   6,  66,  67,  68,  69,  70,  71,  72,  73,   4,  74,  75,
-     76,  77,  65,   6,   6,  66,  78,  79,  80,  81,  82,  83,  84,   4,  85,  33,
-     76,  45,  24,   6,   6,  66,  86,  68,  87,  88,  89,  33,  73,   4,  90,  91,
-     76,  64,  65,   6,   6,  66,  86,  68,  69,  81,  92,  72,  73,   4,   6,  33,
-     93,  94,  95,  96,  97,  94,   6,  98,  99, 100, 101,  33,  84,   4,   6, 102,
-    103,  57,  66,   6,   6,  66,   6, 104, 105, 100, 106,  56,  73,   4, 107,   6,
-    108,  57,  66,   6,   6,  66, 109,  68, 105, 100, 106, 110,  73,   4, 111,  33,
-    112,  57,  66,   6,   6,   6,   6, 113, 105, 114, 115,   6,  73,   4,   6, 116,
-    117,   6,  28, 118,   6,   6,  24, 119,  28, 120, 121,   0,  84,   4, 122,  33,
-    123, 124, 124, 124, 124, 124, 124, 125, 124, 126,   4, 127,  33,  33,  33,  33,
-    128, 129, 124, 124, 130, 124, 124, 131, 132, 131,   4, 133,  33,  33,  33,  33,
-    134, 135, 136,  26,   4,  44, 137, 138,   6,  27,   6,   6,   6, 139,  30, 140,
-    141, 142,   0,  30,   0,   0,   0, 143, 144,  57, 145, 146,  33,  33,  33,  33,
-    124, 124, 124, 124, 124, 124, 124, 124,   4, 147, 124, 124, 124, 124, 124, 124,
-    124, 124,   4, 148,   6,   6,   6,   6,  45, 149,   6,   6,   6,   6,   6,   6,
-    150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 151, 151, 151, 151,
-    151, 151, 151, 151, 151, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152,
-      6,   6,   6,   6,   6,   6,   6,   6,   6,  95,  28,  95,   6,   6,   6,   6,
-      6,  95,   6,   6,   6,   6,  95,  28,  95,   6,  28,   6,   6,   6,   6,   6,
-      6,   6,  95,   6,   6,   6,   6,   6,   6,   6,   6, 153, 154,   6,   6, 139,
-      6,   6,   6, 155,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,  58,  58,
-    156,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,
-    156,   6,   6, 157,   6,   6,   6,   6,   6,   6,   6,   6,   6, 158,   6,  89,
-      6,  57, 159,  33,   6,   6, 160,  33,   6,   6, 161,  33,   6,  57, 162,  33,
-    124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 163, 164,   4, 165,   6, 155,
-    166, 167,   4, 165,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,  89,
-    168,   6,   6,   6,   6, 169,   6,   6,   6,   6,   6,   6,   6,   6,  58,  33,
-      6,   6,   6,  28,   0, 170,   0, 170, 171,   4, 124, 124, 124, 131, 172,  33,
-    124, 124, 124, 124, 124, 173, 124, 124, 124, 174,   4, 175,   6,   6,   6,   6,
-      6,   6, 176, 177, 124, 124, 124, 124, 124, 124, 124, 178, 124, 124, 124, 179,
-      4, 165,   4, 165, 124, 131,   0, 180,  33,  33,  33,  33,  33,  33,  33,  33,
-    103,   6,   6,   6,   6,   6, 181,   0, 103, 182,   4, 183, 156,  25,  50, 139,
-    184,   6,   6,   6,  61, 185,   4,  44,   6,   6,   6,   6,  48,   0, 170,  22,
-      6,   6,   6,   6, 181,   0,   0, 186,   4, 187,   4,  44,   6,   6,   6, 188,
-      6,  89,   6,   6,   6,   6,   6, 189,   6,  33, 190,   0,   0, 191, 192, 193,
-      6,   6,   6,   6,   6,   6,   6,   6,   0,   0,   0,   0,   0,   0,   0, 194,
-      6,   6,  58,  58,   6,   6,   6,   6,  58,  58,   6, 195,   6,   6,   6,  58,
-      6,   6,   6,   6,   6,   6,  57,   6,  57,   6, 196, 109,   6,   6, 197, 198,
-    199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211,   0, 212, 213,
-    214, 215,   6, 139, 216, 217, 218, 219, 217, 217,   0,   0,   0,   0, 220,  33,
-    221, 116, 222,   6, 223, 224,   6,   6,   6,   6, 225, 226, 227, 228, 227, 229,
-      6, 230, 227, 229,   6,   6,   6,   6,   6,   6, 231,   6,   6,   6,   6,   6,
-    232, 233, 234, 235, 236, 237, 238, 225,   6, 239, 240,   6, 241, 242,   6,   6,
-    242,   6, 243, 244, 243,   6,   6,  14,   6,   6,   6,   6,   6, 245,   6,   6,
-      6, 246, 240, 247,   6, 248,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,
-      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6, 249,   6,
-      6,   6,   6,   6,  28,  33,  33,  33,   6,  56,  33,  33, 227, 227, 227, 227,
-    227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 250,
-    227, 227, 227, 227, 227, 227, 227, 227, 227, 228, 227, 227, 227, 227, 251,   6,
-    227, 227, 252,   6, 253, 229, 242, 225, 254, 255, 229,   6, 252,  14,   6,   6,
-    256, 257, 258, 259,   6,   6,   6, 260, 261,   6,   6,   6, 262, 263,   6, 264,
-      6,   6,   6, 265,   6,   6,   6, 266, 267, 268, 269, 270, 271, 272, 273, 274,
-    275, 276,   6,   6,   6,   6,   6,   6,   6,   6,  14, 277, 278, 279, 280, 227,
-    227, 227, 228,   6,   6,   6,   6,   6, 281,   6,   6,   6, 282, 279,   6,   6,
-    283, 284, 284, 285,   6,   6,   6,   6,   6,   6,   6, 246,   6,   6,   6, 286,
-      6,   6,   6,   6,   6,   6,   6,   6,   6,   6, 287, 229,   6,   6, 196,   6,
-      6,   6,  58,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,
-      6,   6,   6,   6,   6,  28,   6,   6,   6,   6,   6,  28,   6,   6,   6,   6,
-      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6, 176, 288, 289,
-      6,   6,   6,   6,  45, 149,   6,   6,   6,   6,   6,   6,   6, 290, 291,  71,
-      6,   6,  28,  33,  28,  28,  28,  28,  28,  28,  28,  28,   0,   0,   0,   0,
-    292, 293, 294, 295, 296, 297, 298, 299, 300, 301,  33,  33,  33,  33,  33,  33,
-    267, 267, 267, 302, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 303,  33,
-    267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267,
-    267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 304,  33,  33,  33, 267, 303,
-    305, 279, 306, 307, 267, 308, 309, 310, 311, 312, 267, 267, 313, 267, 267, 267,
-    314, 315, 316, 317, 318, 312, 267, 267, 313, 267, 267, 267, 314, 315, 319, 320,
-    321, 267, 267, 267, 267, 267, 322, 267, 267, 267, 267, 267, 267, 267, 267, 267,
-    267, 323, 267, 267, 267, 267, 267, 324, 267, 267, 267, 267, 303,  33, 325, 325,
-    267, 267, 267, 323, 267, 267, 267, 267, 267, 227, 267, 267, 267, 267, 267, 267,
-    267, 267, 267, 267, 267, 267, 267, 267,   6,   6,   6,   6,   6,   6,   6,   6,
-    267, 267, 326, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267,
-    267, 327, 267, 267, 267, 267, 267, 267, 323,  33,   6,   6,   6,   6,   6, 188,
-      6, 328,   6,   6,   4, 329,  33,  33,   6,   6,   6,   6,   6, 176, 190, 185,
-      6,   6,   6,  48,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6, 330,  33,
-      6,   6,   6,   6,   6,   6,   6,   6, 331,  33,  33,  33,  33,  33, 290,   6,
-    332, 333,   6,   6,  25, 182,   6, 334,   6,   6,   6,   6,   6,   6, 335,  33,
-     26,   6,   6,   6,   6,   6, 181,   0, 336, 337,   4, 165,   0,   0,  26, 338,
-      4,  44,   6,   6,  48, 339,   6,   6, 176,   0, 170, 290, 150, 150, 150, 340,
-     50,   6,   6,   6,   6,   6,  25,   0, 341, 342,   4, 343, 124, 124,   4, 344,
-      6,   6,   6,   6,   6,  61, 180,  33, 333, 345,   4, 346, 124, 124, 124, 124,
-    124, 124, 124, 124, 124, 124, 124, 124, 347,  33,  33, 348,   6,  25, 349,  33,
-    350, 350, 350,  33,  28,  28,   6,   6,   6,   6,   6,   6,   6,  33,   6,   6,
-      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,  25, 351,   4, 165,
-    352, 353, 353, 354, 353, 353, 353, 352, 353, 353, 354, 353, 353, 353, 352, 353,
-    353, 354, 353, 353, 353, 352, 353, 353, 354, 353, 353, 353, 352, 353, 353, 354,
-    353, 353, 353, 352, 353, 353, 354, 353, 353, 353, 352, 353, 353, 354, 353, 353,
-    353, 352, 353, 353, 354, 353, 353, 353, 352, 353, 353, 354, 353, 353, 353, 352,
-    353, 353, 354, 353, 353, 353, 352, 353, 353, 354, 353, 353, 353, 352, 353, 353,
-    354, 353, 353, 353, 352, 353, 353, 354, 353, 353, 353, 352, 353, 353, 354, 353,
-    353, 353, 352, 353, 353, 354, 353, 353, 353, 352, 353, 353, 354, 353, 353, 353,
-    353, 352, 353, 353, 355,  33, 151, 151, 356, 357, 152, 152, 152, 152, 152, 358,
-    359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359,
-     33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,
-     28,  33, 360, 361,  34, 362, 363, 364, 365,  34,   6,   6,   6,   6,   6,   6,
-      6,   6,   6,   6,   6,   6,   6,   6, 155,  33, 360,   6,   6,   6,   6,   6,
-      6,   6,   6,   6,   6,   6,   6, 366,  33,  33,   6,   6,   6,   6,   6,   6,
-      6,   6, 118,   6,   6,   6,   6,   6,   6,  33,  33,  33,  33,  33,   6, 367,
-      0,   0, 368, 369,   0,   0, 370, 284, 371, 372, 373, 374, 323, 375,  57,   6,
-      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6, 376,
-    377, 378, 267, 379, 267, 267, 267, 380, 267, 267, 267, 381, 382, 325, 383, 267,
-    267, 267, 267, 384, 267, 267, 267, 323, 385, 385, 385, 386, 387,  28,  33, 388,
-      6, 109,   6,   6,  28,   6,   6, 389,   6,  58,   6,  58,  33,  33,  33,  33,
-      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,  56,
-    390,   6,   6,   6,   6,   6, 391,   6,   6,   6,   6,   6,   6,   6,   6,   6,
-      6,  28,   6, 182,  89,  33,  33,  33,  33,  33,   6,   6,   6,   6,   6, 392,
-      6,   6,   6, 139,   6,   6,   6,   6,   6,   6,  89,  33,  40,   6,   6, 182,
-      6,   6,   6,   6, 182, 393,   6,   6,   6,  56,   6,   6,   6,   6,  48, 394,
-      6,   6,   6, 395,   6,   6,   6,   6, 182,   6, 396,  33,  33,  33,  33,  33,
-      6,   6,   6,  58,   4, 165,   6,   6,   6,   6, 182,   6,   6,   6,   6, 182,
-      6,   6,   6,   6,   6,  33,   6,   6,   6,   6,   6,   6, 182, 290,  33,  33,
-      6,   6,   6,   6,   6,   6,  28,  33,   6,   6,  58,  33,   6,  33,  33,  33,
-     58,  66,   6,   6,   6,   6,  45, 397,   6,   6, 395,   6,   6,   6,   6,   6,
-      6,   6,   6,  28, 290,   6,  33,  33,  33,  33,  33,  33,   6,   6, 398, 360,
-      6,   6,   6, 399,   6,   6,   6, 400,  33,  33,  33,  33,  33,  33,  33,  33,
-      6,   6,   6,   6,   6,   6,   6,  22,   6,   6, 118,   6,   6,   6,   6,   6,
-    401, 402, 109,  27,   6,   6,  58,  80,   6,  89, 403,  89,   6,   6,   6,   6,
-      6,   6,   6,   6,  33,  33,  33,  33,   6,   6,   6,   6, 404, 360, 405,  33,
-      6,   6,   6,   6,   6,   6,  58, 406,   6,   6,  58,   6,   6,   6,  56,   6,
-      6,   6, 155, 407,  33,  27,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,
-      6,   6,   6,   6,   6,   6,   6,   6,   6,  89,  33,  33,  33,  33,  33,  33,
-      6,   6,   6,   6,   6,   6,  56,  33,   6,   6,   6,   6,   6,   6,  56, 118,
-      6,   6,   6,   6, 181,  33,   4, 165,  33,  33,  33,  33,  33,  33,  33,  33,
-     33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,   6,   6,   6,  28,
-      6,   6,   6,   6,   6,  33,   6,   6,  48,   0,  40, 155,  33,  33,  33,  33,
-     33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,   6,   6,  28,  33,
-    184,   6,   6,   6,   6,   6,   6,   0, 140, 396, 118,   6, 408,   4,  33,  71,
-    184,   6,   6,   6,   6,   6,   0, 409, 410, 149,   6,   6,   6,  89,   4, 165,
-    184,   6,   6,   6, 176,   0, 411,   4, 412,  33,   6,   6,   6,   6, 413,  33,
-    184,   6,   6,   6,   6,   6,  25,   0, 414, 415,   4, 416,  27,   6, 139,  33,
-      6,   6,  24,   6,   6, 181,   0, 417,  33,  33,  33,  33,  33,  33,  33,  33,
-     28, 418,   6,  45,   6, 419,   6,   6,   6,   6,   6, 176,   0, 394,   4, 165,
-    112,  64,  65,   6,   6,  66,  86, 420,  69,  81, 101, 393, 421, 422, 422,  33,
-      6,   6,   6,   6,   6,   6, 142,   0, 423, 424,   4, 425,  33,  33,  33,  33,
-      6,   6,   6,   6,   6,   6,   0,   0,  50,  33,   4, 165,  33,  33,  33,  33,
-      6,   6,   6,   6,   6, 176, 336,   0, 426, 427, 403, 345,  33,  33,  33,  33,
-      6,   6,   6,   6,   6,   6,   0,   0, 428,  33,   4, 165, 429, 430,  33,  33,
-      6,   6,   6,   6,   6,  25,   0,  89,   4, 165,  33,  33,  33,  33,  33,  33,
-    124, 124, 124, 431, 124, 173,   4, 432,  33,  33,  33,  33,  33,  33,  33,  33,
-      6,   6,   6,   6,   6, 181,   0, 433,  33,  33,  33,  33,  33,  33,  33,  33,
-     33,  33,  33,  33,   6,   6,   6,   6,   6,   6,   6,   6,   4,  44,  56, 290,
-     33,  33,  33,  33,   6, 118,   6,   6,   6,   6,  61, 434, 435,  33,  33,  33,
-     61, 184,   6,   6,   6,   6,  25, 436, 437,  33,  61,  50,   6,   6,   6,   6,
-      6, 438,   0, 439, 440,  33,  33,  33,   6,   6,   6,   6,   6,   6,   6,  89,
-      6,  66,   6,   6,   6, 176, 180,   0, 441,  33,   4,  44,   6, 139, 442,   6,
-      6,   6, 434,   0,   0,  30, 180,  33,  33,  33,  33,  33,  33,  33,  33,  33,
-     28,  24,   6,   6,   6,   6, 443, 444, 445,  33,   4, 165,  45,  66,   6,   6,
-      6, 446, 194,  89,   4, 165,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,
-     33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,   6,   6, 447,  89,
-     33,  33,  33,  33,  33,  33,  33,  33,   6,   6,   6, 448, 449,   6, 155, 450,
-      6,   6,   6, 155,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,
-      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,  28, 451,  33,
-      6,   6,   6,   6,   6,   6,   6,   6, 182,  33,  33,  33,  33,  33,  33,  33,
-      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6, 452,   6,   6,   6,   6,
-    453, 454,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,
-      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6, 455,
-      6,   6,   6,   6,   6,  28, 456, 457,  33,  33,  33,  33,  33,  33,  33,  33,
-      6,   6,   6,   6,   6,   6,   6,   6,   6, 282,   6,   6,   6,   6,   6,   6,
-      6,   6,   6,   6,   6,   6,   6,   6,  28,  33,  33,  33,  33,  33,  33,  33,
-      6,   6,   6,   6,   6,   6,   6,  89,   6,   6,   6,  28,   4, 458,  33,  33,
-     33,  33,  33,  33,  33,  33,  33,  33,  33,  33,   6,   6,   6,  58, 459,  33,
-      6,   6,   6,   6,   6,   6, 140, 460, 461,  33,   4, 462,  24,   6,   6, 393,
-      6,   6,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,
-     33,  33,  33,  33,  33,  33,  33,  33,   6,   6,   6,   6,   6,   6,   6,   6,
-      6,   6, 463, 464,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,
-      6,   6,   6,   6,   6,   6,   6,   6,   6, 465,  61,   0,   0,   0,   0,   0,
-      0,  71, 184,   6,  33,  33,  33,  33,  33,  33,  33,  33, 466,  33,  33,  33,
-    267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267,  33,
-    267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 324,  33,
-    267, 267, 267, 323,  33,  33,  33,  33,  33,  33, 467,  33, 468,  33, 267, 267,
-    267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 303,
-      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,  56,   6, 139,
-      6,  89,   6, 469, 170,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,
-      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,  58,  33,
-      6,   6,   6,   6,  28,  27,   6,   6,   6,   6,   6,   6, 142, 470,   0,   0,
-    471,  50,   6,   6,   6, 472,   6,   6,   6,   6,   6,   6,   6,  89,  33,  33,
-      6,   6,   6,   6,   6,   6,   6,   6, 473,  33,  33,  33,  33,  33,  33,  33,
-     33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,   6,   6, 182,  33,
-      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,  28,  33,   6,   6,   6,  89,
-      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,  57,   6,   6,   6,   6,   6,
-      6,   6,   6,  57, 474, 475,   6, 476, 109,   6,   6,   6,   6,   6,   6,   6,
-     45, 189,  57,  57,   6,   6,   6, 477, 478, 118,  66,   6,   6,   6,   6,   6,
-      6,   6,   6,   6,  58,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,
-      6,   6,   6,   6,   6,   6,   6,   6,   6, 479,   4,   4,   4,   4,   4,   4,
-      0,   0,   0,   0,   0,   0, 423,  25,   0,   0,   0,   0,   0, 103, 480,   6,
-    481, 482,  33,  59,  30,   0,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,
-    180,   0,   0, 483, 484, 394,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,
-      6,   6,   6,   6,   6, 139, 423,  58,   4, 343,  33,  33,  33,  33,  33,  33,
-     33,  33,  33,  33,  33,  33,  33,  33,   6,   6,   6,   6,   6, 181,   4, 485,
-      6,   6,   6,   6,   6,   6,   6,   6,  64,   6, 180,  33,  33,  33,  33,  33,
-      6,   6,   6,   6,   6,   6,   6,   6, 181, 433,   4, 486,  33,  33,  33,  33,
-     33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  27,   6,
-      6,   6,   6,   6,   6, 487, 488,  33,  33,  33,  33,  33,  33,  33,  33,  33,
-     27,   6,   6,   6,   6,   6,   6,  58,  33,  33,  33,  33,  33,  33,  33,  33,
-    109,   6,   6,   6, 489,  27, 490, 491, 492, 493, 489, 195, 489, 490, 490,  83,
-      6,  24,   6, 182, 494,  24,   6, 182,  33,  33,  33,  33,  33,  33, 155,  33,
-    227, 495, 227, 227, 227, 496, 227, 227, 227, 227, 227, 227, 227, 497, 227, 227,
-    227, 227, 227, 227, 227, 495, 267, 267, 267, 267, 267, 267, 498, 499, 499, 499,
-    500, 267, 267, 501, 267, 267, 502, 503, 504, 505, 267, 267, 267, 267, 267, 506,
-    267, 267, 267, 267, 267, 267, 267, 267, 507, 508, 509, 267, 510, 508, 508, 511,
-    512, 513, 514, 267, 515, 516, 517, 267, 267, 267, 267, 267, 267, 267, 267, 267,
-    264, 267, 518,   6, 266, 267, 519,   6,   6, 520, 267, 267, 267, 267, 521, 522,
-    267, 267, 523, 267, 267, 267, 267, 267, 267, 267, 249, 524, 267, 267, 249, 520,
-    267, 267, 267, 267, 267, 267, 267, 267, 525, 526,   6,   6,   6,   6, 527, 528,
-    267, 267, 267, 267, 529, 267, 530, 267, 509, 531, 267, 267, 267, 267, 267, 267,
-      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6, 524, 267,
-      6,   6,   6,   6,   6,   6,   6,   6,   6,   6, 266, 267, 267, 267, 267, 267,
-      6, 524,   6,   6,   6,   6,   6,   6,   6, 267,   6, 520,   6,   6,   6,   6,
-      6, 267,   6,   6,   6, 532, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267,
-      6, 533, 267, 508, 534, 267, 508, 535, 267, 267, 267, 267, 267, 267, 267, 267,
-    267, 267, 267, 267, 267, 267, 536, 537, 267, 525, 538, 539, 267, 267, 267, 267,
-      6,   6,   6,   6,   6,   6,   6,   6,   6,   6, 524, 267, 267, 267, 267, 267,
-    267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 304,
-     82,  33,  33,  33,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  33,  33,
+/* Terminal_Punctuation. */
+static RE_UINT8 re_terminal_punctuation_table_1[] = {
+     0,  1,  2,  3,  4,  5,  6,  7,  8,  9,  9, 10, 11,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9, 12, 13,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9, 14,
+    15,  9, 16, 17, 18, 19, 20, 21,  9, 22,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9, 23, 24,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9, 25,
+     9,  9,  9,  9,  9,  9, 26,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9
 };
 
-static RE_UINT8 re_line_break_stage_4[] = {
-    16, 16, 16, 16, 16, 16, 16, 16, 16, 18, 22, 20, 20, 21, 16, 16,
-    19,  6,  3, 12,  9, 10, 12,  3,  1, 36, 12,  9,  8, 15,  8,  7,
-    11, 11, 11, 11, 11, 11, 11, 11, 11, 11,  8,  8, 12, 12, 12,  6,
-    12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,  1,  9, 36, 12, 12,
-    12, 12, 12,  1, 18,  2, 12, 16, 16, 16, 16, 16, 16, 29, 16, 16,
-     4,  1, 10,  9,  9,  9, 12, 25, 25, 12, 25,  3, 12, 18, 12, 12,
-    10,  9, 25, 25, 17, 12, 25, 25, 25, 25, 25,  3, 25, 25, 25,  1,
-    12, 12, 12, 12, 12, 12, 12, 25, 17, 25, 25, 25, 17, 25, 12, 12,
-    25, 12, 12, 12, 12, 12, 12, 12, 25, 25, 25, 25, 12, 25, 12, 17,
-    16, 16, 16, 16, 16, 16, 16,  4, 16, 16, 16, 16,  4,  4,  4,  4,
-     4,  4,  4, 16, 16, 16, 16, 16,  0,  0, 12, 12, 12, 12,  8, 12,
-     0,  0,  0,  0, 12, 12, 12, 12, 12, 12, 12,  0, 12,  0, 12, 12,
-    12, 12,  0, 12, 12, 12, 12, 12, 12, 12, 12, 16, 16, 16, 16, 16,
-    16, 16, 12, 12, 12, 12, 12, 12,  0, 12, 12, 12, 12, 12, 12, 12,
-    12, 12, 12, 12, 12, 12, 12,  0, 12,  8, 18,  0,  0, 12, 12,  9,
-     0, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 18, 16,
-    12, 16, 16, 12, 16, 16,  6, 16,  0,  0,  0,  0,  0,  0,  0,  0,
-    37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,  0,  0,  0,  0, 37,
-    37, 37, 37, 12, 12,  0,  0,  0, 12, 10, 10, 10,  8,  8, 12, 12,
-    16, 16, 16,  6, 16,  0,  6,  6, 11, 11, 10, 11, 11, 12, 12, 12,
-    16, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,  6, 12, 16, 16,
-    16, 16, 16, 16, 16, 12, 12, 16, 16, 12, 16, 16, 16, 16, 12, 12,
-    11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,  0, 12,
-    12, 16, 12, 12, 12, 12, 12, 12, 16, 16, 16,  0,  0, 12, 12, 12,
-    12, 12, 12, 12, 12, 12, 16, 16, 16, 12,  0,  0,  0,  0,  0,  0,
-    16, 16, 16, 16, 12, 12, 12, 12,  8,  6, 12,  0,  0, 16,  9,  9,
-    16, 16, 12, 16, 16, 16, 16, 16, 16, 16, 16, 16, 12, 16, 16, 16,
-    12, 16, 16, 16, 16, 16,  0,  0, 12, 16, 16, 16,  0,  0, 12,  0,
-    12, 12, 12,  0,  0,  0,  0,  0, 12, 12, 12, 12, 12,  0, 12, 12,
-    12, 12, 12, 12, 12, 12,  0,  0,  0,  0,  0, 16, 16, 16, 16, 16,
-    12, 12, 16, 16, 16, 12, 16, 16, 12, 16, 16, 16, 16, 16, 16, 16,
-    12, 12, 16, 16, 18, 18, 11, 11, 12, 16, 16, 16,  0, 12, 12, 12,
-    12, 12, 12, 12, 12,  0,  0, 12, 12,  0,  0, 12, 12, 12, 12, 12,
-    12,  0, 12, 12, 12, 12, 12, 12, 12,  0, 12,  0,  0,  0, 12, 12,
-    12, 12,  0,  0, 16, 12, 16, 16, 16, 16, 16, 16, 16,  0,  0, 16,
-    16,  0,  0, 16, 16, 16, 12,  0,  0,  0,  0,  0,  0,  0,  0, 16,
-     0,  0,  0,  0, 12, 12,  0, 12, 12, 12, 16, 16,  0,  0, 11, 11,
-    12, 12, 10, 10, 12, 12, 12, 12, 12, 10, 12,  9, 12, 12, 16,  0,
-     0, 16, 16, 16,  0, 12, 12, 12, 12, 12, 12,  0,  0,  0,  0, 12,
-    12,  0, 12, 12,  0, 12, 12,  0, 12, 12,  0,  0, 16,  0, 16, 16,
-    16, 16, 16,  0,  0,  0,  0, 16, 16,  0,  0, 16, 16, 16,  0,  0,
-     0, 16,  0,  0,  0,  0,  0,  0,  0, 12, 12, 12, 12,  0, 12,  0,
-     0,  0,  0,  0,  0,  0, 11, 11, 16, 16, 12, 12, 12, 16, 12,  0,
-    12,  0, 12, 12,  0, 12, 12, 12, 16, 16, 16, 16, 16, 16,  0, 16,
-    16, 16,  0, 16, 16, 16,  0,  0, 12,  0,  0,  0,  0,  0,  0,  0,
-    12,  9,  0,  0,  0,  0,  0,  0,  0, 12, 16, 16, 16, 16, 16, 16,
-     0,  0,  0,  0,  0,  0, 16, 16,  0,  0, 16, 12,  0, 12, 12, 12,
-    12, 12, 12,  0,  0,  0, 12, 12, 12,  0, 12, 12, 12, 12,  0,  0,
-     0, 12, 12,  0, 12,  0, 12, 12,  0,  0,  0, 12, 12,  0,  0,  0,
-    12, 12,  0,  0,  0,  0, 16, 16, 16, 16, 16,  0,  0,  0, 16, 16,
-    16,  0, 16, 16, 16, 16,  0,  0, 12,  0,  0,  0,  0,  0,  0, 16,
-    12,  9, 12,  0,  0,  0,  0,  0, 16, 16, 16, 16, 16, 12, 12, 12,
-    12, 12,  0,  0,  0, 12, 16, 16, 16, 16, 16, 16, 16,  0, 16, 16,
-     0,  0,  0,  0,  0, 16, 16,  0,  0,  0,  0,  0,  0,  0,  0, 17,
-    12, 16, 16, 16, 17, 12, 12, 12, 12, 12, 12, 12,  0, 12, 12, 12,
-     0,  0,  0,  0,  0,  0, 12,  0,  0, 12, 12,  0,  0,  0,  0,  0,
-    16, 16, 16, 16,  0, 12, 12, 12, 12, 12, 12, 16, 16, 12, 16, 16,
-    16,  0, 16, 16, 16, 16, 12, 12,  0,  0,  0,  0, 12, 12, 12, 16,
-    12, 10, 12, 12, 12, 12, 12, 12,  0,  0, 16, 16,  0, 12, 12, 12,
-     0,  0, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,  0, 12,  0,  0,
-     0,  0, 16,  0,  0,  0,  0, 16, 16, 16, 16, 16, 16,  0, 16,  0,
-     0,  0, 16, 16, 12,  0,  0,  0,  0, 24, 24, 24, 24, 24, 24, 24,
-    24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,  0,  0,  0,  0,  9,
-    24, 24, 24, 24, 24, 24, 24, 12, 11, 11, 18, 18,  0,  0,  0,  0,
-     0, 24, 24,  0, 24,  0, 24, 24, 24, 24, 24,  0, 24, 24, 24, 24,
-    24, 24, 24, 24,  0, 24,  0, 24, 24, 24, 24, 24, 24, 24,  0,  0,
-    24, 24, 24, 24, 24,  0, 24,  0, 11, 11,  0,  0, 24, 24, 24, 24,
-    12, 17, 17, 17, 17, 12, 17, 17,  4, 17, 17, 18,  4,  6,  6,  6,
-     6,  6,  4, 12,  6, 12, 12, 12, 12, 12, 12, 12, 18, 16, 12, 16,
-    12, 16,  1,  2,  1,  2, 16, 16, 12, 12, 12, 12, 12,  0,  0,  0,
-    16, 16, 16, 16, 16, 16, 16, 18, 16, 16, 16, 16, 16, 18, 16, 16,
-    12, 12, 12, 12, 12, 16, 16, 16, 16, 16, 16, 16, 16,  0, 18, 18,
-    12, 12, 12, 12, 12, 12, 16, 12, 17, 17, 18, 17, 12, 12, 12, 12,
-    12,  4,  4,  0,  0,  0,  0,  0, 11, 11, 18, 18, 12, 12, 12, 12,
-    11, 11, 24, 24, 24, 24, 24, 24,  0,  0,  0,  0,  0, 12,  0,  0,
-    31, 31, 31, 31, 31, 31, 31, 31, 32, 32, 32, 32, 32, 32, 32, 32,
-    33, 33, 33, 33, 33, 33, 33, 33, 12, 12, 12,  0,  0, 16, 16, 16,
-    12, 18, 12, 12, 12, 12, 12, 12, 12, 12,  0,  0,  0,  0,  0,  0,
-    18, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,  1,  2,  0,  0,  0,
-    12, 12, 12, 18, 18, 18, 12, 12, 12, 12, 16, 16, 16,  0,  0,  0,
-    12, 12, 16, 16, 16, 18, 18,  0, 12, 12, 16, 16,  0,  0,  0,  0,
-    12,  0, 16, 16,  0,  0,  0,  0, 24, 24, 24, 24, 18, 18,  5, 24,
-    18, 12, 18,  9, 24, 24,  0,  0, 11, 11,  0,  0,  0,  0,  0,  0,
-    12, 12,  6,  6, 18, 18, 17, 12,  6,  6, 12, 16, 16, 16,  4,  0,
-    12, 12, 12, 12, 12, 16, 16, 12, 12, 16, 12,  0,  0,  0,  0,  0,
-    16, 16, 16, 16,  0,  0,  0,  0, 12,  0,  0,  0,  6,  6, 11, 11,
-    24, 24, 24, 24, 24,  0,  0,  0, 24, 24, 24, 24,  0,  0,  0,  0,
-    24, 24,  0,  0,  0,  0,  0,  0, 11, 11, 24,  0,  0,  0, 24, 24,
-    12, 12, 12, 12, 12, 12, 12, 16, 16, 16, 16, 16,  0,  0, 12, 12,
-    24, 24, 24, 24, 24, 24, 24,  0, 24, 24, 24, 24, 24,  0,  0, 16,
-    16, 16, 16, 16, 16, 16, 16,  0, 12, 12, 12, 12, 16, 16, 16, 16,
-    12, 12, 12, 12,  0,  0,  0,  0, 11, 11, 18, 18, 12, 18, 18, 18,
-    16, 16, 16, 12, 12, 12, 12, 12, 16, 16, 16, 16, 16, 16, 12, 12,
-     0,  0,  0, 18, 18, 18, 18, 18, 11, 11,  0,  0,  0, 12, 12, 12,
-    12, 12, 12, 12, 12, 12, 18, 18, 12, 12, 12,  0,  0, 12, 12, 12,
-    16, 16, 16, 12, 16, 16, 16, 16, 16, 12, 12, 12, 12, 16, 12, 12,
-    12, 12, 12, 12, 16, 12, 12, 16, 16, 16, 12,  0,  0,  0,  0,  0,
-    16, 16,  0, 16, 16, 16, 16, 16,  0, 12,  0, 12,  0, 12,  0, 12,
-    12, 12, 12, 12,  0,  0, 12, 12,  0,  0, 12, 12, 12,  0, 12, 12,
-    12, 12, 12, 12, 12, 17, 12,  0, 18, 18, 18, 18, 18, 18, 18,  4,
-    18, 18, 18, 28, 16, 42, 16, 16, 18,  4, 18, 18, 26, 25, 25, 12,
-     3,  3,  1,  3,  3,  3,  1,  3, 25, 25, 12, 12, 14, 14, 14, 18,
-    20, 20, 16, 16, 16, 16, 16,  4, 10, 10, 10, 10, 10, 10, 10, 10,
-    12,  3,  3, 25,  5,  5, 12, 12, 12, 12, 12, 12,  8,  1,  2,  5,
-     5,  5, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 18, 12,
-    18, 18, 18, 18, 12, 18, 18, 18, 30, 12, 12, 12, 12,  0, 16, 16,
-    12, 12,  0,  0, 25, 12, 12, 12, 12, 12, 12, 12, 12,  1,  2, 25,
-    12, 25, 25, 25, 25, 12, 12, 12, 12, 12, 12, 12, 12,  1,  2,  0,
-     9,  9,  9,  9,  9,  9,  9, 10,  9,  9,  9,  9,  9,  9,  9,  9,
-     9,  9,  9,  9,  9,  9, 10,  9,  9,  9,  9, 10,  9,  9, 10,  9,
-    16,  0,  0,  0,  0,  0,  0,  0, 12, 12, 12, 10, 12, 25, 12, 12,
-    12, 12, 12, 25, 12, 12,  9, 12, 12, 25, 25, 12, 12, 12, 12, 12,
-    12, 12, 12, 25, 12, 12, 12, 12, 12, 12, 12, 12, 25, 25, 12, 12,
-    12, 12, 12, 25, 12, 12, 25, 12, 25, 25, 25, 25, 25, 25, 25, 25,
-    25, 25, 25, 25, 12, 12, 12, 12, 25, 25, 12, 12, 12, 12, 12, 12,
-    12, 25, 12, 12,  0,  0,  0,  0, 12, 12, 25, 12, 25, 12, 12, 12,
-    25, 12, 25, 25, 12, 12, 12, 25, 25, 12, 12, 25, 12, 12, 12, 25,
-    12, 25,  9,  9, 12, 25, 12, 12, 12, 12, 25, 12, 12, 25, 25, 25,
-    25, 12, 12, 25, 12, 25, 12, 25, 25, 25, 25, 25, 25, 12, 25, 12,
-    12, 12, 12, 12, 25, 25, 25, 25, 25, 12, 12, 12, 25, 12, 12, 12,
-    12, 12, 25, 12, 12, 12, 12, 12, 25, 25, 12, 12, 25, 25, 25, 25,
-    12, 12, 25, 25, 12, 12, 25, 25, 12, 12, 12, 12, 12, 25, 12, 12,
-    12, 25, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 14,
-     1,  2,  1,  2, 12, 12, 12, 12, 12, 12, 13, 13, 12, 12, 12, 12,
-    12,  1,  2, 12, 12, 12, 12, 12, 13, 13, 13, 13, 12, 12, 12, 12,
-    25, 25, 25, 25, 25, 25, 25, 12, 25, 25, 25, 25, 25, 12, 12, 12,
-    12, 12, 25, 25, 25, 25, 12, 12, 25, 25, 12, 25, 25, 25, 25, 25,
-    25, 25, 12, 12, 12, 12, 25, 25, 25, 12, 12, 25, 12, 12, 25, 25,
-    13, 13, 13, 13, 12, 25, 25, 12, 12, 25, 12, 12, 12, 12, 25, 25,
-    12, 12, 12, 12, 13, 13, 25, 25, 13, 12, 13, 13, 13, 40, 13, 13,
-    12, 13, 13, 13, 12, 12, 12, 12, 25, 12, 25, 12, 12, 12, 12, 12,
-    25, 25, 12, 25, 25, 25, 12, 25, 13, 25, 25, 12, 25, 25, 12, 25,
-    12, 12, 12, 12, 12, 12, 12, 13, 12, 12, 12, 12, 12, 12, 25, 25,
-    12, 12, 12, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-    13, 25, 25, 25, 25, 13, 12, 13, 13, 13, 25, 13, 13, 25, 25, 25,
-    13, 13, 25, 25, 13, 25, 25, 13, 13, 13, 12, 25, 12, 12, 12, 12,
-    25, 25, 13, 25, 25, 25, 25, 25, 25, 13, 13, 13, 13, 13, 25, 13,
-    13, 40, 13, 25, 25, 13, 13, 13, 13, 13, 13, 13, 13, 12, 12, 12,
-    13, 13, 40, 40, 40, 40, 12, 12, 12, 12, 12,  3,  3,  3,  3,  3,
-     3, 12,  6,  6, 13, 12, 12, 12,  1,  2,  1,  2,  1,  2,  1,  2,
-     1,  2,  1,  2,  1,  2, 25, 25, 12, 12, 12, 12, 12,  1,  2, 12,
-    12, 12, 12, 12, 12, 12,  1,  2, 12, 12, 12,  1,  2,  1,  2,  1,
-     2,  1,  2,  1,  2,  1,  2,  1,  2, 12, 12, 12, 12, 12, 12, 12,
-    12, 12, 12, 12,  1,  2, 12, 12, 12, 12, 12, 12, 12, 25, 25, 25,
-    16, 16, 12, 12,  0,  0,  0,  0,  0,  6, 18, 18, 18, 12,  6, 18,
-     0,  0,  0,  0,  0,  0,  0, 12, 18,  0,  0,  0,  0,  0,  0,  0,
-     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3, 18, 18,
-    18, 18, 18, 18, 18, 18, 12, 18,  1, 18, 12, 12,  3,  3, 12, 12,
-     3,  3,  1,  2,  1,  2,  1,  2,  1,  2, 18, 18, 18, 18,  6, 12,
-    18, 18, 12, 18, 18, 12, 12, 12, 12, 12, 26, 26, 18, 18, 18, 12,
-    18, 18,  1, 18, 18, 18, 18, 18, 18, 18, 18, 12, 18, 12, 18, 18,
-    13, 13,  0, 13, 13, 13, 13, 13, 13, 13, 13, 13,  0,  0,  0,  0,
-    13, 13, 13, 13, 13, 13,  0,  0, 18,  2,  2, 13, 13,  5, 13, 13,
-     1,  2, 13, 13,  1,  2,  1,  2,  1,  2,  1,  2,  5,  1,  2,  2,
-    13, 13, 16, 16, 16, 16, 16, 16, 13, 13, 13, 13, 13, 16, 13, 13,
-    13, 13, 13,  5,  5, 13, 13, 13,  0, 38, 13, 38, 13, 38, 13, 38,
-    13, 38, 13, 13, 13, 13, 13, 13, 13, 13, 13, 38, 13, 13, 13, 13,
-    13, 13, 13, 38, 13, 38, 13, 38, 13, 13, 13, 13, 13, 13, 38, 13,
-    13, 13, 13, 13, 13, 38, 38,  0,  0, 16, 16,  5,  5,  5,  5, 13,
-     5, 38, 13, 38, 13, 38, 13, 38, 13, 13, 13, 13, 13, 38, 38, 13,
-    13, 13, 13,  5, 38,  5,  5, 13,  0,  0,  0,  0,  0, 13, 13, 13,
-     0, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,  0,
-    13, 13, 13,  0,  0,  0,  0,  0, 38, 38, 38, 38, 38, 38, 38, 38,
-    13, 13, 13, 13, 13,  5, 13, 13, 13, 13, 13, 13, 13,  0,  0,  0,
-    12, 12, 12, 12, 12, 18,  6, 18, 11, 11, 12, 12,  0,  0,  0,  0,
-    16, 16, 12, 18, 18, 18, 18, 18,  0,  0, 12, 12, 12, 12, 12,  0,
-    12, 12, 16, 12, 12, 12, 16, 12, 12, 12, 12, 16, 12, 12, 12, 12,
-    10, 12,  0,  0,  0,  0,  0,  0, 12, 12, 12, 12, 17, 17,  6,  6,
-    16, 16, 16, 16, 16, 16,  0,  0,  0,  0,  0,  0,  0,  0, 18, 18,
-    12, 12, 12, 12, 17, 12, 12, 16, 16, 16, 16, 16, 16, 16, 18, 18,
-    31, 31, 31, 31, 31,  0,  0,  0, 16, 12, 12, 12, 12, 12, 12, 18,
-    18, 18, 12, 12, 12, 12,  0, 12, 11, 11,  0,  0,  0,  0, 12, 12,
-    11, 11, 24, 24, 24, 24, 24,  0, 12, 12, 12, 12, 16, 16,  0,  0,
-    11, 11,  0,  0, 12, 18, 18, 18, 24, 24, 24,  0,  0,  0,  0,  0,
-     0,  0,  0, 24, 24, 24, 24, 24, 18, 18, 12, 12, 12, 16, 16,  0,
-     0, 12, 12, 12, 12, 12, 12,  0, 16, 16, 16, 18, 16, 16,  0,  0,
-    34, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
-    35, 35, 35, 35, 34, 35, 35, 35, 35, 35, 35, 35,  0,  0,  0,  0,
-    32, 32, 32, 32, 32, 32, 32,  0,  0,  0,  0, 33, 33, 33, 33, 33,
-    33, 33, 33, 33,  0,  0,  0,  0, 27, 27, 27, 27, 27, 27, 27, 27,
-     0,  0,  0, 12, 12, 12, 12, 12,  0,  0,  0,  0,  0, 37, 16, 37,
-    37, 12, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,  0,
-    37, 37, 37, 37, 37,  0, 37,  0, 37, 37,  0, 37, 37,  0, 37, 37,
-    12, 12, 12, 12, 12, 12,  2,  1, 12, 12, 12, 12, 10, 12,  0,  0,
-     8,  2,  2,  8,  8,  6,  6,  1,  2, 14,  0,  0,  0,  0,  0,  0,
-    13, 13, 13, 13, 13,  1,  2,  1,  2,  1,  2,  1,  2, 13, 13,  1,
-     2, 13, 13, 13, 13, 13, 13, 13,  2, 13,  2,  0,  5,  5,  6,  6,
-    13,  1,  2,  1,  2,  1,  2, 13, 13,  9, 10, 13,  0,  0,  0,  0,
-    12, 12, 12, 12, 12,  0,  0, 30,  0,  6, 13, 13,  9, 10, 13, 13,
-     1,  2, 13, 13,  2, 13,  2, 13, 13, 13,  5,  5, 13, 13, 13,  6,
-    13, 13, 13,  1, 13,  2, 13, 13, 13, 13, 13,  1, 13,  2, 13,  1,
-     2,  2,  1,  2,  2,  5, 13, 38, 38, 13, 13, 13, 13, 13, 13, 13,
-    13, 13, 13, 13, 13, 13,  5,  5,  0,  0, 13, 13, 13, 13, 13, 13,
-     0,  0, 13, 13, 13,  0,  0,  0, 10,  9, 13, 13, 13,  9,  9,  0,
-     0, 16, 16, 16, 23, 25,  0,  0, 12, 12, 12,  0, 12, 12,  0, 12,
-    18, 18, 18,  0,  0,  0,  0, 12, 12, 12, 12, 12,  0,  0,  0, 12,
-    12, 12, 12, 12, 12, 16,  0,  0,  0,  0,  0,  0,  0, 12, 12, 12,
-    16, 16, 16,  0,  0,  0,  0,  0, 12, 12, 12, 12, 12, 12,  0, 18,
-    18, 12, 12, 12, 12, 12,  0,  0, 12,  0,  0,  0, 12,  0,  0, 12,
-    12, 12, 12,  0, 12, 12,  0,  0, 12, 12, 12, 12,  0,  0,  0, 18,
-    12, 12,  0,  0,  0,  0,  0, 12, 12, 16, 16, 16,  0, 16, 16,  0,
-     0,  0,  0,  0, 16, 16, 16, 16, 18, 18, 18, 18, 18, 18, 18, 18,
-    12, 12, 12, 12, 12, 16, 16,  0, 18, 18, 18, 18, 18, 18, 14,  0,
-     0, 18, 18, 18, 18, 18, 18, 18,  0, 12, 12, 12, 12,  0,  0,  0,
-    12, 12, 12, 12, 12, 12, 11, 11, 16, 16, 16, 12, 12, 12, 18, 18,
-    18, 18,  0,  0,  0,  0,  0,  0, 16, 16, 16, 16, 16,  0, 11, 11,
-    18, 18, 18, 18, 12, 16, 16,  0, 12, 12, 12, 16, 12, 17, 12,  0,
-    16, 12, 12, 12, 12, 18, 18, 12, 18, 16, 16, 16, 16, 12,  0,  0,
-    11, 11, 12, 17, 12, 18, 18, 18, 18, 18, 12, 18, 18, 12, 16,  0,
-    12,  0, 12, 12, 12, 12,  0, 12, 12, 18,  0,  0,  0,  0,  0,  0,
-    12, 12,  0, 16, 16, 12, 16, 16, 12, 12, 16, 16,  0,  0, 16, 16,
-    16, 16, 16, 16, 16,  0,  0,  0, 16, 16, 16, 16, 16, 16, 16, 12,
-    12, 12, 12, 18, 18, 18, 18, 12, 11, 11,  0, 18,  0, 12, 16, 12,
-    16, 17, 18, 18,  6,  6, 12, 12, 12, 18, 18, 18, 18, 18, 18, 18,
-    16, 18, 18, 12, 12,  0,  0,  0, 17, 17, 17, 17, 17, 17, 17, 17,
-    17, 17, 17, 17, 17,  0,  0,  0, 24, 24, 24,  0,  0, 24, 24, 24,
-    11, 11, 24, 24, 18, 18, 18, 24, 16, 16, 16, 12,  0,  0,  0,  0,
-     0,  0, 16, 16, 16, 16, 16, 16, 16, 12, 17, 12, 16,  0,  0,  0,
-    16, 16, 12, 16, 16, 16, 16, 17, 12, 18, 18, 18, 18, 17, 12, 16,
-    12, 12, 16, 16, 16, 16, 16, 16, 16, 16, 18, 18, 18, 12, 17, 17,
-    17, 18, 18,  0,  0,  0,  0,  0, 12, 18, 18, 18, 18, 18,  0,  0,
-    17,  6, 12, 12, 12, 12, 12, 12, 12, 16, 16, 16, 16, 16, 16,  0,
-     0,  0, 16,  0, 16, 16,  0, 16, 16, 16, 16, 16, 16, 16, 12, 16,
-    12, 12, 16, 16, 16, 16, 16,  0, 12, 12, 12, 16, 16, 16, 16, 12,
-    12, 12, 12, 12, 12, 10, 10, 10, 10, 12, 12, 12, 12, 12, 12, 12,
-     0,  0,  0,  0,  0,  0,  0, 18, 18, 18, 18, 18, 18,  0,  0,  0,
-     1,  1,  1,  2,  2,  2, 12, 12, 12, 12,  2, 12, 12, 12,  1,  2,
-     1,  2, 12, 12, 12, 12, 12, 12, 12,  1,  2,  2, 12, 12, 12, 12,
-     4,  4,  4,  4,  4,  4,  4,  1,  2,  0,  0,  0,  0,  0,  0,  0,
-    11, 11,  0,  0,  0,  0, 18, 18, 16, 16, 16, 16, 16, 18,  0,  0,
-    18, 18, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 18, 12,  0,  0,
-    11, 11,  0, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 18,
-    18, 12, 12,  0,  0,  0,  0,  0, 12, 12, 12,  0,  0,  0,  0, 16,
-     5,  5,  5,  5,  0,  0,  0,  0, 38, 38, 38,  0,  0,  0,  0,  0,
-     0,  0,  0,  0, 38, 38, 38, 38, 12, 12,  0,  0, 12, 16, 16, 18,
-    16, 16, 12, 12, 12, 16, 16, 16, 16, 16, 16, 12, 12, 16, 16, 16,
-    12, 12, 16, 16, 16, 16, 12, 12, 12, 12, 16, 16, 16, 12,  0,  0,
-     0,  0, 12,  0,  0, 12, 12,  0,  0, 12, 12, 12, 12,  0, 12, 12,
-    12, 12,  0, 12,  0, 12, 12, 12, 12, 12,  0, 12, 12, 12, 12,  0,
-    12, 12, 12, 12, 12,  0, 12,  0, 12, 12, 12, 12,  0,  0, 11, 11,
-    12, 12, 12, 12, 12, 16, 12, 12, 12, 12, 12, 12, 16, 12, 12, 18,
-    18, 18, 18, 12,  0,  0,  0,  0, 16,  0,  0, 16, 16, 16, 16, 16,
-    16, 16,  0, 16, 16,  0, 16, 16, 11, 11,  0,  0,  0,  0,  0,  9,
-    11, 11,  0,  0,  0,  0,  1,  1, 12, 12, 12, 12, 10, 12, 12, 12,
-    10, 12, 12, 12, 12,  0,  0,  0,  0, 12, 12,  0, 12,  0,  0, 12,
-    12, 12, 12,  0, 12, 12, 12, 12,  0, 12,  0, 12,  0,  0,  0,  0,
-     0,  0, 12,  0,  0,  0,  0, 12,  0, 12,  0, 12,  0, 12, 12, 12,
-     0, 12, 12, 12,  0, 12, 12, 12, 25, 25, 25, 25, 25, 13, 13, 13,
-    25, 25, 25, 25, 25, 25, 12, 12, 25, 25, 12, 12, 12, 13, 13, 13,
-    13, 13, 13, 13, 13, 13, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39,
-    13, 13, 13, 13, 13, 40, 13, 13, 13, 13, 13, 13, 12, 12, 13, 13,
-    13, 13, 13, 13, 13, 12, 12, 13, 13, 13, 13, 13, 12, 13, 13, 13,
-    13, 13, 40, 40, 40, 13, 13, 40, 13, 13, 40, 40, 40, 13, 13, 13,
-    13, 13, 13, 41, 41, 41, 41, 41, 13, 13, 40, 40, 13, 13, 40, 40,
-    40, 40, 40, 40, 40, 40, 40, 40, 40, 13, 13, 13, 13, 13, 13, 13,
-    13, 13, 13, 13, 13, 13, 40, 40, 40, 13, 13, 13, 40, 13, 13, 13,
-    13, 40, 40, 40, 13, 40, 40, 40, 13, 13, 13, 13, 13, 13, 13, 40,
-    13, 40, 13, 13, 13, 13, 13, 13, 12, 13, 12, 13, 12, 13, 13, 13,
-    13, 13, 40, 13, 13, 13, 13, 12, 13, 12, 12, 13, 13, 13, 13, 13,
-    13, 13, 13, 13, 13, 13, 13, 12, 13, 13, 12, 12, 12, 12, 12, 12,
-    12, 12, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 40, 40, 13, 13,
-    13, 13, 40, 13, 13, 13, 13, 13, 40, 13, 13, 13, 13, 40, 40, 13,
-    12, 12, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13, 13, 40, 40, 40,
-    13, 13, 13, 40, 40, 40, 40, 40, 12, 12, 12, 12, 12, 12,  3,  3,
-     3,  5,  5,  5, 12, 12, 12, 12, 13, 13, 13, 40, 13, 13, 13, 13,
-    13, 13, 13, 13, 40, 40, 40, 13, 13, 13, 13, 13, 40, 13, 13, 13,
-    12, 12, 12, 12, 12, 12, 13, 13, 12, 12, 12, 12, 13, 13, 13, 40,
-    13, 13, 13, 13, 13, 13, 40, 13, 40, 40, 13, 13, 40, 40, 40, 13,
-    13, 13, 13, 13, 13, 40, 40, 13, 40, 40, 13, 40, 13, 13, 13, 13,
-    13, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 13, 13,
+static RE_UINT8 re_terminal_punctuation_table_2[] = {
+     0,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  2,  3,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  4,  0,  5,  0,
+     6,  0,  0,  0,  0,  0,  7,  0,  8,  0,  0,  0,  0,  0,  0,  9,
+     0, 10,  2,  0,  0,  0,  0,  0,  0,  0,  0, 11,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0, 12,  0,  0,  0,  0,  0, 13,  0,  0,  0,  0,  0,  0,  0,
+     0,  0, 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 15,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0, 16,  0,  0,  0, 17,  0, 18,  0,  0,  0,  0, 19,  0,
+    20,  0,  0,  0,  0,  0,  0,  0,  0,  0, 11,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0, 21,  0,  0,  0,  0, 22,  0,  0,  0,  0,  0,
+     0, 23,  0, 24,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0, 25, 26,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0, 27, 28,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    29,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0, 24,  0,  0,  0,  0,  0,  0,  0,  0,
+    30,  0,  0,  0,  0,  0,  0, 31,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0, 32,  0,  0, 33,  0,  0, 34,  0,  0,  0,  0, 26,  0,
+     0,  0, 35,  0,  0,  0, 36, 37,  0,  0,  0,  0,  0,  0,  0, 38,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0, 39,  0,  0,  0,  0,  0,  1,  0,  0, 40,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 36,  0, 41,  0,
+     0,  0, 42,  0,  0,  0,  0,  0, 36,  0,  0,  0,  0,  0,  0,  0,
+     0,  0, 32,  0,  0,  0,  0, 43,  0, 44,  0,  0, 45,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 46,  0,  0,  0,  0,  0,
+     0,  0, 47,  0,  0, 24, 48,  0,  0,  0, 49,  0,  0,  0, 50,  0,
+     0, 51,  0,  0,  0,  4,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0, 52,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 53,  0,
+     0,  0, 29,  0,  0,  0,  0,  0,  0, 54,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 55,  0,  0,  0,  0,  0,
+     0,  0, 56,  0, 57, 29,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0, 49, 58,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0, 59,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0, 60,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0, 33,  0,  0,  0, 61,  0, 62, 63,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0, 59,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0, 36,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0, 64,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0
 };
 
-/* Line_Break: 12816 bytes. */
-
-RE_UINT32 re_get_line_break(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-
-    f = ch >> 12;
-    code = ch ^ (f << 12);
-    pos = (RE_UINT32)re_line_break_stage_1[f] << 5;
-    f = code >> 7;
-    code ^= f << 7;
-    pos = (RE_UINT32)re_line_break_stage_2[pos + f] << 4;
-    f = code >> 3;
-    code ^= f << 3;
-    pos = (RE_UINT32)re_line_break_stage_3[pos + f] << 3;
-    value = re_line_break_stage_4[pos + code];
-
-    return value;
-}
-
-/* Numeric_Type. */
-
-static RE_UINT8 re_numeric_type_stage_1[] = {
-     0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14,  8,
-    15, 16, 17,  8, 18, 19,  8,  8,  8,  8,  8,  8,  8,  8,  8, 20,
-    21, 22, 23, 24, 25,  8,  8,  8,  8,  8,  8,  8,  8, 26,  8,  8,
-     8,  8,  8,  8,  8,  8,  8,  8,  8,  8, 27,  8, 28, 29, 30,  8,
-    31, 32,  8,  8, 33, 34,  8, 35,  8,  8,  8,  8, 36,  8,  8,  8,
-     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8, 37,
-     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
-     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
-     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
-     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
-     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
-     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
-     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
-     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
-     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
-     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
-     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
-     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
-     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
-     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
-     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
-     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
-     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
-     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
-     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
-     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
-     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
-     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
-     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
-     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
-     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
-     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
-     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
-     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+static RE_UINT8 re_terminal_punctuation_table_3[] = {
+      0,   0,   0,   0,   2,  80,   0, 140,   0,   0,   0,  64, 128,   0,   0,   0,
+      0,   2,   0,   0,   8,   0,   0,   0,   0,  16,   0, 200,   0,   0,  16,   0,
+    255,  23,   0,   0,   0,   0,   0,   3,   0,   0, 255, 127,  48,   0,   0,   0,
+      0,   0,   0,  12,   0, 225,   7,   0,   0,  12,   0,   0, 254,   1,   0,   0,
+      0,  64,   0,   0,   0,  56,   0,   0,   0,   0,  96,   0,   0,   0, 112,   4,
+     60,   3,   0,   0,   0,  15,   0,   0,   0,   0,   0, 236,   0,   0,   0, 248,
+      0,   0,   0, 192,   0,   0,   0,  48, 128,   3,   0,   0,   0,  64,   0,  16,
+      2, 208,   0,   0,   6,   0,   0,   0,   0, 224,   0,   0,   0,   0, 248,   0,
+      0,   0, 192,   0,   0, 192,   0,   0,   0, 128,   0,   0,   0,   0,   0, 224,
+      0,   0,   0, 128,   0,   0,   3,   0,   0,   8,   0,   0,   0,   0, 247,   0,
+     18,   0,   0,   0,   0,   0,   1,   0,   0,   0, 128,   0,   0,   0,  63,   0,
+      0,   0,   0, 252,   0,   0,   0,  30,   0,   0, 224,   3, 128,  63,   0,   0,
+      3,   0,   0,   0,  14,   0,   0,   0,  96,  32,   0, 192,   0,   0,   0,  31,
+      0,  56,   0,  12,  60, 254, 255,   0,   0,   0,   0, 112,  80,   0,   0,   0,
+     12,   0,   0,   0,   0,   0,   0,  24,   0,   0,   2,   0,   0,   0, 128,   1,
+      0,   0,  31,   0,   0,   0,  32,   0,   0,   0, 128,   3,  16,   0,   0,   0,
+    128,   7,   0,   0
 };
 
-static RE_UINT8 re_numeric_type_stage_2[] = {
-      0,   1,   2,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   3,   1,   0,   1,   1,   1,   4,
-      1,   1,   1,   1,   1,   5,   1,   6,   1,   5,   1,   5,   1,   7,   1,   8,
-      1,   9,   1,   5,   1,  10,   1,   5,   1,  11,   1,  11,  12,   1,   1,   1,
-      1,   4,  11,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,  13,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,  14,   1,   1,   1,  15,
-     11,   1,   1,   1,   1,  16,   1,  17,   1,   1,  18,   1,   1,  11,   0,   1,
-      1,  18,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,  19,  20,   1,   1,  21,  22,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,  23,  24,  25,   1,   1,   1,   1,   1,   1,   1,   1,   1,  26,  27,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   1,  28,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-     29,   1,   1,   1,   1,   1,  30,   1,  31,  32,  33,   1,   1,   1,   1,   1,
-     34,   1,  35,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-     36,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,  37,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,  38,  39,  40,  41,  37,  42,   1,   1,
-      1,   1,   1,   1,  43,  44,   1,   1,   1,   1,   1,   1,   1,  45,   1,  46,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,  47,   1,   1,   1,   1,
-      1,   1,   1,  48,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,  49,   1,  50,  51,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,  52,   1,  53,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,  54,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,  55,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,  56,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,  52,   1,   1,   1,   1,   1,   1,
-      1,   1,  55,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-     57,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,  58,   1,  42,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,  59,  60,   1,  61,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   3,   1,   1,  62,   1,   1,   1,   1,
-     63,   1,   1,  11,   4,   1,   1,  64,   1,  11,   1,   1,   1,   1,   1,   0,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,  65,  66,  67,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,  11,   1,   1,   1,
-      1,   1,   1,   1,  68,  69,  70,   1,   1,   1,   1,  71,  72,  73,   1,  74,
-      1,   1,   3,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,  75,  76,  77,  78,   1,  79,  80,   1,  81,  82,  83,   1,  84,  85,   1,
-      1,   1,   1,  86,   0,   1,   1,   1,   1,  87,   1,   1,  88,  89,   1,   1,
-      1,  90,   1,   0,  91,   1,   1,  92,   1,   1,   1,   0,   1,   1,   1,   1,
-      1,  11,   1,  11,   1,   1,   1,   1,   1,  11,   1,   4,  93,   1,   1,   1,
-      1,   1,   1,  94,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,  95,   1,   1,   1,  11,   3,   1,   1,   1,   1,   1,   1,   1,   1,  96,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-     97,  98,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   3,   1,   1,   1,  99,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1, 100,   1,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1, 101,   1, 102,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1, 103,
-      1,   1,   1,   1,   1,   4,   1,   1,   1,   1,   1,   0,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   1, 104,   1,  11,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1, 105, 106,   1, 107,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   1,   1, 108,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-    109, 110,   1, 111,  59,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   1,   1,  36,   1, 112,   1,   1,   1,   1, 113, 114,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1, 115,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1, 116,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,  47,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1, 117,   1,   1,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,   1, 115,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-};
+RE_UINT32 re_get_terminal_punctuation(RE_UINT32 codepoint) {
+    RE_UINT32 field_2;
+    RE_UINT32 field_1;
+    RE_UINT32 field_0;
+    RE_UINT32 offset;
+    RE_UINT32 v;
 
-static RE_UINT8 re_numeric_type_stage_3[] = {
-     0,  0,  0,  0,  0,  0,  1,  2,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0,  3,  4,  0,  0,  0,  0,  1,  2,  0,  0,
-     1,  2,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  5,  1,  0,  0,
-     0,  0,  0,  0,  5,  1,  6,  7,  0,  0,  0,  0,  5,  1,  8,  0,
-     0,  0,  0,  0,  5,  1,  9,  0,  0,  0,  0,  0,  5,  1,  0, 10,
-     0,  0,  0, 10,  5,  1, 11, 12,  0,  0,  1,  2,  0,  0,  0,  0,
-     0,  0,  0,  0,  1, 13, 14,  0,  0,  0,  0,  0,  0, 15, 16, 17,
-     0,  0,  0,  0,  0, 18, 12,  0,  0,  0,  0,  0,  1,  2, 11,  7,
-     5,  1,  0,  0,  0,  0,  0,  0,  0,  0,  1, 19,  0,  0,  0,  0,
-     1,  2,  1,  2,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 20, 21,
-    22, 21,  0,  0,  0,  0,  0,  0,  0,  0, 11, 11, 11, 11, 11, 11,
-    23,  7,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 22, 24, 25, 26,
-    11, 22, 24, 14,  0,  0,  0,  0,  0,  0,  0,  0,  0, 27, 28, 29,
-     0,  0,  0,  0,  0,  0, 30, 31, 22, 32, 33,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0,  0, 34, 35,  0,  0,  0, 36,  7,  0,  9,
-     0,  0, 37,  0,  0,  0,  0,  0,  0,  0,  0,  0, 11,  7,  0,  0,
-     0, 11, 36, 11,  0,  0,  0,  0, 11,  7,  0,  0,  0,  0, 36, 11,
-    34,  0,  0,  0,  0,  0,  0,  0, 38,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0, 39,  0,  0,  0, 34,  0,  0,  0,  0,  0,  0,
-    40, 41,  0,  0,  0,  0,  0,  0,  0,  0,  0, 34,  0,  0,  0,  0,
-     0, 42, 43,  0,  0,  0,  0, 35, 12,  0,  0, 35,  0, 12,  0,  0,
-     0,  0,  0,  0,  0,  0, 12,  0, 42,  0,  0,  0,  0,  0,  0,  0,
-    44,  0,  0,  0,  0, 45,  0,  0, 46, 42,  0,  0,  0,  0,  0,  0,
-    47,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 38,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0, 41, 41,  0,  0,  0,  0,  0,  0,  0, 39,
-     0,  0,  0,  0,  0,  0,  0, 18,  0, 48, 12,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0,  0, 44,  0, 42,  0,  0,  0,  0,  0,  0,
-     0,  0, 39,  0,  0,  0,  0,  0, 44,  0,  0,  0,  0,  0,  0,  0,
-     0,  0, 44,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 42,  0,  0,
-     0,  0,  0,  0,  0, 44, 38,  0,  0,  0,  0,  0, 41,  0,  0,  0,
-    44, 42,  0,  0,  0,  0,  0, 12,  0,  0,  0,  0,  0,  0, 44,  0,
-     0,  0,  0,  0, 18, 11,  0,  0,  0,  0,  0,  0,  0,  0, 49,  0,
-     0,  0,  1,  2,  0,  0,  1,  2,  0,  0,  0,  0,  0, 38, 38, 12,
-     0,  0,  0,  0,  0,  0, 39,  0,  0,  0, 50,  0,  0,  0,  0, 34,
-    35, 11, 11, 11, 11, 11, 14,  0, 11, 11, 11, 11, 11, 11, 11, 12,
-     0, 51,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 36, 11, 11, 14,
-     0,  0,  0,  0, 14,  0,  0,  0, 41, 39,  0,  0,  0,  0,  0,  0,
-     0,  0, 52,  0,  0,  0,  0,  0,  0,  0,  0, 11,  0,  0,  0, 36,
-     0,  0,  0,  0, 35, 11,  0,  0,  0,  0,  0,  0,  0,  0,  0, 53,
-     0,  0, 18, 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 54,
-    11, 11,  8, 11, 11, 11, 11, 11, 55, 12,  0,  0,  0,  0,  0, 56,
-     0,  0,  0, 57,  0,  0,  0,  0,  0,  0,  0,  0,  0, 53,  0,  0,
-     0,  0,  0, 11,  0,  0,  0, 11,  0,  0,  0,  0,  0, 36,  0,  0,
-     0,  0,  0,  0,  0,  0,  0,  8,  0,  0,  0,  0, 22, 24, 11, 10,
-     0,  0,  0, 57, 10,  0,  0,  0,  0,  0, 47,  0,  0,  0,  0,  0,
-     0,  0, 58, 59, 60,  1,  0,  0,  0,  0,  0,  0,  0,  0,  5,  1,
-     0,  0,  1,  2, 36, 11, 17,  0,  0,  0,  0,  0,  0,  0,  1, 61,
-     0,  0,  0,  0,  1, 13,  9,  0,  0,  0,  1, 13, 11, 17,  0,  0,
-    11, 11, 17,  0,  0,  0,  0,  0, 11, 11, 11, 11, 11, 11, 11, 11,
-    11, 11, 11, 11, 11, 10,  0,  0,  0,  0,  1, 62,  7,  0,  0,  0,
-    11, 11, 10,  0,  0,  0,  0,  0,  0,  0,  0,  0, 11, 11, 14,  0,
-     0,  0,  0,  0, 11, 11, 11, 12,  0,  5,  1,  1,  1,  1,  1,  1,
-    35, 11,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 36, 11,
-    11, 11, 11, 11, 11, 63, 47,  0, 36, 11, 11, 11, 11, 64, 11, 49,
-    22, 65,  0,  0,  0,  0,  0,  0, 41,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0, 42,  0,  0,  0,  0,  0,  0,  0, 39,  0,  0,  0,
-    38, 42,  0, 42,  0,  0,  0,  0,  0,  0,  0,  0,  0, 39,  0, 34,
-     0,  0,  0, 41,  0,  0,  0,  0,  0,  0, 12,  0,  0,  0,  0,  0,
-     0,  0,  0, 12,  0,  0,  0,  0,  0,  0,  0,  0,  0, 34,  0,  0,
-};
+    field_2 = codepoint >> 10;
+    field_1 = (codepoint >> 5) & 0x1F;
+    field_0 = (codepoint >> 3) & 0x3;
+    offset = codepoint & 0x7;
 
-static RE_UINT8 re_numeric_type_stage_4[] = {
-    0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3,
-    3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0,
-    0, 2, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 3, 3,
-    0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0,
-    0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0,
-    1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 0, 0, 0, 0, 0, 0, 0, 3, 3, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 1, 1, 3, 3, 2, 0, 0, 0, 0, 0,
-    2, 0, 0, 0, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0,
-    2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 0, 0, 1, 1, 1,
-    2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 1, 1, 1, 0, 0, 2, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2,
-    0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1,
-    2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
-    0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0,
-    0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0,
-    1, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0,
-    0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 0,
-    0, 1, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0,
-    0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0,
-    0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0,
-    0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1,
-    0, 0, 0, 0, 1, 1, 0, 0, 2, 2, 2, 2, 1, 1, 1, 1,
-    0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1,
-    0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 3, 3, 3, 3, 1, 1, 0, 0, 0, 0,
-    3, 3, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 0, 1, 2, 2, 2, 1, 1, 0, 0, 0,
-};
+    v = re_terminal_punctuation_table_1[field_2];
+    v = re_terminal_punctuation_table_2[(v << 5) | field_1];
+    v = re_terminal_punctuation_table_3[(v << 2) | field_0];
 
-/* Numeric_Type: 3232 bytes. */
-
-RE_UINT32 re_get_numeric_type(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-
-    f = ch >> 11;
-    code = ch ^ (f << 11);
-    pos = (RE_UINT32)re_numeric_type_stage_1[f] << 5;
-    f = code >> 6;
-    code ^= f << 6;
-    pos = (RE_UINT32)re_numeric_type_stage_2[pos + f] << 3;
-    f = code >> 3;
-    code ^= f << 3;
-    pos = (RE_UINT32)re_numeric_type_stage_3[pos + f] << 3;
-    value = re_numeric_type_stage_4[pos + code];
-
-    return value;
+    return (v >> offset) & 0x1;
 }
 
-/* Numeric_Value. */
-
-static RE_UINT8 re_numeric_value_stage_1[] = {
-     0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14,  8,
-    15, 16, 17,  8, 18, 19,  8,  8,  8,  8,  8,  8,  8,  8,  8, 20,
-    21, 22, 23, 24, 25,  8,  8,  8,  8,  8,  8,  8,  8, 26,  8,  8,
-     8,  8,  8,  8,  8,  8,  8,  8,  8,  8, 27,  8, 28, 29, 30,  8,
-    31, 32,  8,  8, 33, 34,  8, 35,  8,  8,  8,  8, 36,  8,  8,  8,
-     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8, 37,
-     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
-     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
-     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
-     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
-     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
-     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
-     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
-     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
-     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
-     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
-     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
-     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
-     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
-     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
-     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
-     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
-     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
-     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
-     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
-     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
-     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
-     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
-     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
-     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
-     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
-     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
-     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
-     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+/* Unified_Ideograph. */
+static RE_UINT8 re_unified_ideograph_table_1[] = {
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  1,  1,
+     1,  1,  1,  2,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  3,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  4,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  5,  1,  1,  1,  6,  7,  1,
+     1,  1,  1,  8,  1,  1,  1,  1,  1,  1,  9,  0,  0,  0,  0,  0,
+     1,  1,  1,  1, 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0
 };
 
-static RE_UINT8 re_numeric_value_stage_2[] = {
-      0,   1,   2,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   3,   1,   0,   1,   1,   1,   4,
-      1,   1,   1,   1,   1,   5,   1,   6,   1,   5,   1,   5,   1,   7,   1,   8,
-      1,   9,   1,   5,   1,  10,   1,   5,   1,  11,   1,  11,  12,   1,   1,   1,
-      1,   4,  11,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,  13,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,  14,   1,   1,   1,  15,
-     11,   1,   1,   1,   1,  16,   1,  17,   1,   1,  18,   1,   1,  11,   0,   1,
-      1,  18,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,  19,   4,   1,   1,  20,  21,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,  22,  23,  24,   1,   1,   1,   1,   1,   1,   1,   1,   1,  25,  26,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   1,  27,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-     28,   1,   1,   1,   1,   1,  29,   1,  30,  31,  32,   1,   1,   1,   1,   1,
-     33,   1,  34,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-     35,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,  36,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,  37,  38,  39,  40,  41,  42,   1,   1,
-      1,   1,   1,   1,  43,  44,   1,   1,   1,   1,   1,   1,   1,  45,   1,  46,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,  47,   1,   1,   1,   1,
-      1,   1,   1,  48,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,  49,   1,  50,  51,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,  52,   1,  53,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,  54,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,  55,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,  56,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,  57,   1,   1,   1,   1,   1,   1,
-      1,   1,  58,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-     59,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,  60,   1,  61,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,  62,  63,   1,  64,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   3,   1,   1,  65,   1,   1,   1,   1,
-     66,   1,   1,  11,   4,   1,   1,  67,   1,  11,   1,   1,   1,   1,   1,   0,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,  68,  69,  70,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,  11,   1,   1,   1,
-      1,   1,   1,   1,  71,  72,  73,   1,   1,   1,   1,  74,  75,  76,   1,  77,
-      1,   1,   3,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,  78,  79,  80,  81,   1,  82,  83,   1,  84,  85,  86,   1,  87,  88,   1,
-      1,   1,   1,  89,   0,   1,   1,   1,   1,  90,   1,   1,  91,  92,   1,   1,
-      1,  93,   1,   0,  94,   1,   1,  95,   1,   1,   1,   0,   1,   1,   1,   1,
-      1,  11,   1,  11,   1,   1,   1,   1,   1,  11,   1,   4,  96,   1,   1,   1,
-      1,   1,   1,  97,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,  98,   1,   1,   1,  11,   3,   1,   1,   1,   1,   1,   1,   1,   1,  99,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-    100, 101,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   3,   1,   1,   1, 102,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1, 103,   1,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1, 104,   1, 105,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1, 106,
-      1,   1,   1,   1,   1,   4,   1,   1,   1,   1,   1,   0,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   1, 107,   1,  11,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1, 108, 109,   1, 110,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   1,   1, 111,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-    112, 113,   1, 114, 115,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   1,   1, 116,   1, 117,   1,   1,   1,   1, 118, 119,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1, 120,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1, 121,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1, 122,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1, 123,   1,   1,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,   1, 124,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+static RE_UINT8 re_unified_ideograph_table_2[] = {
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    3, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 5, 0, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 6, 1, 1, 1, 1, 1, 1,
+    5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 8,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 9, 0, 0, 0, 0, 0
 };
 
-static RE_UINT8 re_numeric_value_stage_3[] = {
-      0,   0,   0,   0,   0,   0,   1,   2,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   3,   4,   0,   0,   0,   0,   1,   2,   0,   0,
-      1,   2,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   5,   6,   0,   0,
-      0,   0,   0,   0,   5,   6,   7,   8,   0,   0,   0,   0,   5,   6,   9,   0,
-      0,   0,   0,   0,   5,   6,  10,   0,   0,   0,   0,   0,   5,   6,   0,  11,
-      0,   0,   0,  12,   5,   6,  13,  14,   0,   0,   1,   2,   0,   0,   0,   0,
-      0,   0,   0,   0,   1,  15,  16,   0,   0,   0,   0,   0,   0,  17,  18,  19,
-      0,   0,   0,   0,   0,  20,  21,   0,   0,   0,   0,   0,   1,   2,   1,   2,
-      5,   6,   0,   0,   0,   0,   0,   0,   0,   0,   1,  22,   0,   0,   0,   0,
-      1,   2,   1,   2,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  23,   2,
-      0,   0,  24,  25,  26,  27,  26,  27,  28,  29,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,  26,  30,  31,  32,  33,  26,  30,  34,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,  35,  36,  37,   0,   0,   0,   0,   0,   0,  38,  39,
-     26,  40,  41,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  42,
-     43,   0,   0,   0,  17,   2,   0,  44,   0,   0,  45,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,  26,  46,   0,   0,   0,  47,  48,  49,   0,   0,   0,   0,
-     26,  46,   0,   0,   0,   0,  50,  51,  52,   0,   0,   0,   0,   0,   0,   0,
-     53,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  54,   0,   0,
-      0,  55,   0,   0,   0,   0,   0,   0,  56,  57,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,  58,   0,   0,   0,   0,   0,  59,  60,   0,   0,   0,   0,  61,
-     62,   0,   0,  63,   0,  64,   0,   0,   0,  52,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,  65,   0,  66,   0,   0,   0,   0,   0,   0,   0,
-     67,   0,   0,   0,   0,  68,   0,   0,  69,  70,   0,   0,   0,   0,   0,   0,
-     71,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  72,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,  73,  73,   0,   0,   0,   0,   0,   0,   0,  74,
-      0,   0,   0,   0,   0,   0,   0,  75,   0,  76,  77,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,  78,   0,  79,   0,   0,   0,   0,   0,   0,
-      0,   0,  80,   0,   0,   0,   0,   0,  81,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,  82,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  83,
-     84,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  85,   0,   0,
-      0,   0,   0,   0,   0,  86,  53,   0,   0,   0,   0,   0,   0,   0,  77,   0,
-      0,   0,   0,   0,  87,   0,   0,   0,  88,  89,   0,   0,   0,   0,   0,  90,
-      0,   0,   0,   0,   0,   0,  91,   0,   0,   0,   0,   0,  38,  92,   0,   0,
-      0,   0,   0,   0,   0,   0,  93,   0,   0,   0,   1,   2,   0,   0,   1,   2,
-      0,   0,   0,   0,   0,  94,  95,  77,   0,   0,   0,   0,   0,   0,  96,   0,
-      0,   0,  97,   0,   0,   0,   0,  98,  99,   6,  47, 100, 101, 102, 103,   0,
-    104, 105, 106, 107, 108, 109, 110, 111,   0, 112,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,  17,  18, 113, 114,   0,   0,   0,   0, 115,   0,   0,   0,
-    116, 117,   0,   0,   0,   0,   0,   0,   0,   0, 118,   0,   0,   0,   0,   0,
-      0,   0,   0, 119,   0,   0,   0, 120,   0,   0,   0,   0,  99, 121,   0,   0,
-      0,   0,   0,   0,   0,   0,   0, 122,   0,   0, 123, 124,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0, 125,  26, 126, 127, 128, 129, 130, 131, 132,
-    133, 134,   0,   0,   0,   0,   0, 135,   0,   0,   0, 136,   0,   0,   0,   0,
-      0,   0,   0,   0,   0, 122,   0,   0,   0,   0,   0, 133,   0,   0,   0, 133,
-      0,   0,   0,   0,   0, 137,   0,   0,   0,   0,   0,   0,   0,   0,   0, 138,
-      0,   0,   0,   0,  26, 126, 139, 140,   0,   0,   0, 141, 142,   0,   0,   0,
-      0,   0, 143,   0,   0,   0,   0,   0,   0,   0, 144, 145, 146,   6,   0,   0,
-      0,   0,   0,   0,   0,   0,   5,   6,   0,   0,   1,   2,  17,  18, 147,   0,
-      0,   0,   0,   0,   0,   0,   1, 148,   0,   0,   0,   0,   1,  18, 149,   0,
-      0,   0,   1, 150, 145, 151,   0,   0, 152, 153, 154,   0,   0,   0,   0,   0,
-      6, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167,   0,   0,
-      0,   0,   1, 168, 169,   0,   0,   0,   1, 170, 171,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   1, 170, 172,   0,   0,   0,   0,   0,  26, 126, 173, 174,
-      0,   5,   6,   1, 175, 176, 177,   6,  99,   6,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,  17,  18, 113, 178, 179, 180, 181, 182, 183,   0,
-     17,  18, 113, 178, 179, 184,  39, 185, 186, 187,   0,   0,   0,   0,   0,   0,
-    188,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 189,   0,   0,   0,
-      0,   0,   0,   0, 190,   0,   0,   0,   0,   0,   0,   0, 191,   0,   0,   0,
-      0,   0,   0,   0,   0,  74,   0,   0, 192,  70,   0,  70,   0,   0,   0,   0,
-      0,   0,   0,   0,   0, 193,   0, 194,   0,   0,   0,  57,   0,   0,   0,   0,
-      0,   0,  77,   0,   0,   0,   0,   0,   0,   0,   0,  64,   0,   0,   0,   0,
-      0,   0,   0,  94,   0,   0,   0,   0,   0,   0,   0,   0,   0, 195,   0,   0,
-      0,   0, 196,   0,   0,   0,   0,   0,
+static RE_UINT8 re_unified_ideograph_table_3[] = {
+      0,   0,   0,   0, 255, 255, 255, 255, 255, 255, 255,  31,   0, 192,  26, 128,
+    154,   3,   0,   0, 255, 255, 255,  63, 255, 255,  31,   0,   3,   0, 255, 255,
+      1,   0,   0,   0, 255,   7,   0,   0
 };
 
-static RE_UINT8 re_numeric_value_stage_4[] = {
-      0,   0,   0,   0,   0,   0,   0,   0,   2,  37,  39,  41,  43,  45,  47,  49,
-     51,  53,   0,   0,   0,   0,   0,   0,   0,   0,  39,  41,   0,   0,   0,   0,
-      0,  37,   0,   0,  22,  27,  32,   0,   0,   0,   0,   0,   0,   0,   2,  37,
-     39,  41,  43,  45,  47,  49,  51,  53,   0,   0,   0,   0,  12,  16,  20,  22,
-     32,  60,   0,   0,   0,   0,   0,   0,   0,   0,  22,  27,  32,  12,  16,  20,
-     54,  99, 108,   0,   0,   0,   0,   0,   2,  37,  39,  41,  37,  39,  41,   0,
-      4,   7,   9,  11,  14,  18,  21,   0,  54,  99, 108,  22,  27,  32,  12,  16,
-     20,   0,   0,   0,   0,   0,   0,   0,  51,  53,  27,  38,  40,  42,  44,  46,
-     48,  50,  52,   1,   0,   0,   0,   0,   0,  37,  39,  41,  43,  45,  47,  49,
-     51,  53,  54,  64,  74,  84,  94,  95,  96,  97,  98,  99, 117,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,  61,  62,  63,   0,   0,   0,   0,   0,   0,   0,
-     51,  53,  37,   0,   0,   0,   0,   0,   2,   0,   0,   0,  43,  45,  47,  49,
-     17,  15,  14,  23,  31,  21,  25,  29,  33,  19,  34,  16,  24,  30,  35,  37,
-     37,  39,  41,  43,  45,  47,  49,  51,  53,  54,  55,  56,  94,  99, 103, 108,
-    108, 112, 117,   0,   0,  47,  94, 121, 126,   2,   0,   0,   0,   0,   0,   0,
-     53,  54,  55,  56,  57,  58,  59,  60,  61,  62,  63,  64,  37,  39,  41,  43,
-     45,  47,  49,  51,  53,  54,  55,  56,  57,  58,  59,  60,  61,  62,  63,  64,
-     61,  62,  63,  64,   0,   0,   0,   0,   0,   0,   2,  55,  56,  57,  58,  59,
-     60,  61,  62,  63,  64,  37,  39,  41,  43,  45,  47,  49,  51,  53,  54,   2,
-      0,   0,   0,   0,   0,   0,  37,  39,  41,  43,  45,  47,  49,  51,  53,  54,
-     53,  54,  37,  39,  41,  43,  45,  47,  49,  51,  53,  54,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,  27,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,
-     54,  64,  74,   0,   0,   0,   0,   0,   0,   0,  37,  39,  41,  43,   0,   0,
-     53,  54,   0,   0,   0,   0,   0,   0,  54,  64,  74,  84,  94,  95,  96,  97,
-      0,  65,  66,  67,  68,  69,  70,  71,  72,  73,  74,  75,  76,  77,  78,  79,
-      0,  80,  81,  82,  83,  84,  85,  86,  87,  88,  89,  90,  91,  92,  93,  94,
-      0,   0,   0,   0,   0,  45,   0,   0,   0,   0,   0,  39,   0,   0,   0,   0,
-      0,   0,  45,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  49,   0,   0,
-     37,   0,   0,  49,   0,   0,   0, 117,   0,  41,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,  53,   0,   0,   0,   0,   0,   0,  39,   0,   0,   0,
-      0,   0,   0,   0,  45,   0,  43,   0,   0,   0,   0,   0,   0,   0,   0, 140,
-     54,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 108,
-     41,   0,   0,   0,   0,   0,   0,   0,  99,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0, 140,   0,   0,   0,   0,   0,   0,   0,   0,   0, 142,   0,
-      0,  39,   0,  51,   0,  47,   0,   0,   0,  54,   0, 108,  64,  74,   0,   0,
-      0,   0,   0,   0,  84,   0,   0,   0,   0,  41,  41,  41,  41,   0,   0,   0,
-      0,   0,   0,  43,   0,   0,   0,   0,   0,  37,   0,   0,   0,   0,   0,   0,
-      0,   0,  37,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  53,  64,
-      0,   0,   0,   0,  37,  39,  41,   0,  39,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,  54,   0,   0,   0,   0,   0,  51,   0,   0,   0,
-      0,   0,  49,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  49,   0,
-      0,   0,   0,   0,   0,   0,  53,   0,   0,   0,   0,   0,   0,   0,  99,   0,
-      0,   0,   0,   0,   0,   0,  43,   0,   0,   0,   0,   0, 117,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,  39,   0,   0, 108,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,  47,   0,   0,   0,   0,   0,  99,   0,   0,   0,
-     47,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,
-     41,  43,  45,  47,  49,  51,  53,   2,  22,  27,  32,  12,  16,  20,   0,   0,
-      0,   0,   0,  41,   0,   0,   0,   0,   0,   0,   0,  54,   0,   0,   0,   0,
-      0,   0,   2,   0,   0,   0,   0,   0,   0,  47,   0,  47,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,  54,   0,   0,   0,   0,   0,   0,   0,   0,   0,  37,
-     98,  99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113,
-    114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125,   0,   0,   0,   0,
-     22,  27,  37,  45,  94, 103, 112, 121,  45,  54,  94,  99, 103, 108, 112,  45,
-     54,  94,  99, 103, 108, 117, 121,  54,  37,  37,  37,  39,  39,  39,  39,  45,
-     54,  54,  54,  54,  54,  74,  94,  94,  94,  94,  99, 101, 103, 103, 103, 103,
-    103, 108, 112,  45,  94,  27,  27,  31,  32,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   2,  22,   0,   0,   0,   0,  96,  97,  98,  99, 100, 101, 102, 103,
-    104, 105, 106, 107,   0,   0,   0,   0,  37,  45,  54,  94,   0,   0,   0,   0,
-      0,  98,   0,   0,   0,   0,   0,   0,   0,   0, 107,   0,   0,   0,   0,   0,
-      0,  37,  39,  54,  64,  99,   0,   0,  37,  39,  41,  54,  64,  99, 108, 117,
-      0,  37,  39,  41,  43,  45,  54,  64,  39,  41,  43,  43,  45,  54,  64,  99,
-      0,   0,   0,  37,  45,  54,  64,  99,   0,   0,   0,   0,   0,   0,  37,  54,
-     64,  99,  39,  41,   0,   0,   0,   0,   0,   0,   0,   0,  36,  27,   0,   0,
-     53,  54,  64,  74,  84,  94,  95,  96,   0,   0,  99, 100, 101, 102, 103, 104,
-    105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120,
-    121, 122, 123, 124, 125, 126, 127, 129, 130, 132, 133, 134, 135, 136,  13,  19,
-     22,  23,  26,  27,  28,  31,  32,  34,  37,  39,  41,  43,  54,  64,  99, 108,
-     27,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  37,  94,   0,
-      0,   0,   0,   0,   0,  37,  54,  64,   0,  37,  39,  41,  43,  54,  64,  99,
-      0,   0,  37,  45,  54,  94,  99, 108,  97,  98,  99, 100, 101, 102, 103, 104,
-    105, 106, 107,  27,  22,  23,  31,   0,   0,   0,   0,   0,   0,  37,  39,  41,
-     43,  45,  54,  64,  74,  99,  27,   0,   0,  37,  54,  64,  99,   0,   0,   0,
-      0,   0,  37,  39,  41,  43,  45,  47,  49,  51,  53,  54,  64,  74,  84,  94,
-     95,  96,  97,  98,  99, 108,   2,  37,  96,  97,  98,  99, 108,   0,   0,   0,
-     51,  53,  54,  64,   0,   0,   0,   0,  96,  97,  98,   0,   0,   0,   0,   0,
-     51,  53,  37,  39,  41,  43,  45,  47,  95,  96,  97,  98,  99,   0,   0,   0,
-      3,   4,   5,   6,   7,   8,   9,  10,  11,  12,  12,  14,  16,  18,  20,  21,
-     22,  27,  27,  32,   3,   0,   0,   0,  41,  43,  45,  47,  49,  51,  53,  43,
-     45,  47,  49,  51,  53,  37,  39,  41,  43,  45,  47,  49,  51,  53,  37,  39,
-     41,  43,  45,  39,  41,  41,  43,  45,  47,  49,  51,  53,  37,  39,  41,  41,
-     43,  45, 128, 131,  37,  39,  41,  41,  43,  45,  41,  41,  43,  43,  43,  43,
-     47,  49,  49,  49,  51,  51,  53,  53,  53,  53,  39,  41,  43,  45,  47,  37,
-     39,  41,  43,  43,  45,  45,  39,  41,  37,  39,  23,  31,  34,  23,  31,  16,
-     22,  19,  22,  22,  27,  23,  31,  84,  94,  43,  45,  47,  49,  51,  53,   0,
-     51,  53,   0,  54,  99, 117, 137, 140, 141, 142,   0,   0,   0,   0,   0,   0,
-     51,  53,  54,  55,  56,  57,  58,  59,  60,  61,  62,  63,  37,  39,  41,   0,
-     60,  61,  62,  63,   0,   0,   0,   0,  97,  98,  37,  39,  41,  43,  45,  37,
-     45,   0,   0,   0,   0,   0,   0,   0,  51,  53,   2,  37,  39,  41,  43,  45,
-     47,  49,  51,  53,   2,  37,  39,  41,  43,  45,  47,  49,  51,  53,   2,  37,
-    104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119,
-    120, 121, 122, 123, 124, 125, 126, 127, 126, 138, 139,  37,  39,  41,  43,  45,
-     47,  49,  51,  53,   0,  22,  27,  32,   0,  37,  39, 117, 126,   0,   0,   0,
-    120, 121, 122, 123, 124, 125,   0,  39, 102, 104, 109, 117,  27,  19,   0,   0,
-      2,   2,  37,  39,  41,  43,  45,  47,  49,  51,  53,   2,   2,   0,   0,   0,
-      0,  49,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  43,   0,   0,   0,
-      0,   0,  43,   0,   0,   0,   0,   0,   0,  45,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,  74,   0,   0,   0,   0,   0,   0,  47,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,  41,   0,   0,   0,   0,   0,   0,   0,  43,   0,   0,
-     53,   0,   0,   0,   0,   0,   0,   0,
+RE_UINT32 re_get_unified_ideograph(RE_UINT32 codepoint) {
+    RE_UINT32 field_2;
+    RE_UINT32 field_1;
+    RE_UINT32 field_0;
+    RE_UINT32 offset;
+    RE_UINT32 v;
+
+    field_2 = codepoint >> 10;
+    field_1 = (codepoint >> 5) & 0x1F;
+    field_0 = (codepoint >> 3) & 0x3;
+    offset = codepoint & 0x7;
+
+    v = re_unified_ideograph_table_1[field_2];
+    v = re_unified_ideograph_table_2[(v << 5) | field_1];
+    v = re_unified_ideograph_table_3[(v << 2) | field_0];
+
+    return (v >> offset) & 0x1;
+}
+
+/* Uppercase. */
+static RE_UINT8 re_uppercase_table_1[] = {
+     0,  1,  2,  2,  3,  2,  2,  4,  5,  6,  2,  7,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  8,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  9,
+     2, 10,  2, 11,  2,  2, 12,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2, 13,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2, 14,  2,  2,  2,  2, 15,  2, 16,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2
+};
+
+static RE_UINT8 re_uppercase_table_2[] = {
+     0,  0,  1,  0,  0,  0,  2,  0,  3,  4,  5,  6,  7,  8,  9, 10,
+     3, 11, 12,  0,  0,  0,  0,  0,  0,  0,  0, 13, 14, 15, 16, 17,
+    18, 19,  0,  3, 20,  3, 21,  3,  3, 22, 23,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0, 18, 24,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 18, 18, 25,
+     0,  0,  0,  0, 26, 27,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     3,  3,  3,  3, 28,  3,  3,  3, 29, 30, 31, 32,  0, 33, 34, 35,
+     0,  0,  0,  0,  0,  0,  0,  0, 36, 37, 38, 19, 39,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0, 40, 19,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    18, 41,  0, 42,  3,  3,  3, 43,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  3, 44, 45,  0,  0,  0,  0, 46,  3, 47, 48, 49, 50, 51,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  0,  0,  0,  0,  0,  0,
+    18, 52,  0,  0,  0, 26, 53,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0, 18, 54,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0, 18,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0, 18,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    55, 56, 57, 58, 59, 60, 26, 61, 62, 63, 64, 65, 66, 55, 56, 57,
+    58, 67, 25, 26, 61, 58, 68, 69, 70, 71, 40, 41, 26, 72, 73,  0,
+     0,  0,  0,  0,  0,  0,  0,  0, 18, 74,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0, 26, 75, 75, 61,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0
 };
 
-/* Numeric_Value: 4336 bytes. */
-
-RE_UINT32 re_get_numeric_value(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-
-    f = ch >> 11;
-    code = ch ^ (f << 11);
-    pos = (RE_UINT32)re_numeric_value_stage_1[f] << 5;
-    f = code >> 6;
-    code ^= f << 6;
-    pos = (RE_UINT32)re_numeric_value_stage_2[pos + f] << 3;
-    f = code >> 3;
-    code ^= f << 3;
-    pos = (RE_UINT32)re_numeric_value_stage_3[pos + f] << 3;
-    value = re_numeric_value_stage_4[pos + code];
-
-    return value;
+static RE_UINT8 re_uppercase_table_3[] = {
+      0,   0,   0,   0, 254, 255, 255,   7, 255, 255, 127, 127,  85,  85,  85,  85,
+     85,  85,  85, 170, 170,  84,  85,  85,  85,  85,  85,  43, 214, 206, 219, 177,
+    213, 210, 174,  17, 144, 164, 170,  74,  85,  85, 210,  85,  85,  85,   5, 108,
+    122,  85,   0,   0,   0,   0,  69, 128,  64, 215, 254, 255, 251,  15,   0,   0,
+      0, 128,  28,  85,  85,  85, 144, 230, 255, 255, 255, 255, 255, 255,   0,   0,
+      1,  84,  85,  85, 171,  42,  85,  85,  85,  85, 254, 255, 255, 255, 127,   0,
+    191,  32,   0,   0, 255, 255,  63,   0,   0,   0, 255, 255, 255, 255, 255, 231,
+     85,  85,  21,  64,   0, 255,   0,  63,   0, 255,   0, 255,   0,  63,   0, 170,
+      0, 255,   0,   0,   0,   0,   0,  15,   0,  15,   0,  15,   0,  31,   0,  15,
+    132,  56,  39,  62,  80,  61,  15, 192,  32,   0,   0,   0,   8,   0,   0,   0,
+      0,   0, 192, 255, 255, 127,   0,   0, 157, 234,  37, 192,   5,  40,   4,   0,
+     85,  21,   0,   0,  85,  85,  85,   5,  84,  85,  84,  85,  85,  85,   0, 106,
+     85,  40,  69,  85,  85, 125,  95,  85, 244,   2,   0,   0,   0,   0,  32,   0,
+    255,   0,   0,   0, 255, 255,  15,   0, 255, 255,   7,   0, 255, 255, 255,   3,
+      0,   0, 240, 255, 255,  63,   0,   0,   0, 255, 255, 255,   3,   0,   0, 208,
+    100, 222,  63,   0, 255,   3,   0,   0, 176, 231, 223,  31,   0,   0,   0, 123,
+     95, 252,   1,   0,   0, 240, 255, 255,  63,   0,   0,   0,   3,   0,   0, 240,
+      1,   0,   0,   0, 252, 255, 255,   7,   0,   0,   0, 240, 255, 255,  31,   0,
+    255,   1,   0,   0,   0,   4,   0,   0,   3,   0,   0,   0, 255,   3, 255, 255
+};
+
+RE_UINT32 re_get_uppercase(RE_UINT32 codepoint) {
+    RE_UINT32 field_2;
+    RE_UINT32 field_1;
+    RE_UINT32 field_0;
+    RE_UINT32 offset;
+    RE_UINT32 v;
+
+    field_2 = codepoint >> 10;
+    field_1 = (codepoint >> 5) & 0x1F;
+    field_0 = (codepoint >> 3) & 0x3;
+    offset = codepoint & 0x7;
+
+    v = re_uppercase_table_1[field_2];
+    v = re_uppercase_table_2[(v << 5) | field_1];
+    v = re_uppercase_table_3[(v << 2) | field_0];
+
+    return (v >> offset) & 0x1;
 }
 
-/* Bidi_Mirrored. */
+/* Variation_Selector. */
+RE_UINT32 re_get_variation_selector(RE_UINT32 codepoint) {
+    if (0x180B <= codepoint && codepoint <= 0x180D)
+        return 1;
+    if (0xFE00 <= codepoint && codepoint <= 0xFE0F)
+        return 1;
+    if (0x0E0100 <= codepoint && codepoint <= 0x0E01EF)
+        return 1;
+
+    return 0;
+}
 
-static RE_UINT8 re_bidi_mirrored_stage_1[] = {
-    0, 1, 1, 2, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1,
+/* White_Space. */
+static RE_UINT8 re_white_space_table_1[] = {
+    0, 1, 1, 1, 1, 2, 1, 1, 3, 1, 1, 1, 4, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
     1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
     1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
     1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
 };
 
-static RE_UINT8 re_bidi_mirrored_stage_2[] = {
-     0,  1,  1,  1,  1,  1,  1,  2,  1,  1,  1,  3,  1,  1,  1,  1,
-     4,  5,  1,  6,  7,  8,  1,  9, 10,  1,  1,  1,  1,  1,  1,  1,
-     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
-     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
-     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
-     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1, 11,
-     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1, 12,  1,  1,  1,  1,
-     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+static RE_UINT8 re_white_space_table_2[] = {
+    0, 1, 2, 2, 3, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    4, 5, 6, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2
 };
 
-static RE_UINT8 re_bidi_mirrored_stage_3[] = {
-     0,  1,  2,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
-     3,  3,  3,  3,  4,  3,  3,  3,  3,  3,  5,  3,  3,  3,  3,  3,
-     6,  7,  8,  3,  3,  9,  3,  3, 10, 11, 12, 13, 14,  3,  3,  3,
-     3,  3,  3,  3,  3, 15,  3, 16,  3,  3,  3,  3,  3,  3, 17, 18,
-    19, 20, 21, 22,  3,  3,  3, 23, 24,  3,  3,  3,  3,  3,  3,  3,
-    25,  3,  3,  3,  3,  3,  3,  3,  3, 26,  3,  3, 27, 28,  3,  3,
-     3,  3,  3, 29, 30, 31, 32, 33,
+static RE_UINT8 re_white_space_table_3[] = {
+      0,  62,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,  32,   0,   0,   0,
+    255,   7,   0,   0,   0, 131,   0,   0,   0,   0,   0, 128
 };
 
-static RE_UINT8 re_bidi_mirrored_stage_4[] = {
-      0,   0,   0,   0,   0,   3,   0,  80,   0,   0,   0,  40,   0,   0,   0,  40,
-      0,   0,   0,   0,   0,   8,   0,   8,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,  60,   0,   0,   0,  24,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   6,  96,   0,   0,   0,   0,   0,   0,  96,
-      0,  96,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,
-     30,  63,  98, 188,  87, 248,  15, 250, 255,  31,  60, 128, 245, 207, 255, 255,
-    255, 159,   7,   1, 204, 255, 255, 193,   0,  62, 195, 255, 255,  63, 255, 255,
-      0,  15,   0,   0,   3,   6,   0,   0,   0,   0,   0,   0,   0, 255,  63,   0,
-    121,  59, 120, 112, 252, 255,   0,   0, 248, 255, 255, 249, 253, 255,   0,   1,
-     63, 194,  55,  31,  58,   3, 240,  51,   0, 252, 255, 223,  83, 122,  48, 112,
-      0,   0, 128,   1,  48, 188,  25, 254, 255, 255, 255, 255, 207, 191, 255, 255,
-    255, 255, 127,  80, 124, 112, 136,  47,   0,   0,   0,   0,   0,   0,   0,  64,
-     60,  54,   0,  48, 255,   3,   0,   0,   0, 255, 243,  15,   0,   0,   0,   0,
-      0,   0,   0, 126,  48,   0,   0,   0,   0,   3,   0,  80,   0,   0,   0,  40,
-      0,   0,   0, 168,  13,   0,   0,   0,   0,   0,   0,   8,   0,   0,   0,   0,
-      0,   0,  32,   0,   0,   0,   0,   0,   0, 128,   0,   0,   0,   0,   0,   0,
-      0,   2,   0,   0,   0,   0,   0,   0,   8,   0,   0,   0,   0,   0,   0,   0,
-};
+RE_UINT32 re_get_white_space(RE_UINT32 codepoint) {
+    RE_UINT32 field_2;
+    RE_UINT32 field_1;
+    RE_UINT32 field_0;
+    RE_UINT32 offset;
+    RE_UINT32 v;
 
-/* Bidi_Mirrored: 572 bytes. */
-
-RE_UINT32 re_get_bidi_mirrored(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-
-    f = ch >> 14;
-    code = ch ^ (f << 14);
-    pos = (RE_UINT32)re_bidi_mirrored_stage_1[f] << 5;
-    f = code >> 9;
-    code ^= f << 9;
-    pos = (RE_UINT32)re_bidi_mirrored_stage_2[pos + f] << 3;
-    f = code >> 6;
-    code ^= f << 6;
-    pos = (RE_UINT32)re_bidi_mirrored_stage_3[pos + f] << 6;
-    pos += code;
-    value = (re_bidi_mirrored_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1;
-
-    return value;
-}
+    field_2 = codepoint >> 10;
+    field_1 = (codepoint >> 5) & 0x1F;
+    field_0 = (codepoint >> 3) & 0x3;
+    offset = codepoint & 0x7;
 
-/* Indic_Positional_Category. */
+    v = re_white_space_table_1[field_2];
+    v = re_white_space_table_2[(v << 5) | field_1];
+    v = re_white_space_table_3[(v << 2) | field_0];
 
-static RE_UINT8 re_indic_positional_category_stage_1[] = {
-    0, 1, 2, 3, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 6, 7, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    return (v >> offset) & 0x1;
+}
+
+/* Word. */
+static RE_UINT8 re_word_table_1[] = {
+     0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 13, 13,
+    13, 13, 13, 14, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 15, 13, 16, 17, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 18, 10, 10, 10, 10, 10, 10, 10, 10, 19, 20,
+    21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 10, 10, 13, 31, 10, 10,
+    10, 32, 10, 10, 10, 10, 10, 10, 10, 10, 33, 34, 13, 13, 13, 13,
+    13, 35, 13, 36, 10, 10, 10, 10, 10, 10, 10, 10, 37, 10, 10, 38,
+    10, 10, 10, 10, 39, 40, 41, 10, 42, 10, 43, 44, 45, 10, 46, 10,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 47, 13, 13, 13, 48, 49, 13,
+    13, 13, 13, 50, 13, 13, 13, 13, 13, 13, 51, 10, 10, 10, 52, 10,
+    13, 13, 13, 13, 53, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    54, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10
 };
 
-static RE_UINT8 re_indic_positional_category_stage_2[] = {
+static RE_UINT16 re_word_table_2[] = {
+      0,   1,   2,   3,   0,   4,   5,   5,   6,   6,   6,   6,   6,   6,   6,   6,
+      6,   6,   6,   6,   6,   6,   7,   8,   6,   6,   6,   9,  10,  11,   6,  12,
+      6,   6,   6,   6,  11,   6,   6,   6,   6,  13,  14,   6,  15,  16,  17,  18,
+     19,   6,   6,  20,   6,   6,  21,  22,  23,   6,  24,   6,   6,  25,   6,  26,
+      6,  27,  28,  29,   0,  30,  31,  11,   6,   6,   6,  32,  33,  34,  35,  36,
+     37,  38,  39,  40,  41,  42,  43,  44,  45,  42,  46,  47,  48,  49,  50,  51,
+     52,  53,  54,  55,  56,  57,  58,  59,  52,   6,  60,  61,  62,  63,  64,  65,
+     66,  67,  68,   0,  69,  70,  71,   0,  72,  73,  74,  75,  76,  77,  78,   0,
+      6,   6,  79,   6,  80,   6,  81,  82,   6,   6,   6,   6,   6,   6,   6,   6,
+      6,   6,  83,   6,  84,  85,  86,   6,  87,   6,  88,   0,  89,   6,   6,  90,
+     66,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,
+      6,   6,   6,  91,   3,   6,   6,  92,  93,  94,  95,  96,   6,   6,  97,  98,
+     99,   6,   6, 100,   6, 101,   6, 102, 103, 104, 105, 106,   6, 107, 108,   0,
+     28,   6, 103, 109, 108, 110, 111,   0,   6,   6, 112, 113,   6,   6,   6,  95,
+      6, 114, 115,  80, 116,  88, 117,  67,   6,   6,   6,   6,   6,   6,   6, 118,
+      6,   6,   6,   6,   6,   6,   6,   6,  90,   6, 119,  80,   6, 120, 121, 122,
+    123, 124, 125, 126, 127,   0,  23, 128, 129, 130, 131,   6, 132,   0,   0,   0,
       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0, 133,   6,  98,   0,   0,   0,   0,   0,   0,   0,   0,
       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   1,   2,   3,   4,   5,   6,   7,   8,
-      9,   6,  10,  11,   9,   6,  12,  13,   5,  14,  15,   4,  16,  17,  18,   0,
-     19,  20,  21,   4,   5,  14,  22,   4,  23,  24,  25,   4,  26,   0,  27,  28,
-      0,  29,  30,   0,   0,  31,  32,   0,  33,  34,   0,  35,  36,  37,  38,   0,
-      0,  39,  40,  41,  42,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,  43,  43,  44,  44,   0,  45,  46,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,  47,   0,   0,   0,  48,  49,   0,
-     50,   0,  51,  52,   0,   0,   0,   0,  53,  54,  55,  56,  57,  58,   0,  59,
-      0,  60,   0,   0,   0,   0,  61,  62,   0,   0,   0,   0,   0,   0,   0,  63,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,  64,   0,   0,   0,   0,   0,   0,   0,   0,
+      6, 134, 103,   6,   6,   6,   6, 135,   6,  81,   6, 136, 137, 138, 138,   6,
+      0, 139,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    140, 141,  66,   6, 142,  66,   6,  82, 143,  13,   6,   6, 144,   6,   0,  23,
       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,
+      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,
+      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   0,   0,
+      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,
+      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,
+      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,  77,
+      6,   6,   6,   6, 145,   0,  23,  80,   6,   6,   6,   6,   6,   6,   6,   6,
+    146, 147,   6, 148,   6,   6,   6,  25, 149, 150,   6,   6, 151,   6, 152, 153,
+      6, 154,   6,  95,   6,   6, 155, 156,   6, 157,  95,  77,   6,   6, 158, 103,
+      6, 137, 159, 160,   6,   6, 161, 162, 163, 164,  82,  79,   6,   6,   6, 165,
+      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,
+      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6, 166, 167,  28,
+      0,   0,   0,   0,   0,   0,   0,   0,   6,   6,   6,   6,   6,   6,   6,   6,
+      6,   6,   6, 157,   6,   6, 168,   0, 169, 170, 171,   6,   6,  25, 172,   6,
+      6,   6,   6,   6,   6,   6,   6,   6,   6,  80,  23,   6, 173,   6, 174, 175,
+     89, 176, 177, 178,   6,   6,   6,  77,   1,   2,   3, 105,   6, 103, 179,   0,
+    180, 181, 182,   0,   6,   6,   6,  67,   0,   0,   6,  94,   0,   0,   0, 183,
+      0,   0,   0,   0,  77,   6, 128, 111,   6, 184, 101,  67,  80,   6, 185,   0,
+      6,   6,   6,   6,  80,  79, 186,  28,   6, 187,   6, 188,   0,   0,   0,   0,
+      6,   6,   6,   6,   6,   6,   6,   6,   6, 137, 102, 174,   0,   0,   0,   0,
+    189, 190, 102, 137, 103,   0,   0, 191, 102, 168,   0,   0,   6, 192,   0,   0,
+    193, 194,   0,  77,  77,   0,  74, 195,   6, 102, 102, 196,  25,   0,   0,   0,
+      6,   6, 132,   0,   6, 196,   6, 196,   6, 197,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   6, 198,   0,   0,  77, 110, 128,   0,   0,  23, 199, 137,
+      6,   6, 195, 200,   6,  67,  23, 201,   6,  30, 202, 203,   6,   6, 204,   0,
+    205, 206,   0,   0, 207, 116,   6, 208,  33, 209, 210, 211,   0,   0,   0,   0,
+      6,   6, 212, 213,   6,   6, 214,   0,   0,   0,   0,   0,   6, 215, 216,   0,
+      6,   6, 217,   0,   6, 100,  98,   0,  88, 112,   0,   0,   0,   0,   0,   0,
+      6,  67,   0,   0,   0,   6,   6, 218, 219, 220, 221,   0,   0, 222, 223, 224,
+      6, 103, 110,   6, 225,   0,   6, 100,   0,   0,   0,   0,   0,   0,   0,   0,
+    226,   5, 227, 228, 173, 229,   0,   0, 230, 231, 197, 232, 233,  98,   0,   0,
+      0,   0,   0,   0,   0,   0,   0, 137,   0,   0,   0,   0,   0, 234,   0,   0,
+      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,
+      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6, 168,   0,   0,   0,
+      6,   6,   6, 144,   6,   6,   6,   6,   6,   6, 188,   0,   0,   0,   0,   0,
       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      6, 144,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     65,  66,   0,   0,  67,  68,  69,  70,   0,  71,  72,   0,   1,  73,  74,  75,
-      0,  76,  77,  78,   0,  79,  80,  81,   0,   0,   0,   0,   0,   0,   0,  82,
+      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,
+      6,   6, 195,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,
+      6, 100, 103,  98,   0,   0,  23, 106,   6, 137, 221, 235,  89,   0,   0,   0,
       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   6,   6,   0,   0,   0,   0,   6,   6, 236,   6, 237,   0,   0, 238,
+      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,
+      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6, 114,
+      6,   6,   6,   6,   6,   6, 102,   0, 132,   0,   0,   0,   0,   0,   0,   0,
       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      6,   6,   6,   6,   6,   6,   6,   6, 103,   0, 239, 202,   6,   6,   6,   6,
+      6,   6,   6,   6,   6,   6,   6,  28,   0,   0,   0,   0,   0,   0,   0,   0,
+      6,   6,   6, 240, 241,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     83,  84,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 242, 243, 244,   0,   0,
+      0,   0, 245,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      6,   6,  30,   6, 246, 247, 248,   6, 249, 250, 251,   6,   6,   6,   6,   6,
+      6,   6,   6,   6,   6, 252, 253,  82,  30,  30, 134, 134, 226, 226, 254,   6,
       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      6, 255,   6, 256, 257, 258,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    259, 260,   0,   0,   0,   0,   0,   0,   6, 261, 262,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   6, 168,   0,   0,   0,   0,   0,   0,   0,   0,
+      6,   6,   6,   6,   6,   6, 263,   0,   6,   6, 112,   0,   0,   0,   0,   0,
       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     85,  86,  87,   0,  57,  88,   0,   0,  89,  90,  91,  92,  57,  93,  94,   0,
-      0,  95,   0,   0,   0,   0,  96,  97,  23,  98,  99, 100,   0,   0,   0,   0,
-      0, 101, 102,   0,   0, 103, 104,   0,   0,   0,   0,   0,   0, 105, 106,   0,
-      0, 107, 108,   0,   0, 109,   0,   0, 110, 111,   0,   0,   0,   0,   0,   0,
-      0, 112,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 113, 114,
-    115, 116, 117,   0, 118,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0, 119,   0,   0, 120, 121,   0,   0,   0, 122, 123,   0, 124,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0, 125,   0,   0,   0,   0,   0,   0,   0,   0,
-};
-
-static RE_UINT8 re_indic_positional_category_stage_3[] = {
-      0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   2,   3,   4,   5,   6,   7,   8,   9,   0,   0,
-     10,   0,   0,   0,   0,   0,   0,   0,  11,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   3,   4,  12,  13,  14,   0,  15,   0,   0,
-     10,   0,   0,   0,   0,   0,   0,  16,  17,   0,   0,   0,   0,   0,   0,   0,
-     18,  19,  20,  21,  22,   0,   0,   0,   0,   0,   0,   0,  23,  22,   0,   0,
-      4,  24,  25,  26,   0,   0,   0,   0,  10,   0,   0,   0,   0,   0,  27,  28,
-      0,   0,   0,   0,   0,   0,   0,  29,   4,  12,  30,  31,   0,  32,   0,   0,
-     16,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  33,
-     34,  35,  36,  37,   0,  15,   0,   0,   6,  38,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,  27,   6,  39,  40,  23,   0,  41,   0,   0,
-     42,  43,  44,  23,   0,  45,   0,   0,  46,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,  19,  47,  48,  49,  36,  37,   0,  15,   0,   0,
-     33,   0,   0,   0,   0,   0,   0,   0,   0,   0,  16,  15,  50,  51,  52,  53,
-      0,   0,   0,   0,  33,   0,   0,   0,   0,   0,   0,   0,  54,  28,  55,   0,
-     56,  57,  28,  58,   0,   0,   0,   0,   0,   0,   0,   0,  54,  28,  59,  60,
-     56,  61,  28,  23,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  62,   0,
-      0,   0,   0,   0,   0,  63,  64,  65,   0,   0,   0,   0,  66,  67,  68,   1,
-     69,  70,   0,  71,  72,  72,  71,  72,  72,  72,  72,  72,  72,  72,  72,  60,
-      0,  73,   0,   0,   0,   0,   0,   0,   0,   0,  15,  74,  75,  76,  77,  78,
-      0,   0,   0,   0,   0,  33,  62,  10,  79,  80,  81,  82,  83,  38,   0,   0,
-     84,  85,  81,  86,   0,   0,  33,  87,   0,   0,   0,   0,  88,  60,   0,   0,
-      0,   0,   0,   0,  88,   0,   0,   0,   0,   0,   0,   0,   0,  89,  76,  90,
-     91,  92,  93,  28,  94,   0,   0,  64,  95,  96,   6,   0,  97,  81,  98,   0,
-      0,   0,   0,   0,  81,  99, 100,  81, 101,   0,  82,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,  19, 102,   0,   0,   0,   0,   0,   0, 103,  76,  55,
-    104,  93, 105, 106, 107,  28,  28, 108,  28, 101,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0, 109, 110, 111, 112, 101,   0,   0,   0,   0,   0,   0,
-      0,   0,  19,   5,  28,   0,   0,   0, 113,   0,   0,   0,   0,   0,   0,   0,
-    114, 115, 113,  62,   0,   0,   0,   0,   0,   2,  46, 116,  46,   0,   0,   0,
-      0, 117, 118,   5,  28, 119,   0,   0,   0,   0,   0,   0,  58, 120, 121,  72,
-    122, 123, 124,  22,   0, 125,   0,   0,   0,   0,   0,   0,   0,   0,  19,   0,
-      0,   0,   0,   0,  38,   0,   0,   0,  16,  16,  19,   0,   0,   0,   0,   0,
-     15, 126,   0,   0,   0,   0,   0,   0,  82,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,  81,  81,  81,  81, 127,   0,   0,   0,   0,   0,   0,
-     28,  28,  28,  28,  23,   0,   0,  19,   0,   0, 128,  62,   0,   0,   0,   0,
-      0, 128, 129,  59,  46,   0,   0,   0,   0,   0,   0,   0,  19,  50, 130, 131,
-    132,   0,   0,   0,   0,   0,   0,   0,   0,  64,   0,   0,   0,   0,   0,   0,
-      0,   0,  83, 133, 134, 135,   0,   0,  19,   0,   0, 136,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,  15, 136,   0,   0,   0,   0, 109, 137, 138, 139,
-     64,   0,   0,   0,   0,   0,   0,   0,   0,   0, 140, 141,   0, 142,   0,   0,
-     15,  54, 143,  26,   0,   0,   0,   0, 144, 145,   0,  59,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0, 146,   0, 147,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,  28,  72, 121,  58,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0, 148, 149,  18,   0,  58,   0,   0,   0,   0,   0,   0,   0,
-      0,  19,   9, 150, 146,  38,   0,   0,   0,  45,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0, 128,   0,   0,   0,   0,   0,   0,   0,  15, 151,  72, 152,
-    101,   0, 153,  60,   0,   0,   0,   0,   0,   0,   0,  48, 154, 109,   0,  16,
-      0,   0,   0,   0,   0,   0,   0,  19, 148,   5, 146,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0, 128,  79,   6, 155,  13, 156,   0,  15,   0,   0,
-     33,  27,  28,  38,  28,  38,   0,   0,   0,   0,   0,   0,   0, 157,  72, 121,
-    158, 159,   0,   0,   0,   0,   0,  16,   0,   0,   0,   0, 148,  72, 160, 161,
-    162,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  15, 151,  62, 163, 164,
-     60,   0,   0,   0,   0,   0,   0,  62,   0,   0,   0,   0,  48,  72, 149, 165,
-     38,   0,   0,   0,   0,   0,   0,   0,   0,   0,  19, 166, 121, 164,   0,   0,
-      0,   0,   0,   0,   0,   0,   0, 167,  50, 168,   5,   0,   0,   0,   0,   0,
-      0,   0,   0, 148,  59,  28,  18,   0,   0,   0,   0,   0, 157,  72,  27,  81,
-     60, 169,   0,   0,   0,   0,   0,   0, 170,  28, 171,   0,   0,   0,   0,   0,
-      0,   0,   0,   0, 128,   5, 172,  55,   0,   0,   0,   0, 170,   1,   4,   0,
-      0,   0,  10,  72,  72, 173,  38,   0,   0,   0,   0,  15,   9,  55,  28, 164,
-      0,   0,   0,   0,  10,  72,  72,  72,  72,  72, 114,  72, 174, 175,   0,   0,
-      0,   0,   0,   0,  83, 171,  16,  94, 176, 177,   0,   0,   0,   0,   0,   0,
-      0,   0,  33, 178, 179, 147,   0,   0,   0,   0,   0,   0,  19, 180,   0,   0,
-};
-
-static RE_UINT8 re_indic_positional_category_stage_4[] = {
-     0,  0,  0,  0,  5,  5,  5,  1,  0,  0,  5,  1,  6,  0,  1,  2,
-     1,  6,  6,  6,  6,  5,  5,  5,  5,  1,  1,  1,  1,  6,  2,  1,
-     0,  5,  6,  5,  5,  5,  6,  6,  0,  0,  6,  6,  0,  5,  1,  1,
-     6,  0,  0,  2,  2,  0,  0,  4,  4,  6,  0,  0,  0,  0,  0,  1,
-     0,  0,  5,  0,  0,  5,  5,  1,  1,  6,  6,  0,  0,  0,  0,  5,
-     5,  0,  0,  5,  5,  6,  0,  0,  0,  6,  0,  0,  5,  5,  0,  0,
-     6,  5,  0,  5,  5,  8,  0,  1,  1,  6,  0,  0,  0,  0,  5,  5,
-     5,  5,  5,  5,  6,  0,  1,  5,  9,  0,  0,  4, 10,  6,  0,  0,
-     0,  0,  5,  8,  0,  0,  1,  1,  5,  1,  1,  0,  0,  0,  2,  2,
-     2,  0,  4,  4,  4,  5,  0,  0,  5,  0,  0,  0,  1,  0,  5,  5,
-     7,  0,  5,  5,  0,  5,  6,  0,  8,  1,  1,  1,  1,  0,  5,  8,
-     8,  0,  8,  8,  0,  1,  1,  0,  5,  5,  1,  1,  5,  0,  1,  1,
-     1,  1,  1,  6,  6,  0,  2,  2,  1,  1,  5,  5,  6,  0,  6,  0,
-     1,  2,  9,  2,  4, 10,  4,  1,  1,  5,  1,  1,  6,  6,  6,  0,
-     3,  3,  3,  3,  3,  1,  0,  5,  5,  5,  5,  0,  6,  6,  6,  5,
-     6,  0,  0,  0,  3,  0,  0,  0,  6,  6,  0,  0,  0,  6,  0,  6,
-     0,  5,  0,  0,  0,  0,  1,  2,  0,  6,  5,  7,  6,  6,  7,  7,
-     7,  7,  5,  5,  5,  7,  5,  5,  6,  0,  5,  5,  0,  6,  6,  6,
-     6,  6,  6,  6,  0,  0,  6,  0,  1,  5,  5,  6,  6,  2,  5,  5,
-     5,  5,  5,  6,  1,  0,  5,  1,  0,  6,  6,  0,  6,  0,  1,  1,
-     1,  0,  0,  1,  1,  1,  1,  1,  1,  1,  0,  0,  0,  5,  5,  5,
-     0,  0,  6,  1,  2,  5,  5,  1,  1,  6,  0,  1,  1,  5,  0,  0,
-     0,  0,  5,  6,  0,  0,  1,  5,  6,  6,  9, 10,  4,  2,  2,  2,
-     4,  4,  5,  1,  1,  5,  5,  5,  5,  5,  0,  5,  5,  5,  6,  1,
-     1,  8,  8,  5,  1,  1,  6,  1,  1,  6,  5,  6,  1,  3,  3,  3,
-     1,  1,  3,  1,  1,  0,  0,  0,  6,  2,  1,  5,  0,  2,  6,  1,
-     0,  1,  5,  1,  5,  6,  6,  5,  6,  1,  2,  2,  2,  2,  2,  5,
-     5,  0,  0,  6,  5,  1,  5,  5,  6,  6,  6, 11,  7, 13,  2,  2,
-     4,  4,  5,  8,  5,  5,  1,  0,  0,  1,  6,  6,  5,  6,  2,  1,
-     1,  5,  1,  5,  1,  1,  1,  2,  2,  9,  1,  1,  2,  2,  5,  6,
-    14,  6,  6,  6,  6,  6,  5,  5,  5,  1, 14, 14, 14, 14, 14, 14,
-    14,  0,  0,  0,  5,  0,  0,  1,  1,  6,  5,  1,  6,  5,  0,  0,
-     0,  0,  0,  6,  6,  6,  5,  6,  6,  6,  2,  2,  5,  6,  1, 12,
-    11,  0,  0,  0,  5,  6,  5,  2,  2,  5,  6,  1,  2,  6,  6,  0,
-     5,  1,  0,  0,  6,  3,  3,  5,  5,  3,  1,  3,  3,  1,  5,  5,
-     0,  0,  0,  2,  6,  5,  2,  1,  0,  1,  0,  0,  6,  1,  1,  0,
-     0, 14,  6,  6,  0,  5, 14,  0,  5,  6,  6,  0,  1,  5,  1,  0,
-     1,  2,  1,  6,  6,  5,  5,  1,  2,  5,  7,  7,  2,  1,  6,  6,
-     5,  5,  5,  8,  0,  6,  6,  5,  5,  5,  8,  8,  1,  0,  0,  2,
-     4,  1,  0,  0,  0,  1,  2,  1,  1,  1,  6,  5,  5,  1,  6,  0,
-     6,  2,  5,  9,  4,  1,  4,  5,  5,  1,  6,  6,  2,  9,  4, 10,
-     5,  5,  1,  6,  1,  5,  1,  6,  1,  5,  2,  1,  0,  6,  0,  5,
-     6,  6,  2,  5,  2,  0,  0,  0,  0,  5,  6,  6,  5,  5,  6,  0,
-     5,  1,  0,  6,  6,  6,  5,  1,  6,  2,  6,  5,  1,  5,  5,  0,
-     5,  5,  6,  5,  6,  0,  0,  6,  1,  1,  1,  0,  5,  5,  0,  1,
-     6,  2,  1,  0,
-};
-
-/* Indic_Positional_Category: 2852 bytes. */
-
-RE_UINT32 re_get_indic_positional_category(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-
-    f = ch >> 11;
-    code = ch ^ (f << 11);
-    pos = (RE_UINT32)re_indic_positional_category_stage_1[f] << 6;
-    f = code >> 5;
-    code ^= f << 5;
-    pos = (RE_UINT32)re_indic_positional_category_stage_2[pos + f] << 3;
-    f = code >> 2;
-    code ^= f << 2;
-    pos = (RE_UINT32)re_indic_positional_category_stage_3[pos + f] << 2;
-    value = re_indic_positional_category_stage_4[pos + code];
-
-    return value;
-}
-
-/* Indic_Syllabic_Category. */
-
-static RE_UINT8 re_indic_syllabic_category_stage_1[] = {
-    0, 1, 2, 2, 2, 3, 2, 2, 4, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2,
-};
-
-static RE_UINT8 re_indic_syllabic_category_stage_2[] = {
-     0,  1,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
-     2,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16,
-    17, 18,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2, 19, 20,
-     2,  2, 21, 22, 23, 24, 25, 26, 27, 28,  2, 29,  2,  2,  2,  2,
-    30, 31,  2,  2,  2,  2,  2,  2,  2,  2,  2, 32,  2,  2,  2,  2,
-     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
-     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
-     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
-     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
-     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
-     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
-     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
-     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
-    33, 34, 35, 36, 37, 38,  2, 39,  2,  2,  2,  2,  2,  2,  2,  2,
-     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
-     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
-     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
-     2,  2,  2,  2, 40,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
-    41, 42, 43, 44, 45, 46, 47,  2, 48, 49,  2, 50, 51, 52, 53,  2,
-    54,  2,  2, 55, 56, 57,  2,  2, 58, 59, 60, 61,  2, 62,  2,  2,
-};
-
-static RE_UINT8 re_indic_syllabic_category_stage_3[] = {
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   2,   2,   3,   0,
       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   4,   0,   0,   0,   5,   0,   0,   0,
-      0,   0,   0,   0,   0,   6,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    248, 264, 265, 266, 267, 268,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,  23,  79,  79,  98,   0,   0,   0,
       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      7,   8,   8,   8,   8,   9,  10,  10,  10,  10,  10,  10,  10,  10,  11,  12,
-     13,  13,  13,  14,  15,  16,  10,  10,  17,  18,   2,   2,  19,   8,  10,  10,
-     20,  21,   8,  22,  22,   9,  10,  10,  10,  10,  23,  10,  24,  25,  26,  12,
-     13,  27,  27,  28,   0,  29,   0,  30,  17,  18,   2,   2,  26,   0,   0,  31,
-     32,  21,  33,  34,  22,   9,  10,  10,  10,  10,  23,  10,  23,  35,  26,  36,
-     37,  29,  27,  38,  39,   0,  40,  24,   0,  18,   2,   2,  41,  42,   0,   0,
-     32,  21,   8,  43,  43,   9,  10,  10,  10,  10,  23,  10,  23,  40,  26,  12,
-     13,  44,  44,  38,   0,   0,   0,   0,  17,  18,   2,   2,   0,   0,  45,  46,
-     32,  21,   8,  22,  22,   9,  10,  10,  10,  10,  23,  10,  23,  40,  26,  12,
-     13,  27,  27,  38,   0,  47,   0,  30,  17,  18,   2,   2,  48,   0,   0,   0,
-     49,  21,  33,  19,  50,  51,  35,  23,  52,  53,  54,  25,  10,  10,  26,  47,
-     37,  47,  55,  38,   0,  29,   0,   0,   0,  18,   2,   2,   0,   0,   0,   0,
-      7,  56,   8,  50,  50,   9,  10,  10,  10,  10,  23,  10,  10,  10,  26,  57,
-     13,  55,  55,  38,   0,  58,  54,   0,  17,  18,   2,   2,   0,   0,   0,   0,
-      7,  21,   8,  50,  50,   9,  10,  10,  10,  10,  23,  10,  10,  40,  26,  12,
-     13,  55,  55,  38,   0,  58,   0,  59,  17,  18,   2,   2,  60,   0,   0,   0,
-      7,  21,   8,  50,  50,   9,  10,  10,  10,  10,  10,  10,  10,  10,  61,  62,
-     13,  55,  55,  63,   0,  64,   0,  34,  17,  18,   2,   2,   0,   0,  65,  66,
-     67,  21,   8,   8,   8,  33,  25,  10,  10,  10,  10,  10,  30,  10,  10,  48,
-     10,  54,  68,  29,  13,  69,  13,  13,   0,  18,   2,   2,  47,   0,   0,   0,
-     40,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  54,  13,  13,  70,   0,
-     13,  44,  71,  72,   2,   2,   3,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     35,  23,  54,  10,  10,  10,  10,  10,  10,  73,  10,  54,  13,  13,  74,  75,
-     13,  76,  71,  77,   2,   2,   3,  10,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   2,   2,   2,   2,   2,  78,  79,   0,
-     10,  10,  40,  10,  10,  10,  10,  10,  10,  10,  10,  53,  16,  13,  13,  80,
-     81,  82,  83,  84,  85,  85,  86,  85,  85,  85,  85,  85,  85,  85,  85,  87,
-      0,  88,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     10,  10,  10,  10,  10,  10,  10,  10,  89,   8,  90,  13,  13,  91,  92,  93,
-      2,   2,  94,  95,  96,  17,  97,  98,  99, 100, 101, 102, 103, 104,  10,  10,
-    105, 106,  71, 107,   2,   2, 108, 109,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-    110,  10,  10,  23,  11, 111,   0,   0, 110,  10,  10,  10,  11, 111,   0,   0,
-    110,  10,  10,  10,  11,   0,   0,   0, 110,  10,  10,  23, 112,   0,   0,   0,
-     10,  10,  10,  10,  10,  10,  10,  10, 113,   8,   8,   8,   8,  47,  13,  13,
-     13,  80, 114, 115, 116,   0,   0, 117,   2,   2,   3,   0,   0,   0,   0,   0,
-    118,  10,  10,  10,  10,  10,  10,  54,  13,  13, 119,   0, 120, 121, 122,   0,
-      0,  18,   2,   2,  10,  10,  10,  10, 123, 124, 124, 125, 126, 127,   0,   0,
-     10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,   0,  13,  13,  13,  13,
-    128, 121, 129,   0,   2,   2, 130,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     10,  10,  10,  10,  10, 131,  13,   0,  10,  10,  10,  10,  10,  10,  10,  10,
-     10,  10,  10,  89, 110, 132, 133, 134, 135,  13,  13,  13,  13, 136, 137, 138,
-      2,   2,   3,   0,   2,   2,   3,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-    139, 140,   8,   8, 110,  10,  10,  10,  10,  10,  10,  10,  10, 141,  13,  13,
-     13, 142,  10,   0,   2,   2,   3,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-    143,   8, 144,  10,  10,  10,  10,  10, 145,  13, 146, 147,   2,   2, 148, 149,
-     10,  10,  10,  10,  10,  10,  10,  10,  10, 150,  13,  13, 151,   0,   0,   0,
-     10,  10,  10,  10,  10,  10,  10,  10,  10, 152,  13, 128, 121, 153,   0,   0,
-      2,   2,   3,  40,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0, 154, 155, 155, 155, 156,   0,   0,   0,  65, 157, 158,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 159,   0,
-      0,   0,   0, 160, 161,   4,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 162,   0,   0,
-      5, 162,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 163,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   4,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-    164, 165, 166,  10,  10,  10,  10,  10, 131,  13,   0,   0,   0,   0,   0,   0,
-     10,  10,  10,  10,  10,  10,  10, 167, 168, 169, 170,  10, 171,   0,   0,   0,
-    172,   8,   8,   8, 144,  10,  10,  10,  10,  10,  10,  10,  10, 173,  13,  13,
-     13, 174,   0,   0,   2,   2,   3,   0, 155, 155, 155, 155, 175,   0,   0, 176,
-      2,   2, 177,  10,  10,  10,  10,  10, 167, 124, 178, 129,  10,  10,  10,  10,
-     10, 131,  13, 179, 180,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-    181,   8,   9, 110,  10,  10,  10,  10,  10,  10,  10,  10, 182,  13,  13, 183,
-    184,   0,   0,   0,   2,   2,   3,   0,  10, 185,  10,  10,   2,   2, 177,  54,
-      8, 144,  10,  10,  10,  10,  10,  10,  10,  10, 103,  13, 186, 187,   0,   0,
-    121, 121, 121, 188,   2,   2,   3,   0,  10,  10,  10,  10,  40, 189, 190, 102,
-     10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  13,  13,  13, 106,
-    191,   0,   0,   0,   0,   0,   0,   0, 144,  10, 131,  13,   0, 192,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     10,  10,  10,  96, 193,  10, 194, 121, 195,  13,  37, 196,   2,   2,   3,   0,
-    103,  58,   0,  80,  10,  40,  40,  10,  10,  10,  10,  10,  10,  26, 197, 198,
-      2,   2, 199,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-    200, 201,   8,   8, 110,  10,  10,  10,  10,  10,  10,  10,  10,  10,  13,  13,
-     13, 202,   0,   0, 203, 204, 204, 204, 204, 205,   2,   2,   0,   0,   0, 206,
-    207,   8,   8,   9,  10,  10,  10,  10,  10,  10,  10,  10,  13,  13, 208,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-    207, 110,  10,  10,  10,  10,  10,  10,  10, 131,  13,  13, 209, 210,   2,   2,
-      0, 211,   0,   0, 124, 212,  10,  10,  10,  10,  10,  10, 182,   0,   0,   0,
-    207,   8,   8,   8,   9,  10,  10,  10,  10,  10,  10,  10, 131,  13,  13,  13,
-    213,   0, 214,  76,   2,   2,   3,   0, 215,   2,   2,   2,   2, 199,   0,   0,
-      8,   8,  10,  10,  30,  10,  10,  10,  10,  10,  10,  13,  13, 216,   0, 217,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      8,  54,  23,  30,  10,  10,  10,  30,  10,  10,  53,   0,   8,   8, 144,  10,
-     10,  10,  10,  10,  10,  10,  10, 166,  13,  13, 218,   0,   2,   2,   3,   0,
-      7,  21,   8,  22,  22,   9,  10,  10,  10,  10,  23,  10,  23,  40, 219,  12,
-     13,  27,  27,  38,   0,  29,   0, 220,  17, 221, 155, 163, 155, 163,   0,   0,
-      8,   8,   8, 144,  10,  10,  10,  10,  10,  10,  10,  10,  10, 103,  13,  13,
-    222, 223,   0,   0,   2,   2,   3, 224,   0,   0,   0,   0,   0,   0,   0,   0,
-     21,   8,   8, 110,  10,  10,  10,  10,  10,  10,  10,  10,  13,  13,  13, 225,
-    226, 227,   0,   0,   2,   2,   3,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      8,   8,   8, 144,  10,  10,  10,  10,  10,  10,  10, 131,  13, 109,  13, 228,
-    229,   0,   0,   0,   0,   0,   8, 109,   0,   0,   0,   0,   0,   0,   0,   0,
-      8,   8,   8, 144,  10,  10,  10,  10,  10,  10,  10,  10,  13,  13,  13, 230,
-     76,   0,   0,   0,   2,   2,   3,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      8,   8, 144,  10,  10,  10,  10,  10,  10,  10, 166, 231,  13, 232,  53,   0,
-      2,   2,   3,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     10,  10,  10,  10,  10,  10,  54, 233,  13,  13, 234,   0,   2,   2,   2,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      8,   8, 144,  10,  10,  10,  10,  10,  10,  10,  10,  13,  13, 225, 235,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   8,   8,  19, 144,  10,  10,  10,  10,
-     10,  10,  10,  10, 103,  13,  47,  80, 236,  76,   0,   0,   0,   0,   0,   0,
-    237,  13, 238,  10,  10,  10,  10,  10,  10,  10,  10,  10, 239, 240, 241, 242,
-      0, 243,   0,   0, 237,  13,  13,  10,  10,  10,  10,  10,  10,  10,  10,  10,
-     10, 244, 245, 121, 121, 246, 247, 248,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      8,   8,  50, 144,  10,  10,  10,  10,  10,  10,  10, 131,  13,  37,  13, 228,
-    227,   0,   0,   0,   2,   2,   2,   2,   2,   2,   2, 199,  25,  10,  10,  10,
-     10,  10,  10,  10, 249,  85,  85,  85,  85,  85,  86,  85,  13, 250,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      8,  33,  43,  10,  10,  10,  10,  10,  10,  10,  10,  10, 103,  37, 251,  44,
-    252, 253,   0,   0,   2,   2,   3,   0,   8,  43,  50,  10,  10,  10,  10,  10,
-     10,  10,  11,  37,  44, 254,   0,   0,   2,   2,   3,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,  10,  10,  10,  10, 255,  37,   0,   0,
-};
-
-static RE_UINT8 re_indic_syllabic_category_stage_4[] = {
-     0,  0,  0,  0,  0, 11,  0,  0, 34, 34, 34, 34, 34, 34,  0,  0,
-    11,  0,  0,  0,  0,  0, 29, 29,  0,  0,  0, 11,  1,  1,  1,  2,
-     8,  8,  8,  8,  8, 12, 12, 12, 12, 12, 12, 12, 12, 12,  9,  9,
-     4,  3,  9,  9,  9,  9,  9,  9,  9,  5,  9,  9,  0, 27, 27,  0,
-     0,  9,  9,  9,  8,  8,  9,  9,  0,  0, 34, 34,  0,  0,  8,  8,
-    11,  1,  1,  2,  0,  8,  8,  8,  8,  0,  0,  8, 12,  0, 12, 12,
-    12,  0, 12,  0,  0,  0, 12, 12, 12, 12,  0,  0,  9,  0,  0,  9,
-     9,  5, 13,  0,  0,  0,  0,  9, 12, 12,  0, 12,  1,  0, 29,  0,
-     0,  1,  1,  2,  8,  8,  8,  0,  0,  0,  0,  8,  0, 12, 12,  0,
-     4,  0,  9,  9,  9,  9,  9,  0,  9,  5,  0,  0,  0, 27,  0,  0,
-     0, 12, 12, 12,  1, 26, 11, 11,  0, 20,  0,  0,  8,  8,  0,  8,
-     9,  9,  0,  9,  0, 12, 27, 27, 27,  4,  4,  4,  0,  0,  9,  9,
-     0, 12,  0,  0,  0,  0,  1, 23,  8,  0,  8,  8,  8, 12,  0,  0,
-     0,  0,  0, 12, 12,  0,  0,  0, 12, 12, 12,  0,  9,  0,  9,  9,
-     1,  8,  8,  8,  0,  3,  9,  9,  0,  9,  9,  0,  0,  0, 12,  0,
-     0, 14, 14,  0, 12, 12, 12,  6,  6,  3,  9,  9,  9,  5, 16,  0,
-    13, 13, 13,  9,  0,  0, 13, 13, 13, 13, 13, 13,  0,  0,  1,  2,
-     0,  0,  5,  0,  9,  0,  9,  0,  9,  9,  6,  0, 25, 25, 25, 25,
-    30,  1,  6,  0,  0, 12,  0, 12,  9,  9,  6,  9, 20, 20,  0,  0,
-     9,  0,  0,  0,  0,  1,  0,  0,  0, 29,  0, 29,  0,  4,  0,  0,
-     9,  9,  1,  2,  9,  9,  1,  1,  6,  3,  0,  0, 22, 22, 22, 22,
-    22, 19, 19, 19, 19, 19, 19, 19,  0, 19, 19, 19, 19,  0,  0,  0,
-     0,  0, 29,  0, 12,  8,  8,  8,  8,  8,  8,  9,  9,  9,  1, 25,
-     2,  7,  6, 20, 20, 20, 20, 12, 34, 34,  0, 11,  0,  0, 11,  0,
-    12, 12,  8,  8,  9,  9, 12, 12, 12, 12, 20, 20, 20, 12,  9, 25,
-    25, 12, 12,  9,  9, 25, 25, 25, 25, 25, 12, 12, 12,  9,  9,  9,
-     9, 12, 12, 12, 12, 12, 20,  9,  9,  9,  9, 25, 25, 25, 12, 25,
-    34, 34, 25, 25,  9,  9,  0,  0,  8,  8,  8, 12,  6,  0,  0,  0,
-    12,  0,  9,  9, 12, 12, 12,  8,  9, 28, 28, 29, 18, 30, 29, 29,
-    29,  6,  7, 29,  3, 29,  0,  0, 11, 12, 12, 12,  9, 19, 19, 19,
-    21, 21,  1, 21, 21, 21, 21, 21, 21, 21,  9, 29, 12, 12, 12, 10,
-    10, 10, 10, 10, 10, 10,  0,  0, 24, 24, 24, 24, 24,  0,  0,  0,
-     9, 21, 21, 21, 25, 25,  0,  0, 34, 34, 34,  0, 12, 12, 12,  9,
-    12, 20, 20, 19, 21, 21, 17, 19, 19, 19, 19,  0,  7,  9,  9,  9,
-     1, 25, 25, 25, 25, 25,  6, 29, 29,  0,  0, 29,  1,  1,  1, 18,
-     2,  8,  8,  8,  4,  9,  9,  9,  5, 12, 12, 12,  1, 18,  2,  8,
-     8,  8, 12, 12, 12, 19, 19, 19,  9,  9,  6,  7, 19, 19, 12, 12,
-    34, 34,  3, 12, 12, 12, 21, 21,  8,  8,  4,  9, 21, 21,  6,  6,
-    19, 19,  9,  9,  1,  1, 29,  4, 27, 27, 27,  0, 27, 27, 27, 27,
-    27, 27,  0,  0, 27, 14, 14, 27, 27, 27, 11,  0,  0,  0,  0, 29,
-    31, 32,  0,  0, 11, 11, 11, 11, 29,  0,  0,  0, 27,  0,  0,  0,
-     8,  8,  9,  8,  8,  8,  5, 12, 12, 12, 12,  1, 12, 12, 10, 10,
-    10, 10, 12, 12, 12, 12, 10, 19, 19, 12, 12, 12, 12, 19, 12,  1,
-     1,  2,  8,  8, 20,  9,  9,  9,  5,  1,  0,  0, 27, 27,  1,  1,
-     0,  0,  8,  9, 34, 34, 12, 12, 10, 10, 10, 25,  9,  9,  9, 21,
-    21, 21, 21,  6,  1,  1, 18,  2, 12, 12, 12,  4,  9, 20, 20, 20,
-     5,  0,  0,  0, 12,  9,  0, 12,  9,  9,  9, 20, 20, 20, 20,  0,
-    21, 21,  0,  0, 11, 11, 11,  0,  0,  0, 12, 25, 24, 25, 24,  0,
-     0,  2,  7,  0, 12,  8, 12, 12, 12, 12, 12, 21, 21, 21, 21,  9,
-    25,  6,  0,  0,  4,  4,  4,  0,  0,  0,  0,  7, 34,  0,  0,  0,
-     1,  1,  2, 14, 14,  8,  8,  8,  9,  9,  5,  0,  0,  0, 35, 35,
-    35, 35, 35, 35, 35, 35, 34, 34,  0,  0,  0, 33,  1,  1,  2,  8,
-     9,  5,  4,  0,  9,  9,  9,  7,  6,  0, 34, 34, 12,  9,  9,  0,
-    10, 12, 12, 12,  5,  3, 15, 15,  0, 29,  4,  9,  0, 34, 34, 34,
-     1,  5,  4, 26,  0,  0, 27,  0,  9,  4,  6,  0, 12, 12,  0,  4,
-     0,  0,  1,  1,  0,  0, 27, 27,  9,  9,  5,  1,  1,  2,  4,  3,
-     0,  0, 29,  1,  9,  9,  9,  1,  1,  2,  5,  4,  3,  0,  0,  0,
-     1,  1,  2,  5,  4,  0,  0,  0,  9,  1,  2,  5,  2,  9,  9,  9,
-     9,  9,  5,  4,  0, 20, 20, 20,  9,  9,  9,  6,  2,  5,  4,  0,
-     5,  3,  0,  0,  8,  9,  9,  9,  9,  9,  9, 12, 12, 12, 12, 29,
-     6,  1,  1,  1,  1,  2, 15, 20, 20, 20, 20, 11,  0, 11,  0,  7,
-    15, 15, 15, 15, 15, 15, 21, 21, 21, 21,  1,  2, 26,  7,  0,  0,
-     0,  3,  0,  0,  0,  0, 19, 19,  9,  1,  1,  0,  0,  0,  9,  0,
-     1,  2,  4,  9,  6,  7, 16, 20,  9,  1,  2,  7, 12, 12, 11,  9,
-};
-
-/* Indic_Syllabic_Category: 3496 bytes. */
-
-RE_UINT32 re_get_indic_syllabic_category(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-
-    f = ch >> 13;
-    code = ch ^ (f << 13);
-    pos = (RE_UINT32)re_indic_syllabic_category_stage_1[f] << 6;
-    f = code >> 7;
-    code ^= f << 7;
-    pos = (RE_UINT32)re_indic_syllabic_category_stage_2[pos + f] << 5;
-    f = code >> 2;
-    code ^= f << 2;
-    pos = (RE_UINT32)re_indic_syllabic_category_stage_3[pos + f] << 2;
-    value = re_indic_syllabic_category_stage_4[pos + code];
-
-    return value;
-}
-
-/* Emoji. */
-
-static RE_UINT8 re_emoji_stage_1[] = {
-    0, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1,
-};
-
-static RE_UINT8 re_emoji_stage_2[] = {
-    0, 1, 1, 1, 1, 1, 1, 1, 2, 3, 4, 1, 5, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 6, 7, 8, 1,
-};
-
-static RE_UINT8 re_emoji_stage_3[] = {
-     0,  1,  2,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
-     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
-     3,  4,  1,  1,  5,  1,  6,  1,  1,  1,  1,  1,  7,  1,  1,  8,
-     1,  1,  1,  9,  1,  1, 10, 11, 12, 13, 14, 15, 16, 17, 18,  1,
-     1,  1,  1,  1, 19,  1,  1,  1,  1,  1,  1,  1, 20, 21,  1,  1,
-    22,  1,  1,  1,  1,  1,  1,  1,  1,  1, 23,  1,  1,  1,  1,  1,
-    24,  1,  1, 25,  1, 26, 27, 28, 29, 30,  1,  1, 31, 32, 33, 34,
-    32, 32, 32, 35, 36, 37, 38, 39, 32, 40, 32, 41,  1,  1,  1, 42,
-     1,  1,  1,  1, 43, 44, 45, 46,  1, 47, 48,  1,  1,  1,  1,  1,
-};
-
-static RE_UINT8 re_emoji_stage_4[] = {
-      0,   0,   0,   0,   8,   4, 255,   3,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,  66,   0,   0,   0,   0,   0,   0,   0,   0,   0,  16,
-      0,   2,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   4,   0,   0,   2,
-      0,   0, 240,   3,   0,   6,   0,   0,   0,   0,   0,  12,   0,   1,   0,   0,
-      0, 128,   0,   0,   0, 254,  15,   7,   4,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,  12,  64,   0,   1,   0,   0,   0,   0,   0,   0, 120,
-     31,  64,  50,  33,  77, 196,   0,   7,   5, 255,  15, 128, 105,   1,   0, 200,
-      0,   0, 252,  26,   3,  12,   3,  96,  48, 193,  26,   0,   0,   6, 191,  39,
-     36, 191,  84,  32,   2,   1,  24,   0, 144,  80, 184,   0,  24,   0,   0,   0,
-      0,   0, 224,   0,   2,   0,   1, 128,   0,   0,   0,   0,   0,   0,  48,   0,
-    224,   0,   0,  24,   0,   0,   0,   0,   0,   0,  33,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   1,  32,   0,   0, 128,   2,   0,   0,   0,   0,
-     16,   0,   0,   0,   0,   0,   0,   0,   0, 128,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   3, 192,   0,  64, 254,   7,   0,   0,   0,   0,
-      0,   0,   0,   0, 192, 255, 255, 255,   6,   0,   0,   4,   0, 128, 252,   7,
-      0,   0,   3,   0,   0,   0,   0,   0, 255, 255, 255, 255, 243, 255, 255, 255,
-    255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 207, 206, 255, 255, 255, 255,
-    255, 255, 255, 255, 255, 255, 185, 255, 255, 255, 255, 255, 255, 255, 255, 191,
-    255, 255, 255, 255, 255, 255, 255,  63,   0, 126, 255, 255, 255, 128, 249,   7,
-    128,  60,  97,   0,  48,   1,   6,  16,  28,   0,  14, 112,  10, 129,   8, 252,
-    255, 255,   0,   0,   0,   0,   0,   0,  63, 248,  39,   0,  63,  26, 249,   7,
-      0,   0,   0,   0, 255,  15,   0,   0,   0, 224, 255, 255, 255, 255, 255, 247,
-    191, 255, 255, 255, 255, 255, 123, 252, 255, 255, 255, 255, 231, 199, 255, 255,
-    255, 231, 255, 255, 255, 255, 255, 255,   0,   0,   0,   0,   0,   0,  15,   7,
-      7,   0,  63,   0,   0,   0,   0,   0,
-};
-
-/* Emoji: 652 bytes. */
-
-RE_UINT32 re_get_emoji(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-
-    f = ch >> 14;
-    code = ch ^ (f << 14);
-    pos = (RE_UINT32)re_emoji_stage_1[f] << 4;
-    f = code >> 10;
-    code ^= f << 10;
-    pos = (RE_UINT32)re_emoji_stage_2[pos + f] << 4;
-    f = code >> 6;
-    code ^= f << 6;
-    pos = (RE_UINT32)re_emoji_stage_3[pos + f] << 6;
-    pos += code;
-    value = (re_emoji_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1;
-
-    return value;
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,
+      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,
+      6,   6,   6,   6,   6,   6,  80,   0,   6,   6,   6,   6,   6,   6,   6,   6,
+      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,
+      6,   6,   6,   6,   6,   6,   6,   6,   6,  94,   6,   6,   6,   6,   6,   6,
+     80,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,
+      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,
+      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,
+      6,   6,   6,   6,   6, 269,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,
+      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,
+      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6, 111,
+      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,
+     80,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,
+      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,  29,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   6,   6,   6,   6,   6,   6,   6,  89,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0
+};
+
+static RE_UINT8 re_word_table_3[] = {
+      0,   0,   0,   0,   0,   0, 255,   3, 254, 255, 255, 135, 254, 255, 255,   7,
+      0,   4,  32,   4, 255, 255, 127, 255, 255, 255, 255, 255, 195, 255,   3,   0,
+     31,  80,   0,   0, 255, 255, 223, 188,  64, 215, 255, 255, 251, 255, 255, 255,
+    255, 255, 191, 255, 255, 255, 254, 255, 255, 255, 127,   2, 255,   1, 254, 255,
+    255, 255, 255, 191, 182,   0, 255, 255, 255, 135,   7,   0,   0,   0, 255,   7,
+    255, 195, 255, 255, 255, 255, 239, 159, 255, 253, 255, 159,   0,   0, 255, 255,
+    255, 231, 255, 255, 255, 255,   3,   0, 255, 255,  63,  36, 255,  63,   0,   0,
+    255, 255, 255,  15, 255,   7,   0,   0, 255, 255, 223, 255, 255,   0, 248, 255,
+    207, 255, 254, 255, 239, 159, 249, 255, 255, 253, 197, 243, 159, 121, 128, 176,
+    207, 255,   3,  80, 238, 135, 249, 255, 255, 253, 109, 211, 135,  57,   2,  94,
+    192, 255,  63,   0, 238, 191, 251, 255, 255, 253, 237, 243, 191,  59,   1,   0,
+    207, 255,   0, 254, 238, 159, 249, 255, 159,  57, 224, 176, 207, 255,   2,   0,
+    236, 199,  61, 214,  24, 199, 255, 195, 199,  61, 129,   0, 192, 255,   0,   0,
+    255, 223, 253, 255, 255, 253, 255, 227, 223,  61,  96,   7, 207, 255,   0,   0,
+    239, 223, 253, 255, 255, 253, 239, 243, 223,  61,  96,  64, 207, 255,   6,   0,
+    223, 125, 240, 128, 207, 255,   0, 252, 238, 255, 127, 252, 255, 255, 251,  47,
+    127, 132,  95, 255, 192, 255,  12,   0, 254, 255, 255, 255, 255, 255, 255,   7,
+    255, 127, 255,   3, 214, 247, 255, 255, 175, 255, 255,  63,  95,  63, 255, 243,
+      1,   0,   0,   3, 255,   3, 160, 194, 255, 254, 255, 255, 255,  31, 254, 255,
+    223, 255, 255, 254, 255, 255, 255,  31,  64,   0,   0,   0, 255,   3, 255, 255,
+    255, 255, 255,  63, 191,  32, 255, 255, 255, 255, 255, 247, 255,  61, 127,  61,
+    255,  61, 255, 255, 255, 255,  61, 127,  61, 255, 127, 255, 255, 255,  61, 255,
+    255, 255, 255, 231, 255, 255,   0,   0, 255, 255,  63,  63, 255, 159, 255, 255,
+    255, 199, 255,   1, 255, 223,  31,   0, 255, 255,  31,   0, 255, 255,  15,   0,
+    255, 223,  13,   0, 255, 255, 143,  48, 255,   3,   0,   0,   0,  56, 255,   3,
+    255, 255, 255,   1, 255,   7, 255, 255, 255, 255,  63,   0, 255, 255, 255, 127,
+    255,  15, 255,  15, 192, 255, 255, 255, 255,  63,  31,   0, 255,  15, 255, 255,
+    255,   3, 255,   3, 255, 255, 255, 159, 128,   0, 255, 255,   1,   0,   0,   0,
+    255,  15, 255,   3,   0, 248,  15,   0, 255, 255, 255,   0, 255, 227, 255, 255,
+    255,   1, 255, 255,   0,   0, 247, 255, 255, 255, 255, 251,  63,  63, 255, 170,
+    255, 255, 223,  95, 220,  31, 207,  15, 255,  31, 220,  31,   0,  48,   0,   0,
+      0,   0,   0, 128,   1,   0,  16,   0,   0,   0,   2, 128,   0,   0, 255,  31,
+    255, 255,   1,   0, 132, 252,  47,  62,  80, 189, 255, 243, 224,  67,   0,   0,
+    255,   1,   0,   0,   0,   0, 192, 255, 255, 127, 255, 255,  31, 248,  15,   0,
+    255, 128,   0, 128, 255, 255, 127,   0, 127, 127, 127, 127,   0, 128,   0,   0,
+    224,   0,   0,   0, 254, 255,  62,  31, 255, 255, 127, 230, 224, 255, 255, 255,
+    255, 127,   0,   0, 255,  31,   0,   0, 255,  31, 255, 255, 255,  15,   0,   0,
+    255, 255, 247, 191,   0,   0, 128, 255, 252, 255, 255, 255, 255, 249, 255, 255,
+    252,   7,   0,   0,   0,   0, 224, 255, 255,  16,   0,   0,  63,   0, 255,   3,
+    255, 255, 255, 232, 255,  63, 255, 255,   1, 128, 255,   3, 255,  63, 255,   3,
+    255, 255, 127, 252,   7,   0,   0,  56, 255, 255, 124,   0, 126, 126, 126,   0,
+    127, 127, 255, 255, 255,  55, 255,   3,  15,   0, 255, 255, 127, 248, 255, 255,
+    255, 255, 255,   3, 127,   0, 248, 224, 255, 253, 127,  95, 219, 255, 255, 255,
+      0,   0, 248, 255, 255, 255, 252, 255, 255,   0,   0,   0,   0,   0, 255,  15,
+    255, 255,  24,   0,   0, 224,   0,   0,   0,   0, 223, 255, 252, 252, 252,  28,
+    255, 239, 255, 255, 127, 255, 255, 183, 255,  63, 255,  63,   0,   0,   0,  32,
+      0, 224, 255, 255,  15, 255,  62,   0, 255, 255,  15, 255, 255,   0, 255, 255,
+     15,   0,   0,   0,  63, 253, 255, 255, 255, 255, 191, 145, 255, 255,  55,   0,
+    255, 255, 255, 192, 111, 240, 239, 254, 255, 255,  63, 135, 127,   0,   0,   0,
+    255, 255,   7,   0, 255,   0, 255,   3, 255,  27,   3,   0,  31,   0,   0,   0,
+    192, 255,   0, 128, 255,   1, 255,   3, 240,   0, 255, 255, 255, 255,  79,   0,
+     31, 222, 255,  23, 255, 255, 251, 255, 255, 255, 255,  64, 127, 189, 255, 191,
+    255,   7, 255,   3, 255, 253, 237, 251, 159,  57, 129, 224, 207,  31,  31,   0,
+    255,   7, 255, 195,   3,   0,   0,   0, 191,   0, 255,   3, 255, 255,  63, 255,
+      1,   0,   0,  63,  17,   0, 255,   3, 255,   3,   0, 128, 127, 242, 111, 255,
+    255, 255, 191, 249,  15,   0, 255,   3, 255, 252, 255, 255, 255, 255, 255, 252,
+     27,   0,   0,   0, 255, 255, 255,  35, 255, 253, 255, 255,   1,   0, 255,   3,
+      0,   0, 252, 255, 255, 254, 127,   0, 127, 251, 255, 255, 255, 255, 127, 180,
+    191, 253, 255, 255, 255, 127, 251,   1,   0,   0,   1,   0, 248, 255, 255, 224,
+    255, 135, 255, 255, 255, 128, 255, 255,  27,   0,   3,   0,   0,   0,   7,   0,
+    255,   7, 255,  31, 255,   1, 255,  99, 224, 227,   7, 248, 231,  15,   0,   0,
+      0,  60,   0,   0,  28,   0,   0,   0, 255, 255, 255, 223, 100, 222, 255, 235,
+    239, 255, 255, 255, 191, 231, 223, 223, 255, 255, 255, 123,  95, 252, 253, 255,
+     63, 255, 255, 255, 253, 255, 255, 247, 247, 207, 255, 255, 255, 255, 127, 248,
+    255,  31,  32,   0,  16,   0,   0, 248, 254, 255,   0,   0, 127, 255, 255, 249,
+    219,   7,   0,   0, 255,  31, 255,  63, 255,  67,   0,   0,  31,   0, 127,   0,
+    150, 254, 247,  10, 132, 234, 150, 170, 150, 247, 247,  94, 255, 251, 255,  15,
+    238, 251, 255,  15,   3,   0, 255, 255
+};
+
+RE_UINT32 re_get_word(RE_UINT32 codepoint) {
+    RE_UINT32 field_2;
+    RE_UINT32 field_1;
+    RE_UINT32 field_0;
+    RE_UINT32 offset;
+    RE_UINT32 v;
+
+    field_2 = codepoint >> 10;
+    field_1 = (codepoint >> 5) & 0x1F;
+    field_0 = (codepoint >> 3) & 0x3;
+    offset = codepoint & 0x7;
+
+    v = re_word_table_1[field_2];
+    v = re_word_table_2[(v << 5) | field_1];
+    v = re_word_table_3[(v << 2) | field_0];
+
+    return (v >> offset) & 0x1;
 }
 
-/* Emoji_Presentation. */
-
-static RE_UINT8 re_emoji_presentation_stage_1[] = {
-    0, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1,
+/* Word_Break. */
+static RE_UINT8 re_word_break_table_1[] = {
+     0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 13, 14, 15, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 16, 10, 10, 10, 10, 10, 10, 10, 10, 17, 18,
+    19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 10, 10, 13, 29, 10, 10,
+    10, 30, 10, 10, 10, 10, 10, 10, 10, 10, 31, 32, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 33, 10, 10, 34,
+    10, 10, 10, 10, 35, 36, 37, 10, 38, 10, 39, 40, 41, 10, 42, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    43, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10
+};
+
+static RE_UINT16 re_word_break_table_2[] = {
+      0,   1,   2,   3,   4,   5,   6,   6,   7,   7,   7,   7,   7,   7,   7,   7,
+      7,   7,   7,   7,   7,   7,   8,   7,   9,   9,   9,  10,  11,  12,   7,  13,
+      7,   7,   7,   7,  14,   7,   7,   7,   7,  15,  16,   7,  17,  18,  19,  20,
+     21,   7,  22,  23,   7,   7,  24,  25,  26,  27,  28,   7,   7,  29,  30,  31,
+     32,  33,  34,  35,  36,  37,  38,  39,  40,  41,  42,  43,  44,  45,  46,  47,
+     48,  49,  50,  51,  52,  53,  54,  55,  56,  53,  57,  58,  59,  60,  61,  62,
+     63,  64,  65,  66,  67,  68,  69,  70,  71,  72,  73,  74,  75,  76,  77,  78,
+     36,  79,  80,  36,  36,  81,  82,  36,  83,  84,  85,  86,  87,  88,  89,  36,
+     36,  90,  91,  92,  93,   7,  94,  95,   7,   7,   7,   7,   7,   7,   7,   7,
+      7,   7,  96,   7,  97,  98,  99,   7, 100,   7, 101,  36, 102,   7,   7, 103,
+    104,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
+      7,   7,   7, 105, 106,   7,   7, 107, 108, 109, 110, 111,  36, 112, 113, 114,
+    115,   7,   7, 116, 117, 118,   7, 119, 120, 121,  62,  36,  36,  36, 122,  36,
+    123,  36, 124, 125, 126, 127, 128,  36, 129, 130, 131, 132, 133, 134,   7, 135,
+      7, 136, 137, 138, 139, 140, 141, 142,   7,   7,   7,   7,   7,   7,   9, 143,
+      7,   7,   7,   7,   7,   7,   7,   7, 103,   7, 144, 138,   7, 145, 146, 147,
+    148, 149, 150, 151, 152,  36, 127, 153, 154, 155, 156,   7, 157,  36,  36,  36,
+     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,
+     36,  36,  36,  36,  36, 158,   7, 159,  36,  36,  36,  36,  36,  36,  36,  36,
+     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,
+     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,
+     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,
+      7, 160, 120,   7,   7,   7,   7, 161,   7,  94,   7, 162, 163, 164, 164,   9,
+     36, 165,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,
+    166, 167,  36,  36, 168, 169, 169, 170, 171,  15,   7,   7, 172,   7,  36, 173,
+     36,  36,  36,  36,  36,  36, 173, 174, 169, 169, 175,  36,  36,  36,  36,  36,
+      7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
+      7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
+      7,   7,   7,   7, 176,  36, 177, 138,   7,   7,   7,   7,   7,   7,   7,   7,
+    178, 179,   7, 180, 181,   7,   7, 182, 183,   7,   7,   7,   7,   7, 184, 185,
+    186, 187,   7, 188, 189, 130, 190, 191,  30, 192, 193, 194,  40, 195, 196, 197,
+      7, 198, 199, 200,  36, 201, 202, 203, 204, 205,   7, 206,   7,   7,   7, 207,
+      7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
+      7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7, 208, 209, 210,
+     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,
+     36,  36,  36,  36,  36,  36,  36,  36, 211, 212, 213,   7,   7, 214, 215,   7,
+      7,   7,   7,   7,   7,   7,   7,   7,   7, 138, 177,   7, 216,   7, 217, 218,
+    219, 220, 221, 222,   7,   7,   7, 223, 224,   2,   3, 225, 226, 120, 227, 228,
+    229, 230, 231,  36,   7,   7,   7, 232,  36,  36,   7, 233,  36,  36,  36, 234,
+     36,  36,  36,  36, 194,   7, 235, 128,   7, 236, 237, 238, 138,   7, 239,  36,
+      7,   7,   7,   7, 138, 240, 241, 210,   7, 242,   7, 243,  36,  36,  36,  36,
+      7,   7,   7,   7,   7,   7,   7,   7,   7, 163, 119, 217,  36,  36,  36,  36,
+    244, 245, 119, 163, 120,  36,  36, 246, 119, 247,  36,  36,   7,   8,  36,  36,
+    248, 249,  36, 194, 194,  36,  85, 250,   7, 119, 119, 251, 214,  36,  36,  36,
+      7,   7, 157,  36,   7, 251,   7, 251,   7, 252,  36,  36,  36,  36,  36,  36,
+     36,  36,  36,  36,   7, 253,  36,  36, 194, 254, 255,  36,  36, 177, 256, 163,
+    133, 257, 258, 259, 133, 260, 261, 262, 133, 263, 264, 265, 133, 195, 266,  36,
+    267, 268,  36,  36, 269, 139, 270, 271, 272, 273, 274, 275,  36,  36,  36,  36,
+      7, 276, 277, 278,   7,  27, 279,  36,  36,  36,  36,  36,   7, 280, 281,  36,
+      7,  27, 282,  36,   7, 283, 114,  36, 284, 285,  36,  36,  36,  36,  36,  36,
+      7, 286,  36,  36,  36,   7,   7, 287, 288, 289, 290,  36,  36, 291, 292, 293,
+    294, 295, 296,   7, 297,  36,   7, 116,  36,  36,  36,  36,  36,  36,  36,  36,
+    298, 299, 300, 301, 302, 303,  36,  36, 304, 305, 306, 307, 308, 114,  36,  36,
+     36,  36,  36,  36,  36,  36,  36, 309,  36,  36,  36,  36,  36, 310,  36,  36,
+      7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
+      7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7, 247,  36,  36,  36,
+      7,   7,   7, 172,   7,   7,   7,   7,   7,   7, 243,  36,  36,  36,  36,  36,
+     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,
+      7, 311,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,
+     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,
+      7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
+      7,   7, 312,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,
+      7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
+      7, 116, 120, 114,  36,  36, 177, 313,   7, 314, 315, 316, 102,  36,  36,  36,
+     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,
+     36,  36,   7,   7,  36,  36,  36,  36,   7,   7, 317,   9, 318,  36,  36, 319,
+    320,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36, 321,  36,  36,  36,  36,
+     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,
+      7,   7,   7, 322, 323, 324,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,
+     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,
+     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36, 325, 326, 327,  36,  36,
+     36,  36, 328,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,
+      7,   7,  37,   7, 329, 330, 331,   7, 332, 333, 334,   7,   7,   7,   7,   7,
+      7,   7,   7,   7,   7, 335, 336,  95,  37,  37, 160, 160, 298, 298, 337, 338,
+     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,
+      9, 339,   9, 340, 341, 342,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,
+    343, 344,  36,  36,  36,  36,  36,  36,   7, 345, 346,  36,  36,  36,  36,  36,
+     36,  36,  36,  36,  36,  36,   7, 347,  36,  36,  36,  36,  36,  36,  36,  36,
+      7,   7,   7,   7,   7,   7, 348,  36,   7,   7, 349,  36,  36,  36,  36,  36,
+     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,
+     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,
+    331, 350, 351, 352, 353, 354,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,
+     36,  36,  36,  36,  36,  36,  36,  36,  36, 177, 206, 206, 159,  36,  36, 355,
+     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36, 356,
+     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,
+     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36, 122,
+    357,   9,   9,   9,  36,  36,  36,  36,   9,   9,   9,   9,   9,   9,   9, 358,
+     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36
 };
 
-static RE_UINT8 re_emoji_presentation_stage_2[] = {
+static RE_UINT8 re_word_break_table_3[] = {
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  2,  2,  3,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     4,  0,  5,  0,  0,  0,  0,  6,  0,  0,  0,  0,  7,  0,  8,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9, 10,  7,  0,  0,  0,  0,
+     0, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,  0,  0,  0,  0, 12,
+     0, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  2,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 11,  0,  0, 13,  0,  0,
+     0,  0,  0,  0,  0, 11,  0, 10,  0,  0, 11,  0,  0,  0,  0,  0,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11,  0, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11,  0,  0,  0,  0,  0,  0, 11, 11,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    11, 11, 11, 11, 11,  0, 11, 11,  0,  0, 11, 11, 11, 11,  7, 11,
+     0,  0,  0,  0,  0,  0, 11, 10, 11, 11, 11,  0, 11,  0, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11,  0, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11,  0, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11,  0, 14, 14, 14, 14, 14, 14, 14, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+     0, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11,  0,  0, 11, 11, 11, 11,  0, 11, 10,
+    11, 11, 11, 11, 11, 11, 11, 11, 11,  7, 11,  0,  0,  0,  0,  0,
+     0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,  0, 14,
+     0, 14, 14,  0, 14, 14,  0, 14,  0,  0,  0,  0,  0,  0,  0,  0,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,  0,  0,  0,  0, 15,
+    15, 15, 15, 11, 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    13, 13, 13, 13, 13, 13,  0,  0,  0,  0,  0,  0,  7,  7,  0,  0,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,  0, 13,  0,  0,  0,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  9,  7,  0, 11, 11,
+    14, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11,  0, 11, 14, 14, 14, 14, 14, 14, 14, 13,  0, 14,
+    14, 14, 14, 14, 14, 11, 11, 14, 14,  0, 14, 14, 14, 14, 11, 11,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9, 11, 11, 11,  0,  0, 11,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 13,
+    11, 14, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,  0,  0, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 11,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 11, 11,  0,  0,  7,  0, 11,  0,  0, 14,  0,  0,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 14, 14, 14, 14, 11, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 11, 14, 14, 14, 11, 14, 14, 14, 14, 14,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 14, 14, 14,  0,  0,  0,  0,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11,  0, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 14, 14, 14, 11, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    11, 14, 14, 14, 14, 14, 14, 14, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 14, 14,  0,  0,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     0, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 14, 14, 14,  0, 11, 11, 11, 11, 11, 11, 11, 11,  0,  0, 11,
+    11,  0,  0, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11,  0, 11, 11, 11, 11, 11, 11,
+    11,  0, 11,  0,  0,  0, 11, 11, 11, 11,  0,  0, 14, 11, 14, 14,
+    14, 14, 14, 14, 14,  0,  0, 14, 14,  0,  0, 14, 14, 14, 11,  0,
+     0,  0,  0,  0,  0,  0,  0, 14,  0,  0,  0,  0, 11, 11,  0, 11,
+    11, 11, 14, 14,  0,  0,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+    11, 11,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 11,  0, 14,  0,
+     0, 14, 14, 14,  0, 11, 11, 11, 11, 11, 11,  0,  0,  0,  0, 11,
+    11,  0,  0, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11,  0, 11, 11, 11, 11, 11, 11,
+    11,  0, 11, 11,  0, 11, 11,  0, 11, 11,  0,  0, 14,  0, 14, 14,
+    14, 14, 14,  0,  0,  0,  0, 14, 14,  0,  0, 14, 14, 14,  0,  0,
+     0, 14,  0,  0,  0,  0,  0,  0,  0, 11, 11, 11, 11,  0, 11,  0,
+     0,  0,  0,  0,  0,  0,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+    14, 14, 11, 11, 11, 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0, 14, 14, 14,  0, 11, 11, 11, 11, 11, 11, 11, 11, 11,  0, 11,
+    11, 11,  0, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11,  0, 11, 11, 11, 11, 11, 11,
+    11,  0, 11, 11,  0, 11, 11, 11, 11, 11,  0,  0, 14, 11, 14, 14,
+    14, 14, 14, 14, 14, 14,  0, 14, 14, 14,  0, 14, 14, 14,  0,  0,
+    11,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    11, 11, 14, 14,  0,  0,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     0,  0,  0,  0,  0,  0,  0,  0,  0, 11, 14, 14, 14, 14, 14, 14,
+     0, 14, 14, 14,  0, 11, 11, 11, 11, 11, 11, 11, 11,  0,  0, 11,
+    11,  0,  0, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    14, 14, 14, 14, 14,  0,  0, 14, 14,  0,  0, 14, 14, 14,  0,  0,
+     0,  0,  0,  0,  0, 14, 14, 14,  0,  0,  0,  0, 11, 11,  0, 11,
+    11, 11, 14, 14,  0,  0,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     0, 11,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0, 14, 11,  0, 11, 11, 11, 11, 11, 11,  0,  0,  0, 11, 11,
+    11,  0, 11, 11, 11, 11,  0,  0,  0, 11, 11,  0, 11,  0, 11, 11,
+     0,  0,  0, 11, 11,  0,  0,  0, 11, 11, 11,  0,  0,  0, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11,  0,  0,  0,  0, 14, 14,
+    14, 14, 14,  0,  0,  0, 14, 14, 14,  0, 14, 14, 14, 14,  0,  0,
+    11,  0,  0,  0,  0,  0,  0, 14,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    14, 14, 14, 14, 14, 11, 11, 11, 11, 11, 11, 11, 11,  0, 11, 11,
+    11,  0, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11,  0, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11,  0,  0,  0, 11, 14, 14,
+    14, 14, 14, 14, 14,  0, 14, 14, 14,  0, 14, 14, 14, 14,  0,  0,
+     0,  0,  0,  0,  0, 14, 14,  0, 11, 11, 11,  0,  0,  0,  0,  0,
+    11, 11, 14, 14,  0,  0,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    11, 14, 14, 14,  0, 11, 11, 11, 11, 11, 11, 11, 11,  0, 11, 11,
+    11,  0, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11,  0, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11,  0, 11, 11, 11, 11, 11,  0,  0, 14, 11, 14, 14,
+    14, 14, 14, 14, 14,  0, 14, 14, 14,  0, 14, 14, 14, 14,  0,  0,
+     0,  0,  0,  0,  0, 14, 14,  0,  0,  0,  0,  0,  0,  0, 11,  0,
+    11, 11, 14, 14,  0,  0,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     0, 11, 11,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    14, 14, 14, 14, 11, 11, 11, 11, 11, 11, 11, 11, 11,  0, 11, 11,
+    11,  0, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 14, 14, 11, 14, 14,
+    14, 14, 14, 14, 14,  0, 14, 14, 14,  0, 14, 14, 14, 14, 11,  0,
+     0,  0,  0,  0, 11, 11, 11, 14,  0,  0,  0,  0,  0,  0,  0, 11,
+    11, 11, 14, 14,  0,  0,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 11, 11, 11, 11, 11, 11,
+     0, 14, 14, 14,  0, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11,  0,  0,  0, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11,  0, 11, 11, 11, 11, 11, 11, 11, 11, 11,  0, 11,  0,  0,
+    11, 11, 11, 11, 11, 11, 11,  0,  0,  0, 14,  0,  0,  0,  0, 14,
+    14, 14, 14, 14, 14,  0, 14,  0, 14, 14, 14, 14, 14, 14, 14, 14,
+     0,  0,  0,  0,  0,  0,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     0,  0, 14, 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0, 14,  0,  0, 14, 14, 14, 14, 14, 14, 14,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0, 14, 14, 14, 14, 14, 14, 14, 14,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0, 14,  0,  0, 14, 14, 14, 14, 14, 14, 14, 14, 14,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0, 14, 14, 14, 14, 14, 14,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,  0,  0,
+    11,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0, 14, 14,  0,  0,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0, 14,  0, 14,  0, 14,  0,  0,  0,  0, 14, 14,
+    11, 11, 11, 11, 11, 11, 11, 11,  0, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,  0,  0,  0,
+     0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14,  0, 14, 14, 11, 11, 11, 11, 11, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14,  0, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,  0,  0,  0,
+     0,  0,  0,  0,  0,  0, 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0, 14, 14, 14, 14,  0,  0,  0,  0, 14, 14,
+    14,  0, 14, 14, 14,  0,  0, 14, 14, 14, 14, 14, 14, 14,  0,  0,
+     0, 14, 14, 14, 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,  0, 14,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9, 14, 14, 14, 14,  0,  0,
+    11, 11, 11, 11, 11, 11,  0, 11,  0,  0,  0,  0,  0, 11,  0,  0,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,  0, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11,  0, 11, 11, 11, 11,  0,  0,
+    11, 11, 11, 11, 11, 11, 11,  0, 11,  0, 11, 11, 11, 11,  0,  0,
+    11, 11, 11, 11, 11, 11, 11, 11, 11,  0, 11, 11, 11, 11,  0,  0,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11,  0, 11, 11, 11, 11,  0,  0, 11, 11, 11, 11, 11, 11, 11,  0,
+    11,  0, 11, 11, 11, 11,  0,  0, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11,  0, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11,  0, 11, 11, 11, 11,  0,  0, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,  0,  0, 14, 14, 14,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11,  0,  0, 11, 11, 11, 11, 11, 11,  0,  0,
+     0, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,  0,  0, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+     4, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,  0,  0,  0,  0,  0,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,  0,  0,  0, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11,  0,  0,  0,  0,  0,  0,  0,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,  0, 11, 11,
+    11, 11, 14, 14, 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 14, 14, 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 14, 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,  0, 11, 11,
+    11,  0, 14, 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14,  0,  0,  0,  0,  0,  0,  0,  0,  0, 14,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 14, 14, 14, 13,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,  0,  0,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11,  0,  0,  0,  0,  0,  0,  0,
+    11, 11, 11, 11, 11, 14, 14, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 14, 11,  0,  0,  0,  0,  0,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,  0,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,  0,  0,  0,  0,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,  0,  0,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 14, 14, 14, 14, 14,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,  0,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,  0,  0, 14,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    14, 14, 14, 14, 14, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 11, 11, 11, 11, 11, 11, 11,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 14, 14, 14, 14, 14,
+    14, 14, 14, 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    14, 14, 14, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 11, 11,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    11, 11, 11, 11, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14,  0,  0,  0,  0,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0, 11, 11, 11,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,  0,  0,
+    11, 11, 11, 11, 11, 11, 11, 11, 11,  0,  0,  0,  0,  0,  0,  0,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,  0,  0, 11, 11, 11,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    14, 14, 14,  0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 11, 11, 11, 11, 14, 11, 11,
+    11, 11, 11, 11, 14, 11, 11, 14, 14, 14, 11,  0,  0,  0,  0,  0,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14,  0, 14, 14, 14, 14, 14,
+    11, 11, 11, 11, 11, 11,  0,  0, 11, 11, 11, 11, 11, 11,  0,  0,
+    11, 11, 11, 11, 11, 11, 11, 11,  0, 11,  0, 11,  0, 11,  0, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11,  0, 11, 11, 11, 11, 11, 11, 11,  0, 11,  0,
+     0,  0, 11, 11, 11,  0, 11, 11, 11, 11, 11, 11, 11,  0,  0,  0,
+    11, 11, 11, 11,  0,  0, 11, 11, 11, 11, 11, 11,  0,  0,  0,  0,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,  0,  0,  0,
+     0,  0, 11, 11, 11,  0, 11, 11, 11, 11, 11, 11, 11,  0,  0,  0,
+     4,  4,  4,  4,  4,  4,  4,  0,  4,  4,  4,  0, 14, 16, 13, 13,
+     0,  0,  0,  0,  0,  0,  0,  0,  8,  8,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  8,  0,  0, 10,  2,  2, 13, 13, 13, 13, 13, 12,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 12,
+    12,  0,  0,  0,  7,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0, 12,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  4,
+    13, 13, 13, 13, 13,  0, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+     0, 11,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 11,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,  0,  0,  0,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0, 11,  0,  0,  0,  0, 11,  0,  0, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11,  0, 11,  0,  0,  0, 11, 11, 11, 11, 11,  0,  0,
+     0,  0,  0,  0, 11,  0, 11,  0, 11,  0, 11, 11, 11, 11,  0, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11,  0,  0, 11, 11, 11, 11,
+     0,  0,  0,  0,  0, 11, 11, 11, 11, 11,  0,  0,  0,  0, 11,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    11, 11, 11, 11, 11, 11, 11, 11, 11,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,  0,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11,  0,  0,  0,  0,  0,  0, 11, 11, 11, 11, 14,
+    14, 14, 11, 11,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    11, 11, 11, 11, 11, 11, 11, 11,  0,  0,  0,  0,  0,  0,  0, 11,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 14,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    11, 11, 11, 11, 11, 11, 11,  0, 11, 11, 11, 11, 11, 11, 11,  0,
+    11, 11, 11, 11, 11, 11, 11,  0, 11, 11, 11, 11, 11, 11, 11,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 11,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     4,  0,  0,  0,  0, 11,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 14, 14, 14, 14, 14, 14,
+     0, 17, 17, 17, 17, 17,  0,  0,  0,  0,  0, 11, 11,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0, 14, 14, 17, 17,  0,  0,  0,
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,  0, 17, 17, 17, 17,
+     0,  0,  0,  0,  0, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,  0,
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+    17, 17, 17, 17, 17, 17, 17, 17,  0,  0,  0,  0,  0,  0,  0,  0,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,  0,  0,  0,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9, 11, 11,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 14,
+    14, 14, 14,  0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,  0, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 14, 14,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    14, 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+     0,  0, 11, 11, 11, 11, 11, 11, 11, 11, 11,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 14, 11, 11, 11, 14, 11, 11, 11, 11, 14, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 14, 14, 14, 14, 14,  0,  0,  0,  0, 14,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    14, 14, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    14, 14, 14, 14, 14, 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,  0,  0,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 11, 11, 11, 11, 11, 11,  0,  0,  0, 11,  0, 11, 11, 14,
+    11, 11, 11, 11, 11, 11, 14, 14, 14, 14, 14, 14, 14, 14,  0,  0,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,  0,  0,  0,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 11,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0, 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,  0,  0,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    11, 11, 11, 14, 11, 11, 11, 11, 11, 11, 11, 11, 14, 14,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 14, 14, 14,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    14,  0, 14, 14, 14,  0,  0, 14, 14,  0,  0,  0,  0,  0, 14, 14,
+     0, 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 14, 14, 14, 14, 14,
+     0,  0, 11, 11, 11, 14, 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0, 11, 11, 11, 11, 11, 11,  0,  0, 11, 11, 11, 11, 11, 11,  0,
+     0, 11, 11, 11, 11, 11, 11,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    11, 11, 11, 11, 11, 11, 11,  0, 11, 11, 11, 11, 11, 11, 11,  0,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11,  0,  0,  0,  0,  0,  0,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 14, 14, 14, 14, 14, 14, 14, 14,  0, 14, 14,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,  0,  0,
+    11, 11, 11, 11,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11,  0,  0,  0,  0, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,  0,  0,  0,  0,
+    11, 11, 11, 11, 11, 11, 11,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0, 11, 11, 11, 11, 11,  0,  0,  0,  0,  0, 15, 14, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15,  0, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15,  0, 15, 15, 15, 15, 15,  0, 15,  0,
+    15, 15,  0, 15, 15,  0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+     0,  0, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,  0,  0,  0,  0,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+     7,  0,  0, 10,  7,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+     0,  0,  0, 12, 12,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 12, 12, 12,
+     7,  0,  8,  0,  7, 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    11, 11, 11, 11, 11,  0, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,  0,  0, 13,
+     0,  0,  0,  0,  0,  0,  0,  8,  0,  0,  0,  0,  7,  0,  8,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9, 10,  7,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 14, 14,
+     0,  0, 11, 11, 11, 11, 11, 11,  0,  0, 11, 11, 11, 11, 11, 11,
+     0,  0, 11, 11, 11, 11, 11, 11,  0,  0, 11, 11, 11,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0, 13, 13, 13,  0,  0,  0,  0,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,  0, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11,  0, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,  0, 11, 11,  0, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,  0,  0,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,  0,  0,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,  0,  0,  0,  0,  0,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 14,  0,  0,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,  0,  0,  0,  0,  0,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 14, 14, 14, 14, 14,  0,  0,  0,  0,  0,
+    11, 11, 11, 11,  0,  0,  0,  0, 11, 11, 11, 11, 11, 11, 11, 11,
+     0, 11, 11, 11, 11, 11,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,  0,  0,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11,  0,  0,  0,  0, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11,  0,  0,  0,  0,  0,  0,  0,  0,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    11, 11, 11, 11, 11, 11,  0,  0, 11,  0, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11,  0, 11, 11,  0,  0,  0, 11,  0,  0, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11,  0, 11, 11,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11,  0,  0,  0,  0,  0,  0,
+    11, 14, 14, 14,  0, 14, 14,  0,  0,  0,  0,  0, 14, 14, 14, 14,
+    11, 11, 11, 11,  0, 11, 11, 11,  0, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11,  0,  0, 14, 14, 14,  0,  0,  0,  0, 14,
+    11, 11, 11, 11, 11, 14, 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,
      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  1,  2,  3,  0,  4,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    11, 11, 11, 11, 14, 14, 14, 14,  0,  0,  0,  0,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,  0,  0,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11,  0, 14, 14,  0,  0,  0,
+    11, 11,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0, 11,  0,  0,  0,  0,  0,  0,  0,  0,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    11, 11, 11, 11, 11,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,
      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 14,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,  0,  0, 13,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 13,  0,  0,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11,  0,  0,  0,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,  0,  0,
+    11, 11, 11, 11, 11, 11, 11, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14,  0,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     0,  0,  0,  0, 11, 14, 14, 11,  0,  0,  0,  0,  0,  0,  0,  0,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 14,  0,  0, 11,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    14, 11, 11, 11, 11,  0,  0,  0,  0, 14, 14, 14, 14,  0, 14, 14,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9, 11,  0, 11,  0,  0,  0,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11,  0, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14,  0,  0,  0,  0,  0,  0, 14,  0,
+    11, 11, 11, 11, 11, 11, 11,  0, 11,  0, 11, 11, 11, 11,  0, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,  0, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,  0,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,  0,  0,
+    14, 14, 14, 14,  0, 11, 11, 11, 11, 11, 11, 11, 11,  0,  0, 11,
+    11,  0,  0, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11,  0, 11, 11, 11, 11, 11, 11,
+    11,  0, 11, 11,  0, 11, 11, 11, 11, 11,  0, 14, 14, 11, 14, 14,
+    14, 14, 14, 14, 14,  0,  0, 14, 14,  0,  0, 14, 14, 14,  0,  0,
+    11,  0,  0,  0,  0,  0,  0, 14,  0,  0,  0,  0,  0, 11, 11, 11,
+    11, 11, 14, 14,  0,  0, 14, 14, 14, 14, 14, 14, 14,  0,  0,  0,
+    14, 14, 14, 14, 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 11, 11, 11, 11,  0,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0, 14, 11,
+    11, 11,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0,  0,  0,  5,  6,  7,  8,  9, 10,  0,  0,
-};
-
-static RE_UINT8 re_emoji_presentation_stage_3[] = {
+    14, 14, 14, 14, 11, 11,  0, 11,  0,  0,  0,  0,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,  0,  0,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 14,
+    14, 14, 14, 14, 14, 14,  0,  0, 14, 14, 14, 14, 14, 14, 14, 14,
+    14,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0, 11, 11, 11, 11, 14, 14,  0,  0,
+    14,  0,  0,  0, 11,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,  0,  0,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 11,  0,  0,  0,  0,  0,  0,  0,
      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0,  0,  0,  1,  0,  0,  0,  0,  0,  0,  2,
-     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  3,
-     4,  0,  5,  6,  7,  8,  9, 10, 11, 12, 13,  0, 14, 15,  0,  0,
-     0,  0,  0,  0,  0,  0,  0,  0, 16,  0, 17,  0,  0,  0,  0,  0,
-    18,  0,  0,  0,  0,  0, 19,  0,  0,  0,  0,  0, 20,  0,  0, 21,
-    22, 23, 24,  0,  0,  0,  0,  0, 25, 26, 25, 27, 28, 25, 29, 30,
-    25, 31, 32, 25, 25, 25, 25, 33, 25, 34, 35, 36, 37, 18,  0, 38,
-    25, 25, 39,  0, 25, 25, 40, 41,  0,  0,  0,  0,  0,  0,  0, 42,
-     0,  0,  0,  0,  0,  0,  0,  0, 43, 44, 45, 46, 25, 47, 48, 25,
-     0,  0,  0, 49, 50,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-};
-
-static RE_UINT8 re_emoji_presentation_stage_4[] = {
-      0,   0,   0,   0,   0,   0,   0,  12,   0,  30,   9,   0,   0,   0,   0,  96,
-      0,   0,  48,   0,   0, 255,  15,   0,   0,   0,   0, 128,   0,   0,   8,   0,
-      2,  12,   0,  96,  48,  64,  16,   0,   0,   4,  44,  36,  32,  12,   0,   0,
-      0,   1,   0,   0,   0,  80, 184,   0,   0,   0, 224,   0,   0,   0,   1, 128,
-      0,   0,   0,  24,   0,   0,  33,   0,  16,   0,   0,   0,   0, 128,   0,   0,
-      0,  64, 254,   7, 192, 255, 255, 255,   2,   0,   0,   4,   0, 128, 124,   7,
-      0,   0,   3,   0, 255, 255, 255, 255,   1, 224, 191, 255, 255, 255, 255, 223,
-    255, 255,  15,   0, 255, 135,  15,   0, 255, 255,  17, 255, 255, 255, 255, 127,
-    253, 255, 255, 255, 255, 255, 255, 159, 255, 255, 255,  63,   0, 120, 255, 255,
-    255,   0,   0,   4,   0,   0,  96,   0,   0,   0,   0, 248, 255, 255,   0,   0,
-     63,  16,  39,   0,   0,  24, 240,   7, 255,  15,   0,   0,   0, 224, 255, 255,
-    255, 255, 255, 247, 191, 255, 255, 255, 255, 255, 123, 252, 231, 199, 255, 255,
-    255, 231, 255, 255,   0,   0,  15,   7,   7,   0,  63,   0,
-};
-
-/* Emoji_Presentation: 544 bytes. */
-
-RE_UINT32 re_get_emoji_presentation(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-
-    f = ch >> 14;
-    code = ch ^ (f << 14);
-    pos = (RE_UINT32)re_emoji_presentation_stage_1[f] << 5;
-    f = code >> 9;
-    code ^= f << 9;
-    pos = (RE_UINT32)re_emoji_presentation_stage_2[pos + f] << 4;
-    f = code >> 5;
-    code ^= f << 5;
-    pos = (RE_UINT32)re_emoji_presentation_stage_3[pos + f] << 5;
-    pos += code;
-    value = (re_emoji_presentation_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1;
-
-    return value;
-}
-
-/* Emoji_Modifier. */
-
-static RE_UINT8 re_emoji_modifier_stage_1[] = {
-    0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0,
-};
-
-static RE_UINT8 re_emoji_modifier_stage_2[] = {
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0,
-};
-
-static RE_UINT8 re_emoji_modifier_stage_3[] = {
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
-};
-
-static RE_UINT8 re_emoji_modifier_stage_4[] = {
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 248,
-};
-
-/* Emoji_Modifier: 130 bytes. */
-
-RE_UINT32 re_get_emoji_modifier(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-
-    f = ch >> 15;
-    code = ch ^ (f << 15);
-    pos = (RE_UINT32)re_emoji_modifier_stage_1[f] << 4;
-    f = code >> 11;
-    code ^= f << 11;
-    pos = (RE_UINT32)re_emoji_modifier_stage_2[pos + f] << 4;
-    f = code >> 7;
-    code ^= f << 7;
-    pos = (RE_UINT32)re_emoji_modifier_stage_3[pos + f] << 7;
-    pos += code;
-    value = (re_emoji_modifier_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1;
-
-    return value;
-}
-
-/* Emoji_Modifier_Base. */
-
-static RE_UINT8 re_emoji_modifier_base_stage_1[] = {
-    0, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1,
-};
-
-static RE_UINT8 re_emoji_modifier_base_stage_2[] = {
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 4, 0,
-};
-
-static RE_UINT8 re_emoji_modifier_base_stage_3[] = {
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,  0,  0,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,  0,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 11,
+    11, 11, 11, 11, 11, 11, 11,  0,  0, 11,  0,  0, 11, 11, 11, 11,
+    11, 11, 11, 11,  0, 11, 11,  0, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    14, 14, 14, 14, 14, 14,  0, 14, 14,  0,  0, 14, 14, 14, 14, 11,
+    14, 11, 14, 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,  0,  0,
+    11, 11, 11, 11, 11, 11, 11, 11,  0,  0, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 14, 14, 14, 14, 14, 14, 14,  0,  0, 14, 14, 14, 14, 14, 14,
+    14, 11,  0, 11, 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0,  0,  0,  1,  0,  0,  2,  3,  0,  0,  0,
-     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  4,  5,
-     0,  6,  7,  0,  0,  8,  9,  0,  0, 10, 11, 12,  0,  0,  0,  0,
-     0,  0,  0,  0, 13,  0, 14, 15,  0,  0,  0,  0,  0,  0,  0,  0,
-};
-
-static RE_UINT8 re_emoji_modifier_base_stage_4[] = {
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  32,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   2,   0,  60,   0,   0,   0,   0,   0,   0,
-     32,   0,   0,   0,   0,   0,   0,   0, 156,  28,   0,   0,   0,   0,   0,   0,
-    204, 255,   1,   0, 192, 255, 255,  17, 238, 128,   2,   0,   0,   4,   0,   0,
-      0,   0,   0,   0,   0,   0,  48,   4,   0,   0,  97,   0,   0,   0,   0,   0,
-    224, 248,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   8,   0, 112,   0,
-      1,  16,   0,   0,   0,   0,   0,   0,   0, 128,   0, 255,  64,   0, 255, 115,
-      0,   0,   0,   0,   0,   0,  96,  11,   0, 224, 254,  63,   0,   0,   0,   0,
-};
-
-/* Emoji_Modifier_Base: 324 bytes. */
-
-RE_UINT32 re_get_emoji_modifier_base(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-
-    f = ch >> 14;
-    code = ch ^ (f << 14);
-    pos = (RE_UINT32)re_emoji_modifier_base_stage_1[f] << 4;
-    f = code >> 10;
-    code ^= f << 10;
-    pos = (RE_UINT32)re_emoji_modifier_base_stage_2[pos + f] << 4;
-    f = code >> 6;
-    code ^= f << 6;
-    pos = (RE_UINT32)re_emoji_modifier_base_stage_3[pos + f] << 6;
-    pos += code;
-    value = (re_emoji_modifier_base_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1;
-
-    return value;
-}
-
-/* Emoji_Component. */
-
-static RE_UINT8 re_emoji_component_stage_1[] = {
-    0, 1, 1, 2, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 4, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1,
-};
-
-static RE_UINT8 re_emoji_component_stage_2[] = {
-    0, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, 1, 5, 1,
-    6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-};
-
-static RE_UINT8 re_emoji_component_stage_3[] = {
-    0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    2, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 4, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 5, 1, 1, 1, 1, 1, 1, 1, 6,
-    1, 1, 1, 1, 1, 1, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    8, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-};
-
-static RE_UINT8 re_emoji_component_stage_4[] = {
-      0,   0,   0,   0,   8,   4, 255,   3,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,  32,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   8,   0,   0,   0,
-      0, 128,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 192, 255, 255, 255,
-      0,   0,   0,   0,   0,   0,   0, 248,   0,   0,   0,   0,   0,   0,  15,   0,
-      0,   0,   0,   0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
-};
-
-/* Emoji_Component: 340 bytes. */
-
-RE_UINT32 re_get_emoji_component(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-
-    f = ch >> 14;
-    code = ch ^ (f << 14);
-    pos = (RE_UINT32)re_emoji_component_stage_1[f] << 4;
-    f = code >> 10;
-    code ^= f << 10;
-    pos = (RE_UINT32)re_emoji_component_stage_2[pos + f] << 4;
-    f = code >> 6;
-    code ^= f << 6;
-    pos = (RE_UINT32)re_emoji_component_stage_3[pos + f] << 6;
-    pos += code;
-    value = (re_emoji_component_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1;
-
-    return value;
-}
-
-/* Extended_Pictographic. */
-
-static RE_UINT8 re_extended_pictographic_stage_1[] = {
-    0, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1,
-};
-
-static RE_UINT8 re_extended_pictographic_stage_2[] = {
-    0, 1, 1, 1, 1, 1, 1, 1, 2, 3, 4, 1, 5, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 6, 7, 8, 9,
-};
-
-static RE_UINT8 re_extended_pictographic_stage_3[] = {
-     0,  0,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    11, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 14, 14, 14, 14, 14, 14, 14, 11, 14, 14, 14, 14,  0,
+     0,  0,  0,  0,  0,  0,  0, 14,  0,  0,  0,  0,  0,  0,  0,  0,
+    11, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14,  0,  0,  0, 11,  0,  0,
+    11, 11, 11, 11, 11, 11, 11, 11, 11,  0, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 14,
+    14, 14, 14, 14, 14, 14, 14,  0, 14, 14, 14, 14, 14, 14, 14, 14,
+    11,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,  0,  0,
      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     2,  3,  0,  0,  4,  0,  5,  0,  0,  0,  0,  0,  6,  0,  7,  8,
-     0,  0,  0,  9,  0,  0, 10, 11, 12, 13, 14, 13, 15, 16, 17,  0,
-     0,  0,  0,  0, 18,  0,  0,  0,  0,  0,  0,  0, 19, 20,  0,  0,
-    21,  0,  0,  0,  0,  0,  0,  0,  0,  0, 22,  0,  0,  0,  0,  0,
-    13, 13, 13, 13, 23, 24, 25, 26, 27, 28, 13, 13, 13, 13, 13, 29,
-    13, 13, 13, 13, 30, 31, 13, 13, 13, 32, 13, 13,  0, 33,  0, 34,
-    35, 36, 37, 13, 38, 39, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 30,
-};
-
-static RE_UINT8 re_extended_pictographic_stage_4[] = {
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  66,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,  16,   0,   2,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   4,   0,   0,   2,   0,   0, 240,   3,   0,   6,   0,   0,
-      0,   0,   0,  12,   0,   1,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,
-      0, 128,   0,   0,   0, 254,  15,   7,   4,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,  12,  64,   0,   1,   0,   0,   0,   0,   0,   0, 120,
-    191, 255, 247, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
-     63,   0, 255, 255, 255, 255, 255, 255,  63, 255,  87,  32,   2,   1,  24,   0,
-    144,  80, 184,   0, 248,   0,   0,   0,   0,   0, 224,   0,   2,   0,   1, 128,
-      0,   0,   0,   0,   0,   0,  48,   0, 224,   0,   0,  24,   0,   0,   0,   0,
-      0,   0,  33,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,  32,
-      0,   0, 128,   2,   0,   0,   0,   0,   0, 224,   0,   0,   0, 128,   0,   0,
-      0,   0,   0,   0,   0, 240,   3, 192,   0,  64, 254,   7,   0, 224, 255, 255,
-    255, 255, 255, 255,  63,   0,   0,   0, 254, 255,   0,   4,   0, 128, 252, 247,
-      0, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,   7,
-    255, 255, 255, 255, 255, 255, 255,  63, 192, 255, 255, 255, 255, 255, 255, 255,
-    255, 255,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 240, 255,
-      0,   0, 224, 255, 255, 255, 255, 255,   0, 240,   0,   0,   0,   0,   0,   0,
-      0, 255,   0, 252,   0,   0,   0,   0,   0, 255,   0,   0,   0, 192, 255, 255,
-      0, 240, 255, 255, 255, 255, 255, 247, 191, 255, 255, 255, 255, 255, 255, 255,
-};
-
-/* Extended_Pictographic: 596 bytes. */
-
-RE_UINT32 re_get_extended_pictographic(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-
-    f = ch >> 14;
-    code = ch ^ (f << 14);
-    pos = (RE_UINT32)re_extended_pictographic_stage_1[f] << 4;
-    f = code >> 10;
-    code ^= f << 10;
-    pos = (RE_UINT32)re_extended_pictographic_stage_2[pos + f] << 4;
-    f = code >> 6;
-    code ^= f << 6;
-    pos = (RE_UINT32)re_extended_pictographic_stage_3[pos + f] << 6;
-    pos += code;
-    value = (re_extended_pictographic_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1;
-
-    return value;
-}
-
-/* NFD_Quick_Check. */
-
-static RE_UINT8 re_nfd_quick_check_stage_1[] = {
-    0, 1, 2, 3, 4, 1, 1, 5, 1, 1, 1, 6, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1,
-};
-
-static RE_UINT8 re_nfd_quick_check_stage_2[] = {
-     0,  1,  2,  3,  4,  5,  6,  7,  8,  5,  9,  5, 10,  5,  5,  5,
-     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
-     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5, 11, 11, 11, 11, 11,
-    11, 11, 11, 11, 11, 12,  5,  5,  5,  5,  5,  5,  5,  5, 13,  5,
-     5,  5,  5,  5, 14, 15,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
-     5,  5,  5,  5, 16,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
-     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5, 17,  5,
-};
-
-static RE_UINT8 re_nfd_quick_check_stage_3[] = {
-     0,  0,  0,  1,  2,  3,  4,  5,  6,  0,  0,  0,  0,  7,  8,  9,
-    10, 11,  0, 12,  0,  0,  0,  0, 13,  0,  0, 14,  0,  0,  0,  0,
-     0,  0,  0,  0, 15, 16,  0, 17, 18, 19,  0,  0,  0, 20, 21, 22,
-     0, 23,  0, 24,  0, 22,  0, 25,  0,  0,  0,  0,  0, 26, 27,  0,
-    28,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 29, 30,  0,  0,
-     0,  0,  0,  0,  0,  0,  0,  0, 31, 31, 32, 33, 34, 35, 36, 37,
-    38,  0,  0,  0, 39,  0, 40, 41, 42, 43, 44, 45, 46,  0,  0,  0,
-     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 47,  0,  0,  0,  0,
-     0, 48, 49, 50,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31,
-    31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 51,  0,
-     0,  0,  0,  0, 31, 31, 31, 31, 52, 53, 31, 54, 55, 56,  0,  0,
-     0,  0, 57,  0, 58,  0,  0,  0,  0,  0,  0,  0,  0, 59,  0,  0,
-     0,  0, 60,  0,  0,  0, 61,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0, 62, 63, 64,  0,  0,  0,  0,  0,  0,  0,  0,
-    31, 31, 31, 31, 31, 31, 31, 31, 65,  0,  0,  0,  0,  0,  0,  0,
-};
-
-static RE_UINT8 re_nfd_quick_check_stage_4[] = {
-      0,   0,   0,   0,   0,   0,   0,   0, 191, 255, 126,  62, 191, 255, 126, 190,
-    255, 255, 252, 255,  63, 255, 241, 126, 248, 241, 243, 255,  63, 255, 255, 127,
-      0,   0,   0,   0,   3, 128,   1,   0,   0, 224, 255, 223, 207, 255,  49, 255,
-    255, 255, 255, 207, 192, 255,  15,   0,  27,   0,   0,   0,   0,   0,  16,  64,
-    224, 215,   1,   0,   0, 252,   1,   0,   0, 124,  24,   0,   0,   0,   0,   0,
-    139, 112,   0,   2,   0,   0,   0,   2,   0,   0, 139, 112,   0,   0, 192,   0,
-      6,   0, 207, 252, 252, 252,  63,   3,   0,   0,   0,   0, 124,   0,   0,   0,
-      5,   0,   8,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,  18,   0,
-      0,   0,   0, 255,   0,   0,   0,   0,   0,  24,   0, 176,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,  72,   0,   0,   0,   0,  78,   0,   0,   0,   0,
-      0,  25,   0,  48,   0,   0,   0,   0,   0,   0,  16,   0,   0,   0,   0,   0,
-      0,  28,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,
-    129,  13,   0,   0,   0,   0,   0,   0,   0,   0,   0, 116,   0,   0,   0,   0,
-      8,  32, 132,  16,   0,   2, 104,   1,   2,   0,   8,  32, 132,  16,   0,   2,
-      0,   0,   0,   0,  64,   0,   0,   0,  64,  85,   4,   0,   0,   0,   0,  40,
-     11,   0,   0,   0,   0,   0,   0,   0, 255, 255, 255, 255, 255, 255, 255, 255,
-    255, 255, 255,  11, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,   3,
-    255, 255,  63,  63, 255, 255, 255, 255,  63,  63, 255, 170, 255, 255, 255,  63,
-    255, 255, 255, 255, 255, 255, 223,  95, 222, 255, 207, 239, 255, 255, 220,  63,
-      3,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  64,  12,   0,   0,
-      0,   0,   0,  12,   0,  64,   0,   0,   0, 224,   0,   0,   0,   0,   0,   0,
-     16,  18,   0,   0,  80,   0,   0,   0, 146,   2,   0,   0,   5, 224,  51,   3,
-     51,   3,   0,   0,   0, 240,   0,   0,   0,   0,   0,   0,  15,  60,   0,   0,
-      0,   0,   0,   0,   0,   6,   0,   0,   0,   0,   0,  16,   0,   0,   0,   0,
-      0,  80,  85,  85, 165,   2, 219,  54,   0,   0,  16,  64,   0,  80,  85,  85,
-    165,   2, 219,  54,   0,   0, 144,  71, 255, 255, 255, 255,  15,   0,   0,   0,
-    255,  63, 229, 127, 101, 252, 255, 255, 255, 255, 255, 255, 255,  63, 255, 255,
-    255, 255, 255,   3,   0,   0,   0,   0,   0,   0,   0, 160,   0, 252, 127,  95,
-    219, 127,   0,   0,   0,   0,   0,   0,   0,   0,   0,  20,   0,   8,   0,   0,
-      0,   0,   0,   0,   0, 192,   0,   0,   0,  24,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,  88,   0,   0,   0,   0,   0,   0,   0,  12,
-      0,   0,   0, 192,  31,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 248,
-      1,   0,   0,   0,   0,   0,   0,   0, 255, 255, 255,  63,   0,   0,   0,   0,
-};
-
-/* NFD_Quick_Check: 996 bytes. */
-
-RE_UINT32 re_get_nfd_quick_check(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-
-    f = ch >> 14;
-    code = ch ^ (f << 14);
-    pos = (RE_UINT32)re_nfd_quick_check_stage_1[f] << 4;
-    f = code >> 10;
-    code ^= f << 10;
-    pos = (RE_UINT32)re_nfd_quick_check_stage_2[pos + f] << 4;
-    f = code >> 6;
-    code ^= f << 6;
-    pos = (RE_UINT32)re_nfd_quick_check_stage_3[pos + f] << 6;
-    pos += code;
-    value = (re_nfd_quick_check_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1;
-
-    return value;
-}
-
-/* NFC_Quick_Check. */
-
-static RE_UINT8 re_nfc_quick_check_stage_1[] = {
-    0, 1, 2, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5,
-    4, 6, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 4, 4,
-    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 8,
-    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
-    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
-    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
-    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
-    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
-    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
-    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
-    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
-    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
-    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
-    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
-    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
-    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
-    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
-};
-
-static RE_UINT8 re_nfc_quick_check_stage_2[] = {
-     0,  0,  0,  0,  0,  0,  1,  2,  0,  0,  0,  0,  3,  0,  0,  0,
-     0,  0,  4,  5,  6,  0,  7,  8,  9, 10,  8, 11,  0,  0, 12, 13,
-    14,  0, 15, 16,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0, 17,  0,  0,  0,  0,  0,  0,  0, 18, 19,
-    20,  0, 21,  0,  0,  0, 22,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0, 23,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0, 24,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+     0,  0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14,  0, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    11, 11, 11, 11, 11, 11, 11,  0, 11, 11,  0, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 14, 14, 14, 14, 14, 14,  0,  0,  0, 14,  0, 14, 14,  0, 14,
+    14, 14, 14, 14, 14, 14, 11, 14,  0,  0,  0,  0,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,  0,  0,
+    11, 11, 11, 11, 11, 11,  0, 11, 11,  0, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 14, 14, 14, 14, 14,  0,
+    14, 14,  0, 14, 14, 14, 14, 14, 11,  0,  0,  0,  0,  0,  0,  0,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 14, 14, 14, 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,
      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    11,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,  0,
+    13, 13, 13, 13, 13, 13, 13, 13, 13,  0,  0,  0,  0,  0,  0,  0,
+    11, 11, 11, 11, 11, 11, 11,  0,  0,  0,  0,  0,  0,  0,  0,  0,
      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,  0,  0,
+    14, 14, 14, 14, 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    14, 14, 14, 14, 14, 14, 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    11, 11, 11, 11,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,  0,  0,
+     0,  0,  0, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11,  0,  0,  0,  0,  0, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,  0,  0,  0,  0, 14,
+    11, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14,  0,  0,  0,  0,  0,  0,  0, 14,
+    14, 14, 14, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11,  0, 11, 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    14, 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    17,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0, 17, 17, 17, 17,  0,  0,  0,  0,  0,  0,  0,  0,
      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0, 25, 25, 26, 27, 28,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0, 29, 30,  0,  0,  0,  8,  0,  0, 31,  0, 32,  0,  0,  0,  0,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,  0,  0,  0,  0,  0,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,  0,  0,  0,
+    11, 11, 11, 11, 11, 11, 11, 11, 11,  0,  0,  0,  0,  0,  0,  0,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11,  0,  0,  0, 14, 14,  0,
+    13, 13, 13, 13,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0, 33, 34,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0, 14, 14, 14, 14, 14,  0,  0,  0, 14, 14, 14,
+    14, 14, 14, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14,
+    14, 14, 14,  0,  0, 14, 14, 14, 14, 14, 14, 14,  0,  0,  0,  0,
      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 14, 14, 14, 14,  0,  0,
      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    25, 25, 25, 25, 35,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-};
-
-static RE_UINT8 re_nfc_quick_check_stage_3[] = {
+     0,  0, 14, 14, 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     1,  2,  3,  4,  5,  6,  7,  8,  9,  0,  0,  0,  0,  0, 10, 11,
-    12,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 13,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0,  0, 14,  0,  0,  0, 15,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0,  0, 16,  0,  0, 17, 18,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0, 19,  0,  0,  0,  0, 20,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0,  0, 16,  0,  0, 21, 22,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0,  0, 16,  0,  0, 17,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 16,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0,  0,  0, 23,  0, 24,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0,  0,  0,  0, 25,  0, 17,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0,  0,  0, 26, 27, 28, 10,  0, 29, 30, 31,
-    29,  0, 26, 27, 28, 10,  0, 29,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0, 16,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 32, 33, 34,  0,
-     0,  0,  0,  0,  0, 33, 33, 33, 35,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0, 36,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 37, 38,
-     0,  0,  0,  0,  0,  0,  0, 19,  0, 39, 26, 26, 26, 40,  0, 38,
-    41,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0, 11, 42,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0, 43,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 10,  0,  0,  0,  0,
-     0,  0,  0, 44,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-    15, 45, 46, 47, 48, 49, 15, 15, 15, 15, 15, 15, 15, 45, 15, 15,
-    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 41,  0,  0,  0,  0,
-     0,  0,  0, 50,  0, 49, 47, 51, 52, 47,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0,  0, 23,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0, 17,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0,  8, 53,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0, 17,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 54, 55,  0,  0,  0,
-     0,  0,  0,  0,  0,  0,  0, 56, 31,  0,  0,  0,  0,  0,  0,  0,
-    15, 15, 15, 45,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-};
-
-static RE_UINT8 re_nfc_quick_check_stage_4[] = {
-    0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 0, 2, 2,
-    2, 2, 2, 2, 2, 0, 0, 2, 0, 2, 0, 2, 2, 0, 0, 0,
-    0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2,
-    2, 0, 0, 0, 0, 2, 2, 0, 2, 2, 0, 0, 0, 0, 0, 0,
-    2, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 1, 1, 2, 0, 0,
-    0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0,
-    0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 2, 2, 2, 0, 0,
-    0, 0, 0, 0, 2, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1,
-    0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 2,
-    0, 0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0,
-    0, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 2,
-    0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 2, 0, 0, 0, 0, 2,
-    0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0,
-    0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0,
-    0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 0, 0, 2, 2, 2, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 2, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1,
-    0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0,
-    0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0,
-    0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0,
-    0, 2, 2, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0,
-    1, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0,
-    1, 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1,
-    0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0,
-    1, 1, 0, 1, 1, 0, 1, 1, 0, 0, 2, 0, 0, 2, 0, 0,
-    0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0,
-    0, 0, 0, 1, 1, 1, 1, 1,
-};
-
-/* NFC_Quick_Check: 1592 bytes. */
-
-RE_UINT32 re_get_nfc_quick_check(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-
-    f = ch >> 12;
-    code = ch ^ (f << 12);
-    pos = (RE_UINT32)re_nfc_quick_check_stage_1[f] << 5;
-    f = code >> 7;
-    code ^= f << 7;
-    pos = (RE_UINT32)re_nfc_quick_check_stage_2[pos + f] << 4;
-    f = code >> 3;
-    code ^= f << 3;
-    pos = (RE_UINT32)re_nfc_quick_check_stage_3[pos + f] << 3;
-    value = re_nfc_quick_check_stage_4[pos + code];
-
-    return value;
-}
-
-/* NFKD_Quick_Check. */
-
-static RE_UINT8 re_nfkd_quick_check_stage_1[] = {
-    0, 1, 2, 2, 2, 3, 4, 5, 6, 2, 2, 2, 2, 2, 7, 8,
-    2, 2, 2, 2, 2, 2, 2, 9, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,  0, 11, 11,
+     0,  0, 11,  0,  0, 11, 11,  0,  0, 11, 11, 11, 11,  0, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11,  0, 11,  0, 11, 11, 11,
+    11, 11, 11, 11,  0, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11,  0, 11, 11, 11, 11,  0,  0, 11, 11, 11,
+    11, 11, 11, 11, 11,  0, 11, 11, 11, 11, 11, 11, 11,  0, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11,  0, 11, 11, 11, 11,  0,
+    11, 11, 11, 11, 11,  0, 11,  0,  0,  0, 11, 11, 11, 11, 11, 11,
+    11,  0, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11,  0,  0, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11,  0, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,  0, 11, 11, 11, 11,
+    11, 11, 11,  0, 11, 11, 11, 11, 11, 11, 11, 11,  0,  0,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14,  0,  0,  0,  0, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,  0,  0,  0,
+     0,  0,  0,  0,  0, 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0, 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 14, 14, 14, 14, 14,
+     0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    14, 14, 14, 14, 14, 14, 14,  0, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14,  0,  0, 14, 14, 14, 14, 14,
+    14, 14,  0, 14, 14,  0, 14, 14, 14, 14, 14,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,  0,  0,  0,
+    14, 14, 14, 14, 14, 14, 14, 11, 11, 11, 11, 11, 11, 11,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0, 11,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 14, 14, 14, 14,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,  0,  0,
+    11, 11, 11, 11, 11,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    14, 14, 14, 14, 14, 14, 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    11, 11, 11, 11, 14, 14, 14, 14, 14, 14, 14, 11,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,  0,  0,
+     0, 11, 11,  0, 11,  0,  0, 11,  0, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11,  0, 11, 11, 11, 11,  0, 11,  0, 11,  0,  0,  0,  0,
+     0,  0, 11,  0,  0,  0,  0, 11,  0, 11,  0, 11,  0, 11, 11, 11,
+     0, 11, 11,  0, 11,  0,  0, 11,  0, 11,  0, 11,  0, 11,  0, 11,
+     0, 11, 11,  0, 11,  0,  0, 11, 11, 11, 11,  0, 11, 11, 11, 11,
+    11, 11, 11,  0, 11, 11, 11, 11,  0, 11, 11, 11, 11,  0, 11,  0,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11,  0, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,  0,  0,  0,  0,
+     0, 11, 11, 11,  0, 11, 11, 11, 11, 11,  0, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 14, 14, 14, 14, 14,
+     0, 13,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0
 };
 
-static RE_UINT8 re_nfkd_quick_check_stage_2[] = {
-     0,  1,  2,  3,  4,  5,  6,  7,  7,  8,  9, 10, 11, 12, 13, 14,
-    15,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7, 16,  7, 17, 18, 19,
-    20, 21, 22, 23, 24,  7,  7,  7,  7,  7, 25,  7, 26, 27, 28, 29,
-    30, 31, 32, 33,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
-     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
-     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
-     7,  7,  7,  7,  7,  7, 34, 35,  7,  7,  7, 36, 33, 33, 33, 33,
-    33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33,
-    33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33,
-    33, 33, 33, 33, 33, 33, 33, 37,  7,  7,  7,  7,  7,  7,  7,  7,
-     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
-     7,  7,  7,  7,  7,  7,  7,  7,  7, 33, 38, 39, 33, 40, 41, 42,
-     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
-    43, 44,  7, 45, 46, 47,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
-     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
-     7, 48,  7,  7, 49, 50, 51, 52,  7,  7,  7,  7,  7,  7,  7,  7,
-     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7, 53,  7,
-     7, 54, 55,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
-     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
-     7,  7,  7,  7,  7,  7,  7,  7, 33, 33, 56,  7,  7,  7,  7,  7,
-};
+RE_UINT32 re_get_word_break(RE_UINT32 codepoint) {
+    RE_UINT32 field_2;
+    RE_UINT32 field_1;
+    RE_UINT32 field_0;
+    RE_UINT32 v;
 
-static RE_UINT8 re_nfkd_quick_check_stage_3[] = {
-      0,   0,   0,   0,   0,   1,   2,   3,   4,   5,   6,   7,   0,   8,   9,  10,
-     11,  12,   0,   0,   0,  13,  14,  15,   0,   0,  16,  17,  18,  19,  20,  21,
-     22,  23,  24,  25,   0,   0,  26,  27,   0,   0,   0,   0,  28,   0,   0,   0,
-      0,  29,   0,  30,   0,   0,  31,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,  32,  33,   0,   0,   0,  34,   0,   0,  35,  36,   0,   0,   0,   0,   0,
-      0,   0,  37,   0,  38,   0,  39,   0,   0,   0,  40,   0,   0,   0,  41,   0,
-      0,   0,  39,   0,   0,   0,  42,   0,   0,  43,   0,   0,   0,  43,  44,   0,
-     45,   0,  46,  47,  48,  49,   0,   0,   0,  50,   0,   0,   0,   0,   0,  51,
-     52,  53,  54,   0,   0,   0,   0,   0,   0,  55,  56,  57,  58,  59,   0,   0,
-     59,  59,  59,  59,  60,  59,  59,  61,  62,  59,  63,  64,  59,  65,  66,  67,
-     68,  69,  70,  71,  72,  40,   0,   0,  73,  74,  75,  59,  76,  77,  78,   0,
-     79,  80,  81,  82,  83,  84,   0,  85,   0,  86,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,  59,  59,  59,  59,  87,  45,   0,   0,  88,   0,   0,  51,   0,
-      0,   0,   0,  44,   0,   0,   0,   0,   0,   0,   0,  89,   0,   0,   0,   0,
-      0,   0,   0,   0,  90,   0,   0,  43,  59,  59,  59,  59,  59,  59,  91,   0,
-     92,  93,  94,  95,  96,  94,  95,  97,   0,  98,  59,  59,  99,   0,   0,   0,
-    100,  59, 101, 100,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,
-      0,   0,   0,   0,  44,   0,   0,   0,   0,   0,   0, 102,   0,   0,   0, 103,
-      0,   0, 104,   0,   0,   0,   0,   0,  59,  59,  59,  59,  59, 105,   0,   0,
-    106, 107,  59, 108,  59,  59,  61,   0, 109, 110, 111,  59,  59, 112, 113,  59,
-     59,  64, 114,  59,   4,  59, 115, 116, 117, 114, 118, 119,  59,  59,  59, 120,
-    121,  59,  59,  59,  59, 100, 122, 123,   0,   0,   0,   0, 124, 125,   0,   0,
-      0, 126,   0,   0,   0,   0,   0,   0,   0,   0, 127,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0, 128,   0,   0,   0,   0,   0,   0,   0, 129,   0,   0,
-      0,   0, 130,  15,   0,  58,  92,   0,  59,  59,  65,  59, 131, 132, 133,  59,
-    134, 135, 136,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,   7,  59,  59,
-     59,  59,  59,  59,  59,  59, 137,  59, 133, 138, 139, 140, 141, 142,   0,   0,
-    143, 144, 145,  39, 102,   0,   0,   0, 146,  60, 147,   0,   0,   0,   0,   0,
-     64,   0,   0,   0,   0,   0,   0,   0,
-};
+    field_2 = codepoint >> 10;
+    field_1 = (codepoint >> 5) & 0x1F;
+    field_0 = codepoint & 0x1F;
 
-static RE_UINT8 re_nfkd_quick_check_stage_4[] = {
-      0,   0,   0,   0,   1, 133,  60, 119, 191, 255, 126,  62, 191, 255, 126, 190,
-    255, 255, 252, 255,  63, 255, 253, 254, 249, 243, 243, 255,  63, 255, 255, 255,
-      3, 128,   1,   0, 240, 255, 255, 223, 207, 255,  63, 255, 255, 255, 255, 207,
-    192, 255,  15,   0,   0,   0, 255,   1,   0,   0,   0,  63,  31,   0,   0,   0,
-     27,   0,   0,   0,   0,   0,  16,  68, 240, 215,   1,   0,   0, 252,   1,   0,
-      0, 124, 127,   0,   0,   0,  55,   2, 139, 112,   0,   2,   0,   0,   0,   2,
-      0,   0, 139, 112,   0,   0, 192,   0,   6,   0, 207, 252, 252, 252,  63,   3,
-    128,   0,   0,   0, 124,   0,   0,   0,   0,   0, 224,   1,   5,   0,   8,   0,
-      0,   2,  18,   0,   0,   0,   0, 255,   0,  24,   0, 176,   0,   0,  72,   0,
-      0,   0,   0,  78,   0,  25,   0,  48,   0,   0,  16,   0,   0,  28,   0,   0,
-      0,   1,   0,   0, 129,  13,   0,   0,   0,   0,   0, 116,   0,   0,   8,   0,
-      0,   0,   0,  48,   0,  16,   0,   0,   8,  32, 132,  16,   0,   2, 232,   3,
-      2,   0,   8,  32, 132,  16,   0,   2,  64,   0,   0,   0,   0,   0,   0,  16,
-     64,  85,   4,   0,   0,   0,   0,  40,  11,   0,   0,   0,   0, 112, 255, 247,
-    255, 191, 255, 255, 255,   7,   0,   1,   0,   0,   0, 248, 255, 255, 255, 255,
-    255, 255, 255,  15, 255, 255, 255,   3, 255, 255,  63,  63,  63,  63, 255, 170,
-    255, 255, 255,  63, 255, 255, 223, 255, 223, 255, 207, 239, 255, 255, 220, 127,
-    255,   7, 130,   0, 112, 128, 216,  80, 128,   3, 128, 128,   0,   0, 243, 255,
-    255, 127, 255,  31, 239, 254, 111,  62,  87, 189, 251, 251, 225,   3, 255, 255,
-      0,   2,   0,  12,   0,  64,   0,   0,   0, 224,   0,   0,  16,  18,   0,   0,
-     80, 176,   1,   0, 146,   2,   0,   0,   5, 224,  51,   3,  51,   3,   0,   0,
-      0, 240,   0,   0,  15,  60,   0,   0,   0,   6,   0,   0, 255,   7,   0,   0,
-      0,   0, 112,   0,   0, 128,   0,   0,   0,   0,   0, 128, 255, 255,  63,   0,
-      1,   0,   0,   0,   0,   0,  64,   7,   0,  80,  85,  85, 165,   2, 219,  54,
-      0,   0,  16, 216,   0,   0, 144, 199,   0,   0, 254, 255, 255, 127, 252, 255,
-    255, 255, 255, 127, 255,   0, 255, 255,   0,   0,   1,   0,   0,   0,   0,   3,
-      0,   0,   0, 240,  15,   0,   0,   0, 255,  63, 229, 127, 101, 252, 255, 255,
-    255,  63, 255, 255, 127,   0, 248, 160, 255, 255, 127,  95, 219, 255, 255, 255,
-    255, 255,   3,   0,   0,   0, 248, 255,   0,   0, 255, 255, 255,   0,   0,   0,
-      0,   0, 255,  31,   0,   0, 255,   3, 159, 255, 247, 255, 127,  15, 215, 255,
-    255, 255, 255,  31, 254, 255, 255, 255, 252, 252, 252,  28, 127, 127,   0,   0,
-      0,   0,   0,  20,   0,   8,   0,   0,   0, 192,   0,   0,   0,  24,   0,   0,
-      0,   0,   0,  88,   0,   0,   0,  12,   0,   0,   0, 192, 255, 255, 255, 223,
-    100, 222, 255, 235, 239, 255, 255, 255, 191, 231, 223, 223, 255, 255, 255, 123,
-     95, 252, 253, 255, 255, 207, 255, 255, 150, 254, 247,  10, 132, 234, 150, 170,
-    150, 247, 247,  94, 255, 251, 255,  15, 238, 251, 255,  15, 255,   7, 255, 255,
-    255, 127, 255, 255, 255, 255,   0,   0,   7,   0, 255, 255, 255,   1,   3,   0,
-};
+    v = re_word_break_table_1[field_2];
+    v = re_word_break_table_2[(v << 5) | field_1];
+    v = re_word_break_table_3[(v << 5) | field_0];
 
-/* NFKD_Quick_Check: 1504 bytes. */
-
-RE_UINT32 re_get_nfkd_quick_check(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-
-    f = ch >> 13;
-    code = ch ^ (f << 13);
-    pos = (RE_UINT32)re_nfkd_quick_check_stage_1[f] << 5;
-    f = code >> 8;
-    code ^= f << 8;
-    pos = (RE_UINT32)re_nfkd_quick_check_stage_2[pos + f] << 3;
-    f = code >> 5;
-    code ^= f << 5;
-    pos = (RE_UINT32)re_nfkd_quick_check_stage_3[pos + f] << 5;
-    pos += code;
-    value = (re_nfkd_quick_check_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1;
-
-    return value;
+    return v;
 }
 
-/* NFKC_Quick_Check. */
-
-static RE_UINT8 re_nfkc_quick_check_stage_1[] = {
-     0,  1,  2,  3,  4,  4,  4,  4,  4,  4,  5,  4,  4,  4,  4,  6,
-     4,  7,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  8,  9, 10,
-     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4, 11,
-     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
-     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
-     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
-     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
-     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
-     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
-     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
-     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
-     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
-     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
-     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
-     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
-     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
-     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
+/* XDigit. */
+static RE_UINT8 re_xdigit_table_1[] = {
+     0,  1,  2,  3,  4,  5,  6,  7,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  9, 10,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8, 11,
+     8, 12,  8, 13, 14, 15, 16, 17,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8, 18,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8, 19,  8,  8, 20,  8, 21,  8,  8,  8, 22,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8
 };
 
-static RE_UINT8 re_nfkc_quick_check_stage_2[] = {
-      0,   0,   1,   0,   2,   3,   0,   4,   0,   0,   5,   6,   7,   8,   9,  10,
-      0,   0,   0,   0,   0,   0,  11,   0,   0,  12,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,  13,  14,  15,  16,  17,  18,   0,   0,  15,  19,  15,  20,
-      0,  21,   0,  22,  15,  20,   0,  23,  24,   0,  24,  25,  26,  27,  28,   0,
-     29,   0,   0,  30,   0,  31,  32,  33,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  34,   0,   0,   0,
-      0,   0,   0,   0,  35,  36,  37,   0,   0,   0,  38,   0,   0,  39,  40,  41,
-     42,  43,  44,   0,  45,  46,  47,   0,  48,   0,   0,   0,  49,   0,   0,   0,
-      0,  50,  51,  52,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,  26,  53,   0,  54,   0,   0,   0,   0,
-      0,  55,   0,   0,   0,  56,   0,   0,   0,   0,  57,  24,  51,  51,  51,  58,
-     59,   0,  60,  61,  62,  51,  63,   0,  64,  65,  51,  51,  51,  51,  51,  51,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  25,   0,   0,  66,   0,  67,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  68,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,  51,  51,  51,  51,  69,  70,  51,  71,  72,  73,  74,  75,
-     51,  51,  51,  51,  76,  77,  78,  79,  80,  81,  51,  82,  83,  51,  84,  85,
-      0,   0,  86,   0,  87,   0,   0,   0,   0,   0,   0,   0,  15,  20,   0,   0,
-      0,   0,  88,   0,   0,   0,  89,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,  90,  91,  92,   0,   0,   0,   0,   0,   0,   0,   0,
-     51,  93,  94,  95,  96,  97,  51,  51,  51,  51,  98,  51,  51,  51,  51,  99,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0, 100, 101, 102,   0,   0,   0,   0,   0,
-      0,   0,   0,   0, 103, 104, 105,   0, 106, 107,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     51,  51,  51,  51,  51,  51,  51,  51, 108,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+static RE_UINT8 re_xdigit_table_2[] = {
+    0, 1, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 3, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4,
+    0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4,
+    0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4,
+    0, 0, 1, 0, 0, 0, 1, 0, 0, 3, 0, 0, 0, 0, 0, 0,
+    0, 0, 3, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+    1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 1, 0,
+    0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0,
+    0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 1, 0, 3, 0, 0, 0, 0, 0, 1, 1,
+    0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 2, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 4, 0, 0, 0, 1, 0, 6, 0, 0, 0, 0, 1, 0,
+    0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 1, 0, 0, 0, 3, 0, 0, 1, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 3, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 8,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1
 };
 
-static RE_UINT8 re_nfkc_quick_check_stage_3[] = {
-     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  2,  3,  4,
-     0,  0,  0,  0,  0,  0,  5,  6,  1,  7,  0,  0,  0,  0,  0,  6,
-     8,  9,  0,  0,  0,  0, 10,  0,  0,  0,  0,  0,  0,  0, 11,  1,
-     0,  0,  0, 12,  9,  0,  0,  0, 13, 14, 15, 16, 17, 18, 19, 20,
-    21,  0,  0,  0,  0,  0, 22, 23, 24,  0,  0,  0,  0,  0,  0,  0,
-     0,  0, 25,  0,  0,  0, 26,  7,  6,  0,  0,  0,  0,  0,  0,  0,
-     0,  0, 27,  0,  0,  0, 28,  1,  0,  0,  0,  0,  0,  0,  0, 29,
-     0,  0,  0, 11,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 30,
-     0,  0, 31, 24,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 32,  0,
-     0,  0,  0, 33,  0,  0,  0,  0,  0,  0, 34, 35,  0,  0,  0,  0,
-     0,  0, 31,  0,  0,  0,  0,  0,  0,  0, 30,  0,  0,  0,  0,  0,
-    36,  0, 37,  0,  0,  0,  0,  0,  0, 38,  0, 31,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0, 39,  0,  0,  0,  0, 35,  0,  0,  0,  0,
-     0, 22,  0,  0,  0,  0,  0,  0, 39, 40, 41, 22,  0,  7, 42, 43,
-     7,  0, 39, 40, 41, 22,  0,  7,  0,  0,  0,  0,  0, 30,  0,  0,
-     0,  0,  0,  0,  0,  0,  0, 22,  0,  0,  0,  0, 44, 45, 46,  0,
-     0,  0,  0,  0,  0, 45, 45, 45, 47,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0, 48,  0,  0,  0,  0,  0,  0, 49, 11, 50,
-    11, 51, 11, 11, 11, 52,  0,  1,  0,  0,  0, 53, 11, 11, 11, 11,
-     0,  0,  0,  5,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 54, 55,
-     0,  0,  0,  0,  0,  0,  0, 42, 43, 56, 39, 42, 39, 42,  0, 57,
-    11, 52, 58,  0, 49,  6, 59, 60,  6, 43,  6,  6,  0,  0, 61, 11,
-    11, 25, 11,  9,  0,  1,  0,  0, 62, 63, 64, 65, 66, 67, 68, 68,
-    69, 43, 11, 11, 11, 11, 11, 11,  0,  7,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0, 24,  1,  0,  0,  0,  0,  0,  0, 70,  0,  0,
-     0,  0,  0,  0, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
-    11, 11, 11, 11, 11, 52,  0,  0,  0,  0,  0,  0,  0,  0, 49,  0,
-     0,  0,  0, 22,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 35,
-     0,  0,  0,  0,  0,  6,  0,  0,  0,  0,  0,  6,  0,  0,  0,  0,
-    11, 11, 12,  0,  0,  0,  0,  0,  1,  0,  0,  0,  0,  0, 71, 52,
-     0,  0,  0, 72,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  6,
-     0,  0,  0,  0,  0,  0, 63, 11, 11, 25, 73, 11,  0,  0,  0,  0,
-    11, 11, 11, 25, 11, 11, 11, 11, 11,  0, 11, 11, 11, 11, 11, 25,
-     0,  0,  0,  0,  0,  0,  1,  0,  0,  0,  0,  0,  0,  0,  0, 43,
-     0,  0,  0,  8,  0,  0,  0,  0, 11, 12, 74, 25, 75, 73, 11, 11,
-    11, 11, 11, 11, 11, 12, 11, 11, 11, 11, 11, 43,  0,  0,  0,  0,
-    25,  0, 53, 76, 11, 11, 25, 77, 78, 11, 11, 11, 11, 11, 11, 11,
-    11, 11, 11, 11, 11, 11, 43,  0,  0,  0, 53, 11, 11, 11, 11, 11,
-    11, 11, 11, 11, 11, 11, 11, 12,  0,  0, 11, 11, 11, 11, 11, 11,
-    11, 11, 73, 11, 11, 11, 11, 11, 11,  0,  0,  0,  0,  0, 11,  9,
-     0,  0, 11, 43,  0,  0, 11, 11, 79, 11, 50, 11, 25, 80, 81, 11,
-    11, 11, 11, 11, 11, 11, 11,  9, 63, 11, 11, 11, 11, 11, 11, 11,
-    11, 11, 11, 11, 11, 11, 11, 25, 73, 73, 73, 82, 25, 25,  0,  0,
-     0,  0,  0,  0,  0,  0,  0, 36,  0,  0,  0,  0, 31,  0,  0,  0,
-     0,  0,  0,  0,  0,  0, 20, 83,  0,  0,  0,  0,  0, 31,  0,  0,
-     0,  0,  0, 84,  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 53,
-     1,  0,  0,  0,  0,  0,  0,  0, 11, 11, 85, 11, 11, 11, 11, 11,
-    11, 11, 11, 85, 86, 87, 11, 88, 62, 11, 11, 11, 11, 11, 11, 11,
-    51, 89, 85, 85, 11, 11, 11, 90, 77, 73, 91, 11, 11, 11, 11, 11,
-    11, 11, 11, 11, 12, 11, 11, 11, 11, 92, 11, 11, 11, 11, 11, 11,
-    62, 11, 11, 11, 93, 63, 50, 94, 41, 56, 93, 54, 93, 50, 50, 95,
-    11, 68, 11, 80, 96, 68, 11, 80, 11, 52, 11, 11, 11, 25, 11, 11,
-    11, 11,  0,  0,  0, 82,  0,  0,  0,  0,  1,  0,  0,  0,  0,  0,
-    52,  0, 11, 11, 11, 11, 11, 80, 11,  1, 43,  0,  0,  0,  0,  0,
-    11, 11, 11, 12,  0,  0,  0,  0,
+static RE_UINT8 re_xdigit_table_3[] = {
+      0,   0,   0,   0,   0,   0, 255,   3, 126,   0,   0,   0, 255,   3,   0,   0,
+    192, 255,   0,   0, 255,   3, 255,   3,   0,   0, 192, 255,   0, 192, 255, 255,
+    255, 255, 255, 255
 };
 
-static RE_UINT8 re_nfkc_quick_check_stage_4[] = {
-    0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
-    1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 0, 0,
-    1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0,
-    0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 0, 0, 2, 2, 2, 2, 2, 0, 2, 2,
-    2, 2, 2, 2, 2, 0, 0, 2, 0, 2, 0, 2, 2, 0, 0, 0,
-    0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2,
-    2, 0, 0, 0, 0, 2, 2, 0, 2, 2, 0, 0, 0, 0, 0, 0,
-    2, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 1, 1, 2, 0, 0,
-    0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0,
-    0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0,
-    1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 2, 2, 2, 0, 0,
-    0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 2, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 2,
-    0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0,
-    0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 1, 1, 0, 0,
-    0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 0,
-    0, 0, 2, 0, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1,
-    0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0,
-    0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 0, 0, 2, 2, 2, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0,
-    1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1,
-    1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1,
-    0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0,
-    0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 0,
-    0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 1, 1,
-    0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 1, 1, 1, 1,
-    1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0,
-    1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 0, 1,
-    1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1,
-    0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0,
-    0, 2, 2, 1, 1, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1,
-    1, 0, 1, 0, 0, 1, 1, 1, 1, 0, 1, 0, 0, 1, 1, 0,
-    0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0,
-    1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1,
-    1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 1, 0, 1, 1,
-    0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 2, 0, 0, 2, 0, 0,
-    0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1,
-    0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 1,
-    1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1,
-    1, 1, 0, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 1, 0, 0, 1,
-    0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 0,
-    0, 1, 1, 1, 0, 1, 1, 1,
-};
+RE_UINT32 re_get_xdigit(RE_UINT32 codepoint) {
+    RE_UINT32 field_2;
+    RE_UINT32 field_1;
+    RE_UINT32 field_0;
+    RE_UINT32 offset;
+    RE_UINT32 v;
 
-/* NFKC_Quick_Check: 2688 bytes. */
-
-RE_UINT32 re_get_nfkc_quick_check(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-
-    f = ch >> 12;
-    code = ch ^ (f << 12);
-    pos = (RE_UINT32)re_nfkc_quick_check_stage_1[f] << 6;
-    f = code >> 6;
-    code ^= f << 6;
-    pos = (RE_UINT32)re_nfkc_quick_check_stage_2[pos + f] << 3;
-    f = code >> 3;
-    code ^= f << 3;
-    pos = (RE_UINT32)re_nfkc_quick_check_stage_3[pos + f] << 3;
-    value = re_nfkc_quick_check_stage_4[pos + code];
-
-    return value;
-}
+    field_2 = codepoint >> 10;
+    field_1 = (codepoint >> 5) & 0x1F;
+    field_0 = (codepoint >> 3) & 0x3;
+    offset = codepoint & 0x7;
 
-/* Alphanumeric. */
+    v = re_xdigit_table_1[field_2];
+    v = re_xdigit_table_2[(v << 5) | field_1];
+    v = re_xdigit_table_3[(v << 2) | field_0];
 
-static RE_UINT8 re_alphanumeric_stage_1[] = {
-     0,  1,  2,  3,  4,  5,  5,  5,  5,  6,  7,  5,  5,  8,  9, 10,
-    11, 12, 13, 14, 15,  9, 16,  5, 17,  9,  9, 18,  9, 19, 20, 21,
-     5,  5,  5,  5,  5,  5,  5,  5,  5,  5, 22, 23, 24,  5, 25, 26,
+    return (v >> offset) & 0x1;
+}
+
+/* XID_Continue. */
+static RE_UINT8 re_xid_continue_table_1[] = {
+     0,  1,  2,  3,  4,  5,  6,  7,  8,  9,  9, 10, 11, 12, 12, 12,
+    12, 12, 12, 13, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+    12, 12, 12, 12, 12, 12, 12, 14, 12, 15, 16, 12, 12, 12, 12, 12,
+    12, 12, 12, 12, 12, 17,  9,  9,  9,  9,  9,  9,  9,  9, 18, 19,
+    20, 21, 22, 23, 24, 25, 26, 27, 28, 29,  9,  9, 12, 30,  9,  9,
+     9, 31,  9,  9,  9,  9,  9,  9,  9,  9, 32, 33, 12, 12, 12, 12,
+    12, 34, 12, 35,  9,  9,  9,  9,  9,  9,  9,  9, 36,  9,  9, 37,
+     9,  9,  9,  9, 38, 39, 40,  9, 41,  9, 42, 43,  9,  9, 44,  9,
+    12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+    12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+    12, 12, 12, 12, 12, 12, 12, 12, 12, 45, 12, 12, 12, 46, 47, 12,
+    12, 12, 12, 48, 12, 12, 12, 12, 12, 12, 49,  9,  9,  9, 50,  9,
+    12, 12, 12, 12, 51,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
@@ -16224,715 +25950,263 @@ static RE_UINT8 re_alphanumeric_stage_1[] = {
      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+    52,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9
 };
 
-static RE_UINT8 re_alphanumeric_stage_2[] = {
-      0,   1,   2,   3,   4,   5,   6,   7,   8,   9,  10,  11,  12,  13,  14,  15,
-     16,   1,  17,  18,  19,   1,  20,  21,  22,  23,  24,  25,  26,  27,   1,  28,
-     29,  30,  31,  31,  32,  31,  31,  31,  31,  31,  31,  31,  33,  34,  35,  31,
-     36,  37,  31,  31,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,  38,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,  39,
-      1,   1,   1,   1,  40,   1,  41,  42,  43,  44,  45,  46,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,  47,  31,  31,  31,  31,  31,  31,  31,  31,
-     31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,
-     31,  31,  31,  31,  31,  31,  31,  31,  31,   1,  48,  49,   1,  50,  51,  52,
-     53,  54,  55,  56,  57,  58,   1,  59,  60,  61,  62,  63,  64,  65,  31,  66,
-     67,  68,  69,  70,  71,  72,  73,  74,  75,  76,  77,  31,  78,  79,  80,  31,
-      1,   1,   1,  81,  82,  83,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,
-      1,   1,   1,   1,  84,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,
-     31,  31,  31,  31,   1,   1,  85,  31,  31,  31,  31,  31,  31,  31,  31,  31,
-     31,  31,  31,  31,  31,  31,  31,  31,   1,   1,  86,  87,  31,  31,  88,  89,
-      1,   1,   1,   1,   1,   1,   1,  90,   1,   1,  91,  31,  31,  31,  31,  31,
-      1,  92,  93,  31,  31,  31,  31,  31,  31,  31,  31,  31,  94,  31,  31,  31,
-     31,  31,  31,  31,  95,  96,  97,  98,  31,  31,  31,  31,  31,  31,  31,  31,
-     99, 100, 101,  31,  31,  31,  31,  31, 102, 103,  31,  31,  31,  31, 104,  31,
-     31, 105,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,
-      1,   1,   1,   1,   1,   1, 106,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1, 107, 108,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1, 109,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1, 110,  31,  31,  31,  31,
-     31,  31,  31,  31,  31,  31,  31,  31,   1,   1, 111,  31,  31,  31,  31,  31,
-};
-
-static RE_UINT8 re_alphanumeric_stage_3[] = {
-      0,   0,   0,   1,   2,   3,   2,   3,   0,   0,   4,   5,   6,   7,   6,   7,
+static RE_UINT16 re_xid_continue_table_2[] = {
+      0,   1,   2,   3,   0,   4,   5,   5,   6,   6,   6,   6,   6,   6,   6,   6,
+      6,   6,   6,   6,   6,   6,   7,   8,   6,   6,   6,   9,  10,  11,   6,  12,
+      6,   6,   6,   6,  13,   6,   6,   6,   6,  14,  15,   6,  16,  17,  18,  19,
+     20,   6,   6,  21,   6,   6,  22,  23,  24,   6,  25,   6,   6,  26,   6,  27,
+      6,  28,  29,  30,   0,  31,  32,  11,   6,   6,   6,  33,  34,  35,  36,  37,
+     38,  39,  40,  41,  42,  43,  44,  45,  46,  43,  47,  48,  49,  50,  51,  52,
+     53,  54,  55,  56,  57,  58,  59,  60,  53,   6,  61,  62,  63,  64,  65,  66,
+     67,  68,  69,   0,  70,  71,  72,   0,  73,  74,  75,  76,  77,  78,  79,   0,
+      6,   6,  80,   6,  81,   6,  82,  83,   6,   6,   6,   6,   6,   6,   6,   6,
+      6,   6,  84,   6,  85,  86,  87,   6,  88,   6,  89,  90,  91,   6,   6,  92,
+     67,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,
+      6,   6,   6,  93,   3,   6,   6,  94,  95,  96,  97,  98,   6,   6,  99, 100,
+    101,   6,   6, 102,   6, 103,   6, 104, 105, 106, 107, 108,   6, 109, 110,   0,
+     29,   6, 105, 111, 112, 113, 114,   0,   6,   6, 115, 116,   6,   6,   6,  97,
+      6, 117, 118,  81, 119,  89, 120,  68,   6,   6,   6,   6,   6,   6,   6, 121,
+      6,   6,   6,   6,   6,   6,   6,   6,  92,   6, 122,  81,   6, 123, 124, 125,
+      0, 126, 127, 128, 129,   0, 129, 130, 131, 132, 133,   6, 134,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      6, 135, 105,   6,   6,   6,   6, 136,   6,  82,   6, 137, 138, 139, 139,   6,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    140, 141,  67,   6, 142,  67,   6,  83, 143,  14,   6,   6, 144,   6,   0,  24,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
       6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,
-      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   8,   9,  10,   0,
-      0,   0,   0,   0,  11,   0,   0,  12,  13,   6,  14,   6,   6,   6,   6,  15,
-      6,   6,   6,   6,   6,   6,   6,   6,  16,   6,   6,   6,   6,   6,   6,   6,
-      6,   6,   6,   2,   6,  17,   6,   6,  18,   0,   0,  19,  20,   6,  21,  22,
-      0,   3,   6,   6,   6,  23,  24,   6,   6,   6,   6,   6,   6,  25,  26,  27,
-      0,   6,   6,   6,  28,   6,   6,   6,   6,   6,   6,   9,   6,   6,   3,  29,
-      6,  30,  31,   0,   6,  18,   3,   0,   0,   0,   6,  32,   0,  33,  34,   6,
-      6,   6,   6,  35,  36,  37,  38,   2,  39,  40,  41,  42,  43,  44,  38,  45,
-     46,  40,  41,  47,  48,  49,  50,  51,  52,  14,  41,  53,  54,  55,  38,  56,
-     57,  40,  41,  53,  58,  59,  38,  60,  61,  62,  63,  24,  64,  65,  50,   0,
-     66,  67,  41,  68,  69,  70,  38,   0,  66,  67,  41,  71,  69,  72,  38,  73,
-     66,  67,   6,  74,  75,  76,  38,  77,  78,  79,   6,  80,  81,  82,  50,  83,
-      2,   6,   6,   3,  84,   1,   0,   0,  85,   6,  86,  87,  88,  89,   0,   0,
-     55,   0,   1,   0,  23,   6,  31,   2,  90,  23,   6,  31,   0,   0,   0,   0,
-      6,   6,   6,  91,   1,   6,   6,   6,   6,  92,   6,   6,  93,   6,   6,  94,
-      6,   6,   6,   6,  95,  96,   6,   6,  95,   6,   6,  97,  98,   7,   6,   6,
-      6,  98,   6,   6,   6,   3,   0,   0,   6,   0,   6,   6,   6,   6,   6,  99,
-      2,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,
-      6,   6,   6,   6,   6,   6,  27,   6,   2,   3,   6,   6,   6,   6, 100,  18,
-     36, 101,   6, 101,   6, 101,  36, 102,   6,   6,   6,  38,  18, 103,   1,   0,
-      0,   1,   6,   6,   6,   6,   6,  18,   6,   6,   3,   6,   6,   6,   6,  51,
-      6, 104, 105,  18,  50,   6,  92, 106,   6,   6, 105,   6,   1,   1,   0,   0,
-      6, 105,   6,   6,   6, 104,   2, 106,   1,   1, 107,   0,   0,   0,   0,   0,
-      6,   6,   6, 108, 109,   1,   0,   0,   6,   6,  89,   6,   6,   6,  15,   9,
-      6,   6,   6, 110,  68,   6,   6,  92,  18,   6,   6,  74,   0,   0, 111, 112,
-      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   0,   0, 113, 106,
-      6,  99,   6,   6,  99, 114,   6,  92,   6,   6,   6, 115, 116, 117,  31, 116,
-      0,   0,   0,   0,   0,   0,   0, 118,   0,  31,   0,   0,   0,   0,   0,   0,
-    119, 120, 121,  89, 122,   0,   6,   6,  18,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  50,   6,   6,   1,   0,
-      6,   6, 104,   6,   6, 104,   6,   6,   6,   6,   6,   6,   6,   6, 123,  83,
-      6,   6,  93,   6,   6,   6, 124,   0,   6, 110, 125, 125, 125, 125,   6,   6,
-      0,   0, 126,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-    127,   0, 128, 129,   2,   6,   6,   6,   6, 130,   2,   6,   6,   6,   6,  94,
-    131,   6,   6,   2,   6,   6,   6,   6, 104,   0,   6,   3,   0,   0,   0,   6,
-      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,  51,   0,   0,   0,   0,
-      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   0,
-      6,   6,   6,   6,   6,   6,   6,   6,  31,   0,   0,   0,   0,   6,   6,  92,
-     31,   6, 105,   0,   6,   6, 104, 132,   6,   6,   6,   6,   6,   6,   6,   0,
-      0, 113, 133,   6,   6,   6,   6,   6, 134,   6,   6,   6, 135,   0,   0, 113,
-     15,   6, 136,   0,   6,   6,   6, 101,   6,   6,   6,   6, 137,   1,   0, 138,
-      6,   6,   3,   6,   6,  22,   6,  31,   6,   6,   6, 139, 126,   1,   6, 104,
-      6,   6,   6, 110,  92,   1,   6,  79,   6,   6,   6, 104, 140, 141,   6, 142,
-    143, 144, 125,   6,   6,  94, 136,   6,   6,   6,   6,   6,   6,   6,   3,   1,
-      6,   6,   6,   6,   6,   6,   6,   6,   6,   6, 101,   6, 145,   6,   6, 105,
-      6,   6,   6,   6,   6,   6,  92,   6,   6,   6,   6,   6,   6,   1,   0,   0,
-    110, 146,  41, 147, 148,   6,   6,   6,   6,   6,   6,   9,   0, 149,   6,   6,
-      6,   6,   6,  92,   0,   6,   6,   6,   6, 133,   6,   6, 136,   0,   0, 105,
-      0,   0,   0,   0,   0,   0,   0, 150,   6,   6,   6,   6,   6,   6,   6,  31,
-      0,   1,   2,   3,   2,   3,  50,   6,   6,   6,   6, 104, 151, 152,   0,   0,
-     35,   6,   7, 153,  92,  92,   0,   0,   6,   6,   6,   6,   6,   6,   6,   3,
-      0,   0,   0,   0,   6,   6,   6, 106,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   6,  31,   6,   6,   6,  55,   0,   0,
-      6,   6,  28,   6,   3,   6,   6,   3,   6,  92,   6,   6, 154, 155,   0,   0,
-      6,   6,   6,   6,   6,   6,   6,   6,   6,  92,   1,   6,   6, 154,   6, 105,
-      6,   6, 136,   6,   6,   6, 101,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      6,   6,   6, 110,   6,  51, 136,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-    156,   6,   6, 157,   6,  51,   6, 110,   6, 104,   0,   0,   0,   0,   6, 158,
-      6,  51,   6,   1,   0,   0,   0,   0,   6,   6,   6, 159,   0,   0,   0,   0,
-    160, 161,   6,  51,   0,   0,   6,  31,   6,  31,   0,   0,  23,   6, 106,   0,
-      6,   6,   6,  51,   6,  51,   6,  22,   6,   9,   0,   0,   0,   0,   0,   0,
-      6,   6,   6,   6,  18,   0,   0,   0,   6,   6,   6,  22,   6,   6,   6,  22,
-      6,   6, 136,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      6,  31, 107,   6,  51,   0,   0,   0,   0,   0,   0,   0,   0,   0,   6, 110,
-      6,   6,   6,   6,  51,   0,  50,   0, 133,   6,   6,  18,   0,   6,  18,   1,
-      6,   6,   6, 162, 163,   6,   6, 164,   6,   6,   6,   6, 165, 166,   0,   0,
-      6,  14,   6, 167,   0,   0,   0,   0, 168,  19,  18,   6,   6,   6,  18,   1,
-     39,  40,  41,  53,  58, 169, 101,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      6,   6,   6,   6, 170, 171,   0,   0,   6,   6,   6,   6, 172,   1,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   6,   6,   6, 173,   0, 174,   0,   0,
-      6,   6,   6, 104, 175,   1,   0,   0,   6,   6,   6, 176,   1,   0,   0,   0,
-      6,  74,   3,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      6,   6,   6,  18,   0,   0,   0,   0,   0,   0,   6,   6,   6,   6,   1, 126,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  30,   6,   6,  30, 177,   0,
-      6,   6,   6, 178,   0,   6,   6,   6,   6, 179,   0,   0,   6,   6,   6,  18,
-     41,   6,   6, 125,  55,   1,   0, 133,   6, 133,  23, 110,   0,   0,   0,   0,
-    180,   6,   6, 181, 182,   1, 183,   6, 104, 184,   1,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   6, 110,
-      6,   6,   6,   6,   6,   6,   6,   6,   6,   1,   0,   0,   0,   0,   0,   0,
-      6,   6,   6,   6,   6,   6, 104,   0,   6,   6,   6,   6,   6,   6,   6,   6,
-      6,   6,   6,   6, 101,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      6,   6, 104,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      6,   6,   6,   6, 110,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      6,   6,   6,  18,   6, 104,   1,   0,   0,   0,   0,   0,   0,   6,  92,   0,
-      6,   6,   6,   0, 101,   1, 149, 185,   6,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   6,   6,   6,   6,   0,   0,   0,   0,   0,   0,   0,   0,
-      6,   6,   6,   6,  21,   6,   6,   6, 124,   6,   0,   0,   0,   0, 186,   0,
-      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6, 136,
-      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,  22,
-      6, 104,   0,   0,   0,  22, 187,   6,   6,   6,   6,   6,   6,   6,   6,   6,
-      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6, 105,
-      6,   6,   6,   6,   6,   6,   3,  31,  18, 188,   0,   0,   0,   0,   0,   0,
-      6,   6,   6,   6,   6, 150,   6,   6,   6,  36, 189, 190, 108,   6,   6,   6,
-    191, 192,   6, 193, 194,  67,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,
-      6,   6,   6,   6,   6,   6,   6,   6,   6,   6, 195,   6,  67,  94,   6,  94,
-      6, 150,   6, 150, 104,   6, 104,   6,  41,   6,  41,   6, 196,   6,   6,   6,
-      7, 134, 197,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      6,   6,  31, 198, 188,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   6,   6, 105,   1,
-      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6, 106,   0,   0,   0,
-      6,   6,   6,   6, 199,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-    108,   6, 200, 201, 202, 203, 204, 205, 206, 105, 207, 105,   0,   0,   0,   0,
-      0,   0,   0,   6,   1,   6,   1,   6,   1,   0,   0,   0,   0,   0,   0,   0,
-      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6, 110,   0,   0,
-      6,   6,   6, 106,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,
-      6,  92,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,
-      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   9,   6,   6,   6,   6,   6,
-      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,  55,   0,
-      6,  92,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-};
-
-static RE_UINT8 re_alphanumeric_stage_4[] = {
-      0,   0, 255,   3, 254, 255, 255,   7,   0,   4,  32,   4, 255, 255, 127, 255,
-    195, 255,   3,   0,  31,  80,  32,   0, 223, 188,  64, 215, 251, 255, 191, 255,
-      3, 252, 127,   2, 255,   1, 255, 191, 182,   0, 255, 135,   7,   0, 255, 254,
-    255, 195, 239,  31, 254, 225, 255, 159,   0, 224,  48,   4, 255, 252, 255,  31,
-    223,  63, 240, 255, 248,   3, 255, 239, 255, 223, 225, 255, 207, 255, 239, 159,
-    249, 255, 255, 253, 197, 227, 159,  89, 128, 176,   3,  16, 238, 135, 109, 195,
-    135,  25,   2,  94, 192, 255,  63,   0, 238, 191, 237, 227, 191,  27,   1,   0,
-      0,  30, 238, 159, 159,  25, 192, 176,   2,   0, 236, 199,  61, 214,  24, 199,
-    199,  29, 129,   0, 239, 223, 253, 255, 255, 227, 223,  29,  96,   7, 239, 227,
-     96,  64,   6,   0, 255, 231, 223,  93, 240, 128,   0, 252, 236, 255, 127, 252,
-    251,  47, 127, 128,  95, 255,  12,   0, 127,  32, 214, 247, 175, 255, 255,  59,
-     95,  32, 255, 243,   3, 255, 127, 249, 255,  63, 191,  32, 255, 247, 255,  61,
-    127,  61,  61, 127,  61, 255,  63,  63, 255, 199,  15,   0,  13,   0, 128,  16,
-    255, 127, 255,  15,  31,   0, 128,   0, 239, 255, 239,  15, 127,   0,   0, 222,
-    111,   4, 128, 255, 255, 170, 223,  95, 220,  31, 207,  15,   2, 128, 132, 252,
-     47,  62,  80, 189, 224,  67,  31, 120, 255, 128, 127, 127,   0, 128, 224,   0,
-    254,   3,  62,  31, 127, 224, 224, 255, 240, 143, 252, 255, 255, 249, 124,   0,
-    255,   0,  47,   0, 252, 232, 247, 255,   5,   0,   0,  56,  60,   0, 126, 126,
-    126,   0, 127, 248, 248, 224, 127,  95, 219, 255, 248, 255, 223, 255, 252, 252,
-    252,  28, 255, 183,  15, 255,  62,   0,  63, 253, 191, 145,  55,   0, 255, 192,
-    111, 240, 239, 254, 199, 255, 112,   0,  71,   0,  30,   0, 255,  23, 159,  64,
-    127, 189, 129, 224, 187,   7, 255, 131, 179,   0,  63, 127,   0,  63,  17,   0,
-     63,   1,  26,   0, 231, 127, 255,  32, 127, 251, 127, 180, 203,   0, 191, 253,
-    123,   1, 255, 224,  11,   0, 240,   0, 255,  67, 100, 222, 255, 235, 191, 231,
-    223, 223, 255, 123,  95, 252,  63, 255, 247, 207, 219,   7, 128,  63, 143,   8,
-    150, 254, 247,  10, 132, 234, 150, 170, 150, 247, 247,  94, 255, 251, 238, 251,
-};
-
-/* Alphanumeric: 2912 bytes. */
-
-RE_UINT32 re_get_alphanumeric(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-
-    f = ch >> 12;
-    code = ch ^ (f << 12);
-    pos = (RE_UINT32)re_alphanumeric_stage_1[f] << 4;
-    f = code >> 8;
-    code ^= f << 8;
-    pos = (RE_UINT32)re_alphanumeric_stage_2[pos + f] << 4;
-    f = code >> 4;
-    code ^= f << 4;
-    pos = (RE_UINT32)re_alphanumeric_stage_3[pos + f] << 4;
-    pos += code;
-    value = (re_alphanumeric_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1;
-
-    return value;
-}
-
-/* Any. */
-
-RE_UINT32 re_get_any(RE_UINT32 ch) {
-    return 1;
-}
-
-/* Blank. */
-
-static RE_UINT8 re_blank_stage_1[] = {
-    0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1,
-};
-
-static RE_UINT8 re_blank_stage_2[] = {
-    0, 1, 1, 1, 1, 2, 1, 1, 3, 1, 1, 1, 4, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-};
-
-static RE_UINT8 re_blank_stage_3[] = {
-    0, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 3, 2, 2, 4, 2, 2, 2, 2, 2, 2, 2,
-    3, 2, 2, 2, 2, 2, 2, 2,
-};
-
-static RE_UINT8 re_blank_stage_4[] = {
-      0,   2,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,
+      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   0,   0,
+      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,
+      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,
+      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,  78,
+      6,   6,   6,   6, 145,   0,  24,  81,   6,   6,   6,   6,   6,   6,   6,   6,
+    146, 147,   6, 148,   6,   6,   6,  26, 149, 150,   6,   6, 151,   6, 152, 153,
+      6, 154,   6,  97,   6,   6, 155, 156,   6, 157,  97,  78,   6,   6, 158, 105,
+      6, 138, 159, 160,   6,   6, 161, 162, 163, 164,  83,  80,   6,   6,   6, 165,
+      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,
+      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6, 166, 167,  29,
+      0,   0,   0,   0,   0,   0,   0,   0,   6,   6,   6,   6,   6,   6,   6,   6,
+      6,   6,   6, 157,   6,   6, 168,   0, 169, 170, 171,   6,   6,  26, 172,   6,
+      6,   6,  81, 173,   6,   6,   6,   6,   6,  81,  24,   6, 174,   6, 175,   1,
+     91, 176, 177, 178,   6,   6,   6,  78,   1,   2,   3, 107,   6, 105, 179,   0,
+    180, 181, 182,   0,   6,   6,   6,  68,   0,   0,   6,  96,   0,   0,   0, 183,
+      0,   0,   0,   0,  78,   6, 184, 114,   6, 185, 103,  68,  81,   6, 186,   0,
+      6,   6,   6,   6,  81,  80, 187,  29,   6, 188,   6, 189,   0,   0,   0,   0,
+      6,   6,   6,   6,   6,   6,   6,   6,   6, 138, 104, 175,   0,   0,   0,   0,
+    190, 191, 104, 138, 105,   0,   0, 192, 104, 168,   0,   0,   6, 193,   0,   0,
+    194, 195,   0,  78,  78,   0,  75, 196,   6, 104, 104, 197,  26,   0,   0,   0,
+      6,   6, 134,   0,   6, 197,   6, 197,   6, 198,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   6, 199,   0,   0,  78, 200, 184,   0,   0,  24, 201, 138,
+      6,   6, 196, 202,   6,  68,  24, 203,   6,  31, 204, 205,   6,   6, 206,   0,
+    207, 208,   0,   0, 209, 119,   6, 210,  34, 211, 212, 213,   0,   0,   0,   0,
+      6,   6, 214, 215,   6,   6, 216,   0,   0,   0,   0,   0,   6, 217, 218,   0,
+      6,   6, 219,   0,   6, 102, 100,   0,  89, 115,   0,   0,   0,   0,   0,   0,
+      6,  68,   0,   0,   0,   6,   6, 220, 221, 222, 223,   0,   0, 224, 225, 226,
+      6, 105, 200,   6, 227,   0,   6, 102,   0,   0,   0,   0,   0,   0,   0,   0,
+    228,   5, 229, 230, 174, 231,   0,   0, 232, 233, 198, 234, 235, 100,   0,   0,
+      0,   0,   0,   0,   0,   0,   0, 138,   0,   0,   0,   0,   0, 236,   0,   0,
+      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,
+      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6, 168,   0,   0,   0,
+      6,   6,   6, 144,   6,   6,   6,   6,   6,   6, 189,   0,   0,   0,   0,   0,
       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-    255,   7,   0,   0,   0, 128,   0,   0,   0,   0,   0, 128,   0,   0,   0,   0,
-};
-
-/* Blank: 218 bytes. */
-
-RE_UINT32 re_get_blank(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-
-    f = ch >> 15;
-    code = ch ^ (f << 15);
-    pos = (RE_UINT32)re_blank_stage_1[f] << 5;
-    f = code >> 10;
-    code ^= f << 10;
-    pos = (RE_UINT32)re_blank_stage_2[pos + f] << 3;
-    f = code >> 7;
-    code ^= f << 7;
-    pos = (RE_UINT32)re_blank_stage_3[pos + f] << 7;
-    pos += code;
-    value = (re_blank_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1;
-
-    return value;
-}
-
-/* Graph. */
-
-static RE_UINT8 re_graph_stage_1[] = {
-     0,  1,  2,  3,  4,  5,  6,  7,  7,  8,  7,  7,  7,  7,  7,  7,
-     7,  7,  7,  9, 10, 11,  7,  7,  7,  7, 12, 13,  7,  7,  7, 14,
-    15, 16, 17, 18, 19, 13, 20, 13, 21, 13, 13, 13, 13, 22,  7,  7,
-    23, 24, 13, 13, 13, 13, 25, 26, 13, 13, 27, 28, 29, 30, 31, 32,
-     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
-     7,  7,  7,  7, 33,  7, 34, 35,  7, 36,  7,  7,  7, 37, 13, 38,
-    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-    39, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
-     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7, 40,
-     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
-     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7, 40,
-};
-
-static RE_UINT8 re_graph_stage_2[] = {
-      0,   1,   2,   2,   2,   2,   3,   4,   2,   2,   5,   6,   7,   2,   8,   9,
-     10,  11,   2,  12,  13,  14,  15,  16,  17,  18,  19,  20,  21,  22,  23,  24,
-      2,  25,   2,   2,  26,  27,  28,  29,   2,   2,   2,   2,   2,  30,  31,  32,
-     33,  34,  35,  36,  37,  38,  39,  40,  41,  42,   2,  43,   2,   2,  44,  45,
-     46,  47,   2,  48,   2,   2,   2,   2,  49,   2,   2,   2,   2,   2,   2,   2,
-      2,   2,   2,   2,   2,   2,  50,  51,  52,  53,  54,  55,  56,  57,   2,  58,
-     59,  60,  61,  62,  63,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
-      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
-      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,  64,   2,   2,   2,   2,
-      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,  65,
-      2,   2,   2,   2,   2,   2,   2,   2,   2,  66,   2,   2,  67,  68,   2,  69,
-     70,  71,  72,  73,  74,  75,  76,  77,   2,   2,   2,   2,   2,   2,   2,   2,
-      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,  78,
-     79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,
-      2,   2,   2,   2,  80,  81,  82,  83,   2,   2,  84,  85,  86,  87,  88,  89,
-     90,  91,  92,  93,  79,  94,  95,  96,   2,  97,  98,  79,   2,   2,  99,  79,
-    100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110,  79, 111,  79, 112, 113,
-    114, 115, 116, 117, 118, 119, 120,  79, 121, 122,  79, 123, 124, 125, 126,  79,
-    127, 128,  79, 129, 130, 131,  79,  79, 132, 133, 134, 135,  79, 136,  79, 137,
-      2,   2,   2,   2,   2,   2,   2, 138, 139,   2, 140,  79,  79,  79,  79,  79,
-      2,   2,   2,   2,   2,   2,   2,   2, 141,  79,  79,  79,  79,  79,  79,  79,
-     79,  79,  79,  79,  79,  79,  79,  79,   2,   2,   2,   2, 142,  79,  79,  79,
-      2,   2,   2,   2, 143, 144, 145, 146,  79,  79,  79,  79, 147, 148, 149, 150,
-      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,  68,
-      2,   2,   2,   2,   2, 151,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,
-      2,   2, 152,   2,   2, 153,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,
-     79,  79,  79,  79,  79,  79,  79,  79, 154, 155,  79,  79,  79,  79,  79,  79,
-      2, 156, 157, 158, 159, 160, 161,  79, 162, 163, 164,   2,   2, 165,   2, 166,
-      2,   2,   2,   2,   2, 167,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,
-    168,  79, 169,  79,  79, 170,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,
-      2, 171, 172,  79,  79,  79,  79,  79, 173, 174, 175,  79, 176, 177,  79,  79,
-    178, 179, 180, 181, 182,  79,   2,   2,   2,   2,   2,   2,   2, 183, 184, 185,
-    186, 187, 188, 189, 190, 191,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,
-      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2, 192,   2,   2,
-      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2, 193,   2,
-    194,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
-      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2, 195,   2,   2,
-      2,   2,   2,   2,   2,   2,   2, 196,  79,  79,  79,  79,  79,  79,  79,  79,
-      2,   2,   2,   2, 197,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,
-    198,  79,   2,  65,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,
-      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2, 199,
-};
-
-static RE_UINT8 re_graph_stage_3[] = {
-      0,   0,   1,   2,   2,   2,   2,   3,   0,   0,   1,   2,   2,   2,   2,   2,
-      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   4,
-      5,   2,   6,   2,   2,   2,   2,   2,   2,   2,   2,   1,   2,   7,   2,   2,
-      8,   1,   2,   2,   9,   2,  10,  11,   2,  12,   2,   2,   2,   2,   2,   2,
-     13,   2,   2,   2,   8,   2,   2,   2,   2,   2,   2,  14,   2,   2,   2,   8,
-      2,   2,  15,   3,   2,  16,  17,   0,   0,   0,   2,  18,   0,  19,   2,   2,
-     20,  21,  22,  23,  24,  25,  26,   3,  27,  21,  22,  28,  29,  30,  31,  32,
-     33,   6,  22,  34,  35,  36,  26,  37,  38,  21,  22,  34,  39,  40,  26,   9,
-     41,  42,  43,  44,  45,  46,  31,  17,  12,  47,  22,  48,  49,  50,  26,  51,
-     12,  47,  22,  52,  49,  53,  26,  54,  55,  47,   2,   2,  56,  57,  26,   2,
-     58,  59,   2,  60,  61,  62,  31,  63,   1,   2,   2,  10,   2,  64,   0,   0,
-     65,   2,  66,  15,  67,  68,   0,   0,   2,   2,   2,   2,  69,   2,  70,   1,
-      2,  69,   2,  12,  12,  17,   0,   0,   2,   2,   2,   2,  71,   2,   2,   2,
-      2,   2,   2,   2,  72,  73,   2,   2,  72,   2,   2,  74,  75,  76,   2,   2,
-      2,  75,   2,   2,   2,   8,   2,  70,   2,  77,   2,   2,   2,   2,   2,  78,
-      1,  70,   2,   2,   2,   2,   2,  79,  12,  11,   2,  32,   2,  80,  12,  81,
-      2,   2,   2,   2,   2,  15,  77,  77,   3,  77,   2,   2,   2,   2,   2,  79,
-      2,   2,  17,   2,   2,   2,   2,  82,   2,   3,  64,  64,  83,   2,  15,  11,
-      2,   2,  64,   2,  77,  84,   2,   2,   2,  85,   2,   2,   2,   3,   2,  86,
-     77,  77,  15,   3,   0,   0,   0,   0,   2,   2,   2,   2,  64,   2,   2,  70,
-      2,   2,   2,   2,   2,   2,   2,  87,   2,   2,   2,  88,  48,   2,   2,   2,
-     79,   2,   2,   8,   9,   2,   2,  17,   2,   2,   2,   2,   2,   2,   2,  89,
-      2,  78,   2,   2,  78,  90,   2,  15,   2,   2,   2,  91,  91,  92,   2,  93,
-     94,   2,  95,   2,   2,   3,  91,  96,   3,  70,   2,   2,   0,   2,   2,  36,
-     64,   2,   2,   2,   2,   2,   2,   2,   2,   2,  32,   0,  17,   0,   2,   2,
-      2,   2,   2,   2,   2,   2,   2,  26,   2,  97,   2,   2,   2,   2,   2,   2,
-      2,   2,   3,   2,   2,   3,   2,   2,   2,   2,   2,   2,   2,   2,   2,  98,
-      2,   2,  71,   2,   2,   2,  99, 100,   2,  32, 101, 101, 101, 101,   2,   2,
-      2,   2,   2,   2,   2,   0,   0,   0,   2,  89,   2,   2,   2,   2,   2,  80,
-      2,   2,   2,   2,   2,  82,   0,  64,   1,   2,   2,   2,   1,   2,   2,   2,
-      2,   7,   2,   2,   2,   2,   2,   2, 102,   2,   2,   1,   2,   2,   2,   2,
-      3,   2,   2,  17,   2,   2,  80,   2,   2,   3,   2,   2,   2,   2,   2,   2,
-      2,   2,   2,  82,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   0,
-     70,   2,   2,   2,  32,   2,   2,   2,   2,   2,  64,   0,   2,   2,   2,   2,
-      2,   2,   2,   2,   2,   2,   2,   9,   2,   2,   2,   2, 103,   0,   0,  51,
-      2,   2,  64,  77,   2,   2,   2,   9,   2,   2,   2,   2, 104,  77,   2,   2,
-      2,   2,   2,   2,   2, 105,   2,  70,   2,   2,   2,   2,  13,  44,   2,   3,
-      2,   2,   2,  32,  15,  68,   2,   2,   2,   2,   2,   2, 106,  94,   2,  32,
-    107, 108, 101,   2,   2,   2,   9,   2,   2,   2,   2,   2,   2,   2,  15,  77,
-      2,   2,  80,   2, 109,   2,   2,  64,   0,   0,   0,   0,   0,   0,   0,   0,
-      2,   2,   2,   2,   2,   2,  15,   2,   2,   2,   2,   2,   2,  77,   0,   0,
-     32, 110,   2, 111, 112,   2,   2,   2,   2,   2,   2,   2,  14,  19,   2,   2,
-      2,   2,   2,   2,   0,   2,   2,   2,   2, 113,   2,   2,   9,   0,   0,  15,
-      2,  77,   2,   2,   2, 114, 115,  91,   2,   2,   2,   2,   2,   2,   2,  86,
-      1,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   3, 116, 117, 101, 118,
-    119,   2,  76, 120,  15,  15,   0,   0,   2,   2,   2,   2,   2,   2,   2,  17,
-    121,   2,   2, 122,   2,   2,   2,   2,   3,  64,  36,   0,   0,   2,   2,  15,
-      2,  70,   2,   2,   2,  36,   2,  64,   2,   2, 123,   2,  17,   2,   2,  17,
-      2,  13,   2,   2, 124,  82,   0,   0,   2,  15,  77,   2,   2, 124,   2,  64,
-      2,   2,   9,   2,   2,   2, 105,   0,   2,   2,   2,  32,   2,  82,   9,   0,
-    125,   2,   2, 126,   2, 127,   2,   2,   2,   3,  51,   0,   0,   0,   2, 128,
-      2, 129,   2, 130,   0,   0,   0,   0,   2,   2,   2, 131,   2, 113,   2,   2,
-    132, 133,   2, 134,  79,  79,   2,   2,   2,   2,   0,   0,   2,   2, 109,  32,
-      2,   2,   2, 135,   2,  97,   2, 136,   2, 137, 138,   0,   0,   0,   0,   0,
-      2,   2,   2,   2,  79,   0,   0,   0,   2,   2,   2, 106,   2,   2,   2, 139,
-      2,   2,   9,  77,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   3,
-      2,   2,   9,   2,   2,  77,   0,   0,   0,   0,   0,   0,   0,   0,   2,  32,
-      2,   2,   2,   2,  15, 113,   2, 140,   2,   2,   2,   2, 141,   2,  79,  77,
-      2,   2,   2,  91,  32,   2,   2,  32,   2,   2,   2,   2,  15,   2,   1,  11,
-      2,   6,   2,   3,   0,   0,   0,   0, 142,  13,  77,   2,   2,   2,  17,  77,
-     20,  21,  22, 143,  39, 144, 145,  11,   2,   2,   2,   2,   2, 146,   0,   0,
-      2,   2,   2,   2,   9,  77,   0,   0,   2,   2,   2,  97,   2,  15,   0,   0,
-      2,   2,   2,   2,  11,  77,  70,   0,   2,   2,   2,  79,  77,   0,   0,   0,
-      2,   8,  64,   2,   0,   0,   0,   0,   2,   2,   2,  64,   0,   0,   0,   0,
-      0,   0,   2,   2,   2,   2,   2, 147,   0,   0,   4,   2,   2,   4,  11,   0,
-      2,   2,   2,   2,   9,   2,   2,   2,   2,   2, 106,   0,   2,   2,   2,  79,
-     22,   2,   2,  76,  82,   2,  70,   2,   2, 113,  69,  32,   0,   0,   0,   0,
-    148,   2,   2, 149,   9,  77, 150,   2,   3, 151,  77,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   2,  79,   0,   0,   0,   0,   2,   2,   2, 152,
-      2,  77,   0,   0,   0,   0,   0,   0,   2,   2,   2,   2,   2,   2,   3,  11,
-      2,   2,   2,   2,  80,   0,   0,   0,   2,   2,   3,  79,   0,   0,   0,   0,
-      2,   2,   2,   2,  32,   0,   0,   0,   2,   2,   2,  79,   2,   3,  44,   0,
-      0,   0,   0,   0,   0,   2,  15,  82,   2,   2,   2,   2,  82,  89,   6, 153,
-      2,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   2,   2,   2,
-      2,  17,   0,   0,   0,   0,   0,   0,   2,   2,   2,   2,  10,   2,   2,   2,
-     99,   2,   0,   0,   0,   0,  80,   0,   2,   2,   2,   2,   2,   2,   2, 106,
-      2,   3,   0,   0,   0, 106, 154,   2,   2,   2,   2,   2,   2,   2,   2,  64,
-      2,   2,   2,   2,   2,   2,  17,  70,  79,  68,  80,   0,   0,   0,   0,   0,
-      2,   2,   2,   2,   2,   2,   2,  82,   2,   2,   7,   2,   2,   2,   2,   2,
-      2,   2,   2,   2,   2,   2,  79,   0,   2,   2,   2,   2,  82,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   2,  80,   2,   2,   2,   2,   2,  32,   2,  79,
-      2,   2,   2,   2,   2,  91,   2,   2,   2,  12, 155, 146, 156,   2,   2,   2,
-    157, 158,   2, 159, 160,  47,   2,   2,   2,   2,  97,   2,   2,   2,   2,   2,
-      2,   2,   2,   2,  85,   2,   2,   2,  64,  94,   1,   0,   0,   0,   0,   0,
-     76, 161, 162,   0,   0,   0,   0,   0,   2,   2,  70,  15,  44,   0,   0,   0,
-      0,   0,   0,   0,   2,   2,   2, 130,   2,   2,   2,   2, 163,  32,   0,   0,
-      2,   2,   2,   2,  64,  44,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,
-      2,   2,   2,  11,   0,   0,   0,   0,   1,   2,   2,  15,   0,   0,   0,   0,
-    156,   2, 164, 165, 166, 167, 168, 169,  89,  64, 170,  64,   0,   0,   0,  14,
-      2,   2,  64,   2,   2,   2,   2,   2,   2,  80,   3,   1,   1,   1,   2,  82,
-     70,   2,   2,   2,   2,   2,  70,   2,   2,   2,  70,   0,   0,   0,  31,   2,
-    106,   2,   2,  64,  79,  14,  82,   0,   2,   2,   2,   2,   2,  82,  70,  17,
-      2,   2,   2,   2,   2,   2,   2,  80,   2,   2,   2,   2,   2,  79,  64,   0,
-     64,   2,   2,   2,   9,  77,   2,   2,   9,   2,  15,   0,   0,   0,   0,   0,
-    119,   2,   2,   2,   2,   2,   2, 171,   2,   2, 172,   2,   8,   2,   2,   2,
-      2,   2,   2,   2,   2,  80,  15, 173, 106,  82,   0,   0,   0,   0,   0,   0,
-      2,   2,   2,   2,   2,  32,   0,   0,   2,   2,   2,  11,   2,   2,   2,   2,
-      2,  15,   2,   2,   2,   2,   2,   2,   2,   2,  14,   2,   2,   2,   2,   2,
-      2,   2,   2,   2,   2,   2,  36,   0,   2,  15,   0,   0,   0,   0,   0,   0,
-    174,   0,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,  15,
-};
-
-static RE_UINT8 re_graph_stage_4[] = {
-      0,   0, 254, 255, 255, 255, 255, 127, 255, 252, 240, 215, 251, 255, 127, 254,
-    255, 231, 255,   0, 255, 135,  31,   0, 255, 223, 255, 191,   3,   0, 255,  63,
-    255,  79, 255,   7, 223,  63, 248, 255, 239, 159, 249, 255, 255, 253, 197, 243,
-    159, 121, 128, 176, 207, 255, 238, 135, 109, 211, 135,  57,   2,  94, 192, 255,
-    127,   0, 238, 191, 237, 243, 191,  59,   1,   0,   3, 254, 238, 159, 159,  57,
-    192, 176, 236, 199,  61, 214,  24, 199, 255, 195, 199,  61, 129,   0, 253, 255,
-    255, 227, 223,  61,  96,   7, 128, 255, 239, 243,  96,  64,   6,   0, 239, 223,
-    223, 253, 240, 255, 236, 255, 127, 252, 251,  47, 127, 132,  95, 255,  28,   0,
-    255,  15, 214, 247, 175, 255,  95,  63, 255, 243, 255, 254, 255,  31, 191,  32,
-    255,  61, 127,  61,  61, 127,  61, 255, 127, 255, 255,   3,  63,  63, 255,   1,
-     15,   0,  13,   0,  63,   0, 241, 255, 255, 199, 255, 207, 255, 159,  15, 240,
-    255, 248, 255, 251, 255, 170, 223, 255, 207, 239, 220, 127,   0, 248, 255, 124,
-    243, 255,  63, 255,  15, 254, 255, 128,   1, 128, 127, 127, 224, 255, 124,   0,
-     63, 192,  15, 128,   7,   0, 126, 126, 126,   0, 127, 248, 248, 224, 127,  95,
-    219, 255, 252, 255, 247, 255, 127,  15, 252, 252, 252,  28,   0,  62, 255, 239,
-    255, 183, 135, 255, 143, 255,  15, 224,  15, 255,  63, 253, 191, 145, 191, 255,
-     55, 248, 255, 143, 255, 131, 255, 240, 111, 240, 239, 254,  63, 135,  63, 254,
-      7, 255,   3,  30,   0, 254,   7, 252,   0, 128,   3,  32, 127, 189, 237, 251,
-    129, 224, 207,  31, 255, 235,   7, 128, 127, 251, 127, 180, 191, 253, 251,   1,
-      3, 128, 255, 224, 240,   0, 100, 222, 239, 255, 191, 231, 223, 223, 255, 123,
-     95, 252, 255, 249, 219,   7, 159, 255, 150, 254, 247,  10, 132, 234, 150, 170,
-    150, 247, 247,  94, 238, 251, 123, 252, 231, 199,  15,   7,   2,   0,
-};
-
-/* Graph: 3150 bytes. */
-
-RE_UINT32 re_get_graph(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-
-    f = ch >> 11;
-    code = ch ^ (f << 11);
-    pos = (RE_UINT32)re_graph_stage_1[f] << 4;
-    f = code >> 7;
-    code ^= f << 7;
-    pos = (RE_UINT32)re_graph_stage_2[pos + f] << 3;
-    f = code >> 4;
-    code ^= f << 4;
-    pos = (RE_UINT32)re_graph_stage_3[pos + f] << 4;
-    pos += code;
-    value = (re_graph_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1;
-
-    return value;
-}
-
-/* Print. */
-
-static RE_UINT8 re_print_stage_1[] = {
-     0,  1,  2,  3,  4,  5,  5,  5,  5,  6,  7,  5,  5,  8,  5,  9,
-    10, 11, 12, 13, 14, 15, 16,  5, 17, 15, 15, 18, 15, 19, 20, 21,
-     5,  5,  5,  5,  5,  5,  5,  5,  5,  5, 22, 23, 24,  5, 25, 26,
-    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-    27, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5, 28,
-     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5, 28,
-};
-
-static RE_UINT8 re_print_stage_2[] = {
-      0,   1,   1,   2,   1,   3,   4,   5,   6,   7,   8,   9,  10,  11,  12,  13,
-     14,   1,  15,  16,   1,   1,  17,  18,  19,  20,  21,  22,  23,  24,   1,  25,
-     26,  27,   1,   1,  28,   1,   1,   1,   1,   1,   1,  29,  30,  31,  32,  33,
-     34,  35,  36,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,  37,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,  38,
-      1,   1,   1,   1,  39,   1,  40,  41,  42,  43,  44,  45,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,  46,  47,  47,  47,  47,  47,  47,  47,  47,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,  48,  49,   1,  50,  51,  52,
-     53,  54,  55,  56,  57,  58,   1,  59,  60,  61,  62,  63,  64,  65,  66,  67,
-     68,  69,  70,  71,  72,  73,  74,  75,  76,  77,  78,  47,  79,  80,  81,  82,
-      1,   1,   1,  83,  84,  85,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,
-      1,   1,   1,   1,  86,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,
-     47,  47,  47,  47,   1,   1,  87,  47,  47,  47,  47,  47,  47,  47,  47,  47,
-     47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,
-     47,  47,  47,  47,  47,  47,  47,  47,   1,   1,  88,  89,  47,  47,  90,  91,
-      1,   1,   1,   1,   1,   1,   1,  92,   1,   1,  93,  47,  47,  47,  47,  47,
-      1,  94,  95,  47,  47,  47,  47,  47,  47,  47,  47,  47,  96,  47,  47,  47,
-     97,  98,  99, 100, 101, 102, 103, 104,   1,   1, 105,  47,  47,  47,  47,  47,
-    106, 107, 108,  47,  47,  47,  47,  47, 109, 110,  47,  47, 111, 112, 113,  47,
-    114, 115, 116,   1,   1,   1, 117, 118, 119, 120, 121,  47,  47,  47,  47,  47,
-      1,   1,   1,   1,   1,   1, 122,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1, 123, 124,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1, 125,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1, 126,  47,  47,  47,  47,
-     47,  47,  47,  47,  47,  47,  47,  47,   1,   1, 127,  47,  47,  47,  47,  47,
-    128,  38,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1, 129,
-};
-
-static RE_UINT8 re_print_stage_3[] = {
-      0,   1,   1,   2,   0,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   1,   3,   4,   5,   1,   1,   1,   6,   7,   1,   8,   1,   9,  10,
-     11,   1,   1,   1,   1,   1,   1,   1,  12,   1,  13,   1,   1,  14,   1,  15,
-      1,  16,  17,  18,   0,  19,  20,   1,   1,   1,   1,   1,  21,  22,  23,  24,
-     25,  26,  27,  28,  29,  30,  31,  32,  33,  30,  34,  35,  36,  37,  38,  39,
-     40,  41,  42,  43,  40,  44,  45,  46,  47,   1,  48,  49,  50,  51,  52,  53,
-     54,  55,  56,   0,  57,  58,  59,   0,   1,   1,  60,  61,  62,  11,  63,   0,
-      1,   1,   1,   1,   1,   1,  64,   1,   1,   1,  65,   1,  66,  67,  68,   1,
-     69,   1,  15,  70,  71,   1,   1,  72,   1,   1,   1,   1,  70,   1,   1,  73,
-     74,  75,  76,  77,   1,   1,  78,  79,  80,   1,   1,  73,   1,  81,   1,  82,
-      2,  83,  84,  85,   1,  86,  87,   1,  88,   1,   2,  89,  79,  16,   0,   0,
-      1,   1,  86,  70,   1,   1,   1,  90,   1,  91,  92,   1,  93,  15,   9,  94,
-      1,   1,   1,   1,   1,   1,   1,  95,  72,   1,  96,  78,   1,  97,  98,  99,
-      1, 100,   1, 101, 102,   1, 103, 104,   1,   1,   1,   1,  86,   1,   1,   1,
-      1, 105,  18,   1,   1,   1,   1,   1,   1,   1,   1, 106, 107,   1,   1,   1,
-      1, 108,   2,   1,   1,   1,   1, 109,   1,  64,   1, 110,  75, 111, 111,   1,
-      1,   1, 112,   0,  95,   1,   1,  76,   1,   1,   1,   1,   1,   1,  82, 113,
-      1,   1,  54,   1,   7,   1,   1,   1, 114,   6,   1,   1, 108,  94,   1, 115,
-      2,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,  82,   1,   1,
-      1,   1,   1,   1,   1,   1,   1, 112,   1,   1,   1,   1, 116,   1, 117,   1,
-      1, 118,   1,   1,   1,   1,   1, 119,   1,   1,   1,   1,   1,   1, 120, 121,
-      1, 122,   1, 119,   1,   1, 123,   1,   1,   1, 124,  70,   1,   1, 125,   2,
-      1,  75, 126,   1,   1,   1, 127,  75, 128, 129,   1,   9,   1,   1,   1, 130,
-      1,   1,   1,   1,   1, 115, 131,  56,   0,   0,   0,   0,   0,   0,   0,   0,
-      1,   1,   1, 132,   1,   1,  71,   0, 133, 134, 135,   1,   1,   1, 136,   1,
-      1,   1, 103,   1, 137,   1, 138, 139,  71,   1, 140, 141,   1,   1,   1,  89,
-     54,   1,   1,   1,   1,   2, 142, 143, 144, 145, 146,   0,   1,   1,   1,  94,
-    147, 148,   1,   1, 149, 150, 103,  78,   0,   0,   0,   0,  70,   1, 104,  56,
-      1, 151,  81,  94, 152,   1, 153,   0,   1,   1,   1,   1,  78, 154, 155,  56,
-      1,   9,   1, 156,   0,   0,   0,   0,   1,  75,  82, 138,   0,   0,   0,   0,
-    157, 158, 159,   1,   2, 160,   0, 161, 162, 163,   0,   0,   1, 164, 137,   1,
-    165, 166, 167,   1,   1,   0,   1, 168,   1, 169, 107, 170, 171, 172,   0,   0,
-      1,   1, 173,   0,   1, 174,   1, 175,   1, 176,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   2,   0,   0,   0,   0,   1,   9,  71,   0,   0,   0,   0,  75,
-      1,   1, 177, 178,   1,   1, 179, 180,   1,  97, 117,  75,   1,   1, 132, 181,
-    182,   2,   0,   0, 183, 154,   1, 184,  21, 185, 186, 187,   0,   0,   0,   0,
-      1,   1, 188,   0,   1,   1, 176,   0,   0,   0,   0,   0,   1, 107,  78,   0,
-      1,   1, 189, 190,   1,  73, 191,   0,  15,  86,   0,   0,   0,   0,   0,   0,
-      1,  56,   0,   0,   0,   1,   1, 192,   0,   0,   0,   0,   0, 100,   3, 193,
-      1,   1,   9,   1,   1, 194,   1,  73, 195, 196, 197, 116, 137, 198,   0,   0,
-    199, 200, 176, 201, 202, 191,   0,   0,   0,   0,   0,   0,   0,   0,   0,  73,
-      0,   0,   0,   0,   0,   0,   1, 203,   1,   1,   1,   1,  71,   0,   0,   0,
-      1,   1,   1, 204,   1,   1,   1,   1,   1,   1, 205,   0,   0,   0,   0,   0,
-      1, 206,   0,   0,   0,   0,   0,   0,   1,   1, 105,   0,   0,   0,   0,   0,
-      1,  73,   2, 207,   0,   0, 103, 208,   1,   1, 209, 210, 112,   0,   0,   0,
-      0,   0,   1,   1,  94,   0,   0,   0,   1,   1, 211,   1, 212,   0,   0, 205,
-      1,   1,   1,   1,   1,   1,   1, 119,   1,   1,   1,   1,   1,   1,   1, 174,
-      2,   0, 213, 214,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,  56,
-      1,   1,   1, 215, 216, 205,   0,   0,   1,   1,   1,   1,   1,   1,   1,  82,
-      1, 217,   1,   1,   1,   1,   1, 173,   1,   1, 218,   0,   0,   0,   0,  76,
-      1,   1,  75,  73,   0,   0,   0,   0,   1,   1,  97,   1,  11, 219, 220,   1,
-    221, 222, 223,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1, 224,   1,   1,
-      1,   1,   1,   1,   1,   1, 225,   1,   1,   1,   1,   1, 226, 227,   0,   0,
-    228, 229,   0,   0,   0,   0,   0,   0,   1, 230, 207,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   1, 163,   1,   1,   1,   1,   1,   1, 231,   0,
-      1,   1, 232,   0,   0,   0,   0,   0,   0,   0,   0, 233,   1, 234,   0,   0,
-     54,  78,   0,   0,   0,   0,   0,   0, 220, 235, 236, 237, 238, 239,   0, 240,
-      1,  86,   1,   1,  76, 241, 242,  82, 116,   1,   1, 116,   1, 190,   0, 243,
-    244,  56, 245, 218,   0,   0,   0,   0,   1,   1,   1,   1,   1,   1,  82, 246,
-      1,   1,   1,  76,   1,   1,  73, 118,  86,   1, 176,   1,   9, 247,   0,   0,
-    144,   1,   1, 248,   1, 249,  13,   1,   1,   1,  76, 250, 251,   0,   0,   0,
-      1,   1,   1,   1,   1,   1,  75,   0,   1, 234,   1,   1,   1,   1,   1,   1,
-     78,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1, 252,   1,   1,
-      1,   1,   1,   1,   1,   1,   1, 150,  78,   0,   0,   0,   0,   0,   0,   0,
-    253,   1,   1,   1,   0,   0,   0,   0,   1,   1,   1,   1,   1,   1,   1,  78,
-};
-
-static RE_UINT8 re_print_stage_4[] = {
-      0,   0,   0,   0, 255, 255, 255, 255, 255, 255, 255, 127, 255, 255, 255, 252,
-    240, 215, 255, 255, 251, 255, 255, 255, 255, 255, 254, 255, 255, 255, 127, 254,
-    255, 231, 254, 255, 255,   0, 255, 255, 255, 135,  31,   0, 255, 255, 255, 223,
-    255, 191, 255, 255, 255, 231, 255, 255, 255, 255,   3,   0, 255, 255, 255, 231,
-    255,  63, 255, 127, 255, 255, 255,  79, 255,   7,   0,   0, 255, 255, 223,  63,
-      0,   0, 248, 255, 239, 159, 249, 255, 255, 253, 197, 243, 159, 121, 128, 176,
-    207, 255, 255, 127, 238, 135, 249, 255, 255, 253, 109, 211, 135,  57,   2,  94,
-    192, 255, 127,   0, 238, 191, 251, 255, 255, 253, 237, 243, 191,  59,   1,   0,
-    207, 255,   3, 254, 238, 159, 249, 255, 159,  57, 192, 176, 207, 255, 255,   0,
-    236, 199,  61, 214,  24, 199, 255, 195, 199,  61, 129,   0, 192, 255, 255,   7,
-    255, 223, 253, 255, 255, 253, 255, 227, 223,  61,  96,   7, 207, 255, 128, 255,
-    255, 253, 239, 243, 223,  61,  96,  64, 207, 255,   6,   0, 239, 223, 253, 255,
-    223, 253, 240, 255, 207, 255, 255, 255, 236, 255, 127, 252, 255, 255, 251,  47,
-    127, 132,  95, 255, 192, 255,  28,   0, 254, 255, 255, 255, 255, 255, 255, 135,
-    255, 255, 255,  15, 214, 247, 255, 255, 175, 255, 255,  63,  95,  63, 255, 243,
-    255, 254, 255, 255, 255,  31, 254, 255, 255, 255, 255, 254, 255, 223, 255,   7,
-    191,  32, 255, 255, 255,  61, 127,  61, 255,  61, 255, 255, 255, 255,  61, 127,
-     61, 255, 127, 255, 255, 255,  61, 255, 255, 255, 255,  31, 255, 255, 255,   3,
-    255, 255,  63,  63, 255, 255, 255,   1, 255, 223,  31,   0, 255, 255, 127,   0,
-    255, 255,  15,   0, 255, 223,  13,   0, 255, 255, 255,  63, 255,   3, 255,   3,
-    255, 127, 255,   3, 255,   7, 255, 255, 255, 255,  63,   0, 255,  15, 255,  15,
-    241, 255, 255, 255, 255,  63,  31,   0, 255,  15, 255, 255, 255,   3, 255, 199,
-    255, 255, 255, 207, 255, 255, 255, 159, 255, 255,  15, 240, 255, 255, 255, 248,
-    255, 227, 255, 255, 255,   1, 255, 255, 255, 255, 255,   7, 255, 255, 255, 251,
-     63,  63, 255, 170, 255, 255, 223, 255, 223, 255, 207, 239, 255, 255, 220, 127,
-    255, 252, 255, 255, 223, 255, 243, 255, 255, 127, 255,  31,   0,   0, 255, 255,
-    255, 255,   1,   0, 127,   0,   0,   0, 255, 255, 207, 255, 255, 255,  63, 255,
-    255, 127, 255, 255, 255, 255,  15, 254, 255, 128,   1, 128, 127, 127, 127, 127,
-    255, 255,   0,   0,   0,   0, 255,  15, 224, 255, 255, 255,  15,   0, 255, 255,
-    255,  31, 255, 255, 127,   0, 255, 255, 255,  15,   0,   0, 255, 255, 255,   0,
-    124,   0,   0,   0,   0,   0, 128, 255, 255,  15, 255,   3,  63, 192, 255,   3,
-    255, 255,  15, 128, 255, 191, 255, 195, 255,  63, 255, 243,   7,   0,   0, 248,
-    126, 126, 126,   0, 127, 127, 255, 255, 255,  63, 255,   3, 127, 248, 255, 255,
-    255,  63, 255, 255, 127,   0, 248, 224, 255, 255, 127,  95, 219, 255, 255, 255,
-      3,   0, 248, 255, 255, 255, 252, 255, 255,   0,   0,   0,   0,   0, 255,  63,
-    255, 255, 247, 255, 127,  15, 223, 255, 252, 252, 252,  28, 127, 127,   0,  62,
-    255, 239, 255, 255, 127, 255, 255, 183, 255,  63, 255,  63, 135, 255, 255, 255,
-    255, 255, 143, 255, 255, 127, 255,  15,   1,   0,   0,   0,  15, 224, 255, 255,
-    255, 255, 255, 191,  15, 255,  63,   0, 255,   3, 255, 255, 255, 255,  15, 255,
-     15, 128,   0,   0,  63, 253, 255, 255, 255, 255, 191, 145, 255, 255, 191, 255,
-    128, 255,   0,   0, 255, 255,  55, 248, 255, 255, 255, 143, 255, 255, 255, 131,
-    255, 255, 255, 240, 111, 240, 239, 254, 255, 255,  63, 135, 255,   1, 255,   1,
-    127, 248, 127,   0, 255, 255,  63, 254, 255, 255,   7, 255, 255, 255,   3,  30,
-      0, 254,   0,   0, 255,   1,   0,   0, 255, 255,   7,   0, 255, 255,   7, 252,
-    255,   0, 255,   3, 255,  63, 252, 255, 255, 255,   0, 128,   3,  32, 255, 255,
-    255,   1, 255,   3, 254, 255,  31,   0, 255, 255, 251, 255, 127, 189, 255, 191,
-    255,   7, 255,   3, 255, 253, 237, 251, 159,  57, 129, 224, 207,  31,  31,   0,
-    255, 255, 255, 235,  31,   0, 255,   3, 255,  31,   0,   0, 255,   3,   0,   0,
-    255, 255,   7, 128,  31,   0,   0,   0,   7,   0,   0,   0, 255, 253, 255, 255,
-    255, 255, 127, 255,  63,   0, 255, 255, 255, 254, 127,   0, 127, 251, 255, 255,
-    255, 255, 127, 180, 191, 253, 255, 255, 255, 127, 251,   1, 255, 255,   3, 128,
-    255, 127,  31,   0,  15,   0,   0,   0, 255, 127, 255,   1, 255, 195,   0,   0,
-    255,  63,  63,   0,  63,   0, 255, 251, 251, 255, 255, 224, 255, 135, 255, 255,
-    255, 128, 255, 255,   0,   0,   7,   0, 240,   0, 255, 255, 255,   7, 255,  31,
-    255,   1, 255, 243, 127, 254, 255, 255,  63,   0,   0,   0, 100, 222, 255, 235,
-    239, 255, 255, 255, 191, 231, 223, 223, 255, 255, 255, 123,  95, 252, 253, 255,
-     63, 255, 255, 255, 255, 207, 255, 255, 255,  15,   0, 248, 254, 255,   0,   0,
-    127, 255, 255, 249, 219,   7,   0,   0, 255,  31, 255,  63, 159, 255, 127,   0,
-    255,  15, 255, 195,   0,   0, 254, 255, 255, 255,  31,   0, 150, 254, 247,  10,
-    132, 234, 150, 170, 150, 247, 247,  94, 255, 251, 255,  15, 238, 251, 255,  15,
-      0,   0,   3,   0, 255, 127, 254, 255, 254, 255, 254, 255, 192, 255, 255, 255,
-      7,   0, 255, 255, 255,   1,   3,   0, 255,  31, 255,   7, 255,  63,   0,   0,
-    255, 255, 123, 252, 231, 199, 255, 255, 255,  63,  15,   7,   7,   0,  63,   0,
-      3,   0, 255, 255,   2,   0,   0,   0,
+      6, 144,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,
+      6,   6, 196,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,
+      6, 102, 105, 100,   0,   0,  24, 108,   6, 138, 223, 237,  91,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   6,   6,   0,   0,   0,   0,   6,   6, 238,   6, 239,   0,   0, 240,
+      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,
+      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6, 117,
+      6,   6,   6,   6,   6,   6, 104,   0, 134,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      6,   6,   6,   6,   6,   6,   6,   6, 105,   0, 241, 204,   6,   6,   6,   6,
+      6,   6,   6,   6,   6,   6,   6,  29,   0,   0,   0,   0,   0,   0,   0,   0,
+      6,   6,   6, 242, 243,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 244, 245, 246,   0,   0,
+      0,   0, 247,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      6,   6,  31,   6, 248, 249, 250,   6, 251, 252, 253,   6,   6,   6,   6,   6,
+      6,   6,   6,   6,   6, 254, 255,  83,  31,  31, 135, 135, 228, 228, 256,   6,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      6, 257,   6, 258, 259, 260,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    261, 262,   0,   0,   0,   0,   0,   0,   6, 263, 264,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   6, 168,   0,   0,   0,   0,   0,   0,   0,   0,
+      6,   6,   6,   6,   6,   6, 265,   0,   6,   6, 115,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    250, 266, 267, 268, 269, 270,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,
+      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,
+      6,   6,   6,   6,   6,   6,  81,   0,   6,   6,   6,   6,   6,   6,   6,   6,
+      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,
+      6,   6,   6,   6,   6,   6,   6,   6,   6,  96,   6,   6,   6,   6,   6,   6,
+     81,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,
+      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,
+      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,
+      6,   6,   6,   6,   6, 271,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,
+      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,
+      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6, 114,
+      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,
+     81,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,
+      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,  30,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   6,   6,   6,   6,   6,   6,   6,  91,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0
+};
+
+static RE_UINT8 re_xid_continue_table_3[] = {
+      0,   0,   0,   0,   0,   0, 255,   3, 254, 255, 255, 135, 254, 255, 255,   7,
+      0,   4, 160,   4, 255, 255, 127, 255, 255, 255, 255, 255, 195, 255,   3,   0,
+     31,  80,   0,   0, 255, 255, 223, 184, 192, 215, 255, 255, 251, 255, 255, 255,
+    255, 255, 191, 255, 251, 252, 255, 255, 255, 255, 254, 255, 255, 255, 127,   2,
+    255,   1, 254, 255, 255, 255, 255, 191, 182,   0, 255, 255, 255, 135,   7,   0,
+      0,   0, 255,   7, 255, 195, 255, 255, 255, 255, 239, 159, 255, 253, 255, 159,
+      0,   0, 255, 255, 255, 231, 255, 255, 255, 255,   3,   0, 255, 255,  63,  36,
+    255,  63,   0,   0, 255, 255, 255,  15, 255,   7,   0,   0, 255, 255, 223, 255,
+    255,   0, 248, 255, 207, 255, 254, 255, 239, 159, 249, 255, 255, 253, 197, 243,
+    159, 121, 128, 176, 207, 255,   3,  80, 238, 135, 249, 255, 255, 253, 109, 211,
+    135,  57,   2,  94, 192, 255,  63,   0, 238, 191, 251, 255, 255, 253, 237, 243,
+    191,  59,   1,   0, 207, 255,   0, 254, 238, 159, 249, 255, 159,  57, 224, 176,
+    207, 255,   2,   0, 236, 199,  61, 214,  24, 199, 255, 195, 199,  61, 129,   0,
+    192, 255,   0,   0, 255, 223, 253, 255, 255, 253, 255, 227, 223,  61,  96,   7,
+    207, 255,   0,   0, 239, 223, 253, 255, 255, 253, 239, 243, 223,  61,  96,  64,
+    207, 255,   6,   0, 223, 125, 240, 128, 207, 255,   0, 252, 238, 255, 127, 252,
+    255, 255, 251,  47, 127, 132,  95, 255, 192, 255,  12,   0, 254, 255, 255, 255,
+    255, 255, 255,   7, 255, 127, 255,   3, 214, 247, 255, 255, 175, 255, 255,  63,
+     95,  63, 255, 243,   1,   0,   0,   3, 255,   3, 160, 194, 255, 254, 255, 255,
+    255,  31, 254, 255, 223, 255, 255, 254, 255, 255, 255,  31,  64,   0,   0,   0,
+    255,   3, 255, 255, 255, 255, 255,  63, 191,  32, 255, 255, 255, 255, 255, 247,
+    255,  61, 127,  61, 255,  61, 255, 255, 255, 255,  61, 127,  61, 255, 127, 255,
+    255, 255,  61, 255, 255, 255, 255, 231,   0, 254,   3,   0, 255, 255,   0,   0,
+    255, 255,  63,  63, 255, 159, 255, 255, 255, 199, 255,   1, 255, 223,  31,   0,
+    255, 255,  31,   0, 255, 255,  15,   0, 255, 223,  13,   0, 255, 255, 143,  48,
+    255,   3,   0,   0,   0,  56, 255,   3, 255, 255, 255,   1, 255,   7, 255, 255,
+    255, 255,  63,   0, 255, 255, 255, 127, 255,  15, 255,  15, 192, 255, 255, 255,
+    255,  63,  31,   0, 255,  15, 255, 255, 255,   3, 255,   7, 255, 255, 255, 159,
+    255,   3, 255,   3, 128,   0, 255, 191,   1,   0,   0,   0, 255,  15, 255,   3,
+      0, 248,  15,   0, 255, 255, 255,   0, 255, 227, 255, 255, 255,   1, 255, 255,
+      0,   0, 247, 255, 255, 255, 255, 251,  63,  63, 255, 170, 255, 255, 223,  95,
+    220,  31, 207,  15, 255,  31, 220,  31,   0,   0,   0, 128,   1,   0,  16,   0,
+      0,   0,   2, 128,   0,   0, 255,  31, 226, 255,   1,   0, 132, 252,  47,  63,
+     80, 253, 255, 243, 224,  67,   0,   0, 255,   1,   0,   0, 255, 127, 255, 255,
+     31, 248,  15,   0, 255, 128,   0, 128, 255, 255, 127,   0, 127, 127, 127, 127,
+    224,   0,   0,   0, 254, 255,  62,  31, 255, 255, 127, 230, 224, 255, 255, 255,
+    255, 127,   0,   0, 255,  31,   0,   0, 255,  31, 255, 255, 255,  15,   0,   0,
+    255, 255, 240, 191,   0,   0, 128, 255, 252, 255, 255, 255, 255, 249, 255, 255,
+    252,   7,   0,   0,   0,   0, 224, 255, 255,  16,   0,   0,  63,   0, 255,   3,
+    255, 255, 255, 232, 255,  63, 255, 255,   1, 128, 255,   3, 255,  63, 255,   3,
+    255, 255, 127, 252,   7,   0,   0,  56, 255, 255, 124,   0, 126, 126, 126,   0,
+    127, 127, 255, 255, 255,  55, 255,   3,  15,   0, 255, 255, 127, 248, 255, 255,
+    255, 255, 255,   3, 127,   0, 248, 224, 255, 253, 127,  95, 219, 255, 255, 255,
+      0,   0, 248, 255, 240, 255, 255, 255, 255, 255, 252, 255, 255,   0,   0,   0,
+    255, 255,  24,   0,   0, 224,   0,   0,   0,   0, 138, 170, 252, 252, 252,  28,
+    255, 239, 255, 255, 127, 255, 255, 183, 255,  63, 255,  63,   0,   0,   0,  32,
+    255, 255,   1,   0,   0, 224, 255, 255,  15, 255,  62,   0, 255, 255,  15, 255,
+    255,   0, 255, 255,  15,   0,   0,   0,  63, 253, 255, 255, 255, 255, 191, 145,
+    255, 255,  55,   0, 255, 255, 255, 192, 111, 240, 239, 254, 255, 255,  63, 135,
+    127,   0,   0,   0, 255, 255,   7,   0, 255,   0, 255,   3, 255,  27,   3,   0,
+    128,   0, 255, 255,  31,   0,   0,   0, 192, 255,   0, 128, 255,   1, 255,   3,
+    240,   0, 255, 255, 255, 255,  79,   0,  31, 222, 255,  23, 255, 255, 251, 255,
+    255, 255, 255,  64, 127, 189, 255, 191, 255,   7, 255,   3, 255, 253, 237, 251,
+    159,  57, 129, 224, 207,  31,  31,   0, 255,   7, 255, 195,   3,   0,   0,   0,
+    191,   0, 255,   3, 255, 255,  63, 255,   1,   0,   0,  63,  17,   0, 255,   3,
+    255,   3,   0, 128, 127, 242, 111, 255, 255, 255, 191, 249,  15,   0, 255,   3,
+    255, 252, 255, 255, 255, 255, 255, 252,  27,   0,   0,   0, 255, 255, 255,  35,
+    255, 253, 255, 255,   1,   0, 255,   3,   0,   0, 252, 255, 255, 254, 127,   0,
+    127, 251, 255, 255, 255, 255, 127, 180, 191, 253, 255, 255, 255, 127, 251,   1,
+      0,   0,   1,   0, 248, 255, 255, 224, 255, 135, 255, 255, 255, 128, 255, 255,
+     27,   0,   3,   0,   0,   0,   7,   0, 255,   7, 255,  31, 255,   1, 255,  99,
+    224, 227,   7, 248, 231,  15,   0,   0,   0,  60,   0,   0,  28,   0,   0,   0,
+    255, 255, 255, 223, 100, 222, 255, 235, 239, 255, 255, 255, 191, 231, 223, 223,
+    255, 255, 255, 123,  95, 252, 253, 255,  63, 255, 255, 255, 253, 255, 255, 247,
+    247, 207, 255, 255, 255, 255, 127, 248, 255,  31,  32,   0,  16,   0,   0, 248,
+    254, 255,   0,   0, 127, 255, 255, 249, 219,   7,   0,   0, 255,  31, 255,  63,
+    255,  67,   0,   0,  31,   0, 127,   0, 150, 254, 247,  10, 132, 234, 150, 170,
+    150, 247, 247,  94, 255, 251, 255,  15, 238, 251, 255,  15,   3,   0, 255, 255
 };
 
-/* Print: 2792 bytes. */
-
-RE_UINT32 re_get_print(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-
-    f = ch >> 12;
-    code = ch ^ (f << 12);
-    pos = (RE_UINT32)re_print_stage_1[f] << 4;
-    f = code >> 8;
-    code ^= f << 8;
-    pos = (RE_UINT32)re_print_stage_2[pos + f] << 3;
-    f = code >> 5;
-    code ^= f << 5;
-    pos = (RE_UINT32)re_print_stage_3[pos + f] << 5;
-    pos += code;
-    value = (re_print_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1;
-
-    return value;
-}
+RE_UINT32 re_get_xid_continue(RE_UINT32 codepoint) {
+    RE_UINT32 field_2;
+    RE_UINT32 field_1;
+    RE_UINT32 field_0;
+    RE_UINT32 offset;
+    RE_UINT32 v;
 
-/* Word. */
+    field_2 = codepoint >> 10;
+    field_1 = (codepoint >> 5) & 0x1F;
+    field_0 = (codepoint >> 3) & 0x3;
+    offset = codepoint & 0x7;
+
+    v = re_xid_continue_table_1[field_2];
+    v = re_xid_continue_table_2[(v << 5) | field_1];
+    v = re_xid_continue_table_3[(v << 2) | field_0];
+
+    return (v >> offset) & 0x1;
+}
 
-static RE_UINT8 re_word_stage_1[] = {
-     0,  1,  2,  3,  4,  5,  5,  5,  5,  6,  7,  5,  5,  8,  9, 10,
-    11, 12, 13, 14, 15,  9, 16,  5, 17,  9,  9, 18,  9, 19, 20, 21,
-     5,  5,  5,  5,  5,  5,  5,  5,  5,  5, 22, 23, 24,  5, 25, 26,
+/* XID_Start. */
+static RE_UINT8 re_xid_start_table_1[] = {
+     0,  1,  2,  3,  4,  5,  6,  7,  8,  9,  9, 10, 11, 12, 12, 12,
+    12, 12, 12, 13, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+    12, 12, 12, 12, 12, 12, 12, 14, 12, 15, 16, 12, 12, 12, 12, 12,
+    12, 12, 12, 12, 12, 17,  9,  9,  9,  9,  9,  9,  9,  9, 18, 19,
+    20, 21, 22, 23, 24, 25, 26, 27, 28, 29,  9,  9, 12, 30,  9,  9,
+     9, 31,  9,  9,  9,  9,  9,  9,  9,  9, 32, 33, 12, 12, 12, 12,
+    12, 34, 12, 35,  9,  9,  9,  9,  9,  9,  9,  9, 36,  9,  9, 37,
+     9,  9,  9,  9,  9, 38,  9,  9, 39,  9, 40, 41,  9,  9,  9,  9,
+    12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+    12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+    12, 12, 12, 12, 12, 12, 12, 12, 12, 42, 12, 12, 12, 43, 44, 12,
+    12, 12, 12, 45, 12, 12, 12, 12, 12, 12, 46,  9,  9,  9, 47,  9,
+    12, 12, 12, 12, 48,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
@@ -16944,339 +26218,8 @@ static RE_UINT8 re_word_stage_1[] = {
      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
-    27,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
-};
-
-static RE_UINT8 re_word_stage_2[] = {
-      0,   1,   2,   3,   4,   5,   6,   7,   8,   9,  10,  11,  12,  13,  14,  15,
-     16,   1,  17,  18,  19,   1,  20,  21,  22,  23,  24,  25,  26,  27,   1,  28,
-     29,  30,  31,  31,  32,  31,  31,  31,  31,  31,  31,  31,  33,  34,  35,  31,
-     36,  37,  31,  31,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,  38,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,  39,
-      1,   1,   1,   1,  40,   1,  41,  42,  43,  44,  45,  46,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,  47,  31,  31,  31,  31,  31,  31,  31,  31,
-     31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,
-     31,  31,  31,  31,  31,  31,  31,  31,  31,   1,  48,  49,   1,  50,  51,  52,
-     53,  54,  55,  56,  57,  58,   1,  59,  60,  61,  62,  63,  64,  65,  31,  66,
-     67,  68,  69,  70,  71,  72,  73,  74,  75,  76,  77,  31,  78,  79,  80,  31,
-      1,   1,   1,  81,  82,  83,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,
-      1,   1,   1,   1,  84,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,
-     31,  31,  31,  31,   1,   1,  85,  31,  31,  31,  31,  31,  31,  31,  31,  31,
-     31,  31,  31,  31,  31,  31,  31,  31,   1,   1,  86,  87,  31,  31,  88,  89,
-      1,   1,   1,   1,   1,   1,   1,  90,   1,   1,  91,  31,  31,  31,  31,  31,
-      1,  92,  93,  31,  31,  31,  31,  31,  31,  31,  31,  31,  94,  31,  31,  31,
-     31,  95,  96,  31,  97,  98,  99, 100,  31,  31, 101,  31,  31,  31,  31,  31,
-    102, 103, 104,  31,  31,  31,  31,  31, 105, 106,  31,  31,  31,  31, 107,  31,
-     31, 108,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,
-      1,   1,   1,   1,   1,   1, 109,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1, 110, 111,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1, 112,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1, 113,  31,  31,  31,  31,
-     31,  31,  31,  31,  31,  31,  31,  31,   1,   1, 114,  31,  31,  31,  31,  31,
-     31,  39,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,
-};
-
-static RE_UINT8 re_word_stage_3[] = {
-      0,   0,   0,   1,   2,   3,   2,   4,   0,   0,   5,   6,   7,   8,   7,   8,
-      7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
-      7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   9,  10,  11,   0,
-      7,   7,   7,   7,   7,   7,   7,  12,  13,   7,  14,   7,   7,   7,   7,  15,
-      7,   7,   7,   7,   7,   7,   7,   7,  14,   7,   7,   7,   7,   7,   7,   7,
-      7,   7,   7,   2,   7,  16,   7,   7,  17,   2,   7,  18,  19,   7,   3,  20,
-      0,   4,   7,   7,   7,   7,  21,   7,   7,   7,   7,   7,   7,  22,  23,  24,
-      0,   7,   7,   7,  25,   7,   7,   7,   7,   7,   7,  10,   7,   7,   7,  26,
-      7,   7,  27,   0,   7,  28,   4,   0,   0,   0,   7,  29,   0,  30,  14,   7,
-      7,   7,   7,   7,   7,   7,  31,   2,  22,  32,  23,  33,  34,  35,  31,  36,
-     37,  32,  23,  38,  39,  40,  41,  42,  43,  14,  23,  44,  45,  46,  31,  47,
-     48,  32,  23,  44,  49,  50,  31,  51,  52,  53,  54,  21,  55,  56,  41,   0,
-     57,  58,  23,  59,  60,  61,  31,   0,  62,  58,  23,  63,  60,  64,  31,  65,
-     62,  58,   7,   7,  66,  67,  31,  68,  69,  70,   7,  71,  72,  73,  41,  74,
-      2,   7,   7,   4,  75,   1,   0,   0,  76,   7,  77,  27,  78,  79,   0,   0,
-     46,  80,   1,  81,  82,   7,  83,   2,  84,  82,   7,  83,  85,   0,   0,   0,
-      7,   7,   7,   7,   1,   7,   7,   7,   7,  27,   7,   7,  86,   7,   7,  87,
-      7,   7,   7,   7,  88,  89,   7,   7,  88,   7,   7,  90,  91,   8,   7,   7,
-      7,  91,   7,   7,   7,  25,   0,   0,   7,   0,   7,   7,   7,   7,   7,  92,
-      2,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
-      7,   7,   7,   7,   7,   7,  24,   7,   2,   4,   7,   7,   7,   7,  93,  17,
-     57,  94,   7,  94,   7,  95,  57,  96,   7,   7,   7,   7,   7,  97,   1,   0,
-     98,   1,   7,   7,   7,   7,   7,  17,   7,   7,   4,   7,   7,   7,   7,  42,
-      7,  75,  28,  28,  41,   7,  27,  94,   7,   7,  28,   7,   1,   1,   0,   0,
-      7,  28,   7,   7,   7,  75,   7,  24,   1,   1,  99,  75,   0,   0,   0,   0,
-      7,   7,   7,   7,  28,   1, 100,  95,   7,   7,   7,   7,   7,   7,   7,  95,
-      7,   7,   7, 101,  59,   7,   7,  27,  17,   7,   7,  25,   0, 102,   7,   4,
-      7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7, 103,
-      7,  92,   7,   7,  92, 104,   7,  27,   7,   7,   7, 105, 106, 107,  83, 106,
-    108,   0,   0, 109,  46, 110,   0, 111,   0,  83,   0,   0,   0,   7,   7,  46,
-    112, 113, 114,  79, 115,   0,   7,   7,  17,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  41,   7,   7,   1,   0,
-      7,   7,  75,   7,   7,  75,   7,   7,   7,   7,   7,   7,   7,   7, 116,  95,
-      7,   7,  86,   7,   7,   7, 117, 109,   7, 118, 119, 119, 119, 119,   7,   7,
-      0,   0, 109,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-    120,   0,   2, 121,   2,   7,   7,   7,   7, 122,   2,   7,   7,   7,   7,  87,
-    123,   7,   7,   2,   7,   7,   7,   7,  75,   0,   7,   4,   0,   0,   0,   7,
-      7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,  42,   0,   0,   0,   0,
-      7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   0,
-      7,   7,   7,   7,   7,   7,   7,   7,  83,   0,   0,   0,   0,   7,   7,  27,
-     83,   7,  28,   0,   7,   7,   7, 124,   7,   7,   7,   7,   7,   7,   7,  10,
-      0, 125, 126,   7,   7,   7,   7,   7, 127,   7,   7,   7, 128,   0,   0, 125,
-      7,   7, 101,   0,   7,   7,   7,  95,   7,   7,   7,   7,  42,   1,   7, 129,
-      7,   7,  27,   7,   7,  95,   7,  83,   7,   7,   7,   7, 130,   1,   7,  75,
-      7,   7,   7, 118,  27,   1,   7,  70,   7,   7,   7,   7,  20,  98,   7, 128,
-    131, 132, 119,   7,   7,  87, 101,   7,   7,   7,   7,   7,   7,   7, 133,   1,
-      7,   7,   7,   7,   7,   7,   7,   7,   7,   7,  95,   7, 134,   7,   7,  28,
-      7,   7,   7,   7,   7,   7,  27,   7,   7,   7,   7,   7,   7,   1,   0,   0,
-    118, 135,  23, 136, 137,   7,   7,   7,   7,   7,   7,  10,   0,  30,   7,   7,
-      7,   7,   7,  27,   0,   7,   7,   7,   7, 126,   7,   7, 101,   0,   0,  28,
-      7,   0,   7, 138, 139,   0,   0,  84,   7,   7,   7,   7,   7,   7,   7,  83,
-      0,   1,   2,   3,   2,   4,  41,   7,   7,   7,   7,  75, 140, 141,   0,   0,
-    142,   7,   8, 143,  27,  27,   0,   0,   7,   7,   7,   7,   7,   7,   7,   4,
-      0,   0,   0,   0,   7,   7,   7,  94,   0,   0,   0,   0,   0,   0,   0, 144,
-      0,   0,   0,   0,   0,   0,   0,   0,   7,  83,   7,   7,   7,  46,  46,   0,
-      7,   7, 139,   7,   4,   7,   7,   4,   7,  27,   7,   7, 145, 146,   0,   0,
-      7,   7,   7,   7,   7,   7,   7,   7,   7,  27,   1,   7,   7, 145,   7,  28,
-      7,   7, 101,   7,   7,   7,  95,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      7,   7,   7, 118,   7,  42, 101,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-    147,   7,   7, 148,   7,  42,   7, 118,   7,  75,   0,   0,   0,   0,   7, 149,
-      7,  42,   7,   1,   0,   0,   0,   0,   7,   7,   7, 150,   0,   0,   0,   0,
-    151, 152,   7, 153,   0,   0,   7,  83,   7,  83,   0,   0,  82,   7, 118,   0,
-      7,   7,   7,  42,   7,  42,   7,  20,   7,  10,   0,   0,   0,   0,   0,   0,
-      7,   7,   7,   7,  17,   0,   0,   0,   7,   7,   7,  20,   7,   7,   7,  20,
-      7,   7, 101,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      7,  83,  99,   7,   7,  46,   0,   0,   0,   0,   0,   0,   0,   0,   7, 118,
-      7,   7,   7,   7, 118,   0,  41, 109,   7,   7,   7,   4,   0,   7,  17,   1,
-      7,   7,   7,  84, 154,   7,   7, 155,   7,   7,   7,   7, 156, 157,   0,   0,
-      7,  14,   7, 158,   0,   0,   0,   0, 159,  18,  17,   7,   7,   7,   4,   1,
-     22,  32,  23, 160,  49, 161, 162,  94,   0,   0,   0,   0,   0,   0,   0,   0,
-      7,   7,   7,   7,   4,  21,   0,   0,   7,   7,   7,   7, 163,   1,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   7,   7,   7, 164,  46, 165,   0,   0,
-      7,   7,   7,   7, 166,   1,   0,   0,   7,   7,   7,  17,   1,   0,   0,   0,
-      7,  25,  28,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      7,   7,   7,   4,   0,   0,   0,   0,   0,   0,   7,   7,   7,   7,   1, 109,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 167,   7,   7, 167, 168,   0,
-      7,   7,   7,  75,  99,   7,   7,   7,   7, 169,   0,   0,   7,   7,   7,  17,
-     23,   7,   7,   8,  46,   1,   0, 126,   7, 126,  82, 118,   0,   0,   0,   0,
-    170,   7,   7, 171, 101,   1, 172,   7,  75, 173,   1,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   7, 118,
-      7,   7,   7,   7,   7,   7,   7,   7,   7,   1,   0,   0,   0,   0,   0,   0,
-      7,   7,   7,   7,   7,   7,  75,   0,   7,   7,   7,   7,   7,   7,   7,   7,
-      7,   7,   7,   7,  95,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      7,   7,  75,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      7,   7,   7,   7, 118,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      7,   7,   7,  17,   7,  75,   1,   0,   0,   0,   0,   0,   0,   7,  27,  94,
-      7,   7,   7, 118,  95,   1,  30, 174,   7,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   7,   7,   7,   7,   0,   0,   0,   0,   0,   0,   0,   0,
-      7,   7,   7,   7,   3,   7,   7,   7, 117,   7,   0,   0,   0,   0, 175,   0,
-      7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7, 101,
-      7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,  20,
-      7,  75,   0,   0,   0,  20, 176,   7,   7,   7,   7,   7,   7,   7,   7,   7,
-      7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,  28,
-      7,   7,   7,   7,   7,   7,   4,  83,  17, 177,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0, 178, 179, 180,   0, 181,   0,   0,   0,   0,   0,
-      0,   0,   0,   0, 182,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      7,   7,   7,   7,   7,  84,   7,   7,   7,  57, 183, 184, 185,   7,   7,   7,
-    186, 187,   7, 188, 189,  58,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
-      7,   7,   7,   7,   7,   7,   7,   7,   7,   7, 164,   7,  58,  87,   7,  87,
-      7,  84,   7,  84,  75,   7,  75,   7,  23,   7,  23,   7, 190,   7,   7,   7,
-      7,   7,   7, 134,   7,   7,  83, 191, 110, 100,   2,   0,   0,   0,   0,   0,
-      8, 127, 192,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      7,   7,  83,  27, 193,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   7,   7,   7,   1,
-      7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,  94, 118,   0,   0,
-      7,   7,   7,   7,  28,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-    185,   7, 194, 195, 196, 197, 198, 199, 103,  28, 200,  28,   0,   0,   0,   0,
-      0,   0,   0,   7,   1,   7,   1,   7,   1,   0,   0,   0,   0,   0,   0,   0,
-      7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7, 118,   0,   0,
-      7,   7,   7,  94,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
-      7,  27,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
-      7,   7,   7,   7,   7,   7,   7,   7,   7,   7,  10,   7,   7,   7,   7,   7,
-      7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,  46,   0,
-      7,  27,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-};
-
-static RE_UINT8 re_word_stage_4[] = {
-      0,   0, 255,   3, 254, 255, 255, 135, 255,   7,   0,   4,  32,   4, 255, 255,
-    127, 255, 195, 255,   3,   0,  31,  80, 223, 188,  64, 215, 251, 255, 191, 255,
-    127,   2, 255,   1, 255, 191, 182,   0,   7,   0, 255, 195, 239, 159, 255, 253,
-    255, 159, 255, 231,  63,  36, 255,  63, 255,  15, 223,  63, 248, 255, 207, 255,
-    249, 255, 197, 243, 159, 121, 128, 176,   3,  80, 238, 135, 109, 211, 135,  57,
-      2,  94, 192, 255,  63,   0, 238, 191, 237, 243, 191,  59,   1,   0,   0, 254,
-    238, 159, 159,  57, 192, 176,   2,   0, 236, 199,  61, 214,  24, 199, 199,  61,
-    129,   0, 255, 223, 253, 255, 255, 227, 223,  61,  96,   7, 239, 223, 239, 243,
-     96,  64,   6,   0, 223, 125, 240, 128,   0, 252, 236, 255, 127, 252, 251,  47,
-    127, 132,  95, 255,  12,   0, 255, 127, 214, 247, 175, 255,  95,  63, 255, 243,
-      0,   3, 160, 194, 255, 254, 255,  31, 223, 255,  64,   0, 191,  32, 255, 247,
-    255,  61, 127,  61,  61, 127,  61, 255,  63,  63, 255, 199,  31,   0,  15,   0,
-     13,   0, 143,  48,   0,  56, 128,   0,   0, 248, 255,   0, 247, 255, 255, 251,
-    255, 170, 223,  95, 220,  31, 207,  15,   0,  48,   0, 128,  16,   0,   2, 128,
-    132, 252,  47,  62,  80, 189, 224,  67,  31, 248, 255, 128, 127,   0, 127, 127,
-    224,   0,  62,  31, 127, 230, 224, 255, 247, 191, 128, 255, 252, 255, 255, 249,
-    124,   0, 255, 232,   1, 128, 126, 126, 126,   0, 255,  55, 127, 248, 248, 224,
-    127,  95, 219, 255,  24,   0,   0, 224, 252, 252, 252,  28, 255, 239, 255, 183,
-      0,  32,  15, 255,  62,   0,  63, 253, 191, 145,  55,   0, 255, 192, 111, 240,
-    239, 254,  63, 135, 112,   0,  79,   0,  31,  30, 255,  23, 255,  64, 127, 189,
-    237, 251, 129, 224, 207,  31, 191,   0,  63, 255,   0,  63,  17,   0, 255, 252,
-     27,   0, 255,  35, 127, 251, 127, 180, 191, 253, 251,   1, 255, 224,  11,   0,
-    240,   0, 255,  99, 224, 227,   7, 248, 231,  15,   0,  60,  28,   0, 100, 222,
-    255, 235, 239, 255, 191, 231, 223, 223, 255, 123,  95, 252, 247, 207,  32,   0,
-    219,   7, 255,  67, 150, 254, 247,  10, 132, 234, 150, 170, 150, 247, 247,  94,
-    238, 251,
-};
-
-/* Word: 2962 bytes. */
-
-RE_UINT32 re_get_word(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-
-    f = ch >> 12;
-    code = ch ^ (f << 12);
-    pos = (RE_UINT32)re_word_stage_1[f] << 4;
-    f = code >> 8;
-    code ^= f << 8;
-    pos = (RE_UINT32)re_word_stage_2[pos + f] << 4;
-    f = code >> 4;
-    code ^= f << 4;
-    pos = (RE_UINT32)re_word_stage_3[pos + f] << 4;
-    pos += code;
-    value = (re_word_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1;
-
-    return value;
-}
-
-/* XDigit. */
-
-static RE_UINT8 re_xdigit_stage_1[] = {
-    0, 1, 1, 1, 1, 2, 1, 3, 4, 1, 1, 5, 1, 1, 6, 7,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1,
-};
-
-static RE_UINT8 re_xdigit_stage_2[] = {
-     0,  1,  1,  2,  3,  4,  4,  5,  6,  1,  1,  7,  8,  9, 10,  1,
-     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
-     1,  1,  1, 11, 12, 13,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
-     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1, 14,
-     1,  1, 15,  1,  1,  1, 16,  1, 17, 18, 19, 20, 21,  1, 22,  1,
-     1,  1,  1,  1,  1, 23,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
-     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1, 24,  1,  1,  1,  1,
-    25, 18,  1,  1, 26,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
-};
-
-static RE_UINT8 re_xdigit_stage_3[] = {
-     0,  1,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
-     2,  3,  2,  0,  2,  2,  2,  4,  2,  2,  2,  2,  2,  5,  2,  5,
-     2,  5,  2,  5,  2,  5,  2,  5,  2,  6,  2,  6,  3,  2,  2,  2,
-     2,  4,  6,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  3,
-     6,  2,  2,  2,  2,  7,  2,  6,  2,  2,  8,  2,  2,  6,  0,  2,
-     2,  8,  2,  2,  2,  2,  2,  2,  3,  2,  2,  2,  2,  2,  2,  2,
-     2,  2,  2,  6,  4,  2,  2,  9,  2,  6,  2,  2,  2,  2,  2,  0,
-     2,  2,  2,  2, 10, 11,  2,  2,  2,  2,  3,  2,  2,  2,  2,  2,
-     2,  2,  2,  2,  0,  2,  2,  2,  2,  5,  2,  0, 12,  2,  2,  6,
-     2,  2,  2,  0,  2,  2,  2,  2,  2,  6,  2,  6,  2,  2,  2,  2,
-     2,  6,  2,  4,  0,  2,  2,  2,  2,  2,  2,  3,  2,  2,  2,  2,
-     2,  6,  2,  2,  2,  6,  3,  2,  2,  3,  2,  2,  2,  6,  2,  2,
-     2,  2,  2,  2,  2,  2,  2, 13,  2,  2,  2,  2,  2,  4,  2,  2,
-     2,  2,  2,  2,  2,  6,  2,  2,
-};
-
-static RE_UINT8 re_xdigit_stage_4[] = {
-      0,   0,   0,   0,   0,   0, 255,   3, 126,   0,   0,   0, 126,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 255,   3,   0,   0,
-    255,   3,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 192, 255,   0,   0,
-      0,   0, 255,   3,   0,   0,   0,   0, 192, 255,   0,   0,   0,   0,   0,   0,
-    255,   3, 255,   3,   0,   0,   0,   0,   0,   0, 255,   3,   0,   0, 255,   3,
-      0,   0, 255,   3, 126,   0,   0,   0, 126,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0, 192, 255,   0, 192, 255, 255, 255, 255, 255, 255,
-};
-
-/* XDigit: 592 bytes. */
-
-RE_UINT32 re_get_xdigit(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-
-    f = ch >> 13;
-    code = ch ^ (f << 13);
-    pos = (RE_UINT32)re_xdigit_stage_1[f] << 4;
-    f = code >> 9;
-    code ^= f << 9;
-    pos = (RE_UINT32)re_xdigit_stage_2[pos + f] << 3;
-    f = code >> 6;
-    code ^= f << 6;
-    pos = (RE_UINT32)re_xdigit_stage_3[pos + f] << 6;
-    pos += code;
-    value = (re_xdigit_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1;
-
-    return value;
-}
-
-/* Posix_Digit. */
-
-static RE_UINT8 re_posix_digit_stage_1[] = {
-    0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1,
-};
-
-static RE_UINT8 re_posix_digit_stage_2[] = {
-    0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-};
-
-static RE_UINT8 re_posix_digit_stage_3[] = {
-    0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-};
-
-static RE_UINT8 re_posix_digit_stage_4[] = {
-      0,   0,   0,   0,   0,   0, 255,   3,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-};
-
-/* Posix_Digit: 130 bytes. */
-
-RE_UINT32 re_get_posix_digit(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-
-    f = ch >> 15;
-    code = ch ^ (f << 15);
-    pos = (RE_UINT32)re_posix_digit_stage_1[f] << 4;
-    f = code >> 11;
-    code ^= f << 11;
-    pos = (RE_UINT32)re_posix_digit_stage_2[pos + f] << 4;
-    f = code >> 7;
-    code ^= f << 7;
-    pos = (RE_UINT32)re_posix_digit_stage_3[pos + f] << 7;
-    pos += code;
-    value = (re_posix_digit_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1;
-
-    return value;
-}
-
-/* Posix_AlNum. */
-
-static RE_UINT8 re_posix_alnum_stage_1[] = {
-     0,  1,  2,  3,  4,  5,  5,  5,  5,  6,  7,  5,  5,  8,  9, 10,
-    11, 12, 13, 14, 15,  9, 16,  5, 17,  9,  9, 18,  9, 19, 20, 21,
-     5,  5,  5,  5,  5,  5,  5,  5,  5,  5, 22, 23, 24,  5, 25, 26,
      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
@@ -17291,1529 +26234,1580 @@ static RE_UINT8 re_posix_alnum_stage_1[] = {
      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9
 };
 
-static RE_UINT8 re_posix_alnum_stage_2[] = {
-      0,   1,   2,   3,   4,   5,   6,   7,   8,   9,  10,  11,  12,  13,  14,  15,
-     16,   1,  17,  18,  19,   1,  20,  21,  22,  23,  24,  25,  26,  27,   1,  28,
-     29,  30,  31,  31,  32,  31,  31,  31,  31,  31,  31,  31,  33,  34,  35,  31,
-     36,  37,  31,  31,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,  38,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,  39,
-      1,   1,   1,   1,  40,   1,  41,  42,  43,  44,  45,  46,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,  47,  31,  31,  31,  31,  31,  31,  31,  31,
-     31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,
-     31,  31,  31,  31,  31,  31,  31,  31,  31,   1,  48,  49,   1,  50,  51,  52,
-     53,  54,  55,  56,  57,  58,   1,  59,  60,  61,  62,  63,  64,  65,  31,  66,
-     67,  68,  69,  70,  71,  72,  73,  74,  75,  76,  77,  31,  78,  79,  80,  31,
-      1,   1,   1,  81,  82,  83,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,
-      1,   1,   1,   1,  84,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,
-     31,  31,  31,  31,   1,   1,  85,  31,  31,  31,  31,  31,  31,  31,  31,  31,
-     31,  31,  31,  31,  31,  31,  31,  31,   1,   1,  86,  87,  31,  31,  88,  89,
-      1,   1,   1,   1,   1,   1,   1,  90,   1,   1,  91,  31,  31,  31,  31,  31,
-      1,  92,  93,  31,  31,  31,  31,  31,  31,  31,  31,  31,  94,  31,  31,  31,
-     31,  31,  31,  31,  95,  96,  97,  98,  31,  31,  31,  31,  31,  31,  31,  31,
-     99, 100, 101,  31,  31,  31,  31,  31, 102, 103,  31,  31,  31,  31, 104,  31,
-     31, 105,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,
-      1,   1,   1,   1,   1,   1, 106,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1, 107, 108,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1, 109,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1, 110,  31,  31,  31,  31,
-     31,  31,  31,  31,  31,  31,  31,  31,   1,   1, 111,  31,  31,  31,  31,  31,
-};
-
-static RE_UINT8 re_posix_alnum_stage_3[] = {
-      0,   1,   2,   2,   0,   3,   4,   4,   5,   5,   5,   5,   5,   5,   5,   5,
-      5,   5,   5,   5,   5,   5,   6,   7,   0,   0,   8,   9,  10,  11,   5,  12,
-      5,   5,   5,   5,  13,   5,   5,   5,   5,  14,  15,   5,  16,  17,  18,  19,
-     20,   5,  21,  22,   5,   5,  23,  24,  25,   5,  26,   5,   5,  27,  28,  29,
-     30,  31,  32,  33,   0,  34,  35,  36,   5,  37,  38,  39,  40,  41,  42,  43,
-     44,  45,  46,  47,  48,  49,  50,  51,  52,  49,  53,  54,  55,  56,  57,   0,
-     58,  59,  60,  61,  58,  62,  63,  64,  58,  65,  66,  67,  68,  69,  70,  71,
-     72,  73,  74,   0,  75,  76,  77,   0,  78,   0,  79,  80,  81,  82,   0,   0,
-      5,  83,  25,   5,  84,   5,  85,  86,   5,   5,  87,   5,  88,  89,  90,   5,
-     91,   5,  73,   0,  92,   5,   5,  93,  72,   5,   5,   5,   5,   5,   5,   5,
-      5,   5,   5,  94,   2,   5,   5,  95,  96,  97,  97,  98,   5,  99, 100,   0,
-      0,   5,   5,  32,   5, 101,   5, 102, 103, 104,  25, 105,   5, 106, 107,   0,
-    108,   5, 103, 109,   0, 110,   0,   0,   5, 111, 112,   0,   5, 113,   5, 114,
-      5, 115, 116, 117, 118,  65,   0, 119,   5,   5,   5,   5,   5,   5,   0, 120,
-     93,   5, 121, 117,   5, 122, 123, 124,   0,   0,   0, 125, 126,   0,   0,   0,
-    127, 128, 129,   5,  16,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0, 130,   5, 107,   5, 131, 103,   5,   5,   5,   5, 132,
-      5,  85,   5, 133, 115, 134, 134,   5,   0, 135,   0,   0,   0,   0,   0,   0,
-    136, 137,  72,   5, 138,  72,   5,  86, 139,  14,   5,   5, 140,  73,   0,  25,
-      5,   5,   5,   5,   5, 102,   0,   0,   5,   5,   5,   5,   5,   5,   5,  92,
-      5,   5,   5,   5,  31,   0,  25, 117, 141, 142,   5, 143,   5,   5,   5,  92,
-    144, 145,   5,   5, 146,   5, 147, 144, 148, 149,   5,  97,   5,   5, 150, 151,
-     28, 101, 152,  82,   5, 153, 135, 154,   5, 115, 155, 156,   5, 103, 157, 158,
-    159, 160,  86, 161,   5,   5,   5,  33,   5,   5,   5,   5,   5, 162, 163, 108,
-      5,   5,   5, 164,   5,   5, 165,   0, 166, 167, 168,   5,   5,  27, 169,   5,
-      5, 117,  25,   5, 170,   5, 149, 171,   0,   0,   0, 172,   5,   5,   5,  82,
-      0,   2,   2, 173,   5, 103, 174,   0, 175, 176, 177,   0,   5,   5,   5,  73,
-      0,   0,   5, 178,   0,   0,   0,   0,   0,   0,   0,   0,  82,   5, 179,   0,
-      5,  26, 101,  73, 117,   5, 180,   0,   5,   5,   5,   5, 117,  25, 181, 108,
-      5, 161,   5,  61,   0,   0,   0,   0,   5, 115, 102, 149,   0,   0,   0,   0,
-    182, 183, 102, 115, 103,   0,   0, 184, 102, 165,   0,   0,   5, 185,   0,   0,
-    186, 102,   0,  82,  82,   0,  79, 187,   5, 102, 102, 152,  27,   0,   0,   0,
-      5,   5,  16,   0,   5, 152,   5, 152,   5, 149,   0,   0,   0,   0,   0,   0,
-     82, 188, 189,   0,   0,   0,   0, 115,   5,   5, 189,   0, 145,  32,  25,  16,
-      5, 152, 190, 191,   5,   5, 192,   0, 193, 194,   0,   0, 195, 118,   5,  16,
-     40,  49, 196,  61,   0,   0,   0,   0,   5,   5, 197,   0,   5,   5, 198,   0,
-      0,   0,   0,   0,   5, 199, 200,   0,   5, 103, 201,   0,   5, 202,   0,   0,
-     65,  33,   0,   0,   0,   0,   0,   0,   5,  32,   0,   0,   0,   5,   5, 203,
-      0,   0,   0,   0,   0, 204,  30, 205,   5, 206,  25,   5, 207,   0,   5,  32,
-    208, 209,  78, 210, 170, 211,   0,   0, 212, 213, 214, 215, 216,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0, 115,   5,   5,   5,   5, 165,   0,   0,   0,
-      5,   5,   5, 140,   5,   5,   5,   5,   5,   5,  61,   0,   0,   0,   0,   0,
-      5, 140,   0,   0,   0,   0,   0,   0,   5,   5, 217,   0,   0,   0,   0,   0,
-      5,  32, 103,   0,   0,   0,  25, 155,   5,  92,  61, 218,  92,   0,   0,   0,
-      0,   0,   5,   5,   0,   0,   0,   0,   5,   5, 219,   5, 220,   0,   0, 221,
-      5,   5,   5,   5,   5,   5,   5, 222,   5,   5,   5,   5,   5,   5,   5, 152,
-    103,   0, 223, 224,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5, 108,
-      5,   5,   5, 225, 226,   0,   0,   0,   5,   5, 227,   5, 228, 229, 230,   5,
-    231, 232, 233,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5, 234, 235,  86,
-    227, 227, 131, 131, 208, 208, 236,   0, 237, 238,   0,   0,   0,   0,   0,   0,
-      5, 239, 240,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   5, 241,
-      5,   5,   5,   5,   5,   5, 187,   0,   5,   5, 242,   0,   0,   0,   0,   0,
-    230, 243, 244, 245, 246, 247,   0,   0,   0,  25, 248, 248, 107,   0,   0,   0,
-      5,   5,   5,   5,   5,   5, 115,   0,   5, 178,   5,   5,   5,   5,   5,   5,
-    117,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5, 249,   5,   5,
-      5,   5,   5,   5,   5,   5,   5,  78, 117,   0,   0,   0,   0,   0,   0,   0,
-};
-
-static RE_UINT8 re_posix_alnum_stage_4[] = {
-      0,   0,   0,   0,   0,   0, 255,   3, 254, 255, 255,   7,   0,   4,  32,   4,
-    255, 255, 127, 255, 255, 255, 255, 255, 195, 255,   3,   0,  31,  80,   0,   0,
-     32,   0,   0,   0,   0,   0, 223, 188,  64, 215, 255, 255, 251, 255, 255, 255,
-    255, 255, 191, 255,   3, 252, 255, 255, 255, 255, 254, 255, 255, 255, 127,   2,
-    255,   1,   0,   0,   0,   0, 255, 191, 182,   0, 255, 255, 255, 135,   7,   0,
-      0,   0, 255,   7, 255, 255, 255, 254,   0, 192, 255, 255, 255, 255, 239,  31,
-    254, 225,   0, 156,   0,   0, 255, 255,   0, 224, 255, 255, 255, 255,   3,   0,
-      0, 252, 255, 255, 255,   7,  48,   4, 255, 255, 255, 252, 255,  31,   0,   0,
-    255, 255, 255,   1, 255,   7,   0,   0, 255, 255, 223,  63,   0,   0, 240, 255,
-    248,   3, 255, 255, 255, 255, 255, 239, 255, 223, 225, 255,  15,   0, 254, 255,
-    239, 159, 249, 255, 255, 253, 197, 227, 159,  89, 128, 176,  15,   0,   3,  16,
-    238, 135, 249, 255, 255, 253, 109, 195, 135,  25,   2,  94,   0,   0,  63,   0,
-    238, 191, 251, 255, 255, 253, 237, 227, 191,  27,   1,   0,  15,   0,   0,  30,
-    238, 159, 249, 255, 159,  25, 192, 176,  15,   0,   2,   0, 236, 199,  61, 214,
-     24, 199, 255, 195, 199,  29, 129,   0, 239, 223, 253, 255, 255, 253, 255, 227,
-    223,  29,  96,   7,  15,   0,   0,   0, 255, 253, 239, 227, 223,  29,  96,  64,
-     15,   0,   6,   0, 255, 255, 255, 231, 223,  93, 240, 128,  15,   0,   0, 252,
-    236, 255, 127, 252, 255, 255, 251,  47, 127, 128,  95, 255,   0,   0,  12,   0,
-    254, 255, 255, 255, 255, 255, 255,   7, 127,  32,   0,   0, 214, 247, 255, 255,
-    175, 255, 255,  59,  95,  32,   0, 240,   1,   0,   0,   0, 255, 254, 255, 255,
-    255,  31, 254, 255,   3, 255, 255, 254, 255, 255, 255,  31, 255, 255, 127, 249,
-    255, 255,   0,  60, 191,  32, 255, 255, 255, 255, 255, 247, 255,  61, 127,  61,
-    255,  61, 255, 255, 255, 255,  61, 127,  61, 255, 127, 255, 255, 255,  61, 255,
-    255, 255,   0,   0, 255, 255,  63,  63, 255, 159, 255, 255, 255, 199, 255,   1,
-    255, 223,  15,   0, 255, 255,  15,   0, 255, 223,  13,   0, 255, 255, 207, 255,
-    255,   1, 128,  16, 255,   7, 255, 255, 255, 255,  63,   0, 255, 255, 255, 127,
-    255,  15, 255,   1, 255,  63,  31,   0, 255,  15, 255, 255, 255,   3,   0,   0,
-    255, 255, 255,  15, 254, 255,  31,   0, 128,   0,   0,   0, 255, 255, 239, 255,
-    239,  15,   0,   0, 255, 243,   0, 252, 191, 255,   3,   0, 255, 255, 127,   0,
-      0, 224,   0, 252, 255, 255, 255,  63, 255,   1, 255, 255,   0, 222, 111,   4,
-    128, 255,  31,   0,  63,  63, 255, 170, 255, 255, 223,  95, 220,  31, 207,  15,
-    255,  31, 220,  31,   0,   0,   2, 128,   0,   0, 255,  31, 132, 252,  47,  62,
-     80, 189, 255, 243, 224,  67,   0,   0,   0,   0, 192, 255, 255, 127, 255, 255,
-     31, 120,  12,   0, 255, 128,   0,   0, 127, 127, 127, 127,   0, 128,   0,   0,
-    224,   0,   0,   0, 254,   3,  62,  31, 255, 255, 127, 224, 224, 255, 255, 255,
-    255, 127,   0,   0, 255,  31, 255, 255,   0,  12,   0,   0, 255, 127, 240, 143,
-      0,   0, 128, 255, 252, 255, 255, 255, 255, 249, 255, 255, 124,   0,   0,   0,
-    191, 255, 255, 255, 255,   0,   0,   0,  47,   0,   0,   0,   0,   0, 252, 232,
-    255, 255,   7,   0, 255, 255, 247, 255, 255, 255,   0, 124, 255,  63,   0,   0,
-    255, 255, 127, 252,   5,   0,   0,  56, 255, 255,  60,   0, 126, 126, 126,   0,
-    127, 127, 255, 255, 255,   0, 255, 255,  15,   0, 255, 255, 127, 248, 255, 255,
-    255,  63, 255, 255, 255, 255, 255,   3, 127,   0, 248, 224, 255, 253, 127,  95,
-    219, 255, 255, 255,   0,   0, 248, 255, 255, 255, 252, 255,   0,   0, 255,  15,
-      0,   0, 223, 255, 192, 255, 255, 255, 252, 252, 252,  28, 255, 239, 255, 255,
-    127, 255, 255, 183, 255,  63, 255,  63, 255, 255,  31,   0, 255, 255,   1,   0,
-     15, 255,  62,   0, 255, 255,  15, 255,  63, 253, 255, 255, 255, 255, 191, 145,
-    255, 255,  55,   0, 255, 255, 255, 192, 111, 240, 239, 254,  31,   0,   0,   0,
-    128,   0, 255, 255,  63,   0,   0,   0, 112,   0, 255, 255, 255, 255,  71,   0,
-     30,   0,   0,  20, 255, 255, 251, 255, 255, 255, 159,  64, 127, 189, 255, 191,
-    159,  25, 129, 224, 187,   7,   0, 128, 179,   0,   0,   0, 255, 255,  63, 127,
-      0,   0,   0,  63,  17,   0,   0,   0, 255, 255,  63,   1,   0,   0,   0, 128,
-    255, 252, 255, 255,  26,   0,   0,   0, 255, 255, 231, 127, 255, 255, 255,  32,
-    255, 253, 255, 255, 255, 255, 127, 127,   0,   0, 252, 255, 255, 254, 127,   0,
-    127, 251, 255, 255, 255, 255, 127, 180, 203,   0,   0,   0, 191, 253, 255, 255,
-    255, 127, 123,   1, 127,   0,   0,   0, 248, 255, 255, 224, 255, 135, 255, 255,
-    255, 128, 255, 255,  11,   0,   0,   0, 255, 255, 255,   0,   0,   0,   7,   0,
-    240,   0, 255, 255, 255,   7, 255,  31, 255,   1, 255,  67, 255, 255, 223, 255,
-    255, 255, 255, 223, 100, 222, 255, 235, 239, 255, 255, 255, 191, 231, 223, 223,
-    255, 255, 255, 123,  95, 252, 253, 255,  63, 255, 255, 255, 253, 255, 255, 247,
-    247,  15,   0,   0, 127, 255, 255, 249, 219,   7,   0,   0, 255,  31, 128,  63,
-      0,  64,   0,   0, 255,  15,   0,   0, 143,   8,   0,   0, 150, 254, 247,  10,
-    132, 234, 150, 170, 150, 247, 247,  94, 255, 251, 255,  15, 238, 251, 255,  15,
-    255,   3, 255, 255,   3,   0, 255, 255,
-};
-
-/* Posix_AlNum: 2600 bytes. */
-
-RE_UINT32 re_get_posix_alnum(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-
-    f = ch >> 12;
-    code = ch ^ (f << 12);
-    pos = (RE_UINT32)re_posix_alnum_stage_1[f] << 4;
-    f = code >> 8;
-    code ^= f << 8;
-    pos = (RE_UINT32)re_posix_alnum_stage_2[pos + f] << 3;
-    f = code >> 5;
-    code ^= f << 5;
-    pos = (RE_UINT32)re_posix_alnum_stage_3[pos + f] << 5;
-    pos += code;
-    value = (re_posix_alnum_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1;
-
-    return value;
-}
-
-/* Posix_Punct. */
-
-static RE_UINT8 re_posix_punct_stage_1[] = {
-     0,  1,  2,  3,  3,  4,  3,  5,  6,  7,  3,  8,  3,  9, 10, 11,
-     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
-     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
-     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
-     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
-     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
-     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
-     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
-     3,  3,  3,  3,  3,  3,  3,  3,
-};
-
-static RE_UINT8 re_posix_punct_stage_2[] = {
-     0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15,
-    16,  1,  1, 17, 18,  1, 19, 20, 21, 22, 23, 24, 25,  1,  1, 26,
-    27, 28, 29, 29, 30, 29, 29, 31, 29, 29, 29, 32, 33, 34, 35, 36,
-    37, 38, 39, 29,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
-     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1, 40,  1,  1,
-     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
-     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
-     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
-     1,  1,  1,  1, 41,  1, 42, 43, 44, 45, 46, 47,  1,  1,  1,  1,
-     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
-     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
-     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1, 48,  1, 49, 50, 51,
-     1, 52,  1, 53,  1, 54,  1,  1, 55, 56, 57, 58,  1,  1,  1, 59,
-    60, 61, 62,  1, 63, 64, 65, 66, 67, 68, 69,  1, 70,  1, 71, 72,
-     1,  1,  1,  1, 73,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
-     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
-     1,  1,  1,  1,  1,  1,  1,  1,  1,  1, 74, 75,  1,  1, 76, 68,
-     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
-     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
-     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1, 77,  1,  1,  1,
-     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
-    78, 79, 80, 81,  1,  1, 82, 83, 29, 29, 84,  1,  1,  1,  1,  1,
-     1, 85, 86,  1,  1,  1,  1,  1,  1, 87,  1,  1, 88, 89, 90,  1,
-    91, 92, 93, 29, 29, 29, 94, 95, 96, 97, 98,  1,  1,  1,  1,  1,
-};
-
-static RE_UINT8 re_posix_punct_stage_3[] = {
-      0,   1,   2,   3,   0,   4,   5,   5,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   6,   7,   0,   0,   0,   8,   9,   0,   0,  10,
-      0,   0,   0,   0,  11,   0,   0,   0,   0,   0,  12,   0,  13,  14,  15,  16,
-     17,   0,   0,  18,   0,   0,  19,  20,  21,   0,   0,   0,   0,   0,   0,  22,
-      0,  23,  14,   0,   0,   0,   0,   0,   0,   0,   0,  24,   0,   0,   0,  25,
-      0,   0,   0,  10,   0,   0,   0,  26,   0,   0,   0,  27,   0,   0,   0,  28,
-      0,   0,   0,  29,  30,   0,   0,   0,   0,   0,  31,  32,   0,   0,   0,  33,
-      0,  34,  35,   0,   0,   0,   0,   0,  36,  37,   0,   0,  38,  39,  40,   0,
-      0,   0,  41,   0,  39,   0,   0,  42,   0,   0,   0,  43,  44,   0,   0,   0,
-     45,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  46,  47,   0,   0,  48,
-      0,  49,   0,   0,   0,   0,  50,   0,  51,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,  52,   0,   0,   0,  39,  53,  39,   0,   0,   0,   0,  54,   0,   0,
-      0,   0,  12,  55,   0,   0,   0,  56,   0,  57,   0,  39,   0,   0,  58,   0,
-      0,   0,   0,   0,   0,  59,  60,  61,  62,  63,  64,  65,  66,  53,   0,   0,
-     67,  68,  69,   0,  70,  53,  53,  53,  53,  53,  53,  53,  53,  53,  53,  53,
-     53,  71,  51,   0,  56,  72,   0,   0,  53,  53,  53,  72,  73,  53,  53,  53,
-     53,  53,  53,  74,  75,  53,  53,  53,   0,   0,   0,   0,   0,   0,   0,  76,
-      0,   0,   0,  27,   0,   0,   0,   0,  53,  77,  78,   0,  79,  53,  53,  80,
-     53,  53,  53,  53,  53,  53,  72,  81,  82,  83,   0,   0,  47,  45,   0,  42,
-      0,   0,   0,   0,  84,   0,  53,  85,  64,  86,  87,  53,  86,  88,  53,  53,
-      0,   0,   0,   0,   0,   0,  53,  53,   0,   0,   0,   0,  62,  53,  71,  39,
-     89,   0,   0,  90,   0,   0,   0,  91,  92,  93,   0,   0,  94,   0,   0,   0,
-      0,  95,   0,  96,   0,   0,  97,  98,   0,  97,  34,   0,   0,   0,  99,   0,
-      0,   0,  56, 100,   0,   0,  39,  26,   0,   0,  42,   0,   0,   0,   0, 101,
-      0, 102,   0,   0,   0, 103,  93,   0,   0,  39,   0,   0,   0,   0,   0, 104,
-     44,  62, 105, 106,   0,   0,   0,   0,   1,   2,   2, 107,   0,   0,   0, 108,
-    109, 110,   0, 111, 112,  45,  62, 113,   0,   0,   0,   0,  34,   0,  27,   0,
-      0,   0,   0,  31,   0,   0,   0,   0,   0,   0,   5, 114,   0,   0,   0,   0,
-     34,  34,   0,   0,   0,   0,   0,   0,   0,   0, 115,  34,   0,   0, 116, 117,
-      0, 111,   0,   0, 118,   0,   0,   0,   0,   0, 119,   0,   0,   0,   0,   0,
-      0,   0, 120,   0,   0, 121,  93,   0,   0,   0,  85, 122,   0,   0, 123,   0,
-      0, 124,   0,   0,   0, 102,   0,   0,   0,   0, 125,   0,   0,   0, 126,   0,
-      0,   0,   0,   0,   0,   0, 127,   0,   0,   0, 128, 129,   0,   0,   0,   0,
-      0,  56,   0,   0,   0,   0,   0,   0,   0,  42,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,  11,   0,  34,  71,   0, 130, 109,   0,   0,
-      0,   0, 131,  26,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 114,
-      0,   0,   0,   0,   0,   0, 132, 133,   0,   0,   0, 134,   0,   0,   0,   0,
-      0,   0,   0,  97,   0,   0,   0, 135,   0, 110, 136,   0,   0,   0,   0,   0,
-      0,   0,   0,   0, 137,   0,   0,   0,   0,   0,   0,   0, 138,   0,   0,   0,
-     53,  53,  53,  53,  53,  53,  53,  72,  53, 139,  53, 140, 141, 142,  53,  43,
-     53,  53, 143,   0,   0,   0,   0,   0,  53,  53,  92,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0, 144,  42, 135, 135,  31,  31, 102, 102, 145,   0,
-      0, 137,   0, 146, 147,   0,   0,   0,   0,   0,  31,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,  34,   0,   0,  39,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0, 148,   0,   0,   0, 149,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,  26,  53, 150,  53,  53,  80, 151, 152,  72,
-     62,  78,  41, 153,  86, 129,   0, 154, 155, 156, 157, 107,   0,   0,   0,   0,
-     53,  53,  53,  53,  53,  53,  72, 158,  53,  53,  53,  80,  53,  53, 159, 160,
-    150,  53, 161,  53,  63,  21,   0,   0, 162,  53,  53, 163,  53, 164, 165,  53,
-     53,  53,  80, 166, 167,   0,   0,   0,
-};
-
-static RE_UINT8 re_posix_punct_stage_4[] = {
-      0,   0,   0,   0, 254, 255,   0, 252,   1,   0,   0, 248,   1,   0,   0, 120,
-    254, 219, 211, 137,   0,   0, 128,   0,  60,   0, 252, 255, 224, 175, 255, 255,
-      0,   0,  32,  64, 176,   0,   0,   0,   0,   0,  64,   0,   4,   0,   0,   0,
-      0,   0,   0, 252,   0, 230,   0,   0,   0,   0,   0,  64,  73,   0,   0,   0,
-      0,   0,  24,   0, 192, 255,   0, 200,   0,  60,   0,   0,   0,   0,  16,  64,
-      0,   2,   0,  96, 255,  63,   0,   0,   0,   0, 192, 195,   0,   0, 255, 127,
-     48,   0,   1,   0,   0,   0,  12,  44,   0,   0,   3,   0,   0,   0,   1,   0,
-      0,   0, 248,   7,   0,   0, 128, 128,  16,   0,   0,   0,   0, 128,   0,   0,
-      0,   0,   0,   2,   0,   0,  16,   0,   0,   0,   0, 128,   0, 128,   0,  12,
-    254, 255, 255, 252,   0,   0,  80,  61,  32,   0,   0,   0,   0,   0,   0, 192,
-    191, 223, 255,   7,   0, 252,   0,   0,   0,   0,   0,   8, 255,   1,   0,   0,
-      0,   0, 255,   3,   1,   0,   0,   0,   0,  96,   0,   0,   0,   0,   0,  24,
-      0,  56,   0,   0,   0,   0,  96,   0,   0,   0, 112,  15, 255,   7,   0,   0,
-     49,   0,   0,   0, 255, 255, 255, 255, 127,  63,   0,   0, 255,   7, 240,  31,
-      0,   0,   0, 240,   0,   0,   0, 248, 255,   0,   8,   0,   0,   0,   0, 160,
-      3, 224,   0, 224,   0, 224,   0,  96,   0,   0, 255, 255, 255,   0, 255, 255,
-    255, 255, 255, 127,   0,   0,   0, 124,   0, 124,   0,   0, 123,   3, 208, 193,
-    175,  66,   0,  12,  31, 188,   0,   0,   0,  12, 255, 255, 127,   0,   0,   0,
-    255, 255,  63,   0,   0,   0, 240, 255, 255, 255, 207, 255, 255, 255,  63, 255,
-    224,   7,   0, 222, 255, 127, 255, 255, 255, 255,   0,   0, 255, 255, 255, 251,
-    255, 255,  15,   0,   0,   0, 255,  15,  30, 255, 255, 255,   1,   0, 193, 224,
-      0,   0, 195, 255,  15,   0,   0,   0,   0, 252, 255, 255, 255,   0,   1,   0,
-    255, 255,   1,   0,   0, 224,   0,   0,   0,   0,   8,  64,   0,   0, 252,   0,
-    255, 255, 127,   0,   3,   0,   0,   0,   0,   6,   0,   0,   0,  15, 192,   3,
-      0,   0, 240,   0,   0, 192,   0,   0,   0,   0,   0,  23, 254,  63,   0, 192,
-      0,   0, 128,   3,   0,   8,   0,   0,   0,   2,   0,   0,   0,   0, 252, 255,
-      0,   0,   0,  48, 255, 255, 247, 255, 127,  15,   0,   0,  63,   0,   0,   0,
-    127, 127,   0,  48,   7,   0,   0,   0,   0,   0, 128, 255,   0,   0,   0, 254,
-    255, 115, 255,  15, 255, 255, 255,  31,   0,   0, 128,   1,   0,   0, 255,   1,
-      0,   1,   0,   0,   0,   0, 127,   0,   0,   0,   0,  30,   0,   0, 224,   3,
-    128,  63,   0,   0,   0,   0,   0, 216,   0,   0,  48,   0, 224,  33,   0, 232,
-      0,   0,   0,  63,   0, 248,   0,  40,  64,   0,   0,   0, 254, 255, 255,   0,
-     14,   0,   0,   0, 255,  31,   0,   0,   0,   0,   0, 220,  62,   0,   0,   0,
-      0,   0, 224, 255, 255, 255,   3, 128,   0,   0,  31,   0,   0,   0,  32,   0,
-     48,   0,   0,   0,   0,   0, 128,   7,   0,   0,   0, 144, 127, 254, 255, 255,
-     31,  28,   0,   0,  24, 240, 255, 255, 255, 195, 255, 255,  35,   0,   0,   0,
-      2,   0,   0,   8,   8,   0,   0,   0,   0, 224, 223, 255, 239,  15,   0,   0,
-      0,  16,   1,   0,   0,  64,   0,   0, 255,  15, 255, 255, 255, 127, 254, 255,
-    254, 255, 254, 255,   0,  28,   0,   0, 192, 255, 255, 255,   7,   0, 255, 255,
-    255, 255, 255,  15, 255,   1,   3,   0, 255,  31, 255,   7, 255, 255, 255,   1,
-    255,  15,   0,   0, 255,   0, 255,   3, 255, 239, 255, 255, 255, 255, 123, 252,
-    231, 199, 255, 255, 255, 231, 255, 255, 255,  63,  15,   7,   7,   0,  63,   0,
-};
-
-/* Posix_Punct: 1984 bytes. */
-
-RE_UINT32 re_get_posix_punct(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-
-    f = ch >> 13;
-    code = ch ^ (f << 13);
-    pos = (RE_UINT32)re_posix_punct_stage_1[f] << 5;
-    f = code >> 8;
-    code ^= f << 8;
-    pos = (RE_UINT32)re_posix_punct_stage_2[pos + f] << 3;
-    f = code >> 5;
-    code ^= f << 5;
-    pos = (RE_UINT32)re_posix_punct_stage_3[pos + f] << 5;
-    pos += code;
-    value = (re_posix_punct_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1;
-
-    return value;
-}
-
-/* Posix_XDigit. */
-
-static RE_UINT8 re_posix_xdigit_stage_1[] = {
-    0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1,
-};
-
-static RE_UINT8 re_posix_xdigit_stage_2[] = {
-    0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-};
-
-static RE_UINT8 re_posix_xdigit_stage_3[] = {
-    0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-};
-
-static RE_UINT8 re_posix_xdigit_stage_4[] = {
-      0,   0,   0,   0,   0,   0, 255,   3, 126,   0,   0,   0, 126,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-};
-
-/* Posix_XDigit: 130 bytes. */
-
-RE_UINT32 re_get_posix_xdigit(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-
-    f = ch >> 15;
-    code = ch ^ (f << 15);
-    pos = (RE_UINT32)re_posix_xdigit_stage_1[f] << 4;
-    f = code >> 11;
-    code ^= f << 11;
-    pos = (RE_UINT32)re_posix_xdigit_stage_2[pos + f] << 4;
-    f = code >> 7;
-    code ^= f << 7;
-    pos = (RE_UINT32)re_posix_xdigit_stage_3[pos + f] << 7;
-    pos += code;
-    value = (re_posix_xdigit_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1;
-
-    return value;
-}
-
-/* All_Cases. */
-
-static RE_UINT8 re_all_cases_stage_1[] = {
-    0, 1, 2, 2, 2, 3, 2, 4, 5, 2, 2, 6, 2, 2, 2, 7,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2,
-};
-
-static RE_UINT8 re_all_cases_stage_2[] = {
-     0,  1,  2,  3,  4,  5,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,
-     7,  6,  6,  8,  6,  6,  6,  6,  6,  6,  6,  6,  9, 10, 11, 12,
-     6, 13,  6,  6, 14,  6,  6,  6,  6,  6,  6,  6, 15, 16,  6,  6,
-     6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,
-     6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,
-     6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,
-     6,  6,  6,  6,  6,  6, 17, 18,  6,  6,  6, 19,  6,  6,  6,  6,
-     6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,
-     6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,
-     6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6, 20,  6,  6,  6, 21,
-     6,  6,  6,  6, 22,  6,  6,  6,  6,  6,  6,  6, 23,  6,  6,  6,
-     6,  6,  6,  6,  6,  6,  6,  6, 24,  6,  6,  6,  6,  6,  6,  6,
-     6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6, 25,  6,
-     6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,
-     6,  6,  6,  6,  6,  6,  6,  6,  6, 26,  6,  6,  6,  6,  6,  6,
-     6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,
-};
-
-static RE_UINT8 re_all_cases_stage_3[] = {
-      0,   0,   0,   0,   0,   0,   0,   0,   1,   2,   3,   4,   5,   6,   7,   8,
-      0,   0,   0,   0,   0,   0,   9,   0,  10,  11,  12,  13,  14,  15,  16,  17,
-     18,  18,  18,  18,  18,  18,  19,  20,  21,  22,  18,  18,  18,  18,  18,  23,
-     24,  25,  26,  27,  28,  29,  30,  31,  32,  33,  21,  34,  18,  18,  35,  18,
-     18,  18,  18,  18,  36,  18,  37,  38,  39,  18,  40,  41,  42,  43,  44,  45,
-     46,  47,  48,  49,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,  50,   0,   0,   0,   0,   0,  51,  52,
-     53,  54,  55,  56,  57,  58,  59,  60,  61,  62,  63,  18,  18,  18,  64,  65,
-     66,  66,  67,  68,  69,  70,  71,  72,  73,  74,  75,  75,  76,  18,  18,  18,
-     77,  78,  18,  18,  18,  18,  18,  18,  79,  80,  18,  18,  18,  18,  18,  18,
-     18,  18,  18,  18,  18,  18,  81,  82,  82,  82,  83,   0,  84,  85,  85,  85,
-     86,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+static RE_UINT8 re_xid_start_table_2[] = {
+      0,   0,   1,   1,   0,   2,   3,   3,   4,   4,   4,   4,   4,   4,   4,   4,
+      4,   4,   4,   4,   4,   4,   5,   6,   0,   0,   0,   7,   8,   9,   4,  10,
+      4,   4,   4,   4,  11,   4,   4,   4,   4,  12,  13,   4,  14,   0,  15,  16,
+      0,   4,  17,  18,   4,   4,  19,  20,  21,  22,  23,   4,   4,  24,  25,  26,
+     27,  28,  29,  17,   0,  30,  31,   0,  32,  33,  34,  35,  36,  37,  38,  39,
+     40,  41,  42,  43,  44,  45,  46,  47,  48,  45,  49,  50,  51,  52,  46,   0,
+     53,  54,  55,  56,  57,  58,  59,  60,  61,  62,  63,  64,  65,  66,  67,   0,
+     68,  69,  67,   0,  70,  71,  72,   0,  73,   0,  74,  75,  76,   0,   0,   0,
+      4,  77,  78,  79,  80,   4,  81,  82,   4,   4,   4,   4,   4,   4,   4,   4,
+      4,   4,  83,   4,  84,  85,  86,   4,  87,   4,  88,   0,  22,   4,   4,  89,
+     68,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
+      4,   4,   4,  90,   1,   4,   4,  91,  92,  93,  93,  94,   4,  95,  96,   0,
+      0,   4,   4,  29,   4,  97,   4,  98,  99,   0,  15, 100,   4, 101, 102,   0,
+    103,   4, 104,   0,   0, 105,   0,   0, 106,  95, 107,   0, 108, 109,   4, 110,
+      4, 111, 112, 113, 114, 115,   0, 116,   4,   4,   4,   4,   4,   4,   0,   0,
+      4,   4,   4,   4,   4,   4,   4,   4,  89,   4, 117, 113,   4, 118, 119, 120,
+      0,   0,   0, 121, 122,   0,   0,   0, 123, 124, 125,   4,  14,   0,   0,   0,
       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,  87,  87,  87,  87,  88,  89,  90,  90,  90,  90,  90,  91,
       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,  92,  92,  92,  92,  92,  92,  92,  92,  92,  92,  93,  94,
+      4, 126,  99,   4,   4,   4,   4, 127,   4,  81,   4, 128, 103, 129, 129,   0,
       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     95,  96,  97,  97,  97,  97,  97,  98,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  99,
-      0, 100,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18, 101,  18,  18,  18,
-     18,  18, 102, 103,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,
-    104, 105,  93,  94, 104, 105, 104, 105,  93,  94, 106, 107, 104, 105, 108, 109,
-    104, 105, 104, 105, 104, 105, 110, 111, 112, 113, 114, 115, 116, 117, 112, 118,
-      0,   0,   0,   0, 119, 120, 121,   0,   0, 122,   0,   0, 123, 123, 124, 124,
-    125,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    130, 131,  68,   4, 132,  68,   4,  82, 106,  12,   4,   4, 133,   4,   0,  15,
       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0, 126, 127, 127, 127, 128, 128, 128, 129,   0,   0,
-     82,  82,  82,  82,  82,  83,  85,  85,  85,  85,  85,  86, 130, 131, 132, 133,
-     18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  37, 134, 135,   0,
-    136, 136, 136, 136, 137, 138,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
+      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
+      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   0,   0,
+      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
+      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
+      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4, 134,
+      4,   4,   4,   4,  75,   0,  15, 113,   4,   4,   4,   4,   4,   4,   4,   4,
+    135, 136,   4, 137, 113,   4,   4,  22, 138, 139,   4,   4, 140,   4, 141, 142,
+    143, 144,   4,  95, 139,  95,   0, 145,  25, 146,  67, 134,  32, 147, 148, 149,
+      4,  14, 150, 151,   4, 152, 153, 154, 155, 156,  82, 157,   4,   4,   4, 144,
+      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
+      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4, 158, 159, 160,
+      0,   0,   0,   0,   0,   0,   0,   0,   4,   4,   4,   4,   4,   4,   4,   4,
+      4,   4,   4, 161,   4,   4, 162,   0, 163, 164, 165,   4,   4,  93, 166,   4,
+      4,   4, 113,  32,   4,   4,   4,   4,   4, 113,  15,   4, 167,   4,  31, 168,
+      0,   0,   0, 169,   4,   4,   4, 134,   0,   1,   1, 170, 113,  99, 171,   0,
+    172, 173, 174,   0,   4,   4,   4,  88,   0,   0,   4, 104,   0,   0,   0,   0,
+      0,   0,   0,   0, 134,   4, 175,   0,   4,  23, 176,  98, 113,   4, 177,   0,
+      4,   4,   4,   4, 113,  15, 178, 160,   4, 179,   4, 111,   0,   0,   0,   0,
+      4,   4,   4,   4,   4,   4,   4,   4,   4, 103,  98,  31,   0,   0,   0,   0,
+    180, 181,  98, 103,  99,   0,   0, 182,  98, 162,   0,   0,   4, 183,   0,   0,
+    184,  98,   0, 134, 134,   0,  74, 185,   4,  98,  98, 147,  93,   0,   0,   0,
+      4,   4,  14,   0,   4, 147,   4, 147,   4, 111,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   4, 186,   0,   0, 134, 187, 110,   0,   0,  15, 185, 103,
+    108, 188,   0,   0, 108,  22,  15,  14, 108,  67, 189, 190, 108, 147, 191,   0,
+    192, 193,   0,   0, 194, 114,  99,   0,  48,  45, 195,  56,   0,   0,   0,   0,
+      4, 104, 196,  56,   4,  22, 197,   0,   0,   0,   0,   0,   4, 133, 198,   0,
+      4,  22, 199,   0,   4, 200,   0,   0,  88,   0,   0,   0,   0,   0,   0,   0,
+      4, 193,   0,   0,   0,   4,   4, 201, 202, 203, 204,   0,   0, 205, 175, 206,
+    207, 208, 209,   4, 210,   0,   4,  29,   0,   0,   0,   0,   0,   0,   0,   0,
+    211, 133,  73, 212,  22,   0,   0,   0, 213, 175, 214, 215, 216,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0, 147,   0,   0,   0,   0,   0,  46,   0,   0,
+      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
+      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4, 162,   0,   0,   0,
+      4,   4,   4, 133,   4,   4,   4,   4,   4,   4, 111,   0,   0,   0,   0,   0,
       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,  18, 139,  18,  18,  18, 102,   0,   0,
-     18,  18,  18,  37,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,  78,  18,  78,  18,  18,  18,  18,  18,  18,  18,   0, 140,
-     18, 141, 142,  18,  18, 143, 144,  18, 145,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 146,   0,   0,   0, 147, 147,
-    147, 147, 147, 147, 147, 147, 147, 147,   0,   0,   0,   0,   0,   0,   0,   0,
-    148,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      4, 133,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   1,  11,  11,   4,   5,  15,  15,   8,   0,   0,   0,   0,
+      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
+      4,   4,  67,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
+      4,  29,  99,   0,   0,   0,  15, 217,   4,  22, 111, 218,  22,   0,   0,   0,
       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-    149, 149, 149, 149, 149, 150, 150, 150, 150, 150,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0, 149, 149, 149, 149, 151, 150, 150, 150, 150, 152,
+      0,   0,   4,   4,   0,   0,   0,   0,   4,   4, 219,   0, 166,   0,   0, 220,
+      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
+      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4, 188,
+      4,   4,   4,   4,   4,   4,  98,   0,  14,   0,   0,   0,   0,   0,   0,   0,
       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-    153, 153, 153, 153, 153, 153, 154,   0, 155, 155, 155, 155, 155, 155, 156,   0,
+      4,   4,   4,   4,   4,   4,   4,   4,  99,   0, 221, 222,   4,   4,   4,   4,
+      4,   4,   4,   4,   4,   4,   4, 160,   0,   0,   0,   0,   0,   0,   0,   0,
+      4,   4,   4, 223, 224,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,  11,  11,  11,  11,  15,  15,  15,  15,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,  11,  11,  11,  11,  15,  15,  15,  15,
+      4,   4,  30,   4, 225, 226, 227,   4, 228, 229, 230,   4,   4,   4,   4,   4,
+      4,   4,   4,   4,   4, 231, 232,  82,  30,  30, 126, 126, 211, 211, 150,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   4, 233, 234,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   4, 193,   0,   0,   0,   0,   0,   0,   0,   0,
+      4,   4,   4,   4,   4,   4, 185,   0,   4,   4, 235,   0,   0,   0,   0,   0,
       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-    157, 157, 157, 157, 158, 159, 159, 159, 160,   0,   0,   0,   0,   0,   0,   0,
       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    227, 236, 237, 238, 239, 240,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
+      4,   4,   4,   4,   4,   4, 113,   0,   4,   4,   4,   4,   4,   4,   4,   4,
+      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
+      4,   4,   4,   4,   4,   4,   4,   4,   4, 104,   4,   4,   4,   4,   4,   4,
+    113,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
+      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
+      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
+      4,   4,   4,   4,   4, 241,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
+      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
+      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,  73,
+      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
+    113,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
+      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,  17,   0,   0,   0,   0,   0
 };
 
-static RE_UINT8 re_all_cases_stage_4[] = {
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   1,   1,   1,   1,   1,   1,
-      1,   2,   1,   3,   1,   1,   1,   1,   1,   1,   1,   4,   1,   1,   1,   1,
-      1,   1,   1,   0,   0,   0,   0,   0,   0,   5,   5,   5,   5,   5,   5,   5,
-      5,   6,   5,   7,   5,   5,   5,   5,   5,   5,   5,   8,   5,   5,   5,   5,
-      5,   5,   5,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   9,   0,   0,
-      1,   1,   1,   1,   1,  10,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   0,   1,   1,   1,   1,   1,   1,   1,  11,
-      5,   5,   5,   5,   5,  12,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
-      5,   5,   5,   5,   5,   5,   5,   0,   5,   5,   5,   5,   5,   5,   5,  13,
-     14,  15,  14,  15,  14,  15,  14,  15,  16,  17,  14,  15,  14,  15,  14,  15,
-      0,  14,  15,  14,  15,  14,  15,  14,  15,  14,  15,  14,  15,  14,  15,  14,
-     15,   0,  14,  15,  14,  15,  14,  15,  18,  14,  15,  14,  15,  14,  15,  19,
-     20,  21,  14,  15,  14,  15,  22,  14,  15,  23,  23,  14,  15,   0,  24,  25,
-     26,  14,  15,  23,  27,  28,  29,  30,  14,  15,  31,   0,  29,  32,  33,  34,
-     14,  15,  14,  15,  14,  15,  35,  14,  15,  35,   0,   0,  14,  15,  35,  14,
-     15,  36,  36,  14,  15,  14,  15,  37,  14,  15,   0,   0,  14,  15,   0,  38,
-      0,   0,   0,   0,  39,  40,  41,  39,  40,  41,  39,  40,  41,  14,  15,  14,
-     15,  14,  15,  14,  15,  42,  14,  15,   0,  39,  40,  41,  14,  15,  43,  44,
-     45,   0,  14,  15,  14,  15,  14,  15,  14,  15,  14,  15,   0,   0,   0,   0,
-      0,   0,  46,  14,  15,  47,  48,  49,  49,  14,  15,  50,  51,  52,  14,  15,
-     53,  54,  55,  56,  57,   0,  58,  58,   0,  59,   0,  60,  61,   0,   0,   0,
-     58,  62,   0,  63,   0,  64,  65,   0,  66,  67,  65,  68,  69,   0,   0,  67,
-      0,  70,  71,   0,   0,  72,   0,   0,   0,   0,   0,   0,   0,  73,   0,   0,
-     74,   0,  75,  74,   0,   0,   0,  76,  74,  77,  78,  78,  79,   0,   0,   0,
-      0,   0,  80,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  81,  82,   0,
-      0,   0,   0,   0,   0,  83,   0,   0,  14,  15,  14,  15,   0,   0,  14,  15,
-      0,   0,   0,  33,  33,  33,   0,  84,   0,   0,   0,   0,   0,   0,  85,   0,
-     86,  86,  86,   0,  87,   0,  88,  88,  89,   1,  90,   1,   1,  91,   1,   1,
-     92,  93,  94,   1,  95,   1,   1,   1,  96,  97,   0,  98,   1,   1,  99,   1,
-      1, 100,   1,   1, 101, 102, 102, 102, 103,   5, 104,   5,   5, 105,   5,   5,
-    106, 107, 108,   5, 109,   5,   5,   5, 110, 111, 112, 113,   5,   5, 114,   5,
-      5, 115,   5,   5, 116, 117, 117, 118, 119, 120,   0,   0,   0, 121, 122, 123,
-    124, 125, 126, 127, 128, 129,   0,  14,  15, 130,  14,  15,   0,  45,  45,  45,
-    131, 131, 131, 131, 131, 131, 131, 131,   1,   1, 132,   1, 133,   1,   1,   1,
-      1,   1,   1,   1,   1,   1, 134,   1,   1, 135, 136,   1,   1,   1,   1,   1,
-      1,   1, 137,   1,   1,   1,   1,   1,   5,   5, 138,   5, 139,   5,   5,   5,
-      5,   5,   5,   5,   5,   5, 140,   5,   5, 141, 142,   5,   5,   5,   5,   5,
-      5,   5, 143,   5,   5,   5,   5,   5, 144, 144, 144, 144, 144, 144, 144, 144,
-     14,  15, 145, 146,  14,  15,  14,  15,  14,  15,   0,   0,   0,   0,   0,   0,
-      0,   0,  14,  15,  14,  15,  14,  15, 147,  14,  15,  14,  15,  14,  15,  14,
-     15,  14,  15,  14,  15,  14,  15, 148,   0, 149, 149, 149, 149, 149, 149, 149,
-    149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149,   0,
-      0, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150,
-    150, 150, 150, 150, 150, 150, 150,   0, 151, 151, 151, 151, 151, 151, 151, 151,
-    151, 151, 151, 151, 151, 151,   0, 151,   0,   0,   0,   0,   0, 151,   0,   0,
-    152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152,   0,   0, 152, 152, 152,
-    153, 153, 153, 153, 153, 153, 153, 153, 118, 118, 118, 118, 118, 118,   0,   0,
-    123, 123, 123, 123, 123, 123,   0,   0, 154, 155, 156, 157, 158, 159, 160, 161,
-    162,   0,   0,   0,   0,   0,   0,   0, 163, 163, 163, 163, 163, 163, 163, 163,
-    163, 163, 163,   0,   0, 163, 163, 163,   0, 164,   0,   0,   0, 165,   0,   0,
-      0,   0,   0,   0,   0,   0, 166,   0, 167, 168,  14,  15,  14,  15,  14,  15,
-     14,  15,  14,  15,  14,  15,   0,   0,   0,   0,   0, 169,   0,   0, 170,   0,
-    118, 118, 118, 118, 118, 118, 118, 118, 123, 123, 123, 123, 123, 123, 123, 123,
-      0, 118,   0, 118,   0, 118,   0, 118,   0, 123,   0, 123,   0, 123,   0, 123,
-    171, 171, 172, 172, 172, 172, 173, 173, 174, 174, 175, 175, 176, 176,   0,   0,
-    118, 118,   0, 177,   0,   0,   0,   0, 123, 123, 178, 178, 179,   0, 180,   0,
-      0,   0,   0, 177,   0,   0,   0,   0, 181, 181, 181, 181, 179,   0,   0,   0,
-    118, 118,   0, 182,   0,   0,   0,   0, 123, 123, 183, 183,   0,   0,   0,   0,
-    118, 118,   0, 184,   0, 126,   0,   0, 123, 123, 185, 185, 130,   0,   0,   0,
-    186, 186, 187, 187, 179,   0,   0,   0,   0,   0,   0,   0,   0,   0, 188,   0,
-      0,   0, 189, 190,   0,   0,   0,   0,   0,   0, 191,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0, 192,   0, 193, 193, 193, 193, 193, 193, 193, 193,
-    194, 194, 194, 194, 194, 194, 194, 194,   0,   0,   0,  14,  15,   0,   0,   0,
-      0,   0,   0,   0,   0,   0, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195,
-    196, 196, 196, 196, 196, 196, 196, 196, 196, 196,   0,   0,   0,   0,   0,   0,
-     14,  15, 197, 198, 199, 200, 201,  14,  15,  14,  15,  14,  15, 202, 203, 204,
-    205,   0,  14,  15,   0,  14,  15,   0,   0,   0,   0,   0,   0,   0, 206, 206,
-      0,   0,   0,  14,  15,  14,  15,   0,   0,   0,  14,  15,   0,   0,   0,   0,
-    207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207,   0, 207,
-      0,   0,   0,   0,   0, 207,   0,   0,  14,  15, 208, 209,  14,  15,  14,  15,
-      0,  14,  15,  14,  15, 210,  14,  15,   0,   0,   0,  14,  15, 211,   0,   0,
-     14,  15,  14,  15, 149,   0,  14,  15,  14,  15, 212, 213, 214, 215, 212,   0,
-    216, 217, 218, 219,  14,  15,  14,  15,   0,   0,  14,  15, 150, 220, 221,   0,
-      0,   0,   0, 222,   0,   0,   0,   0, 223, 223, 223, 223, 223, 223, 223, 223,
-      0,   0,   0,   0,   0,  14,  15,   0, 224, 224, 224, 224, 224, 224, 224, 224,
-    225, 225, 225, 225, 225, 225, 225, 225, 224, 224, 224, 224,   0,   0,   0,   0,
-    225, 225, 225, 225,   0,   0,   0,   0,  87,  87,  87,  87,  87,  87,  87,  87,
-     87,  87,  87,   0,   0,   0,   0,   0, 116, 116, 116, 116, 116, 116, 116, 116,
-    116, 116, 116,   0,   0,   0,   0,   0, 226, 226, 226, 226, 226, 226, 226, 226,
-    226, 226, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227,
-    227, 227, 227, 227,   0,   0,   0,   0,
-};
+static RE_UINT8 re_xid_start_table_3[] = {
+      0,   0,   0,   0, 254, 255, 255,   7,   0,   4,  32,   4, 255, 255, 127, 255,
+    255, 255, 255, 255, 195, 255,   3,   0,  31,  80,   0,   0,   0,   0, 223, 184,
+     64, 215, 255, 255, 251, 255, 255, 255, 255, 255, 191, 255,   3, 252, 255, 255,
+    255, 255, 254, 255, 255, 255, 127,   2, 255,   1,   0,   0,   0,   0, 255, 255,
+    255, 135,   7,   0, 255,   7,   0,   0,   0, 192, 254, 255, 255, 255,  47,   0,
+     96, 192,   0, 156,   0,   0, 253, 255, 255, 255,   0,   0,   0, 224, 255, 255,
+     63,   0,   2,   0,   0, 252, 255, 255, 255,   7,  48,   4, 255, 255,  63,   4,
+     16,   1,   0,   0, 255, 255, 255,   1, 255, 255, 223, 255, 255,   0,   0,   0,
+    240, 255, 255, 255, 255, 255, 255,  35,   0,   0,   1, 255,   3,   0, 254, 255,
+    225, 159, 249, 255, 255, 253, 197,  35,   0,  64,   0, 176,   3,   0,   3,  16,
+    224, 135, 249, 255, 255, 253, 109,   3,   0,   0,   0,  94,   0,   0,  28,   0,
+    224, 191, 251, 255, 255, 253, 237,  35,   0,   0,   1,   0,   3,   0,   0,   2,
+    224, 159, 249, 255,   0,   0,   0, 176,   3,   0,   2,   0, 232, 199,  61, 214,
+     24, 199, 255,   3, 224, 223, 253, 255, 255, 253, 255,  35,   0,   0,   0,   7,
+      3,   0,   0,   0, 225, 223, 253, 255, 255, 253, 239,  35,   0,   0,   0,  64,
+      3,   0,   6,   0, 240, 223, 253, 255, 255, 255, 255,  39,   0,  64, 112, 128,
+      3,   0,   0, 252, 224, 255, 127, 252, 255, 255, 251,  47, 127,   0,   0,   0,
+    254, 255, 255, 255, 255, 255,   5,   0, 214, 247, 255, 255, 175, 255,   5,  32,
+     95,   0,   0, 240,   1,   0,   0,   0, 255, 254, 255, 255, 255,  31,   0,   0,
+      0,  31,   0,   0, 255,   7,   0, 128,   0,   0,  63,  60,  98, 192, 225, 255,
+      3,  64,   0,   0, 191,  32, 255, 255, 255, 255, 255, 247, 255,  61, 127,  61,
+    255,  61, 255, 255, 255, 255,  61, 127,  61, 255, 127, 255, 255, 255,  61, 255,
+    255, 255, 255,   7, 255, 255,  63,  63, 255, 159, 255, 255, 255, 199, 255,   1,
+    255, 223,   3,   0, 255, 255,   3,   0, 255, 223,   1,   0, 255, 255,  15,   0,
+      0,   0, 128,  16, 255,   5, 255, 255, 255, 255,  63,   0, 255, 255, 255, 127,
+    255,  63,  31,   0, 255,  15, 255, 255, 255,   3,   0,   0, 255, 255, 127,   0,
+    255, 255,  31,   0, 128,   0,   0,   0, 224, 255, 255, 255, 224,  15,   0,   0,
+    248, 255, 255, 255,   1, 192,   0, 252,  63,   0,   0,   0,  15,   0,   0,   0,
+      0, 224,   0, 252, 255, 255, 255,  63, 255,   1, 255, 255, 255, 255, 255, 231,
+      0, 222, 111,   4,  63,  63, 255, 170, 255, 255, 223,  95, 220,  31, 207,  15,
+    255,  31, 220,  31,   0,   0,   2, 128,   0,   0, 255,  31, 132, 252,  47,  63,
+     80, 253, 255, 243, 224,  67,   0,   0, 255, 127, 255, 255,  31, 120,  12,   0,
+    255, 128,   0,   0, 127, 127, 127, 127, 224,   0,   0,   0, 254,   3,  62,  31,
+    255, 255, 127, 224, 255, 127,   0,   0, 255, 255, 255,  31, 255,  31, 255, 255,
+      0,  12,   0,   0, 255, 127,   0, 128,   0,   0, 128, 255, 252, 255, 255, 255,
+    255, 249, 255, 255, 252,   7,   0,   0,   0,   0, 224, 255, 187, 247, 255, 255,
+      7,   0,   0,   0,   0,   0, 252, 104,  63,   0, 255, 255, 255, 255,   7,   0,
+      0, 128,   0,   0, 223, 255,   0, 124, 247,  15,   0,   0, 255, 255, 127, 196,
+    255, 255,  98,  62,   5,   0,   0,  56, 255,   7,  28,   0, 126, 126, 126,   0,
+    127, 127, 255, 255, 255,   3, 255, 255,  15,   0, 255, 255, 127, 248, 255, 255,
+    255, 255, 255,  15, 255,  63, 255, 255, 255, 255, 255,   3, 127,   0, 248, 160,
+    255, 253, 127,  95, 219, 255, 255, 255,   0,   0, 248, 255, 255, 255, 252, 255,
+      0,   0, 255,   3,   0,   0, 138, 170, 192, 255, 255, 255, 252, 252, 252,  28,
+    255, 239, 255, 255, 127, 255, 255, 183, 255,  63, 255,  63, 255, 255,   1,   0,
+    255,   7, 255, 255,  15, 255,  62,   0, 255, 255,  15, 255, 255,   0, 255, 255,
+     63, 253, 255, 255, 255, 255, 191, 145, 255, 255,  55,   0, 255, 255, 255, 192,
+      1,   0, 239, 254,  31,   0,   0,   0, 255,   3,   3,   0, 128,   0, 255, 255,
+    255, 255, 255,   0, 144,   0, 255, 255, 255, 255,  71,   0,  30,   0,   0,  20,
+    255, 255, 251, 255, 255,  15,   0,   0, 127, 189, 255, 191,   0,   0,   1, 224,
+    128,   7,   0, 128, 176,   0,   0,   0,   0,   0,   0,  15,  16,   0,   0,   0,
+    255,   7,   0,   1,   0,   0,   0, 128, 127, 242, 111, 255, 255, 255,   0, 128,
+      2,   0,   0,   0, 255, 252, 255, 255,  10,   0,   0,   0,   1, 248, 255, 255,
+    255, 255,   7,   4,   0,   0,   1, 240, 255,   3,   0,  32, 255, 253, 255, 255,
+      0,   0, 252, 255, 127, 251, 255, 255,  64,   0,   0,   0, 191, 253, 255, 255,
+    255,   3,   0,   1, 255,  63,   0,   0, 248, 255, 255, 224, 255,   7,   1,   0,
+     11,   0,   0,   0,   0,   0,   7,   0, 240,   0, 255, 255, 255,   7, 255,  31,
+    255,   1, 255,   3, 255, 255, 255, 223, 100, 222, 255, 235, 239, 255, 255, 255,
+    191, 231, 223, 223, 255, 255, 255, 123,  95, 252, 253, 255,  63, 255, 255, 255,
+    253, 255, 255, 247, 255,  31, 128,  63,   0,  64,   0,   0,  15,   8,   0,   0,
+    150, 254, 247,  10, 132, 234, 150, 170, 150, 247, 247,  94, 255, 251, 255,  15,
+    238, 251, 255,  15,   3,   0, 255, 255
+};
+
+RE_UINT32 re_get_xid_start(RE_UINT32 codepoint) {
+    RE_UINT32 field_2;
+    RE_UINT32 field_1;
+    RE_UINT32 field_0;
+    RE_UINT32 offset;
+    RE_UINT32 v;
+
+    field_2 = codepoint >> 10;
+    field_1 = (codepoint >> 5) & 0x1F;
+    field_0 = (codepoint >> 3) & 0x3;
+    offset = codepoint & 0x7;
+
+    v = re_xid_start_table_1[field_2];
+    v = re_xid_start_table_2[(v << 5) | field_1];
+    v = re_xid_start_table_3[(v << 2) | field_0];
+
+    return (v >> offset) & 0x1;
+}
 
-/* All_Cases: 2544 bytes. */
-
-static RE_AllCases re_all_cases_table[] = {
-    {{     0,     0,     0}},
-    {{    32,     0,     0}},
-    {{    32,   232,     0}},
-    {{    32,  8415,     0}},
-    {{    32,   300,     0}},
-    {{   -32,     0,     0}},
-    {{   -32,   199,     0}},
-    {{   -32,  8383,     0}},
-    {{   -32,   268,     0}},
-    {{   743,   775,     0}},
-    {{    32,  8294,     0}},
-    {{  7615,     0,     0}},
-    {{   -32,  8262,     0}},
-    {{   121,     0,     0}},
-    {{     1,     0,     0}},
-    {{    -1,     0,     0}},
-    {{  -199,     0,     0}},
-    {{  -232,     0,     0}},
-    {{  -121,     0,     0}},
-    {{  -300,  -268,     0}},
-    {{   195,     0,     0}},
-    {{   210,     0,     0}},
-    {{   206,     0,     0}},
-    {{   205,     0,     0}},
-    {{    79,     0,     0}},
-    {{   202,     0,     0}},
-    {{   203,     0,     0}},
-    {{   207,     0,     0}},
-    {{    97,     0,     0}},
-    {{   211,     0,     0}},
-    {{   209,     0,     0}},
-    {{   163,     0,     0}},
-    {{   213,     0,     0}},
-    {{   130,     0,     0}},
-    {{   214,     0,     0}},
-    {{   218,     0,     0}},
-    {{   217,     0,     0}},
-    {{   219,     0,     0}},
-    {{    56,     0,     0}},
-    {{     1,     2,     0}},
-    {{    -1,     1,     0}},
-    {{    -2,    -1,     0}},
-    {{   -79,     0,     0}},
-    {{   -97,     0,     0}},
-    {{   -56,     0,     0}},
-    {{  -130,     0,     0}},
-    {{ 10795,     0,     0}},
-    {{  -163,     0,     0}},
-    {{ 10792,     0,     0}},
-    {{ 10815,     0,     0}},
-    {{  -195,     0,     0}},
-    {{    69,     0,     0}},
-    {{    71,     0,     0}},
-    {{ 10783,     0,     0}},
-    {{ 10780,     0,     0}},
-    {{ 10782,     0,     0}},
-    {{  -210,     0,     0}},
-    {{  -206,     0,     0}},
-    {{  -205,     0,     0}},
-    {{  -202,     0,     0}},
-    {{  -203,     0,     0}},
-    {{ 42319,     0,     0}},
-    {{ 42315,     0,     0}},
-    {{  -207,     0,     0}},
-    {{ 42280,     0,     0}},
-    {{ 42308,     0,     0}},
-    {{  -209,     0,     0}},
-    {{  -211,     0,     0}},
-    {{ 10743,     0,     0}},
-    {{ 42305,     0,     0}},
-    {{ 10749,     0,     0}},
-    {{  -213,     0,     0}},
-    {{  -214,     0,     0}},
-    {{ 10727,     0,     0}},
-    {{  -218,     0,     0}},
-    {{ 42307,     0,     0}},
-    {{ 42282,     0,     0}},
-    {{   -69,     0,     0}},
-    {{  -217,     0,     0}},
-    {{   -71,     0,     0}},
-    {{  -219,     0,     0}},
-    {{ 42261,     0,     0}},
-    {{ 42258,     0,     0}},
-    {{    84,   116,  7289}},
-    {{   116,     0,     0}},
-    {{    38,     0,     0}},
-    {{    37,     0,     0}},
-    {{    64,     0,     0}},
-    {{    63,     0,     0}},
-    {{  7235,     0,     0}},
-    {{    32,    62,     0}},
-    {{    32,    96,     0}},
-    {{    32,    57,    92}},
-    {{   -84,    32,  7205}},
-    {{    32,    86,     0}},
-    {{  -743,    32,     0}},
-    {{    32,    54,     0}},
-    {{    32,    80,     0}},
-    {{    31,    32,     0}},
-    {{    32,    47,     0}},
-    {{    32,  7549,     0}},
-    {{   -38,     0,     0}},
-    {{   -37,     0,     0}},
-    {{  7219,     0,     0}},
-    {{   -32,    30,     0}},
-    {{   -32,    64,     0}},
-    {{   -32,    25,    60}},
-    {{  -116,   -32,  7173}},
-    {{   -32,    54,     0}},
-    {{  -775,   -32,     0}},
-    {{   -32,    22,     0}},
-    {{   -32,    48,     0}},
-    {{   -31,     1,     0}},
-    {{   -32,    -1,     0}},
-    {{   -32,    15,     0}},
-    {{   -32,  7517,     0}},
-    {{   -64,     0,     0}},
-    {{   -63,     0,     0}},
-    {{     8,     0,     0}},
-    {{   -62,   -30,     0}},
-    {{   -57,   -25,    35}},
-    {{   -47,   -15,     0}},
-    {{   -54,   -22,     0}},
-    {{    -8,     0,     0}},
-    {{   -86,   -54,     0}},
-    {{   -80,   -48,     0}},
-    {{     7,     0,     0}},
-    {{  -116,     0,     0}},
-    {{   -92,   -60,   -35}},
-    {{   -96,   -64,     0}},
-    {{    -7,     0,     0}},
-    {{    80,     0,     0}},
-    {{    32,  6254,     0}},
-    {{    32,  6253,     0}},
-    {{    32,  6244,     0}},
-    {{    32,  6242,     0}},
-    {{    32,  6242,  6243}},
-    {{    32,  6236,     0}},
-    {{   -32,  6222,     0}},
-    {{   -32,  6221,     0}},
-    {{   -32,  6212,     0}},
-    {{   -32,  6210,     0}},
-    {{   -32,  6210,  6211}},
-    {{   -32,  6204,     0}},
-    {{   -80,     0,     0}},
-    {{     1,  6181,     0}},
-    {{    -1,  6180,     0}},
-    {{    15,     0,     0}},
-    {{   -15,     0,     0}},
-    {{    48,     0,     0}},
-    {{   -48,     0,     0}},
-    {{  7264,     0,     0}},
-    {{  3008,     0,     0}},
-    {{ 38864,     0,     0}},
-    {{ -6254, -6222,     0}},
-    {{ -6253, -6221,     0}},
-    {{ -6244, -6212,     0}},
-    {{ -6242, -6210,     0}},
-    {{ -6242, -6210,     1}},
-    {{ -6243, -6211,    -1}},
-    {{ -6236, -6204,     0}},
-    {{ -6181, -6180,     0}},
-    {{ 35266, 35267,     0}},
-    {{ -3008,     0,     0}},
-    {{ 35332,     0,     0}},
-    {{  3814,     0,     0}},
-    {{ 35384,     0,     0}},
-    {{     1,    59,     0}},
-    {{    -1,    58,     0}},
-    {{   -59,   -58,     0}},
-    {{ -7615,     0,     0}},
-    {{    74,     0,     0}},
-    {{    86,     0,     0}},
-    {{   100,     0,     0}},
-    {{   128,     0,     0}},
-    {{   112,     0,     0}},
-    {{   126,     0,     0}},
-    {{     9,     0,     0}},
-    {{   -74,     0,     0}},
-    {{    -9,     0,     0}},
-    {{ -7289, -7205, -7173}},
-    {{   -86,     0,     0}},
-    {{ -7235,     0,     0}},
-    {{  -100,     0,     0}},
-    {{ -7219,     0,     0}},
-    {{  -112,     0,     0}},
-    {{  -128,     0,     0}},
-    {{  -126,     0,     0}},
-    {{ -7549, -7517,     0}},
-    {{ -8415, -8383,     0}},
-    {{ -8294, -8262,     0}},
-    {{    28,     0,     0}},
-    {{   -28,     0,     0}},
-    {{    16,     0,     0}},
-    {{   -16,     0,     0}},
-    {{    26,     0,     0}},
-    {{   -26,     0,     0}},
-    {{-10743,     0,     0}},
-    {{ -3814,     0,     0}},
-    {{-10727,     0,     0}},
-    {{-10795,     0,     0}},
-    {{-10792,     0,     0}},
-    {{-10780,     0,     0}},
-    {{-10749,     0,     0}},
-    {{-10783,     0,     0}},
-    {{-10782,     0,     0}},
-    {{-10815,     0,     0}},
-    {{ -7264,     0,     0}},
-    {{-35266,     1,     0}},
-    {{-35267,    -1,     0}},
-    {{-35332,     0,     0}},
-    {{-42280,     0,     0}},
-    {{-42308,     0,     0}},
-    {{-42319,     0,     0}},
-    {{-42315,     0,     0}},
-    {{-42305,     0,     0}},
-    {{-42258,     0,     0}},
-    {{-42282,     0,     0}},
-    {{-42261,     0,     0}},
-    {{   928,     0,     0}},
-    {{-42307,     0,     0}},
-    {{-35384,     0,     0}},
-    {{  -928,     0,     0}},
-    {{-38864,     0,     0}},
-    {{    40,     0,     0}},
-    {{   -40,     0,     0}},
-    {{    34,     0,     0}},
-    {{   -34,     0,     0}},
+/* All cases. */
+static RE_UINT8 re_all_cases_table_1[] = {
+     0,  1,  2,  2,  3,  2,  2,  4,  5,  6,  2,  7,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  8,  9,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2, 10,
+     2, 11,  2, 12,  2,  2, 13,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2, 14,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2, 15,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2
 };
 
-/* All_Cases: 2736 bytes. */
-
-int re_get_all_cases(RE_UINT32 ch, RE_UINT32* codepoints) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-    RE_AllCases* all_cases;
-    int count;
-
-    f = ch >> 13;
-    code = ch ^ (f << 13);
-    pos = (RE_UINT32)re_all_cases_stage_1[f] << 5;
-    f = code >> 8;
-    code ^= f << 8;
-    pos = (RE_UINT32)re_all_cases_stage_2[pos + f] << 5;
-    f = code >> 3;
-    code ^= f << 3;
-    pos = (RE_UINT32)re_all_cases_stage_3[pos + f] << 3;
-    value = re_all_cases_stage_4[pos + code];
-
-    all_cases = &re_all_cases_table[value];
-
-    codepoints[0] = ch;
-    count = 1;
-
-    while (count < RE_MAX_CASES && all_cases->diffs[count - 1] != 0) {
-        codepoints[count] = (RE_UINT32)((RE_INT32)ch + all_cases->diffs[count -
-          1]);
-        ++count;
-    }
-
-    return count;
+static RE_UINT8 re_all_cases_table_2[] = {
+     0,  0,  1,  2,  0,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13,
+     6, 14, 15, 16, 17,  0,  0,  0,  0,  0, 18, 19, 20, 21, 22, 23,
+    24, 25, 26, 27, 28,  6, 29,  6,  6, 30, 31, 32, 33,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0, 34, 35, 36,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 37, 38, 39,
+     0,  0,  0,  0, 40, 36,  0,  0,  0,  0,  0, 41, 42,  0,  0,  0,
+     6,  6,  6, 43, 44,  6,  6,  6, 45, 46, 47, 48, 46, 49, 50, 51,
+     0,  0,  0,  0,  0,  0,  0,  0,  0, 52, 53, 54, 55,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0, 56, 57, 58,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    59, 60, 61, 62,  6,  6,  6, 63, 34, 64,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0, 65, 66, 67,  0,  0,  0,  0, 68,  6, 69, 70, 71, 72, 73,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 74, 75, 76, 77,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0, 78, 78,  0,  0,  0,  0,  0,
+    79, 80, 81,  0,  0, 82, 83, 84,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0, 85, 86, 85, 86,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0, 87, 87,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0, 88, 88,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0, 89, 90, 91,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0
+};
+
+static RE_UINT8 re_all_cases_table_3[] = {
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   1,   1,   1,   1,   1,   1,   1,   1, 134,   1,   3,   1,   1,   1,   1,
+      1,   1,   1,   4,   1,   1,   1,   1,   1,   1,   1,   0,   0,   0,   0,   0,
+      0,   1,   1,   1,   1,   1,   1,   1,   1,   2,   1,   3,   1,   1,   1,   1,
+      1,   1,   1,   4,   1,   1,   1,   1,   1,   1,   1,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0, 145,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      1,   1,   1,   1,   1,   5,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   0,   1,   1,   1,   1,   1,   1,   1,  83,
+      1,   1,   1,   1,   1,   5,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   0,   1,   1,   1,   1,   1,   1,   1,  29,
+     16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,
+     16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,
+     16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,
+    133,  15,  16,  16,  16,  16,  16,  16,   0,  23,  23,  25,  25,  23,  23,  27,
+     27,  23,  23,  25,  25,  23,  23,  28,  28,   0,  16,  16,  16,  16,  16,  16,
+     16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,
+     16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,
+     16,  16,  16,  16,  16,  16,  16,  16,  29,  23,  23,  25,  25,  23,  23, 136,
+     53,  30,  16,  16,  16,  16,  30,  28,  28,  31,  32,  25,  25,   0,  33,  34,
+     35,  23,  23,  36,  37,  47,  38,  38,  16,  16,  51,   0,  36,  39,  49,  40,
+     16,  16,  16,  16,  16,  16,  41,  28,  28,  42,   0,   0,  16,  16,  41,  43,
+     43,  44,  45,  25,  25,  23,  23,  46,  16,  16,   0,   0,  16,  16,   0,  48,
+      0,   0,   0,   0, 155, 155,  24, 149, 149,  17, 156, 156,  26,  23,  23,  43,
+     43,  23,  23,  25,  25,  23,  23,  28,  28,  23,  23,  25,  25,  33,  16,  16,
+     16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,
+      0, 150, 150,  18,  16,  16,  47,  48,  16,  16,  16,  16,  16,  16,  16,  16,
+     49,   0,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,
+     16,  16,  16,  16,   0,   0,   0,   0,   0,   0,  50,  25,  25,  51,  52, 108,
+    106,  23,  23,  53,  54,  55,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,
+    106, 104, 107,  30,  30,   0,  31,  32,   0,  34,   0,  35, 112,   0,   0,   0,
+     36, 113,   0,  37,   0, 110, 111,   0,  38,  38, 115, 101, 114,   0,   0,  36,
+      0, 105,  39,   0,   0,  40,   0,   0,   0,   0,   0,   0,   0, 103,   0,   0,
+     41,   0, 120,  42,   0,   0,   0, 117,  41,  54,  44,  45,  55,   0,   0,   0,
+      0,   0,  46,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 118, 116,   0,
+      0,   0,   0,   0,   0, 142,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     16,  16,  16,  16,   0,   0,  16,  16,   0,   0,   0,  75,  76,  76,   0,  56,
+      0,   0,   0,   0,   0,   0,  57,   0,  58,  59,  58,   0,  60,   0,  61,  62,
+      0,   1,   6,   1,   1,   7,   1,   1,   8, 142,  10,   1, 145,   1,   1,   1,
+     63,  64,   0, 151,  65,  65,  66,  65,  65,  67,  65,  65,  57,  58,  59,  58,
+      0,   1,   6,   1,   1,   7,   1,   1,   8,   9,  10,   1,  11,   1,   1,   1,
+     63,  64, 151,  19,  65,  65,  66,  65,  65,  67,  65,  65,  60,  61,  62,  71,
+    138, 140,   0,   0,   0, 159, 157,  71,  16,  16,  16,  16,  16,  16,  16,  16,
+     16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,
+    144, 158,  74,  56, 141, 139,   0,  28,  28,  74,  16,  16,   0,  75,  76,  76,
+     77,  77,  77,  77,  77,  77,  77,  77,  77,  77,  77,  77,  77,  77,  77,  77,
+      1,   1,  12,   1,  13,   1,   1,   1,   1,   1,   1,   1,   1,   1,  14,   1,
+     65,  68,  69,  65,  65,  65,  65,  65,  65,  65,  70,  65,  65,  65,  65,  65,
+      1,   1,  12,   1,  13,   1,   1,   1,   1,   1,   1,   1,   1,   1,  14,   1,
+     65,  68,  69,  65,  65,  65,  65,  65,  65,  65,  70,  65,  65,  65,  65,  65,
+     77,  77,  77,  77,  77,  77,  77,  77,  77,  77,  77,  77,  77,  77,  77,  77,
+     16,  16,  20,  20,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,
+     16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,
+     16,  16,   0,   0,   0,   0,   0,   0,   0,   0,  16,  16,  16,  16,  16,  16,
+     16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,
+     28,  23,  23,  25,  25,  23,  23,  28,  28,  23,  23,  25,  25,  23,  23,  28,
+     16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,
+     16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,
+      0,  77,  77,  77,  77,  77,  77,  77,  77,  77,  77,  77,  77,  77,  77,  77,
+     73,  73,  73,  73,  73,  73,  73,  73,  73,  73,  73,  73,  73,  73,  73,  73,
+     78,  78,  78,  78,  78,  78,  78,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,  77,  77,  77,  77,  77,  77,  77,  77,  77,  77,  77,  77,  77,  77,  77,
+     73,  73,  73,  73,  73,  73,  73,  73,  73,  73,  73,  73,  73,  73,  73,  73,
+     78,  78,  78,  78,  78,  78,  78,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,
+     79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,
+     80,  80,  80,  80,  80,  80,   0,  80,   0,   0,   0,   0,   0,  80,   0,   0,
+     82,  82,  82,  82,  82,  82,  82,  82,  82,  82,  82,  82,  82,  82,  82,  82,
+     82,  82,  82,  82,  82,  82,  82,  82,  82,  82,  82,  82,  82,  82,  82,  82,
+     82,  82,  82,  82,  82,  82,  82,  82,  82,  82,  82,   0,   0,  82,  82,  82,
+    122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+    123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+    124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+    125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+    124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+     81,  81,  81,  81,  81,  81,   0,   0,  81,  81,  81,  81,  81,  81,   0,   0,
+    146, 147, 148, 161, 162, 163, 164, 152, 154,   0,   0,   0,   0,   0,   0,   0,
+     82,  82,  82,  82,  82,  82,  82,  82,  82,  82,  82,  82,  82,  82,  82,  82,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0, 109,   0,   0,   0, 102,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 121,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     21,  21,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,
+     16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,
+     16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,
+     16,  16,  16,  16,  16,  16,   0,   0,   0,   0,   0, 153,   0,   0,  83,   0,
+     81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,
+     81,  81,  81,  81,  81,  81,   0,   0,  81,  81,  81,  81,  81,  81,   0,   0,
+     81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,
+     81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,
+     81,  81,  81,  81,  81,  81,   0,   0,  81,  81,  81,  81,  81,  81,   0,   0,
+      0,  81,   0,  81,   0,  81,   0,  81,   0,  81,   0,  81,   0,  81,   0,  81,
+     81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,
+     84,  84,  85,  85,  86,  86,  87,  87,  90,  90,  88,  88,  75,  75,   0,   0,
+     81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,
+     81,  81,   0,  28,   0,   0,   0,   0,  81,  81,  84,  84,  28,   0, 143,   0,
+      0,   0,   0,  28,   0,   0,   0,   0,  85,  85,  86,  86,  28,   0,   0,   0,
+     81,  81,   0,   0,   0,   0,   0,   0,  81,  81,  87,  87,   0,   0,   0,   0,
+     81,  81,   0,   0,   0,  89,   0,   0,  81,  81,  88,  88,  89,   0,   0,   0,
+      0,   0,   0,  28,   0,   0,   0,   0,  90,  90,  75,  75,  28,   0,   0,   0,
+      0,   0,   0,   0,   0,   0, 160,   0,   0,   0, 135, 137,   0,   0,   0,   0,
+      0,   0,  91,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  91,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     92,  92,  92,  92,  92,  92,  92,  92,  92,  92,  92,  92,  92,  92,  92,  92,
+     92,  92,  92,  92,  92,  92,  92,  92,  92,  92,  92,  92,  92,  92,  92,  92,
+      0,   0,   0,  25,  25,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,  93,  93,  94,  94,  95,  95,  94,  94,  93,  93,
+     96,  96,  97,  97,  96,  96,  98,  98,  57,  57,  99,  99,  57,  57,  98,  98,
+     93,  93,  94,  94,  95,  95,  94,  94,  93,  93,  96,  96,  97,  97,  96,  96,
+     98,  98,  57,  57,  99,  99,  57,  57,  98,  98,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     73,  73,  73,  73,  73,  73,  73,  73,  73,  73,  73,  73,  73,  73,  73,  73,
+     77,  77,  77,  77,  77,  77,  77,  77,  77,  77,  77,  77,  77,  77,  77,  77,
+    100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100,   0,
+     73,  73,  73,  73,  73,  73,  73,  73,  73,  73,  73,  73,  73,  73,  73,  73,
+     77,  77,  77,  77,  77,  77,  77,  77,  77,  77,  77,  77,  77,  77,  77,  77,
+    100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100,   0,
+     16,  16, 101, 102, 103,  50,  52,  28,  28,  23,  23,  25,  25, 104, 105, 106,
+    107,   0,  16,  16,   0,  23,  23,   0,   0,   0,   0,   0,   0,   0, 108, 106,
+     16,  16,  16,  16,   0,   0,   0,   0,   0,   0,   0,  25,  25,  23,  23,   0,
+      0,   0,  16,  16,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     80,  80,  80,  80,  80,  80,   0,  80,   0,   0,   0,   0,   0,  80,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     16,  16,  16,  16,  16,  16,  16,  16,  16,  16, 154,  22,  16,  16,  16,  16,
+     16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,
+     16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,
+     16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,   0,   0,   0,   0,
+      0,   0,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,
+      0,   0,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,
+     16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,  23,  23,  25,  25, 109,  16,  16,
+     16,  16,  16,  16,  16,  16,  16,  16,   0,   0,   0,  25,  25, 110,   0,   0,
+     16,  16,  16,  16,  77,   0,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,
+     16,  16,  16,  16,  16,  16,  16,  16,  16,  16, 111, 112, 113, 114, 115,   0,
+    116, 117, 118, 119,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,
+      0,   0,  16,  16,  77, 120, 121,  28,  28,  23,  23,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,  23,  23,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0, 119,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+    123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+    124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+    125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+    124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+      0,  65,  65,  65,  65,  65,  65,  65,  65,  65,  65,  65,  65,  65,  65,  65,
+     65,  65,  65,  65,  65,  65,  65,  65,  65,  65,  65,   0,   0,   0,   0,   0,
+    126, 126, 126, 126, 126, 126, 126, 126, 127, 127, 127, 127, 127, 127, 127, 127,
+    126, 126, 126, 126, 126, 126, 126, 126, 128, 128, 128, 128, 128, 128, 128, 128,
+    129, 129, 129, 129, 129, 129, 129, 129, 126, 126, 126, 126, 126, 126, 126, 126,
+    127, 127, 127, 127, 127, 127, 127, 127, 126, 126, 126, 126, 126, 126, 126, 126,
+    128, 128, 128, 128, 128, 128, 128, 128, 129, 129, 129, 129, 129, 129, 129, 129,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    129, 129, 129, 129, 129, 129, 129, 129, 128, 128, 128, 128, 128, 128, 128, 128,
+    126, 126, 126, 126, 126, 126, 126, 126, 127, 127, 127, 127, 127, 127, 127, 127,
+    126, 126, 126, 126,   0,   0,   0,   0, 129, 129, 129, 129, 129, 129, 129, 129,
+    128, 128, 128, 128, 128, 128, 128, 128, 126, 126, 126, 126, 126, 126, 126, 126,
+    127, 127, 127, 127, 127, 127, 127, 127, 126, 126, 126, 126,   0,   0,   0,   0,
+     60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,
+     60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,
+     60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,
+     60,  60,  60,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     65,  65,  65,  65,  65,  65,  65,  65,  65,  65,  65,  65,  65,  65,  65,  65,
+     65,  65,  65,  65,  65,  65,  65,  65,  65,  65,  65,  65,  65,  65,  65,  65,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+    130, 130,  98,  98, 130, 130,  99,  99, 130, 130,  98,  98, 130, 130, 131, 131,
+    130, 130,  98,  98, 130, 130,  99,  99, 130, 130,  98,  98, 130, 130, 132, 132,
+     72,  72, 130, 130,  98,  98, 130, 130,  99,  99, 130, 130,  98,  98, 130, 130,
+    131, 131, 130, 130,  98,  98, 130, 130,  99,  99, 130, 130,  98,  98, 130, 130,
+    132, 132,  72,  72,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0
+};
+
+static RE_AllCases re_all_cases_table_4[] = {
+    {    0,     0,     0},
+    {   32,     0,     0},
+    {   32,   304,     0},
+    {   32,  8490,     0},
+    {   32,   383,     0},
+    {   32,  8491,     0},
+    {   32,   976,     0},
+    {   32,  1013,     0},
+    {   32,   977,  1012},
+    {  252,   921,  8126},
+    {   32,  1008,     0},
+    {  777,   924,     0},
+    {   32,  7296,     0},
+    {   32,  7297,     0},
+    {   32,  7298,     0},
+    {  376,     0,     0},
+    {    1,     0,     0},
+    {   14,   456,     0},
+    {    2,   498,     0},
+    {   96,   962,     0},
+    {    1,  7303,     0},
+    {    1,  7835,     0},
+    {47811, 42570,     0},
+    {    3,     0,     0},
+    {    2,   453,     0},
+    {    7,     0,     0},
+    {    6,   459,     0},
+    {  127,     0,     0},
+    {   15,     0,     0},
+    {  391,     0,     0},
+    {  978,     0,     0},
+    {  991,     0,     0},
+    {  989,     0,     0},
+    {   83,     0,     0},
+    {  982,     0,     0},
+    {  971,     0,     0},
+    { 1011,     0,     0},
+    { 1015,     0,     0},
+    { 1023,     0,     0},
+    { 1007,     0,     0},
+    { 1002,     0,     0},
+    {  806,     0,     0},
+    {  810,     0,     0},
+    {   31,     0,     0},
+    {  827,     0,     0},
+    {  825,     0,     0},
+    {  805,     0,     0},
+    {   99,     0,     0},
+    {   72,     0,     0},
+    {  958,     0,     0},
+    {11871,     0,     0},
+    {  935,     0,     0},
+    {11864,     0,     0},
+    {  963,     0,     0},
+    {  205,     0,     0},
+    {  201,     0,     0},
+    {  140,     0,     0},
+    {   42,     0,     0},
+    {   37,     0,     0},
+    {   39,     0,     0},
+    {   64,     0,     0},
+    {   67,     0,     0},
+    {   65,     0,     0},
+    {   96,   982,     0},
+    {   96,  1009,     0},
+    {   96,     0,     0},
+    {   96,   981,     0},
+    {   96,  8486,     0},
+    {   96,  7299,     0},
+    {   96,  7300,  7301},
+    {   96,  7302,     0},
+    {   24,     0,     0},
+    {   98,     0,     0},
+    {   48,     0,     0},
+    {   11,     0,     0},
+    {  134,     0,     0},
+    {  130,     0,     0},
+    {   80,     0,     0},
+    {  208,     0,     0},
+    {15776,     0,     0},
+    {15840,     0,     0},
+    {    8,     0,     0},
+    { 3136,     0,     0},
+    { 7745,     0,     0},
+    {  202,     0,     0},
+    {  186,     0,     0},
+    {  190,     0,     0},
+    {  172,     0,     0},
+    {  144,     0,     0},
+    {    9,     0,     0},
+    {  128,     0,     0},
+    {  124,     0,     0},
+    {   16,     0,     0},
+    {  102,     0,     0},
+    {  106,     0,     0},
+    {  110,     0,     0},
+    {   26,     0,     0},
+    {   30,     0,     0},
+    {   38,     0,     0},
+    {   46,     0,     0},
+    {  112,     0,     0},
+    {11785,     0,     0},
+    {12574,     0,     0},
+    {11801,     0,     0},
+    {11836,     0,     0},
+    {11807,     0,     0},
+    {11839,     0,     0},
+    {11810,     0,     0},
+    {11841,     0,     0},
+    {47620,     0,     0},
+    {42472,     0,     0},
+    {42444,     0,     0},
+    {42487,     0,     0},
+    {42445,     0,     0},
+    {42433,     0,     0},
+    {42436,     0,     0},
+    {42286,     0,     0},
+    {42294,     0,     0},
+    {42287,     0,     0},
+    { 3296,     0,     0},
+    {42311,     0,     0},
+    {47688,     0,     0},
+    {47312,     0,     0},
+    {47152,     0,     0},
+    {47184,     0,     0},
+    {47216,     0,     0},
+    {   40,     0,     0},
+    {   56,     0,     0},
+    {   88,     0,     0},
+    {  104,     0,     0},
+    {   34,     0,     0},
+    {   62,     0,     0},
+    {   94,     0,     0},
+    {  345,     0,     0},
+    {   32,   305,     0},
+    { 8545,   107,     0},
+    {  300,   115,     0},
+    { 8686,   229,     0},
+    {   66,   946,     0},
+    {   96,   949,     0},
+    {   73,   952,  1012},
+    {  108,   952,   977},
+    {  220,   953,  8126},
+    { 7419,   921,   953},
+    {  106,   954,     0},
+    {  809,   956,     0},
+    { 6290,  1074,     0},
+    { 6293,  1076,     0},
+    { 6300,  1086,     0},
+    {   15,   457,     0},
+    {    3,   499,     0},
+    {   97,   963,     0},
+    { 6373,  1123,     0},
+    {  251,  7777,     0},
+    {47810, 42571,     0},
+    {    1,   454,     0},
+    {    1,   460,     0},
+    {  118,   960,     0},
+    {   80,   961,     0},
+    {  115,   966,     0},
+    { 8847,   969,     0},
+    { 6306,  1089,     0},
+    { 6310,  1090,  7301},
+    { 6311,  1090,  7300},
+    { 6316,  1098,     0}
+};
+
+int re_get_all_cases(RE_UINT32 codepoint, RE_UINT32* cases) {
+    RE_UINT32 field_2;
+    RE_UINT32 field_1;
+    RE_UINT32 field_0;
+    RE_UINT32 v;
+
+    field_2 = codepoint >> 10;
+    field_1 = (codepoint >> 5) & 0x1F;
+    field_0 = codepoint & 0x1F;
+
+    v = re_all_cases_table_1[field_2];
+    v = re_all_cases_table_2[(v << 5) | field_1];
+    v = re_all_cases_table_3[(v << 5) | field_0];
+
+    cases[0] = codepoint;
+
+    if (re_all_cases_table_4[v].delta == 0)
+        return 1;
+
+    cases[1] = codepoint ^ re_all_cases_table_4[v].delta;
+
+    if (re_all_cases_table_4[v].others[0] == 0)
+        return 2;
+
+    cases[2] = re_all_cases_table_4[v].others[0];
+
+    if (re_all_cases_table_4[v].others[1] == 0)
+        return 3;
+
+    cases[3] = re_all_cases_table_4[v].others[1];
+
+    return 4;
 }
 
-/* Simple_Case_Folding. */
+/* Simple case folding. */
+static RE_UINT8 re_simple_folding_table_1[] = {
+     0,  1,  2,  2,  3,  2,  2,  4,  5,  6,  2,  7,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  8,  9,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2, 10,
+     2, 11,  2, 12,  2,  2, 13,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2, 14,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2, 15,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2
+};
 
-static RE_UINT8 re_simple_case_folding_stage_1[] = {
-    0, 1, 2, 2, 2, 3, 2, 4, 5, 2, 2, 6, 2, 2, 2, 7,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2,
+static RE_UINT8 re_simple_folding_table_2[] = {
+     0,  0,  1,  0,  0,  2,  3,  0,  4,  5,  6,  7,  8,  9, 10, 11,
+     4, 12, 13,  0,  0,  0,  0,  0,  0,  0, 14, 15, 16, 17, 18, 19,
+    20, 21,  0,  4, 22,  4, 23,  4,  4, 24, 25,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0, 26, 27,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 28,
+     0,  0,  0,  0, 29, 30,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     4,  4,  4,  4, 31,  4,  4,  4, 32, 33, 34, 35, 33, 36, 37, 38,
+     0,  0,  0,  0,  0,  0,  0,  0,  0, 39,  0, 40, 41,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0, 42, 43,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    44, 45,  0, 46,  4,  4,  4, 47,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  4, 48, 49,  0,  0,  0,  0, 50,  4, 51, 52, 53, 54, 55,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 56, 57, 58,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0, 59,  0,  0,  0,  0,  0,  0,
+    60, 61,  0,  0,  0, 62, 63,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0, 64, 65,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0, 66,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0, 67,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0, 68, 69,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0
 };
 
-static RE_UINT8 re_simple_case_folding_stage_2[] = {
-     0,  1,  2,  3,  4,  5,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,
-     7,  6,  6,  8,  6,  6,  6,  6,  6,  6,  6,  6,  9,  6, 10, 11,
-     6, 12,  6,  6, 13,  6,  6,  6,  6,  6,  6,  6, 14,  6,  6,  6,
-     6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,
-     6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,
-     6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,
-     6,  6,  6,  6,  6,  6, 15, 16,  6,  6,  6, 17,  6,  6,  6,  6,
-     6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,
-     6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,
-     6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6, 18,
-     6,  6,  6,  6, 19,  6,  6,  6,  6,  6,  6,  6, 20,  6,  6,  6,
-     6,  6,  6,  6,  6,  6,  6,  6, 21,  6,  6,  6,  6,  6,  6,  6,
-     6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6, 22,  6,
-     6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,
-     6,  6,  6,  6,  6,  6,  6,  6,  6, 23,  6,  6,  6,  6,  6,  6,
-     6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,
+static RE_UINT8 re_simple_folding_table_3[] = {
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,  18,  18,  18,  18,  18,  18,  18,  18,  66,  18,  18,  18,  18,  18,  18,
+     18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,  68,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,
+     18,  18,  18,  18,  18,  18,  18,   0,  18,  18,  18,  18,  18,  18,  18,   0,
+      1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,
+      1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,
+      1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,
+     65,   0,   1,   0,   1,   0,   1,   0,   0,   3,   0,   5,   0,   3,   0,  49,
+      0,   3,   0,   5,   0,   3,   0,  10,   0,   0,   1,   0,   1,   0,   1,   0,
+      1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,
+      1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,
+      1,   0,   1,   0,   1,   0,   1,   0,  67,   3,   0,   5,   0,   3,   0,  64,
+      0,  78,   1,   0,   1,   0,  78,  10,   0,  81,  80,   5,   0,   0,  36,  79,
+     77,   3,   0,  84,  85,   0,  86,  86,   1,   0,   0,   0,  84,  83,   0,  82,
+      1,   0,   1,   0,   1,   0,  70,  10,   0,  71,   0,   0,   1,   0,  70,  17,
+      0,  73,  72,   5,   0,   3,   0,  69,   1,   0,   0,   0,   1,   0,   0,   0,
+      0,   0,   0,   0,   2,   3,   0,   9,   1,   0,   4,   5,   0,   3,   0,  17,
+      0,   3,   0,   5,   0,   3,   0,  10,   0,   3,   0,   5,   0,   0,   1,   0,
+      1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,
+      0,   2,   1,   0,   1,   0,  41,  32,   1,   0,   1,   0,   1,   0,   1,   0,
+     75,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,
+      1,   0,   1,   0,   0,   0,   0,   0,   0,   0, 110,   5,   0,  74, 109,   0,
+      0,   3,   0,  76,  60,  58,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,  63,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      1,   0,   1,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,  53,
+      0,   0,   0,   0,   0,   0,  24,   0,  20,  22,  20,   0,  29,   0,  31,  30,
+      0,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,
+     39,  39,   0,  39,  39,  39,  39,  39,  39,  39,  39,  39,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  14,
+     40,  44,   0,   0,   0,  12,  13,   0,   1,   0,   1,   0,   1,   0,   1,   0,
+      1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,
+     33,  26,   0,   0,  34,  29,   0,  10,   0,   8,   1,   0,   0,  52,  51,  51,
+     35,  35,  35,  35,  35,  35,  35,  35,  35,  35,  35,  35,  35,  35,  35,  35,
+     18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,
+     39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   1,   0,   1,   0,
+      1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,
+     10,   3,   0,   5,   0,   3,   0,  10,   0,   3,   0,   5,   0,   3,   0,   0,
+      1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,
+      1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,
+      0,  35,  35,  35,  35,  35,  35,  35,  35,  35,  35,  35,  35,  35,  35,  35,
+     26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
+     61,  61,  61,  61,  61,  61,  61,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112,
+    112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112,
+    113, 113, 113, 113, 113, 113,   0, 113,   0,   0,   0,   0,   0, 113,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   6,   6,   6,   6,   6,   6,   0,   0,
+     89,  90,  91,  92,  93,  94,  95,  96, 130,   0,   0,   0,   0,   0,   0,   0,
+     87,  87,  87,  87,  87,  87,  87,  87,  87,  87,  87,  87,  87,  87,  87,  87,
+     87,  87,  87,  87,  87,  87,  87,  87,  87,  87,  87,  87,  87,  87,  87,  87,
+     87,  87,  87,  87,  87,  87,  87,  87,  87,  87,  87,   0,   0,  87,  87,  87,
+      1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,
+      1,   0,   1,   0,   1,   0,   0,   0,   0,   0,   0,  62,   0,   0,  98,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   6,   6,   6,   6,   6,   6,   6,   6,
+      0,   0,   0,   0,   0,   0,   0,   0,   6,   6,   6,   6,   6,   6,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   6,   6,   6,   6,   6,   6,   6,   6,
+      0,   0,   0,   0,   0,   0,   0,   0,   6,   6,   6,   6,   6,   6,   6,   6,
+      0,   0,   0,   0,   0,   0,   0,   0,   6,   6,   6,   6,   6,   6,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   6,   0,   6,   0,   6,   0,   6,
+      0,   0,   0,   0,   0,   0,   0,   0,   6,   6,   6,   6,   6,   6,   6,   6,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   6,   6,   6,   6,   6,   6,   6,   6,
+      0,   0,   0,   0,   0,   0,   0,   0,   6,   6,  59,  59,  10,   0,  97,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,  56,  56,  57,  57,  10,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   6,   6,  55,  55,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   6,   6,  54,  54,   7,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,  50,  50,  52,  52,  10,   0,   0,   0,
+      0,   0,   0,   0,   0,   0, 101,   0,   0,   0,  99, 100,   0,   0,   0,   0,
+      0,   0,  48,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   5,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,  42,  42,  45,  45,  46,  46,  45,  45,  42,  42,
+     15,  15,  16,  16,  15,  15,  21,  21,  24,  24,  25,  25,  24,  24,  21,  21,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
+     35,  35,  35,  35,  35,  35,  35,  35,  35,  35,  35,  35,  35,  35,  35,  35,
+     47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      1,   0, 102, 111, 103,   0,   0,  10,   0,   3,   0,   5,   0, 106, 104, 107,
+    105,   0,   1,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   0, 108, 107,
+      1,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   5,   0,   3,   0,   0,
+      0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,
+      1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   0,   0,   0,   0,
+      0,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,
+      0,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,
+      1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   5,   0, 128,   1,   0,
+      1,   0,   1,   0,   1,   0,   1,   0,   0,   0,   0,   5,   0, 122,   0,   0,
+      1,   0,   1,   0,   0,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,
+      1,   0,   1,   0,   1,   0,   1,   0,   1,   0, 120, 123, 121, 118, 119,   0,
+    114, 116, 115,  88,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,
+      0,   0,   1,   0,  35, 117, 129,  10,   0,   3,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+    124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+    125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+    126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+    125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+      0,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,
+     39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,   0,   0,   0,   0,   0,
+     23,  23,  23,  23,  23,  23,  23,  23,  27,  27,  27,  27,  27,  27,  27,  27,
+     23,  23,  23,  23,  23,  23,  23,  23,  37,  37,  37,  37,  37,  37,  37,  37,
+     43,  43,  43,  43,  43,  43,  43,  43,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     43,  43,  43,  43,  43,  43,  43,  43,  37,  37,  37,  37,  37,  37,  37,  37,
+     23,  23,  23,  23,  23,  23,  23,  23,  27,  27,  27,  27,  27,  27,  27,  27,
+     23,  23,  23,  23,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     29,  29,  29,  29,  29,  29,  29,  29,  29,  29,  29,  29,  29,  29,  29,  29,
+     29,  29,  29,  29,  29,  29,  29,  29,  29,  29,  29,  29,  29,  29,  29,  29,
+     29,  29,  29,  29,  29,  29,  29,  29,  29,  29,  29,  29,  29,  29,  29,  29,
+     29,  29,  29,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,
+     39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,
+     18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,
+     18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,
+     19,  19,  21,  21,  19,  19,  25,  25,  19,  19,  21,  21,  19,  19,  28,  28,
+     19,  19,  21,  21,  19,  19,  25,  25,  19,  19,  21,  21,  19,  19,  38,  38,
+     40,  40,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0
+};
+
+static RE_UINT16 re_simple_folding_table_4[] = {
+        0,     1,     2,     3,     6,     7,     8,     9,
+       11,    14,    15,    16,    19,    22,    24,    26,
+       30,    31,    32,    34,    37,    38,    39,    40,
+       42,    46,    48,    56,    62,    64,    65,    67,
+       72,    74,    76,    80,    83,    88,    94,    96,
+       98,    99,   102,   104,   105,   106,   110,   112,
+      124,   127,   128,   130,   134,   140,   144,   172,
+      186,   190,   201,   202,   205,   208,   250,   252,
+      268,   345,   376,   391,   777,   805,   806,   810,
+      825,   827,   935,   958,   963,   971,   978,   982,
+      989,   991,  1002,  1007,  1011,  1015,  1023,  3136,
+     3296,  6322,  6325,  6332,  6338,  6342,  6343,  6348,
+     6372,  7175,  7745,  8513,  8654,  8943, 11785, 11801,
+    11807, 11810, 11836, 11839, 11841, 11864, 11871, 12574,
+    15776, 15840, 42286, 42287, 42294, 42311, 42433, 42436,
+    42444, 42445, 42472, 42487, 47152, 47184, 47216, 47312,
+    47620, 47688, 47811
+};
+
+RE_UINT32 re_get_simple_case_folding(RE_UINT32 codepoint) {
+    RE_UINT32 field_2;
+    RE_UINT32 field_1;
+    RE_UINT32 field_0;
+    RE_UINT32 v;
+
+    field_2 = codepoint >> 10;
+    field_1 = (codepoint >> 5) & 0x1F;
+    field_0 = codepoint & 0x1F;
+
+    v = re_simple_folding_table_1[field_2];
+    v = re_simple_folding_table_2[(v << 5) | field_1];
+    v = re_simple_folding_table_3[(v << 5) | field_0];
+
+    return codepoint ^ re_simple_folding_table_4[v];
+}
+
+/* Full case folding. */
+static RE_UINT8 re_full_folding_table_1[] = {
+     0,  1,  2,  2,  3,  2,  2,  4,  5,  6,  2,  7,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  8,  9,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2, 10, 11,
+     2, 12,  2, 13,  2,  2, 14,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2, 15,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2, 16,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2
 };
 
-static RE_UINT8 re_simple_case_folding_stage_3[] = {
-     0,  0,  0,  0,  0,  0,  0,  0,  1,  2,  2,  3,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0,  4,  0,  2,  2,  5,  5,  0,  0,  0,  0,
-     6,  6,  6,  6,  6,  6,  7,  8,  8,  7,  6,  6,  6,  6,  6,  9,
-    10, 11, 12, 13, 14, 15, 16, 17, 18, 19,  8, 20,  6,  6, 21,  6,
-     6,  6,  6,  6, 22,  6, 23, 24, 25,  6,  0,  0,  0,  0,  0,  0,
+static RE_UINT8 re_full_folding_table_2[] = {
+     0,  0,  1,  0,  0,  2,  3,  0,  4,  5,  6,  7,  8,  9, 10, 11,
+     4, 12, 13,  0,  0,  0,  0,  0,  0,  0, 14, 15, 16, 17, 18, 19,
+    20, 21,  0,  4, 22,  4, 23,  4,  4, 24, 25,  0, 26,  0,  0,  0,
      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0,  0,  0, 26,  0,  0,  0,  0,  0, 27, 28,
-    29, 30,  1,  2, 31, 32,  0,  0, 33, 34, 35,  6,  6,  6, 36, 37,
-    38, 38,  2,  2,  2,  2,  0,  0,  0,  0,  0,  0,  6,  6,  6,  6,
-    39,  7,  6,  6,  6,  6,  6,  6, 40, 41,  6,  6,  6,  6,  6,  6,
-     6,  6,  6,  6,  6,  6, 42, 43, 43, 43, 44,  0,  0,  0,  0,  0,
      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0, 27, 28,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 29,
+     0,  0,  0,  0, 30, 31,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     4,  4,  4,  4, 32,  4,  4,  4, 33, 34, 35, 36, 37, 38, 39, 40,
+     0,  0,  0,  0,  0,  0,  0,  0,  0, 41,  0, 42, 43,  0,  0,  0,
      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0, 44, 45,  0,  0,  0,  0,  0,  0,  0,  0,  0,
      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0, 45, 45, 45, 45, 46, 47,  0,  0,  0,  0,  0,  0,
+    46, 47,  0, 48,  4,  4,  4, 49,  0,  0,  0,  0,  0,  0,  0,  0,
      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 48,
      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    49, 50, 51, 51, 51, 51, 51, 52,  0,  0,  0,  0,  0,  0,  0,  0,
-     6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,
-     6,  6, 53, 54,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,
-     0, 55,  0, 48,  0, 55,  0, 55,  0, 48,  0, 56,  0, 55,  0,  0,
-     0, 55,  0, 55,  0, 55,  0, 57,  0, 58,  0, 59,  0, 60,  0, 61,
-     0,  0,  0,  0, 62, 63, 64,  0,  0,  0,  0,  0, 65, 65,  0,  0,
-    66,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  4, 50, 51,  0,  0,  0,  0, 52,  4, 53, 54, 55, 56, 57,
      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0, 67, 68, 68, 68,  0,  0,  0,  0,  0,  0,
-    43, 43, 43, 43, 43, 44,  0,  0,  0,  0,  0,  0, 69, 70, 71, 72,
-     6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6, 23, 73, 33,  0,
-     0,  0,  0,  0,  0,  0,  0,  0,  6,  6,  6,  6,  6, 53,  0,  0,
-     6,  6,  6, 23,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  7,  6,  7,  6,  6,  6,  6,  6,  6,  6,  0, 74,
-     6, 75, 27,  6,  6, 76, 77,  6, 78,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 79, 79,
-    79, 79, 79, 79, 79, 79, 79, 79,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  1,  2,  2,  3,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 58, 59, 60,  0,  0,
      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    80, 80, 80, 80, 80,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0, 80, 80, 80, 80, 81,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0, 61,  0,  0,  0,  0,  0,  0,  0,
      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    82, 82, 82, 82, 82, 82, 83,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0, 62,  0,  0,  0,  0,  0,  0,
+    63, 64,  0,  0,  0, 65, 66,  0,  0,  0,  0,  0,  0,  0,  0,  0,
      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  2,  2,  2,  2,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0,  0,  0,  2,  2,  2,  2,  0,  0,  0,  0,
+     0,  0,  0,  0, 67, 68,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    84, 84, 84, 84, 85,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0, 69,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0, 70,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0, 71, 72,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0
 };
 
-static RE_UINT8 re_simple_case_folding_stage_4[] = {
-     0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  1,  1,  1,  1,  1,  1,
-     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  2,  0,  0,  1,  1,  1,  1,  1,  1,  1,  0,
-     3,  0,  3,  0,  3,  0,  3,  0,  0,  0,  3,  0,  3,  0,  3,  0,
-     0,  3,  0,  3,  0,  3,  0,  3,  4,  3,  0,  3,  0,  3,  0,  5,
-     0,  6,  3,  0,  3,  0,  7,  3,  0,  8,  8,  3,  0,  0,  9, 10,
-    11,  3,  0,  8, 12,  0, 13, 14,  3,  0,  0,  0, 13, 15,  0, 16,
-     3,  0,  3,  0,  3,  0, 17,  3,  0, 17,  0,  0,  3,  0, 17,  3,
-     0, 18, 18,  3,  0,  3,  0, 19,  3,  0,  0,  0,  3,  0,  0,  0,
-     0,  0,  0,  0, 20,  3,  0, 20,  3,  0, 20,  3,  0,  3,  0,  3,
-     0,  3,  0,  3,  0,  0,  3,  0,  0, 20,  3,  0,  3,  0, 21, 22,
-    23,  0,  3,  0,  3,  0,  3,  0,  3,  0,  3,  0,  0,  0,  0,  0,
-     0,  0, 24,  3,  0, 25, 26,  0,  0,  3,  0, 27, 28, 29,  3,  0,
-     0,  0,  0,  0,  0, 30,  0,  0,  3,  0,  3,  0,  0,  0,  3,  0,
-     0,  0,  0,  0,  0,  0,  0, 30,  0,  0,  0,  0,  0,  0, 31,  0,
-    32, 32, 32,  0, 33,  0, 34, 34,  1,  1,  0,  1,  1,  1,  1,  1,
-     1,  1,  1,  1,  0,  0,  0,  0,  0,  0,  3,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0,  0, 35, 36, 37,  0,  0,  0, 38, 39,  0,
-    40, 41,  0,  0, 42, 43,  0,  3,  0, 44,  3,  0,  0, 23, 23, 23,
-    45, 45, 45, 45, 45, 45, 45, 45,  3,  0,  0,  0,  0,  0,  0,  0,
-    46,  3,  0,  3,  0,  3,  0,  3,  0,  3,  0,  3,  0,  3,  0,  0,
-     0, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
-    47, 47, 47, 47, 47, 47, 47,  0, 48, 48, 48, 48, 48, 48, 48, 48,
-    48, 48, 48, 48, 48, 48,  0, 48,  0,  0,  0,  0,  0, 48,  0,  0,
-    49, 49, 49, 49, 49, 49,  0,  0, 50, 51, 52, 53, 53, 54, 55, 56,
-    57,  0,  0,  0,  0,  0,  0,  0, 58, 58, 58, 58, 58, 58, 58, 58,
-    58, 58, 58,  0,  0, 58, 58, 58,  3,  0,  3,  0,  3,  0,  0,  0,
-     0,  0,  0, 59,  0,  0, 60,  0, 49, 49, 49, 49, 49, 49, 49, 49,
-     0, 49,  0, 49,  0, 49,  0, 49, 49, 49, 61, 61, 62,  0, 63,  0,
-    64, 64, 64, 64, 62,  0,  0,  0, 49, 49, 65, 65,  0,  0,  0,  0,
-    49, 49, 66, 66, 44,  0,  0,  0, 67, 67, 68, 68, 62,  0,  0,  0,
-     0,  0,  0,  0,  0,  0, 69,  0,  0,  0, 70, 71,  0,  0,  0,  0,
-     0,  0, 72,  0,  0,  0,  0,  0, 73, 73, 73, 73, 73, 73, 73, 73,
-     0,  0,  0,  3,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 74, 74,
-    74, 74, 74, 74, 74, 74, 74, 74,  3,  0, 75, 76, 77,  0,  0,  3,
-     0,  3,  0,  3,  0, 78, 79, 80, 81,  0,  3,  0,  0,  3,  0,  0,
-     0,  0,  0,  0,  0,  0, 82, 82,  0,  0,  0,  3,  0,  3,  0,  0,
-     0,  3,  0,  3,  0, 83,  3,  0,  0,  0,  0,  3,  0, 84,  0,  0,
-     3,  0, 85, 86, 87, 88, 85,  0, 89, 90, 91, 92,  3,  0,  3,  0,
-     0,  0,  3,  0, 41, 93, 94,  0, 95, 95, 95, 95, 95, 95, 95, 95,
-    96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96,  0,  0,  0,  0,
-    33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33,  0,  0,  0,  0,  0,
-    97, 97, 97, 97, 97, 97, 97, 97, 97, 97,  0,  0,  0,  0,  0,  0,
-};
-
-/* Simple_Case_Folding: 1848 bytes. */
-
-static RE_INT32 re_simple_case_folding_table[] = {
-         0,
-        32,
-       775,
-         1,
-      -121,
-      -268,
-       210,
-       206,
-       205,
-        79,
-       202,
-       203,
-       207,
-       211,
-       209,
-       213,
-       214,
-       218,
-       217,
-       219,
-         2,
-       -97,
-       -56,
-      -130,
-     10795,
-      -163,
-     10792,
-      -195,
-        69,
-        71,
-       116,
-        38,
-        37,
-        64,
-        63,
-         8,
-       -30,
-       -25,
-       -15,
-       -22,
-       -54,
-       -48,
-       -60,
-       -64,
-        -7,
-        80,
-        15,
-        48,
-      7264,
-        -8,
-     -6222,
-     -6221,
-     -6212,
-     -6210,
-     -6211,
-     -6204,
-     -6180,
-     35267,
-     -3008,
-       -58,
-     -7615,
-       -74,
-        -9,
-     -7173,
-       -86,
-      -100,
-      -112,
-      -128,
-      -126,
-     -7517,
-     -8383,
-     -8262,
-        28,
-        16,
-        26,
-    -10743,
-     -3814,
-    -10727,
-    -10780,
-    -10749,
-    -10783,
-    -10782,
-    -10815,
-    -35332,
-    -42280,
-    -42308,
-    -42319,
-    -42315,
-    -42305,
-    -42258,
-    -42282,
-    -42261,
-       928,
-    -42307,
-    -35384,
-    -38864,
-        40,
-        34,
-};
-
-/* Simple_Case_Folding: 392 bytes. */
-
-RE_UINT32 re_get_simple_case_folding(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-    RE_INT32 diff;
-
-    f = ch >> 13;
-    code = ch ^ (f << 13);
-    pos = (RE_UINT32)re_simple_case_folding_stage_1[f] << 5;
-    f = code >> 8;
-    code ^= f << 8;
-    pos = (RE_UINT32)re_simple_case_folding_stage_2[pos + f] << 5;
-    f = code >> 3;
-    code ^= f << 3;
-    pos = (RE_UINT32)re_simple_case_folding_stage_3[pos + f] << 3;
-    value = re_simple_case_folding_stage_4[pos + code];
-
-    diff = re_simple_case_folding_table[value];
-
-    return (RE_UINT32)((RE_INT32)ch + diff);
-}
-
-/* Full_Case_Folding. */
-
-static RE_UINT8 re_full_case_folding_stage_1[] = {
-    0, 1, 2, 2, 2, 3, 2, 4, 5, 2, 2, 6, 2, 2, 2, 7,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2,
-};
-
-static RE_UINT8 re_full_case_folding_stage_2[] = {
-     0,  1,  2,  3,  4,  5,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,
-     7,  6,  6,  8,  6,  6,  6,  6,  6,  6,  6,  6,  9,  6, 10, 11,
-     6, 12,  6,  6, 13,  6,  6,  6,  6,  6,  6,  6, 14,  6,  6,  6,
-     6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,
-     6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,
-     6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,
-     6,  6,  6,  6,  6,  6, 15, 16,  6,  6,  6, 17,  6,  6,  6,  6,
-     6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,
-     6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,
-     6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6, 18,  6,  6,  6, 19,
-     6,  6,  6,  6, 20,  6,  6,  6,  6,  6,  6,  6, 21,  6,  6,  6,
-     6,  6,  6,  6,  6,  6,  6,  6, 22,  6,  6,  6,  6,  6,  6,  6,
-     6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6, 23,  6,
-     6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,
-     6,  6,  6,  6,  6,  6,  6,  6,  6, 24,  6,  6,  6,  6,  6,  6,
-     6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,
-};
-
-static RE_UINT8 re_full_case_folding_stage_3[] = {
-      0,   0,   0,   0,   0,   0,   0,   0,   1,   2,   2,   3,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   4,   0,   2,   2,   5,   6,   0,   0,   0,   0,
-      7,   7,   7,   7,   7,   7,   8,   9,   9,  10,   7,   7,   7,   7,   7,  11,
-     12,  13,  14,  15,  16,  17,  18,  19,  20,  21,   9,  22,   7,   7,  23,   7,
-      7,   7,   7,   7,  24,   7,  25,  26,  27,   7,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,  28,   0,   0,   0,   0,   0,  29,  30,
-     31,  32,  33,   2,  34,  35,  36,   0,  37,  38,  39,   7,   7,   7,  40,  41,
-     42,  42,   2,   2,   2,   2,   0,   0,   0,   0,   0,   0,   7,   7,   7,   7,
-     43,  44,   7,   7,   7,   7,   7,   7,  45,  46,   7,   7,   7,   7,   7,   7,
-      7,   7,   7,   7,   7,   7,  47,  48,  48,  48,  49,   0,   0,   0,   0,   0,
-     50,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,  51,  51,  51,  51,  52,  53,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  54,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     55,  56,  57,  57,  57,  57,  57,  58,   0,   0,   0,   0,   0,   0,   0,   0,
-      7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
-      7,   7,  59,  60,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
-      0,  61,   0,  54,   0,  61,   0,  61,   0,  54,  62,  63,   0,  61,   0,   0,
-     64,  65,  66,  67,  68,  69,  70,  71,  72,  73,  74,  75,  76,  77,  78,  79,
-      0,   0,   0,   0,  80,  81,  82,   0,   0,   0,   0,   0,  83,  83,   0,   0,
-     84,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,  85,  86,  86,  86,   0,   0,   0,   0,   0,   0,
-     48,  48,  48,  48,  48,  49,   0,   0,   0,   0,   0,   0,  87,  88,  89,  90,
-      7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,  25,  91,  37,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   7,   7,   7,   7,   7,  92,   0,   0,
-      7,   7,   7,  25,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,  44,   7,  44,   7,   7,   7,   7,   7,   7,   7,   0,  93,
-      7,  94,  29,   7,   7,  95,  96,   7,  97,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  98,  98,
-     98,  98,  98,  98,  98,  98,  98,  98,   0,   0,   0,   0,   0,   0,   0,   0,
-     99,   0, 100,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+static RE_UINT8 re_full_folding_table_3[] = {
       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   1,   2,   2,   3,   0,   0,   0,   0,   0,   0,   0,   0,
       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-    101, 101, 101, 101, 101,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0, 101, 101, 101, 101, 102,   0,   0,   0,   0,   0,
+      0,  18,  18,  18,  18,  18,  18,  18,  18,  80,  18,  18,  18,  18,  18,  18,
+     18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,   0,   0,   0,   0,   0,
       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-    103, 103, 103, 103, 103, 103, 104,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   2,   2,   2,   2,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   2,   2,   2,   2,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-    105, 105, 105, 105, 106,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-};
-
-static RE_UINT8 re_full_case_folding_stage_4[] = {
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   2,   0,   0,   1,   1,   1,   1,   1,   1,   1,   0,
-      1,   1,   1,   1,   1,   1,   1,   3,   4,   0,   4,   0,   4,   0,   4,   0,
-      5,   0,   4,   0,   4,   0,   4,   0,   0,   4,   0,   4,   0,   4,   0,   4,
-      0,   6,   4,   0,   4,   0,   4,   0,   7,   4,   0,   4,   0,   4,   0,   8,
-      0,   9,   4,   0,   4,   0,  10,   4,   0,  11,  11,   4,   0,   0,  12,  13,
-     14,   4,   0,  11,  15,   0,  16,  17,   4,   0,   0,   0,  16,  18,   0,  19,
-      4,   0,   4,   0,   4,   0,  20,   4,   0,  20,   0,   0,   4,   0,  20,   4,
-      0,  21,  21,   4,   0,   4,   0,  22,   4,   0,   0,   0,   4,   0,   0,   0,
-      0,   0,   0,   0,  23,   4,   0,  23,   4,   0,  23,   4,   0,   4,   0,   4,
-      0,   4,   0,   4,   0,   0,   4,   0,  24,  23,   4,   0,   4,   0,  25,  26,
-     27,   0,   4,   0,   4,   0,   4,   0,   4,   0,   4,   0,   0,   0,   0,   0,
-      0,   0,  28,   4,   0,  29,  30,   0,   0,   4,   0,  31,  32,  33,   4,   0,
-      0,   0,   0,   0,   0,  34,   0,   0,   4,   0,   4,   0,   0,   0,   4,   0,
-      0,   0,   0,   0,   0,   0,   0,  34,   0,   0,   0,   0,   0,   0,  35,   0,
-     36,  36,  36,   0,  37,   0,  38,  38,  39,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   0,   1,   1,   1,   1,   1,   1,   1,   1,   1,   0,   0,   0,   0,
-     40,   0,   0,   0,   0,   0,   0,   0,   0,   0,   4,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,  41,  42,  43,   0,   0,   0,  44,  45,   0,
-     46,  47,   0,   0,  48,  49,   0,   4,   0,  50,   4,   0,   0,  27,  27,  27,
-     51,  51,  51,  51,  51,  51,  51,  51,   4,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   4,   0,   4,   0,   4,   0,  52,   4,   0,   4,   0,   4,   0,   4,
-      0,   4,   0,   4,   0,   4,   0,   0,   0,  53,  53,  53,  53,  53,  53,  53,
-     53,  53,  53,  53,  53,  53,  53,  53,  53,  53,  53,  53,  53,  53,  53,   0,
-      0,   0,   0,   0,   0,   0,   0,  54,  55,  55,  55,  55,  55,  55,  55,  55,
-     55,  55,  55,  55,  55,  55,   0,  55,   0,   0,   0,   0,   0,  55,   0,   0,
-     56,  56,  56,  56,  56,  56,   0,   0,  57,  58,  59,  60,  60,  61,  62,  63,
-     64,   0,   0,   0,   0,   0,   0,   0,  65,  65,  65,  65,  65,  65,  65,  65,
-     65,  65,  65,   0,   0,  65,  65,  65,   4,   0,   4,   0,   4,   0,  66,  67,
-     68,  69,  70,  71,   0,   0,  72,   0,  56,  56,  56,  56,  56,  56,  56,  56,
-     73,   0,  74,   0,  75,   0,  76,   0,   0,  56,   0,  56,   0,  56,   0,  56,
-     77,  77,  77,  77,  77,  77,  77,  77,  78,  78,  78,  78,  78,  78,  78,  78,
-     79,  79,  79,  79,  79,  79,  79,  79,  80,  80,  80,  80,  80,  80,  80,  80,
-     81,  81,  81,  81,  81,  81,  81,  81,  82,  82,  82,  82,  82,  82,  82,  82,
-      0,   0,  83,  84,  85,   0,  86,  87,  56,  56,  88,  88,  89,   0,  90,   0,
-      0,   0,  91,  92,  93,   0,  94,  95,  96,  96,  96,  96,  97,   0,   0,   0,
-      0,   0,  98,  99,   0,   0, 100, 101,  56,  56, 102, 102,   0,   0,   0,   0,
-      0,   0, 103, 104, 105,   0, 106, 107,  56,  56, 108, 108,  50,   0,   0,   0,
-      0,   0, 109, 110, 111,   0, 112, 113, 114, 114, 115, 115, 116,   0,   0,   0,
-      0,   0,   0,   0,   0,   0, 117,   0,   0,   0, 118, 119,   0,   0,   0,   0,
-      0,   0, 120,   0,   0,   0,   0,   0, 121, 121, 121, 121, 121, 121, 121, 121,
-      0,   0,   0,   4,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 122, 122,
-    122, 122, 122, 122, 122, 122, 122, 122,   4,   0, 123, 124, 125,   0,   0,   4,
-      0,   4,   0,   4,   0, 126, 127, 128, 129,   0,   4,   0,   0,   4,   0,   0,
-      0,   0,   0,   0,   0,   0, 130, 130,   0,   0,   0,   4,   0,   4,   0,   0,
-      4,   0,   4,   0,   4,   0,   0,   0,   0,   4,   0,   4,   0, 131,   4,   0,
-      0,   0,   0,   4,   0, 132,   0,   0,   4,   0, 133, 134, 135, 136, 133,   0,
-    137, 138, 139, 140,   4,   0,   4,   0,   0,   0,   4,   0,  47, 141, 142,   0,
-    143, 143, 143, 143, 143, 143, 143, 143, 144, 145, 146, 147, 148, 149, 150,   0,
-      0,   0,   0, 151, 152, 153, 154, 155, 156, 156, 156, 156, 156, 156, 156, 156,
-    156, 156, 156, 156,   0,   0,   0,   0,  37,  37,  37,  37,  37,  37,  37,  37,
-     37,  37,  37,   0,   0,   0,   0,   0, 157, 157, 157, 157, 157, 157, 157, 157,
-    157, 157,   0,   0,   0,   0,   0,   0,
-};
-
-/* Full_Case_Folding: 2048 bytes. */
-
-static RE_FullCaseFolding re_full_case_folding_table[] = {
-    {     0, {   0,   0}},
-    {    32, {   0,   0}},
-    {   775, {   0,   0}},
-    {  -108, { 115,   0}},
-    {     1, {   0,   0}},
-    {  -199, { 775,   0}},
-    {   371, { 110,   0}},
-    {  -121, {   0,   0}},
-    {  -268, {   0,   0}},
-    {   210, {   0,   0}},
-    {   206, {   0,   0}},
-    {   205, {   0,   0}},
-    {    79, {   0,   0}},
-    {   202, {   0,   0}},
-    {   203, {   0,   0}},
-    {   207, {   0,   0}},
-    {   211, {   0,   0}},
-    {   209, {   0,   0}},
-    {   213, {   0,   0}},
-    {   214, {   0,   0}},
-    {   218, {   0,   0}},
-    {   217, {   0,   0}},
-    {   219, {   0,   0}},
-    {     2, {   0,   0}},
-    {  -390, { 780,   0}},
-    {   -97, {   0,   0}},
-    {   -56, {   0,   0}},
-    {  -130, {   0,   0}},
-    { 10795, {   0,   0}},
-    {  -163, {   0,   0}},
-    { 10792, {   0,   0}},
-    {  -195, {   0,   0}},
-    {    69, {   0,   0}},
-    {    71, {   0,   0}},
-    {   116, {   0,   0}},
-    {    38, {   0,   0}},
-    {    37, {   0,   0}},
-    {    64, {   0,   0}},
-    {    63, {   0,   0}},
-    {    41, { 776, 769}},
-    {    21, { 776, 769}},
-    {     8, {   0,   0}},
-    {   -30, {   0,   0}},
-    {   -25, {   0,   0}},
-    {   -15, {   0,   0}},
-    {   -22, {   0,   0}},
-    {   -54, {   0,   0}},
-    {   -48, {   0,   0}},
-    {   -60, {   0,   0}},
-    {   -64, {   0,   0}},
-    {    -7, {   0,   0}},
-    {    80, {   0,   0}},
-    {    15, {   0,   0}},
-    {    48, {   0,   0}},
-    {   -34, {1410,   0}},
-    {  7264, {   0,   0}},
-    {    -8, {   0,   0}},
-    { -6222, {   0,   0}},
-    { -6221, {   0,   0}},
-    { -6212, {   0,   0}},
-    { -6210, {   0,   0}},
-    { -6211, {   0,   0}},
-    { -6204, {   0,   0}},
-    { -6180, {   0,   0}},
-    { 35267, {   0,   0}},
-    { -3008, {   0,   0}},
-    { -7726, { 817,   0}},
-    { -7715, { 776,   0}},
-    { -7713, { 778,   0}},
-    { -7712, { 778,   0}},
-    { -7737, { 702,   0}},
-    {   -58, {   0,   0}},
-    { -7723, { 115,   0}},
-    { -7051, { 787,   0}},
-    { -7053, { 787, 768}},
-    { -7055, { 787, 769}},
-    { -7057, { 787, 834}},
-    {  -128, { 953,   0}},
-    {  -136, { 953,   0}},
-    {  -112, { 953,   0}},
-    {  -120, { 953,   0}},
-    {   -64, { 953,   0}},
-    {   -72, { 953,   0}},
-    {   -66, { 953,   0}},
-    { -7170, { 953,   0}},
-    { -7176, { 953,   0}},
-    { -7173, { 834,   0}},
-    { -7174, { 834, 953}},
-    {   -74, {   0,   0}},
-    { -7179, { 953,   0}},
-    { -7173, {   0,   0}},
-    {   -78, { 953,   0}},
-    { -7180, { 953,   0}},
-    { -7190, { 953,   0}},
-    { -7183, { 834,   0}},
-    { -7184, { 834, 953}},
-    {   -86, {   0,   0}},
-    { -7189, { 953,   0}},
-    { -7193, { 776, 768}},
-    { -7194, { 776, 769}},
-    { -7197, { 834,   0}},
-    { -7198, { 776, 834}},
-    {  -100, {   0,   0}},
-    { -7197, { 776, 768}},
-    { -7198, { 776, 769}},
-    { -7203, { 787,   0}},
-    { -7201, { 834,   0}},
-    { -7202, { 776, 834}},
-    {  -112, {   0,   0}},
-    {  -118, { 953,   0}},
-    { -7210, { 953,   0}},
-    { -7206, { 953,   0}},
-    { -7213, { 834,   0}},
-    { -7214, { 834, 953}},
-    {  -128, {   0,   0}},
-    {  -126, {   0,   0}},
-    { -7219, { 953,   0}},
-    { -7517, {   0,   0}},
-    { -8383, {   0,   0}},
-    { -8262, {   0,   0}},
-    {    28, {   0,   0}},
-    {    16, {   0,   0}},
-    {    26, {   0,   0}},
-    {-10743, {   0,   0}},
-    { -3814, {   0,   0}},
-    {-10727, {   0,   0}},
-    {-10780, {   0,   0}},
-    {-10749, {   0,   0}},
-    {-10783, {   0,   0}},
-    {-10782, {   0,   0}},
-    {-10815, {   0,   0}},
-    {-35332, {   0,   0}},
-    {-42280, {   0,   0}},
-    {-42308, {   0,   0}},
-    {-42319, {   0,   0}},
-    {-42315, {   0,   0}},
-    {-42305, {   0,   0}},
-    {-42258, {   0,   0}},
-    {-42282, {   0,   0}},
-    {-42261, {   0,   0}},
-    {   928, {   0,   0}},
-    {-42307, {   0,   0}},
-    {-35384, {   0,   0}},
-    {-38864, {   0,   0}},
-    {-64154, { 102,   0}},
-    {-64155, { 105,   0}},
-    {-64156, { 108,   0}},
-    {-64157, { 102, 105}},
-    {-64158, { 102, 108}},
-    {-64146, { 116,   0}},
-    {-64147, { 116,   0}},
-    {-62879, {1398,   0}},
-    {-62880, {1381,   0}},
-    {-62881, {1387,   0}},
-    {-62872, {1398,   0}},
-    {-62883, {1389,   0}},
-    {    40, {   0,   0}},
-    {    34, {   0,   0}},
-};
-
-/* Full_Case_Folding: 1264 bytes. */
-
-int re_get_full_case_folding(RE_UINT32 ch, RE_UINT32* codepoints) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-    RE_FullCaseFolding* case_folding;
-    int count;
-
-    f = ch >> 13;
-    code = ch ^ (f << 13);
-    pos = (RE_UINT32)re_full_case_folding_stage_1[f] << 5;
-    f = code >> 8;
-    code ^= f << 8;
-    pos = (RE_UINT32)re_full_case_folding_stage_2[pos + f] << 5;
-    f = code >> 3;
-    code ^= f << 3;
-    pos = (RE_UINT32)re_full_case_folding_stage_3[pos + f] << 3;
-    value = re_full_case_folding_stage_4[pos + code];
-
-    case_folding = &re_full_case_folding_table[value];
-
-    codepoints[0] = (RE_UINT32)((RE_INT32)ch + case_folding->diff);
-    count = 1;
-
-    while (count < RE_MAX_FOLDED && case_folding->codepoints[count - 1] != 0) {
-        codepoints[count] = case_folding->codepoints[count - 1];
-        ++count;
-    }
-
-    return count;
+      0,   0,   0,   0,   0,  83,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,
+     18,  18,  18,  18,  18,  18,  18,   0,  18,  18,  18,  18,  18,  18,  18,  61,
+      1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,
+      1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,
+      1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,
+     79,   0,   1,   0,   1,   0,   1,   0,   0,   3,   0,   5,   0,   3,   0,  51,
+      0,   3,   0,   5,   0,   3,   0,  10,   0, 100,   1,   0,   1,   0,   1,   0,
+      1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,
+      1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,
+      1,   0,   1,   0,   1,   0,   1,   0,  81,   3,   0,   5,   0,   3,   0,  77,
+      0,  93,   1,   0,   1,   0,  93,  10,   0,  96,  95,   5,   0,   0,  37,  94,
+     92,   3,   0,  99, 101,   0, 102, 102,   1,   0,   0,   0,  99,  98,   0,  97,
+      1,   0,   1,   0,   1,   0,  85,  10,   0,  86,   0,   0,   1,   0,  85,  17,
+      0,  88,  87,   5,   0,   3,   0,  84,   1,   0,   0,   0,   1,   0,   0,   0,
+      0,   0,   0,   0,   2,   3,   0,   9,   1,   0,   4,   5,   0,   3,   0,  17,
+      0,   3,   0,   5,   0,   3,   0,  10,   0,   3,   0,   5,   0,   0,   1,   0,
+      1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,
+     82,   2,   1,   0,   1,   0,  42,  33,   1,   0,   1,   0,   1,   0,   1,   0,
+     90,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,
+      1,   0,   1,   0,   0,   0,   0,   0,   0,   0, 158,   5,   0,  89, 157,   0,
+      0,   3,   0,  91,  72,  70,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,  76,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      1,   0,   1,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,  57,
+      0,   0,   0,   0,   0,   0,  25,   0,  20,  22,  20,   0,  30,   0,  32,  31,
+     24,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,
+     40,  40,   0,  40,  40,  40,  40,  40,  40,  40,  40,  40,   0,   0,   0,   0,
+     49,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  14,
+     41,  45,   0,   0,   0,  12,  13,   0,   1,   0,   1,   0,   1,   0,   1,   0,
+      1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,
+     34,  27,   0,   0,  35,  30,   0,  10,   0,   8,   1,   0,   0,  55,  54,  54,
+     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,
+     18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,
+     40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   1,   0,   1,   0,
+      1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,
+     10,   3,   0,   5,   0,   3,   0,  10,   0,   3,   0,   5,   0,   3,   0,   0,
+      1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,
+      1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,
+      0,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,
+     27,  27,  27,  27,  27,  27,  27,  27,  27,  27,  27,  27,  27,  27,  27,  27,
+     73,  73,  73,  73,  73,  73,  73,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,  74,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+    160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+    161, 161, 161, 161, 161, 161,   0, 161,   0,   0,   0,   0,   0, 161,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   6,   6,   6,   6,   6,   6,   0,   0,
+    105, 106, 107, 108, 109, 110, 111, 112, 178,   0,   0,   0,   0,   0,   0,   0,
+    103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103,
+    103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103,
+    103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103,   0,   0, 103, 103, 103,
+      1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,
+      1,   0,   1,   0,   1,   0, 146, 142, 144, 141, 145,  75,   0,   0, 143,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   6,   6,   6,   6,   6,   6,   6,   6,
+      0,   0,   0,   0,   0,   0,   0,   0,   6,   6,   6,   6,   6,   6,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   6,   6,   6,   6,   6,   6,   6,   6,
+      0,   0,   0,   0,   0,   0,   0,   0,   6,   6,   6,   6,   6,   6,   6,   6,
+      0,   0,   0,   0,   0,   0,   0,   0,   6,   6,   6,   6,   6,   6,   0,   0,
+    139,   0, 140,   0, 137,   0, 138,   0,   0,   6,   0,   6,   0,   6,   0,   6,
+      0,   0,   0,   0,   0,   0,   0,   0,   6,   6,   6,   6,   6,   6,   6,   6,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     53,  53,  53,  53,  53,  53,  53,  53,  56,  56,  56,  56,  56,  56,  56,  56,
+     62,  62,  62,  62,  62,  62,  62,  62,  64,  64,  64,  64,  64,  64,  64,  64,
+     67,  67,  67,  67,  67,  67,  67,  67,  69,  69,  69,  69,  69,  69,  69,  69,
+      0,   0,  68, 113, 118,   0, 116, 114,   6,   6,  71,  71, 117,   0, 115,   0,
+      0,   0,  63, 135, 129,   0, 134, 133,  65,  65,  66,  66, 136,   0,   0,   0,
+      0,   0, 130, 128,   0,   0, 132, 131,   6,   6,  60,  60,   0,   0,   0,   0,
+      0,   0, 123, 122, 121,   0, 120, 119,   6,   6,  59,  59,   7,   0,   0,   0,
+      0,   0,  58, 125, 125,   0, 127, 126,  52,  52,  55,  55, 124,   0,   0,   0,
+      0,   0,   0,   0,   0,   0, 149,   0,   0,   0, 147, 148,   0,   0,   0,   0,
+      0,   0,  50,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   5,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,  43,  43,  46,  46,  47,  47,  46,  46,  43,  43,
+     15,  15,  16,  16,  15,  15,  21,  21,  25,  25,  26,  26,  25,  25,  21,  21,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     27,  27,  27,  27,  27,  27,  27,  27,  27,  27,  27,  27,  27,  27,  27,  27,
+     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,
+     48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      1,   0, 150, 159, 151,   0,   0,  10,   0,   3,   0,   5,   0, 154, 152, 155,
+    153,   0,   1,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   0, 156, 155,
+      1,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   5,   0,   3,   0,   0,
+      0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,
+      1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   0,   0,   0,   0,
+      0,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,
+      0,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,
+      1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   5,   0, 176,   1,   0,
+      1,   0,   1,   0,   1,   0,   1,   0,   0,   0,   0,   5,   0, 170,   0,   0,
+      1,   0,   1,   0,   0,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,
+      1,   0,   1,   0,   1,   0,   1,   0,   1,   0, 168, 171, 169, 166, 167,   0,
+    162, 164, 163, 104,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,
+      0,   0,   1,   0,  36, 165, 177,  10,   0,   3,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175,
+    172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172,
+    173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173,
+    174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174,
+    173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173,
+    182, 183, 180, 181, 179, 185, 184,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0, 189, 186, 187, 190, 188,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,
+     40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,   0,   0,   0,   0,   0,
+     23,  23,  23,  23,  23,  23,  23,  23,  28,  28,  28,  28,  28,  28,  28,  28,
+     23,  23,  23,  23,  23,  23,  23,  23,  38,  38,  38,  38,  38,  38,  38,  38,
+     44,  44,  44,  44,  44,  44,  44,  44,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     44,  44,  44,  44,  44,  44,  44,  44,  38,  38,  38,  38,  38,  38,  38,  38,
+     23,  23,  23,  23,  23,  23,  23,  23,  28,  28,  28,  28,  28,  28,  28,  28,
+     23,  23,  23,  23,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,
+     30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,
+     30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,
+     30,  30,  30,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,
+     40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,
+     18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,
+     18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,
+     19,  19,  21,  21,  19,  19,  26,  26,  19,  19,  21,  21,  19,  19,  29,  29,
+     19,  19,  21,  21,  19,  19,  26,  26,  19,  19,  21,  21,  19,  19,  39,  39,
+     41,  41,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0
+};
+
+static RE_FullCaseFolding re_full_folding_table_4[] = {
+    {    0,     0,     0},
+    {    1,     0,     0},
+    {    2,     0,     0},
+    {    3,     0,     0},
+    {    6,     0,     0},
+    {    7,     0,     0},
+    {    8,     0,     0},
+    {    9,     0,     0},
+    {   11,     0,     0},
+    {   14,     0,     0},
+    {   15,     0,     0},
+    {   16,     0,     0},
+    {   19,     0,     0},
+    {   22,     0,     0},
+    {   24,     0,     0},
+    {   26,     0,     0},
+    {   30,     0,     0},
+    {   31,     0,     0},
+    {   32,     0,     0},
+    {   34,     0,     0},
+    {   37,     0,     0},
+    {   38,     0,     0},
+    {   39,     0,     0},
+    {   40,     0,     0},
+    {   41,   776,   769},
+    {   42,     0,     0},
+    {   46,     0,     0},
+    {   48,     0,     0},
+    {   56,     0,     0},
+    {   62,     0,     0},
+    {   64,     0,     0},
+    {   65,     0,     0},
+    {   67,     0,     0},
+    {   72,     0,     0},
+    {   74,     0,     0},
+    {   76,     0,     0},
+    {   80,     0,     0},
+    {   83,     0,     0},
+    {   88,     0,     0},
+    {   94,     0,     0},
+    {   96,     0,     0},
+    {   98,     0,     0},
+    {   99,     0,     0},
+    {  102,     0,     0},
+    {  104,     0,     0},
+    {  105,     0,     0},
+    {  106,     0,     0},
+    {  110,     0,     0},
+    {  112,     0,     0},
+    {  117,   776,   769},
+    {  124,     0,     0},
+    {  127,     0,     0},
+    {  128,     0,     0},
+    {  128,   953,     0},
+    {  130,     0,     0},
+    {  134,     0,     0},
+    {  136,   953,     0},
+    {  140,     0,     0},
+    {  142,   953,     0},
+    {  144,     0,     0},
+    {  172,     0,     0},
+    {  172,   115,     0},
+    {  176,   953,     0},
+    {  182,   953,     0},
+    {  184,   953,     0},
+    {  186,     0,     0},
+    {  190,     0,     0},
+    {  192,   953,     0},
+    {  194,   953,     0},
+    {  200,   953,     0},
+    {  201,     0,     0},
+    {  202,     0,     0},
+    {  205,     0,     0},
+    {  208,     0,     0},
+    {  226,  1410,     0},
+    {  250,     0,     0},
+    {  252,     0,     0},
+    {  268,     0,     0},
+    {  345,     0,     0},
+    {  345,   775,     0},
+    {  376,     0,     0},
+    {  391,     0,     0},
+    {  410,   780,     0},
+    {  777,     0,     0},
+    {  805,     0,     0},
+    {  806,     0,     0},
+    {  810,     0,     0},
+    {  825,     0,     0},
+    {  827,     0,     0},
+    {  935,     0,     0},
+    {  958,     0,     0},
+    {  963,     0,     0},
+    {  971,     0,     0},
+    {  978,     0,     0},
+    {  982,     0,     0},
+    {  989,     0,     0},
+    {  991,     0,     0},
+    { 1002,     0,     0},
+    { 1007,     0,     0},
+    { 1011,     0,     0},
+    { 1013,   110,     0},
+    { 1015,     0,     0},
+    { 1023,     0,     0},
+    { 3136,     0,     0},
+    { 3296,     0,     0},
+    { 6322,     0,     0},
+    { 6325,     0,     0},
+    { 6332,     0,     0},
+    { 6338,     0,     0},
+    { 6342,     0,     0},
+    { 6343,     0,     0},
+    { 6348,     0,     0},
+    { 6372,     0,     0},
+    { 7170,   953,     0},
+    { 7174,   834,   953},
+    { 7175,     0,     0},
+    { 7175,   834,     0},
+    { 7181,   953,     0},
+    { 7192,   953,     0},
+    { 7202,   776,   834},
+    { 7203,   834,     0},
+    { 7205,   787,     0},
+    { 7206,   776,   769},
+    { 7207,   776,   768},
+    { 7221,   953,     0},
+    { 7226,   953,     0},
+    { 7230,   834,   953},
+    { 7231,   834,     0},
+    { 7274,   776,   769},
+    { 7274,   953,     0},
+    { 7275,   776,   768},
+    { 7278,   776,   834},
+    { 7279,   834,     0},
+    { 7280,   834,   953},
+    { 7281,   834,     0},
+    { 7284,   953,     0},
+    { 7291,   953,     0},
+    { 7313,   787,   769},
+    { 7315,   787,   834},
+    { 7317,   787,     0},
+    { 7319,   787,   768},
+    { 7904,   778,     0},
+    { 7907,   776,     0},
+    { 7917,   115,     0},
+    { 7919,   778,     0},
+    { 7931,   702,     0},
+    { 7934,   817,     0},
+    { 8513,     0,     0},
+    { 8654,     0,     0},
+    { 8943,     0,     0},
+    {11785,     0,     0},
+    {11801,     0,     0},
+    {11807,     0,     0},
+    {11810,     0,     0},
+    {11836,     0,     0},
+    {11839,     0,     0},
+    {11841,     0,     0},
+    {11864,     0,     0},
+    {11871,     0,     0},
+    {12574,     0,     0},
+    {15776,     0,     0},
+    {15840,     0,     0},
+    {42286,     0,     0},
+    {42287,     0,     0},
+    {42294,     0,     0},
+    {42311,     0,     0},
+    {42433,     0,     0},
+    {42436,     0,     0},
+    {42444,     0,     0},
+    {42445,     0,     0},
+    {42472,     0,     0},
+    {42487,     0,     0},
+    {47152,     0,     0},
+    {47184,     0,     0},
+    {47216,     0,     0},
+    {47312,     0,     0},
+    {47620,     0,     0},
+    {47688,     0,     0},
+    {47811,     0,     0},
+    {64354,   102,   108},
+    {64356,   108,     0},
+    {64357,   102,   105},
+    {64358,   102,     0},
+    {64359,   105,     0},
+    {64373,   116,     0},
+    {64374,   116,     0},
+    {65120,  1381,     0},
+    {65121,  1387,     0},
+    {65123,  1389,     0},
+    {65127,  1398,     0},
+    {65128,  1398,     0}
+};
+
+int re_get_full_case_folding(RE_UINT32 codepoint, RE_UINT32* folded) {
+    RE_UINT32 field_2;
+    RE_UINT32 field_1;
+    RE_UINT32 field_0;
+    RE_UINT32 v;
+    RE_UINT16* data;
+
+    field_2 = codepoint >> 10;
+    field_1 = (codepoint >> 5) & 0x1F;
+    field_0 = codepoint & 0x1F;
+
+    v = re_full_folding_table_1[field_2];
+    v = re_full_folding_table_2[(v << 5) | field_1];
+    v = re_full_folding_table_3[(v << 5) | field_0];
+
+    data = re_full_folding_table_4[v].data;
+    folded[0] = codepoint ^ data[0];
+
+    if (data[1] == 0)
+        return 1;
+
+    folded[1] = data[1];
+
+    if (data[2] == 0)
+        return 2;
+
+    folded[2] = data[2];
+
+    return 3;
 }
 
 /* Property function table. */
-
 RE_GetPropertyFunc re_get_property[] = {
-    re_get_general_category,
-    re_get_block,
-    re_get_script,
-    0,
-    re_get_word_break,
-    re_get_grapheme_cluster_break,
-    re_get_sentence_break,
-    re_get_math,
     re_get_alphabetic,
-    re_get_lowercase,
-    re_get_uppercase,
+    re_get_alphanumeric,
+    re_get_any,
+    re_get_ascii_hex_digit,
+    re_get_bidi_class,
+    re_get_bidi_control,
+    re_get_bidi_mirrored,
+    re_get_blank,
+    re_get_block,
+    re_get_canonical_combining_class,
     re_get_cased,
     re_get_case_ignorable,
-    re_get_changes_when_lowercased,
-    re_get_changes_when_uppercased,
-    re_get_changes_when_titlecased,
     re_get_changes_when_casefolded,
     re_get_changes_when_casemapped,
-    re_get_id_start,
-    re_get_id_continue,
-    re_get_xid_start,
-    re_get_xid_continue,
+    re_get_changes_when_lowercased,
+    re_get_changes_when_titlecased,
+    re_get_changes_when_uppercased,
+    re_get_dash,
+    re_get_decomposition_type,
     re_get_default_ignorable_code_point,
-    re_get_grapheme_extend,
+    re_get_deprecated,
+    re_get_diacritic,
+    re_get_east_asian_width,
+    re_get_emoji,
+    re_get_emoji_component,
+    re_get_emoji_modifier,
+    re_get_emoji_modifier_base,
+    re_get_emoji_presentation,
+    re_get_extended_pictographic,
+    re_get_extender,
+    re_get_general_category,
+    re_get_graph,
     re_get_grapheme_base,
+    re_get_grapheme_cluster_break,
+    re_get_grapheme_extend,
     re_get_grapheme_link,
-    re_get_white_space,
-    re_get_bidi_control,
-    re_get_join_control,
-    re_get_dash,
-    re_get_hyphen,
-    re_get_quotation_mark,
-    re_get_terminal_punctuation,
-    re_get_other_math,
+    re_get_hangul_syllable_type,
     re_get_hex_digit,
-    re_get_ascii_hex_digit,
-    re_get_other_alphabetic,
+    re_get_hyphen,
+    re_get_id_continue,
     re_get_ideographic,
-    re_get_diacritic,
-    re_get_extender,
-    re_get_other_lowercase,
-    re_get_other_uppercase,
-    re_get_noncharacter_code_point,
-    re_get_other_grapheme_extend,
     re_get_ids_binary_operator,
+    re_get_id_start,
     re_get_ids_trinary_operator,
-    re_get_radical,
-    re_get_unified_ideograph,
-    re_get_other_default_ignorable_code_point,
-    re_get_deprecated,
-    re_get_soft_dotted,
-    re_get_logical_order_exception,
-    re_get_other_id_start,
-    re_get_other_id_continue,
-    re_get_sentence_terminal,
-    re_get_variation_selector,
-    re_get_pattern_white_space,
-    re_get_pattern_syntax,
-    re_get_prepended_concatenation_mark,
-    re_get_regional_indicator,
-    re_get_hangul_syllable_type,
-    re_get_bidi_class,
-    re_get_canonical_combining_class,
-    re_get_decomposition_type,
-    re_get_east_asian_width,
+    re_get_indic_positional_category,
+    re_get_indic_syllabic_category,
+    re_get_join_control,
     re_get_joining_group,
     re_get_joining_type,
     re_get_line_break,
-    re_get_numeric_type,
-    re_get_numeric_value,
-    re_get_bidi_mirrored,
-    re_get_indic_positional_category,
-    re_get_indic_syllabic_category,
-    re_get_emoji,
-    re_get_emoji_presentation,
-    re_get_emoji_modifier,
-    re_get_emoji_modifier_base,
-    re_get_emoji_component,
-    re_get_extended_pictographic,
-    re_get_nfd_quick_check,
+    re_get_logical_order_exception,
+    re_get_lowercase,
+    re_get_math,
     re_get_nfc_quick_check,
-    re_get_nfkd_quick_check,
+    re_get_nfd_quick_check,
     re_get_nfkc_quick_check,
-    re_get_alphanumeric,
-    re_get_any,
-    re_get_blank,
-    re_get_graph,
-    re_get_print,
-    re_get_word,
-    re_get_xdigit,
-    re_get_posix_digit,
+    re_get_nfkd_quick_check,
+    re_get_noncharacter_code_point,
+    re_get_numeric_type,
+    re_get_numeric_value,
+    re_get_other_alphabetic,
+    re_get_other_default_ignorable_code_point,
+    re_get_other_grapheme_extend,
+    re_get_other_id_continue,
+    re_get_other_id_start,
+    re_get_other_lowercase,
+    re_get_other_math,
+    re_get_other_uppercase,
+    re_get_pattern_syntax,
+    re_get_pattern_white_space,
     re_get_posix_alnum,
+    re_get_posix_digit,
     re_get_posix_punct,
     re_get_posix_xdigit,
+    re_get_prepended_concatenation_mark,
+    re_get_print,
+    re_get_quotation_mark,
+    re_get_radical,
+    re_get_regional_indicator,
+    re_get_script,
+    0,
+    re_get_sentence_break,
+    re_get_sentence_terminal,
+    re_get_soft_dotted,
+    re_get_terminal_punctuation,
+    re_get_unified_ideograph,
+    re_get_uppercase,
+    re_get_variation_selector,
+    re_get_white_space,
+    re_get_word,
+    re_get_word_break,
+    re_get_xdigit,
+    re_get_xid_continue,
+    re_get_xid_start
 };
diff --git a/regex_2/_regex_unicode.h b/regex_2/_regex_unicode.h
index 77e5764..ea8e48c 100644
--- a/regex_2/_regex_unicode.h
+++ b/regex_2/_regex_unicode.h
@@ -13,7 +13,6 @@ typedef unsigned char BOOL;
 
 #define RE_ASCII_MAX 0x7F
 #define RE_LOCALE_MAX 0xFF
-#define RE_UNICODE_MAX 0x10FFFF
 
 #define RE_MAX_CASES 4
 #define RE_MAX_FOLDED 3
@@ -31,13 +30,13 @@ typedef struct RE_PropertyValue {
     RE_UINT16 id;
 } RE_PropertyValue;
 
-typedef RE_UINT32 (*RE_GetPropertyFunc)(RE_UINT32 ch);
+typedef RE_UINT32 (*RE_GetPropertyFunc)(RE_UINT32 codepoint);
 
-#define RE_PROP_GC 0x0
-#define RE_PROP_CASED 0xB
-#define RE_PROP_UPPERCASE 0xA
-#define RE_PROP_LOWERCASE 0x9
-#define RE_PROP_SCX 0x3
+#define RE_PROP_GC 0x1E
+#define RE_PROP_CASED 0xA
+#define RE_PROP_UPPERCASE 0x56
+#define RE_PROP_LOWERCASE 0x33
+#define RE_PROP_SCX 0x50
 
 #define RE_PROP_C 30
 #define RE_PROP_L 31
@@ -46,254 +45,254 @@ typedef RE_UINT32 (*RE_GetPropertyFunc)(RE_UINT32 ch);
 #define RE_PROP_P 34
 #define RE_PROP_S 35
 #define RE_PROP_Z 36
-#define RE_PROP_ASSIGNED 38
-#define RE_PROP_CASEDLETTER 37
+#define RE_PROP_ASSIGNED 37
+#define RE_PROP_CASEDLETTER 38
 
 #define RE_PROP_CN 0
-#define RE_PROP_LU 1
-#define RE_PROP_LL 2
-#define RE_PROP_LT 3
-#define RE_PROP_LM 4
-#define RE_PROP_LO 5
-#define RE_PROP_MN 6
-#define RE_PROP_ME 7
-#define RE_PROP_MC 8
+#define RE_PROP_CC 1
+#define RE_PROP_ZS 2
+#define RE_PROP_PO 3
+#define RE_PROP_SC 4
+#define RE_PROP_PS 5
+#define RE_PROP_PE 6
+#define RE_PROP_SM 7
+#define RE_PROP_PD 8
 #define RE_PROP_ND 9
-#define RE_PROP_NL 10
-#define RE_PROP_NO 11
-#define RE_PROP_ZS 12
-#define RE_PROP_ZL 13
-#define RE_PROP_ZP 14
-#define RE_PROP_CC 15
-#define RE_PROP_CF 16
-#define RE_PROP_CO 17
-#define RE_PROP_CS 18
-#define RE_PROP_PD 19
-#define RE_PROP_PS 20
-#define RE_PROP_PE 21
-#define RE_PROP_PC 22
-#define RE_PROP_PO 23
-#define RE_PROP_SM 24
-#define RE_PROP_SC 25
-#define RE_PROP_SK 26
-#define RE_PROP_SO 27
-#define RE_PROP_PI 28
-#define RE_PROP_PF 29
+#define RE_PROP_LU 10
+#define RE_PROP_SK 11
+#define RE_PROP_PC 12
+#define RE_PROP_LL 13
+#define RE_PROP_SO 14
+#define RE_PROP_LO 15
+#define RE_PROP_PI 16
+#define RE_PROP_CF 17
+#define RE_PROP_NO 18
+#define RE_PROP_PF 19
+#define RE_PROP_LT 20
+#define RE_PROP_LM 21
+#define RE_PROP_MN 22
+#define RE_PROP_ME 23
+#define RE_PROP_MC 24
+#define RE_PROP_NL 25
+#define RE_PROP_ZL 26
+#define RE_PROP_ZP 27
+#define RE_PROP_CS 28
+#define RE_PROP_CO 29
 
-#define RE_PROP_C_MASK 0x00078001
-#define RE_PROP_L_MASK 0x0000003E
-#define RE_PROP_M_MASK 0x000001C0
-#define RE_PROP_N_MASK 0x00000E00
-#define RE_PROP_P_MASK 0x30F80000
-#define RE_PROP_S_MASK 0x0F000000
-#define RE_PROP_Z_MASK 0x00007000
+#define RE_PROP_C_MASK 0x30020003
+#define RE_PROP_L_MASK 0x0030A400
+#define RE_PROP_M_MASK 0x01C00000
+#define RE_PROP_N_MASK 0x02040200
+#define RE_PROP_P_MASK 0x00091168
+#define RE_PROP_S_MASK 0x00004890
+#define RE_PROP_Z_MASK 0x0C000004
 
-#define RE_PROP_ALNUM 0x530001
-#define RE_PROP_ALPHA 0x080001
-#define RE_PROP_ANY 0x540001
-#define RE_PROP_ASCII 0x010001
-#define RE_PROP_BLANK 0x550001
-#define RE_PROP_CNTRL 0x00000F
-#define RE_PROP_DIGIT 0x000009
-#define RE_PROP_GRAPH 0x560001
-#define RE_PROP_LOWER 0x090001
-#define RE_PROP_PRINT 0x570001
-#define RE_PROP_SPACE 0x1A0001
-#define RE_PROP_UPPER 0x0A0001
-#define RE_PROP_WORD 0x580001
-#define RE_PROP_XDIGIT 0x590001
-#define RE_PROP_POSIX_ALNUM 0x5B0001
-#define RE_PROP_POSIX_DIGIT 0x5A0001
-#define RE_PROP_POSIX_PUNCT 0x5C0001
-#define RE_PROP_POSIX_XDIGIT 0x5D0001
+#define RE_PROP_ALNUM 0x010001
+#define RE_PROP_ALPHA 0x000001
+#define RE_PROP_ANY 0x020001
+#define RE_PROP_ASCII 0x080001
+#define RE_PROP_BLANK 0x070001
+#define RE_PROP_CNTRL 0x1E0001
+#define RE_PROP_DIGIT 0x1E0009
+#define RE_PROP_GRAPH 0x1F0001
+#define RE_PROP_LOWER 0x330001
+#define RE_PROP_PRINT 0x4B0001
+#define RE_PROP_SPACE 0x580001
+#define RE_PROP_UPPER 0x560001
+#define RE_PROP_WORD 0x590001
+#define RE_PROP_XDIGIT 0x5B0001
+#define RE_PROP_POSIX_ALNUM 0x460001
+#define RE_PROP_POSIX_DIGIT 0x470001
+#define RE_PROP_POSIX_PUNCT 0x480001
+#define RE_PROP_POSIX_XDIGIT 0x490001
 
 #define RE_WBREAK_OTHER 0
-#define RE_WBREAK_DOUBLEQUOTE 1
-#define RE_WBREAK_SINGLEQUOTE 2
-#define RE_WBREAK_HEBREWLETTER 3
-#define RE_WBREAK_CR 4
-#define RE_WBREAK_LF 5
-#define RE_WBREAK_NEWLINE 6
-#define RE_WBREAK_EXTEND 7
-#define RE_WBREAK_REGIONALINDICATOR 8
-#define RE_WBREAK_FORMAT 9
-#define RE_WBREAK_KATAKANA 10
+#define RE_WBREAK_LF 1
+#define RE_WBREAK_NEWLINE 2
+#define RE_WBREAK_CR 3
+#define RE_WBREAK_WSEGSPACE 4
+#define RE_WBREAK_DOUBLEQUOTE 5
+#define RE_WBREAK_SINGLEQUOTE 6
+#define RE_WBREAK_MIDNUM 7
+#define RE_WBREAK_MIDNUMLET 8
+#define RE_WBREAK_NUMERIC 9
+#define RE_WBREAK_MIDLETTER 10
 #define RE_WBREAK_ALETTER 11
-#define RE_WBREAK_MIDLETTER 12
-#define RE_WBREAK_MIDNUM 13
-#define RE_WBREAK_MIDNUMLET 14
-#define RE_WBREAK_NUMERIC 15
-#define RE_WBREAK_EXTENDNUMLET 16
-#define RE_WBREAK_ZWJ 17
-#define RE_WBREAK_WSEGSPACE 18
+#define RE_WBREAK_EXTENDNUMLET 12
+#define RE_WBREAK_FORMAT 13
+#define RE_WBREAK_EXTEND 14
+#define RE_WBREAK_HEBREWLETTER 15
+#define RE_WBREAK_ZWJ 16
+#define RE_WBREAK_KATAKANA 17
+#define RE_WBREAK_REGIONALINDICATOR 18
 #define RE_WBREAK_EBASE 19
 #define RE_WBREAK_EBASEGAZ 20
 #define RE_WBREAK_EMODIFIER 21
 #define RE_WBREAK_GLUEAFTERZWJ 22
 
 #define RE_GBREAK_OTHER 0
-#define RE_GBREAK_PREPEND 1
-#define RE_GBREAK_CR 2
-#define RE_GBREAK_LF 3
-#define RE_GBREAK_CONTROL 4
-#define RE_GBREAK_EXTEND 5
-#define RE_GBREAK_REGIONALINDICATOR 6
-#define RE_GBREAK_SPACINGMARK 7
-#define RE_GBREAK_L 8
-#define RE_GBREAK_V 9
-#define RE_GBREAK_T 10
+#define RE_GBREAK_CONTROL 1
+#define RE_GBREAK_LF 2
+#define RE_GBREAK_CR 3
+#define RE_GBREAK_EXTEND 4
+#define RE_GBREAK_PREPEND 5
+#define RE_GBREAK_SPACINGMARK 6
+#define RE_GBREAK_L 7
+#define RE_GBREAK_V 8
+#define RE_GBREAK_T 9
+#define RE_GBREAK_ZWJ 10
 #define RE_GBREAK_LV 11
 #define RE_GBREAK_LVT 12
-#define RE_GBREAK_ZWJ 13
+#define RE_GBREAK_REGIONALINDICATOR 13
 #define RE_GBREAK_EBASE 14
 #define RE_GBREAK_EBASEGAZ 15
 #define RE_GBREAK_EMODIFIER 16
 #define RE_GBREAK_GLUEAFTERZWJ 17
 
 #define RE_LBREAK_UNKNOWN 0
-#define RE_LBREAK_OPENPUNCTUATION 1
-#define RE_LBREAK_CLOSEPUNCTUATION 2
-#define RE_LBREAK_QUOTATION 3
-#define RE_LBREAK_GLUE 4
-#define RE_LBREAK_NONSTARTER 5
-#define RE_LBREAK_EXCLAMATION 6
-#define RE_LBREAK_BREAKSYMBOLS 7
-#define RE_LBREAK_INFIXNUMERIC 8
-#define RE_LBREAK_PREFIXNUMERIC 9
-#define RE_LBREAK_POSTFIXNUMERIC 10
-#define RE_LBREAK_NUMERIC 11
-#define RE_LBREAK_ALPHABETIC 12
-#define RE_LBREAK_IDEOGRAPHIC 13
-#define RE_LBREAK_INSEPARABLE 14
+#define RE_LBREAK_COMBININGMARK 1
+#define RE_LBREAK_BREAKAFTER 2
+#define RE_LBREAK_LINEFEED 3
+#define RE_LBREAK_MANDATORYBREAK 4
+#define RE_LBREAK_CARRIAGERETURN 5
+#define RE_LBREAK_SPACE 6
+#define RE_LBREAK_EXCLAMATION 7
+#define RE_LBREAK_QUOTATION 8
+#define RE_LBREAK_ALPHABETIC 9
+#define RE_LBREAK_PREFIXNUMERIC 10
+#define RE_LBREAK_POSTFIXNUMERIC 11
+#define RE_LBREAK_OPENPUNCTUATION 12
+#define RE_LBREAK_CLOSEPARENTHESIS 13
+#define RE_LBREAK_INFIXNUMERIC 14
 #define RE_LBREAK_HYPHEN 15
-#define RE_LBREAK_COMBININGMARK 16
-#define RE_LBREAK_BREAKBEFORE 17
-#define RE_LBREAK_BREAKAFTER 18
-#define RE_LBREAK_SPACE 19
-#define RE_LBREAK_MANDATORYBREAK 20
-#define RE_LBREAK_CARRIAGERETURN 21
-#define RE_LBREAK_LINEFEED 22
-#define RE_LBREAK_CONTINGENTBREAK 23
+#define RE_LBREAK_BREAKSYMBOLS 16
+#define RE_LBREAK_NUMERIC 17
+#define RE_LBREAK_CLOSEPUNCTUATION 18
+#define RE_LBREAK_NEXTLINE 19
+#define RE_LBREAK_GLUE 20
+#define RE_LBREAK_AMBIGUOUS 21
+#define RE_LBREAK_BREAKBEFORE 22
+#define RE_LBREAK_HEBREWLETTER 23
 #define RE_LBREAK_COMPLEXCONTEXT 24
-#define RE_LBREAK_AMBIGUOUS 25
-#define RE_LBREAK_BREAKBOTH 26
-#define RE_LBREAK_SURROGATE 27
-#define RE_LBREAK_ZWSPACE 28
-#define RE_LBREAK_NEXTLINE 29
-#define RE_LBREAK_WORDJOINER 30
-#define RE_LBREAK_JL 31
-#define RE_LBREAK_JV 32
-#define RE_LBREAK_JT 33
-#define RE_LBREAK_H2 34
-#define RE_LBREAK_H3 35
-#define RE_LBREAK_CLOSEPARENTHESIS 36
-#define RE_LBREAK_HEBREWLETTER 37
-#define RE_LBREAK_CONDITIONALJAPANESESTARTER 38
-#define RE_LBREAK_REGIONALINDICATOR 39
-#define RE_LBREAK_EBASE 40
-#define RE_LBREAK_EMODIFIER 41
-#define RE_LBREAK_ZWJ 42
+#define RE_LBREAK_JL 25
+#define RE_LBREAK_JV 26
+#define RE_LBREAK_JT 27
+#define RE_LBREAK_NONSTARTER 28
+#define RE_LBREAK_ZWSPACE 29
+#define RE_LBREAK_ZWJ 30
+#define RE_LBREAK_BREAKBOTH 31
+#define RE_LBREAK_INSEPARABLE 32
+#define RE_LBREAK_WORDJOINER 33
+#define RE_LBREAK_IDEOGRAPHIC 34
+#define RE_LBREAK_EBASE 35
+#define RE_LBREAK_CONDITIONALJAPANESESTARTER 36
+#define RE_LBREAK_H2 37
+#define RE_LBREAK_H3 38
+#define RE_LBREAK_SURROGATE 39
+#define RE_LBREAK_CONTINGENTBREAK 40
+#define RE_LBREAK_REGIONALINDICATOR 41
+#define RE_LBREAK_EMODIFIER 42
 
-extern char* re_strings[1425];
-extern RE_Property re_properties[168];
-extern RE_PropertyValue re_property_values[1568];
+extern char* re_strings[1447];
+extern RE_Property re_properties[173];
+extern RE_PropertyValue re_property_values[1589];
 extern RE_UINT16 re_expand_on_folding[104];
 extern RE_GetPropertyFunc re_get_property[94];
 
-RE_UINT32 re_get_general_category(RE_UINT32 ch);
-RE_UINT32 re_get_block(RE_UINT32 ch);
-RE_UINT32 re_get_script(RE_UINT32 ch);
-int re_get_script_extensions(RE_UINT32 ch, RE_UINT8* scripts);
-RE_UINT32 re_get_word_break(RE_UINT32 ch);
-RE_UINT32 re_get_grapheme_cluster_break(RE_UINT32 ch);
-RE_UINT32 re_get_sentence_break(RE_UINT32 ch);
-RE_UINT32 re_get_math(RE_UINT32 ch);
-RE_UINT32 re_get_alphabetic(RE_UINT32 ch);
-RE_UINT32 re_get_lowercase(RE_UINT32 ch);
-RE_UINT32 re_get_uppercase(RE_UINT32 ch);
-RE_UINT32 re_get_cased(RE_UINT32 ch);
-RE_UINT32 re_get_case_ignorable(RE_UINT32 ch);
-RE_UINT32 re_get_changes_when_lowercased(RE_UINT32 ch);
-RE_UINT32 re_get_changes_when_uppercased(RE_UINT32 ch);
-RE_UINT32 re_get_changes_when_titlecased(RE_UINT32 ch);
-RE_UINT32 re_get_changes_when_casefolded(RE_UINT32 ch);
-RE_UINT32 re_get_changes_when_casemapped(RE_UINT32 ch);
-RE_UINT32 re_get_id_start(RE_UINT32 ch);
-RE_UINT32 re_get_id_continue(RE_UINT32 ch);
-RE_UINT32 re_get_xid_start(RE_UINT32 ch);
-RE_UINT32 re_get_xid_continue(RE_UINT32 ch);
-RE_UINT32 re_get_default_ignorable_code_point(RE_UINT32 ch);
-RE_UINT32 re_get_grapheme_extend(RE_UINT32 ch);
-RE_UINT32 re_get_grapheme_base(RE_UINT32 ch);
-RE_UINT32 re_get_grapheme_link(RE_UINT32 ch);
-RE_UINT32 re_get_white_space(RE_UINT32 ch);
-RE_UINT32 re_get_bidi_control(RE_UINT32 ch);
-RE_UINT32 re_get_join_control(RE_UINT32 ch);
-RE_UINT32 re_get_dash(RE_UINT32 ch);
-RE_UINT32 re_get_hyphen(RE_UINT32 ch);
-RE_UINT32 re_get_quotation_mark(RE_UINT32 ch);
-RE_UINT32 re_get_terminal_punctuation(RE_UINT32 ch);
-RE_UINT32 re_get_other_math(RE_UINT32 ch);
-RE_UINT32 re_get_hex_digit(RE_UINT32 ch);
-RE_UINT32 re_get_ascii_hex_digit(RE_UINT32 ch);
-RE_UINT32 re_get_other_alphabetic(RE_UINT32 ch);
-RE_UINT32 re_get_ideographic(RE_UINT32 ch);
-RE_UINT32 re_get_diacritic(RE_UINT32 ch);
-RE_UINT32 re_get_extender(RE_UINT32 ch);
-RE_UINT32 re_get_other_lowercase(RE_UINT32 ch);
-RE_UINT32 re_get_other_uppercase(RE_UINT32 ch);
-RE_UINT32 re_get_noncharacter_code_point(RE_UINT32 ch);
-RE_UINT32 re_get_other_grapheme_extend(RE_UINT32 ch);
-RE_UINT32 re_get_ids_binary_operator(RE_UINT32 ch);
-RE_UINT32 re_get_ids_trinary_operator(RE_UINT32 ch);
-RE_UINT32 re_get_radical(RE_UINT32 ch);
-RE_UINT32 re_get_unified_ideograph(RE_UINT32 ch);
-RE_UINT32 re_get_other_default_ignorable_code_point(RE_UINT32 ch);
-RE_UINT32 re_get_deprecated(RE_UINT32 ch);
-RE_UINT32 re_get_soft_dotted(RE_UINT32 ch);
-RE_UINT32 re_get_logical_order_exception(RE_UINT32 ch);
-RE_UINT32 re_get_other_id_start(RE_UINT32 ch);
-RE_UINT32 re_get_other_id_continue(RE_UINT32 ch);
-RE_UINT32 re_get_sentence_terminal(RE_UINT32 ch);
-RE_UINT32 re_get_variation_selector(RE_UINT32 ch);
-RE_UINT32 re_get_pattern_white_space(RE_UINT32 ch);
-RE_UINT32 re_get_pattern_syntax(RE_UINT32 ch);
-RE_UINT32 re_get_prepended_concatenation_mark(RE_UINT32 ch);
-RE_UINT32 re_get_regional_indicator(RE_UINT32 ch);
-RE_UINT32 re_get_hangul_syllable_type(RE_UINT32 ch);
-RE_UINT32 re_get_bidi_class(RE_UINT32 ch);
-RE_UINT32 re_get_canonical_combining_class(RE_UINT32 ch);
-RE_UINT32 re_get_decomposition_type(RE_UINT32 ch);
-RE_UINT32 re_get_east_asian_width(RE_UINT32 ch);
-RE_UINT32 re_get_joining_group(RE_UINT32 ch);
-RE_UINT32 re_get_joining_type(RE_UINT32 ch);
-RE_UINT32 re_get_line_break(RE_UINT32 ch);
-RE_UINT32 re_get_numeric_type(RE_UINT32 ch);
-RE_UINT32 re_get_numeric_value(RE_UINT32 ch);
-RE_UINT32 re_get_bidi_mirrored(RE_UINT32 ch);
-RE_UINT32 re_get_indic_positional_category(RE_UINT32 ch);
-RE_UINT32 re_get_indic_syllabic_category(RE_UINT32 ch);
-RE_UINT32 re_get_emoji(RE_UINT32 ch);
-RE_UINT32 re_get_emoji_presentation(RE_UINT32 ch);
-RE_UINT32 re_get_emoji_modifier(RE_UINT32 ch);
-RE_UINT32 re_get_emoji_modifier_base(RE_UINT32 ch);
-RE_UINT32 re_get_emoji_component(RE_UINT32 ch);
-RE_UINT32 re_get_extended_pictographic(RE_UINT32 ch);
-RE_UINT32 re_get_nfd_quick_check(RE_UINT32 ch);
-RE_UINT32 re_get_nfc_quick_check(RE_UINT32 ch);
-RE_UINT32 re_get_nfkd_quick_check(RE_UINT32 ch);
-RE_UINT32 re_get_nfkc_quick_check(RE_UINT32 ch);
-RE_UINT32 re_get_alphanumeric(RE_UINT32 ch);
-RE_UINT32 re_get_any(RE_UINT32 ch);
-RE_UINT32 re_get_blank(RE_UINT32 ch);
-RE_UINT32 re_get_graph(RE_UINT32 ch);
-RE_UINT32 re_get_print(RE_UINT32 ch);
-RE_UINT32 re_get_word(RE_UINT32 ch);
-RE_UINT32 re_get_xdigit(RE_UINT32 ch);
-RE_UINT32 re_get_posix_digit(RE_UINT32 ch);
-RE_UINT32 re_get_posix_alnum(RE_UINT32 ch);
-RE_UINT32 re_get_posix_punct(RE_UINT32 ch);
-RE_UINT32 re_get_posix_xdigit(RE_UINT32 ch);
-int re_get_all_cases(RE_UINT32 ch, RE_UINT32* codepoints);
-RE_UINT32 re_get_simple_case_folding(RE_UINT32 ch);
-int re_get_full_case_folding(RE_UINT32 ch, RE_UINT32* codepoints);
+RE_UINT32 re_get_alphabetic(RE_UINT32 codepoint);
+RE_UINT32 re_get_alphanumeric(RE_UINT32 codepoint);
+RE_UINT32 re_get_any(RE_UINT32 codepoint);
+RE_UINT32 re_get_ascii_hex_digit(RE_UINT32 codepoint);
+RE_UINT32 re_get_bidi_class(RE_UINT32 codepoint);
+RE_UINT32 re_get_bidi_control(RE_UINT32 codepoint);
+RE_UINT32 re_get_bidi_mirrored(RE_UINT32 codepoint);
+RE_UINT32 re_get_blank(RE_UINT32 codepoint);
+RE_UINT32 re_get_block(RE_UINT32 codepoint);
+RE_UINT32 re_get_canonical_combining_class(RE_UINT32 codepoint);
+RE_UINT32 re_get_cased(RE_UINT32 codepoint);
+RE_UINT32 re_get_case_ignorable(RE_UINT32 codepoint);
+RE_UINT32 re_get_changes_when_casefolded(RE_UINT32 codepoint);
+RE_UINT32 re_get_changes_when_casemapped(RE_UINT32 codepoint);
+RE_UINT32 re_get_changes_when_lowercased(RE_UINT32 codepoint);
+RE_UINT32 re_get_changes_when_titlecased(RE_UINT32 codepoint);
+RE_UINT32 re_get_changes_when_uppercased(RE_UINT32 codepoint);
+RE_UINT32 re_get_dash(RE_UINT32 codepoint);
+RE_UINT32 re_get_decomposition_type(RE_UINT32 codepoint);
+RE_UINT32 re_get_default_ignorable_code_point(RE_UINT32 codepoint);
+RE_UINT32 re_get_deprecated(RE_UINT32 codepoint);
+RE_UINT32 re_get_diacritic(RE_UINT32 codepoint);
+RE_UINT32 re_get_east_asian_width(RE_UINT32 codepoint);
+RE_UINT32 re_get_emoji(RE_UINT32 codepoint);
+RE_UINT32 re_get_emoji_component(RE_UINT32 codepoint);
+RE_UINT32 re_get_emoji_modifier(RE_UINT32 codepoint);
+RE_UINT32 re_get_emoji_modifier_base(RE_UINT32 codepoint);
+RE_UINT32 re_get_emoji_presentation(RE_UINT32 codepoint);
+RE_UINT32 re_get_extended_pictographic(RE_UINT32 codepoint);
+RE_UINT32 re_get_extender(RE_UINT32 codepoint);
+RE_UINT32 re_get_general_category(RE_UINT32 codepoint);
+RE_UINT32 re_get_graph(RE_UINT32 codepoint);
+RE_UINT32 re_get_grapheme_base(RE_UINT32 codepoint);
+RE_UINT32 re_get_grapheme_cluster_break(RE_UINT32 codepoint);
+RE_UINT32 re_get_grapheme_extend(RE_UINT32 codepoint);
+RE_UINT32 re_get_grapheme_link(RE_UINT32 codepoint);
+RE_UINT32 re_get_hangul_syllable_type(RE_UINT32 codepoint);
+RE_UINT32 re_get_hex_digit(RE_UINT32 codepoint);
+RE_UINT32 re_get_hyphen(RE_UINT32 codepoint);
+RE_UINT32 re_get_id_continue(RE_UINT32 codepoint);
+RE_UINT32 re_get_ideographic(RE_UINT32 codepoint);
+RE_UINT32 re_get_ids_binary_operator(RE_UINT32 codepoint);
+RE_UINT32 re_get_id_start(RE_UINT32 codepoint);
+RE_UINT32 re_get_ids_trinary_operator(RE_UINT32 codepoint);
+RE_UINT32 re_get_indic_positional_category(RE_UINT32 codepoint);
+RE_UINT32 re_get_indic_syllabic_category(RE_UINT32 codepoint);
+RE_UINT32 re_get_join_control(RE_UINT32 codepoint);
+RE_UINT32 re_get_joining_group(RE_UINT32 codepoint);
+RE_UINT32 re_get_joining_type(RE_UINT32 codepoint);
+RE_UINT32 re_get_line_break(RE_UINT32 codepoint);
+RE_UINT32 re_get_logical_order_exception(RE_UINT32 codepoint);
+RE_UINT32 re_get_lowercase(RE_UINT32 codepoint);
+RE_UINT32 re_get_math(RE_UINT32 codepoint);
+RE_UINT32 re_get_nfc_quick_check(RE_UINT32 codepoint);
+RE_UINT32 re_get_nfd_quick_check(RE_UINT32 codepoint);
+RE_UINT32 re_get_nfkc_quick_check(RE_UINT32 codepoint);
+RE_UINT32 re_get_nfkd_quick_check(RE_UINT32 codepoint);
+RE_UINT32 re_get_noncharacter_code_point(RE_UINT32 codepoint);
+RE_UINT32 re_get_numeric_type(RE_UINT32 codepoint);
+RE_UINT32 re_get_numeric_value(RE_UINT32 codepoint);
+RE_UINT32 re_get_other_alphabetic(RE_UINT32 codepoint);
+RE_UINT32 re_get_other_default_ignorable_code_point(RE_UINT32 codepoint);
+RE_UINT32 re_get_other_grapheme_extend(RE_UINT32 codepoint);
+RE_UINT32 re_get_other_id_continue(RE_UINT32 codepoint);
+RE_UINT32 re_get_other_id_start(RE_UINT32 codepoint);
+RE_UINT32 re_get_other_lowercase(RE_UINT32 codepoint);
+RE_UINT32 re_get_other_math(RE_UINT32 codepoint);
+RE_UINT32 re_get_other_uppercase(RE_UINT32 codepoint);
+RE_UINT32 re_get_pattern_syntax(RE_UINT32 codepoint);
+RE_UINT32 re_get_pattern_white_space(RE_UINT32 codepoint);
+RE_UINT32 re_get_posix_alnum(RE_UINT32 codepoint);
+RE_UINT32 re_get_posix_digit(RE_UINT32 codepoint);
+RE_UINT32 re_get_posix_punct(RE_UINT32 codepoint);
+RE_UINT32 re_get_posix_xdigit(RE_UINT32 codepoint);
+RE_UINT32 re_get_prepended_concatenation_mark(RE_UINT32 codepoint);
+RE_UINT32 re_get_print(RE_UINT32 codepoint);
+RE_UINT32 re_get_quotation_mark(RE_UINT32 codepoint);
+RE_UINT32 re_get_radical(RE_UINT32 codepoint);
+RE_UINT32 re_get_regional_indicator(RE_UINT32 codepoint);
+RE_UINT32 re_get_script(RE_UINT32 codepoint);
+int re_get_script_extensions(RE_UINT32 codepoint, RE_UINT8* scripts);
+RE_UINT32 re_get_sentence_break(RE_UINT32 codepoint);
+RE_UINT32 re_get_sentence_terminal(RE_UINT32 codepoint);
+RE_UINT32 re_get_soft_dotted(RE_UINT32 codepoint);
+RE_UINT32 re_get_terminal_punctuation(RE_UINT32 codepoint);
+RE_UINT32 re_get_unified_ideograph(RE_UINT32 codepoint);
+RE_UINT32 re_get_uppercase(RE_UINT32 codepoint);
+RE_UINT32 re_get_variation_selector(RE_UINT32 codepoint);
+RE_UINT32 re_get_white_space(RE_UINT32 codepoint);
+RE_UINT32 re_get_word(RE_UINT32 codepoint);
+RE_UINT32 re_get_word_break(RE_UINT32 codepoint);
+RE_UINT32 re_get_xdigit(RE_UINT32 codepoint);
+RE_UINT32 re_get_xid_continue(RE_UINT32 codepoint);
+RE_UINT32 re_get_xid_start(RE_UINT32 codepoint);
+int re_get_all_cases(RE_UINT32 codepoint, RE_UINT32* cases);
+RE_UINT32 re_get_simple_case_folding(RE_UINT32 codepoint);
+int re_get_full_case_folding(RE_UINT32 codepoint, RE_UINT32* folded);
diff --git a/regex_2/regex/regex.py b/regex_2/regex.py
similarity index 92%
rename from regex_2/regex/regex.py
rename to regex_2/regex.py
index 67aa73a..81ef0ac 100644
--- a/regex_2/regex/regex.py
+++ b/regex_2/regex.py
@@ -136,6 +136,7 @@ second character.
     \g<name>        Matches the text matched by the group named name.
     \G              Matches the empty string, but only at the position where
                     the search started.
+    \h              Matches horizontal whitespace.
     \K              Keeps only what follows for the entire match.
     \L<name>        Named list. The list is provided as a keyword argument.
     \m              Matches the empty string, but only at the start of a word.
@@ -239,54 +240,54 @@ __all__ = ["compile", "DEFAULT_VERSION", "escape", "findall", "finditer",
   "T", "TEMPLATE", "U", "UNICODE", "V0", "VERSION0", "V1", "VERSION1", "X",
   "VERBOSE", "W", "WORD", "error", "Regex", "__version__", "__doc__"]
 
-__version__ = "2.5.64"
+__version__ = "2.5.83"
 
 # --------------------------------------------------------------------
 # Public interface.
 
 def match(pattern, string, flags=0, pos=None, endpos=None, partial=False,
-  concurrent=None, **kwargs):
+  concurrent=None, ignore_unused=False, **kwargs):
     """Try to apply the pattern at the start of the string, returning a match
     object, or None if no match was found."""
-    return _compile(pattern, flags, kwargs).match(string, pos, endpos,
-      concurrent, partial)
+    return _compile(pattern, flags, ignore_unused, kwargs).match(string, pos,
+      endpos, concurrent, partial)
 
 def fullmatch(pattern, string, flags=0, pos=None, endpos=None, partial=False,
-  concurrent=None, **kwargs):
+  concurrent=None, ignore_unused=False, **kwargs):
     """Try to apply the pattern against all of the string, returning a match
     object, or None if no match was found."""
-    return _compile(pattern, flags, kwargs).fullmatch(string, pos, endpos,
-      concurrent, partial)
+    return _compile(pattern, flags, ignore_unused, kwargs).fullmatch(string,
+      pos, endpos, concurrent, partial)
 
 def search(pattern, string, flags=0, pos=None, endpos=None, partial=False,
-  concurrent=None, **kwargs):
+  concurrent=None, ignore_unused=False, **kwargs):
     """Search through string looking for a match to the pattern, returning a
     match object, or None if no match was found."""
-    return _compile(pattern, flags, kwargs).search(string, pos, endpos,
-      concurrent, partial)
+    return _compile(pattern, flags, ignore_unused, kwargs).search(string, pos,
+      endpos, concurrent, partial)
 
 def sub(pattern, repl, string, count=0, flags=0, pos=None, endpos=None,
-  concurrent=None, **kwargs):
+  concurrent=None, ignore_unused=False, **kwargs):
     """Return the string obtained by replacing the leftmost (or rightmost with a
     reverse pattern) non-overlapping occurrences of the pattern in string by the
     replacement repl. repl can be either a string or a callable; if a string,
     backslash escapes in it are processed; if a callable, it's passed the match
     object and must return a replacement string to be used."""
-    return _compile(pattern, flags, kwargs).sub(repl, string, count, pos,
-      endpos, concurrent)
+    return _compile(pattern, flags, ignore_unused, kwargs).sub(repl, string,
+      count, pos, endpos, concurrent)
 
 def subf(pattern, format, string, count=0, flags=0, pos=None, endpos=None,
-  concurrent=None, **kwargs):
+  concurrent=None, ignore_unused=False, **kwargs):
     """Return the string obtained by replacing the leftmost (or rightmost with a
     reverse pattern) non-overlapping occurrences of the pattern in string by the
     replacement format. format can be either a string or a callable; if a string,
     it's treated as a format string; if a callable, it's passed the match object
     and must return a replacement string to be used."""
-    return _compile(pattern, flags, kwargs).subf(format, string, count, pos,
-      endpos, concurrent)
+    return _compile(pattern, flags, ignore_unused, kwargs).subf(format, string,
+      count, pos, endpos, concurrent)
 
 def subn(pattern, repl, string, count=0, flags=0, pos=None, endpos=None,
-  concurrent=None, **kwargs):
+  concurrent=None, ignore_unused=False, **kwargs):
     """Return a 2-tuple containing (new_string, number). new_string is the string
     obtained by replacing the leftmost (or rightmost with a reverse pattern)
     non-overlapping occurrences of the pattern in the source string by the
@@ -294,11 +295,11 @@ def subn(pattern, repl, string, count=0, flags=0, pos=None, endpos=None,
     can be either a string or a callable; if a string, backslash escapes in it
     are processed; if a callable, it's passed the match object and must return a
     replacement string to be used."""
-    return _compile(pattern, flags, kwargs).subn(repl, string, count, pos,
-      endpos, concurrent)
+    return _compile(pattern, flags, ignore_unused, kwargs).subn(repl, string,
+      count, pos, endpos, concurrent)
 
 def subfn(pattern, format, string, count=0, flags=0, pos=None, endpos=None,
-  concurrent=None, **kwargs):
+  concurrent=None, ignore_unused=False, **kwargs):
     """Return a 2-tuple containing (new_string, number). new_string is the string
     obtained by replacing the leftmost (or rightmost with a reverse pattern)
     non-overlapping occurrences of the pattern in the source string by the
@@ -306,45 +307,46 @@ def subfn(pattern, format, string, count=0, flags=0, pos=None, endpos=None,
     can be either a string or a callable; if a string, it's treated as a format
     string; if a callable, it's passed the match object and must return a
     replacement string to be used."""
-    return _compile(pattern, flags, kwargs).subfn(format, string, count, pos,
-      endpos, concurrent)
+    return _compile(pattern, flags, ignore_unused, kwargs).subfn(format, string,
+      count, pos, endpos, concurrent)
 
 def split(pattern, string, maxsplit=0, flags=0, concurrent=None,
-  **kwargs):
+  ignore_unused=False, **kwargs):
     """Split the source string by the occurrences of the pattern, returning a
     list containing the resulting substrings.  If capturing parentheses are used
     in pattern, then the text of all groups in the pattern are also returned as
     part of the resulting list.  If maxsplit is nonzero, at most maxsplit splits
     occur, and the remainder of the string is returned as the final element of
     the list."""
-    return _compile(pattern, flags, kwargs).split(string, maxsplit, concurrent)
+    return _compile(pattern, flags, ignore_unused, kwargs).split(string,
+      maxsplit, concurrent)
 
 def splititer(pattern, string, maxsplit=0, flags=0, concurrent=None,
-  **kwargs):
+  ignore_unused=False, **kwargs):
     "Return an iterator yielding the parts of a split string."
-    return _compile(pattern, flags, kwargs).splititer(string, maxsplit,
-      concurrent)
+    return _compile(pattern, flags, ignore_unused, kwargs).splititer(string,
+      maxsplit, concurrent)
 
 def findall(pattern, string, flags=0, pos=None, endpos=None, overlapped=False,
-  concurrent=None, **kwargs):
+  concurrent=None, ignore_unused=False, **kwargs):
     """Return a list of all matches in the string. The matches may be overlapped
     if overlapped is True. If one or more groups are present in the pattern,
     return a list of groups; this will be a list of tuples if the pattern has
     more than one group. Empty matches are included in the result."""
-    return _compile(pattern, flags, kwargs).findall(string, pos, endpos,
-      overlapped, concurrent)
+    return _compile(pattern, flags, ignore_unused, kwargs).findall(string, pos,
+      endpos, overlapped, concurrent)
 
 def finditer(pattern, string, flags=0, pos=None, endpos=None, overlapped=False,
-  partial=False, concurrent=None, **kwargs):
+  partial=False, concurrent=None, ignore_unused=False, **kwargs):
     """Return an iterator over all matches in the string. The matches may be
     overlapped if overlapped is True. For each match, the iterator returns a
     match object. Empty matches are included in the result."""
-    return _compile(pattern, flags, kwargs).finditer(string, pos, endpos,
-      overlapped, concurrent, partial)
+    return _compile(pattern, flags, ignore_unused, kwargs).finditer(string, pos,
+      endpos, overlapped, concurrent, partial)
 
-def compile(pattern, flags=0, **kwargs):
+def compile(pattern, flags=0, ignore_unused=False, **kwargs):
     "Compile a regular expression pattern, returning a pattern object."
-    return _compile(pattern, flags, kwargs)
+    return _compile(pattern, flags, ignore_unused, kwargs)
 
 def purge():
     "Clear the regular expression cache"
@@ -353,7 +355,7 @@ def purge():
 
 def template(pattern, flags=0):
     "Compile a template pattern, returning a pattern object."
-    return _compile(pattern, flags | TEMPLATE)
+    return _compile(pattern, flags | TEMPLATE, False, {})
 
 def escape(pattern, special_only=True, literal_spaces=False):
     """Escape a string for use as a literal in a pattern. If special_only is
@@ -420,7 +422,7 @@ _locale_sensitive = {}
 _MAXCACHE = 500
 _MAXREPCACHE = 500
 
-def _compile(pattern, flags=0, kwargs={}):
+def _compile(pattern, flags, ignore_unused, kwargs):
     "Compiles a regular expression to a PatternObject."
 
     global DEFAULT_VERSION
@@ -563,6 +565,12 @@ def _compile(pattern, flags=0, kwargs={}):
         named_list_indexes[index] = items
         args_needed.add((name, values))
 
+    # Any unused keyword arguments, possibly resulting from a typo?
+    unused_kwargs = set(kwargs) - set(named_lists)
+    if unused_kwargs and not ignore_unused:
+        any_one = next(iter(unused_kwargs))
+        raise ValueError('unused keyword argument %r' % any_one)
+
     # Check the features of the groups.
     _check_group_features(info, parsed)
 
@@ -683,8 +691,8 @@ def _compile_replacement_helper(pattern, template):
     return compiled
 
 # We define Pattern here after all the support objects have been defined.
-Pattern = type(_compile('', 0, {}))
-Match = type(_compile('', 0).match(''))
+Pattern = type(_compile('', 0, False, {}))
+Match = type(_compile('', 0, False, {}).match(''))
 
 # We'll define an alias for the 'compile' function so that the repr of a
 # pattern object is eval-able.
diff --git a/regex_2/regex/test/__init__.py b/regex_2/regex/test/__init__.py
deleted file mode 100644
index e69de29..0000000
diff --git a/regex_2/regex/test/test_regex.py b/regex_2/test_regex.py
similarity index 97%
rename from regex_2/regex/test/test_regex.py
rename to regex_2/test_regex.py
index 8a4aed6..c918ba2 100644
--- a/regex_2/regex/test/test_regex.py
+++ b/regex_2/test_regex.py
@@ -1,12 +1,12 @@
 from __future__ import with_statement
-import regex
-import string
+from test.test_support import run_unittest
 from weakref import proxy
-import unittest
 import copy
 import pickle
-from test.test_support import run_unittest
 import re
+import regex
+import string
+import unittest
 
 # _AssertRaisesContext is defined here because the class doesn't exist before
 # Python 2.7.
@@ -1773,8 +1773,8 @@ class RegexTests(unittest.TestCase):
               repr('\a\b\f\n\r\t\v')),
             (r'[\a][\b][\f][\n][\r][\t][\v]', '\a\b\f\n\r\t\v', '0',
               repr('\a\b\f\n\r\t\v')),
-            (r'\c\e\g\h\i\j\k\o\p\q\y\z', 'ceghijkopqyz', '0',
-              repr('ceghijkopqyz')),
+            (r'\c\e\g\i\j\k\o\p\q\y\z', 'cegijkopqyz', '0',
+              repr('cegijkopqyz')),
             (r'\xff', '\377', '0', repr(chr(255))),
 
             # New \x semantics.
@@ -4018,103 +4018,142 @@ thing
               [u'\U0001F468\u200D\U0001F469\u200D\U0001F467\u200D\U0001F466'])
 
         # Hg issue 320: Abnormal performance
-        self.assertEquals(bool(regex.search(r'(?=a)a', 'a')), True)
-        self.assertEquals(bool(regex.search(r'(?!b)a', 'a')), True)
+        self.assertEqual(bool(regex.search(r'(?=a)a', 'a')), True)
+        self.assertEqual(bool(regex.search(r'(?!b)a', 'a')), True)
 
         # Hg issue 327: .fullmatch() causes MemoryError
-        self.assertEquals(regex.fullmatch(r'((\d)*?)*?', '123').span(), (0, 3))
+        self.assertEqual(regex.fullmatch(r'((\d)*?)*?', '123').span(), (0, 3))
 
         # Hg issue 329: Wrong group matches when question mark quantifier is used within a look behind
-        self.assertEquals(regex.search(r'''(?(DEFINE)(?<mydef>(?<wrong>THIS_SHOULD_NOT_MATCHx?)|(?<right>right))).*(?<=(?&mydef).*)''',
+        self.assertEqual(regex.search(r'''(?(DEFINE)(?<mydef>(?<wrong>THIS_SHOULD_NOT_MATCHx?)|(?<right>right))).*(?<=(?&mydef).*)''',
           'x right').capturesdict(), {'mydef': ['right'], 'wrong': [], 'right':
           ['right']})
 
+        # Hg issue 353: fuzzy changes negative indexes
+        self.assertEqual(regex.search(r'(?be)(AGTGTTCCCCGCGCCAGCGGGGATAAACCG){s<=5,i<=5,d<=5,s+i+d<=10}',
+          'TTCCCCGCGCCAGCGGGGATAAACCG').fuzzy_changes, ([], [], [0, 1, 3, 5]))
+
+        # Git issue 364: Contradictory values in fuzzy_counts and fuzzy_changes
+        self.assertEqual(regex.match(r'(?:bc){e}', 'c').fuzzy_counts, (1, 0,
+          1))
+        self.assertEqual(regex.match(r'(?:bc){e}', 'c').fuzzy_changes, ([0],
+          [], [1]))
+        self.assertEqual(regex.match(r'(?e)(?:bc){e}', 'c').fuzzy_counts, (0,
+          0, 1))
+        self.assertEqual(regex.match(r'(?e)(?:bc){e}', 'c').fuzzy_changes,
+          ([], [], [0]))
+        self.assertEqual(regex.match(r'(?b)(?:bc){e}', 'c').fuzzy_counts, (0,
+          0, 1))
+        self.assertEqual(regex.match(r'(?b)(?:bc){e}', 'c').fuzzy_changes,
+          ([], [], [0]))
+
+        # Git issue 370: Confusions about Fuzzy matching behavior
+        self.assertEqual(regex.match('(?e)(?:^(\\$ )?\\d{1,3}(,\\d{3})*(\\.\\d{2})$){e}',
+          '$ 10,112.111.12').fuzzy_counts, (6, 0, 5))
+        self.assertEqual(regex.match('(?e)(?:^(\\$ )?\\d{1,3}(,\\d{3})*(\\.\\d{2})$){s<=1}',
+          '$ 10,112.111.12').fuzzy_counts, (1, 0, 0))
+        self.assertEqual(regex.match('(?e)(?:^(\\$ )?\\d{1,3}(,\\d{3})*(\\.\\d{2})$){s<=1,i<=1,d<=1}',
+          '$ 10,112.111.12').fuzzy_counts, (1, 0, 0))
+        self.assertEqual(regex.match('(?e)(?:^(\\$ )?\\d{1,3}(,\\d{3})*(\\.\\d{2})$){s<=3}',
+          '$ 10,1a2.111.12').fuzzy_counts, (2, 0, 0))
+        self.assertEqual(regex.match('(?e)(?:^(\\$ )?\\d{1,3}(,\\d{3})*(\\.\\d{2})$){s<=2}',
+          '$ 10,1a2.111.12').fuzzy_counts, (2, 0, 0))
+
+        self.assertEqual(regex.fullmatch(r'(?e)(?:0?,0(?:,0)?){s<=1,d<=1}',
+          ',0;0').fuzzy_counts, (1, 0, 0))
+        self.assertEqual(regex.fullmatch(r'(?e)(?:0??,0(?:,0)?){s<=1,d<=1}',
+          ',0;0').fuzzy_counts, (1, 0, 0))
+
+        # Git issue 371: Specifying character set when fuzzy-matching allows characters not in the set
+        self.assertEqual(regex.search(r"\b(?e)(?:\d{6,20}){i<=5:[\-\\\/]}\b",
+          "cat dog starting at 00:01132.000. hello world"), None)
+
     def test_fuzzy_ext(self):
-        self.assertEquals(bool(regex.fullmatch(r'(?r)(?:a){e<=1:[a-z]}', 'e')),
+        self.assertEqual(bool(regex.fullmatch(r'(?r)(?:a){e<=1:[a-z]}', 'e')),
           True)
-        self.assertEquals(bool(regex.fullmatch(r'(?:a){e<=1:[a-z]}', 'e')),
+        self.assertEqual(bool(regex.fullmatch(r'(?:a){e<=1:[a-z]}', 'e')),
           True)
-        self.assertEquals(bool(regex.fullmatch(r'(?:a){e<=1:[a-z]}', '-')),
+        self.assertEqual(bool(regex.fullmatch(r'(?:a){e<=1:[a-z]}', '-')),
           False)
-        self.assertEquals(bool(regex.fullmatch(r'(?r)(?:a){e<=1:[a-z]}', '-')),
+        self.assertEqual(bool(regex.fullmatch(r'(?r)(?:a){e<=1:[a-z]}', '-')),
           False)
 
-        self.assertEquals(bool(regex.fullmatch(r'(?:a){e<=1:[a-z]}', 'ae')),
+        self.assertEqual(bool(regex.fullmatch(r'(?:a){e<=1:[a-z]}', 'ae')),
           True)
-        self.assertEquals(bool(regex.fullmatch(r'(?r)(?:a){e<=1:[a-z]}',
+        self.assertEqual(bool(regex.fullmatch(r'(?r)(?:a){e<=1:[a-z]}',
           'ae')), True)
-        self.assertEquals(bool(regex.fullmatch(r'(?:a){e<=1:[a-z]}', 'a-')),
+        self.assertEqual(bool(regex.fullmatch(r'(?:a){e<=1:[a-z]}', 'a-')),
           False)
-        self.assertEquals(bool(regex.fullmatch(r'(?r)(?:a){e<=1:[a-z]}',
+        self.assertEqual(bool(regex.fullmatch(r'(?r)(?:a){e<=1:[a-z]}',
           'a-')), False)
 
-        self.assertEquals(bool(regex.fullmatch(r'(?:ab){e<=1:[a-z]}', 'ae')),
+        self.assertEqual(bool(regex.fullmatch(r'(?:ab){e<=1:[a-z]}', 'ae')),
            True)
-        self.assertEquals(bool(regex.fullmatch(r'(?r)(?:ab){e<=1:[a-z]}',
+        self.assertEqual(bool(regex.fullmatch(r'(?r)(?:ab){e<=1:[a-z]}',
            'ae')), True)
-        self.assertEquals(bool(regex.fullmatch(r'(?:ab){e<=1:[a-z]}', 'a-')),
+        self.assertEqual(bool(regex.fullmatch(r'(?:ab){e<=1:[a-z]}', 'a-')),
            False)
-        self.assertEquals(bool(regex.fullmatch(r'(?r)(?:ab){e<=1:[a-z]}',
+        self.assertEqual(bool(regex.fullmatch(r'(?r)(?:ab){e<=1:[a-z]}',
            'a-')), False)
 
-        self.assertEquals(bool(regex.fullmatch(r'(a)\1{e<=1:[a-z]}', 'ae')),
+        self.assertEqual(bool(regex.fullmatch(r'(a)\1{e<=1:[a-z]}', 'ae')),
            True)
-        self.assertEquals(bool(regex.fullmatch(r'(?r)\1{e<=1:[a-z]}(a)',
+        self.assertEqual(bool(regex.fullmatch(r'(?r)\1{e<=1:[a-z]}(a)',
            'ea')), True)
-        self.assertEquals(bool(regex.fullmatch(r'(a)\1{e<=1:[a-z]}', 'a-')),
+        self.assertEqual(bool(regex.fullmatch(r'(a)\1{e<=1:[a-z]}', 'a-')),
            False)
-        self.assertEquals(bool(regex.fullmatch(r'(?r)\1{e<=1:[a-z]}(a)',
+        self.assertEqual(bool(regex.fullmatch(r'(?r)\1{e<=1:[a-z]}(a)',
            '-a')), False)
 
-        self.assertEquals(bool(regex.fullmatch(ur'(?fiu)(?:\N{LATIN SMALL LETTER SHARP S}){e<=1:[a-z]}',
+        self.assertEqual(bool(regex.fullmatch(ur'(?fiu)(?:\N{LATIN SMALL LETTER SHARP S}){e<=1:[a-z]}',
           u'ts')), True)
-        self.assertEquals(bool(regex.fullmatch(ur'(?fiu)(?:\N{LATIN SMALL LETTER SHARP S}){e<=1:[a-z]}',
+        self.assertEqual(bool(regex.fullmatch(ur'(?fiu)(?:\N{LATIN SMALL LETTER SHARP S}){e<=1:[a-z]}',
           u'st')), True)
-        self.assertEquals(bool(regex.fullmatch(ur'(?firu)(?:\N{LATIN SMALL LETTER SHARP S}){e<=1:[a-z]}',
+        self.assertEqual(bool(regex.fullmatch(ur'(?firu)(?:\N{LATIN SMALL LETTER SHARP S}){e<=1:[a-z]}',
           u'st')), True)
-        self.assertEquals(bool(regex.fullmatch(ur'(?firu)(?:\N{LATIN SMALL LETTER SHARP S}){e<=1:[a-z]}',
+        self.assertEqual(bool(regex.fullmatch(ur'(?firu)(?:\N{LATIN SMALL LETTER SHARP S}){e<=1:[a-z]}',
           u'ts')), True)
-        self.assertEquals(bool(regex.fullmatch(ur'(?fiu)(?:\N{LATIN SMALL LETTER SHARP S}){e<=1:[a-z]}',
+        self.assertEqual(bool(regex.fullmatch(ur'(?fiu)(?:\N{LATIN SMALL LETTER SHARP S}){e<=1:[a-z]}',
           u'-s')), False)
-        self.assertEquals(bool(regex.fullmatch(ur'(?fiu)(?:\N{LATIN SMALL LETTER SHARP S}){e<=1:[a-z]}',
+        self.assertEqual(bool(regex.fullmatch(ur'(?fiu)(?:\N{LATIN SMALL LETTER SHARP S}){e<=1:[a-z]}',
           u's-')), False)
-        self.assertEquals(bool(regex.fullmatch(ur'(?firu)(?:\N{LATIN SMALL LETTER SHARP S}){e<=1:[a-z]}',
+        self.assertEqual(bool(regex.fullmatch(ur'(?firu)(?:\N{LATIN SMALL LETTER SHARP S}){e<=1:[a-z]}',
           u's-')), False)
-        self.assertEquals(bool(regex.fullmatch(ur'(?firu)(?:\N{LATIN SMALL LETTER SHARP S}){e<=1:[a-z]}',
+        self.assertEqual(bool(regex.fullmatch(ur'(?firu)(?:\N{LATIN SMALL LETTER SHARP S}){e<=1:[a-z]}',
           u'-s')), False)
 
-        self.assertEquals(bool(regex.fullmatch(ur'(?fiu)(\N{LATIN SMALL LETTER SHARP S})\1{e<=1:[a-z]}',
+        self.assertEqual(bool(regex.fullmatch(ur'(?fiu)(\N{LATIN SMALL LETTER SHARP S})\1{e<=1:[a-z]}',
            u'ssst')), True)
-        self.assertEquals(bool(regex.fullmatch(ur'(?fiu)(\N{LATIN SMALL LETTER SHARP S})\1{e<=1:[a-z]}',
+        self.assertEqual(bool(regex.fullmatch(ur'(?fiu)(\N{LATIN SMALL LETTER SHARP S})\1{e<=1:[a-z]}',
            u'ssts')), True)
-        self.assertEquals(bool(regex.fullmatch(ur'(?firu)\1{e<=1:[a-z]}(\N{LATIN SMALL LETTER SHARP S})',
+        self.assertEqual(bool(regex.fullmatch(ur'(?firu)\1{e<=1:[a-z]}(\N{LATIN SMALL LETTER SHARP S})',
            u'stss')), True)
-        self.assertEquals(bool(regex.fullmatch(ur'(?firu)\1{e<=1:[a-z]}(\N{LATIN SMALL LETTER SHARP S})',
+        self.assertEqual(bool(regex.fullmatch(ur'(?firu)\1{e<=1:[a-z]}(\N{LATIN SMALL LETTER SHARP S})',
            u'tsss')), True)
-        self.assertEquals(bool(regex.fullmatch(ur'(?fiu)(\N{LATIN SMALL LETTER SHARP S})\1{e<=1:[a-z]}',
+        self.assertEqual(bool(regex.fullmatch(ur'(?fiu)(\N{LATIN SMALL LETTER SHARP S})\1{e<=1:[a-z]}',
            u'ss-s')), False)
-        self.assertEquals(bool(regex.fullmatch(ur'(?fiu)(\N{LATIN SMALL LETTER SHARP S})\1{e<=1:[a-z]}',
+        self.assertEqual(bool(regex.fullmatch(ur'(?fiu)(\N{LATIN SMALL LETTER SHARP S})\1{e<=1:[a-z]}',
            u'sss-')), False)
-        self.assertEquals(bool(regex.fullmatch(ur'(?firu)(\N{LATIN SMALL LETTER SHARP S})\1{e<=1:[a-z]}',
+        self.assertEqual(bool(regex.fullmatch(ur'(?firu)(\N{LATIN SMALL LETTER SHARP S})\1{e<=1:[a-z]}',
            u'-s')), False)
-        self.assertEquals(bool(regex.fullmatch(ur'(?firu)(\N{LATIN SMALL LETTER SHARP S})\1{e<=1:[a-z]}',
+        self.assertEqual(bool(regex.fullmatch(ur'(?firu)(\N{LATIN SMALL LETTER SHARP S})\1{e<=1:[a-z]}',
            u's-')), False)
 
-        self.assertEquals(bool(regex.fullmatch(ur'(?fiu)(ss)\1{e<=1:[a-z]}',
+        self.assertEqual(bool(regex.fullmatch(ur'(?fiu)(ss)\1{e<=1:[a-z]}',
            u'\N{LATIN SMALL LETTER SHARP S}ts')), True)
-        self.assertEquals(bool(regex.fullmatch(ur'(?fiu)(ss)\1{e<=1:[a-z]}',
+        self.assertEqual(bool(regex.fullmatch(ur'(?fiu)(ss)\1{e<=1:[a-z]}',
            u'\N{LATIN SMALL LETTER SHARP S}st')), True)
-        self.assertEquals(bool(regex.fullmatch(ur'(?firu)\1{e<=1:[a-z]}(ss)',
+        self.assertEqual(bool(regex.fullmatch(ur'(?firu)\1{e<=1:[a-z]}(ss)',
            u'st\N{LATIN SMALL LETTER SHARP S}')), True)
-        self.assertEquals(bool(regex.fullmatch(ur'(?firu)\1{e<=1:[a-z]}(ss)',
+        self.assertEqual(bool(regex.fullmatch(ur'(?firu)\1{e<=1:[a-z]}(ss)',
            u'ts\N{LATIN SMALL LETTER SHARP S}')), True)
-        self.assertEquals(bool(regex.fullmatch(ur'(?fiu)(ss)\1{e<=1:[a-z]}',
+        self.assertEqual(bool(regex.fullmatch(ur'(?fiu)(ss)\1{e<=1:[a-z]}',
            u'\N{LATIN SMALL LETTER SHARP S}-s')), False)
-        self.assertEquals(bool(regex.fullmatch(ur'(?fiu)(ss)\1{e<=1:[a-z]}',
+        self.assertEqual(bool(regex.fullmatch(ur'(?fiu)(ss)\1{e<=1:[a-z]}',
            u'\N{LATIN SMALL LETTER SHARP S}s-')), False)
-        self.assertEquals(bool(regex.fullmatch(ur'(?firu)(ss)\1{e<=1:[a-z]}',
+        self.assertEqual(bool(regex.fullmatch(ur'(?firu)(ss)\1{e<=1:[a-z]}',
            u's-\N{LATIN SMALL LETTER SHARP S}')), False)
-        self.assertEquals(bool(regex.fullmatch(ur'(?firu)(ss)\1{e<=1:[a-z]}',
+        self.assertEqual(bool(regex.fullmatch(ur'(?firu)(ss)\1{e<=1:[a-z]}',
            u'-s\N{LATIN SMALL LETTER SHARP S}')), False)
 
     def test_subscripted_captures(self):
diff --git a/regex_3/regex/__init__.py b/regex_3/__init__.py
similarity index 100%
rename from regex_3/regex/__init__.py
rename to regex_3/__init__.py
diff --git a/regex_3/_regex.c b/regex_3/_regex.c
index c720424..58888da 100644
--- a/regex_3/_regex.c
+++ b/regex_3/_regex.c
@@ -60,11 +60,6 @@
 #endif
 #endif
 
-#if PY_VERSION_HEX < 0x03030000
-typedef unsigned char Py_UCS1;
-typedef unsigned short Py_UCS2;
-
-#endif
 typedef RE_UINT32 RE_CODE;
 typedef unsigned char BYTE;
 
@@ -516,6 +511,7 @@ typedef struct RE_State {
     Py_ssize_t timeout; /* The timeout in clock ticks. */
     clock_t start_time; /* The clock time when matching started. */
     int partial_side; /* The side that could truncate in a partial match. */
+    /* Various flags. */
     RE_UINT16 iterations; /* The number of iterations the matching engine has performed since checking for KeyboardInterrupt. */
     BOOL is_unicode; /* Whether the string to be matched is Unicode. */
     BOOL should_release; /* Whether the buffer should be released. */
@@ -1502,11 +1498,7 @@ static BOOL unicode_at_word_end(RE_State* state, Py_ssize_t text_pos) {
  * Only a limited number are treated as vowels.
  */
 Py_LOCAL_INLINE(BOOL) is_unicode_vowel(Py_UCS4 ch) {
-#if PY_VERSION_HEX >= 0x03030000
     switch (Py_UNICODE_TOLOWER(ch)) {
-#else
-    switch (Py_UNICODE_TOLOWER((Py_UNICODE)ch)) {
-#endif
     case 'a': case 0xE0: case 0xE1: case 0xE2:
     case 'e': case 0xE8: case 0xE9: case 0xEA:
     case 'i': case 0xEC: case 0xED: case 0xEE:
@@ -1854,7 +1846,7 @@ static BOOL unicode_at_grapheme_boundary(RE_State* state, Py_ssize_t text_pos)
         return FALSE;
 
     /* GB8 */
-    if ((left_prop == RE_GBREAK_LVT || left_prop == RE_GBREAK_T) && left_prop
+    if ((left_prop == RE_GBREAK_LVT || left_prop == RE_GBREAK_T) && right_prop
       == RE_GBREAK_T)
         return FALSE;
 
@@ -1895,14 +1887,16 @@ static BOOL unicode_at_grapheme_boundary(RE_State* state, Py_ssize_t text_pos)
      * number of RI characters before the break point.
      */
     /* GB12 and GB13 */
-    pos = left_pos;
+    if (right_prop == RE_GBREAK_REGIONALINDICATOR) {
+        pos = left_pos;
 
-    while (pos >= 0 && re_get_grapheme_cluster_break(char_at(state->text, pos))
-      == RE_WBREAK_REGIONALINDICATOR)
-        --pos;
+        while (pos >= 0 && re_get_grapheme_cluster_break(char_at(state->text,
+          pos)) == RE_GBREAK_REGIONALINDICATOR)
+            --pos;
 
-    if ((left_pos - pos) % 2 == 1)
-        return FALSE;
+        if ((left_pos - pos) % 2 == 1)
+            return FALSE;
+    }
 
     /* Otherwise, break everywhere. */
     /* GB999 */
@@ -9373,7 +9367,8 @@ Py_LOCAL_INLINE(BOOL) is_repeat_guarded(RE_State* state, size_t index,
     RE_GuardList* guard_list;
 
     /* Is a guard active here? */
-    if (!(state->pattern->repeat_info[index].status & guard_type))
+    if (!(state->pattern->repeat_info[index].status & guard_type) ||
+      state->is_fuzzy)
         return FALSE;
 
     /* Which guard list? */
@@ -9468,795 +9463,67 @@ Py_LOCAL_INLINE(PyObject*) build_unicode_value(void* buffer, Py_ssize_t start,
 
     return result;
 #else
-#if PY_VERSION_HEX >= 0x03030000
     Py_ssize_t len;
     int kind;
 
     buffer = (void*)((RE_UINT8*)buffer + start * buffer_charsize);
     len = end - start;
 
-    switch (buffer_charsize) {
-    case 1:
-        kind = PyUnicode_1BYTE_KIND;
-        break;
-    case 2:
-        kind = PyUnicode_2BYTE_KIND;
-        break;
-    case 4:
-        kind = PyUnicode_4BYTE_KIND;
-        break;
-    default:
-        kind = PyUnicode_1BYTE_KIND;
-        break;
-    }
-
-    return PyUnicode_FromKindAndData(kind, buffer, len);
-#else
-    Py_ssize_t len;
-
-    buffer = (void*)((RE_UINT8*)buffer + start * buffer_charsize);
-    len = end - start;
-
-    return PyUnicode_FromUnicode(buffer, len);
-#endif
-#endif
-}
-
-/* Builds a bytestring. Returns NULL if any member is too wide. */
-Py_LOCAL_INLINE(PyObject*) build_bytes_value(void* buffer, Py_ssize_t start,
-  Py_ssize_t end, Py_ssize_t buffer_charsize) {
-    Py_ssize_t len;
-    Py_UCS1* byte_buffer;
-    Py_ssize_t i;
-    PyObject* result;
-
-    buffer = (void*)((RE_UINT8*)buffer + start * buffer_charsize);
-    len = end - start;
-
-    if (buffer_charsize == 1)
-        return Py_BuildValue("y#", buffer, len);
-
-    byte_buffer = re_alloc((size_t)len);
-    if (!byte_buffer)
-        return NULL;
-
-    for (i = 0; i < len; i++) {
-        Py_UCS2 c = ((Py_UCS2*)buffer)[i];
-        if (c > 0xFF)
-            goto too_wide;
-
-        byte_buffer[i] = (Py_UCS1)c;
-    }
-
-    result = Py_BuildValue("y#", byte_buffer, len);
-
-    re_dealloc(byte_buffer);
-
-    return result;
-
-too_wide:
-    re_dealloc(byte_buffer);
-
-    return NULL;
-}
-
-/* Looks for a string in a string set. */
-Py_LOCAL_INLINE(int) string_set_contains(RE_State* state, PyObject* string_set,
-  Py_ssize_t first, Py_ssize_t last) {
-    PyObject* string;
-    int status;
-
-    if (state->is_unicode)
-        string = build_unicode_value(state->text, first, last,
-          state->charsize);
-    else
-        string = build_bytes_value(state->text, first, last, state->charsize);
-    if (!string)
-        return RE_ERROR_INTERNAL;
-
-    status = PySet_Contains(string_set, string);
-    Py_DECREF(string);
-
-    return status;
-}
-
-/* Looks for a string in a string set, ignoring case. */
-Py_LOCAL_INLINE(int) string_set_contains_ign(RE_State* state, PyObject*
-  string_set, void* buffer, Py_ssize_t first, Py_ssize_t last, Py_ssize_t
-   index, Py_ssize_t buffer_charsize) {
-    Py_UCS4 (*char_at)(void* text, Py_ssize_t pos);
-    void (*set_char_at)(void* text, Py_ssize_t pos, Py_UCS4 ch);
-    RE_EncodingTable* encoding;
-    RE_LocaleInfo* locale_info;
-    BOOL (*possible_turkic)(RE_LocaleInfo* locale_info, Py_UCS4 ch);
-    Py_UCS4 codepoints[4];
-
-    switch (buffer_charsize) {
-    case 1:
-        char_at = bytes1_char_at;
-        set_char_at = bytes1_set_char_at;
-        break;
-    case 2:
-        char_at = bytes2_char_at;
-        set_char_at = bytes2_set_char_at;
-        break;
-    case 4:
-        char_at = bytes4_char_at;
-        set_char_at = bytes4_set_char_at;
-        break;
-    default:
-        char_at = bytes1_char_at;
-        set_char_at = bytes1_set_char_at;
-        break;
-    }
-
-    encoding = state->encoding;
-    locale_info = state->locale_info;
-    possible_turkic = encoding->possible_turkic;
-
-    /* Look for a possible Turkic 'I'. */
-    while (index < last && !possible_turkic(locale_info, char_at(buffer,
-      index)))
-        ++index;
-
-    if (index < last) {
-        /* Possible Turkic 'I'. */
-        int count;
-        int i;
-
-        /* Try all the alternatives to the 'I'. */
-        count = encoding->all_turkic_i(locale_info, char_at(buffer, index),
-          codepoints);
-
-        for (i = 0; i < count; i++) {
-            int status;
-
-            set_char_at(buffer, index, codepoints[i]);
-
-            /* Recurse for the remainder of the string. */
-            status = string_set_contains_ign(state, string_set, buffer, first,
-              last, index + 1, buffer_charsize);
-            if (status != 0)
-                return status;
-        }
-
-        return 0;
-    } else {
-        /* No Turkic 'I'. */
-        PyObject* string;
-        int status;
-
-        if (state->is_unicode)
-            string = build_unicode_value(buffer, first, last, buffer_charsize);
-        else
-            string = build_bytes_value(buffer, first, last, buffer_charsize);
-        if (!string)
-            return RE_ERROR_MEMORY;
-
-        status = PySet_Contains(string_set, string);
-        Py_DECREF(string);
-
-        return status;
-    }
-}
-
-/* Creates a partial string set for truncation at the left or right side. */
-Py_LOCAL_INLINE(int) make_partial_string_set(RE_State* state, RE_Node* node) {
-    PatternObject* pattern;
-    int partial_side;
-    PyObject* string_set;
-    PyObject* partial_set;
-    PyObject* iter = NULL;
-    PyObject* item = NULL;
-    PyObject* slice = NULL;
-
-    pattern = state->pattern;
-    partial_side = state->partial_side;
-    if (partial_side != RE_PARTIAL_LEFT && partial_side != RE_PARTIAL_RIGHT)
-        return RE_ERROR_INTERNAL;
-
-    /* Fetch the full string set. PyList_GET_ITEM borrows a reference. */
-    string_set = PyList_GET_ITEM(pattern->named_list_indexes, node->values[0]);
-    if (!string_set)
-        return RE_ERROR_INTERNAL;
-
-    /* Gets the list of partial string sets. */
-    if (!pattern->partial_named_lists[partial_side]) {
-        size_t size;
-
-        size = pattern->named_lists_count * sizeof(PyObject*);
-        pattern->partial_named_lists[partial_side] = re_alloc(size);
-        if (!pattern->partial_named_lists[partial_side])
-            return RE_ERROR_INTERNAL;
-
-        memset(pattern->partial_named_lists[partial_side], 0, size);
-    }
-
-    /* Get the partial string set. */
-    partial_set = pattern->partial_named_lists[partial_side][node->values[0]];
-    if (partial_set)
-        return 1;
-
-    /* Build the partial string set. */
-    partial_set = PySet_New(NULL);
-    if (!partial_set)
-        return RE_ERROR_INTERNAL;
-
-    iter = PyObject_GetIter(string_set);
-    if (!iter)
-        goto error;
-
-    item = PyIter_Next(iter);
-
-    while (item) {
-        Py_ssize_t len;
-        Py_ssize_t first;
-        Py_ssize_t last;
-
-        len = PySequence_Length(item);
-        if (len == -1)
-            goto error;
-
-        first = 0;
-        last = len;
-
-        while (last - first > 1) {
-            int status;
-
-            /* Shorten the entry. */
-            if (partial_side == RE_PARTIAL_LEFT)
-                ++first;
-            else
-                --last;
-
-            slice = PySequence_GetSlice(item, first, last);
-            if (!slice)
-                goto error;
-
-            status = PySet_Add(partial_set, slice);
-            Py_DECREF(slice);
-            if (status < 0)
-                goto error;
-        }
-
-        Py_DECREF(item);
-        item = PyIter_Next(iter);
-    }
-
-    if (PyErr_Occurred())
-        goto error;
-
-    Py_DECREF(iter);
-
-    pattern->partial_named_lists[partial_side][node->values[0]] = partial_set;
-
-    return 1;
-
-error:
-    Py_XDECREF(item);
-    Py_XDECREF(iter);
-    Py_DECREF(partial_set);
-
-    return RE_ERROR_INTERNAL;
-}
-
-/* Tries to match a string at the current position with a member of a string
- * set, forwards or backwards.
- */
-Py_LOCAL_INLINE(int) string_set_match_fwdrev(RE_State* state, RE_Node* node,
-  BOOL reverse) {
-    Py_ssize_t min_len;
-    Py_ssize_t max_len;
-    Py_ssize_t text_available;
-    Py_ssize_t slice_available;
-    int partial_side;
-    Py_ssize_t len;
-    Py_ssize_t first;
-    Py_ssize_t last;
-    int status;
-    PyObject* string_set;
-
-    min_len = (Py_ssize_t)node->values[1];
-    max_len = (Py_ssize_t)node->values[2];
-
-    acquire_GIL(state);
-
-    if (reverse) {
-        text_available = state->text_pos;
-        slice_available = state->text_pos - state->slice_start;
-        partial_side = RE_PARTIAL_LEFT;
-    } else {
-        text_available = state->text_length - state->text_pos;
-        slice_available = state->slice_end - state->text_pos;
-        partial_side = RE_PARTIAL_RIGHT;
-    }
-
-    /* Get as many characters as we need for the longest possible match. */
-    len = min_ssize_t(max_len, slice_available);
-
-    if (reverse) {
-        first = state->text_pos - len;
-        last = state->text_pos;
-    } else {
-        first = state->text_pos;
-        last = state->text_pos + len;
-    }
-
-    /* If we didn't get all of the characters we need, is a partial match
-     * allowed?
-     */
-    if (len < max_len && len == text_available && state->partial_side ==
-      partial_side) {
-        if (len == 0) {
-            /* An empty string is always a possible partial match. */
-            status = RE_ERROR_PARTIAL;
-            goto finished;
-        }
-
-        /* Make a set of the possible partial matches. */
-        status = make_partial_string_set(state, node);
-        if (status < 0)
-            goto finished;
-
-        /* Fetch the partial string set. */
-        string_set =
-          state->pattern->partial_named_lists[partial_side][node->values[0]];
-
-        /* Is the text we have a partial match? */
-        status = string_set_contains(state, string_set, first, last);
-        if (status < 0)
-            goto finished;
-
-        if (status == 1) {
-            /* Advance past the match. */
-            if (reverse)
-                state->text_pos -= len;
-            else
-                state->text_pos += len;
-
-            status = RE_ERROR_PARTIAL;
-            goto finished;
-        }
-    }
-
-    /* Fetch the string set. PyList_GET_ITEM borrows a reference. */
-    string_set = PyList_GET_ITEM(state->pattern->named_list_indexes,
-      node->values[0]);
-    if (!string_set) {
-        status = RE_ERROR_INTERNAL;
-        goto finished;
-    }
-
-    /* We've already looked for a partial match (if allowed), but what about a
-     * complete match?
-     */
-    while (len >= min_len) {
-        status = string_set_contains(state, string_set, first, last);
-
-        if (status == 1) {
-            /* Advance past the match. */
-            if (reverse)
-                state->text_pos -= len;
-            else
-                state->text_pos += len;
-
-            status = 1;
-            goto finished;
-        }
-
-        /* Look for a shorter match. */
-        --len;
-        if (reverse)
-            ++first;
-        else
-            --last;
-    }
-
-    /* No match. */
-    status = 0;
-
-finished:
-    release_GIL(state);
-
-    return status;
-}
-
-/* Tries to match a string at the current position with a member of a string
- * set, ignoring case, forwards or backwards.
- */
-Py_LOCAL_INLINE(int) string_set_match_fld_fwdrev(RE_State* state, RE_Node*
-  node, BOOL reverse) {
-    int (*full_case_fold)(RE_LocaleInfo* locale_info, Py_UCS4 ch, Py_UCS4*
-      folded);
-    Py_UCS4 (*char_at)(void* text, Py_ssize_t pos);
-    Py_ssize_t folded_charsize;
-    void (*set_char_at)(void* text, Py_ssize_t pos, Py_UCS4 ch);
-    Py_ssize_t min_len;
-    Py_ssize_t max_len;
-    Py_ssize_t buf_len;
-    void* folded;
-    int status;
-    BOOL* end_of_fold = NULL;
-    Py_ssize_t text_available;
-    Py_ssize_t slice_available;
-    Py_ssize_t t_pos;
-    Py_ssize_t f_pos;
-    int step;
-    int partial_side;
-    Py_ssize_t len;
-    Py_ssize_t consumed;
-    Py_UCS4 codepoints[RE_MAX_FOLDED];
-    Py_ssize_t first;
-    Py_ssize_t last;
-    PyObject* string_set;
-
-    full_case_fold = state->encoding->full_case_fold;
-    char_at = state->char_at;
-
-#if PY_VERSION_HEX >= 0x03030000
-    /* The folded string needs to be at least 2 bytes per character. */
-    folded_charsize = max_ssize_t(state->charsize, sizeof(Py_UCS2));
-#else
-    /* The folded string will have the same width as the original string. */
-    folded_charsize = state->charsize;
-#endif
-
-    switch (folded_charsize) {
-    case 1:
-        set_char_at = bytes1_set_char_at;
-        break;
-    case 2:
-        set_char_at = bytes2_set_char_at;
-        break;
-    case 4:
-        set_char_at = bytes4_set_char_at;
-        break;
-    default:
-        return RE_ERROR_INTERNAL;
-    }
-
-    min_len = (Py_ssize_t)node->values[1];
-    max_len = (Py_ssize_t)node->values[2];
-
-    acquire_GIL(state);
-
-    /* Allocate a buffer for the folded string. */
-    buf_len = max_len + RE_MAX_FOLDED;
-    folded = re_alloc((size_t)(buf_len * folded_charsize));
-    if (!folded) {
-        status = RE_ERROR_MEMORY;
-        goto finished;
-    }
-
-    end_of_fold = re_alloc((size_t)buf_len * sizeof(BOOL));
-    if (!end_of_fold) {
-        status = RE_ERROR_MEMORY;
-        goto finished;
-    }
-
-    memset(end_of_fold, 0, (size_t)buf_len * sizeof(BOOL));
-
-    if (reverse) {
-        text_available = state->text_pos;
-        slice_available = state->text_pos - state->slice_start;
-        t_pos = state->text_pos - 1;
-        f_pos = buf_len;
-        step = -1;
-        partial_side = RE_PARTIAL_LEFT;
-    } else {
-        text_available = state->text_length - state->text_pos;
-        slice_available = state->slice_end - state->text_pos;
-        t_pos = state->text_pos;
-        f_pos = 0;
-        step = 1;
-        partial_side = RE_PARTIAL_RIGHT;
-    }
-
-    /* We can stop getting characters as soon as the case-folded string is long
-     * enough (each codepoint from the text can expand to more than one folded
-     * codepoint).
-     */
-    len = 0;
-    end_of_fold[len] = TRUE;
-
-    consumed = 0;
-    while (len < max_len && consumed < slice_available) {
-        int count;
-        int j;
-
-        count = full_case_fold(state->locale_info, char_at(state->text, t_pos),
-          codepoints);
-
-        if (reverse)
-            f_pos -= count;
-
-        for (j = 0; j < count; j++)
-            set_char_at(folded, f_pos + j, codepoints[j]);
-
-        if (!reverse)
-            f_pos += count;
-
-        len += count;
-        end_of_fold[len] = TRUE;
-        ++consumed;
-        t_pos += step;
-    }
-
-    if (reverse) {
-        first = f_pos;
-        last = buf_len;
-    } else {
-        first = 0;
-        last = f_pos;
-    }
-
-    /* If we didn't get all of the characters we need, is a partial match
-     * allowed?
-     */
-    if (len < max_len && len == text_available && state->partial_side ==
-      partial_side) {
-        if (len == 0) {
-            /* An empty string is always a possible partial match. */
-            status = RE_ERROR_PARTIAL;
-            goto finished;
-        }
-
-        /* Make a set of the possible partial matches. */
-        status = make_partial_string_set(state, node);
-        if (status < 0)
-            goto finished;
-
-        /* Fetch the partial string set. */
-        string_set =
-          state->pattern->partial_named_lists[partial_side][node->values[0]];
-
-        /* Is the text we have a partial match? */
-        status = string_set_contains_ign(state, string_set, folded, first,
-          last, first, folded_charsize);
-        if (status < 0)
-            goto finished;
-
-        if (status == 1) {
-            /* Advance past the match. */
-            if (reverse)
-                state->text_pos -= consumed;
-            else
-                state->text_pos += consumed;
-
-            status = RE_ERROR_PARTIAL;
-            goto finished;
-        }
-    }
-
-    /* Fetch the string set. PyList_GET_ITEM borrows a reference. */
-    string_set = PyList_GET_ITEM(state->pattern->named_list_indexes,
-      node->values[0]);
-    if (!string_set) {
-        status = RE_ERROR_INTERNAL;
-        goto finished;
-    }
-
-    /* We've already looked for a partial match (if allowed), but what about a
-     * complete match?
-     */
-    while (len >= min_len) {
-        if (end_of_fold[len]) {
-            status = string_set_contains_ign(state, string_set, folded, first,
-              last, first, folded_charsize);
-
-            if (status == 1) {
-                /* Advance past the match. */
-                if (reverse)
-                    state->text_pos -= consumed;
-                else
-                    state->text_pos += consumed;
-
-                status = 1;
-                goto finished;
-            }
-
-            --consumed;
-        }
-
-        /* Look for a shorter match. */
-        --len;
-        if (reverse)
-            ++first;
-        else
-            --last;
-    }
-
-    /* No match. */
-    status = 0;
-
-finished:
-    re_dealloc(end_of_fold);
-    re_dealloc(folded);
-
-    release_GIL(state);
-
-    return status;
-}
-
-/* Tries to match a string at the current position with a member of a string
- * set, ignoring case, forwards or backwards.
- */
-Py_LOCAL_INLINE(int) string_set_match_ign_fwdrev(RE_State* state, RE_Node*
-  node, BOOL reverse) {
-    Py_UCS4 (*simple_case_fold)(RE_LocaleInfo* locale_info, Py_UCS4 ch);
-    Py_UCS4 (*char_at)(void* text, Py_ssize_t pos);
-    Py_ssize_t folded_charsize;
-    void (*set_char_at)(void* text, Py_ssize_t pos, Py_UCS4 ch);
-    Py_ssize_t min_len;
-    Py_ssize_t max_len;
-    void* folded;
-    int status;
-    Py_ssize_t text_available;
-    Py_ssize_t slice_available;
-    Py_ssize_t t_pos;
-    Py_ssize_t f_pos;
-    int step;
-    int partial_side;
-    Py_ssize_t len;
-    Py_ssize_t i;
-    Py_ssize_t first;
-    Py_ssize_t last;
-    PyObject* string_set;
-
-    simple_case_fold = state->encoding->simple_case_fold;
-    char_at = state->char_at;
-
-#if PY_VERSION_HEX >= 0x03030000
-    /* The folded string needs to be at least 2 bytes per character. */
-    folded_charsize = max_ssize_t(state->charsize, sizeof(Py_UCS2));
-#else
-    /* The folded string will have the same width as the original string. */
-    folded_charsize = state->charsize;
-#endif
-
-    switch (folded_charsize) {
+    switch (buffer_charsize) {
     case 1:
-        set_char_at = bytes1_set_char_at;
+        kind = PyUnicode_1BYTE_KIND;
         break;
     case 2:
-        set_char_at = bytes2_set_char_at;
+        kind = PyUnicode_2BYTE_KIND;
         break;
     case 4:
-        set_char_at = bytes4_set_char_at;
+        kind = PyUnicode_4BYTE_KIND;
         break;
     default:
-        return RE_ERROR_INTERNAL;
-    }
-
-    min_len = (Py_ssize_t)node->values[1];
-    max_len = (Py_ssize_t)node->values[2];
-
-    acquire_GIL(state);
-
-    /* Allocate a buffer for the folded string. */
-    folded = re_alloc((size_t)(max_len * folded_charsize));
-    if (!folded) {
-        status = RE_ERROR_MEMORY;
-        goto finished;
-    }
-
-    if (reverse) {
-        text_available = state->text_pos;
-        slice_available = state->text_pos - state->slice_start;
-        t_pos = state->text_pos - 1;
-        f_pos = max_len - 1;
-        step = -1;
-        partial_side = RE_PARTIAL_LEFT;
-    } else {
-        text_available = state->text_length - state->text_pos;
-        slice_available = state->slice_end - state->text_pos;
-        t_pos = state->text_pos;
-        f_pos = 0;
-        step = 1;
-        partial_side = RE_PARTIAL_RIGHT;
-    }
-
-    /* Get as many characters as we need for the longest possible match. */
-    len = min_ssize_t(max_len, slice_available);
-
-    for (i = 0; i < len; i ++) {
-        Py_UCS4 ch;
-
-        ch = simple_case_fold(state->locale_info, char_at(state->text, t_pos));
-        set_char_at(folded, f_pos, ch);
-        t_pos += step;
-        f_pos += step;
-    }
-
-    if (reverse) {
-        first = f_pos + 1;
-        last = max_len;
-    } else {
-        first = 0;
-        last = f_pos;
+        kind = PyUnicode_1BYTE_KIND;
+        break;
     }
 
-    /* If we didn't get all of the characters we need, is a partial match
-     * allowed?
-     */
-    if (len < max_len && len == text_available && state->partial_side ==
-      partial_side) {
-        if (len == 0) {
-            /* An empty string is always a possible partial match. */
-            status = RE_ERROR_PARTIAL;
-            goto finished;
-        }
+    return PyUnicode_FromKindAndData(kind, buffer, len);
+#endif
+}
 
-        /* Make a set of the possible partial matches. */
-        status = make_partial_string_set(state, node);
-        if (status < 0)
-            goto finished;
+/* Builds a bytestring. Returns NULL if any member is too wide. */
+Py_LOCAL_INLINE(PyObject*) build_bytes_value(void* buffer, Py_ssize_t start,
+  Py_ssize_t end, Py_ssize_t buffer_charsize) {
+    Py_ssize_t len;
+    Py_UCS1* byte_buffer;
+    Py_ssize_t i;
+    PyObject* result;
 
-        /* Fetch the partial string set. */
-        string_set =
-          state->pattern->partial_named_lists[partial_side][node->values[0]];
+    buffer = (void*)((RE_UINT8*)buffer + start * buffer_charsize);
+    len = end - start;
 
-        /* Is the text we have a partial match? */
-        status = string_set_contains_ign(state, string_set, folded, first,
-          last, first, folded_charsize);
-        if (status < 0)
-            goto finished;
+    if (buffer_charsize == 1)
+        return Py_BuildValue("y#", buffer, len);
 
-        if (status == 1) {
-            /* Advance past the match. */
-            if (reverse)
-                state->text_pos -= len;
-            else
-                state->text_pos += len;
+    byte_buffer = re_alloc((size_t)len);
+    if (!byte_buffer)
+        return NULL;
 
-            status = RE_ERROR_PARTIAL;
-            goto finished;
-        }
-    }
+    for (i = 0; i < len; i++) {
+        Py_UCS2 c = ((Py_UCS2*)buffer)[i];
+        if (c > 0xFF)
+            goto too_wide;
 
-    /* Fetch the string set. PyList_GET_ITEM borrows a reference. */
-    string_set = PyList_GET_ITEM(state->pattern->named_list_indexes,
-      node->values[0]);
-    if (!string_set) {
-        status = RE_ERROR_INTERNAL;
-        goto finished;
+        byte_buffer[i] = (Py_UCS1)c;
     }
 
-    /* We've already looked for a partial match (if allowed), but what about a
-     * complete match?
-     */
-    while (len >= min_len) {
-        status = string_set_contains_ign(state, string_set, folded, first,
-          last, first, folded_charsize);
-
-        if (status == 1) {
-            /* Advance past the match. */
-            if (reverse)
-                state->text_pos -= len;
-            else
-                state->text_pos += len;
-
-            status = 1;
-            goto finished;
-        }
-
-        /* Look for a shorter match. */
-        --len;
-        if (reverse)
-            ++first;
-        else
-            --last;
-    }
+    result = Py_BuildValue("y#", byte_buffer, len);
 
-    /* No match. */
-    status = 0;
+    re_dealloc(byte_buffer);
 
-finished:
-    re_dealloc(folded);
+    return result;
 
-    release_GIL(state);
+too_wide:
+    re_dealloc(byte_buffer);
 
-    return status;
+    return NULL;
 }
 
 Py_LOCAL_INLINE(size_t) total_errors(size_t* fuzzy_counts) {
@@ -10420,16 +9687,25 @@ Py_LOCAL_INLINE(void) unrecord_fuzzy(RE_State* state) {
     --state->fuzzy_changes.count;
 }
 
-/* Makes a list of lists of fuzzy changes. */
-Py_LOCAL_INLINE(void) make_fuzzy_changes_list(RE_FuzzyChangesList*
+/* Initialises a list of fuzzy changes. */
+Py_LOCAL_INLINE(void) init_fuzzy_changes_list(RE_FuzzyChangesList*
   changes_list) {
     changes_list->capacity = 0;
     changes_list->count = 0;
     changes_list->items = NULL;
 }
 
-/* Makes a list of lists of fuzzy changes. */
-Py_LOCAL_INLINE(void) make_best_changes_list(RE_BestChangesList*
+/* Finalises a list of fuzzy changes. */
+Py_LOCAL_INLINE(void) fini_fuzzy_changes_list(RE_State* state,
+  RE_FuzzyChangesList* changes_list) {
+    safe_dealloc(state, changes_list->items);
+    changes_list->capacity = 0;
+    changes_list->count = 0;
+    changes_list->items = NULL;
+}
+
+/* Initialises a list of lists of fuzzy changes. */
+Py_LOCAL_INLINE(void) init_best_changes_list(RE_BestChangesList*
   best_changes_list) {
     best_changes_list->capacity = 0;
     best_changes_list->count = 0;
@@ -10454,11 +9730,14 @@ Py_LOCAL_INLINE(void) clear_best_fuzzy_changes(RE_State* state,
     best_changes_list->count = 0;
 }
 
-/* Destroys a list of lists of fuzzy changes. */
-Py_LOCAL_INLINE(void) destroy_best_changes_list(RE_State* state,
+/* Finalises a list of lists of fuzzy changes. */
+Py_LOCAL_INLINE(void) fini_best_changes_list(RE_State* state,
   RE_BestChangesList* best_changes_list) {
     clear_best_fuzzy_changes(state, best_changes_list);
     safe_dealloc(state, best_changes_list->lists);
+    best_changes_list->capacity = 0;
+    best_changes_list->count = 0;
+    best_changes_list->lists = NULL;
 }
 
 /* Adds a list of fuzzy changes to a list of best fuzzy changes. */
@@ -10501,20 +9780,6 @@ Py_LOCAL_INLINE(BOOL) add_best_fuzzy_changes(RE_State* state,
     return TRUE;
 }
 
-/* Initialises a list of fuzzy changes. */
-Py_LOCAL_INLINE(void) make_changes_list(RE_State* state, RE_FuzzyChangesList*
-  best_changes_list) {
-    best_changes_list->capacity = 0;
-    best_changes_list->count = 0;
-    best_changes_list->items = NULL;
-}
-
-/* Finitialises a list of fuzzy changes. */
-Py_LOCAL_INLINE(void) destroy_changes_list(RE_State* state,
-  RE_FuzzyChangesList* best_changes_list) {
-    safe_dealloc(state, best_changes_list->items);
-}
-
 /* Saves a list of fuzzy changes. */
 Py_LOCAL_INLINE(BOOL) save_fuzzy_changes(RE_State* state, RE_FuzzyChangesList*
   best_changes_list) {
@@ -10612,6 +9877,13 @@ Py_LOCAL_INLINE(BOOL) fuzzy_ext_match(RE_State* state, RE_Node* fuzzy_node,
         return pos > state->slice_start && matches_RANGE(state->encoding,
           state->locale_info, test_node, state->char_at(state->text, pos - 1))
           == test_node->match;
+    case RE_OP_SET_DIFF:
+    case RE_OP_SET_INTER:
+    case RE_OP_SET_SYM_DIFF:
+    case RE_OP_SET_UNION:
+        return pos < state->slice_end && matches_SET(state->encoding,
+          state->locale_info, test_node, state->char_at(state->text, pos)) ==
+          test_node->match;
     }
 
     return TRUE;
@@ -10703,6 +9975,14 @@ Py_LOCAL_INLINE(BOOL) fuzzy_ext_match_group_fld(RE_State* state, RE_Node*
           matches_RANGE(state->encoding, state->locale_info, test_node,
           folded_char_at(state, state->text_pos - 1, folded_pos - 1)) ==
           test_node->match;
+    case RE_OP_SET_DIFF:
+    case RE_OP_SET_INTER:
+    case RE_OP_SET_SYM_DIFF:
+    case RE_OP_SET_UNION:
+        return state->text_pos < state->slice_end &&
+          matches_SET(state->encoding, state->locale_info, test_node,
+          folded_char_at(state, state->text_pos, folded_pos)) ==
+          test_node->match;
     }
 
     return TRUE;
@@ -10713,58 +9993,60 @@ Py_LOCAL_INLINE(int) next_fuzzy_match_item(RE_State* state, RE_FuzzyData* data,
   BOOL is_string, RE_INT8 step) {
     Py_ssize_t new_pos;
 
-    if (this_error_permitted(state, data->fuzzy_type)) {
-        switch (data->fuzzy_type) {
-        case RE_FUZZY_DEL:
-            /* Could a character at text_pos have been deleted? */
-            if (step == 0)
-                return RE_ERROR_FAILURE;
+    if (!this_error_permitted(state, data->fuzzy_type))
+        return RE_ERROR_FAILURE;
 
-            if (is_string)
-                data->new_string_pos += step;
-            else
-                data->new_node = data->new_node->next_1.node;
-            return RE_ERROR_SUCCESS;
-        case RE_FUZZY_INS:
-            /* Could the character at text_pos have been inserted? */
-            if (!data->permit_insertion)
+    switch (data->fuzzy_type) {
+    case RE_FUZZY_DEL:
+        /* Could a character at text_pos have been deleted? */
+        if (step == 0)
+            return RE_ERROR_FAILURE;
+
+        if (is_string)
+            data->new_string_pos += step;
+        else
+            data->new_node = data->new_node->next_1.node;
+        return RE_ERROR_SUCCESS;
+    case RE_FUZZY_INS:
+        /* Could the character at text_pos have been inserted? */
+        if (!data->permit_insertion)
+            return RE_ERROR_FAILURE;
+
+        if (step == 0)
+            new_pos = data->new_text_pos + data->step;
+        else
+            new_pos = data->new_text_pos + step;
+
+        if (state->slice_start <= new_pos && new_pos <= state->slice_end) {
+            if (!fuzzy_ext_match(state, state->fuzzy_node, data->new_text_pos))
                 return RE_ERROR_FAILURE;
 
-            if (step == 0)
-                new_pos = data->new_text_pos + data->step;
-            else
-                new_pos = data->new_text_pos + step;
-            if (state->slice_start <= new_pos && new_pos <= state->slice_end) {
-                if (!fuzzy_ext_match(state, state->fuzzy_node,
-                  data->new_text_pos))
-                    return RE_ERROR_FAILURE;
+            data->new_text_pos = new_pos;
+            return RE_ERROR_SUCCESS;
+        }
 
-                data->new_text_pos = new_pos;
-                return RE_ERROR_SUCCESS;
-            }
+        return check_fuzzy_partial(state, new_pos);
+    case RE_FUZZY_SUB:
+        /* Could the character at text_pos have been substituted? */
+        if (step == 0)
+            return RE_ERROR_FAILURE;
 
-            return check_fuzzy_partial(state, new_pos);
-        case RE_FUZZY_SUB:
-            /* Could the character at text_pos have been substituted? */
-            if (step == 0)
+        new_pos = data->new_text_pos + step;
+        if (state->slice_start <= new_pos && new_pos <= state->slice_end) {
+            if (!fuzzy_ext_match(state, state->fuzzy_node, data->new_text_pos))
                 return RE_ERROR_FAILURE;
 
-            new_pos = data->new_text_pos + step;
-            if (state->slice_start <= new_pos && new_pos <= state->slice_end) {
-                if (!fuzzy_ext_match(state, state->fuzzy_node,
-                  data->new_text_pos))
-                    return RE_ERROR_FAILURE;
+            data->new_text_pos = new_pos;
 
-                data->new_text_pos = new_pos;
-                if (is_string)
-                    data->new_string_pos += step;
-                else
-                    data->new_node = data->new_node->next_1.node;
-                return RE_ERROR_SUCCESS;
-            }
+            if (is_string)
+                data->new_string_pos += step;
+            else
+                data->new_node = data->new_node->next_1.node;
 
-            return check_fuzzy_partial(state, new_pos);
+            return RE_ERROR_SUCCESS;
         }
+
+        return check_fuzzy_partial(state, new_pos);
     }
 
     return RE_ERROR_FAILURE;
@@ -10775,11 +10057,14 @@ Py_LOCAL_INLINE(int) fuzzy_match_item(RE_State* state, BOOL search, Py_ssize_t*
   text_pos, RE_Node** node, RE_INT8 step) {
     size_t* fuzzy_counts;
     RE_FuzzyData data;
+    TRACE(("<<fuzzy_match_item>>\n"))
 
     fuzzy_counts = state->fuzzy_counts;
 
-    if (!any_error_permitted(state))
+    if (!any_error_permitted(state)) {
+        TRACE(("    return RE_ERROR_FAILURE\n"))
         return RE_ERROR_FAILURE;
+    }
 
     data.new_text_pos = *text_pos;
     data.new_node = *node;
@@ -10813,6 +10098,7 @@ Py_LOCAL_INLINE(int) fuzzy_match_item(RE_State* state, BOOL search, Py_ssize_t*
             goto found;
     }
 
+    TRACE(("    return RE_ERROR_FAILURE\n"))
     return RE_ERROR_FAILURE;
 
 found:
@@ -10829,7 +10115,8 @@ found:
 
     /* bstack: node step text_pos fuzzy_type op */
 
-    if (!record_fuzzy(state, data.fuzzy_type, data.new_text_pos - data.step))
+    if (!record_fuzzy(state, data.fuzzy_type, data.fuzzy_type == RE_FUZZY_DEL ?
+      data.new_text_pos : data.new_text_pos - data.step))
         return RE_ERROR_MEMORY;
 
     ++fuzzy_counts[data.fuzzy_type];
@@ -10838,6 +10125,9 @@ found:
     *text_pos = data.new_text_pos;
     *node = data.new_node;
 
+    TRACE(("    fuzzy_counts is (%zd, %zd, %zd)\n", fuzzy_counts[0],
+      fuzzy_counts[1], fuzzy_counts[2]))
+    TRACE(("    return RE_ERROR_SUCCESS\n"))
     return RE_ERROR_SUCCESS;
 }
 
@@ -10849,6 +10139,7 @@ Py_LOCAL_INLINE(int) retry_fuzzy_match_item(RE_State* state, RE_UINT8 op, BOOL
     RE_FuzzyData data;
     RE_INT8 step;
     RE_Node* curr_node;
+    TRACE(("<<retry_fuzzy_match_item>>\n"))
 
     fuzzy_counts = state->fuzzy_counts;
 
@@ -10894,6 +10185,7 @@ Py_LOCAL_INLINE(int) retry_fuzzy_match_item(RE_State* state, RE_UINT8 op, BOOL
             goto found;
     }
 
+    TRACE(("    return RE_ERROR_FAILURE\n"))
     return RE_ERROR_FAILURE;
 
 found:
@@ -10910,7 +10202,8 @@ found:
 
     /* bstack: node step text_pos fuzzy_type op */
 
-    if (!record_fuzzy(state, data.fuzzy_type, data.new_text_pos - data.step))
+    if (!record_fuzzy(state, data.fuzzy_type, data.fuzzy_type == RE_FUZZY_DEL ?
+      data.new_text_pos : data.new_text_pos - data.step))
         return RE_ERROR_MEMORY;
 
     ++fuzzy_counts[data.fuzzy_type];
@@ -10919,6 +10212,9 @@ found:
     *text_pos = data.new_text_pos;
     *node = data.new_node;
 
+    TRACE(("    fuzzy_counts is (%zd, %zd, %zd)\n", fuzzy_counts[0],
+      fuzzy_counts[1], fuzzy_counts[2]))
+    TRACE(("    return RE_ERROR_SUCCESS\n"))
     return RE_ERROR_SUCCESS;
 }
 
@@ -11015,11 +10311,14 @@ Py_LOCAL_INLINE(int) fuzzy_match_string(RE_State* state, BOOL search,
   Py_ssize_t* text_pos, RE_Node* node, Py_ssize_t* string_pos, RE_INT8 step) {
     size_t* fuzzy_counts;
     RE_FuzzyData data;
+    TRACE(("<<fuzzy_match_string>>\n"))
 
     fuzzy_counts = state->fuzzy_counts;
 
-    if (!any_error_permitted(state))
+    if (!any_error_permitted(state)) {
+        TRACE(("    return RE_ERROR_FAILURE\n"))
         return RE_ERROR_FAILURE;
+    }
 
     data.new_text_pos = *text_pos;
     data.new_string_pos = *string_pos;
@@ -11043,6 +10342,7 @@ Py_LOCAL_INLINE(int) fuzzy_match_string(RE_State* state, BOOL search,
             goto found;
     }
 
+    TRACE(("    return RE_ERROR_FAILURE\n"))
     return RE_ERROR_FAILURE;
 
 found:
@@ -11061,7 +10361,8 @@ found:
 
     /* bstack: node step string_pos text_pos fuzzy_type op */
 
-    if (!record_fuzzy(state, data.fuzzy_type, data.new_text_pos - data.step))
+    if (!record_fuzzy(state, data.fuzzy_type, data.fuzzy_type == RE_FUZZY_DEL ?
+      data.new_text_pos : data.new_text_pos - data.step))
         return RE_ERROR_MEMORY;
 
     ++fuzzy_counts[data.fuzzy_type];
@@ -11070,6 +10371,9 @@ found:
     *text_pos = data.new_text_pos;
     *string_pos = data.new_string_pos;
 
+    TRACE(("    fuzzy_counts is (%zd, %zd, %zd)\n", fuzzy_counts[0],
+      fuzzy_counts[1], fuzzy_counts[2]))
+    TRACE(("    return RE_ERROR_SUCCESS\n"))
     return RE_ERROR_SUCCESS;
 }
 
@@ -11081,6 +10385,7 @@ Py_LOCAL_INLINE(int) retry_fuzzy_match_string(RE_State* state, RE_UINT8 op,
     Py_ssize_t curr_text_pos;
     Py_ssize_t curr_string_pos;
     RE_Node* new_node;
+    TRACE(("<<retry_fuzzy_match_string>>\n"))
 
     fuzzy_counts = state->fuzzy_counts;
 
@@ -11122,6 +10427,7 @@ Py_LOCAL_INLINE(int) retry_fuzzy_match_string(RE_State* state, RE_UINT8 op,
             goto found;
     }
 
+    TRACE(("    return RE_ERROR_FAILURE\n"))
     return RE_ERROR_FAILURE;
 
 found:
@@ -11138,7 +10444,8 @@ found:
     if (!push_uint8(state, &state->bstack, op))
         return RE_ERROR_MEMORY;
 
-    if (!record_fuzzy(state, data.fuzzy_type, data.new_text_pos - data.step))
+    if (!record_fuzzy(state, data.fuzzy_type, data.fuzzy_type == RE_FUZZY_DEL ?
+      data.new_text_pos : data.new_text_pos - data.step))
         return RE_ERROR_MEMORY;
 
     /* bstack: node step string_pos text_pos fuzzy_type op */
@@ -11150,6 +10457,9 @@ found:
     *node = new_node;
     *string_pos = data.new_string_pos;
 
+    TRACE(("    fuzzy_counts is (%zd, %zd, %zd)\n", fuzzy_counts[0],
+      fuzzy_counts[1], fuzzy_counts[2]))
+    TRACE(("    return RE_ERROR_SUCCESS\n"))
     return RE_ERROR_SUCCESS;
 }
 
@@ -11267,7 +10577,8 @@ found:
      * op
      */
 
-    if (!record_fuzzy(state, data.fuzzy_type, data.new_text_pos - data.step))
+    if (!record_fuzzy(state, data.fuzzy_type, data.fuzzy_type == RE_FUZZY_DEL ?
+      data.new_text_pos : data.new_text_pos - data.step))
         return RE_ERROR_MEMORY;
 
     ++fuzzy_counts[data.fuzzy_type];
@@ -11366,7 +10677,8 @@ found:
      * op
      */
 
-    if (!record_fuzzy(state, data.fuzzy_type, data.new_text_pos - data.step))
+    if (!record_fuzzy(state, data.fuzzy_type, data.fuzzy_type == RE_FUZZY_DEL ?
+      data.new_text_pos : data.new_text_pos - data.step))
         return RE_ERROR_MEMORY;
 
     ++fuzzy_counts[data.fuzzy_type];
@@ -11500,7 +10812,8 @@ found:
      * folded_len text_pos fuzzy_type op
      */
 
-    if (!record_fuzzy(state, data.fuzzy_type, data.new_text_pos - data.step))
+    if (!record_fuzzy(state, data.fuzzy_type, data.fuzzy_type == RE_FUZZY_DEL ?
+      data.new_text_pos : data.new_text_pos - data.step))
         return RE_ERROR_MEMORY;
 
     ++fuzzy_counts[data.fuzzy_type];
@@ -11605,7 +10918,8 @@ found:
      * folded_len text_pos fuzzy_type op
      */
 
-    if (!record_fuzzy(state, data.fuzzy_type, data.new_text_pos - data.step))
+    if (!record_fuzzy(state, data.fuzzy_type, data.fuzzy_type == RE_FUZZY_DEL ?
+      data.new_text_pos : data.new_text_pos - data.step))
         return RE_ERROR_MEMORY;
 
     ++fuzzy_counts[data.fuzzy_type];
@@ -13056,7 +12370,7 @@ advance:
             /* The counts are of type size_t, so the format needs to specify
              * that.
              */
-            TRACE(("min is %u, max is %u, count is %" PY_FORMAT_SIZE_T "u\n",
+            TRACE(("    min is %u, max is %u, count is %" PY_FORMAT_SIZE_T "u\n",
               node->values[1], node->values[2], rp_data->count))
 
             /* Could the body or tail match? */
@@ -13283,7 +12597,7 @@ advance:
             /* The counts are of type size_t, so the format needs to specify
              * that.
              */
-            TRACE(("min is %u, max is %u, count is %" PY_FORMAT_SIZE_T "u\n",
+            TRACE(("    min is %u, max is %u, count is %" PY_FORMAT_SIZE_T "u\n",
               node->values[1], node->values[2], rp_data->count))
 
             /* Could the body or tail match? */
@@ -13705,6 +13019,11 @@ advance:
             rp_data->capture_change = state->capture_change;
 
             /* Could the body or tail match? */
+#if defined(VERBOSE)
+            printf("    is_repeat_guarded(..., RE_STATUS_BODY) returns %d\n",
+              is_repeat_guarded(state, index, state->text_pos,
+              RE_STATUS_BODY));
+#endif
             try_body = node->values[2] > 0 && !is_repeat_guarded(state, index,
               state->text_pos, RE_STATUS_BODY);
             if (try_body) {
@@ -15628,66 +14947,6 @@ advance:
             node = node->next_1.node;
             break;
         }
-        case RE_OP_STRING_SET: /* Member of a string set. */
-            TRACE(("%s\n", re_op_text[node->op]))
-
-            status = string_set_match_fwdrev(state, node, FALSE);
-            if (status < 0)
-                return status;
-            if (status == 0)
-                goto backtrack;
-            node = node->next_1.node;
-            break;
-        case RE_OP_STRING_SET_FLD: /* Member of a string set, ignoring case. */
-            TRACE(("%s\n", re_op_text[node->op]))
-
-            status = string_set_match_fld_fwdrev(state, node, FALSE);
-            if (status < 0)
-                return status;
-            if (status == 0)
-                goto backtrack;
-            node = node->next_1.node;
-            break;
-        case RE_OP_STRING_SET_FLD_REV: /* Member of a string set, ignoring case. */
-            TRACE(("%s\n", re_op_text[node->op]))
-
-            status = string_set_match_fld_fwdrev(state, node, TRUE);
-            if (status < 0)
-                return status;
-            if (status == 0)
-                goto backtrack;
-            node = node->next_1.node;
-            break;
-        case RE_OP_STRING_SET_IGN: /* Member of a string set, ignoring case. */
-            TRACE(("%s\n", re_op_text[node->op]))
-
-            status = string_set_match_ign_fwdrev(state, node, FALSE);
-            if (status < 0)
-                return status;
-            if (status == 0)
-                goto backtrack;
-            node = node->next_1.node;
-            break;
-        case RE_OP_STRING_SET_IGN_REV: /* Member of a string set, ignoring case. */
-            TRACE(("%s\n", re_op_text[node->op]))
-
-            status = string_set_match_ign_fwdrev(state, node, TRUE);
-            if (status < 0)
-                return status;
-            if (status == 0)
-                goto backtrack;
-            node = node->next_1.node;
-            break;
-        case RE_OP_STRING_SET_REV: /* Member of a string set. */
-            TRACE(("%s\n", re_op_text[node->op]))
-
-            status = string_set_match_fwdrev(state, node, TRUE);
-            if (status < 0)
-                return status;
-            if (status == 0)
-                goto backtrack;
-            node = node->next_1.node;
-            break;
         case RE_OP_SUCCESS: /* Success. */
             /* Must the match advance past its start? */
             TRACE(("%s\n", re_op_text[node->op]))
@@ -18013,8 +17272,17 @@ Py_LOCAL_INLINE(void) restore_fuzzy_counts(RE_State* state, size_t*
     Py_MEMCPY(state->fuzzy_counts, fuzzy_counts, sizeof(state->fuzzy_counts));
 }
 
-/* Makes the list of best matches found so far. */
-Py_LOCAL_INLINE(void) make_best_list(RE_BestList* best_list) {
+/* Initialises the list of best matches found so far. */
+Py_LOCAL_INLINE(void) init_best_list(RE_BestList* best_list) {
+    best_list->capacity = 0;
+    best_list->count = 0;
+    best_list->entries = NULL;
+}
+
+/* Finalises the list of best matches found so far. */
+Py_LOCAL_INLINE(void) fini_best_list(RE_State* state, RE_BestList*
+  best_list) {
+    safe_dealloc(state, best_list->entries);
     best_list->capacity = 0;
     best_list->count = 0;
     best_list->entries = NULL;
@@ -18055,13 +17323,6 @@ Py_LOCAL_INLINE(BOOL) add_to_best_list(RE_State* state, RE_BestList* best_list,
     return TRUE;
 }
 
-/* Destroy the list of best matches found so far. */
-Py_LOCAL_INLINE(void) destroy_best_list(RE_State* state, RE_BestList*
-  best_list) {
-    if (best_list->entries)
-        safe_dealloc(state, best_list->entries);
-}
-
 /* Performs a match or search from the current text position for a best fuzzy
  * match.
  */
@@ -18095,8 +17356,8 @@ Py_LOCAL_INLINE(int) do_best_fuzzy_match(RE_State* state, BOOL search) {
     must_advance = state->must_advance;
     found_match = FALSE;
 
-    make_best_list(&best_list);
-    make_best_changes_list(&best_changes_list);
+    init_best_list(&best_list);
+    init_best_changes_list(&best_changes_list);
 
     /* Search the text for the best match. */
     start_pos = state->text_pos;
@@ -18189,7 +17450,7 @@ Py_LOCAL_INLINE(int) do_best_fuzzy_match(RE_State* state, BOOL search) {
                 error_limit = RE_MAX_ERRORS;
 
             best_groups = NULL;
-            make_fuzzy_changes_list(&best_fuzzy_changes);
+            init_fuzzy_changes_list(&best_fuzzy_changes);
 
             /* Look again at the best of the matches that we've seen. */
             for (i = 0; i < best_list.count; i++) {
@@ -18310,27 +17571,29 @@ Py_LOCAL_INLINE(int) do_best_fuzzy_match(RE_State* state, BOOL search) {
                 state->text_pos = entry->match_pos;
                 init_match(state);
                 status = basic_match(state, search);
+
+                list = &best_changes_list.lists[0];
+                state->fuzzy_changes.count = list->count;
+                Py_MEMCPY(state->fuzzy_changes.items, list->items,
+                  (size_t)list->count * sizeof(RE_FuzzyChange));
             }
 
+            fini_fuzzy_changes_list(state, &best_fuzzy_changes);
+
             state->slice_start = slice_start;
             state->slice_end = slice_end;
-
-            list = &best_changes_list.lists[0];
-            state->fuzzy_changes.count = list->count;
-            Py_MEMCPY(state->fuzzy_changes.items, list->items,
-              (size_t)list->count * sizeof(RE_FuzzyChange));
         } else
             state->fuzzy_changes.count = 0;
     }
 
-    destroy_best_list(state, &best_list);
-    destroy_best_changes_list(state, &best_changes_list);
+    fini_best_list(state, &best_list);
+    fini_best_changes_list(state, &best_changes_list);
 
     return status;
 
 error:
-    destroy_best_list(state, &best_list);
-    destroy_best_changes_list(state, &best_changes_list);
+    fini_best_list(state, &best_list);
+    fini_best_changes_list(state, &best_changes_list);
     return RE_ERROR_MEMORY;
 }
 
@@ -18354,7 +17617,7 @@ Py_LOCAL_INLINE(int) do_enhanced_fuzzy_match(RE_State* state, BOOL search) {
 
     pattern = state->pattern;
 
-    make_changes_list(state, &best_fuzzy_changes);
+    init_fuzzy_changes_list(&best_fuzzy_changes);
 
     if (state->reverse)
         available = state->text_pos - state->slice_start;
@@ -18490,12 +17753,12 @@ Py_LOCAL_INLINE(int) do_enhanced_fuzzy_match(RE_State* state, BOOL search) {
         restore_fuzzy_changes(state, &best_fuzzy_changes);
     }
 
-    destroy_changes_list(state, &best_fuzzy_changes);
+    fini_fuzzy_changes_list(state, &best_fuzzy_changes);
 
     return status;
 
 error:
-    destroy_changes_list(state, &best_fuzzy_changes);
+    fini_fuzzy_changes_list(state, &best_fuzzy_changes);
     return status;
 }
 
@@ -18702,18 +17965,12 @@ Py_LOCAL_INLINE(BOOL) get_string(PyObject* string, RE_StringInfo* str_info) {
      */
     if (PyUnicode_Check(string)) {
         /* Unicode strings don't always support the buffer interface. */
-#if PY_VERSION_HEX >= 0x03030000
         if (PyUnicode_READY(string) == -1)
             return FALSE;
 
         str_info->characters = (void*)PyUnicode_DATA(string);
         str_info->length = PyUnicode_GET_LENGTH(string);
         str_info->charsize = PyUnicode_KIND(string);
-#else
-        str_info->characters = (void*)PyUnicode_AS_DATA(string);
-        str_info->length = PyUnicode_GET_SIZE(string);
-        str_info->charsize = sizeof(Py_UNICODE);
-#endif
         str_info->is_unicode = TRUE;
         str_info->should_release = FALSE;
         return TRUE;
@@ -19196,7 +18453,7 @@ Py_LOCAL_INLINE(Py_ssize_t) as_string_index(PyObject* obj, Py_ssize_t def) {
         return value;
 
     set_error(RE_ERROR_INDEX, NULL);
-    return 0;
+    return -1;
 }
 
 /* Deallocates a MatchObject. */
@@ -19253,21 +18510,12 @@ Py_LOCAL_INLINE(Py_ssize_t) limited_range(Py_ssize_t value, Py_ssize_t lower,
 Py_LOCAL_INLINE(PyObject*) unicode_slice(PyObject* string, Py_ssize_t start,
   Py_ssize_t end) {
     Py_ssize_t length;
-#if PY_VERSION_HEX < 0x03030000
-    Py_UNICODE* buffer;
-#endif
 
-    length = PyUnicode_GET_SIZE(string);
+    length = PyUnicode_GET_LENGTH(string);
     start = limited_range(start, 0, length);
     end = limited_range(end, 0, length);
 
-#if PY_VERSION_HEX >= 0x03030000
     return PyUnicode_Substring(string, start, end);
-#else
-    buffer = PyUnicode_AsUnicode(string);
-
-    return PyUnicode_FromUnicode(buffer + start, end - start);
-#endif
 }
 
 /* Gets a slice from a bytestring. */
@@ -20173,7 +19421,7 @@ Py_LOCAL_INLINE(PyObject*) join_list_info(RE_JoinInfo* join_info) {
 
         if (join_info->is_unicode) {
             /* Concatenate the Unicode strings. */
-            joiner = PyUnicode_FromUnicode(NULL, 0);
+            joiner = PyUnicode_New(0, 0);
             if (!joiner) {
                 clear_join_list(join_info);
                 return NULL;
@@ -20203,7 +19451,7 @@ Py_LOCAL_INLINE(PyObject*) join_list_info(RE_JoinInfo* join_info) {
 
     /* There are no items, so return an empty string. */
     if (join_info->is_unicode)
-        return PyUnicode_FromUnicode(NULL, 0);
+        return PyUnicode_New(0, 0);
     else
         return PyBytes_FromString("");
 }
@@ -20507,14 +19755,8 @@ Py_LOCAL_INLINE(PyObject*) match_get_group_slice(MatchObject* self, PyObject*
     Py_ssize_t step;
     Py_ssize_t slice_length;
 
-#if PY_VERSION_HEX >= 0x03020000
     if (PySlice_GetIndicesEx(slice, (Py_ssize_t)self->group_count + 1, &start,
       &end, &step, &slice_length) < 0)
-#else
-    if (PySlice_GetIndicesEx((PySliceObject*)slice,
-      (Py_ssize_t)self->group_count + 1, &start, &end, &step, &slice_length) <
-      0)
-#endif
         return NULL;
 
     if (slice_length <= 0)
@@ -20759,6 +20001,8 @@ static PyObject* match_lastgroup(PyObject* self_) {
         PyObject* result;
 
         index = Py_BuildValue("n", self->lastgroup);
+        if (!index)
+            return NULL;
 
         /* PyDict_GetItem returns borrows a reference. */
         result = PyDict_GetItem(self->pattern->indexgroup, index);
@@ -21718,19 +20962,11 @@ Py_LOCAL_INLINE(Py_ssize_t) index_to_integer(PyObject* item) {
     /* Is the index a string representation of an integer? */
     if (PyUnicode_Check(item)) {
         PyObject* int_obj;
-#if PY_VERSION_HEX < 0x03030000
-        Py_UNICODE* characters;
-        Py_ssize_t length;
-#endif
 
 #if defined(PYPY_VERSION) && PY_VERSION_HEX < 0x05090000
         int_obj = integer_from_unicode(item);
-#elif PY_VERSION_HEX >= 0x03030000
-        int_obj = PyLong_FromUnicodeObject(item, 0);
 #else
-        characters = (Py_UNICODE*)PyUnicode_AS_DATA(item);
-        length = PyUnicode_GET_SIZE(item);
-        int_obj = PyLong_FromUnicode(characters, length, 0);
+        int_obj = PyLong_FromUnicodeObject(item, 0);
 #endif
         if (!int_obj)
             goto error;
@@ -25525,12 +24761,6 @@ Py_LOCAL_INLINE(BOOL) section_contains_repeat(RE_CODE** code, RE_CODE*
         case RE_OP_RANGE_IGN:
         case RE_OP_RANGE_IGN_REV:
         case RE_OP_RANGE_REV:
-        case RE_OP_STRING_SET:
-        case RE_OP_STRING_SET_FLD:
-        case RE_OP_STRING_SET_FLD_REV:
-        case RE_OP_STRING_SET_IGN:
-        case RE_OP_STRING_SET_IGN_REV:
-        case RE_OP_STRING_SET_REV:
             /* codes: opcode, value, value, value. */
             *code += 4;
             break;
@@ -25905,37 +25135,6 @@ Py_LOCAL_INLINE(int) build_SET(RE_CompileArgs* args) {
     return RE_ERROR_SUCCESS;
 }
 
-/* Builds a STRING_SET node. */
-Py_LOCAL_INLINE(int) build_STRING_SET(RE_CompileArgs* args) {
-    RE_CODE index;
-    RE_CODE min_len;
-    RE_CODE max_len;
-    RE_Node* node;
-
-    /* codes: opcode, index, min_len, max_len. */
-    if (args->code + 3 > args->end_code)
-        return RE_ERROR_ILLEGAL;
-
-    index = args->code[1];
-    min_len = args->code[2];
-    max_len = args->code[3];
-    node = create_node(args->pattern, (RE_UINT8)args->code[0], 0, 0, 3);
-    if (!node)
-        return RE_ERROR_MEMORY;
-
-    node->values[0] = index;
-    node->values[1] = min_len;
-    node->values[2] = max_len;
-
-    args->code += 4;
-
-    /* Append the reference. */
-    add_node(args->end, node);
-    args->end = node;
-
-    return RE_ERROR_SUCCESS;
-}
-
 /* Builds a SUCCESS node . */
 Py_LOCAL_INLINE(int) build_SUCCESS(RE_CompileArgs* args) {
     RE_Node* node;
@@ -26245,17 +25444,6 @@ Py_LOCAL_INLINE(int) build_sequence(RE_CompileArgs* args) {
             if (!build_STRING(args, FALSE))
                 return FALSE;
             break;
-        case RE_OP_STRING_SET:
-        case RE_OP_STRING_SET_FLD:
-        case RE_OP_STRING_SET_FLD_REV:
-        case RE_OP_STRING_SET_IGN:
-        case RE_OP_STRING_SET_IGN_REV:
-        case RE_OP_STRING_SET_REV:
-            /* A reference to a list. */
-            status = build_STRING_SET(args);
-            if (status != RE_ERROR_SUCCESS)
-                return status;
-            break;
         default:
             /* We've found an opcode which we don't recognise. We'll leave it
              * for the caller.
@@ -26757,7 +25945,6 @@ static PyObject* fold_case(PyObject* self_, PyObject* args) {
     else
         encoding = &unicode_encoding;
 
-#if PY_VERSION_HEX >= 0x03030000
     /* Initially assume that the folded string will have the same width as the
      * original string (usually true).
      */
@@ -26768,10 +25955,6 @@ static PyObject* fold_case(PyObject* self_, PyObject* args) {
      */
     if (encoding == &unicode_encoding && str_info.charsize == 1)
         folded_charsize = 2;
-#else
-    /* The folded string will have the same width as the original string. */
-    folded_charsize = str_info.charsize;
-#endif
 
     /* Get the function for writing to the folded string. */
     switch (folded_charsize) {
@@ -26875,11 +26058,7 @@ static PyObject* get_expand_on_folding(PyObject* self, PyObject* unused) {
         return NULL;
 
     for (i = 0; i < count; i++) {
-#if PY_VERSION_HEX >= 0x03030000
         Py_UCS4 codepoint;
-#else
-        Py_UNICODE codepoint;
-#endif
         PyObject* item;
 
         codepoint = re_expand_on_folding[i];
@@ -27201,5 +26380,3 @@ PyMODINIT_FUNC PyInit__regex(void) {
 
     return m;
 }
-
-/* vim:ts=4:sw=4:et */
diff --git a/regex_3/_regex.h b/regex_3/_regex.h
index f2b7d67..4c7f5fb 100644
--- a/regex_3/_regex.h
+++ b/regex_3/_regex.h
@@ -98,29 +98,23 @@
 #define RE_OP_STRING_IGN 77
 #define RE_OP_STRING_IGN_REV 78
 #define RE_OP_STRING_REV 79
-#define RE_OP_STRING_SET 80
-#define RE_OP_STRING_SET_FLD 81
-#define RE_OP_STRING_SET_FLD_REV 82
-#define RE_OP_STRING_SET_IGN 83
-#define RE_OP_STRING_SET_IGN_REV 84
-#define RE_OP_STRING_SET_REV 85
-#define RE_OP_FUZZY_EXT 86
-#define RE_OP_BODY_END 87
-#define RE_OP_BODY_START 88
-#define RE_OP_END_ATOMIC 89
-#define RE_OP_END_CONDITIONAL 90
-#define RE_OP_END_FUZZY 91
-#define RE_OP_END_GREEDY_REPEAT 92
-#define RE_OP_END_GROUP 93
-#define RE_OP_END_LAZY_REPEAT 94
-#define RE_OP_END_LOOKAROUND 95
-#define RE_OP_FUZZY_INSERT 96
-#define RE_OP_GREEDY_REPEAT_ONE 97
-#define RE_OP_GROUP_RETURN 98
-#define RE_OP_LAZY_REPEAT_ONE 99
-#define RE_OP_MATCH_BODY 100
-#define RE_OP_MATCH_TAIL 101
-#define RE_OP_START_GROUP 102
+#define RE_OP_FUZZY_EXT 80
+#define RE_OP_BODY_END 81
+#define RE_OP_BODY_START 82
+#define RE_OP_END_ATOMIC 83
+#define RE_OP_END_CONDITIONAL 84
+#define RE_OP_END_FUZZY 85
+#define RE_OP_END_GREEDY_REPEAT 86
+#define RE_OP_END_GROUP 87
+#define RE_OP_END_LAZY_REPEAT 88
+#define RE_OP_END_LOOKAROUND 89
+#define RE_OP_FUZZY_INSERT 90
+#define RE_OP_GREEDY_REPEAT_ONE 91
+#define RE_OP_GROUP_RETURN 92
+#define RE_OP_LAZY_REPEAT_ONE 93
+#define RE_OP_MATCH_BODY 94
+#define RE_OP_MATCH_TAIL 95
+#define RE_OP_START_GROUP 96
 
 char* re_op_text[] = {
     "RE_OP_FAILURE",
@@ -203,12 +197,6 @@ char* re_op_text[] = {
     "RE_OP_STRING_IGN",
     "RE_OP_STRING_IGN_REV",
     "RE_OP_STRING_REV",
-    "RE_OP_STRING_SET",
-    "RE_OP_STRING_SET_FLD",
-    "RE_OP_STRING_SET_FLD_REV",
-    "RE_OP_STRING_SET_IGN",
-    "RE_OP_STRING_SET_IGN_REV",
-    "RE_OP_STRING_SET_REV",
     "RE_OP_FUZZY_EXT",
     "RE_OP_BODY_END",
     "RE_OP_BODY_START",
diff --git a/regex_3/regex/_regex_core.py b/regex_3/_regex_core.py
similarity index 98%
rename from regex_3/regex/_regex_core.py
rename to regex_3/_regex_core.py
index ab27a7f..19d9d4a 100644
--- a/regex_3/regex/_regex_core.py
+++ b/regex_3/_regex_core.py
@@ -220,12 +220,6 @@ STRING_FLD_REV
 STRING_IGN
 STRING_IGN_REV
 STRING_REV
-STRING_SET
-STRING_SET_FLD
-STRING_SET_FLD_REV
-STRING_SET_IGN
-STRING_SET_IGN_REV
-STRING_SET_REV
 FUZZY_EXT
 """
 
@@ -2015,6 +2009,9 @@ class Branch(RegexBase):
             b.fix_groups(pattern, reverse, fuzzy)
 
     def optimise(self, info, reverse):
+        if not self.branches:
+            return Sequence([])
+
         # Flatten branches within branches.
         branches = Branch._flatten_branches(info, reverse, self.branches)
 
@@ -2434,6 +2431,9 @@ class CallGroup(RegexBase):
     def max_width(self):
         return UNLIMITED
 
+    def __del__(self):
+        self.info = None
+
 class CallRef(RegexBase):
     def __init__(self, ref, parsed):
         self.ref = ref
@@ -2603,6 +2603,9 @@ class Conditional(RegexBase):
     def max_width(self):
         return max(self.yes_item.max_width(), self.no_item.max_width())
 
+    def __del__(self):
+        self.info = None
+
 class DefaultBoundary(ZeroWidthBase):
     _opcode = OP.DEFAULT_BOUNDARY
     _op_name = "DEFAULT_BOUNDARY"
@@ -2997,6 +3000,9 @@ class Group(RegexBase):
     def get_required_string(self, reverse):
         return self.subpattern.get_required_string(reverse)
 
+    def __del__(self):
+        self.info = None
+
 class Keep(ZeroWidthBase):
     _opcode = OP.KEEP
     _op_name = "KEEP"
@@ -3346,6 +3352,9 @@ class RefGroup(RegexBase):
     def max_width(self):
         return UNLIMITED
 
+    def __del__(self):
+        self.info = None
+
 class SearchAnchor(ZeroWidthBase):
     _opcode = OP.SEARCH_ANCHOR
     _op_name = "SEARCH_ANCHOR"
@@ -3665,6 +3674,9 @@ class SetBase(RegexBase):
 
         return max(len(folded) for folded in seen)
 
+    def __del__(self):
+        self.info = None
+
 class SetDiff(SetBase):
     _opcode = {(NOCASE, False): OP.SET_DIFF, (IGNORECASE, False):
       OP.SET_DIFF_IGN, (FULLCASE, False): OP.SET_DIFF, (FULLIGNORECASE, False):
@@ -3902,13 +3914,7 @@ class Literal(String):
         print("{}LITERAL MATCH {}{}".format(INDENT * indent, display,
           CASE_TEXT[self.case_flags]))
 
-class StringSet(RegexBase):
-    _opcode = {(NOCASE, False): OP.STRING_SET, (IGNORECASE, False):
-      OP.STRING_SET_IGN, (FULLCASE, False): OP.STRING_SET, (FULLIGNORECASE,
-      False): OP.STRING_SET_FLD, (NOCASE, True): OP.STRING_SET_REV,
-      (IGNORECASE, True): OP.STRING_SET_IGN_REV, (FULLCASE, True):
-      OP.STRING_SET_REV, (FULLIGNORECASE, True): OP.STRING_SET_FLD_REV}
-
+class StringSet(Branch):
     def __init__(self, info, name, case_flags=NOCASE):
         self.info = info
         self.name = name
@@ -3920,84 +3926,34 @@ class StringSet(RegexBase):
         if self.set_key not in info.named_lists_used:
             info.named_lists_used[self.set_key] = len(info.named_lists_used)
 
-    def _compile(self, reverse, fuzzy):
         index = self.info.named_lists_used[self.set_key]
         items = self.info.kwargs[self.name]
 
         case_flags = self.case_flags
 
-        if not items:
-            return []
-
         encoding = self.info.flags & _ALL_ENCODINGS
         fold_flags = encoding | case_flags
 
-        if fuzzy:
-            choices = [self._folded(fold_flags, i) for i in items]
+        choices = []
 
-            # Sort from longest to shortest.
-            choices.sort(key=lambda s: (-len(s), s))
+        for string in items:
+            if isinstance(string, str):
+                string = [ord(c) for c in string]
 
-            branches = []
-            for string in choices:
-                branches.append(Sequence([Character(c, case_flags=case_flags)
-                  for c in string]))
+            choices.append([Character(c, case_flags=case_flags) for c in
+              string])
 
-            if len(branches) > 1:
-                branch = Branch(branches)
-            else:
-                branch = branches[0]
-            branch = branch.optimise(self.info,
-              reverse).pack_characters(self.info)
+        # Sort from longest to shortest.
+        choices.sort(key=len, reverse=True)
 
-            return branch.compile(reverse, fuzzy)
-        else:
-            min_len = min(len(i) for i in items)
-            max_len = max(len(self._folded(fold_flags, i)) for i in items)
-            return [(self._opcode[case_flags, reverse], index, min_len,
-              max_len)]
+        self.branches = [Sequence(choice) for choice in choices]
 
     def dump(self, indent, reverse):
         print("{}STRING_SET {}{}".format(INDENT * indent, self.name,
           CASE_TEXT[self.case_flags]))
 
-    def _folded(self, fold_flags, item):
-        if isinstance(item, str):
-            return [ord(c) for c in _regex.fold_case(fold_flags, item)]
-        else:
-            return list(item)
-
-    def _flatten(self, s):
-        # Flattens the branches.
-        if isinstance(s, Branch):
-            for b in s.branches:
-                self._flatten(b)
-        elif isinstance(s, Sequence) and s.items:
-            seq = s.items
-
-            while isinstance(seq[-1], Sequence):
-                seq[-1 : ] = seq[-1].items
-
-            n = 0
-            while n < len(seq) and isinstance(seq[n], Character):
-                n += 1
-
-            if n > 1:
-                seq[ : n] = [String([c.value for c in seq[ : n]],
-                  case_flags=self.case_flags)]
-
-            self._flatten(seq[-1])
-
-    def max_width(self):
-        if not self.info.kwargs[self.name]:
-            return 0
-
-        if self.case_flags & IGNORECASE:
-            fold_flags = (self.info.flags & _ALL_ENCODINGS) | self.case_flags
-            return max(len(_regex.fold_case(fold_flags, i)) for i in
-              self.info.kwargs[self.name])
-        else:
-            return max(len(i) for i in self.info.kwargs[self.name])
+    def __del__(self):
+        self.info = None
 
 class Source:
     "Scanner for the regular expression source string."
@@ -4471,6 +4427,7 @@ CHARACTER_ESCAPES = {
 CHARSET_ESCAPES = {
     "d": lookup_property(None, "Digit", True),
     "D": lookup_property(None, "Digit", False),
+    "h": lookup_property(None, "Blank", True),
     "s": lookup_property(None, "Space", True),
     "S": lookup_property(None, "Space", False),
     "w": lookup_property(None, "Word", True),
diff --git a/regex_3/_regex_unicode.c b/regex_3/_regex_unicode.c
index eff2643..aec7fe7 100644
--- a/regex_3/_regex_unicode.c
+++ b/regex_3/_regex_unicode.c
@@ -1,4 +1,4 @@
-/* For Unicode version 12.1.0 */
+/* For Unicode version 13.0.0 */
 
 #include "_regex_unicode.h"
 
@@ -6,21 +6,20 @@
 #define RE_GRAPH_MASK ((1 << RE_PROP_CC) | (1 << RE_PROP_CS) | (1 << RE_PROP_CN))
 #define RE_WORD_MASK (RE_PROP_M_MASK | (1 << RE_PROP_ND) | (1 << RE_PROP_PC))
 
-typedef struct RE_ScriptExt {
+typedef struct {
     RE_UINT8 scripts[RE_MAX_SCX];
 } RE_ScriptExt;
 
-typedef struct RE_AllCases {
-    RE_INT32 diffs[RE_MAX_CASES - 1];
+typedef struct {
+    RE_UINT32 delta;
+    RE_UINT16 others[RE_MAX_CASES - 1];
 } RE_AllCases;
 
-typedef struct RE_FullCaseFolding {
-    RE_INT32 diff;
-    RE_UINT16 codepoints[RE_MAX_FOLDED - 1];
+typedef struct {
+    RE_UINT16 data[RE_MAX_FOLDED];
 } RE_FullCaseFolding;
 
-/* strings. */
-
+/* Strings. */
 char* re_strings[] = {
     "-1/2",
     "0",
@@ -393,6 +392,8 @@ char* re_strings[] = {
     "CHEROKEESUP",
     "CHEROKEESUPPLEMENT",
     "CHESSSYMBOLS",
+    "CHORASMIAN",
+    "CHRS",
     "CI",
     "CIRCLE",
     "CJ",
@@ -411,6 +412,7 @@ char* re_strings[] = {
     "CJKEXTD",
     "CJKEXTE",
     "CJKEXTF",
+    "CJKEXTG",
     "CJKRADICALSSUP",
     "CJKRADICALSSUPPLEMENT",
     "CJKSTROKES",
@@ -423,6 +425,7 @@ char* re_strings[] = {
     "CJKUNIFIEDIDEOGRAPHSEXTENSIOND",
     "CJKUNIFIEDIDEOGRAPHSEXTENSIONE",
     "CJKUNIFIEDIDEOGRAPHSEXTENSIONF",
+    "CJKUNIFIEDIDEOGRAPHSEXTENSIONG",
     "CL",
     "CLOSE",
     "CLOSEPARENTHESIS",
@@ -521,8 +524,10 @@ char* re_strings[] = {
     "DIACRITICALSEXT",
     "DIACRITICALSFORSYMBOLS",
     "DIACRITICALSSUP",
+    "DIAK",
     "DIGIT",
     "DINGBATS",
+    "DIVESAKURU",
     "DOGR",
     "DOGRA",
     "DOMINO",
@@ -544,6 +549,7 @@ char* re_strings[] = {
     "EBASE",
     "EBASEGAZ",
     "EBG",
+    "ECOMP",
     "EGYP",
     "EGYPTIANHIEROGLYPHFORMATCONTROLS",
     "EGYPTIANHIEROGLYPHS",
@@ -552,6 +558,7 @@ char* re_strings[] = {
     "ELYM",
     "ELYMAIC",
     "EM",
+    "EMOD",
     "EMODIFIER",
     "EMOJI",
     "EMOJICOMPONENT",
@@ -570,6 +577,7 @@ char* re_strings[] = {
     "ENCLOSEDIDEOGRAPHICSUP",
     "ENCLOSEDIDEOGRAPHICSUPPLEMENT",
     "ENCLOSINGMARK",
+    "EPRES",
     "ES",
     "ET",
     "ETHI",
@@ -590,6 +598,7 @@ char* re_strings[] = {
     "EXTENDEDPICTOGRAPHIC",
     "EXTENDER",
     "EXTENDNUMLET",
+    "EXTPICT",
     "F",
     "FALSE",
     "FARSIYEH",
@@ -678,6 +687,8 @@ char* re_strings[] = {
     "HANIFIROHINGYAKINNAYA",
     "HANIFIROHINGYAPA",
     "HANO",
+    "HANR",
+    "HANREADING",
     "HANUNOO",
     "HATR",
     "HATRAN",
@@ -781,12 +792,14 @@ char* re_strings[] = {
     "KHAPH",
     "KHAR",
     "KHAROSHTHI",
+    "KHITANSMALLSCRIPT",
     "KHMER",
     "KHMERSYMBOLS",
     "KHMR",
     "KHOJ",
     "KHOJKI",
     "KHUDAWADI",
+    "KITS",
     "KNDA",
     "KNOTTEDHEH",
     "KTHI",
@@ -844,6 +857,8 @@ char* re_strings[] = {
     "LINEFEED",
     "LINESEPARATOR",
     "LISU",
+    "LISUSUP",
+    "LISUSUPPLEMENT",
     "LL",
     "LM",
     "LO",
@@ -1299,6 +1314,7 @@ char* re_strings[] = {
     "SYMBOL",
     "SYMBOLSANDPICTOGRAPHSEXTA",
     "SYMBOLSANDPICTOGRAPHSEXTENDEDA",
+    "SYMBOLSFORLEGACYCOMPUTING",
     "SYRC",
     "SYRIAC",
     "SYRIACSUP",
@@ -1326,6 +1342,8 @@ char* re_strings[] = {
     "TANG",
     "TANGUT",
     "TANGUTCOMPONENTS",
+    "TANGUTSUP",
+    "TANGUTSUPPLEMENT",
     "TAVT",
     "TAW",
     "TEHMARBUTA",
@@ -1350,6 +1368,7 @@ char* re_strings[] = {
     "TONEMARK",
     "TOP",
     "TOPANDBOTTOM",
+    "TOPANDBOTTOMANDLEFT",
     "TOPANDBOTTOMANDRIGHT",
     "TOPANDLEFT",
     "TOPANDLEFTANDRIGHT",
@@ -1424,6 +1443,8 @@ char* re_strings[] = {
     "YEHBARREE",
     "YEHWITHTAIL",
     "YES",
+    "YEZI",
+    "YEZIDI",
     "YI",
     "YIII",
     "YIJING",
@@ -1449,1760 +1470,1777 @@ char* re_strings[] = {
     "ZZZZ",
 };
 
-/* strings: 13687 bytes. */
-
-/* properties. */
-
+/* Properties. */
 RE_Property re_properties[] = {
-    { 591,  0,  0},
-    { 588,  0,  0},
-    { 271,  1,  1},
-    { 270,  1,  1},
-    {1185,  2,  2},
-    {1183,  2,  2},
-    {1186,  3,  2},
-    {1187,  3,  2},
-    {1384,  4,  3},
-    {1378,  4,  3},
-    { 617,  5,  4},
-    { 589,  5,  4},
-    {1193,  6,  5},
-    {1182,  6,  5},
-    { 900,  7,  6},
-    { 189,  8,  6},
-    { 188,  8,  6},
-    { 828,  9,  6},
-    { 827,  9,  6},
-    {1350, 10,  6},
-    {1349, 10,  6},
-    { 314, 11,  6},
-    { 316, 12,  6},
-    { 371, 12,  6},
-    { 363, 13,  6},
-    { 457, 13,  6},
-    { 365, 14,  6},
-    { 459, 14,  6},
-    { 364, 15,  6},
-    { 458, 15,  6},
-    { 361, 16,  6},
-    { 455, 16,  6},
-    { 362, 17,  6},
-    { 456, 17,  6},
-    { 694, 18,  6},
-    { 690, 18,  6},
-    { 684, 19,  6},
-    { 683, 19,  6},
-    {1393, 20,  6},
-    {1392, 20,  6},
-    {1391, 21,  6},
-    {1390, 21,  6},
-    { 484, 22,  6},
-    { 492, 22,  6},
-    { 618, 23,  6},
-    { 626, 23,  6},
-    { 616, 24,  6},
-    { 620, 24,  6},
-    { 619, 25,  6},
-    { 627, 25,  6},
-    {1380, 26,  6},
-    {1388, 26,  6},
-    {1231, 26,  6},
-    { 263, 27,  6},
-    { 261, 27,  6},
-    { 730, 28,  6},
-    { 728, 28,  6},
-    { 477, 29,  6},
-    { 681, 30,  6},
-    {1147, 31,  6},
-    {1144, 31,  6},
-    {1311, 32,  6},
-    {1310, 32,  6},
-    {1071, 33,  6},
-    {1050, 33,  6},
-    { 667, 34,  6},
-    { 666, 34,  6},
-    { 221, 35,  6},
-    { 177, 35,  6},
-    {1064, 36,  6},
-    {1030, 36,  6},
-    { 686, 37,  6},
-    { 685, 37,  6},
-    { 494, 38,  6},
-    { 493, 38,  6},
-    { 566, 39,  6},
-    { 563, 39,  6},
-    {1070, 40,  6},
-    {1049, 40,  6},
-    {1076, 41,  6},
-    {1078, 41,  6},
-    {1003, 42,  6},
-    { 980, 42,  6},
-    {1066, 43,  6},
-    {1035, 43,  6},
-    { 692, 44,  6},
-    { 691, 44,  6},
-    { 695, 45,  6},
-    { 693, 45,  6},
-    {1149, 46,  6},
-    {1346, 47,  6},
-    {1342, 47,  6},
-    {1065, 48,  6},
-    {1032, 48,  6},
-    { 486, 49,  6},
-    { 485, 49,  6},
-    {1222, 50,  6},
-    {1188, 50,  6},
-    { 826, 51,  6},
-    { 825, 51,  6},
-    {1068, 52,  6},
-    {1037, 52,  6},
-    {1067, 53,  6},
-    {1036, 53,  6},
-    {1194, 54,  6},
-    {1240, 54,  6},
-    {1355, 55,  6},
-    {1371, 55,  6},
-    {1090, 56,  6},
-    {1091, 56,  6},
-    {1089, 57,  6},
-    {1088, 57,  6},
-    {1129, 58,  6},
-    {1095, 58,  6},
-    {1150, 59,  6},
-    {1155, 59,  6},
-    { 650, 60,  7},
-    { 678, 60,  7},
-    { 262, 61,  8},
-    { 251, 61,  8},
-    { 308, 62,  9},
-    { 320, 62,  9},
-    { 483, 63, 10},
-    { 510, 63, 10},
-    { 517, 64, 11},
-    { 515, 64, 11},
-    { 732, 65, 12},
-    { 726, 65, 12},
-    { 733, 66, 13},
-    { 734, 66, 13},
-    { 818, 67, 14},
-    { 793, 67, 14},
-    {1023, 68, 15},
-    {1016, 68, 15},
-    {1024, 69, 16},
-    {1027, 69, 16},
-    { 265, 70,  6},
-    { 264, 70,  6},
-    { 699, 71, 17},
-    { 707, 71, 17},
-    { 701, 72, 18},
-    { 708, 72, 18},
-    { 531, 73, 19},
-    { 535, 74, 19},
-    { 533, 75, 19},
-    { 534, 76, 19},
-    { 532, 77, 19},
-    { 565, 78, 19},
-    { 990, 79, 20},
-    { 989, 79, 20},
-    { 988, 80, 21},
-    { 987, 80, 21},
-    { 994, 81, 20},
-    { 993, 81, 20},
-    { 992, 82, 21},
-    { 991, 82, 21},
-    { 192, 83,  6},
-    { 187, 83,  6},
-    { 200, 84,  6},
-    { 269, 85,  6},
-    { 615, 86,  6},
-    {1130, 87,  6},
-    {1383, 88,  6},
-    {1389, 89,  6},
-    {1121, 90,  6},
-    {1120, 91,  6},
-    {1122, 92,  6},
-    {1123, 93,  6},
-};
-
-/* properties: 672 bytes. */
-
-/* property values. */
-
+    { 189,  0,  0}, /* ALPHABETIC */
+    { 188,  0,  0}, /* ALPHA */
+    { 192,  1,  0}, /* ALPHANUMERIC */
+    { 187,  1,  0}, /* ALNUM */
+    { 200,  2,  0}, /* ANY */
+    { 221,  3,  0}, /* ASCIIHEXDIGIT */
+    { 177,  3,  0}, /* AHEX */
+    { 262,  4,  1}, /* BIDICLASS */
+    { 251,  4,  1}, /* BC */
+    { 263,  5,  0}, /* BIDICONTROL */
+    { 261,  5,  0}, /* BIDIC */
+    { 265,  6,  0}, /* BIDIMIRRORED */
+    { 264,  6,  0}, /* BIDIM */
+    { 269,  7,  0}, /* BLANK */
+    { 271,  8,  2}, /* BLOCK */
+    { 270,  8,  2}, /* BLK */
+    { 308,  9,  3}, /* CANONICALCOMBININGCLASS */
+    { 320,  9,  3}, /* CCC */
+    { 314, 10,  0}, /* CASED */
+    { 316, 11,  0}, /* CASEIGNORABLE */
+    { 373, 11,  0}, /* CI */
+    { 361, 12,  0}, /* CHANGESWHENCASEFOLDED */
+    { 459, 12,  0}, /* CWCF */
+    { 362, 13,  0}, /* CHANGESWHENCASEMAPPED */
+    { 460, 13,  0}, /* CWCM */
+    { 363, 14,  0}, /* CHANGESWHENLOWERCASED */
+    { 461, 14,  0}, /* CWL */
+    { 364, 15,  0}, /* CHANGESWHENTITLECASED */
+    { 462, 15,  0}, /* CWT */
+    { 365, 16,  0}, /* CHANGESWHENUPPERCASED */
+    { 463, 16,  0}, /* CWU */
+    { 481, 17,  0}, /* DASH */
+    { 487, 18,  4}, /* DECOMPOSITIONTYPE */
+    { 516, 18,  4}, /* DT */
+    { 488, 19,  0}, /* DEFAULTIGNORABLECODEPOINT */
+    { 496, 19,  0}, /* DI */
+    { 490, 20,  0}, /* DEPRECATED */
+    { 489, 20,  0}, /* DEP */
+    { 498, 21,  0}, /* DIACRITIC */
+    { 497, 21,  0}, /* DIA */
+    { 523, 22,  5}, /* EASTASIANWIDTH */
+    { 521, 22,  5}, /* EA */
+    { 539, 23,  0}, /* EMOJI */
+    { 540, 24,  0}, /* EMOJICOMPONENT */
+    { 528, 24,  0}, /* ECOMP */
+    { 541, 25,  0}, /* EMOJIMODIFIER */
+    { 537, 25,  0}, /* EMOD */
+    { 542, 26,  0}, /* EMOJIMODIFIERBASE */
+    { 525, 26,  0}, /* EBASE */
+    { 543, 27,  0}, /* EMOJIPRESENTATION */
+    { 556, 27,  0}, /* EPRES */
+    { 574, 28,  0}, /* EXTENDEDPICTOGRAPHIC */
+    { 577, 28,  0}, /* EXTPICT */
+    { 575, 29,  0}, /* EXTENDER */
+    { 572, 29,  0}, /* EXT */
+    { 601, 30,  6}, /* GENERALCATEGORY */
+    { 598, 30,  6}, /* GC */
+    { 625, 31,  0}, /* GRAPH */
+    { 626, 32,  0}, /* GRAPHEMEBASE */
+    { 630, 32,  0}, /* GRBASE */
+    { 627, 33,  7}, /* GRAPHEMECLUSTERBREAK */
+    { 599, 33,  7}, /* GCB */
+    { 628, 34,  0}, /* GRAPHEMEEXTEND */
+    { 636, 34,  0}, /* GREXT */
+    { 629, 35,  0}, /* GRAPHEMELINK */
+    { 637, 35,  0}, /* GRLINK */
+    { 660, 36,  8}, /* HANGULSYLLABLETYPE */
+    { 690, 36,  8}, /* HST */
+    { 679, 37,  0}, /* HEXDIGIT */
+    { 678, 37,  0}, /* HEX */
+    { 693, 38,  0}, /* HYPHEN */
+    { 696, 39,  0}, /* IDCONTINUE */
+    { 695, 39,  0}, /* IDC */
+    { 698, 40,  0}, /* IDEOGRAPHIC */
+    { 697, 40,  0}, /* IDEO */
+    { 704, 41,  0}, /* IDSBINARYOPERATOR */
+    { 703, 41,  0}, /* IDSB */
+    { 706, 42,  0}, /* IDSTART */
+    { 702, 42,  0}, /* IDS */
+    { 707, 43,  0}, /* IDSTRINARYOPERATOR */
+    { 705, 43,  0}, /* IDST */
+    { 711, 44,  9}, /* INDICPOSITIONALCATEGORY */
+    { 719, 44,  9}, /* INPC */
+    { 713, 45, 10}, /* INDICSYLLABICCATEGORY */
+    { 720, 45, 10}, /* INSC */
+    { 742, 46,  0}, /* JOINCONTROL */
+    { 740, 46,  0}, /* JOINC */
+    { 744, 47, 11}, /* JOININGGROUP */
+    { 738, 47, 11}, /* JG */
+    { 745, 48, 12}, /* JOININGTYPE */
+    { 746, 48, 12}, /* JT */
+    { 832, 49, 13}, /* LINEBREAK */
+    { 807, 49, 13}, /* LB */
+    { 842, 50,  0}, /* LOGICALORDEREXCEPTION */
+    { 841, 50,  0}, /* LOE */
+    { 844, 51,  0}, /* LOWERCASE */
+    { 843, 51,  0}, /* LOWER */
+    { 916, 52,  0}, /* MATH */
+    {1004, 53, 14}, /* NFCQUICKCHECK */
+    {1003, 53, 14}, /* NFCQC */
+    {1006, 54, 15}, /* NFDQUICKCHECK */
+    {1005, 54, 15}, /* NFDQC */
+    {1008, 55, 14}, /* NFKCQUICKCHECK */
+    {1007, 55, 14}, /* NFKCQC */
+    {1010, 56, 15}, /* NFKDQUICKCHECK */
+    {1009, 56, 15}, /* NFKDQC */
+    {1019, 57,  0}, /* NONCHARACTERCODEPOINT */
+    { 996, 57,  0}, /* NCHAR */
+    {1039, 58, 16}, /* NUMERICTYPE */
+    {1032, 58, 16}, /* NT */
+    {1040, 59, 17}, /* NUMERICVALUE */
+    {1043, 59, 17}, /* NV */
+    {1080, 60,  0}, /* OTHERALPHABETIC */
+    {1046, 60,  0}, /* OALPHA */
+    {1081, 61,  0}, /* OTHERDEFAULTIGNORABLECODEPOINT */
+    {1048, 61,  0}, /* ODI */
+    {1082, 62,  0}, /* OTHERGRAPHEMEEXTEND */
+    {1051, 62,  0}, /* OGREXT */
+    {1083, 63,  0}, /* OTHERIDCONTINUE */
+    {1052, 63,  0}, /* OIDC */
+    {1084, 64,  0}, /* OTHERIDSTART */
+    {1053, 64,  0}, /* OIDS */
+    {1086, 65,  0}, /* OTHERLOWERCASE */
+    {1065, 65,  0}, /* OLOWER */
+    {1087, 66,  0}, /* OTHERMATH */
+    {1066, 66,  0}, /* OMATH */
+    {1092, 67,  0}, /* OTHERUPPERCASE */
+    {1094, 67,  0}, /* OUPPER */
+    {1105, 68,  0}, /* PATTERNSYNTAX */
+    {1104, 68,  0}, /* PATSYN */
+    {1106, 69,  0}, /* PATTERNWHITESPACE */
+    {1107, 69,  0}, /* PATWS */
+    {1136, 70,  0}, /* POSIXALNUM */
+    {1137, 71,  0}, /* POSIXDIGIT */
+    {1138, 72,  0}, /* POSIXPUNCT */
+    {1139, 73,  0}, /* POSIXXDIGIT */
+    {1145, 74,  0}, /* PREPENDEDCONCATENATIONMARK */
+    {1111, 74,  0}, /* PCM */
+    {1146, 75,  0}, /* PRINT */
+    {1163, 76,  0}, /* QUOTATIONMARK */
+    {1160, 76,  0}, /* QMARK */
+    {1165, 77,  0}, /* RADICAL */
+    {1166, 78,  0}, /* REGIONALINDICATOR */
+    {1171, 78,  0}, /* RI */
+    {1201, 79, 18}, /* SCRIPT */
+    {1199, 79, 18}, /* SC */
+    {1202, 80, 18}, /* SCRIPTEXTENSIONS */
+    {1203, 80, 18}, /* SCX */
+    {1209, 81, 19}, /* SENTENCEBREAK */
+    {1198, 81, 19}, /* SB */
+    {1210, 82,  0}, /* SENTENCETERMINAL */
+    {1256, 82,  0}, /* STERM */
+    {1238, 83,  0}, /* SOFTDOTTED */
+    {1204, 83,  0}, /* SD */
+    {1330, 84,  0}, /* TERMINALPUNCTUATION */
+    {1329, 84,  0}, /* TERM */
+    {1366, 85,  0}, /* UNIFIEDIDEOGRAPH */
+    {1362, 85,  0}, /* UIDEO */
+    {1370, 86,  0}, /* UPPERCASE */
+    {1369, 86,  0}, /* UPPER */
+    {1375, 87,  0}, /* VARIATIONSELECTOR */
+    {1391, 87,  0}, /* VS */
+    {1400, 88,  0}, /* WHITESPACE */
+    {1408, 88,  0}, /* WSPACE */
+    {1247, 88,  0}, /* SPACE */
+    {1403, 89,  0}, /* WORD */
+    {1404, 90, 20}, /* WORDBREAK */
+    {1398, 90, 20}, /* WB */
+    {1409, 91,  0}, /* XDIGIT */
+    {1411, 92,  0}, /* XIDCONTINUE */
+    {1410, 92,  0}, /* XIDC */
+    {1413, 93,  0}, /* XIDSTART */
+    {1412, 93,  0}, /* XIDS */
+};
+
+/* Property values. */
 RE_PropertyValue re_property_values[] = {
-    {1343,  0,   0},
-    { 406,  0,   0},
-    {1351,  0,   1},
-    { 835,  0,   1},
-    { 829,  0,   2},
-    { 822,  0,   2},
-    {1323,  0,   3},
-    { 834,  0,   3},
-    { 946,  0,   4},
-    { 823,  0,   4},
-    {1069,  0,   5},
-    { 824,  0,   5},
-    {1007,  0,   6},
-    { 944,  0,   6},
-    { 547,  0,   7},
-    { 910,  0,   7},
-    {1233,  0,   8},
-    { 909,  0,   8},
-    { 482,  0,   9},
-    { 981,  0,   9},
-    { 499,  0,   9},
-    { 808,  0,  10},
-    { 998,  0,  10},
-    {1073,  0,  11},
-    { 999,  0,  11},
-    {1232,  0,  12},
-    {1419,  0,  12},
-    { 820,  0,  13},
-    {1417,  0,  13},
-    {1087,  0,  14},
-    {1418,  0,  14},
-    { 439,  0,  15},
-    { 319,  0,  15},
-    { 407,  0,  15},
-    { 580,  0,  16},
-    { 358,  0,  16},
-    {1131,  0,  17},
-    { 408,  0,  17},
-    {1267,  0,  18},
-    { 449,  0,  18},
-    { 478,  0,  19},
-    {1096,  0,  19},
-    {1053,  0,  20},
-    {1134,  0,  20},
-    { 404,  0,  21},
-    {1099,  0,  21},
-    { 424,  0,  22},
-    {1094,  0,  22},
-    {1074,  0,  23},
-    {1117,  0,  23},
-    { 905,  0,  24},
-    {1214,  0,  24},
-    { 453,  0,  25},
-    {1183,  0,  25},
-    { 948,  0,  26},
-    {1213,  0,  26},
-    {1075,  0,  27},
-    {1221,  0,  27},
-    { 706,  0,  28},
-    {1114,  0,  28},
-    { 575,  0,  29},
-    {1101,  0,  29},
-    {1063,  0,  30},
-    { 301,  0,  30},
-    { 302,  0,  30},
-    { 806,  0,  31},
-    { 769,  0,  31},
-    { 770,  0,  31},
-    { 898,  0,  32},
-    { 844,  0,  32},
-    { 415,  0,  32},
-    { 845,  0,  32},
-    {1019,  0,  33},
-    { 968,  0,  33},
-    { 969,  0,  33},
-    {1138,  0,  34},
-    {1082,  0,  34},
-    {1137,  0,  34},
-    {1083,  0,  34},
-    {1274,  0,  35},
-    {1172,  0,  35},
-    {1173,  0,  35},
-    {1196,  0,  36},
-    {1410,  0,  36},
-    {1411,  0,  36},
-    { 315,  0,  37},
-    { 794,  0,  37},
-    { 222,  0,  38},
-    {1000,  1,   0},
-    { 978,  1,   0},
-    { 245,  1,   1},
-    { 220,  1,   1},
-    { 779,  1,   2},
-    { 778,  1,   2},
-    { 777,  1,   2},
-    { 786,  1,   3},
-    { 780,  1,   3},
-    { 788,  1,   4},
-    { 782,  1,   4},
-    { 716,  1,   5},
-    { 715,  1,   5},
-    {1234,  1,   6},
-    { 947,  1,   6},
-    { 410,  1,   7},
-    { 495,  1,   7},
-    { 622,  1,   8},
-    { 621,  1,   8},
-    { 462,  1,   9},
-    { 470,  1,  10},
-    { 469,  1,  10},
-    { 471,  1,  10},
-    { 216,  1,  11},
-    { 661,  1,  12},
-    { 203,  1,  13},
-    {1278,  1,  14},
-    { 215,  1,  15},
-    { 214,  1,  15},
-    {1316,  1,  16},
-    { 996,  1,  17},
-    {1177,  1,  18},
-    { 865,  1,  19},
-    {1280,  1,  20},
-    {1279,  1,  20},
-    { 205,  1,  21},
-    { 204,  1,  21},
-    { 489,  1,  22},
-    { 257,  1,  23},
-    { 631,  1,  24},
-    { 628,  1,  25},
-    {1055,  1,  26},
-    {1297,  1,  27},
-    {1309,  1,  28},
-    { 749,  1,  29},
-    { 852,  1,  30},
-    {1211,  1,  31},
-    {1317,  1,  32},
-    { 774,  1,  33},
-    {1318,  1,  34},
-    { 962,  1,  35},
-    { 597,  1,  36},
-    { 646,  1,  37},
-    { 721,  1,  37},
-    { 551,  1,  38},
-    { 557,  1,  39},
-    { 556,  1,  39},
-    { 367,  1,  40},
-    {1344,  1,  41},
-    {1338,  1,  41},
-    { 306,  1,  41},
-    {1034,  1,  42},
-    {1170,  1,  43},
-    {1283,  1,  44},
-    { 656,  1,  45},
-    { 297,  1,  46},
-    {1285,  1,  47},
-    { 759,  1,  48},
-    { 952,  1,  49},
-    {1345,  1,  50},
-    {1339,  1,  50},
-    { 811,  1,  51},
-    {1288,  1,  52},
-    { 985,  1,  53},
-    { 760,  1,  54},
-    { 295,  1,  55},
-    {1289,  1,  56},
-    { 411,  1,  57},
-    { 496,  1,  57},
-    { 240,  1,  58},
-    {1244,  1,  59},
-    { 248,  1,  60},
-    { 805,  1,  61},
-    {1038,  1,  62},
-    { 468,  1,  63},
-    { 465,  1,  63},
-    { 599,  1,  64},
-    { 598,  1,  64},
-    {1246,  1,  65},
-    {1245,  1,  65},
-    {1359,  1,  66},
-    {1358,  1,  66},
-    {1111,  1,  67},
-    {1110,  1,  67},
-    {1112,  1,  68},
-    {1113,  1,  68},
-    { 413,  1,  69},
-    { 498,  1,  69},
-    { 787,  1,  70},
-    { 781,  1,  70},
-    { 624,  1,  71},
-    { 623,  1,  71},
-    { 592,  1,  72},
-    {1138,  1,  72},
-    {1253,  1,  73},
-    {1252,  1,  73},
-    { 454,  1,  74},
-    { 412,  1,  75},
-    { 497,  1,  75},
-    { 416,  1,  75},
-    { 807,  1,  76},
-    {1020,  1,  77},
-    { 219,  1,  78},
-    { 903,  1,  79},
-    { 904,  1,  79},
-    { 936,  1,  80},
-    { 941,  1,  80},
-    { 440,  1,  81},
-    {1054,  1,  82},
-    {1031,  1,  82},
-    { 540,  1,  83},
-    { 539,  1,  83},
-    { 282,  1,  84},
-    { 272,  1,  85},
-    { 593,  1,  86},
-    { 933,  1,  87},
-    { 940,  1,  87},
-    { 500,  1,  88},
-    { 931,  1,  89},
-    { 937,  1,  89},
-    {1255,  1,  90},
-    {1248,  1,  90},
-    { 289,  1,  91},
-    { 288,  1,  91},
-    {1256,  1,  92},
-    {1249,  1,  92},
-    { 932,  1,  93},
-    { 938,  1,  93},
-    {1258,  1,  94},
-    {1254,  1,  94},
-    { 934,  1,  95},
-    { 930,  1,  95},
-    { 604,  1,  96},
-    { 789,  1,  97},
-    { 783,  1,  97},
-    { 442,  1,  98},
-    { 601,  1,  99},
-    { 600,  1,  99},
-    {1320,  1, 100},
-    { 554,  1, 101},
-    { 552,  1, 101},
-    { 466,  1, 102},
-    { 463,  1, 102},
-    {1259,  1, 103},
-    {1265,  1, 103},
-    { 390,  1, 104},
-    { 389,  1, 104},
-    { 748,  1, 105},
-    { 747,  1, 105},
-    { 687,  1, 106},
-    { 683,  1, 106},
-    { 393,  1, 107},
-    { 392,  1, 107},
-    { 672,  1, 108},
-    { 751,  1, 109},
-    { 275,  1, 110},
-    { 645,  1, 111},
-    { 421,  1, 111},
-    { 746,  1, 112},
-    { 277,  1, 113},
-    { 276,  1, 113},
-    { 391,  1, 114},
-    { 754,  1, 115},
-    { 752,  1, 115},
-    { 544,  1, 116},
-    { 543,  1, 116},
-    { 377,  1, 117},
-    { 375,  1, 117},
-    { 395,  1, 118},
-    { 383,  1, 118},
-    {1405,  1, 119},
-    {1404,  1, 119},
-    { 394,  1, 120},
-    { 374,  1, 120},
-    {1407,  1, 121},
-    {1406,  1, 122},
-    { 821,  1, 123},
-    {1353,  1, 124},
-    { 467,  1, 125},
-    { 464,  1, 125},
-    { 242,  1, 126},
-    { 949,  1, 127},
-    { 790,  1, 128},
-    { 784,  1, 128},
-    {1273,  1, 129},
-    { 418,  1, 130},
-    { 698,  1, 130},
-    {1103,  1, 131},
-    {1181,  1, 132},
-    { 491,  1, 133},
-    { 490,  1, 133},
-    { 755,  1, 134},
-    {1153,  1, 135},
-    { 647,  1, 136},
-    { 722,  1, 136},
-    { 725,  1, 137},
-    { 966,  1, 138},
-    { 964,  1, 138},
-    { 360,  1, 139},
-    { 965,  1, 140},
-    { 963,  1, 140},
-    {1290,  1, 141},
-    { 918,  1, 142},
-    { 917,  1, 142},
-    { 555,  1, 143},
-    { 553,  1, 143},
-    { 791,  1, 144},
-    { 785,  1, 144},
-    { 369,  1, 145},
-    { 368,  1, 145},
-    { 916,  1, 146},
-    { 649,  1, 147},
-    { 644,  1, 147},
-    { 648,  1, 148},
-    { 723,  1, 148},
-    { 670,  1, 149},
-    { 668,  1, 150},
-    { 669,  1, 150},
-    { 830,  1, 151},
-    {1132,  1, 152},
-    {1136,  1, 152},
-    {1131,  1, 152},
-    { 379,  1, 153},
-    { 381,  1, 153},
-    { 191,  1, 154},
-    { 190,  1, 154},
-    { 212,  1, 155},
-    { 210,  1, 155},
-    {1356,  1, 156},
-    {1371,  1, 156},
-    {1362,  1, 157},
-    { 414,  1, 158},
-    { 638,  1, 158},
-    { 378,  1, 159},
-    { 376,  1, 159},
-    {1217,  1, 160},
-    {1216,  1, 160},
-    { 213,  1, 161},
-    { 211,  1, 161},
-    { 640,  1, 162},
-    { 637,  1, 162},
-    {1235,  1, 163},
-    { 817,  1, 164},
-    { 816,  1, 165},
-    { 172,  1, 166},
-    { 198,  1, 167},
-    { 199,  1, 168},
-    {1105,  1, 169},
-    {1104,  1, 169},
-    { 841,  1, 170},
-    { 312,  1, 171},
-    { 443,  1, 172},
-    {1041,  1, 173},
-    { 612,  1, 174},
-    {1043,  1, 175},
-    {1341,  1, 176},
-    {1044,  1, 177},
-    { 487,  1, 178},
-    {1200,  1, 179},
-    {1062,  1, 180},
-    {1059,  1, 181},
-    { 526,  1, 182},
-    { 317,  1, 183},
-    { 814,  1, 184},
-    { 461,  1, 185},
-    { 696,  1, 186},
-    {1086,  1, 187},
-    { 971,  1, 188},
-    { 658,  1, 189},
-    {1109,  1, 190},
-    { 843,  1, 191},
-    { 924,  1, 192},
-    { 923,  1, 193},
-    { 758,  1, 194},
-    {1046,  1, 195},
-    {1042,  1, 196},
-    { 868,  1, 197},
-    { 234,  1, 198},
-    { 710,  1, 199},
-    { 709,  1, 200},
-    {1135,  1, 201},
-    {1047,  1, 202},
-    {1040,  1, 203},
-    { 652,  1, 204},
-    {1169,  1, 205},
-    {1168,  1, 205},
-    {1045,  1, 206},
-    {1224,  1, 207},
-    { 528,  1, 208},
-    { 285,  1, 209},
-    { 738,  1, 210},
-    {1227,  1, 211},
-    { 359,  1, 212},
-    { 846,  1, 213},
-    {1199,  1, 214},
-    {1212,  1, 215},
-    { 763,  1, 216},
-    { 959,  1, 217},
-    { 764,  1, 218},
-    { 614,  1, 219},
-    { 983,  1, 220},
-    {1322,  1, 221},
-    {1206,  1, 222},
-    { 945,  1, 223},
-    { 954,  1, 224},
-    { 953,  1, 224},
-    {1294,  1, 225},
-    { 178,  1, 226},
-    { 502,  1, 227},
-    {1376,  1, 228},
-    { 974,  1, 229},
-    {1413,  1, 230},
-    {1229,  1, 231},
-    {1093,  1, 232},
-    { 259,  1, 233},
-    { 897,  1, 234},
-    { 899,  1, 235},
-    { 630,  1, 236},
-    { 851,  1, 237},
-    {1299,  1, 238},
-    {1298,  1, 238},
-    { 450,  1, 239},
-    { 452,  1, 240},
-    { 451,  1, 240},
-    { 516,  1, 241},
-    { 524,  1, 242},
-    { 523,  1, 243},
-    { 195,  1, 244},
-    { 244,  1, 245},
-    { 243,  1, 245},
-    { 955,  1, 246},
-    { 247,  1, 247},
-    {1084,  1, 248},
-    { 912,  1, 249},
-    { 925,  1, 250},
-    { 689,  1, 251},
-    { 688,  1, 251},
-    {1302,  1, 252},
-    {1303,  1, 253},
-    { 744,  1, 254},
-    { 743,  1, 254},
-    { 742,  1, 255},
-    { 741,  1, 255},
-    {1219,  1, 256},
-    {1218,  1, 256},
-    {1026,  1, 257},
-    { 513,  1, 258},
-    {1203,  1, 259},
-    { 300,  1, 260},
-    { 299,  1, 260},
-    { 961,  1, 261},
-    { 960,  1, 261},
-    { 197,  1, 262},
-    { 196,  1, 262},
-    { 906,  1, 263},
-    {1292,  1, 264},
-    {1291,  1, 264},
-    { 445,  1, 265},
-    { 444,  1, 265},
-    { 902,  1, 266},
-    { 901,  1, 266},
-    {1268,  1, 267},
-    { 606,  1, 268},
-    { 605,  1, 268},
-    {1029,  1, 269},
-    {1374,  1, 270},
-    { 920,  1, 271},
-    { 170,  1, 272},
-    { 700,  1, 273},
-    {1077,  1, 274},
-    { 208,  1, 275},
-    { 207,  1, 275},
-    { 849,  1, 276},
-    { 848,  1, 276},
-    { 504,  1, 277},
-    { 503,  1, 277},
-    {1115,  1, 278},
-    { 541,  1, 279},
-    { 542,  1, 279},
-    { 546,  1, 280},
-    { 545,  1, 280},
-    { 935,  1, 281},
-    { 939,  1, 281},
-    { 536,  1, 282},
-    {1057,  1, 283},
-    {1335,  1, 284},
-    {1334,  1, 284},
-    { 184,  1, 285},
-    { 183,  1, 285},
-    { 595,  1, 286},
-    { 594,  1, 286},
-    {1257,  1, 287},
-    {1250,  1, 287},
-    {1260,  1, 288},
-    {1266,  1, 288},
-    { 370,  1, 289},
-    {1276,  1, 290},
-    {1275,  1, 290},
-    { 396,  1, 291},
-    { 384,  1, 291},
-    { 397,  1, 292},
-    { 385,  1, 292},
-    { 398,  1, 293},
-    { 386,  1, 293},
-    { 399,  1, 294},
-    { 387,  1, 294},
-    { 400,  1, 295},
-    { 388,  1, 295},
-    { 380,  1, 296},
-    { 382,  1, 296},
-    {1286,  1, 297},
-    {1357,  1, 298},
-    {1372,  1, 298},
-    {1261,  1, 299},
-    {1263,  1, 299},
-    {1262,  1, 300},
-    {1264,  1, 300},
-    {1347,  2,   0},
-    {1424,  2,   0},
-    { 417,  2,   1},
-    {1423,  2,   1},
-    { 776,  2,   2},
-    { 792,  2,   2},
-    { 621,  2,   3},
-    { 625,  2,   3},
-    { 462,  2,   4},
-    { 472,  2,   4},
-    { 216,  2,   5},
-    { 218,  2,   5},
-    { 661,  2,   6},
-    { 660,  2,   6},
-    { 203,  2,   7},
-    { 202,  2,   7},
-    {1278,  2,   8},
-    {1277,  2,   8},
-    {1316,  2,   9},
-    {1315,  2,   9},
-    { 489,  2,  10},
-    { 488,  2,  10},
-    { 257,  2,  11},
-    { 256,  2,  11},
-    { 631,  2,  12},
-    { 632,  2,  12},
-    { 628,  2,  13},
-    { 629,  2,  13},
-    {1055,  2,  14},
-    {1058,  2,  14},
-    {1297,  2,  15},
-    {1300,  2,  15},
-    {1309,  2,  16},
-    {1308,  2,  16},
-    { 749,  2,  17},
-    { 765,  2,  17},
-    { 852,  2,  18},
-    { 943,  2,  18},
-    {1211,  2,  19},
-    {1210,  2,  19},
-    {1317,  2,  20},
-    { 774,  2,  21},
-    { 775,  2,  21},
-    {1318,  2,  22},
-    {1319,  2,  22},
-    { 962,  2,  23},
-    { 967,  2,  23},
-    { 597,  2,  24},
-    { 596,  2,  24},
-    { 644,  2,  25},
-    { 643,  2,  25},
-    { 551,  2,  26},
-    { 550,  2,  26},
-    { 367,  2,  27},
-    { 366,  2,  27},
-    { 305,  2,  28},
-    { 309,  2,  28},
-    {1034,  2,  29},
-    {1033,  2,  29},
-    {1170,  2,  30},
-    {1171,  2,  30},
-    { 759,  2,  31},
-    { 761,  2,  31},
-    { 952,  2,  32},
-    { 951,  2,  32},
-    { 672,  2,  33},
-    { 671,  2,  33},
-    { 751,  2,  34},
-    { 740,  2,  34},
-    { 275,  2,  35},
-    { 274,  2,  35},
-    { 642,  2,  36},
-    { 651,  2,  36},
-    {1402,  2,  37},
-    {1403,  2,  37},
-    {1041,  2,  38},
-    { 720,  2,  38},
-    { 612,  2,  39},
-    { 611,  2,  39},
-    { 487,  2,  40},
-    { 509,  2,  40},
-    { 703,  2,  41},
-    {1416,  2,  41},
-    {1141,  2,  41},
-    {1283,  2,  42},
-    {1314,  2,  42},
-    { 656,  2,  43},
-    { 655,  2,  43},
-    { 297,  2,  44},
-    { 296,  2,  44},
-    {1285,  2,  45},
-    {1284,  2,  45},
-    { 811,  2,  46},
-    { 810,  2,  46},
-    {1288,  2,  47},
-    {1295,  2,  47},
-    { 815,  2,  48},
-    { 813,  2,  48},
-    {1341,  2,  49},
-    {1340,  2,  49},
-    {1200,  2,  50},
-    {1201,  2,  50},
-    {1062,  2,  51},
-    {1061,  2,  51},
-    { 460,  2,  52},
-    { 447,  2,  52},
-    { 288,  2,  53},
-    { 287,  2,  53},
-    { 295,  2,  54},
-    { 294,  2,  54},
-    { 442,  2,  55},
-    { 441,  2,  55},
-    {1140,  2,  55},
-    { 985,  2,  56},
-    {1296,  2,  56},
-    { 604,  2,  57},
-    { 603,  2,  57},
-    {1320,  2,  58},
-    {1313,  2,  58},
-    {1273,  2,  59},
-    {1272,  2,  59},
-    {1044,  2,  60},
-    {1394,  2,  60},
-    { 758,  2,  61},
-    { 757,  2,  61},
-    { 240,  2,  62},
-    { 239,  2,  62},
-    { 450,  2,  63},
-    {1395,  2,  63},
-    {1109,  2,  64},
-    {1108,  2,  64},
-    {1103,  2,  65},
-    {1102,  2,  65},
-    { 996,  2,  66},
-    { 997,  2,  66},
-    {1244,  2,  67},
-    {1243,  2,  67},
-    { 805,  2,  68},
-    { 804,  2,  68},
-    {1038,  2,  69},
-    {1039,  2,  69},
-    {1353,  2,  70},
-    {1354,  2,  70},
-    {1181,  2,  71},
-    {1180,  2,  71},
-    { 755,  2,  72},
-    { 739,  2,  72},
-    {1153,  2,  73},
-    {1162,  2,  73},
-    { 841,  2,  74},
-    { 840,  2,  74},
-    { 312,  2,  75},
-    { 311,  2,  75},
-    { 843,  2,  76},
-    { 842,  2,  76},
-    { 360,  2,  77},
-    {1289,  2,  78},
-    { 773,  2,  78},
-    {1290,  2,  79},
-    {1304,  2,  79},
-    { 234,  2,  80},
-    { 235,  2,  80},
-    { 524,  2,  81},
-    { 522,  2,  81},
-    {1177,  2,  82},
-    {1178,  2,  82},
-    { 821,  2,  83},
-    { 242,  2,  84},
-    { 241,  2,  84},
-    { 725,  2,  85},
-    { 724,  2,  85},
-    { 916,  2,  86},
-    { 957,  2,  86},
-    { 696,  2,  87},
-    { 217,  2,  87},
-    {1046,  2,  88},
-    {1179,  2,  88},
-    { 710,  2,  89},
-    {1133,  2,  89},
-    { 709,  2,  90},
-    {1106,  2,  90},
-    {1047,  2,  91},
-    {1056,  2,  91},
-    { 738,  2,  92},
-    { 767,  2,  92},
-    { 248,  2,  93},
-    { 249,  2,  93},
-    { 285,  2,  94},
-    { 284,  2,  94},
-    { 865,  2,  95},
-    { 864,  2,  95},
-    { 359,  2,  96},
-    { 303,  2,  96},
-    { 923,  2,  97},
-    { 921,  2,  97},
-    { 924,  2,  98},
-    { 922,  2,  98},
-    { 925,  2,  99},
-    {1116,  2,  99},
-    {1199,  2, 100},
-    {1204,  2, 100},
-    {1227,  2, 101},
-    {1226,  2, 101},
-    {1294,  2, 102},
-    {1293,  2, 102},
-    { 317,  2, 103},
-    { 176,  2, 103},
-    { 247,  2, 104},
-    { 246,  2, 104},
-    { 513,  2, 105},
-    { 512,  2, 105},
-    { 526,  2, 106},
-    { 525,  2, 106},
-    { 614,  2, 107},
-    { 613,  2, 107},
-    {1084,  2, 108},
-    { 675,  2, 108},
-    { 763,  2, 109},
-    { 762,  2, 109},
-    { 814,  2, 110},
-    { 812,  2, 110},
-    { 846,  2, 111},
-    { 847,  2, 111},
-    { 868,  2, 112},
-    { 867,  2, 112},
-    { 920,  2, 113},
-    { 919,  2, 113},
-    { 945,  2, 114},
-    { 955,  2, 115},
-    { 956,  2, 115},
-    {1042,  2, 116},
-    { 976,  2, 116},
-    { 971,  2, 117},
-    { 979,  2, 117},
-    {1086,  2, 118},
-    {1085,  2, 118},
-    {1093,  2, 119},
-    {1092,  2, 119},
-    {1043,  2, 120},
-    {1100,  2, 120},
-    {1135,  2, 121},
-    {1107,  2, 121},
-    {1206,  2, 122},
-    {1205,  2, 122},
-    { 764,  2, 123},
-    {1208,  2, 123},
-    {1322,  2, 124},
-    {1321,  2, 124},
-    {1376,  2, 125},
-    {1375,  2, 125},
-    { 178,  2, 126},
-    { 195,  2, 127},
-    { 674,  2, 127},
-    { 658,  2, 128},
-    { 657,  2, 128},
-    { 959,  2, 129},
-    { 958,  2, 129},
-    {1040,  2, 130},
-    { 679,  2, 130},
-    {1207,  2, 131},
-    {1198,  2, 131},
-    { 170,  2, 132},
-    { 171,  2, 132},
-    { 259,  2, 133},
-    { 260,  2, 133},
-    { 897,  2, 134},
-    { 896,  2, 134},
-    { 983,  2, 135},
-    {1059,  2, 136},
-    {1060,  2, 136},
-    {1302,  2, 137},
-    {1301,  2, 137},
-    { 899,  2, 138},
-    { 610,  2, 138},
-    {1026,  2, 139},
-    {1014,  2, 139},
-    {1229,  2, 140},
-    {1228,  2, 140},
-    {1413,  2, 141},
-    {1414,  2, 141},
-    { 502,  2, 142},
-    { 501,  2, 142},
-    { 630,  2, 143},
-    { 609,  2, 143},
-    { 851,  2, 144},
-    { 850,  2, 144},
-    { 912,  2, 145},
-    { 913,  2, 145},
-    { 652,  2, 146},
-    {1166,  2, 146},
-    {1224,  2, 147},
-    {1223,  2, 147},
-    {1045,  2, 148},
-    {1225,  2, 148},
-    { 528,  2, 149},
-    { 527,  2, 149},
-    { 974,  2, 150},
-    { 973,  2, 150},
-    {1029,  2, 151},
-    { 676,  2, 151},
-    {1374,  2, 152},
-    {1379,  2, 152},
-    { 753,  2, 153},
-    { 677,  2, 153},
-    {1063,  3,   0},
-    {1396,  3,   0},
-    { 507,  3,   1},
-    { 508,  3,   1},
-    {1209,  3,   2},
-    {1236,  3,   2},
-    { 662,  3,   3},
-    { 673,  3,   3},
-    { 448,  3,   4},
-    { 809,  3,   5},
-    { 984,  3,   6},
-    { 998,  3,   6},
-    { 564,  3,   7},
-    {1150,  3,   8},
-    {1155,  3,   8},
-    { 580,  3,   9},
-    { 578,  3,   9},
-    { 751,  3,  10},
-    { 736,  3,  10},
-    { 186,  3,  11},
-    { 795,  3,  11},
-    { 926,  3,  12},
-    { 942,  3,  12},
-    { 927,  3,  13},
-    { 944,  3,  13},
-    { 928,  3,  14},
-    { 908,  3,  14},
-    {1022,  3,  15},
-    {1017,  3,  15},
-    { 567,  3,  16},
-    { 561,  3,  16},
-    {1421,  3,  17},
-    {1387,  3,  18},
-    { 519,  3,  19},
-    { 518,  3,  19},
-    { 520,  3,  20},
-    { 521,  3,  20},
-    { 530,  3,  21},
-    { 529,  3,  21},
-    { 608,  3,  22},
-    { 587,  3,  22},
-    {1063,  4,   0},
-    {1396,  4,   0},
-    {1128,  4,   1},
-    {1125,  4,   1},
-    { 448,  4,   2},
-    { 809,  4,   3},
-    { 439,  4,   4},
-    { 406,  4,   4},
-    { 564,  4,   5},
-    { 561,  4,   5},
-    {1150,  4,   6},
-    {1155,  4,   6},
-    {1233,  4,   7},
-    {1214,  4,   7},
-    { 769,  4,   8},
-    {1352,  4,   9},
-    {1282,  4,  10},
-    { 836,  4,  11},
-    { 838,  4,  12},
-    {1421,  4,  13},
-    { 519,  4,  14},
-    { 518,  4,  14},
-    { 520,  4,  15},
-    { 521,  4,  15},
-    { 530,  4,  16},
-    { 529,  4,  16},
-    { 608,  4,  17},
-    { 587,  4,  17},
-    {1063,  5,   0},
-    {1396,  5,   0},
-    { 448,  5,   1},
-    { 809,  5,   2},
-    { 564,  5,   3},
-    { 561,  5,   3},
-    {1195,  5,   4},
-    {1189,  5,   4},
-    { 580,  5,   5},
-    { 578,  5,   5},
-    {1230,  5,   6},
-    { 827,  5,   7},
-    { 824,  5,   7},
-    {1349,  5,   8},
-    {1348,  5,   8},
-    {1048,  5,   9},
-    { 795,  5,   9},
-    {1022,  5,  10},
-    {1017,  5,  10},
-    { 228,  5,  11},
-    { 223,  5,  11},
-    {1240,  5,  12},
-    {1239,  5,  12},
-    { 402,  5,  13},
-    { 401,  5,  13},
-    {1184,  5,  14},
-    {1183,  5,  14},
-    { 999,  6,   0},
-    { 968,  6,   0},
-    { 568,  6,   0},
-    { 569,  6,   0},
-    {1401,  6,   1},
-    {1397,  6,   1},
-    {1282,  6,   1},
-    {1336,  6,   1},
-    {1010,  7,   0},
-    { 970,  7,   0},
-    { 796,  7,   1},
-    { 769,  7,   1},
-    {1369,  7,   2},
-    {1352,  7,   2},
-    {1332,  7,   3},
-    {1282,  7,   3},
-    { 837,  7,   4},
-    { 836,  7,   4},
-    { 839,  7,   5},
-    { 838,  7,   5},
-    { 800,  8,   0},
-    { 769,  8,   0},
-    {1158,  8,   1},
-    {1148,  8,   1},
-    { 558,  8,   2},
-    { 537,  8,   2},
-    { 559,  8,   3},
-    { 548,  8,   3},
-    { 560,  8,   4},
-    { 549,  8,   4},
-    { 209,  8,   5},
-    { 194,  8,   5},
-    { 419,  8,   6},
-    { 449,  8,   6},
-    {1087,  8,   7},
-    { 236,  8,   7},
-    {1191,  8,   8},
-    {1172,  8,   8},
-    {1380,  8,   9},
-    {1386,  8,   9},
-    {1072,  8,  10},
-    {1051,  8,  10},
-    { 281,  8,  11},
-    { 273,  8,  11},
-    {1007,  8,  12},
-    {1015,  8,  12},
-    { 206,  8,  13},
-    { 181,  8,  13},
-    { 803,  8,  14},
-    { 833,  8,  14},
-    {1161,  8,  15},
-    {1165,  8,  15},
-    { 801,  8,  16},
-    { 831,  8,  16},
-    {1159,  8,  17},
-    {1163,  8,  17},
-    {1118,  8,  18},
-    {1097,  8,  18},
-    { 802,  8,  19},
-    { 832,  8,  19},
-    {1160,  8,  20},
-    {1164,  8,  20},
-    { 577,  8,  21},
-    { 583,  8,  21},
-    {1119,  8,  22},
-    {1098,  8,  22},
-    {1011,  9,   0},
-    {   1,  9,   0},
-    {1012,  9,   0},
-    {1080,  9,   1},
-    {   2,  9,   1},
-    {1079,  9,   1},
-    {1018,  9,   2},
-    { 142,  9,   2},
-    { 995,  9,   2},
-    { 745,  9,   3},
-    { 151,  9,   3},
-    { 768,  9,   3},
-    {1363,  9,   4},
-    { 158,  9,   4},
-    {1370,  9,   4},
-    { 321,  9,   5},
-    {  21,  9,   5},
-    { 324,  9,   6},
-    {  33,  9,   6},
-    { 326,  9,   7},
-    {  37,  9,   7},
-    { 329,  9,   8},
-    {  40,  9,   8},
-    { 333,  9,   9},
-    {  45,  9,   9},
-    { 334,  9,  10},
-    {  46,  9,  10},
-    { 335,  9,  11},
-    {  48,  9,  11},
-    { 336,  9,  12},
-    {  49,  9,  12},
-    { 337,  9,  13},
-    {  51,  9,  13},
-    { 338,  9,  14},
-    {  52,  9,  14},
-    { 339,  9,  15},
-    {  56,  9,  15},
-    { 340,  9,  16},
-    {  63,  9,  16},
-    { 341,  9,  17},
-    {  68,  9,  17},
-    { 342,  9,  18},
-    {  74,  9,  18},
-    { 343,  9,  19},
-    {  79,  9,  19},
-    { 344,  9,  20},
-    {  81,  9,  20},
-    { 345,  9,  21},
-    {  82,  9,  21},
-    { 346,  9,  22},
-    {  83,  9,  22},
-    { 347,  9,  23},
-    {  84,  9,  23},
-    { 348,  9,  24},
-    {  85,  9,  24},
-    { 349,  9,  25},
-    {  95,  9,  25},
-    { 350,  9,  26},
-    { 100,  9,  26},
-    { 351,  9,  27},
-    { 101,  9,  27},
-    { 352,  9,  28},
-    { 102,  9,  28},
-    { 353,  9,  29},
-    { 103,  9,  29},
-    { 354,  9,  30},
-    { 104,  9,  30},
-    { 355,  9,  31},
-    { 105,  9,  31},
-    { 356,  9,  32},
-    { 157,  9,  32},
-    { 357,  9,  33},
-    { 165,  9,  33},
-    { 322,  9,  34},
-    {  31,  9,  34},
-    { 323,  9,  35},
-    {  32,  9,  35},
-    { 325,  9,  36},
-    {  36,  9,  36},
-    { 327,  9,  37},
-    {  38,  9,  37},
-    { 328,  9,  38},
-    {  39,  9,  38},
-    { 330,  9,  39},
-    {  42,  9,  39},
-    { 331,  9,  40},
-    {  43,  9,  40},
-    { 231,  9,  41},
-    {  62,  9,  41},
-    { 226,  9,  41},
-    { 229,  9,  42},
-    {  64,  9,  42},
-    { 224,  9,  42},
-    { 230,  9,  43},
-    {  65,  9,  43},
-    { 225,  9,  43},
-    { 254,  9,  44},
-    {  67,  9,  44},
-    { 268,  9,  44},
-    { 253,  9,  45},
-    {  69,  9,  45},
-    { 236,  9,  45},
-    { 255,  9,  46},
-    {  70,  9,  46},
-    { 283,  9,  46},
-    { 797,  9,  47},
-    {  71,  9,  47},
-    { 769,  9,  47},
-    {1156,  9,  48},
-    {  72,  9,  48},
-    {1148,  9,  48},
-    { 168,  9,  49},
-    {  73,  9,  49},
-    { 181,  9,  49},
-    { 167,  9,  50},
-    {  75,  9,  50},
-    { 166,  9,  50},
-    { 169,  9,  51},
-    {  76,  9,  51},
-    { 201,  9,  51},
-    { 506,  9,  52},
-    {  77,  9,  52},
-    { 479,  9,  52},
-    { 505,  9,  53},
-    {  78,  9,  53},
-    { 474,  9,  53},
-    { 714,  9,  54},
-    {  80,  9,  54},
-    { 717,  9,  54},
-    { 332,  9,  55},
-    {  44,  9,  55},
-    { 232,  9,  56},
-    {  57,  9,  56},
-    { 227,  9,  56},
-    {1004, 10,   0},
-    { 307, 10,   1},
-    { 304, 10,   1},
-    { 420, 10,   2},
-    { 409, 10,   2},
-    { 579, 10,   3},
-    {1001, 10,   4},
-    { 978, 10,   4},
-    { 705, 10,   5},
-    { 704, 10,   5},
-    { 914, 10,   6},
-    { 911, 10,   6},
-    { 574, 10,   7},
-    { 573, 10,   7},
-    { 719, 10,   8},
-    { 718, 10,   8},
-    { 372, 10,   9},
-    { 538, 10,   9},
-    {1251, 10,  10},
-    {1247, 10,  10},
-    {1242, 10,  11},
-    {1361, 10,  12},
-    {1360, 10,  12},
-    {1381, 10,  13},
-    { 977, 10,  14},
-    { 975, 10,  14},
-    {1215, 10,  15},
-    {1220, 10,  15},
-    {1238, 10,  16},
-    {1237, 10,  16},
-    { 582, 10,  17},
-    { 581, 10,  17},
-    { 982, 11,   0},
-    { 968, 11,   0},
-    { 193, 11,   1},
-    { 166, 11,   1},
-    { 639, 11,   2},
-    { 633, 11,   2},
-    {1381, 11,   3},
-    {1373, 11,   3},
-    { 584, 11,   4},
-    { 568, 11,   4},
-    { 977, 11,   5},
-    { 970, 11,   5},
-    {1002, 12,   0},
-    { 180, 12,   1},
-    { 182, 12,   2},
-    { 185, 12,   3},
-    { 252, 12,   4},
-    { 258, 12,   5},
-    { 475, 12,   6},
-    { 476, 12,   7},
-    { 514, 12,   8},
-    { 572, 12,   9},
-    { 576, 12,  10},
-    { 585, 12,  11},
-    { 586, 12,  12},
-    { 636, 12,  13},
-    { 641, 12,  14},
-    {1307, 12,  14},
-    { 659, 12,  15},
-    { 663, 12,  16},
-    { 664, 12,  17},
-    { 665, 12,  18},
-    { 737, 12,  19},
-    { 750, 12,  20},
-    { 766, 12,  21},
-    { 771, 12,  22},
-    { 772, 12,  23},
-    { 915, 12,  24},
-    { 929, 12,  25},
-    {1009, 12,  26},
-    {1025, 12,  27},
-    {1099, 12,  28},
-    {1142, 12,  29},
-    {1143, 12,  30},
-    {1152, 12,  31},
-    {1154, 12,  32},
-    {1175, 12,  33},
-    {1176, 12,  34},
-    {1190, 12,  35},
-    {1192, 12,  36},
-    {1202, 12,  37},
-    {1269, 12,  38},
-    {1287, 12,  39},
-    {1305, 12,  40},
-    {1306, 12,  41},
-    {1312, 12,  42},
-    {1377, 12,  43},
-    {1281, 12,  44},
-    {1398, 12,  45},
-    {1399, 12,  46},
-    {1400, 12,  47},
-    {1408, 12,  48},
-    {1409, 12,  49},
-    {1412, 12,  50},
-    {1415, 12,  51},
-    { 756, 12,  52},
-    { 571, 12,  53},
-    { 298, 12,  54},
-    { 570, 12,  55},
-    {1028, 12,  56},
-    {1167, 12,  57},
-    {1241, 12,  58},
-    { 869, 12,  59},
-    { 870, 12,  60},
-    { 871, 12,  61},
-    { 872, 12,  62},
-    { 873, 12,  63},
-    { 874, 12,  64},
-    { 875, 12,  65},
-    { 876, 12,  66},
-    { 877, 12,  67},
-    { 878, 12,  68},
-    { 879, 12,  69},
-    { 880, 12,  70},
-    { 881, 12,  71},
-    { 882, 12,  72},
-    { 883, 12,  73},
-    { 884, 12,  74},
-    { 885, 12,  75},
-    { 886, 12,  76},
-    { 887, 12,  77},
-    { 888, 12,  78},
-    { 889, 12,  79},
-    { 890, 12,  80},
-    { 891, 12,  81},
-    { 892, 12,  82},
-    { 893, 12,  83},
-    { 894, 12,  84},
-    { 895, 12,  85},
-    { 173, 12,  86},
-    { 175, 12,  87},
-    { 174, 12,  88},
-    { 857, 12,  89},
-    { 854, 12,  90},
-    { 860, 12,  91},
-    { 863, 12,  92},
-    { 858, 12,  93},
-    { 859, 12,  94},
-    { 853, 12,  95},
-    { 861, 12,  96},
-    { 855, 12,  97},
-    { 856, 12,  98},
-    { 862, 12,  99},
-    { 654, 12, 100},
-    { 653, 12, 101},
-    {1006, 13,   0},
-    {1337, 13,   0},
-    { 729, 13,   1},
-    { 301, 13,   1},
-    { 511, 13,   2},
-    { 473, 13,   2},
-    {1157, 13,   3},
-    {1148, 13,   3},
-    { 799, 13,   4},
-    { 769, 13,   4},
-    {1333, 13,   5},
-    {1282, 13,   5},
-    {1347, 14,   0},
-    {1396, 14,   0},
-    {1053, 14,   1},
-    {1052, 14,   1},
-    { 404, 14,   2},
-    { 401, 14,   2},
-    {1146, 14,   3},
-    {1145, 14,   3},
-    { 607, 14,   4},
-    { 602, 14,   4},
-    {1008, 14,   5},
-    {1013, 14,   5},
-    { 562, 14,   6},
-    { 561, 14,   6},
-    { 293, 14,   7},
-    {1270, 14,   7},
-    { 702, 14,   8},
-    { 717, 14,   8},
-    {1127, 14,   9},
-    {1126, 14,   9},
-    {1124, 14,  10},
-    {1117, 14,  10},
-    {1022, 14,  11},
-    {1017, 14,  11},
-    { 189, 14,  12},
-    { 181, 14,  12},
-    { 686, 14,  13},
-    { 682, 14,  13},
-    { 711, 14,  14},
-    { 697, 14,  14},
-    { 712, 14,  14},
-    { 681, 14,  15},
-    { 680, 14,  15},
-    { 415, 14,  16},
-    { 405, 14,  16},
-    { 291, 14,  17},
-    { 250, 14,  17},
-    { 290, 14,  18},
-    { 238, 14,  18},
-    {1231, 14,  19},
-    {1230, 14,  19},
-    { 866, 14,  20},
-    { 267, 14,  20},
-    { 313, 14,  21},
-    { 448, 14,  21},
-    { 819, 14,  22},
-    { 809, 14,  22},
-    { 438, 14,  23},
-    { 318, 14,  23},
-    { 422, 14,  24},
-    {1174, 14,  24},
-    { 193, 14,  25},
-    { 179, 14,  25},
-    { 292, 14,  26},
-    { 237, 14,  26},
-    {1267, 14,  27},
-    {1197, 14,  27},
-    {1422, 14,  28},
-    {1420, 14,  28},
-    { 986, 14,  29},
-    { 998, 14,  29},
-    {1385, 14,  30},
-    {1382, 14,  30},
-    { 727, 14,  31},
-    { 735, 14,  32},
-    { 734, 14,  33},
-    { 634, 14,  34},
-    { 635, 14,  35},
-    { 403, 14,  36},
-    { 446, 14,  36},
-    { 662, 14,  37},
-    { 673, 14,  37},
-    { 423, 14,  38},
-    { 373, 14,  38},
-    {1150, 14,  39},
-    {1155, 14,  39},
-    { 519, 14,  40},
-    { 518, 14,  40},
-    { 530, 14,  41},
-    { 529, 14,  41},
-    {1421, 14,  42},
-    {1004, 15,   0},
-    {1022, 15,   1},
-    {1017, 15,   1},
-    { 499, 15,   2},
-    { 492, 15,   2},
-    { 481, 15,   3},
-    { 480, 15,   3},
-    { 972, 16,   0},
-    {   0, 16,   1},
-    {   1, 16,   2},
-    {  11, 16,   3},
-    {   6, 16,   4},
-    {  19, 16,   5},
-    {  16, 16,   6},
-    {  13, 16,   7},
-    {  10, 16,   8},
-    {  94, 16,   9},
-    {  92, 16,  10},
-    {   8, 16,  11},
-    {   5, 16,  12},
-    {   4, 16,  13},
-    {   3, 16,  14},
-    {  20, 16,  15},
-    {  18, 16,  16},
-    {  17, 16,  17},
-    {  89, 16,  18},
-    {  15, 16,  19},
-    {  87, 16,  20},
-    {  14, 16,  21},
-    {  12, 16,  22},
-    {   9, 16,  23},
-    {  93, 16,  24},
-    {  55, 16,  25},
-    { 127, 16,  26},
-    {   7, 16,  27},
-    { 143, 16,  28},
-    {  91, 16,  29},
-    { 130, 16,  30},
-    {  54, 16,  31},
-    {  90, 16,  32},
-    { 110, 16,  33},
-    { 129, 16,  34},
-    { 145, 16,  35},
-    {  34, 16,  36},
-    {   2, 16,  37},
-    {  88, 16,  38},
-    {  53, 16,  39},
-    { 128, 16,  40},
-    {  86, 16,  41},
-    { 144, 16,  42},
-    { 109, 16,  43},
-    { 159, 16,  44},
-    { 126, 16,  45},
-    {  35, 16,  46},
-    { 136, 16,  47},
-    {  41, 16,  48},
-    { 142, 16,  49},
-    {  47, 16,  50},
-    { 151, 16,  51},
-    {  50, 16,  52},
-    { 158, 16,  53},
-    {  21, 16,  54},
-    {  33, 16,  55},
-    {  37, 16,  56},
-    {  40, 16,  57},
-    {  45, 16,  58},
-    {  46, 16,  59},
-    {  48, 16,  60},
-    {  49, 16,  61},
-    {  51, 16,  62},
-    {  52, 16,  63},
-    {  56, 16,  64},
-    {  63, 16,  65},
-    {  68, 16,  66},
-    {  74, 16,  67},
-    {  79, 16,  68},
-    {  81, 16,  69},
-    {  82, 16,  70},
-    {  83, 16,  71},
-    {  84, 16,  72},
-    {  85, 16,  73},
-    {  95, 16,  74},
-    { 100, 16,  75},
-    { 101, 16,  76},
-    { 102, 16,  77},
-    { 103, 16,  78},
-    { 104, 16,  79},
-    { 105, 16,  80},
-    { 106, 16,  81},
-    { 107, 16,  82},
-    { 108, 16,  83},
-    { 111, 16,  84},
-    { 116, 16,  85},
-    { 117, 16,  86},
-    { 118, 16,  87},
-    { 120, 16,  88},
-    { 121, 16,  89},
-    { 122, 16,  90},
-    { 123, 16,  91},
-    { 124, 16,  92},
-    { 125, 16,  93},
-    { 131, 16,  94},
-    { 137, 16,  95},
-    { 146, 16,  96},
-    { 152, 16,  97},
-    { 160, 16,  98},
-    {  22, 16,  99},
-    {  57, 16, 100},
-    {  96, 16, 101},
-    { 112, 16, 102},
-    { 132, 16, 103},
-    { 138, 16, 104},
-    { 147, 16, 105},
-    { 153, 16, 106},
-    { 161, 16, 107},
-    {  23, 16, 108},
-    {  58, 16, 109},
-    {  97, 16, 110},
-    { 113, 16, 111},
-    { 133, 16, 112},
-    { 139, 16, 113},
-    { 148, 16, 114},
-    { 154, 16, 115},
-    { 162, 16, 116},
-    {  24, 16, 117},
-    {  59, 16, 118},
-    {  98, 16, 119},
-    { 114, 16, 120},
-    { 134, 16, 121},
-    { 140, 16, 122},
-    { 149, 16, 123},
-    { 155, 16, 124},
-    { 163, 16, 125},
-    {  25, 16, 126},
-    {  60, 16, 127},
-    {  66, 16, 128},
-    {  99, 16, 129},
-    { 115, 16, 130},
-    { 119, 16, 131},
-    { 135, 16, 132},
-    { 141, 16, 133},
-    { 150, 16, 134},
-    { 156, 16, 135},
-    { 164, 16, 136},
-    {  26, 16, 137},
-    {  27, 16, 138},
-    {  61, 16, 139},
-    {  28, 16, 140},
-    {  29, 16, 141},
-    {  30, 16, 142},
-    { 970, 17,   0},
-    {1156, 17,   1},
-    { 797, 17,   2},
-    {1365, 17,   3},
-    { 798, 17,   4},
-    {1326, 17,   5},
-    { 278, 17,   6},
-    {1327, 17,   7},
-    {1331, 17,   8},
-    {1329, 17,   9},
-    {1330, 17,  10},
-    { 280, 17,  11},
-    { 279, 17,  12},
-    {1328, 17,  13},
-    {1081, 17,  14},
-    {1063, 18,   0},
-    { 266, 18,   1},
-    {1364, 18,   2},
-    { 233, 18,   3},
-    {1018, 18,   4},
-    {1363, 18,   5},
-    {1139, 18,   6},
-    { 713, 18,   7},
-    {1368, 18,   8},
-    {1367, 18,   9},
-    {1366, 18,  10},
-    { 432, 18,  11},
-    { 425, 18,  12},
-    { 426, 18,  13},
-    { 437, 18,  14},
-    { 434, 18,  15},
-    { 433, 18,  16},
-    { 429, 18,  17},
-    { 436, 18,  18},
-    { 435, 18,  19},
-    { 431, 18,  20},
-    { 427, 18,  21},
-    { 428, 18,  22},
-    { 950, 18,  23},
-    {1324, 18,  24},
-    {1325, 18,  25},
-    { 590, 18,  26},
-    { 310, 18,  27},
-    {1151, 18,  28},
-    {1271, 18,  29},
-    { 430, 18,  30},
-    {1005, 18,  31},
-    { 731, 18,  32},
-    {1021, 18,  33},
-    {1019, 18,  34},
-    { 286, 18,  35},
-    { 999, 19,   0},
-    {1401, 19,   1},
-    {1401, 20,   0},
-    {1397, 20,   0},
-    { 999, 20,   1},
-    { 968, 20,   1},
-    {1401, 21,   0},
-    {1397, 21,   0},
-    { 999, 21,   1},
-    { 968, 21,   1},
-    { 907, 21,   2},
-    { 844, 21,   2},
+    {1015,  0,   0}, /* NO */
+    { 984,  0,   0}, /* N */
+    { 578,  0,   0}, /* F */
+    { 579,  0,   0}, /* FALSE */
+    {1421,  0,   1}, /* YES */
+    {1417,  0,   1}, /* Y */
+    {1299,  0,   1}, /* T */
+    {1356,  0,   1}, /* TRUE */
+    { 814,  1,   0}, /* LEFTTORIGHT */
+    { 783,  1,   0}, /* L */
+    { 281,  1,   1}, /* BOUNDARYNEUTRAL */
+    { 273,  1,   1}, /* BN */
+    {1207,  1,   2}, /* SEGMENTSEPARATOR */
+    {1188,  1,   2}, /* S */
+    {1103,  1,   3}, /* PARAGRAPHSEPARATOR */
+    { 236,  1,   3}, /* B */
+    {1400,  1,   4}, /* WHITESPACE */
+    {1406,  1,   4}, /* WS */
+    {1088,  1,   5}, /* OTHERNEUTRAL */
+    {1067,  1,   5}, /* ON */
+    { 569,  1,   6}, /* EUROPEANTERMINATOR */
+    { 558,  1,   6}, /* ET */
+    { 568,  1,   7}, /* EUROPEANSEPARATOR */
+    { 557,  1,   7}, /* ES */
+    { 423,  1,   8}, /* COMMONSEPARATOR */
+    { 453,  1,   8}, /* CS */
+    { 567,  1,   9}, /* EUROPEANNUMBER */
+    { 545,  1,   9}, /* EN */
+    {1023,  1,  10}, /* NONSPACINGMARK */
+    {1031,  1,  10}, /* NSM */
+    {1174,  1,  11}, /* RIGHTTOLEFT */
+    {1164,  1,  11}, /* R */
+    { 209,  1,  12}, /* ARABICNUMBER */
+    { 194,  1,  12}, /* AN */
+    { 206,  1,  13}, /* ARABICLETTER */
+    { 181,  1,  13}, /* AL */
+    { 815,  1,  14}, /* LEFTTORIGHTEMBEDDING */
+    { 847,  1,  14}, /* LRE */
+    {1175,  1,  15}, /* RIGHTTOLEFTEMBEDDING */
+    {1179,  1,  15}, /* RLE */
+    {1134,  1,  16}, /* POPDIRECTIONALFORMAT */
+    {1113,  1,  16}, /* PDF */
+    { 817,  1,  17}, /* LEFTTORIGHTOVERRIDE */
+    { 849,  1,  17}, /* LRO */
+    {1177,  1,  18}, /* RIGHTTOLEFTOVERRIDE */
+    {1181,  1,  18}, /* RLO */
+    { 816,  1,  19}, /* LEFTTORIGHTISOLATE */
+    { 848,  1,  19}, /* LRI */
+    {1176,  1,  20}, /* RIGHTTOLEFTISOLATE */
+    {1180,  1,  20}, /* RLI */
+    { 587,  1,  21}, /* FIRSTSTRONGISOLATE */
+    { 593,  1,  21}, /* FSI */
+    {1135,  1,  22}, /* POPDIRECTIONALISOLATE */
+    {1114,  1,  22}, /* PDI */
+    {1016,  2,   0}, /* NOBLOCK */
+    { 994,  2,   0}, /* NB */
+    { 245,  2,   1}, /* BASICLATIN */
+    { 220,  2,   1}, /* ASCII */
+    { 793,  2,   2}, /* LATIN1SUPPLEMENT */
+    { 792,  2,   2}, /* LATIN1SUP */
+    { 791,  2,   2}, /* LATIN1 */
+    { 800,  2,   3}, /* LATINEXTENDEDA */
+    { 794,  2,   3}, /* LATINEXTA */
+    { 802,  2,   4}, /* LATINEXTENDEDB */
+    { 796,  2,   4}, /* LATINEXTB */
+    { 728,  2,   5}, /* IPAEXTENSIONS */
+    { 727,  2,   5}, /* IPAEXT */
+    {1250,  2,   6}, /* SPACINGMODIFIERLETTERS */
+    { 963,  2,   6}, /* MODIFIERLETTERS */
+    { 414,  2,   7}, /* COMBININGDIACRITICALMARKS */
+    { 499,  2,   7}, /* DIACRITICALS */
+    { 632,  2,   8}, /* GREEKANDCOPTIC */
+    { 631,  2,   8}, /* GREEK */
+    { 466,  2,   9}, /* CYRILLIC */
+    { 474,  2,  10}, /* CYRILLICSUPPLEMENT */
+    { 473,  2,  10}, /* CYRILLICSUP */
+    { 475,  2,  10}, /* CYRILLICSUPPLEMENTARY */
+    { 216,  2,  11}, /* ARMENIAN */
+    { 673,  2,  12}, /* HEBREW */
+    { 203,  2,  13}, /* ARABIC */
+    {1295,  2,  14}, /* SYRIAC */
+    { 215,  2,  15}, /* ARABICSUPPLEMENT */
+    { 214,  2,  15}, /* ARABICSUP */
+    {1335,  2,  16}, /* THAANA */
+    {1012,  2,  17}, /* NKO */
+    {1193,  2,  18}, /* SAMARITAN */
+    { 881,  2,  19}, /* MANDAIC */
+    {1297,  2,  20}, /* SYRIACSUPPLEMENT */
+    {1296,  2,  20}, /* SYRIACSUP */
+    { 205,  2,  21}, /* ARABICEXTENDEDA */
+    { 204,  2,  21}, /* ARABICEXTA */
+    { 493,  2,  22}, /* DEVANAGARI */
+    { 257,  2,  23}, /* BENGALI */
+    { 641,  2,  24}, /* GURMUKHI */
+    { 638,  2,  25}, /* GUJARATI */
+    {1071,  2,  26}, /* ORIYA */
+    {1314,  2,  27}, /* TAMIL */
+    {1328,  2,  28}, /* TELUGU */
+    { 761,  2,  29}, /* KANNADA */
+    { 868,  2,  30}, /* MALAYALAM */
+    {1227,  2,  31}, /* SINHALA */
+    {1336,  2,  32}, /* THAI */
+    { 788,  2,  33}, /* LAO */
+    {1337,  2,  34}, /* TIBETAN */
+    { 978,  2,  35}, /* MYANMAR */
+    { 607,  2,  36}, /* GEORGIAN */
+    { 656,  2,  37}, /* HANGULJAMO */
+    { 733,  2,  37}, /* JAMO */
+    { 560,  2,  38}, /* ETHIOPIC */
+    { 566,  2,  39}, /* ETHIOPICSUPPLEMENT */
+    { 565,  2,  39}, /* ETHIOPICSUP */
+    { 367,  2,  40}, /* CHEROKEE */
+    {1364,  2,  41}, /* UNIFIEDCANADIANABORIGINALSYLLABICS */
+    {1358,  2,  41}, /* UCAS */
+    { 306,  2,  41}, /* CANADIANSYLLABICS */
+    {1050,  2,  42}, /* OGHAM */
+    {1186,  2,  43}, /* RUNIC */
+    {1300,  2,  44}, /* TAGALOG */
+    { 668,  2,  45}, /* HANUNOO */
+    { 297,  2,  46}, /* BUHID */
+    {1302,  2,  47}, /* TAGBANWA */
+    { 772,  2,  48}, /* KHMER */
+    { 968,  2,  49}, /* MONGOLIAN */
+    {1365,  2,  50}, /* UNIFIEDCANADIANABORIGINALSYLLABICSEXTENDED */
+    {1359,  2,  50}, /* UCASEXT */
+    { 825,  2,  51}, /* LIMBU */
+    {1305,  2,  52}, /* TAILE */
+    {1001,  2,  53}, /* NEWTAILUE */
+    { 773,  2,  54}, /* KHMERSYMBOLS */
+    { 295,  2,  55}, /* BUGINESE */
+    {1306,  2,  56}, /* TAITHAM */
+    { 415,  2,  57}, /* COMBININGDIACRITICALMARKSEXTENDED */
+    { 500,  2,  57}, /* DIACRITICALSEXT */
+    { 240,  2,  58}, /* BALINESE */
+    {1260,  2,  59}, /* SUNDANESE */
+    { 248,  2,  60}, /* BATAK */
+    { 819,  2,  61}, /* LEPCHA */
+    {1054,  2,  62}, /* OLCHIKI */
+    { 472,  2,  63}, /* CYRILLICEXTENDEDC */
+    { 469,  2,  63}, /* CYRILLICEXTC */
+    { 609,  2,  64}, /* GEORGIANEXTENDED */
+    { 608,  2,  64}, /* GEORGIANEXT */
+    {1262,  2,  65}, /* SUNDANESESUPPLEMENT */
+    {1261,  2,  65}, /* SUNDANESESUP */
+    {1379,  2,  66}, /* VEDICEXTENSIONS */
+    {1378,  2,  66}, /* VEDICEXT */
+    {1127,  2,  67}, /* PHONETICEXTENSIONS */
+    {1126,  2,  67}, /* PHONETICEXT */
+    {1128,  2,  68}, /* PHONETICEXTENSIONSSUPPLEMENT */
+    {1129,  2,  68}, /* PHONETICEXTSUP */
+    { 417,  2,  69}, /* COMBININGDIACRITICALMARKSSUPPLEMENT */
+    { 502,  2,  69}, /* DIACRITICALSSUP */
+    { 801,  2,  70}, /* LATINEXTENDEDADDITIONAL */
+    { 795,  2,  70}, /* LATINEXTADDITIONAL */
+    { 634,  2,  71}, /* GREEKEXTENDED */
+    { 633,  2,  71}, /* GREEKEXT */
+    { 602,  2,  72}, /* GENERALPUNCTUATION */
+    {1154,  2,  72}, /* PUNCTUATION */
+    {1269,  2,  73}, /* SUPERSCRIPTSANDSUBSCRIPTS */
+    {1268,  2,  73}, /* SUPERANDSUB */
+    { 458,  2,  74}, /* CURRENCYSYMBOLS */
+    { 416,  2,  75}, /* COMBININGDIACRITICALMARKSFORSYMBOLS */
+    { 501,  2,  75}, /* DIACRITICALSFORSYMBOLS */
+    { 420,  2,  75}, /* COMBININGMARKSFORSYMBOLS */
+    { 821,  2,  76}, /* LETTERLIKESYMBOLS */
+    {1036,  2,  77}, /* NUMBERFORMS */
+    { 219,  2,  78}, /* ARROWS */
+    { 919,  2,  79}, /* MATHEMATICALOPERATORS */
+    { 920,  2,  79}, /* MATHOPERATORS */
+    { 952,  2,  80}, /* MISCELLANEOUSTECHNICAL */
+    { 957,  2,  80}, /* MISCTECHNICAL */
+    { 444,  2,  81}, /* CONTROLPICTURES */
+    {1070,  2,  82}, /* OPTICALCHARACTERRECOGNITION */
+    {1047,  2,  82}, /* OCR */
+    { 548,  2,  83}, /* ENCLOSEDALPHANUMERICS */
+    { 547,  2,  83}, /* ENCLOSEDALPHANUM */
+    { 282,  2,  84}, /* BOXDRAWING */
+    { 272,  2,  85}, /* BLOCKELEMENTS */
+    { 603,  2,  86}, /* GEOMETRICSHAPES */
+    { 949,  2,  87}, /* MISCELLANEOUSSYMBOLS */
+    { 956,  2,  87}, /* MISCSYMBOLS */
+    { 505,  2,  88}, /* DINGBATS */
+    { 947,  2,  89}, /* MISCELLANEOUSMATHEMATICALSYMBOLSA */
+    { 953,  2,  89}, /* MISCMATHSYMBOLSA */
+    {1271,  2,  90}, /* SUPPLEMENTALARROWSA */
+    {1264,  2,  90}, /* SUPARROWSA */
+    { 289,  2,  91}, /* BRAILLEPATTERNS */
+    { 288,  2,  91}, /* BRAILLE */
+    {1272,  2,  92}, /* SUPPLEMENTALARROWSB */
+    {1265,  2,  92}, /* SUPARROWSB */
+    { 948,  2,  93}, /* MISCELLANEOUSMATHEMATICALSYMBOLSB */
+    { 954,  2,  93}, /* MISCMATHSYMBOLSB */
+    {1274,  2,  94}, /* SUPPLEMENTALMATHEMATICALOPERATORS */
+    {1270,  2,  94}, /* SUPMATHOPERATORS */
+    { 950,  2,  95}, /* MISCELLANEOUSSYMBOLSANDARROWS */
+    { 946,  2,  95}, /* MISCARROWS */
+    { 614,  2,  96}, /* GLAGOLITIC */
+    { 803,  2,  97}, /* LATINEXTENDEDC */
+    { 797,  2,  97}, /* LATINEXTC */
+    { 446,  2,  98}, /* COPTIC */
+    { 611,  2,  99}, /* GEORGIANSUPPLEMENT */
+    { 610,  2,  99}, /* GEORGIANSUP */
+    {1339,  2, 100}, /* TIFINAGH */
+    { 563,  2, 101}, /* ETHIOPICEXTENDED */
+    { 561,  2, 101}, /* ETHIOPICEXT */
+    { 470,  2, 102}, /* CYRILLICEXTENDEDA */
+    { 467,  2, 102}, /* CYRILLICEXTA */
+    {1275,  2, 103}, /* SUPPLEMENTALPUNCTUATION */
+    {1281,  2, 103}, /* SUPPUNCTUATION */
+    { 393,  2, 104}, /* CJKRADICALSSUPPLEMENT */
+    { 392,  2, 104}, /* CJKRADICALSSUP */
+    { 760,  2, 105}, /* KANGXIRADICALS */
+    { 759,  2, 105}, /* KANGXI */
+    { 699,  2, 106}, /* IDEOGRAPHICDESCRIPTIONCHARACTERS */
+    { 695,  2, 106}, /* IDC */
+    { 396,  2, 107}, /* CJKSYMBOLSANDPUNCTUATION */
+    { 395,  2, 107}, /* CJKSYMBOLS */
+    { 684,  2, 108}, /* HIRAGANA */
+    { 763,  2, 109}, /* KATAKANA */
+    { 275,  2, 110}, /* BOPOMOFO */
+    { 655,  2, 111}, /* HANGULCOMPATIBILITYJAMO */
+    { 425,  2, 111}, /* COMPATJAMO */
+    { 758,  2, 112}, /* KANBUN */
+    { 277,  2, 113}, /* BOPOMOFOEXTENDED */
+    { 276,  2, 113}, /* BOPOMOFOEXT */
+    { 394,  2, 114}, /* CJKSTROKES */
+    { 766,  2, 115}, /* KATAKANAPHONETICEXTENSIONS */
+    { 764,  2, 115}, /* KATAKANAEXT */
+    { 552,  2, 116}, /* ENCLOSEDCJKLETTERSANDMONTHS */
+    { 551,  2, 116}, /* ENCLOSEDCJK */
+    { 379,  2, 117}, /* CJKCOMPATIBILITY */
+    { 377,  2, 117}, /* CJKCOMPAT */
+    { 398,  2, 118}, /* CJKUNIFIEDIDEOGRAPHSEXTENSIONA */
+    { 385,  2, 118}, /* CJKEXTA */
+    {1427,  2, 119}, /* YIJINGHEXAGRAMSYMBOLS */
+    {1426,  2, 119}, /* YIJING */
+    { 397,  2, 120}, /* CJKUNIFIEDIDEOGRAPHS */
+    { 376,  2, 120}, /* CJK */
+    {1429,  2, 121}, /* YISYLLABLES */
+    {1428,  2, 122}, /* YIRADICALS */
+    { 835,  2, 123}, /* LISU */
+    {1373,  2, 124}, /* VAI */
+    { 471,  2, 125}, /* CYRILLICEXTENDEDB */
+    { 468,  2, 125}, /* CYRILLICEXTB */
+    { 242,  2, 126}, /* BAMUM */
+    { 965,  2, 127}, /* MODIFIERTONELETTERS */
+    { 804,  2, 128}, /* LATINEXTENDEDD */
+    { 798,  2, 128}, /* LATINEXTD */
+    {1289,  2, 129}, /* SYLOTINAGRI */
+    { 422,  2, 130}, /* COMMONINDICNUMBERFORMS */
+    { 710,  2, 130}, /* INDICNUMBERFORMS */
+    {1119,  2, 131}, /* PHAGSPA */
+    {1197,  2, 132}, /* SAURASHTRA */
+    { 495,  2, 133}, /* DEVANAGARIEXTENDED */
+    { 494,  2, 133}, /* DEVANAGARIEXT */
+    { 767,  2, 134}, /* KAYAHLI */
+    {1169,  2, 135}, /* REJANG */
+    { 657,  2, 136}, /* HANGULJAMOEXTENDEDA */
+    { 734,  2, 136}, /* JAMOEXTA */
+    { 737,  2, 137}, /* JAVANESE */
+    { 982,  2, 138}, /* MYANMAREXTENDEDB */
+    { 980,  2, 138}, /* MYANMAREXTB */
+    { 360,  2, 139}, /* CHAM */
+    { 981,  2, 140}, /* MYANMAREXTENDEDA */
+    { 979,  2, 140}, /* MYANMAREXTA */
+    {1307,  2, 141}, /* TAIVIET */
+    { 934,  2, 142}, /* MEETEIMAYEKEXTENSIONS */
+    { 933,  2, 142}, /* MEETEIMAYEKEXT */
+    { 564,  2, 143}, /* ETHIOPICEXTENDEDA */
+    { 562,  2, 143}, /* ETHIOPICEXTA */
+    { 805,  2, 144}, /* LATINEXTENDEDE */
+    { 799,  2, 144}, /* LATINEXTE */
+    { 369,  2, 145}, /* CHEROKEESUPPLEMENT */
+    { 368,  2, 145}, /* CHEROKEESUP */
+    { 932,  2, 146}, /* MEETEIMAYEK */
+    { 659,  2, 147}, /* HANGULSYLLABLES */
+    { 654,  2, 147}, /* HANGUL */
+    { 658,  2, 148}, /* HANGULJAMOEXTENDEDB */
+    { 735,  2, 148}, /* JAMOEXTB */
+    { 682,  2, 149}, /* HIGHSURROGATES */
+    { 680,  2, 150}, /* HIGHPRIVATEUSESURROGATES */
+    { 681,  2, 150}, /* HIGHPUSURROGATES */
+    { 846,  2, 151}, /* LOWSURROGATES */
+    {1148,  2, 152}, /* PRIVATEUSEAREA */
+    {1152,  2, 152}, /* PUA */
+    {1147,  2, 152}, /* PRIVATEUSE */
+    { 381,  2, 153}, /* CJKCOMPATIBILITYIDEOGRAPHS */
+    { 383,  2, 153}, /* CJKCOMPATIDEOGRAPHS */
+    { 191,  2, 154}, /* ALPHABETICPRESENTATIONFORMS */
+    { 190,  2, 154}, /* ALPHABETICPF */
+    { 212,  2, 155}, /* ARABICPRESENTATIONFORMSA */
+    { 210,  2, 155}, /* ARABICPFA */
+    {1376,  2, 156}, /* VARIATIONSELECTORS */
+    {1391,  2, 156}, /* VS */
+    {1382,  2, 157}, /* VERTICALFORMS */
+    { 418,  2, 158}, /* COMBININGHALFMARKS */
+    { 648,  2, 158}, /* HALFMARKS */
+    { 380,  2, 159}, /* CJKCOMPATIBILITYFORMS */
+    { 378,  2, 159}, /* CJKCOMPATFORMS */
+    {1233,  2, 160}, /* SMALLFORMVARIANTS */
+    {1232,  2, 160}, /* SMALLFORMS */
+    { 213,  2, 161}, /* ARABICPRESENTATIONFORMSB */
+    { 211,  2, 161}, /* ARABICPFB */
+    { 650,  2, 162}, /* HALFWIDTHANDFULLWIDTHFORMS */
+    { 647,  2, 162}, /* HALFANDFULLFORMS */
+    {1251,  2, 163}, /* SPECIALS */
+    { 831,  2, 164}, /* LINEARBSYLLABARY */
+    { 830,  2, 165}, /* LINEARBIDEOGRAMS */
+    { 172,  2, 166}, /* AEGEANNUMBERS */
+    { 198,  2, 167}, /* ANCIENTGREEKNUMBERS */
+    { 199,  2, 168}, /* ANCIENTSYMBOLS */
+    {1121,  2, 169}, /* PHAISTOSDISC */
+    {1120,  2, 169}, /* PHAISTOS */
+    { 857,  2, 170}, /* LYCIAN */
+    { 312,  2, 171}, /* CARIAN */
+    { 447,  2, 172}, /* COPTICEPACTNUMBERS */
+    {1057,  2, 173}, /* OLDITALIC */
+    { 622,  2, 174}, /* GOTHIC */
+    {1059,  2, 175}, /* OLDPERMIC */
+    {1361,  2, 176}, /* UGARITIC */
+    {1060,  2, 177}, /* OLDPERSIAN */
+    { 491,  2, 178}, /* DESERET */
+    {1216,  2, 179}, /* SHAVIAN */
+    {1078,  2, 180}, /* OSMANYA */
+    {1075,  2, 181}, /* OSAGE */
+    { 533,  2, 182}, /* ELBASAN */
+    { 317,  2, 183}, /* CAUCASIANALBANIAN */
+    { 828,  2, 184}, /* LINEARA */
+    { 465,  2, 185}, /* CYPRIOTSYLLABARY */
+    { 708,  2, 186}, /* IMPERIALARAMAIC */
+    {1102,  2, 187}, /* PALMYRENE */
+    { 987,  2, 188}, /* NABATAEAN */
+    { 670,  2, 189}, /* HATRAN */
+    {1125,  2, 190}, /* PHOENICIAN */
+    { 859,  2, 191}, /* LYDIAN */
+    { 940,  2, 192}, /* MEROITICHIEROGLYPHS */
+    { 939,  2, 193}, /* MEROITICCURSIVE */
+    { 770,  2, 194}, /* KHAROSHTHI */
+    {1062,  2, 195}, /* OLDSOUTHARABIAN */
+    {1058,  2, 196}, /* OLDNORTHARABIAN */
+    { 884,  2, 197}, /* MANICHAEAN */
+    { 234,  2, 198}, /* AVESTAN */
+    { 722,  2, 199}, /* INSCRIPTIONALPARTHIAN */
+    { 721,  2, 200}, /* INSCRIPTIONALPAHLAVI */
+    {1151,  2, 201}, /* PSALTERPAHLAVI */
+    {1063,  2, 202}, /* OLDTURKIC */
+    {1056,  2, 203}, /* OLDHUNGARIAN */
+    { 662,  2, 204}, /* HANIFIROHINGYA */
+    {1185,  2, 205}, /* RUMINUMERALSYMBOLS */
+    {1184,  2, 205}, /* RUMI */
+    {1423,  2, 206}, /* YEZIDI */
+    {1061,  2, 207}, /* OLDSOGDIAN */
+    {1240,  2, 208}, /* SOGDIAN */
+    { 371,  2, 209}, /* CHORASMIAN */
+    { 535,  2, 210}, /* ELYMAIC */
+    { 285,  2, 211}, /* BRAHMI */
+    { 750,  2, 212}, /* KAITHI */
+    {1243,  2, 213}, /* SORASOMPENG */
+    { 359,  2, 214}, /* CHAKMA */
+    { 862,  2, 215}, /* MAHAJANI */
+    {1215,  2, 216}, /* SHARADA */
+    {1228,  2, 217}, /* SINHALAARCHAICNUMBERS */
+    { 776,  2, 218}, /* KHOJKI */
+    { 975,  2, 219}, /* MULTANI */
+    { 777,  2, 220}, /* KHUDAWADI */
+    { 624,  2, 221}, /* GRANTHA */
+    { 999,  2, 222}, /* NEWA */
+    {1341,  2, 223}, /* TIRHUTA */
+    {1222,  2, 224}, /* SIDDHAM */
+    { 961,  2, 225}, /* MODI */
+    { 970,  2, 226}, /* MONGOLIANSUPPLEMENT */
+    { 969,  2, 226}, /* MONGOLIANSUP */
+    {1311,  2, 227}, /* TAKRI */
+    { 178,  2, 228}, /* AHOM */
+    { 508,  2, 229}, /* DOGRA */
+    {1396,  2, 230}, /* WARANGCITI */
+    { 506,  2, 231}, /* DIVESAKURU */
+    { 990,  2, 232}, /* NANDINAGARI */
+    {1435,  2, 233}, /* ZANABAZARSQUARE */
+    {1245,  2, 234}, /* SOYOMBO */
+    {1109,  2, 235}, /* PAUCINHAU */
+    { 259,  2, 236}, /* BHAIKSUKI */
+    { 913,  2, 237}, /* MARCHEN */
+    { 915,  2, 238}, /* MASARAMGONDI */
+    { 640,  2, 239}, /* GUNJALAGONDI */
+    { 867,  2, 240}, /* MAKASAR */
+    { 837,  2, 241}, /* LISUSUPPLEMENT */
+    { 836,  2, 241}, /* LISUSUP */
+    {1316,  2, 242}, /* TAMILSUPPLEMENT */
+    {1315,  2, 242}, /* TAMILSUP */
+    { 454,  2, 243}, /* CUNEIFORM */
+    { 456,  2, 244}, /* CUNEIFORMNUMBERSANDPUNCTUATION */
+    { 455,  2, 244}, /* CUNEIFORMNUMBERS */
+    { 522,  2, 245}, /* EARLYDYNASTICCUNEIFORM */
+    { 531,  2, 246}, /* EGYPTIANHIEROGLYPHS */
+    { 530,  2, 247}, /* EGYPTIANHIEROGLYPHFORMATCONTROLS */
+    { 195,  2, 248}, /* ANATOLIANHIEROGLYPHS */
+    { 244,  2, 249}, /* BAMUMSUPPLEMENT */
+    { 243,  2, 249}, /* BAMUMSUP */
+    { 971,  2, 250}, /* MRO */
+    { 247,  2, 251}, /* BASSAVAH */
+    {1100,  2, 252}, /* PAHAWHHMONG */
+    { 928,  2, 253}, /* MEDEFAIDRIN */
+    { 941,  2, 254}, /* MIAO */
+    { 701,  2, 255}, /* IDEOGRAPHICSYMBOLSANDPUNCTUATION */
+    { 700,  2, 255}, /* IDEOGRAPHICSYMBOLS */
+    {1319,  2, 256}, /* TANGUT */
+    {1320,  2, 257}, /* TANGUTCOMPONENTS */
+    { 771,  2, 258}, /* KHITANSMALLSCRIPT */
+    {1322,  2, 259}, /* TANGUTSUPPLEMENT */
+    {1321,  2, 259}, /* TANGUTSUP */
+    { 756,  2, 260}, /* KANASUPPLEMENT */
+    { 755,  2, 260}, /* KANASUP */
+    { 754,  2, 261}, /* KANAEXTENDEDA */
+    { 753,  2, 261}, /* KANAEXTA */
+    {1235,  2, 262}, /* SMALLKANAEXTENSION */
+    {1234,  2, 262}, /* SMALLKANAEXT */
+    {1042,  2, 263}, /* NUSHU */
+    { 519,  2, 264}, /* DUPLOYAN */
+    {1219,  2, 265}, /* SHORTHANDFORMATCONTROLS */
+    { 300,  2, 266}, /* BYZANTINEMUSICALSYMBOLS */
+    { 299,  2, 266}, /* BYZANTINEMUSIC */
+    { 977,  2, 267}, /* MUSICALSYMBOLS */
+    { 976,  2, 267}, /* MUSIC */
+    { 197,  2, 268}, /* ANCIENTGREEKMUSICALNOTATION */
+    { 196,  2, 268}, /* ANCIENTGREEKMUSIC */
+    { 922,  2, 269}, /* MAYANNUMERALS */
+    {1309,  2, 270}, /* TAIXUANJINGSYMBOLS */
+    {1308,  2, 270}, /* TAIXUANJING */
+    { 449,  2, 271}, /* COUNTINGRODNUMERALS */
+    { 448,  2, 271}, /* COUNTINGROD */
+    { 918,  2, 272}, /* MATHEMATICALALPHANUMERICSYMBOLS */
+    { 917,  2, 272}, /* MATHALPHANUM */
+    {1284,  2, 273}, /* SUTTONSIGNWRITING */
+    { 616,  2, 274}, /* GLAGOLITICSUPPLEMENT */
+    { 615,  2, 274}, /* GLAGOLITICSUP */
+    {1045,  2, 275}, /* NYIAKENGPUACHUEHMONG */
+    {1394,  2, 276}, /* WANCHO */
+    { 936,  2, 277}, /* MENDEKIKAKUI */
+    { 170,  2, 278}, /* ADLAM */
+    { 712,  2, 279}, /* INDICSIYAQNUMBERS */
+    {1093,  2, 280}, /* OTTOMANSIYAQNUMBERS */
+    { 208,  2, 281}, /* ARABICMATHEMATICALALPHABETICSYMBOLS */
+    { 207,  2, 281}, /* ARABICMATH */
+    { 865,  2, 282}, /* MAHJONGTILES */
+    { 864,  2, 282}, /* MAHJONG */
+    { 510,  2, 283}, /* DOMINOTILES */
+    { 509,  2, 283}, /* DOMINO */
+    {1131,  2, 284}, /* PLAYINGCARDS */
+    { 549,  2, 285}, /* ENCLOSEDALPHANUMERICSUPPLEMENT */
+    { 550,  2, 285}, /* ENCLOSEDALPHANUMSUP */
+    { 554,  2, 286}, /* ENCLOSEDIDEOGRAPHICSUPPLEMENT */
+    { 553,  2, 286}, /* ENCLOSEDIDEOGRAPHICSUP */
+    { 951,  2, 287}, /* MISCELLANEOUSSYMBOLSANDPICTOGRAPHS */
+    { 955,  2, 287}, /* MISCPICTOGRAPHS */
+    { 544,  2, 288}, /* EMOTICONS */
+    {1073,  2, 289}, /* ORNAMENTALDINGBATS */
+    {1355,  2, 290}, /* TRANSPORTANDMAPSYMBOLS */
+    {1354,  2, 290}, /* TRANSPORTANDMAP */
+    { 184,  2, 291}, /* ALCHEMICALSYMBOLS */
+    { 183,  2, 291}, /* ALCHEMICAL */
+    { 605,  2, 292}, /* GEOMETRICSHAPESEXTENDED */
+    { 604,  2, 292}, /* GEOMETRICSHAPESEXT */
+    {1273,  2, 293}, /* SUPPLEMENTALARROWSC */
+    {1266,  2, 293}, /* SUPARROWSC */
+    {1276,  2, 294}, /* SUPPLEMENTALSYMBOLSANDPICTOGRAPHS */
+    {1282,  2, 294}, /* SUPSYMBOLSANDPICTOGRAPHS */
+    { 370,  2, 295}, /* CHESSSYMBOLS */
+    {1292,  2, 296}, /* SYMBOLSANDPICTOGRAPHSEXTENDEDA */
+    {1291,  2, 296}, /* SYMBOLSANDPICTOGRAPHSEXTA */
+    {1293,  2, 297}, /* SYMBOLSFORLEGACYCOMPUTING */
+    { 399,  2, 298}, /* CJKUNIFIEDIDEOGRAPHSEXTENSIONB */
+    { 386,  2, 298}, /* CJKEXTB */
+    { 400,  2, 299}, /* CJKUNIFIEDIDEOGRAPHSEXTENSIONC */
+    { 387,  2, 299}, /* CJKEXTC */
+    { 401,  2, 300}, /* CJKUNIFIEDIDEOGRAPHSEXTENSIOND */
+    { 388,  2, 300}, /* CJKEXTD */
+    { 402,  2, 301}, /* CJKUNIFIEDIDEOGRAPHSEXTENSIONE */
+    { 389,  2, 301}, /* CJKEXTE */
+    { 403,  2, 302}, /* CJKUNIFIEDIDEOGRAPHSEXTENSIONF */
+    { 390,  2, 302}, /* CJKEXTF */
+    { 382,  2, 303}, /* CJKCOMPATIBILITYIDEOGRAPHSSUPPLEMENT */
+    { 384,  2, 303}, /* CJKCOMPATIDEOGRAPHSSUP */
+    { 404,  2, 304}, /* CJKUNIFIEDIDEOGRAPHSEXTENSIONG */
+    { 391,  2, 304}, /* CJKEXTG */
+    {1303,  2, 305}, /* TAGS */
+    {1377,  2, 306}, /* VARIATIONSELECTORSSUPPLEMENT */
+    {1392,  2, 306}, /* VSSUP */
+    {1277,  2, 307}, /* SUPPLEMENTARYPRIVATEUSEAREAA */
+    {1279,  2, 307}, /* SUPPUAA */
+    {1278,  2, 308}, /* SUPPLEMENTARYPRIVATEUSEAREAB */
+    {1280,  2, 308}, /* SUPPUAB */
+    {1027,  3,   0}, /* NOTREORDERED */
+    {   1,  3,   0}, /* 0 */
+    {1028,  3,   0}, /* NR */
+    { 167,  3,   1}, /* ABOVE */
+    {  75,  3,   1}, /* 230 */
+    { 166,  3,   1}, /* A */
+    { 169,  3,   2}, /* ABOVERIGHT */
+    {  76,  3,   2}, /* 232 */
+    { 201,  3,   2}, /* AR */
+    { 253,  3,   3}, /* BELOW */
+    {  69,  3,   3}, /* 220 */
+    { 236,  3,   3}, /* B */
+    { 230,  3,   4}, /* ATTACHEDABOVERIGHT */
+    {  65,  3,   4}, /* 216 */
+    { 225,  3,   4}, /* ATAR */
+    { 231,  3,   5}, /* ATTACHEDBELOW */
+    {  62,  3,   5}, /* 202 */
+    { 226,  3,   5}, /* ATB */
+    {1096,  3,   6}, /* OVERLAY */
+    {   2,  3,   6}, /* 1 */
+    {1095,  3,   6}, /* OV */
+    { 726,  3,   7}, /* IOTASUBSCRIPT */
+    {  80,  3,   7}, /* 240 */
+    { 729,  3,   7}, /* IS */
+    { 512,  3,   8}, /* DOUBLEBELOW */
+    {  77,  3,   8}, /* 233 */
+    { 483,  3,   8}, /* DB */
+    { 511,  3,   9}, /* DOUBLEABOVE */
+    {  78,  3,   9}, /* 234 */
+    { 478,  3,   9}, /* DA */
+    { 255,  3,  10}, /* BELOWRIGHT */
+    {  70,  3,  10}, /* 222 */
+    { 283,  3,  10}, /* BR */
+    { 168,  3,  11}, /* ABOVELEFT */
+    {  73,  3,  11}, /* 228 */
+    { 181,  3,  11}, /* AL */
+    { 321,  3,  12}, /* CCC10 */
+    {  21,  3,  12}, /* 10 */
+    { 324,  3,  13}, /* CCC11 */
+    {  33,  3,  13}, /* 11 */
+    { 326,  3,  14}, /* CCC12 */
+    {  37,  3,  14}, /* 12 */
+    { 329,  3,  15}, /* CCC13 */
+    {  40,  3,  15}, /* 13 */
+    { 333,  3,  16}, /* CCC14 */
+    {  45,  3,  16}, /* 14 */
+    { 334,  3,  17}, /* CCC15 */
+    {  46,  3,  17}, /* 15 */
+    { 335,  3,  18}, /* CCC16 */
+    {  48,  3,  18}, /* 16 */
+    { 336,  3,  19}, /* CCC17 */
+    {  49,  3,  19}, /* 17 */
+    { 337,  3,  20}, /* CCC18 */
+    {  51,  3,  20}, /* 18 */
+    { 338,  3,  21}, /* CCC19 */
+    {  52,  3,  21}, /* 19 */
+    { 339,  3,  22}, /* CCC20 */
+    {  56,  3,  22}, /* 20 */
+    { 340,  3,  23}, /* CCC21 */
+    {  63,  3,  23}, /* 21 */
+    { 341,  3,  24}, /* CCC22 */
+    {  68,  3,  24}, /* 22 */
+    { 342,  3,  25}, /* CCC23 */
+    {  74,  3,  25}, /* 23 */
+    { 343,  3,  26}, /* CCC24 */
+    {  79,  3,  26}, /* 24 */
+    { 344,  3,  27}, /* CCC25 */
+    {  81,  3,  27}, /* 25 */
+    { 349,  3,  28}, /* CCC30 */
+    {  95,  3,  28}, /* 30 */
+    { 350,  3,  29}, /* CCC31 */
+    { 100,  3,  29}, /* 31 */
+    { 351,  3,  30}, /* CCC32 */
+    { 101,  3,  30}, /* 32 */
+    { 346,  3,  31}, /* CCC27 */
+    {  83,  3,  31}, /* 27 */
+    { 347,  3,  32}, /* CCC28 */
+    {  84,  3,  32}, /* 28 */
+    { 348,  3,  33}, /* CCC29 */
+    {  85,  3,  33}, /* 29 */
+    { 352,  3,  34}, /* CCC33 */
+    { 102,  3,  34}, /* 33 */
+    { 353,  3,  35}, /* CCC34 */
+    { 103,  3,  35}, /* 34 */
+    { 354,  3,  36}, /* CCC35 */
+    { 104,  3,  36}, /* 35 */
+    { 355,  3,  37}, /* CCC36 */
+    { 105,  3,  37}, /* 36 */
+    {1034,  3,  38}, /* NUKTA */
+    { 142,  3,  38}, /* 7 */
+    {1011,  3,  38}, /* NK */
+    {1383,  3,  39}, /* VIRAMA */
+    { 158,  3,  39}, /* 9 */
+    {1390,  3,  39}, /* VR */
+    { 356,  3,  40}, /* CCC84 */
+    { 157,  3,  40}, /* 84 */
+    { 357,  3,  41}, /* CCC91 */
+    { 165,  3,  41}, /* 91 */
+    { 322,  3,  42}, /* CCC103 */
+    {  31,  3,  42}, /* 103 */
+    { 323,  3,  43}, /* CCC107 */
+    {  32,  3,  43}, /* 107 */
+    { 325,  3,  44}, /* CCC118 */
+    {  36,  3,  44}, /* 118 */
+    { 327,  3,  45}, /* CCC122 */
+    {  38,  3,  45}, /* 122 */
+    { 328,  3,  46}, /* CCC129 */
+    {  39,  3,  46}, /* 129 */
+    { 330,  3,  47}, /* CCC130 */
+    {  42,  3,  47}, /* 130 */
+    { 331,  3,  48}, /* CCC132 */
+    {  43,  3,  48}, /* 132 */
+    { 229,  3,  49}, /* ATTACHEDABOVE */
+    {  64,  3,  49}, /* 214 */
+    { 224,  3,  49}, /* ATA */
+    { 254,  3,  50}, /* BELOWLEFT */
+    {  67,  3,  50}, /* 218 */
+    { 268,  3,  50}, /* BL */
+    { 811,  3,  51}, /* LEFT */
+    {  71,  3,  51}, /* 224 */
+    { 783,  3,  51}, /* L */
+    { 757,  3,  52}, /* KANAVOICING */
+    { 151,  3,  52}, /* 8 */
+    { 782,  3,  52}, /* KV */
+    { 345,  3,  53}, /* CCC26 */
+    {  82,  3,  53}, /* 26 */
+    { 667,  3,  54}, /* HANREADING */
+    { 136,  3,  54}, /* 6 */
+    { 666,  3,  54}, /* HANR */
+    {1172,  3,  55}, /* RIGHT */
+    {  72,  3,  55}, /* 226 */
+    {1164,  3,  55}, /* R */
+    { 332,  3,  56}, /* CCC133 */
+    {  44,  3,  56}, /* 133 */
+    { 232,  3,  57}, /* ATTACHEDBELOWLEFT */
+    {  57,  3,  57}, /* 200 */
+    { 227,  3,  57}, /* ATBL */
+    {1020,  4,   0}, /* NONE */
+    {1017,  4,   1}, /* NOBREAK */
+    { 994,  4,   1}, /* NB */
+    { 424,  4,   2}, /* COMPAT */
+    { 413,  4,   2}, /* COM */
+    {1267,  4,   3}, /* SUPER */
+    {1263,  4,   3}, /* SUP */
+    { 592,  4,   4}, /* FRACTION */
+    { 591,  4,   4}, /* FRA */
+    { 307,  4,   5}, /* CANONICAL */
+    { 304,  4,   5}, /* CAN */
+    {1258,  4,   6}, /* SUB */
+    { 589,  4,   7}, /* FONT */
+    { 374,  4,   8}, /* CIRCLE */
+    { 546,  4,   8}, /* ENC */
+    {1401,  4,   9}, /* WIDE */
+    {1381,  4,  10}, /* VERTICAL */
+    {1380,  4,  10}, /* VERT */
+    {1254,  4,  11}, /* SQUARE */
+    {1253,  4,  11}, /* SQR */
+    { 731,  4,  12}, /* ISOLATED */
+    { 730,  4,  12}, /* ISO */
+    { 584,  4,  13}, /* FINAL */
+    { 583,  4,  13}, /* FIN */
+    { 717,  4,  14}, /* INITIAL */
+    { 716,  4,  14}, /* INIT */
+    { 930,  4,  15}, /* MEDIAL */
+    { 927,  4,  15}, /* MED */
+    {1231,  4,  16}, /* SMALL */
+    {1236,  4,  16}, /* SML */
+    { 993,  4,  17}, /* NARROW */
+    { 991,  4,  17}, /* NAR */
+    { 998,  5,   0}, /* NEUTRAL */
+    { 984,  5,   0}, /* N */
+    { 993,  5,   1}, /* NARROW */
+    { 986,  5,   1}, /* NA */
+    { 193,  5,   2}, /* AMBIGUOUS */
+    { 166,  5,   2}, /* A */
+    {1401,  5,   3}, /* WIDE */
+    {1393,  5,   3}, /* W */
+    { 649,  5,   4}, /* HALFWIDTH */
+    { 643,  5,   4}, /* H */
+    { 594,  5,   5}, /* FULLWIDTH */
+    { 578,  5,   5}, /* F */
+    {1363,  6,   0}, /* UNASSIGNED */
+    { 410,  6,   0}, /* CN */
+    { 443,  6,   1}, /* CONTROL */
+    { 319,  6,   1}, /* CC */
+    { 411,  6,   1}, /* CNTRL */
+    {1248,  6,   2}, /* SPACESEPARATOR */
+    {1441,  6,   2}, /* ZS */
+    {1090,  6,   3}, /* OTHERPUNCTUATION */
+    {1133,  6,   3}, /* PO */
+    { 457,  6,   4}, /* CURRENCYSYMBOL */
+    {1199,  6,   4}, /* SC */
+    {1069,  6,   5}, /* OPENPUNCTUATION */
+    {1150,  6,   5}, /* PS */
+    { 408,  6,   6}, /* CLOSEPUNCTUATION */
+    {1115,  6,   6}, /* PE */
+    { 921,  6,   7}, /* MATHSYMBOL */
+    {1230,  6,   7}, /* SM */
+    { 482,  6,   8}, /* DASHPUNCTUATION */
+    {1112,  6,   8}, /* PD */
+    { 486,  6,   9}, /* DECIMALNUMBER */
+    { 997,  6,   9}, /* ND */
+    { 504,  6,   9}, /* DIGIT */
+    {1371,  6,  10}, /* UPPERCASELETTER */
+    { 851,  6,  10}, /* LU */
+    { 964,  6,  11}, /* MODIFIERSYMBOL */
+    {1229,  6,  11}, /* SK */
+    { 428,  6,  12}, /* CONNECTORPUNCTUATION */
+    {1110,  6,  12}, /* PC */
+    { 845,  6,  13}, /* LOWERCASELETTER */
+    { 838,  6,  13}, /* LL */
+    {1091,  6,  14}, /* OTHERSYMBOL */
+    {1237,  6,  14}, /* SO */
+    {1085,  6,  15}, /* OTHERLETTER */
+    { 840,  6,  15}, /* LO */
+    { 718,  6,  16}, /* INITIALPUNCTUATION */
+    {1130,  6,  16}, /* PI */
+    { 590,  6,  17}, /* FORMAT */
+    { 358,  6,  17}, /* CF */
+    {1089,  6,  18}, /* OTHERNUMBER */
+    {1015,  6,  18}, /* NO */
+    { 585,  6,  19}, /* FINALPUNCTUATION */
+    {1117,  6,  19}, /* PF */
+    {1342,  6,  20}, /* TITLECASELETTER */
+    { 850,  6,  20}, /* LT */
+    { 962,  6,  21}, /* MODIFIERLETTER */
+    { 839,  6,  21}, /* LM */
+    {1023,  6,  22}, /* NONSPACINGMARK */
+    { 960,  6,  22}, /* MN */
+    { 555,  6,  23}, /* ENCLOSINGMARK */
+    { 926,  6,  23}, /* ME */
+    {1249,  6,  24}, /* SPACINGMARK */
+    { 925,  6,  24}, /* MC */
+    { 822,  6,  25}, /* LETTERNUMBER */
+    {1014,  6,  25}, /* NL */
+    { 834,  6,  26}, /* LINESEPARATOR */
+    {1439,  6,  26}, /* ZL */
+    {1103,  6,  27}, /* PARAGRAPHSEPARATOR */
+    {1440,  6,  27}, /* ZP */
+    {1283,  6,  28}, /* SURROGATE */
+    { 453,  6,  28}, /* CS */
+    {1147,  6,  29}, /* PRIVATEUSE */
+    { 412,  6,  29}, /* CO */
+    {1079,  6,  30}, /* OTHER */
+    { 301,  6,  30}, /* C */
+    { 302,  6,  30}, /* C& */
+    { 820,  6,  31}, /* LETTER */
+    { 783,  6,  31}, /* L */
+    { 784,  6,  31}, /* L& */
+    { 914,  6,  32}, /* MARK */
+    { 860,  6,  32}, /* M */
+    { 419,  6,  32}, /* COMBININGMARK */
+    { 861,  6,  32}, /* M& */
+    {1035,  6,  33}, /* NUMBER */
+    { 984,  6,  33}, /* N */
+    { 985,  6,  33}, /* N& */
+    {1154,  6,  34}, /* PUNCTUATION */
+    {1098,  6,  34}, /* P */
+    {1153,  6,  34}, /* PUNCT */
+    {1099,  6,  34}, /* P& */
+    {1290,  6,  35}, /* SYMBOL */
+    {1188,  6,  35}, /* S */
+    {1189,  6,  35}, /* S& */
+    {1212,  6,  36}, /* SEPARATOR */
+    {1432,  6,  36}, /* Z */
+    {1433,  6,  36}, /* Z& */
+    { 315,  6,  37}, /* CASEDLETTER */
+    { 808,  6,  37}, /* LC */
+    { 222,  6,  38}, /* ASSIGNED */
+    {1079,  7,   0}, /* OTHER */
+    {1416,  7,   0}, /* XX */
+    { 443,  7,   1}, /* CONTROL */
+    { 410,  7,   1}, /* CN */
+    { 823,  7,   2}, /* LF */
+    { 452,  7,   3}, /* CR */
+    { 573,  7,   4}, /* EXTEND */
+    { 570,  7,   4}, /* EX */
+    {1144,  7,   5}, /* PREPEND */
+    {1141,  7,   5}, /* PP */
+    {1249,  7,   6}, /* SPACINGMARK */
+    {1230,  7,   6}, /* SM */
+    { 783,  7,   7}, /* L */
+    {1372,  7,   8}, /* V */
+    {1299,  7,   9}, /* T */
+    {1443,  7,  10}, /* ZWJ */
+    { 852,  7,  11}, /* LV */
+    { 854,  7,  12}, /* LVT */
+    {1166,  7,  13}, /* REGIONALINDICATOR */
+    {1171,  7,  13}, /* RI */
+    { 525,  7,  14}, /* EBASE */
+    { 524,  7,  14}, /* EB */
+    { 526,  7,  15}, /* EBASEGAZ */
+    { 527,  7,  15}, /* EBG */
+    { 538,  7,  16}, /* EMODIFIER */
+    { 536,  7,  16}, /* EM */
+    { 618,  7,  17}, /* GLUEAFTERZWJ */
+    { 597,  7,  17}, /* GAZ */
+    {1026,  8,   0}, /* NOTAPPLICABLE */
+    { 986,  8,   0}, /* NA */
+    { 810,  8,   1}, /* LEADINGJAMO */
+    { 783,  8,   1}, /* L */
+    {1389,  8,   2}, /* VOWELJAMO */
+    {1372,  8,   2}, /* V */
+    {1352,  8,   3}, /* TRAILINGJAMO */
+    {1299,  8,   3}, /* T */
+    { 853,  8,   4}, /* LVSYLLABLE */
+    { 852,  8,   4}, /* LV */
+    { 855,  8,   5}, /* LVTSYLLABLE */
+    { 854,  8,   5}, /* LVT */
+    { 986,  9,   0}, /* NA */
+    {1345,  9,   1}, /* TOP */
+    {1172,  9,   2}, /* RIGHT */
+    { 278,  9,   3}, /* BOTTOM */
+    { 811,  9,   4}, /* LEFT */
+    { 812,  9,   5}, /* LEFTANDRIGHT */
+    {1351,  9,   6}, /* TOPANDRIGHT */
+    {1349,  9,   7}, /* TOPANDLEFT */
+    {1350,  9,   8}, /* TOPANDLEFTANDRIGHT */
+    {1346,  9,   9}, /* TOPANDBOTTOM */
+    {1385,  9,  10}, /* VISUALORDERLEFT */
+    {1347,  9,  11}, /* TOPANDBOTTOMANDLEFT */
+    { 280,  9,  12}, /* BOTTOMANDRIGHT */
+    {1348,  9,  13}, /* TOPANDBOTTOMANDRIGHT */
+    {1097,  9,  14}, /* OVERSTRUCK */
+    { 279,  9,  15}, /* BOTTOMANDLEFT */
+    {1079, 10,   0}, /* OTHER */
+    { 436, 10,   1}, /* CONSONANTPLACEHOLDER */
+    {1035, 10,   2}, /* NUMBER */
+    {1287, 10,   3}, /* SYLLABLEMODIFIER */
+    { 266, 10,   4}, /* BINDU */
+    {1384, 10,   5}, /* VISARGA */
+    {1388, 10,   6}, /* VOWELINDEPENDENT */
+    { 429, 10,   7}, /* CONSONANT */
+    {1387, 10,   8}, /* VOWELDEPENDENT */
+    {1034, 10,   9}, /* NUKTA */
+    { 233, 10,  10}, /* AVAGRAHA */
+    {1383, 10,  11}, /* VIRAMA */
+    { 310, 10,  12}, /* CANTILLATIONMARK */
+    { 430, 10,  13}, /* CONSONANTDEAD */
+    { 600, 10,  14}, /* GEMINATIONMARK */
+    { 435, 10,  15}, /* CONSONANTMEDIAL */
+    { 966, 10,  16}, /* MODIFYINGLETTER */
+    { 441, 10,  17}, /* CONSONANTWITHSTACKER */
+    {1155, 10,  18}, /* PUREKILLER */
+    { 437, 10,  19}, /* CONSONANTPRECEDINGREPHA */
+    {1344, 10,  20}, /* TONEMARK */
+    { 434, 10,  21}, /* CONSONANTKILLER */
+    { 432, 10,  22}, /* CONSONANTHEADLETTER */
+    { 439, 10,  23}, /* CONSONANTSUBJOINED */
+    { 725, 10,  24}, /* INVISIBLESTACKER */
+    {1167, 10,  25}, /* REGISTERSHIFTER */
+    { 440, 10,  26}, /* CONSONANTSUCCEEDINGREPHA */
+    { 431, 10,  27}, /* CONSONANTFINAL */
+    {1386, 10,  28}, /* VOWEL */
+    {1343, 10,  29}, /* TONELETTER */
+    { 433, 10,  30}, /* CONSONANTINITIALPOSTFIXED */
+    {1021, 10,  31}, /* NONJOINER */
+    { 743, 10,  32}, /* JOINER */
+    { 286, 10,  33}, /* BRAHMIJOININGNUMBER */
+    {1037, 10,  34}, /* NUMBERJOINER */
+    { 438, 10,  35}, /* CONSONANTPREFIXED */
+    {1018, 11,   0}, /* NOJOININGGROUP */
+    {1418, 11,   1}, /* YEH */
+    { 185, 11,   2}, /* ALEF */
+    {1397, 11,   3}, /* WAW */
+    { 252, 11,   4}, /* BEH */
+    {1325, 11,   5}, /* TEHMARBUTA */
+    { 646, 11,   6}, /* HAH */
+    { 479, 11,   7}, /* DAL */
+    {1168, 11,   8}, /* REH */
+    {1206, 11,   9}, /* SEEN */
+    {1191, 11,  10}, /* SAD */
+    {1304, 11,  11}, /* TAH */
+    { 180, 11,  12}, /* AIN */
+    { 595, 11,  13}, /* GAF */
+    { 580, 11,  14}, /* FARSIYEH */
+    { 582, 11,  15}, /* FEH */
+    {1158, 11,  16}, /* QAF */
+    { 749, 11,  17}, /* KAF */
+    { 785, 11,  18}, /* LAM */
+    { 931, 11,  19}, /* MEEM */
+    {1025, 11,  20}, /* NOON */
+    { 675, 11,  21}, /* HEH */
+    {1285, 11,  22}, /* SWASHKAF */
+    {1044, 11,  23}, /* NYA */
+    { 780, 11,  24}, /* KNOTTEDHEH */
+    { 676, 11,  25}, /* HEHGOAL */
+    { 651, 11,  26}, /* HAMZAONHEHGOAL */
+    {1326, 11,  26}, /* TEHMARBUTAGOAL */
+    {1420, 11,  27}, /* YEHWITHTAIL */
+    {1419, 11,  28}, /* YEHBARREE */
+    { 182, 11,  29}, /* ALAPH */
+    { 258, 11,  30}, /* BETH */
+    { 596, 11,  31}, /* GAMAL */
+    { 480, 11,  32}, /* DALATHRISH */
+    { 671, 11,  33}, /* HE */
+    {1298, 11,  34}, /* SYRIACWAW */
+    {1434, 11,  35}, /* ZAIN */
+    { 677, 11,  36}, /* HETH */
+    {1331, 11,  37}, /* TETH */
+    {1430, 11,  38}, /* YUDH */
+    {1431, 11,  39}, /* YUDHHE */
+    { 762, 11,  40}, /* KAPH */
+    { 786, 11,  41}, /* LAMADH */
+    { 945, 11,  42}, /* MIM */
+    {1041, 11,  43}, /* NUN */
+    {1208, 11,  44}, /* SEMKATH */
+    { 586, 11,  45}, /* FINALSEMKATH */
+    { 520, 11,  46}, /* E */
+    {1115, 11,  47}, /* PE */
+    {1170, 11,  48}, /* REVERSEDPE */
+    {1192, 11,  49}, /* SADHE */
+    {1159, 11,  50}, /* QAPH */
+    {1218, 11,  51}, /* SHIN */
+    {1324, 11,  52}, /* TAW */
+    {1437, 11,  53}, /* ZHAIN */
+    { 768, 11,  54}, /* KHAPH */
+    { 581, 11,  55}, /* FE */
+    { 298, 11,  56}, /* BURUSHASKIYEHBARREE */
+    { 873, 11,  57}, /* MALAYALAMNGA */
+    { 870, 11,  58}, /* MALAYALAMJA */
+    { 876, 11,  59}, /* MALAYALAMNYA */
+    { 879, 11,  60}, /* MALAYALAMTTA */
+    { 874, 11,  61}, /* MALAYALAMNNA */
+    { 875, 11,  62}, /* MALAYALAMNNNA */
+    { 869, 11,  63}, /* MALAYALAMBHA */
+    { 877, 11,  64}, /* MALAYALAMRA */
+    { 871, 11,  65}, /* MALAYALAMLLA */
+    { 872, 11,  66}, /* MALAYALAMLLLA */
+    { 878, 11,  67}, /* MALAYALAMSSA */
+    {1183, 11,  68}, /* ROHINGYAYEH */
+    {1257, 11,  69}, /* STRAIGHTWAW */
+    { 173, 11,  70}, /* AFRICANFEH */
+    { 175, 11,  71}, /* AFRICANQAF */
+    { 174, 11,  72}, /* AFRICANNOON */
+    { 885, 11,  73}, /* MANICHAEANALEPH */
+    { 887, 11,  74}, /* MANICHAEANBETH */
+    { 891, 11,  75}, /* MANICHAEANGIMEL */
+    { 888, 11,  76}, /* MANICHAEANDALETH */
+    { 909, 11,  77}, /* MANICHAEANWAW */
+    { 911, 11,  78}, /* MANICHAEANZAYIN */
+    { 892, 11,  79}, /* MANICHAEANHETH */
+    { 906, 11,  80}, /* MANICHAEANTETH */
+    { 910, 11,  81}, /* MANICHAEANYODH */
+    { 894, 11,  82}, /* MANICHAEANKAPH */
+    { 895, 11,  83}, /* MANICHAEANLAMEDH */
+    { 889, 11,  84}, /* MANICHAEANDHAMEDH */
+    { 907, 11,  85}, /* MANICHAEANTHAMEDH */
+    { 896, 11,  86}, /* MANICHAEANMEM */
+    { 897, 11,  87}, /* MANICHAEANNUN */
+    { 903, 11,  88}, /* MANICHAEANSAMEKH */
+    { 886, 11,  89}, /* MANICHAEANAYIN */
+    { 899, 11,  90}, /* MANICHAEANPE */
+    { 902, 11,  91}, /* MANICHAEANSADHE */
+    { 900, 11,  92}, /* MANICHAEANQOPH */
+    { 901, 11,  93}, /* MANICHAEANRESH */
+    { 904, 11,  94}, /* MANICHAEANTAW */
+    { 898, 11,  95}, /* MANICHAEANONE */
+    { 890, 11,  96}, /* MANICHAEANFIVE */
+    { 905, 11,  97}, /* MANICHAEANTEN */
+    { 908, 11,  98}, /* MANICHAEANTWENTY */
+    { 893, 11,  99}, /* MANICHAEANHUNDRED */
+    { 664, 11, 100}, /* HANIFIROHINGYAPA */
+    { 663, 11, 101}, /* HANIFIROHINGYAKINNAYA */
+    {1022, 12,   0}, /* NONJOINING */
+    {1357, 12,   0}, /* U */
+    {1353, 12,   1}, /* TRANSPARENT */
+    {1299, 12,   1}, /* T */
+    { 517, 12,   2}, /* DUALJOINING */
+    { 477, 12,   2}, /* D */
+    {1173, 12,   3}, /* RIGHTJOINING */
+    {1164, 12,   3}, /* R */
+    { 741, 12,   4}, /* JOINCAUSING */
+    { 301, 12,   4}, /* C */
+    { 813, 12,   5}, /* LEFTJOINING */
+    { 783, 12,   5}, /* L */
+    {1367, 13,   0}, /* UNKNOWN */
+    {1416, 13,   0}, /* XX */
+    { 419, 13,   1}, /* COMBININGMARK */
+    { 409, 13,   1}, /* CM */
+    { 290, 13,   2}, /* BREAKAFTER */
+    { 238, 13,   2}, /* BA */
+    { 833, 13,   3}, /* LINEFEED */
+    { 823, 13,   3}, /* LF */
+    { 882, 13,   4}, /* MANDATORYBREAK */
+    { 267, 13,   4}, /* BK */
+    { 313, 13,   5}, /* CARRIAGERETURN */
+    { 452, 13,   5}, /* CR */
+    {1247, 13,   6}, /* SPACE */
+    {1246, 13,   6}, /* SP */
+    { 571, 13,   7}, /* EXCLAMATION */
+    { 570, 13,   7}, /* EX */
+    {1162, 13,   8}, /* QUOTATION */
+    {1161, 13,   8}, /* QU */
+    { 189, 13,   9}, /* ALPHABETIC */
+    { 181, 13,   9}, /* AL */
+    {1143, 13,  10}, /* PREFIXNUMERIC */
+    {1142, 13,  10}, /* PR */
+    {1140, 13,  11}, /* POSTFIXNUMERIC */
+    {1133, 13,  11}, /* PO */
+    {1069, 13,  12}, /* OPENPUNCTUATION */
+    {1068, 13,  12}, /* OP */
+    { 407, 13,  13}, /* CLOSEPARENTHESIS */
+    { 450, 13,  13}, /* CP */
+    { 714, 13,  14}, /* INFIXNUMERIC */
+    { 729, 13,  14}, /* IS */
+    { 693, 13,  15}, /* HYPHEN */
+    { 692, 13,  15}, /* HY */
+    { 293, 13,  16}, /* BREAKSYMBOLS */
+    {1286, 13,  16}, /* SY */
+    {1038, 13,  17}, /* NUMERIC */
+    {1033, 13,  17}, /* NU */
+    { 408, 13,  18}, /* CLOSEPUNCTUATION */
+    { 405, 13,  18}, /* CL */
+    {1002, 13,  19}, /* NEXTLINE */
+    {1014, 13,  19}, /* NL */
+    { 617, 13,  20}, /* GLUE */
+    { 612, 13,  20}, /* GL */
+    { 193, 13,  21}, /* AMBIGUOUS */
+    { 179, 13,  21}, /* AI */
+    { 291, 13,  22}, /* BREAKBEFORE */
+    { 250, 13,  22}, /* BB */
+    { 674, 13,  23}, /* HEBREWLETTER */
+    { 685, 13,  23}, /* HL */
+    { 426, 13,  24}, /* COMPLEXCONTEXT */
+    {1190, 13,  24}, /* SA */
+    { 739, 13,  25}, /* JL */
+    { 747, 13,  26}, /* JV */
+    { 746, 13,  27}, /* JT */
+    {1024, 13,  28}, /* NONSTARTER */
+    {1029, 13,  28}, /* NS */
+    {1444, 13,  29}, /* ZWSPACE */
+    {1442, 13,  29}, /* ZW */
+    {1443, 13,  30}, /* ZWJ */
+    { 292, 13,  31}, /* BREAKBOTH */
+    { 237, 13,  31}, /* B2 */
+    { 723, 13,  32}, /* INSEPARABLE */
+    { 709, 13,  32}, /* IN */
+    { 724, 13,  32}, /* INSEPERABLE */
+    {1405, 13,  33}, /* WORDJOINER */
+    {1402, 13,  33}, /* WJ */
+    { 698, 13,  34}, /* IDEOGRAPHIC */
+    { 694, 13,  34}, /* ID */
+    { 525, 13,  35}, /* EBASE */
+    { 524, 13,  35}, /* EB */
+    { 427, 13,  36}, /* CONDITIONALJAPANESESTARTER */
+    { 375, 13,  36}, /* CJ */
+    { 644, 13,  37}, /* H2 */
+    { 645, 13,  38}, /* H3 */
+    {1283, 13,  39}, /* SURROGATE */
+    {1213, 13,  39}, /* SG */
+    { 442, 13,  40}, /* CONTINGENTBREAK */
+    { 318, 13,  40}, /* CB */
+    {1166, 13,  41}, /* REGIONALINDICATOR */
+    {1171, 13,  41}, /* RI */
+    { 538, 13,  42}, /* EMODIFIER */
+    { 536, 13,  42}, /* EM */
+    {1015, 14,   0}, /* NO */
+    { 984, 14,   0}, /* N */
+    {1421, 14,   1}, /* YES */
+    {1417, 14,   1}, /* Y */
+    { 923, 14,   2}, /* MAYBE */
+    { 860, 14,   2}, /* M */
+    {1015, 15,   0}, /* NO */
+    { 984, 15,   0}, /* N */
+    {1421, 15,   1}, /* YES */
+    {1417, 15,   1}, /* Y */
+    {1020, 16,   0}, /* NONE */
+    { 485, 16,   1}, /* DECIMAL */
+    { 484, 16,   1}, /* DE */
+    { 504, 16,   2}, /* DIGIT */
+    { 496, 16,   2}, /* DI */
+    {1038, 16,   3}, /* NUMERIC */
+    {1033, 16,   3}, /* NU */
+    { 988, 17,   0}, /* NAN */
+    {   1, 17,   1}, /* 0 */
+    {   2, 17,   2}, /* 1 */
+    {  53, 17,   3}, /* 2 */
+    {  86, 17,   4}, /* 3 */
+    { 109, 17,   5}, /* 4 */
+    { 126, 17,   6}, /* 5 */
+    { 136, 17,   7}, /* 6 */
+    { 142, 17,   8}, /* 7 */
+    { 151, 17,   9}, /* 8 */
+    { 158, 17,  10}, /* 9 */
+    {  12, 17,  11}, /* 1/4 */
+    {   7, 17,  12}, /* 1/2 */
+    {  90, 17,  13}, /* 3/4 */
+    {   5, 17,  14}, /* 1/16 */
+    {  18, 17,  15}, /* 1/8 */
+    {  87, 17,  16}, /* 3/16 */
+    {  48, 17,  17}, /* 16 */
+    {  21, 17,  18}, /* 10 */
+    {  22, 17,  19}, /* 100 */
+    {  23, 17,  20}, /* 1000 */
+    {   6, 17,  21}, /* 1/160 */
+    {  13, 17,  22}, /* 1/40 */
+    {  94, 17,  23}, /* 3/80 */
+    {   8, 17,  24}, /* 1/20 */
+    {   3, 17,  25}, /* 1/10 */
+    {  89, 17,  26}, /* 3/20 */
+    {  14, 17,  27}, /* 1/5 */
+    {  88, 17,  28}, /* 3/2 */
+    { 128, 17,  29}, /* 5/2 */
+    { 144, 17,  30}, /* 7/2 */
+    { 159, 17,  31}, /* 9/2 */
+    {  35, 17,  32}, /* 11/2 */
+    {  41, 17,  33}, /* 13/2 */
+    {  47, 17,  34}, /* 15/2 */
+    {  50, 17,  35}, /* 17/2 */
+    {   0, 17,  36}, /* -1/2 */
+    {  56, 17,  37}, /* 20 */
+    {  95, 17,  38}, /* 30 */
+    { 111, 17,  39}, /* 40 */
+    { 131, 17,  40}, /* 50 */
+    { 137, 17,  41}, /* 60 */
+    { 146, 17,  42}, /* 70 */
+    { 152, 17,  43}, /* 80 */
+    { 160, 17,  44}, /* 90 */
+    {  24, 17,  45}, /* 10000 */
+    {  49, 17,  46}, /* 17 */
+    {  51, 17,  47}, /* 18 */
+    {  52, 17,  48}, /* 19 */
+    {  17, 17,  49}, /* 1/7 */
+    {  20, 17,  50}, /* 1/9 */
+    {   9, 17,  51}, /* 1/3 */
+    {  54, 17,  52}, /* 2/3 */
+    {  55, 17,  53}, /* 2/5 */
+    {  91, 17,  54}, /* 3/5 */
+    { 110, 17,  55}, /* 4/5 */
+    {  15, 17,  56}, /* 1/6 */
+    { 129, 17,  57}, /* 5/6 */
+    {  93, 17,  58}, /* 3/8 */
+    { 130, 17,  59}, /* 5/8 */
+    { 145, 17,  60}, /* 7/8 */
+    {  33, 17,  61}, /* 11 */
+    {  37, 17,  62}, /* 12 */
+    { 132, 17,  63}, /* 500 */
+    { 133, 17,  64}, /* 5000 */
+    { 134, 17,  65}, /* 50000 */
+    {  25, 17,  66}, /* 100000 */
+    {  40, 17,  67}, /* 13 */
+    {  45, 17,  68}, /* 14 */
+    {  46, 17,  69}, /* 15 */
+    {  63, 17,  70}, /* 21 */
+    {  68, 17,  71}, /* 22 */
+    {  74, 17,  72}, /* 23 */
+    {  79, 17,  73}, /* 24 */
+    {  81, 17,  74}, /* 25 */
+    {  82, 17,  75}, /* 26 */
+    {  83, 17,  76}, /* 27 */
+    {  84, 17,  77}, /* 28 */
+    {  85, 17,  78}, /* 29 */
+    { 100, 17,  79}, /* 31 */
+    { 101, 17,  80}, /* 32 */
+    { 102, 17,  81}, /* 33 */
+    { 103, 17,  82}, /* 34 */
+    { 104, 17,  83}, /* 35 */
+    { 105, 17,  84}, /* 36 */
+    { 106, 17,  85}, /* 37 */
+    { 107, 17,  86}, /* 38 */
+    { 108, 17,  87}, /* 39 */
+    { 116, 17,  88}, /* 41 */
+    { 117, 17,  89}, /* 42 */
+    { 118, 17,  90}, /* 43 */
+    { 120, 17,  91}, /* 44 */
+    { 121, 17,  92}, /* 45 */
+    { 122, 17,  93}, /* 46 */
+    { 123, 17,  94}, /* 47 */
+    { 124, 17,  95}, /* 48 */
+    { 125, 17,  96}, /* 49 */
+    {  28, 17,  97}, /* 100000000 */
+    {  30, 17,  98}, /* 1000000000000 */
+    {  57, 17,  99}, /* 200 */
+    {  96, 17, 100}, /* 300 */
+    { 112, 17, 101}, /* 400 */
+    { 138, 17, 102}, /* 600 */
+    { 147, 17, 103}, /* 700 */
+    { 153, 17, 104}, /* 800 */
+    { 161, 17, 105}, /* 900 */
+    {  58, 17, 106}, /* 2000 */
+    {  97, 17, 107}, /* 3000 */
+    { 113, 17, 108}, /* 4000 */
+    { 139, 17, 109}, /* 6000 */
+    { 148, 17, 110}, /* 7000 */
+    { 154, 17, 111}, /* 8000 */
+    { 162, 17, 112}, /* 9000 */
+    {  59, 17, 113}, /* 20000 */
+    {  98, 17, 114}, /* 30000 */
+    { 114, 17, 115}, /* 40000 */
+    { 140, 17, 116}, /* 60000 */
+    { 149, 17, 117}, /* 70000 */
+    { 155, 17, 118}, /* 80000 */
+    { 163, 17, 119}, /* 90000 */
+    {  34, 17, 120}, /* 11/12 */
+    {  60, 17, 121}, /* 200000 */
+    {  99, 17, 122}, /* 300000 */
+    { 115, 17, 123}, /* 400000 */
+    { 135, 17, 124}, /* 500000 */
+    { 141, 17, 125}, /* 600000 */
+    { 150, 17, 126}, /* 700000 */
+    { 156, 17, 127}, /* 800000 */
+    { 164, 17, 128}, /* 900000 */
+    {   4, 17, 129}, /* 1/12 */
+    { 127, 17, 130}, /* 5/12 */
+    { 143, 17, 131}, /* 7/12 */
+    {  11, 17, 132}, /* 1/320 */
+    {  19, 17, 133}, /* 1/80 */
+    {  16, 17, 134}, /* 1/64 */
+    {  10, 17, 135}, /* 1/32 */
+    {  92, 17, 136}, /* 3/64 */
+    {  66, 17, 137}, /* 216000 */
+    { 119, 17, 138}, /* 432000 */
+    {  26, 17, 139}, /* 1000000 */
+    {  29, 17, 140}, /* 10000000000 */
+    {  27, 17, 141}, /* 10000000 */
+    {  61, 17, 142}, /* 20000000 */
+    {1367, 18,   0}, /* UNKNOWN */
+    {1446, 18,   0}, /* ZZZZ */
+    { 421, 18,   1}, /* COMMON */
+    {1445, 18,   1}, /* ZYYY */
+    { 790, 18,   2}, /* LATIN */
+    { 806, 18,   2}, /* LATN */
+    { 275, 18,   3}, /* BOPOMOFO */
+    { 274, 18,   3}, /* BOPO */
+    { 715, 18,   4}, /* INHERITED */
+    {1438, 18,   4}, /* ZINH */
+    {1157, 18,   4}, /* QAAI */
+    { 631, 18,   5}, /* GREEK */
+    { 635, 18,   5}, /* GREK */
+    { 446, 18,   6}, /* COPTIC */
+    { 445, 18,   6}, /* COPT */
+    {1156, 18,   6}, /* QAAC */
+    { 466, 18,   7}, /* CYRILLIC */
+    { 476, 18,   7}, /* CYRL */
+    { 216, 18,   8}, /* ARMENIAN */
+    { 218, 18,   8}, /* ARMN */
+    { 673, 18,   9}, /* HEBREW */
+    { 672, 18,   9}, /* HEBR */
+    { 203, 18,  10}, /* ARABIC */
+    { 202, 18,  10}, /* ARAB */
+    {1295, 18,  11}, /* SYRIAC */
+    {1294, 18,  11}, /* SYRC */
+    {1335, 18,  12}, /* THAANA */
+    {1334, 18,  12}, /* THAA */
+    {1012, 18,  13}, /* NKO */
+    {1013, 18,  13}, /* NKOO */
+    {1193, 18,  14}, /* SAMARITAN */
+    {1194, 18,  14}, /* SAMR */
+    { 881, 18,  15}, /* MANDAIC */
+    { 880, 18,  15}, /* MAND */
+    { 493, 18,  16}, /* DEVANAGARI */
+    { 492, 18,  16}, /* DEVA */
+    { 257, 18,  17}, /* BENGALI */
+    { 256, 18,  17}, /* BENG */
+    { 641, 18,  18}, /* GURMUKHI */
+    { 642, 18,  18}, /* GURU */
+    { 638, 18,  19}, /* GUJARATI */
+    { 639, 18,  19}, /* GUJR */
+    {1071, 18,  20}, /* ORIYA */
+    {1074, 18,  20}, /* ORYA */
+    {1314, 18,  21}, /* TAMIL */
+    {1317, 18,  21}, /* TAML */
+    {1328, 18,  22}, /* TELUGU */
+    {1327, 18,  22}, /* TELU */
+    { 761, 18,  23}, /* KANNADA */
+    { 779, 18,  23}, /* KNDA */
+    { 868, 18,  24}, /* MALAYALAM */
+    { 959, 18,  24}, /* MLYM */
+    {1227, 18,  25}, /* SINHALA */
+    {1226, 18,  25}, /* SINH */
+    {1336, 18,  26}, /* THAI */
+    { 788, 18,  27}, /* LAO */
+    { 789, 18,  27}, /* LAOO */
+    {1337, 18,  28}, /* TIBETAN */
+    {1338, 18,  28}, /* TIBT */
+    { 978, 18,  29}, /* MYANMAR */
+    { 983, 18,  29}, /* MYMR */
+    { 607, 18,  30}, /* GEORGIAN */
+    { 606, 18,  30}, /* GEOR */
+    { 654, 18,  31}, /* HANGUL */
+    { 653, 18,  31}, /* HANG */
+    { 560, 18,  32}, /* ETHIOPIC */
+    { 559, 18,  32}, /* ETHI */
+    { 367, 18,  33}, /* CHEROKEE */
+    { 366, 18,  33}, /* CHER */
+    { 305, 18,  34}, /* CANADIANABORIGINAL */
+    { 309, 18,  34}, /* CANS */
+    {1050, 18,  35}, /* OGHAM */
+    {1049, 18,  35}, /* OGAM */
+    {1186, 18,  36}, /* RUNIC */
+    {1187, 18,  36}, /* RUNR */
+    {1300, 18,  37}, /* TAGALOG */
+    {1333, 18,  37}, /* TGLG */
+    { 668, 18,  38}, /* HANUNOO */
+    { 665, 18,  38}, /* HANO */
+    { 297, 18,  39}, /* BUHID */
+    { 296, 18,  39}, /* BUHD */
+    {1302, 18,  40}, /* TAGBANWA */
+    {1301, 18,  40}, /* TAGB */
+    { 772, 18,  41}, /* KHMER */
+    { 774, 18,  41}, /* KHMR */
+    { 968, 18,  42}, /* MONGOLIAN */
+    { 967, 18,  42}, /* MONG */
+    { 825, 18,  43}, /* LIMBU */
+    { 824, 18,  43}, /* LIMB */
+    {1305, 18,  44}, /* TAILE */
+    {1312, 18,  44}, /* TALE */
+    {1001, 18,  45}, /* NEWTAILUE */
+    {1313, 18,  45}, /* TALU */
+    { 295, 18,  46}, /* BUGINESE */
+    { 294, 18,  46}, /* BUGI */
+    {1306, 18,  47}, /* TAITHAM */
+    { 787, 18,  47}, /* LANA */
+    { 240, 18,  48}, /* BALINESE */
+    { 239, 18,  48}, /* BALI */
+    {1260, 18,  49}, /* SUNDANESE */
+    {1259, 18,  49}, /* SUND */
+    { 248, 18,  50}, /* BATAK */
+    { 249, 18,  50}, /* BATK */
+    { 819, 18,  51}, /* LEPCHA */
+    { 818, 18,  51}, /* LEPC */
+    {1054, 18,  52}, /* OLCHIKI */
+    {1055, 18,  52}, /* OLCK */
+    { 288, 18,  53}, /* BRAILLE */
+    { 287, 18,  53}, /* BRAI */
+    { 614, 18,  54}, /* GLAGOLITIC */
+    { 613, 18,  54}, /* GLAG */
+    {1339, 18,  55}, /* TIFINAGH */
+    {1332, 18,  55}, /* TFNG */
+    { 652, 18,  56}, /* HAN */
+    { 661, 18,  56}, /* HANI */
+    { 684, 18,  57}, /* HIRAGANA */
+    { 683, 18,  57}, /* HIRA */
+    { 763, 18,  58}, /* KATAKANA */
+    { 752, 18,  58}, /* KANA */
+    {1424, 18,  59}, /* YI */
+    {1425, 18,  59}, /* YIII */
+    { 835, 18,  60}, /* LISU */
+    {1373, 18,  61}, /* VAI */
+    {1374, 18,  61}, /* VAII */
+    { 242, 18,  62}, /* BAMUM */
+    { 241, 18,  62}, /* BAMU */
+    {1289, 18,  63}, /* SYLOTINAGRI */
+    {1288, 18,  63}, /* SYLO */
+    {1119, 18,  64}, /* PHAGSPA */
+    {1118, 18,  64}, /* PHAG */
+    {1197, 18,  65}, /* SAURASHTRA */
+    {1196, 18,  65}, /* SAUR */
+    { 767, 18,  66}, /* KAYAHLI */
+    { 751, 18,  66}, /* KALI */
+    {1169, 18,  67}, /* REJANG */
+    {1178, 18,  67}, /* RJNG */
+    { 737, 18,  68}, /* JAVANESE */
+    { 736, 18,  68}, /* JAVA */
+    { 360, 18,  69}, /* CHAM */
+    {1307, 18,  70}, /* TAIVIET */
+    {1323, 18,  70}, /* TAVT */
+    { 932, 18,  71}, /* MEETEIMAYEK */
+    { 973, 18,  71}, /* MTEI */
+    { 829, 18,  72}, /* LINEARB */
+    { 827, 18,  72}, /* LINB */
+    { 857, 18,  73}, /* LYCIAN */
+    { 856, 18,  73}, /* LYCI */
+    { 312, 18,  74}, /* CARIAN */
+    { 311, 18,  74}, /* CARI */
+    {1057, 18,  75}, /* OLDITALIC */
+    { 732, 18,  75}, /* ITAL */
+    { 622, 18,  76}, /* GOTHIC */
+    { 621, 18,  76}, /* GOTH */
+    {1059, 18,  77}, /* OLDPERMIC */
+    {1116, 18,  77}, /* PERM */
+    {1361, 18,  78}, /* UGARITIC */
+    {1360, 18,  78}, /* UGAR */
+    {1060, 18,  79}, /* OLDPERSIAN */
+    {1414, 18,  79}, /* XPEO */
+    { 491, 18,  80}, /* DESERET */
+    { 515, 18,  80}, /* DSRT */
+    {1216, 18,  81}, /* SHAVIAN */
+    {1217, 18,  81}, /* SHAW */
+    {1078, 18,  82}, /* OSMANYA */
+    {1077, 18,  82}, /* OSMA */
+    {1075, 18,  83}, /* OSAGE */
+    {1076, 18,  83}, /* OSGE */
+    { 533, 18,  84}, /* ELBASAN */
+    { 532, 18,  84}, /* ELBA */
+    { 317, 18,  85}, /* CAUCASIANALBANIAN */
+    { 176, 18,  85}, /* AGHB */
+    { 828, 18,  86}, /* LINEARA */
+    { 826, 18,  86}, /* LINA */
+    { 464, 18,  87}, /* CYPRIOT */
+    { 451, 18,  87}, /* CPRT */
+    { 708, 18,  88}, /* IMPERIALARAMAIC */
+    { 217, 18,  88}, /* ARMI */
+    {1102, 18,  89}, /* PALMYRENE */
+    {1101, 18,  89}, /* PALM */
+    { 987, 18,  90}, /* NABATAEAN */
+    { 995, 18,  90}, /* NBAT */
+    { 670, 18,  91}, /* HATRAN */
+    { 669, 18,  91}, /* HATR */
+    {1125, 18,  92}, /* PHOENICIAN */
+    {1124, 18,  92}, /* PHNX */
+    { 859, 18,  93}, /* LYDIAN */
+    { 858, 18,  93}, /* LYDI */
+    { 940, 18,  94}, /* MEROITICHIEROGLYPHS */
+    { 938, 18,  94}, /* MERO */
+    { 939, 18,  95}, /* MEROITICCURSIVE */
+    { 937, 18,  95}, /* MERC */
+    { 770, 18,  96}, /* KHAROSHTHI */
+    { 769, 18,  96}, /* KHAR */
+    {1062, 18,  97}, /* OLDSOUTHARABIAN */
+    {1195, 18,  97}, /* SARB */
+    {1058, 18,  98}, /* OLDNORTHARABIAN */
+    { 992, 18,  98}, /* NARB */
+    { 884, 18,  99}, /* MANICHAEAN */
+    { 883, 18,  99}, /* MANI */
+    { 234, 18, 100}, /* AVESTAN */
+    { 235, 18, 100}, /* AVST */
+    { 722, 18, 101}, /* INSCRIPTIONALPARTHIAN */
+    {1149, 18, 101}, /* PRTI */
+    { 721, 18, 102}, /* INSCRIPTIONALPAHLAVI */
+    {1122, 18, 102}, /* PHLI */
+    {1151, 18, 103}, /* PSALTERPAHLAVI */
+    {1123, 18, 103}, /* PHLP */
+    {1063, 18, 104}, /* OLDTURKIC */
+    {1072, 18, 104}, /* ORKH */
+    {1056, 18, 105}, /* OLDHUNGARIAN */
+    { 691, 18, 105}, /* HUNG */
+    { 662, 18, 106}, /* HANIFIROHINGYA */
+    {1182, 18, 106}, /* ROHG */
+    {1423, 18, 107}, /* YEZIDI */
+    {1422, 18, 107}, /* YEZI */
+    {1061, 18, 108}, /* OLDSOGDIAN */
+    {1241, 18, 108}, /* SOGO */
+    {1240, 18, 109}, /* SOGDIAN */
+    {1239, 18, 109}, /* SOGD */
+    { 371, 18, 110}, /* CHORASMIAN */
+    { 372, 18, 110}, /* CHRS */
+    { 535, 18, 111}, /* ELYMAIC */
+    { 534, 18, 111}, /* ELYM */
+    { 285, 18, 112}, /* BRAHMI */
+    { 284, 18, 112}, /* BRAH */
+    { 750, 18, 113}, /* KAITHI */
+    { 781, 18, 113}, /* KTHI */
+    {1243, 18, 114}, /* SORASOMPENG */
+    {1242, 18, 114}, /* SORA */
+    { 359, 18, 115}, /* CHAKMA */
+    { 303, 18, 115}, /* CAKM */
+    { 862, 18, 116}, /* MAHAJANI */
+    { 863, 18, 116}, /* MAHJ */
+    {1215, 18, 117}, /* SHARADA */
+    {1220, 18, 117}, /* SHRD */
+    { 776, 18, 118}, /* KHOJKI */
+    { 775, 18, 118}, /* KHOJ */
+    { 975, 18, 119}, /* MULTANI */
+    { 974, 18, 119}, /* MULT */
+    { 777, 18, 120}, /* KHUDAWADI */
+    {1224, 18, 120}, /* SIND */
+    { 624, 18, 121}, /* GRANTHA */
+    { 623, 18, 121}, /* GRAN */
+    { 999, 18, 122}, /* NEWA */
+    {1341, 18, 123}, /* TIRHUTA */
+    {1340, 18, 123}, /* TIRH */
+    {1222, 18, 124}, /* SIDDHAM */
+    {1221, 18, 124}, /* SIDD */
+    { 961, 18, 125}, /* MODI */
+    {1311, 18, 126}, /* TAKRI */
+    {1310, 18, 126}, /* TAKR */
+    { 178, 18, 127}, /* AHOM */
+    { 508, 18, 128}, /* DOGRA */
+    { 507, 18, 128}, /* DOGR */
+    {1396, 18, 129}, /* WARANGCITI */
+    {1395, 18, 129}, /* WARA */
+    { 506, 18, 130}, /* DIVESAKURU */
+    { 503, 18, 130}, /* DIAK */
+    { 990, 18, 131}, /* NANDINAGARI */
+    { 989, 18, 131}, /* NAND */
+    {1435, 18, 132}, /* ZANABAZARSQUARE */
+    {1436, 18, 132}, /* ZANB */
+    {1245, 18, 133}, /* SOYOMBO */
+    {1244, 18, 133}, /* SOYO */
+    {1109, 18, 134}, /* PAUCINHAU */
+    {1108, 18, 134}, /* PAUC */
+    { 259, 18, 135}, /* BHAIKSUKI */
+    { 260, 18, 135}, /* BHKS */
+    { 913, 18, 136}, /* MARCHEN */
+    { 912, 18, 136}, /* MARC */
+    { 915, 18, 137}, /* MASARAMGONDI */
+    { 620, 18, 137}, /* GONM */
+    { 640, 18, 138}, /* GUNJALAGONDI */
+    { 619, 18, 138}, /* GONG */
+    { 867, 18, 139}, /* MAKASAR */
+    { 866, 18, 139}, /* MAKA */
+    { 454, 18, 140}, /* CUNEIFORM */
+    {1415, 18, 140}, /* XSUX */
+    { 531, 18, 141}, /* EGYPTIANHIEROGLYPHS */
+    { 529, 18, 141}, /* EGYP */
+    { 195, 18, 142}, /* ANATOLIANHIEROGLYPHS */
+    { 686, 18, 142}, /* HLUW */
+    { 971, 18, 143}, /* MRO */
+    { 972, 18, 143}, /* MROO */
+    { 247, 18, 144}, /* BASSAVAH */
+    { 246, 18, 144}, /* BASS */
+    {1100, 18, 145}, /* PAHAWHHMONG */
+    { 687, 18, 145}, /* HMNG */
+    { 928, 18, 146}, /* MEDEFAIDRIN */
+    { 929, 18, 146}, /* MEDF */
+    { 941, 18, 147}, /* MIAO */
+    {1132, 18, 147}, /* PLRD */
+    {1319, 18, 148}, /* TANGUT */
+    {1318, 18, 148}, /* TANG */
+    {1042, 18, 149}, /* NUSHU */
+    {1030, 18, 149}, /* NSHU */
+    { 771, 18, 150}, /* KHITANSMALLSCRIPT */
+    { 778, 18, 150}, /* KITS */
+    { 519, 18, 151}, /* DUPLOYAN */
+    { 518, 18, 151}, /* DUPL */
+    {1223, 18, 152}, /* SIGNWRITING */
+    {1214, 18, 152}, /* SGNW */
+    {1045, 18, 153}, /* NYIAKENGPUACHUEHMONG */
+    { 688, 18, 153}, /* HMNP */
+    {1394, 18, 154}, /* WANCHO */
+    {1399, 18, 154}, /* WCHO */
+    { 936, 18, 155}, /* MENDEKIKAKUI */
+    { 935, 18, 155}, /* MEND */
+    { 170, 18, 156}, /* ADLAM */
+    { 171, 18, 156}, /* ADLM */
+    { 765, 18, 157}, /* KATAKANAORHIRAGANA */
+    { 689, 18, 157}, /* HRKT */
+    {1079, 19,   0}, /* OTHER */
+    {1416, 19,   0}, /* XX */
+    {1246, 19,   1}, /* SP */
+    { 823, 19,   2}, /* LF */
+    { 452, 19,   3}, /* CR */
+    {1256, 19,   4}, /* STERM */
+    {1255, 19,   4}, /* ST */
+    { 406, 19,   5}, /* CLOSE */
+    { 405, 19,   5}, /* CL */
+    {1200, 19,   6}, /* SCONTINUE */
+    {1199, 19,   6}, /* SC */
+    { 228, 19,   7}, /* ATERM */
+    { 223, 19,   7}, /* AT */
+    {1038, 19,   8}, /* NUMERIC */
+    {1033, 19,   8}, /* NU */
+    {1369, 19,   9}, /* UPPER */
+    {1368, 19,   9}, /* UP */
+    { 843, 19,  10}, /* LOWER */
+    { 840, 19,  10}, /* LO */
+    {1211, 19,  11}, /* SEP */
+    {1205, 19,  11}, /* SE */
+    { 590, 19,  12}, /* FORMAT */
+    { 588, 19,  12}, /* FO */
+    {1064, 19,  13}, /* OLETTER */
+    { 809, 19,  13}, /* LE */
+    { 573, 19,  14}, /* EXTEND */
+    { 570, 19,  14}, /* EX */
+    {1079, 20,   0}, /* OTHER */
+    {1416, 20,   0}, /* XX */
+    { 823, 20,   1}, /* LF */
+    {1000, 20,   2}, /* NEWLINE */
+    {1014, 20,   2}, /* NL */
+    { 452, 20,   3}, /* CR */
+    {1407, 20,   4}, /* WSEGSPACE */
+    { 513, 20,   5}, /* DOUBLEQUOTE */
+    { 514, 20,   5}, /* DQ */
+    {1225, 20,   6}, /* SINGLEQUOTE */
+    {1252, 20,   6}, /* SQ */
+    { 943, 20,   7}, /* MIDNUM */
+    { 960, 20,   7}, /* MN */
+    { 944, 20,   8}, /* MIDNUMLET */
+    { 924, 20,   8}, /* MB */
+    {1038, 20,   9}, /* NUMERIC */
+    {1033, 20,   9}, /* NU */
+    { 942, 20,  10}, /* MIDLETTER */
+    { 958, 20,  10}, /* ML */
+    { 186, 20,  11}, /* ALETTER */
+    { 809, 20,  11}, /* LE */
+    { 576, 20,  12}, /* EXTENDNUMLET */
+    { 570, 20,  12}, /* EX */
+    { 590, 20,  13}, /* FORMAT */
+    { 588, 20,  13}, /* FO */
+    { 573, 20,  14}, /* EXTEND */
+    { 674, 20,  15}, /* HEBREWLETTER */
+    { 685, 20,  15}, /* HL */
+    {1443, 20,  16}, /* ZWJ */
+    { 763, 20,  17}, /* KATAKANA */
+    { 748, 20,  17}, /* KA */
+    {1166, 20,  18}, /* REGIONALINDICATOR */
+    {1171, 20,  18}, /* RI */
+    { 525, 20,  19}, /* EBASE */
+    { 524, 20,  19}, /* EB */
+    { 526, 20,  20}, /* EBASEGAZ */
+    { 527, 20,  20}, /* EBG */
+    { 538, 20,  21}, /* EMODIFIER */
+    { 536, 20,  21}, /* EM */
+    { 618, 20,  22}, /* GLUEAFTERZWJ */
+    { 597, 20,  22}, /* GAZ */
 };
 
-/* property values: 6272 bytes. */
-
 /* Codepoints which expand on full case-folding. */
-
 RE_UINT16 re_expand_on_folding[] = {
       223,   304,   329,   496,   912,   944,  1415,  7830,
      7831,  7832,  7833,  7834,  7838,  8016,  8018,  8020,
@@ -3216,4231 +3254,9697 @@ RE_UINT16 re_expand_on_folding[] = {
      8131,  8132,  8134,  8135,  8140,  8146,  8147,  8150,
      8151,  8162,  8163,  8164,  8166,  8167,  8178,  8179,
      8180,  8182,  8183,  8188, 64256, 64257, 64258, 64259,
-    64260, 64261, 64262, 64275, 64276, 64277, 64278, 64279,
+    64260, 64261, 64262, 64275, 64276, 64277, 64278, 64279
 };
 
-/* expand_on_folding: 208 bytes. */
-
-/* General_Category. */
-
-static RE_UINT8 re_general_category_stage_1[] = {
-     0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15,
-    16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 26, 26, 26, 26, 26,
-    26, 26, 26, 26, 26, 26, 27, 26, 26, 26, 26, 26, 26, 26, 26, 26,
-    26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
-    26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 28,
-    29, 26, 30, 31, 32, 33, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
-    26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 34, 35, 35, 35, 35,
-    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 37, 38, 39, 40,
-    41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56,
-    26, 57, 58, 59, 59, 59, 59, 59, 26, 26, 60, 59, 59, 59, 59, 59,
-    59, 59, 26, 61, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 26, 62, 59, 63, 26, 26, 26, 26, 26, 26, 26, 26,
-    26, 26, 26, 64, 26, 65, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 66, 67, 59, 59, 59, 59, 68, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 69, 70, 71, 72, 73, 74, 59, 59,
-    75, 76, 59, 59, 77, 59, 78, 79, 80, 81, 73, 82, 83, 84, 59, 59,
-    26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
-    26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
-    26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
-    26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
-    26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
-    26, 26, 26, 85, 26, 26, 26, 26, 26, 26, 26, 86, 87, 26, 26, 26,
-    26, 26, 26, 26, 26, 26, 26, 88, 26, 26, 26, 26, 26, 26, 26, 26,
-    26, 26, 26, 26, 26, 89, 59, 59, 59, 59, 59, 59, 26, 90, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    91, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
-    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
-    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
-    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
-    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
-    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
-    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
-    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 92,
-    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
-    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
-    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
-    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
-    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
-    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
-    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
-    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 92,
+/* Alphabetic. */
+static RE_UINT8 re_alphabetic_table_1[] = {
+     0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 13, 13,
+    13, 13, 13, 14, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 15, 13, 16, 17, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 18, 10, 10, 10, 10, 10, 10, 10, 10, 19, 20,
+    21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 10, 10, 13, 31, 10, 10,
+    10, 32, 10, 10, 10, 10, 10, 10, 10, 10, 33, 34, 13, 13, 13, 13,
+    13, 35, 13, 36, 10, 10, 10, 10, 10, 10, 10, 10, 37, 10, 10, 38,
+    10, 10, 10, 10, 10, 39, 10, 10, 40, 10, 41, 42, 43, 10, 10, 10,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 44, 13, 13, 13, 45, 46, 13,
+    13, 13, 13, 47, 13, 13, 13, 13, 13, 13, 48, 10, 10, 10, 49, 10,
+    13, 13, 13, 13, 50, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10
 };
 
-static RE_UINT16 re_general_category_stage_2[] = {
-      0,   0,   1,   2,   3,   4,   5,   6,   0,   0,   7,   8,   9,  10,  11,  12,
-     13,  13,  13,  14,  15,  13,  13,  16,  17,  18,  19,  20,  21,  22,  13,  23,
-     13,  13,  13,  24,  25,  11,  11,  11,  11,  26,  11,  27,  28,  29,  30,  31,
-     32,  32,  32,  32,  32,  32,  32,  33,  34,  35,  36,  11,  37,  38,  13,  39,
-      9,   9,   9,  11,  11,  11,  13,  13,  40,  13,  13,  13,  41,  13,  13,  13,
-     13,  13,  13,  42,   9,  43,  11,  11,  44,  45,  32,  46,  47,  48,  49,  50,
-     51,  52,  48,  48,  53,  32,  54,  55,  48,  48,  48,  48,  48,  56,  57,  58,
-     59,  60,  48,  32,  61,  48,  48,  48,  48,  48,  62,  63,  64,  48,  65,  66,
-     48,  67,  68,  69,  48,  70,  71,  72,  72,  72,  48,  73,  72,  74,  75,  32,
-     76,  48,  48,  77,  78,  79,  80,  81,  82,  83,  84,  85,  86,  87,  88,  89,
-     90,  83,  84,  91,  92,  93,  94,  95,  96,  97,  84,  98,  99, 100,  88, 101,
-    102,  83,  84, 103, 104, 105,  88, 106, 107, 108, 109, 110, 111, 112,  94, 113,
-    114, 115,  84, 116, 117, 118,  88, 119, 120, 115,  84, 121, 122, 123,  88, 124,
-    125, 115,  48, 126, 127, 128,  88, 129, 130, 131,  48, 132, 133, 134,  94, 135,
-    136,  48,  48, 137, 138, 139,  72,  72, 140,  48, 141, 142, 143, 144,  72,  72,
-    145, 146, 147, 148, 149,  48, 150, 151, 152, 153,  32, 154, 155, 156,  72,  72,
-     48,  48, 157, 158, 159, 160, 161, 162, 163, 164,   9,   9, 165,  11,  11, 166,
-     48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,
-     48,  48,  48,  48, 167, 168,  48,  48, 167,  48,  48, 169, 170, 171,  48,  48,
-     48, 170,  48,  48,  48, 172, 173, 174,  48, 175,   9,   9,   9,   9,   9, 176,
-    177,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,
-     48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,
-     48,  48,  48,  48,  48,  48, 178,  48, 179, 180,  48,  48,  48,  48, 181, 182,
-    183, 184,  48, 185,  48, 186, 183, 187,  48,  48,  48, 188, 189, 190, 191, 192,
-    193, 191,  48,  48, 194,  48,  48, 195, 196,  48, 197,  48,  48,  48,  48, 198,
-     48, 199, 200, 201, 202,  48, 203, 204,  48,  48, 205,  48, 206, 207, 208, 208,
-     48, 209,  48,  48,  48, 210, 211, 212, 191, 191, 213, 214,  72,  72,  72,  72,
-    215,  48,  48, 216, 217, 159, 218, 219, 220,  48, 221,  64,  48,  48, 222, 223,
-     48,  48, 224, 225, 226,  64,  48, 227, 228,   9,   9, 229, 230, 231, 232, 233,
-     11,  11, 234,  27,  27,  27, 235, 236,  11, 237,  27,  27,  32,  32,  32, 238,
-     13,  13,  13,  13,  13,  13,  13,  13,  13, 239,  13,  13,  13,  13,  13,  13,
-    240, 241, 240, 240, 241, 242, 240, 243, 244, 244, 244, 245, 246, 247, 248, 249,
-    250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 260,  72, 261, 262, 263,
-    264, 265, 266, 267, 268, 269, 270, 270, 271, 272, 273, 208, 274, 275, 208, 276,
-    277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277,
-    278, 208, 279, 208, 208, 208, 208, 280, 208, 281, 277, 282, 208, 283, 284, 208,
-    208, 208, 285,  72, 286,  72, 269, 269, 269, 287, 208, 208, 208, 208, 288, 269,
-    208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 289, 290, 208, 208, 291,
-    208, 208, 208, 208, 208, 208, 292, 208, 208, 208, 208, 208, 208, 208, 208, 208,
-    208, 208, 208, 208, 208, 208, 293, 294, 269, 295, 208, 208, 296, 277, 297, 277,
-    208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208,
-    277, 277, 277, 277, 277, 277, 277, 277, 298, 299, 277, 277, 277, 300, 277, 301,
-    277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277,
-    208, 208, 208, 277, 302, 208, 208, 303, 208, 304, 208, 208, 208, 208, 208, 208,
-      9,   9, 305,  11,  11, 306, 307, 308,  13,  13,  13,  13,  13,  13, 309, 310,
-     11,  11, 311,  48,  48,  48, 312, 313,  48, 314, 315, 315, 315, 315,  32,  32,
-    316, 317, 318, 319, 320,  72,  72,  72, 208, 321, 208, 208, 208, 208, 208, 322,
-    208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 323,  72, 324,
-    325, 326, 327, 328, 136,  48,  48,  48,  48, 329, 177,  48,  48,  48,  48, 330,
-    331,  48,  48, 136,  48,  48,  48,  48, 199, 332,  48,  71, 208, 208, 322,  48,
-    208, 333, 334, 208, 335, 336, 208, 208, 334, 208, 208, 336, 208, 208, 208, 208,
-    208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208,
-     48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,
-     48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,
-     48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,
-     48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48, 198, 208, 208, 208, 208,
-     48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,
-     48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  72,
-     48, 337,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,
-     48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,
-     48,  48,  48,  48,  48,  48,  48,  48, 150, 208, 208, 208, 285,  48,  48, 227,
-     48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,
-    338,  48, 339,  72,  13,  13, 340, 341,  13, 342,  48,  48,  48,  48, 343, 344,
-     31, 345, 346, 347,  13,  13,  13, 348, 349, 350, 351, 352, 353,  72,  72, 354,
-    355,  48, 356, 357,  48,  48,  48, 358, 359,  48,  48, 360, 361, 191,  32, 362,
-     64,  48, 363,  48, 364, 365,  48, 150,  76,  48,  48, 366, 367, 368, 369, 370,
-     48,  48, 371, 372, 373, 374,  48, 375,  48,  48,  48, 376, 377, 378, 379, 380,
-    381, 382, 315,  11,  11, 383, 384,  11,  11,  11,  11,  11,  48,  48, 385, 191,
-     48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,
-     48,  48,  48,  48,  48,  48,  48,  48,  48,  48, 386,  48, 387,  48,  48, 205,
-    388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388,
-    388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388,
-    389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389,
-    389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389,
-    389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389,
-     48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,
-     48,  48,  48,  48,  48,  48, 203,  48,  48,  48,  48,  48,  48, 206,  72,  72,
-    390, 391, 392, 393, 394,  48,  48,  48,  48,  48,  48, 395, 396, 397,  48,  48,
-     48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,
-     48,  48,  48, 398,  72,  48,  48,  48,  48, 399,  48,  48, 400,  72,  72, 401,
-     32, 402,  32, 403, 404, 405, 406, 407,  48,  48,  48,  48,  48,  48,  48, 408,
-    409,   2,   3,   4,   5, 410, 411, 412,  48, 413,  48, 199, 414, 415, 416, 417,
-    418,  48, 171, 419, 203, 203,  72,  72,  48,  48,  48,  48,  48,  48,  48,  71,
-    420, 269, 269, 421, 270, 270, 270, 422, 423, 324, 424,  72,  72, 208, 208, 425,
-     72,  72,  72,  72,  72,  72,  72,  72,  48, 150,  48,  48,  48, 100, 426, 427,
-     48,  48, 428,  48, 429,  48,  48, 430,  48, 431,  48,  48, 432, 433,  72,  72,
-      9,   9, 434,  11,  11,  48,  48,  48,  48, 203, 191,   9,   9, 435,  11, 436,
-     48,  48, 400,  48,  48,  48, 437,  72,  72,  72,  72,  72,  72,  72,  72,  72,
-     48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,
-     48,  48,  48, 314,  48, 198, 400,  72,  72,  72,  72,  72,  72,  72,  72,  72,
-    438,  48,  48, 439,  48, 440,  48, 441,  48, 199, 442,  72,  72,  72,  48, 443,
-     48, 444,  48, 445,  72,  72,  72,  72,  48,  48,  48, 446, 269, 447, 269, 269,
-    448, 449,  48, 450, 451, 452,  48, 453,  48, 454,  72,  72, 455,  48, 456, 457,
-     48,  48,  48, 458,  48, 459,  48, 460,  48, 461, 462,  72,  72,  72,  72,  72,
-     48,  48,  48,  48, 195,  72,  72,  72,   9,   9,   9, 463,  11,  11,  11, 464,
-     48,  48, 465, 191,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,
-     72,  72,  72,  72,  72,  72, 269, 466,  72,  72,  72,  72,  72,  72,  72,  72,
-     48, 454, 467,  48,  62, 468,  72,  72,  72,  72,  72,  72,  72,  72,  48, 314,
-    469,  48,  48, 470, 471, 447, 472, 473, 220,  48,  48, 474, 475,  48, 195, 191,
-    476,  48, 477, 478, 479,  48,  48, 480, 220,  48,  48, 481, 482, 483, 484, 485,
-     48,  97, 486, 487,  72,  72,  72,  72, 488, 489, 490,  48,  48, 491, 492, 191,
-    493,  83,  84, 494, 495, 496, 497, 498,  72,  72,  72,  72,  72,  72,  72,  72,
-     48,  48,  48, 499, 500, 501,  72,  72,  48,  48,  48, 502, 503, 191,  72,  72,
-     72,  72,  72,  72,  72,  72,  72,  72,  48,  48, 504, 505, 506, 507,  72,  72,
-     48,  48,  48, 508, 509, 191, 510,  72,  48,  48, 511, 512, 191,  72,  72,  72,
-     48, 172, 513, 514,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,
-     48,  48, 486, 515,  72,  72,  72,  72,  72,  72,   9,   9,  11,  11, 147, 516,
-     72,  72,  72,  72,  72,  72,  72,  72,  72,  72, 517,  48,  48, 518, 519,  72,
-    520,  48,  48, 521, 522, 523,  48,  48, 524, 525, 526,  72,  48,  48,  48, 195,
-     72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,
-     84,  48, 504, 527, 528, 147, 174, 529,  48, 530, 531, 532,  72,  72,  72,  72,
-    533,  48,  48, 534, 535, 191, 536,  48, 537, 538, 191,  72,  72,  72,  72,  72,
-     72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  48, 539,
-     72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72, 269, 540, 541, 542,
-     48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,
-     48,  48,  48,  48,  48,  48,  48,  48,  48, 206,  72,  72,  72,  72,  72,  72,
-    270, 270, 270, 270, 270, 270, 543, 544,  48,  48,  48,  48,  48,  48,  48,  48,
-     48,  48,  48,  48, 386,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,
-     72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,
-     72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,
-     48,  48, 199, 545,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,
-     72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,
-     48,  48,  48,  48, 314,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,
-     72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,
-     48,  48,  48, 195,  48, 199, 368,  72,  72,  72,  72,  72,  72,  48, 203, 546,
-     48,  48,  48, 547, 548, 549, 550, 551,  48,  72,  72,  72,  72,  72,  72,  72,
-     72,  72,  72,  72,   9,   9,  11,  11, 269, 552,  72,  72,  72,  72,  72,  72,
-     48,  48,  48,  48, 553, 554, 555, 555, 556, 557,  72,  72,  72,  72, 558,  72,
-     48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,
-     48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48, 400,
-     48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48, 559,
-     72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,
-     48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,
-     48, 199,  72,  72,  72, 559, 560,  48,  48,  48,  48,  48,  48,  48,  48,  48,
-     48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48, 205,
-     72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,
-     48,  48,  48,  48,  48,  48,  71, 150, 195, 561, 562,  72,  72,  72,  72,  72,
-     72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,
-    208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 323,
-    208, 208, 563, 208, 208, 208, 564, 565, 566, 208, 567, 208, 208, 208, 568,  72,
-    208, 208, 208, 208, 569,  72,  72,  72,  72,  72,  72,  72,  72,  72, 269, 570,
-    208, 208, 208, 208, 208, 285, 269, 451,  72,  72,  72,  72,  72,  72,  72,  72,
-      9, 571,  11, 572, 573, 574, 240,   9, 575, 576, 577, 578, 579,   9, 571,  11,
-    580, 581,  11, 582, 583, 584, 585,   9, 586,  11,   9, 571,  11, 572, 573,  11,
-    240,   9, 575, 585,   9, 586,  11,   9, 571,  11, 587,   9, 588, 589, 590, 591,
-     11, 592,   9, 593, 594, 595, 596,  11, 597,   9, 598,  11, 599, 600, 600, 600,
-    208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208,
-    208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208,
-     32,  32,  32, 601,  32,  32, 602, 603, 604, 605,  45,  72,  72,  72,  72,  72,
-     72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,
-    606, 607, 608,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,
-     48,  48, 150, 609, 610,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,
-     72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  48,  48, 611, 612,
-     72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,
-     48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48, 613, 614,  72,  72,
-      9,   9, 575,  11, 615, 368,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,
-     72,  72,  72,  72,  72,  72,  72, 484, 269, 269, 616, 617,  72,  72,  72,  72,
-    484, 269, 618, 619,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,
-    620,  48, 621, 622, 623, 624, 625, 626, 627, 205, 628, 205,  72,  72,  72, 629,
-     72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,
-    208, 208, 324, 208, 208, 208, 208, 208, 208, 322, 333, 630, 630, 630, 208, 323,
-    174, 208, 208, 208, 208, 208, 631, 208, 208, 208, 631,  72,  72,  72, 632, 208,
-    633, 208, 208, 324, 568, 634, 323,  72,  72,  72,  72,  72,  72,  72,  72,  72,
-    208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 635,
-    208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 323, 631, 286,
-    208, 208, 208, 208, 208, 208, 208, 322, 208, 208, 208, 208, 208, 568, 324,  72,
-    324, 208, 208, 208, 636, 175, 208, 208, 636, 208, 637,  72,  72,  72,  72,  72,
-    638, 208, 208, 208, 208, 208, 208, 639, 208, 208, 640, 208, 641, 208, 208, 208,
-    208, 208, 208, 208, 208, 322, 637, 642, 633, 323,  72,  72,  72,  72,  72,  72,
-     72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,
-     48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48, 314,  72,  72,
-     48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,
-     48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,
-     48,  48,  48, 204,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,
-     48, 203,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,
-     48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,
-     48,  48,  48,  48,  48,  48,  48,  48,  48,  48, 643,  48,  48,  48,  48,  48,
-     48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,
-     48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,
-     48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48, 100,  72,
-     48, 203,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,
-     72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,
-    644,  72, 645, 645, 645, 645, 645, 645,  72,  72,  72,  72,  72,  72,  72,  72,
-     32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  72,
-    389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389,
-    389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 646,
+static RE_UINT8 re_alphabetic_table_2[] = {
+      0,   0,   1,   1,   0,   2,   3,   3,   4,   4,   4,   4,   4,   4,   4,   4,
+      4,   4,   4,   4,   4,   4,   5,   6,   0,   0,   7,   8,   9,  10,   4,  11,
+      4,   4,   4,   4,  12,   4,   4,   4,   4,  13,  14,   4,  15,  16,  17,  18,
+     19,   4,  20,  21,   4,   4,  22,  23,  24,   4,  25,   4,   4,  26,  27,  28,
+     29,  30,  31,  32,   0,  33,  34,  35,   4,  36,  37,  38,  39,  40,  41,  42,
+     43,  44,  45,  46,  47,  48,  49,  50,  51,  48,  52,  53,  54,  55,  56,   0,
+     57,  58,  59,  60,  57,  61,  62,  63,  64,  65,  66,  67,  68,  69,  70,  71,
+     72,  73,  74,   0,  75,  76,  77,   0,  78,   0,  79,  80,  81,  82,   0,   0,
+      4,  83,  24,   4,  84,   4,  85,  86,   4,   4,   4,   4,   4,   4,   4,   4,
+      4,   4,  87,   4,  88,  89,  90,   4,  91,   4,  73,   0,  92,   4,   4,  93,
+     72,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
+      4,   4,   4,  94,   1,   4,   4,  95,  96,  97,  97,  98,   4,  99, 100,   0,
+      0,   4,   4,  31,   4, 101,   4, 102, 103, 104,  24, 105,   4, 106, 107,   0,
+    108,   4, 103, 109,   0, 110,  78,   0,   4, 111, 112,   0,   4, 113,   4, 114,
+      4, 115, 116, 117, 118,  65,   0, 119,   4,   4,   4,   4,   4,   4,   0, 120,
+      4,   4,   4,   4,   4,   4,   4,   4,  93,   4, 121, 117,   4, 122, 123, 124,
+      0,   0,   0, 125, 126,   0,   0,   0, 127, 128, 129,   4,  15,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0, 130,   4, 107,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      4, 131, 103,   4,   4,   4,   4, 132,   4,  85,   4, 133, 115, 134, 134,   4,
+      0, 135,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    136, 137,  72,   4, 138,  72,   4,  86, 139,  13,   4,   4, 140,   4,   0,  24,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
+      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
+      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   0,   0,
+      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
+      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
+      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,  82,
+      4,   4,   4,   4,  30,   0,  24, 117,   4,   4,   4,   4,   4,   4,   4,   4,
+    141, 142,   4, 143,   4,   4,   4,  92, 144, 145,   4,   4, 146,   4, 147, 148,
+    149, 150,   4,  97,   4,   4, 151, 152,  27, 101, 153,  82,   4, 154, 135, 155,
+      4, 115, 156, 157,   4, 103, 158, 159, 160, 161,  86, 162,   4,   4,   4,  32,
+      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
+      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4, 163, 164, 108,
+      0,   0,   0,   0,   0,   0,   0,   0,   4,   4,   4,   4,   4,   4,   4,   4,
+      4,   4,   4, 165,   4,   4, 166,   0, 167, 168, 169,   4,   4,  26, 170,   4,
+      4,   4,   4,   4,   4,   4,   4,   4,   4, 117,  24,   4, 171,   4, 150, 172,
+      0,   0,   0, 173,   4,   4,   4,  82,   0,   1,   1, 174,   4, 103, 175,   0,
+    176, 177, 178,   0,   4,   4,   4,  73,   0,   0,   4, 179,   0,   0,   0,   0,
+      0,   0,   0,   0,  82,   4, 180,   0,   4,  25, 101,  73, 117,   4, 181,   0,
+      4,   4,   4,   4, 117,  24, 182, 108,   4, 183,   4,  60,   0,   0,   0,   0,
+      4,   4,   4,   4,   4,   4,   4,   4,   4, 115, 102, 150,   0,   0,   0,   0,
+    184, 185, 102, 115, 103,   0,   0, 186, 102, 166,   0,   0,   4, 187,   0,   0,
+    188, 102,   0,  82,  82,   0,  79, 189,   4, 102, 102, 153,  26,   0,   0,   0,
+      4,   4,  15,   0,   4, 153,   4, 153,   4, 150,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   4, 190,   0,   0,  82, 191, 192,   0,   0,  24, 189, 115,
+      4,   4, 192,   0, 145,  31,  24,  15,   4, 153, 193, 194,   4,   4, 195,   0,
+    196, 197,   0,   0, 198, 118,   4,  15,  39,  48, 199,  60,   0,   0,   0,   0,
+      4,   4, 200, 201,   4,   4, 202,   0,   0,   0,   0,   0,   4, 203, 204,   0,
+      4, 103, 205,   0,   4, 206,   0,   0,  65,  32,   0,   0,   0,   0,   0,   0,
+      4,  31,   0,   0,   0,   4,   4, 207, 208, 209, 210,   0,   0, 211,  29, 212,
+      4, 213,  24,   4, 214,   0,   4,  31,   0,   0,   0,   0,   0,   0,   0,   0,
+    215, 216,  78, 217, 171, 218,   0,   0, 219, 220, 221, 222, 223,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0, 115,   0,   0,   0,   0,   0, 224,   0,   0,
+      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
+      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4, 166,   0,   0,   0,
+      4,   4,   4, 140,   4,   4,   4,   4,   4,   4,  60,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      4, 140,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
+      4,   4, 225,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
+      4,  31, 103,   0,   0,   0,  24, 156,   4,  92,  60, 226,  92,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   4,   4,   0,   0,   0,   0,   4,   4, 227,   4, 228,   0,   0, 229,
+      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
+      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4, 230,
+      4,   4,   4,   4,   4,   4, 102,   0,  15,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      4,   4,   4,   4,   4,   4,   4,   4, 103,   0, 231, 193,   4,   4,   4,   4,
+      4,   4,   4,   4,   4,   4,   4, 108,   0,   0,   0,   0,   0,   0,   0,   0,
+      4,   4,   4, 232, 233,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      4,   4,  33,   4, 234, 235, 236,   4, 237, 238, 239,   4,   4,   4,   4,   4,
+      4,   4,   4,   4,   4, 240, 241,  86,  33,  33, 131, 131, 215, 215, 242,   0,
+    243, 244,   0,   0,   0,   0,   0,   0,   4, 245, 246,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   4, 247,   0,   0,   0,   0,   0,   0,   0,   0,
+      4,   4,   4,   4,   4,   4, 189,   0,   4,   4, 248,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    236, 249, 250, 251, 252, 253,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,  24, 162, 162, 107,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
+      4,   4,   4,   4,   4,   4, 117,   0,   4,   4,   4,   4,   4,   4,   4,   4,
+      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
+      4,   4,   4,   4,   4,   4,   4,   4,   4, 179,   4,   4,   4,   4,   4,   4,
+    117,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
+      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
+      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
+      4,   4,   4,   4,   4, 254,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
+      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
+      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,  78,
+      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
+    117,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
+      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,  32,   0,   0,   0,   0,   0
 };
 
-static RE_UINT8 re_general_category_stage_3[] = {
-      0,   0,   0,   0,   0,   0,   0,   0,   1,   2,   3,   2,   4,   5,   6,   2,
-      7,   7,   7,   7,   7,   2,   8,   9,  10,  11,  11,  11,  11,  11,  11,  11,
-     11,  11,  11,  11,  11,  12,  13,  14,  15,  16,  16,  16,  16,  16,  16,  16,
-     16,  16,  16,  16,  16,  17,  18,  19,   1,  20,  20,  21,  22,  23,  24,  25,
-     26,  27,  15,   2,  28,  29,  27,  30,  11,  11,  11,  11,  11,  11,  11,  11,
-     11,  11,  11,  31,  11,  11,  11,  32,  16,  16,  16,  16,  16,  16,  16,  16,
-     16,  16,  16,  33,  16,  16,  16,  16,  32,  32,  32,  32,  32,  32,  32,  32,
-     32,  32,  32,  32,  34,  34,  34,  34,  34,  34,  34,  34,  16,  32,  32,  32,
-     32,  32,  32,  32,  11,  34,  34,  16,  34,  32,  32,  11,  34,  11,  16,  11,
-     11,  34,  32,  11,  32,  16,  11,  34,  32,  32,  32,  11,  34,  16,  32,  11,
-     34,  11,  34,  34,  32,  35,  32,  16,  36,  36,  37,  34,  38,  37,  34,  34,
-     34,  34,  34,  34,  34,  34,  16,  32,  34,  38,  32,  11,  32,  32,  32,  32,
-     32,  32,  16,  16,  16,  11,  34,  32,  34,  34,  11,  32,  32,  32,  32,  32,
-     16,  16,  39,  16,  16,  16,  16,  16,  40,  40,  40,  40,  40,  40,  40,  40,
-     40,  41,  41,  40,  40,  40,  40,  40,  40,  41,  41,  41,  41,  41,  41,  41,
-     40,  40,  42,  41,  41,  41,  42,  42,  41,  41,  41,  41,  41,  41,  41,  41,
-     43,  43,  43,  43,  43,  43,  43,  43,  32,  32,  42,  32,  44,  45,  16,  10,
-     44,  44,  41,  46,  11,  47,  47,  11,  34,  11,  11,  11,  11,  11,  11,  11,
-     11,  48,  11,  11,  11,  11,  16,  16,  16,  16,  16,  16,  16,  16,  16,  34,
-     16,  11,  32,  16,  32,  32,  32,  32,  16,  16,  32,  49,  34,  32,  34,  11,
-     32,  50,  43,  43,  51,  32,  32,  32,  11,  34,  34,  34,  34,  34,  34,  16,
-     48,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  47,  52,   2,   2,   2,
-     16,  16,  16,  16,  53,  54,  55,  56,  57,  43,  43,  43,  43,  43,  43,  43,
-     43,  43,  43,  43,  43,  43,  43,  58,  59,  60,  43,  59,  44,  44,  44,  44,
-     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  61,  44,  62,
-     36,  63,  64,  44,  44,  44,  44,  44,  65,  65,  65,   8,   9,  66,   2,  67,
-     43,  43,  43,  43,  43,  60,  68,   2,  69,  36,  36,  36,  36,  70,  43,  43,
-      7,   7,   7,   7,   7,   2,   2,  36,  71,  36,  36,  36,  36,  36,  36,  36,
-     36,  36,  72,  43,  43,  43,  73,  50,  43,  43,  74,  75,  76,  43,  43,  36,
-      7,   7,   7,   7,   7,  36,  77,  78,   2,   2,   2,   2,   2,   2,   2,  79,
-     70,  36,  36,  36,  36,  36,  36,  36,  43,  43,  43,  43,  43,  80,  62,  36,
-     36,  36,  36,  43,  43,  43,  43,  43,  71,  44,  44,  44,  44,  44,  44,  44,
-      7,   7,   7,   7,   7,  36,  36,  36,  36,  36,  36,  36,  36,  70,  43,  43,
-     43,  43,  40,  21,   2,  81,  57,  20,  36,  36,  36,  43,  43,  75,  43,  43,
-     43,  43,  75,  43,  75,  43,  43,  44,   2,   2,   2,   2,   2,   2,   2,  64,
-     36,  36,  36,  36,  70,  43,  44,  64,  36,  36,  36,  36,  36,  61,  44,  44,
-     44,  44,  44,  44,  44,  44,  44,  44,  36,  36,  61,  36,  36,  36,  36,  44,
-     44,  57,  43,  43,  43,  43,  43,  43,  43,  82,  43,  43,  43,  43,  43,  43,
-     43,  83,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  83,  71,  84,
-     85,  43,  43,  43,  83,  84,  85,  84,  70,  43,  43,  43,  36,  36,  36,  36,
-     36,  43,   2,   7,   7,   7,   7,   7,  86,  36,  36,  36,  36,  36,  36,  36,
-     70,  84,  62,  36,  36,  36,  61,  62,  61,  62,  36,  36,  36,  36,  36,  36,
-     36,  36,  36,  36,  61,  36,  36,  36,  61,  61,  44,  36,  36,  44,  71,  84,
-     85,  43,  80,  87,  88,  87,  85,  61,  44,  44,  44,  87,  44,  44,  36,  62,
-     36,  43,  44,   7,   7,   7,   7,   7,  36,  20,  27,  27,  27,  56,  63,  80,
-     57,  83,  62,  36,  36,  61,  44,  62,  61,  36,  62,  61,  36,  44,  80,  84,
-     85,  80,  44,  57,  80,  57,  43,  44,  57,  44,  44,  44,  62,  36,  61,  61,
-     44,  44,  44,   7,   7,   7,   7,   7,  43,  36,  70,  64,  44,  44,  44,  44,
-     57,  83,  62,  36,  36,  36,  36,  62,  36,  62,  36,  36,  36,  36,  36,  36,
-     61,  36,  62,  36,  36,  44,  71,  84,  85,  43,  43,  57,  83,  87,  85,  44,
-     61,  44,  44,  44,  44,  44,  44,  44,  66,  44,  44,  44,  62,  43,  43,  43,
-     57,  84,  62,  36,  36,  36,  61,  62,  61,  36,  62,  36,  36,  44,  71,  85,
-     85,  43,  80,  87,  88,  87,  85,  44,  44,  44,  44,  83,  44,  44,  36,  62,
-     78,  27,  27,  27,  44,  44,  44,  44,  44,  71,  62,  36,  36,  61,  44,  36,
-     61,  36,  36,  44,  62,  61,  61,  36,  44,  62,  61,  44,  36,  61,  44,  36,
-     36,  36,  36,  36,  36,  44,  44,  84,  83,  88,  44,  84,  88,  84,  85,  44,
-     61,  44,  44,  87,  44,  44,  44,  44,  27,  89,  67,  67,  56,  90,  44,  44,
-     83,  84,  71,  36,  36,  36,  61,  36,  61,  36,  36,  36,  36,  36,  36,  36,
-     36,  36,  36,  36,  36,  44,  62,  43,  83,  84,  88,  43,  80,  43,  43,  44,
-     44,  44,  57,  80,  36,  61,  44,  44,  44,  44,  44,  91,  27,  27,  27,  89,
-     70,  84,  72,  36,  36,  36,  61,  36,  36,  36,  62,  36,  36,  44,  71,  85,
-     84,  84,  88,  83,  88,  84,  43,  44,  44,  44,  87,  88,  44,  44,  44,  61,
-     62,  61,  44,  44,  44,  44,  44,  44,  43,  84,  62,  36,  36,  36,  61,  36,
-     36,  36,  36,  36,  36,  70,  71,  84,  85,  43,  80,  84,  88,  84,  85,  77,
-     44,  44,  36,  92,  27,  27,  27,  93,  27,  27,  27,  27,  89,  36,  36,  36,
-     44,  84,  62,  36,  36,  36,  36,  36,  36,  36,  36,  61,  44,  36,  36,  36,
-     36,  62,  36,  36,  36,  36,  62,  44,  36,  36,  36,  61,  44,  80,  44,  87,
-     84,  43,  80,  80,  84,  84,  84,  84,  44,  84,  64,  44,  44,  44,  44,  44,
-     62,  36,  36,  36,  36,  36,  36,  36,  70,  36,  43,  43,  43,  80,  44,  94,
-     36,  36,  36,  75,  43,  43,  43,  60,   7,   7,   7,   7,   7,   2,  44,  44,
-     62,  61,  61,  36,  36,  61,  36,  36,  36,  36,  62,  62,  36,  36,  36,  36,
-     70,  36,  43,  43,  43,  43,  71,  44,  36,  36,  61,  81,  43,  43,  43,  44,
-      7,   7,   7,   7,   7,  44,  36,  36,  77,  67,   2,   2,   2,   2,   2,   2,
-      2,  95,  95,  67,  43,  67,  67,  67,   7,   7,   7,   7,   7,  27,  27,  27,
-     27,  27,  50,  50,  50,   4,   4,  84,  36,  36,  36,  36,  62,  36,  36,  36,
-     36,  36,  36,  36,  36,  36,  61,  44,  57,  43,  43,  43,  43,  43,  43,  83,
-     43,  43,  60,  43,  36,  36,  70,  43,  43,  43,  43,  43,  57,  43,  43,  43,
-     43,  43,  43,  43,  43,  43,  80,  67,  67,  67,  67,  76,  67,  67,  90,  67,
-      2,   2,  95,  67,  21,  64,  44,  44,  36,  36,  36,  36,  36,  92,  85,  43,
-     83,  43,  43,  43,  85,  83,  85,  71,   7,   7,   7,   7,   7,   2,   2,   2,
-     36,  36,  36,  84,  43,  36,  36,  43,  71,  84,  96,  92,  84,  84,  84,  36,
-     70,  43,  71,  36,  36,  36,  36,  36,  36,  83,  85,  83,  84,  84,  85,  92,
-      7,   7,   7,   7,   7,  84,  85,  67,  11,  11,  11,  48,  44,  44,  48,  44,
-     16,  16,  16,  16,  16,  53,  45,  16,  36,  36,  36,  36,  61,  36,  36,  44,
-     36,  36,  36,  61,  61,  36,  36,  44,  61,  36,  36,  44,  36,  36,  36,  61,
-     61,  36,  36,  44,  36,  36,  36,  36,  36,  36,  36,  61,  36,  36,  36,  36,
-     36,  36,  36,  36,  36,  61,  57,  43,   2,   2,   2,   2,  97,  27,  27,  27,
-     27,  27,  27,  27,  27,  27,  98,  44,  67,  67,  67,  67,  67,  44,  44,  44,
-     11,  11,  11,  44,  16,  16,  16,  44,  99,  36,  36,  36,  36,  36,  36,  36,
-     36,  36,  36,  36,  36,  36,  77,  72, 100,  36,  36,  36,  36,  36,  36,  36,
-     36,  36,  36,  36,  36, 101, 102,  44,  36,  36,  36,  36,  36,  63,   2, 103,
-    104,  36,  36,  36,  61,  44,  44,  44,  36,  36,  36,  36,  36,  36,  61,  36,
-     36,  43,  80,  44,  44,  44,  44,  44,  36,  43,  60,  64,  44,  44,  44,  44,
-     36,  43,  44,  44,  44,  44,  44,  44,  61,  43,  44,  44,  44,  44,  44,  44,
-     36,  36,  43,  85,  43,  43,  43,  84,  84,  84,  84,  83,  85,  43,  43,  43,
-     43,  43,   2,  86,   2,  66,  70,  44,   7,   7,   7,   7,   7,  44,  44,  44,
-     27,  27,  27,  27,  27,  44,  44,  44,   2,   2,   2, 105,   2,  59,  43,  68,
-     36, 106,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  61,  44,  44,  44,
-     36,  36,  70,  71,  36,  36,  36,  36,  36,  36,  36,  36,  70,  61,  44,  44,
-     36,  36,  36,  44,  44,  44,  44,  44,  36,  36,  36,  36,  36,  36,  36,  61,
-     43,  83,  84,  85,  83,  84,  44,  44,  84,  83,  84,  84,  85,  43,  44,  44,
-     90,  44,   2,   7,   7,   7,   7,   7,  36,  36,  36,  36,  36,  36,  36,  44,
-     36,  36,  61,  44,  44,  44,  44,  44,  36,  36,  36,  36,  36,  36,  44,  44,
-     36,  36,  36,  36,  36,  44,  44,  44,   7,   7,   7,   7,   7,  98,  44,  67,
-     67,  67,  67,  67,  67,  67,  67,  67,  36,  36,  36,  70,  83,  85,  44,   2,
-     36,  36,  92,  83,  43,  43,  43,  80,  83,  83,  85,  43,  43,  43,  83,  84,
-     84,  85,  43,  43,  43,  43,  80,  57,   2,   2,   2,  86,   2,   2,   2,  44,
-     43,  43,  43,  43,  43,  43,  43, 107,  43,  43,  96,  36,  36,  36,  36,  36,
-     36,  36,  83,  43,  43,  83,  83,  84,  84,  83,  96,  36,  36,  36,  44,  44,
-     95,  67,  67,  67,  67,  50,  43,  43,  43,  43,  67,  67,  67,  67,  90,  44,
-     43,  96,  36,  36,  36,  36,  36,  36,  92,  43,  43,  84,  43,  85,  43,  36,
-     36,  36,  36,  83,  43,  84,  85,  85,  43,  84,  44,  44,  44,  44,   2,   2,
-     36,  36,  84,  84,  84,  84,  43,  43,  43,  43,  84,  43,  44,  91,   2,   2,
-      7,   7,   7,   7,   7,  44,  62,  36,  36,  36,  36,  36,  40,  40,  40,   2,
-     16,  16,  16,  16, 108,  44,  44,  44,  11,  11,  11,  11,  11,  47,  48,  11,
-      2,   2,   2,   2,  44,  44,  44,  44,  43,  60,  43,  43,  43,  43,  43,  43,
-     83,  43,  43,  43,  71,  36,  70,  36,  36,  36,  71,  92,  43,  61,  44,  44,
-     16,  16,  16,  16,  16,  16,  40,  40,  40,  40,  40,  40,  40,  45,  16,  16,
-     16,  16,  16,  16,  45,  16,  16,  16,  16,  16,  16,  16,  16, 109,  40,  40,
-     43,  43,  43,  43,  43,  57,  43,  43,  32,  32,  32,  16,  16,  16,  16,  32,
-     16,  16,  16,  16,  11,  11,  11,  11,  16,  16,  16,  44,  11,  11,  11,  44,
-     16,  16,  16,  16,  48,  48,  48,  48,  16,  16,  16,  16,  16,  16,  16,  44,
-     16,  16,  16,  16, 110, 110, 110, 110,  16,  16, 108,  16,  11,  11, 111, 112,
-     41,  16, 108,  16,  11,  11, 111,  41,  16,  16,  44,  16,  11,  11, 113,  41,
-     16,  16,  16,  16,  11,  11, 114,  41,  44,  16, 108,  16,  11,  11, 111, 115,
-    116, 116, 116, 116, 116, 117,  65,  65, 118, 118, 118,   2, 119, 120, 119, 120,
-      2,   2,   2,   2, 121,  65,  65, 122,   2,   2,   2,   2, 123, 124,   2, 125,
-    126,   2, 127, 128,   2,   2,   2,   2,   2,   9, 126,   2,   2,   2,   2, 129,
-     65,  65,  68,  65,  65,  65,  65,  65, 130,  44,  27,  27,  27,   8, 127, 131,
-     27,  27,  27,  27,  27,   8, 127, 102,  40,  40,  40,  40,  40,  40,  81,  44,
-     20,  20,  20,  20,  20,  20,  20,  20,  43,  43,  43,  43,  43,  43, 132,  51,
-    133,  51, 133,  43,  43,  43,  43,  43,  80,  44,  44,  44,  44,  44,  44,  44,
-     67, 134,  67, 135,  67,  34,  11,  16,  11,  32, 135,  67,  49,  11,  11,  67,
-     67,  67, 134, 134, 134,  11,  11, 136,  11,  11,  35,  36,  39,  67,  16,  11,
-      8,   8,  49,  16,  16,  26,  67, 137,  27,  27,  27,  27,  27,  27,  27,  27,
-    103, 103, 103, 103, 103, 103, 103, 103, 103, 138, 139, 103, 140,  67,  44,  44,
-      8,   8, 141,  67,  67,   8,  67,  67, 141,  26,  67, 141,  67,  67,  67, 141,
-     67,  67,  67,  67,  67,  67,  67,   8,  67, 141, 141,  67,  67,  67,  67,  67,
-     67,  67,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,
-     67,  67,  67,  67,   4,   4,  67,  67,   8,  67,  67,  67, 142, 143,  67,  67,
-     67,  67,  67,  67,  67,  67, 141,  67,  67,  67,  67,  67,  67,  26,   8,   8,
-      8,   8,  67,  67,  67,  67,  67,  67,  67,  67,  67,  67,  67,  67,   8,   8,
-      8,  67,  67,  67,  67,  67,  67,  67,  67,  67,  67,  90,  44,  44,  44,  44,
-     67,  67,  67,  67,  67,  90,  44,  44,  27,  27,  27,  27,  27,  27,  67,  67,
-     67,  67,  67,  67,  67,  27,  27,  27,  67,  67,  67,  26,  67,  67,  67,  67,
-     26,  67,  67,  67,  67,  67,  67,  67,  67,  67,  67,  67,   8,   8,   8,   8,
-     67,  67,  67,  67,  67,  67,  67,  26,  67,  67,  67,  67,   4,   4,   4,   4,
-      4,   4,   4,  27,  27,  27,  27,  27,  27,  27,  67,  67,  67,  67,  67,  67,
-      8,   8, 127, 144,   8,   8,   8,   8,   8,   8,   8,   4,   4,   4,   4,   4,
-      8, 127, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 144,   8,   8,   8,
-      8,   8,   8,   8,   4,   4,   8,   8,   8,   8,   8,   8,   8,   8,   4,   8,
-      8,   8, 141,  26,   8,   8, 141,  67,  67,  67,  44,  67,  67,  67,  67,  67,
-     67,  67,  67,  44,  67,  67,  67,  67,  11,  11,  11,  11,  11,  11,  11,  47,
-     16,  16,  16,  16,  16,  16,  16, 108,  32,  11,  32,  34,  34,  34,  34,  11,
-     32,  32,  34,  16,  16,  16,  40,  11,  32,  32, 137,  67,  67, 135,  34, 146,
-     43,  32,  44,  44,  91,   2,  97,   2,  16,  16,  16, 147,  44,  44, 147,  44,
-     36,  36,  36,  36,  44,  44,  44,  52,  64,  44,  44,  44,  44,  44,  44,  57,
-     36,  36,  36,  61,  44,  44,  44,  44,  36,  36,  36,  61,  36,  36,  36,  61,
-      2, 119, 119,   2, 123, 124, 119,   2,   2,   2,   2,   6,   2, 105, 119,   2,
-    119,   4,   4,   4,   4,   2,   2,  86,   2,   2,   2,   2,   2, 118,   2,   2,
-    105, 148,   2,   2,   2,   2,   2,   2,  67,  67,  67,  67,  67,  55,  67,  67,
-     67,  67,  44,  44,  44,  44,  44,  44,  67,  67,  67,  44,  44,  44,  44,  44,
-     67,  67,  67,  67,  67,  67,  44,  44,   1,   2, 149, 150,   4,   4,   4,   4,
-      4,  67,   4,   4,   4,   4, 151, 152, 153, 103, 103, 103, 103,  43,  43,  84,
-    154,  40,  40,  67, 103, 155,  63,  67,  36,  36,  36,  61,  57, 156, 157,  69,
-     36,  36,  36,  36,  36,  63,  40,  69,  44,  44,  62,  36,  36,  36,  36,  36,
-     67,  27,  27,  67,  67,  67,  67,  67,  67,  67,  67,  67,  67,  67,  67,  90,
-     27,  27,  27,  27,  27,  67,  67,  67,  67,  67,  67,  67,  27,  27,  27,  27,
-    158,  27,  27,  27,  27,  27,  27,  27,  36,  36, 106,  36,  36,  36,  36,  36,
-     36,  36,  36,  36,  36,  36, 159,   2,   7,   7,   7,   7,   7,  36,  44,  44,
-     32,  32,  32,  32,  32,  32,  32,  70,  51, 160,  43,  43,  43,  43,  43,  86,
-     32,  32,  32,  32,  32,  32,  40,  43,  36,  36,  36, 103, 103, 103, 103, 103,
-     43,   2,   2,   2,  44,  44,  44,  44,  41,  41,  41, 157,  40,  40,  40,  40,
-     41,  32,  32,  32,  32,  32,  32,  32,  16,  32,  32,  32,  32,  32,  32,  32,
-     45,  16,  16,  16,  34,  34,  34,  32,  32,  32,  32,  32,  42, 161,  34,  35,
-     32,  32,  16,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  11,  11,  32,
-     11,  11,  32,  32,  32,  32,  32,  32,  44,  32,  11,  47,  44,  44,  44,  44,
-     44,  44,  44,  62,  40,  35,  36,  36,  36,  71,  36,  71,  36,  70,  36,  36,
-     36,  92,  85,  83,  67,  67,  44,  44,  27,  27,  27,  67, 162,  44,  44,  44,
-     36,  36,   2,   2,  44,  44,  44,  44,  84,  36,  36,  36,  36,  36,  36,  36,
-     36,  36,  84,  84,  84,  84,  84,  84,  84,  84,  43,  44,  44,  44,  44,   2,
-     43,  36,  36,  36,   2,  72,  72,  70,  36,  36,  36,  43,  43,  43,  43,   2,
-     36,  36,  36,  70,  43,  43,  43,  43,  43,  84,  44,  44,  44,  44,  44,  91,
-     36,  70,  84,  43,  43,  84,  43,  84, 163,   2,   2,   2,   2,   2,   2,  52,
-      7,   7,   7,   7,   7,  44,  44,   2,  36,  36,  70,  69,  36,  36,  36,  36,
-      7,   7,   7,   7,   7,  36,  36,  61,  36,  36,  36,  36,  70,  43,  43,  83,
-     85,  83,  85,  80,  44,  44,  44,  44,  36,  70,  36,  36,  36,  36,  83,  44,
-      7,   7,   7,   7,   7,  44,   2,   2,  69,  36,  36,  77,  67,  92,  83,  36,
-     71,  43,  71,  70,  71,  36,  36,  43,  70,  61,  44,  44,  44,  44,  44,  44,
-     44,  44,  44,  44,  44,  62, 106,   2,  36,  36,  36,  36,  36,  92,  43,  84,
-      2, 106, 164,  80,  44,  44,  44,  44,  62,  36,  36,  61,  62,  36,  36,  61,
-     62,  36,  36,  61,  44,  44,  44,  44,  16,  16,  16,  16,  16, 112,  40,  40,
-     16,  16,  16,  16,  44,  44,  44,  44,  36,  92,  85,  84,  83, 163,  85,  44,
-     36,  36,  44,  44,  44,  44,  44,  44,  36,  36,  36,  61,  44,  62,  36,  36,
-    165, 165, 165, 165, 165, 165, 165, 165, 166, 166, 166, 166, 166, 166, 166, 166,
-     16,  16,  16, 108,  44,  44,  44,  44,  44, 147,  16,  16,  44,  44,  62,  71,
-     36,  36,  36,  36, 167,  36,  36,  36,  36,  36,  36,  61,  36,  36,  61,  61,
-     36,  62,  61,  36,  36,  36,  36,  36,  36,  41,  41,  41,  41,  41,  41,  41,
-     41,  44,  44,  44,  44,  44,  44,  44,  44,  62,  36,  36,  36,  36,  36,  36,
-     36,  36,  36,  36,  36,  36,  36, 145,  44,  36,  36,  36,  36,  36,  36,  36,
-     36,  36,  36,  36,  44,  44,  44,  44,  36,  36,  36,  36,  36,  36, 162,  44,
-      2,   2,   2, 168, 128,  44,  44,  44,   6, 169, 170, 145, 145, 145, 145, 145,
-    145, 145, 128, 168, 128,   2, 125, 171,   2,  64,   2,   2, 151, 145, 145, 128,
-      2, 172,   8, 173,  66,   2,  44,  44,  36,  36,  61,  36,  36,  36,  36,  36,
-     36,  36,  36,  36,  36,  36,  61,  79,  91,   2,   3,   2,   4,   5,   6,   2,
-     16,  16,  16,  16,  16,  17,  18, 127, 128,   4,   2,  36,  36,  36,  36,  36,
-     69,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  40,
-     44,  36,  36,  36,  44,  36,  36,  36,  44,  36,  36,  36,  44,  36,  61,  44,
-     20, 174,  56, 175,  26,   8, 141,  90,  44,  44,  44,  44,  79,  65,  67,  44,
-     36,  36,  36,  36,  36,  36,  62,  36,  36,  36,  36,  36,  36,  61,  36,  62,
-      2,  64,  44, 176,  27,  27,  27,  27,  27,  27,  44,  55,  67,  67,  67,  67,
-    103, 103, 140,  27,  89,  67,  67,  67,  67,  67,  67,  67,  67,  27,  67,  90,
-     90,  44,  44,  44,  44,  44,  44,  44,  67,  67,  67,  67,  67,  67,  50,  44,
-    177,  27,  27,  27,  27,  27,  27,  27,  27,  27,  27,  27,  27,  27,  44,  44,
-     27,  27,  44,  44,  44,  44,  62,  36, 150,  36,  36,  36,  36, 178,  44,  44,
-     36,  36,  36,  43,  43,  80,  44,  44,  36,  36,  36,  36,  36,  36,  36,  91,
-     36,  36,  44,  44,  36,  36,  36,  36, 179, 103, 103,  44,  44,  44,  44,  44,
-     11,  11,  11,  11,  16,  16,  16,  16,  11,  11,  44,  44,  16,  16,  16,  16,
-     16,  16,  16,  16,  16,  16,  44,  44,  36,  36,  44,  44,  44,  44,  44,  91,
-     36,  36,  36,  44,  61,  36,  36,  36,  36,  36,  36,  62,  61,  44,  61,  62,
-     36,  36,  36,  91,  27,  27,  27,  27,  36,  36,  36,  77, 158,  27,  27,  27,
-     44,  44,  44, 176,  27,  27,  27,  27,  36,  61,  36,  44,  44, 176,  27,  27,
-     36,  36,  36,  27,  27,  27,  44,  91,  36,  36,  36,  36,  36,  44,  44,  91,
-     36,  36,  36,  36,  44,  44,  27,  36,  44,  27,  27,  27,  27,  27,  27,  27,
-     70,  43,  57,  80,  44,  44,  43,  43,  36,  36,  62,  36,  62,  36,  36,  36,
-     36,  36,  36,  44,  43,  80,  44,  57,  27,  27,  27,  27,  98,  44,  44,  44,
-      2,   2,   2,   2,  64,  44,  44,  44,  36,  36,  36,  36,  36,  36, 180,  30,
-     36,  36,  36,  36,  36,  36, 180,  27,  36,  36,  36,  36,  78,  36,  36,  36,
-     36,  36,  70,  80,  44, 176,  27,  27,   2,   2,   2,  64,  44,  44,  44,  44,
-     36,  36,  36,  44,  91,   2,   2,   2,  36,  36,  36,  44,  27,  27,  27,  27,
-     36,  61,  44,  44,  27,  27,  27,  27,  36,  44,  44,  44,  91,   2,  64,  44,
-     44,  44,  44,  44, 176,  27,  27,  27,  11,  47,  44,  44,  44,  44,  44,  44,
-     16, 108,  44,  44,  44,  27,  27,  27,  36,  36,  43,  43,  44,  44,  44,  44,
-     27,  27,  27,  27,  27,  27,  27,  98,  27,  27,  27,  93,  44,  44,  44,  44,
-    177,  27,  30,   2,   2,  44,  44,  44,  85,  96,  36,  36,  36,  36,  36,  36,
-     36,  36,  36,  36,  43,  43,  43,  43,  43,  43,  43,  60,   2,   2,   2,  44,
-     27,  27,  27,   7,   7,   7,   7,   7,  44,  44,  44,  44,  44,  44,  44,  57,
-     84,  85,  43,  83,  85,  60, 181,   2,   2,  44,  44,  44,  44,  44,  79,  44,
-     43,  71,  36,  36,  36,  36,  36,  36,  36,  36,  36,  70,  43,  43,  85,  43,
-     43,  43,  80,   7,   7,   7,   7,   7,   2,   2,  92,  88,  44,  44,  44,  44,
-     36,  70,   2,  61,  44,  44,  44,  44,  36,  92,  84,  43,  43,  43,  43,  83,
-     96,  36,  63,   2,  59,  43,  60,  44,   7,   7,   7,   7,   7,  63,  63,   2,
-    176,  27,  27,  27,  27,  27,  27,  27,  27,  27,  98,  44,  44,  44,  44,  44,
-     36,  36,  36,  36,  36,  36,  84,  85,  43,  84,  83,  43,   2,   2,   2,  80,
-     36,  36,  36,  61,  61,  36,  36,  62,  36,  36,  36,  36,  36,  36,  36,  62,
-     36,  36,  36,  36,  63,  44,  44,  44,  36,  36,  36,  36,  36,  36,  36,  70,
-     84,  85,  43,  43,  43,  80,  44,  44,  43,  84,  62,  36,  36,  36,  61,  62,
-     61,  36,  62,  36,  36,  57,  71,  84,  83,  84,  88,  87,  88,  87,  84,  44,
-     61,  44,  44,  87,  44,  44,  62,  36,  36,  84,  44,  43,  43,  43,  80,  44,
-     43,  43,  80,  44,  44,  44,  44,  44,  36,  36,  92,  84,  43,  43,  43,  43,
-     84,  43,  83,  71,  36,  63,   2,   2,   7,   7,   7,   7,   7,  91,  91,  71,
-     84,  85,  43,  43,  83,  83,  84,  85,  83,  43,  36,  72,  44,  44,  44,  44,
-     36,  36,  36,  36,  36,  36,  36,  92,  84,  43,  43,  44,  84,  84,  43,  85,
-     60,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,  36,  36,  43,  44,
-     84,  85,  43,  43,  43,  83,  85,  85,  60,   2,  61,  44,  44,  44,  44,  44,
-      2,   2,   2,   2,   2,   2,  64,  44,  36,  36,  36,  36,  36,  70,  85,  84,
-     43,  43,  43,  85,  61,  44,  44,  44,  84,  43,  43,  85,  43,  43,  44,  44,
-      7,   7,   7,   7,   7,  27,   2,  95,  43,  43,  43,  43,  85,  60,  44,  44,
-     27,  98,  44,  44,  44,  44,  44,  62,  36,  36,  36,  36,  44,  36,  36,  36,
-     92,  84,  43,  43,  44,  43,  84,  84,  71,  72,  88,  44,  44,  44,  44,  44,
-     70,  43,  43,  43,  43,  71,  36,  36,  36,  70,  43,  43,  83,  70,  43,  60,
-      2,   2,   2,  59,  44,  44,  44,  44,  70,  43,  43,  83,  85,  43,  36,  36,
-     36,  36,  36,  36,  36,  43,  43,  43,  43,  43,  43,  83,  43,   2,  72,   2,
-      2,  64,  44,  44,  44,  44,  44,  44,  43,  43,  43,  80,  43,  43,  43,  85,
-     63,   2,   2,  44,  44,  44,  44,  44,   2,  36,  36,  36,  36,  36,  36,  36,
-     44,  43,  43,  43,  43,  43,  43,  43,  43,  43,  43,  43,  87,  43,  43,  43,
-     83,  43,  85,  80,  44,  44,  44,  44,  36,  36,  36,  61,  36,  62,  36,  36,
-     70,  43,  43,  80,  44,  80,  43,  57,  43,  43,  43,  70,  44,  44,  44,  44,
-     36,  36,  36,  62,  61,  36,  36,  36,  36,  36,  36,  36,  36,  84,  84,  88,
-     43,  87,  85,  85,  61,  44,  44,  44,  36,  70,  83, 163,  64,  44,  44,  44,
-     27,  27,  89,  67,  67,  67,  56,  20, 162,  67,  67,  67,  67,  67,  67,  67,
-     67,  44,  44,  44,  44,  44,  44,  91, 103, 103, 103, 103, 103, 103, 103, 178,
-      2,   2,  64,  44,  44,  44,  44,  44,  65,  65,  65,  65,  68,  44,  44,  44,
-     43,  43,  60,  44,  44,  44,  44,  44,  43,  43,  43,  60,   2,   2,  67,  67,
-     40,  40,  95,  44,  44,  44,  44,  44,   7,   7,   7,   7,   7, 176,  27,  27,
-     27,  62,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  44,  44,  62,  36,
-     27,  27,  27,  30,   2,  64,  44,  44,  36,  36,  36,  36,  36,  61,  44,  57,
-     92,  84,  84,  84,  84,  84,  84,  84,  84,  84,  84,  84,  84,  84,  84,  84,
-     84,  84,  84,  84,  44,  44,  44,  57,  43,  74,  40,  40,  40,  40,  40,  40,
-     40,  86,  44,  44,  44,  44,  44,  44,  36,  61,  44,  44,  44,  44,  44,  44,
-     44,  44,  36,  36,  44,  44,  44,  44,  36,  36,  36,  36,  36,  44,  50,  60,
-     65,  65,  44,  44,  44,  44,  44,  44,  67,  67,  67,  90,  55,  67,  67,  67,
-     67,  67, 182,  85,  43,  67, 182,  84,  84, 183,  65,  65,  65,  82,  43,  43,
-     43,  76,  50,  43,  43,  43,  67,  67,  67,  67,  67,  67,  67,  43,  43,  67,
-     67,  67,  67,  67,  90,  44,  44,  44,  67,  43,  76,  44,  44,  44,  44,  44,
-     27,  27,  44,  44,  44,  44,  44,  44,  11,  11,  11,  11,  11,  16,  16,  16,
-     16,  16,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  16,
-     16,  16, 108,  16,  16,  16,  16,  16,  11,  16,  16,  16,  16,  16,  16,  16,
-     16,  16,  16,  16,  16,  16,  47,  11,  44,  47,  48,  47,  48,  11,  47,  11,
-     11,  11,  11,  16,  16, 147, 147,  16,  16,  16, 147,  16,  16,  16,  16,  16,
-     16,  16,  11,  48,  11,  47,  48,  11,  11,  11,  47,  11,  11,  11,  47,  16,
-     16,  16,  16,  16,  11,  48,  11,  47,  11,  11,  47,  47,  44,  11,  11,  11,
-     47,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  11,  11,
-     11,  11,  11,  16,  16,  16,  16,  16,  16,  16,  16,  44,  11,  11,  11,  11,
-     31,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  33,  16,  16,
-     16,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  31,  16,  16,
-     16,  16,  33,  16,  16,  16,  11,  11,  11,  11,  31,  16,  16,  16,  16,  16,
-     16,  16,  16,  16,  16,  16,  16,  33,  16,  16,  16,  11,  11,  11,  11,  11,
-     11,  11,  11,  11,  11,  11,  11,  31,  16,  16,  16,  16,  33,  16,  16,  16,
-     11,  11,  11,  11,  31,  16,  16,  16,  16,  33,  16,  16,  16,  32,  44,   7,
-      7,   7,   7,   7,   7,   7,   7,   7,  43,  43,  43,  76,  67,  50,  43,  43,
-     43,  43,  43,  43,  43,  43,  76,  67,  67,  67,  50,  67,  67,  67,  67,  67,
-     67,  67,  76,  21,   2,   2,  44,  44,  44,  44,  44,  44,  44,  57,  43,  43,
-     43,  43,  43,  80,  43,  43,  43,  43,  43,  43,  43,  43,  80,  57,  43,  43,
-     43,  57,  80,  43,  43,  80,  44,  44,  43,  43,  43,  74,  40,  40,  40,  44,
-      7,   7,   7,   7,   7,  44,  44,  77,  36,  36,  36,  36,  36,  36,  43,  43,
-      7,   7,   7,   7,   7,  44,  44,  94,  36,  36,  61, 176,  27,  27,  27,  27,
-     43,  43,  43,  80,  44,  44,  44,  44,  16,  16,  43,  43,  43,  74,  44,  44,
-     27,  27,  27,  27,  27,  27, 158,  27, 184,  27,  98,  44,  44,  44,  44,  44,
-     27,  27,  27,  27,  27,  27,  27, 158,  27,  27,  27,  27,  27,  27,  27,  44,
-     36,  36,  62,  36,  36,  36,  36,  36,  62,  61,  61,  62,  62,  36,  36,  36,
-     36,  61,  36,  36,  62,  62,  44,  44,  44,  61,  44,  62,  62,  62,  62,  36,
-     62,  61,  61,  62,  62,  62,  62,  62,  62,  61,  61,  62,  36,  61,  36,  36,
-     36,  61,  36,  36,  62,  36,  61,  61,  36,  36,  36,  36,  36,  62,  36,  36,
-     62,  36,  62,  36,  36,  62,  36,  36,   8,  44,  44,  44,  44,  44,  44,  44,
-     55,  67,  67,  67,  67,  67,  67,  67,  67,  67,  67,  67,  67,  67,  90,  44,
-     44,  44,  44,  67,  67,  67,  67,  67,  67,  90,  44,  44,  44,  44,  44,  44,
-     67,  44,  44,  44,  44,  44,  44,  44,  67,  67,  67,  67,  67,  25,  41,  41,
-     67,  67,  67,  67,  44,  44,  44,  44,  67,  67,  67,  67,  67,  67,  67,  44,
-     67,  67,  67,  67,  67,  67,  55,  67,  67,  55,  67,  90,  44,  67,  67,  67,
-     67,  90,  55,  67,  67,  90,  44,  67,  67,  67,  67,  67,  67,  90,  55,  67,
-     67,  67,  44,  44,  67,  90,  44,  44,  36,  44,  44,  44,  44,  44,  44,  44,
-     79,  44,  44,  44,  44,  44,  44,  44,  65,  65,  65,  65,  65,  65,  65,  65,
-    166, 166, 166, 166, 166, 166, 166,  44,
+static RE_UINT8 re_alphabetic_table_3[] = {
+      0,   0,   0,   0, 254, 255, 255,   7,   0,   4,  32,   4, 255, 255, 127, 255,
+    255, 255, 255, 255, 195, 255,   3,   0,  31,  80,   0,   0,  32,   0,   0,   0,
+      0,   0, 223, 188,  64, 215, 255, 255, 251, 255, 255, 255, 255, 255, 191, 255,
+      3, 252, 255, 255, 255, 255, 254, 255, 255, 255, 127,   2, 255,   1,   0,   0,
+      0,   0, 255, 191, 182,   0, 255, 255, 255, 135,   7,   0,   0,   0, 255,   7,
+    255, 255, 255, 254,   0, 192, 255, 255, 255, 255, 239,  31, 254, 225,   0, 156,
+      0,   0, 255, 255,   0, 224, 255, 255, 255, 255,   3,   0,   0, 252, 255, 255,
+    255,   7,  48,   4, 255, 255, 255, 252, 255,  31,   0,   0, 255, 255, 255,   1,
+    255,   7,   0,   0, 255, 255, 223, 255, 255,   0, 240, 255, 248,   3, 255, 255,
+    255, 255, 255, 239, 255, 223, 225, 255,  15,   0, 254, 255, 239, 159, 249, 255,
+    255, 253, 197, 227, 159,  89, 128, 176,  15,   0,   3,  16, 238, 135, 249, 255,
+    255, 253, 109, 195, 135,  25,   2,  94,   0,   0,  63,   0, 238, 191, 251, 255,
+    255, 253, 237, 227, 191,  27,   1,   0,  15,   0,   0,  30, 238, 159, 249, 255,
+    159,  25, 192, 176,  15,   0,   2,   0, 236, 199,  61, 214,  24, 199, 255, 195,
+    199,  29, 129,   0, 239, 223, 253, 255, 255, 253, 255, 227, 223,  29,  96,   7,
+     15,   0,   0,   0, 255, 253, 239, 227, 223,  29,  96,  64,  15,   0,   6,   0,
+    255, 223, 253, 255, 255, 255, 255, 231, 223,  93, 240, 128,  15,   0,   0, 252,
+    238, 255, 127, 252, 255, 255, 251,  47, 127, 128,  95, 255,   0,   0,  12,   0,
+    254, 255, 255, 255, 255, 255, 255,   7, 127,  32,   0,   0, 214, 247, 255, 255,
+    175, 255, 255,  59,  95,  32,   0, 240,   1,   0,   0,   0, 255, 254, 255, 255,
+    255,  31, 254, 255,   3, 255, 255, 254, 255, 255, 255,  31, 255, 255, 127, 249,
+    255, 255,   0,  60, 191,  32, 255, 255, 255, 255, 255, 247, 255,  61, 127,  61,
+    255,  61, 255, 255, 255, 255,  61, 127,  61, 255, 127, 255, 255, 255,  61, 255,
+    255, 255,   0,   0, 255, 255,  63,  63, 255, 159, 255, 255, 255, 199, 255,   1,
+    255, 223,  15,   0, 255, 255,  15,   0, 255, 223,  13,   0, 255, 255, 207, 255,
+    255,   1, 128,  16, 255,   7, 255, 255, 255, 255,  63,   0, 255, 255, 255, 127,
+    255,  15, 255,   1, 255,  63,  31,   0, 255,  15, 255, 255, 255,   3,   0,   0,
+    255, 255, 255,  15, 254, 255,  31,   0, 128,   0,   0, 128, 255, 255, 239, 255,
+    239,  15,   0,   0, 255, 243,   0, 252, 191, 255,   3,   0, 255, 255, 127,   0,
+      0, 224,   0, 252, 255, 255, 255,  63, 255,   1, 255, 255,   0, 222, 111,   4,
+    128, 255,  31,   0,  63,  63, 255, 170, 255, 255, 223,  95, 220,  31, 207,  15,
+    255,  31, 220,  31,   0,   0,   2, 128,   0,   0, 255,  31, 132, 252,  47,  62,
+     80, 189, 255, 243, 224,  67,   0,   0,   0,   0, 192, 255, 255, 127, 255, 255,
+     31, 120,  12,   0, 255, 128,   0,   0, 127, 127, 127, 127,   0, 128,   0,   0,
+    224,   0,   0,   0, 254,   3,  62,  31, 255, 255, 127, 224, 224, 255, 255, 255,
+    255, 127,   0,   0, 255,  31, 255, 255,   0,  12,   0,   0, 255, 127, 240, 143,
+      0,   0, 128, 255, 252, 255, 255, 255, 255, 249, 255, 255, 252,   7,   0,   0,
+      0,   0, 224, 255, 191, 255, 255, 255, 255,   0,   0,   0,  47,   0,   0,   0,
+      0,   0, 252, 232, 255, 255,   7,   0, 255, 255, 247, 255, 255, 255,   0, 124,
+    255,  63,   0,   0, 255, 255, 127, 252,   5,   0,   0,  56, 255, 255,  60,   0,
+    126, 126, 126,   0, 127, 127, 255, 255, 255,   3, 255, 255,  15,   0, 255, 255,
+    127, 248, 255, 255, 255,  63, 255, 255, 255, 255, 255,   3, 127,   0, 248, 224,
+    255, 253, 127,  95, 219, 255, 255, 255,   0,   0, 248, 255, 255, 255, 252, 255,
+      0,   0, 255,  15,   0,   0, 223, 255, 192, 255, 255, 255, 252, 252, 252,  28,
+    255, 239, 255, 255, 127, 255, 255, 183, 255,  63, 255,  63, 255, 255,  31,   0,
+    255, 255,   1,   0,  15, 255,  62,   0, 255, 255,  15, 255, 255,   0, 255, 255,
+     63, 253, 255, 255, 255, 255, 191, 145, 255, 255,  55,   0, 255, 255, 255, 192,
+    111, 240, 239, 254,  31,   0,   0,   0, 255,  27,   3,   0, 128,   0, 255, 255,
+     63,   0,   0,   0, 240,   0, 255, 255, 255, 255,  71,   0,  30, 192,   0,  20,
+    255, 255, 251, 255, 255, 255, 159,  64, 127, 189, 255, 191, 159,  25, 129, 224,
+    187,   7,   0, 128,   3,   0,   0,   0, 179,   0,   0,   0, 255, 255,  63, 127,
+      0,   0,   0,  63,  17,   0,   0,   0, 255, 255,  63,   1,   0,   0,   0, 128,
+    127, 242, 111, 255, 255, 255, 191, 153,   7,   0,   0,   0, 255, 252, 255, 255,
+     26,   0,   0,   0, 255, 255, 231, 127, 255, 255, 255,  32, 255, 253, 255, 255,
+    255, 255, 127, 127,   0,   0, 252, 255, 255, 254, 127,   0, 127, 251, 255, 255,
+    255, 255, 127, 180, 203,   0,   0,   0, 191, 253, 255, 255, 255, 127, 123,   1,
+      0,   0,   1,   0, 127,   0,   0,   0, 248, 255, 255, 224, 255, 135, 255, 255,
+    255, 128, 255, 255,  11,   0,   3,   0, 255, 255, 255,   0,   0,   0,   7,   0,
+    255,   7, 255,  31, 255,   1, 255,  67, 255, 255, 255, 223, 100, 222, 255, 235,
+    239, 255, 255, 255, 191, 231, 223, 223, 255, 255, 255, 123,  95, 252, 253, 255,
+     63, 255, 255, 255, 253, 255, 255, 247, 247,  15,   0,   0, 127, 255, 255, 249,
+    219,   7,   0,   0, 255,  31, 128,  63,   0,  64,   0,   0, 255,  15,   0,   0,
+    143,   8,   0,   0, 150, 254, 247,  10, 132, 234, 150, 170, 150, 247, 247,  94,
+    255, 251, 255,  15, 238, 251, 255,  15,   3,   0, 255, 255
 };
 
-static RE_UINT8 re_general_category_stage_4[] = {
-    15, 15, 12, 23, 23, 23, 25, 23, 20, 21, 23, 24, 23, 19,  9,  9,
-    24, 24, 24, 23, 23,  1,  1,  1,  1, 20, 23, 21, 26, 22, 26,  2,
-     2,  2,  2, 20, 24, 21, 24, 15, 25, 25, 27, 23, 26, 27,  5, 28,
-    24, 16, 27, 26, 27, 24, 11, 11, 26, 11,  5, 29, 11, 23,  1, 24,
-     1,  2,  2, 24,  2,  1,  2,  5,  5,  5,  1,  3,  3,  2,  5,  2,
-     4,  4, 26, 26,  4, 26,  6,  6,  0,  0,  4,  2,  1, 23,  1,  0,
-     0,  1, 24,  1, 27,  6,  7,  7,  0,  4,  2, 23, 19,  0,  0, 27,
-    27, 25,  0,  6, 19,  6, 23,  6,  6, 23,  5,  0,  0,  5,  5, 23,
-    23,  0, 16, 16, 23, 25, 27, 27, 16,  0,  4,  5,  5,  6,  6,  5,
-    23,  5,  6, 16,  6,  4,  4,  6,  6, 27,  5, 27, 27,  5,  0, 16,
-     6,  0,  4,  0, 16,  6,  6,  8,  8,  8,  8,  6, 23,  4,  0,  8,
-     8,  0, 11, 27, 27,  0,  0, 23,  5,  8, 11,  5,  0, 25, 23, 27,
-     8,  5, 23, 11, 11,  0, 19,  5, 12,  5,  5, 20, 21,  0, 10, 10,
-    10,  5, 19, 23,  5,  4,  7,  0,  2,  0,  2,  4,  3,  3,  3, 26,
-     2, 26,  0, 26,  1, 26, 26,  0, 12, 12, 12, 16, 19, 19, 28, 29,
-    20, 28, 13, 14, 16, 12, 23, 28, 29, 23, 23, 22, 22, 23, 24, 20,
-    21, 23, 23, 12, 11,  4, 21,  4,  6,  7,  7,  6,  1, 27, 27,  1,
-    27,  2,  2, 27, 10,  1,  2, 10, 10, 11, 24, 27, 27, 20, 21, 27,
-    21, 24, 21, 20,  2,  6,  0,  2, 20, 23, 27,  4,  5, 10, 19, 20,
-    21, 21, 27, 10, 19,  4, 10,  4,  6, 26, 26,  4, 27, 11,  4, 23,
-     7, 23, 26,  1, 25, 27,  8, 23,  4,  8, 18, 18, 17, 17,  5, 24,
-    23, 20, 19, 22, 22, 20, 22, 22, 24, 19, 24,  0, 24, 26, 25,  0,
-     0, 11,  6, 11, 10,  0, 23, 10,  5, 11, 23, 16, 27,  8,  8, 16,
-    25, 11,
-};
+RE_UINT32 re_get_alphabetic(RE_UINT32 codepoint) {
+    RE_UINT32 field_2;
+    RE_UINT32 field_1;
+    RE_UINT32 field_0;
+    RE_UINT32 offset;
+    RE_UINT32 v;
 
-/* General_Category: 13674 bytes. */
-
-RE_UINT32 re_get_general_category(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-
-    f = ch >> 9;
-    code = ch ^ (f << 9);
-    pos = (RE_UINT32)re_general_category_stage_1[f] << 5;
-    f = code >> 4;
-    code ^= f << 4;
-    pos = (RE_UINT32)re_general_category_stage_2[pos + f] << 3;
-    f = code >> 1;
-    code ^= f << 1;
-    pos = (RE_UINT32)re_general_category_stage_3[pos + f] << 1;
-    value = re_general_category_stage_4[pos + code];
-
-    return value;
-}
+    field_2 = codepoint >> 10;
+    field_1 = (codepoint >> 5) & 0x1F;
+    field_0 = (codepoint >> 3) & 0x3;
+    offset = codepoint & 0x7;
 
-/* Block. */
+    v = re_alphabetic_table_1[field_2];
+    v = re_alphabetic_table_2[(v << 5) | field_1];
+    v = re_alphabetic_table_3[(v << 2) | field_0];
 
-static RE_UINT8 re_block_stage_1[] = {
+    return (v >> offset) & 0x1;
+}
+
+/* Alphanumeric. */
+static RE_UINT8 re_alphanumeric_table_1[] = {
      0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 13, 13,
-    13, 13, 13, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-    15, 15, 15, 15, 15, 15, 15, 15, 16, 17, 18, 19, 19, 19, 19, 19,
-    19, 19, 19, 19, 19, 20, 21, 22, 23, 23, 23, 23, 23, 23, 24, 25,
-    26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 36, 37, 38, 36, 36,
-    36, 39, 36, 36, 36, 36, 36, 36, 36, 36, 40, 41, 42, 42, 42, 42,
-    42, 42, 43, 36, 36, 36, 36, 36, 36, 36, 36, 36, 44, 36, 36, 45,
-    36, 36, 36, 36, 46, 47, 48, 36, 49, 36, 50, 51, 52, 53, 54, 36,
-    55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
-    55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
-    55, 55, 55, 55, 55, 55, 55, 55, 55, 56, 57, 57, 57, 58, 59, 60,
-    60, 60, 60, 61, 62, 62, 62, 62, 62, 62, 63, 36, 36, 36, 64, 36,
-    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
-    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
-    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
-    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
-    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
-    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
-    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
-    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
-    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
-    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
-    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
-    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
-    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
-    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
-    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
-    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
-    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
-    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
-    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
-    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
-    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
-    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
-    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
-    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
-    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
-    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
-    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
-    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
-    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
-    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
-    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
-    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
-    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
-    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
-    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
-    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
-    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
-    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
-    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
-    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
-    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
-    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
-    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
-    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
-    65, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
-    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
-    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
-    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
-    66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66,
-    66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66,
-    66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66,
-    66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66,
-    67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67,
-    67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67,
-    67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67,
-    67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67,
-};
-
-static RE_UINT16 re_block_stage_2[] = {
-      0,   0,   0,   0,   1,   1,   1,   1,   2,   2,   2,   2,   3,   3,   3,   3,
-      3,   3,   4,   5,   5,   6,   7,   7,   8,   8,   8,   9,  10,  10,  10,  10,
-     11,  11,  11,  11,  11,  11,  11,  11,  12,  13,  14,  14,  15,  16,  16,  16,
-     17,  17,  17,  17,  17,  17,  17,  17,  18,  18,  19,  20,  21,  21,  22,  22,
-     23,  23,  24,  25,  26,  27,  27,  27,  28,  28,  28,  28,  29,  29,  29,  29,
-     30,  30,  30,  30,  31,  31,  31,  31,  32,  32,  32,  32,  33,  33,  33,  33,
-     34,  34,  34,  34,  35,  35,  35,  35,  36,  36,  36,  36,  37,  37,  37,  37,
-     38,  38,  38,  38,  39,  39,  39,  39,  40,  40,  40,  40,  40,  40,  40,  40,
-     41,  41,  41,  41,  41,  42,  42,  42,  43,  43,  43,  43,  43,  43,  43,  43,
-     44,  44,  44,  44,  44,  44,  44,  44,  44,  44,  44,  44,  45,  46,  46,  46,
-     47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,
-     47,  47,  47,  47,  48,  49,  49,  49,  50,  51,  52,  53,  54,  54,  54,  54,
-     55,  55,  55,  55,  55,  56,  57,  57,  58,  58,  59,  60,  61,  61,  61,  62,
-     63,  64,  64,  64,  64,  65,  66,  66,  67,  67,  67,  67,  68,  68,  69,  69,
-     70,  70,  71,  72,  73,  74,  75,  76,  77,  77,  77,  77,  78,  78,  79,  79,
-     80,  80,  80,  80,  80,  80,  80,  80,  81,  81,  81,  81,  81,  81,  81,  81,
-     82,  82,  82,  83,  84,  85,  86,  87,  88,  88,  89,  90,  91,  92,  92,  92,
-     93,  93,  93,  93,  93,  93,  93,  93,  94,  94,  94,  94,  94,  94,  94,  94,
-     95,  95,  96,  97,  97,  97,  97,  97,  98,  98,  98,  98,  99, 100, 100, 100,
-    101, 101, 101, 101, 101, 101, 101, 101, 102, 102, 102, 102, 102, 102, 103, 104,
-    105, 105, 105, 105, 105, 105, 105, 105, 106, 106, 106, 106, 107, 107, 107, 107,
-    108, 108, 108, 108, 108, 108, 108, 108, 109, 109, 109, 109, 109, 109, 109, 109,
-    110, 110, 110, 111, 112, 112, 112, 112, 113, 114, 115, 115, 116, 116, 116, 117,
-    118, 118, 118, 118, 119, 119, 119, 119, 120, 120, 120, 120, 120, 120, 120, 121,
-    122, 122, 123, 123, 123, 124, 124, 124, 125, 126, 127, 127, 128, 129, 130, 131,
-    132, 132, 132, 132, 132, 132, 132, 132, 133, 133, 133, 133, 133, 133, 133, 133,
-    134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-    134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-    134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 135, 135,
-    136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-    136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-    136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-    137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-    137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-    137, 137, 137, 137, 138, 139, 140, 141, 142, 142, 142, 142, 142, 142, 142, 142,
-    142, 142, 143, 143, 143, 144, 144, 144, 145, 146, 146, 146, 146, 146, 146, 146,
-    147, 148, 149, 149, 150, 150, 150, 151, 152, 153, 154, 155, 156, 156, 156, 157,
-    158, 158, 158, 159, 160, 160, 160, 161, 162, 163, 164, 165, 166, 166, 167, 167,
-    168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168,
-    168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168,
-    168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168,
-    168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 169, 170, 170,
-    171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171,
-    171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 172, 172, 172, 172,
-    173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173,
-    173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173,
-    174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174,
-    174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174,
-    174, 174, 174, 174, 174, 174, 174, 174, 175, 175, 175, 175, 175, 175, 175, 175,
-    175, 175, 175, 175, 175, 175, 175, 175, 176, 176, 177, 178, 178, 178, 178, 178,
-    178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-    179, 180, 181, 182, 183, 183, 183, 183, 184, 184, 184, 184, 184, 184, 184, 185,
-    186, 186, 186, 186, 187, 187, 187, 187, 188, 188, 189, 189, 190, 191, 192, 193,
-     26,  26,  26,  26, 194, 195, 195, 196, 197, 198, 199, 200, 201, 202, 202,  26,
-    203, 203, 204, 205, 206, 207, 208, 208, 209, 210, 211, 212,  26,  26,  26,  26,
-    213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213,  26,  26,  26,  26,
-    214, 214, 215, 216, 217, 218,  26, 219, 220, 221,  26,  26, 222, 223, 223, 223,
-    224, 224, 224, 225, 226,  26, 227, 227, 228, 228, 229, 230, 231, 232,  26,  26,
-    233, 233, 234,  26, 235, 235, 235, 235, 236, 236,  26,  26,  26,  26,  26,  26,
-     26,  26,  26, 237,  26,  26,  26,  26, 238, 239, 240, 241,  26,  26,  26, 242,
-    243, 243, 243, 243, 244, 244, 245, 246, 247, 247, 248, 249, 250, 250, 250, 251,
-    252, 252, 253,  26, 254, 255, 256, 256, 257, 257, 257, 257,  26,  26,  26,  26,
-    258, 258, 258, 258, 259, 259, 259,  26,  26,  26,  26,  26, 260, 260, 260, 260,
-    261, 261, 261, 262, 263, 263, 264,  26, 265, 265,  26,  26,  26,  26,  26,  26,
-    266, 266, 267,  26,  26, 268, 268, 268,  26,  26,  26,  26,  26, 269, 269, 269,
-    270, 270, 271, 272, 272, 273, 274, 274,  26,  26,  26,  26,  26,  26,  26,  26,
-    275, 275, 275, 276, 277, 277,  26,  26, 278, 278, 278, 279, 279, 280,  26,  26,
-     26,  26,  26,  26,  26,  26,  26, 281,  26,  26,  26,  26,  26,  26, 282, 282,
-    283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283,
-    283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283,
-    284, 284, 284, 284, 285, 285, 285, 285, 285, 285, 286,  26,  26,  26,  26,  26,
-     26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
-     26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
-     26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
-    287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287,
-    287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287,
-    287, 288,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
-     26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
-    289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289,
-    289, 289, 289, 289,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
-    290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290,
-    290, 290, 291, 292,  26,  26, 293, 294, 295, 295, 295, 295, 296,  26,  26,  26,
-     26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
-     26,  26, 297, 297, 297,  26,  26,  26, 298, 298, 298, 298, 298,  26,  26, 299,
-    300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300,
-    300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300,
-    301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301,
-    301, 301, 301, 301, 301, 301, 301, 301,  26,  26,  26,  26,  26,  26,  26,  26,
-    302, 302, 302, 302, 302, 302, 302, 302, 303, 304, 305, 306, 307, 307, 307, 307,
-    307, 307, 307, 307, 307, 307, 307, 307,  26,  26,  26,  26,  26,  26,  26,  26,
-    308, 308, 308, 308, 308, 309,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
-     26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
-    310, 310, 310, 310, 310, 310, 310, 310, 311, 311, 311, 311, 311, 311, 311, 311,
-    312, 312, 313,  26,  26,  26,  26, 314, 315, 315, 315, 316,  26,  26,  26,  26,
-    317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317,
-    317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317,
-    318, 318, 318, 318, 318, 318, 318, 318, 318, 318, 318, 318, 318, 318, 318, 318,
-    318, 318, 318, 318, 318, 319,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
-    320, 321,  26,  26,  26,  26,  26,  26, 322, 322, 323,  26,  26,  26,  26,  26,
-     26,  26,  26,  26,  26,  26, 324, 324,  26,  26,  26,  26,  26,  26,  26,  26,
-    325, 325, 325, 325, 325, 325, 325,  26, 326, 326, 326,  26,  26,  26,  26,  26,
-     26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
-     26,  26,  26, 327, 328, 328,  26,  26, 329, 329, 330,  26,  26,  26,  26,  26,
-    331, 331, 331, 331, 331, 331, 331, 331,  26,  26,  26,  26,  26,  26,  26,  26,
-    332, 333, 334, 334, 334, 335, 335, 335, 336, 336, 336, 336, 336, 336, 336, 336,
-    337, 337, 337, 337, 337, 337, 337, 337, 338, 338, 338, 338, 338, 338, 338, 338,
-    338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338,
-    339, 339, 340, 341, 342, 342, 342, 342, 343, 343, 343, 343, 344, 344, 344, 344,
-    345, 345, 345, 345, 345, 345, 345, 345, 346, 346, 346, 346, 346, 346, 346, 346,
-    347, 347, 347, 348, 349, 349, 349, 349,  26,  26,  26,  26,  26,  26,  26,  26,
-    350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350,
-    350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350,
-    350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350,
-    350, 350, 350, 350, 350, 350, 350,  26, 351, 351, 351, 351, 351, 351, 351, 351,
-    351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351,
-    351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351,
-    351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351,
-    351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 352, 352, 352, 352, 352, 352,
-    352, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353,
-    353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353,
-    353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353,
-    353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353,
-    353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353,
-    353, 353, 353, 353, 353, 354, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355,
-    355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355,
-    355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355,
-    355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355,
-    355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 356,
-    357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357,
-    357,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
-    358, 358, 358, 358,  26,  26,  26,  26, 359, 359, 359, 359, 359, 359, 359, 360,
-     26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
-    361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361,
-    361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361,
-    362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362,
-    362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362,
-};
-
-static RE_UINT16 re_block_stage_3[] = {
-      0,   0,   0,   0,   1,   1,   1,   1,   2,   2,   2,   2,   3,   3,   3,   3,
-      3,   3,   4,   4,   4,   4,   4,   4,   4,   4,   5,   5,   5,   5,   5,   5,
-      6,   6,   6,   6,   6,   6,   7,   7,   7,   7,   7,   7,   8,   8,   8,   8,
-      9,   9,   9,   9,   9,   9,  10,  10,  10,  10,  10,  10,  10,  10,  11,  11,
-     11,  11,  11,  11,  12,  12,  12,  12,  13,  13,  13,  13,  13,  13,  14,  14,
-     14,  14,  14,  14,  15,  15,  15,  15,  16,  16,  16,  16,  17,  17,  17,  17,
-     18,  18,  18,  18,  19,  19,  20,  20,  20,  20,  20,  20,  21,  21,  21,  21,
-     22,  22,  22,  22,  23,  23,  23,  23,  24,  24,  24,  24,  25,  25,  25,  25,
-     26,  26,  26,  26,  27,  27,  27,  27,  28,  28,  28,  28,  29,  29,  29,  29,
-     30,  30,  30,  30,  31,  31,  31,  31,  32,  32,  32,  32,  33,  33,  33,  33,
-     34,  34,  34,  34,  35,  35,  35,  35,  36,  36,  36,  36,  37,  37,  37,  37,
-     38,  38,  38,  38,  39,  39,  39,  39,  40,  40,  40,  40,  41,  41,  41,  41,
-     42,  42,  42,  42,  43,  43,  43,  43,  44,  44,  44,  44,  45,  45,  45,  45,
-     46,  46,  46,  46,  47,  47,  47,  47,  48,  48,  48,  48,  49,  49,  49,  49,
-     49,  49,  50,  50,  50,  50,  50,  50,  51,  51,  51,  51,  51,  51,  52,  52,
-     52,  52,  52,  52,  53,  53,  53,  53,  54,  54,  54,  54,  55,  55,  55,  55,
-     56,  56,  56,  56,  56,  56,  57,  57,  57,  57,  57,  57,  58,  58,  58,  58,
-     59,  59,  59,  59,  60,  60,  60,  60,  61,  61,  61,  61,  61,  61,  62,  62,
-     62,  62,  62,  62,  63,  63,  64,  64,  64,  64,  64,  64,  65,  65,  66,  66,
-     66,  66,  66,  66,  67,  67,  67,  67,  68,  68,  68,  68,  69,  69,  69,  69,
-     70,  70,  70,  70,  71,  71,  71,  71,  72,  72,  72,  72,  72,  72,  73,  73,
-     73,  73,  73,  73,  74,  74,  74,  74,  74,  74,  75,  75,  75,  75,  75,  75,
-     76,  76,  76,  76,  76,  76,  77,  77,  77,  77,  77,  77,  77,  77,  78,  78,
-     78,  78,  78,  78,  79,  79,  79,  79,  80,  80,  80,  80,  81,  81,  81,  81,
-     82,  82,  82,  82,  83,  83,  83,  83,  84,  84,  84,  84,  85,  85,  85,  85,
-     86,  86,  86,  86,  87,  87,  87,  87,  88,  88,  88,  88,  89,  89,  89,  89,
-     89,  89,  90,  90,  91,  91,  91,  91,  92,  92,  92,  92,  93,  93,  93,  93,
-     94,  94,  94,  94,  95,  95,  95,  95,  96,  96,  96,  96,  97,  97,  97,  97,
-     98,  98,  98,  98,  99,  99,  99,  99,  99,  99, 100, 100, 100, 100, 100, 100,
-    101, 101, 101, 101, 102, 102, 102, 102, 103, 103, 103, 103, 104, 104, 104, 104,
-    105, 105, 105, 105,  20,  20, 106, 106, 107, 107, 107, 107, 108, 108, 108, 108,
-    109, 109, 109, 109, 110, 110, 110, 110, 110, 110, 111, 111, 111, 111, 111, 111,
-    111, 111, 112, 112, 113, 113, 113, 113, 114, 114, 114, 114, 114, 114, 115, 115,
-    116, 116, 116, 116, 117, 117, 117, 117, 118, 118, 118, 118, 119, 119, 119, 119,
-    120, 120, 120, 120, 121, 121, 121, 121, 121, 121, 122, 122, 122, 122, 122, 122,
-    122, 122, 123, 123, 123, 123, 123, 123, 124, 124, 124, 124, 125, 125, 125, 125,
-    126, 126, 126, 126, 127, 127, 127, 127, 128, 128, 128, 128, 129, 129, 129, 129,
-    129, 129, 130, 130, 131, 131, 131, 131, 132, 132, 132, 132, 133, 133, 133, 133,
-    134, 134, 134, 134, 134, 134, 135, 135, 135, 135, 135, 135, 136, 136, 136, 136,
-    137, 137, 137, 137, 138, 138, 138, 138, 139, 139, 139, 139, 140, 140, 140, 140,
-    141, 141, 141, 141, 142, 142, 142, 142, 143, 143, 143, 143, 143, 143, 144, 144,
-    144, 144, 144, 144, 144, 144, 145, 145, 145, 145, 145, 145, 146, 146, 146, 146,
-    147, 147, 147, 147, 147, 147, 148, 148, 148, 148, 148, 148, 149, 149, 149, 149,
-    150, 150, 150, 150, 151, 151, 151, 151, 152, 152, 152, 152, 153, 153, 153, 153,
-    154, 154, 154, 154, 154, 154, 155, 155, 155, 155, 155, 155, 156, 156, 157, 157,
-    158, 158, 159, 159, 159, 159, 160, 160, 160, 160, 161, 161, 161, 161, 161, 161,
-    162, 162, 162, 162, 162, 162, 163, 163, 164, 164, 164, 164, 165, 165, 165, 165,
-    166, 166, 166, 166, 167, 167, 167, 167, 167, 167, 168, 168, 168, 168, 168, 168,
-    168, 168, 169, 169, 169, 169, 169, 169, 170, 170, 170, 170, 171, 171, 171, 171,
-    172, 172, 172, 172, 173, 173, 173, 173, 173, 173, 174, 174, 174, 174, 175, 175,
-    175, 175, 175, 175, 176, 176, 176, 176, 177, 177, 177, 177, 178, 178, 178, 178,
-    178, 178, 179, 179, 179, 179, 179, 179, 180, 180, 180, 180, 180, 180, 181, 181,
-    181, 181, 181, 181, 182, 182, 182, 182, 182, 182, 183, 183, 183, 183, 183, 183,
-    183, 183,  20,  20, 184, 184, 184, 184, 185, 185, 185, 185, 186, 186, 186, 186,
-    187, 187, 187, 187, 188, 188, 188, 188, 188, 188,  20,  20, 189, 189, 189, 189,
-    190, 190, 190, 190, 191, 191, 191, 191, 192, 192, 192, 192, 193, 193, 193, 193,
-    194, 194, 194, 194, 195, 195, 195, 195, 196, 196, 196, 196, 197, 197, 197, 197,
-    198, 198, 198, 198, 199, 199, 199, 199, 200, 200, 200, 200, 201, 201, 201, 201,
-    201, 201,  20,  20, 202, 202, 202, 202, 202, 202,  20,  20, 203, 203, 203, 203,
-    204, 204, 204, 204, 205, 205, 205, 205, 206, 206, 206, 206, 206, 206, 207, 207,
-    207, 207, 207, 207, 207, 207,  20,  20, 208, 208, 208, 208, 209, 209, 209, 209,
-    210, 210, 210, 210, 210, 210, 211, 211, 211, 211, 211, 211, 212, 212, 212, 212,
-    212, 212, 213, 213, 213, 213, 213, 213, 214, 214, 214, 214, 215, 215, 215, 215,
-    216, 216, 216, 216, 216, 216,  20,  20, 217, 217, 217, 217, 217, 217, 218, 218,
-    218, 218, 218, 218, 219, 219, 219, 219, 220, 220, 220, 220, 221, 221, 221, 221,
-    222, 222, 222, 222, 223, 223, 223, 223, 224, 224, 224, 224, 225, 225, 225, 225,
-    225, 225,  20,  20, 226, 226, 226, 226, 227, 227, 227, 227, 227, 227,  20,  20,
-    228, 228, 228, 228, 229, 229, 229, 229, 230, 230, 230, 230, 230, 230, 231, 231,
-    231, 231, 231, 231, 231, 231,  20,  20, 232, 232, 232, 232, 233, 233, 233, 233,
-    233, 233, 234, 234, 234, 234, 234, 234, 235, 235, 235, 235, 236, 236, 236, 236,
-    236, 236,  20,  20, 237, 237, 237, 237, 238, 238, 238, 238, 239, 239, 239, 239,
-    240, 240, 240, 240, 241, 241, 241, 241, 241, 241,  20,  20, 242, 242, 242, 242,
-    242, 242, 243, 243, 244, 244, 244, 244, 245, 245, 245, 245, 246, 246, 246, 246,
-    246, 246,  20,  20,  20,  20, 247, 247, 247, 247, 247, 247, 248, 248, 248, 248,
-    248, 248,  20,  20, 249, 249, 249, 249, 250, 250, 250, 250, 251, 251, 251, 251,
-    252, 252, 252, 252, 253, 253, 253, 253, 254, 254, 254, 254, 255, 255, 255, 255,
-    255, 255, 256, 256, 256, 256, 256, 256, 256, 256, 257, 257, 257, 257, 257, 257,
-    258, 258, 258, 258, 259, 259,  20,  20, 260, 260, 260, 260, 261, 261, 261, 261,
-    262, 262, 262, 262, 262, 262,  20,  20, 263, 263, 263, 263, 264, 264, 264, 264,
-    265, 265, 265, 265, 266, 266, 266, 266, 267, 267, 267, 267, 267, 267,  20,  20,
-    268, 268, 268, 268, 268, 268,  20,  20, 269, 269, 269, 269, 269, 269,  20,  20,
-    270, 270, 270, 270, 271, 271, 271, 271, 272, 272, 272, 272,  20,  20, 273, 273,
-    273, 273, 273, 273, 274, 274, 274, 274, 274, 274,  20,  20, 275, 275, 275, 275,
-    276, 276, 276, 276, 276, 276, 277, 277, 277, 277, 277, 277, 278, 278, 278, 278,
-    279, 279, 279, 279, 280, 280, 280, 280, 281, 281, 281, 281, 282, 282, 282, 282,
-    282, 282, 283, 283, 283, 283, 283, 283, 284, 284, 284, 284, 285, 285, 285, 285,
-    286, 286, 286, 286, 287, 287, 287, 287, 288, 288, 288, 288, 289, 289, 289, 289,
-    289, 289, 290, 290, 290, 290, 290, 290, 291, 291, 291, 291, 292, 292, 292, 292,
-    293, 293, 293, 293, 294, 294, 294, 294, 294, 294, 295, 295, 295, 295, 295, 295,
-    295, 295,  20,  20, 296, 296, 296, 296, 297, 297, 297, 297, 298, 298, 298, 298,
-    298, 298,  20,  20, 299, 299, 299, 299, 300, 300, 300, 300,
+    13, 13, 13, 14, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 15, 13, 16, 17, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 18, 10, 10, 10, 10, 10, 10, 10, 10, 19, 20,
+    21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 10, 10, 13, 31, 10, 10,
+    10, 32, 10, 10, 10, 10, 10, 10, 10, 10, 33, 34, 13, 13, 13, 13,
+    13, 35, 13, 36, 10, 10, 10, 10, 10, 10, 10, 10, 37, 10, 10, 38,
+    10, 10, 10, 10, 10, 39, 10, 10, 40, 10, 41, 42, 43, 10, 44, 10,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 45, 13, 13, 13, 46, 47, 13,
+    13, 13, 13, 48, 13, 13, 13, 13, 13, 13, 49, 10, 10, 10, 50, 10,
+    13, 13, 13, 13, 51, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10
 };
 
-static RE_UINT16 re_block_stage_4[] = {
-      1,   1,   1,   1,   1,   1,   1,   1,   2,   2,   2,   2,   2,   2,   2,   2,
-      3,   3,   3,   3,   3,   3,   3,   3,   4,   4,   4,   4,   4,   4,   4,   4,
-      5,   5,   5,   5,   5,   5,   5,   5,   6,   6,   6,   6,   6,   6,   6,   6,
-      7,   7,   7,   7,   7,   7,   7,   7,   8,   8,   8,   8,   8,   8,   8,   8,
-      9,   9,   9,   9,   9,   9,   9,   9,  10,  10,  10,  10,  10,  10,  10,  10,
-     11,  11,  11,  11,  11,  11,  11,  11,  12,  12,  12,  12,  12,  12,  12,  12,
-     13,  13,  13,  13,  13,  13,  13,  13,  14,  14,  14,  14,  14,  14,  14,  14,
-     15,  15,  15,  15,  15,  15,  15,  15,  16,  16,  16,  16,  16,  16,  16,  16,
-     17,  17,  17,  17,  17,  17,  17,  17,  18,  18,  18,  18,  18,  18,  18,  18,
-     19,  19,  19,  19,  19,  19,  19,  19,  20,  20,  20,  20,  20,  20,  20,  20,
-      0,   0,   0,   0,   0,   0,   0,   0,  21,  21,  21,  21,  21,  21,  21,  21,
-     22,  22,  22,  22,  22,  22,  22,  22,  23,  23,  23,  23,  23,  23,  23,  23,
-     24,  24,  24,  24,  24,  24,  24,  24,  25,  25,  25,  25,  25,  25,  25,  25,
-     26,  26,  26,  26,  26,  26,  26,  26,  27,  27,  27,  27,  27,  27,  27,  27,
-     28,  28,  28,  28,  28,  28,  28,  28,  29,  29,  29,  29,  29,  29,  29,  29,
-     30,  30,  30,  30,  30,  30,  30,  30,  31,  31,  31,  31,  31,  31,  31,  31,
-     32,  32,  32,  32,  32,  32,  32,  32,  33,  33,  33,  33,  33,  33,  33,  33,
-     34,  34,  34,  34,  34,  34,  34,  34,  35,  35,  35,  35,  35,  35,  35,  35,
-     36,  36,  36,  36,  36,  36,  36,  36,  37,  37,  37,  37,  37,  37,  37,  37,
-     38,  38,  38,  38,  38,  38,  38,  38,  39,  39,  39,  39,  39,  39,  39,  39,
-     40,  40,  40,  40,  40,  40,  40,  40,  41,  41,  41,  41,  41,  41,  41,  41,
-     42,  42,  42,  42,  42,  42,  42,  42,  43,  43,  43,  43,  43,  43,  43,  43,
-     44,  44,  44,  44,  44,  44,  44,  44,  45,  45,  45,  45,  45,  45,  45,  45,
-     46,  46,  46,  46,  46,  46,  46,  46,  47,  47,  47,  47,  47,  47,  47,  47,
-     48,  48,  48,  48,  48,  48,  48,  48,  49,  49,  49,  49,  49,  49,  49,  49,
-     50,  50,  50,  50,  50,  50,  50,  50,  51,  51,  51,  51,  51,  51,  51,  51,
-     52,  52,  52,  52,  52,  52,  52,  52,  53,  53,  53,  53,  53,  53,  53,  53,
-     54,  54,  54,  54,  54,  54,  54,  54,  55,  55,  55,  55,  55,  55,  55,  55,
-     56,  56,  56,  56,  56,  56,  56,  56,  57,  57,  57,  57,  57,  57,  57,  57,
-     58,  58,  58,  58,  58,  58,  58,  58,  59,  59,  59,  59,  59,  59,  59,  59,
-     60,  60,  60,  60,  60,  60,  60,  60,  61,  61,  61,  61,  61,  61,  61,  61,
-     62,  62,  62,  62,  62,  62,  62,  62,  63,  63,  63,  63,  63,  63,  63,  63,
-     64,  64,  64,  64,  64,  64,  64,  64,  65,  65,  65,  65,  65,  65,  65,  65,
-     66,  66,  66,  66,  66,  66,  66,  66,  67,  67,  67,  67,  67,  67,  67,  67,
-     68,  68,  68,  68,  68,  68,  68,  68,  69,  69,  69,  69,  69,  69,  69,  69,
-     70,  70,  70,  70,  70,  70,  70,  70,  71,  71,  71,  71,  71,  71,  71,  71,
-     72,  72,  72,  72,  72,  72,  72,  72,  73,  73,  73,  73,  73,  73,  73,  73,
-     74,  74,  74,  74,  74,  74,  74,  74,  75,  75,  75,  75,  75,  75,  75,  75,
-     76,  76,  76,  76,  76,  76,  76,  76,  77,  77,  77,  77,  77,  77,  77,  77,
-     78,  78,  78,  78,  78,  78,  78,  78,  79,  79,  79,  79,  79,  79,  79,  79,
-     80,  80,  80,  80,  80,  80,  80,  80,  81,  81,  81,  81,  81,  81,  81,  81,
-     82,  82,  82,  82,  82,  82,  82,  82,  83,  83,  83,  83,  83,  83,  83,  83,
-     84,  84,  84,  84,  84,  84,  84,  84,  85,  85,  85,  85,  85,  85,  85,  85,
-     86,  86,  86,  86,  86,  86,  86,  86,  87,  87,  87,  87,  87,  87,  87,  87,
-     88,  88,  88,  88,  88,  88,  88,  88,  89,  89,  89,  89,  89,  89,  89,  89,
-     90,  90,  90,  90,  90,  90,  90,  90,  91,  91,  91,  91,  91,  91,  91,  91,
-     92,  92,  92,  92,  92,  92,  92,  92,  93,  93,  93,  93,  93,  93,  93,  93,
-     94,  94,  94,  94,  94,  94,  94,  94,  95,  95,  95,  95,  95,  95,  95,  95,
-     96,  96,  96,  96,  96,  96,  96,  96,  97,  97,  97,  97,  97,  97,  97,  97,
-     98,  98,  98,  98,  98,  98,  98,  98,  99,  99,  99,  99,  99,  99,  99,  99,
-    100, 100, 100, 100, 100, 100, 100, 100, 101, 101, 101, 101, 101, 101, 101, 101,
-    102, 102, 102, 102, 102, 102, 102, 102, 103, 103, 103, 103, 103, 103, 103, 103,
-    104, 104, 104, 104, 104, 104, 104, 104, 105, 105, 105, 105, 105, 105, 105, 105,
-    106, 106, 106, 106, 106, 106, 106, 106, 107, 107, 107, 107, 107, 107, 107, 107,
-    108, 108, 108, 108, 108, 108, 108, 108, 109, 109, 109, 109, 109, 109, 109, 109,
-    110, 110, 110, 110, 110, 110, 110, 110, 111, 111, 111, 111, 111, 111, 111, 111,
-    112, 112, 112, 112, 112, 112, 112, 112, 113, 113, 113, 113, 113, 113, 113, 113,
-    114, 114, 114, 114, 114, 114, 114, 114, 115, 115, 115, 115, 115, 115, 115, 115,
-    116, 116, 116, 116, 116, 116, 116, 116, 117, 117, 117, 117, 117, 117, 117, 117,
-    118, 118, 118, 118, 118, 118, 118, 118, 119, 119, 119, 119, 119, 119, 119, 119,
-    120, 120, 120, 120, 120, 120, 120, 120, 121, 121, 121, 121, 121, 121, 121, 121,
-    122, 122, 122, 122, 122, 122, 122, 122, 123, 123, 123, 123, 123, 123, 123, 123,
-    124, 124, 124, 124, 124, 124, 124, 124, 125, 125, 125, 125, 125, 125, 125, 125,
-    126, 126, 126, 126, 126, 126, 126, 126, 127, 127, 127, 127, 127, 127, 127, 127,
-    128, 128, 128, 128, 128, 128, 128, 128, 129, 129, 129, 129, 129, 129, 129, 129,
-    130, 130, 130, 130, 130, 130, 130, 130, 131, 131, 131, 131, 131, 131, 131, 131,
-    132, 132, 132, 132, 132, 132, 132, 132, 133, 133, 133, 133, 133, 133, 133, 133,
-    134, 134, 134, 134, 134, 134, 134, 134, 135, 135, 135, 135, 135, 135, 135, 135,
-    136, 136, 136, 136, 136, 136, 136, 136, 137, 137, 137, 137, 137, 137, 137, 137,
-    138, 138, 138, 138, 138, 138, 138, 138, 139, 139, 139, 139, 139, 139, 139, 139,
-    140, 140, 140, 140, 140, 140, 140, 140, 141, 141, 141, 141, 141, 141, 141, 141,
-    142, 142, 142, 142, 142, 142, 142, 142, 143, 143, 143, 143, 143, 143, 143, 143,
-    144, 144, 144, 144, 144, 144, 144, 144, 145, 145, 145, 145, 145, 145, 145, 145,
-    146, 146, 146, 146, 146, 146, 146, 146, 147, 147, 147, 147, 147, 147, 147, 147,
-    148, 148, 148, 148, 148, 148, 148, 148, 149, 149, 149, 149, 149, 149, 149, 149,
-    150, 150, 150, 150, 150, 150, 150, 150, 151, 151, 151, 151, 151, 151, 151, 151,
-    152, 152, 152, 152, 152, 152, 152, 152, 153, 153, 153, 153, 153, 153, 153, 153,
-    154, 154, 154, 154, 154, 154, 154, 154, 155, 155, 155, 155, 155, 155, 155, 155,
-    156, 156, 156, 156, 156, 156, 156, 156, 157, 157, 157, 157, 157, 157, 157, 157,
-    158, 158, 158, 158, 158, 158, 158, 158, 159, 159, 159, 159, 159, 159, 159, 159,
-    160, 160, 160, 160, 160, 160, 160, 160, 161, 161, 161, 161, 161, 161, 161, 161,
-    162, 162, 162, 162, 162, 162, 162, 162, 163, 163, 163, 163, 163, 163, 163, 163,
-    164, 164, 164, 164, 164, 164, 164, 164, 165, 165, 165, 165, 165, 165, 165, 165,
-    166, 166, 166, 166, 166, 166, 166, 166, 167, 167, 167, 167, 167, 167, 167, 167,
-    168, 168, 168, 168, 168, 168, 168, 168, 169, 169, 169, 169, 169, 169, 169, 169,
-    170, 170, 170, 170, 170, 170, 170, 170, 171, 171, 171, 171, 171, 171, 171, 171,
-    172, 172, 172, 172, 172, 172, 172, 172, 173, 173, 173, 173, 173, 173, 173, 173,
-    174, 174, 174, 174, 174, 174, 174, 174, 175, 175, 175, 175, 175, 175, 175, 175,
-    176, 176, 176, 176, 176, 176, 176, 176, 177, 177, 177, 177, 177, 177, 177, 177,
-    178, 178, 178, 178, 178, 178, 178, 178, 179, 179, 179, 179, 179, 179, 179, 179,
-    180, 180, 180, 180, 180, 180, 180, 180, 181, 181, 181, 181, 181, 181, 181, 181,
-    182, 182, 182, 182, 182, 182, 182, 182, 183, 183, 183, 183, 183, 183, 183, 183,
-    184, 184, 184, 184, 184, 184, 184, 184, 185, 185, 185, 185, 185, 185, 185, 185,
-    186, 186, 186, 186, 186, 186, 186, 186, 187, 187, 187, 187, 187, 187, 187, 187,
-    188, 188, 188, 188, 188, 188, 188, 188, 189, 189, 189, 189, 189, 189, 189, 189,
-    190, 190, 190, 190, 190, 190, 190, 190, 191, 191, 191, 191, 191, 191, 191, 191,
-    192, 192, 192, 192, 192, 192, 192, 192, 193, 193, 193, 193, 193, 193, 193, 193,
-    194, 194, 194, 194, 194, 194, 194, 194, 195, 195, 195, 195, 195, 195, 195, 195,
-    196, 196, 196, 196, 196, 196, 196, 196, 197, 197, 197, 197, 197, 197, 197, 197,
-    198, 198, 198, 198, 198, 198, 198, 198, 199, 199, 199, 199, 199, 199, 199, 199,
-    200, 200, 200, 200, 200, 200, 200, 200, 201, 201, 201, 201, 201, 201, 201, 201,
-    202, 202, 202, 202, 202, 202, 202, 202, 203, 203, 203, 203, 203, 203, 203, 203,
-    204, 204, 204, 204, 204, 204, 204, 204, 205, 205, 205, 205, 205, 205, 205, 205,
-    206, 206, 206, 206, 206, 206, 206, 206, 207, 207, 207, 207, 207, 207, 207, 207,
-    208, 208, 208, 208, 208, 208, 208, 208, 209, 209, 209, 209, 209, 209, 209, 209,
-    210, 210, 210, 210, 210, 210, 210, 210, 211, 211, 211, 211, 211, 211, 211, 211,
-    212, 212, 212, 212, 212, 212, 212, 212, 213, 213, 213, 213, 213, 213, 213, 213,
-    214, 214, 214, 214, 214, 214, 214, 214, 215, 215, 215, 215, 215, 215, 215, 215,
-    216, 216, 216, 216, 216, 216, 216, 216, 217, 217, 217, 217, 217, 217, 217, 217,
-    218, 218, 218, 218, 218, 218, 218, 218, 219, 219, 219, 219, 219, 219, 219, 219,
-    220, 220, 220, 220, 220, 220, 220, 220, 221, 221, 221, 221, 221, 221, 221, 221,
-    222, 222, 222, 222, 222, 222, 222, 222, 223, 223, 223, 223, 223, 223, 223, 223,
-    224, 224, 224, 224, 224, 224, 224, 224, 225, 225, 225, 225, 225, 225, 225, 225,
-    226, 226, 226, 226, 226, 226, 226, 226, 227, 227, 227, 227, 227, 227, 227, 227,
-    228, 228, 228, 228, 228, 228, 228, 228, 229, 229, 229, 229, 229, 229, 229, 229,
-    230, 230, 230, 230, 230, 230, 230, 230, 231, 231, 231, 231, 231, 231, 231, 231,
-    232, 232, 232, 232, 232, 232, 232, 232, 233, 233, 233, 233, 233, 233, 233, 233,
-    234, 234, 234, 234, 234, 234, 234, 234, 235, 235, 235, 235, 235, 235, 235, 235,
-    236, 236, 236, 236, 236, 236, 236, 236, 237, 237, 237, 237, 237, 237, 237, 237,
-    238, 238, 238, 238, 238, 238, 238, 238, 239, 239, 239, 239, 239, 239, 239, 239,
-    240, 240, 240, 240, 240, 240, 240, 240, 241, 241, 241, 241, 241, 241, 241, 241,
-    242, 242, 242, 242, 242, 242, 242, 242, 243, 243, 243, 243, 243, 243, 243, 243,
-    244, 244, 244, 244, 244, 244, 244, 244, 245, 245, 245, 245, 245, 245, 245, 245,
-    246, 246, 246, 246, 246, 246, 246, 246, 247, 247, 247, 247, 247, 247, 247, 247,
-    248, 248, 248, 248, 248, 248, 248, 248, 249, 249, 249, 249, 249, 249, 249, 249,
-    250, 250, 250, 250, 250, 250, 250, 250, 251, 251, 251, 251, 251, 251, 251, 251,
-    252, 252, 252, 252, 252, 252, 252, 252, 253, 253, 253, 253, 253, 253, 253, 253,
-    254, 254, 254, 254, 254, 254, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255,
-    256, 256, 256, 256, 256, 256, 256, 256, 257, 257, 257, 257, 257, 257, 257, 257,
-    258, 258, 258, 258, 258, 258, 258, 258, 259, 259, 259, 259, 259, 259, 259, 259,
-    260, 260, 260, 260, 260, 260, 260, 260, 261, 261, 261, 261, 261, 261, 261, 261,
-    262, 262, 262, 262, 262, 262, 262, 262, 263, 263, 263, 263, 263, 263, 263, 263,
-    264, 264, 264, 264, 264, 264, 264, 264, 265, 265, 265, 265, 265, 265, 265, 265,
-    266, 266, 266, 266, 266, 266, 266, 266, 267, 267, 267, 267, 267, 267, 267, 267,
-    268, 268, 268, 268, 268, 268, 268, 268, 269, 269, 269, 269, 269, 269, 269, 269,
-    270, 270, 270, 270, 270, 270, 270, 270, 271, 271, 271, 271, 271, 271, 271, 271,
-    272, 272, 272, 272, 272, 272, 272, 272, 273, 273, 273, 273, 273, 273, 273, 273,
-    274, 274, 274, 274, 274, 274, 274, 274, 275, 275, 275, 275, 275, 275, 275, 275,
-    276, 276, 276, 276, 276, 276, 276, 276, 277, 277, 277, 277, 277, 277, 277, 277,
-    278, 278, 278, 278, 278, 278, 278, 278, 279, 279, 279, 279, 279, 279, 279, 279,
-    280, 280, 280, 280, 280, 280, 280, 280, 281, 281, 281, 281, 281, 281, 281, 281,
-    282, 282, 282, 282, 282, 282, 282, 282, 283, 283, 283, 283, 283, 283, 283, 283,
-    284, 284, 284, 284, 284, 284, 284, 284, 285, 285, 285, 285, 285, 285, 285, 285,
-    286, 286, 286, 286, 286, 286, 286, 286, 287, 287, 287, 287, 287, 287, 287, 287,
-    288, 288, 288, 288, 288, 288, 288, 288, 289, 289, 289, 289, 289, 289, 289, 289,
-    290, 290, 290, 290, 290, 290, 290, 290, 291, 291, 291, 291, 291, 291, 291, 291,
-    292, 292, 292, 292, 292, 292, 292, 292, 293, 293, 293, 293, 293, 293, 293, 293,
-    294, 294, 294, 294, 294, 294, 294, 294, 295, 295, 295, 295, 295, 295, 295, 295,
-    296, 296, 296, 296, 296, 296, 296, 296, 297, 297, 297, 297, 297, 297, 297, 297,
-    298, 298, 298, 298, 298, 298, 298, 298, 299, 299, 299, 299, 299, 299, 299, 299,
-    300, 300, 300, 300, 300, 300, 300, 300,
+static RE_UINT16 re_alphanumeric_table_2[] = {
+      0,   1,   2,   2,   0,   3,   4,   4,   5,   5,   5,   5,   5,   5,   5,   5,
+      5,   5,   5,   5,   5,   5,   6,   7,   0,   0,   8,   9,  10,  11,   5,  12,
+      5,   5,   5,   5,  13,   5,   5,   5,   5,  14,  15,   5,  16,  17,  18,  19,
+     20,   5,  21,  22,   5,   5,  23,  24,  25,   5,  26,   5,   5,  27,   5,  28,
+     29,  30,  31,  32,   0,  33,  34,  35,   5,  36,  37,  38,  39,  40,  41,  42,
+     43,  44,  45,  46,  47,  48,  49,  50,  51,  48,  52,  53,  54,  55,  56,  57,
+     58,  59,  60,  61,  58,  62,  63,  64,  65,  66,  67,  68,  69,  70,  71,  72,
+     73,  74,  75,   0,  76,  77,  78,   0,  79,  80,  81,  82,  83,  84,   0,   0,
+      5,  85,  86,   5,  87,   5,  88,  89,   5,   5,   5,   5,   5,   5,   5,   5,
+      5,   5,  90,   5,  91,  92,  93,   5,  94,   5,  74,   0,  95,   5,   5,  96,
+     73,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
+      5,   5,   5,  97,   2,   5,   5,  98,  99, 100, 100, 101,   5, 102, 103,  80,
+      1,   5,   5,  31,   5, 104,   5, 105, 106, 107, 108, 109,   5, 110, 111,   0,
+    112,   5, 106, 113, 111, 114,  79,   0,   5, 115, 116,   0,   5, 117,   5, 118,
+      5, 119, 120,  87, 121,  66,   0, 122,   5,   5,   5,   5,   5,   5,   0, 123,
+      5,   5,   5,   5,   5,   5,   5,   5,  96,   5, 124,  87,   5, 125, 126, 127,
+      0,   0,   0, 128, 129,   0,   0,   0, 130, 131, 132,   5,  16,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0, 133,   5,  80,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      5, 134, 106,   5,   5,   5,   5, 135,   5,  88,   5, 136, 119, 137, 137,   5,
+      0, 138,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    139, 140,  73,   5, 141,  73,   5,  89, 142,  14,   5,   5, 143,   5,   0,  25,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
+      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
+      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   0,   0,
+      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
+      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
+      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,  84,
+      5,   5,   5,   5,  30,   0,  25,  87,   5,   5,   5,   5,   5,   5,   5,   5,
+    144, 145,   5, 146,   5,   5,   5,  95, 147, 148,   5,   5, 149,   5, 150, 151,
+    152, 153,   5, 100,   5,   5, 154, 155,   5, 104, 156,  84,   5, 157, 158, 106,
+      5, 119, 159, 160,   5, 106, 161, 162, 163, 164,  89,  86,   5,   5,   5, 165,
+      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
+      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5, 166, 167, 112,
+      0,   0,   0,   0,   0,   0,   0,   0,   5,   5,   5,   5,   5,   5,   5,   5,
+      5,   5,   5, 168,   5,   5, 169,   0, 170, 171, 172,   5,   5,  27, 173,   5,
+      5,   5,   5,   5,   5,   5,   5,   5,   5,  87,  25,   5, 174,   5, 153, 175,
+      0,   0,   0, 176,   5,   5,   5,  84,   1,   2,   2, 108,   5, 106, 177,   0,
+    178, 179, 180,   0,   5,   5,   5,  74,   0,   0,   5, 181,   0,   0,   0,   0,
+      0,   0,   0,   0,  84,   5, 182,   0,   5,  26, 104,  74,  87,   5, 183,   0,
+      5,   5,   5,   5,  87,  86, 184, 112,   5, 185,   5, 186,   0,   0,   0,   0,
+      5,   5,   5,   5,   5,   5,   5,   5,   5, 119, 105, 153,   0,   0,   0,   0,
+    187, 188, 105, 119, 106,   0,   0, 189, 105, 169,   0,   0,   5, 190,   0,   0,
+    191, 105,   0,  84,  84,   0,  81, 192,   5, 105, 105, 156,  27,   0,   0,   0,
+      5,   5,  16,   0,   5, 156,   5, 156,   5, 193,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   5, 194,   0,   0,  84, 195, 196,   0,   0,  25, 192, 119,
+      5,   5, 196,  57, 148,  31,  25, 197,   5, 198, 199, 200,   5,   5, 201,   0,
+    202, 203,   0,   0, 204, 121,   5, 197,  39,  48, 205, 186,   0,   0,   0,   0,
+      5,   5, 206, 207,   5,   5, 208,   0,   0,   0,   0,   0,   5, 209, 210,   0,
+      5, 106, 211,   0,   5, 212,  80,   0,  66, 165,   0,   0,   0,   0,   0,   0,
+      5,  31,   0,   0,   0,   5,   5, 213, 214, 215, 216,   0,   0, 217,  29, 218,
+      5, 219,  25,   5, 220,   0,   5,  31,   0,   0,   0,   0,   0,   0,   0,   0,
+    221, 222, 223, 224, 174, 225,   0,   0, 226, 227, 228, 229, 230,  80,   0,   0,
+      0,   0,   0,   0,   0,   0,   0, 119,   0,   0,   0,   0,   0, 231,   0,   0,
+      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
+      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5, 169,   0,   0,   0,
+      5,   5,   5, 143,   5,   5,   5,   5,   5,   5, 186,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      5, 143,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
+      5,   5, 232,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
+      5,  31, 106,  80,   0,   0,  25, 233,   5,  95, 234, 235,  95,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   5,   5,   0,   0,   0,   0,   5,   5, 236,   5, 237,   0,   0, 238,
+      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
+      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5, 239,
+      5,   5,   5,   5,   5,   5, 105,   0,  16,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      5,   5,   5,   5,   5,   5,   5,   5, 106,   0, 240, 199,   5,   5,   5,   5,
+      5,   5,   5,   5,   5,   5,   5, 112,   0,   0,   0,   0,   0,   0,   0,   0,
+      5,   5,   5, 241, 242,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      5,   5,  33,   5, 243, 244, 245,   5, 246, 247, 248,   5,   5,   5,   5,   5,
+      5,   5,   5,   5,   5, 249, 250,  89,  33,  33, 134, 134, 221, 221, 251,   5,
+    252, 253,   0,   0,   0,   0,   0,   0,   5, 254, 255,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   5, 256,   0,   0,   0,   0,   0,   0,   0,   0,
+      5,   5,   5,   5,   5,   5, 192,   0,   5,   5, 257,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    245, 258, 259, 260, 261, 262,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,  25,  86,  86,  80,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,
+      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
+      5,   5,   5,   5,   5,   5,  87,   0,   5,   5,   5,   5,   5,   5,   5,   5,
+      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
+      5,   5,   5,   5,   5,   5,   5,   5,   5, 181,   5,   5,   5,   5,   5,   5,
+     87,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
+      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
+      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
+      5,   5,   5,   5,   5, 263,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
+      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
+      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,  79,
+      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
+     87,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
+      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,  32,   0,   0,   0,   0,   0
+};
+
+static RE_UINT8 re_alphanumeric_table_3[] = {
+      0,   0,   0,   0,   0,   0, 255,   3, 254, 255, 255,   7,   0,   4,  32,   4,
+    255, 255, 127, 255, 255, 255, 255, 255, 195, 255,   3,   0,  31,  80,   0,   0,
+     32,   0,   0,   0,   0,   0, 223, 188,  64, 215, 255, 255, 251, 255, 255, 255,
+    255, 255, 191, 255,   3, 252, 255, 255, 255, 255, 254, 255, 255, 255, 127,   2,
+    255,   1,   0,   0,   0,   0, 255, 191, 182,   0, 255, 255, 255, 135,   7,   0,
+      0,   0, 255,   7, 255, 255, 255, 254, 255, 195, 255, 255, 255, 255, 239,  31,
+    254, 225, 255, 159,   0,   0, 255, 255,   0, 224, 255, 255, 255, 255,   3,   0,
+    255,   7,  48,   4, 255, 255, 255, 252, 255,  31,   0,   0, 255, 255, 255,   1,
+    255,   7,   0,   0, 255, 255, 223, 255, 255,   0, 240, 255, 248,   3, 255, 255,
+    255, 255, 255, 239, 255, 223, 225, 255, 207, 255, 254, 255, 239, 159, 249, 255,
+    255, 253, 197, 227, 159,  89, 128, 176, 207, 255,   3,  16, 238, 135, 249, 255,
+    255, 253, 109, 195, 135,  25,   2,  94, 192, 255,  63,   0, 238, 191, 251, 255,
+    255, 253, 237, 227, 191,  27,   1,   0, 207, 255,   0,  30, 238, 159, 249, 255,
+    159,  25, 192, 176, 207, 255,   2,   0, 236, 199,  61, 214,  24, 199, 255, 195,
+    199,  29, 129,   0, 192, 255,   0,   0, 239, 223, 253, 255, 255, 253, 255, 227,
+    223,  29,  96,   7, 207, 255,   0,   0, 255, 253, 239, 227, 223,  29,  96,  64,
+    207, 255,   6,   0, 255, 223, 253, 255, 255, 255, 255, 231, 223,  93, 240, 128,
+    207, 255,   0, 252, 238, 255, 127, 252, 255, 255, 251,  47, 127, 128,  95, 255,
+    192, 255,  12,   0, 254, 255, 255, 255, 255, 255, 255,   7, 127,  32, 255,   3,
+    214, 247, 255, 255, 175, 255, 255,  59,  95,  32, 255, 243,   1,   0,   0,   0,
+    255,   3,   0,   0, 255, 254, 255, 255, 255,  31, 254, 255,   3, 255, 255, 254,
+    255, 255, 255,  31, 255, 255, 127, 249, 255,   3, 255, 255, 255, 255, 255,  63,
+    191,  32, 255, 255, 255, 255, 255, 247, 255,  61, 127,  61, 255,  61, 255, 255,
+    255, 255,  61, 127,  61, 255, 127, 255, 255, 255,  61, 255, 255, 255,   0,   0,
+    255, 255,  63,  63, 255, 159, 255, 255, 255, 199, 255,   1, 255, 223,  15,   0,
+    255, 255,  15,   0, 255, 223,  13,   0, 255, 255, 207, 255, 255,   1, 128,  16,
+    255,   7, 255, 255, 255, 255,  63,   0, 255, 255, 255, 127, 255,  15, 255,   1,
+    192, 255, 255, 255, 255,  63,  31,   0, 255,  15, 255, 255, 255,   3, 255,   3,
+    255, 255, 255,  15, 254, 255,  31,   0, 128,   0,   0, 128, 255, 255, 239, 255,
+    239,  15, 255,   3, 255, 243, 255, 255, 191, 255,   3,   0, 255, 255, 127,   0,
+    255, 227, 255, 255, 255,   1, 255, 255,   0, 222, 111,   4, 128, 255,  31,   0,
+     63,  63, 255, 170, 255, 255, 223,  95, 220,  31, 207,  15, 255,  31, 220,  31,
+      0,   0,   2, 128,   0,   0, 255,  31, 132, 252,  47,  62,  80, 189, 255, 243,
+    224,  67,   0,   0,   0,   0, 192, 255, 255, 127, 255, 255,  31, 120,  12,   0,
+    255, 128,   0,   0, 127, 127, 127, 127,   0, 128,   0,   0, 224,   0,   0,   0,
+    254,   3,  62,  31, 255, 255, 127, 224, 224, 255, 255, 255, 255, 127,   0,   0,
+    255,  31, 255, 255, 255,  15,   0,   0, 255, 127, 240, 143,   0,   0, 128, 255,
+    252, 255, 255, 255, 255, 249, 255, 255, 252,   7,   0,   0,   0,   0, 224, 255,
+    191, 255, 255, 255, 255,   0,   0,   0,  47,   0, 255,   3,   0,   0, 252, 232,
+    255, 255,   7,   0, 255, 255, 247, 255,   0, 128, 255,   3, 255,  63, 255,   3,
+    255, 255, 127, 252,   5,   0,   0,  56, 255, 255,  60,   0, 126, 126, 126,   0,
+    127, 127, 255, 255, 255,   7, 255,   3,  15,   0, 255, 255, 127, 248, 255, 255,
+    255,  63, 255, 255, 255, 255, 255,   3, 127,   0, 248, 224, 255, 253, 127,  95,
+    219, 255, 255, 255,   0,   0, 248, 255, 255, 255, 252, 255,   0,   0, 255,  15,
+      0,   0, 223, 255, 252, 252, 252,  28, 255, 239, 255, 255, 127, 255, 255, 183,
+    255,  63, 255,  63, 255, 255,  31,   0, 255, 255,   1,   0,  15, 255,  62,   0,
+    255, 255,  15, 255, 255,   0, 255, 255,  15,   0,   0,   0,  63, 253, 255, 255,
+    255, 255, 191, 145, 255, 255,  55,   0, 255, 255, 255, 192, 111, 240, 239, 254,
+     31,   0,   0,   0, 255,   0, 255,   3, 255,  27,   3,   0, 128,   0, 255, 255,
+     63,   0,   0,   0, 255,   1, 255,   3, 255, 255, 199, 255, 240,   0, 255, 255,
+    255, 255,  71,   0,  30, 192, 255,  23, 255, 255, 251, 255, 255, 255, 159,  64,
+    127, 189, 255, 191, 159,  25, 129, 224, 187,   7, 255, 131,   3,   0,   0,   0,
+    179,   0, 255,   3, 255, 255,  63, 127,   0,   0,   0,  63,  17,   0, 255,   3,
+    255, 255,  63,   1, 255,   3,   0, 128, 127, 242, 111, 255, 255, 255, 191, 153,
+      7,   0, 255,   3, 255, 252, 255, 255,  26,   0,   0,   0, 255, 255, 231, 127,
+    255, 255, 255,  32, 255, 253, 255, 255, 255, 255, 127, 127,   1,   0, 255,   3,
+      0,   0, 252, 255, 255, 254, 127,   0, 127, 251, 255, 255, 255, 255, 127, 180,
+    203,   0, 255,   3, 191, 253, 255, 255, 255, 127, 123,   1,   0,   0,   1,   0,
+    127,   0,   0,   0, 255,  63,   0,   0,  15,   0, 255,   3, 248, 255, 255, 224,
+    255, 135, 255, 255, 255, 128, 255, 255,  11,   0,   3,   0, 255, 255, 255,   0,
+      0,   0,   7,   0, 255,   7, 255,  31, 255,   1, 255,  67, 255, 255, 255, 223,
+    100, 222, 255, 235, 239, 255, 255, 255, 191, 231, 223, 223, 255, 255, 255, 123,
+     95, 252, 253, 255,  63, 255, 255, 255, 253, 255, 255, 247, 247, 207, 255, 255,
+    127, 255, 255, 249, 219,   7,   0,   0, 255,  31, 128,  63, 255,  67,   0,   0,
+    255,  15, 255,   3, 143,   8, 255,   3, 150, 254, 247,  10, 132, 234, 150, 170,
+    150, 247, 247,  94, 255, 251, 255,  15, 238, 251, 255,  15,   3,   0, 255, 255
 };
 
-/* Block: 13160 bytes. */
-
-RE_UINT32 re_get_block(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-
-    f = ch >> 10;
-    code = ch ^ (f << 10);
-    pos = (RE_UINT32)re_block_stage_1[f] << 5;
-    f = code >> 5;
-    code ^= f << 5;
-    pos = (RE_UINT32)re_block_stage_2[pos + f] << 2;
-    f = code >> 3;
-    code ^= f << 3;
-    pos = (RE_UINT32)re_block_stage_3[pos + f] << 3;
-    value = re_block_stage_4[pos + code];
-
-    return value;
-}
-
-/* Script. */
-
-static RE_UINT8 re_script_stage_1[] = {
-     0,  1,  2,  3,  4,  5,  6,  7,  7,  8,  7,  7,  7,  7,  7,  7,
-     7,  7,  7,  9, 10, 11, 12, 12, 12, 12, 13, 14, 14, 14, 14, 15,
-    16, 17, 18, 19, 20, 14, 21, 14, 22, 14, 14, 14, 14, 23, 24, 24,
-    25, 26, 14, 14, 14, 14, 27, 28, 14, 14, 29, 30, 31, 32, 33, 34,
-     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
-     7,  7,  7,  7, 35,  7, 36, 37,  7, 38,  7,  7,  7, 39, 14, 40,
-    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-    41, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-};
+RE_UINT32 re_get_alphanumeric(RE_UINT32 codepoint) {
+    RE_UINT32 field_2;
+    RE_UINT32 field_1;
+    RE_UINT32 field_0;
+    RE_UINT32 offset;
+    RE_UINT32 v;
 
-static RE_UINT8 re_script_stage_2[] = {
-      0,   1,   2,   2,   2,   3,   4,   5,   6,   7,   8,   9,  10,  11,  12,  13,
-     14,  15,  16,  17,  18,  19,  20,  21,  22,  23,  24,  25,  26,  27,  28,  29,
-     30,  31,  32,  32,  33,  34,  35,  36,  37,  37,  37,  37,  37,  38,  39,  40,
-     41,  42,  43,  44,  45,  46,  47,  48,  49,  50,  51,  52,   2,   2,  53,  54,
-     55,  56,  57,  58,  59,  59,  59,  59,  60,  59,  59,  59,  59,  59,  59,  59,
-     61,  61,  59,  59,  59,  59,  62,  63,  64,  65,  66,  67,  68,  69,  70,  71,
-     72,  73,  74,  75,  76,  77,  78,  59,  70,  70,  70,  70,  70,  70,  70,  70,
-     70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  70,
-     70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  79,  70,  70,  70,  70,
-     70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  80,
-     81,  81,  81,  81,  81,  81,  81,  81,  81,  82,  83,  83,  84,  85,  86,  87,
-     88,  89,  90,  91,  92,  93,  94,  95,  32,  32,  32,  32,  32,  32,  32,  32,
-     32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,
-     32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  96,
-     97,  97,  97,  97,  97,  97,  97,  97,  97,  97,  97,  97,  97,  97,  97,  97,
-     97,  97,  70,  70,  98,  99, 100, 101, 102, 102, 103, 104, 105, 106, 107, 108,
-    109, 110, 111, 112,  97, 113, 114, 115, 116, 117, 118,  97, 119, 119, 120,  97,
-    121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131,  97, 132,  97, 133, 134,
-    135, 136, 137, 138, 139, 140, 141,  97, 142, 143,  97, 144, 145, 146, 147,  97,
-    148, 149,  97, 150, 151, 152,  97,  97, 153, 154, 155, 156,  97, 157,  97, 158,
-    159, 159, 159, 159, 159, 159, 159, 160, 161, 159, 162,  97,  97,  97,  97,  97,
-    163, 163, 163, 163, 163, 163, 163, 163, 164,  97,  97,  97,  97,  97,  97,  97,
-     97,  97,  97,  97,  97,  97,  97,  97, 165, 165, 165, 165, 166,  97,  97,  97,
-    167, 167, 167, 167, 168, 169, 170, 171,  97,  97,  97,  97, 172, 173, 174, 175,
-    176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176,
-    176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 177,
-    176, 176, 176, 176, 176, 178,  97,  97,  97,  97,  97,  97,  97,  97,  97,  97,
-    179, 180, 181, 182, 182, 183,  97,  97,  97,  97,  97,  97,  97,  97,  97,  97,
-     97,  97,  97,  97,  97,  97,  97,  97, 184, 185,  97,  97,  97,  97,  97,  97,
-     59, 186, 187, 188, 189, 190, 191,  97, 192, 193, 194,  59,  59, 195,  59, 196,
-    197, 197, 197, 197, 197, 198,  97,  97,  97,  97,  97,  97,  97,  97,  97,  97,
-    199,  97, 200,  97,  97, 201,  97,  97,  97,  97,  97,  97,  97,  97,  97,  97,
-    202, 203, 204,  97,  97,  97,  97,  97, 205, 206, 207,  97, 208, 209,  97,  97,
-    210, 211, 212, 213, 214,  97,  59,  59,  59,  59,  59,  59,  59, 215, 216, 217,
-    218, 219, 220, 221, 222, 223,  97,  97,  97,  97,  97,  97,  97,  97,  97,  97,
-     70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  70, 224,  70,  70,
-     70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  70, 225,  70,
-    226,  70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  70,
-     70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  70, 227,  70,  70,
-     70,  70,  70,  70,  70,  70,  70, 228,  97,  97,  97,  97,  97,  97,  97,  97,
-     70,  70,  70,  70, 229,  97,  97,  97,  97,  97,  97,  97,  97,  97,  97,  97,
-    230,  97, 231, 232,  97,  97,  97,  97,  97,  97,  97,  97,  97,  97,  97,  97,
-};
+    field_2 = codepoint >> 10;
+    field_1 = (codepoint >> 5) & 0x1F;
+    field_0 = (codepoint >> 3) & 0x3;
+    offset = codepoint & 0x7;
 
-static RE_UINT16 re_script_stage_3[] = {
-      0,   0,   0,   0,   0,   0,   0,   0,   1,   2,   2,   3,   1,   2,   2,   3,
-      0,   0,   0,   0,   0,   4,   0,   4,   2,   2,   5,   2,   2,   2,   5,   2,
-      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
-      2,   2,   2,   2,   2,   2,   2,   6,   0,   0,   0,   0,   7,   8,   0,   0,
-      9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,  10,  11,
-     12,  13,  14,  14,  15,  14,  14,  14,  14,  14,  14,  14,  16,  17,  14,  14,
-     18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,
-     19,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,
-     18,  18,  18,  18,  18,  18,  20,  21,  21,  21,  22,  20,  21,  21,  21,  21,
-     21,  23,  24,  25,  25,  25,  25,  25,  25,  26,  25,  25,  25,  27,  28,  26,
-     29,  30,  31,  32,  31,  31,  31,  31,  33,  34,  35,  31,  31,  31,  36,  31,
-     31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  29,  31,  31,  31,  31,
-     37,  38,  37,  37,  37,  37,  37,  37,  37,  39,  31,  31,  31,  31,  31,  31,
-     40,  40,  40,  40,  40,  40,  41,  26,  42,  42,  42,  42,  42,  42,  42,  43,
-     44,  44,  44,  44,  44,  45,  44,  46,  47,  47,  47,  48,  37,  49,  26,  26,
-     26,  26,  26,  26,  31,  31,  50,  51,  26,  26,  52,  31,  53,  31,  31,  31,
-     54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  55,  54,  56,  54,  54,  54,
-     57,  58,  59,  60,  60,  61,  62,  63,  58,  64,  65,  66,  67,  60,  60,  68,
-     69,  70,  71,  72,  72,  73,  74,  75,  70,  76,  77,  78,  79,  72,  80,  26,
-     81,  82,  83,  84,  84,  85,  86,  87,  82,  88,  89,  26,  90,  84,  91,  92,
-     93,  94,  95,  96,  96,  97,  98,  99,  94, 100, 101, 102, 103,  96,  96,  26,
-    104, 105, 106, 107, 108, 105, 109, 110, 105, 106, 111,  26, 112, 109, 109, 113,
-    114, 115, 116, 114, 114, 116, 114, 117, 115, 118, 119, 120, 121, 114, 122, 114,
-    123, 124, 125, 123, 123, 125, 126, 127, 124, 128, 129, 130, 131, 123, 132,  26,
-    133, 134, 135, 136, 136, 136, 136, 136, 134, 135, 137, 136, 138, 136, 136, 136,
-    139, 140, 141, 142, 140, 140, 143, 144, 141, 145, 146, 140, 147, 140, 148,  26,
-    149, 150, 150, 150, 150, 150, 150, 151, 150, 150, 150, 152,  26,  26,  26,  26,
-    153, 154, 155, 155, 156, 155, 155, 157, 158, 157, 155, 159,  26,  26,  26,  26,
-    160, 160, 160, 160, 160, 160, 160, 160, 160, 161, 160, 160, 160, 162, 161, 160,
-    160, 160, 160, 161, 160, 160, 160, 163, 160, 163, 164, 165,  26,  26,  26,  26,
-    166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
-    166, 166, 166, 166, 167, 167, 167, 167, 168, 169, 167, 167, 167, 167, 167, 170,
-    171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171,
-    172, 172, 172, 172, 172, 172, 172, 172, 172, 173, 174, 173, 172, 172, 172, 172,
-    172, 173, 172, 172, 172, 172, 173, 174, 173, 172, 174, 172, 172, 172, 172, 172,
-    172, 172, 173, 172, 172, 172, 172, 172, 172, 172, 172, 175, 172, 172, 172, 176,
-    172, 172, 172, 177, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 179, 179,
-    180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180,
-    181, 181, 181, 182, 183, 183, 183, 183, 183, 183, 183, 183, 183, 184, 183, 185,
-    186, 187, 188,  26, 189, 189, 190,  26, 191, 191, 192,  26, 193, 194, 195,  26,
-    196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 197, 196, 198, 196, 198,
-    199, 200, 201, 202, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 203,
-    201, 201, 201, 201, 201, 204, 180, 180, 180, 180, 180, 180, 180, 180, 205,  26,
-    206, 206, 206, 207, 206, 208, 206, 208, 209, 206, 210, 210, 210, 211, 212,  26,
-    213, 213, 213, 213, 213, 214, 213, 213, 213, 215, 213, 216, 196, 196, 196, 196,
-    217, 217, 217, 218, 219, 219, 219, 219, 219, 219, 219, 220, 219, 219, 219, 221,
-    219, 222, 219, 222, 219, 223,   9, 224,  26,  26,  26,  26,  26,  26,  26,  26,
-    225, 225, 225, 225, 225, 225, 225, 225, 225, 226, 225, 225, 225, 225, 225, 227,
-    228, 228, 228, 228, 228, 228, 228, 228, 229, 229, 229, 229, 229, 229, 230, 231,
-    232, 232, 232, 232, 232, 232, 232, 233, 232, 234, 235, 235, 235, 235, 235, 235,
-     18, 236, 167, 167, 167, 167, 167, 237, 228,  26, 238,   9, 239, 240, 241, 242,
-      2,   2,   2,   2, 243, 244,   2,   2,   2,   2,   2, 245, 246, 247,   2, 248,
-      2,   2,   2,   2,   2,   2,   2, 249,   9,   9,   9,   9,   9,   9,   9, 250,
-     14,  14, 251, 251,  14,  14,  14,  14, 251, 251,  14, 252,  14,  14,  14, 251,
-     14,  14,  14,  14,  14,  14, 253,  14, 253,  14, 254, 255,  14,  14, 256, 257,
-      0, 258,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 259,   0, 260, 261,
-      0, 262,   2, 263,   0,   0,   0,   0,  26,  26,   9,   9,   9,   9, 264,  26,
-      0,   0,   0,   0, 265, 266,   4,   0,   0, 267,   0,   0,   2,   2,   2,   2,
-      2, 268,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0, 262,  26,  26,  26,   0, 269,  26,  26,   0,   0,   0,   0,
-    270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 271,   0,
-      0,   0, 272,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-    273, 273, 273, 273, 273, 274, 273, 273, 273, 273, 273, 274,   2,   2,   2,   2,
-     17,  17,  17,  17,  17,  17,  17,  17,  17,  17,  17,  17,  17,  17, 275, 276,
-    167, 167, 167, 167, 168, 169, 277, 277, 277, 277, 277, 277, 277, 278, 279, 278,
-    172, 172, 174,  26, 174, 174, 174, 174, 174, 174, 174, 174,  18,  18,  18,  18,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  26,  26,  26,  26,  26,  26,
-    280, 280, 280, 281, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 282,  26,
-    280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280,
-    280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 283,  26,  26,  26,   0, 284,
-    285,   0,   0,   0, 286, 287,   0, 288, 289, 290, 290, 290, 290, 290, 290, 290,
-    290, 290, 291, 292, 293, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 295,
-    296, 297, 297, 297, 297, 297, 298, 171, 171, 171, 171, 171, 171, 171, 171, 171,
-    171, 299,   0,   0, 297, 297, 297, 300,   0,   0,   0,   0, 284,  26, 294, 294,
-    171, 171, 171, 299,   0,   0,   0,   0,   0,   0,   0,   0, 171, 171, 171, 301,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 294, 294, 294, 294, 294, 302,
-    294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294,   0,   0,   0,   0,   0,
-    280, 280, 280, 280, 280, 280, 283,  26,   0,   0,   0,   0,   0,   0,   0,   0,
-    280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280,  26,  26,
-    303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303,
-    303, 304, 303, 303, 303, 303, 303, 303, 305,  26, 306, 306, 306, 306, 306, 306,
-    307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307,
-    307, 307, 307, 307, 307, 308,  26,  26,  18,  18,  18,  18,  18,  18,  18,  18,
-     18,  18,  18,  18, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309,  26,
-      0,   0,   0,   0, 310,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
-      2, 311,   2,   2,   2,   2,   2,   2, 312,  26,  26,  26,  26,  26, 313,   2,
-    314, 314, 314, 314, 314, 315,   0, 316, 317, 317, 317, 317, 317, 317, 317,  26,
-    318, 318, 318, 318, 318, 318, 318, 318, 319, 320, 318, 321,  54,  54,  54,  54,
-    322, 322, 322, 322, 322, 323, 324, 324, 324, 324, 325, 326, 171, 171, 171, 327,
-    328, 328, 328, 328, 328, 328, 328, 328, 328, 329, 328, 330, 166, 166, 166, 331,
-    332, 332, 332, 332, 332, 332, 333,  26, 332, 334, 332, 335, 166, 166, 166, 166,
-    336, 336, 336, 336, 336, 336, 336, 336, 337,  26,  26, 338, 339, 339, 340,  26,
-    341, 341, 341,  26, 174, 174,   2,   2,   2,   2,   2, 342, 343,  26, 178, 178,
-    178, 178, 178, 178, 178, 178, 178, 178, 339, 339, 339, 339, 339, 344, 339, 345,
-    171, 171, 171, 171, 346,  26, 171, 171, 299, 347, 171, 171, 171, 171, 171, 346,
-     26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
-    280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 283, 280, 280,
-    280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 348,  26,  26,  26,  26,
-    349,  26, 350, 351,  25,  25, 352, 353, 354,  25,  31,  31,  31,  31,  31,  31,
-     31,  31,  31,  31,  31,  31,  31,  31, 355,  26,  52,  31,  31,  31,  31,  31,
-     31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,
-     31,  31,  31,  31,  31,  31,  31, 356,  26,  26,  31,  31,  31,  31,  31,  31,
-     31,  31, 357,  31,  31,  31,  31,  31,  31,  26,  26,  26,  26,  26,  31,  51,
-      9,   9,   0, 316,   9, 358,   0,   0,   0,   0, 359,   0, 262, 284,  50,  31,
-     31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31, 360,
-    361,   0,   0,   0,   1,   2,   2,   3,   1,   2,   2,   3, 362, 294, 293, 294,
-    294, 294, 294, 363, 171, 171, 171, 299, 364, 364, 364, 365, 262, 262,  26, 366,
-    367, 368, 367, 367, 369, 367, 367, 370, 367, 371, 367, 371,  26,  26,  26,  26,
-    367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 372,
-    373,   0,   0,   0,   0,   0, 374,   0,  14,  14,  14,  14,  14,  14,  14,  14,
-     14, 257,   0, 284, 375,  26,  26,  26,  26,  26,   0,   0,   0,   0,   0, 376,
-    377, 377, 377, 378, 379, 379, 379, 379, 379, 379, 380,  26, 381,   0,   0, 284,
-    382, 382, 382, 382, 383, 384, 385, 385, 385, 386, 387, 387, 387, 387, 387, 388,
-    389, 389, 389, 390, 391, 391, 391, 391, 392, 391, 393,  26,  26,  26,  26,  26,
-    394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 395, 395, 395, 395, 395, 395,
-    396, 396, 396, 397, 396, 398, 399, 399, 399, 399, 400, 399, 399, 399, 399, 400,
-    401, 401, 401, 401, 401,  26, 402, 402, 402, 402, 402, 402, 403, 404,  26,  26,
-    405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405,
-    405, 405, 405, 405, 405, 405, 406,  26, 405, 405, 407,  26, 405,  26,  26,  26,
-    408, 409, 410, 410, 410, 410, 411, 412, 413, 413, 414, 413, 415, 415, 415, 415,
-    416, 416, 416, 417, 418, 416,  26,  26,  26,  26,  26,  26, 419, 419, 420, 421,
-    422, 422, 422, 423, 424, 424, 424, 425,  26,  26,  26,  26,  26,  26,  26,  26,
-    426, 426, 426, 426, 427, 427, 427, 428, 427, 427, 429, 427, 427, 427, 427, 427,
-    430, 431, 432, 433, 434, 434, 435, 436, 434, 437, 434, 437, 438, 438, 438, 438,
-    439, 439, 439, 439,  26,  26,  26,  26, 440, 440, 440, 440, 441, 442, 441,  26,
-    443, 443, 443, 443, 443, 443, 444, 445, 446, 446, 447, 446, 448, 448, 449, 448,
-    450, 450, 451, 452,  26, 453,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
-    454, 454, 454, 454, 454, 454, 454, 454, 454, 455,  26,  26,  26,  26,  26,  26,
-    456, 456, 456, 456, 456, 456, 457,  26, 456, 456, 456, 456, 456, 456, 457, 458,
-    459, 459, 459, 459, 459,  26, 459, 460,  26,  26,  26,  26,  26,  26,  26,  26,
-     26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  31,  31,  31, 461,
-    462, 462, 462, 462, 462,  26, 463, 463, 463, 463, 463, 464,  26,  26,  26,  26,
-     26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26, 465, 465, 466,  26,
-    467, 467, 467, 467, 467, 467, 467, 467, 467, 468, 469, 467, 467, 467,  26, 470,
-    471, 471, 471, 471, 471, 471, 471, 471, 472, 473, 474, 474, 474, 475, 474, 476,
-    477, 477, 477, 477, 477, 477, 478, 477, 479,  26, 480, 480, 480, 480, 481,  26,
-    482, 482, 482, 482, 482, 482, 482, 482, 482, 483, 482, 482, 484, 140, 485,  26,
-    486, 486, 487, 486, 486, 486, 486, 488,  26,  26,  26,  26,  26,  26,  26,  26,
-    489, 490, 491, 492, 491, 493, 494, 494, 494, 494, 494, 494, 494, 495, 494, 496,
-    497, 498, 499, 500, 500, 501, 502, 503, 498, 504, 505, 506, 507, 508, 508,  26,
-    509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 510,  26,  26,  26,  26,
-    511, 511, 511, 511, 511, 511, 511, 511, 511,  26, 511, 512,  26,  26,  26,  26,
-    513, 513, 513, 513, 513, 513, 514, 513, 513, 513, 513, 514,  26,  26,  26,  26,
-    515, 515, 515, 515, 515, 515, 515, 515, 516,  26, 515, 517, 201, 518,  26,  26,
-    519, 519, 519, 519, 519, 519, 519, 520, 519, 521,  26,  26,  26,  26,  26,  26,
-    522, 522, 522, 523, 522, 524, 522, 522,  26,  26,  26,  26,  26,  26,  26,  26,
-    525, 525, 525, 525, 525, 525, 525, 526,  26,  26,  26,  26,  26,  26,  26,  26,
-     26,  26,  26,  26, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 528, 529,
-     26,  26,  26,  26, 530, 531, 530, 530, 530, 530, 530, 531, 532,  26,  26,  26,
-    533, 533, 533, 533, 533, 533, 533, 533, 533,  26, 534, 534, 534, 534, 534, 534,
-    534, 534, 534, 534, 535,  26,  26,  26, 536, 536, 536, 536, 536, 536, 536, 537,
-    538, 539, 538, 538, 538, 538, 540, 538, 541,  26, 538, 538, 538, 542, 543, 543,
-    543, 543, 544, 543, 543, 545, 546,  26,  26,  26,  26,  26,  26,  26,  26,  26,
-    547, 548, 549, 549, 549, 549, 547, 550, 549,  26, 549, 551, 552, 553, 554, 554,
-    554, 555, 556, 557, 554, 558,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
-     26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26, 559, 559, 559, 560,
-     26,  26,  26,  26,  26,  26,  26,  26, 109, 109, 109, 109, 109, 109, 561, 562,
-    563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563,
-    563, 563, 563, 564,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
-    563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 565, 566,  26,
-    563, 563, 563, 563, 563, 563, 563, 563, 567,  26,  26,  26,  26,  26,  26,  26,
-    568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568,
-    568, 568, 568, 568, 568, 569, 568, 570,  26,  26,  26,  26,  26,  26,  26,  26,
-    571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571,
-    571, 571, 571, 571, 571, 571, 571, 571, 572,  26,  26,  26,  26,  26,  26,  26,
-    309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309,
-    309, 309, 309, 309, 309, 309, 309, 573, 574, 574, 574, 575, 574, 576,  26,  26,
-     26,  26,  26,  26,  26,  26,  26,  26,  26,  26, 577, 577, 577, 578, 578,  26,
-    579, 579, 579, 579, 579, 579, 579, 579, 580,  26, 579, 581, 581, 579, 579, 582,
-    579, 579,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
-     26,  26,  26,  26,  26,  26,  26,  26, 583, 583, 583, 583, 583, 583, 583, 583,
-    583, 583, 583, 584,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
-    585, 585, 585, 585, 585, 585, 585, 585, 585, 586, 585, 585, 585, 585, 585, 585,
-    585, 587, 585, 585,  26,  26,  26,  26,  26,  26,  26,  26, 588,  26,  26,  26,
-    589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589,
-    589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589,  26,
-    589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 590,  26,
-    591, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290,
-    290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290,
-    290, 290, 290, 291,  26,  26,  26,  26,  26,  26, 592,  26, 593,  26, 594, 594,
-    594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594,
-    594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 595,
-    596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 597, 596, 598,
-    596, 599, 596, 600, 284,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 272,  26,
-      0,   0,   0,   0, 262, 361,   0,   0,   0,   0,   0,   0, 601, 602,   0, 603,
-    604, 605,   0,   0,   0, 606,   0,   0,   0,   0,   0,   0,   0, 607,  26,  26,
-     14,  14,  14,  14,  14,  14,  14,  14, 251,  26,  26,  26,  26,  26,  26,  26,
-     26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,   0,   0, 284,  26,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 262,  26,   0,   0,   0, 607,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 259,   0,   0,   0,   0,   0,
-      0,   0,   0, 259, 608, 609,   0, 610, 611,   0,   0,   0,   0,   0,   0,   0,
-    612, 613, 259, 259,   0,   0,   0, 614, 615, 616, 617,   0,   0,   0,   0,   0,
-      0,   0,   0,   0, 272,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0, 271,   0,   0,   0,   0,   0,   0,
-    618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618,
-    618, 619,  26, 620, 621, 618,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
-    274, 273, 273, 622, 623, 624,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
-    625, 625, 625, 625, 625, 626, 625, 627, 625, 628,  26,  26,  26,  26,  26,  26,
-     26,  26,  26,  26,  26,  26,  26,  26, 629, 629, 629, 629, 629, 629, 629, 630,
-    631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631,
-    631, 631, 631, 631, 631, 631, 631, 631, 632, 631, 633,  26,  26,  26,  26,  26,
-    634, 634, 634, 634, 634, 634, 634, 634, 634, 635, 634, 636,  26,  26,  26,  26,
-     26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26, 361,   0,
-      0,   0,   0,   0,   0,   0, 637,  26,  26,  26,  26,  26,  26,  26,  26,  26,
-    361,   0,   0,   0,   0,   0,   0, 272,  26,  26,  26,  26,  26,  26,  26,  26,
-    638,  31,  31,  31, 639, 640, 641, 642, 643, 644, 639, 645, 639, 641, 641, 646,
-     31, 647,  31, 648, 649, 647,  31, 648,  26,  26,  26,  26,  26,  26, 355,  26,
-      0,   0,   0,   0,   0, 284,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0, 284,  26,   0, 262, 361,   0, 361,   0, 361,   0,   0,   0, 272,  26,
-      0, 637,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 637,   0,   0,
-      0,   0,   0,   0,   0, 637,  26,  26,  26,  26,  26,  26, 650,   0,   0,   0,
-    651,  26,   0,   0,   0,   0,   0, 284,   0, 607, 316,  26, 272,  26,  26,  26,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 272,  26,   0, 637,   0, 269,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 284,  26,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 607,   0, 284,  26,  26,
-      0, 284,   0,   0,   0,   0,   0,   0,   0,  26,   0, 316,   0,   0,   0,   0,
-      0,  26,   0,   0,   0, 272,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
-      0, 611,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 614, 616,
-      0,   0,   0,   0, 613, 652,   0,   0,   0, 613,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 284,  26,   0, 272, 284, 269,
-    269,  26, 272,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
-    280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 653,  26,  26,  26,  26,  26,
-    280, 280, 280, 280, 280, 280, 654,  26, 280, 280, 280, 280, 280, 280, 280, 280,
-    280, 280, 280, 283, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280,
-    280, 280, 280, 280, 348,  26, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280,
-    280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 655,  26,  26,  26,
-    280, 280, 280, 283,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
-    656,  26,  26,  26,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,
-      9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,  26,  26,
-};
+    v = re_alphanumeric_table_1[field_2];
+    v = re_alphanumeric_table_2[(v << 5) | field_1];
+    v = re_alphanumeric_table_3[(v << 2) | field_0];
 
-static RE_UINT8 re_script_stage_4[] = {
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   2,   2,   2,   2,   2,   2,   2,
-      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   1,   1,   1,   1,   1,
-      1,   1,   2,   1,   1,   1,   1,   1,   2,   2,   2,   2,   2,   2,   2,   1,
-      2,   1,   1,   1,   1,   1,   1,   1,   2,   2,   2,   2,   2,   1,   1,   1,
-      1,   1,  35,  35,   1,   1,   1,   1,  41,  41,  41,  41,  41,  41,  41,  41,
-      3,   3,   3,   3,   1,   3,   3,   3,   0,   0,   3,   3,   3,   3,   1,   3,
-      0,   0,   0,   0,   3,   1,   3,   1,   3,   3,   3,   0,   3,   0,   3,   3,
-      3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   0,   3,   3,   3,   3,   3,
-      3,   3,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,
-      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,  41,  41,   4,
-      0,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
-      5,   5,   5,   5,   5,   5,   5,   0,   5,   1,   5,   0,   0,   5,   5,   5,
-      0,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,
-      0,   0,   0,   0,   0,   0,   0,   0,   6,   6,   6,   0,   0,   0,   0,   6,
-      6,   6,   6,   6,   6,   0,   0,   0,   7,   7,   7,   7,   7,   1,   7,   7,
-      7,   7,   7,   7,   1,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
-      7,   7,   7,   1,   7,   0,   7,   1,   1,   7,   7,   7,   7,   7,   7,   7,
-      7,   7,   7,  41,  41,  41,  41,  41,  41,  41,  41,  41,  41,  41,   7,   7,
-     41,   7,   7,   7,   7,   7,   7,   7,   8,   8,   8,   8,   8,   8,   8,   8,
-      8,   8,   8,   8,   8,   8,   0,   8,   8,   8,   8,   0,   0,   8,   8,   8,
-      9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   0,   0,   0,   0,   0,   0,
-     66,  66,  66,  66,  66,  66,  66,  66,  66,  66,  66,   0,   0,  66,  66,  66,
-     82,  82,  82,  82,  82,  82,  82,  82,  82,  82,  82,  82,  82,  82,   0,   0,
-     82,  82,  82,  82,  82,  82,  82,   0,  95,  95,  95,  95,  95,  95,  95,  95,
-     95,  95,  95,  95,   0,   0,  95,   0,   8,   8,   8,   0,   0,   0,   0,   0,
-      7,   7,   7,   7,   7,   0,   7,   7,   7,   7,   7,   7,   7,   7,   0,   0,
-      0,   0,   0,   7,   7,   7,   7,   7,   7,   7,   1,   7,   7,   7,   7,   7,
-     10,  10,  10,  10,  10,  10,  10,  10,  10,  41,  41,  41,  41,  10,  10,  10,
-     10,  10,  10,  10,   1,   1,  10,  10,  11,  11,  11,  11,   0,  11,  11,  11,
-     11,  11,  11,  11,  11,   0,   0,  11,  11,   0,   0,  11,  11,  11,  11,  11,
-     11,  11,  11,  11,  11,  11,  11,  11,  11,   0,  11,  11,  11,  11,  11,  11,
-     11,   0,  11,   0,   0,   0,  11,  11,  11,  11,   0,   0,  11,  11,  11,  11,
-     11,   0,   0,  11,  11,  11,  11,   0,   0,   0,   0,   0,   0,   0,   0,  11,
-      0,   0,   0,   0,  11,  11,   0,  11,  11,  11,  11,  11,   0,   0,  11,  11,
-     11,  11,  11,  11,  11,  11,  11,   0,   0,  12,  12,  12,   0,  12,  12,  12,
-     12,  12,  12,   0,   0,   0,   0,  12,  12,   0,   0,  12,  12,  12,  12,  12,
-     12,  12,  12,  12,  12,  12,  12,  12,  12,   0,  12,  12,  12,  12,  12,  12,
-     12,   0,  12,  12,   0,  12,  12,   0,  12,  12,   0,   0,  12,   0,  12,  12,
-     12,   0,   0,  12,  12,  12,   0,   0,   0,  12,   0,   0,   0,   0,   0,   0,
-      0,  12,  12,  12,  12,   0,  12,   0,   0,   0,   0,   0,   0,   0,  12,  12,
-     12,  12,  12,  12,  12,  12,  12,   0,   0,  13,  13,  13,   0,  13,  13,  13,
-     13,  13,  13,  13,  13,  13,   0,  13,  13,  13,   0,  13,  13,  13,  13,  13,
-     13,  13,  13,  13,  13,  13,  13,  13,  13,   0,  13,  13,  13,  13,  13,  13,
-     13,   0,  13,  13,   0,  13,  13,  13,  13,  13,   0,   0,  13,  13,  13,  13,
-     13,  13,   0,  13,  13,  13,   0,   0,  13,   0,   0,   0,   0,   0,   0,   0,
-     13,  13,  13,  13,   0,   0,  13,  13,  13,  13,   0,   0,   0,   0,   0,   0,
-      0,  13,  13,  13,  13,  13,  13,  13,   0,  14,  14,  14,   0,  14,  14,  14,
-     14,  14,  14,  14,  14,   0,   0,  14,  14,   0,   0,  14,  14,  14,  14,  14,
-     14,  14,  14,  14,  14,  14,  14,  14,  14,   0,  14,  14,  14,  14,  14,  14,
-     14,   0,  14,  14,   0,  14,  14,  14,  14,  14,   0,   0,  14,  14,  14,  14,
-     14,   0,   0,  14,  14,  14,   0,   0,   0,   0,   0,   0,   0,   0,  14,  14,
-      0,   0,   0,   0,  14,  14,   0,  14,  14,  14,  14,  14,   0,   0,  14,  14,
-      0,   0,  15,  15,   0,  15,  15,  15,  15,  15,  15,   0,   0,   0,  15,  15,
-     15,   0,  15,  15,  15,  15,   0,   0,   0,  15,  15,   0,  15,   0,  15,  15,
-      0,   0,   0,  15,  15,   0,   0,   0,  15,  15,  15,  15,  15,  15,  15,  15,
-     15,  15,   0,   0,   0,   0,  15,  15,  15,   0,   0,   0,   0,   0,   0,  15,
-      0,   0,   0,   0,   0,   0,  15,  15,  15,  15,  15,   0,   0,   0,   0,   0,
-     16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,   0,  16,  16,
-     16,   0,  16,  16,  16,  16,  16,  16,  16,  16,   0,   0,   0,  16,  16,  16,
-     16,   0,  16,  16,  16,  16,   0,   0,   0,   0,   0,   0,   0,  16,  16,   0,
-     16,  16,  16,   0,   0,   0,   0,   0,  16,  16,  16,  16,   0,   0,  16,  16,
-      0,   0,   0,   0,   0,   0,   0,  16,  17,  17,  17,  17,  17,  17,  17,  17,
-     17,  17,  17,  17,  17,   0,  17,  17,  17,   0,  17,  17,  17,  17,  17,  17,
-     17,  17,  17,  17,   0,  17,  17,  17,  17,  17,   0,   0,  17,  17,  17,  17,
-     17,   0,  17,  17,  17,  17,   0,   0,   0,   0,   0,   0,   0,  17,  17,   0,
-      0,   0,   0,   0,   0,   0,  17,   0,  17,  17,  17,  17,   0,   0,  17,  17,
-      0,  17,  17,   0,   0,   0,   0,   0,  18,  18,  18,  18,   0,  18,  18,  18,
-     18,  18,  18,  18,  18,   0,  18,  18,  18,   0,  18,  18,  18,  18,  18,  18,
-     18,  18,  18,  18,  18,  18,  18,  18,   0,   0,   0,   0,  18,  18,  18,  18,
-     18,  18,  18,  18,   0,   0,  18,  18,   0,   0,  19,  19,   0,  19,  19,  19,
-     19,  19,  19,  19,  19,  19,  19,  19,  19,  19,  19,  19,  19,  19,  19,   0,
-      0,   0,  19,  19,  19,  19,  19,  19,  19,  19,   0,  19,  19,  19,  19,  19,
-     19,  19,  19,  19,   0,  19,   0,   0,   0,   0,  19,   0,   0,   0,   0,  19,
-     19,  19,  19,  19,  19,   0,  19,   0,   0,   0,   0,   0,   0,   0,  19,  19,
-      0,   0,  19,  19,  19,   0,   0,   0,   0,  20,  20,  20,  20,  20,  20,  20,
-     20,  20,  20,  20,  20,  20,  20,  20,  20,  20,  20,   0,   0,   0,   0,   1,
-     20,  20,  20,  20,   0,   0,   0,   0,   0,  21,  21,   0,  21,   0,  21,  21,
-     21,  21,  21,   0,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,
-     21,  21,  21,  21,   0,  21,   0,  21,  21,  21,  21,  21,  21,  21,   0,   0,
-     21,  21,  21,  21,  21,   0,  21,   0,  21,  21,   0,   0,  21,  21,  21,  21,
-     22,  22,  22,  22,  22,  22,  22,  22,   0,  22,  22,  22,  22,  22,  22,  22,
-     22,  22,  22,  22,  22,   0,   0,   0,  22,  22,  22,  22,  22,   0,  22,  22,
-     22,  22,  22,  22,  22,   1,   1,   1,   1,  22,  22,   0,   0,   0,   0,   0,
-     23,  23,  23,  23,  23,  23,  23,  23,  24,  24,  24,  24,  24,  24,  24,  24,
-     24,  24,  24,  24,  24,  24,   0,  24,   0,   0,   0,   0,   0,  24,   0,   0,
-     24,  24,  24,   1,  24,  24,  24,  24,  25,  25,  25,  25,  25,  25,  25,  25,
-     26,  26,  26,  26,  26,  26,  26,  26,  26,   0,  26,  26,  26,  26,   0,   0,
-     26,  26,  26,  26,  26,  26,  26,   0,  26,  26,  26,   0,   0,  26,  26,  26,
-     26,  26,  26,  26,  26,   0,   0,   0,  26,  26,   0,   0,   0,   0,   0,   0,
-     27,  27,  27,  27,  27,  27,  27,  27,  27,  27,  27,  27,  27,  27,   0,   0,
-     28,  28,  28,  28,  28,  28,  28,  28,  29,  29,  29,  29,  29,  29,  29,  29,
-     29,  29,  29,  29,  29,   0,   0,   0,  30,  30,  30,  30,  30,  30,  30,  30,
-     30,  30,  30,   1,   1,   1,  30,  30,  30,   0,   0,   0,   0,   0,   0,   0,
-     42,  42,  42,  42,  42,  42,  42,  42,  42,  42,  42,  42,  42,   0,  42,  42,
-     42,  42,  42,  42,  42,   0,   0,   0,  43,  43,  43,  43,  43,  43,  43,  43,
-     43,  43,  43,  43,  43,   1,   1,   0,  44,  44,  44,  44,  44,  44,  44,  44,
-     44,  44,  44,  44,   0,   0,   0,   0,  45,  45,  45,  45,  45,  45,  45,  45,
-     45,  45,  45,  45,  45,   0,  45,  45,  45,   0,  45,  45,   0,   0,   0,   0,
-     31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,   0,   0,
-     31,  31,   0,   0,   0,   0,   0,   0,  32,  32,   1,   1,  32,   1,  32,  32,
-     32,  32,  32,  32,  32,  32,  32,   0,  32,  32,  32,  32,  32,  32,  32,  32,
-     32,  32,   0,   0,   0,   0,   0,   0,  32,   0,   0,   0,   0,   0,   0,   0,
-     32,  32,  32,   0,   0,   0,   0,   0,  28,  28,  28,  28,  28,  28,   0,   0,
-     46,  46,  46,  46,  46,  46,  46,  46,  46,  46,  46,  46,  46,  46,  46,   0,
-     46,  46,  46,  46,   0,   0,   0,   0,  46,   0,   0,   0,  46,  46,  46,  46,
-     47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,   0,   0,
-     47,  47,  47,  47,  47,   0,   0,   0,  56,  56,  56,  56,  56,  56,  56,  56,
-     56,  56,  56,  56,   0,   0,   0,   0,  56,  56,   0,   0,   0,   0,   0,   0,
-     56,  56,  56,   0,   0,   0,  56,  56,  54,  54,  54,  54,  54,  54,  54,  54,
-     54,  54,  54,  54,   0,   0,  54,  54,  78,  78,  78,  78,  78,  78,  78,  78,
-     78,  78,  78,  78,  78,  78,  78,   0,  78,  78,  78,  78,  78,   0,   0,  78,
-     78,  78,   0,   0,   0,   0,   0,   0,  78,  78,  78,  78,  78,  78,   0,   0,
-     41,  41,  41,  41,  41,  41,  41,   0,  62,  62,  62,  62,  62,  62,  62,  62,
-     62,  62,  62,  62,   0,   0,   0,   0,  62,  62,  62,  62,  62,   0,   0,   0,
-     67,  67,  67,  67,  67,  67,  67,  67,  93,  93,  93,  93,  93,  93,  93,  93,
-     93,  93,  93,  93,   0,   0,   0,   0,   0,   0,   0,   0,  93,  93,  93,  93,
-     68,  68,  68,  68,  68,  68,  68,  68,   0,   0,   0,  68,  68,  68,  68,  68,
-     68,  68,   0,   0,   0,  68,  68,  68,  69,  69,  69,  69,  69,  69,  69,  69,
-      4,   0,   0,   0,   0,   0,   0,   0,  24,  24,  24,   0,   0,  24,  24,  24,
-     41,  41,  41,   1,  41,  41,  41,  41,  41,   1,  41,  41,  41,  41,  41,  41,
-     41,   1,   1,   1,   1,  41,   1,   1,   1,   1,   1,   1,  41,   1,   1,   1,
-     41,  41,   1,   0,   0,   0,   0,   0,   2,   2,   2,   2,   2,   2,   3,   3,
-      3,   3,   3,   4,   2,   2,   2,   2,   2,   2,   2,   2,   2,   3,   3,   3,
-      3,   3,   2,   2,   2,   2,   3,   3,   3,   3,   3,   2,   2,   2,   2,   2,
-      4,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   3,
-     41,  41,   0,  41,  41,  41,  41,  41,   3,   3,   3,   3,   3,   3,   0,   0,
-      0,   3,   0,   3,   0,   3,   0,   3,   3,   3,   3,   3,   3,   0,   3,   3,
-      3,   3,   3,   3,   0,   0,   3,   3,   3,   3,   3,   3,   0,   3,   3,   3,
-      0,   0,   3,   3,   3,   0,   3,   3,   3,   3,   3,   3,   3,   3,   3,   0,
-      1,   1,   1,   1,  41,  41,   1,   1,   1,   1,   1,   1,   1,   0,   1,   1,
-      1,   2,   0,   0,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   2,
-      1,   1,   1,   1,   1,   1,   1,   0,   2,   2,   2,   2,   2,   0,   0,   0,
-     41,   0,   0,   0,   0,   0,   0,   0,   1,   1,   1,   1,   1,   1,   3,   1,
-      1,   1,   2,   2,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   2,   1,
-      2,   1,   1,   1,   0,   0,   0,   0,   1,   1,   1,   0,   0,   0,   0,   0,
-     53,  53,  53,  53,  53,  53,  53,  53,   1,   1,   1,   1,   0,   0,   1,   1,
-      1,   1,   1,   1,   1,   1,   0,   0,  57,  57,  57,  57,  57,  57,  57,  57,
-     57,  57,  57,  57,  57,  57,  57,   0,  55,  55,  55,  55,   0,   0,   0,   0,
-      0,  55,  55,  55,  55,  55,  55,  55,  58,  58,  58,  58,  58,  58,  58,  58,
-      0,   0,   0,   0,   0,   0,   0,  58,  58,   0,   0,   0,   0,   0,   0,   0,
-     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,   0,  36,  36,  36,  36,  36,
-     36,  36,  36,  36,   0,   0,   0,   0,  36,  36,  36,  36,  36,  36,   0,   0,
-      1,   1,   1,   1,   0,   0,   0,   0,   1,   1,   1,   1,   1,  36,   1,  36,
-      1,  36,  36,  36,  36,  36,  36,  36,  36,  36,  41,  41,  41,  41,  25,  25,
-     36,  36,  36,  36,   1,   1,   1,   1,   0,  33,  33,  33,  33,  33,  33,  33,
-     33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,   0,
-      0,  41,  41,   1,   1,  33,  33,  33,   1,  34,  34,  34,  34,  34,  34,  34,
-     34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,   1,   1,  34,  34,  34,
-      0,   0,   0,   0,   0,  35,  35,  35,  35,  35,  35,  35,  35,  35,  35,  35,
-      0,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,   0,
-     35,  35,  35,   0,   0,   0,   0,   0,  25,  25,  25,  25,  25,  25,  25,   1,
-     34,  34,  34,  34,  34,  34,  34,   1,  37,  37,  37,  37,  37,  37,  37,  37,
-     37,  37,  37,  37,  37,   0,   0,   0,  37,  37,  37,  37,  37,  37,  37,   0,
-     83,  83,  83,  83,  83,  83,  83,  83,  70,  70,  70,  70,  70,  70,  70,  70,
-     70,  70,  70,  70,   0,   0,   0,   0,  84,  84,  84,  84,  84,  84,  84,  84,
-      1,   1,   2,   2,   2,   2,   2,   2,   1,   1,   1,   2,   2,   2,   2,   2,
-      0,   0,   2,   2,   2,   2,   2,   0,   0,   0,   0,   0,   0,   0,   0,   2,
-     59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,   0,   0,   0,   0,
-      1,   1,   0,   0,   0,   0,   0,   0,  65,  65,  65,  65,  65,  65,  65,  65,
-     71,  71,  71,  71,  71,  71,  71,  71,  71,  71,  71,  71,  71,  71,   0,   0,
-      0,   0,   0,   0,   0,   0,  71,  71,  71,  71,   0,   0,   0,   0,   0,   0,
-     72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,   1,  72,
-     73,  73,  73,  73,  73,  73,  73,  73,  73,  73,  73,  73,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,  73,  25,  25,  25,  25,  25,   0,   0,   0,
-     85,  85,  85,  85,  85,  85,  85,  85,  85,  85,  85,  85,  85,  85,   0,   1,
-     85,  85,   0,   0,   0,   0,  85,  85,  23,  23,  23,  23,  23,  23,  23,   0,
-     77,  77,  77,  77,  77,  77,  77,  77,  77,  77,  77,  77,  77,  77,  77,   0,
-     77,  77,  77,  77,  77,  77,   0,   0,  77,  77,   0,   0,  77,  77,  77,  77,
-     79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,   0,   0,   0,   0,   0,
-      0,   0,   0,  79,  79,  79,  79,  79,  86,  86,  86,  86,  86,  86,  86,  86,
-     86,  86,  86,  86,  86,  86,  86,   0,   0,  26,  26,  26,  26,  26,  26,   0,
-      2,   2,   2,   1,   2,   2,   2,   2,   2,   2,   2,   2,   2,   3,   2,   2,
-     86,  86,  86,  86,  86,  86,   0,   0,  86,  86,   0,   0,   0,   0,   0,   0,
-     25,  25,  25,  25,   0,   0,   0,   0,   0,   0,   0,  25,  25,  25,  25,  25,
-     36,  36,   0,   0,   0,   0,   0,   0,   2,   2,   2,   2,   2,   2,   2,   0,
-      0,   0,   0,   5,   5,   5,   5,   5,   0,   0,   0,   0,   0,   6,   6,   6,
-      6,   6,   6,   6,   6,   6,   6,   0,   6,   6,   6,   6,   6,   0,   6,   0,
-      6,   6,   0,   6,   6,   0,   6,   6,   7,   7,   0,   0,   0,   0,   0,   0,
-      7,   7,   7,   7,   7,   7,   1,   1,   0,   0,   7,   7,   7,   7,   7,   7,
-     41,  41,  41,  41,  41,  41,   4,   4,   1,   1,   1,   0,   1,   1,   1,   1,
-      7,   7,   7,   7,   7,   0,   0,   1,   0,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,  34,  34,  34,  34,  34,  34,  34,  34,   1,   1,
-      0,   0,  25,  25,  25,  25,  25,  25,   0,   0,  25,  25,  25,   0,   0,   0,
-      0,   1,   1,   1,   1,   1,   0,   0,  48,  48,  48,  48,  48,  48,  48,  48,
-     48,  48,  48,  48,   0,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,   0,
-     48,  48,  48,   0,  48,  48,   0,  48,  48,  48,  48,  48,  48,  48,   0,   0,
-     48,  48,  48,   0,   0,   0,   0,   0,   1,   1,   1,   0,   0,   0,   0,   1,
-      1,   1,   1,   1,   0,   0,   0,   1,   3,   0,   0,   0,   0,   0,   0,   0,
-      1,   1,   1,   1,   1,  41,   0,   0,  74,  74,  74,  74,  74,  74,  74,  74,
-     74,  74,  74,  74,  74,   0,   0,   0,  75,  75,  75,  75,  75,  75,  75,  75,
-     75,   0,   0,   0,   0,   0,   0,   0,  41,   1,   1,   1,   1,   1,   1,   1,
-     38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,  38,  38,  38,  39,  39,  39,  39,  39,  39,  39,  39,
-     39,  39,  39,   0,   0,   0,   0,   0, 120, 120, 120, 120, 120, 120, 120, 120,
-    120, 120, 120,   0,   0,   0,   0,   0,  49,  49,  49,  49,  49,  49,  49,  49,
-     49,  49,  49,  49,  49,  49,   0,  49,  60,  60,  60,  60,  60,  60,  60,  60,
-     60,  60,  60,  60,   0,   0,   0,   0,  60,  60,  60,  60,  60,  60,   0,   0,
-     40,  40,  40,  40,  40,  40,  40,  40,  50,  50,  50,  50,  50,  50,  50,  50,
-     51,  51,  51,  51,  51,  51,  51,  51,  51,  51,  51,  51,  51,  51,   0,   0,
-     51,  51,   0,   0,   0,   0,   0,   0, 136, 136, 136, 136, 136, 136, 136, 136,
-    136, 136, 136, 136,   0,   0,   0,   0, 106, 106, 106, 106, 106, 106, 106, 106,
-    103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0, 103, 110, 110, 110, 110, 110, 110, 110, 110,
-    110, 110, 110, 110, 110, 110, 110,   0, 110, 110, 110, 110, 110, 110,   0,   0,
-     52,  52,  52,  52,  52,  52,   0,   0,  52,   0,  52,  52,  52,  52,  52,  52,
-     52,  52,  52,  52,  52,  52,  52,  52,  52,  52,  52,  52,  52,  52,   0,  52,
-     52,   0,   0,   0,  52,   0,   0,  52,  87,  87,  87,  87,  87,  87,  87,  87,
-     87,  87,  87,  87,  87,  87,   0,  87, 118, 118, 118, 118, 118, 118, 118, 118,
-    117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117,   0,
-      0,   0,   0,   0,   0,   0,   0, 117, 128, 128, 128, 128, 128, 128, 128, 128,
-    128, 128, 128,   0, 128, 128,   0,   0,   0,   0,   0, 128, 128, 128, 128, 128,
-     64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,   0,   0,   0,  64,
-     76,  76,  76,  76,  76,  76,  76,  76,  76,  76,   0,   0,   0,   0,   0,  76,
-     98,  98,  98,  98,  98,  98,  98,  98,  97,  97,  97,  97,  97,  97,  97,  97,
-      0,   0,   0,   0,  97,  97,  97,  97,   0,   0,  97,  97,  97,  97,  97,  97,
-     61,  61,  61,  61,   0,  61,  61,   0,   0,   0,   0,   0,  61,  61,  61,  61,
-     61,  61,  61,  61,   0,  61,  61,  61,   0,  61,  61,  61,  61,  61,  61,  61,
-     61,  61,  61,  61,  61,  61,  61,  61,  61,  61,  61,  61,  61,  61,   0,   0,
-     61,  61,  61,   0,   0,   0,   0,  61,  61,   0,   0,   0,   0,   0,   0,   0,
-     88,  88,  88,  88,  88,  88,  88,  88, 116, 116, 116, 116, 116, 116, 116, 116,
-    112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112,   0,
-      0,   0,   0, 112, 112, 112, 112, 112,  80,  80,  80,  80,  80,  80,  80,  80,
-     80,  80,  80,  80,  80,  80,   0,   0,   0,  80,  80,  80,  80,  80,  80,  80,
-     89,  89,  89,  89,  89,  89,  89,  89,  89,  89,  89,  89,  89,  89,   0,   0,
-     90,  90,  90,  90,  90,  90,  90,  90,  90,  90,  90,   0,   0,   0,   0,   0,
-    121, 121, 121, 121, 121, 121, 121, 121, 121, 121,   0,   0,   0,   0,   0,   0,
-      0, 121, 121, 121, 121,   0,   0,   0,   0, 121, 121, 121, 121, 121, 121, 121,
-     91,  91,  91,  91,  91,  91,  91,  91,  91,   0,   0,   0,   0,   0,   0,   0,
-    130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130,   0,   0,   0,   0,   0,
-      0,   0, 130, 130, 130, 130, 130, 130, 146, 146, 146, 146, 146, 146, 146, 146,
-    146, 146,   0,   0,   0,   0,   0,   0,   7,   7,   7,   7,   7,   7,   7,   0,
-    148, 148, 148, 148, 148, 148, 148, 148, 147, 147, 147, 147, 147, 147, 147, 147,
-    147, 147,   0,   0,   0,   0,   0,   0, 149, 149, 149, 149, 149, 149, 149, 149,
-    149, 149, 149, 149, 149, 149, 149,   0,  94,  94,  94,  94,  94,  94,  94,  94,
-     94,  94,  94,  94,  94,  94,   0,   0,   0,   0,  94,  94,  94,  94,  94,  94,
-      0,   0,   0,   0,   0,   0,   0,  94,  92,  92,  92,  92,  92,  92,  92,  92,
-     92,  92,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  92,   0,   0,
-    101, 101, 101, 101, 101, 101, 101, 101, 101,   0,   0,   0,   0,   0,   0,   0,
-    101, 101,   0,   0,   0,   0,   0,   0,  96,  96,  96,  96,  96,  96,  96,  96,
-     96,  96,  96,  96,  96,   0,  96,  96,  96,  96,  96,  96,  96,  96,  96,   0,
-    111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111,   0,
-    100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100,   0,   0,
-      0,  19,  19,  19,  19,  19,  19,  19,  19,  19,  19,  19,  19,   0,   0,   0,
-    109, 109, 109, 109, 109, 109, 109, 109, 109, 109,   0, 109, 109, 109, 109, 109,
-    109, 109, 109, 109, 109, 109, 109,   0, 129, 129, 129, 129, 129, 129, 129,   0,
-    129,   0, 129, 129, 129, 129,   0, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-    129, 129, 129, 129, 129, 129,   0, 129, 129, 129,   0,   0,   0,   0,   0,   0,
-    123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123,   0,   0,   0,   0,   0,
-    123, 123,   0,   0,   0,   0,   0,   0, 107, 107, 107, 107,   0, 107, 107, 107,
-    107, 107, 107, 107, 107,   0,   0, 107, 107,   0,   0, 107, 107, 107, 107, 107,
-    107, 107, 107, 107, 107, 107, 107, 107, 107,   0, 107, 107, 107, 107, 107, 107,
-    107,   0, 107, 107,   0, 107, 107, 107, 107, 107,   0,  41, 107, 107, 107, 107,
-    107,   0,   0, 107, 107, 107,   0,   0, 107,   0,   0,   0,   0,   0,   0, 107,
-      0,   0,   0,   0,   0, 107, 107, 107, 107, 107, 107, 107,   0,   0, 107, 107,
-    107, 107, 107, 107, 107,   0,   0,   0, 135, 135, 135, 135, 135, 135, 135, 135,
-    135, 135,   0, 135,   0, 135, 135, 135, 124, 124, 124, 124, 124, 124, 124, 124,
-    124, 124,   0,   0,   0,   0,   0,   0, 122, 122, 122, 122, 122, 122, 122, 122,
-    122, 122, 122, 122, 122, 122,   0,   0, 114, 114, 114, 114, 114, 114, 114, 114,
-    114, 114, 114, 114, 114,   0,   0,   0, 114, 114,   0,   0,   0,   0,   0,   0,
-     32,  32,  32,  32,  32,   0,   0,   0, 102, 102, 102, 102, 102, 102, 102, 102,
-    102,   0,   0,   0,   0,   0,   0,   0, 102, 102,   0,   0,   0,   0,   0,   0,
-    126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126,   0,   0, 126, 126, 126,
-    126, 126, 126, 126,   0,   0,   0,   0, 142, 142, 142, 142, 142, 142, 142, 142,
-    142, 142, 142, 142,   0,   0,   0,   0, 125, 125, 125, 125, 125, 125, 125, 125,
-    125, 125, 125,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 125,
-    150, 150, 150, 150, 150, 150, 150, 150,   0,   0, 150, 150, 150, 150, 150, 150,
-    150, 150, 150, 150, 150,   0,   0,   0, 141, 141, 141, 141, 141, 141, 141, 141,
-    140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,   0,   0,   0,   0,   0,
-    119, 119, 119, 119, 119, 119, 119, 119, 119,   0,   0,   0,   0,   0,   0,   0,
-    133, 133, 133, 133, 133, 133, 133, 133, 133,   0, 133, 133, 133, 133, 133, 133,
-    133, 133, 133, 133, 133, 133, 133,   0, 133, 133, 133, 133, 133, 133,   0,   0,
-    133, 133, 133, 133, 133,   0,   0,   0, 134, 134, 134, 134, 134, 134, 134, 134,
-      0,   0, 134, 134, 134, 134, 134, 134,   0, 134, 134, 134, 134, 134, 134, 134,
-    134, 134, 134, 134, 134, 134, 134,   0, 138, 138, 138, 138, 138, 138, 138,   0,
-    138, 138,   0, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138,
-      0,   0, 138,   0, 138, 138,   0, 138, 138, 138,   0,   0,   0,   0,   0,   0,
-    143, 143, 143, 143, 143, 143,   0, 143, 143,   0, 143, 143, 143, 143, 143, 143,
-    143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143,   0,
-    143, 143,   0, 143, 143, 143, 143, 143, 143,   0,   0,   0,   0,   0,   0,   0,
-    143, 143,   0,   0,   0,   0,   0,   0, 144, 144, 144, 144, 144, 144, 144, 144,
-    144,   0,   0,   0,   0,   0,   0,   0,  15,  15,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,  15,  63,  63,  63,  63,  63,  63,  63,  63,
-     63,  63,   0,   0,   0,   0,   0,   0,  63,  63,  63,  63,  63,  63,  63,   0,
-     63,  63,  63,  63,  63,   0,   0,   0,  63,  63,  63,  63,   0,   0,   0,   0,
-     81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,   0,
-     81,   0,   0,   0,   0,   0,   0,   0, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127,   0,  84,   0,   0,   0,   0,   0,   0,   0,
-    115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115,   0,
-    115, 115,   0,   0,   0,   0, 115, 115, 104, 104, 104, 104, 104, 104, 104, 104,
-    104, 104, 104, 104, 104, 104,   0,   0, 108, 108, 108, 108, 108, 108, 108, 108,
-    108, 108, 108, 108, 108, 108,   0,   0, 108, 108,   0, 108, 108, 108, 108, 108,
-      0,   0,   0,   0,   0, 108, 108, 108, 145, 145, 145, 145, 145, 145, 145, 145,
-    145, 145, 145,   0,   0,   0,   0,   0,  99,  99,  99,  99,  99,  99,  99,  99,
-     99,  99,  99,   0,   0,   0,   0,  99,   0,   0,   0,   0,   0,   0,   0,  99,
-    137, 139,   1,   1,   0,   0,   0,   0, 137, 137, 137, 137, 137, 137, 137, 137,
-    137, 137, 137,   0,   0,   0,   0,   0,  34,  33,  33,  33,  33,  33,  33,  33,
-     33,  33,  33,   0,   0,   0,   0,   0,   0,   0,   0,   0,  34,  34,  34,  34,
-    139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139,   0,   0,   0,   0,
-    105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105,   0,   0,   0,   0,   0,
-    105, 105, 105, 105, 105,   0,   0,   0, 105,   0,   0,   0,   0,   0,   0,   0,
-    105, 105,   0,   0, 105, 105, 105, 105,   1,   1,   1,   1,   1,   1,   1,  41,
-     41,  41,   1,   1,   1,   1,   1,   1,   1,   1,   1,  41,  41,  41,  41,  41,
-     41,  41,  41,   1,   1,  41,  41,  41,  41,  41,  41,  41,   1,   1,   1,   1,
-      1,   1,  41,  41,  41,  41,   1,   1,   1,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   1,   0,   0,   1,   1,   0,   0,   1,   1,   1,   1,   0,   1,   1,
-      1,   1,   0,   1,   0,   1,   1,   1,   1,   1,   1,   1,   0,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   0,   1,   1,   1,   1,   0,   0,   1,   1,   1,
-      1,   1,   0,   1,   1,   1,   1,   0,   1,   1,   1,   1,   1,   0,   1,   0,
-      0,   0,   1,   1,   1,   1,   1,   1,   1,   0,   1,   1,   1,   1,   1,   1,
-    131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131,   0,   0,   0,   0,
-      0,   0,   0, 131, 131, 131, 131, 131,   0, 131, 131, 131, 131, 131, 131, 131,
-     57,   0,   0,  57,  57,  57,  57,  57,  57,  57,   0,  57,  57,   0,  57,  57,
-     57,  57,  57,   0,   0,   0,   0,   0, 151, 151, 151, 151, 151, 151, 151, 151,
-    151, 151, 151, 151, 151,   0,   0,   0, 151, 151, 151, 151, 151, 151,   0,   0,
-    151, 151,   0,   0,   0,   0, 151, 151, 152, 152, 152, 152, 152, 152, 152, 152,
-    152, 152,   0,   0,   0,   0,   0, 152, 113, 113, 113, 113, 113, 113, 113, 113,
-    113, 113, 113, 113, 113,   0,   0, 113, 113, 113, 113, 113, 113, 113, 113,   0,
-    132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132,   0,   0,   0,   0,
-    132, 132,   0,   0,   0,   0, 132, 132,   1,   1,   1,   1,   1,   0,   0,   0,
-      7,   7,   7,   7,   0,   7,   7,   7,   0,   7,   7,   0,   7,   0,   0,   7,
-      0,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   0,   7,   7,   7,   7,
-      0,   7,   0,   7,   0,   0,   0,   0,   0,   0,   7,   0,   0,   0,   0,   7,
-      0,   7,   0,   7,   0,   7,   7,   7,   0,   7,   0,   7,   0,   7,   0,   7,
-      0,   7,   7,   7,   7,   0,   7,   0,   7,   7,   0,   7,   7,   7,   7,   7,
-      7,   7,   7,   7,   0,   0,   0,   0,   0,   7,   7,   7,   0,   7,   7,   7,
-      0,   0,   0,   0,   0,   0,   1,   1,  33,   1,   1,   0,   0,   0,   0,   0,
-      1,   1,   1,   0,   0,   0,   1,   1,  36,  36,  36,  36,  36,  36,  36,   0,
-     36,  36,  36,  36,  36,   0,   0,   0,  36,   0,   0,   0,   0,   0,   0,   0,
-      0,   1,   0,   0,   0,   0,   0,   0,
-};
+    return (v >> offset) & 0x1;
+}
 
-/* Script: 13928 bytes. */
-
-RE_UINT32 re_get_script(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-
-    f = ch >> 11;
-    code = ch ^ (f << 11);
-    pos = (RE_UINT32)re_script_stage_1[f] << 4;
-    f = code >> 7;
-    code ^= f << 7;
-    pos = (RE_UINT32)re_script_stage_2[pos + f] << 4;
-    f = code >> 3;
-    code ^= f << 3;
-    pos = (RE_UINT32)re_script_stage_3[pos + f] << 3;
-    value = re_script_stage_4[pos + code];
-
-    return value;
+/* Any. */
+RE_UINT32 re_get_any(RE_UINT32 codepoint) {
+    return 1;
 }
 
-/* Script_Extensions. */
+/* ASCII_Hex_Digit. */
+RE_UINT32 re_get_ascii_hex_digit(RE_UINT32 codepoint) {
+    if (0x30 <= codepoint && codepoint <= 0x39)
+        return 1;
+    if (0x41 <= codepoint && codepoint <= 0x46)
+        return 1;
+    if (0x61 <= codepoint && codepoint <= 0x66)
+        return 1;
+
+    return 0;
+}
 
-static RE_UINT8 re_script_extensions_stage_1[] = {
-     0,  1,  2,  3,  4,  5,  6,  7,  7,  8,  7,  7,  7,  7,  7,  7,
-     7,  7,  7,  9, 10, 11, 12, 12, 12, 12, 13, 14, 14, 14, 14, 15,
-    16, 17, 18, 19, 20, 14, 21, 14, 22, 14, 14, 14, 14, 23, 24, 24,
-    25, 26, 14, 14, 14, 14, 27, 28, 14, 14, 29, 30, 31, 32, 33, 34,
-     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
-     7,  7,  7,  7, 35,  7, 36, 37,  7, 38,  7,  7,  7, 39, 14, 40,
-    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-    41, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-};
-
-static RE_UINT8 re_script_extensions_stage_2[] = {
-      0,   1,   2,   2,   2,   3,   4,   5,   6,   7,   8,   9,  10,  11,  12,  13,
-     14,  15,  16,  17,  18,  19,  20,  21,  22,  23,  24,  25,  26,  27,  28,  29,
-     30,  31,  32,  32,  33,  34,  35,  36,  37,  37,  37,  37,  37,  38,  39,  40,
-     41,  42,  43,  44,  45,  46,  47,  48,  49,  50,  51,  52,   2,   2,  53,  54,
-     55,  56,  57,  58,  59,  59,  59,  59,  60,  59,  59,  59,  59,  59,  59,  59,
-     61,  61,  59,  59,  59,  59,  62,  63,  64,  65,  66,  67,  68,  69,  70,  71,
-     72,  73,  74,  75,  76,  77,  78,  79,  70,  70,  70,  70,  70,  70,  70,  70,
-     70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  70,
-     70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  80,  70,  70,  70,  70,
-     70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  81,
-     82,  82,  82,  82,  82,  82,  82,  82,  82,  83,  84,  84,  85,  86,  87,  88,
-     89,  90,  91,  92,  93,  94,  95,  96,  32,  32,  32,  32,  32,  32,  32,  32,
-     32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,
-     32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  97,
-     98,  98,  98,  98,  98,  98,  98,  98,  98,  98,  98,  98,  98,  98,  98,  98,
-     98,  98,  70,  70,  99, 100, 101, 102, 103, 103, 104, 105, 106, 107, 108, 109,
-    110, 111, 112, 113,  98, 114, 115, 116, 117, 118, 119,  98, 120, 120, 121,  98,
-    122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132,  98, 133,  98, 134, 135,
-    136, 137, 138, 139, 140, 141, 142,  98, 143, 144,  98, 145, 146, 147, 148,  98,
-    149, 150,  98, 151, 152, 153,  98,  98, 154, 155, 156, 157,  98, 158,  98, 159,
-    160, 160, 160, 160, 160, 160, 160, 161, 162, 160, 163,  98,  98,  98,  98,  98,
-    164, 164, 164, 164, 164, 164, 164, 164, 165,  98,  98,  98,  98,  98,  98,  98,
-     98,  98,  98,  98,  98,  98,  98,  98, 166, 166, 166, 166, 167,  98,  98,  98,
-    168, 168, 168, 168, 169, 170, 171, 172,  98,  98,  98,  98, 173, 174, 175, 176,
-    177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177,
-    177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 178,
-    177, 177, 177, 177, 177, 179,  98,  98,  98,  98,  98,  98,  98,  98,  98,  98,
-    180, 181, 182, 183, 183, 184,  98,  98,  98,  98,  98,  98,  98,  98,  98,  98,
-     98,  98,  98,  98,  98,  98,  98,  98, 185, 186,  98,  98,  98,  98,  98,  98,
-     59, 187, 188, 189, 190, 191, 192,  98, 193, 194, 195,  59,  59, 196,  59, 197,
-    198, 198, 198, 198, 198, 199,  98,  98,  98,  98,  98,  98,  98,  98,  98,  98,
-    200,  98, 201,  98,  98, 202,  98,  98,  98,  98,  98,  98,  98,  98,  98,  98,
-    203, 204, 205,  98,  98,  98,  98,  98, 206, 207, 208,  98, 209, 210,  98,  98,
-    211, 212, 213, 214, 215,  98,  59,  59,  59,  59,  59,  59,  59, 216, 217, 218,
-    219, 220, 221, 222, 223, 224,  98,  98,  98,  98,  98,  98,  98,  98,  98,  98,
-     70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  70, 225,  70,  70,
-     70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  70, 226,  70,
-    227,  70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  70,
-     70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  70, 228,  70,  70,
-     70,  70,  70,  70,  70,  70,  70, 229,  98,  98,  98,  98,  98,  98,  98,  98,
-     70,  70,  70,  70, 230,  98,  98,  98,  98,  98,  98,  98,  98,  98,  98,  98,
-    231,  98, 232, 233,  98,  98,  98,  98,  98,  98,  98,  98,  98,  98,  98,  98,
-};
-
-static RE_UINT16 re_script_extensions_stage_3[] = {
-      0,   0,   0,   0,   0,   0,   0,   0,   1,   2,   2,   3,   1,   2,   2,   3,
-      0,   0,   0,   0,   0,   4,   0,   4,   2,   2,   5,   2,   2,   2,   5,   2,
-      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
-      2,   2,   2,   2,   2,   2,   2,   6,   0,   0,   0,   0,   7,   8,   0,   0,
-      9,   9,   9,   9,   9,   9,   9,   9,  10,   9,   9,   9,  11,   2,  12,  13,
-     14,  15,  16,  16,  17,  16,  16,  16,  16,  16,  16,  16,  18,  19,  16,  16,
-     20,  20,  20,  20,  20,  20,  20,  20,  20,  20,  20,  20,  20,  20,  20,  20,
-     21,  20,  20,  20,  20,  20,  20,  20,  20,  20,  20,  20,  20,  20,  20,  20,
-     20,  20,  20,  20,  20,  20,  22,  23,  23,  23,  24,  22,  23,  23,  23,  23,
-     23,  25,  26,  27,  27,  27,  27,  27,  27,  28,  27,  27,  27,  29,  30,  28,
-     31,  32,  33,  34,  33,  33,  33,  33,  35,  36,  37,  33,  38,  39,  40,  33,
-     33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  41,  31,  33,  33,  33,  33,
-     42,  43,  42,  42,  42,  42,  42,  42,  42,  44,  33,  33,  33,  33,  33,  33,
-     45,  45,  45,  45,  45,  45,  46,  28,  47,  47,  47,  47,  47,  47,  47,  48,
-     49,  49,  49,  49,  49,  50,  49,  51,  52,  52,  52,  53,  42,  54,  28,  28,
-     28,  28,  28,  28,  33,  33,  55,  56,  28,  28,  57,  33,  58,  33,  33,  33,
-     59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  60,  59,  61,  62,  59,  59,
-     63,  64,  65,  66,  66,  67,  68,  69,  64,  70,  71,  72,  73,  74,  66,  75,
-     76,  77,  78,  79,  79,  80,  81,  82,  77,  83,  84,  85,  86,  87,  88,  28,
-     89,  90,  91,  92,  92,  93,  94,  95,  90,  96,  97,  28,  98,  99, 100, 101,
-    102, 103, 104, 105, 105, 106, 107, 108, 103, 109, 110, 111, 112, 105, 105,  28,
-    113, 114, 115, 116, 117, 114, 118, 119, 114, 115, 120,  28, 121, 122, 123, 124,
-    125, 126, 127, 125, 125, 127, 125, 128, 126, 129, 130, 131, 132, 125, 133, 125,
-    134, 135, 136, 134, 134, 136, 137, 138, 135, 139, 140, 141, 142, 143, 144,  28,
-    145, 146, 147, 148, 148, 148, 148, 148, 146, 147, 149, 148, 150, 148, 148, 148,
-    151, 152, 153, 154, 152, 152, 155, 156, 153, 157, 158, 152, 159, 152, 160,  28,
-    161, 162, 162, 162, 162, 162, 162, 163, 162, 162, 162, 164,  28,  28,  28,  28,
-    165, 166, 167, 167, 168, 167, 167, 169, 170, 169, 167, 171,  28,  28,  28,  28,
-    172, 172, 172, 172, 172, 172, 172, 172, 172, 173, 172, 172, 172, 174, 173, 172,
-    172, 172, 172, 173, 172, 172, 172, 175, 172, 175, 176, 177,  28,  28,  28,  28,
-    178, 178, 178, 178, 178, 178, 178, 178, 179, 180, 178, 178, 178, 178, 178, 178,
-    178, 178, 178, 178, 181, 181, 181, 181, 182, 183, 181, 181, 181, 181, 181, 184,
-    185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185,
-    186, 186, 186, 186, 186, 186, 186, 186, 186, 187, 188, 187, 186, 186, 186, 186,
-    186, 187, 186, 186, 186, 186, 187, 188, 187, 186, 188, 186, 186, 186, 186, 186,
-    186, 186, 187, 186, 186, 186, 186, 186, 186, 186, 186, 189, 186, 186, 186, 190,
-    186, 186, 186, 191, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 193, 193,
-    194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194,
-    195, 195, 195, 196, 197, 197, 197, 197, 197, 197, 197, 197, 197, 198, 197, 199,
-    200, 201, 202,  28, 203, 203, 204,  28, 205, 205, 206,  28, 207, 208, 209,  28,
-    210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 211, 210, 212, 210, 212,
-    213, 214, 215, 216, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 217,
-    215, 215, 215, 215, 215, 218, 194, 194, 194, 194, 194, 194, 194, 194, 219,  28,
-    220, 220, 220, 221, 220, 222, 220, 222, 223, 220, 224, 224, 224, 225, 226,  28,
-    227, 227, 227, 227, 227, 228, 227, 227, 227, 229, 227, 230, 210, 210, 210, 210,
-    231, 231, 231, 232, 233, 233, 233, 233, 233, 233, 233, 234, 233, 233, 233, 235,
-    233, 236, 233, 236, 233, 237,   9, 238,  28,  28,  28,  28,  28,  28,  28,  28,
-    239, 239, 239, 239, 239, 239, 239, 239, 239, 240, 239, 239, 239, 239, 239, 241,
-    242, 242, 242, 242, 242, 242, 242, 242, 243, 243, 243, 243, 243, 243, 244, 245,
-    246, 246, 246, 246, 246, 246, 246, 247, 246, 248, 249, 249, 249, 249, 249, 249,
-     20, 250, 181, 181, 181, 181, 181, 251, 242,  28, 252, 253, 254, 255, 256, 257,
-      2,   2,   2,   2, 258, 259,   2,   2,   2,   2,   2, 260, 261, 262,   2, 263,
-      2,   2,   2,   2,   2,   2,   2, 264, 265,   9,   9,   9,   9,   9,   9, 266,
-     16,  16, 267, 267,  16,  16,  16,  16, 267, 267,  16, 268,  16,  16,  16, 267,
-     16,  16,  16,  16,  16,  16, 269,  16, 269,  16, 270, 271,  16,  16, 272, 273,
-      0, 274,   0,   0,   0, 275,   0,   0,   0,   0,   0,   0, 276,   0, 277, 278,
-      0, 279,   2, 280,   0,   0,   0,   0,  28,  28,   9,   9,   9,   9, 281,  28,
-      0,   0,   0,   0, 282, 283,   4,   0,   0, 284,   0,   0,   2,   2,   2,   2,
-      2, 285,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0, 279,  28,  28,  28,   0, 286,  28,  28,   0,   0,   0,   0,
-    287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 288,   0,
-      0,   0, 289,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-    290, 290, 290, 290, 290, 291, 290, 290, 290, 290, 290, 291,   2,   2,   2,   2,
-     19,  19,  19,  19,  19,  19,  19,  19,  19,  19,  19,  19,  19,  19, 292, 293,
-    181, 181, 181, 181, 182, 183, 294, 294, 294, 294, 294, 294, 294, 295, 296, 295,
-    186, 186, 188,  28, 188, 188, 188, 188, 188, 188, 188, 188,  20,  20,  20,  20,
-      0,   0,   0,   0,   0,   0,   0,   0, 297,   0,  28,  28,  28,  28,  28,  28,
-    298, 298, 298, 299, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 300,  28,
-    298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298,
-    298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 301,  28,  28,  28,   0, 302,
-    303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 312, 312, 312, 312, 312, 312,
-    312, 312, 313, 314, 315, 316, 316, 316, 316, 316, 316, 316, 316, 316, 316, 317,
-    318, 319, 319, 319, 319, 319, 320, 185, 185, 185, 185, 185, 185, 185, 185, 185,
-    185, 321, 298, 298, 319, 319, 319, 322, 298, 298, 298, 298, 300,  28, 316, 316,
-    185, 185, 185, 321, 298, 298, 298, 298, 298,   0,   0,   0, 185, 185, 185, 323,
-    298, 298, 298, 298, 298, 298, 324,   0, 298, 325, 316, 316, 316, 316, 316, 326,
-    316, 316, 316, 316, 316, 316, 316, 316, 316, 316, 316, 298, 298, 298, 324, 327,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 298, 298, 298, 328,
-    298, 298, 298, 298, 298, 298, 301,  28,   0,   0,   0,   0,   0,   0,   0,   0,
-    298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298,  28,  28,
-    329, 329, 329, 329, 329, 329, 329, 329, 329, 329, 329, 329, 329, 329, 329, 329,
-    329, 330, 329, 329, 329, 329, 329, 329, 331,  28, 332, 332, 332, 332, 332, 332,
-    333, 333, 333, 333, 333, 333, 333, 333, 333, 333, 333, 333, 333, 333, 333, 333,
-    333, 333, 333, 333, 333, 334,  28,  28,  20,  20,  20,  20,  20, 335,  20,  20,
-     20,  20,  20,  20, 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, 336,  28,
-      0,   0,   0,   0, 337,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
-      2, 338,   2,   2,   2,   2,   2,   2, 339,  28,  28,  28,  28,  28, 340,   2,
-    341, 341, 341, 341, 341, 342, 343, 344, 345, 345, 345, 345, 345, 345, 345,  28,
-    346, 346, 346, 346, 346, 346, 346, 346, 347, 348, 346, 349,  59,  59, 350,  59,
-    351, 351, 351, 351, 351, 352, 353, 353, 353, 353, 354, 355, 185, 185, 185, 356,
-    357, 357, 357, 357, 357, 357, 357, 357, 357, 358, 357, 359, 178, 178, 178, 360,
-    361, 361, 361, 361, 361, 361, 362,  28, 361, 363, 361, 364, 178, 178, 178, 178,
-    365, 365, 365, 365, 365, 365, 365, 365, 366,  28,  28, 367, 368, 368, 369,  28,
-    370, 370, 370,  28, 188, 188,   2,   2,   2,   2,   2, 371, 372,  28, 192, 192,
-    192, 192, 192, 192, 192, 192, 192, 192, 368, 368, 368, 368, 368, 373, 368, 374,
-    185, 185, 185, 185, 375,  28, 185, 185, 321, 376, 185, 185, 185, 185, 185, 375,
-     28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,
-    298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 301, 298, 298,
-    298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 377,  28,  28,  28,  28,
-    378,  28, 379, 380,  27,  27, 381, 382, 383,  27,  33,  33,  33,  33,  33,  33,
-     33,  33,  33,  33,  33,  33,  33,  33, 384,  28,  57,  33,  33,  33,  33,  33,
-     33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,
-     33,  33,  33,  33,  33,  33,  33, 385,  28,  28,  33,  33,  33,  33,  33,  33,
-     33,  33, 386,  33,  33,  33,  33,  33,  33,  28,  28,  28,  28,  28, 387, 388,
-      9,   9,   0, 389,   9, 390,   0,   0, 391,   0, 392,   0, 279, 302,  55,  33,
-     33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33, 393,
-    394,   0,   0,   0,   1,   2,   2,   3,   1,   2,   2,   3, 395, 316, 315, 316,
-    316, 316, 316, 396, 185, 185, 185, 321, 397, 397, 397, 398, 279, 279,  28, 399,
-    400, 401, 400, 400, 402, 400, 400, 403, 400, 404, 400, 404,  28,  28,  28,  28,
-    400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 405,
-    406, 407, 407, 407, 407, 407, 408, 409,  16,  16,  16,  16,  16,  16,  16,  16,
-     16, 273,   0, 302, 410,  28,  28,  28,  28,  28,   0,   0,   0,   0,   0, 411,
-    412, 412, 412, 413, 414, 414, 414, 414, 414, 414, 415,  28, 416, 416, 416, 417,
-    418, 418, 418, 418, 419, 420, 421, 421, 421, 422, 423, 423, 423, 423, 423, 424,
-    425, 425, 425, 426, 427, 427, 427, 427, 428, 427, 429,  28,  28,  28,  28,  28,
-    430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 431, 431, 431, 431, 431, 431,
-    432, 432, 432, 433, 432, 434, 435, 435, 435, 435, 436, 435, 435, 435, 435, 436,
-    437, 437, 437, 437, 437,  28, 438, 438, 438, 438, 438, 438, 439, 440,  28,  28,
-    441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441,
-    441, 441, 441, 441, 441, 441, 442,  28, 441, 441, 443,  28, 441,  28,  28,  28,
-    444, 445, 446, 446, 446, 446, 447, 448, 449, 449, 450, 449, 451, 451, 451, 451,
-    452, 452, 452, 453, 454, 452,  28,  28,  28,  28,  28,  28, 455, 455, 456, 457,
-    458, 458, 458, 459, 460, 460, 460, 461,  28,  28,  28,  28,  28,  28,  28,  28,
-    462, 462, 462, 462, 463, 463, 463, 464, 463, 463, 465, 463, 463, 463, 463, 463,
-    466, 467, 468, 469, 470, 470, 471, 472, 470, 473, 470, 473, 474, 474, 474, 474,
-    475, 475, 475, 475,  28,  28,  28,  28, 476, 476, 476, 476, 477, 478, 477,  28,
-    479, 479, 479, 479, 479, 479, 480, 481, 482, 482, 483, 482, 484, 484, 485, 484,
-    486, 486, 487, 488,  28, 489,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,
-    490, 490, 490, 490, 490, 490, 490, 490, 490, 491,  28,  28,  28,  28,  28,  28,
-    492, 492, 492, 492, 492, 492, 493,  28, 492, 492, 492, 492, 492, 492, 493, 494,
-    495, 495, 495, 495, 495,  28, 495, 496,  28,  28,  28,  28,  28,  28,  28,  28,
-     28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  33,  33,  33, 497,
-    498, 498, 498, 498, 498,  28, 499, 499, 499, 499, 499, 500,  28,  28,  28,  28,
-     28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28, 501, 501, 502,  28,
-    503, 503, 503, 503, 503, 503, 503, 503, 503, 504, 505, 503, 503, 503,  28, 506,
-    507, 507, 507, 507, 507, 507, 507, 507, 508, 509, 510, 510, 510, 511, 510, 512,
-    513, 513, 513, 513, 513, 513, 514, 513, 515,  28, 516, 516, 516, 516, 517,  28,
-    518, 518, 518, 518, 518, 518, 518, 518, 518, 519, 518, 518, 520, 152, 521,  28,
-    522, 522, 523, 522, 522, 522, 522, 524,  28,  28,  28,  28,  28,  28,  28,  28,
-    525, 526, 527, 528, 527, 529, 530, 530, 530, 530, 530, 530, 530, 531, 530, 532,
-    533, 534, 535, 536, 536, 537, 538, 539, 534, 540, 541, 542, 543, 544, 544,  28,
-    545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 546,  28,  28,  28,  28,
-    547, 547, 547, 547, 547, 547, 547, 547, 547,  28, 547, 548,  28,  28,  28,  28,
-    549, 549, 549, 549, 549, 549, 550, 549, 549, 549, 549, 550,  28,  28,  28,  28,
-    551, 551, 551, 551, 551, 551, 551, 551, 552,  28, 551, 553, 215, 554,  28,  28,
-    555, 555, 555, 555, 555, 555, 555, 556, 555, 557,  28,  28,  28,  28,  28,  28,
-    558, 558, 558, 559, 558, 560, 558, 558,  28,  28,  28,  28,  28,  28,  28,  28,
-    561, 561, 561, 561, 561, 561, 561, 562,  28,  28,  28,  28,  28,  28,  28,  28,
-     28,  28,  28,  28, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 564, 565,
-     28,  28,  28,  28, 566, 567, 566, 566, 566, 566, 566, 567, 568,  28,  28,  28,
-    569, 569, 569, 569, 569, 569, 569, 569, 569,  28, 570, 570, 570, 570, 570, 570,
-    570, 570, 570, 570, 571,  28,  28,  28, 572, 572, 572, 572, 572, 572, 572, 573,
-    574, 575, 574, 574, 574, 574, 576, 574, 577,  28, 574, 574, 574, 578, 579, 579,
-    579, 579, 580, 579, 579, 581, 582,  28,  28,  28,  28,  28,  28,  28,  28,  28,
-    583, 584, 585, 585, 585, 585, 583, 586, 585,  28, 585, 587, 588, 589, 590, 590,
-    590, 591, 592, 593, 590, 594,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,
-     28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28, 595, 595, 595, 596,
-     28,  28,  28,  28,  28,  28,  28,  28, 118, 118, 597, 118, 118, 118, 598, 599,
-    600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600,
-    600, 600, 600, 601,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,
-    600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 602, 603,  28,
-    600, 600, 600, 600, 600, 600, 600, 600, 604,  28,  28,  28,  28,  28,  28,  28,
-    605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605,
-    605, 605, 605, 605, 605, 606, 605, 607,  28,  28,  28,  28,  28,  28,  28,  28,
-    608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608,
-    608, 608, 608, 608, 608, 608, 608, 608, 609,  28,  28,  28,  28,  28,  28,  28,
-    336, 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, 336,
-    336, 336, 336, 336, 336, 336, 336, 610, 611, 611, 611, 612, 611, 613,  28,  28,
-     28,  28,  28,  28,  28,  28,  28,  28,  28,  28, 614, 614, 614, 615, 615,  28,
-    616, 616, 616, 616, 616, 616, 616, 616, 617,  28, 616, 618, 618, 616, 616, 619,
-    616, 616,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,
-     28,  28,  28,  28,  28,  28,  28,  28, 620, 620, 620, 620, 620, 620, 620, 620,
-    620, 620, 620, 621,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,
-    622, 622, 622, 622, 622, 622, 622, 622, 622, 623, 622, 622, 622, 622, 622, 622,
-    622, 624, 622, 622,  28,  28,  28,  28,  28,  28,  28,  28, 625,  28,  28,  28,
-    626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626,
-    626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626,  28,
-    626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 627,  28,
-    628, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312,
-    312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312,
-    312, 312, 312, 313,  28,  28,  28,  28,  28,  28, 629,  28, 630,  28, 631, 631,
-    631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631,
-    631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 632,
-    633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 634, 633, 635,
-    633, 636, 633, 637, 638,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 289,  28,
-      0,   0,   0,   0, 279, 394,   0,   0,   0,   0,   0,   0, 639, 640,   0, 641,
-    642, 643,   0,   0,   0, 644,   0,   0,   0,   0,   0,   0,   0, 645,  28,  28,
-     16,  16,  16,  16,  16,  16,  16,  16, 267,  28,  28,  28,  28,  28,  28,  28,
-     28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,   0,   0, 302,  28,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 279,  28, 298, 298, 646, 645,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 276,   0,   0,   0,   0,   0,
-      0,   0,   0, 276, 647, 648,   0, 649, 650,   0,   0,   0,   0,   0,   0,   0,
-    651, 652, 276, 276,   0,   0,   0, 653, 654, 655, 656,   0,   0,   0,   0,   0,
-      0,   0,   0,   0, 289,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0, 288,   0,   0,   0,   0,   0,   0,
-    657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657,
-    657, 658,  28, 659, 660, 657,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,
-    291, 290, 290, 661, 662, 663,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,
-    664, 664, 664, 664, 664, 665, 664, 666, 664, 667,  28,  28,  28,  28,  28,  28,
-     28,  28,  28,  28,  28,  28,  28,  28, 668, 668, 668, 668, 668, 668, 668, 669,
-    670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670,
-    670, 670, 670, 670, 670, 670, 670, 670, 671, 670, 672,  28,  28,  28,  28,  28,
-    673, 673, 673, 673, 673, 673, 673, 673, 673, 674, 673, 675,  28,  28,  28,  28,
-     28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28, 394,   0,
-      0,   0,   0,   0,   0,   0, 676,  28,  28,  28,  28,  28,  28,  28,  28,  28,
-    394,   0,   0,   0,   0,   0,   0, 289,  28,  28,  28,  28,  28,  28,  28,  28,
-    677,  33,  33,  33, 678, 679, 680, 681, 682, 683, 678, 684, 678, 680, 680, 685,
-     33, 686,  33, 687, 688, 686,  33, 687,  28,  28,  28,  28,  28,  28, 384,  28,
-      0,   0,   0,   0,   0, 302,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0, 302,  28,   0, 279, 394,   0, 394,   0, 394,   0,   0,   0, 289,  28,
-      0, 676,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 676,   0,   0,
-      0,   0,   0,   0,   0, 676,  28,  28,  28,  28,  28,  28, 689,   0,   0,   0,
-    690,  28,   0,   0,   0,   0,   0, 302,   0, 645, 377,  28, 289,  28,  28,  28,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 289,  28,   0, 676,   0, 286,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 302,  28,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 645,   0, 302,  28,  28,
-      0, 302,   0,   0,   0,   0,   0,   0,   0,  28,   0, 389,   0,   0,   0,   0,
-      0,  28,   0,   0,   0, 289,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,
-      0, 650,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 653, 655,
-      0,   0,   0,   0, 652, 691,   0,   0,   0, 652,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 302,  28,   0, 289, 302, 286,
-    286,  28, 289,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,
-    298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 692,  28,  28,  28,  28,  28,
-    298, 298, 298, 298, 298, 298, 693,  28, 298, 298, 298, 298, 298, 298, 298, 298,
-    298, 298, 298, 301, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298,
-    298, 298, 298, 298, 377,  28, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298,
-    298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 694,  28,  28,  28,
-    298, 298, 298, 301,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,
-    695,  28,  28,  28,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,
-      9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,  28,  28,
-};
-
-static RE_UINT8 re_script_extensions_stage_4[] = {
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   2,   2,   2,   2,   2,   2,   2,
-      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   1,   1,   1,   1,   1,
-      1,   1,   2,   1,   1,   1,   1,   1,   2,   2,   2,   2,   2,   2,   2,   1,
-      2,   1,   1,   1,   1,   1,   1,   1,   2,   2,   2,   2,   2,   1,   1,   1,
-      1,   1,  35,  35,   1,   1,   1,   1,  41,  41,  41,  41,  41,  41,  41,  41,
-     41,  41,   3,  41,  41,   3,  41,  41,  41,  41,  41,   2,   2,   2,   2,   2,
-      3,   3,   3,   3,   1,   3,   3,   3,   0,   0,   3,   3,   3,   3,   1,   3,
-      0,   0,   0,   0,   3,   1,   3,   1,   3,   3,   3,   0,   3,   0,   3,   3,
-      3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   0,   3,   3,   3,   3,   3,
-      3,   3,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,
-      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4, 164, 162, 163, 163, 162,
-      0,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
-      5,   5,   5,   5,   5,   5,   5,   0,   5, 157,   5,   0,   0,   5,   5,   5,
-      0,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,
-      0,   0,   0,   0,   0,   0,   0,   0,   6,   6,   6,   0,   0,   0,   0,   6,
-      6,   6,   6,   6,   6,   0,   0,   0,   7,   7,   7,   7,   7,   1,   7,   7,
-      7,   7,   7,   7, 185,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
-      7,   7,   7, 185, 177,   0,   7, 185, 192,   7,   7,   7,   7,   7,   7,   7,
-      7,   7,   7, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155,   7,   7,
-    156, 156, 156, 156, 156, 156, 156, 156, 156, 156,   7,   7,   7,   7,   7,   7,
-    155,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7, 154,   7,   7,   7,
-      8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   0,   8,
-      8,   8,   8,   0,   0,   8,   8,   8,   9,   9,   9,   9,   9,   9,   9,   9,
-      9,   9,   0,   0,   0,   0,   0,   0,  66,  66,  66,  66,  66,  66,  66,  66,
-     66,  66,  66,   0,   0,  66,  66,  66,  82,  82,  82,  82,  82,  82,  82,  82,
-     82,  82,  82,  82,  82,  82,   0,   0,  82,  82,  82,  82,  82,  82,  82,   0,
-     95,  95,  95,  95,  95,  95,  95,  95,  95,  95,  95,  95,   0,   0,  95,   0,
-      8,   8,   8,   0,   0,   0,   0,   0,   7,   7,   7,   7,   7,   0,   7,   7,
-      7,   7,   7,   7,   7,   7,   0,   0,   0,   0,   0,   7,   7,   7,   7,   7,
-      7,   7,   1,   7,   7,   7,   7,   7,  10,  10,  10,  10,  10,  10,  10,  10,
-     10, 196, 195,  41,  41,  10,  10,  10,  10,  10,  10,  10, 199, 200, 188, 188,
-    188, 188, 188, 188, 188, 188, 188, 188,  11,  11,  11,  11,   0,  11,  11,  11,
-     11,  11,  11,  11,  11,   0,   0,  11,  11,   0,   0,  11,  11,  11,  11,  11,
-     11,  11,  11,  11,  11,  11,  11,  11,  11,   0,  11,  11,  11,  11,  11,  11,
-     11,   0,  11,   0,   0,   0,  11,  11,  11,  11,   0,   0,  11,  11,  11,  11,
-     11,   0,   0,  11,  11,  11,  11,   0,   0,   0,   0,   0,   0,   0,   0,  11,
-      0,   0,   0,   0,  11,  11,   0,  11,  11,  11,  11,  11,   0,   0, 178, 178,
-    178, 178, 178, 178, 178, 178, 178, 178,  11,  11,  11,  11,  11,  11,  11,   0,
-      0,  12,  12,  12,   0,  12,  12,  12,  12,  12,  12,   0,   0,   0,   0,  12,
-     12,   0,   0,  12,  12,  12,  12,  12,  12,  12,  12,  12,  12,  12,  12,  12,
-     12,   0,  12,  12,  12,  12,  12,  12,  12,   0,  12,  12,   0,  12,  12,   0,
-     12,  12,   0,   0,  12,   0,  12,  12,  12,   0,   0,  12,  12,  12,   0,   0,
-      0,  12,   0,   0,   0,   0,   0,   0,   0,  12,  12,  12,  12,   0,  12,   0,
-      0,   0,   0,   0,   0,   0, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172,
-     12,  12,  12,  12,  12,  12,  12,   0,   0,  13,  13,  13,   0,  13,  13,  13,
-     13,  13,  13,  13,  13,  13,   0,  13,  13,  13,   0,  13,  13,  13,  13,  13,
-     13,  13,  13,  13,  13,  13,  13,  13,  13,   0,  13,  13,  13,  13,  13,  13,
-     13,   0,  13,  13,   0,  13,  13,  13,  13,  13,   0,   0,  13,  13,  13,  13,
-     13,  13,   0,  13,  13,  13,   0,   0,  13,   0,   0,   0,   0,   0,   0,   0,
-     13,  13,  13,  13,   0,   0, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171,
-     13,  13,   0,   0,   0,   0,   0,   0,   0,  13,  13,  13,  13,  13,  13,  13,
-      0,  14,  14,  14,   0,  14,  14,  14,  14,  14,  14,  14,  14,   0,   0,  14,
-     14,   0,   0,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,
-     14,   0,  14,  14,  14,  14,  14,  14,  14,   0,  14,  14,   0,  14,  14,  14,
-     14,  14,   0,   0,  14,  14,  14,  14,  14,   0,   0,  14,  14,  14,   0,   0,
-      0,   0,   0,   0,   0,   0,  14,  14,   0,   0,   0,   0,  14,  14,   0,  14,
-     14,  14,  14,  14,   0,   0,  14,  14,   0,   0,  15,  15,   0,  15,  15,  15,
-     15,  15,  15,   0,   0,   0,  15,  15,  15,   0,  15,  15,  15,  15,   0,   0,
-      0,  15,  15,   0,  15,   0,  15,  15,   0,   0,   0,  15,  15,   0,   0,   0,
-     15,  15,  15,  15,  15,  15,  15,  15,  15,  15,   0,   0,   0,   0,  15,  15,
-     15,   0,   0,   0,   0,   0,   0,  15,   0,   0,   0,   0,   0,   0, 170, 170,
-    170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170,  15,  15,  15,  15,
-     15,  15,  15,   0,   0,   0,   0,   0,  16,  16,  16,  16,  16,  16,  16,  16,
-     16,  16,  16,  16,  16,   0,  16,  16,  16,   0,  16,  16,  16,  16,  16,  16,
-     16,  16,   0,   0,   0,  16,  16,  16,  16,   0,  16,  16,  16,  16,   0,   0,
-      0,   0,   0,   0,   0,  16,  16,   0,  16,  16,  16,   0,   0,   0,   0,   0,
-     16,  16,  16,  16,   0,   0,  16,  16,   0,   0,   0,   0,   0,   0,   0,  16,
-     17,  17,  17,  17,  17,  17,  17,  17,  17,  17,  17,  17,  17,   0,  17,  17,
-     17,   0,  17,  17,  17,  17,  17,  17,  17,  17,  17,  17,   0,  17,  17,  17,
-     17,  17,   0,   0,  17,  17,  17,  17,  17,   0,  17,  17,  17,  17,   0,   0,
-      0,   0,   0,   0,   0,  17,  17,   0,   0,   0,   0,   0,   0,   0,  17,   0,
-     17,  17,  17,  17,   0,   0, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174,
-      0,  17,  17,   0,   0,   0,   0,   0,  18,  18,  18,  18,   0,  18,  18,  18,
-     18,  18,  18,  18,  18,   0,  18,  18,  18,   0,  18,  18,  18,  18,  18,  18,
-     18,  18,  18,  18,  18,  18,  18,  18,   0,   0,   0,   0,  18,  18,  18,  18,
-     18,  18,  18,  18,   0,   0,  18,  18,   0,   0,  19,  19,   0,  19,  19,  19,
-     19,  19,  19,  19,  19,  19,  19,  19,  19,  19,  19,  19,  19,  19,  19,   0,
-      0,   0,  19,  19,  19,  19,  19,  19,  19,  19,   0,  19,  19,  19,  19,  19,
-     19,  19,  19,  19,   0,  19,   0,   0,   0,   0,  19,   0,   0,   0,   0,  19,
-     19,  19,  19,  19,  19,   0,  19,   0,   0,   0,   0,   0,   0,   0,  19,  19,
-      0,   0,  19,  19,  19,   0,   0,   0,   0,  20,  20,  20,  20,  20,  20,  20,
-     20,  20,  20,  20,  20,  20,  20,  20,  20,  20,  20,   0,   0,   0,   0,   1,
-     20,  20,  20,  20,   0,   0,   0,   0,   0,  21,  21,   0,  21,   0,  21,  21,
-     21,  21,  21,   0,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,
-     21,  21,  21,  21,   0,  21,   0,  21,  21,  21,  21,  21,  21,  21,   0,   0,
-     21,  21,  21,  21,  21,   0,  21,   0,  21,  21,   0,   0,  21,  21,  21,  21,
-     22,  22,  22,  22,  22,  22,  22,  22,   0,  22,  22,  22,  22,  22,  22,  22,
-     22,  22,  22,  22,  22,   0,   0,   0,  22,  22,  22,  22,  22,   0,  22,  22,
-     22,  22,  22,  22,  22,   1,   1,   1,   1,  22,  22,   0,   0,   0,   0,   0,
-     23,  23,  23,  23,  23,  23,  23,  23, 179, 179, 179, 179, 179, 179, 179, 179,
-    179, 179,  23,  23,  23,  23,  23,  23,  24,  24,  24,  24,  24,  24,  24,  24,
-     24,  24,  24,  24,  24,  24,   0,  24,   0,   0,   0,   0,   0,  24,   0,   0,
-     24,  24,  24, 169,  24,  24,  24,  24,  25,  25,  25,  25,  25,  25,  25,  25,
-     26,  26,  26,  26,  26,  26,  26,  26,  26,   0,  26,  26,  26,  26,   0,   0,
-     26,  26,  26,  26,  26,  26,  26,   0,  26,  26,  26,   0,   0,  26,  26,  26,
-     26,  26,  26,  26,  26,   0,   0,   0,  26,  26,   0,   0,   0,   0,   0,   0,
-     27,  27,  27,  27,  27,  27,  27,  27,  27,  27,  27,  27,  27,  27,   0,   0,
-     28,  28,  28,  28,  28,  28,  28,  28,  29,  29,  29,  29,  29,  29,  29,  29,
-     29,  29,  29,  29,  29,   0,   0,   0,  30,  30,  30,  30,  30,  30,  30,  30,
-     30,  30,  30,   1,   1,   1,  30,  30,  30,   0,   0,   0,   0,   0,   0,   0,
-     42,  42,  42,  42,  42,  42,  42,  42,  42,  42,  42,  42,  42,   0,  42,  42,
-     42,  42,  42,  42,  42,   0,   0,   0,  43,  43,  43,  43,  43,  43,  43,  43,
-     43,  43,  43,  43,  43, 187, 187,   0,  44,  44,  44,  44,  44,  44,  44,  44,
-     44,  44,  44,  44,   0,   0,   0,   0,  45,  45,  45,  45,  45,  45,  45,  45,
-     45,  45,  45,  45,  45,   0,  45,  45,  45,   0,  45,  45,   0,   0,   0,   0,
-     31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,   0,   0,
-     31,  31,   0,   0,   0,   0,   0,   0,  32,  32, 176, 176,  32, 176,  32,  32,
-     32,  32,  32,  32,  32,  32,  32,   0,  32,  32,  32,  32,  32,  32,  32,  32,
-     32,  32,   0,   0,   0,   0,   0,   0,  32,   0,   0,   0,   0,   0,   0,   0,
-     32,  32,  32,   0,   0,   0,   0,   0,  28,  28,  28,  28,  28,  28,   0,   0,
-     46,  46,  46,  46,  46,  46,  46,  46,  46,  46,  46,  46,  46,  46,  46,   0,
-     46,  46,  46,  46,   0,   0,   0,   0,  46,   0,   0,   0,  46,  46,  46,  46,
-     47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,   0,   0,
-     47,  47,  47,  47,  47,   0,   0,   0,  56,  56,  56,  56,  56,  56,  56,  56,
-     56,  56,  56,  56,   0,   0,   0,   0,  56,  56,   0,   0,   0,   0,   0,   0,
-     56,  56,  56,   0,   0,   0,  56,  56,  54,  54,  54,  54,  54,  54,  54,  54,
-     54,  54,  54,  54,   0,   0,  54,  54,  78,  78,  78,  78,  78,  78,  78,  78,
-     78,  78,  78,  78,  78,  78,  78,   0,  78,  78,  78,  78,  78,   0,   0,  78,
-     78,  78,   0,   0,   0,   0,   0,   0,  78,  78,  78,  78,  78,  78,   0,   0,
-     41,  41,  41,  41,  41,  41,  41,   0,  62,  62,  62,  62,  62,  62,  62,  62,
-     62,  62,  62,  62,   0,   0,   0,   0,  62,  62,  62,  62,  62,   0,   0,   0,
-     67,  67,  67,  67,  67,  67,  67,  67,  93,  93,  93,  93,  93,  93,  93,  93,
-     93,  93,  93,  93,   0,   0,   0,   0,   0,   0,   0,   0,  93,  93,  93,  93,
-     68,  68,  68,  68,  68,  68,  68,  68,   0,   0,   0,  68,  68,  68,  68,  68,
-     68,  68,   0,   0,   0,  68,  68,  68,  69,  69,  69,  69,  69,  69,  69,  69,
-      4,   0,   0,   0,   0,   0,   0,   0,  24,  24,  24,   0,   0,  24,  24,  24,
-    186,  10, 186, 165,  10, 158, 158, 167, 158, 167, 191,  10, 167, 167,  10,  10,
-    167, 158,  10,  10,  10,  10,  10,  10,  10, 166, 158,  10,  10, 158,  10,  10,
-     10,  10, 193, 165, 181, 158, 158,  11, 165, 165, 150,   0,   0,   0,   0,   0,
-      2,   2,   2,   2,   2,   2,   3,   3,   3,   3,   3,   4,   2,   2,   2,   2,
-      2,   2,   2,   2,   2,   3,   3,   3,   3,   3,   2,   2,   2,   2,   3,   3,
-      3,   3,   3,   2,   2,   2,   2,   2,   4,   2,   2,   2,   2,   2,   2,   2,
-      2,   2,   2,   2,   2,   2,   2,   3,   3,   3,  41,  41,  41,  41,  41,  41,
-     41,  41,   0,  41,  41,  41,  41,  41,   3,   3,   3,   3,   3,   3,   0,   0,
-      0,   3,   0,   3,   0,   3,   0,   3,   3,   3,   3,   3,   3,   0,   3,   3,
-      3,   3,   3,   3,   0,   0,   3,   3,   3,   3,   3,   3,   0,   3,   3,   3,
-      0,   0,   3,   3,   3,   0,   3,   3,   3,   3,   3,   3,   3,   3,   3,   0,
-      1,   1,   1,   1,  41,  41,   1,   1,   1,   1,   1,   1,   1,   1,   1, 175,
-      1,   1,   1,   1,   1,   0,   1,   1,   1,   2,   0,   0,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   2,   1,   1,   1,   1,   1,   1,   1,   0,
-      2,   2,   2,   2,   2,   0,   0,   0, 182,   0,   0,   0,   0,   0,   0,   0,
-      1,   1,   1,   1,   1,   1,   3,   1,   1,   1,   2,   2,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   2,   1,   2,   1,   1,   1,   0,   0,   0,   0,
-      1,   1,   1,   0,   0,   0,   0,   0,  53,  53,  53,  53,  53,  53,  53,  53,
-      1,   1,   1,   1,   0,   0,   1,   1,   1,   1,   1,   1,   1,   1,   0,   0,
-     57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,   0,
-     55,  55,  55,  55,   0,   0,   0,   0,   0,  55,  55,  55,  55,  55,  55,  55,
-     58,  58,  58,  58,  58,  58,  58,  58,   0,   0,   0,   0,   0,   0,   0,  58,
-     58,   0,   0,   0,   0,   0,   0,   0,   1,   1,   1, 162,   1,   1,   1,   1,
-     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,   0,  36,  36,  36,  36,  36,
-     36,  36,  36,  36,   0,   0,   0,   0,  36,  36,  36,  36,  36,  36,   0,   0,
-      1,   1,   1,   1,   0,   0,   0,   0,   1, 190, 190, 189,   1,  36,  36,  36,
-    190, 190, 190, 190, 190, 190, 190, 190, 190, 190,   1, 189, 190, 190, 190, 190,
-    190, 190, 190, 190, 189, 189, 189, 189,   1,  36,  36,  36,  36,  36,  36,  36,
-     36,  36, 159, 159, 159, 159,  25,  25, 189, 173, 173, 173, 173, 173,   1, 189,
-     36,  36,  36,  36, 183, 183,  36,  36,   0,  33,  33,  33,  33,  33,  33,  33,
-     33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,   0,
-      0, 173, 173, 173, 173,  33,  33,  33, 173,  34,  34,  34,  34,  34,  34,  34,
-     34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34, 190, 173,  34,  34,  34,
-      0,   0,   0,   0,   0,  35,  35,  35,  35,  35,  35,  35,  35,  35,  35,  35,
-      0,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,   0,
-     35,  35,  35,   0,   0,   0,   0,   0,  25,  25,  25,  25,  25,  25,  25,   1,
-     36,   1,   1,   1,   1,   1,   1,   1,  36,  36,  36,  36,   1,   1,   1,   1,
-     34,  34,  34,  34,  34,  34,  34,  36,   1,   1,   1,  36,  36,  36,  36,  36,
-     36,  36,  36,  36,  36,  36,  36,   1,  37,  37,  37,  37,  37,  37,  37,  37,
-     37,  37,  37,  37,  37,   0,   0,   0,  37,  37,  37,  37,  37,  37,  37,   0,
-     83,  83,  83,  83,  83,  83,  83,  83,  70,  70,  70,  70,  70,  70,  70,  70,
-     70,  70,  70,  70,   0,   0,   0,   0,   4,   4,   4,   4,   4,   4,   4, 162,
-     84,  84,  84,  84,  84,  84,  84,  84,   1,   1,   2,   2,   2,   2,   2,   2,
-      1,   1,   1,   2,   2,   2,   2,   2,   0,   0,   2,   2,   2,   2,   2,   0,
-      0,   0,   0,   0,   0,   0,   0,   2,  59,  59,  59,  59,  59,  59,  59,  59,
-     59,  59,  59,  59,   0,   0,   0,   0, 198, 198, 198, 197, 197, 197, 194, 194,
-    194, 194,   0,   0,   0,   0,   0,   0,  65,  65,  65,  65,  65,  65,  65,  65,
-     71,  71,  71,  71,  71,  71,  71,  71,  71,  71,  71,  71,  71,  71,   0,   0,
-      0,   0,   0,   0,   0,   0,  71,  71,  71,  71,   0,   0,   0,   0,   0,   0,
-     10, 158,  10, 168,  10,  10,  10,  10,  72,  72,  72,  72,  72,  72,  72,  72,
-     72,  72,  72,  72,  72,  72, 184,  72,  73,  73,  73,  73,  73,  73,  73,  73,
-     73,  73,  73,  73,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  73,
-     25,  25,  25,  25,  25,   0,   0,   0,  85,  85,  85,  85,  85,  85,  85,  85,
-     85,  85,  85,  85,  85,  85,   0, 160,  85,  85,   0,   0,   0,   0,  85,  85,
-     23,  23,  23,  23,  23,  23,  23,   0,  77,  77,  77,  77,  77,  77,  77,  77,
-     77,  77,  77,  77,  77,  77,  77,   0,  77,  77,  77,  77,  77,  77,   0,   0,
-     77,  77,   0,   0,  77,  77,  77,  77,  79,  79,  79,  79,  79,  79,  79,  79,
-     79,  79,  79,   0,   0,   0,   0,   0,   0,   0,   0,  79,  79,  79,  79,  79,
-     86,  86,  86,  86,  86,  86,  86,  86,  86,  86,  86,  86,  86,  86,  86,   0,
-      0,  26,  26,  26,  26,  26,  26,   0,   2,   2,   2,   1,   2,   2,   2,   2,
-      2,   2,   2,   2,   2,   3,   2,   2,  86,  86,  86,  86,  86,  86,   0,   0,
-     86,  86,   0,   0,   0,   0,   0,   0,  25,  25,  25,  25,   0,   0,   0,   0,
-      0,   0,   0,  25,  25,  25,  25,  25,  36,  36,   0,   0,   0,   0,   0,   0,
-      2,   2,   2,   2,   2,   2,   2,   0,   0,   0,   0,   5,   5,   5,   5,   5,
-      0,   0,   0,   0,   0,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   0,
-      6,   6,   6,   6,   6,   0,   6,   0,   6,   6,   0,   6,   6,   0,   6,   6,
-      7,   7,   0,   0,   0,   0,   0,   0,   7,   7,   7,   7,   7,   7,   1,   1,
-      0,   0,   7,   7,   7,   7,   7,   7,   7,   7, 156,   7,   7,   7,   7,   7,
-      7,   7,   7,   7,   7, 156,   0,   0,   1,   1,   0,   0,   0,   0,   0,   0,
-     41,  41,  41,  41,  41,  41,   4,   4,   1,   1,   1,   1,   1, 189, 189,   1,
-      1,   1,   1,   0,   1,   1,   1,   1,   7,   7,   7,   7,   7,   0,   0,   1,
-      0,   1,   1,   1,   1,   1,   1,   1,   1, 190, 190, 190, 190, 190,  34,  34,
-     34,  34,  34,  34,  34,  34, 173, 173,   0,   0,  25,  25,  25,  25,  25,  25,
-      0,   0,  25,  25,  25,   0,   0,   0,   0,   1,   1,   1,   1,   1,   0,   0,
-     48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,   0,  48,  48,  48,
-     48,  48,  48,  48,  48,  48,  48,   0,  48,  48,  48,   0,  48,  48,   0,  48,
-     48,  48,  48,  48,  48,  48,   0,   0,  48,  48,  48,   0,   0,   0,   0,   0,
-    161, 161, 161,   0,   0,   0,   0, 180, 180, 180, 180, 180, 180, 180, 180, 180,
-    180, 180, 180, 180,   0,   0,   0, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-      3,   0,   0,   0,   0,   0,   0,   0,   1,   1,   1,   1,   1,  41,   0,   0,
-     74,  74,  74,  74,  74,  74,  74,  74,  74,  74,  74,  74,  74,   0,   0,   0,
-     75,  75,  75,  75,  75,  75,  75,  75,  75,   0,   0,   0,   0,   0,   0,   0,
-    153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153,   0,   0,   0,   0,
-     38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,  38,  38,  38,  39,  39,  39,  39,  39,  39,  39,  39,
-     39,  39,  39,   0,   0,   0,   0,   0, 120, 120, 120, 120, 120, 120, 120, 120,
-    120, 120, 120,   0,   0,   0,   0,   0,  49,  49,  49,  49,  49,  49,  49,  49,
-     49,  49,  49,  49,  49,  49,   0,  49,  60,  60,  60,  60,  60,  60,  60,  60,
-     60,  60,  60,  60,   0,   0,   0,   0,  60,  60,  60,  60,  60,  60,   0,   0,
-     40,  40,  40,  40,  40,  40,  40,  40,  50,  50,  50,  50,  50,  50,  50,  50,
-     51,  51,  51,  51,  51,  51,  51,  51,  51,  51,  51,  51,  51,  51,   0,   0,
-     51,  51,   0,   0,   0,   0,   0,   0, 136, 136, 136, 136, 136, 136, 136, 136,
-    136, 136, 136, 136,   0,   0,   0,   0, 106, 106, 106, 106, 106, 106, 106, 106,
-    103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0, 103, 110, 110, 110, 110, 110, 110, 110, 110,
-    110, 110, 110, 110, 110, 110, 110,   0, 110, 110, 110, 110, 110, 110,   0,   0,
-     52,  52,  52,  52,  52,  52,   0,   0,  52,   0,  52,  52,  52,  52,  52,  52,
-     52,  52,  52,  52,  52,  52,  52,  52,  52,  52,  52,  52,  52,  52,   0,  52,
-     52,   0,   0,   0,  52,   0,   0,  52,  87,  87,  87,  87,  87,  87,  87,  87,
-     87,  87,  87,  87,  87,  87,   0,  87, 118, 118, 118, 118, 118, 118, 118, 118,
-    117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117,   0,
-      0,   0,   0,   0,   0,   0,   0, 117, 128, 128, 128, 128, 128, 128, 128, 128,
-    128, 128, 128,   0, 128, 128,   0,   0,   0,   0,   0, 128, 128, 128, 128, 128,
-     64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,   0,   0,   0,  64,
-     76,  76,  76,  76,  76,  76,  76,  76,  76,  76,   0,   0,   0,   0,   0,  76,
-     98,  98,  98,  98,  98,  98,  98,  98,  97,  97,  97,  97,  97,  97,  97,  97,
-      0,   0,   0,   0,  97,  97,  97,  97,   0,   0,  97,  97,  97,  97,  97,  97,
-     61,  61,  61,  61,   0,  61,  61,   0,   0,   0,   0,   0,  61,  61,  61,  61,
-     61,  61,  61,  61,   0,  61,  61,  61,   0,  61,  61,  61,  61,  61,  61,  61,
-     61,  61,  61,  61,  61,  61,  61,  61,  61,  61,  61,  61,  61,  61,   0,   0,
-     61,  61,  61,   0,   0,   0,   0,  61,  61,   0,   0,   0,   0,   0,   0,   0,
-     88,  88,  88,  88,  88,  88,  88,  88, 116, 116, 116, 116, 116, 116, 116, 116,
-    112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112,   0,
-      0,   0,   0, 112, 112, 112, 112, 112,  80,  80,  80,  80,  80,  80,  80,  80,
-     80,  80,  80,  80,  80,  80,   0,   0,   0,  80,  80,  80,  80,  80,  80,  80,
-     89,  89,  89,  89,  89,  89,  89,  89,  89,  89,  89,  89,  89,  89,   0,   0,
-     90,  90,  90,  90,  90,  90,  90,  90,  90,  90,  90,   0,   0,   0,   0,   0,
-    121, 121, 121, 121, 121, 121, 121, 121, 121, 121,   0,   0,   0,   0,   0,   0,
-      0, 121, 121, 121, 121,   0,   0,   0,   0, 121, 121, 121, 121, 121, 121, 121,
-     91,  91,  91,  91,  91,  91,  91,  91,  91,   0,   0,   0,   0,   0,   0,   0,
-    130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130,   0,   0,   0,   0,   0,
-      0,   0, 130, 130, 130, 130, 130, 130, 146, 146, 146, 146, 146, 146, 146, 146,
-    146, 146,   0,   0,   0,   0,   0,   0,   7,   7,   7,   7,   7,   7,   7,   0,
-    148, 148, 148, 148, 148, 148, 148, 148, 147, 147, 147, 147, 147, 147, 147, 147,
-    147, 147,   0,   0,   0,   0,   0,   0, 149, 149, 149, 149, 149, 149, 149, 149,
-    149, 149, 149, 149, 149, 149, 149,   0,  94,  94,  94,  94,  94,  94,  94,  94,
-     94,  94,  94,  94,  94,  94,   0,   0,   0,   0,  94,  94,  94,  94,  94,  94,
-      0,   0,   0,   0,   0,   0,   0,  94,  92,  92,  92,  92,  92,  92,  92,  92,
-     92,  92,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  92,   0,   0,
-    101, 101, 101, 101, 101, 101, 101, 101, 101,   0,   0,   0,   0,   0,   0,   0,
-    101, 101,   0,   0,   0,   0,   0,   0,  96,  96,  96,  96,  96,  96,  96,  96,
-     96,  96,  96,  96,  96,   0,  96,  96,  96,  96,  96,  96,  96,  96,  96,   0,
-    111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111,   0,
-    100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100,   0,   0,
-      0,  19,  19,  19,  19,  19,  19,  19,  19,  19,  19,  19,  19,   0,   0,   0,
-    109, 109, 109, 109, 109, 109, 109, 109, 109, 109,   0, 109, 109, 109, 109, 109,
-    109, 109, 109, 109, 109, 109, 109,   0, 129, 129, 129, 129, 129, 129, 129,   0,
-    129,   0, 129, 129, 129, 129,   0, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-    129, 129, 129, 129, 129, 129,   0, 129, 129, 129,   0,   0,   0,   0,   0,   0,
-    123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123,   0,   0,   0,   0,   0,
-    123, 123,   0,   0,   0,   0,   0,   0, 107, 170, 107, 170,   0, 107, 107, 107,
-    107, 107, 107, 107, 107,   0,   0, 107, 107,   0,   0, 107, 107, 107, 107, 107,
-    107, 107, 107, 107, 107, 107, 107, 107, 107,   0, 107, 107, 107, 107, 107, 107,
-    107,   0, 107, 107,   0, 107, 107, 107, 107, 107,   0, 170, 170, 107, 107, 107,
-    107,   0,   0, 107, 107, 107,   0,   0, 107,   0,   0,   0,   0,   0,   0, 107,
-      0,   0,   0,   0,   0, 107, 107, 107, 107, 107, 107, 107,   0,   0, 107, 107,
-    107, 107, 107, 107, 107,   0,   0,   0, 135, 135, 135, 135, 135, 135, 135, 135,
-    135, 135,   0, 135,   0, 135, 135, 135, 124, 124, 124, 124, 124, 124, 124, 124,
-    124, 124,   0,   0,   0,   0,   0,   0, 122, 122, 122, 122, 122, 122, 122, 122,
-    122, 122, 122, 122, 122, 122,   0,   0, 114, 114, 114, 114, 114, 114, 114, 114,
-    114, 114, 114, 114, 114,   0,   0,   0, 114, 114,   0,   0,   0,   0,   0,   0,
-     32,  32,  32,  32,  32,   0,   0,   0, 102, 102, 102, 102, 102, 102, 102, 102,
-    102,   0,   0,   0,   0,   0,   0,   0, 102, 102,   0,   0,   0,   0,   0,   0,
-    126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126,   0,   0, 126, 126, 126,
-    126, 126, 126, 126,   0,   0,   0,   0, 142, 142, 142, 142, 142, 142, 142, 142,
-    142, 142, 142, 142,   0,   0,   0,   0, 125, 125, 125, 125, 125, 125, 125, 125,
-    125, 125, 125,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 125,
-    150, 150, 150, 150, 150, 150, 150, 150,   0,   0, 150, 150, 150, 150, 150, 150,
-    150, 150, 150, 150, 150,   0,   0,   0, 141, 141, 141, 141, 141, 141, 141, 141,
-    140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,   0,   0,   0,   0,   0,
-    119, 119, 119, 119, 119, 119, 119, 119, 119,   0,   0,   0,   0,   0,   0,   0,
-    133, 133, 133, 133, 133, 133, 133, 133, 133,   0, 133, 133, 133, 133, 133, 133,
-    133, 133, 133, 133, 133, 133, 133,   0, 133, 133, 133, 133, 133, 133,   0,   0,
-    133, 133, 133, 133, 133,   0,   0,   0, 134, 134, 134, 134, 134, 134, 134, 134,
-      0,   0, 134, 134, 134, 134, 134, 134,   0, 134, 134, 134, 134, 134, 134, 134,
-    134, 134, 134, 134, 134, 134, 134,   0, 138, 138, 138, 138, 138, 138, 138,   0,
-    138, 138,   0, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138,
-      0,   0, 138,   0, 138, 138,   0, 138, 138, 138,   0,   0,   0,   0,   0,   0,
-    143, 143, 143, 143, 143, 143,   0, 143, 143,   0, 143, 143, 143, 143, 143, 143,
-    143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143,   0,
-    143, 143,   0, 143, 143, 143, 143, 143, 143,   0,   0,   0,   0,   0,   0,   0,
-    143, 143,   0,   0,   0,   0,   0,   0, 144, 144, 144, 144, 144, 144, 144, 144,
-    144,   0,   0,   0,   0,   0,   0,   0, 170, 170,  15, 170,  15,  15,  15,  15,
-     15,  15,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  15,
-     63,  63,  63,  63,  63,  63,  63,  63,  63,  63,   0,   0,   0,   0,   0,   0,
-     63,  63,  63,  63,  63,  63,  63,   0,  63,  63,  63,  63,  63,   0,   0,   0,
-     63,  63,  63,  63,   0,   0,   0,   0,  81,  81,  81,  81,  81,  81,  81,  81,
-     81,  81,  81,  81,  81,  81,  81,   0,  81,   0,   0,   0,   0,   0,   0,   0,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,   0,
-     84,   0,   0,   0,   0,   0,   0,   0, 115, 115, 115, 115, 115, 115, 115, 115,
-    115, 115, 115, 115, 115, 115, 115,   0, 115, 115,   0,   0,   0,   0, 115, 115,
-    104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104,   0,   0,
-    108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108,   0,   0,
-    108, 108,   0, 108, 108, 108, 108, 108,   0,   0,   0,   0,   0, 108, 108, 108,
-    145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145,   0,   0,   0,   0,   0,
-     99,  99,  99,  99,  99,  99,  99,  99,  99,  99,  99,   0,   0,   0,   0,  99,
-      0,   0,   0,   0,   0,   0,   0,  99, 137, 139,   1,   1,   0,   0,   0,   0,
-    137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137,   0,   0,   0,   0,   0,
-     34,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,  34,  34,  34,  34, 139, 139, 139, 139, 139, 139, 139, 139,
-    139, 139, 139, 139,   0,   0,   0,   0, 105, 105, 105, 105, 105, 105, 105, 105,
-    105, 105, 105,   0,   0,   0,   0,   0, 105, 105, 105, 105, 105,   0,   0,   0,
-    105,   0,   0,   0,   0,   0,   0,   0, 105, 105,   0,   0, 105, 105, 105, 105,
-    105, 105, 105, 105,   0,   0,   0,   0,   1,   1,   1,   1,   1,   1,   1,  41,
-     41,  41,   1,   1,   1,   1,   1,   1,   1,   1,   1,  41,  41,  41,  41,  41,
-     41,  41,  41,   1,   1,  41,  41,  41,  41,  41,  41,  41,   1,   1,   1,   1,
-      1,   1,  41,  41,  41,  41,   1,   1,   1,   0,   0,   0,   0,   0,   0,   0,
-     36,  36,   1,   1,   1,   1,   1,   1,   0,   0,   1,   0,   0,   1,   1,   0,
-      0,   1,   1,   1,   1,   0,   1,   1,   1,   1,   0,   1,   0,   1,   1,   1,
-      1,   1,   1,   1,   0,   1,   1,   1,   1,   1,   1,   1,   1,   1,   0,   1,
-      1,   1,   1,   0,   0,   1,   1,   1,   1,   1,   0,   1,   1,   1,   1,   0,
-      1,   1,   1,   1,   1,   0,   1,   0,   0,   0,   1,   1,   1,   1,   1,   1,
-      1,   0,   1,   1,   1,   1,   1,   1, 131, 131, 131, 131, 131, 131, 131, 131,
-    131, 131, 131, 131,   0,   0,   0,   0,   0,   0,   0, 131, 131, 131, 131, 131,
-      0, 131, 131, 131, 131, 131, 131, 131,  57,   0,   0,  57,  57,  57,  57,  57,
-     57,  57,   0,  57,  57,   0,  57,  57,  57,  57,  57,   0,   0,   0,   0,   0,
-    151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151,   0,   0,   0,
-    151, 151, 151, 151, 151, 151,   0,   0, 151, 151,   0,   0,   0,   0, 151, 151,
-    152, 152, 152, 152, 152, 152, 152, 152, 152, 152,   0,   0,   0,   0,   0, 152,
-    113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113,   0,   0, 113,
-    113, 113, 113, 113, 113, 113, 113,   0, 132, 132, 132, 132, 132, 132, 132, 132,
-    132, 132, 132, 132,   0,   0,   0,   0, 132, 132,   0,   0,   0,   0, 132, 132,
-      1,   1,   1,   1,   1,   0,   0,   0,   7,   7,   7,   7,   0,   7,   7,   7,
-      0,   7,   7,   0,   7,   0,   0,   7,   0,   7,   7,   7,   7,   7,   7,   7,
-      7,   7,   7,   0,   7,   7,   7,   7,   0,   7,   0,   7,   0,   0,   0,   0,
-      0,   0,   7,   0,   0,   0,   0,   7,   0,   7,   0,   7,   0,   7,   7,   7,
-      0,   7,   0,   7,   0,   7,   0,   7,   0,   7,   7,   7,   7,   0,   7,   0,
-      7,   7,   0,   7,   7,   7,   7,   7,   7,   7,   7,   7,   0,   0,   0,   0,
-      0,   7,   7,   7,   0,   7,   7,   7,   0,   0,   0,   0,   0,   0,   1,   1,
-     33,   1,   1,   0,   0,   0,   0,   0,   1,   1,   1,   0,   0,   0,   1,   1,
-     36,  36,  36,  36,  36,  36,  36,   0,  36,  36,  36,  36,  36,   0,   0,   0,
-     36,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,
-};
-
-/* Script_Extensions: 14272 bytes. */
-
-static RE_ScriptExt re_scripts_extensions_table[] = {
-    {{  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{  1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{  2,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{  3,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{  4,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{  5,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{  6,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{  7,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{  8,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{  9,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 10,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 11,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 12,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 13,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 14,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 15,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 16,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 17,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 18,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 19,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 20,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 21,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 22,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 23,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 24,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 25,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 26,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 27,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 28,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 29,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 30,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 31,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 32,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 33,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 34,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 35,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 36,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 37,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 38,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 39,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 40,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 41,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 42,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 43,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 44,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 45,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 46,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 47,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 48,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 49,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 50,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 51,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 52,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 53,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 54,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 55,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 56,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 57,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 58,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 59,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 60,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 61,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 62,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 63,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 64,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 65,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 66,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 67,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 68,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 69,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 70,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 71,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 72,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 73,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 74,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 75,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 76,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 77,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 78,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 79,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 80,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 81,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 82,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 83,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 84,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 85,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 86,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 87,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 88,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 89,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 90,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 91,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 92,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 93,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 94,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 95,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 96,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 97,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 98,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 99,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{100,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{101,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{102,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{103,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{104,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{105,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{106,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{107,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{108,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{109,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{110,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{111,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{112,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{113,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{114,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{115,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{116,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{117,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{118,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{119,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{120,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{121,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{122,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{123,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{124,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{125,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{126,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{127,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{128,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{129,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{130,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{131,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{132,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{133,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{134,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{135,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{136,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{137,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{138,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{139,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{140,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{141,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{142,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{143,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{144,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{145,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{146,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{147,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{148,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{149,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{150,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{151,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{152,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{  7,  55,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{  7, 146,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{  7,   8,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{  7,   9,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{  5,  24,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 10,  11,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 35,  36,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 54,  85,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 48,  52,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{  4,  57,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{  2,   4,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{  4, 120,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 10, 107,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 10, 150,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 10, 100,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 10,  15,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{  2,  24,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 15, 107,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 13, 109,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 12, 129,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 33,  34,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 17, 150,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{  2,  32,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 32,  65,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{  7,   8,   9,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 11,  59,  96,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 23,  47,  96,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 48,  52, 110,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 10,  17, 107,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{  2,  10, 107,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 33,  34,  36,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{  2,  23,  72,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{  7,   8,   9, 146,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 10,  11,  17, 107,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 42,  43,  44,  45,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 10,  92, 111, 142,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 25,  33,  34,  35,  36,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 25,  33,  34,  35,  36,  37,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 10,  14,  15,  16,  17,  18,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{  7,   8,  95, 112, 121, 132, 146, 147,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 10,  11,  14,  16,  17, 107, 124, 150,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 10,  12,  13,  92, 102, 109, 111, 114, 123, 124, 142,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{  2,  10,  11,  12,  13,  14,  15,  16,  17,  18, 107, 124,   0,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{  2,  10,  11,  12,  13,  14,  15,  16,  17,  18, 100, 107, 124,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 10,  12,  13,  17,  92, 102, 109, 111, 114, 123, 124, 142, 150,   0,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 10,  12,  13,  17,  18,  92, 102, 109, 111, 114, 123, 124, 142, 150,   0,   0,   0,   0,   0,   0,   0}},
-    {{ 10,  11,  12,  13,  14,  15,  16,  17,  18,  19,  59, 102, 107, 111, 123, 124, 138, 142, 143, 150,   0}},
-    {{ 10,  11,  12,  13,  14,  15,  16,  17,  18,  19,  46,  59, 102, 107, 111, 123, 124, 138, 142, 143, 150}}
-};
-
-int re_get_script_extensions(RE_UINT32 ch, RE_UINT8* scripts) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-    RE_UINT8* scr;
-    int count;
-
-    f = ch >> 11;
-    code = ch ^ (f << 11);
-    pos = (RE_UINT32)re_script_extensions_stage_1[f] << 4;
-    f = code >> 7;
-    code ^= f << 7;
-    pos = (RE_UINT32)re_script_extensions_stage_2[pos + f] << 4;
-    f = code >> 3;
-    code ^= f << 3;
-    pos = (RE_UINT32)re_script_extensions_stage_3[pos + f] << 3;
-    value = re_script_extensions_stage_4[pos + code];
-
-    scr = re_scripts_extensions_table[value].scripts;
-    scripts[0] = scr[0];
-    count = 1;
-
-    if (scr[0] != 0) {
-        while (count < RE_MAX_SCX && scr[count] != 0) {
-            scripts[count] = scr[count];
-            ++count;
-        }
-    }
-
-    return count;
-}
-
-/* Word_Break. */
-
-static RE_UINT8 re_word_break_stage_1[] = {
-     0,  1,  2,  3,  4,  4,  4,  4,  4,  4,  5,  6,  6,  7,  4,  8,
-     9, 10, 11, 12, 13,  4, 14,  4,  4,  4,  4, 15,  4, 16, 17, 18,
-     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
-     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
-     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
-     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
-     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
-     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
-     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
-     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
-     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
-     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
-     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
-     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
-    19,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
-     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
-     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
-};
-
-static RE_UINT8 re_word_break_stage_2[] = {
-      0,   1,   2,   2,   2,   3,   4,   5,   2,   6,   7,   8,   9,  10,  11,  12,
-     13,  14,  15,  16,  17,  18,  19,  20,  21,  22,  23,  24,  25,  26,  27,  28,
-     29,  30,   2,   2,  31,  32,  33,  34,  35,   2,   2,   2,  36,  37,  38,  39,
-     40,  41,  42,  43,  44,  45,  46,  47,  48,  49,   2,  50,   2,   2,  51,  52,
-     53,  54,  55,  56,  57,  57,  57,  57,  57,  58,  57,  57,  57,  57,  57,  57,
-     57,  57,  57,  57,  57,  57,  57,  57,  59,  60,  61,  62,  63,  57,  57,  57,
-     64,  65,  66,  67,  57,  68,  69,  57,  57,  57,  57,  57,  57,  57,  57,  57,
-     57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,
-     57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,
-     57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,
-      2,   2,   2,   2,   2,   2,   2,   2,   2,  70,   2,   2,  71,  72,  73,  74,
-     75,  76,  77,  78,  79,  80,  81,  82,   2,   2,   2,   2,   2,   2,   2,   2,
-      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
-      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
-      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,  83,
-     57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,
-     57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,
-     57,  57,  57,  57,  57,  57,  84,  85,   2,   2,  86,  87,  88,  89,  90,  91,
-     92,  93,  94,  95,  57,  96,  97,  98,   2,  99, 100,  57,   2,   2, 101,  57,
-    102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112,  57,  57,  57, 113, 114,
-    115, 116, 117, 118, 119, 120, 121,  57, 122, 123,  57, 124, 125, 126, 127,  57,
-    128, 129,  57, 130, 131, 132,  57,  57, 133, 134, 135, 136,  57, 137,  57,  57,
-      2,   2,   2,   2,   2,   2,   2, 138, 139,   2, 140,  57,  57,  57,  57,  57,
-     57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,
-      2,   2,   2,   2,   2,   2,   2,   2, 141,  57,  57,  57,  57,  57,  57,  57,
-     57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,
-     57,  57,  57,  57,  57,  57,  57,  57,   2,   2,   2,   2, 142,  57,  57,  57,
-     57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,
-     57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,
-      2,   2,   2,   2, 143, 144, 145, 146,  57,  57,  57,  57, 147,  57, 148, 149,
-    150,  57, 151,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,
-     57,  57,  57,  57,  57,  57,  57,  57, 152, 153,  57,  57,  57,  57,  57,  57,
-     57,  57, 154, 155, 156,  57,  57,  57, 157, 158, 159,   2,   2, 160, 161, 162,
-     57,  57,  57,  57, 163, 164,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,
-    165,  57, 166,  57,  57, 167,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,
-      2, 168, 169,  57,  57,  57,  57,  57,  57,  57,  57,  57, 170, 171,  57,  57,
-     57,  57, 172, 173,  57,  57,  57, 174,  57,  57,  57,  57,  57,  57,  57,  57,
-     57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,
-    175,  57, 176, 177,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,
-     57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,
-};
-
-static RE_UINT8 re_word_break_stage_3[] = {
-      0,   0,   1,   2,   0,   0,   0,   0,   3,   4,   0,   5,   6,   6,   7,   0,
-      8,   9,   9,   9,   9,   9,  10,  11,   8,   9,   9,   9,   9,   9,  10,   0,
-      0,  12,   0,   0,   0,   0,   0,   0,   0,   0,  13,  14,   0,  15,  13,   0,
-      9,   9,   9,   9,   9,  10,   9,   9,   9,   9,   9,   9,   9,  10,   9,   9,
-      9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,
-      9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,
-      9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,
-      9,   9,   9,   9,   9,   9,   0,  16,   9,  17,   0,   9,   9,   9,   9,   9,
-     18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,
-     18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,   9,  19,  16,  20,
-      0,  21,  10,  19,   9,   9,   9,   9,  22,   9,   9,   9,   9,   9,   9,   9,
-      9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,  22,   9,   9,
-     23,  18,  24,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,
-      9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,
-      9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   8,   9,   9,   9,
-      9,   9,   9,   9,   9,  10,  25,  26,   9,   9,   9,   9,   9,   9,   9,   9,
-      9,   9,  27,   0,  28,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  29,
-     30,  29,   0,   0,  31,  31,  31,  31,  31,  31,  32,  33,  34,  35,   0,   0,
-     36,  37,   0,  38,  18,  18,  39,  40,   9,   9,   9,   9,   9,   9,   9,   9,
-      9,   9,  41,  18,  18,  18,  18,  18,   6,   6,  42,  43,  44,   9,   9,   9,
-      9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,
-      9,   9,   9,   9,   9,  45,  18,  46,  18,  47,  48,  24,   6,   6,  49,  50,
-      0,   0,   0,  51,  52,   9,   9,   9,   9,   9,   9,   9,  18,  18,  18,  18,
-     18,  18,  39,   8,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,
-      9,   9,   9,   9,   9,   9,   9,   9,   9,  53,  18,  18,  54,   0,   0,   0,
-      6,   6,  49,   9,   9,   9,   9,   9,   9,   9,  41,  18,  18,  55,  56,  57,
-      9,   9,   9,   9,   9,  53,  58,  18,  18,  59,  59,  60,   0,   0,   0,   0,
-      9,   9,   9,   9,   9,   9,  59,   0,   9,   9,  10,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   9,   9,   9,   9,   9,  19,   9,  55,
-      0,   0,   0,   0,  61,  18,  18,  18,  62,  18,  18,  18,  18,  18,  18,  18,
-     18,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,  53,  63,
-     18,  18,  18,  18,  59,  18,   9,   9,  53,  64,   6,   6,   8,   9,   9,   9,
-     59,   8,   9,  50,  50,   9,   9,   9,   9,   9,  19,   9,  26,  16,  55,  63,
-     18,  65,  65,  66,   0,  61,   0,  22,  53,  64,   6,   6,  55,   0,   0,  67,
-     28,   8,  10,  68,  50,   9,   9,   9,   9,   9,  19,   9,  19,  69,  55,  48,
-     39,  61,  65,  60,  57,   0,   8,  26,   0,  64,   6,   6,  24,  70,   0,   0,
-     28,   8,   9,  22,  22,   9,   9,   9,   9,   9,  19,   9,  19,   8,  55,  63,
-     18,  29,  29,  60,  17,   0,   0,   0,  53,  64,   6,   6,   0,   0,  45,  18,
-     28,   8,   9,  50,  50,   9,   9,   9,   9,   9,  19,   9,  19,   8,  55,  63,
-     18,  65,  65,  60,   0,  71,   0,  22,  53,  64,   6,   6,  72,   0,   0,   0,
-     73,   8,  10,  16,  19,  55,  69,  19,  68,  17,  10,  16,   9,   9,  55,  71,
-     39,  71,  48,  60,  17,  61,   0,   0,   0,  64,   6,   6,   0,   0,   0,   0,
-     18,  44,   9,  19,  19,   9,   9,   9,   9,   9,  19,   9,   9,   9,  55,  45,
-     18,  48,  48,  60,   0,  30,  10,   0,  53,  64,   6,   6,   0,   0,   0,   0,
-     59,   8,   9,  19,  19,   9,   9,   9,   9,   9,  19,   9,   9,   8,  55,  63,
-     18,  48,  48,  60,   0,  30,   0,  13,  53,  64,   6,   6,  69,   0,   0,   0,
-     18,   8,   9,  19,  19,   9,   9,   9,   9,   9,   9,   9,   9,   9,  41,  63,
-     18,  48,  48,  66,   0,  41,   0,  68,  53,  64,   6,   6,   0,   0,  16,   9,
-     71,   8,   9,   9,   9,  10,  16,   9,   9,   9,   9,   9,  22,   9,   9,  72,
-      9,  10,  74,  61,  18,  75,  18,  18,   0,  64,   6,   6,  71,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  57,  18,  39,   0,
-      0,  61,  18,  39,   6,   6,  76,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  57,  18,  18,  77,
-      0,   0,  18,  60,   6,   6,  76,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     17,   0,   0,   0,   0,   0,  60,   0,   6,   6,  76,   0,   0,  78,  57,  71,
-      9,   9,   8,   9,   9,   9,   9,   9,   9,   9,   9,  17,  28,  18,  18,  18,
-     18,  48,   9,  59,  18,  18,  28,  18,  18,  18,  18,  18,  18,  18,  18,  77,
-      0,  74,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  61,  18,  18,  18,  18,  39,
-      6,   6,  76,   0,   0,  71,  60,  71,  48,  65,  18,  60,  28,  77,   0,   0,
-     71,  18,  18,  29,   6,   6,  79,  60,   9,   9,   9,   9,   9,   9,   9,   9,
-      9,  22,   0,  72,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,  10,   9,
-      9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,
-      9,   9,  19,  55,   9,  10,  19,  55,   9,   9,   9,   9,   9,   9,   9,   9,
-      9,   9,  19,  55,   9,   9,   9,   9,   9,   9,   9,   9,  19,  55,   9,  10,
-     19,  55,   9,   9,   9,  10,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,
-      9,   9,   9,   9,  19,  55,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,
-      9,   9,   9,   9,   9,   9,  10,  28,   0,   0,   0,   0,   0,   0,   0,   0,
-      9,   9,   9,   9,   0,   0,   0,   0,   9,   9,   9,   9,   9,   9,   9,   9,
-      9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,  55,   9,  55,
-      8,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,
-      9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,
-      9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,
-      9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,  50,   9,   9,   9,   9,
-     80,   9,   9,   9,   9,   9,  10,   0,   9,   9,   9,   9,   9,   9,   9,   9,
-      9,   9,   9,   9,   9,   9,   9,   9,   9,   9,  10,  16,   9,   9,  17,   0,
-      9,   9,   9,  19,  53,  77,   0,   0,   9,   9,   9,   9,  53,  77,   0,   0,
-      9,   9,   9,   9,  53,   0,   0,   0,   9,   9,   9,  19,  81,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  18,  18,  18,
-     18,  18,  18,  18,  18,   0,   0,  57,   6,   6,  76,   0,   0,   0,   0,   0,
-      0,   0,  61,  82,   6,   6,  76,   0,   9,   9,   9,   9,   9,   9,   9,   9,
-      9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,  17,   0,
-      9,  83,   9,   9,   9,   9,   9,   9,   9,   9,  84,   0,   9,   9,   9,   9,
-      9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,  55,   0,   0,
-      9,   9,   9,   9,   9,   9,   9,  10,  18,  18,  18,   0,  18,  18,  18,   0,
-      0,  64,   6,   6,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   6,   6,  76,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      9,   9,   9,   9,   9,  41,  18,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,  28,  18,  39,  18,  18,  18,  18,  18,  18,  18,  65,
-      6,   6,  76,   0,   6,   6,  76,   0,   0,   0,   0,   0,  18,  18,  18,  39,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     18,  44,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,  18,  18,  18,
-     18,  44,   9,   0,   6,   6,  76,   0,   0,   0,  61,  18,  18,   0,   0,   0,
-     85,   9,   9,   9,   9,   9,   9,   9,  59,  18,  18,  24,   6,   6,  49,   9,
-      9,   9,   9,   9,   9,   9,   9,   9,   9,  53,  18,  18,  18,   0,   0,   0,
-      9,   9,   9,   9,   9,   9,   9,   9,   9,  18,  18,  18,  18,  18,   0,   0,
-      6,   6,  76,   8,   6,   6,  49,   9,   9,   9,   9,   9,   9,   9,   9,  55,
-      9,   9,  17,   0,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,  10,   8,
-      0,   0,   0,   0,  39,  18,  18,  18,  18,  18,  44,  52,   9,  47,  66,   0,
-      9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,
-     18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  29,  18,
-      9,   9,   9,   9,   9,  55,   9,  55,   9,   9,   9,   9,   9,   9,   9,   9,
-      9,  55,   9,  55,   9,   9,  25,  25,   9,   9,   9,   9,   9,   9,   9,  55,
-      9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,  19,   9,  26,
-     16,  19,   9,  17,   9,  16,   9,   0,   9,   9,   9,  17,  16,  19,   9,  17,
-     86,  87,  87,  88,   0,   0,  89,   0,   0,  90,  91,  92,   0,   0,   0,  11,
-     93,  94,   0,   0,   0,  93,   0,  95,  36,  96,  36,  36,  72,   0,   0,  68,
-      0,   0,   0,   0,   9,   9,   9,  17,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,  18,  18,  18,  18,  18,  18,  18,  18,  77,   0,   0,   0,
-     13,  68,  16,   9,   9,  72,   8,  55,   0,  26,  19,  22,   9,   9,  55,   9,
-      0,   8,  55,  13,   0,   0,   0,   0,   9,   9,   9,   9,   9,   9,   9,   9,
-      9,   9,  17,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  16,   9,   9,
-      9,   9,   9,   9,   9,   9,   9,   9,   9,   9,  55,   0,   0,   0,   0,   0,
-      9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,  10,   9,   9,   9,   9,
-      9,   9,   9,   9,   9,   9,   9,  10,   9,   9,   9,   9,   9,   9,   9,   9,
-      9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,
-      9,   9,   9,   9,   9,   9,   9,   9,   9,  17,  68,  41,  24,   0,   0,   0,
-      9,   9,   9,   9,   9,   9,   9,   9,   9,  22,   0,  72,   9,   9,   9,   9,
-      9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   0,  68,   0,   0,   0,  61,
-      9,   9,   9,   9,   9,  10,   0,   0,   9,  10,   9,  10,   9,  10,   9,  10,
-      9,  10,   9,  10,   9,  10,   9,  10,  18,  18,  18,  18,  18,  18,  18,  18,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  68,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     97,  72,   0,   0,   0,   0,   0,   0,   0,   0,  71,  18,  98,  99,  68,  17,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0, 100, 101, 102, 102, 102, 102, 102, 102, 102, 102,
-    102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 103, 102,
-      0,   8,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   8,   9,   9,   9,
-      9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,
-      9,   9,   9,  10,   0,   0,   0,   0,   9,   9,   9,   9,   9,   9,  10,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 102, 102, 102, 102,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 103,
-    102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102,
-    102, 102, 102, 102, 102, 102,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      9,   9,   9,  17,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,  55,
-      9,   9,   9,  17,   9,   9,   9,   9,   6,   6,  49,   0,   0,   0,   0,   0,
-      9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,  41,  39,  18,  18, 104,
-      9,   9,   9,   9,   9,   9,   9,  53,   9,   9,   9,   9,   9,   9,   9,   9,
-      9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,  60,   0,   0,   0,
-      0,   0,   0,   0,   0,  68,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,
-      9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,
-      9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,
-     16,  10,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  68,   9,   9,
-    105, 105,  41,   9,   9,   9,   9,   9,  41,  18,   0,   0,   0,   0,   0,   0,
-      9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   0,   0,   0,
-     24,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,  18,  18,  18,
-     18,  60,   0,   0,   6,   6,  76,   0,  18,  18,  18,  18,  24,   9,  68, 106,
-      6,   6,  49,   9,   9,   9,   9,   9,   9,  53,  18,  60,   9,   9,   9,   9,
-      9,  41,  18,  18,  18,   0,   0,   0,   9,   9,   9,   9,   9,   9,   9,  17,
-     18,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,  41,  18,  18,  18,
-     77,   0,   0,  68,   6,   6,  76,   0,   0,  57,   0,   0,   6,   6,  76,   0,
-      9,   9,   9,   9,   9,   9,   9,   9,   9,   9,  59,  18,  18,  39,   0,   0,
-     41,   9,   9,  60,   6,   6,  76,   0,   0,   0,   0,   0,   0,   0,  61,  60,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  48,  65,  77,  71,
-     57,   0,   0,   0,   0,   0,   0,   0,   9,   9,  41,  18,  16, 107,   0,   0,
-      8,  10,   8,  10,   8,  10,   0,   0,   9,  10,   9,  10,   9,   9,   9,   9,
-      9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   0,   0,   9,   9,   9,   9,
-      9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,
-      9,   9,   9,   9,   9,   9,   9,   9,  41,  18,  39,  60,   6,   6,  76,   0,
-      9,   9,   9,   9,   9,   9,   9,   9,   9,   0,   0,   0,   9,   9,   9,   9,
-      9,  10,  68,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   0,
-      9,  10,   0,   0,  68,   9,   0, 108,  31,  31, 109,  31,  31,  32,  31, 110,
-    111, 109,  31,  31,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,
-      9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,  55,   0,   0,   0,
-      0,   0,   0,   0,  68,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,
-      9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,  55,
-      0,   0,   0,   0,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,
-      9,   9,   9,   9,  16,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,
-      9,   9,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   9,   9,   9,   0,
-     18,  18,  18,  18, 112,  94,   0,   0,  18,  18,  18,  18,  11,  93,   0,   0,
-      0,   0,   0, 113,   5, 114,   0,   0,   0,   0,   0,   0,   9,  19,   9,   9,
-      9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,
-      9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9, 115,
-      0, 116,   0,   5,   6,   6,   7,   0,   8,   9,   9,   9,   9,   9,  10,  11,
-      8,   9,   9,   9,   9,   9,  10,   0,   0, 117, 102, 102, 102, 102, 102, 102,
-    102, 102, 102, 102, 102, 102, 102, 118,   9,   9,   9,   9,   9,   9,   9,  10,
-     16,   9,  16,   9,  16,   9,  16,  17,   0,   0,   0,   0,   0,   0, 119,   0,
-      9,   9,   9,   8,   9,   9,   9,   9,   9,  10,   9,   9,   9,   9,  10,  22,
-      9,   9,   9,  55,   9,   9,   9,  55,   0,   0,   0,   0,   0,   0,   0,   0,
-      9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,
-      9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,  10,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,  17,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  57,
-      9,   9,   9,   9,   9,   9,   9,  17,   9,   9,   9,   9,   9,   9,   9,   9,
-      9,   9,   9,   9,  17,   0,   0,   0,  77,   0,   0,   0,   0,   0,   0,   0,
-      9,   9,   9,   9,   9,   9,   9,   9,   0,   0,   0,   8,   9,   9,   9,   9,
-      9,   9,  10,   0,   9,   9,   9,   9,   9,   9,   9,   9,   9,  53,  39,   0,
-      9,   9,   9,   9,   9,   9,   9,  55,   9,   9,   9,   9,   9,   9,   9,   9,
-      9,   0,   9,   9,   8,  55,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      9,   9,   9,   9,   9,   9,   9,  55,   6,   6,  76,   0,   9,   9,   9,   9,
-      9,   9,   9,   9,   9,   0,   9,   9,   9,   9,   9,   9,   9,   9,   9,   0,
-      9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   0,   0,   9,   9,   9,   9,
-      9,   9,   9,   9,   9,   9,   9,   9,   9,   0,   0,   0,   0,   0,   0,   0,
-      9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,  10,   0,   0,
-      9,   9,   9,   9,   9,  55,   0,   0,   9,   9,   0,   0,   0,   0,   0,   0,
-      9,  55,  19,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,  22,  17,  50,
-      9,   9,   9,   9,   9,  55,   0,   0,   9,   9,   9,   9,   9,  10,   0,   0,
-      9,   9,   9,   9,   9,   9,   9,  10,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   9,   9,   9,   9,  10,  55,   0,   0,
-      9,   9,   9,   9,   9,  55,   0,   0,   9,   9,   9,   9,   9,   9,  55,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   0,  16,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     59,  30,   0,  18,   9,   8,   8,   9,   9,   9,   9,   9,   9,  55,  39,  61,
-      0,   0,   0,   0,   0,   0,   0,   0,   9,   9,   9,   9,   9,   9,   9,  17,
-      9,   9,   9,   9,   9,   9,   9,  17,   0,   0,   0,   0,   0,   0,   0,   0,
-      9,   9,   8,   9,   9,   9,   9,   9,   9, 107,   0,   0,   0,   0,   0,   0,
-      9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,  55,   0,   0,
-      9,   9,   9,   9,   9,  55,   0,   0,   9,   9,   9,   9,  10,   0,   0,   0,
-      9,   9,   9,   9,  55,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,
-      9,   9,  17,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,  10,   0,   0,   0,
-      9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,  10,   0,   0,   0,
-      9,   9,   9,   9,   9,   9,   9,   9,   9,  18,   0,   0,   6,   6,  76,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      9,   9,   9,   9,   9,   9,   9,  17,   0,  68,   0,   0,   9,   9,   9,   9,
-      9,  53,  18,  18,  77,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   9,   9,   9,   9,   9,  10,   0,   0,
-     85,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,  18,  18,
-     18,  39,   0,   0,   0,   0,   0,   0,   0,  64,   6,   6,   0,   0,   0,  61,
-     85,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,  18,  18,  39,  14,
-      0,   0,   0,  14,   9,   9,   9,   9,   9,   9,  17,   0,   6,   6,  76,   0,
-     85,   9,   9,   9,   9,   9,   9,   9,   9,  41,  18,  18,  18, 120,   6,   6,
-      0, 107,   0,   0,   9,   9,   9,   9,   9,   9,   9,   9,  41,  13,   0,   0,
-     85,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,  41,  18,  18,  18,
-     44,  17,  28,  77,   6,   6, 121,  17,   0,   0,   0,   0,   0,   0,   0,   0,
-      9,   9,   9,   9,  22,   9,   9,   9,   9,   9,   9,  18,  18,  18,   0,  74,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      9,  10,  19,  22,   9,   9,   9,  22,   9,   9,  17,   0,   9,   9,   9,   9,
-      9,   9,   9,   9,   9,   9,   9,  41,  18,  18,  39,   0,   6,   6,  76,   0,
-     18,   8,   9,  50,  50,   9,   9,   9,   9,   9,  19,   9,  19,   8,  23,  63,
-     18,  65,  65,  60,  17,  61,   0,   8,  53,  71,  18,  77,  18,  77,   0,   0,
-      9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,  59,  18,  18,
-     18,  85,  10,   0,   6,   6,  76,  73,   0,   0,   0,   0,   0,   0,   0,   0,
-      9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,  18,  18,  18,  18,
-     18,  22,   0,   0,   6,   6,  76,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,  41,  18,  60,  18,  18,
-     77,   0,   0,   0,   0,   0,   9,  60,   0,   0,   0,   0,   0,   0,   0,   0,
-      9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,  18,  18,  18,  18,
-     77,  17,   0,   0,   6,   6,  76,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      9,   9,   9,   9,   9,   9,   9,   9,   9,   9,  41,  18,  18,  18,  17,   0,
-      6,   6,  76,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,  28,  18,  18,  18,   0,   6,   6,  76,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,  18,  18,  18,  39,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   9,   9,   9,   9,   9,   9,   9,   9,
-      9,   9,   9,   9,   9,   9,   9,   9,   6,   6,  76,   0,   0,   0,   0,  68,
-      0,   0,   0,   0,   0,   0,   0,   0,   9,   9,  16,   9,   9,   9,   9,   9,
-      9,   9,   9,   9,  59,  18,  71,  18, 122,  77,   0,   0,   0,   0,   0,   0,
-     59,  18,  85,   9,   9,   9,   9,   9,   9,   9,   9,   9,  41,  18,  58,  39,
-      0,  61,   0,   0,  59,  18,  18,   9,   9,   9,   9,   9,   9,   9,   9,   9,
-      9,   9,  53,  18,  18,  18,  60,  72,   0,   0,   0,   0,   0,   0,   0,   0,
-      9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,  17,   0,
-      9,   9,  19,   9,   9,   9,   9,   9,   9,   9,   9,  41,  18,  39,  18,  18,
-     17,   0,   0,   0,   6,   6,  76,   0,   0,   0,   0,   0,  16,   9,   9,   9,
-      9,   9,   9,   9,  71,  18,  18,  18,  18,  18,  28,  18,  18,  39,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      9,  10,  22,   9,   9,   9,   9,   9,   9,   9,   9,   9,  59,  39,  74,  29,
-     18,  58,   0,   0,   6,   6,  76,   0,   9,  22,  19,   9,   9,   9,   9,   9,
-      9,   9,  53,  39,  29,  18,  17,   0,   6,   6,  76,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   9,   9,   9,   9,  41,  39,   0,   0,
-      9,   9,   9,   9,   9,   9,  55,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,
-      9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,  10,   0,   0,   0,   0,
-      9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,
-      9,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,  10,  36,  36,  40,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,
-      9,  10,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,  17,   0,
-      9,   9,   9,   9,   9,   9,   9,  10,   6,   6,  76,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   9,   9,   9,   9,   9,   9,   9,  55,  18,  77,   0,   0,
-      9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,  18,  39,   0,   0,
-      9,   0,   0,   0,   6,   6,  76,   0,  68,   9,   9,   9,   9,   9,   0,   8,
-      9,   9,   9,   9,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,
-      9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,
-      9,   9,  10,  61,  59,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,
-     18,  18,   0,  61,  85,   9,   9,   9,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,  22,   0,   0,   0,   0,   0,   0,   0,
-    101,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0, 102,   0,   0,   0,   0,   0,   0,
-      9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,
-      9,   9,   9,   9,   9,   9,   9,   9,   9,   9,  10,   0,   9,   9,   9,  17,
-      9,   9,  17,   0,   9,   9,  55,  30,  36,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,  28,  60,  28, 123,  36, 124,  18,
-     39,  28,  18,   0,   0,   0,   0,   0,   0,   0,  71,  60,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     71,  77,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,
-      9,   9,   9,   9,   9,  19,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,
-      9,   9,   9,   9,   9,   9,   9,  19,  13,  69,   8,  19,   9,   9,  22,   8,
-      9,   8,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,
-      9,  22,  10,   8,   9,  19,   9,  19,   9,   9,   9,   9,   9,   9,  22,  10,
-      9,  26,  16,   9,  19,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,
-      9,   9,   9,   9,   9,   9,   9,   9,   9,  55,   9,   9,   9,   9,   9,   9,
-     19,   9,   9,   9,   9,   9,  10,   9,   9,   9,   9,   9,   9,   9,  10,   9,
-      9,   9,   9,   9,   9,  19,   9,   9,   9,   9,   9,   9,   9,  19,   9,   9,
-      9,   9,   9,  10,   9,   9,   9,   9,   9,   9,   9,  10,   9,   9,   9,   9,
-      9,   9,  19,   9,   9,   9,   9,   9,   9,   9,  19,   9,   9,   9,   9,   9,
-     10,   9,   9,  64,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,
-     18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  39,  61,  18,
-     18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  77,   0,  57,   0,   0,
-      0,  77,   0,   0,   0,   0,  61,  18,  28,  18,  18,  18,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     18,  39,  18,  18,  18,  18,  65,  18,  29,  48,  39,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,  17,  18,  85,   9,  55,
-      6,   6,  76,  13,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,  18,   6,   6,  76,   0,
-      9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,
-      9,  17,   0,   0,  18,  39,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,
-      9,  18,  85,   0,   6,   6,  76,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      9,   8,   9,   9,   9,   9,   9,   9,  69,  50,   8,   9,  10,   9,  25,   0,
-     13,  68,  25,   8,  69,  50,  25,  25,  69,  50,  10,   9,  10,   9,   8,  26,
-      9,   9,  22,   9,   9,   9,   9,   0,   8,   8,  22,   9,   9,   9,   9,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   9,   9,   9,   9,
-      9,   9,  55,   0,   9,   9,   9,   9,   9,   9,  55,   0,   9,   9,   9,   9,
-      9,   9,  55,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0, 125, 126, 126, 126, 126, 126, 126,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  61,  18,
-     14,   0,   0,   0,   0,   0,   0,   0,  18,  18,  18,  18,  18,  18,  18,  18,
-     18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,
-     18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,
-     18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,
-     18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,
-     18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,   0,   0,   0,   0,
-};
-
-static RE_UINT8 re_word_break_stage_4[] = {
-     0,  0,  0,  0,  0,  0,  5,  6,  6,  4,  0,  0, 18,  0,  1,  0,
-     0,  0,  0,  2, 13,  0, 14,  0, 15, 15, 15, 15, 15, 15, 12, 13,
-     0, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,  0,  0,  0,  0, 16,
-     0,  6,  0,  0,  0,  0, 11,  0,  0,  9,  0,  0,  0, 11,  0, 12,
-     0,  0, 11, 11, 11,  0,  0,  0,  7,  7,  7,  7, 11,  0, 11, 11,
-    11, 11, 13, 11,  0,  0, 11, 12, 11, 11,  0, 11, 11, 11,  0,  7,
-     7,  7, 11, 11,  0, 11,  0, 11, 11,  0, 11,  0, 11, 13,  0,  0,
-     0,  7,  7,  7,  7,  7,  0,  7,  0,  7,  7,  0,  3,  3,  3,  3,
-     3,  3,  3,  0,  0,  0,  0,  3,  3,  3,  3, 11, 12,  0,  0,  0,
-     9,  9,  9,  9,  9,  9,  0,  0, 13, 13,  0,  0,  7,  7,  7,  0,
-     9,  0,  0,  0, 11, 11, 11,  7, 15, 15,  0, 15, 13,  0, 11, 11,
-     7, 11, 11, 11,  0, 11,  7,  7,  7,  9,  0,  7,  7, 11, 11,  7,
-     7,  0,  7,  7, 15, 15, 11, 11, 11,  0,  0, 11,  0,  0,  0,  9,
-    11,  7, 11, 11, 11, 11,  7,  7,  7, 11,  0,  0, 11, 11,  0,  0,
-    13,  0, 11,  0,  0,  7,  0,  0,  7,  7, 11,  7, 11,  7,  7,  7,
-     7,  7,  0,  0,  0,  0,  0,  7,  7,  7,  9,  7,  7, 11,  7,  7,
-     0,  0, 15, 15,  7,  0,  0,  7,  7,  7, 11,  0, 11,  0,  7,  0,
-     0,  0,  0, 11,  0, 11, 11,  0, 11,  7,  0,  0,  0,  0,  7,  7,
-     0, 11,  0,  0,  0,  0,  7, 11,  0,  0,  7,  0,  7,  0,  7,  0,
-    15, 15,  0,  0,  7,  0,  0,  0,  0,  7,  0,  7, 15, 15,  7,  7,
-    18, 11, 11, 11, 11,  0,  7,  7,  7,  7,  9,  0, 11,  7,  7, 11,
-    11,  7, 11,  0,  7,  7,  7, 11, 18, 18, 18, 18, 18, 18, 18,  0,
-     7, 17,  9,  9, 14, 14,  0,  0, 14,  0,  0, 12,  6,  6,  9,  9,
-     9,  9,  9, 16, 16,  0,  0,  0, 13,  0,  0,  0,  0,  0,  0, 18,
-     9,  0,  9,  9, 18,  0,  0,  0,  0, 10, 10, 10, 10, 10,  0,  0,
-     0,  7,  7, 10, 10,  0,  0,  0, 10, 10, 10, 10, 10, 10, 10,  0,
-     7,  7,  0, 11, 11, 11,  7, 11,  0, 11, 11,  7, 11,  7,  7,  0,
-     0,  3,  7,  3,  3,  0,  3,  3,  3,  0,  3,  0,  3,  3,  0,  3,
-    13,  0,  0, 12,  0, 16, 16, 16, 13, 12,  0,  0, 11,  0,  0,  9,
-     0,  0,  0, 14,  0,  0, 10, 10, 10, 10,  7,  7,  0,  9,  9,  9,
-     7,  0, 15, 15, 15, 15, 11,  0,  7, 11,  0, 11,  7,  7,  7,  9,
-     9,  9,  9,  7,  0,  0,  8,  8,  8,  8,  8,  8,
-};
-
-/* Word_Break: 7116 bytes. */
-
-RE_UINT32 re_get_word_break(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-
-    f = ch >> 12;
-    code = ch ^ (f << 12);
-    pos = (RE_UINT32)re_word_break_stage_1[f] << 5;
-    f = code >> 7;
-    code ^= f << 7;
-    pos = (RE_UINT32)re_word_break_stage_2[pos + f] << 5;
-    f = code >> 2;
-    code ^= f << 2;
-    pos = (RE_UINT32)re_word_break_stage_3[pos + f] << 2;
-    value = re_word_break_stage_4[pos + code];
-
-    return value;
-}
-
-/* Grapheme_Cluster_Break. */
-
-static RE_UINT8 re_grapheme_cluster_break_stage_1[] = {
-     0,  1,  2,  3,  4,  4,  4,  4,  4,  4,  5,  6,  7,  8,  4,  9,
-    10, 11,  4, 12,  4,  4, 13,  4,  4,  4,  4, 14,  4, 15, 16, 17,
-     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
-     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
-     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
-     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
-     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
-     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
-     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
-     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
-     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
-     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
-     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
-     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
-    18,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
-     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
-     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
-};
-
-static RE_UINT8 re_grapheme_cluster_break_stage_2[] = {
-      0,   1,   2,   3,   3,   3,   3,   3,   3,   3,   3,   3,   4,   5,   3,   3,
-      3,   3,   6,   3,   3,   3,   7,   8,   9,  10,   3,  11,  12,  13,  14,  15,
-     16,  17,   3,  18,  19,  20,  21,  22,  23,  24,  23,  25,  26,  27,  28,  29,
-     30,  31,  32,  33,  34,  35,  36,  37,  38,  39,  40,  41,  42,  43,  44,  45,
-     46,  47,  48,   3,  49,  50,  51,  52,   3,   3,   3,   3,   3,  53,   3,   3,
-      3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,  54,  55,  56,  57,
-     58,   3,  59,   3,  60,   3,   3,   3,  61,  62,  63,   3,  64,  65,  66,  67,
-     68,   3,   3,  69,   3,   3,   3,  70,   3,   3,   3,   3,   3,   3,   3,   3,
-     71,  72,   3,  73,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,
-      3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,
-      3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,
-      3,   3,   3,  74,   3,  75,   3,  76,   3,   3,   3,   3,   3,   3,   3,   3,
-     77,   3,  78,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,
-      3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,
-      3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,
-      3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,
-      3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,
-      3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,
-      3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,
-      3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,
-      3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,
-      3,   3,   3,   3,   3,   3,   3,   3,   3,  79,  80,  81,   3,   3,   3,   3,
-     82,   3,  83,  84,  85,  86,  87,  88,  89,  90,  91,  92,   3,   3,   3,  93,
-     94,  95,  96,  97,  98,  99, 100,  94,  95,  96,  97,  98,  99, 100,  94,  95,
-     96,  97,  98,  99, 100,  94,  95,  96,  97,  98,  99, 100,  94,  95,  96,  97,
-     98,  99, 100,  94,  95,  96,  97,  98,  99, 100,  94,  95,  96,  97,  98,  99,
-    100,  94,  95,  96,  97,  98,  99, 100,  94,  95,  96,  97,  98,  99, 100,  94,
-     95,  96,  97,  98,  99, 100,  94,  95,  96,  97,  98,  99, 100,  94,  95,  96,
-     97,  98,  99, 100,  94,  95,  96,  97,  98,  99, 100,  94,  95,  96,  97,  98,
-     99, 100,  94,  95,  96,  97,  98,  99, 100,  94,  95,  96,  97,  98,  99, 100,
-     94,  95,  96,  97,  98,  99, 100,  94,  95,  96,  97,  98,  99, 100,  94,  95,
-     96,  97,  98,  99, 100,  94,  95,  96,  97,  98,  99, 100,  94,  95,  96,  97,
-     98,  99, 100,  94,  95,  96,  97,  98,  99, 100,  94,  95,  96,  97,  98,  99,
-    100,  94,  95,  96,  97,  98,  99, 100,  94,  95,  96,  97,  98,  99, 101, 102,
-      3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,
-      3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,
-      3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,
-      3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,
-      3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3, 103,   3,   3,   3,
-      3,   3,   3,   3,   3,   3,   3,   3, 104,   3,   3,   1,   3,   3,  80, 105,
-      3,   3,   3,   3,   3,   3,   3, 106,   3,   3,   3, 107,   3, 108,   3,   3,
-      3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,
-      3,   3,   3,   3,   3,   3,   3,   3, 109,   3,   3, 110,   3,   3,   3,   3,
-      3,   3,   3,   3, 111,   3,   3,   3,   3,   3,   3,   3,   3, 112,   3,   3,
-    113, 114, 115, 116, 117, 118, 119, 120, 121,   3,   3, 122,  34, 123,   3,   3,
-    124, 125, 126, 127,   3,   3, 128, 129, 130, 131, 132,   3, 133,   3,   3,   3,
-    134,   3,   3,   3,   3,   3,   3, 135, 136, 137, 138,   3,   3,   3,   3,   3,
-    139,   3, 140,   3, 141, 142, 143,   3,   3,   3,   3, 144,   3,   3,   3,   3,
-      3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,
-    145,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,
-      3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,
-      3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,
-      3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,
-      3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,
-      3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3, 146, 147,   3,   3,   3,
-      3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3, 148, 149,   3,
-      3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,
-      3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,
-      3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,
-      3,   3, 150,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,
-      3,   3,   3,   3,   3, 151, 152,   3,   3, 153,   3,   3,   3,   3,   3,   3,
-      3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,
-      3,   3,   3,   3,   3,   3,   3,   3, 154, 155, 156,   3,   3,   3,   3,   3,
-      3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,
-    157,   3,   3,   3, 147,   3,   3,   3,   3,   3,   3, 158,   3,   3,   3,   3,
-      3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,
-      3,   3,   3, 159,   3, 160,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,
-      3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,
-      3,   3,   3,   3,   3,   3,   3, 161,   3,   3,   3,   3,   3,   3,   3, 162,
-      3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,
-      3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,
-      3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,
-    163,   4, 164, 164,   4,   4,   4, 165, 164, 164, 164, 164, 164, 164, 164, 164,
-    164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-    164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-    164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-};
-
-static RE_UINT8 re_grapheme_cluster_break_stage_3[] = {
-      0,   1,   0,   0,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   3,
-      0,   0,   0,   0,   2,   4,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
-      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   2,   2,
-      6,   7,   2,   2,   2,   2,   2,   2,   2,   2,   8,   5,   5,   5,   5,   9,
-     10,   2,   2,   2,   2,   2,   2,   2,  11,   2,   5,  12,   2,   2,   2,   2,
-      2,   6,   5,   5,   2,   2,  13,   2,   2,   2,  14,  15,  16,  17,   2,   2,
-      2,  18,  19,   2,   2,   2,   5,   5,   5,  20,   2,   2,   2,   2,   2,   2,
-      2,   2,   2,   2,  14,   5,  13,   2,   2,   2,   2,   2,   2,   6,  21,  22,
-      2,   2,  14,  23,  24,  25,   2,   2,   2,   2,   2,  26,   2,   2,   2,   2,
-      2,   2,   6,   5,  27,   5,   5,   5,  28,   2,   2,   2,   2,   2,   2,  29,
-     30,  31,   8,   2,  32,   2,   2,   2,  33,   2,   2,   2,   2,   2,   2,  34,
-     35,  36,  37,   2,  32,   2,   2,  38,  39,   2,   2,   2,   2,   2,   2,  40,
-     41,  42,  19,   2,   2,   2,  43,   2,  44,  45,   2,   2,  32,   2,   2,  46,
-     33,   2,   2,   2,   2,   2,   2,  47,  35,  36,  14,   2,  32,   2,   2,   2,
-     48,   2,   2,   2,   2,   2,   2,  49,  50,  51,  37,   2,   2,   2,   2,   2,
-     52,   2,   2,   2,   2,   2,   2,  14,  53,  17,  54,   2,  32,   2,   2,   2,
-     33,   2,   2,   2,   2,   2,   2,  55,  56,  57,  54,   2,  32,   2,   2,   2,
-     58,   2,   2,   2,   2,   2,   2,  59,  60,  61,  37,   2,  32,   2,   2,   2,
-     62,   2,   2,   2,   2,   2,   2,   2,   2,  63,  64,  65,   2,   2,  62,   2,
-      2,   2,   2,   2,   2,   2,  66,  20,  37,  67,   2,   2,   2,   2,   2,   2,
-      2,   2,   2,   2,   2,   2,  66,  68,   2,  69,   2,   2,   2,   2,   2,   2,
-      2,   2,   2,   7,   2,   2,  70,  71,   2,   2,   2,   2,   2,   2,   8,  72,
-     73,  74,   5,   8,   5,   5,   5,  68,  38,   2,   2,   2,   2,   2,   2,   2,
-      2,   2,   2,   2,   2,  74,  75,  76,   2,   2,  77,  78,  13,   2,  79,   2,
-     80,  22,   2,  22,   2,   2,   2,   2,  81,  81,  81,  81,  81,  81,  81,  81,
-     81,  81,  81,  81,  82,  82,  82,  82,  82,  82,  82,  82,  82,  83,  83,  83,
-     83,  83,  83,  83,  83,  83,  83,  83,   2,   2,   2,  74,   2,   2,   2,   2,
-      2,   2,  84,   2,   2,   2,  84,   2,   2,   2,  32,   2,   2,   2,  32,   2,
-      2,   2,   2,   2,   2,   2,  85,  86,  87,  30,  21,  22,   2,   2,   2,   2,
-      2,  88,   2,   2,   2,   2,   2,   2,  54,   2,   2,   2,   2,  19,   2,   2,
-      2,   2,   2,   2,  89,  90,  91,  92,   2,   2,  37,  93,   2,   2,   2,   2,
-      2,   2,  94,  67,  95,  96,  97,  16,   2,   2,   2,   2,   2,   2,   5,  67,
-     98,   2,   2,   2,   2,   2,  99, 100, 101,   2,   2,   2,   2,   6,  21,   2,
-    102,   2,   2,   2, 103, 104,   2,   2,   2,   2,   2,   2,  49, 105,  58,   2,
-      2,   2,   2,   2, 106, 107, 108,   2,   2,   2, 109,   5,  75, 110, 111,   7,
-      5,   5,   5,   5,   5,   5,   5,  23,   2, 112,   2,   2,   2, 113,   2,   2,
-      2,   2,   2,   2,   0,   0,   2,   2,   2,   2,   5,   5,   5,   5,  13,   2,
-      2,   2,   2,   2,   2,  37,   7,   2,   2,   2,   2,   2,   2,   2,   2,  37,
-      2,   2,   2,   2,   5,   5,   5,   5,   2,   2,   2,   2,   2,  46,   2,   2,
-      2,   2,   2, 114,   2,   2,   2,   2,   2,   2,   2,   2,   2,  37, 109,  69,
-      2,   2,   2,  14,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   7,   2,
-    115, 116,   2,   2, 117,   2,   2,   2, 118,   2,   2,   2,   2,   2, 106, 119,
-    120,   2,   2,   2,   5,   5,   7,  37,   2,   2,   2,   2,  14,  69,   2,   2,
-     37,   5,  58,   2,  81,  81,  81, 121,  28,   2,   2,   2,   2,   2, 122, 123,
-    124,   2,   2,   2,  22,   2,   2,   2,   2,   2,   2,   2,   2, 125, 126,   2,
-    116, 127,   2,   2,   2,   2,   2, 128,   2,   2,   2,   2,   2,   2, 129, 130,
-     19,   2,   2,   2,   2, 131, 132,   2,   2,   2,   2,   2, 133, 134,   2,   2,
-    135, 136, 136, 137, 136, 136, 136, 135, 136, 136, 137, 136, 136, 136, 135, 136,
-    136, 137, 136, 136, 136, 135, 136, 136, 137, 136, 136, 136, 135, 136, 136, 137,
-    136, 136, 136, 135, 136, 136, 137, 136, 136, 136, 135, 136, 136, 137, 136, 136,
-    136, 135, 136, 136, 137, 136, 136, 136, 136, 135, 136, 136, 138,   2,  82,  82,
-    139, 140,  83,  83,  83,  83,  83, 141,   2,   2,   2,  38,   2,   2,   2,   2,
-      5,   5,   2,   2,   5,   5,   2,   2,   2,   2,   2,   2,   2,   2,   0, 142,
-      2,   2,   2,   2,   2,   2,   2,  22,   2,   2,   2,   2,  13,   2,   2,   2,
-      2,   2,   2,   2,   2,   2,  14,  20, 143,  99,   2,   2,   2,   2,   2, 144,
-      2,   2,   2,   2,  54,   2,   2,   2,   2,   2,   2,   2,  99,   2,   2,   2,
-     14,   5,  13,   2,   2,   2,   2,   2, 145,   2,   2,   2,   2,   2,   2,   5,
-     67,   2,   2,   2,   2,   2,   2,  37, 102,   2,   2,   2,   2,   2, 146, 147,
-      2, 148,   2,   2,   2,   2,   2,   2,  20,   2,   2,   2,  37, 149,  68,   2,
-    150,   2,   2,   2,   2,   2, 116,   2, 102,   2,   2,   2,   2,   2, 151,  72,
-    152,  79,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2, 153, 154,  38,
-      2,   2,   2,  37,  97,  20,   2,   2, 155, 156,  37,   2, 157,  68,  68,   2,
-      2,   2,   2,   2,   2,   2, 158,   5, 159,   2,   2,  38,   2,   2,   2,   2,
-      2,   2,   2,   2,   2,   2, 160, 161, 162,   2,   2,   2,   2,   2,   2,   2,
-      2,   2,   2,   2,   2,  37, 163, 164,  13,   2,   2, 165,   2,   2,   2,   2,
-      2,   2,   2,   2,   2,   2,  97, 166,  13,   2,   2,   2,   2,   2,   2,   2,
-      2,   2,   2,   2,   2, 167, 168,   2,   2,   2,   2,  74, 169,  21,   2,   2,
-      2,   2,   2,   2,   2, 153,   5, 170,   2,   2, 171, 172, 173,   2,   2,   2,
-      8,  20,   2,   2,   2,   2,   6, 174,  37,   2, 125,  92,   2,   2,   2,   2,
-    175, 176,  72,   7,   2,   2,   2,   2,   2,   2,   2,   2,   2, 177,  67, 168,
-      2,   2,  46,   5,   5, 178, 179,   2,   2,   2,   2,   2,   2,   2, 180, 181,
-    182,   2,   2,   2,   2,   2,   2,   2,   2, 183, 184,   2,   2,   2,   2,   2,
-      2,   2,   2,   2,   2,   2, 185,   2,   2,   2,   2,   2,   2,   2,   0, 186,
-      2,   2,   2,   2,   2,   2,  68,   2,   2,   2,   2,   2,   2,   2,  67,   2,
-      2,  37, 187, 119, 119, 119, 119, 119, 119,  37,  20,   2,   2,   2,   2,   2,
-      2,   2,   2,  54, 142,   2,   2,   2,   2,   2,   2,   2, 188, 189, 190, 191,
-    192,  21,   2,   2,   2, 193,   2,   2,  84,   2,   2,   2,   2,   2,   2,   2,
-      5,   5,   5,   5,   5,   5,  67,   6,   5,   5,   5,   5,   5,  68,  22,   2,
-    128,   2,   2,   6,   8,   5,   2,   2,  67,   5,   5, 194, 195,  20,   2,   2,
-      2,   2,   2,   2,   2,  99,   2,   2,   2,   2,  67,   2,   2,   2,   2,   2,
-     99,  20,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2, 196, 197, 197, 197,
-      2,   2,   2,   2,   2,   2,   2,   6,   0,   0,   0,   0,   5,   5,   5,   5,
-      0,   0,   0,   0,   0,   0,   0,   0,   5,   5,   5,   5,   5,   5,   0,   0,
-};
-
-static RE_UINT8 re_grapheme_cluster_break_stage_4[] = {
-     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  3,  4,  4,  2,  4,  4,
-     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  4,
-     0,  0,  0,  0,  0,  4,  0,  0,  5,  5,  5,  5,  5,  5,  5,  5,
-     0,  0,  0,  5,  5,  5,  5,  5,  5,  5,  0,  0,  0,  0,  0,  0,
-     0,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  0,  5,
-     0,  5,  5,  0,  5,  5,  0,  5,  1,  1,  1,  1,  1,  1,  0,  0,
-     5,  5,  5,  0,  4,  0,  0,  0,  5,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0,  5,  5,  5,  5,  5,  5,  5,  1,  0,  5,
-     5,  5,  5,  5,  5,  0,  0,  5,  5,  0,  5,  5,  5,  5,  0,  0,
-     0,  0,  0,  0,  0,  0,  0,  1,  0,  5,  0,  0,  0,  0,  0,  0,
-     5,  5,  5,  0,  0,  0,  0,  0,  5,  5,  5,  5,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  5,  0,  0,  5,  5,  0,  5,  5,  5,  5,  5,
-     5,  5,  5,  5,  0,  5,  5,  5,  0,  5,  5,  5,  5,  5,  0,  0,
-     0,  5,  5,  5,  0,  0,  0,  0,  5,  5,  1,  5,  5,  5,  5,  5,
-     5,  5,  5,  7,  0,  0,  0,  0,  0,  0,  5,  7,  5,  0,  7,  7,
-     7,  5,  5,  5,  5,  5,  5,  5,  5,  7,  7,  7,  7,  5,  7,  7,
-     0,  0,  5,  5,  0,  0,  0,  0,  0,  5,  7,  7,  0,  0,  0,  0,
-     0,  0,  0,  0,  5,  0,  5,  7,  7,  5,  5,  5,  5,  0,  0,  7,
-     7,  0,  0,  7,  7,  5,  0,  0,  0,  0,  0,  0,  0,  0,  0,  5,
-     0,  0,  0,  0,  0,  0,  5,  0,  0,  5,  5,  7,  0,  0,  0,  0,
-     0,  0,  0,  0,  5,  0,  7,  7,  7,  5,  5,  0,  0,  0,  0,  5,
-     5,  0,  0,  5,  5,  5,  0,  0,  5,  5,  0,  0,  0,  5,  0,  0,
-     7,  5,  5,  5,  5,  5,  0,  5,  5,  7,  0,  7,  7,  5,  0,  0,
-     0,  0,  5,  5,  5,  5,  5,  5,  0,  0,  0,  0,  5,  0,  5,  5,
-     0,  0,  5,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  5,  7,
-     5,  7,  7,  0,  0,  0,  7,  7,  7,  0,  7,  7,  7,  5,  0,  0,
-     5,  7,  7,  7,  5,  0,  0,  0,  5,  7,  7,  7,  7,  0,  5,  5,
-     0,  0,  0,  0,  0,  5,  5,  0,  0,  0,  0,  0,  5,  0,  7,  5,
-     7,  7,  5,  7,  7,  0,  5,  7,  7,  0,  7,  7,  5,  5,  0,  0,
-     5,  5,  7,  7,  0,  0,  0,  0,  0,  0,  0,  5,  5,  0,  5,  7,
-     7,  5,  5,  5,  5,  0,  7,  7,  7,  0,  7,  7,  7,  5,  1,  0,
-     0,  0,  7,  7,  0,  0,  0,  0,  0,  0,  5,  0,  0,  0,  0,  5,
-     7,  7,  5,  5,  5,  0,  5,  0,  7,  7,  7,  7,  7,  7,  7,  5,
-     0,  5,  0,  7,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  0,
-     5,  5,  5,  5,  5,  0,  0,  0,  5,  5,  5,  5,  5,  5,  0,  0,
-     0,  0,  0,  0,  0,  5,  0,  5,  0,  5,  0,  0,  0,  0,  7,  7,
-     5,  5,  5,  5,  5,  5,  5,  7,  5,  5,  5,  5,  5,  0,  5,  5,
-     0,  0,  0,  0,  0,  5,  5,  5,  5,  7,  5,  5,  5,  5,  5,  5,
-     0,  5,  5,  7,  7,  5,  5,  0,  0,  0,  0,  0,  0,  0,  7,  7,
-     5,  5,  0,  0,  0,  0,  5,  5,  0,  5,  5,  5,  5,  0,  0,  0,
-     0,  0,  5,  0,  7,  5,  5,  0,  8,  8,  8,  8,  8,  8,  8,  8,
-     9,  9,  9,  9,  9,  9,  9,  9, 10, 10, 10, 10, 10, 10, 10, 10,
-     0,  0,  5,  5,  5,  0,  0,  0,  0,  0,  0,  0,  5,  5,  7,  5,
-     5,  5,  5,  5,  5,  5,  7,  7,  7,  7,  7,  7,  7,  7,  5,  7,
-     0,  0,  0,  5,  5,  5,  4,  0,  5,  5,  5,  7,  7,  7,  7,  5,
-     5,  7,  7,  7,  0,  0,  0,  0,  7,  7,  5,  7,  7,  7,  7,  7,
-     7,  5,  5,  5,  0,  0,  0,  0,  5,  7,  7,  5,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  7,  5,  7,  5,  0,  5,  0,  0,  5,  5,  5,
-     5,  5,  5,  5,  5,  7,  7,  7,  7,  7,  7,  5,  5,  5,  5,  5,
-     5,  5,  5,  5,  7,  0,  0,  0,  0,  0,  0,  0,  5,  5,  5,  5,
-     5,  5,  5,  7,  5,  7,  7,  7,  7,  7,  5,  7,  7,  0,  0,  0,
-     5,  5,  7,  0,  0,  0,  0,  0,  0,  7,  5,  5,  5,  5,  7,  7,
-     5,  5,  7,  5,  5,  5,  0,  0,  5,  5,  7,  7,  7,  5,  7,  5,
-     0,  0,  0,  0,  7,  7,  7,  7,  7,  7,  7,  7,  5,  5,  5,  5,
-     5,  5,  5,  5,  7,  7,  5,  5,  5,  5,  5,  0,  5,  5,  5,  5,
-     5,  0,  0,  0,  0,  5,  0,  0,  0,  0,  0,  0,  5,  0,  0,  7,
-     0,  0,  0,  4,  5, 13,  4,  4,  4,  4,  4,  4,  4,  4,  4,  0,
-     0,  5,  5,  0,  0,  0,  0,  0,  0,  0,  5,  0,  0,  0,  5,  0,
-     0,  0,  0,  5,  0,  0,  0,  0,  0,  0,  0,  7,  7,  5,  5,  7,
-     7,  7,  0,  0,  0,  0,  0,  0,  7,  7,  7,  7,  7,  7,  7,  7,
-     7,  7,  7,  7,  5,  5,  0,  0,  8,  8,  8,  8,  8,  0,  0,  0,
-     0,  0,  0,  5,  7,  7,  5,  5,  5,  5,  7,  7,  5,  5,  7,  7,
-     7,  0,  0,  0,  0,  0,  0,  0,  0,  5,  5,  5,  5,  5,  5,  7,
-     7,  5,  5,  7,  7,  5,  5,  0,  0,  0,  0,  0,  5,  7,  0,  0,
-     0,  0,  0,  0,  5,  0,  0,  0,  5,  0,  5,  5,  5,  0,  0,  5,
-     5,  0,  0,  0,  0,  0,  5,  5,  0,  0,  0,  7,  5,  5,  7,  7,
-     0,  0,  0,  0,  0,  7,  5,  0,  0,  0,  0,  7,  7,  5,  7,  7,
-     5,  7,  7,  0,  7,  5,  0,  0, 11, 12, 12, 12, 12, 12, 12, 12,
-    12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 11, 12, 12, 12,
-    12, 12, 12, 12,  0,  0,  0,  0,  9,  9,  9,  9,  9,  9,  9,  0,
-     0,  0,  0, 10, 10, 10, 10, 10, 10, 10, 10, 10,  0,  0,  0,  0,
-     4,  4,  4,  4,  0,  0,  0,  0,  0,  5,  5,  5,  0,  5,  5,  0,
-     5,  5,  5,  0,  0,  0,  0,  5,  7,  5,  7,  0,  0,  0,  0,  0,
-     7,  7,  7,  5,  5,  5,  5,  7,  7,  5,  5,  0,  0,  1,  0,  0,
-     0,  0,  0,  0,  0,  1,  0,  0,  5,  5,  5,  5,  7,  5,  5,  5,
-     0,  0,  0,  0,  0,  7,  7,  0,  0,  0,  0,  7,  7,  7,  5,  5,
-     7,  0,  1,  1,  0,  0,  0,  0,  0,  0,  0,  0,  7,  7,  7,  5,
-     5,  5,  7,  7,  5,  7,  5,  5,  5,  7,  7,  7,  7,  0,  0,  7,
-     7,  0,  0,  7,  7,  7,  0,  0,  0,  0,  7,  7,  0,  0,  5,  5,
-     0,  0,  0,  0,  0,  7,  7,  7,  7,  7,  5,  5,  5,  7,  5,  0,
-     5,  7,  7,  5,  5,  5,  5,  5,  5,  7,  5,  7,  7,  5,  7,  5,
-     5,  7,  5,  5,  0,  0,  0,  0,  7,  7,  5,  5,  5,  5,  0,  0,
-     7,  7,  7,  7,  5,  5,  7,  5,  0,  0,  0,  0,  5,  5,  0,  0,
-     5,  5,  5,  7,  7,  5,  7,  5,  0,  0,  0,  5,  7,  5,  7,  7,
-     5,  5,  5,  5,  5,  5,  7,  5,  7,  7,  5,  5,  5,  5,  7,  5,
-     7,  5,  5,  0,  0,  0,  0,  0,  0,  7,  7,  7,  5,  5,  5,  5,
-     0,  0,  5,  5,  7,  7,  7,  7,  5,  0,  0,  0,  7,  0,  0,  0,
-     5,  7,  1,  5,  5,  5,  5,  0,  0,  0,  0,  0,  1,  1,  1,  1,
-     1,  1,  5,  5,  5,  5,  5,  5,  0,  0,  0,  0,  0,  0,  0,  7,
-     0,  7,  5,  5,  5,  5,  5,  5,  5,  7,  5,  5,  7,  5,  5,  0,
-     0,  5,  5,  5,  5,  5,  5,  0,  0,  0,  5,  0,  5,  5,  0,  5,
-     5,  5,  5,  5,  5,  5,  1,  5,  0,  0,  7,  7,  7,  7,  7,  0,
-     5,  5,  0,  7,  7,  5,  7,  5,  0,  0,  0,  5,  5,  7,  7,  0,
-     4,  0,  0,  0,  0,  0,  0,  0,  0,  7,  7,  7,  7,  7,  7,  7,
-     0,  0,  0,  0,  0,  5,  7,  5,  5,  5,  0,  0,  0,  7,  5,  5,
-     5,  5,  5,  4,  4,  4,  4,  4,  4,  4,  4,  5,  5,  5,  5,  5,
-     5,  5,  5,  0,  0,  5,  5,  5,  0,  0,  5,  5,  5,  5,  0,  0,
-     5,  0,  0,  5,  5,  5,  5,  5,  5,  5,  0,  5,  5,  0,  5,  5,
-     0,  0,  0,  0,  0,  0,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,
-};
-
-/* Grapheme_Cluster_Break: 4400 bytes. */
-
-RE_UINT32 re_get_grapheme_cluster_break(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-
-    f = ch >> 12;
-    code = ch ^ (f << 12);
-    pos = (RE_UINT32)re_grapheme_cluster_break_stage_1[f] << 6;
-    f = code >> 6;
-    code ^= f << 6;
-    pos = (RE_UINT32)re_grapheme_cluster_break_stage_2[pos + f] << 3;
-    f = code >> 3;
-    code ^= f << 3;
-    pos = (RE_UINT32)re_grapheme_cluster_break_stage_3[pos + f] << 3;
-    value = re_grapheme_cluster_break_stage_4[pos + code];
-
-    return value;
-}
-
-/* Sentence_Break. */
-
-static RE_UINT8 re_sentence_break_stage_1[] = {
-     0,  1,  2,  3,  4,  5,  6,  7,  7,  8,  7,  7,  7,  7,  7,  7,
-     7,  7,  7,  9, 10, 11,  7,  7,  7,  7, 12, 13, 13, 13, 13, 14,
-    15, 16, 17, 18, 19, 13, 20, 13, 21, 13, 13, 13, 13, 22,  7,  7,
-    23, 24, 13, 13, 13, 13, 25, 26, 13, 13, 27, 28, 29, 30, 31, 13,
-     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
-     7,  7,  7,  7, 32,  7, 33, 34,  7, 35,  7,  7,  7, 36, 13, 37,
+/* Bidi_Class. */
+static RE_UINT8 re_bidi_class_table_1[] = {
+     0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 13, 13,
+    13, 13, 13, 14, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 15, 16, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 17, 18,
+    19, 13, 20, 21, 22, 23, 24, 25, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 26, 27, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 28,
+    13, 13, 13, 13, 29, 30, 31, 13, 32, 13, 33, 34, 35, 36, 37, 38,
     13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
     13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
     13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 38,
     13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
     13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
     13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 38,
     13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
     13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
     13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 38,
     13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
     13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
     13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 38,
     13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
     13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
     13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 38,
     13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
     13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
     13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 38,
     13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
     13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
     13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 38,
     13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-    38, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
     13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
     13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 38,
     13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
     13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
     13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-};
-
-static RE_UINT8 re_sentence_break_stage_2[] = {
-      0,   1,   2,   3,   4,   5,   6,   7,   8,   9,  10,  11,  12,  13,  14,  15,
-     16,  17,  18,  19,  20,  21,  22,  23,  24,  25,  26,  27,  28,  29,  30,  31,
-     32,  33,  34,  34,  35,  36,  37,  38,  39,  34,  34,  34,  40,  41,  42,  43,
-     44,  45,  46,  47,  48,  49,  50,  51,  52,  53,  54,  55,  56,  57,  58,  59,
-     60,  61,  62,  63,  64,  64,  65,  64,  64,  66,  64,  64,  64,  64,  67,  68,
-     64,  64,  64,  69,  64,  64,  64,  64,  70,  71,  72,  73,  74,  64,  64,  64,
-     75,  76,  77,  78,  64,  64,  64,  64,  34,  34,  34,  34,  34,  34,  34,  34,
-     34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,
-     34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  79,  34,  34,  34,  34,
-     34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  80,
-     34,  34,  34,  34,  34,  34,  34,  34,  34,  81,  34,  34,  82,  83,  84,  85,
-     86,  87,  88,  89,  90,  91,  92,  93,  34,  34,  34,  34,  34,  34,  34,  34,
-     34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  94,
-     64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,
-     64,  64,  34,  34,  95,  96,  97,  98,  34,  34,  99, 100, 101, 102, 103, 104,
-    105, 106, 107, 108,  64, 109, 110, 111, 112, 113, 114,  64,  34,  34, 115,  64,
-    116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126,  64,  64,  64, 127, 128,
-    129, 130, 131, 132, 133, 134, 135,  64, 136, 137,  64, 138, 139, 140, 141,  64,
-    142, 143,  64, 144, 145, 146,  64,  64, 147, 148, 149, 150,  64, 151,  64,  64,
-     34,  34,  34,  34,  34,  34,  34, 152, 153,  34, 154,  64,  64,  64,  64,  64,
-     34,  34,  34,  34,  34,  34,  34,  34, 155,  64,  64,  64,  64,  64,  64,  64,
-     64,  64,  64,  64,  64,  64,  64,  64,  34,  34,  34,  34, 156,  64,  64,  64,
-     34,  34,  34,  34, 157, 158, 159, 160,  64,  64,  64,  64, 161, 162, 163, 164,
-     34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34, 165,
-     34,  34,  34,  34,  34, 166,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,
-     34,  34, 167,  34,  34, 168,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,
-     64,  64,  64,  64,  64,  64,  64,  64, 169, 170,  64,  64,  64,  64,  64,  64,
-     64,  64, 171, 172, 173,  64,  64,  64, 174, 175, 176, 177, 178, 179, 180, 181,
-     64,  64,  64,  64, 182, 183,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,
-    184,  64, 185,  64,  64, 186,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,
-     34, 187, 188,  64,  64,  64,  64,  64,  64,  64,  64,  64, 189, 190,  64,  64,
-     64,  64, 191, 192,  64,  64,  64,  64,  64,  64,  64,  64, 193,  64,  64,  64,
-     34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34, 194,  34,  34,
-     34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34, 195,  34,
-    196,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,
-     34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34, 197,  34,  34,
-     34,  34,  34,  34,  34,  34,  34, 198,  64,  64,  64,  64,  64,  64,  64,  64,
-     34,  34,  34,  34, 199,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,
-    200,  64, 201, 202,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,
-};
-
-static RE_UINT8 re_sentence_break_stage_3[] = {
-      0,   0,   1,   2,   0,   0,   0,   0,   3,   4,   5,   6,   7,   7,   8,   9,
-     10,  11,  11,  11,  11,  11,  12,  13,  14,  15,  15,  15,  15,  15,  16,  13,
-      0,  17,   0,   0,   0,   0,   0,   0,  18,   0,  19,  20,   0,  21,  19,   0,
-     11,  11,  11,  11,  11,  22,  11,  23,  15,  15,  15,  15,  15,  24,  15,  15,
-     25,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,  26,  26,
-     26,  26,  27,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,  28,  29,
-     30,  31,  32,  33,  28,  31,  34,  28,  25,  31,  29,  31,  32,  26,  35,  34,
-     36,  28,  31,  26,  26,  26,  26,  27,  25,  25,  25,  25,  30,  31,  25,  25,
-     25,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,  15,  33,  30,
-     26,  23,  25,  25,  15,  15,  15,  15,  15,  15,  15,  15,  15,  15,  15,  15,
-     15,  15,  15,  15,  15,  37,  15,  15,  15,  15,  15,  15,  15,  15,  38,  36,
-     39,  40,  36,  36,  41,   0,   0,   0,  15,  42,   0,  43,   0,   0,   0,   0,
-     44,  44,  44,  44,  44,  44,  44,  44,  44,  44,  44,  44,  44,  44,  44,  44,
-     44,  44,  44,  44,  44,  44,  44,  44,  44,  44,  44,  44,  25,  45,  46,  47,
-      0,  48,  22,  49,  32,  11,  11,  11,  50,  11,  11,  15,  15,  15,  15,  15,
-     15,  15,  15,  51,  33,  34,  25,  25,  25,  25,  25,  25,  15,  52,  30,  32,
-     11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  15,  15,  15,  15,
-     15,  15,  15,  15,  15,  15,  15,  15,  25,  25,  25,  25,  25,  25,  25,  25,
-     53,  44,  54,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,
-     28,  26,  26,  29,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,
-     25,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,  10,  11,  11,  11,
-     11,  11,  11,  11,  11,  22,  55,  56,  15,  15,  15,  15,  15,  15,  15,  15,
-     15,  15,  57,   0,  58,  44,  44,  44,  44,  44,  44,  44,  44,  44,  44,  59,
-     60,  59,   0,   0,  36,  36,  36,  36,  36,  36,  61,  62,  36,   0,   0,   0,
-     63,  64,   0,  65,  44,  44,  66,  67,  36,  36,  36,  36,  36,  36,  36,  36,
-     36,  36,  68,  44,  44,  44,  44,  44,   7,   7,  69,  70,  71,  36,  36,  36,
-     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,
-     36,  36,  36,  36,  36,  72,  44,  73,  44,  74,  75,  76,   7,   7,  77,  78,
-     79,   0,   0,  80,  81,  36,  36,  36,  36,  36,  36,  36,  44,  44,  44,  44,
-     44,  44,  66,  82,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,
-     36,  36,  36,  36,  36,  36,  36,  36,  36,  83,  44,  44,  84,   0,   0,   0,
-      7,   7,  77,  36,  36,  36,  36,  36,  36,  36,  68,  44,  44,  41,  85,  86,
-     36,  36,  36,  36,  36,  83,  87,  44,  44,  88,  88,  89,   0,   9,  90,  91,
-     36,  36,  36,  36,  36,  36,  88,   0,  36,  36,  61,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,  36,  36,  36,  36,  36,  92,  36,  41,
-      0,   0,   0,   0,  93,  44,  44,  44,  94,  44,  44,  44,  44,  44,  44,  44,
-     44,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  83,  95,
-     44,  44,  44,  44,  88,  44,  36,  36,  83,  96,   7,   7,  82,  36,  36,  36,
-     88,  82,  36,  78,  78,  36,  36,  36,  36,  36,  92,  36,  43,  40,  41,  95,
-     44,  97,  97,  98,   0,  93,   0,  99,  83, 100,   7,   7,  41,   0,   0, 101,
-     58,  82,  61,  62,  78,  36,  36,  36,  36,  36,  92,  36,  92, 102,  41,  75,
-     66,  93,  97,  89,  86,   0,  82,  43,   0, 100,   7,   7,  76, 103,   0,   0,
-     58,  82,  36,  99,  99,  36,  36,  36,  36,  36,  92,  36,  92,  82,  41,  95,
-     44,  59,  59,  89, 104,   0,   0,   0,  83, 100,   7,   7,   0,   0, 105,  44,
-     58,  82,  36,  78,  78,  36,  36,  36,  36,  36,  92,  36,  92,  82,  41,  95,
-     44,  97,  97,  89,   0, 106,   0,  99,  83, 100,   7,   7,  55,   0,   0,   0,
-    107,  82,  61,  40,  92,  41, 102,  92,  62, 104,  61,  40,  36,  36,  41, 106,
-     66, 106,  75,  89, 104,  93,   0,   0,   0, 100,   7,   7,   0,   0,   0,   0,
-     44,  71,  36,  92,  92,  36,  36,  36,  36,  36,  92,  36,  36,  36,  41, 105,
-     44,  75,  75,  89,   0,  60,  61,   0,  83, 100,   7,   7,   0,   0,   0,   0,
-     88,  82,  36,  92,  92,  36,  36,  36,  36,  36,  92,  36,  36,  82,  41,  95,
-     44,  75,  75,  89,   0,  60,   0, 108,  83, 100,   7,   7, 102,   0,   0,   0,
-     44,  82,  36,  92,  92,  36,  36,  36,  36,  36,  36,  36,  36,  36,  68,  95,
-     44,  75,  75,  98,   0,  68,   0,  62,  83, 100,   7,   7,   0,   0,  40,  36,
-    106,  82,  36,  36,  36,  61,  40,  36,  36,  36,  36,  36,  99,  36,  36,  55,
-     36,  61, 109,  93,  44, 110,  44,  44,   0, 100,   7,   7, 106,   0,   0,   0,
-     82,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  81,  44,  66,   0,
-     36,  68,  44,  66,   7,   7, 111,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-    102,  92,  61,  36,  36,  36,  36,  36,  36, 112,  36,  36,  81,  44,  44,  84,
-     36,  43,  44,  89,   7,   7, 111,  36,   0,   0,   0,   0,   0,   0,   0,   0,
-    104,   0,   0,   0,   0,   0,  89,   0,   7,   7, 111,   0,   0, 113, 114, 115,
-     36,  36,  82,  36,  36,  36,  36,  36,  36,  36,  36, 104,  58,  44,  44,  44,
-     44,  75,  36,  88,  44,  44,  58,  44,  44,  44,  44,  44,  44,  44,  44, 116,
-      0, 109,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  68,  44,  44,  44,  44, 117,
-      7,   7, 118,   0,  36,  83,  76,  83,  95,  74,  44,  76,  88,  71,  36,  36,
-     83,  44,  44,  87,   7,   7, 119,  89,  11,  11,  11,  11,  11,  11,  11,  11,
-     11,  50,   0, 120,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  61,  36,
-     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,
-     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,
-     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,
-     36,  36,  92,  41,  36,  61,  92,  41,  36,  36,  36,  36,  36,  36,  36,  36,
-     36,  36,  92,  41,  36,  36,  36,  36,  36,  36,  36,  36,  92,  41,  36,  61,
-     92,  41,  36,  36,  36,  61,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,
-     36,  36,  36,  36,  92,  41,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,
-     36,  36,  36,  36,  36,  36,  61,  58, 121,   9, 122,   0,   0,   0,   0,   0,
-     36,  36,  36,  36,   0,   0,   0,   0,  11,  11,  11,  11,  11,  11,  11,  11,
-     11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11, 123,  15,  39,
-     82,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,
-     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,
-     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,
-     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36, 124,  36,  36,  36,  36,
-    125,  36,  36,  36,  36,  36, 126, 127,  36,  36,  36,  36,  36,  36,  36,  36,
-     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  61,  40,  36,  36, 104,   0,
-     36,  36,  36,  92,  83, 116,   0,   0,  36,  36,  36,  36,  83, 128,   0,   0,
-     36,  36,  36,  36,  83,   0,   0,   0,  36,  36,  36,  92, 129,   0,   0,   0,
-     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  44,  44,  44,
-     44,  44,  44,  44,  44,  62,   0, 103,   7,   7, 111,   0,   0,   0,   0,   0,
-    130,   0, 131, 132,   7,   7, 111,   0,  36,  36,  36,  36,  36,  36,  36,  36,
-     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36, 104,   0,
-     36, 133,  36,  36,  36,  36,  36,  36,  36,  36, 134,   0,  36,  36,  36,  36,
-     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  41,   0,   0,
-     36,  36,  36,  36,  36,  36,  36,  61,  44,  44,  44,   0,  44,  44,  44,   0,
-      0,  96,   7,   7,  36,  36,  36,  36,  36,  36,  36,  41,  36, 104,   0,   0,
-     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,   0,  36,  36,  36,  36,
-     36,  36,  41,   0,   7,   7, 111,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     36,  36,  36,  36,  36,  68,  44,   0,  36,  36,  36,  36,  36,  36,  36,  36,
-     36,  36,  36,  36,  36,  88,  44,  66,  44,  44,  44,  44,  44,  44,  44,  97,
-      7,   7, 111,   0,   7,   7, 111,   0,   0,  62, 135,   0,  44,  44,  44,  66,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     44,  71,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  44,  44,  44,
-     44,  71,  36,   0,   7,   7, 118, 136,   0,   0,  93,  44,  44,   0,   0,   0,
-    117,  36,  36,  36,  36,  36,  36,  36,  88,  44,  44,  76,   7,   7,  77,  36,
-     36,  36,  36,  36,  36,  36,  36,  36,  36,  83,  44,  44,  44,   0,   0,   0,
-     36,  36,  36,  36,  36,  36,  36,  36,  36,  44,  44,  44,  44,  44,   9, 122,
-      7,   7, 111,  82,   7,   7,  77,  36,  36,  36,  36,  36,  36,  36,  36, 137,
-     15,  15,  42,   0,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  61,  82,
-      0,   0,   0,   0,  66,  44,  44,  44,  44,  44,  71,  81,  36,  74,  98,   0,
-     15,  15,  15,  15,  15,  15,  15,  15,  15,  15,  15,  15,  15,  15,  15,  15,
-     15,  15,  15,  15,  15,  15,  15,  15,  15,  15,  15,  15,  15,  15,  15,  15,
-     15,  15,  15,  15,  15,  15,  15,  15,  15,  15,  15,  15,  15,  15,  15,  15,
-     44,  44,  44,  44,  44,  44,  44,  44,  44,  44,  44,  44,  44,  44,  59,  44,
-     25,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,
-     25,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,
-     25,  25,  25,  25,  25,  34,  15,  27,  25,  25,  25,  25,  25,  25,  25,  25,
-     25,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,
-     15,  15,  11,  11,  15,  39,  11, 123,  15,  15,  11,  11,  15,  15,  11,  11,
-     15,  39,  11, 123,  15,  15, 138, 138,  15,  15,  11,  11,  15,  15,  15,  39,
-     15,  15,  11,  11,  15,  15,  11,  11,  15,  15,  11,  11,  15, 139,  11, 140,
-     46, 139,  11, 141,  15,  46,  11,   0,  15,  15,  11, 141,  46, 139,  11, 141,
-    142, 142, 143, 144, 145, 146, 147, 147,   0, 148, 149, 150,   0,   0, 151, 152,
-      0, 153, 152,   0,   0,   0,   0, 154,  63, 155,  63,  63,  21,   0,   0, 156,
-      0,   0,   0, 151,  15,  15,  15,  42,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,  44,  44,  44,  44,  44,  44,  44,  44, 116,   0,   0,   0,
-     48, 157, 158, 159,  23, 120,  10, 123,   0, 160,  49, 161,  11,  38, 162,  33,
-      0, 163,  39, 164,   0,   0,   0,   0,  11,  11,  11,  11,  15,  15,  15,  15,
-    165,  38, 104,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0, 147,   0,   0,   0,   0,   0,   0,   0, 151,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 166,  11,  11,
-     11,  11,  11,  11,  15,  15,  15,  15,  15,  15,  39,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   4, 147, 127,   0, 147, 147, 147,   5,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0, 151,   0,   0,   0,   0,   0,   0,   0, 167, 147, 147,   0,   0,   0,   0,
-      4, 147, 147, 147, 147, 147, 127,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0, 147,   0,   0,   0,   0,   0,   0,   0,   0,   5,
-     11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  22,  15,  15,  15,  15,
-     15,  15,  15,  15,  15,  15,  15,  24,  31, 168,  26,  32,  25,  29,  15,  33,
-     25,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,
-     25,  25,  25,  25,  25,  25,  25,  25,  25,  42, 157, 169,  54,   0,   0,   0,
-     15,  15,  15,  15,  15,  15,  15,  15,  15, 170,   0,  21,  36,  36,  36,  36,
-     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,   0,  62,   0,   0,   0,  93,
-     36,  36,  36,  36,  36,  61,   0,   0,  36,  61,  36,  61,  36,  61,  36,  61,
-     36,  61,  36,  61,  36,  61,  36,  61,  44,  44,  44,  44,  44,  44,  44,  44,
-    147, 147, 147,   5,   0,   0,   0,   5, 147, 147,   5, 171,   0,   0,   0, 122,
-    172,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-    173,  82, 147, 147,   5, 147, 147, 174,  82,  36,  83,  44,  82,  41,  36, 104,
-     82,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,
-     36,  36,  36,  36,  36,  61,  60,  82,  82,  36,  36,  36,  36,  36,  36,  36,
-     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  61,  36,
-      0,  82,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  82,  36,  36,  36,
-     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,
-     36,  36,  36,  61,   0,   0,   0,   0,  36,  36,  36,  36,  36,  36,  61,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  36,  36,  36,  36,
-     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  41,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,
-     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,   0,   0,   0,   0,
-     36,  36,  36, 104,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36, 175,
-     36,  36,  36, 176,  36,  36,  36,  36,   7,   7,  77,   0,   0,   0,   0,   0,
-     25,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25, 177,  66,  44,  44, 178,
-     25,  25,  25,  25,  25,  25,  25, 179,  36,  36,  36,  36,  36,  36,  36,  36,
-     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36, 180,   9,   0,   0,
-      0,   0,   0,   0,   0,  62,  36,  36, 181,  25,  25,  25,  27,  25,  25,  25,
-     25,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,  15,  15,  26,  30,
-     25,  25, 182, 183,  25,  27,  25,  25,  25,  25,  31,  23,  11,  25,  25,  25,
-    181,  22,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  62, 184,  36,
-    185, 185,  68,  36,  36,  36,  36,  36,  68,  44,   0,   0,   0,   0,   0,   0,
-     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36, 136,   0,   0,
-     76,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  44,  44,  44,
-     44,  89,   0, 136,   7,   7, 111,   0,  44,  44,  44,  44,  76,  36,  62, 186,
-      7,   7,  77,  36,  36,  36,  36,  36,  36,  83,  44, 180,  36,  36,  36,  36,
-     36,  68,  44,  44,  44,   0,   0,   0,  36,  36,  36,  36,  36,  36,  36, 104,
-     44,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  68,  44,  44,  44,
-    116,   0, 152,  62,   7,   7, 111,   0,  36,  81,  36,  36,   7,   7,  77,  61,
-     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  88,  44,  44,  66,   0,   0,
-     68,  36,  36,  89,   7,   7, 111, 187,  36,  36,  36,  36,  36,  61, 188,  76,
-     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  95,  74,  71,  83,
-    134,   0,   0,   0,   0,   0,  62,  41,  36,  36,  68,  44, 189, 190,   0,   0,
-     82,  61,  82,  61,  82,  61,   0,   0,  36,  61,  36,  61,  15,  15,  15,  15,
-     15,  15,  15,  15,  15,  15,  24,  15,  15,  15,   0,   0,  15,  15,  15,  15,
-     15,  15,  15,  15,  15,  15,  15,  15,  15,  15,  15,  15,  15,  15,  15,  15,
-     36,  36,  36,  36,  36,  36,  36,  36,  68,  44, 191,  89,   7,   7, 111,   0,
-     36,  36,  36,  36,  36,  36,  36,  36,  36,   0,   0,   0,  36,  36,  36,  36,
-     36,  61,  62,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,   0,
-     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,
-     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  41,  36,  36,  36,  36,
-     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,
-     36,  36,  36,  36,  36,  36,  41,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     15,  24,   0,   0, 192,  15,   0, 193,  36,  36,  92,  36,  36,  61,  36,  43,
-     99,  92,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,
-     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  41,   0,   0,   0,
-      0,   0,   0,   0,  62,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,
-     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36, 194,
-      0,   0,   0,   0,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,
-     36,  36,  36,  36,  40,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,
-     36,  36,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  36,  36,  36,   0,
-     44,  44,  44,  44, 195,   4, 127,   0,  44,  44,  44,  44, 196, 174, 147, 147,
-    147, 197, 127,   0,   6, 198, 199, 200, 145,   0,   0,   0,  36,  92,  36,  36,
-     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,
-     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36, 201,
-     90,   0,   5,   6,   7,   7,   8,   9,  10,  11,  11,  11,  11,  11,  12,  13,
-     14,  15,  15,  15,  15,  15,  16, 202, 203, 204,  36,  36,  36,  36,  36,  36,
-     36,  36,  36,  36,  36,  36,  36,  83,  36,  36,  36,  36,  36,  36,  36,  61,
-     40,  36,  40,  36,  40,  36,  40, 104,   0,   0,   0,   0,   0,   0, 205,   0,
-     36,  36,  36,  82,  36,  36,  36,  36,  36,  61,  36,  36,  36,  36,  61,  99,
-     36,  36,  36,  41,  36,  36,  36,  41,   0,   0,   0,   0,   0,   0,   0,   0,
-     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,
-     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  61,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36, 104,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  86,
-     36,  36,  36,  36,  36,  36,  36, 104,  36,  36,  36,  36,  36,  36,  36,  36,
-     36,  36,  36,  36, 104,   0,   0,   0, 116,   0,   0,   0,   0,   0,   0,   0,
-     36,  36,  36,  36,  36,  36,  36,  36,   0,   0,   0,  82,  36,  36,  36,  36,
-     36,  36,  61,   0,  36,  36,  36,  36,  36,  36,  36,  36,  36,  83,  66,   0,
-     36,  36,  36,  36,  36,  36,  36,  41,  36,  36,  36,  36,  36,  36,  36,  36,
-     36,   0,  36,  36,  82,  41,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  15,  15,  15,  15,  15,  15,
-     15,  15,  15,  15,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,
-     36,  36,  36,  36,  36,  36,  36,  41,   7,   7, 111,   0,  11,  11,  11,  11,
-     11,  11,  11,  11,  11,   0,  15,  15,  15,  15,  15,  15,  15,  15,  15,   0,
-     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,   0,   0,  36,  36,  36,  36,
-     36,  36,  36,  36,  36,  36,  36,  36,  36,   0,   0,   0,   0,   0,   0,   0,
-     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  61,   0,   0,
-     36,  36,  36,  36,  36,  41,   0,   0,  36,  36,   0,   0,   0,   0,   0,   0,
-     36,  41,  92,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  99, 104,  78,
-     36,  36,  36,  36,  36,  41,   0,   0,  36,  36,  36,  36,  36,  61,   0,   0,
-     36,  36,  36,  36,  36,  36,  36,  61,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,  36,  36,  36,  36,  61,  41,   0,   0,
-     36,  36,  36,  36,  36,  41,   0,   0,  36,  36,  36,  36,  36,  36,  41,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,   0,  40,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     88,  60,   0,  44,  36,  82,  82,  36,  36,  36,  36,  36,  36,  41,  66,  93,
-      0,   0,   0,   0,   0, 136,   0,   0,  36,  36,  36,  36,  36,  36,  36, 104,
-     36,  36,  36,  36,  36,  36,  36, 104,   0,   0,   0,   0,   0,   0,   0,   0,
-     36,  36,  82,  36,  36,  36,  36,  36,  36, 190,   0,   0,   0,   0,   0,   0,
-     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  41,   0,   0,
-     36,  36,  36,  36,  36,  41,   0,   0,  36,  36,  36,  36,  61,   0,   0,   0,
-     36,  36,  36,  36,  41,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,
-     36,  36, 104,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  22,   0,   0,   0,
-     15,  15,  15,  15,  15,  15,  15,  15,  15,  15,  15,  15,  24,   0,   0,   0,
-     36,  36,  36,  36,  36,  36,  36,  36,  36,  44,   0,   0,   7,   7, 111,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     36,  36,  36,  36,  36,  36,  36, 104,   0,  62,   0,   0,  36,  36,  36,  36,
-     36,  83,  44,  44, 116, 187, 152,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,  36,  36,  36,  36,  36,  61,   0,   0,
-    117,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  44,  44,
-     44, 191, 122,   0,   0,   0,   0,   0,   0, 100,   7,   7,   0,   0,   0,  93,
-    117,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  44,  44,  66, 206,
-    152,   0,   0,  20,  36,  36,  36,  36,  36,  36, 104,   0,   7,   7, 111,   0,
-    117,  36,  36,  36,  36,  36,  36,  36,  36,  68,  44,  44,  44, 207,   7,   7,
-    187, 190,   0,   0,  36,  36,  36,  36,  36,  36,  36,  36,  68, 108,   0,   0,
-    117,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  68,  44,  44,  44,
-     71, 208,  58, 209,   7,   7, 210, 176,   0,   0,   0,   0,   0,   0,   0,   0,
-     36,  36,  36,  36,  99,  36,  36,  36,  36,  36,  36,  44,  44,  44, 211, 212,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     36,  61,  92,  99,  36,  36,  36,  99,  36,  36, 213,   0,  36,  36,  36,  36,
-     36,  36,  36,  36,  36,  36,  36,  68,  44,  44,  66,   0,   7,   7, 111,   0,
-     44,  82,  36,  78,  78,  36,  36,  36,  36,  36,  92,  36,  92,  82, 214,  95,
-     44,  97,  97,  89, 104,  93,   0,  82,  83, 106,  44, 116,  44, 116,   0,   0,
-     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  88,  44,  44,
-     44, 117, 215, 122,   7,   7, 111, 107,   0,   0,   0,   0,   0,   0,   0,   0,
-     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  44,  44,  44,  44,
-     44,  99,   0,   0,   7,   7, 111,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  68,  44,  89,  44,  44,
-    216,   0, 187, 135, 135, 135,  36,  89,   0,   0,   0,   0,   0,   0,   0,   0,
-     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  44,  44,  44,  44,
-    128, 104,   0,   0,   7,   7, 111,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  68,  44,  44,  44, 104,   0,
-      7,   7, 111,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     36,  36,  36,  36,  36,  36,  61,  58,  44,  44,  44,   0,   7,   7, 111,  79,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  44,  44,  44,  66,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,  11,  11,  11,  11,  11,  11,  11,  11,
-     15,  15,  15,  15,  15,  15,  15,  15,   7,   7, 111,   0,   0,   0,   0,  62,
-      0,   0,   0,   0,   0,   0,   0,   0,  36,  36,  40,  36,  36,  36,  36,  36,
-     36,  36,  36,  36,  88,  44, 106,  44, 217, 116,   0,   0,   0,   0,   0,   0,
-     88,  44, 117,  36,  36,  36,  36,  36,  36,  36,  36,  36,  68,  44,  87,  66,
-    136,  93,   0,   0,  88,  44,  44,  36,  36,  36,  36,  36,  36,  36,  36,  36,
-     36,  36,  83,  44,  44,  44, 180, 218,   0,   0,   0,   0,   0,   0,   0,   0,
-     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36, 104,   0,
-     36,  36,  92,  36,  36,  36,  36,  36,  36,  36,  36,  68,  44,  66,  44,  44,
-    208,   0,   0,   0,   7,   7, 111,   0,   0,   0,   0,   0,  40,  36,  36,  36,
-     36,  36,  36,  36, 106,  44,  44,  44,  44,  44,  58,  44,  44,  66,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     36,  61,  99,  36,  36,  36,  36,  36,  36,  36,  36,  36,  88,  66, 109,  59,
-     44,  87,   0,   0,   7,   7, 111,   0,  36,  99,  92,  36,  36,  36,  36,  36,
-     36,  36,  83,  66,  59,  44, 104,   0,   7,   7, 111,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,  36,  36,  36,  36,  68, 191, 122,   0,
-     36,  36,  36,  36,  36,  36,  41,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,
-     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  61,   0,   0,   0,   0,
-     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,
-     36,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  61,  63,  63, 219,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 38,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 38,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 38,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 38,
+    39, 40, 40, 40, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 38,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 38,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 38
+};
+
+static RE_UINT16 re_bidi_class_table_2[] = {
+      0,   1,   2,   3,   4,   5,   6,   6,   7,   7,   7,   7,   7,   7,   7,   7,
+      7,   7,   7,   7,   7,   8,   9,  10,  11,  11,  11,  12,  13,   7,   7,  14,
+      7,   7,   7,   7,  15,   7,   7,   7,   7,   7,   7,   7,  16,  17,  18,  19,
+     20,  21,  22,  23,  21,  21,  24,  25,  26,  27,  28,  21,  21,  29,  19,  30,
+     31,  32,  33,  34,  19,  21,  35,  36,  37,  38,  39,  40,  41,  42,  43,  44,
+     45,  42,  46,  47,  45,  42,  48,  49,  41,  50,  51,  40,  52,   7,  53,  54,
+     55,  56,  57,  58,  41,  42,  59,  40,  60,  61,  43,  40,  41,   7,  62,   7,
+      7,  63,  64,   7,   7,  65,  66,   7,  67,  68,   7,  69,  70,  71,  72,   7,
+      7,  73,  74,  75,  76,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
+      7,   7,   7,   7,   7,   7,   7,   7,   7,   7,  77,   7,  78,   7,   7,   7,
+     79,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
+      7,   7,   7,   7,  80,   7,   7,   7,  81,  81,  82,  82,   7,  83,  84,  78,
+     85,   7,   7,   7,  86,  87,   7,   7,   7,  88,  89,   7,   7,   7,  90,  91,
+     92,   7,  93,  94,   7,  95,  96,   7,  97,  98,  52,  99,  60, 100,   7, 101,
+      7, 102,   7,   7,   7,   7, 103, 104,   7,   7,   7,   7,   7,   7,  11, 105,
+      7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7, 106, 107, 108,
+    109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119,   7, 120,  91,  91,  91,
+    121,  91,  91,  91,  91,  91,  91,  91,  91, 122,   7, 123, 124,  91,  91,  91,
+     91, 125, 126,  91, 127,   7,   7, 128,  91,  91,  91,  91,  91,  91,  91,  91,
+     91,  91,  91,  91,  91, 129,  91,  91,  91,  91,  91,  91,  91,  91,  91,  91,
+      7,   7,   7,   7,   7,   7,   7,   7,  91,  91,  91,  91,  91,  91,  91,  91,
+     91,  91,  91,  91,  91,  91,  91,  91,  91,  91,  91, 130, 131,  91,  91,  91,
+      7,   7,   7,   7,   7,   7,   7, 132,   7,   7,   7, 133,   7,   7,   7,  11,
+     91,  91, 134,   7, 135,  91,  91, 136,  91,  91,  91,  91,  91,  91, 122, 137,
+    138, 139,   7,   7, 140,  79,   7, 141,   7,   7,   7,   7,   7,   7,  91, 142,
+    143,   7, 144, 145,   7, 146, 147,   7,   7,   7,   7, 148,   7,   7,  90, 149,
+      7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
+      7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
+      7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,  91,  91,
+      7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
+      7,   7,   7,   7, 144,  91, 125,   7,   7,   7,   7,   7,   7,   7,   7,   7,
+    150,   7,   7, 151,  56,   7,   7, 152,  91, 153,   7,   7, 154,   7,   7,   7,
+    155, 156,   7, 157,   7,   7, 158, 159,   7, 160, 161,   7,  37, 162,   7, 163,
+      7, 164, 165,  42,   7, 166,  41, 167,   7,   7,   7, 168,   7,   7,   7, 169,
+      7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
+      7,   7,   7,   7,   7,   7,   7,   7, 170, 171, 172,  21,  21,  21,  21,  21,
+     21,  21,  21,  21,  21,  21,  21,  21,  21, 173,  21,  21,  21,  21, 174, 175,
+    176, 177, 178, 179,  21,  21,  21, 180, 181,   2,   2, 182,   7,   7,   7, 183,
+      7,   7,   7,   7,   7,   7,   7,   7, 184,   7,  91,  91, 185,  79,   7, 186,
+      7,   7,   7,   7,   7,   7,   7, 187,   7,   7,   7, 188,   7,   7,   7,   7,
+     19,  19,  19,  19,  19,  19,  19,  19, 189,  19,  19,  19,  19,  19,  19,  19,
+    190, 191,  19,  19,  19,  19,  19, 192,  19, 193,  19,  19,  19,  19,  19,  19,
+     19,  19,  19,  19,  19,  19,  19,  19,  21, 194,  19,  19,  19,  19,  19,  19,
+     19,  19,  19, 195,  19, 196,  19,  19,  19, 172,  29,  34,  19,  19,  19,  19,
+     41, 197, 198, 199,  60, 200,   7,   7,  37, 201,   7, 202,  60, 203, 204,   7,
+      7, 205,   7,   7,   7,   7, 133, 206,  60,  61,  96, 207,   7,   7,   7,   7,
+      7, 197, 208,   7,   7, 209, 210,   7,   7,   7,   7,   7,   7, 211, 212,   7,
+      7, 213,  96, 214,   7, 215,   7,   7,  77, 216,   7,   7,   7,   7,   7,   7,
+      7, 217,   7,   7,   7,   7,   7,   7,   7, 218, 219,   7,   7,   7, 220,  96,
+    221, 222, 223,   7, 224,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
+      7, 225,   7,   7, 226, 227,   7,   7,   7, 228, 229,   7, 230,   7,   7,   7,
+      7,   7,   7,   7,   7,   7,   7, 231,   7,   7,   7,   7,   7,   7, 232, 233,
+      7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
+      7,   7,   7,   7,   7,   7,   7, 234,   7, 235,   7,   7,   7,   7,   7,   7,
+      7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
+      7,   7,   7,   7,   7,   7,   7,   7,   7,   7, 236,   7, 237,   7,   7, 238,
+      7,   7,   7,   7, 239, 240,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
+      7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
+      7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7, 241, 242, 243,   7,   7,
+     91,  91, 244,   7,   7,   7,   7,   7,  91,  91, 245,   7,   7,   7,   7,   7,
+      7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
+      7,   7,   7,   7,   7,   7, 141,   7, 246,   7, 247,   7, 248,   7, 249, 250,
+      7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
+     11, 251,  11, 252, 253, 254,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
+    255, 256,   7,   7,   7,   7,   7,   7,   7, 235,   7,   7,   7,   7,   7,   7,
+      7,   7,   7,   7,   7,   7,   7, 257,   7,   7,   7,   7,   7,   7,   7,   7,
+     19,  19,  19,  19,  19,  19, 258,  19,  19,  19, 259,  19,  19,  19,  19,  19,
+     19,  19,  19,  19,  19,  19,  19,  19,  19,  19,  19,  19,  19,  19,  19,  19,
+     19,  19,  19, 172,  21,  21,  19,  19,  21,  21,  34,  19,  19,  19,  19,  19,
+     21,  21,  21,  21,  21,  21,  21, 260,  19,  19,  19,  19,  19,  19,  19,  19,
+     91, 261,  91,  91, 136, 262, 263, 122, 264, 247,   7, 265,   7, 266,   7,   7,
+      7,   7,   7, 182,   7,   7,   7,   7,  91,  91,  91,  91,  91,  91,  91,  91,
+     91,  91,  91,  91,  91,  91,  91,  91,  91,  91,  91,  91,  91,  91,  91,  91,
+     91,  91,  91,  91,  91,  91, 267, 185,  91,  91,  91, 136,  91,  91, 268, 269,
+    261,  91, 270,  91, 271, 272,   7,   7,  91,  91,  91, 273,  91,  91, 129,  91,
+     91,  91, 136, 274, 275, 276, 277,   7,  91,  91,  91,  91, 278,  91, 126, 279,
+      7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
+      7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7, 280,
+    281, 281, 281, 281, 281, 281, 281, 281,  11,  11,  11,  11,  11,  11,  11, 282,
+    281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281,
+    281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281,
+    281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281
+};
+
+static RE_UINT8 re_bidi_class_table_3[] = {
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  2,  3,  2,  4,  3,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  3,  3,  3,  2,
+     4,  5,  5,  6,  6,  6,  5,  5,  5,  5,  5,  7,  8,  7,  8,  8,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  8,  5,  5,  5,  5,  5,
+     5,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  5,  5,  5,  5,  5,
+     5,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  5,  5,  5,  5,  1,
+     1,  1,  1,  1,  1,  3,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     8,  5,  6,  6,  6,  6,  5,  5,  5,  5,  0,  5,  5,  1,  5,  5,
+     6,  6,  9,  9,  5,  0,  5,  5,  5,  9,  0,  5,  5,  5,  5,  5,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  5,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  5,  5,  0,  0,  0,  0,  0,
+     0,  0,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     0,  0,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     0,  0,  0,  0,  0,  5,  5,  5,  5,  5,  5,  5,  5,  5,  0,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+     0,  0,  0,  0,  5,  5,  0,  0,  0,  0,  0,  0,  0,  0,  5,  0,
+     0,  0,  0,  0,  5,  5,  0,  5,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  5,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0, 10, 10, 10, 10, 10, 10, 10,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  5,  0,  0,  5,  5,  6,
+    11, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 11, 10,
+    11, 10, 10, 11, 10, 10, 11, 10, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    12, 12, 12, 12, 12, 12,  5,  5, 13,  6,  6, 13,  8, 13,  5,  5,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    12, 12, 12, 12, 12, 12, 12, 12, 12, 12,  6, 12, 12, 13, 13, 13,
+    10, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 10, 10, 10, 10, 10, 10, 10, 12,  5, 10,
+    10, 10, 10, 10, 10, 13, 13, 10, 10,  5, 10, 10, 10, 10, 13, 13,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 10, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 11, 11,  5,  5,  5,  5, 11, 11, 11, 10, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 10, 10, 10, 10, 11, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 11, 10, 10, 10, 11, 10, 10, 10, 10, 10, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 10, 10, 10, 11, 11, 11, 11,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 12, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 10,  0, 10,  0,  0,  0,
+     0, 10, 10, 10, 10, 10, 10, 10, 10,  0,  0,  0,  0, 10,  0,  0,
+     0, 10, 10, 10, 10, 10, 10, 10,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0, 10, 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0, 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 10,  0,  0,  0,
+     0, 10, 10, 10, 10,  0,  0,  0,  0,  0,  0,  0,  0, 10,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0, 10, 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  6,  6,  0,  0,  0,  0,  0,  0,  0,  6,  0,  0, 10,  0,
+     0, 10, 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0, 10, 10,  0,  0,  0,  0, 10, 10,  0,  0, 10, 10, 10,  0,  0,
+     0, 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    10, 10,  0,  0,  0, 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0, 10, 10, 10, 10, 10,  0, 10, 10,  0,  0,  0,  0, 10,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0, 10, 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  6,  0,  0,  0,  0,  0,  0,  0,  0, 10, 10, 10, 10, 10, 10,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 10,  0,  0, 10,
+     0, 10, 10, 10, 10,  0,  0,  0,  0,  0,  0,  0,  0, 10,  0,  0,
+     0,  0,  0,  0,  0, 10, 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0, 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 10,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  5,  5,  5,  5,  5,  5,  6,  5,  0,  0,  0,  0,  0,
+    10,  0,  0,  0, 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 10, 10,
+    10,  0,  0,  0,  0,  0, 10, 10, 10,  0, 10, 10, 10, 10,  0,  0,
+     0,  0,  0,  0,  0, 10, 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0, 10, 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  5,  5,  5,  5,  5,  5,  5,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 10, 10,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    10, 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 10, 10,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 10,  0,  0,  0,  0,  0,
+     0,  0, 10, 10, 10,  0, 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0, 10,  0,  0, 10, 10, 10, 10, 10, 10, 10,  0,  0,  0,  0,  6,
+     0,  0,  0,  0,  0,  0,  0, 10, 10, 10, 10, 10, 10, 10, 10,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0, 10,  0,  0, 10, 10, 10, 10, 10, 10, 10, 10, 10,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0, 10, 10, 10, 10, 10, 10,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0, 10, 10,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0, 10,  0, 10,  0, 10,  5,  5,  5,  5,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,  0,
+    10, 10, 10, 10, 10,  0, 10, 10,  0,  0,  0,  0,  0, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10,  0, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,  0,  0,  0,
+     0,  0,  0,  0,  0,  0, 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 10, 10, 10,
+    10,  0, 10, 10, 10, 10, 10, 10,  0, 10, 10,  0,  0, 10, 10,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0, 10, 10,  0,  0,  0,  0, 10, 10,
+    10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0, 10, 10, 10, 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0, 10,  0,  0, 10, 10,  0,  0,  0,  0,  0,  0, 10,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 10,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 10, 10, 10,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  0,  0,  0,  0,  0,  0,
+     5,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     4,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  5,  5,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0, 10, 10, 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0, 10, 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0, 10, 10,  0, 10, 10, 10, 10, 10, 10, 10,  0,  0,
+     0,  0,  0,  0,  0,  0, 10,  0,  0, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10,  0,  0,  0,  0,  0,  0,  0,  6,  0, 10,  0,  0,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5, 10, 10, 10,  1,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0, 10, 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0, 10,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    10, 10, 10,  0,  0,  0,  0, 10, 10,  0,  0,  0,  0,  0,  0,  0,
+     0,  0, 10,  0,  0,  0,  0,  0,  0, 10, 10, 10,  0,  0,  0,  0,
+     5,  0,  0,  0,  5,  5,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0, 10, 10,  0,  0, 10,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0, 10,  0, 10, 10, 10, 10, 10, 10, 10,  0,
+    10,  0, 10,  0,  0, 10, 10, 10, 10, 10, 10, 10, 10,  0,  0,  0,
+     0,  0,  0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,  0,  0, 10,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    10, 10, 10, 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0, 10,  0, 10, 10, 10, 10, 10,  0, 10,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 10, 10, 10, 10, 10,
+    10, 10, 10, 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0, 10, 10, 10, 10,  0,  0, 10, 10,  0, 10, 10, 10,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0, 10,  0, 10, 10,  0,  0,  0, 10,  0, 10,
+    10, 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 10, 10, 10, 10,
+    10, 10, 10, 10,  0,  0, 10, 10,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    10, 10, 10,  0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10,  0, 10, 10, 10, 10, 10, 10, 10,  0,  0,  0,  0, 10,  0,  0,
+     0,  0,  0,  0, 10,  0,  0,  0, 10, 10,  0,  0,  0,  0,  0,  0,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10,  0, 10, 10, 10, 10, 10,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  5,  0,  5,
+     5,  5,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  5,  5,  5,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  5,  5,  5,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  5,  5,  5,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  5,  5,  0,
+     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  1,  1,  1,  0, 11,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  4,  3, 14, 15, 16, 17, 18,  8,
+     6,  6,  6,  6,  6,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  8,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  4,
+     1,  1,  1,  1,  1,  1, 19, 20, 21, 22,  1,  1,  1,  1,  1,  1,
+     9,  0,  0,  0,  9,  9,  9,  9,  9,  9,  7,  7,  5,  5,  5,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  7,  7,  5,  5,  5,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,
+     6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,
+     6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     5,  5,  0,  5,  5,  5,  5,  0,  5,  5,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  5,  0,  5,  5,  5,  0,  0,  0,  0,  0,  5,  5,
+     5,  5,  5,  5,  0,  5,  0,  5,  0,  5,  0,  0,  0,  0,  6,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  5,  5,  0,  0,  0,  0,
+     5,  5,  5,  5,  5,  0,  0,  0,  0,  0,  5,  5,  5,  5,  0,  0,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  5,  5,  5,  0,  0,  0,  0,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  7,  6,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  0,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     5,  5,  5,  5,  5,  5,  5,  5,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  0,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  0,  0,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  0,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     0,  0,  0,  0,  0,  5,  5,  5,  5,  5,  5,  0,  0,  0,  0, 10,
+    10, 10,  0,  0,  0,  0,  0,  0,  0,  5,  5,  5,  5,  5,  5,  5,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 10,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  0,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  0,  0,  0,  0,
+     4,  5,  5,  5,  5,  0,  0,  0,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  0,  0,  0,  0,  0,  0,  0,  0,  0, 10, 10, 10, 10,  0,  0,
+     5,  0,  0,  0,  0,  0,  5,  5,  0,  0,  0,  0,  0,  5,  5,  5,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0, 10, 10,  5,  5,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  5,  0,  0,  0,  0,
+     5,  5,  5,  5,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  5,  5,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  5,  5,  5,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  5,  5,  5,  5,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  5,  5,  5,  5,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  5,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  5,  5,  5,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 10,
+    10, 10, 10,  5, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,  5,  5,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    10, 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     5,  5,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  5,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0, 10,  0,  0,  0, 10,  0,  0,  0,  0, 10,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0, 10, 10,  0,  5,  5,  5,  5, 10,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  6,  6,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  5,  5,  5,  5,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0, 10, 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 10,
+     0,  0,  0,  0,  0,  0, 10, 10, 10, 10, 10, 10, 10, 10,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0, 10,  0,  0, 10, 10, 10, 10,  0,  0, 10, 10,  0,  0,
+     0,  0,  0,  0,  0, 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0, 10, 10, 10, 10, 10, 10,  0,
+     0, 10, 10,  0,  0, 10, 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0, 10,  0,  0,  0,  0,  0,  0,  0,  0, 10,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    10,  0, 10, 10, 10,  0,  0, 10, 10,  0,  0,  0,  0,  0, 10, 10,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 10, 10,  0,  0,
+     0,  0,  0,  0,  0,  0, 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  5,  5,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0, 10,  0,  0, 10,  0,  0,  0,  0, 10,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 11, 10, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11,  7, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,  5,  5,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,  5, 13, 13,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  0,  0,  0,  0,  0,  0,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     8,  5,  8,  0,  5,  8,  5,  5,  5,  5,  5,  5,  5,  5,  5,  6,
+     5,  5,  7,  7,  5,  5,  5,  0,  5,  6,  6,  5,  0,  0,  0,  0,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,  1,
+     0,  5,  5,  6,  6,  6,  5,  5,  5,  5,  5,  7,  8,  7,  8,  8,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  8,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     6,  6,  5,  5,  5,  6,  6,  0,  5,  5,  5,  5,  5,  5,  5,  0,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  5,  5,  5,  5,  5,  1,  1,
+     0,  5,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  0,  0,  0,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 10,  0,  0,
+    10,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0, 10, 10, 10, 10, 10,  0,  0,  0,  0,  0,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,  5,
+    11, 10, 10, 10, 11, 10, 10, 11, 11, 11, 11, 11, 10, 10, 10, 10,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 10, 10, 10, 11, 11, 11, 11, 10,
+    11, 11, 11, 11, 11, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11,  5,  5,  5,  5,  5,  5,  5,
+    13, 13, 13, 13, 10, 10, 10, 10, 13, 13, 13, 13, 13, 13, 13, 13,
+    12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, 13, 13,
+    12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+    12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 10, 10, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 10,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0, 10, 10, 10, 10,  0,  0, 10, 10,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0, 10, 10, 10, 10, 10,  0, 10, 10, 10,
+    10, 10, 10, 10, 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0, 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0, 10, 10, 10, 10, 10, 10, 10, 10, 10,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0, 10, 10, 10, 10,  0,  0, 10,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 10,
+    10, 10,  0,  0, 10,  0, 10, 10,  0,  0,  0,  0,  0,  0, 10,  0,
+     0,  0,  0, 10, 10, 10, 10, 10, 10, 10, 10,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0, 10, 10, 10, 10, 10, 10, 10,  0,  0,  0,
+    10, 10, 10, 10, 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0, 10, 10, 10,  0, 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 10,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0, 10, 10, 10, 10, 10, 10,  0, 10,  0,  0,  0,  0, 10,
+    10,  0, 10, 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0, 10, 10, 10, 10,  0,  0,  0,  0,  0,  0, 10, 10,  0, 10,
+    10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 10, 10,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0, 10, 10, 10, 10, 10, 10, 10, 10,  0,  0, 10,  0, 10,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 10,  0, 10,  0,  0,
+    10, 10, 10, 10, 10, 10,  0, 10,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0, 10, 10, 10, 10,  0, 10, 10, 10, 10, 10,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 10,
+    10, 10, 10, 10, 10, 10, 10, 10,  0, 10, 10,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 10, 10,  0, 10,  0,
+     0,  0,  0, 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0, 10, 10, 10, 10,  0,  0, 10, 10,  0,  0,  0,  0,
+     0, 10, 10, 10, 10, 10, 10,  0,  0, 10, 10,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0, 10, 10, 10, 10, 10, 10,  0,  0, 10, 10, 10, 10,  0,
+     0,  0,  0,  0,  0,  0,  0, 10,  0,  0,  0,  0,  0,  0,  0,  0,
+     0, 10, 10, 10, 10, 10, 10,  0,  0, 10, 10, 10,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10,  0, 10, 10,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    10, 10, 10, 10, 10, 10, 10,  0, 10, 10, 10, 10, 10, 10,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10,  0,  0, 10, 10, 10, 10, 10, 10,
+    10,  0, 10, 10,  0, 10, 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0, 10, 10, 10, 10, 10, 10,  0,  0,  0, 10,  0, 10, 10,  0, 10,
+    10, 10, 10, 10, 10, 10,  0, 10,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    10, 10,  0,  0,  0, 10,  0, 10,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0, 10, 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  5,  5,  5,  5,  5,  5,  5,  5,  6,  6,  6,
+     6,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    10, 10, 10, 10, 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    10, 10, 10, 10, 10, 10, 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 10,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 10,
+    10, 10, 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  5,  0, 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 10, 10,  0,
+     1,  1,  1,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0, 10, 10, 10,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  1,  1,  1,  1,  1,  1,  1,  1, 10, 10, 10, 10, 10,
+    10, 10, 10,  0,  0, 10, 10, 10, 10, 10, 10, 10,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 10, 10, 10, 10,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     5,  5, 10, 10, 10,  5,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  5,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  5,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  5,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  5,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10,  0,  0,  0,  0, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,  0,  0,  0,
+     0,  0,  0,  0,  0, 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0, 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 10, 10, 10, 10, 10,
+     0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    10, 10, 10, 10, 10, 10, 10,  0, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10,  0,  0, 10, 10, 10, 10, 10,
+    10, 10,  0, 10, 10,  0, 10, 10, 10, 10, 10,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 10, 10, 10, 10,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  6,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+     5,  5, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  0,  0,  0,  0,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  0,
+     0,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     0,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     0,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  5,  5,  5,  5,  5,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  5,  5,  5,  5,  5,  5,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  5,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  0,  0,  0,  0,  0,  0,  0,  0,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  0,  0,  0,  0,  0,  0,  0,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     5,  5,  5,  5,  5,  5,  5,  5,  0,  0,  0,  0,  0,  0,  0,  0,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  0,  0,  0,  0,  0,  0,
+     5,  5,  5,  5,  5,  5,  5,  5,  0,  0,  0,  0,  0,  0,  0,  0,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  0,  0,
+     5,  5,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  0,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  0,  0,
+     5,  5,  5,  5,  5,  0,  0,  0,  5,  5,  5,  0,  0,  0,  0,  0,
+     5,  5,  5,  5,  5,  5,  5,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  0,  0,  0,  0,  0,  0,  0,
+     5,  5,  5,  5,  5,  5,  5,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     5,  5,  5,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     5,  5,  5,  5,  5,  5,  5,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  0,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1
+};
+
+RE_UINT32 re_get_bidi_class(RE_UINT32 codepoint) {
+    RE_UINT32 field_2;
+    RE_UINT32 field_1;
+    RE_UINT32 field_0;
+    RE_UINT32 v;
+
+    field_2 = codepoint >> 10;
+    field_1 = (codepoint >> 5) & 0x1F;
+    field_0 = codepoint & 0x1F;
+
+    v = re_bidi_class_table_1[field_2];
+    v = re_bidi_class_table_2[(v << 5) | field_1];
+    v = re_bidi_class_table_3[(v << 5) | field_0];
+
+    return v;
+}
+
+/* Bidi_Control. */
+RE_UINT32 re_get_bidi_control(RE_UINT32 codepoint) {
+    if (codepoint == 0x061C)
+        return 1;
+    if (0x200E <= codepoint && codepoint <= 0x200F)
+        return 1;
+    if (0x202A <= codepoint && codepoint <= 0x202E)
+        return 1;
+    if (0x2066 <= codepoint && codepoint <= 0x2069)
+        return 1;
+
+    return 0;
+}
+
+/* Bidi_Mirrored. */
+static RE_UINT8 re_bidi_mirrored_table_1[] = {
+     0,  1,  1,  2,  1,  3,  1,  1,  4,  5,  6,  7,  8,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  9,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1, 10,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1
+};
+
+static RE_UINT8 re_bidi_mirrored_table_2[] = {
+     0,  1,  2,  2,  0,  3,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  4,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  5,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  6,  7,  8,  9,  0,  0,  0,  0,  0, 10,  0,  0,  0,  0,  0,
+    11, 12, 13, 14, 15, 16, 17, 18, 19, 20,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 21,  0,  0, 22, 23,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 24, 25, 26, 27,
+    28, 29, 30, 31, 32, 33, 34, 35,  0,  0,  0,  0,  0,  0,  0, 36,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    37, 38,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    39,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0, 40, 41,  0,  0,  0,  0,  1,  2, 42, 43,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0, 44,  0, 45,  0, 46,  0, 47,  0, 48,  0
+};
+
+static RE_UINT8 re_bidi_mirrored_table_3[] = {
+      0,   0,   0,   0,   0,   3,   0,  80,   0,   0,   0,  40,   0,   8,   0,   8,
+      0,   0,   0,  60,   0,   0,   0,  24,   0,   0,   0,   6,  96,   0,   0,   0,
+      0,   0,   0,  96,   0,  96,   0,   0,   1,   0,   0,   0,  30,  63,  98, 188,
+     87, 248,  15, 250, 255,  31,  60, 128, 245, 207, 255, 255, 255, 159,   7,   1,
+    204, 255, 255, 193,   0,  62, 195, 255, 255,  63, 255, 255,   0,  15,   0,   0,
+      3,   6,   0,   0,   0, 255,  63,   0, 121,  59, 120, 112, 252, 255,   0,   0,
+    248, 255, 255, 249, 253, 255,   0,   1,  63, 194,  55,  31,  58,   3, 240,  51,
+      0, 252, 255, 223,  83, 122,  48, 112,   0,   0, 128,   1,  48, 188,  25, 254,
+    255, 255, 255, 255, 207, 191, 255, 255, 255, 255, 127,  80, 124, 112, 136,  47,
+      0,   0,   0,  64,  60,  54,   0,  48, 255,   3,   0,   0,   0, 255, 243,  15,
+      0,   0,   0, 126,  48,   0,   0,   0,   0,   0,   0, 168,  13,   0,   0,   0,
+      0,   0,   0,   8,   0,   0,  32,   0,   0, 128,   0,   0,   0,   2,   0,   0,
+      8,   0,   0,   0
+};
+
+RE_UINT32 re_get_bidi_mirrored(RE_UINT32 codepoint) {
+    RE_UINT32 field_2;
+    RE_UINT32 field_1;
+    RE_UINT32 field_0;
+    RE_UINT32 offset;
+    RE_UINT32 v;
+
+    field_2 = codepoint >> 10;
+    field_1 = (codepoint >> 5) & 0x1F;
+    field_0 = (codepoint >> 3) & 0x3;
+    offset = codepoint & 0x7;
+
+    v = re_bidi_mirrored_table_1[field_2];
+    v = re_bidi_mirrored_table_2[(v << 5) | field_1];
+    v = re_bidi_mirrored_table_3[(v << 2) | field_0];
+
+    return (v >> offset) & 0x1;
+}
+
+/* Blank. */
+RE_UINT32 re_get_blank(RE_UINT32 codepoint) {
+    if (codepoint == 0x09)
+        return 1;
+    if (codepoint == 0x20)
+        return 1;
+    if (codepoint == 0xA0)
+        return 1;
+    if (codepoint == 0x1680)
+        return 1;
+    if (0x2000 <= codepoint && codepoint <= 0x200A)
+        return 1;
+    if (codepoint == 0x202F)
+        return 1;
+    if (codepoint == 0x205F)
+        return 1;
+    if (codepoint == 0x3000)
+        return 1;
+
+    return 0;
+}
+
+/* Block. */
+static RE_UINT8 re_block_table_1[] = {
+     0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 13, 13,
+    13, 13, 13, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 16, 17, 18, 19, 19, 19, 19, 19,
+    19, 19, 19, 19, 19, 20, 21, 22, 23, 23, 23, 23, 23, 23, 24, 25,
+    26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 36, 37, 38, 36, 36,
+    36, 39, 36, 36, 36, 36, 36, 36, 36, 36, 40, 41, 42, 42, 42, 42,
+    42, 42, 43, 44, 36, 36, 36, 36, 36, 36, 36, 36, 45, 36, 36, 46,
+    36, 36, 36, 36, 47, 48, 49, 36, 50, 36, 51, 52, 53, 54, 55, 36,
+    56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56,
+    56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56,
+    56, 56, 56, 56, 56, 56, 56, 56, 56, 57, 58, 58, 58, 59, 60, 61,
+    61, 61, 61, 62, 63, 63, 63, 63, 63, 63, 64, 36, 36, 36, 65, 36,
+    66, 66, 66, 66, 67, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
+    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
+    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
+    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
+    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
+    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
+    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
+    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
+    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
+    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
+    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
+    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
+    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
+    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
+    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
+    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
+    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
+    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
+    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
+    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
+    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
+    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
+    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
+    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
+    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
+    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
+    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
+    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
+    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
+    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
+    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
+    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
+    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
+    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
+    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
+    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
+    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
+    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
+    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
+    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
+    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
+    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
+    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
+    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
+    68, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
+    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
+    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
+    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
+    69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69,
+    69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69,
+    69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69,
+    69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69,
+    70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70,
+    70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70,
+    70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70,
+    70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70
+};
+
+static RE_UINT16 re_block_table_2[] = {
+      0,   0,   0,   0,   1,   1,   1,   1,   2,   2,   2,   2,   3,   3,   3,   3,
+      3,   3,   4,   5,   5,   6,   7,   7,   8,   8,   8,   9,  10,  10,  10,  10,
+     11,  11,  11,  11,  11,  11,  11,  11,  12,  13,  14,  14,  15,  16,  16,  16,
+     17,  17,  17,  17,  17,  17,  17,  17,  18,  18,  19,  20,  21,  21,  22,  22,
+     23,  23,  24,  25,  26,  27,  27,  27,  28,  28,  28,  28,  29,  29,  29,  29,
+     30,  30,  30,  30,  31,  31,  31,  31,  32,  32,  32,  32,  33,  33,  33,  33,
+     34,  34,  34,  34,  35,  35,  35,  35,  36,  36,  36,  36,  37,  37,  37,  37,
+     38,  38,  38,  38,  39,  39,  39,  39,  40,  40,  40,  40,  40,  40,  40,  40,
+     41,  41,  41,  41,  41,  42,  42,  42,  43,  43,  43,  43,  43,  43,  43,  43,
+     44,  44,  44,  44,  44,  44,  44,  44,  44,  44,  44,  44,  45,  46,  46,  46,
+     47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,
+     47,  47,  47,  47,  48,  49,  49,  49,  50,  51,  52,  53,  54,  54,  54,  54,
+     55,  55,  55,  55,  55,  56,  57,  57,  58,  58,  59,  60,  61,  61,  61,  62,
+     63,  64,  64,  64,  64,  65,  66,  66,  67,  67,  67,  67,  68,  68,  69,  69,
+     70,  70,  71,  72,  73,  74,  75,  76,  77,  77,  77,  77,  78,  78,  79,  79,
+     80,  80,  80,  80,  80,  80,  80,  80,  81,  81,  81,  81,  81,  81,  81,  81,
+     82,  82,  82,  83,  84,  85,  86,  87,  88,  88,  89,  90,  91,  92,  92,  92,
+     93,  93,  93,  93,  93,  93,  93,  93,  94,  94,  94,  94,  94,  94,  94,  94,
+     95,  95,  96,  97,  97,  97,  97,  97,  98,  98,  98,  98,  99, 100, 100, 100,
+    101, 101, 101, 101, 101, 101, 101, 101, 102, 102, 102, 102, 102, 102, 103, 104,
+    105, 105, 105, 105, 105, 105, 105, 105, 106, 106, 106, 106, 107, 107, 107, 107,
+    108, 108, 108, 108, 108, 108, 108, 108, 109, 109, 109, 109, 109, 109, 109, 109,
+    110, 110, 110, 111, 112, 112, 112, 112, 113, 114, 115, 115, 116, 116, 116, 117,
+    118, 118, 118, 118, 119, 119, 119, 119, 120, 120, 120, 120, 120, 120, 120, 121,
+    122, 122, 123, 123, 123, 124, 124, 124, 125, 126, 127, 127, 128, 129, 130, 131,
+    132, 132, 132, 132, 132, 132, 132, 132, 133, 133, 133, 133, 133, 133, 133, 133,
+    134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+    134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+    134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 135, 135,
+    136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+    136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+    136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+    137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+    137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+    137, 137, 137, 137, 138, 139, 140, 141, 142, 142, 142, 142, 142, 142, 142, 142,
+    142, 142, 143, 143, 143, 144, 144, 144, 145, 146, 146, 146, 146, 146, 146, 146,
+    147, 148, 149, 149, 150, 150, 150, 151, 152, 153, 154, 155, 156, 156, 156, 157,
+    158, 158, 158, 159, 160, 160, 160, 161, 162, 163, 164, 165, 166, 166, 167, 167,
+    168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168,
+    168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168,
+    168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168,
+    168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 169, 170, 170,
+    171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171,
+    171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 172, 172, 172, 172,
+    173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173,
+    173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173,
+    174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174,
+    174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174,
+    174, 174, 174, 174, 174, 174, 174, 174, 175, 175, 175, 175, 175, 175, 175, 175,
+    175, 175, 175, 175, 175, 175, 175, 175, 176, 176, 177, 178, 178, 178, 178, 178,
+    178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+    179, 180, 181, 182, 183, 183, 183, 183, 184, 184, 184, 184, 184, 184, 184, 185,
+    186, 186, 186, 186, 187, 187, 187, 187, 188, 188, 189, 189, 190, 191, 192, 193,
+     26,  26,  26,  26, 194, 195, 195, 196, 197, 198, 199, 200, 201, 202, 202,  26,
+    203, 203, 204, 205, 206, 207, 208, 208, 209, 210, 211, 212,  26,  26,  26,  26,
+    213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213,  26,  26,  26,  26,
+    214, 214, 215, 216, 217, 218,  26, 219, 220, 221,  26,  26, 222, 223, 223, 223,
+    224, 224, 224, 225, 226,  26, 227, 227, 228, 228, 229, 230, 231, 232,  26,  26,
+    233, 233, 234,  26, 235, 235, 235, 235, 236, 236,  26,  26,  26,  26,  26,  26,
+     26,  26,  26, 237, 238, 238,  26,  26, 239, 240, 241, 242,  26, 243, 244, 245,
+    246, 246, 246, 246, 247, 247, 248, 249, 250, 250, 251, 252, 253, 253, 253, 254,
+    255, 255, 256,  26, 257, 258, 259, 259, 260, 260, 260, 260,  26,  26,  26,  26,
+    261, 261, 261, 261, 262, 262, 262,  26,  26,  26,  26,  26, 263, 263, 263, 263,
+    264, 264, 264, 265, 266, 266, 267,  26, 268, 268,  26,  26,  26,  26,  26,  26,
+    269, 269, 270,  26,  26, 271, 271, 271, 272, 272, 272,  26,  26, 273, 273, 273,
+    274, 274, 275, 276, 276, 277, 278, 278,  26,  26,  26,  26,  26,  26,  26,  26,
+    279, 279, 279, 280, 281, 281,  26,  26, 282, 282, 282, 283, 283, 284,  26,  26,
+     26,  26,  26,  26,  26,  26,  26, 285,  26,  26,  26,  26,  26, 286, 287, 287,
+    288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288,
+    288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288,
+    289, 289, 289, 289, 290, 290, 290, 290, 290, 290, 291,  26,  26,  26,  26,  26,
+     26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
+     26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
+     26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
+    292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292,
+    292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292,
+    292, 293,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
+     26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
+    294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294,
+    294, 294, 294, 294,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
+    295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295,
+    295, 295, 296, 297,  26,  26, 298, 299, 300, 300, 300, 300, 301,  26,  26,  26,
+     26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
+     26,  26, 302, 302, 302,  26,  26,  26, 303, 303, 303, 303, 303,  26,  26, 304,
+    305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305,
+    305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305,
+    306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306,
+    306, 306, 306, 306, 306, 306, 306, 306, 307, 307, 307, 307, 307, 307, 307, 307,
+    307, 307, 307, 307, 307, 307, 307, 307, 308, 308, 308, 308, 309,  26,  26,  26,
+     26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
+    310, 310, 310, 310, 310, 310, 310, 310, 311, 312, 313, 314, 315, 315, 315, 315,
+    315, 315, 315, 315, 315, 315, 315, 315,  26,  26,  26,  26,  26,  26,  26,  26,
+    316, 316, 316, 316, 316, 317,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
+     26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
+    318, 318, 318, 318, 318, 318, 318, 318, 319, 319, 319, 319, 319, 319, 319, 319,
+    320, 320, 321,  26,  26,  26,  26, 322, 323, 323, 323, 324,  26,  26,  26,  26,
+    325, 325, 325, 325, 325, 325, 325, 325, 325, 325, 325, 325, 325, 325, 325, 325,
+    325, 325, 325, 325, 325, 325, 325, 325, 325, 325, 325, 325, 325, 325, 325, 325,
+    326, 326, 326, 326, 326, 326, 326, 326, 326, 326, 326, 326, 326, 326, 326, 326,
+    326, 326, 326, 326, 326, 327,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
+    328, 329,  26,  26,  26,  26,  26,  26, 330, 330, 331,  26,  26,  26,  26,  26,
+     26,  26,  26,  26,  26,  26, 332, 332,  26,  26,  26,  26,  26,  26,  26,  26,
+    333, 333, 333, 333, 333, 333, 333,  26, 334, 334, 334,  26,  26,  26,  26,  26,
+     26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
+     26,  26,  26, 335, 336, 336,  26,  26, 337, 337, 338,  26,  26,  26,  26,  26,
+    339, 339, 339, 339, 339, 339, 339, 339,  26,  26,  26,  26,  26,  26,  26,  26,
+    340, 341, 342, 342, 342, 343, 343, 343, 344, 344, 344, 344, 344, 344, 344, 344,
+    345, 345, 345, 345, 345, 345, 345, 345, 346, 346, 346, 346, 346, 346, 346, 346,
+    346, 346, 346, 346, 346, 346, 346, 346, 346, 346, 346, 346, 346, 346, 346, 346,
+    347, 347, 348, 349, 350, 350, 350, 350, 351, 351, 351, 351, 352, 352, 352, 352,
+    353, 353, 353, 353, 353, 353, 353, 353, 354, 354, 354, 354, 354, 354, 354, 354,
+    355, 355, 355, 356, 357, 357, 357, 357, 358, 358, 358, 358, 358, 358, 358, 358,
+    359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359,
+    359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359,
+    359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359,
+    359, 359, 359, 359, 359, 359, 359,  26, 360, 360, 360, 360, 360, 360, 360, 360,
+    360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360,
+    360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360,
+    360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360,
+    360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 361, 361, 361, 361, 361, 361,
+    361, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362,
+    362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362,
+    362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362,
+    362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362,
+    362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362,
+    362, 362, 362, 362, 362, 363, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364,
+    364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364,
+    364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364,
+    364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364,
+    364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 365,
+    366, 366, 366, 366, 366, 366, 366, 366, 366, 366, 366, 366, 366, 366, 366, 366,
+    366,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
+    367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367,
+    367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367,
+    367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367,
+    367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 368,  26,  26,  26,  26,  26,
+    369, 369, 369, 369,  26,  26,  26,  26, 370, 370, 370, 370, 370, 370, 370, 371,
+     26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
+    372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372,
+    372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372,
+    373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373,
+    373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373
+};
+
+static RE_UINT16 re_block_table_3[] = {
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
+      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
+      3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,
+      3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,
+      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
+      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
+      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
+      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
+      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
+      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
+      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
+      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,
+      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,
+      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,
+      7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
+      7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
+      7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
+      8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,
+      8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,
+      8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,
+      9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,
+      9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,
+     10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,
+     10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,
+     10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,
+     11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,
+     11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,
+     11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,
+     11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,
+     12,  12,  12,  12,  12,  12,  12,  12,  12,  12,  12,  12,  12,  12,  12,  12,
+     12,  12,  12,  12,  12,  12,  12,  12,  12,  12,  12,  12,  12,  12,  12,  12,
+     12,  12,  12,  12,  12,  12,  12,  12,  12,  12,  12,  12,  12,  12,  12,  12,
+     13,  13,  13,  13,  13,  13,  13,  13,  13,  13,  13,  13,  13,  13,  13,  13,
+     13,  13,  13,  13,  13,  13,  13,  13,  13,  13,  13,  13,  13,  13,  13,  13,
+     14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,
+     14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,
+     14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,
+     15,  15,  15,  15,  15,  15,  15,  15,  15,  15,  15,  15,  15,  15,  15,  15,
+     15,  15,  15,  15,  15,  15,  15,  15,  15,  15,  15,  15,  15,  15,  15,  15,
+     15,  15,  15,  15,  15,  15,  15,  15,  15,  15,  15,  15,  15,  15,  15,  15,
+     16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,
+     16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,
+     17,  17,  17,  17,  17,  17,  17,  17,  17,  17,  17,  17,  17,  17,  17,  17,
+     17,  17,  17,  17,  17,  17,  17,  17,  17,  17,  17,  17,  17,  17,  17,  17,
+     18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,
+     18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,
+     19,  19,  19,  19,  19,  19,  19,  19,  19,  19,  19,  19,  19,  19,  19,  19,
+     19,  19,  19,  19,  19,  19,  19,  19,  19,  19,  19,  19,  19,  19,  19,  19,
+     20,  20,  20,  20,  20,  20,  20,  20,  20,  20,  20,  20,  20,  20,  20,  20,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,
+     21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,
+     22,  22,  22,  22,  22,  22,  22,  22,  22,  22,  22,  22,  22,  22,  22,  22,
+     22,  22,  22,  22,  22,  22,  22,  22,  22,  22,  22,  22,  22,  22,  22,  22,
+     23,  23,  23,  23,  23,  23,  23,  23,  23,  23,  23,  23,  23,  23,  23,  23,
+     23,  23,  23,  23,  23,  23,  23,  23,  23,  23,  23,  23,  23,  23,  23,  23,
+     24,  24,  24,  24,  24,  24,  24,  24,  24,  24,  24,  24,  24,  24,  24,  24,
+     24,  24,  24,  24,  24,  24,  24,  24,  24,  24,  24,  24,  24,  24,  24,  24,
+     25,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,
+     25,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,
+     26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
+     26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
+     27,  27,  27,  27,  27,  27,  27,  27,  27,  27,  27,  27,  27,  27,  27,  27,
+     27,  27,  27,  27,  27,  27,  27,  27,  27,  27,  27,  27,  27,  27,  27,  27,
+     28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,
+     28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,
+     29,  29,  29,  29,  29,  29,  29,  29,  29,  29,  29,  29,  29,  29,  29,  29,
+     29,  29,  29,  29,  29,  29,  29,  29,  29,  29,  29,  29,  29,  29,  29,  29,
+     30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,
+     30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,
+     31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,
+     31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,
+     32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,
+     32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,
+     33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,
+     33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,
+     34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,
+     34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,
+     35,  35,  35,  35,  35,  35,  35,  35,  35,  35,  35,  35,  35,  35,  35,  35,
+     35,  35,  35,  35,  35,  35,  35,  35,  35,  35,  35,  35,  35,  35,  35,  35,
      36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,
-     36,  61,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36, 104,   0,
-     36,  36,  36,  36,  36,  36,  36,  61,   7,   7, 111, 136,   0,   0,   0,   0,
+     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,
+     37,  37,  37,  37,  37,  37,  37,  37,  37,  37,  37,  37,  37,  37,  37,  37,
+     37,  37,  37,  37,  37,  37,  37,  37,  37,  37,  37,  37,  37,  37,  37,  37,
+     38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,
+     38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,
+     39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,
+     39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,
+     40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,
+     40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,
+     41,  41,  41,  41,  41,  41,  41,  41,  41,  41,  41,  41,  41,  41,  41,  41,
+     41,  41,  41,  41,  41,  41,  41,  41,  41,  41,  41,  41,  41,  41,  41,  41,
+     42,  42,  42,  42,  42,  42,  42,  42,  42,  42,  42,  42,  42,  42,  42,  42,
+     42,  42,  42,  42,  42,  42,  42,  42,  42,  42,  42,  42,  42,  42,  42,  42,
+     43,  43,  43,  43,  43,  43,  43,  43,  43,  43,  43,  43,  43,  43,  43,  43,
+     43,  43,  43,  43,  43,  43,  43,  43,  43,  43,  43,  43,  43,  43,  43,  43,
+     44,  44,  44,  44,  44,  44,  44,  44,  44,  44,  44,  44,  44,  44,  44,  44,
+     44,  44,  44,  44,  44,  44,  44,  44,  44,  44,  44,  44,  44,  44,  44,  44,
+     45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,
+     45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,
+     46,  46,  46,  46,  46,  46,  46,  46,  46,  46,  46,  46,  46,  46,  46,  46,
+     46,  46,  46,  46,  46,  46,  46,  46,  46,  46,  46,  46,  46,  46,  46,  46,
+     47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,
+     47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,
+     48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,
+     48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,
+     49,  49,  49,  49,  49,  49,  49,  49,  49,  49,  49,  49,  49,  49,  49,  49,
+     49,  49,  49,  49,  49,  49,  49,  49,  49,  49,  49,  49,  49,  49,  49,  49,
+     49,  49,  49,  49,  49,  49,  49,  49,  49,  49,  49,  49,  49,  49,  49,  49,
+     50,  50,  50,  50,  50,  50,  50,  50,  50,  50,  50,  50,  50,  50,  50,  50,
+     50,  50,  50,  50,  50,  50,  50,  50,  50,  50,  50,  50,  50,  50,  50,  50,
+     50,  50,  50,  50,  50,  50,  50,  50,  50,  50,  50,  50,  50,  50,  50,  50,
+     51,  51,  51,  51,  51,  51,  51,  51,  51,  51,  51,  51,  51,  51,  51,  51,
+     51,  51,  51,  51,  51,  51,  51,  51,  51,  51,  51,  51,  51,  51,  51,  51,
+     51,  51,  51,  51,  51,  51,  51,  51,  51,  51,  51,  51,  51,  51,  51,  51,
+     52,  52,  52,  52,  52,  52,  52,  52,  52,  52,  52,  52,  52,  52,  52,  52,
+     52,  52,  52,  52,  52,  52,  52,  52,  52,  52,  52,  52,  52,  52,  52,  52,
+     52,  52,  52,  52,  52,  52,  52,  52,  52,  52,  52,  52,  52,  52,  52,  52,
+     53,  53,  53,  53,  53,  53,  53,  53,  53,  53,  53,  53,  53,  53,  53,  53,
+     53,  53,  53,  53,  53,  53,  53,  53,  53,  53,  53,  53,  53,  53,  53,  53,
+     54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,
+     54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,
+     55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,
+     55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,
+     56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,
+     56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,
+     56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,
+     57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,
+     57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,
+     57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,
+     58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,
+     58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,
+     59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,
+     59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,
+     60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,
+     60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,
+     61,  61,  61,  61,  61,  61,  61,  61,  61,  61,  61,  61,  61,  61,  61,  61,
+     61,  61,  61,  61,  61,  61,  61,  61,  61,  61,  61,  61,  61,  61,  61,  61,
+     61,  61,  61,  61,  61,  61,  61,  61,  61,  61,  61,  61,  61,  61,  61,  61,
+     62,  62,  62,  62,  62,  62,  62,  62,  62,  62,  62,  62,  62,  62,  62,  62,
+     62,  62,  62,  62,  62,  62,  62,  62,  62,  62,  62,  62,  62,  62,  62,  62,
+     62,  62,  62,  62,  62,  62,  62,  62,  62,  62,  62,  62,  62,  62,  62,  62,
+     63,  63,  63,  63,  63,  63,  63,  63,  63,  63,  63,  63,  63,  63,  63,  63,
+     64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,
+     64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,
+     64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,
+     65,  65,  65,  65,  65,  65,  65,  65,  65,  65,  65,  65,  65,  65,  65,  65,
+     66,  66,  66,  66,  66,  66,  66,  66,  66,  66,  66,  66,  66,  66,  66,  66,
+     66,  66,  66,  66,  66,  66,  66,  66,  66,  66,  66,  66,  66,  66,  66,  66,
+     66,  66,  66,  66,  66,  66,  66,  66,  66,  66,  66,  66,  66,  66,  66,  66,
+     67,  67,  67,  67,  67,  67,  67,  67,  67,  67,  67,  67,  67,  67,  67,  67,
+     67,  67,  67,  67,  67,  67,  67,  67,  67,  67,  67,  67,  67,  67,  67,  67,
+     68,  68,  68,  68,  68,  68,  68,  68,  68,  68,  68,  68,  68,  68,  68,  68,
+     68,  68,  68,  68,  68,  68,  68,  68,  68,  68,  68,  68,  68,  68,  68,  68,
+     69,  69,  69,  69,  69,  69,  69,  69,  69,  69,  69,  69,  69,  69,  69,  69,
+     69,  69,  69,  69,  69,  69,  69,  69,  69,  69,  69,  69,  69,  69,  69,  69,
+     70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  70,
+     70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  70,
+     71,  71,  71,  71,  71,  71,  71,  71,  71,  71,  71,  71,  71,  71,  71,  71,
+     71,  71,  71,  71,  71,  71,  71,  71,  71,  71,  71,  71,  71,  71,  71,  71,
+     72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,
+     72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,
+     72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,
+     73,  73,  73,  73,  73,  73,  73,  73,  73,  73,  73,  73,  73,  73,  73,  73,
+     73,  73,  73,  73,  73,  73,  73,  73,  73,  73,  73,  73,  73,  73,  73,  73,
+     73,  73,  73,  73,  73,  73,  73,  73,  73,  73,  73,  73,  73,  73,  73,  73,
+     74,  74,  74,  74,  74,  74,  74,  74,  74,  74,  74,  74,  74,  74,  74,  74,
+     74,  74,  74,  74,  74,  74,  74,  74,  74,  74,  74,  74,  74,  74,  74,  74,
+     74,  74,  74,  74,  74,  74,  74,  74,  74,  74,  74,  74,  74,  74,  74,  74,
+     75,  75,  75,  75,  75,  75,  75,  75,  75,  75,  75,  75,  75,  75,  75,  75,
+     75,  75,  75,  75,  75,  75,  75,  75,  75,  75,  75,  75,  75,  75,  75,  75,
+     75,  75,  75,  75,  75,  75,  75,  75,  75,  75,  75,  75,  75,  75,  75,  75,
+     76,  76,  76,  76,  76,  76,  76,  76,  76,  76,  76,  76,  76,  76,  76,  76,
+     76,  76,  76,  76,  76,  76,  76,  76,  76,  76,  76,  76,  76,  76,  76,  76,
+     76,  76,  76,  76,  76,  76,  76,  76,  76,  76,  76,  76,  76,  76,  76,  76,
+     77,  77,  77,  77,  77,  77,  77,  77,  77,  77,  77,  77,  77,  77,  77,  77,
+     77,  77,  77,  77,  77,  77,  77,  77,  77,  77,  77,  77,  77,  77,  77,  77,
+     77,  77,  77,  77,  77,  77,  77,  77,  77,  77,  77,  77,  77,  77,  77,  77,
+     77,  77,  77,  77,  77,  77,  77,  77,  77,  77,  77,  77,  77,  77,  77,  77,
+     78,  78,  78,  78,  78,  78,  78,  78,  78,  78,  78,  78,  78,  78,  78,  78,
+     78,  78,  78,  78,  78,  78,  78,  78,  78,  78,  78,  78,  78,  78,  78,  78,
+     78,  78,  78,  78,  78,  78,  78,  78,  78,  78,  78,  78,  78,  78,  78,  78,
+     79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,
+     79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,
+     80,  80,  80,  80,  80,  80,  80,  80,  80,  80,  80,  80,  80,  80,  80,  80,
+     80,  80,  80,  80,  80,  80,  80,  80,  80,  80,  80,  80,  80,  80,  80,  80,
+     81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,
+     81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,
+     82,  82,  82,  82,  82,  82,  82,  82,  82,  82,  82,  82,  82,  82,  82,  82,
+     82,  82,  82,  82,  82,  82,  82,  82,  82,  82,  82,  82,  82,  82,  82,  82,
+     83,  83,  83,  83,  83,  83,  83,  83,  83,  83,  83,  83,  83,  83,  83,  83,
+     83,  83,  83,  83,  83,  83,  83,  83,  83,  83,  83,  83,  83,  83,  83,  83,
+     84,  84,  84,  84,  84,  84,  84,  84,  84,  84,  84,  84,  84,  84,  84,  84,
+     84,  84,  84,  84,  84,  84,  84,  84,  84,  84,  84,  84,  84,  84,  84,  84,
+     85,  85,  85,  85,  85,  85,  85,  85,  85,  85,  85,  85,  85,  85,  85,  85,
+     85,  85,  85,  85,  85,  85,  85,  85,  85,  85,  85,  85,  85,  85,  85,  85,
+     86,  86,  86,  86,  86,  86,  86,  86,  86,  86,  86,  86,  86,  86,  86,  86,
+     86,  86,  86,  86,  86,  86,  86,  86,  86,  86,  86,  86,  86,  86,  86,  86,
+     87,  87,  87,  87,  87,  87,  87,  87,  87,  87,  87,  87,  87,  87,  87,  87,
+     87,  87,  87,  87,  87,  87,  87,  87,  87,  87,  87,  87,  87,  87,  87,  87,
+     88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,
+     88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,
+     89,  89,  89,  89,  89,  89,  89,  89,  89,  89,  89,  89,  89,  89,  89,  89,
+     89,  89,  89,  89,  89,  89,  89,  89,  89,  89,  89,  89,  89,  89,  89,  89,
+     89,  89,  89,  89,  89,  89,  89,  89,  89,  89,  89,  89,  89,  89,  89,  89,
+     90,  90,  90,  90,  90,  90,  90,  90,  90,  90,  90,  90,  90,  90,  90,  90,
+     91,  91,  91,  91,  91,  91,  91,  91,  91,  91,  91,  91,  91,  91,  91,  91,
+     91,  91,  91,  91,  91,  91,  91,  91,  91,  91,  91,  91,  91,  91,  91,  91,
+     92,  92,  92,  92,  92,  92,  92,  92,  92,  92,  92,  92,  92,  92,  92,  92,
+     92,  92,  92,  92,  92,  92,  92,  92,  92,  92,  92,  92,  92,  92,  92,  92,
+     93,  93,  93,  93,  93,  93,  93,  93,  93,  93,  93,  93,  93,  93,  93,  93,
+     93,  93,  93,  93,  93,  93,  93,  93,  93,  93,  93,  93,  93,  93,  93,  93,
+     94,  94,  94,  94,  94,  94,  94,  94,  94,  94,  94,  94,  94,  94,  94,  94,
+     94,  94,  94,  94,  94,  94,  94,  94,  94,  94,  94,  94,  94,  94,  94,  94,
+     95,  95,  95,  95,  95,  95,  95,  95,  95,  95,  95,  95,  95,  95,  95,  95,
+     95,  95,  95,  95,  95,  95,  95,  95,  95,  95,  95,  95,  95,  95,  95,  95,
+     96,  96,  96,  96,  96,  96,  96,  96,  96,  96,  96,  96,  96,  96,  96,  96,
+     96,  96,  96,  96,  96,  96,  96,  96,  96,  96,  96,  96,  96,  96,  96,  96,
+     97,  97,  97,  97,  97,  97,  97,  97,  97,  97,  97,  97,  97,  97,  97,  97,
+     97,  97,  97,  97,  97,  97,  97,  97,  97,  97,  97,  97,  97,  97,  97,  97,
+     98,  98,  98,  98,  98,  98,  98,  98,  98,  98,  98,  98,  98,  98,  98,  98,
+     98,  98,  98,  98,  98,  98,  98,  98,  98,  98,  98,  98,  98,  98,  98,  98,
+     99,  99,  99,  99,  99,  99,  99,  99,  99,  99,  99,  99,  99,  99,  99,  99,
+     99,  99,  99,  99,  99,  99,  99,  99,  99,  99,  99,  99,  99,  99,  99,  99,
+     99,  99,  99,  99,  99,  99,  99,  99,  99,  99,  99,  99,  99,  99,  99,  99,
+    100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100,
+    100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100,
+    100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100,
+    101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101,
+    101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101,
+    102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102,
+    102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102,
+    103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103,
+    103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103,
+    104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104,
+    104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104,
+    105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105,
+    105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106,
+    107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107,
+    107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107,
+    108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108,
+    108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108,
+    109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109,
+    109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109,
+    110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110,
+    110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110,
+    110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110,
+    111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111,
+    111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111,
+    111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111,
+    111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111,
+    112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112,
+    113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+    113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+    114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114,
+    114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114,
+    114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114,
+    115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115,
+    116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116,
+    116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116,
+    117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117,
+    117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117,
+    118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118,
+    118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118,
+    119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119,
+    119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119,
+    120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
+    120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
+    121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+    121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+    121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+    122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+    122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+    122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+    122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+    123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+    123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+    123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+    124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+    124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+    125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+    125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+    126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+    126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+    129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+    129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+    129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+    130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+    131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+    131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+    132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+    132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+    133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+    133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+    134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+    134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+    134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+    135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+    135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+    135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+    136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+    136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+    137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+    137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+    138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138,
+    138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138,
+    139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139,
+    139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139,
+    140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,
+    140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,
+    141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141,
+    141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141,
+    142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142,
+    142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142,
+    143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143,
+    143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143,
+    143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143,
+    144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144,
+    144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144,
+    144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144,
+    144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144,
+    145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145,
+    145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145,
+    145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145,
+    146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146,
+    146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146,
+    147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147,
+    147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147,
+    147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147,
+    148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148,
+    148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148,
+    148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148,
+    149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149,
+    149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149,
+    150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150,
+    150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150,
+    151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151,
+    151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151,
+    152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152,
+    152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152,
+    153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153,
+    153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153,
+    154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154,
+    154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154,
+    154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154,
+    155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155,
+    155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155,
+    155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155,
+    156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156,
+    157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157,
+    158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
+    159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+    159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+    160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+    160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+    161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+    161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+    161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+    162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+    162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+    162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+    163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+    164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+    164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+    165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+    165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+    166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
+    166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
+    167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167,
+    167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167,
+    167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167,
+    168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168,
+    168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168,
+    168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168,
+    168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168,
+    169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169,
+    169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169,
+    169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169,
+    170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170,
+    170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170,
+    171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171,
+    171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171,
+    172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172,
+    172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172,
+    173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173,
+    173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173,
+    173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173,
+    174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174,
+    174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174,
+    175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175,
+    175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175,
+    175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175,
+    176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176,
+    176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176,
+    177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177,
+    177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177,
+    178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+    178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+    178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+    179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179,
+    179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179,
+    179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179,
+    180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180,
+    180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180,
+    180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180,
+    181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181,
+    181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181,
+    181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181,
+    182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182,
+    182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182,
+    182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182,
+    183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183,
+    183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183,
+    183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183,
+    183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184,
+    184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184,
+    185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185,
+    185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185,
+    186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186,
+    186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186,
+    187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187,
+    187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187,
+    188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188,
+    188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188,
+    188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189,
+    189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189,
+    190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190,
+    190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190,
+    191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191,
+    191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191,
+    192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192,
+    192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192,
+    193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193,
+    193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193,
+    194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194,
+    194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194,
+    195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195,
+    195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195,
+    196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196,
+    196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196,
+    197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197,
+    197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197,
+    198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198,
+    198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198,
+    199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199,
+    199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199,
+    200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200,
+    200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200,
+    201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201,
+    201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201,
+    201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202,
+    202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202,
+    202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203,
+    203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203,
+    204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204,
+    204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204,
+    205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205,
+    205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205,
+    206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206,
+    206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206,
+    207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207,
+    207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207,
+    207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207,
+    208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208,
+    208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208,
+    208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208,
+    208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209,
+    209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209,
+    209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209,
+    210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210,
+    210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210,
+    211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211,
+    211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211,
+    212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212,
+    212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212,
+    212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212,
+    213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213,
+    213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213,
+    213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213,
+    214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214,
+    214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214,
+    214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214,
+    215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215,
+    215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215,
+    215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215,
+    216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216,
+    216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216,
+    217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217,
+    217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217,
+    218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218,
+    218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218,
+    218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219,
+    219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219,
+    219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219,
+    220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220,
+    220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220,
+    220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220,
+    221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221,
+    221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221,
+    222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222,
+    222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222,
+    223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223,
+    223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223,
+    224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224,
+    224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224,
+    225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225,
+    225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225,
+    226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226,
+    226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226,
+    227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227,
+    227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227,
+    227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228,
+    228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228,
+    229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229,
+    229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229,
+    229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230,
+    230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230,
+    231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231,
+    231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231,
+    232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232,
+    232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232,
+    233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233,
+    233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233,
+    233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233,
+    234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234,
+    234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234,
+    234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234,
+    234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235,
+    235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235,
+    236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236,
+    236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236,
+    236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236,
+    237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237,
+    237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237,
+    237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237,
+    238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238,
+    238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238,
+    239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239,
+    239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239,
+    239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240,
+    240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241,
+    242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242,
+    242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242,
+    243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243,
+    243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243,
+    244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244,
+    244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244,
+    245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245,
+    245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245,
+    245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246,
+    246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246,
+    246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246,
+    247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247,
+    248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248,
+    248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248,
+    249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249,
+    249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249,
+    250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250,
+    250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250,
+    250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251,
+    251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251,
+    251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251,
+    252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252,
+    252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252,
+    252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253,
+    253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253,
+    254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254,
+    254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254,
+    255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
+    255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
+    256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256,
+    256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256,
+    257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257,
+    257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257,
+    258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258,
+    258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258,
+    259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259,
+    259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259,
+    259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260,
+    260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260,
+    261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261,
+    261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261,
+    261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261,
+    262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262,
+    262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262,
+    262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262,
+    262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262,
+    263, 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, 263,
+    263, 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, 263,
+    263, 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, 263,
+    264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264,
+    264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264,
+    265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266,
+    266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266,
+    267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267,
+    267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267,
+    268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268,
+    268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268,
+    268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269,
+    269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269,
+    270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270,
+    270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270,
+    271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271,
+    271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271,
+    272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272,
+    272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272,
+    273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273,
+    273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273,
+    273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274,
+    274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274,
+    274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    275, 275, 275, 275, 275, 275, 275, 275, 275, 275, 275, 275, 275, 275, 275, 275,
+    275, 275, 275, 275, 275, 275, 275, 275, 275, 275, 275, 275, 275, 275, 275, 275,
+    275, 275, 275, 275, 275, 275, 275, 275, 275, 275, 275, 275, 275, 275, 275, 275,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+    276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+    277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277,
+    277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277,
+    278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278,
+    278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279,
+    279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279,
+    279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279,
+    280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280,
+    280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280,
+    280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281,
+    281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281,
+    282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282,
+    282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282,
+    282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282,
+    283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283,
+    283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283,
+    283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283,
+    284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284,
+    284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284,
+    285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285,
+    285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285,
+    286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286,
+    286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286,
+    287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287,
+    287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287,
+    288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288,
+    288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288,
+    288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288,
+    289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289,
+    289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289,
+    289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289,
+    290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290,
+    290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290,
+    291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291,
+    291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291,
+    292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292,
+    292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292,
+    293, 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, 293,
+    293, 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, 293,
+    294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294,
+    294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294,
+    295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295,
+    295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295,
+    295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295,
+    296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296,
+    296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296,
+    296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296,
+    297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297,
+    297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297,
+    298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298,
+    298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298,
+    299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299,
+    299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299,
+    300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300,
+    300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300,
+    301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301,
+    301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301,
+    301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301,
+    302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302,
+    302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302,
+    302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302,
+    302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303,
+    303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303,
+    304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304,
+    304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304,
+    304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305,
+    305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305,
+    306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306,
+    306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306,
+    306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307,
+    307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307,
+    308, 308, 308, 308, 308, 308, 308, 308, 308, 308, 308, 308, 308, 308, 308, 308,
+    308, 308, 308, 308, 308, 308, 308, 308, 308, 308, 308, 308, 308, 308, 308, 308
+};
+
+RE_UINT32 re_get_block(RE_UINT32 codepoint) {
+    RE_UINT32 field_2;
+    RE_UINT32 field_1;
+    RE_UINT32 field_0;
+    RE_UINT32 v;
+
+    field_2 = codepoint >> 10;
+    field_1 = (codepoint >> 5) & 0x1F;
+    field_0 = codepoint & 0x1F;
+
+    v = re_block_table_1[field_2];
+    v = re_block_table_2[(v << 5) | field_1];
+    v = re_block_table_3[(v << 5) | field_0];
+
+    return v;
+}
+
+/* Canonical_Combining_Class. */
+static RE_UINT8 re_canonical_combining_class_table_1[] = {
+     0,  1,  2,  3,  4,  5,  6,  7,  8,  9,  9, 10, 11,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9, 12, 13,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9, 14, 15,
+    16,  9, 17, 18, 19, 20, 21, 22,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9, 23, 24,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9, 25,
+     9,  9,  9,  9, 26,  9,  9,  9, 27,  9, 28,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9
+};
+
+static RE_UINT8 re_canonical_combining_class_table_2[] = {
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   1,   2,   3,   4,   0,   0,   0,   0,
+      0,   0,   0,   0,   5,   0,   0,   0,   0,   0,   0,   0,   6,   7,   8,   0,
+      9,   0,  10,  11,   0,   0,  12,  13,  14,  15,  16,   0,   0,   0,   0,  17,
+     18,  19,  20,   0,   0,   0,  21,  22,   0,  23,  24,   0,   0,  23,  25,  26,
+      0,  23,  25,   0,   0,  23,  25,   0,   0,  23,  25,   0,   0,   0,  25,   0,
+      0,   0,  27,   0,   0,  23,  25,   0,   0,  28,  25,   0,   0,   0,  29,   0,
+      0,  30,  31,   0,   0,  32,  33,   0,  34,  35,   0,  36,  37,   0,  38,   0,
+      0,  39,   0,   0,  40,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  41,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,  42,  42,   0,   0,   0,   0,  43,   0,
+      0,   0,   0,   0,   0,  44,   0,   0,   0,  45,   0,   0,   0,   0,   0,   0,
+     46,   0,   0,  47,   0,  48,  49,   0,   0,  50,  51,  52,   0,  53,   0,  54,
+      0,  55,   0,   0,   0,   0,  56,  57,   0,   0,   0,   0,   0,   0,  58,  59,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,  60,  61,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,  62,   0,   0,   0,  63,   0,   0,   0,  64,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,  65,   0,   0,  66,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,  67,  68,   0,   0,  69,   0,   0,   0,   0,   0,   0,   0,   0,
+     70,  71,   0,   0,   0,   0,  51,  72,   0,  73,  74,   0,   0,  75,  76,   0,
+      0,   0,   0,   0,   0,  77,  78,  79,   0,   0,   0,   0,   0,   0,   0,  25,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,  80,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,  81,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  82,
+      0,   0,   0,   0,   0,   0,   0,  49,   0,   0,   0,  83,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     84,  85,   0,   0,   0,   0,   0,  86,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,  87,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,  88,   0,   0,   0,   0,  89,   0,   0,   0,   0,   0,
+      0,   0,  70,  63,   0,  90,   0,   0,  91,  92,   0,  75,   0,   0,  93,   0,
+      0,  94,   0,   0,   0,   0,   0,  95,   0,  96,  25,  97,   0,   0,   0,   0,
+      0,   0,  98,   0,   0,   0,  99,   0,   0,   0,   0,   0,   0,  63, 100,   0,
+      0,  63,   0,   0,   0, 101,   0,   0,   0, 102,   0,   0,   0,   0,   0,   0,
+      0,  90,   0,   0,   0,   0,   0,   0,   0, 103, 104,   0,   0,   0,   0,  76,
+      0,  42, 105,   0, 106,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,  63,   0,   0,   0,   0,   0,   0,   0,   0, 107,   0, 108,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0, 109,   0, 110,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 111,
+      0,   0,   0,   0, 112,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 113, 114, 115,   0,   0,
+      0,   0, 116,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    117, 118,   0,   0,   0,   0,   0,   0,   0, 110,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0, 119,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0, 120,   0,   0,   0, 121,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0
+};
+
+static RE_UINT8 re_canonical_combining_class_table_3[] = {
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  2,  3,  3,  3,  3,  2,  4,  3,  3,  3,  3,
+     3,  5,  5,  3,  3,  3,  3,  5,  5,  3,  3,  3,  3,  3,  3,  3,
+     3,  3,  3,  3,  6,  6,  6,  6,  6,  3,  3,  3,  3,  1,  1,  1,
+     1,  1,  1,  1,  1,  7,  1,  3,  3,  3,  1,  1,  1,  3,  3,  0,
+     1,  1,  1,  3,  3,  3,  3,  1,  2,  3,  3,  1,  8,  9,  9,  8,
+     9,  9,  8,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  1,  1,  1,  1,  1,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  3,  1,  1,  1,  1,  3,  1,  1,  1, 10,  3,  1,  1,  1,  1,
+     1,  1,  3,  3,  3,  3,  3,  3,  1,  1,  3,  1,  1, 10, 11,  1,
+    12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 21, 22, 23, 24,  0, 25,
+     0, 26, 27,  0,  1,  3,  0, 20,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     1,  1,  1,  1,  1,  1,  1,  1, 28, 29, 30,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 31, 32, 33, 28, 29,
+    30, 34, 35,  1,  1,  3,  3,  1,  1,  1,  1,  1,  3,  1,  1,  3,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    36,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  1,  1,  1,  1,  1,  1,  1,  0,  0,  1,
+     1,  1,  1,  3,  1,  0,  0,  1,  1,  0,  3,  1,  1,  3,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0, 37,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     1,  3,  1,  1,  3,  1,  1,  3,  3,  3,  1,  3,  3,  1,  3,  1,
+     1,  1,  3,  1,  3,  1,  3,  1,  3,  1,  1,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  1,  1,  1,  1,
+     1,  1,  3,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  3,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  1,  1,  1,  1,  0,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  0,  1,  1,  1,  0,  1,  1,  1,  1,  1,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  3,  3,  3,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  3,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  0,  3,  1,  1,  3,  1,  1,  3,  1,  1,  1,  3,  3,  3,
+    31, 32, 33,  1,  1,  1,  3,  1,  1,  3,  3,  1,  1,  1,  1,  1,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 38,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 39,  0,  0,
+     0,  1,  3,  1,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 39,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 39,  0,  0,
+     0,  0,  0,  0,  0, 40, 41,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 39, 39,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 39,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0, 42, 42, 39,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0, 43, 43, 43, 43,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0, 44, 44, 39,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0, 45, 45, 45, 45,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  3,  3,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  3,  0,  3,  0,  4,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0, 46, 47,  0, 48,  0,  0,  0,  0,  0, 47, 47, 47, 47,  0,  0,
+    47,  0,  1,  1, 39,  0,  1,  1,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  3,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0, 38,  0, 39, 39,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  3,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  1,  1,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0, 39,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0, 39,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0, 11,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0, 10,  1,  3,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  1,  3,  0,  0,  0,  0,  0,  0,  0,
+    39,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  1,  1,  1,  1,  1,  1,  1,  1,  0,  0,  3,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     1,  1,  1,  1,  1,  3,  3,  3,  3,  3,  3,  1,  1,  3,  0,  3,
+     3,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0, 38,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0, 39,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  3,  1,  1,  1,
+     1,  1,  1,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 39, 39,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0, 38,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0, 39, 39,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0, 38,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     1,  1,  1,  0,  6,  3,  3,  3,  3,  3,  1,  1,  3,  3,  3,  3,
+     1,  0,  6,  6,  6,  6,  6,  6,  6,  0,  0,  0,  0,  3,  0,  0,
+     0,  0,  0,  0,  1,  0,  0,  0,  1,  1,  0,  0,  0,  0,  0,  0,
+     1,  1,  3,  1,  1,  1,  1,  1,  1,  1,  3,  1,  1,  9, 49,  3,
+     5,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  2, 11, 11,  3,  0,  1,  8,  3,  1,  3,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     1,  1,  6,  6,  1,  1,  1,  1,  6,  6,  6,  1,  1,  0,  0,  0,
+     0,  1,  0,  0,  0,  6,  6,  1,  3,  1,  6,  6,  3,  3,  3,  3,
+     1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,
+     1,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 39,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 50, 11,  2, 10, 51, 51,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0, 52, 52,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,
+     0,  0,  0,  0,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  1,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     1,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0, 39,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 39,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  3,  3,  3,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0, 39,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0, 38,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    39,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     1,  0,  1,  1,  3,  0,  0,  1,  1,  0,  0,  0,  0,  0,  1,  1,
+     0,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0, 39,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 53,  0,
+     1,  1,  1,  1,  1,  1,  1,  3,  3,  3,  3,  3,  3,  3,  1,  1,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  3,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  1,  1,  1,  1,  1,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  3,  0,  1,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  1,  6,  3,  0,  0,  0,  0, 39,
+     0,  0,  0,  0,  0,  1,  3,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  1,  1,  1,  1,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  1,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  3,  3,  1,  1,  1,  3,  1,  3,  3,  3,
+     3,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0, 39, 38,  0,  0,  0,  0,  0,
+     1,  1,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0, 39, 39,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    39,  0,  0,  0,  0,  0,  0,  0,  0,  0, 38,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0, 39, 38,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0, 38, 39,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 38, 38,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  1,  1,  1,  1,  1,  1,  1,  0,  0,  0,
+     1,  1,  1,  1,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0, 39,  0,  0,  0, 38,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  0,
+     0,  0, 39, 38,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    38,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0, 39, 38,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 39,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 39, 39,  0,
+     0,  0,  0, 38,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0, 39,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0, 39,  0,  0,  0,  0,  0,  0,
+     0,  0, 38,  0, 39, 39,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0, 39,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     6,  6,  6,  6,  6,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     1,  1,  1,  1,  1,  1,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    54, 54,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  6,  0,
+     0,  0,  0,  0,  0,  4,  4,  6,  6,  6,  0,  0,  0, 55,  4,  4,
+     4,  4,  4,  0,  0,  0,  0,  0,  0,  0,  0,  3,  3,  3,  3,  3,
+     3,  3,  3,  0,  0,  1,  1,  1,  1,  1,  3,  3,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  1,  1,  1,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  1,  1,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     1,  1,  1,  1,  1,  1,  1,  0,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  0,  0,  1,  1,  1,  1,  1,
+     1,  1,  0,  1,  1,  0,  1,  1,  1,  1,  1,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  1,  1,  1,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     3,  3,  3,  3,  3,  3,  3,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  1,  1,  1,  1,  1,  1, 38,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0
+};
+
+RE_UINT32 re_get_canonical_combining_class(RE_UINT32 codepoint) {
+    RE_UINT32 field_2;
+    RE_UINT32 field_1;
+    RE_UINT32 field_0;
+    RE_UINT32 v;
+
+    field_2 = codepoint >> 10;
+    field_1 = (codepoint >> 5) & 0x1F;
+    field_0 = codepoint & 0x1F;
+
+    v = re_canonical_combining_class_table_1[field_2];
+    v = re_canonical_combining_class_table_2[(v << 5) | field_1];
+    v = re_canonical_combining_class_table_3[(v << 5) | field_0];
+
+    return v;
+}
+
+/* Cased. */
+static RE_UINT8 re_cased_table_1[] = {
+     0,  1,  2,  2,  3,  2,  2,  4,  5,  6,  2,  7,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  8,  9,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2, 10, 11,
+     2, 12,  2, 13,  2,  2, 14,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2, 15,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2, 16,  2,  2,  2,  2, 17,  2, 18,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2
+};
+
+static RE_UINT8 re_cased_table_2[] = {
+     0,  0,  1,  1,  0,  2,  3,  3,  4,  4,  4,  4,  4,  5,  6,  4,
+     4,  4,  4,  4,  7,  8,  9, 10,  0,  0, 11, 12, 13, 14,  4, 15,
+     4,  4,  4,  4, 16,  4,  4,  4,  4, 17, 18,  4, 19,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  4, 20, 21,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  4,  4, 22,
+     0,  0,  0,  0, 23, 21,  0,  0,  4,  4,  4,  4,  4,  4,  0,  0,
+     4,  4,  4,  4,  4,  4,  4,  4, 22,  4, 24, 25,  4, 26, 27, 28,
+     0,  0,  0, 29, 30,  0,  0,  0, 31, 32, 33,  4, 34,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0, 35,  4, 36,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     4, 37, 38,  4,  4,  4,  4, 39,  4, 40,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  4, 41, 25,  0,  0,  0,  0, 42,  4,  4, 43,  4, 44, 45,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0, 46,  5, 23,  4,  4,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0, 47,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  1,  0,  0,  0,  0,  0,
+     4,  4, 48,  0,  0, 46, 49, 50,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  4, 51,  4, 51,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  4,  4,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  4,  4,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     4,  4, 52,  4, 53, 54, 55,  4, 56, 57, 58,  4,  4,  4,  4,  4,
+     4,  4,  4,  4,  4, 59, 60,  5, 52, 52, 37, 37, 61, 61, 62,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  4,  4, 63,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0, 46, 64, 64, 36,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0
+};
+
+static RE_UINT8 re_cased_table_3[] = {
+      0,   0,   0,   0, 254, 255, 255,   7,   0,   4,  32,   4, 255, 255, 127, 255,
+    255, 255, 255, 255, 255, 255, 255, 247, 240, 255, 255, 255, 255, 255, 239, 255,
+    255, 255, 255,   1,   3,   0,   0,   0,  31,   0,   0,   0,  32,   0,   0,   0,
+      0,   0, 207, 188,  64, 215, 255, 255, 251, 255, 255, 255, 255, 255, 191, 255,
+      3, 252, 255, 255, 255, 255, 254, 255, 255, 255, 127,   0, 255,   1,   0,   0,
+    191,  32, 255, 255, 255, 255, 255, 231, 255, 255,  63,  63, 255,   1, 255, 255,
+     63,  63, 255, 170, 255, 255, 255,  63, 255, 255, 223,  95, 220,  31, 207,  15,
+    255,  31, 220,  31,   0,   0,   2, 128,   0,   0, 255,  31, 132, 252,  47,  62,
+     80, 189,  31, 242, 224,  67,   0,   0,  24,   0,   0,   0,   0,   0, 192, 255,
+    255,   3,   0,   0, 255, 127, 255, 255, 255, 255, 255, 127,  31, 120,  12,   0,
+    191,  32,   0,   0, 255,  63,   0,   0, 252, 255, 255, 255, 255, 120, 255, 255,
+    252,   7,   0,   0,   0,   0,  96,   7,   0,   0, 255, 255, 127,   0, 248,   0,
+    255, 255,   0,   0, 255, 255,  15, 255, 255, 255, 255,  15, 255, 255,   7,   0,
+    255, 255, 223, 255, 255, 255, 255, 223, 100, 222, 255, 235, 239, 255, 255, 255,
+    191, 231, 223, 223, 255, 255, 255, 123,  95, 252, 253, 255,  63, 255, 255, 255,
+    253, 255, 255, 247, 255, 253, 255, 255, 247,  15,   0,   0,  15,   0,   0,   0,
+    255,   3, 255, 255
+};
+
+RE_UINT32 re_get_cased(RE_UINT32 codepoint) {
+    RE_UINT32 field_2;
+    RE_UINT32 field_1;
+    RE_UINT32 field_0;
+    RE_UINT32 offset;
+    RE_UINT32 v;
+
+    field_2 = codepoint >> 10;
+    field_1 = (codepoint >> 5) & 0x1F;
+    field_0 = (codepoint >> 3) & 0x3;
+    offset = codepoint & 0x7;
+
+    v = re_cased_table_1[field_2];
+    v = re_cased_table_2[(v << 5) | field_1];
+    v = re_cased_table_3[(v << 2) | field_0];
+
+    return (v >> offset) & 0x1;
+}
+
+/* Case_Ignorable. */
+static RE_UINT8 re_case_ignorable_table_1[] = {
+     0,  1,  2,  3,  4,  5,  6,  7,  8,  9,  9, 10, 11,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9, 12, 13, 14,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9, 15, 16,
+    17,  9, 18, 19, 20, 21, 22, 23,  9,  9,  9,  9,  9, 24,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9, 25, 26,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9, 27,
+     9,  9,  9,  9, 28,  9, 29,  9, 30,  9, 31,  9, 32,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+    33,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9
+};
+
+static RE_UINT8 re_case_ignorable_table_2[] = {
+      0,   1,   2,   3,   0,   4,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   5,   6,   6,   6,   6,   6,   7,   8,   0,   0,   0,
+      0,   0,   0,   0,   9,   0,   0,   0,   0,   0,  10,   0,  11,  12,  13,  14,
+     15,   0,  16,  17,   0,   0,  18,  19,  20,   5,  21,   0,   0,  22,   0,  23,
+     24,  25,  26,   0,   0,   0,  27,   6,  28,  29,  30,  31,  32,  33,  34,  35,
+     36,  33,  37,  38,  36,  33,  39,  40,  32,  41,  42,  43,  44,   0,  45,   0,
+     46,  47,  48,  43,  32,  41,  49,  43,  50,  51,  34,  43,  32,   0,  52,   0,
+      0,  53,  54,   0,   0,  55,  56,   0,  57,  58,   0,  59,  60,  61,  62,   0,
+      0,  63,  64,  65,  66,   0,   0,  33,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  67,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,  68,  68,  69,  69,   0,  70,  71,   0,
+     72,   0,  73,   0,  74,  75,   0,   0,   0,  76,   0,   0,   0,   0,   0,   0,
+     77,   0,  78,  79,   0,  80,   3,   0,  81,  82,  44,  83,  50,  84,   0,  85,
+      0,  86,   0,  87,   0,   0,  88,  89,   0,  90,   6,  91,  92,   6,   6,  93,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  94,  95,  96,
+     97,  98,   0,  99, 100,   0,   5, 101,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0, 102,   0,   0,   0, 103,   0,   0,   0, 104,   0,   0,   0,   6,
+      0, 105,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    106, 107,   0,   0, 108,   0,   0, 109,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    110,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,  87,   0,   0,   0,   0,   0,   0,   0,   0,
+    111,   0,   0, 112, 113,   0,   0, 114,   6,  50,   0,  17, 115,   0,   0,  57,
+    116, 117,   0,   0,   0,   0, 118, 119,   0, 120, 121,   0,  28, 122, 105,  74,
+      0, 123, 124, 125,   0, 126, 127, 128,   0,   0,  92, 129,   0,   0,   0, 130,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   0, 131,  50,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    132, 133, 134,   0,   0,   0,   0, 135,   1,   2,   3,  17,  47,   0,   0, 136,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 137,
+      0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0, 138,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    139, 140,   0,   0,   0,   0,   0,  74,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0, 141,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0, 142,   0,   0,   0,   0,  22,   0,   0,   0,   0,   0,
+     32, 143, 144, 135,  50, 145, 146,   0,  28, 147,   0, 148,  50, 149, 150,   0,
+      0, 151,   0,   0,   0,   0, 135, 152,  50,  51,   3, 153,   0,   0,   0,   0,
+      0, 143, 154,   0,   0, 155, 156,   0,   0,   0,   0,   0,   0, 157, 158,   0,
+      0, 159,   3,   0,   0, 160,   0,   0,  67, 161,   0,   0,   0,   0,   0,   0,
+      0, 162,   0,   0,   0,   0,   0,   0,   0, 163,  73,   0,   0,   0, 164,   3,
+    165, 166, 167,   0, 168,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0, 169,   0,   0, 131, 170,   0,   0,   0, 171, 172,   0, 173,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0, 174,   0,   0,   0,   0,   0,   0,   0,   0,
+      0, 175,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0, 176,   0, 177,  81,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 105,   0, 178,   0,   0, 179,
+      0,   0,   0,   0, 180,  81,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 181, 182, 183,   0,   0,
+      0,   0, 184,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      6, 185,   6, 186, 187, 188,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    189, 190,   0,   0,   0,   0,   0,   0,   0, 191,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0, 192,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0, 177,   0,   0,   0, 193,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  92,
+     32,   6,   6,   6,   0,   0,   0,   0,   6,   6,   6,   6,   6,   6,   6, 133,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0
+};
+
+static RE_UINT8 re_case_ignorable_table_3[] = {
+      0,   0,   0,   0, 128,  64,   0,   4,   0,   0,   0,  64,   1,   0,   0,   0,
+      0, 161, 144,   1,   0,   0, 255, 255, 255, 255, 255, 255, 255, 255,  48,   4,
+    176,   0,   0,   0, 248,   3,   0,   0,   0,   0,   0, 130,   0,   0, 254, 255,
+    255, 255, 255, 191, 182,   0,   0,   0,   0,   0,  16,   0,  63,   0, 255,  23,
+      1, 248, 255, 255,   0,   0,   1,   0,   0,   0, 192, 191, 255,  61,   0,   0,
+      0, 128,   2,   0, 255,   7,   0,   0, 192, 255,   1,   0,   0, 248,  63,  36,
+      0,   0, 192, 255, 255,  63,   0,   0,   0,   0,   0,  14,   0,   0, 248, 255,
+      7,   0,   0,   0,   0,   0,   0,  20, 254,  33, 254,   0,  12,   0,   2,   0,
+      2,   0,   0,   0,   0,   0,   0,  16,  30,  32,   0,   0,  12,   0,   0,  64,
+      6,   0,   0,   0, 134,  57,   2,   0,   0,   0,  35,   0, 190,  33,   0,   0,
+     12,   0,   0, 252,   0,   0,   0, 144,  30,  32,  96,   0,  12,   0,   0,   0,
+      4,   0,   0,   0,   1,  32,   0,   0,  17,   0,   0,   0,   0,   0,   0, 192,
+    193,  61,  96,   0,  64,  48,   0,   0,   3,   0,   0,   0,   0,   0,   0,  24,
+      0,   4,  92,   0,   0,   0, 242,   7, 192, 127,   0,   0,   0,   0, 242,  31,
+     64,  63,   0,   0,   0,   0,   0,   3,   0,   0, 160,   2,   0,   0, 254, 127,
+    223, 224, 255, 254, 255, 255, 255,  31,  64,   0,   0,   0,   0, 224, 253, 102,
+      0,   0,   0, 195,   1,   0,  30,   0, 100,  32,   0,  32,   0,   0,   0, 224,
+      0,   0,  28,   0,   0,   0,  12,   0,   0,   0, 176,  63,  64, 254, 143,  32,
+      0, 120,   0,   0,   8,   0,   0,   0,  96,   0,   0,   0,   0,   2,   0,   0,
+    135,   1,   4,  14,   0,   0, 128,   9,   0,   0,  64, 127, 229,  31, 248, 159,
+    128,   0, 255, 255,  15,   0,   0,   0,   0,   0, 208,  23,   0, 248,  15,   0,
+     60,  59,   0,   0,  64, 163,   3,   0,   0, 240, 207,   0,   0,   0,   0,  63,
+      0,   0, 247, 255, 253,  33,  16,   3,   0, 240, 255, 255, 255,   7,   0,   1,
+      0,   0,   0, 248, 255, 255, 255, 251,   0,   0,   0, 160,   3, 224,   0, 224,
+      0, 224,   0,  96,   0, 248,   0,   3, 144, 124,   0,   0, 223, 255,   2, 128,
+      0,   0, 255,  31, 255, 255,   1,   0,   0,   0,   0,  48,   0, 128,   3,   0,
+      0, 128,   0, 128,   0, 128,   0,   0,  32,   0,   0,   0,   0,  60,  62,   8,
+      0,   0,   0, 126,   0,   0,   0, 112,   0,   0,  32,   0,   0,  16,   0,   0,
+      0, 128, 247, 191,   0,   0,   0, 240,   0,   0,   3,   0,   0,   7,   0,   0,
+     68,   8,   0,   0,  96,  16,   0,   0,  48,   0,   0,   0, 255, 255,   3, 128,
+    192,  63,   0,   0, 128, 255,   3,   0,   0,   0, 200,  51,   0, 126, 102,   0,
+      8,  16,   0,   0,   0,   0,   1,  16,   0,   0, 157, 193,   2,   0,   0,  32,
+      0,  48,  88,   0,   0,  14,   0,   0,  32,  33,   0,   0,   0,   0, 252, 255,
+    255, 255,   8,   0, 255, 255,   0,   0,   0,   0,  36,   0,   0,   0,   0, 128,
+      8,   0,   0,  14,   0,   0,   0,  32,   0,   0, 192,   7, 110, 240,   0,   0,
+      0,   0,   0, 135, 240,   0,   0,   0,   0,  24,   0,   0,   0,   0,   0, 255,
+    127,   0,   0,   0,   0,   0, 120,  38,   0,  32,   0,   0, 128, 239,  31,   0,
+      0,   0,   8,   0,   0,   0, 192, 127,   0, 158,   0,   0,   0, 128, 211,  64,
+    248,   7,   0,   0, 192,  31,  31,   0,  92,   0,   0,  64,   0,   0, 248, 133,
+     13,   0,   0,   0,   0,   0,  60, 176,   1,   0,   0,  48,   0,   0, 248, 167,
+      0,  40, 191,   0, 188,  15,   0,   0,   0, 128, 255,   6,   0,   0,   0,  88,
+      0,   0, 240,  12, 254,   7,   0,   0,   0,   0, 248, 121, 128,   0, 126,  14,
+      0, 252, 127,   3,   0,   0, 127, 191, 255, 252, 109,   0,   0,   0, 126, 180,
+    191,   0,   0,   0,   0,   0, 163,   0,   0,   0,  24,   0,   0,   0, 255,   1,
+      0,   0,  31,   0,   0,   0, 127,   0,   0, 128, 255, 255,  27,   0,   0,   0,
+      0,   0,   0,  96, 128,   3, 248, 255, 231,  15,   0,   0,   0,  60,   0,   0,
+     28,   0,   0,   0, 255, 255, 127, 248, 255,  31,  32,   0,  16,   0,   0, 248,
+    254, 255,   0,   0, 127, 255, 255, 249, 219,   7,   0,   0,   0,   0, 255,  63,
+      0, 240,   0,   0, 240,  15,   0,   0
+};
+
+RE_UINT32 re_get_case_ignorable(RE_UINT32 codepoint) {
+    RE_UINT32 field_2;
+    RE_UINT32 field_1;
+    RE_UINT32 field_0;
+    RE_UINT32 offset;
+    RE_UINT32 v;
+
+    field_2 = codepoint >> 10;
+    field_1 = (codepoint >> 5) & 0x1F;
+    field_0 = (codepoint >> 3) & 0x3;
+    offset = codepoint & 0x7;
+
+    v = re_case_ignorable_table_1[field_2];
+    v = re_case_ignorable_table_2[(v << 5) | field_1];
+    v = re_case_ignorable_table_3[(v << 2) | field_0];
+
+    return (v >> offset) & 0x1;
+}
+
+/* Changes_When_Casefolded. */
+static RE_UINT8 re_changes_when_casefolded_table_1[] = {
+     0,  1,  2,  2,  3,  2,  2,  4,  5,  6,  2,  7,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  8,  9,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2, 10, 11,
+     2, 12,  2, 13,  2,  2, 14,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2, 15,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2, 16,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2
+};
+
+static RE_UINT8 re_changes_when_casefolded_table_2[] = {
+     0,  0,  1,  0,  0,  2,  3,  0,  4,  5,  6,  7,  8,  9, 10, 11,
+     4, 12, 13,  0,  0,  0,  0,  0,  0,  0, 14, 15, 16, 17, 18, 19,
+    20, 21,  0,  4, 22,  4, 23,  4,  4, 24, 25,  0, 26,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0, 20, 27,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 28,
+     0,  0,  0,  0, 29, 30,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     4,  4,  4,  4, 31,  4,  4,  4, 32, 33, 34, 35, 20, 36, 37, 38,
+     0,  0,  0,  0,  0,  0,  0,  0,  0, 39,  0, 21, 40,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0, 41, 21,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    20, 42,  0, 43,  4,  4,  4, 44,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  4, 45, 46,  0,  0,  0,  0, 47,  4, 48, 49, 50, 51,  2,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 52, 20, 20,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0, 53,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  0,  0,  0,  0,  0,  0,
+    20, 54,  0,  0,  0, 52, 55,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0, 20, 56,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0, 20,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0, 20,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0, 20, 57,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0
+};
+
+static RE_UINT8 re_changes_when_casefolded_table_3[] = {
+      0,   0,   0,   0, 254, 255, 255,   7,   0,   0,  32,   0, 255, 255, 127, 255,
+     85,  85,  85,  85,  85,  85,  85, 170, 170,  86,  85,  85,  85,  85,  85, 171,
+    214, 206, 219, 177, 213, 210, 174,  17, 176, 173, 170,  74,  85,  85, 214,  85,
+     85,  85,   5, 108, 122,  85,   0,   0,  32,   0,   0,   0,   0,   0,  69, 128,
+     64, 215, 254, 255, 251,  15,   0,   0,   4, 128,  99,  85,  85,  85, 179, 230,
+    255, 255, 255, 255, 255, 255,   0,   0,   1,  84,  85,  85, 171,  42,  85,  85,
+     85,  85, 254, 255, 255, 255, 127,   0, 128,   0,   0,   0, 191,  32,   0,   0,
+      0,   0,   0,  63, 255,   1, 255, 255, 255, 255, 255, 231,  85,  85,  21,  76,
+      0, 255,   0,  63,   0, 255,   0, 255,   0,  63,   0, 170,   0, 255,   0,   0,
+    255, 255, 156,  31, 156,  31,   0,  15,   0,  31, 156,  31,  64,  12,   4,   0,
+      8,   0,   0,   0,   0,   0, 192, 255, 255, 127,   0,   0, 157, 234,  37, 192,
+      5,  40,   4,   0,  85,  21,   0,   0,  85,  85,  85,   5,  84,  85,  84,  85,
+     85,  85,   0, 106,  85,  40,  69,  85,  85, 125,  95,  85, 244,   2,   0,   0,
+      0,   0, 255, 255, 127,   0, 248,   0, 255,   0,   0,   0, 255, 255,  15,   0,
+    255, 255,   7,   0,   3,   0,   0,   0
+};
+
+RE_UINT32 re_get_changes_when_casefolded(RE_UINT32 codepoint) {
+    RE_UINT32 field_2;
+    RE_UINT32 field_1;
+    RE_UINT32 field_0;
+    RE_UINT32 offset;
+    RE_UINT32 v;
+
+    field_2 = codepoint >> 10;
+    field_1 = (codepoint >> 5) & 0x1F;
+    field_0 = (codepoint >> 3) & 0x3;
+    offset = codepoint & 0x7;
+
+    v = re_changes_when_casefolded_table_1[field_2];
+    v = re_changes_when_casefolded_table_2[(v << 5) | field_1];
+    v = re_changes_when_casefolded_table_3[(v << 2) | field_0];
+
+    return (v >> offset) & 0x1;
+}
+
+/* Changes_When_Casemapped. */
+static RE_UINT8 re_changes_when_casemapped_table_1[] = {
+     0,  1,  2,  2,  3,  2,  2,  4,  5,  6,  2,  7,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  8,  9,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2, 10, 11,
+     2, 12,  2, 13,  2,  2, 14,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2, 15,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2, 16,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2
+};
+
+static RE_UINT8 re_changes_when_casemapped_table_2[] = {
+     0,  0,  1,  1,  0,  2,  3,  3,  4,  5,  4,  4,  6,  7,  8,  4,
+     4,  9, 10, 11, 12,  0,  0,  0,  0,  0, 13, 14, 15, 16, 17, 18,
+     4,  4,  4,  4, 19,  4,  4,  4,  4, 20, 21, 22, 23,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  4, 24, 25,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  4,  4, 26,
+     0,  0,  0,  0, 27, 25,  0,  0,  0,  0,  0, 28, 29,  0,  0,  0,
+     4,  4,  4,  4, 30,  4,  4,  4, 26,  4, 31, 32,  4, 33, 34, 35,
+     0,  0,  0,  0,  0,  0,  0,  0,  0, 36, 29,  4, 37,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0, 38,  4, 39,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     4, 40, 41, 42,  4,  4,  4, 43,  4, 44,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  4, 45, 46,  0,  0,  0,  0, 47,  4, 48, 49, 40, 50, 51,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 52, 53,  4,  4,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0, 54,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  1,  0,  0,  0,  0,  0,
+     4,  4, 55,  0,  0, 53, 56, 46,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  4, 57,  4, 57,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  4,  4,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  4,  4,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  4,  4, 58,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0
+};
+
+static RE_UINT8 re_changes_when_casemapped_table_3[] = {
+      0,   0,   0,   0, 254, 255, 255,   7,   0,   0,  32,   0, 255, 255, 127, 255,
+    255, 255, 255, 255, 255, 255, 255, 254, 255, 223, 255, 247, 255, 243, 255, 179,
+    240, 255, 255, 255, 253, 255,  15, 252, 255, 255, 223,  26, 107, 159,  38,  32,
+    141,  31,   4,  96,  32,   0,   0,   0,   0,   0, 207, 184,  64, 215, 255, 255,
+    251, 255, 255, 255, 255, 255, 227, 255, 255, 255, 191, 239,   3, 252, 255, 255,
+    255, 255, 254, 255, 255, 255, 127,   0, 254, 255, 255, 255, 255,   0,   0,   0,
+    191,  32, 255, 255, 255, 255, 255, 231, 255, 255,  63,  63, 255,   1, 255, 255,
+      0,   0,   0,  34,   0,  64,   0,   0, 255, 255, 255,  79,  63,  63, 255, 170,
+    255, 255, 255,  63, 255, 255, 223,  95, 220,  31, 207,  15, 255,  31, 220,  31,
+     64,  12,   4,   0,  24,   0,   0,   0,   0,   0, 192, 255, 255,   3,   0,   0,
+    255, 127, 255, 255, 255, 255, 255, 127, 255, 255, 109, 192,  15, 120,  12,   0,
+    191,  32,   0,   0, 255,  63,   0,   0, 255, 255, 255,  15, 252, 255, 252, 255,
+    255, 255,   0, 254, 255,  56, 223, 255, 252,   7,   0,   0,   0,   0,  96,   0,
+      0,   0,   8,   0,   0,   0, 255, 255, 127,   0, 248,   0, 255, 255,   0,   0,
+    255, 255,  15, 255, 255, 255,   7,   0,  15,   0,   0,   0
+};
+
+RE_UINT32 re_get_changes_when_casemapped(RE_UINT32 codepoint) {
+    RE_UINT32 field_2;
+    RE_UINT32 field_1;
+    RE_UINT32 field_0;
+    RE_UINT32 offset;
+    RE_UINT32 v;
+
+    field_2 = codepoint >> 10;
+    field_1 = (codepoint >> 5) & 0x1F;
+    field_0 = (codepoint >> 3) & 0x3;
+    offset = codepoint & 0x7;
+
+    v = re_changes_when_casemapped_table_1[field_2];
+    v = re_changes_when_casemapped_table_2[(v << 5) | field_1];
+    v = re_changes_when_casemapped_table_3[(v << 2) | field_0];
+
+    return (v >> offset) & 0x1;
+}
+
+/* Changes_When_Lowercased. */
+static RE_UINT8 re_changes_when_lowercased_table_1[] = {
+     0,  1,  2,  2,  3,  2,  2,  4,  5,  6,  2,  7,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  8,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  9,
+     2, 10,  2, 11,  2,  2, 12,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2, 13,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2, 14,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2
+};
+
+static RE_UINT8 re_changes_when_lowercased_table_2[] = {
+     0,  0,  1,  0,  0,  0,  2,  0,  3,  4,  5,  6,  7,  8,  9, 10,
+     3, 11, 12,  0,  0,  0,  0,  0,  0,  0,  0, 13, 14, 15, 16, 17,
+    18, 19,  0,  3, 20,  3, 21,  3,  3, 22, 23,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0, 18, 24,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 18, 18, 25,
+     0,  0,  0,  0, 26, 27,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     3,  3,  3,  3, 28,  3,  3,  3, 29, 30, 31, 32, 30, 33, 34, 35,
+     0,  0,  0,  0,  0,  0,  0,  0,  0, 36,  0, 19, 37,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0, 38, 19,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    18, 39,  0, 40,  3,  3,  3, 41,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  3, 42, 43,  0,  0,  0,  0, 44,  3, 45, 46, 47, 48, 49,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  0,  0,  0,  0,  0,  0,
+    18, 50,  0,  0,  0, 26, 51,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0, 18, 52,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0, 18,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0, 18,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0, 18, 53,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0
+};
+
+static RE_UINT8 re_changes_when_lowercased_table_3[] = {
+      0,   0,   0,   0, 254, 255, 255,   7, 255, 255, 127, 127,  85,  85,  85,  85,
+     85,  85,  85, 170, 170,  84,  85,  85,  85,  85,  85,  43, 214, 206, 219, 177,
+    213, 210, 174,  17, 176, 173, 170,  74,  85,  85, 214,  85,  85,  85,   5, 108,
+    122,  85,   0,   0,   0,   0,  69, 128,  64, 215, 254, 255, 251,  15,   0,   0,
+      0, 128,   0,  85,  85,  85, 144, 230, 255, 255, 255, 255, 255, 255,   0,   0,
+      1,  84,  85,  85, 171,  42,  85,  85,  85,  85, 254, 255, 255, 255, 127,   0,
+    191,  32,   0,   0, 255, 255,  63,   0,   0,   0, 255, 255, 255, 255, 255, 231,
+     85,  85,  21,  64,   0, 255,   0,  63,   0, 255,   0, 255,   0,  63,   0, 170,
+      0, 255,   0,   0,   0, 255,   0,  31,   0,  31,   0,  15,   0,  31,   0,  31,
+     64,  12,   4,   0,   8,   0,   0,   0,   0,   0, 192, 255, 255, 127,   0,   0,
+    157, 234,  37, 192,   5,  40,   4,   0,  85,  21,   0,   0,  85,  85,  85,   5,
+     84,  85,  84,  85,  85,  85,   0, 106,  85,  40,  69,  85,  85, 125,  95,  85,
+    244,   2,   0,   0,   0,   0,  32,   0, 255,   0,   0,   0, 255, 255,  15,   0,
+    255, 255,   7,   0,   3,   0,   0,   0
+};
+
+RE_UINT32 re_get_changes_when_lowercased(RE_UINT32 codepoint) {
+    RE_UINT32 field_2;
+    RE_UINT32 field_1;
+    RE_UINT32 field_0;
+    RE_UINT32 offset;
+    RE_UINT32 v;
+
+    field_2 = codepoint >> 10;
+    field_1 = (codepoint >> 5) & 0x1F;
+    field_0 = (codepoint >> 3) & 0x3;
+    offset = codepoint & 0x7;
+
+    v = re_changes_when_lowercased_table_1[field_2];
+    v = re_changes_when_lowercased_table_2[(v << 5) | field_1];
+    v = re_changes_when_lowercased_table_3[(v << 2) | field_0];
+
+    return (v >> offset) & 0x1;
+}
+
+/* Changes_When_Titlecased. */
+static RE_UINT8 re_changes_when_titlecased_table_1[] = {
+     0,  1,  2,  2,  3,  2,  2,  4,  5,  6,  2,  7,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  8,  9,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2, 10, 11,
+     2, 12,  2, 13,  2,  2, 14,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2, 15,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2, 16,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2
+};
+
+static RE_UINT8 re_changes_when_titlecased_table_2[] = {
+     0,  0,  0,  1,  0,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12,
+     5, 13, 14, 15, 16,  0,  0,  0,  0,  0, 17, 18, 19, 20, 21, 22,
+     0, 23, 24,  5, 25,  5, 26,  5,  5, 27,  0, 28, 29,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 30,
+     0,  0,  0,  0, 31,  0,  0,  0,  0,  0,  0, 32, 33,  0,  0,  0,
+     5,  5,  5,  5, 34,  5,  5,  5, 35, 36, 37, 38, 36, 39, 40, 41,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 33, 23, 42,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0, 23, 43,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0, 23, 44, 45,  5,  5,  5, 46, 24, 47,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  5, 48, 49,  0,  0,  0,  0, 50,  5, 51, 52, 53, 54, 55,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 56, 23, 24, 24,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0, 57,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  0,  0,  0,  0,  0,
+     0, 58, 59,  0,  0,  0, 60, 61,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0, 24, 62,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0, 24,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0, 24,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0, 63, 64,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0
+};
+
+static RE_UINT8 re_changes_when_titlecased_table_3[] = {
+      0,   0,   0,   0, 254, 255, 255,   7,   0,   0,  32,   0,   0,   0,   0, 128,
+    255, 255, 127, 255, 170, 170, 170, 170, 170, 170, 170,  84,  85, 171, 170, 170,
+    170, 170, 170, 212,  41,  17,  36,  70,  42,  33,  81, 162, 208,  86,  85, 181,
+    170, 170,  43, 170, 168, 170,  10, 144, 133, 170, 223,  26, 107, 159,  38,  32,
+    141,  31,   4,  96,  32,   0,   0,   0,   0,   0, 138,  56,   0,   0,   1,   0,
+      0, 240, 255, 255, 255, 127, 227, 170, 170, 170,  47,   9,   0,   0, 255, 255,
+    255, 255, 255, 255,   2, 168, 170, 170,  84, 213, 170, 170, 170, 170,   0,   0,
+    254, 255, 255, 255, 255,   0,   0,   0,   0,   0,   0,  63, 255,   1,   0,   0,
+      0,   0,   0,  34,   0,  64,   0,   0, 170, 170, 234,  15, 255,   0,  63,   0,
+    255,   0, 255,   0,  63,   0, 255,   0, 255,   0, 255,  63, 255,   0, 223,  64,
+    220,   0, 207,   0, 255,   0, 220,   0,  16,   0,   0,   0, 255,   3,   0,   0,
+    255, 255, 255, 127,  98,  21,  72,   0,  10,  80,   8,   0, 191,  32,   0,   0,
+    170,  42,   0,   0, 170, 170, 170,  10, 168, 170, 168, 170, 170, 170,   0, 148,
+    170,  16, 154, 170, 170,   2, 160, 170,   8,   5,   0,   0,   0,   0,  64,   0,
+      0,   0,   8,   0, 127,   0, 248,   0,   0, 255, 255, 255, 255, 255,   0,   0,
+      0,   0,   0, 255, 255, 255, 255,  15, 255, 255,   7,   0, 252, 255, 255, 255,
+     15,   0,   0,   0
+};
+
+RE_UINT32 re_get_changes_when_titlecased(RE_UINT32 codepoint) {
+    RE_UINT32 field_2;
+    RE_UINT32 field_1;
+    RE_UINT32 field_0;
+    RE_UINT32 offset;
+    RE_UINT32 v;
+
+    field_2 = codepoint >> 10;
+    field_1 = (codepoint >> 5) & 0x1F;
+    field_0 = (codepoint >> 3) & 0x3;
+    offset = codepoint & 0x7;
+
+    v = re_changes_when_titlecased_table_1[field_2];
+    v = re_changes_when_titlecased_table_2[(v << 5) | field_1];
+    v = re_changes_when_titlecased_table_3[(v << 2) | field_0];
+
+    return (v >> offset) & 0x1;
+}
+
+/* Changes_When_Uppercased. */
+static RE_UINT8 re_changes_when_uppercased_table_1[] = {
+     0,  1,  2,  2,  3,  2,  2,  4,  5,  6,  2,  7,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  8,  9,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2, 10, 11,
+     2, 12,  2, 13,  2,  2, 14,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2, 15,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2, 16,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2
+};
+
+static RE_UINT8 re_changes_when_uppercased_table_2[] = {
+     0,  0,  0,  1,  0,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12,
+     5, 13, 14, 15, 16,  0,  0,  0,  0,  0, 17, 18, 19, 20, 21, 22,
+     0, 23, 24,  5, 25,  5, 26,  5,  5, 27,  0, 28, 29,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0, 23, 30,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 31,
+     0,  0,  0,  0, 32,  0,  0,  0,  0,  0,  0, 33, 34,  0,  0,  0,
+     5,  5,  5,  5, 35,  5,  5,  5, 36, 37, 38, 39, 24, 40, 41, 42,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 34, 23, 43,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0, 23, 44,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0, 23, 45, 46,  5,  5,  5, 47, 24, 48,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  5, 49, 50,  0,  0,  0,  0, 51,  5, 52, 53, 54, 55, 56,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 57, 23, 24, 24,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0, 58,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  0,  0,  0,  0,  0,
+     0, 59, 60,  0,  0,  0, 61, 62,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0, 24, 63,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0, 24,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0, 24,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0, 64, 65,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0
+};
+
+static RE_UINT8 re_changes_when_uppercased_table_3[] = {
+      0,   0,   0,   0, 254, 255, 255,   7,   0,   0,  32,   0,   0,   0,   0, 128,
+    255, 255, 127, 255, 170, 170, 170, 170, 170, 170, 170,  84,  85, 171, 170, 170,
+    170, 170, 170, 212,  41,  17,  36,  70,  42,  33,  81, 162,  96,  91,  85, 181,
+    170, 170,  45, 170, 168, 170,  10, 144, 133, 170, 223,  26, 107, 159,  38,  32,
+    141,  31,   4,  96,  32,   0,   0,   0,   0,   0, 138,  56,   0,   0,   1,   0,
+      0, 240, 255, 255, 255, 127, 227, 170, 170, 170,  47,   9,   0,   0, 255, 255,
+    255, 255, 255, 255,   2, 168, 170, 170,  84, 213, 170, 170, 170, 170,   0,   0,
+    254, 255, 255, 255, 255,   0,   0,   0, 255, 255, 255, 231,   0,   0,   0,  63,
+    255,   1,   0,   0,   0,   0,   0,  34,   0,  64,   0,   0, 170, 170, 234,  15,
+    255,   0,  63,   0, 255,   0, 255,   0,  63,   0, 255,   0, 255,   0, 255,  63,
+    255, 255, 223,  80, 220,  16, 207,   0, 255,   0, 220,  16,  16,   0,   0,   0,
+    255,   3,   0,   0, 255, 255, 255, 127,  98,  21,  72,   0,  10,  80,   8,   0,
+    191,  32,   0,   0, 170,  42,   0,   0, 170, 170, 170,  10, 168, 170, 168, 170,
+    170, 170,   0, 148, 170,  16, 154, 170, 170,   2, 160, 170,   8,   5,   0,   0,
+      0,   0,  64,   0,   0,   0,   8,   0, 127,   0, 248,   0,   0, 255, 255, 255,
+    255, 255,   0,   0,   0,   0,   0, 255, 255, 255, 255,  15, 255, 255,   7,   0,
+    252, 255, 255, 255,  15,   0,   0,   0
+};
+
+RE_UINT32 re_get_changes_when_uppercased(RE_UINT32 codepoint) {
+    RE_UINT32 field_2;
+    RE_UINT32 field_1;
+    RE_UINT32 field_0;
+    RE_UINT32 offset;
+    RE_UINT32 v;
+
+    field_2 = codepoint >> 10;
+    field_1 = (codepoint >> 5) & 0x1F;
+    field_0 = (codepoint >> 3) & 0x3;
+    offset = codepoint & 0x7;
+
+    v = re_changes_when_uppercased_table_1[field_2];
+    v = re_changes_when_uppercased_table_2[(v << 5) | field_1];
+    v = re_changes_when_uppercased_table_3[(v << 2) | field_0];
+
+    return (v >> offset) & 0x1;
+}
+
+/* Dash. */
+static RE_UINT8 re_dash_table_1[] = {
+    0, 1, 2, 2, 2, 3, 4, 2, 5, 2, 2, 6, 7, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 8,
+    2, 2, 2, 9, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2
+};
+
+static RE_UINT8 re_dash_table_2[] = {
+     0,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  2,  3,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     4,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     5,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     6,  0,  7,  8,  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    11, 12,  4,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    13, 14,  0,  0,  0,  4,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0, 15, 16, 17,  0,  0,  0,  0,  1,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0
+};
+
+static RE_UINT8 re_dash_table_3[] = {
+      0,   0,   0,   0,   0,  32,   0,   0,   0,   4,   0,   0,   0,   0,   0,  64,
+      1,   0,   0,   0,  64,   0,   0,   0,   0,   0,  63,   0,   0,   0,   8,   0,
+      0,   0,   0,   8,   0,   8,   0,   0,   0,   0,   4,   0,   0,   0, 128,   4,
+      0,   0,   0,  12,   0,   0,   0,  16,   0,   0,   1,   0,   0,   0,   6,   0,
+      0,   0,   0,   1,   8,   0,   0,   0
+};
+
+RE_UINT32 re_get_dash(RE_UINT32 codepoint) {
+    RE_UINT32 field_2;
+    RE_UINT32 field_1;
+    RE_UINT32 field_0;
+    RE_UINT32 offset;
+    RE_UINT32 v;
+
+    field_2 = codepoint >> 10;
+    field_1 = (codepoint >> 5) & 0x1F;
+    field_0 = (codepoint >> 3) & 0x3;
+    offset = codepoint & 0x7;
+
+    v = re_dash_table_1[field_2];
+    v = re_dash_table_2[(v << 5) | field_1];
+    v = re_dash_table_3[(v << 2) | field_0];
+
+    return (v >> offset) & 0x1;
+}
+
+/* Decomposition_Type. */
+static RE_UINT8 re_decomposition_type_table_1[] = {
+     0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5, 13, 14, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 16,  5,  5,  5,  5,  5,  5,  5,  5, 17, 18,
+     5,  5,  5,  5, 19, 20, 21,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5, 22, 23,  5,  5,  5,  5,  5, 24, 25,  5, 26,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5, 27,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5
+};
+
+static RE_UINT8 re_decomposition_type_table_2[] = {
+      0,   0,   0,   0,   0,   1,   2,   3,   4,   5,   6,   7,   0,   8,   9,  10,
+     11,  12,   0,   0,   0,  13,  14,  15,   0,   0,  16,  17,  18,  19,  20,  21,
+     22,  23,  24,  25,   0,   0,  26,  27,   0,   0,   0,   0,  28,   0,   0,   0,
+      0,  29,   0,  30,   0,   0,  31,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,  32,  33,   0,   0,   0,  34,   0,
+      0,  35,  36,   0,   0,   0,   0,   0,   0,   0,  37,   0,  38,   0,  39,   0,
+      0,   0,  40,   0,   0,   0,  41,   0,   0,   0,  39,   0,   0,   0,  42,   0,
+      0,  43,   0,   0,   0,  43,  44,   0,  45,   0,  46,  47,  48,  49,   0,   0,
+      0,  50,   0,   0,   0,   0,   0,  51,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,  52,  53,  54,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,  55,  56,  57,  58,  59,   0,   0,
+     60,  60,  60,  60,  61,  60,  60,  62,  63,  60,  64,  65,  60,  66,  67,  68,
+     69,  70,  71,  72,  73,  74,   0,   0,  75,  76,  77,  78,  79,  80,  81,   0,
+     82,  83,  84,  85,  86,  87,   0,  88,   0,  89,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,  90,  78,  91,  92,  93,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     94,   0,   0,  95,   0,   0,  96,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,  97,   0,   0,   0,   0,   0,   0,   0,  98,   0,   0,   0,   0,
+      0,   0,   0,   0,  99,   0,   0,  43,  78,  78,  78,  78,  78,  78, 100,   0,
+    101, 102, 103, 104, 105, 103, 104, 106,   0, 107,  78,  78, 108,   0,   0,   0,
+    109,  78, 110, 111,  92,  92, 112, 113, 114, 114, 115, 116, 114, 114, 114, 117,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0, 118,   0,   0,   0,   0,   0,   0, 119,   0,   0,   0, 120,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 121, 122,   0,   0,   0,   0,
+     60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,
+     60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,
+     60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,
+     60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60, 123,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,  60,  60,  60,  60,  60,  60,  60,  60,
+    124, 125,  60, 126,  60,  60,  62,   0, 127, 128, 129, 130, 131, 132, 133, 134,
+    135, 135, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148,
+    149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 158, 159, 160, 161, 162, 163,
+      0,   0,   0,   0, 164, 165,   0,   0,   0, 166,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 167,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0, 168,   0,   0,   0,   0,   0,   0,   0, 169,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0, 170,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 171, 172,   0, 173, 174,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    175, 175, 176, 175, 177, 178, 179, 175, 180, 181, 182, 175, 175, 175, 175, 175,
+    175, 175, 175, 175, 175, 183, 175, 175, 175, 175, 175, 175, 175, 175, 184, 175,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    179, 185, 186, 187, 188, 189,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0, 190, 191, 192, 193, 194,   0,   0,   0,
+    195, 196, 197,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 198,
+     60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,
+     65,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0
+};
+
+static RE_UINT8 re_decomposition_type_table_3[] = {
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     1,  0,  0,  0,  0,  0,  0,  0,  2,  0,  3,  0,  0,  0,  0,  2,
+     0,  0,  3,  3,  2,  2,  0,  0,  2,  3,  3,  0,  4,  4,  4,  0,
+     5,  5,  5,  5,  5,  5,  0,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     0,  5,  5,  5,  5,  5,  5,  0,  0,  5,  5,  5,  5,  5,  0,  0,
+     5,  5,  5,  5,  5,  5,  0,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     0,  5,  5,  5,  5,  5,  5,  0,  0,  5,  5,  5,  5,  5,  0,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     0,  0,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  0,  0,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  0,  2,  2,  5,  5,  5,  5,  0,  5,  5,  5,  5,  5,  5,  2,
+     2,  0,  0,  5,  5,  5,  5,  5,  5,  2,  0,  0,  5,  5,  5,  5,
+     5,  5,  0,  0,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  0,  0,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  2,
+     5,  5,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  5,
+     5,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  2,  2,  2,  2,  2,  2,  2,  2,  2,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  0,  5,  5,
+     5,  5,  5,  5,  0,  0,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  2,  2,  2,  5,  5,  0,  0,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  0,  0,  5,  5,
+     0,  0,  0,  0,  0,  0,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  2,  2,  2,  2,  2,  2,  0,  0,
+     3,  3,  3,  3,  3,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     5,  5,  0,  5,  5,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  5,  0,  0,  0,  0,  0,  2,  0,  0,  0,  5,  0,
+     0,  0,  0,  0,  2,  5,  5,  5,  5,  5,  5,  0,  5,  0,  5,  5,
+     5,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  5,  5,  5,  5,  5,  5,
+     5,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  5,  5,  5,  5,  5,  0,
+     2,  2,  2,  5,  5,  2,  2,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     2,  2,  2,  0,  2,  2,  0,  0,  0,  2,  0,  0,  0,  0,  0,  0,
+     5,  5,  0,  5,  0,  0,  0,  5,  0,  0,  0,  0,  5,  5,  5,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  5,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  5,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     5,  5,  0,  5,  0,  0,  0,  5,  0,  0,  0,  0,  5,  5,  5,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  5,  5,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  5,  5,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     5,  5,  5,  5,  0,  0,  5,  5,  0,  0,  5,  5,  5,  5,  5,  5,
+     0,  0,  5,  5,  5,  5,  5,  5,  0,  0,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  0,  0,  5,  5,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  2,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  5,  5,  5,  5,  5,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  2,  2,  2,  2,  0,  0,  0,  0,  0,  0,  0,
+     5,  0,  5,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  5,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  5,  0,  0,  0,  0,  0,  0,
+     0,  5,  0,  0,  5,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  5,  5,  5,  5,  5,  5,  5,  5,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  5,  5,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  5,  5,  0,  5,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  5,  0,  0,  5,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  5,  5,  5,  0,  0,  5,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  5,  0,  0,  5,  5,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  5,  5,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  5,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  5,  5,  5,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  5,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     5,  0,  0,  0,  0,  0,  0,  5,  5,  0,  5,  5,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  5,  0,  5,  5,  5,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  2,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  2,  2,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  5,  0,  0,  0,  0,  0,  0,  0,  0,  0,  5,  0,  0,
+     0,  0,  5,  0,  0,  0,  0,  5,  0,  0,  0,  0,  5,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  5,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  5,  0,  5,  5,  2,  5,  2,  0,  0,  0,  0,  0,  0,
+     0,  5,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  5,  0,  0,  0,  0,  0,  0,  0,  0,  0,  5,  0,  0,
+     0,  0,  5,  0,  0,  0,  0,  5,  0,  0,  0,  0,  5,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  5,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  5,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  3,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  5,  0,  5,  0,  5,  0,  5,  0,  5,  0,
+     0,  0,  5,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  5,  0,  5,  0,  0,
+     5,  5,  0,  5,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  3,  3,  3,  0,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  0,  3,  3,  3,  3,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  0,  3,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+     3,  3,  6,  6,  6,  6,  6,  6,  6,  6,  6,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  3,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  3,  3,  3,  3,  3,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  2,  5,  0,  0,  0,  0,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  0,  0,  0,  0,  0,  0,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  0,  0,  5,  5,  5,  5,  5,  5,  0,  0,
+     5,  5,  5,  5,  5,  5,  0,  0,  5,  5,  5,  5,  5,  5,  0,  0,
+     5,  5,  5,  5,  5,  5,  5,  5,  0,  5,  0,  5,  0,  5,  0,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  0,  0,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  0,  5,  5,  5,  5,  5,  5,  5,  2,  5,  2,
+     2,  5,  5,  5,  5,  0,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  0,  0,  5,  5,  5,  5,  5,  5,  0,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     0,  0,  5,  5,  5,  0,  5,  5,  5,  5,  5,  5,  5,  5,  2,  0,
+     5,  5,  2,  2,  2,  2,  2,  1,  2,  2,  2,  0,  0,  0,  0,  0,
+     0,  1,  0,  0,  0,  0,  0,  2,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  2,  2,  2,  0,  0,  0,  0,  0,  0,  0,  0,  1,
+     0,  0,  0,  2,  2,  0,  2,  2,  0,  0,  0,  0,  2,  0,  2,  0,
+     0,  0,  0,  0,  0,  0,  0,  2,  2,  2,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  2,  0,  0,  0,  0,  0,  0,  0,  2,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     3,  3,  0,  0,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+     6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  0,
+     6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  2,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     2,  2,  7,  2,  0,  2,  2,  2,  0,  2,  7,  7,  7,  7,  7,  7,
+     7,  7,  7,  7,  0,  7,  2,  0,  0,  7,  7,  7,  7,  7,  0,  0,
+     3,  2,  3,  0,  7,  0,  5,  0,  7,  0,  5,  5,  7,  7,  0,  7,
+     7,  7,  0,  7,  7,  2,  2,  2,  2,  7,  0,  2,  7,  7,  7,  7,
+     7,  0,  0,  0,  0,  7,  7,  7,  7,  7,  0,  0,  0,  0,  0,  0,
+     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  4,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  5,  5,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  5,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  5,  5,  5,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  5,  0,  0,  0,  0,  5,  0,  0,  5,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  5,  0,  5,  0,  0,  0,  0,  0,  2,  2,  0,  2,
+     2,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  5,  0,  0,  5,  0,  0,  5,  0,  5,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     5,  0,  5,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  5,  5,  5,
+     5,  5,  0,  0,  5,  5,  0,  0,  5,  5,  0,  0,  0,  0,  0,  0,
+     5,  5,  0,  0,  5,  5,  0,  0,  5,  5,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  5,  5,  5,  5,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     5,  5,  5,  5,  0,  0,  0,  0,  0,  0,  5,  5,  5,  5,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  5,  5,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  2,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  2,  2,  2,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  5,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  6,  3,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  3,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  2,  0,  2,  2,  2,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  5,  0,  5,  0,
+     5,  0,  5,  0,  5,  0,  5,  0,  5,  0,  5,  0,  5,  0,  5,  0,
+     5,  0,  5,  0,  0,  5,  0,  5,  0,  5,  0,  0,  0,  0,  0,  0,
+     5,  5,  0,  5,  5,  0,  5,  5,  0,  5,  5,  0,  5,  5,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  5,  0,  0,  0,  0,  0,  0,  2,  2,  0,  5, 10,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  5,  0,  0,  5,  5,  5,  5,  0,  0,  0,  5, 10,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  0,
+     0,  0,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  0,
+     2,  2,  2,  2,  8,  8,  8,  8,  0,  0,  0,  0,  0,  0,  0,  0,
+    11,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  0,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2, 11, 11, 11, 11,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2, 11,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  3,  3,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     3,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  3,  3,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  3,  3,  3,  3,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  3,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     5,  5,  5,  5,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  0,  0,
+     5,  0,  5,  0,  0,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  0,
+     5,  0,  5,  0,  0,  5,  5,  0,  0,  0,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  0,  0,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     2,  2,  2,  2,  2,  2,  2,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  2,  2,  2,  2,  2,  0,  0,  0,  0,  0,  5,  0,  5,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  0,  5,  5,  5,  5,  5,  0,  5,  0,
+     5,  5,  0,  5,  5,  0,  5,  5,  5,  5,  5,  5,  5,  5,  5,  2,
+    12, 13, 12, 13, 14, 15, 12, 13, 14, 15, 12, 13, 14, 15, 12, 13,
+    14, 15, 12, 13, 14, 15, 12, 13, 14, 15, 12, 13, 14, 15, 12, 13,
+    14, 15, 12, 13, 14, 15, 12, 13, 14, 15, 12, 13, 14, 15, 12, 13,
+    14, 15, 12, 13, 12, 13, 12, 13, 12, 13, 12, 13, 12, 13, 12, 13,
+    14, 15, 12, 13, 14, 15, 12, 13, 14, 15, 12, 13, 14, 15, 12, 13,
+    12, 13, 14, 15, 12, 13, 12, 13, 14, 15, 12, 13, 14, 15, 12, 13,
+    12, 13,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0, 12, 13, 14, 15, 12, 13, 12, 13, 12, 13, 12, 12, 13,
+    12, 13, 12, 13, 12, 13, 14, 15, 14, 15, 12, 13, 12, 13, 12, 13,
+    12, 13, 12, 13, 12, 13, 12, 13, 14, 12, 13, 14, 12, 13, 14, 15,
+    12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+    12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+    12, 12, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+    12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+    12, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14,
+    14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, 13, 12,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    14, 13, 14, 14, 14, 14, 14, 14, 13, 14, 13, 13, 14, 14, 13, 13,
+    14, 14, 13, 14, 13, 14, 13, 13, 14, 13, 13, 14, 13, 14, 13, 13,
+    14, 13, 14, 14, 13, 13, 13, 14, 13, 13, 13, 13, 13, 14, 13, 13,
+    13, 13, 13, 14, 13, 13, 14, 13, 14, 14, 14, 13, 14, 14, 14, 14,
+     0,  0, 14, 14, 14, 14, 13, 13, 14, 13, 13, 13, 13, 14, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 14, 14, 13, 13, 14, 13, 14, 13, 13, 13, 13, 13,
+    13, 13, 13, 14, 14, 14, 13, 13,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10,  0,  0, 10, 10,  2,  2,  2,  2,  2,  2,  2,
+    16, 16, 16,  0, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+    16, 16, 16, 16, 16, 16, 16,  0, 16, 16, 16, 16,  0,  0,  0,  0,
+    12, 15, 12,  0, 12,  0, 12, 15, 12, 15, 12, 15, 12, 15, 12, 15,
+    12, 12, 13, 12, 13, 12, 13, 12, 13, 12, 13, 14, 15, 12, 13, 12,
+    13, 14, 15, 12, 13, 12, 13, 14, 15, 12, 13, 14, 15, 12, 13, 14,
+    15, 12, 13, 14, 15, 12, 13, 14, 15, 12, 13, 12, 13, 12, 13, 12,
+    13, 12, 13, 14, 15, 12, 13, 14, 15, 12, 13, 14, 15, 12, 13, 14,
+    15, 12, 13, 14, 15, 12, 13, 14, 15, 12, 13, 14, 15, 12, 13, 14,
+    15, 12, 13, 14, 15, 12, 13, 14, 15, 12, 13, 14, 15, 12, 13, 14,
+    15, 12, 13, 14, 15, 12, 13, 14, 15, 12, 13, 14, 15, 12, 13, 12,
+    13, 12, 13, 14, 15, 12, 13, 12, 13, 12, 13, 12, 13,  0,  0,  0,
+     0,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,  0,
+     0,  0, 17, 17, 17, 17, 17, 17,  0,  0, 17, 17, 17, 17, 17, 17,
+     0,  0, 17, 17, 17, 17, 17, 17,  0,  0, 17, 17, 17,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  0, 17, 17, 17, 17, 17, 17, 17,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  5,  0,  5,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  5,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  5,  5,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  5,  5,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  5,  5,  0,  5,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  5,  5,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  5,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  5,  5,
+     5,  5,  5,  5,  5,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  5,  5,  5,  5,  5,
+     5,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     7,  7,  7,  7,  7,  0,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  0,  7,  7,
+     0,  0,  7,  0,  0,  7,  7,  0,  0,  7,  7,  7,  7,  0,  7,  7,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  0,  7,  0,  7,  7,  7,
+     7,  7,  7,  7,  0,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     7,  7,  7,  7,  7,  7,  0,  7,  7,  7,  7,  0,  0,  7,  7,  7,
+     7,  7,  7,  7,  7,  0,  7,  7,  7,  7,  7,  7,  7,  0,  7,  7,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  0,  7,  7,  7,  7,  0,
+     7,  7,  7,  7,  7,  0,  7,  0,  0,  0,  7,  7,  7,  7,  7,  7,
+     7,  0,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     7,  7,  7,  7,  7,  7,  0,  0,  7,  7,  7,  7,  7,  7,  7,  7,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  0,  0,  7,  7,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     0,  7,  7,  0,  7,  0,  0,  7,  0,  7,  7,  7,  7,  7,  7,  7,
+     7,  7,  7,  0,  7,  7,  7,  7,  0,  7,  0,  7,  0,  0,  0,  0,
+     0,  0,  7,  0,  0,  0,  0,  7,  0,  7,  0,  7,  0,  7,  7,  7,
+     0,  7,  7,  0,  7,  0,  0,  7,  0,  7,  0,  7,  0,  7,  0,  7,
+     0,  7,  7,  0,  7,  0,  0,  7,  7,  7,  7,  0,  7,  7,  7,  7,
+     7,  7,  7,  0,  7,  7,  7,  7,  0,  7,  7,  7,  7,  0,  7,  0,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  0,  7,  7,  7,  7,  7,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  0,  0,  0,  0,
+     0,  7,  7,  7,  0,  7,  7,  7,  7,  7,  0,  7,  7,  7,  7,  7,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  0,  0,  0,  0,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  0,  0,  0,  0,  0,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  8,  8,  8,  8,  0,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  3,  3,  3,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    11,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    11, 11, 11,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,  0,  0,  0,  0,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  0,  0,  0,  0,  0,  0,  0,
+     8,  8,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  0,  0,  0,  0,  0,  0
+};
+
+RE_UINT32 re_get_decomposition_type(RE_UINT32 codepoint) {
+    RE_UINT32 field_2;
+    RE_UINT32 field_1;
+    RE_UINT32 field_0;
+    RE_UINT32 v;
+
+    field_2 = codepoint >> 10;
+    field_1 = (codepoint >> 5) & 0x1F;
+    field_0 = codepoint & 0x1F;
+
+    v = re_decomposition_type_table_1[field_2];
+    v = re_decomposition_type_table_2[(v << 5) | field_1];
+    v = re_decomposition_type_table_3[(v << 5) | field_0];
+
+    return v;
+}
+
+/* Default_Ignorable_Code_Point. */
+static RE_UINT8 re_default_ignorable_code_point_table_1[] = {
+     0,  1,  2,  2,  3,  4,  5,  2,  6,  2,  2,  2,  7,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  8,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  9,
+     2,  2,  2,  2, 10,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+    11, 11, 11, 11,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2
+};
+
+static RE_UINT8 re_default_ignorable_code_point_table_2[] = {
+     0,  0,  0,  0,  0,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  2,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     3,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  4,  5,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  6,  0,  0,
+     7,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     8,  9,  0, 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 11,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    10,  0,  0,  0,  0,  0,  0,  4,  0,  0,  0,  0,  0,  5,  0, 12,
+     0,  0,  0,  0,  0, 13,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 14,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15
+};
+
+static RE_UINT8 re_default_ignorable_code_point_table_3[] = {
+      0,   0,   0,   0,   0,  32,   0,   0,   0, 128,   0,   0,   0,   0,   0,  16,
+      0,   0,   0, 128,   1,   0,   0,   0,   0,   0,  48,   0,   0, 120,   0,   0,
+      0, 248,   0,   0,   0, 124,   0,   0, 255, 255,   0,   0,  16,   0,   0,   0,
+      0,   0, 255,   1,  15,   0,   0,   0,   0,   0, 248,   7, 255, 255, 255, 255
+};
+
+RE_UINT32 re_get_default_ignorable_code_point(RE_UINT32 codepoint) {
+    RE_UINT32 field_2;
+    RE_UINT32 field_1;
+    RE_UINT32 field_0;
+    RE_UINT32 offset;
+    RE_UINT32 v;
+
+    field_2 = codepoint >> 10;
+    field_1 = (codepoint >> 5) & 0x1F;
+    field_0 = (codepoint >> 3) & 0x3;
+    offset = codepoint & 0x7;
+
+    v = re_default_ignorable_code_point_table_1[field_2];
+    v = re_default_ignorable_code_point_table_2[(v << 5) | field_1];
+    v = re_default_ignorable_code_point_table_3[(v << 2) | field_0];
+
+    return (v >> offset) & 0x1;
+}
+
+/* Deprecated. */
+RE_UINT32 re_get_deprecated(RE_UINT32 codepoint) {
+    if (codepoint == 0x0149)
+        return 1;
+    if (codepoint == 0x0673)
+        return 1;
+    if (codepoint == 0x0F77)
+        return 1;
+    if (codepoint == 0x0F79)
+        return 1;
+    if (0x17A3 <= codepoint && codepoint <= 0x17A4)
+        return 1;
+    if (0x206A <= codepoint && codepoint <= 0x206F)
+        return 1;
+    if (0x2329 <= codepoint && codepoint <= 0x232A)
+        return 1;
+    if (codepoint == 0x0E0001)
+        return 1;
+
+    return 0;
+}
+
+/* Diacritic. */
+static RE_UINT8 re_diacritic_table_1[] = {
+     0,  1,  2,  3,  4,  5,  6,  7,  8,  8,  8,  9, 10,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8, 11, 12,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8, 13, 14,
+    15,  8, 16, 17, 18, 19, 20, 21,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8, 22, 23,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8, 24,  8,  8,  8, 25,  8, 26,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8
+};
+
+static RE_UINT8 re_diacritic_table_2[] = {
+      0,   0,   1,   2,   0,   3,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   4,   5,   5,   5,   5,   6,   7,   8,   0,   0,   0,
+      0,   0,   0,   0,   9,   0,   0,   0,   0,   0,  10,   0,  11,  12,  13,   0,
+      0,   0,  14,   0,   0,   0,  15,  16,   0,   4,  17,   0,   0,  18,   0,  19,
+     20,   0,   0,   0,   0,   0,   0,  21,   0,  22,  23,  24,   0,  22,  25,   0,
+      0,  22,  25,   0,   0,  22,  25,  26,   0,  22,  27,   0,   0,   0,  25,   0,
+      0,   0,  25,   0,   0,  22,  25,   0,   0,  28,  25,   0,   0,   0,  29,   0,
+      0,   0,  30,   0,   0,  31,  32,   0,  20,  33,   0,   0,  34,   0,  35,   0,
+      0,  36,   0,  37,  38,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  26,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  39,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,  40,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,  41,   0,  42,   0,   0,   0,  43,  44,  45,   0,  46,   0,   0,
+      0,  47,   0,  48,   0,   0,   4,  49,   0,  50,   5,  17,   0,   0,  51,  52,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  53,  54,  55,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,  56,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,  57,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,  58,   0,   0,  59,   0,   0,  22,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,  60,  61,   0,   0,  62,   5,  63,   0,   0,  64,   0,   0,  20,
+      0,   0,   0,   0,   0,   0,  44,  65,   0,  66,  67,   0,   0,  67,   2,  68,
+      0,   0,   0,  69,   0,  15,  70,  71,   0,   0,  72,  73,   0,   0,   0,  74,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,  75,   0,   0,   0,   0,   0,   0,   0,   1,   2,  76,  77,   0,   0,  78,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,  79,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,  80,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  18,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,  81,   0,   0,   0,  82,   0,  67,   0,   0,  83,   0,
+      0,  84,   0,   0,   0,   0,   0,  85,   0,  22,  25,  86,   0,   0,   0,   0,
+      0,   0,  87,   0,   0,   0,  88,   0,   0,   0,   0,   0,   0,  15,   2,   0,
+      0,  15,   0,   0,   0,  47,   0,   0,   0,  89,   0,   0,   0,   0,   0,   0,
+      0,  81,   0,   0,   0,   0,   0,   0,   0,  90,  78,   0,   0,   0,   0,   2,
+      0,  43,  91,   0,  10,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,  15,   0,   0,   0,   0,   0,   0,   0,   0,  92,   0,  93,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,  94,   0,  95,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  96,   0,   0,  62,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  97,  98,  99,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,  95,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0, 100,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,  95,   0,   0,   0, 101,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0
+};
+
+static RE_UINT8 re_diacritic_table_3[] = {
+      0,   0,   0,   0,   0,   0,   0,  64,   1,   0,   0,   0,   0, 129, 144,   1,
+      0,   0, 255, 255, 255, 255, 255, 255, 255, 127, 255, 224,   7,   0,  48,   4,
+     48,   0,   0,   0, 248,   0,   0,   0,   0,   0,   0,   2,   0,   0, 254, 255,
+    251, 255, 255, 191,  22,   0,   0,   0,   0, 248, 135,   1,   0,   0,   0, 128,
+     97,  28,   0,   0, 255,   7,   0,   0, 192, 255,   1,   0,   0, 248,  63,   0,
+      0,   0,   0,   3, 248, 255, 255, 127,   0,   0,   0,  16,   0,  32,  30,   0,
+      0,   0,   2,   0,   0,  32,   0,   0,   0,   0,   0, 224,   0,  32,  32,   0,
+      0,   0,   0,  24,   0,   4,   0,   0, 128,  95,   0,   0,   0,   0,   0,   4,
+      0,  31,   0,   0,   0,   0, 160, 194, 220,   0,   0,   0,  64,   0,   0,   0,
+      0,   0, 128,   6,  24,  62,   0,   0, 128, 191,   0,  12,   0, 254,  15,  32,
+      0,   0,   0,  14,   0,   0, 224, 159,   0,   0, 255,  63,   0,   0,  16,   0,
+     16,   0,   0,   0,   0, 248,  15,   0,   0,  12,   0,   0,   0,   0, 192,   0,
+      0,   0,   0,  63, 255,  33, 144,   3,   0, 240, 255, 255, 240, 255,   0,   0,
+      0,   0, 224, 227,   0,   0,   0, 160,   3, 224,   0, 224,   0, 224,   0,  96,
+      0, 128,   3,   0,   0, 128,   0,   0,   0, 252,   0,   0,   0,   0,   0,  30,
+      0, 128,   0, 176,   0,   0,   0,  48,   0,   0,   3,   0,   3,   0,   0,   0,
+      0,   7,   0,   0, 255, 255,   3,   0,   0, 120,   0,   0,   0,   0,   8,   0,
+     32,   0,   0,   0,   0,   0,   0,  56,   7,   0,   0,   0,   0,   0,  64,   0,
+      0,   0,   0, 248,   0,  14,   0,   0,   0,  48,   0,   0, 255, 255,   0,   0,
+      0,   0,   1,   0,   0,   0,   0, 192,   8,   0,   0,   0,  96,   0,   0,   0,
+    252,   0,   0,   0,   0,   0,   0,   6,   0,   0,  24,   0,   1,  28,   0,   0,
+      0,   0,  96,   0,   0,   6,   0,   0, 192,  31,  31,   0,  68,   0,   0,   0,
+     12,   0,   0,   0,   0,   8,   0,   0,   0,   0,   0,  96, 128,   0,   0,   0,
+     52,   0,   0,   0,   0,   0, 128,   0,   0,   0,  31,   0,   0,   0, 127,   0,
+      0, 128, 255, 255, 128, 227,   7, 248, 231,  15,   0,   0,   0,  60,   0,   0,
+      0, 240,   0,   0, 112,   7,   0,   0
+};
+
+RE_UINT32 re_get_diacritic(RE_UINT32 codepoint) {
+    RE_UINT32 field_2;
+    RE_UINT32 field_1;
+    RE_UINT32 field_0;
+    RE_UINT32 offset;
+    RE_UINT32 v;
+
+    field_2 = codepoint >> 10;
+    field_1 = (codepoint >> 5) & 0x1F;
+    field_0 = (codepoint >> 3) & 0x3;
+    offset = codepoint & 0x7;
+
+    v = re_diacritic_table_1[field_2];
+    v = re_diacritic_table_2[(v << 5) | field_1];
+    v = re_diacritic_table_3[(v << 2) | field_0];
+
+    return (v >> offset) & 0x1;
+}
+
+/* East_Asian_Width. */
+static RE_UINT8 re_east_asian_width_table_1[] = {
+     0,  1,  2,  2,  3,  2,  2,  2,  4,  5,  6,  7,  8,  9,  9,  9,
+     9,  9,  9, 10,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9, 11, 12,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9, 13,  2,  2, 14, 14, 14, 14, 14, 14, 15, 16,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2, 17,  9,  9,  9,  9,
+     9, 18,  9, 19,  2,  2,  2,  2,  2,  2,  2,  2, 20,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2, 21, 22, 23,  2,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9, 24,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9, 24,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+    25,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 26,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 26
+};
+
+static RE_UINT8 re_east_asian_width_table_2[] = {
+      0,   1,   1,   2,   0,   3,   4,   5,   6,   7,   8,   9,   0,   0,  10,   0,
+      0,   0,  11,  12,   0,   0,  13,   0,  14,  14,  14,  15,  16,  17,  18,   0,
+     19,  14,  20,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,  21,  21,  21,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     22,  23,   0,  24,  25,  26,   0,   0,  27,  28,  29,  30,  31,  32,  33,  34,
+     35,  36,  37,  38,  39,  40,   0,   0,  41,  42,   0,   0,   0,   0,   0,  43,
+      0,   0,   0,  14,  14,  14,  14,  44,  14,  14,  45,  46,  47,  48,  49,  50,
+     51,   0,  52,  53,  54,  55,  56,  57,  58,  59,  60,  61,  62,  63,   0,  64,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  65,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,  66,   0,  67,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,  68,  21,  21,  69,  21,  21,  21,  21,  21,  21,  70,  71,
+     72,  73,  74,  21,  75,  21,  21,  21,  76,  77,  21,  21,  78,  21,  21,  79,
+     73,  21,  80,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,
+     21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,
+     21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,
+     21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,   0,   0,
+     21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,
+     21,  21,  21,  21,  81,  21,  82,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  83,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,
+     21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  84,   0,   0,
+     14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,
+     14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,
+     14,  14,  14,  14,  14,  14,  14,  14,  21,  21,  21,  21,  21,  21,  21,  21,
+     21,  21,  21,  21,  21,  21,  21,  21,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     85,  86,  87,  88,   0,   0,   0,   0,  89,  90,  90,  91,  92,  93,  94,  95,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  96,
+     21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,
+     21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  97,
+     21,  21,  21,  21,  21,  21,  70,   0,  98,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     21,  21,  21,  21,  21,  21,  21,  21,  73,   0,  99, 100,  21,  21,  21,  21,
+     21,  21,  21,  21,  21,  21,  21, 101,   0,   0,   0,   0,   0,   0,   0,   0,
+    102,   0,   0,   0,   0,   0, 103,   0, 104, 105,  14, 106, 107, 108,   0,   0,
+    109, 101, 110, 111,   0,   0,   0,   0,  21, 112,  21, 113,  69,  21, 114, 115,
+     21,  73, 116,  21,  21,  21,  21, 117,  21, 118, 119, 120, 121, 102,   0, 122,
+     21,  21, 123,   0,  21,  21, 124, 125,   0,   0,   0,   0,   0,   0,   0, 126,
+      0,   0,   0,   0,   0,   0,   0,   0, 127, 128, 129, 130,  21,  21, 131,  21,
+      0,   0,   0, 132, 133, 134, 135,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,
+     21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21, 118,
+      0,   0,   0,   0,   0,   0,   0,   0,  14,  14,  14,  14,  14,  14,  14,  15,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,
+     14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14, 136
+};
+
+static RE_UINT8 re_east_asian_width_table_3[] = {
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0,
+    0, 2, 1, 1, 2, 1, 1, 2, 2, 0, 2, 0, 1, 2, 2, 1,
+    2, 2, 2, 2, 2, 0, 2, 2, 2, 2, 2, 0, 2, 2, 2, 2,
+    0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    2, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 0, 2, 2,
+    2, 2, 0, 0, 0, 0, 2, 0, 2, 2, 2, 0, 2, 2, 0, 0,
+    2, 0, 2, 2, 0, 0, 0, 2, 2, 2, 2, 0, 2, 0, 2, 0,
+    0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 2, 0, 2, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 2, 0, 0, 0, 0,
+    0, 2, 2, 2, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 2,
+    2, 2, 2, 0, 2, 0, 0, 0, 2, 2, 2, 2, 0, 2, 0, 0,
+    0, 0, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 2, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0,
+    2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 2, 0, 0, 2, 0, 2, 2, 2, 0, 2, 0, 0,
+    2, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 0, 2, 0, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 0, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0,
+    0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 0, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    2, 0, 0, 2, 2, 2, 2, 0, 2, 2, 0, 0, 2, 2, 0, 0,
+    2, 2, 2, 0, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0,
+    2, 0, 2, 2, 0, 2, 0, 0, 0, 0, 0, 2, 0, 0, 2, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2,
+    0, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 2, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 2, 0, 2, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 2, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 2, 2, 0, 0, 0, 2, 0, 0, 0, 0, 2, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 2, 2, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 0,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 2, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    2, 0, 2, 2, 0, 0, 0, 2, 2, 0, 0, 2, 0, 0, 0, 2,
+    0, 2, 0, 0, 0, 2, 0, 0, 0, 0, 2, 0, 0, 2, 2, 2,
+    2, 0, 0, 2, 0, 2, 0, 2, 2, 2, 2, 2, 2, 0, 2, 0,
+    0, 0, 0, 0, 2, 2, 2, 2, 0, 0, 0, 0, 2, 2, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0,
+    0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    2, 2, 0, 0, 2, 2, 2, 2, 0, 0, 2, 2, 0, 0, 2, 2,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 2, 2, 0, 0, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 3, 3, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 0, 0, 0,
+    3, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    0, 0, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    2, 2, 0, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0,
+    0, 0, 2, 2, 0, 0, 2, 2, 0, 0, 0, 0, 2, 2, 0, 0,
+    2, 2, 0, 0, 0, 0, 2, 2, 2, 0, 0, 2, 0, 0, 2, 2,
+    2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 0,
+    0, 0, 0, 0, 0, 2, 2, 0, 0, 2, 0, 0, 0, 0, 2, 2,
+    0, 0, 0, 0, 3, 3, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0,
+    2, 0, 2, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3,
+    3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    2, 2, 0, 2, 2, 2, 0, 2, 2, 2, 2, 0, 2, 2, 0, 2,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2,
+    0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 2,
+    0, 0, 0, 0, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 3, 2,
+    2, 2, 2, 2, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 0, 2, 0, 0, 0, 0, 2, 2, 3, 2, 2, 2, 2, 2,
+    2, 2, 3, 3, 2, 3, 2, 2, 2, 2, 3, 2, 2, 3, 2, 2,
+    0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 3, 3, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 3, 0,
+    0, 0, 0, 3, 3, 3, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+    0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    3, 0, 0, 0, 0, 3, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0,
+    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 3, 3, 3, 3, 3,
+    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+    3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+    3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0,
+    5, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0,
+    0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+    3, 3, 3, 3, 3, 3, 3, 0, 0, 3, 3, 3, 3, 3, 3, 3,
+    0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+    0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0,
+    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+    3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+    3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2,
+    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0,
+    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+    3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0,
+    3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+    3, 3, 3, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+    3, 3, 3, 3, 3, 3, 3, 0, 3, 3, 3, 3, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+    5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+    5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+    5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+    5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 0,
+    0, 0, 4, 4, 4, 4, 4, 4, 0, 0, 4, 4, 4, 4, 4, 4,
+    0, 0, 4, 4, 4, 4, 4, 4, 0, 0, 4, 4, 4, 0, 0, 0,
+    5, 5, 5, 5, 5, 5, 5, 0, 4, 4, 4, 4, 4, 4, 4, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0,
+    3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+    3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0,
+    3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0,
+    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0,
+    0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 2,
+    2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+    3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0,
+    3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3,
+    3, 3, 3, 3, 3, 3, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 3, 3,
+    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 3,
+    3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+    3, 0, 0, 0, 3, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3,
+    3, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 3,
+    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 0,
+    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+    3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3,
+    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,
+    3, 3, 3, 0, 0, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 0, 0, 0,
+    0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0,
+    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3,
+    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 3, 3, 3, 3,
+    3, 3, 3, 3, 3, 3, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+    3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 3, 3, 3, 3, 3, 3,
+    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 3, 3, 3,
+    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    3, 3, 3, 3, 3, 0, 0, 0, 3, 3, 3, 0, 0, 0, 0, 0,
+    3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+    3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0,
+    3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0
+};
+
+RE_UINT32 re_get_east_asian_width(RE_UINT32 codepoint) {
+    RE_UINT32 field_2;
+    RE_UINT32 field_1;
+    RE_UINT32 field_0;
+    RE_UINT32 v;
+
+    field_2 = codepoint >> 10;
+    field_1 = (codepoint >> 5) & 0x1F;
+    field_0 = codepoint & 0x1F;
+
+    v = re_east_asian_width_table_1[field_2];
+    v = re_east_asian_width_table_2[(v << 5) | field_1];
+    v = re_east_asian_width_table_3[(v << 5) | field_0];
+
+    return v;
+}
+
+/* Emoji. */
+static RE_UINT8 re_emoji_table_1[] = {
+    0, 1, 1, 1, 1, 1, 1, 1, 2, 3, 4, 1, 5, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 6, 7, 8, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
+};
+
+static RE_UINT8 re_emoji_table_2[] = {
+     0,  1,  0,  0,  0,  2,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  3,  4,  0,  0,  0,  0,  0,  0,  5,  0,  0,  6,  7,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  8,  9,  0,  0,  0,  0, 10, 11,
+     0,  0,  0,  0,  0,  0, 12,  0,  0,  0,  0,  0,  0, 13, 14, 15,
+    16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0, 30,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0, 31,  0, 32,  0,  0,  0,  0,  0,
+     0, 33,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0, 34,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    35,  0,  0,  0,  0,  0, 10,  0,  0,  0,  0, 36, 37,  0,  0, 38,
+    39, 40, 41,  0,  0,  0,  0,  0, 42, 43, 42, 42, 44, 42, 42, 45,
+    42, 42, 42, 42, 42, 42, 42, 46, 42, 47, 48, 49, 50, 51, 52, 53,
+    42, 42, 54,  0, 42, 42, 55, 56,  0,  0,  0,  0,  0,  0,  0, 57,
+     0,  0,  0,  0,  0,  0,  0,  0, 58, 59, 60, 61, 42, 42, 62, 42,
+     0,  0,  0, 63, 64, 65, 66,  0,  0,  0,  0,  0,  0,  0,  0,  0
+};
+
+static RE_UINT8 re_emoji_table_3[] = {
+      0,   0,   0,   0,   8,   4, 255,   3,   0,  66,   0,   0,   0,   0,   0,  16,
+      0,   2,   0,   0,   4,   0,   0,   2,   0,   0, 240,   3,   0,   6,   0,   0,
+      0,   0,   0,  12,   0,   1,   0,   0,   0, 128,   0,   0,   0, 254,  15,   7,
+      4,   0,   0,   0,   0,  12,  64,   0,   1,   0,   0,   0,   0,   0,   0, 120,
+     31,  64,  50,  33,  77, 196,   0,   7,   5, 255,  15, 128, 105,   1,   0, 200,
+      0,   0, 252,  26, 131,  12,   3,  96,  48, 193,  26,   0,   0,   6, 191,  39,
+     36, 191,  84,  32,   2,   1,  24,   0, 144,  80, 184,   0,  24,   0,   0,   0,
+      0,   0, 224,   0,   2,   0,   1, 128,   0,   0,  48,   0, 224,   0,   0,  24,
+      0,   0,  33,   0,   0,   0,   1,  32,   0,   0, 128,   2,  16,   0,   0,   0,
+      0,   0,   3, 192,   0,  64, 254,   7, 192, 255, 255, 255,   6,   0,   0,   4,
+      0, 128, 252,   7,   0,   0,   3,   0, 255, 255, 255, 255, 243, 255, 255, 255,
+    255, 255, 207, 206, 255, 255, 185, 255, 255, 255, 255, 191, 255, 255, 255,  63,
+      0, 126, 255, 255, 255, 128, 249,   7, 128,  60,  97,   0,  48,   1,   6,  16,
+     28,   0,  14, 112,  10, 129,   8, 252, 255, 255,   0,   0,  63, 248, 231,   0,
+     63,  26, 249,  31, 255,  15,   0,   0,   0, 240, 255, 255, 255, 255, 255, 247,
+    191, 255, 255, 255, 255, 255, 255, 253, 255, 239, 255, 255,   0,   0,  31,   7,
+    127,   0, 255, 255, 255,   1, 127,   0,   7,   0, 127,   0
+};
+
+RE_UINT32 re_get_emoji(RE_UINT32 codepoint) {
+    RE_UINT32 field_2;
+    RE_UINT32 field_1;
+    RE_UINT32 field_0;
+    RE_UINT32 offset;
+    RE_UINT32 v;
+
+    field_2 = codepoint >> 10;
+    field_1 = (codepoint >> 5) & 0x1F;
+    field_0 = (codepoint >> 3) & 0x3;
+    offset = codepoint & 0x7;
+
+    v = re_emoji_table_1[field_2];
+    v = re_emoji_table_2[(v << 5) | field_1];
+    v = re_emoji_table_3[(v << 2) | field_0];
+
+    return (v >> offset) & 0x1;
+}
+
+/* Emoji_Component. */
+static RE_UINT8 re_emoji_component_table_1[] = {
+    0, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, 1, 5, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
+};
+
+static RE_UINT8 re_emoji_component_table_2[] = {
+    0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    2, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 8, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+};
+
+static RE_UINT8 re_emoji_component_table_3[] = {
+      0,   0,   0,   0,   8,   4, 255,   3,   0,  32,   0,   0,   8,   0,   0,   0,
+      0, 128,   0,   0, 192, 255, 255, 255,   0,   0,   0, 248,   0,   0,  15,   0,
+    255, 255, 255, 255
+};
+
+RE_UINT32 re_get_emoji_component(RE_UINT32 codepoint) {
+    RE_UINT32 field_2;
+    RE_UINT32 field_1;
+    RE_UINT32 field_0;
+    RE_UINT32 offset;
+    RE_UINT32 v;
+
+    field_2 = codepoint >> 10;
+    field_1 = (codepoint >> 5) & 0x1F;
+    field_0 = (codepoint >> 3) & 0x3;
+    offset = codepoint & 0x7;
+
+    v = re_emoji_component_table_1[field_2];
+    v = re_emoji_component_table_2[(v << 5) | field_1];
+    v = re_emoji_component_table_3[(v << 2) | field_0];
+
+    return (v >> offset) & 0x1;
+}
+
+/* Emoji_Modifier. */
+RE_UINT32 re_get_emoji_modifier(RE_UINT32 codepoint) {
+    if (0x01F3FB <= codepoint && codepoint <= 0x01F3FF)
+        return 1;
+
+    return 0;
+}
+
+/* Emoji_Modifier_Base. */
+static RE_UINT8 re_emoji_modifier_base_table_1[] = {
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 4, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+};
+
+static RE_UINT8 re_emoji_modifier_base_table_2[] = {
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     1,  0,  0,  0,  0,  0,  0,  2,  3,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  4,  0,  5,  0,
+     0,  0,  6,  7,  8,  9,  0,  0,  0,  0,  0, 10, 11,  0,  0,  0,
+     0,  0, 12,  0,  0, 13, 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0, 15, 16,  0, 17,  0, 18, 19,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0
+};
+
+static RE_UINT8 re_emoji_modifier_base_table_3[] = {
+      0,   0,   0,   0,   0,   0,   0,  32,   0,   0,   0,   2,   0,  60,   0,   0,
+     32,   0,   0,   0, 156,  28,   0,   0, 204, 255,   1,   0, 192, 255, 255,  17,
+    238, 128,   2,   0,   0,   4,   0,   0,   0,   0,  48,   4,   0,   0,  97,   0,
+    224, 248,   0,   0,   8,   0, 112,   0,   1,  16,   0,   0,   0, 144,   0, 255,
+     64,   0, 255, 115,   0,   0, 128,   0,   0,   0,  96,  11,   0, 224, 254,  63
+};
+
+RE_UINT32 re_get_emoji_modifier_base(RE_UINT32 codepoint) {
+    RE_UINT32 field_2;
+    RE_UINT32 field_1;
+    RE_UINT32 field_0;
+    RE_UINT32 offset;
+    RE_UINT32 v;
+
+    field_2 = codepoint >> 10;
+    field_1 = (codepoint >> 5) & 0x1F;
+    field_0 = (codepoint >> 3) & 0x3;
+    offset = codepoint & 0x7;
+
+    v = re_emoji_modifier_base_table_1[field_2];
+    v = re_emoji_modifier_base_table_2[(v << 5) | field_1];
+    v = re_emoji_modifier_base_table_3[(v << 2) | field_0];
+
+    return (v >> offset) & 0x1;
+}
+
+/* Emoji_Presentation. */
+static RE_UINT8 re_emoji_presentation_table_1[] = {
+    0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 5, 6, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+};
+
+static RE_UINT8 re_emoji_presentation_table_2[] = {
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  1,  0,  0,  0,  0,  0,  0,  2,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  3,
+     4,  0,  5,  6,  7,  8,  9, 10, 11, 12, 13,  0, 14, 15,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0, 16,  0, 17,  0,  0,  0,  0,  0,
+    18,  0,  0,  0,  0,  0, 19,  0,  0,  0,  0,  0, 20,  0,  0, 21,
+    22, 23, 24,  0,  0,  0,  0,  0, 25, 26, 25, 27, 28, 25, 29, 30,
+    25, 31, 32, 25, 25, 25, 25, 33, 25, 34, 35, 36, 37, 18,  0, 38,
+    25, 25, 39,  0, 25, 25, 40, 41,  0,  0,  0,  0,  0,  0,  0, 42,
+     0,  0,  0,  0,  0,  0,  0,  0, 43, 44, 45, 46, 25, 25, 47, 25,
+     0,  0,  0, 48, 49, 50, 51,  0,  0,  0,  0,  0,  0,  0,  0,  0
+};
+
+static RE_UINT8 re_emoji_presentation_table_3[] = {
+      0,   0,   0,   0,   0,   0,   0,  12,   0,  30,   9,   0,   0,   0,   0,  96,
+      0,   0,  48,   0,   0, 255,  15,   0,   0,   0,   0, 128,   0,   0,   8,   0,
+      2,  12,   0,  96,  48,  64,  16,   0,   0,   4,  44,  36,  32,  12,   0,   0,
+      0,   1,   0,   0,   0,  80, 184,   0,   0,   0, 224,   0,   0,   0,   1, 128,
+      0,   0,   0,  24,   0,   0,  33,   0,  16,   0,   0,   0,   0, 128,   0,   0,
+      0,  64, 254,   7, 192, 255, 255, 255,   2,   0,   0,   4,   0, 128, 124,   7,
+      0,   0,   3,   0, 255, 255, 255, 255,   1, 224, 191, 255, 255, 255, 255, 223,
+    255, 255,  15,   0, 255, 135,  15,   0, 255, 255,  17, 255, 255, 255, 255, 127,
+    253, 255, 255, 255, 255, 255, 255, 159, 255, 255, 255,  63,   0, 120, 255, 255,
+    255,   0,   0,   4,   0,   0,  96,   0,   0,   0,   0, 248, 255, 255,   0,   0,
+     63,  16, 231,   0,   0,  24, 240,  31, 255,  15,   0,   0,   0, 240, 255, 255,
+    255, 255, 255, 247, 191, 255, 255, 255, 255, 255, 255, 253, 255, 239, 255, 255,
+      0,   0,  31,   7, 127,   0, 255, 255, 255,   1, 127,   0,   7,   0, 127,   0
+};
+
+RE_UINT32 re_get_emoji_presentation(RE_UINT32 codepoint) {
+    RE_UINT32 field_2;
+    RE_UINT32 field_1;
+    RE_UINT32 field_0;
+    RE_UINT32 offset;
+    RE_UINT32 v;
+
+    field_2 = codepoint >> 10;
+    field_1 = (codepoint >> 5) & 0x1F;
+    field_0 = (codepoint >> 3) & 0x3;
+    offset = codepoint & 0x7;
+
+    v = re_emoji_presentation_table_1[field_2];
+    v = re_emoji_presentation_table_2[(v << 5) | field_1];
+    v = re_emoji_presentation_table_3[(v << 2) | field_0];
+
+    return (v >> offset) & 0x1;
+}
+
+/* Extended_Pictographic. */
+static RE_UINT8 re_extended_pictographic_table_1[] = {
+    0, 1, 1, 1, 1, 1, 1, 1, 2, 3, 4, 1, 5, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 6, 7, 8, 9,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
+};
+
+static RE_UINT8 re_extended_pictographic_table_2[] = {
+     0,  0,  0,  0,  0,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  2,  3,  0,  0,  0,  0,  0,  0,  4,  0,  0,  5,  6,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  7,  8,  0,  0,  8,  0,  9, 10,
+     0,  0,  0,  0,  0,  0, 11,  0,  0,  0,  0,  0,  0, 12, 13, 14,
+    15, 16, 16, 16, 17, 16, 16, 16, 18, 19, 20, 21, 22, 23,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0, 24,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0, 25,  0, 26,  0,  0,  0,  0,  0,
+     0, 27,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0, 28,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    16, 16, 16, 16, 16, 16, 16, 16, 29,  9,  0, 30, 31, 32, 16, 33,
+    34, 35, 36, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 37,
+    16, 16, 16, 16, 16, 16, 16, 16, 16, 38, 39, 16, 16, 16, 16, 16,
+    16, 16, 40,  0, 16, 16, 16, 16,  0,  0,  0, 41,  0,  0, 42, 16,
+    43,  0, 44,  0, 45, 46, 16, 16, 47, 48, 49, 16, 16, 16, 16, 16,
+    16, 16, 16, 16, 16, 16, 16, 16,  0,  0,  0,  0,  0,  0,  0,  0,
+    16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+    16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 38
+};
+
+static RE_UINT8 re_extended_pictographic_table_3[] = {
+      0,   0,   0,   0,   0,  66,   0,   0,   0,   0,   0,  16,   0,   2,   0,   0,
+      4,   0,   0,   2,   0,   0, 240,   3,   0,   6,   0,   0,   0,   0,   0,  12,
+      0,   1,   0,   0,   0, 128,   0,   0,   0, 254,  15,   7,   4,   0,   0,   0,
+      0,  12,  64,   0,   1,   0,   0,   0,   0,   0,   0, 120, 191, 255, 247, 255,
+    255, 255, 255, 255,  63,   0, 255, 255,  63, 255,  87,  32,   2,   1,  24,   0,
+    144,  80, 184,   0, 248,   0,   0,   0,   0,   0, 224,   0,   2,   0,   1, 128,
+      0,   0,  48,   0, 224,   0,   0,  24,   0,   0,  33,   0,   0,   0,   1,  32,
+      0,   0, 128,   2,   0, 224,   0,   0,   0, 240,   3, 192,   0,  64, 254,   7,
+      0, 224, 255, 255,  63,   0,   0,   0, 254, 255,   0,   4,   0, 128, 252, 247,
+      0, 254, 255, 255, 255, 255, 255,   7, 255, 255, 255,  63, 192, 255, 255, 255,
+    255, 255,   0,   0,   0,   0, 240, 255,   0,   0, 224, 255,   0, 240,   0,   0,
+      0, 255,   0, 252,   0, 255,   0,   0,   0, 192, 255, 255,   0, 240, 255, 255,
+    255, 255, 255, 247, 191, 255, 255, 255
+};
+
+RE_UINT32 re_get_extended_pictographic(RE_UINT32 codepoint) {
+    RE_UINT32 field_2;
+    RE_UINT32 field_1;
+    RE_UINT32 field_0;
+    RE_UINT32 offset;
+    RE_UINT32 v;
+
+    field_2 = codepoint >> 10;
+    field_1 = (codepoint >> 5) & 0x1F;
+    field_0 = (codepoint >> 3) & 0x3;
+    offset = codepoint & 0x7;
+
+    v = re_extended_pictographic_table_1[field_2];
+    v = re_extended_pictographic_table_2[(v << 5) | field_1];
+    v = re_extended_pictographic_table_3[(v << 2) | field_0];
+
+    return (v >> offset) & 0x1;
+}
+
+/* Extender. */
+static RE_UINT8 re_extender_table_1[] = {
+     0,  1,  2,  3,  4,  4,  5,  6,  4,  4,  4,  4,  7,  4,  4,  4,
+     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
+     4,  4,  4,  4,  4,  4,  4,  4,  8,  9, 10,  4,  4,  4,  4,  4,
+     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4, 11,
+     4,  4,  4,  4, 12, 13, 14,  4,  4,  4,  4,  4,  4,  4,  4,  4,
+     4,  4,  4,  4,  4,  4,  4,  4,  4,  4, 15, 16,  4,  4,  4,  4,
+     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
+     4,  4,  4,  4,  4,  4,  4,  4, 17,  4, 18,  4,  4,  4,  4,  4,
+     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
+     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
+     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
+     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
+     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
+     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
+     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
+     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
+     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
+     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
+     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
+     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
+     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
+     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
+     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
+     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
+     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
+     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
+     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
+     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
+     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
+     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
+     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
+     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
+     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
+     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
+     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
+     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
+     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
+     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
+     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
+     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
+     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
+     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
+     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
+     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
+     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
+     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
+     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
+     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
+     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
+     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
+     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
+     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
+     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
+     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
+     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
+     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
+     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
+     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
+     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
+     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
+     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
+     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
+     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
+     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
+     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
+     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
+     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
+     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4
+};
+
+static RE_UINT8 re_extender_table_2[] = {
+     0,  0,  0,  0,  0,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  2,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  3,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  4,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  5,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  6,  0,  0,  0,  6,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     7,  0,  8,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0, 10,  0, 11,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    12, 13,  0,  0, 14,  0,  0, 15,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     5,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    16,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 17,  6,
+     0,  0,  0, 18,  0,  0, 19, 20,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 18,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 19,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 21,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0, 22,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 23,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 24,
+     0,  0,  0,  0,  0,  0,  0,  0,  0, 25,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 26,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0
+};
+
+static RE_UINT8 re_extender_table_3[] = {
+      0,   0,   0,   0,   0,   0, 128,   0,   0,   0,   3,   0,   1,   0,   0,   0,
+      0,   0,   0,   4,   0,   0,  32,   0,  64,   0,   0,   0,   0,   4,   0,   0,
+      8,   0,   0,   0, 128,   0,   0,   0,   0,   0,  64,   0,   0,   0,   0,   8,
+     32,   0,   0,   0,   0,   0,  62,   0,   0,   0,   0,  96,   0,   0,   0, 112,
+      0,  16,   0,   0,   0, 128,   0,   0,   0,   0,   1,   0,   0,   0,   0,  32,
+      0,   0,  24,   0, 192,   1,   0,   0,   0,   0,   0,   1,  12,   0,   0,   0,
+     11,   0,   0,   0,   0,   0,   0,  48, 112,   0,   0,   0
+};
+
+RE_UINT32 re_get_extender(RE_UINT32 codepoint) {
+    RE_UINT32 field_2;
+    RE_UINT32 field_1;
+    RE_UINT32 field_0;
+    RE_UINT32 offset;
+    RE_UINT32 v;
+
+    field_2 = codepoint >> 10;
+    field_1 = (codepoint >> 5) & 0x1F;
+    field_0 = (codepoint >> 3) & 0x3;
+    offset = codepoint & 0x7;
+
+    v = re_extender_table_1[field_2];
+    v = re_extender_table_2[(v << 5) | field_1];
+    v = re_extender_table_3[(v << 2) | field_0];
+
+    return (v >> offset) & 0x1;
+}
+
+/* General_Category. */
+static RE_UINT8 re_general_category_table_1[] = {
+     0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 13, 13,
+    13, 13, 13, 14, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 15, 16, 17, 18, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 19, 20, 20, 21, 21, 21, 21, 21, 21, 22, 23,
+    24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 34, 13, 35, 34, 34,
+    34, 36, 34, 34, 34, 34, 34, 34, 34, 34, 37, 38, 13, 13, 13, 13,
+    13, 39, 13, 40, 34, 34, 34, 34, 34, 34, 34, 34, 41, 34, 34, 42,
+    34, 34, 34, 34, 43, 44, 45, 34, 46, 34, 47, 48, 49, 50, 51, 34,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 52, 13, 13, 13, 53, 54, 13,
+    13, 13, 13, 55, 13, 13, 13, 13, 13, 13, 56, 34, 34, 34, 57, 34,
+    13, 13, 13, 13, 58, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    59, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 60,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 60
+};
+
+static RE_UINT16 re_general_category_table_2[] = {
+      0,   1,   2,   3,   0,   4,   5,   6,   7,   8,   9,  10,  11,  12,  13,  14,
+      7,  15,  16,  17,  18,  19,  20,  21,  22,  22,  22,  23,  24,  25,  26,  27,
+     28,  29,  17,   7,  30,   7,  31,   7,   7,  32,  33,  17,  34,  35,  36,  37,
+     38,  39,  40,  41,  39,  39,  42,  43,  44,  45,  46,  39,  39,  47,  48,  49,
+     50,  51,  52,  53,  54,  55,  56,  57,  58,  59,  60,  61,  62,  63,  64,  65,
+     66,  67,  68,  69,  70,  71,  72,  73,  74,  75,  76,  77,  78,  79,  80,  81,
+     82,  83,  84,  85,  86,  87,  88,  89,  90,  91,  92,  93,  94,  95,  96,  97,
+     98,  99, 100,  54, 101, 102, 103,  54, 104, 105, 106, 107, 108, 109, 110,  54,
+     39, 111, 112, 113, 114,  28, 115, 116,  39,  39,  39,  39,  39,  39,  39,  39,
+     39,  39, 117,  39, 118, 119, 120,  39, 121,  39, 122, 123, 124,  28,  28, 125,
+    126,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,
+     39,  39,  39, 127, 128,  39,  39, 129, 130, 131, 132, 133,  39, 134, 135, 136,
+    137,  39, 138, 139, 140, 141,  39, 142, 143, 144, 145, 146,  39, 147, 148, 149,
+    150,  39, 151, 152, 153, 154, 155,  54, 156, 157, 158, 159, 160, 161,  39, 162,
+     39, 163, 164, 165, 166, 167, 168, 169,  17, 170, 171, 172, 173, 171,  22, 174,
+      7,   7,   7,   7, 175,   7,   7,   7, 176, 177, 178, 179, 180, 181, 182, 183,
+    184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199,
+    200, 200, 200, 200, 200, 200, 200, 200, 201, 202, 149, 203, 204, 205, 206, 207,
+    149, 208, 209, 210, 211, 149, 149, 212, 149, 149, 149, 149, 149, 213, 214, 215,
+    149, 149, 149, 216, 149, 149, 149, 149, 149, 149, 149, 217, 218, 149, 219, 220,
+    149, 149, 149, 149, 149, 149, 149, 149, 200, 200, 200, 200, 221, 200, 222, 223,
+    200, 200, 200, 200, 200, 200, 200, 200, 149, 224, 225, 226, 227, 149, 149, 149,
+     28, 228, 229, 230,   7,   7,   7, 231,  17, 232,  39, 233, 234, 235, 235,  22,
+    236, 237, 238,  54, 239, 149, 149, 240, 149, 149, 149, 149, 149, 149, 241, 242,
+    243, 244,  98,  39, 245, 126,  39, 246, 247, 248,  39,  39, 249,  39, 149, 250,
+    251, 252, 253, 149, 252, 254, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149,
+     39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,
+     39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,
+     39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39, 149, 149,
+     39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,
+     39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,
+     39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39, 255,
+    256,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,
+     39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,
+     39,  39,  39,  39, 257, 149, 258, 165,  39,  39,  39,  39,  39,  39,  39,  39,
+    259, 260,   7, 261, 262,  39,  39, 263, 264, 265,   7, 266, 267, 268, 269, 270,
+    271, 272,  39, 273, 274, 275, 276, 277,  48, 278, 279, 255,  58, 280, 281, 282,
+     39, 283, 284, 285,  39, 286, 287, 288, 289, 290, 291, 292,  17,  17,  39, 293,
+     39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,
+     39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39, 294, 295, 296,
+    297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297,
+    297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297,
+    298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298,
+    298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298,
+    298, 298, 298, 298, 298, 298, 298, 298,  39,  39,  39,  39,  39,  39,  39,  39,
+     39,  39,  39, 299,  39,  39, 300,  54, 301, 302, 303,  39,  39, 304, 305,  39,
+     39,  39,  39,  39,  39,  39,  39,  39,  39, 306, 307,  39, 308,  39, 309, 310,
+    311, 312, 313, 314,  39,  39,  39, 315, 316,   2, 317, 318, 319, 143, 320, 321,
+    322, 323, 324,  54,  39,  39,  39, 325, 326, 327, 195, 328, 329, 330, 331, 332,
+     54,  54,  54,  54, 255,  39, 333, 334,  39, 335, 336, 337, 338,  39, 339,  54,
+     28, 340, 341,  39, 342, 343, 344, 345,  39, 346,  39, 347,  54,  54,  54,  54,
+     39,  39,  39,  39,  39,  39,  39,  39,  39, 234, 142, 309,  54,  54,  54,  54,
+    348, 349, 350, 351, 143, 352,  54, 353, 354, 355,  54,  54,  39, 356, 357, 210,
+    358, 359, 360, 361, 362,  54, 363, 364,  39, 365, 366, 367, 368, 369,  54,  54,
+     39,  39, 370,  54,  28, 371,  17, 372,  39, 373,  54,  54,  54,  54,  54,  54,
+     54,  54,  54, 374,  39, 375,  54,  54, 362, 376, 377,  54,  54, 307, 378, 234,
+    379, 380, 381, 382, 160, 383, 384, 385, 386, 387, 388, 389, 160, 390, 391, 392,
+    393, 394,  54,  54, 395, 396, 397, 398, 399, 400, 401, 402,  54,  54,  54,  54,
+     39, 403, 404, 405,  39, 406, 407,  54,  54,  54,  54,  54,  39, 408, 409,  54,
+     39, 410, 411, 412,  39, 413, 414,  54, 122, 415,  54,  54,  54,  54,  54,  54,
+     39, 416,  54,  54,  54,  28,  17, 417, 418, 419, 420,  54,  54, 421, 422, 423,
+    424, 425, 426,  39, 427, 428,  39, 139,  54,  54,  54,  54,  54,  54,  54,  54,
+    429, 430, 431, 432, 433, 434,  54,  54, 435, 436, 437, 438, 439, 414,  54,  54,
+     54,  54,  54,  54,  54,  54,  54, 440,  54,  54,  54,  54,  54, 441, 442, 443,
+     39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,
+     39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39, 300,  54,  54,  54,
+    195, 195, 195, 444,  39,  39,  39,  39,  39,  39, 445,  54,  54,  54,  54,  54,
+     54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,
+     54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,
+     54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,
+     39, 446,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,
+     54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,
+     39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,
+     39,  39, 447,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,
+     39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,
+     39, 139, 143, 448,  54,  54, 307, 449,  39, 450, 451, 452, 453,  54,  54,  54,
+     54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,
+     54,  54,  28,  17, 454,  54,  54,  54,  39,  39, 455, 456, 457,  54,  54, 458,
+     39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,
+     39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39, 459,
+     39,  39,  39,  39,  39,  39, 142,  54, 370,  54,  54,  54,  54,  54,  54,  54,
+     54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,
+     39,  39,  39,  39,  39,  39,  39,  39, 143,  54, 460, 461,  39,  39,  39,  39,
+     39,  39,  39,  39,  39,  39,  39, 296,  54,  54,  54,  54,  54,  54,  54,  54,
+     39,  39,  39, 462, 463, 464,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,
+     54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,
+    149, 149, 149, 149, 149, 149, 149, 241, 149, 465, 149, 466, 467, 468, 149, 469,
+    149, 149, 470,  54,  54,  54,  54, 471, 149, 149, 472, 473,  54,  54,  54,  54,
+    474, 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, 474, 475, 487,
+    477, 488, 489, 490, 481, 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, 501,
+    149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149,
+     22, 502,  22, 503, 504, 505,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,
+    506, 507,  54,  54,  54,  54,  54,  54,  39, 508, 509,  54,  54,  54,  54,  54,
+     54,  54,  54,  54,  54,  54,  39, 510,  54,  54,  54,  54,  54,  54,  54,  54,
+     39,  39,  39,  39,  39,  39, 511,  54,  28, 512, 513,  54,  54,  54,  54,  54,
+     54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,
+     54,  54,  54, 514, 210, 515,  54,  54, 516, 517,  54,  54,  54,  54,  54,  54,
+    518, 519, 520, 521, 522, 523,  54, 524,  54,  54,  54,  54,  54,  54,  54,  54,
+    149, 525, 149, 149, 240, 526, 527, 241, 528, 149, 149, 149, 149, 529,  54, 530,
+    531, 532, 533, 534,  54,  54,  54,  54, 149, 149, 149, 149, 149, 149, 149, 535,
+    149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149,
+    149, 149, 149, 149, 149, 149, 536, 537, 149, 149, 149, 240, 149, 149, 538, 539,
+    525, 149, 540, 149, 541, 542,  54,  54, 149, 149, 149, 543, 149, 149, 544, 149,
+    149, 149, 240, 545, 546, 547, 548,  54, 149, 149, 149, 149, 549, 149, 209, 550,
+     39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,
+     39,  39,  39,  39,  39,  39, 342,  54,  39,  39,  39,  39,  39,  39,  39,  39,
+     39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,
+     39,  39,  39,  39,  39,  39,  39,  39,  39, 551,  39,  39,  39,  39,  39,  39,
+    342,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,
+     39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,
+     39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,
+     39,  39,  39,  39,  39, 552,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,
+     39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,
+     39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39, 553,
+     39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,
+    342,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,
+     39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,
+     39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  53,  54,  54,  54,  54,  54,
+    554, 555, 555, 555,  54,  54,  54,  54,  22,  22,  22,  22,  22,  22,  22, 556,
+     54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,
+    298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298,
+    298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 557
+};
+
+static RE_UINT8 re_general_category_table_3[] = {
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     2,  3,  3,  3,  4,  3,  3,  3,  5,  6,  3,  7,  3,  8,  3,  3,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  3,  3,  7,  7,  7,  3,
+     3, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,  5,  3,  6, 11, 12,
+    11, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,  5,  7,  6,  7,  1,
+     2,  3,  4,  4,  4,  4, 14,  3, 11, 14, 15, 16,  7, 17, 14, 11,
+    14,  7, 18, 18, 11, 13,  3,  3, 11, 18, 15, 19, 18, 18, 18,  3,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10,  7, 10, 10, 10, 10, 10, 10, 10, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13,  7, 13, 13, 13, 13, 13, 13, 13, 13,
+    10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13,
+    10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13,
+    10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13,
+    10, 13, 10, 13, 10, 13, 10, 13, 13, 10, 13, 10, 13, 10, 13, 10,
+    13, 10, 13, 10, 13, 10, 13, 10, 13, 13, 10, 13, 10, 13, 10, 13,
+    10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13,
+    10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13,
+    10, 13, 10, 13, 10, 13, 10, 13, 10, 10, 13, 10, 13, 10, 13, 13,
+    13, 10, 10, 13, 10, 13, 10, 10, 13, 10, 10, 10, 13, 13, 10, 10,
+    10, 10, 13, 10, 10, 13, 10, 10, 10, 13, 13, 13, 10, 10, 13, 10,
+    10, 13, 10, 13, 10, 13, 10, 10, 13, 10, 13, 13, 10, 13, 10, 10,
+    13, 10, 10, 10, 13, 10, 13, 10, 10, 13, 13, 15, 10, 13, 13, 13,
+    15, 15, 15, 15, 10, 20, 13, 10, 20, 13, 10, 20, 13, 10, 13, 10,
+    13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 13, 10, 13,
+    10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13,
+    13, 10, 20, 13, 10, 13, 10, 10, 10, 13, 10, 13, 10, 13, 10, 13,
+    10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13,
+    10, 13, 10, 13, 13, 13, 13, 13, 13, 13, 10, 10, 13, 10, 10, 13,
+    13, 10, 13, 10, 10, 10, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 15, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 11, 11, 11, 11, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    21, 21, 21, 21, 21, 11, 11, 11, 11, 11, 11, 11, 21, 11, 21, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
+    22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
+    22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
+    10, 13, 10, 13, 21, 11, 10, 13,  0,  0, 21, 13, 13, 13,  3, 10,
+     0,  0,  0,  0, 11, 11, 10,  3, 10, 10, 10,  0, 10,  0, 10, 10,
+    13, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10,  0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 10,
+    13, 13, 10, 10, 10, 13, 13, 13, 10, 13, 10, 13, 10, 13, 10, 13,
+    10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13,
+    13, 13, 13, 13, 10, 13,  7, 10, 13, 10, 10, 13, 13, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    10, 13, 14, 22, 22, 22, 22, 22, 23, 23, 10, 13, 10, 13, 10, 13,
+    10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13,
+    10, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 13,
+    10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13,
+    10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13,
+     0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10,  0,  0, 21,  3,  3,  3,  3,  3,  3,
+    13, 13, 13, 13, 13, 13, 13, 13, 13,  3,  8,  0,  0, 14, 14,  4,
+     0, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
+    22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
+    22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,  8, 22,
+     3, 22, 22,  3, 22, 22,  3, 22,  0,  0,  0,  0,  0,  0,  0,  0,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,  0,  0,  0,  0, 15,
+    15, 15, 15,  3,  3,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    17, 17, 17, 17, 17, 17,  7,  7,  7,  3,  3,  4,  3,  3, 14, 14,
+    22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,  3, 17,  0,  3,  3,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    21, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 22, 22, 22, 22, 22,
+    22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  3,  3,  3,  3, 15, 15,
+    22, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15,  3, 15, 22, 22, 22, 22, 22, 22, 22, 17, 14, 22,
+    22, 22, 22, 22, 22, 21, 21, 22, 22, 14, 22, 22, 22, 22, 15, 15,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9, 15, 15, 15, 14, 14, 15,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  0, 17,
+    15, 22, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
+    22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,  0,  0, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
+    22, 15,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 22, 22, 22, 22, 22,
+    22, 22, 22, 22, 21, 21, 14,  3,  3,  3, 21,  0,  0, 22,  4,  4,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 22, 22, 22, 22, 21, 22, 22, 22, 22, 22,
+    22, 22, 22, 22, 21, 22, 22, 22, 21, 22, 22, 22, 22, 22,  0,  0,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  0,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 22, 22, 22,  0,  0,  3,  0,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15,  0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
+    22, 22, 17, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
+    22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
+    22, 22, 22, 24, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 22, 24, 22, 15, 24, 24,
+    24, 22, 22, 22, 22, 22, 22, 22, 22, 24, 24, 24, 24, 22, 24, 24,
+    15, 22, 22, 22, 22, 22, 22, 22, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 22, 22,  3,  3,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     3, 21, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 22, 24, 24,  0, 15, 15, 15, 15, 15, 15, 15, 15,  0,  0, 15,
+    15,  0,  0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15,  0, 15, 15, 15, 15, 15, 15,
+    15,  0, 15,  0,  0,  0, 15, 15, 15, 15,  0,  0, 22, 15, 24, 24,
+    24, 22, 22, 22, 22,  0,  0, 24, 24,  0,  0, 24, 24, 22, 15,  0,
+     0,  0,  0,  0,  0,  0,  0, 24,  0,  0,  0,  0, 15, 15,  0, 15,
+    15, 15, 22, 22,  0,  0,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+    15, 15,  4,  4, 18, 18, 18, 18, 18, 18, 14,  4, 15,  3, 22,  0,
+     0, 22, 22, 24,  0, 15, 15, 15, 15, 15, 15,  0,  0,  0,  0, 15,
+    15,  0,  0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15,  0, 15, 15, 15, 15, 15, 15,
+    15,  0, 15, 15,  0, 15, 15,  0, 15, 15,  0,  0, 22,  0, 24, 24,
+    24, 22, 22,  0,  0,  0,  0, 22, 22,  0,  0, 22, 22, 22,  0,  0,
+     0, 22,  0,  0,  0,  0,  0,  0,  0, 15, 15, 15, 15,  0, 15,  0,
+     0,  0,  0,  0,  0,  0,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+    22, 22, 15, 15, 15, 22,  3,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0, 22, 22, 24,  0, 15, 15, 15, 15, 15, 15, 15, 15, 15,  0, 15,
+    15, 15,  0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15,  0, 15, 15, 15, 15, 15, 15,
+    15,  0, 15, 15,  0, 15, 15, 15, 15, 15,  0,  0, 22, 15, 24, 24,
+    24, 22, 22, 22, 22, 22,  0, 22, 22, 24,  0, 24, 24, 22,  0,  0,
+    15,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    15, 15, 22, 22,  0,  0,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     3,  4,  0,  0,  0,  0,  0,  0,  0, 15, 22, 22, 22, 22, 22, 22,
+     0, 22, 24, 24,  0, 15, 15, 15, 15, 15, 15, 15, 15,  0,  0, 15,
+    15,  0,  0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15,  0, 15, 15, 15, 15, 15, 15,
+    15,  0, 15, 15,  0, 15, 15, 15, 15, 15,  0,  0, 22, 15, 24, 22,
+    24, 22, 22, 22, 22,  0,  0, 24, 24,  0,  0, 24, 24, 22,  0,  0,
+     0,  0,  0,  0,  0, 22, 22, 24,  0,  0,  0,  0, 15, 15,  0, 15,
+    15, 15, 22, 22,  0,  0,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+    14, 15, 18, 18, 18, 18, 18, 18,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0, 22, 15,  0, 15, 15, 15, 15, 15, 15,  0,  0,  0, 15, 15,
+    15,  0, 15, 15, 15, 15,  0,  0,  0, 15, 15,  0, 15,  0, 15, 15,
+     0,  0,  0, 15, 15,  0,  0,  0, 15, 15, 15,  0,  0,  0, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15,  0,  0,  0,  0, 24, 24,
+    22, 24, 24,  0,  0,  0, 24, 24, 24,  0, 24, 24, 24, 22,  0,  0,
+    15,  0,  0,  0,  0,  0,  0, 24,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+    18, 18, 18, 14, 14, 14, 14, 14, 14,  4, 14,  0,  0,  0,  0,  0,
+    22, 24, 24, 24, 22, 15, 15, 15, 15, 15, 15, 15, 15,  0, 15, 15,
+    15,  0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15,  0, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15,  0,  0,  0, 15, 22, 22,
+    22, 24, 24, 24, 24,  0, 22, 22, 22,  0, 22, 22, 22, 22,  0,  0,
+     0,  0,  0,  0,  0, 22, 22,  0, 15, 15, 15,  0,  0,  0,  0,  0,
+    15, 15, 22, 22,  0,  0,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     0,  0,  0,  0,  0,  0,  0,  3, 18, 18, 18, 18, 18, 18, 18, 14,
+    15, 22, 24, 24,  3, 15, 15, 15, 15, 15, 15, 15, 15,  0, 15, 15,
+    15,  0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15,  0, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15,  0, 15, 15, 15, 15, 15,  0,  0, 22, 15, 24, 22,
+    24, 24, 24, 24, 24,  0, 22, 24, 24,  0, 24, 24, 22, 22,  0,  0,
+     0,  0,  0,  0,  0, 24, 24,  0,  0,  0,  0,  0,  0,  0, 15,  0,
+    15, 15, 22, 22,  0,  0,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     0, 15, 15,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    22, 22, 24, 24, 15, 15, 15, 15, 15, 15, 15, 15, 15,  0, 15, 15,
+    15,  0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 22, 22, 15, 24, 24,
+    24, 22, 22, 22, 22,  0, 24, 24, 24,  0, 24, 24, 24, 22, 15, 14,
+     0,  0,  0,  0, 15, 15, 15, 24, 18, 18, 18, 18, 18, 18, 18, 15,
+    15, 15, 22, 22,  0,  0,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 14, 15, 15, 15, 15, 15, 15,
+     0, 22, 24, 24,  0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15,  0,  0,  0, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15,  0, 15, 15, 15, 15, 15, 15, 15, 15, 15,  0, 15,  0,  0,
+    15, 15, 15, 15, 15, 15, 15,  0,  0,  0, 22,  0,  0,  0,  0, 24,
+    24, 24, 22, 22, 22,  0, 22,  0, 24, 24, 24, 24, 24, 24, 24, 24,
+     0,  0,  0,  0,  0,  0,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     0,  0, 24, 24,  3,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 22, 15, 15, 22, 22, 22, 22, 22, 22, 22,  0,  0,  0,  0,  4,
+    15, 15, 15, 15, 15, 15, 21, 22, 22, 22, 22, 22, 22, 22, 22,  3,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  3,  3,  0,  0,  0,  0,
+     0, 15, 15,  0, 15,  0, 15, 15, 15, 15, 15,  0, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15,  0, 15,  0, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 22, 15, 15, 22, 22, 22, 22, 22, 22, 22, 22, 22, 15,  0,  0,
+    15, 15, 15, 15, 15,  0, 21,  0, 22, 22, 22, 22, 22, 22,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0, 15, 15, 15, 15,
+    15, 14, 14, 14,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+     3,  3,  3, 14,  3, 14, 14, 14, 22, 22, 14, 14, 14, 14, 14, 14,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 14, 22, 14, 22, 14, 22,  5,  6,  5,  6, 24, 24,
+    15, 15, 15, 15, 15, 15, 15, 15,  0, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,  0,  0,  0,
+     0, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 24,
+    22, 22, 22, 22, 22,  3, 22, 22, 15, 15, 15, 15, 15, 22, 22, 22,
+    22, 22, 22, 22, 22, 22, 22, 22,  0, 22, 22, 22, 22, 22, 22, 22,
+    22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
+    22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,  0, 14, 14,
+    14, 14, 14, 14, 14, 14, 22, 14, 14, 14, 14, 14, 14,  0, 14, 14,
+     3,  3,  3,  3,  3, 14, 14, 14, 14,  3,  3,  0,  0,  0,  0,  0,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 24, 24, 22, 22, 22,
+    22, 24, 22, 22, 22, 22, 22, 22, 24, 22, 22, 24, 24, 22, 22, 15,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  3,  3,  3,  3,  3,  3,
+    15, 15, 15, 15, 15, 15, 24, 24, 22, 22, 15, 15, 15, 15, 22, 22,
+    22, 15, 24, 24, 24, 15, 15, 24, 24, 24, 24, 24, 24, 24, 15, 15,
+    15, 22, 22, 22, 22, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 22, 24, 24, 22, 22, 24, 24, 24, 24, 24, 24, 22, 15, 24,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9, 24, 24, 24, 22, 14, 14,
+    10, 10, 10, 10, 10, 10,  0, 10,  0,  0,  0,  0,  0, 10,  0,  0,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,  3, 21, 13, 13, 13,
+    15, 15, 15, 15, 15, 15, 15, 15, 15,  0, 15, 15, 15, 15,  0,  0,
+    15, 15, 15, 15, 15, 15, 15,  0, 15,  0, 15, 15, 15, 15,  0,  0,
+    15, 15, 15, 15, 15, 15, 15, 15, 15,  0, 15, 15, 15, 15,  0,  0,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15,  0, 15, 15, 15, 15,  0,  0, 15, 15, 15, 15, 15, 15, 15,  0,
+    15,  0, 15, 15, 15, 15,  0,  0, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15,  0, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15,  0, 15, 15, 15, 15,  0,  0, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,  0,  0, 22, 22, 22,
+     3,  3,  3,  3,  3,  3,  3,  3,  3, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,  0,  0,  0,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14,  0,  0,  0,  0,  0,  0,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10,  0,  0, 13, 13, 13, 13, 13, 13,  0,  0,
+     8, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 14,  3, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+     2, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,  5,  6,  0,  0,  0,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,  3,  3,  3, 25, 25,
+    25, 15, 15, 15, 15, 15, 15, 15, 15,  0,  0,  0,  0,  0,  0,  0,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,  0, 15, 15,
+    15, 15, 22, 22, 22,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 22, 22, 22,  3,  3,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 22, 22,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,  0, 15, 15,
+    15,  0, 22, 22,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 22, 22, 24, 22, 22, 22, 22, 22, 22, 22, 24, 24,
+    24, 24, 24, 24, 24, 24, 22, 24, 24, 22, 22, 22, 22, 22, 22, 22,
+    22, 22, 22, 22,  3,  3,  3, 21,  3,  3,  3,  4, 15, 22,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,  0,  0,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18,  0,  0,  0,  0,  0,  0,
+     3,  3,  3,  3,  3,  3,  8,  3,  3,  3,  3, 22, 22, 22, 17,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,  0,  0,
+    15, 15, 15, 21, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15,  0,  0,  0,  0,  0,  0,  0,
+    15, 15, 15, 15, 15, 22, 22, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 22, 15,  0,  0,  0,  0,  0,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,  0,
+    22, 22, 22, 24, 24, 24, 24, 22, 22, 24, 24, 24,  0,  0,  0,  0,
+    24, 24, 22, 24, 24, 24, 24, 24, 24, 22, 22, 22,  0,  0,  0,  0,
+    14,  0,  0,  0,  3,  3,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,  0,  0,
+    15, 15, 15, 15, 15,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,  0,  0,  0,  0,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15,  0,  0,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9, 18,  0,  0,  0, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 22, 22, 24, 24, 22,  0,  0,  3,  3,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 24, 22, 24, 22, 22, 22, 22, 22, 22, 22,  0,
+    22, 24, 22, 24, 24, 22, 22, 22, 22, 22, 22, 22, 22, 24, 24, 24,
+    24, 24, 24, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,  0,  0, 22,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,  0,  0,
+     3,  3,  3,  3,  3,  3,  3, 21,  3,  3,  3,  3,  3,  3,  0,  0,
+    22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 23, 22,
+    22,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    22, 22, 22, 22, 24, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 22, 24, 22, 22, 22, 22, 22, 24, 22, 24, 24, 24,
+    24, 24, 22, 24, 24, 15, 15, 15, 15, 15, 15, 15,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  3,  3,  3,  3,  3,  3,
+     3, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 22, 22, 22, 22, 22,
+    22, 22, 22, 22, 14, 14, 14, 14, 14, 14, 14, 14, 14,  0,  0,  0,
+    22, 22, 24, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 24, 22, 22, 22, 22, 24, 24, 22, 22, 24, 22, 22, 22, 15, 15,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 22, 24, 22, 22, 24, 24, 24, 22, 24, 22,
+    22, 22, 24, 24,  0,  0,  0,  0,  0,  0,  0,  0,  3,  3,  3,  3,
+    15, 15, 15, 15, 24, 24, 24, 24, 24, 24, 24, 24, 22, 22, 22, 22,
+    22, 22, 22, 22, 24, 24, 22, 22,  0,  0,  0,  3,  3,  3,  3,  3,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0, 15, 15, 15,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 21, 21, 21, 21, 21, 21,  3,  3,
+    13, 13, 13, 13, 13, 13, 13, 13, 13,  0,  0,  0,  0,  0,  0,  0,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,  0,  0, 10, 10, 10,
+     3,  3,  3,  3,  3,  3,  3,  3,  0,  0,  0,  0,  0,  0,  0,  0,
+    22, 22, 22,  3, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
+    22, 24, 22, 22, 22, 22, 22, 22, 22, 15, 15, 15, 15, 22, 15, 15,
+    15, 15, 15, 15, 22, 15, 15, 24, 22, 22, 15,  0,  0,  0,  0,  0,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 21, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 21, 21, 21, 21, 21,
+    22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
+    22, 22, 22, 22, 22, 22, 22, 22, 22, 22,  0, 22, 22, 22, 22, 22,
+    10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13,
+    10, 13, 10, 13, 10, 13, 13, 13, 13, 13, 13, 13, 13, 13, 10, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 10, 10, 10, 10, 10, 10, 10, 10,
+    13, 13, 13, 13, 13, 13,  0,  0, 10, 10, 10, 10, 10, 10,  0,  0,
+    13, 13, 13, 13, 13, 13, 13, 13, 10, 10, 10, 10, 10, 10, 10, 10,
+    13, 13, 13, 13, 13, 13, 13, 13, 10, 10, 10, 10, 10, 10, 10, 10,
+    13, 13, 13, 13, 13, 13,  0,  0, 10, 10, 10, 10, 10, 10,  0,  0,
+    13, 13, 13, 13, 13, 13, 13, 13,  0, 10,  0, 10,  0, 10,  0, 10,
+    13, 13, 13, 13, 13, 13, 13, 13, 10, 10, 10, 10, 10, 10, 10, 10,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,  0,  0,
+    13, 13, 13, 13, 13, 13, 13, 13, 20, 20, 20, 20, 20, 20, 20, 20,
+    13, 13, 13, 13, 13, 13, 13, 13, 20, 20, 20, 20, 20, 20, 20, 20,
+    13, 13, 13, 13, 13, 13, 13, 13, 20, 20, 20, 20, 20, 20, 20, 20,
+    13, 13, 13, 13, 13,  0, 13, 13, 10, 10, 10, 10, 20, 11, 13, 11,
+    11, 11, 13, 13, 13,  0, 13, 13, 10, 10, 10, 10, 20, 11, 11, 11,
+    13, 13, 13, 13,  0,  0, 13, 13, 10, 10, 10, 10,  0, 11, 11, 11,
+    13, 13, 13, 13, 13, 13, 13, 13, 10, 10, 10, 10, 10, 11, 11, 11,
+     0,  0, 13, 13, 13,  0, 13, 13, 10, 10, 10, 10, 20, 11, 11,  0,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2, 17, 17, 17, 17, 17,
+     8,  8,  8,  8,  8,  8,  3,  3, 16, 19,  5, 16, 16, 19,  5, 16,
+     3,  3,  3,  3,  3,  3,  3,  3, 26, 27, 17, 17, 17, 17, 17,  2,
+     3,  3,  3,  3,  3,  3,  3,  3,  3, 16, 19,  3,  3,  3,  3, 12,
+    12,  3,  3,  3,  7,  5,  6,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+     3,  3,  7,  3, 12,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  2,
+    17, 17, 17, 17, 17,  0, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+    18, 21,  0,  0, 18, 18, 18, 18, 18, 18,  7,  7,  7,  5,  6, 21,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18,  7,  7,  7,  5,  6,  0,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,  0,  0,  0,
+     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
+     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 23, 23, 23,
+    23, 22, 23, 23, 23, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
+    22,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    14, 14, 10, 14, 14, 14, 14, 10, 14, 14, 13, 10, 10, 10, 13, 13,
+    10, 10, 10, 13, 14, 10, 14, 14,  7, 10, 10, 10, 10, 10, 14, 14,
+    14, 14, 14, 14, 10, 14, 10, 14, 10, 14, 10, 10, 10, 10, 14, 13,
+    10, 10, 10, 10, 13, 15, 15, 15, 15, 13, 14, 14, 13, 13, 10, 10,
+     7,  7,  7,  7,  7, 10, 13, 13, 13, 13, 14,  7, 14, 14, 13, 14,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+    25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+    25, 25, 25, 10, 13, 25, 25, 25, 25, 18, 14, 14,  0,  0,  0,  0,
+     7,  7,  7,  7,  7, 14, 14, 14, 14, 14,  7,  7, 14, 14, 14, 14,
+     7, 14, 14,  7, 14, 14,  7, 14, 14, 14, 14, 14, 14, 14,  7, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,  7,  7,
+    14, 14,  7, 14,  7, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+    14, 14, 14, 14, 14, 14, 14, 14,  5,  6,  5,  6, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+     7,  7, 14, 14, 14, 14, 14, 14, 14,  5,  6, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,  7, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,  7,  7,  7,  7,  7,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     7,  7,  7,  7, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,  7,  7,  7,  7,
+     7,  7, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14,  7, 14, 14, 14, 14, 14, 14, 14, 14,
+    14,  7, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14,  7,  7,  7,  7,  7,  7,  7,  7,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,  7,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14,  5,  6,  5,  6,  5,  6,  5,  6,
+     5,  6,  5,  6,  5,  6, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+     7,  7,  7,  7,  7,  5,  6,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     7,  7,  7,  7,  7,  7,  5,  6,  5,  6,  5,  6,  5,  6,  5,  6,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     7,  7,  7,  5,  6,  5,  6,  5,  6,  5,  6,  5,  6,  5,  6,  5,
+     6,  5,  6,  5,  6,  5,  6,  5,  6,  7,  7,  7,  7,  7,  7,  7,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     7,  7,  7,  7,  7,  7,  7,  7,  5,  6,  5,  6,  7,  7,  7,  7,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  5,  6,  7,  7,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     7,  7,  7,  7,  7, 14, 14,  7,  7,  7,  7,  7,  7, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14,  0,  0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14,  0, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,  0,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,  0,
+    10, 13, 10, 10, 10, 13, 13, 10, 13, 10, 13, 10, 13, 10, 10, 10,
+    10, 13, 10, 13, 13, 10, 13, 13, 13, 13, 13, 13, 21, 21, 10, 10,
+    10, 13, 10, 13, 13, 14, 14, 14, 14, 14, 14, 10, 13, 10, 13, 22,
+    22, 22, 10, 13,  0,  0,  0,  0,  0,  3,  3,  3,  3, 18,  3,  3,
+    13, 13, 13, 13, 13, 13,  0, 13,  0,  0,  0,  0,  0, 13,  0,  0,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15,  0,  0,  0,  0,  0,  0,  0, 21,
+     3,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 22,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    15, 15, 15, 15, 15, 15, 15,  0, 15, 15, 15, 15, 15, 15, 15,  0,
+    15, 15, 15, 15, 15, 15, 15,  0, 15, 15, 15, 15, 15, 15, 15,  0,
+     3,  3, 16, 19, 16, 19,  3,  3,  3, 16, 19,  3, 16, 19,  3,  3,
+     3,  3,  3,  3,  3,  3,  3,  8,  3,  3,  8,  3, 16, 19,  3,  3,
+    16, 19,  5,  6,  5,  6,  5,  6,  5,  6,  3,  3,  3,  3,  3, 21,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  8,  8,  3,  3,  3,  3,
+     8,  3,  5,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+    14, 14,  3,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14,  0, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,  0,  0,  0,  0,
+     2,  3,  3,  3, 14, 21, 15, 25,  5,  6,  5,  6,  5,  6,  5,  6,
+     5,  6, 14, 14,  5,  6,  5,  6,  5,  6,  5,  6,  8,  5,  6,  6,
+    14, 25, 25, 25, 25, 25, 25, 25, 25, 25, 22, 22, 22, 22, 24, 24,
+     8, 21, 21, 21, 21, 21, 14, 14, 25, 25, 25, 21, 15,  3, 14, 14,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15,  0,  0, 22, 22, 11, 11, 21, 21, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,  3, 21, 21, 21, 15,
+     0,  0,  0,  0,  0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+     0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,  0,
+    14, 14, 18, 18, 18, 18, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,  0,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 18, 18, 18, 18, 18, 18, 18, 18,
+    14, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,  0,  0,  0,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 21, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,  0,  0,  0,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 21,  3,  3,  3,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9, 15, 15,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 15, 22,
+    23, 23, 23,  3, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,  3, 21,
+    10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13,
+    10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 21, 21, 22, 22,
+    15, 15, 15, 15, 15, 15, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+    22, 22,  3,  3,  3,  3,  3,  3,  0,  0,  0,  0,  0,  0,  0,  0,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    11, 11, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13,
+    13, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13,
+    10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13,
+    21, 13, 13, 13, 13, 13, 13, 13, 13, 10, 13, 10, 13, 10, 10, 13,
+    10, 13, 10, 13, 10, 13, 10, 13, 21, 11, 11, 10, 13, 10, 13, 15,
+    10, 13, 10, 13, 13, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13,
+    10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 10, 10, 10, 10, 13,
+    10, 10, 10, 10, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13,
+     0,  0, 10, 13, 10, 10, 10, 10, 13, 10, 13,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0, 10, 13, 15, 21, 21, 13, 15, 15, 15, 15, 15,
+    15, 15, 22, 15, 15, 15, 22, 15, 15, 15, 15, 22, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 24, 24, 22, 22, 24, 14, 14, 14, 14, 22,  0,  0,  0,
+    18, 18, 18, 18, 18, 18, 14, 14,  4, 14,  0,  0,  0,  0,  0,  0,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15,  3,  3,  3,  3,  0,  0,  0,  0,  0,  0,  0,  0,
+    24, 24, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
+    24, 24, 24, 24, 22, 22,  0,  0,  0,  0,  0,  0,  0,  0,  3,  3,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,  0,  0,
+    22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
+    22, 22, 15, 15, 15, 15, 15, 15,  3,  3,  3, 15,  3, 15, 15, 22,
+    15, 15, 15, 15, 15, 15, 22, 22, 22, 22, 22, 22, 22, 22,  3,  3,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 22, 22, 22, 22, 22, 22, 22, 22, 22,
+    22, 22, 24, 24,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  3,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 22, 24, 24, 22, 22, 22, 22, 24, 24, 22, 22, 24, 24,
+    24,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  0, 21,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,  3,  3,
+    15, 15, 15, 15, 15, 22, 21, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9, 15, 15, 15, 15, 15,  0,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 22, 22, 22, 22, 22, 22, 24,
+    24, 22, 22, 24, 24, 22, 22,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    15, 15, 15, 22, 15, 15, 15, 15, 15, 15, 15, 15, 22, 24,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  3,  3,  3,  3,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    21, 15, 15, 15, 15, 15, 15, 14, 14, 14, 15, 24, 22, 24, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    22, 15, 22, 22, 22, 15, 15, 22, 22, 15, 15, 15, 15, 15, 22, 22,
+    15, 22, 15,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 15, 15, 21,  3,  3,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 24, 22, 22, 24, 24,
+     3,  3, 15, 21, 21, 24, 22,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0, 15, 15, 15, 15, 15, 15,  0,  0, 15, 15, 15, 15, 15, 15,  0,
+     0, 15, 15, 15, 15, 15, 15,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    15, 15, 15, 15, 15, 15, 15,  0, 15, 15, 15, 15, 15, 15, 15,  0,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 11, 21, 21, 21, 21,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 21, 11, 11,  0,  0,  0,  0,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    15, 15, 15, 24, 24, 22, 24, 24, 22, 24, 24,  3, 24, 22,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,  0,  0,
+    15, 15, 15, 15,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15,  0,  0,  0,  0, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,  0,  0,  0,  0,
+    28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,
+    28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,
+    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
+    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,  0,  0,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15,  0,  0,  0,  0,  0,  0,
+    13, 13, 13, 13, 13, 13, 13,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0, 13, 13, 13, 13, 13,  0,  0,  0,  0,  0, 15, 22, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15,  7, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15,  0, 15, 15, 15, 15, 15,  0, 15,  0,
+    15, 15,  0, 15, 15,  0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,  6,  5,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+     0,  0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,  4, 14,  0,  0,
+    22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
+     3,  3,  3,  3,  3,  3,  3,  5,  6,  3,  0,  0,  0,  0,  0,  0,
+    22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
+     3,  8,  8, 12, 12,  5,  6,  5,  6,  5,  6,  5,  6,  5,  6,  5,
+     6,  5,  6,  5,  6,  3,  3,  5,  6,  3,  3,  3,  3, 12, 12, 12,
+     3,  3,  3,  0,  3,  3,  3,  3,  8,  5,  6,  5,  6,  5,  6,  3,
+     3,  3,  7,  8,  7,  7,  7,  0,  3,  4,  3,  3,  0,  0,  0,  0,
+    15, 15, 15, 15, 15,  0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,  0,  0, 17,
+     0,  3,  3,  3,  4,  3,  3,  3,  5,  6,  3,  7,  3,  8,  3,  3,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  3,  3,  7,  7,  7,  3,
+    11, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,  5,  7,  6,  7,  5,
+     6,  3,  5,  6,  3,  3, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    21, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 21, 21,
+     0,  0, 15, 15, 15, 15, 15, 15,  0,  0, 15, 15, 15, 15, 15, 15,
+     0,  0, 15, 15, 15, 15, 15, 15,  0,  0, 15, 15, 15,  0,  0,  0,
+     4,  4,  7, 11, 14,  4,  4,  0, 14,  7,  7,  7,  7, 14, 14,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0, 17, 17, 17, 14, 14,  0,  0,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,  0, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15,  0, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,  0, 15, 15,  0, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,  0,  0,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,  0,  0,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,  0,  0,  0,  0,  0,
+     3,  3,  3,  0,  0,  0,  0, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18,  0,  0,  0, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+    25, 25, 25, 25, 25, 18, 18, 18, 18, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 18, 18, 14, 14, 14,  0,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,  0,  0,  0,
+    14,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 22,  0,  0,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    22, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,  0,  0,  0,  0,
+    18, 18, 18, 18,  0,  0,  0,  0,  0,  0,  0,  0,  0, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 25, 15, 15, 15, 15, 15, 15, 15, 15, 25,  0,  0,  0,  0,  0,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 22, 22, 22, 22, 22,  0,  0,  0,  0,  0,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,  0,  3,
+    15, 15, 15, 15,  0,  0,  0,  0, 15, 15, 15, 15, 15, 15, 15, 15,
+     3, 25, 25, 25, 25, 25,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    10, 10, 10, 10, 10, 10, 10, 10, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,  0,  0,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10,  0,  0,  0,  0, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,  0,  0,  0,  0,
+    15, 15, 15, 15, 15, 15, 15, 15,  0,  0,  0,  0,  0,  0,  0,  0,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  3,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    15, 15, 15, 15, 15, 15,  0,  0, 15,  0, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15,  0, 15, 15,  0,  0,  0, 15,  0,  0, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15,  0,  3, 18, 18, 18, 18, 18, 18, 18, 18,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 14, 14, 18, 18, 18, 18, 18, 18, 18,
+     0,  0,  0,  0,  0,  0,  0, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15,  0, 15, 15,  0,  0,  0,  0,  0, 18, 18, 18, 18, 18,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 18, 18, 18, 18, 18, 18,  0,  0,  0,  3,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15,  0,  0,  0,  0,  0,  3,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15,  0,  0,  0,  0, 18, 18, 15, 15,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+     0,  0, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    15, 22, 22, 22,  0, 22, 22,  0,  0,  0,  0,  0, 22, 22, 22, 22,
+    15, 15, 15, 15,  0, 15, 15, 15,  0, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15,  0,  0, 22, 22, 22,  0,  0,  0,  0, 22,
+    18, 18, 18, 18, 18, 18, 18, 18, 18,  0,  0,  0,  0,  0,  0,  0,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  0,  0,  0,  0,  0,  0,  0,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 18, 18,  3,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 18, 18, 18,
+    15, 15, 15, 15, 15, 15, 15, 15, 14, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 22, 22,  0,  0,  0,  0, 18, 18, 18, 18, 18,
+     3,  3,  3,  3,  3,  3,  3,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15,  0,  0,  0,  3,  3,  3,  3,  3,  3,  3,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15,  0,  0, 18, 18, 18, 18, 18, 18, 18, 18,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15,  0,  0,  0,  0,  0, 18, 18, 18, 18, 18, 18, 18, 18,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15,  0,  0,  0,  0,  0,  0,  0,  3,  3,  3,  3,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0, 18, 18, 18, 18, 18, 18, 18,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    15, 15, 15, 15, 15, 15, 15, 15, 15,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13,  0,  0,  0,  0,  0,  0,  0, 18, 18, 18, 18, 18, 18,
+    15, 15, 15, 15, 22, 22, 22, 22,  0,  0,  0,  0,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,  0,  0,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,  0,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15,  0, 22, 22,  8,  0,  0,
+    15, 15,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    18, 18, 18, 18, 18, 18, 18, 15,  0,  0,  0,  0,  0,  0,  0,  0,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
+    22, 18, 18, 18, 18,  3,  3,  3,  3,  3,  0,  0,  0,  0,  0,  0,
+    15, 15, 15, 15, 15, 18, 18, 18, 18, 18, 18, 18,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    24, 22, 24, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 22, 22, 22, 22, 22, 22, 22, 22,
+    22, 22, 22, 22, 22, 22, 22,  3,  3,  3,  3,  3,  3,  3,  0,  0,
+     0,  0, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 22,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    24, 24, 24, 22, 22, 22, 22, 24, 24, 22, 22,  3,  3, 17,  3,  3,
+     3,  3,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 17,  0,  0,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15,  0,  0,  0,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,  0,  0,
+    22, 22, 22, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 22, 22, 22, 22, 22, 24, 22, 22, 22,
+    22, 22, 22, 22, 22,  0,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     3,  3,  3,  3, 15, 24, 24, 15,  0,  0,  0,  0,  0,  0,  0,  0,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 22,  3,  3, 15,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 24, 24, 24, 22, 22, 22, 22, 22, 22, 22, 22, 22, 24,
+    24, 15, 15, 15, 15,  3,  3,  3,  3, 22, 22, 22, 22,  3, 24, 22,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9, 15,  3, 15,  3,  3,  3,
+     0, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15,  0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 24, 24, 24, 22,
+    22, 22, 24, 24, 22, 24, 22, 22,  3,  3,  3,  3,  3,  3, 22,  0,
+    15, 15, 15, 15, 15, 15, 15,  0, 15,  0, 15, 15, 15, 15,  0, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,  0, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15,  3,  0,  0,  0,  0,  0,  0,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 22,
+    24, 24, 24, 22, 22, 22, 22, 22, 22, 22, 22,  0,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,  0,  0,
+    22, 22, 24, 24,  0, 15, 15, 15, 15, 15, 15, 15, 15,  0,  0, 15,
+    15,  0,  0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15,  0, 15, 15, 15, 15, 15, 15,
+    15,  0, 15, 15,  0, 15, 15, 15, 15, 15,  0, 22, 22, 15, 24, 24,
+    22, 24, 24, 24, 24,  0,  0, 24, 24,  0,  0, 24, 24, 24,  0,  0,
+    15,  0,  0,  0,  0,  0,  0, 24,  0,  0,  0,  0,  0, 15, 15, 15,
+    15, 15, 24, 24,  0,  0, 22, 22, 22, 22, 22, 22, 22,  0,  0,  0,
+    22, 22, 22, 22, 22,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 24, 24, 24, 22, 22, 22, 22, 22, 22, 22, 22,
+    24, 24, 22, 22, 22, 24, 22, 15, 15, 15, 15,  3,  3,  3,  3,  3,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  3,  3,  0,  3, 22, 15,
+    15, 15,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    24, 24, 24, 22, 22, 22, 22, 22, 22, 24, 22, 24, 24, 24, 24, 22,
+    22, 24, 22, 22, 15, 15,  3, 15,  0,  0,  0,  0,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,  0,  0,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 24,
+    24, 24, 22, 22, 22, 22,  0,  0, 24, 24, 24, 24, 22, 22, 24, 22,
+    22,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+     3,  3,  3,  3,  3,  3,  3,  3, 15, 15, 15, 15, 22, 22,  0,  0,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    24, 24, 24, 22, 22, 22, 22, 22, 22, 22, 22, 24, 24, 22, 24, 22,
+    22,  3,  3,  3, 15,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,  0,  0,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 22, 24, 22, 24, 24,
+    22, 22, 22, 22, 22, 22, 24, 22, 15,  0,  0,  0,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    24, 24, 22, 22, 22, 22, 24, 22, 22, 22, 22, 22,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9, 18, 18,  3,  3,  3, 14,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 24, 24, 24, 22,
+    22, 22, 22, 22, 22, 22, 22, 22, 24, 22, 22,  3,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9, 18, 18, 18, 18, 18, 18,
+    18, 18, 18,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 15,
+    15, 15, 15, 15, 15, 15, 15,  0,  0, 15,  0,  0, 15, 15, 15, 15,
+    15, 15, 15, 15,  0, 15, 15,  0, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    24, 24, 24, 24, 24, 24,  0, 24, 24,  0,  0, 22, 22, 24, 22, 15,
+    24, 15, 24, 22,  3,  3,  3,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,  0,  0,
+    15, 15, 15, 15, 15, 15, 15, 15,  0,  0, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 24, 24, 24, 22, 22, 22, 22,  0,  0, 22, 22, 24, 24, 24, 24,
+    22, 15,  3, 15, 24,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    15, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 22, 22, 22, 22, 22, 22, 24, 15, 22, 22, 22, 22,  3,
+     3,  3,  3,  3,  3,  3,  3, 22,  0,  0,  0,  0,  0,  0,  0,  0,
+    15, 22, 22, 22, 22, 22, 22, 24, 24, 22, 22, 22, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 22, 22, 22, 22, 22, 22,
+    22, 22, 22, 22, 22, 22, 22, 24, 22, 22,  3,  3,  3, 15,  3,  3,
+     3,  3,  3,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    15, 15, 15, 15, 15, 15, 15, 15, 15,  0, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 24,
+    22, 22, 22, 22, 22, 22, 22,  0, 22, 22, 22, 22, 22, 22, 24, 22,
+    15,  3,  3,  3,  3,  3,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,  0,  0,  0,
+     3,  3, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+     0,  0, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
+    22, 22, 22, 22, 22, 22, 22, 22,  0, 24, 22, 22, 22, 22, 22, 22,
+    22, 24, 22, 22, 24, 22, 22,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    15, 15, 15, 15, 15, 15, 15,  0, 15, 15,  0, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 22, 22, 22, 22, 22, 22,  0,  0,  0, 22,  0, 22, 22,  0, 22,
+    22, 22, 22, 22, 22, 22, 15, 22,  0,  0,  0,  0,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,  0,  0,
+    15, 15, 15, 15, 15, 15,  0, 15, 15,  0, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 24, 24, 24, 24, 24,  0,
+    22, 22,  0, 24, 24, 22, 24, 22, 15,  0,  0,  0,  0,  0,  0,  0,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 22, 22, 24, 24,  3,  3,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    15,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 14, 14, 14, 14, 14, 14, 14, 14,  4,  4,  4,
+     4, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  3,
+    25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,  0,
+     3,  3,  3,  3,  3,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    15, 15, 15, 15,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,  0,
+    17, 17, 17, 17, 17, 17, 17, 17, 17,  0,  0,  0,  0,  0,  0,  0,
+    15, 15, 15, 15, 15, 15, 15,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,  3,  3,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,  0,  0,
+    22, 22, 22, 22, 22,  3,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    22, 22, 22, 22, 22, 22, 22,  3,  3,  3,  3,  3, 14, 14, 14, 14,
+    21, 21, 21, 21,  3, 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0, 18, 18, 18, 18, 18,
+    18, 18,  0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15,  0,  0,  0,  0,  0, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18,  3,  3,  3,  3,  0,  0,  0,  0,  0,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,  0,  0,  0,  0, 22,
+    15, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
+    24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
+    24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
+    24, 24, 24, 24, 24, 24, 24, 24,  0,  0,  0,  0,  0,  0,  0, 22,
+    22, 22, 22, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21,  3, 21, 22,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    24, 24,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    15, 15, 15,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0, 15, 15, 15, 15,  0,  0,  0,  0,  0,  0,  0,  0,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,  0,  0,  0,  0,  0,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,  0,  0,  0,
+    15, 15, 15, 15, 15, 15, 15, 15, 15,  0,  0,  0,  0,  0,  0,  0,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15,  0,  0, 14, 22, 22,  3,
+    17, 17, 17, 17,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    14, 14, 14, 14, 14, 14, 14,  0,  0, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 24, 24, 22, 22, 22, 14, 14, 14, 24, 24, 24,
+    24, 24, 24, 17, 17, 17, 17, 17, 17, 17, 17, 22, 22, 22, 22, 22,
+    22, 22, 22, 14, 14, 22, 22, 22, 22, 22, 22, 22, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 22, 22, 22, 22, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    14, 14, 22, 22, 22, 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18,  0,  0,  0,  0,  0,  0,  0,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 13, 13,
+    13, 13, 13, 13, 13,  0, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 10,  0, 10, 10,
+     0,  0, 10,  0,  0, 10, 10,  0,  0, 10, 10, 10, 10,  0, 10, 10,
+    10, 10, 10, 10, 10, 10, 13, 13, 13, 13,  0, 13,  0, 13, 13, 13,
+    13, 13, 13, 13,  0, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 10, 10,  0, 10, 10, 10, 10,  0,  0, 10, 10, 10,
+    10, 10, 10, 10, 10,  0, 10, 10, 10, 10, 10, 10, 10,  0, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 10, 10,  0, 10, 10, 10, 10,  0,
+    10, 10, 10, 10, 10,  0, 10,  0,  0,  0, 10, 10, 10, 10, 10, 10,
+    10,  0, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    10, 10, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    13, 13, 13, 13, 13, 13,  0,  0, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10,  7, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,  7, 13, 13, 13, 13,
+    13, 13, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,  7, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13,  7, 13, 13, 13, 13, 13, 13, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10,  7, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,  7,
+    13, 13, 13, 13, 13, 13, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,  7,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13,  7, 13, 13, 13, 13, 13, 13,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10,  7, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13,  7, 13, 13, 13, 13, 13, 13, 10, 13,  0,  0,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+    22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
+    22, 22, 22, 22, 22, 22, 22, 14, 14, 14, 14, 22, 22, 22, 22, 22,
+    22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 14, 14, 14,
+    14, 14, 14, 14, 14, 22, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 22, 14, 14,  3,  3,  3,  3,  3,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 22, 22, 22, 22, 22,
+     0, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    22, 22, 22, 22, 22, 22, 22,  0, 22, 22, 22, 22, 22, 22, 22, 22,
+    22, 22, 22, 22, 22, 22, 22, 22, 22,  0,  0, 22, 22, 22, 22, 22,
+    22, 22,  0, 22, 22,  0, 22, 22, 22, 22, 22,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,  0,  0,  0,
+    22, 22, 22, 22, 22, 22, 22, 21, 21, 21, 21, 21, 21, 21,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0, 15, 14,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 22, 22, 22, 22,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,  0,  4,
+    15, 15, 15, 15, 15,  0,  0, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    22, 22, 22, 22, 22, 22, 22,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    10, 10, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 22, 22, 22, 22, 22, 22, 22, 21,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,  3,  3,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 14, 18, 18, 18,
+     4, 18, 18, 18, 18,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 14, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,  0,  0,
+    15, 15, 15, 15,  0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+     0, 15, 15,  0, 15,  0,  0, 15,  0, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15,  0, 15, 15, 15, 15,  0, 15,  0, 15,  0,  0,  0,  0,
+     0,  0, 15,  0,  0,  0,  0, 15,  0, 15,  0, 15,  0, 15, 15, 15,
+     0, 15, 15,  0, 15,  0,  0, 15,  0, 15,  0, 15,  0, 15,  0, 15,
+     0, 15, 15,  0, 15,  0,  0, 15, 15, 15, 15,  0, 15, 15, 15, 15,
+    15, 15, 15,  0, 15, 15, 15, 15,  0, 15, 15, 15, 15,  0, 15,  0,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15,  0, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,  0,  0,  0,  0,
+     0, 15, 15, 15,  0, 15, 15, 15, 15, 15,  0, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     7,  7,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,  0,  0,  0,  0,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,  0,
+     0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+     0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+     0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,  0,  0,  0,  0,
+    14, 14, 14, 14, 14, 14, 14, 14, 14,  0,  0,  0,  0,  0,  0,  0,
+    14, 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    14, 14, 14, 14, 14, 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 11, 11, 11, 11, 11,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14,  0,  0,  0,  0,  0,  0,  0,  0,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,  0,  0,  0,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,  0,  0,  0,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14,  0,  0,  0,  0,  0,  0,  0,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    14, 14, 14, 14, 14, 14, 14, 14,  0,  0,  0,  0,  0,  0,  0,  0,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14,  0,  0,  0,  0,  0,  0,
+    14, 14, 14, 14, 14, 14, 14, 14,  0,  0,  0,  0,  0,  0,  0,  0,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,  0,  0,
+    14, 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14,  0, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,  0, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,  0,  0,
+    14, 14, 14, 14, 14,  0,  0,  0, 14, 14, 14,  0,  0,  0,  0,  0,
+    14, 14, 14, 14, 14, 14, 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14,  0,  0,  0,  0,  0,  0,  0,
+    14, 14, 14, 14, 14, 14, 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    14, 14, 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    14, 14, 14, 14, 14, 14, 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14,  0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,  0,  0,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    15, 15,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0, 17,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+    22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
+    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,  0,  0
+};
+
+RE_UINT32 re_get_general_category(RE_UINT32 codepoint) {
+    RE_UINT32 field_2;
+    RE_UINT32 field_1;
+    RE_UINT32 field_0;
+    RE_UINT32 v;
+
+    field_2 = codepoint >> 10;
+    field_1 = (codepoint >> 5) & 0x1F;
+    field_0 = codepoint & 0x1F;
+
+    v = re_general_category_table_1[field_2];
+    v = re_general_category_table_2[(v << 5) | field_1];
+    v = re_general_category_table_3[(v << 5) | field_0];
+
+    return v;
+}
+
+/* Graph. */
+static RE_UINT8 re_graph_table_1[] = {
+     0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 14, 13, 15, 16, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 17, 18, 18, 13, 13, 13, 13, 13, 13, 19, 20,
+    21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 18, 18, 13, 31, 18, 18,
+    18, 32, 18, 18, 18, 18, 18, 18, 18, 18, 33, 34, 13, 13, 13, 13,
+    13, 35, 13, 36, 18, 18, 18, 18, 18, 18, 18, 18, 37, 18, 18, 38,
+    18, 18, 18, 18, 39, 40, 41, 18, 42, 18, 43, 44, 45, 46, 47, 18,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 48, 13, 13, 13, 49, 50, 13,
+    13, 13, 13, 51, 13, 13, 13, 13, 13, 13, 52, 18, 18, 18, 53, 18,
+    13, 13, 13, 13, 54, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    55, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 56,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 56
+};
+
+static RE_UINT16 re_graph_table_2[] = {
+      0,   1,   2,   3,   0,   1,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
+      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   4,   5,   6,   2,   2,
+      2,   2,   2,   2,   2,   2,   2,   2,   2,   7,   8,   2,   9,   2,  10,  11,
+     12,   2,   2,   2,   2,   2,   2,   2,  13,   2,  14,   2,   2,  15,   2,  16,
+      2,  17,  18,  19,   0,  20,  21,   2,   2,   2,   2,   2,  22,  23,  24,  25,
+     26,  27,  28,  29,  30,  31,  32,  33,  34,  31,  35,  36,  37,  38,  39,  40,
+     41,  42,  43,  44,  41,  45,  46,  47,  41,   2,  48,  49,  50,  51,  52,  53,
+      1,  54,  55,   0,  56,  57,  58,   0,   2,   2,  59,  60,  61,  12,  62,   0,
+      2,   2,   2,   2,   2,   2,  63,   2,   2,   2,   2,   2,   2,   2,   2,   2,
+      2,   2,  64,   2,  65,  66,  67,   2,  68,   2,  16,  69,  70,   2,   2,  71,
+      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
+      2,   2,   2,   2,  72,   2,   2,  73,  74,  75,  76,  77,   2,   2,  78,  79,
+     80,   2,   2,  73,   2,  81,   2,  82,   3,  83,  84,  85,   2,  86,  87,   2,
+     88,   2,   3,  89,  79,  90,  91,   0,   2,   2,  86,  69,   2,   2,   2,  92,
+      2,  93,  94,   2,  95,  16,  10,  96,   2,   2,   2,   2,   2,   2,   2,  97,
+      2,   2,   2,   2,   2,   2,   2,   2,  71,   2,  98,  78,   2,  20,  99, 100,
+    101, 102,   3, 103, 104,   2, 105, 106,   2,   2,   2,   2,  86,   2,   2,   2,
+      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
+      2, 107,  19,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
+      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
+      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
+      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2, 108, 109,   2,   2,   2,
+      2, 110,   3,   2,   2,   2,   2, 111,   2,  63,   2, 112,  75, 113, 113,   2,
+      2,   2, 114,   0,  97,   2,   2,  76,   2,   2,   2,   2,   2,   2,  82, 115,
+      1,   2,   1,   2,   8,   2,   2,   2, 116,   7,   2,   2, 110,   2,   2, 117,
+      3,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
+      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
+      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
+      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
+      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,  69,
+      2,   2,   2,   2, 118,   2, 119,   2,   2,   2,   2,   2,   2,   2,   2,   2,
+      2, 120,   2,   2,   2,   2,   2, 121,   2,   2,   2,   2,   2,   2, 122, 123,
+      2, 124,   2, 121,   2,   2, 125,   2,   2,   2, 126,  69,   2,   2, 127,   3,
+      2,  75, 128,   2,   2,   2, 129,  75, 130, 131,   2,  86,   2,   2,   2, 132,
+      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
+      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2, 117, 133,  55,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
+      2,   2,   2,  90,   2,   2,  70,   0, 134, 135, 136,   2,   2,   2, 137,   2,
+      2,   2,   2,   2,   2,   2,   2,   2,   2,   2, 105,   2, 138,   2, 139, 140,
+     70,   2, 141, 142,   2,   2,   2,  89,   1,   2,   2,   2,   2,   3, 143, 144,
+    145, 146, 147,   0,   2,   2,   2,  96, 148, 149,   2,   2, 104,  91, 105,  78,
+      0,   0,   0,   0,  69,   2, 106,  55,   2, 150,  81,  96, 151,   2, 152,   0,
+      2,   2,   2,   2,  78, 153, 154,  55,   2,  10,   2, 155,   0,   0,   0,   0,
+      2,   2,   2,   2,   2,   2,   2,   2,   2,  75,  82, 139,   0,   0,   0,   0,
+    156, 157, 109,   2,   3, 158,   0, 159, 160, 161,   0,   0,   2, 162, 138,   2,
+    163, 164, 165,   2,   2,   0,   2, 166,   2, 167, 168, 169, 170, 171,   0,   0,
+      2,   2, 172,   0,   2, 114,   2, 173,   2, 174,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   3,   2, 175,   0,   0,   2,  10,  70,   0,   0, 105, 120,  75,
+      2,   2, 176, 177,   2,   2, 178, 179,   2,  20,  10,  75,   2,   2,   2, 180,
+    181,   3,   0,   0, 182, 153,   2, 183,  22, 184, 185, 186,   0,   0,   0,   0,
+      2,   2, 187, 188,   2,   2, 174,   0,   0,   0,   0,   0,   2, 168,  78,   0,
+      2,   2, 189, 190,   2,  73, 191,   0,  16,  86,   0,   0,   0,   0,   0,   0,
+      2,  55,   0,   0,   0,   2,   2, 192, 193, 194, 195,   0,   0, 196,   4, 197,
+      2,   2,  10,   2,   2, 198,   2,  73,   0,   0,   0,   0,   0,   0,   0,   0,
+    199, 200, 201, 118, 138, 202,   0,   0, 203, 204, 174, 205, 206, 191,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,  73,   0,   0,   0,   0,   0, 207,   2, 208,
+      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
+      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,  70,   0,   0,   0,
+      2,   2,   2, 209,   2,   2,   2,   2,   2,   2, 210,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      2, 211,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
+      2,   2, 107,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
+      2,  73,   3, 212,   0,   0, 105, 213,   2,   2, 214, 215, 216,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   2,   2,  96,   0,   0,   0,   2,   2, 217,   2, 218,   0,   0, 219,
+      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
+      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2, 121,
+      2,   2,   2,   2,   2,   2,  82,   0, 172,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      2,   2,   2,   2,   2,   2,   2,   2,   3,   0, 220, 221,   2,   2,   2,   2,
+      2,   2,   2,   2,   2,   2,   2,  55,   0,   0,   0,   0,   0,   0,   0,   0,
+      2,   2,   2, 222, 223, 210,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      2,   2,   2,   2,   2,   2,   2,  82,   2, 224,   2,   2,   2,   2,   2, 172,
+      2,   2, 225,   0,   0,   0,   0,  76,   2,   2,  75,  73,   0,   0,   0,   0,
+      2,   2,  20,   2,  12, 226, 227,   2, 228, 229, 230,   2,   2,   2,   2,   2,
+      2,   2,   2,   2,   2, 231,   2,   2,   2,   2,   2,   2,   2,   2, 232,   2,
+      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
+      2,   2,   2,   2, 233, 234,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    235, 236,   0,   0,   0,   0,   0,   0,   2, 237, 212,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   2, 161,   0,   0,   0,   0,   0,   0,   0,   0,
+      2,   2,   2,   2,   2,   2, 238,   0,   2,   2, 239,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0, 240,   2, 241,   0,   0,   1,  78,   0,   0,   0,   0,   0,   0,
+    227, 242, 243, 244, 245, 246,   0, 247,   0,   0,   0,   0,   0,   0,   0,   0,
+      2,  86,   2,   2,  76, 248, 249,  82,   2,   2,   2,   2,   2, 250,   0, 251,
+    252,  55, 253, 225,   0,   0,   0,   0,   2,   2,   2,   2,   2,   2,   2,   2,
+      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
+      2,   2,   2,   2,   2,   2, 121, 254,   2,   2,   2,  76,   2,   2,  73, 120,
+     86,   2, 174,   2,  10, 255,   0,   0,   2,   2,   2, 256,   2,   2, 145,   2,
+      2,   2,  76, 257, 119, 258, 259,   0,   2,   2,   2,   2, 141,   2,  19, 260,
+      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
+      2,   2,   2,   2,   2,   2,  78,   0,   2,   2,   2,   2,   2,   2,   2,   2,
+      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
+      2,   2,   2,   2,   2,   2,   2,   2,   2, 241,   2,   2,   2,   2,   2,   2,
+     78,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
+      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
+      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
+      2,   2,   2,   2,   2, 261,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
+      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
+      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,  91,
+      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
+     78,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
+      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,  19,   0,   0,   0,   0,   0,
+    262,   2,   2,   2,   0,   0,   0,   0,   2,   2,   2,   2,   2,   2,   2, 216,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
+      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,  78
+};
+
+static RE_UINT8 re_graph_table_3[] = {
+      0,   0,   0,   0, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 127,
+    255, 255, 255, 252, 240, 215, 255, 255, 251, 255, 255, 255, 255, 255, 254, 255,
+    255, 255, 127, 254, 255, 231, 254, 255, 255,   0, 255, 255, 255, 135,  31,   0,
+    255, 255, 255, 223, 255, 191, 255, 255, 255, 231, 255, 255, 255, 255,   3,   0,
+    255, 255, 255, 231, 255,  63, 255, 127, 255, 255, 255,  79, 255,   7,   0,   0,
+    255, 255, 223, 255, 255,   0, 248, 255, 239, 159, 249, 255, 255, 253, 197, 243,
+    159, 121, 128, 176, 207, 255, 255, 127, 238, 135, 249, 255, 255, 253, 109, 211,
+    135,  57,   2,  94, 192, 255, 127,   0, 238, 191, 251, 255, 255, 253, 237, 243,
+    191,  59,   1,   0, 207, 255,   3, 254, 238, 159, 249, 255, 159,  57, 224, 176,
+    207, 255, 255,   0, 236, 199,  61, 214,  24, 199, 255, 195, 199,  61, 129,   0,
+    192, 255, 255,   7, 255, 223, 253, 255, 255, 253, 255, 227, 223,  61,  96,   7,
+    207, 255, 128, 255, 255, 253, 239, 243, 223,  61,  96,  64, 207, 255,   6,   0,
+    223, 253, 240, 255, 207, 255, 255, 255, 238, 255, 127, 252, 255, 255, 251,  47,
+    127, 132,  95, 255, 192, 255,  28,   0, 255, 255, 255, 135, 255, 255, 255,  15,
+    214, 247, 255, 255, 175, 255, 255,  63,  95,  63, 255, 243, 255, 254, 255, 255,
+    255,  31, 254, 255, 255, 255, 255, 254, 255, 223, 255,   7, 191,  32, 255, 255,
+    255,  61, 127,  61, 255,  61, 255, 255, 255, 255,  61, 127,  61, 255, 127, 255,
+    255, 255,  61, 255, 255, 255, 255,  31, 255, 255, 255,   3, 255, 255,  63,  63,
+    254, 255, 255,  31, 255, 255, 255,   1, 255, 223,  31,   0, 255, 255, 127,   0,
+    255, 255,  15,   0, 255, 223,  13,   0, 255, 255, 255,  63, 255,   3, 255,   3,
+    255, 127, 255,   3, 255,   7, 255, 255, 255, 255,  63,   0, 255,  15, 255,  15,
+    241, 255, 255, 255, 255,  63,  31,   0, 255,  15, 255, 255, 255,   3, 255, 199,
+    255, 255, 255, 207, 255, 255, 255, 159, 255,  63, 255, 255,   1,   0,   0,   0,
+    255, 255,  15, 240, 255, 255, 255, 248, 255, 227, 255, 255, 255,   1, 255, 255,
+    255, 255, 255,   7, 255, 255, 255, 251,  63,  63, 255, 170, 223, 255, 207, 239,
+    255, 255, 220, 127,   0, 248, 255, 255, 255, 124, 255, 255, 223, 255, 243, 255,
+    255, 127, 255,  31,   0,   0, 255, 255, 255, 255,   1,   0, 127,   0,   0,   0,
+    255, 255, 207, 255, 255, 255, 191, 255, 255, 127, 255, 255, 255, 255,  15, 254,
+    255, 128,   1, 128, 127, 127, 127, 127, 255, 255,   7,   0,   0,   0, 255,  15,
+    224, 255, 255, 255,  15,   0, 255, 255, 255,  31, 255, 255, 127,   0, 255, 255,
+    255,  15,   0,   0, 255, 255, 255,   0, 252,   7,   0,   0,   0,   0, 224, 255,
+    255,  31, 255,   3,  63, 192, 255,   3, 255, 255,  15, 128, 255, 191, 255, 195,
+    255,  63, 255, 243,   7,   0,   0, 248, 126, 126, 126,   0, 127, 127, 255, 255,
+    255,  63, 255,   3, 127, 248, 255, 255, 127,   0, 248, 224, 255, 255, 127,  95,
+    219, 255, 255, 255,   3,   0, 248, 255, 255, 255, 252, 255, 255,   0,   0,   0,
+      0,   0, 255,  63, 255, 255, 247, 255, 127,  15, 223, 255, 252, 252, 252,  28,
+    127, 127,   0,  62, 255, 239, 255, 255, 127, 255, 255, 183, 255,  63, 255,  63,
+    135, 255, 255, 255, 255, 255, 143, 255,  15, 224, 255, 255, 255, 255, 255, 191,
+     15, 255,  63,   0, 255,   3, 255, 255, 255, 255,  15, 255,  15, 128,   0,   0,
+     63, 253, 255, 255, 255, 255, 191, 145, 128, 255,   0,   0, 255, 255,  55, 248,
+    255, 255, 255, 143, 255, 255, 255, 131, 255, 255, 255, 240, 111, 240, 239, 254,
+    255, 255,  63, 135, 255,   1, 255,   1, 127, 248, 127,   0, 255, 255,  63, 254,
+    255, 255,  63, 255, 255, 255,   7, 255, 255, 255,   3,  30,   0, 254,   0,   0,
+    255,   1,   0,   0, 255, 255,   7, 252, 255,   0, 255,   3, 255,  59,   3,   0,
+    255,  63, 252, 255, 255, 255,   0, 128,   3,  32, 255, 255, 255,   1, 255,   3,
+    254, 255,  31,   0, 255, 255, 251, 255, 127, 189, 255, 191, 255,   7, 255,   3,
+    255, 253, 237, 251, 159,  57, 129, 224, 207,  31,  31,   0, 255, 255, 255, 239,
+      3,   0,   0,   0,  31,   0, 255,   3, 255,  31,   0,   0, 255,   3,   0,   0,
+    255, 255,   7, 128, 127, 242, 111, 255, 255, 255, 191, 249, 127,   0, 255,   3,
+    255, 252, 255, 255,  31,   0,   0,   0,   7,   0,   0,   0, 255, 253, 255, 255,
+    255, 255, 127, 255,  63,   0, 255, 255, 255, 254, 127,   0, 127, 251, 255, 255,
+    255, 255, 127, 180, 191, 253, 255, 255, 255, 127, 251,   1,   0,   0,   1,   0,
+    255, 255,   3, 128, 255, 127,  31,   0,  15,   0,   0,   0, 255, 127, 255,   1,
+    255, 195,   0,   0, 255,  63,  63,   0,  63,   0, 255, 251, 251, 255, 255, 224,
+    255, 255,   0,   0, 255, 135, 255, 255, 255, 128, 255, 255,  31,   0,   3,   0,
+      0,   0,   7,   0, 240,   0, 255, 255, 255,   7, 255,  31, 255,   1, 255, 243,
+    127, 254, 255, 255,  63,   0,   0,   0, 100, 222, 255, 235, 239, 255, 255, 255,
+    191, 231, 223, 223, 255, 255, 255, 123,  95, 252, 253, 255,  63, 255, 255, 255,
+    255, 207, 255, 255, 255,  15,   0, 248, 254, 255,   0,   0, 127, 255, 255, 249,
+    219,   7,   0,   0, 255,  31, 255,  63, 159, 255, 127,   0, 255,  15, 255, 195,
+      0,   0, 254, 255, 255, 255,  31,   0, 150, 254, 247,  10, 132, 234, 150, 170,
+    150, 247, 247,  94, 255, 251, 255,  15, 238, 251, 255,  15,   0,   0,   3,   0,
+    255, 127, 254, 255, 254, 255, 254, 255, 255,  63,   0,   0, 192, 255, 255, 255,
+      7,   0, 255, 255, 255,   1,   3,   0, 255,  31, 255,  31, 255,  63,   3,   0,
+    255, 255, 255, 253, 255,  63,  31,   7, 255,   1, 127,   0,   7,   0, 127,   0,
+      0,   0, 255,   3,   3,   0, 255, 255,   2,   0,   0,   0
+};
+
+RE_UINT32 re_get_graph(RE_UINT32 codepoint) {
+    RE_UINT32 field_2;
+    RE_UINT32 field_1;
+    RE_UINT32 field_0;
+    RE_UINT32 offset;
+    RE_UINT32 v;
+
+    field_2 = codepoint >> 10;
+    field_1 = (codepoint >> 5) & 0x1F;
+    field_0 = (codepoint >> 3) & 0x3;
+    offset = codepoint & 0x7;
+
+    v = re_graph_table_1[field_2];
+    v = re_graph_table_2[(v << 5) | field_1];
+    v = re_graph_table_3[(v << 2) | field_0];
+
+    return (v >> offset) & 0x1;
+}
+
+/* Grapheme_Base. */
+static RE_UINT8 re_grapheme_base_table_1[] = {
+     0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 14, 13, 15, 16, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 17, 18, 18, 18, 18, 18, 18, 18, 18, 19, 20,
+    21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 18, 18, 13, 31, 18, 18,
+    18, 32, 18, 18, 18, 18, 18, 18, 18, 18, 33, 34, 13, 13, 13, 13,
+    13, 35, 13, 36, 18, 18, 18, 18, 18, 18, 18, 18, 37, 18, 18, 38,
+    18, 18, 18, 18, 39, 40, 41, 18, 42, 18, 43, 44, 45, 46, 47, 18,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 48, 13, 13, 13, 49, 50, 13,
+    13, 13, 13, 51, 13, 13, 13, 13, 13, 13, 52, 18, 18, 18, 53, 18,
+    13, 13, 13, 13, 54, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18
+};
+
+static RE_UINT16 re_grapheme_base_table_2[] = {
+      0,   1,   1,   2,   0,   3,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   0,   0,   0,   4,   5,   6,   1,   1,
+      1,   1,   1,   1,   7,   1,   1,   1,   1,   8,   9,   1,  10,  11,  12,  13,
+     14,   1,  15,   8,   1,   1,  16,  17,  18,  19,  20,   1,   1,  21,   1,  22,
+     23,  24,  25,  15,   0,  26,  27,   0,  28,  29,  30,  31,  32,  33,  34,  35,
+     36,  37,  38,  39,  40,  41,  42,  43,  44,  45,  46,  47,  48,  49,  50,  51,
+     52,  53,  54,  55,  56,  57,  58,  59,  60,  61,  62,  63,  64,  65,  66,  67,
+     68,  69,  70,   0,  71,  72,  73,   0,  74,  75,  76,  77,  78,  79,  80,   0,
+      1,  81,  82,  83,  84,   1,  85,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,  86,   1,  87,  88,  89,   1,  90,   1,  91,  92,  93,   1,   1,  94,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,  92,   1,   1,  95,  96,  97,  98,  99,   1, 100, 101, 102,
+    103,   1,   1,  95, 104, 105,   1, 106,   2, 107, 108, 109,   1, 110, 111,   1,
+    112,   1, 113, 114, 102, 115,   0,   0, 116, 117, 118, 119, 120, 121,   1, 122,
+      1, 123, 124,   1, 125, 126, 127, 128,   1,   1,   1,   1,   1,   1,   0,   0,
+      1,   1,   1,   1,   1,   1,   1,   1,  94,   1, 129, 130,   1,  26, 131, 132,
+    133, 134,   1, 135, 136,   1,   0,   0,   1,   1,   1,   1, 110,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1, 137,  15,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1, 138, 139,   1,   1,   1,
+      1, 140,   2,   1,   1,   1,   1, 141,   1,  85,   1, 142, 143, 144, 144,   0,
+      1,   1, 145,   0, 146,   1,   1, 147,   1,   1,   1,   1,   1,   1, 106, 148,
+      1, 149,  68,   1, 150,   1,   1,   1, 151,   8,   1,   1, 140,   1,   1, 152,
+      2,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,  92,
+      1,   1,   1,   1, 153,   1, 154,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1, 155,   1, 156, 130,   1,   1, 157,   1,   1,   1,   1,   1,   1, 158, 159,
+    160, 161,   1, 162,   1,   1, 163, 164,   1, 165, 166,  92,  28, 167, 168, 169,
+      1, 170, 171, 172,   1, 173, 174, 175, 176, 177,   1, 110,   1,   1,   1, 178,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1, 152, 179, 180,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1, 181,   1,   1,  93,   0, 182, 183, 184,   1,   1,   1, 185,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1, 186,   1, 187,   1,  27, 188,
+    189, 186, 190, 191,   1,   1,   1,  92,  68,   1,   1,   1, 130,   2, 192, 193,
+    194, 195, 196,   0,   1,   1,   1,  91, 197, 198,   1,   1, 136, 199, 186,  92,
+      0,   0,   0,   0,  92,   1, 200, 201,   1, 202, 133, 106, 203,   1, 204,   0,
+      1,   1,   1,   1, 130, 149, 205, 180,   1, 206,   1, 207,   0,   0,   0,   0,
+      1,   1,   1,   1,   1,   1,   1,   1,   1, 143, 106,  27,   0,   0,   0,   0,
+    208, 209, 139,   1,   2, 210,   0, 211, 212, 213,   0,   0,   1, 214, 187,   1,
+    215, 106, 216,   1,   1,   0,   1, 217,   1, 218, 219, 220, 221, 222,   0,   0,
+      1,   1, 223,   0,   1, 145,   1, 224,   1, 225,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   2,   1, 226,   0,   0,   1, 206, 227,   0,   0, 186, 155, 143,
+    228, 162, 229,  19, 120, 230, 231, 232,  28, 233, 206, 234, 120, 235, 236, 237,
+    238, 239,   0,   0, 240, 149,   2, 241,  44, 242, 243, 244,   0,   0,   0,   0,
+      1, 162, 245, 246,   1, 247, 248,   0,   0,   0,   0,   0,   1, 249, 201,   0,
+      1, 250, 251, 252,   1, 253, 254,   0,  91, 255,   0,   0,   0,   0,   0,   0,
+      1, 256,   0,   0,   0,   1,   1, 257, 258, 259, 260,   0,   0, 261, 262, 263,
+    264, 265, 266,   1, 267, 268,   1,  95,   0,   0,   0,   0,   0,   0,   0,   0,
+    269, 270, 271, 153,  19, 272,   0,   0, 273, 200, 274, 275, 276, 254,   0,   0,
+      0,   0,   0,   0,   0,   0,   0, 277,   0,   0,   0,   0,   0, 278,   1, 279,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,  93,   0,   0,   0,
+      1,   1,   1, 280,   1,   1,   1,   1,   1,   1, 244,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      1, 281,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1, 137,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,  95,   2, 282,   0,   0, 186, 283,   1, 284, 285, 286,  19,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   1,   1,  91,   0,   0,   0,   1,   1, 133,   1, 287,   0,   0, 288,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1, 162,
+      1,   1,   1,   1,   1,   1, 106,   0, 223,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      1,   1,   1,   1,   1,   1,   1,   1,   2,   0, 289, 290,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1, 180,   0,   0,   0,   0,   0,   0,   0,   0,
+      1,   1,   1, 291, 292,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      1,   1,   1,   1,   1,   1,   1, 106,   1, 293,   1, 294, 295, 296,   1, 223,
+      1,   1, 297,   0,   0,   0,   0, 147,   1,   1, 143,  95,   0,   0,   0,   0,
+      1,   1,  26,   1, 298, 299, 300,   1, 301, 302, 303,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1, 304,   1,   1,   1,   1,   1,   1,   1,   1, 305,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      0, 306,   0, 307, 308,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   1, 309, 282,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   1, 310,   0,   0,   0,   0,   0,   0,   0,   0,
+      1,   1,   1,   1,   1,   1, 311,   0,   1,   1, 312,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0, 313,   1, 314,   0,   0,  68, 130,   0,   0,   0,   0,   0,   0,
+    300, 315, 316, 317, 318, 319,   0, 320,   0,   0,   0,   0,   0,   0,   0,   0,
+      1, 110,   1,   1, 147, 321, 322, 106,   1,   1,   1,   1,   1, 115,   0, 323,
+    324, 180, 325, 326,   0,   0,   0,   0,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1, 162, 327,   1,   1,   1, 147,   1,   1,  95, 155,
+    110,   1, 328,   1, 206, 329,   0,   0,   1,   1,   1, 330,   1,   1, 194,   1,
+      1,   1, 147, 331, 154, 332, 333,   0,   1,   1,   1,   1, 190,   1,  15, 189,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1, 130,   0,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1, 314,   1,   1,   1,   1,   1,   1,
+    130,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1, 231,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1, 199,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+    130,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,  15,   0,   0,   0,   0,   0
+};
+
+static RE_UINT8 re_grapheme_base_table_3[] = {
+      0,   0,   0,   0, 255, 255, 255, 255, 255, 255, 255, 127, 255, 223, 255, 255,
+      0,   0, 255, 252, 240, 215, 255, 255, 251, 255, 255, 255,   7, 252, 255, 255,
+    255, 255, 254, 255, 255, 255, 127, 254, 255, 231,   0,   0,   0,   0,   0,  64,
+     73,   0, 255, 255, 255, 135,  31,   0, 192, 255,   0, 200, 255,   7,   0,   0,
+    255, 255,  63,  64,  96, 194, 255, 255, 255,  63, 253, 255, 255, 255,   0,   0,
+      0, 224, 255, 255,  63,   0,   2,   0, 255,   7, 240, 199, 255, 255,  63,   4,
+     16,   1, 255, 127, 255, 255, 255,  65, 255, 255, 223, 255, 255,   0,   0,   0,
+    248, 255, 255, 255, 255, 255, 255, 235,   1, 222,   1, 255, 243, 255, 255, 255,
+    237, 159, 249, 255, 255, 253, 197, 163, 129,  89,   0, 176, 195, 255, 255,  63,
+    232, 135, 249, 255, 255, 253, 109, 195,   1,   0,   0,  94, 192, 255,  92,   0,
+    232, 191, 251, 255, 255, 253, 237, 227,   1,  26,   1,   0, 195, 255,   3,   2,
+    236, 159, 249, 255, 255, 253, 237,  35, 129,  25,   0, 176, 195, 255, 255,   0,
+    232, 199,  61, 214,  24, 199, 255, 131, 198,  29,   1,   0, 192, 255, 255,   7,
+    238, 223, 253, 255, 255, 253, 255,  35,  30,   0,   0,   7, 195, 255, 128, 255,
+    253, 223, 253, 255, 255, 253, 239,  99, 155,  13,   0,  64, 195, 255,   6,   0,
+    252, 223, 253, 255, 255, 255, 255, 167, 193, 221, 112, 255, 195, 255, 255, 255,
+    236, 255, 127, 252, 255, 255, 251,  47, 127,   0,   3, 127, 192, 255,  28,   0,
+    254, 255, 255, 255, 255, 255,  13, 128, 127, 128, 255,  15, 214, 247, 255, 255,
+    175, 255,  13,  32,  95,   0, 255, 243, 255, 255, 255, 252, 255, 255,  95, 253,
+    255, 254, 255, 255, 255,  31,   0, 128,  32,  31,   0,   0,   0,   0,   0, 192,
+    191, 223, 255,   7, 255,  31,   2, 153, 255, 255, 255,  60, 254, 255, 225, 255,
+    155, 223, 255, 223, 191,  32, 255, 255, 255,  61, 127,  61, 255,  61, 255, 255,
+    255, 255,  61, 127,  61, 255, 127, 255, 255, 255,  61, 255, 255, 255, 255,   7,
+    255, 255, 255,  31, 255, 255, 255,   3, 255, 255,  63,  63, 255, 255, 255,   1,
+    255, 223,   3,   0, 255, 255,  99,   0, 255, 255,   3,   0, 255, 223,   1,   0,
+    255, 255,  79, 192, 191,   1, 240,  31, 255,   3, 255,   3, 255,   7, 255,   3,
+    159, 255, 255, 255, 255,   5, 255, 255, 255, 255,  63,   0, 120,  14, 251,   1,
+    241, 255, 255, 255, 255,  63,  31,   0, 255,  15, 255, 255, 255,   3, 255, 199,
+    255, 255, 127, 198, 255, 255, 191,   0,  26, 224,   7,   0, 255,  63,   0,   0,
+    240, 255, 255, 255, 255, 255,  15, 232, 251,  15, 255, 255, 255,   7, 240,  31,
+    252, 255, 255, 255, 195, 196, 255, 255, 191,  92,  12, 240, 255,  15,  48, 248,
+    255, 227, 255, 255, 255,   1, 255, 255, 255, 255, 255, 231, 255,   0,   8,   0,
+      2, 222, 239,   4,  63,  63, 255, 170, 255, 255, 255,  63, 223, 255, 207, 239,
+    255, 255, 220, 127, 255,   7, 255, 255, 255, 128, 255, 255,   0,   0, 243, 255,
+    255, 127, 255,  31, 127,   0,   0,   0, 255, 255, 207, 255, 255, 255, 191, 255,
+    255, 127, 255, 255, 255, 127,  12, 254, 255, 128,   1,   0, 255, 255, 127,   0,
+    127, 127, 127, 127, 255, 255,   7,   0, 255, 255, 255, 251, 255, 255,  15,   0,
+      0,   0, 255,  15, 255,   3, 255, 255, 255, 255, 127, 248, 224, 255, 255, 255,
+     15,   0, 255, 255, 255,  31, 255, 255, 127,   0, 255, 255, 255,  15,   0,   0,
+    255, 127,   8, 192, 255, 255, 252,   0, 252,   7,   0,   0,   0,   0, 224, 255,
+    187, 247, 255, 255, 159,  15, 255,   3, 255, 255, 255,   0,  15, 192, 255,   3,
+      0,   0, 252, 127,  63, 192, 255, 255, 127,   0,  12, 128, 255, 255,  55, 204,
+    255, 191, 255, 195, 223, 255, 255, 127, 255, 129,  25,   0, 247,  47, 255, 243,
+    255, 255, 255, 239, 255, 255,  98,  62,   5,   0,   0, 248, 255, 207,  63,   0,
+    126, 126, 126,   0, 127, 127, 255, 255, 223,  30, 255,   3, 127, 248, 255, 255,
+    255, 255, 255,  15, 255,  63, 255, 255, 127,   0, 248, 160, 255, 255, 127,  95,
+    219, 255, 255, 255,   3,   0, 248, 255,   0,   0, 255, 255, 255, 255, 252, 255,
+      0,   0, 255,  63,   0,   0, 255,   3, 255, 255, 247, 255, 127,  15, 223, 255,
+    252, 252, 252,  28, 127, 127,   0,  48, 255, 239, 255, 255, 127, 255, 255, 183,
+    255,  63, 255,  63, 135, 255, 255, 255, 255, 255, 143, 255,   1,   0,   0,   0,
+    255, 255,   1,   0, 254, 255, 255,  15,  15, 224, 255, 255, 255, 255, 255, 191,
+     15, 255,  63,   0, 255, 255,  15, 255, 255,   0, 255, 255,  15, 128,   0,   0,
+     63, 253, 255, 255, 255, 255, 191, 145, 128, 255,   0,   0, 255, 255,  55, 248,
+    255, 255, 255, 143, 255, 255, 255, 131, 255, 255, 255, 240,   1,   0, 239, 254,
+    255,   1, 255,   1,  31, 248, 127,   0, 255, 255,  63, 254, 255, 255,  63, 255,
+    255, 255,   7, 255, 255, 255,   3,  30,   0, 254,   0,   0, 255,   1,   0,   0,
+    255, 255,   7, 252,  15,   0, 255,   3, 255,  35,   3,   0,  63,   0, 254,   3,
+    253, 255, 255, 255, 128,  63, 252, 255, 255, 255, 135, 217,   3,   0, 255, 255,
+    255,   1, 255,   3, 127,  16, 192, 255, 255, 255, 119,   0, 255, 255,  63, 128,
+    255,  97, 255, 255, 254, 255,  31,   0, 255, 255, 251, 255, 255, 127,  44,  63,
+    127, 189, 255, 191,   7,   0, 255,   3, 255, 253, 237, 163, 158,  57,   1, 224,
+     15,   0,   0,   0, 163, 255, 255, 175,   3,   0,   0,   0, 255, 255,   6,  90,
+    242,   0, 255,   3, 255, 127,   3,  79, 255, 255,   7,  88,  30,   0, 255,   3,
+    255,  31,   0,   0, 255, 215,  64,   1, 255,   3,   0,   0,  67,   0, 255, 255,
+    255, 127,   0,   9, 255, 255,   7, 128, 127, 242, 111, 255, 255, 255, 190, 161,
+    119,   0, 255,   3, 255, 252, 255, 255, 255, 255,  15, 240,  30,   0,   0,   0,
+      1, 248, 255, 255, 255, 255,   7, 134, 127,   0, 129, 241, 255,   3, 128, 252,
+      7,   0,   0,   0, 255, 253, 255, 255, 255, 255,   0,  64,  63,   0, 255, 255,
+      0,   2,  18,   0, 127, 251, 255, 255,  64,   0, 255,   3, 191, 253, 255, 255,
+    255, 127,  88,   1, 255, 255, 231,   1,   0,   0,   1,   0, 255, 255,   3, 128,
+    255, 127,  31,   0, 255, 127,   0,   0, 255, 195,   0,   0, 255,  63,  32,   0,
+    255, 255, 128, 255,  63,   0, 255, 251, 251, 255, 255, 224, 255,   0, 248, 255,
+     15,   0,   3,   0,   0,   0,   7,   0, 240,   0, 255, 255, 255,   7, 255,  31,
+    255,   1, 255, 147, 127, 254, 255, 255,  95,  60,   0,   0,  24, 240, 255, 255,
+    255, 195, 255, 255,  35,   0,   0,   0, 255, 255, 255, 223, 100, 222, 255, 235,
+    239, 255, 255, 255, 191, 231, 223, 223, 255, 255, 255, 123,  95, 252, 253, 255,
+     63, 255, 255, 255, 255, 207, 255, 255,   0,   0, 128,   7,   0, 224, 223, 255,
+    239,  15,   0,   0, 255,  31, 128,  63, 255,  15, 255, 131, 159, 255,   0,   0,
+     15,   8, 255, 195,   0,   0, 254, 255, 255, 255,  31,   0, 150, 254, 247,  10,
+    132, 234, 150, 170, 150, 247, 247,  94, 255, 251, 255,  15, 238, 251, 255,  15,
+      0,   0,   3,   0, 255, 127, 254, 255, 254, 255, 254, 255, 192, 255, 255, 255,
+      7,   0, 255, 255, 255,   1,   3,   0,  63,   0,   0,   0, 255,  31, 255,  31,
+    255,   0, 255,   3, 255,  63,   3,   0, 255, 255, 255, 253, 255,  63,  31,   7,
+    255,   1, 127,   0,   7,   0, 127,   0
+};
+
+RE_UINT32 re_get_grapheme_base(RE_UINT32 codepoint) {
+    RE_UINT32 field_2;
+    RE_UINT32 field_1;
+    RE_UINT32 field_0;
+    RE_UINT32 offset;
+    RE_UINT32 v;
+
+    field_2 = codepoint >> 10;
+    field_1 = (codepoint >> 5) & 0x1F;
+    field_0 = (codepoint >> 3) & 0x3;
+    offset = codepoint & 0x7;
+
+    v = re_grapheme_base_table_1[field_2];
+    v = re_grapheme_base_table_2[(v << 5) | field_1];
+    v = re_grapheme_base_table_3[(v << 2) | field_0];
+
+    return (v >> offset) & 0x1;
+}
+
+/* Grapheme_Cluster_Break. */
+static RE_UINT8 re_grapheme_cluster_break_table_1[] = {
+     0,  1,  2,  3,  4,  5,  6,  7,  8,  9,  9, 10, 11,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9, 12, 13, 14, 15, 16, 17, 18,
+    19, 20, 14, 15, 16, 21,  9,  9,  9,  9,  9,  9,  9,  9, 22, 23,
+    24,  9, 25, 26, 27, 28, 29, 30,  9,  9,  9,  9,  9, 31,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9, 32, 33,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9, 34,
+     9,  9,  9,  9, 35,  9, 36,  9, 37,  9, 38,  9, 39,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+    40, 41, 41, 41,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9
+};
+
+static RE_UINT8 re_grapheme_cluster_break_table_2[] = {
+      0,   1,   1,   2,   3,   4,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   5,   5,   5,   6,   1,   1,   1,   1,
+      1,   1,   1,   1,   7,   1,   1,   1,   1,   1,   1,   1,   8,   9,  10,   1,
+     11,   1,  12,  13,   1,   1,  14,  15,  16,  17,  18,   1,   1,  19,   1,  20,
+     21,  22,  23,   1,   1,   1,  24,  25,  26,  27,  28,  29,  30,  31,  32,  33,
+     34,  35,  36,  37,  34,  35,  38,  39,  30,  40,  41,  29,  42,  43,  44,   1,
+     45,  46,  47,  29,  30,  48,  49,  29,  50,  51,  52,  29,  30,   1,  53,  54,
+      1,  55,  56,   1,   1,  57,  58,   1,  59,  60,   1,  61,  62,  63,  64,   1,
+      1,  65,  66,  67,  68,   1,   1,   1,  69,  69,  69,  70,  70,  71,  72,  72,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,  73,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,  74,  74,  75,  75,   1,  76,  77,   1,
+     78,   1,   1,   1,  79,  80,   1,   1,   1,  81,   1,   1,   1,   1,   1,   1,
+     82,   1,  83,  84,   1,  17,  85,   1,  86,  87,  88,  89,  90,  91,   1,  92,
+      1,  93,   1,   1,   1,   1,  94,  95,   1,   1,   1,   1,   1,   1,   5,  96,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+     97,  98,   1,  99,   1,   1,  17, 100,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1, 101,   1,   1,   1, 102,   1,   1,   1,   5,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1, 103,   1,   1, 104,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1, 105,  46,   1,   1, 106,   1,   1,   1,   1,   1,   1,   1,   1,
+    107, 108,   1,   1, 109, 110, 111, 112,   1, 113, 114, 115,  26, 116, 117, 118,
+      1, 119, 120, 121,   1, 122, 123, 124,   1,   1,   1,   1,   1,   1,   1, 125,
+    126, 127, 128, 129, 130, 131, 132, 126, 127, 128, 129, 130, 131, 132, 126, 127,
+    128, 129, 130, 131, 132, 126, 127, 128, 129, 130, 131, 132, 126, 127, 128, 129,
+    130, 131, 132, 126, 127, 128, 129, 130, 131, 132, 126, 127, 128, 129, 130, 131,
+    132, 126, 127, 128, 129, 130, 131, 132, 126, 127, 128, 129, 130, 131, 132, 126,
+    127, 128, 129, 130, 131, 132, 126, 127, 128, 129, 130, 131, 132, 126, 127, 128,
+    129, 130, 131, 132, 126, 127, 128, 129, 130, 131, 132, 126, 127, 128, 129, 130,
+    131, 132, 126, 127, 128, 129, 130, 131, 132, 126, 127, 128, 129, 130, 131, 132,
+    126, 127, 128, 129, 130, 131, 132, 126, 127, 128, 129, 130, 131, 132, 126, 127,
+    128, 129, 130, 131, 132, 126, 127, 128, 129, 130, 131, 132, 126, 127, 128, 129,
+    130, 131, 132, 126, 127, 128, 129, 130, 131, 132, 126, 127, 128, 129, 130, 131,
+    132, 126, 127, 128, 129, 130, 131, 132, 126, 127, 128, 129, 130, 131, 132, 126,
+    127, 128, 129, 130, 131, 132, 126, 127, 128, 129, 130, 131, 132, 126, 127, 128,
+    129, 130, 131, 132, 126, 127, 128, 129, 130, 131, 132, 126, 127, 128, 129, 130,
+    131, 132, 126, 127, 128, 129, 130, 131, 132, 126, 127, 128, 129, 130, 131, 132,
+    131, 132, 126, 127, 128, 129, 130, 131, 132, 126, 127, 128, 129, 130, 131, 132,
+    126, 127, 128, 129, 130, 131, 132, 126, 127, 128, 129, 130, 131, 133, 134, 135,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1, 136,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      6,   6,   1,   1,   1,   1,   1,   2,   1,   1,   1,   1,  46,   1,   1, 137,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1, 138,
+      1,   1,   1,   1,   1,   1,   1,  85,   1,   1,   1, 139,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+    140, 141,   1,   1,   1,   1,   1,  79,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1, 142,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1, 143,   1,   1,   1,   1,  19,   1,   1,   1,   1,   1,
+    144, 145, 146, 102,  90, 147, 148,   1, 149, 150, 151, 152,  90, 153, 154,   1,
+      1, 155,   1,   1,   1,   1, 102, 156,  50,  51, 157, 158,   1,   1,   1,   1,
+      1, 159, 160,   1,   1, 161, 162,   1,   1,   1,   1,   1,   1, 163, 164,   1,
+      1, 165,  85,   1,   1, 166,   1,   1,  73, 167,   1,   1,   1,   1,   1,   1,
+      1, 168,   1,   1,   1,   1,   1,   1,   1, 169, 170,   1,   1,   1, 171, 172,
+    173, 174, 175,   1, 176,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1, 177,   1,   1, 178, 179,   1,   1,   1, 180, 181,   1, 182,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1, 183,   1,   1,   1,   1,   1,   1,   1,   1,
+      1, 184,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1, 185,   1, 186,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1, 187, 188, 189,   1,   1, 190,
+      1,   1,   1,   1, 191, 192,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1, 193, 194, 195,   1,   1,
+      1,   1, 196,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      5, 197,   5, 198, 199, 200,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+    201, 202,   1,   1,   1,   1,   1,   1,   1, 186,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1, 203,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1, 186,   1,   1,   1, 204,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1, 205,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1, 206,
+      3,   5,   5,   5,   3,   3,   3,   3,   5,   5,   5,   5,   5,   5,   5, 207,
+      3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,
+      3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,
+      3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3
+};
+
+static RE_UINT8 re_grapheme_cluster_break_table_3[] = {
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  2,  1,  1,  3,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
+     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
+     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  4,  4,  4,  4,  4,  4,  4,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
+     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
+     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  0,  4,
+     0,  4,  4,  0,  4,  4,  0,  4,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     5,  5,  5,  5,  5,  5,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  0,  1,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  4,  4,  4,  4,  4,
+     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     4,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  4,  4,  4,  4,  4,  4,  4,  5,  0,  4,
+     4,  4,  4,  4,  4,  0,  0,  4,  4,  0,  4,  4,  4,  4,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  5,
+     0,  4,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
+     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
+     4,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  4,  4,  4,  4,  4,
+     4,  4,  4,  4,  0,  0,  0,  0,  0,  0,  0,  0,  0,  4,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  4,  4,  4,  4,  0,  4,  4,  4,  4,  4,
+     4,  4,  4,  4,  0,  4,  4,  4,  0,  4,  4,  4,  4,  4,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  4,  4,  4,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
+     4,  4,  5,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
+     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
+     4,  4,  4,  6,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  4,  6,  4,  0,  6,  6,
+     6,  4,  4,  4,  4,  4,  4,  4,  4,  6,  6,  6,  6,  4,  6,  6,
+     0,  4,  4,  4,  4,  4,  4,  4,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  4,  4,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  4,  6,  6,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  4,  0,  4,  6,
+     6,  4,  4,  4,  4,  0,  0,  6,  6,  0,  0,  6,  6,  4,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  4,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  4,  4,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  4,  0,
+     0,  4,  4,  6,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  4,  0,  6,  6,
+     6,  4,  4,  0,  0,  0,  0,  4,  4,  0,  0,  4,  4,  4,  0,  0,
+     0,  4,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     4,  4,  0,  0,  0,  4,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     6,  4,  4,  4,  4,  4,  0,  4,  4,  6,  0,  6,  6,  4,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  4,  4,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  4,  4,  4,  4,  4,  4,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  4,  0,  4,  4,
+     6,  4,  4,  4,  4,  0,  0,  6,  6,  0,  0,  6,  6,  4,  0,  0,
+     0,  0,  0,  0,  0,  4,  4,  4,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  4,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  4,  6,
+     4,  6,  6,  0,  0,  0,  6,  6,  6,  0,  6,  6,  6,  4,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  4,  0,  0,  0,  0,  0,  0,  0,  0,
+     4,  6,  6,  6,  4,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  4,  4,
+     4,  6,  6,  6,  6,  0,  4,  4,  4,  0,  4,  4,  4,  4,  0,  0,
+     0,  0,  0,  0,  0,  4,  4,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  4,  0,  6,  4,
+     6,  6,  4,  6,  6,  0,  4,  6,  6,  0,  6,  6,  4,  4,  0,  0,
+     0,  0,  0,  0,  0,  4,  4,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     4,  4,  6,  6,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  4,  4,  0,  4,  6,
+     6,  4,  4,  4,  4,  0,  6,  6,  6,  0,  6,  6,  6,  4,  5,  0,
+     0,  0,  0,  0,  0,  0,  0,  4,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  4,  0,  0,  0,  0,  4,
+     6,  6,  4,  4,  4,  0,  4,  0,  6,  6,  6,  6,  6,  6,  6,  4,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  6,  6,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  4,  0,  6,  4,  4,  4,  4,  4,  4,  4,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  4,  4,  4,  4,  4,  4,  4,  4,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  4,  0,  6,  4,  4,  4,  4,  4,  4,  4,  4,  4,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  4,  4,  4,  4,  4,  4,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  4,  4,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  4,  0,  4,  0,  4,  0,  0,  0,  0,  6,  6,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  6,
+     4,  4,  4,  4,  4,  0,  4,  4,  0,  0,  0,  0,  0,  4,  4,  4,
+     4,  4,  4,  4,  4,  4,  4,  4,  0,  4,  4,  4,  4,  4,  4,  4,
+     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
+     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  4,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  4,  4,  4,
+     4,  6,  4,  4,  4,  4,  4,  4,  0,  4,  4,  6,  6,  4,  4,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  6,  6,  4,  4,  0,  0,  0,  0,  4,  4,
+     4,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  4,  4,  4,  4,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  4,  0,  6,  4,  4,  0,  0,  0,  0,  0,  0,  4,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  4,  0,  0,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  4,  4,  4,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  4,  4,  4,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  4,  4,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  4,  4,  6,  4,  4,  4,  4,  4,  4,  4,  6,  6,
+     6,  6,  6,  6,  6,  6,  4,  6,  6,  4,  4,  4,  4,  4,  4,  4,
+     4,  4,  4,  4,  0,  0,  0,  0,  0,  0,  0,  0,  0,  4,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  4,  4,  4,  1,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  4,  4,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  4,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     4,  4,  4,  6,  6,  6,  6,  4,  4,  6,  6,  6,  0,  0,  0,  0,
+     6,  6,  4,  6,  6,  6,  6,  6,  6,  4,  4,  4,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  4,  4,  6,  6,  4,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  6,  4,  6,  4,  4,  4,  4,  4,  4,  4,  0,
+     4,  0,  4,  0,  0,  4,  4,  4,  4,  4,  4,  4,  4,  6,  6,  6,
+     6,  6,  6,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  0,  0,  4,
+     4,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     4,  4,  4,  4,  6,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  4,  4,  4,  4,  4,  4,  4,  6,  4,  6,  6,  6,
+     6,  6,  4,  6,  6,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  4,  4,  4,  4,  4,
+     4,  4,  4,  4,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     4,  4,  6,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  6,  4,  4,  4,  4,  6,  6,  4,  4,  6,  4,  4,  4,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  4,  6,  4,  4,  6,  6,  6,  4,  6,  4,
+     4,  4,  6,  6,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  6,  6,  6,  6,  6,  6,  6,  6,  4,  4,  4,  4,
+     4,  4,  4,  4,  6,  6,  4,  4,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     4,  4,  4,  0,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
+     4,  6,  4,  4,  4,  4,  4,  4,  4,  0,  0,  0,  0,  4,  0,  0,
+     0,  0,  0,  0,  4,  0,  0,  6,  4,  4,  0,  0,  0,  0,  0,  0,
+     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
+     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  0,  4,  4,  4,  4,  4,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  4, 10,  1,  1,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  1,  1,  1,  1,  1,  1,  1,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
+     4,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  4,
+     4,  4,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  4,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  4,  4,  4,  4,  4,  4,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  4,  4,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  4,
+     4,  4,  4,  0,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     4,  4,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  4,  0,  0,  0,  4,  0,  0,  0,  0,  4,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  6,  6,  4,  4,  6,  0,  0,  0,  0,  4,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     6,  6,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,
+     6,  6,  6,  6,  4,  4,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
+     4,  4,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  4,
+     0,  0,  0,  0,  0,  0,  4,  4,  4,  4,  4,  4,  4,  4,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  4,  4,  4,  4,  4,  4,  4,  4,  4,
+     4,  4,  6,  6,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  4,  6,  6,  4,  4,  4,  4,  6,  6,  4,  4,  6,  6,
+     6,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  4,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  4,  4,  4,  4,  4,  4,  6,
+     6,  4,  4,  6,  6,  4,  4,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  4,  0,  0,  0,  0,  0,  0,  0,  0,  4,  6,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  4,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     4,  0,  4,  4,  4,  0,  0,  4,  4,  0,  0,  0,  0,  0,  4,  4,
+     0,  4,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  6,  4,  4,  6,  6,
+     0,  0,  0,  0,  0,  6,  4,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  6,  6,  4,  6,  6,  4,  6,  6,  0,  6,  4,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+    12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 11, 12, 12, 12,
+    12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+    12, 12, 12, 12, 12, 12, 12, 12, 11, 12, 12, 12, 12, 12, 12, 12,
+    12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+    12, 12, 12, 12, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+    12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+    11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+    12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 11, 12, 12, 12,
+    12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+    12, 12, 12, 12, 12, 12, 12, 12, 11, 12, 12, 12, 12, 12, 12, 12,
+    12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+    12, 12, 12, 12, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+    12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+    12, 12, 12, 12,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  0,  0,  0,  0,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  4,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  4,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  4,  4,  4,  4,  4,  0,  0,  0,  0,  0,
+     0,  4,  4,  4,  0,  4,  4,  0,  0,  0,  0,  0,  4,  4,  4,  4,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  4,  4,  4,  0,  0,  0,  0,  4,
+     0,  0,  0,  0,  4,  4,  4,  4,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  4,  4,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     6,  4,  6,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  4,  4,  4,  4,  4,  4,  4,  4,
+     4,  4,  4,  4,  4,  4,  4,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     6,  6,  6,  4,  4,  4,  4,  6,  6,  4,  4,  0,  0,  5,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  5,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     4,  4,  4,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  4,  4,  4,  4,  4,  6,  4,  4,  4,
+     4,  4,  4,  4,  4,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  6,  6,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  4,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  6,  6,  6,  4,  4,  4,  4,  4,  4,  4,  4,  4,  6,
+     6,  0,  5,  5,  0,  0,  0,  0,  0,  4,  4,  4,  4,  0,  6,  4,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  6,  6,  6,  4,
+     4,  4,  6,  6,  4,  6,  4,  4,  0,  0,  0,  0,  0,  0,  4,  0,
+     6,  6,  6,  4,  4,  4,  4,  4,  4,  4,  4,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     4,  6,  6,  6,  6,  0,  0,  6,  6,  0,  0,  6,  6,  6,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  4,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  6,  6,  0,  0,  4,  4,  4,  4,  4,  4,  4,  0,  0,  0,
+     4,  4,  4,  4,  4,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  6,  6,  6,  4,  4,  4,  4,  4,  4,  4,  4,
+     6,  6,  4,  4,  4,  6,  4,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  4,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     4,  6,  6,  4,  4,  4,  4,  4,  4,  6,  4,  6,  6,  4,  6,  4,
+     4,  6,  4,  4,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  4,
+     6,  6,  4,  4,  4,  4,  0,  0,  6,  6,  6,  6,  4,  4,  6,  4,
+     4,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  4,  4,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     6,  6,  6,  4,  4,  4,  4,  4,  4,  4,  4,  6,  6,  4,  6,  4,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  4,  6,  4,  6,  6,
+     4,  4,  4,  4,  4,  4,  6,  4,  0,  0,  0,  0,  0,  0,  0,  0,
+     6,  6,  4,  4,  4,  4,  6,  4,  4,  4,  4,  4,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  6,  6,  6,  4,
+     4,  4,  4,  4,  4,  4,  4,  4,  6,  4,  4,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     4,  6,  6,  6,  6,  6,  0,  6,  6,  0,  0,  4,  4,  6,  4,  5,
+     6,  5,  6,  4,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  6,  6,  6,  4,  4,  4,  4,  0,  0,  4,  4,  6,  6,  6,  6,
+     4,  0,  0,  0,  6,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  4,  4,  4,  4,  4,  4,  6,  5,  4,  4,  4,  4,  0,
+     0,  0,  0,  0,  0,  0,  0,  4,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  4,  4,  4,  4,  4,  4,  6,  6,  4,  4,  4,  0,  0,  0,  0,
+     0,  0,  0,  0,  5,  5,  5,  5,  5,  5,  4,  4,  4,  4,  4,  4,
+     4,  4,  4,  4,  4,  4,  4,  6,  4,  4,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  6,
+     4,  4,  4,  4,  4,  4,  4,  0,  4,  4,  4,  4,  4,  4,  6,  4,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
+     4,  4,  4,  4,  4,  4,  4,  4,  0,  6,  4,  4,  4,  4,  4,  4,
+     4,  6,  4,  4,  6,  4,  4,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  4,  4,  4,  4,  4,  4,  0,  0,  0,  4,  0,  4,  4,  0,  4,
+     4,  4,  4,  4,  4,  4,  5,  4,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  6,  6,  6,  6,  6,  0,
+     4,  4,  0,  6,  6,  4,  6,  4,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  4,  4,  6,  6,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     4,  4,  4,  4,  4,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     4,  4,  4,  4,  4,  4,  4,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  4,
+     0,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,
+     6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,
+     6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,
+     6,  6,  6,  6,  6,  6,  6,  6,  0,  0,  0,  0,  0,  0,  0,  4,
+     4,  4,  4,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  4,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     6,  6,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  4,  4,  0,
+     1,  1,  1,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  4,  6,  4,  4,  4,  0,  0,  0,  6,  4,  4,
+     4,  4,  4,  1,  1,  1,  1,  1,  1,  1,  1,  4,  4,  4,  4,  4,
+     4,  4,  4,  0,  0,  4,  4,  4,  4,  4,  4,  4,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  4,  4,  4,  4,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  4,  4,  4,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
+     4,  4,  4,  4,  4,  4,  4,  0,  0,  0,  0,  4,  4,  4,  4,  4,
+     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  0,  0,  0,
+     0,  0,  0,  0,  0,  4,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  4,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  4,  4,  4,  4,  4,
+     0,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     4,  4,  4,  4,  4,  4,  4,  0,  4,  4,  4,  4,  4,  4,  4,  4,
+     4,  4,  4,  4,  4,  4,  4,  4,  4,  0,  0,  4,  4,  4,  4,  4,
+     4,  4,  0,  4,  4,  0,  4,  4,  4,  4,  4,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  4,  4,  4,  4,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  4,  4,  4,  4,  4,  4,  4,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  4,  4,  4,  4,  4,
+     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1
+};
+
+RE_UINT32 re_get_grapheme_cluster_break(RE_UINT32 codepoint) {
+    RE_UINT32 field_2;
+    RE_UINT32 field_1;
+    RE_UINT32 field_0;
+    RE_UINT32 v;
+
+    field_2 = codepoint >> 10;
+    field_1 = (codepoint >> 5) & 0x1F;
+    field_0 = codepoint & 0x1F;
+
+    v = re_grapheme_cluster_break_table_1[field_2];
+    v = re_grapheme_cluster_break_table_2[(v << 5) | field_1];
+    v = re_grapheme_cluster_break_table_3[(v << 5) | field_0];
+
+    return v;
+}
+
+/* Grapheme_Extend. */
+static RE_UINT8 re_grapheme_extend_table_1[] = {
+     0,  1,  2,  3,  4,  5,  6,  7,  8,  9,  9, 10, 11,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9, 12, 13,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9, 14, 15,
+    16,  9, 17, 18, 19, 20, 21, 22,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9, 23, 24,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9, 25,
+     9,  9,  9,  9, 26,  9, 27,  9, 28,  9, 29,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+    30,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9
+};
+
+static RE_UINT8 re_grapheme_extend_table_2[] = {
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   1,   1,   1,   2,   0,   0,   0,   0,
+      0,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   4,   5,   6,   0,
+      7,   0,   8,   9,   0,   0,  10,  11,  12,  13,  14,   0,   0,  15,   0,  16,
+     17,  18,  19,   0,   0,   0,  20,  21,  22,  23,  24,  25,  26,  27,  28,  29,
+     30,  31,  32,  33,  30,  31,  34,  35,  26,  36,  37,  25,  38,  39,  40,   0,
+     41,  42,  43,  25,  26,  44,  45,  25,  46,  47,  28,  25,  26,   0,  48,   0,
+      0,  49,  50,   0,   0,  51,  52,   0,  53,  54,   0,  55,  56,  57,  58,   0,
+      0,  59,  60,  61,  62,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  63,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,  64,  64,  65,  65,   0,  66,  67,   0,
+     68,   0,   0,   0,  69,  70,   0,   0,   0,  71,   0,   0,   0,   0,   0,   0,
+     72,   0,  73,  74,   0,  13,  75,   0,  76,  77,  38,  78,  46,  79,   0,  80,
+      0,  81,   0,   0,   0,   0,  82,  83,   0,   0,   0,   0,   0,   0,   1,  84,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     85,   0,   0,   0,   0,   0,  13,  86,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,  87,   0,   0,   0,  88,   0,   0,   0,   1,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,  89,   0,   0,  90,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,  91,  42,   0,   0,  92,   0,   0,   0,   0,   0,   0,   0,   0,
+     93,  94,   0,   0,   0,   0,  95,  96,   0,  97,  98,   0,  22,  99,   0, 100,
+      0, 101, 102,  31,   0, 103,  26, 104,   0,   0,   0,   0,   0,   0,   0, 105,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,  39,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      2,   2,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  42,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 106,
+      0,   0,   0,   0,   0,   0,   0,  75,   0,   0,   0, 107,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    108, 109,   0,   0,   0,   0,   0,  69,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0, 110,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0, 111,   0,   0,   0,   0,  15,   0,   0,   0,   0,   0,
+     26, 112, 113,  88,  46, 114,   0,   0,  22, 115,   0, 116,  46, 117, 118,   0,
+      0, 119,   0,   0,   0,   0,  88, 120,  46,  47, 121, 122,   0,   0,   0,   0,
+      0, 112, 123,   0,   0, 124, 125,   0,   0,   0,   0,   0,   0, 126, 127,   0,
+      0, 128,  75,   0,   0, 129,   0,   0,  63, 130,   0,   0,   0,   0,   0,   0,
+      0, 131,   0,   0,   0,   0,   0,   0,   0, 132, 133,   0,   0,   0, 134,  75,
+    135, 136, 137,   0, 138,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0, 139,   0,   0, 140, 141,   0,   0,   0, 142, 143,   0, 144,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0, 145,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0, 146,   0, 147,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 148,   0, 149,   0,   0, 150,
+      0,   0,   0,   0, 151,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 152, 153, 154,   0,   0,
+      0,   0, 155,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      1, 156,   1, 157, 158, 159,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    160, 161,   0,   0,   0,   0,   0,   0,   0, 147,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0, 162,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0, 147,   0,   0,   0, 163,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   1,   1,   1,   0,   0,   0,   0,   1,   1,   1,   1,   1,   1,   1,   2,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0
+};
+
+static RE_UINT8 re_grapheme_extend_table_3[] = {
+      0,   0,   0,   0, 255, 255, 255, 255, 255, 255,   0,   0, 248,   3,   0,   0,
+      0,   0, 254, 255, 255, 255, 255, 191, 182,   0,   0,   0,   0,   0, 255,   7,
+      0, 248, 255, 255,   0,   0,   1,   0,   0,   0, 192, 159, 159,  61,   0,   0,
+      0,   0,   2,   0,   0,   0, 255, 255, 255,   7,   0,   0, 192, 255,   1,   0,
+      0, 248,  15,  32,   0,   0, 192, 251, 239,  62,   0,   0,   0,   0,   0,  14,
+      0,   0, 248, 255, 251, 255, 255, 255,   7,   0,   0,   0,   0,   0,   0,  20,
+    254,  33, 254,   0,  12,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,  80,
+     30,  32, 128,   0,  12,   0,   0,  64,   6,   0,   0,   0,   0,   0,   0,  16,
+    134,  57,   2,   0,   0,   0,  35,   0, 190,  33,   0,   0,  12,   0,   0, 252,
+      0,   0,   0, 208,  30,  32, 224,   0,   4,   0,   0,   0,   0,   0,   0,  64,
+      1,  32, 128,   0,  17,   0,   0,   0,   0,   0,   0, 192, 193,  61,  96,   0,
+      0,   0,   0, 144,  68,  48,  96,   0,   3,   0,   0,   0,   0,   0,   0,  88,
+      0, 132,  92, 128,   0,   0, 242,   7, 128, 127,   0,   0,   0,   0, 242,  31,
+      0,  63,   0,   0,   0,   0,   0,   3,   0,   0, 160,   2,   0,   0, 254, 127,
+    223, 224, 255, 254, 255, 255, 255,  31,  64,   0,   0,   0,   0, 224, 253, 102,
+      0,   0,   0, 195,   1,   0,  30,   0, 100,  32,   0,  32,   0,   0,   0, 224,
+      0,   0,  28,   0,   0,   0,  12,   0,   0,   0, 176,  63,  64, 254,  15,  32,
+      0,  56,   0,   0,  96,   0,   0,   0,   0,   2,   0,   0, 135,   1,   4,  14,
+      0,   0, 128,   9,   0,   0,  64, 127, 229,  31, 248, 159,   1,   0,   0,   0,
+     15,   0,   0,   0,   0,   0, 240,  23,   0, 248,  15,   0,  60,  59,   0,   0,
+     64, 163,   3,   0,   0, 240, 207,   0,   0,   0, 247, 255, 253,  33,  16,   3,
+    255, 255, 255, 251,   0,  16,   0,   0, 255, 255,   1,   0,   0, 128,   3,   0,
+      0,   0,   0, 128,   0, 252,   0,   0,   0,   0,   0,   6,   0, 128, 247,  63,
+      0,   0,   3,   0,  68,   8,   0,   0,  96,  16,   0,   0,  48,   0,   0,   0,
+    255, 255,   3, 128, 192,  63,   0,   0, 128, 255,   3,   0,   0,   0, 200,  51,
+     32,   0,   0,   0,   0, 126, 102,   0,   8,  16,   0,   0,   0,   0, 157, 193,
+      0,  48,  64,   0,  32,  33,   0,   0,   0,   0,   0,  32,   0,   0, 192,   7,
+    110, 240,   0,   0,   0,   0,   0, 135, 240,   0,   0,   0,   0,  24,   0,   0,
+      0,   0,   0, 255, 127,   0,   0,   0,   0,   0, 120,   6, 128, 239,  31,   0,
+      0,   0,   8,   0,   0,   0, 192, 127,   0, 158,   0,   0,   0, 128, 211,  64,
+    248,   7,   0,   0,   1,   0, 128,   0, 192,  31,  31,   0,  92,   0,   0,  64,
+      0,   0, 249, 165,  13,   0,   0,   0,   0, 128,  60, 176,   1,   0,   0,  48,
+      0,   0, 248, 167,   0,  40, 191,   0, 188,  15,   0,   0,   0, 128, 255,   6,
+      0,   0,   1,  88,   8,   0,   0,   0,   0,   0, 240,  12, 254,   7,   0,   0,
+      0,   0, 248, 121, 128,   0, 126,  14,   0, 252, 127,   3,   0,   0, 127, 191,
+      0,   0, 252, 255, 255, 252, 109,   0,   0,   0, 126, 180, 191,   0,   0,   0,
+      0,   0, 163,   0,   0,   0,  24,   0,   0,   0,  31,   0,   0,   0, 127,   0,
+      0, 128,   0,   0,   0, 128,   7,   0,  16,   0,   0,   0,   0,   0,   0,  96,
+    160, 195,   7, 248, 231,  15,   0,   0,   0,  60,   0,   0,  28,   0,   0,   0,
+    255, 255, 127, 248, 255,  31,  32,   0,  16,   0,   0, 248, 254, 255,   0,   0,
+    127, 255, 255, 249, 219,   7,   0,   0,   0, 240,   0,   0, 240,   7,   0,   0
+};
+
+RE_UINT32 re_get_grapheme_extend(RE_UINT32 codepoint) {
+    RE_UINT32 field_2;
+    RE_UINT32 field_1;
+    RE_UINT32 field_0;
+    RE_UINT32 offset;
+    RE_UINT32 v;
+
+    field_2 = codepoint >> 10;
+    field_1 = (codepoint >> 5) & 0x1F;
+    field_0 = (codepoint >> 3) & 0x3;
+    offset = codepoint & 0x7;
+
+    v = re_grapheme_extend_table_1[field_2];
+    v = re_grapheme_extend_table_2[(v << 5) | field_1];
+    v = re_grapheme_extend_table_3[(v << 2) | field_0];
+
+    return (v >> offset) & 0x1;
+}
+
+/* Grapheme_Link. */
+static RE_UINT8 re_grapheme_link_table_1[] = {
+     0,  0,  1,  2,  3,  4,  5,  0,  0,  0,  0,  6,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  7,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  8,  0,  9, 10, 11, 12,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0
+};
+
+static RE_UINT8 re_grapheme_link_table_2[] = {
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  0,  0,  0,  1,  0,
+     0,  0,  1,  0,  0,  0,  1,  0,  0,  0,  1,  0,  0,  0,  1,  0,
+     0,  0,  1,  0,  0,  0,  1,  0,  0,  2,  1,  0,  0,  0,  3,  0,
+     0,  4,  0,  0,  0,  4,  0,  0,  0,  0,  0,  0,  5,  0,  0,  0,
+     0,  6,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  7,  7,  0,  0,  0,  0,  8,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  9,  0,  0,  0,  0,  0,  0,  5,  0,  0, 10,  0, 11,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 12,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    13, 14,  0,  0,  0,  0,  5,  0,  0,  0, 15,  0,  0,  0,  9,  0,
+     0,  0,  0,  0,  0,  0,  0, 16,  0,  0,  0,  0,  0,  0,  0,  1,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0, 12,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0, 13, 12,  0, 17,  0,  0,  0, 18,  0,  0,  0,  0,  9,  0,
+     0, 19,  0,  0,  0,  0,  0,  3,  0,  0,  1,  0,  0,  0,  0,  0,
+     0,  0, 20,  0,  0,  0, 20,  0,  0,  0,  0,  0,  0, 12,  0,  0,
+     0, 12,  0,  0,  0, 16,  0,  0,  0, 21,  0,  0,  0,  0,  0,  0,
+     0, 17,  0,  0,  0,  0,  0,  0,  0, 22,  0,  0,  0,  0,  0,  9,
+     0,  7, 23,  0, 17,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0, 12,  0,  0,  0,  0,  0,  0,  0,  0, 24,  0, 25,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0
+};
+
+static RE_UINT8 re_grapheme_link_table_3[] = {
+      0,   0,   0,   0,   0,  32,   0,   0,   0,   0,   0,  24,   0,   4,   0,   0,
+      0,   0,   0,   4,  16,   0,   0,   0,   0,   0,   0,   6,   0,   0,  16,   0,
+      0,   0,   4,   0,   1,   0,   0,   0,   0,  12,   0,   0,   0,   0,  12,   0,
+      0,   0,   0, 128,  64,   0,   0,   0,   0,  16,   0,   0,   0,   0,   8,   0,
+      0,   0,  64,   0,   0,   0,   0,   2,   0,   0,  24,   0,   0,   0,  32,   0,
+      4,   0,   0,   0,   0,   8,   0,   0,   0,   0,   0,  96, 128,   0,   0,   0,
+     48,   0,   0,   0,   0,   0, 128,   0
+};
+
+RE_UINT32 re_get_grapheme_link(RE_UINT32 codepoint) {
+    RE_UINT32 field_2;
+    RE_UINT32 field_1;
+    RE_UINT32 field_0;
+    RE_UINT32 offset;
+    RE_UINT32 v;
+
+    field_2 = codepoint >> 10;
+    field_1 = (codepoint >> 5) & 0x1F;
+    field_0 = (codepoint >> 3) & 0x3;
+    offset = codepoint & 0x7;
+
+    v = re_grapheme_link_table_1[field_2];
+    v = re_grapheme_link_table_2[(v << 5) | field_1];
+    v = re_grapheme_link_table_3[(v << 2) | field_0];
+
+    return (v >> offset) & 0x1;
+}
+
+/* Hangul_Syllable_Type. */
+static RE_UINT8 re_hangul_syllable_type_table_1[] = {
+     0,  0,  0,  0,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  2,  3,  4,  5,  6,  7,
+     8,  9,  3,  4,  5, 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0
+};
+
+static RE_UINT8 re_hangul_syllable_type_table_2[] = {
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  1,  1,  1,  2,  2,  3,  4,  4,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  5,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     6,  7,  8,  9, 10, 11, 12,  6,  7,  8,  9, 10, 11, 12,  6,  7,
+     8,  9, 10, 11, 12,  6,  7,  8,  9, 10, 11, 12,  6,  7,  8,  9,
+    10, 11, 12,  6,  7,  8,  9, 10, 11, 12,  6,  7,  8,  9, 10, 11,
+    12,  6,  7,  8,  9, 10, 11, 12,  6,  7,  8,  9, 10, 11, 12,  6,
+     7,  8,  9, 10, 11, 12,  6,  7,  8,  9, 10, 11, 12,  6,  7,  8,
+     9, 10, 11, 12,  6,  7,  8,  9, 10, 11, 12,  6,  7,  8,  9, 10,
+    11, 12,  6,  7,  8,  9, 10, 11, 12,  6,  7,  8,  9, 10, 11, 12,
+     6,  7,  8,  9, 10, 11, 12,  6,  7,  8,  9, 10, 11, 12,  6,  7,
+     8,  9, 10, 11, 12,  6,  7,  8,  9, 10, 11, 12,  6,  7,  8,  9,
+    10, 11, 12,  6,  7,  8,  9, 10, 11, 12,  6,  7,  8,  9, 10, 11,
+    12,  6,  7,  8,  9, 10, 11, 12,  6,  7,  8,  9, 10, 11, 12,  6,
+     7,  8,  9, 10, 11, 12,  6,  7,  8,  9, 10, 11, 12,  6,  7,  8,
+     9, 10, 11, 12,  6,  7,  8,  9, 10, 11, 12,  6,  7,  8,  9, 10,
+    11, 12,  6,  7,  8,  9, 10, 11, 12,  6,  7,  8,  9, 10, 11, 12,
+    11, 12,  6,  7,  8,  9, 10, 11, 12,  6,  7,  8,  9, 10, 11, 12,
+     6,  7,  8,  9, 10, 11, 12,  6,  7,  8,  9, 10, 11, 13, 14, 15
+};
+
+static RE_UINT8 re_hangul_syllable_type_table_3[] = {
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3,
+    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0,
+    4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+    5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 4, 5, 5, 5,
+    5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+    5, 5, 5, 5, 5, 5, 5, 5, 4, 5, 5, 5, 5, 5, 5, 5,
+    5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+    5, 5, 5, 5, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+    5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+    4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+    5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 4, 5, 5, 5,
+    5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+    5, 5, 5, 5, 5, 5, 5, 5, 4, 5, 5, 5, 5, 5, 5, 5,
+    5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+    5, 5, 5, 5, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+    5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+    5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 3, 3, 3, 3, 3,
+    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0
+};
+
+RE_UINT32 re_get_hangul_syllable_type(RE_UINT32 codepoint) {
+    RE_UINT32 field_2;
+    RE_UINT32 field_1;
+    RE_UINT32 field_0;
+    RE_UINT32 v;
+
+    field_2 = codepoint >> 10;
+    field_1 = (codepoint >> 5) & 0x1F;
+    field_0 = codepoint & 0x1F;
+
+    v = re_hangul_syllable_type_table_1[field_2];
+    v = re_hangul_syllable_type_table_2[(v << 5) | field_1];
+    v = re_hangul_syllable_type_table_3[(v << 5) | field_0];
+
+    return v;
+}
+
+/* Hex_Digit. */
+RE_UINT32 re_get_hex_digit(RE_UINT32 codepoint) {
+    if (0x30 <= codepoint && codepoint <= 0x39)
+        return 1;
+    if (0x41 <= codepoint && codepoint <= 0x46)
+        return 1;
+    if (0x61 <= codepoint && codepoint <= 0x66)
+        return 1;
+    if (0xFF10 <= codepoint && codepoint <= 0xFF19)
+        return 1;
+    if (0xFF21 <= codepoint && codepoint <= 0xFF26)
+        return 1;
+    if (0xFF41 <= codepoint && codepoint <= 0xFF46)
+        return 1;
+
+    return 0;
+}
+
+/* Hyphen. */
+static RE_UINT8 re_hyphen_table_1[] = {
+    0, 1, 2, 2, 2, 2, 3, 2, 4, 2, 2, 5, 6, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 7,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2
+};
+
+static RE_UINT8 re_hyphen_table_2[] = {
+    0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 7, 0, 0, 0, 0, 1, 0, 0, 8, 0, 0, 0, 0
+};
+
+static RE_UINT8 re_hyphen_table_3[] = {
+      0,   0,   0,   0,   0,  32,   0,   0,   0,   4,   0,   0,  64,   0,   0,   0,
+      0,   0,   3,   0,   0,   0, 128,   0,   0,   0,   0,   8,   8,   0,   0,   0,
+     32,   0,   0,   0
+};
+
+RE_UINT32 re_get_hyphen(RE_UINT32 codepoint) {
+    RE_UINT32 field_2;
+    RE_UINT32 field_1;
+    RE_UINT32 field_0;
+    RE_UINT32 offset;
+    RE_UINT32 v;
+
+    field_2 = codepoint >> 10;
+    field_1 = (codepoint >> 5) & 0x1F;
+    field_0 = (codepoint >> 3) & 0x3;
+    offset = codepoint & 0x7;
+
+    v = re_hyphen_table_1[field_2];
+    v = re_hyphen_table_2[(v << 5) | field_1];
+    v = re_hyphen_table_3[(v << 2) | field_0];
+
+    return (v >> offset) & 0x1;
+}
+
+/* ID_Continue. */
+static RE_UINT8 re_id_continue_table_1[] = {
+     0,  1,  2,  3,  4,  5,  6,  7,  8,  9,  9, 10, 11, 12, 12, 12,
+    12, 12, 12, 13, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+    12, 12, 12, 12, 12, 12, 12, 14, 12, 15, 16, 12, 12, 12, 12, 12,
+    12, 12, 12, 12, 12, 17,  9,  9,  9,  9,  9,  9,  9,  9, 18, 19,
+    20, 21, 22, 23, 24, 25, 26, 27, 28, 29,  9,  9, 12, 30,  9,  9,
+     9, 31,  9,  9,  9,  9,  9,  9,  9,  9, 32, 33, 12, 12, 12, 12,
+    12, 34, 12, 35,  9,  9,  9,  9,  9,  9,  9,  9, 36,  9,  9, 37,
+     9,  9,  9,  9, 38, 39, 40,  9, 41,  9, 42, 43,  9,  9, 44,  9,
+    12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+    12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+    12, 12, 12, 12, 12, 12, 12, 12, 12, 45, 12, 12, 12, 46, 47, 12,
+    12, 12, 12, 48, 12, 12, 12, 12, 12, 12, 49,  9,  9,  9, 50,  9,
+    12, 12, 12, 12, 51,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+    52,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9
+};
+
+static RE_UINT16 re_id_continue_table_2[] = {
+      0,   1,   2,   3,   0,   4,   5,   5,   6,   6,   6,   6,   6,   6,   6,   6,
+      6,   6,   6,   6,   6,   6,   7,   8,   6,   6,   6,   9,  10,  11,   6,  12,
+      6,   6,   6,   6,  13,   6,   6,   6,   6,  14,  15,   6,  16,  17,  18,  19,
+     20,   6,   6,  21,   6,   6,  22,  23,  24,   6,  25,   6,   6,  26,   6,  27,
+      6,  28,  29,  30,   0,  31,  32,  11,   6,   6,   6,  33,  34,  35,  36,  37,
+     38,  39,  40,  41,  42,  43,  44,  45,  46,  43,  47,  48,  49,  50,  51,  52,
+     53,  54,  55,  56,  57,  58,  59,  60,  53,   6,  61,  62,  63,  64,  65,  66,
+     67,  68,  69,   0,  70,  71,  72,   0,  73,  74,  75,  76,  77,  78,  79,   0,
+      6,   6,  80,   6,  81,   6,  82,  83,   6,   6,   6,   6,   6,   6,   6,   6,
+      6,   6,  84,   6,  85,  86,  87,   6,  88,   6,  89,  90,  91,   6,   6,  92,
+     67,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,
+      6,   6,   6,  93,   3,   6,   6,  94,  95,  96,  97,  98,   6,   6,  99, 100,
+    101,   6,   6, 102,   6, 103,   6, 104, 105, 106, 107, 108,   6, 109, 110,   0,
+     29,   6, 105, 111, 112, 113, 114,   0,   6,   6, 115, 116,   6,   6,   6,  97,
+      6, 117, 118,  81, 119,  89, 120,  68,   6,   6,   6,   6,   6,   6,   6, 121,
+      6,   6,   6,   6,   6,   6,   6,   6,  92,   6, 122,  81,   6, 123, 124, 125,
+      0, 126, 127, 128, 129,   0, 129, 130, 131, 132, 133,   6, 134,   0,   0,   0,
       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,  36,  36,  36,  36,  36,  36,  36,  41,  44, 209,   0,   0,
-     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  44, 191, 122,   0,
-     36, 122,   0,   0,   7,   7, 111,   0,  62,  36,  36,  36,  36,  36,   0,  82,
-     36,  36,  36,  36,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     11,  11,  11,  11,  11,  11,  11,  11,  15,  15,  15,  15,  15,  15,  15,  15,
-      0,   0,   0,   0,   0,   0, 122,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      6, 135, 105,   6,   6,   6,   6, 136,   6,  82,   6, 137, 138, 139, 139,   6,
       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,
-     36,  36,  61,  93,  88,  44,  44,  44,  44,  44,  44,  44,  44,  44,  44,  44,
-     44,  44,   0,  93, 117,  36,  36,  36,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,  99,   0,   0,   0,   0,   0,   0,   0,
-     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,
-     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,   0,   0,
-     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,
-     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  61,   0,   0,   0,
-     36,  36,  36,  36,  36,  36,  36,  61,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,  61,   0,   0,   0,   0,  36,   0,   0,  36,  36,  36,  36,
-     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,
-     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,   0,
-     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,
-     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  61,   0,  36,  36,  36, 104,
-     36,  36, 104,   0,  36,  36,  41, 220,  63,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,  58,  89,  58, 221,  63, 222,  44,
-     66,  58,  44,   0,   0,   0,   0,   0,   0,   0, 106,  89,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-    106, 116,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     11,  11,  11,  11,  11,  11, 159,  15,  15,  15,  15,  15,  15,  11,  11,  11,
-     11,  11,  11, 159,  15, 139,  15,  15,  15,  15,  11,  11,  11,  11,  11,  11,
-    159,  15,  15,  15,  15,  15,  15,  49,  48, 223,  10,  49,  11, 159, 170,  14,
-     15,  14,  15,  15,  11,  11,  11,  11,  11,  11, 159,  15,  15,  15,  15,  15,
-     15,  50,  22,  10,  11,  49,  11, 224,  15,  15,  15,  15,  15,  15,  50,  22,
-     11, 160, 166,  11, 224,  15,  15,  15,  15,  15,  15,  11,  11,  11,  11,  11,
-     11, 159,  15,  15,  15,  15,  15,  15,  11,  11,  11,  11,  11,  11, 159,  15,
-     15,  15,  15,  15,  15,  11,  11,  11,  11,  11,  11, 159,  15,  15,  15,  15,
-     15,  15,  11,  11,  11,  11,  11,  11, 159,  15,  15,  15,  15,  15,  15,  11,
-     11,  11,  11,  11,  11, 159,  15,  15,  15,  15,  15,  15,  11,  11,  11,  11,
-     11,  11, 159,  15,  15,  15,  15,  15,  15,  39,  11,  11,  11,  11,  11,  11,
-    224,  15,  15,  15,  15,  15,  24,  15,  33,  11,  11,  11,  11,  11,  22,  15,
-     15,  15,  15,  15,  15, 139,  15,  11,  11,  11,  11,  11,  11, 224,  15,  15,
-     15,  15,  15,  24,  15,  33,  11,  11,  11,  11,  11,  22,  15,  15,  15,  15,
-     15,  15, 139,  15,  11,  11,  11,  11,  11,  11, 224,  15,  15,  15,  15,  15,
-     24,  15,  27, 100,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
-     44,  44,  44,  44,  44,  44,  44,  44,  44,  44,  44,  44,  44,  66,  93,  44,
-     44,  44,  44,  44,  44,  44,  44,  44,  44,  44,  44, 116,   0,  86,   0,   0,
-      0, 116, 122,   0,   0,   0,  93,  44,  58,  44,  44,  44,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     44,  66,  44,  44,  44,  44,  97,  44,  59,  75,  66,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36, 104,  44, 117,  36,  41,
-      7,   7, 111, 108,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  44,   7,   7, 111,   0,
-     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,
-     36, 104,   0,   0,  44,  66,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     11,  11,  11,  11,  11,  11,  11,  11, 159,  15,  15,  15,  15,  15,  15,  15,
-     15,  44, 117,   0,   7,   7, 111,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     36,  82,  36,  36,  36,  36,  36,  36, 102,  78,  82,  36,  61,  36, 112,   0,
-    108,  62, 112,  82, 102,  78, 112, 112, 102,  78,  61,  36,  61,  36,  82,  43,
-     36,  36,  99,  36,  36,  36,  36,   0,  82,  82,  99,  36,  36,  36,  36,   0,
+    140, 141,  67,   6, 142,  67,   6,  83, 143,  14,   6,   6, 144,   6,   0,  24,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,
+      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,
+      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   0,   0,
+      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,
+      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,
+      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,  78,
+      6,   6,   6,   6, 145,   0,  24,  81,   6,   6,   6,   6,   6,   6,   6,   6,
+    146, 147,   6, 148,   6,   6,   6,  26, 149, 150,   6,   6, 151,   6, 152, 153,
+      6, 154,   6,  97,   6,   6, 155, 156,   6, 157,  97,  78,   6,   6, 158, 105,
+      6, 138, 159, 160,   6,   6, 161, 162, 163, 164,  83,  80,   6,   6,   6, 165,
+      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,
+      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6, 166, 167,  29,
+      0,   0,   0,   0,   0,   0,   0,   0,   6,   6,   6,   6,   6,   6,   6,   6,
+      6,   6,   6, 157,   6,   6, 168,   0, 169, 170, 171,   6,   6,  26, 172,   6,
+      6,   6,   6,   6,   6,   6,   6,   6,   6,  81,  24,   6, 173,   6, 174, 175,
+     91, 176, 177, 178,   6,   6,   6,  78,   1,   2,   3, 107,   6, 105, 179,   0,
+    180, 181, 182,   0,   6,   6,   6,  68,   0,   0,   6,  96,   0,   0,   0, 183,
+      0,   0,   0,   0,  78,   6, 184, 114,   6, 185, 103,  68,  81,   6, 186,   0,
+      6,   6,   6,   6,  81,  80, 187,  29,   6, 188,   6, 189,   0,   0,   0,   0,
+      6,   6,   6,   6,   6,   6,   6,   6,   6, 138, 104, 174,   0,   0,   0,   0,
+    190, 191, 104, 138, 105,   0,   0, 192, 104, 168,   0,   0,   6, 193,   0,   0,
+    194, 195,   0,  78,  78,   0,  75, 196,   6, 104, 104, 197,  26,   0,   0,   0,
+      6,   6, 134,   0,   6, 197,   6, 197,   6, 198,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   6, 199,   0,   0,  78, 200, 184,   0,   0,  24, 201, 138,
+      6,   6, 196, 202,   6,  68,  24, 203,   6,  31, 204, 205,   6,   6, 206,   0,
+    207, 208,   0,   0, 209, 119,   6, 210,  34, 211, 212, 213,   0,   0,   0,   0,
+      6,   6, 214, 215,   6,   6, 216,   0,   0,   0,   0,   0,   6, 217, 218,   0,
+      6,   6, 219,   0,   6, 102, 100,   0,  89, 115,   0,   0,   0,   0,   0,   0,
+      6,  68,   0,   0,   0,   6,   6, 220, 221, 222, 223,   0,   0, 224, 225, 226,
+      6, 105, 200,   6, 227,   0,   6, 102,   0,   0,   0,   0,   0,   0,   0,   0,
+    228,   5, 229, 230, 173, 231,   0,   0, 232, 233, 198, 234, 235, 100,   0,   0,
+      0,   0,   0,   0,   0,   0,   0, 138,   0,   0,   0,   0,   0, 236,   0,   0,
+      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,
+      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6, 168,   0,   0,   0,
+      6,   6,   6, 144,   6,   6,   6,   6,   6,   6, 189,   0,   0,   0,   0,   0,
       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  11,  11,  11,  11,
-     11,  11, 123,   0,  11,  11,  11,  11,  11,  11, 123,   0,  11,  11,  11,  11,
-     11,  11, 123,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      6, 144,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,
+      6,   6, 196,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,
+      6, 102, 105, 100,   0,   0,  24, 108,   6, 138, 223, 237,  91,   0,   0,   0,
       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 167, 127,   0,
-     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,
-     36,  36,  36,  36,  36,  61,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36, 104,   0,   0,
-     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,
-     36,  36,  36,  36,  36,  36,  36,  41,  36,  36,  36,  36,  36,  36,  36,  36,
-     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,
-     36,  36,  36,  36,  36,  36,  36,  36,  41,   0,   0,   0,  36,  36,  36,  36,
-     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,
-     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,
-     36,  36,  36,  36,  36,  36,  36,  36, 104,   0,   0,   0,   0,   0,   0,   0,
-     36,  36,  36,  36,  36,  36,  36,  41,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   6,   6,   0,   0,   0,   0,   6,   6, 238,   6, 239,   0,   0, 240,
+      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,
+      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6, 117,
+      6,   6,   6,   6,   6,   6, 104,   0, 134,   0,   0,   0,   0,   0,   0,   0,
       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     20,   0,   0,   0,   0,   0,   0,   0,  44,  44,  44,  44,  44,  44,  44,  44,
-     44,  44,  44,  44,  44,  44,  44,  44,  44,  44,  44,  44,  44,  44,  44,  44,
-     44,  44,  44,  44,  44,  44,  44,  44,  44,  44,  44,  44,  44,  44,  44,  44,
-     44,  44,  44,  44,  44,  44,  44,  44,  44,  44,  44,  44,  44,  44,  44,  44,
-     44,  44,  44,  44,  44,  44,  44,  44,  44,  44,  44,  44,  44,  44,  44,  44,
-     44,  44,  44,  44,  44,  44,  44,  44,  44,  44,  44,  44,   0,   0,   0,   0,
+      6,   6,   6,   6,   6,   6,   6,   6, 105,   0, 241, 204,   6,   6,   6,   6,
+      6,   6,   6,   6,   6,   6,   6,  29,   0,   0,   0,   0,   0,   0,   0,   0,
+      6,   6,   6, 242, 243,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 244, 245, 246,   0,   0,
+      0,   0, 247,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      6,   6,  31,   6, 248, 249, 250,   6, 251, 252, 253,   6,   6,   6,   6,   6,
+      6,   6,   6,   6,   6, 254, 255,  83,  31,  31, 135, 135, 228, 228, 256,   6,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      6, 257,   6, 258, 259, 260,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    261, 262,   0,   0,   0,   0,   0,   0,   6, 263, 264,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   6, 168,   0,   0,   0,   0,   0,   0,   0,   0,
+      6,   6,   6,   6,   6,   6, 265,   0,   6,   6, 115,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    250, 266, 267, 268, 269, 270,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,
+      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,
+      6,   6,   6,   6,   6,   6,  81,   0,   6,   6,   6,   6,   6,   6,   6,   6,
+      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,
+      6,   6,   6,   6,   6,   6,   6,   6,   6,  96,   6,   6,   6,   6,   6,   6,
+     81,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,
+      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,
+      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,
+      6,   6,   6,   6,   6, 271,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,
+      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,
+      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6, 114,
+      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,
+     81,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,
+      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,  30,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   6,   6,   6,   6,   6,   6,   6,  91,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0
+};
+
+static RE_UINT8 re_id_continue_table_3[] = {
+      0,   0,   0,   0,   0,   0, 255,   3, 254, 255, 255, 135, 254, 255, 255,   7,
+      0,   4, 160,   4, 255, 255, 127, 255, 255, 255, 255, 255, 195, 255,   3,   0,
+     31,  80,   0,   0, 255, 255, 223, 188, 192, 215, 255, 255, 251, 255, 255, 255,
+    255, 255, 191, 255, 251, 252, 255, 255, 255, 255, 254, 255, 255, 255, 127,   2,
+    255,   1, 254, 255, 255, 255, 255, 191, 182,   0, 255, 255, 255, 135,   7,   0,
+      0,   0, 255,   7, 255, 195, 255, 255, 255, 255, 239, 159, 255, 253, 255, 159,
+      0,   0, 255, 255, 255, 231, 255, 255, 255, 255,   3,   0, 255, 255,  63,  36,
+    255,  63,   0,   0, 255, 255, 255,  15, 255,   7,   0,   0, 255, 255, 223, 255,
+    255,   0, 248, 255, 207, 255, 254, 255, 239, 159, 249, 255, 255, 253, 197, 243,
+    159, 121, 128, 176, 207, 255,   3,  80, 238, 135, 249, 255, 255, 253, 109, 211,
+    135,  57,   2,  94, 192, 255,  63,   0, 238, 191, 251, 255, 255, 253, 237, 243,
+    191,  59,   1,   0, 207, 255,   0, 254, 238, 159, 249, 255, 159,  57, 224, 176,
+    207, 255,   2,   0, 236, 199,  61, 214,  24, 199, 255, 195, 199,  61, 129,   0,
+    192, 255,   0,   0, 255, 223, 253, 255, 255, 253, 255, 227, 223,  61,  96,   7,
+    207, 255,   0,   0, 239, 223, 253, 255, 255, 253, 239, 243, 223,  61,  96,  64,
+    207, 255,   6,   0, 223, 125, 240, 128, 207, 255,   0, 252, 238, 255, 127, 252,
+    255, 255, 251,  47, 127, 132,  95, 255, 192, 255,  12,   0, 254, 255, 255, 255,
+    255, 255, 255,   7, 255, 127, 255,   3, 214, 247, 255, 255, 175, 255, 255,  63,
+     95,  63, 255, 243,   1,   0,   0,   3, 255,   3, 160, 194, 255, 254, 255, 255,
+    255,  31, 254, 255, 223, 255, 255, 254, 255, 255, 255,  31,  64,   0,   0,   0,
+    255,   3, 255, 255, 255, 255, 255,  63, 191,  32, 255, 255, 255, 255, 255, 247,
+    255,  61, 127,  61, 255,  61, 255, 255, 255, 255,  61, 127,  61, 255, 127, 255,
+    255, 255,  61, 255, 255, 255, 255, 231,   0, 254,   3,   0, 255, 255,   0,   0,
+    255, 255,  63,  63, 255, 159, 255, 255, 255, 199, 255,   1, 255, 223,  31,   0,
+    255, 255,  31,   0, 255, 255,  15,   0, 255, 223,  13,   0, 255, 255, 143,  48,
+    255,   3,   0,   0,   0,  56, 255,   3, 255, 255, 255,   1, 255,   7, 255, 255,
+    255, 255,  63,   0, 255, 255, 255, 127, 255,  15, 255,  15, 192, 255, 255, 255,
+    255,  63,  31,   0, 255,  15, 255, 255, 255,   3, 255,   7, 255, 255, 255, 159,
+    255,   3, 255,   3, 128,   0, 255, 191,   1,   0,   0,   0, 255,  15, 255,   3,
+      0, 248,  15,   0, 255, 255, 255,   0, 255, 227, 255, 255, 255,   1, 255, 255,
+      0,   0, 247, 255, 255, 255, 255, 251,  63,  63, 255, 170, 255, 255, 223,  95,
+    220,  31, 207,  15, 255,  31, 220,  31,   0,   0,   0, 128,   1,   0,  16,   0,
+      0,   0,   2, 128,   0,   0, 255,  31, 226, 255,   1,   0, 132, 252,  47,  63,
+     80, 253, 255, 243, 224,  67,   0,   0, 255,   1,   0,   0, 255, 127, 255, 255,
+     31, 248,  15,   0, 255, 128,   0, 128, 255, 255, 127,   0, 127, 127, 127, 127,
+    224,   0,   0,   0, 254, 255,  62,  31, 255, 255, 127, 254, 224, 255, 255, 255,
+    255, 127,   0,   0, 255,  31,   0,   0, 255,  31, 255, 255, 255,  15,   0,   0,
+    255, 255, 240, 191,   0,   0, 128, 255, 252, 255, 255, 255, 255, 249, 255, 255,
+    252,   7,   0,   0,   0,   0, 224, 255, 255,  16,   0,   0,  63,   0, 255,   3,
+    255, 255, 255, 232, 255,  63, 255, 255,   1, 128, 255,   3, 255,  63, 255,   3,
+    255, 255, 127, 252,   7,   0,   0,  56, 255, 255, 124,   0, 126, 126, 126,   0,
+    127, 127, 255, 255, 255,  55, 255,   3,  15,   0, 255, 255, 127, 248, 255, 255,
+    255, 255, 255,   3, 127,   0, 248, 224, 255, 253, 127,  95, 219, 255, 255, 255,
+      0,   0, 248, 255, 255, 255, 252, 255, 255,   0,   0,   0,   0,   0, 255,  15,
+    255, 255,  24,   0,   0, 224,   0,   0,   0,   0, 223, 255, 252, 252, 252,  28,
+    255, 239, 255, 255, 127, 255, 255, 183, 255,  63, 255,  63,   0,   0,   0,  32,
+    255, 255,   1,   0,   0, 224, 255, 255,  15, 255,  62,   0, 255, 255,  15, 255,
+    255,   0, 255, 255,  15,   0,   0,   0,  63, 253, 255, 255, 255, 255, 191, 145,
+    255, 255,  55,   0, 255, 255, 255, 192, 111, 240, 239, 254, 255, 255,  63, 135,
+    127,   0,   0,   0, 255, 255,   7,   0, 255,   0, 255,   3, 255,  27,   3,   0,
+    128,   0, 255, 255,  31,   0,   0,   0, 192, 255,   0, 128, 255,   1, 255,   3,
+    240,   0, 255, 255, 255, 255,  79,   0,  31, 222, 255,  23, 255, 255, 251, 255,
+    255, 255, 255,  64, 127, 189, 255, 191, 255,   7, 255,   3, 255, 253, 237, 251,
+    159,  57, 129, 224, 207,  31,  31,   0, 255,   7, 255, 195,   3,   0,   0,   0,
+    191,   0, 255,   3, 255, 255,  63, 255,   1,   0,   0,  63,  17,   0, 255,   3,
+    255,   3,   0, 128, 127, 242, 111, 255, 255, 255, 191, 249,  15,   0, 255,   3,
+    255, 252, 255, 255, 255, 255, 255, 252,  27,   0,   0,   0, 255, 255, 255,  35,
+    255, 253, 255, 255,   1,   0, 255,   3,   0,   0, 252, 255, 255, 254, 127,   0,
+    127, 251, 255, 255, 255, 255, 127, 180, 191, 253, 255, 255, 255, 127, 251,   1,
+      0,   0,   1,   0, 248, 255, 255, 224, 255, 135, 255, 255, 255, 128, 255, 255,
+     27,   0,   3,   0,   0,   0,   7,   0, 255,   7, 255,  31, 255,   1, 255,  99,
+    224, 227,   7, 248, 231,  15,   0,   0,   0,  60,   0,   0,  28,   0,   0,   0,
+    255, 255, 255, 223, 100, 222, 255, 235, 239, 255, 255, 255, 191, 231, 223, 223,
+    255, 255, 255, 123,  95, 252, 253, 255,  63, 255, 255, 255, 253, 255, 255, 247,
+    247, 207, 255, 255, 255, 255, 127, 248, 255,  31,  32,   0,  16,   0,   0, 248,
+    254, 255,   0,   0, 127, 255, 255, 249, 219,   7,   0,   0, 255,  31, 255,  63,
+    255,  67,   0,   0,  31,   0, 127,   0, 150, 254, 247,  10, 132, 234, 150, 170,
+    150, 247, 247,  94, 255, 251, 255,  15, 238, 251, 255,  15,   3,   0, 255, 255
 };
 
-static RE_UINT8 re_sentence_break_stage_4[] = {
-     0,  0,  0,  0,  0,  6,  2,  6,  6,  1,  0,  0,  6, 12, 13,  0,
-     0,  0,  0, 13, 13, 13,  0,  0, 14, 14, 11,  0, 10, 10, 10, 10,
-    10, 10, 14,  0,  0,  0,  0, 12,  0,  8,  8,  8,  8,  8,  8,  8,
-     8,  8,  8, 13,  0, 13,  0,  0,  0,  7,  7,  7,  7,  7,  7,  7,
-     7,  7,  7, 13,  0,  4,  0,  0,  6,  0,  0,  0,  0,  0,  7, 13,
-     0,  5,  0,  0,  0,  7,  0,  0,  8,  8,  8,  0,  8,  8,  8,  7,
-     7,  7,  7,  0,  8,  7,  8,  7,  7,  8,  7,  8,  7,  7,  8,  7,
-     8,  8,  7,  8,  7,  8,  7,  7,  7,  8,  8,  7,  8,  7,  8,  8,
-     7,  8,  8,  8,  7,  7,  8,  8,  8,  7,  7,  7,  8,  7,  7,  9,
-     9,  9,  9,  9,  9,  7,  7,  7,  7,  9,  9,  9,  7,  7,  0,  0,
-     0,  0,  9,  9,  9,  9,  0,  0,  7,  0,  0,  0,  9,  0,  9,  0,
-     3,  3,  3,  3,  9,  0,  8,  7,  0,  0,  7,  7,  7,  7,  0,  8,
-     0,  0,  8,  0,  8,  0,  8,  8,  8,  8,  0,  8,  7,  7,  7,  8,
-     8,  7,  0,  8,  8,  7,  0,  3,  3,  3,  8,  7,  0,  9,  0,  0,
-     0, 14,  0,  0,  7, 12,  0,  0,  0,  3,  3,  3,  3,  3,  0,  3,
-     0,  3,  3,  0,  9,  9,  9,  0,  0,  0,  0,  9,  5,  5,  5,  5,
-     5,  5,  0,  0, 14, 14,  0,  0,  3,  3,  3,  0,  5,  0, 12, 12,
-     9,  9,  9,  3, 10, 10,  0, 10, 10,  0,  9,  9,  3,  9,  9,  9,
-    12,  9,  3,  3,  3,  5,  0,  3,  3,  9,  9,  3,  3,  0,  3,  3,
-     3,  3,  9,  9, 10, 10,  9,  9,  9,  0,  0,  9, 12, 12, 12,  0,
-     0,  0,  0,  5,  9,  3,  9,  9,  0,  9,  9,  9,  9,  9,  3,  3,
-     3,  9,  0,  0, 14, 12,  9,  0,  0,  3,  0,  0,  3,  3,  9,  3,
-     9,  3,  3,  3,  3,  3,  0,  0,  0, 12,  0,  0,  0, 12, 12,  0,
-     9,  0,  9,  9,  0,  0,  0,  3,  3,  3,  5,  3,  3,  9,  3,  3,
-    12, 12, 10, 10,  3,  0,  0,  3,  3,  3,  9,  0,  9,  9,  0,  9,
-     0,  0, 10, 10,  9,  0,  3,  0,  0,  9,  9,  0,  9,  3,  0,  0,
-     9,  0,  0,  0,  0,  9,  3,  3,  0,  0,  3,  3,  0,  0,  3,  9,
-     0,  0,  9,  0,  0,  0,  3,  0,  3,  0,  3,  0, 10, 10,  0,  0,
-     0,  9,  0,  9,  0,  3,  0,  3,  0,  3, 13, 13, 13, 13,  3,  3,
-     3,  0,  0,  0,  3,  3,  3,  9, 10, 10, 12, 12, 10, 10,  3,  3,
-     0,  8,  0,  0,  0,  0, 12,  0, 12,  0,  0,  0,  8,  8,  0,  0,
-     9,  0, 12,  9,  6,  9,  9,  9,  9,  9,  9, 13, 13,  0,  0,  0,
-     3, 12, 12,  0,  9,  0,  3,  3,  0,  0, 14, 12, 14, 12,  0,  3,
-     3,  3,  5,  0,  9,  3,  3,  9,  9,  3,  9,  0, 12, 12, 12, 12,
-     0,  0, 12, 12,  9,  9, 12, 12,  0,  8,  0,  8,  7,  0,  7,  7,
-     8,  0,  7,  0,  8,  0,  0,  0,  6,  6,  6,  6,  6,  6,  6,  5,
-     3,  3,  5,  5,  0,  0,  0, 14, 14,  0,  0,  0, 13, 13, 13, 13,
-    11,  0,  0,  0,  4,  4,  5,  5,  5,  5,  5,  6,  0, 13, 13,  0,
-    12, 12,  0,  0,  0, 13, 13, 12,  0,  0,  0,  6,  5,  0,  5,  5,
-     0, 13, 13,  7,  0,  0,  0,  8,  0,  0,  7,  8,  8,  8,  7,  7,
-     8,  0,  8,  0,  8,  8,  0,  7,  9,  7,  0,  0,  0,  8,  7,  7,
-     0,  0,  7,  0,  9,  9,  9,  8,  0,  0,  8,  8,  0,  0, 13, 13,
-     8,  7,  7,  8,  7,  8,  7,  3,  7,  7,  0,  7,  0,  0, 12,  9,
-     0,  0, 13,  0,  6, 14, 12,  0,  0, 13, 13, 13,  9,  9,  0, 12,
-     9,  0, 12, 12,  8,  7,  9,  3,  3,  3,  0,  9,  7,  7,  3,  3,
-     3,  3,  0, 12,  0,  0,  8,  7,  9,  0,  0,  8,  7,  8,  7,  9,
-     7,  7,  7,  9,  9,  9,  3,  9,  0,  9,  9,  3,  0, 12, 12, 12,
-     0,  0,  9,  3, 12, 12,  9,  9,  9,  3,  3,  0,  3,  3,  3, 12,
-     0,  0,  0,  7,  0,  9,  3,  9,  9,  9, 13, 13, 14, 14,  0, 14,
-     0, 14, 14,  0, 13,  0,  0, 13,  0, 14, 12, 12, 14, 13, 13, 13,
-    13, 13, 13,  0,  9,  0,  0,  5,  0, 13,  0, 13, 13, 12, 13, 13,
-    14,  0,  9,  9,  0,  5,  5,  5,  0,  5, 12, 12,  3,  0, 10, 10,
-     9, 12, 12,  0,  3, 12,  0,  0, 10, 10,  9,  0, 12, 12,  0, 12,
-    12,  0,  3,  0,  9, 12,  0,  0,  9,  9,  0,  3,  9,  9,  9, 12,
-     3,  0, 12, 12,  3,  9,  0,  9, 12,  9,  0,  0,  5,  0,  0,  0,
-     0,  3,  3, 12,  3,  3,  3,  5,  5,  5,  5,  3,  0,  8,  8,  0,
-     8,  0,  7,  7,
-};
+RE_UINT32 re_get_id_continue(RE_UINT32 codepoint) {
+    RE_UINT32 field_2;
+    RE_UINT32 field_1;
+    RE_UINT32 field_0;
+    RE_UINT32 offset;
+    RE_UINT32 v;
 
-/* Sentence_Break: 8564 bytes. */
-
-RE_UINT32 re_get_sentence_break(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-
-    f = ch >> 11;
-    code = ch ^ (f << 11);
-    pos = (RE_UINT32)re_sentence_break_stage_1[f] << 4;
-    f = code >> 7;
-    code ^= f << 7;
-    pos = (RE_UINT32)re_sentence_break_stage_2[pos + f] << 5;
-    f = code >> 2;
-    code ^= f << 2;
-    pos = (RE_UINT32)re_sentence_break_stage_3[pos + f] << 2;
-    value = re_sentence_break_stage_4[pos + code];
-
-    return value;
-}
+    field_2 = codepoint >> 10;
+    field_1 = (codepoint >> 5) & 0x1F;
+    field_0 = (codepoint >> 3) & 0x3;
+    offset = codepoint & 0x7;
 
-/* Math. */
+    v = re_id_continue_table_1[field_2];
+    v = re_id_continue_table_2[(v << 5) | field_1];
+    v = re_id_continue_table_3[(v << 2) | field_0];
 
-static RE_UINT8 re_math_stage_1[] = {
-    0, 1, 1, 2, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1,
-};
+    return (v >> offset) & 0x1;
+}
 
-static RE_UINT8 re_math_stage_2[] = {
-    0, 1, 2, 2, 2, 2, 2, 2, 3, 4, 5, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 6, 7,
-    2, 2, 2, 2, 2, 8, 2, 2, 2, 2, 2, 9, 2, 2, 2, 2,
+/* Ideographic. */
+static RE_UINT8 re_ideographic_table_1[] = {
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  2,  2,  2,
+     2,  2,  2,  3,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  4,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  5,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  6,  2,  2,  2,  2,
+     2,  7,  2,  8,  0,  0,  0,  0,  0,  0,  0,  0,  9,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2, 10,  2,  2,  2, 11, 12,  2,
+     2,  2,  2, 13,  2,  2,  2,  2,  2,  2, 14,  0,  0,  0, 15,  0,
+     2,  2,  2,  2, 16,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0
 };
 
-static RE_UINT8 re_math_stage_3[] = {
-     0,  1,  2,  3,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  5,
-     4,  4,  4,  4,  4,  4,  4,  4,  6,  4,  4,  4,  4,  4,  4,  4,
-     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
-     7,  8,  9, 10, 11, 12, 13, 14, 15, 15, 15, 15, 16, 17, 18, 19,
-     4,  4,  4,  4,  4,  4, 20, 21, 22, 23,  4,  4,  4,  4,  4, 15,
-     4,  4,  4,  4, 15, 15, 15, 15, 15, 15, 15, 15, 24, 25,  4,  4,
-     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4, 26,  4,  4,  4,
-     4,  4,  4,  4,  4,  4,  4,  4,  4, 27,  4,  4, 28, 29,  4, 30,
-    15, 31, 32, 33, 34, 35, 15, 15, 15, 15, 36, 15, 15, 15, 15, 37,
-     4,  4,  4,  4,  4,  4,  4,  4, 38, 39, 40, 41,  4,  4,  4,  4,
+static RE_UINT8 re_ideographic_table_2[] = {
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     1,  2,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  0,  0,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  4,
+     0,  0,  0,  0,  0,  0,  0,  0,  3,  3,  3,  3,  3,  3,  3,  3,
+     3,  3,  3,  5,  3,  3,  6,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  7,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  8,
+     3,  3,  3,  3,  3,  3,  9,  0, 10,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 11,  3,  3,  3,  3,
+     3,  3,  3,  3,  3,  3,  3, 12,  0,  0,  0,  0,  0,  0,  0,  0,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+     3,  3,  3,  3,  3,  3, 13,  0,  3,  3,  3,  3,  3,  3,  3,  3,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+     3,  3,  3,  3,  3,  3,  3,  3,  3, 14,  3,  3,  3,  3,  3,  3,
+    13,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+     3,  3,  3,  3,  3, 15,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3, 16,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+    13,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  3, 17,  0,  0,  0,  0,  0
 };
 
-static RE_UINT8 re_math_stage_4[] = {
-      0,   0,   0,   0,   0,   8,   0, 112,   0,   0,   0,  64,   0,   0,   0,  80,
-      0,   0,   0,   0,   0,  16,   2,   0,   0,   0, 128,   0,   0,   0, 128,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  39,   0,   0,   0, 115,   0,
-    192,   1,   0,   0,   0,   0,   0,   0,   0,   0,  64,   0,   0,   0,  28,   0,
-     17,   0,   4,   0,  30,   0,   0, 124,   0, 124,   0,   0,   0,   0,   0,   0,
-      0,   0, 255,  31,  98, 248,   0,   0, 132, 252,  47,  63,  16, 179, 251, 241,
-    255,  11,   0,   0,   0,   0,   0,   0,   0,   0, 255, 255, 255, 126, 195, 240,
-    255, 255, 255,  47,  48,   0, 240, 255, 255, 255, 255, 255, 255, 255, 255, 255,
-      0,  15,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  16,
-      0,   0,   0, 248, 255, 255, 191,   0,   0,   0,   1, 240,   7,   0,   0,   0,
-      0,   0,   0,   0,   3, 192, 255, 240, 195, 140,  15,   0, 148,  31,   0, 255,
-     96,   0,   0,   0,   0,   0,   0,   0,   5,   0,   0,   0,  15, 224,   0,   0,
-      0,   0,   0,   0,   0,   0, 255, 255, 159,  31,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0, 126,   1,   0,   0,
-      0,   8,   0, 112,   0,   0,   0,  80,   0,   0,   0,  80,   0,   0,   0,   0,
-      0,   0,   0,   0,   4,  30,   0,   0, 255, 255, 223, 255, 255, 255, 255, 255,
-    255, 255, 255, 223, 100, 222, 255, 235, 239, 255, 255, 255, 255, 255, 255, 255,
-    191, 231, 223, 223, 255, 255, 255, 123,  95, 252, 253, 255, 255, 255, 255, 255,
-    255, 255, 255, 255,  63, 255, 255, 255, 255, 207, 255, 255, 255, 255, 255, 255,
-    239, 255, 255, 255, 150, 254, 247,  10, 132, 234, 150, 170, 150, 247, 247,  94,
-    255, 251, 255,  15, 238, 251, 255,  15,   0,   0,   0,   0,   0,   0,   3,   0,
+static RE_UINT8 re_ideographic_table_3[] = {
+      0,   0,   0,   0, 192,   0,   0,   0, 254,   3,   0,   7, 255, 255, 255, 255,
+    255, 255, 255,  31, 255,  63, 255, 255, 255, 255, 255,   3,  16,   0,   0,   0,
+    255, 255, 255,   0, 255, 255,  63,   0, 255,   1,   0,   0,   0,   0, 255, 255,
+    255, 255, 255,  15, 255, 255, 255,  63, 255, 255,  31,   0,   3,   0, 255, 255,
+      1,   0,   0,   0, 255,   7,   0,   0
 };
 
-/* Math: 628 bytes. */
-
-RE_UINT32 re_get_math(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-
-    f = ch >> 14;
-    code = ch ^ (f << 14);
-    pos = (RE_UINT32)re_math_stage_1[f] << 4;
-    f = code >> 10;
-    code ^= f << 10;
-    pos = (RE_UINT32)re_math_stage_2[pos + f] << 4;
-    f = code >> 6;
-    code ^= f << 6;
-    pos = (RE_UINT32)re_math_stage_3[pos + f] << 6;
-    pos += code;
-    value = (re_math_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1;
-
-    return value;
+RE_UINT32 re_get_ideographic(RE_UINT32 codepoint) {
+    RE_UINT32 field_2;
+    RE_UINT32 field_1;
+    RE_UINT32 field_0;
+    RE_UINT32 offset;
+    RE_UINT32 v;
+
+    field_2 = codepoint >> 10;
+    field_1 = (codepoint >> 5) & 0x1F;
+    field_0 = (codepoint >> 3) & 0x3;
+    offset = codepoint & 0x7;
+
+    v = re_ideographic_table_1[field_2];
+    v = re_ideographic_table_2[(v << 5) | field_1];
+    v = re_ideographic_table_3[(v << 2) | field_0];
+
+    return (v >> offset) & 0x1;
 }
 
-/* Alphabetic. */
+/* IDS_Binary_Operator. */
+RE_UINT32 re_get_ids_binary_operator(RE_UINT32 codepoint) {
+    if (0x2FF0 <= codepoint && codepoint <= 0x2FF1)
+        return 1;
+    if (0x2FF4 <= codepoint && codepoint <= 0x2FFB)
+        return 1;
+
+    return 0;
+}
 
-static RE_UINT8 re_alphabetic_stage_1[] = {
-     0,  1,  2,  3,  4,  5,  5,  5,  5,  6,  7,  5,  5,  8,  9, 10,
-    11, 12, 13, 14, 15,  9, 16,  5, 17,  9,  9, 18,  9, 19, 20, 21,
-     5,  5,  5,  5,  5,  5,  5,  5,  5,  5, 22, 23, 24,  5, 25, 26,
+/* ID_Start. */
+static RE_UINT8 re_id_start_table_1[] = {
+     0,  1,  2,  3,  4,  5,  6,  7,  8,  9,  9, 10, 11, 12, 12, 12,
+    12, 12, 12, 13, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+    12, 12, 12, 12, 12, 12, 12, 14, 12, 15, 16, 12, 12, 12, 12, 12,
+    12, 12, 12, 12, 12, 17,  9,  9,  9,  9,  9,  9,  9,  9, 18, 19,
+    20, 21, 22, 23, 24, 25, 26, 27, 28, 29,  9,  9, 12, 30,  9,  9,
+     9, 31,  9,  9,  9,  9,  9,  9,  9,  9, 32, 33, 12, 12, 12, 12,
+    12, 34, 12, 35,  9,  9,  9,  9,  9,  9,  9,  9, 36,  9,  9, 37,
+     9,  9,  9,  9,  9, 38,  9,  9, 39,  9, 40, 41,  9,  9,  9,  9,
+    12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+    12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+    12, 12, 12, 12, 12, 12, 12, 12, 12, 42, 12, 12, 12, 43, 44, 12,
+    12, 12, 12, 45, 12, 12, 12, 12, 12, 12, 46,  9,  9,  9, 47,  9,
+    12, 12, 12, 12, 48,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
@@ -7455,3134 +12959,5435 @@ static RE_UINT8 re_alphabetic_stage_1[] = {
      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9
 };
 
-static RE_UINT8 re_alphabetic_stage_2[] = {
-      0,   1,   2,   3,   4,   5,   6,   7,   8,   9,  10,  11,  12,  13,  14,  15,
-     16,   1,  17,  18,  19,   1,  20,  21,  22,  23,  24,  25,  26,  27,   1,  28,
-     29,  30,  31,  31,  32,  31,  31,  31,  31,  31,  31,  31,  33,  34,  35,  31,
-     36,  37,  31,  31,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,  38,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,  39,
-      1,   1,   1,   1,  40,   1,  41,  42,  43,  44,  45,  46,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,  47,  31,  31,  31,  31,  31,  31,  31,  31,
-     31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,
-     31,  31,  31,  31,  31,  31,  31,  31,  31,   1,  48,  49,   1,  50,  51,  52,
-     53,  54,  55,  56,  57,  58,   1,  59,  60,  61,  62,  63,  64,  65,  31,  66,
-     67,  68,  69,  70,  71,  72,  73,  74,  75,  76,  77,  31,  78,  79,  80,  31,
-      1,   1,   1,  81,  82,  83,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,
-      1,   1,   1,   1,  84,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,
-     31,  31,  31,  31,   1,   1,  85,  31,  31,  31,  31,  31,  31,  31,  31,  31,
-     31,  31,  31,  31,  31,  31,  31,  31,   1,   1,  86,  87,  31,  31,  88,  89,
-      1,   1,   1,   1,   1,   1,   1,  90,   1,   1,  91,  31,  31,  31,  31,  31,
-      1,  92,  93,  31,  31,  31,  31,  31,  31,  31,  31,  31,  94,  31,  31,  31,
-     31,  31,  31,  31,  95,  96,  97,  98,  31,  31,  31,  31,  31,  31,  31,  31,
-     99, 100, 101,  31,  31,  31,  31,  31, 102, 103,  31,  31,  31,  31, 104,  31,
-     31, 105,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,
-      1,   1,   1,   1,   1,   1, 106,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1, 107, 108,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1, 109,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1, 110,  31,  31,  31,  31,
-     31,  31,  31,  31,  31,  31,  31,  31,   1,   1, 111,  31,  31,  31,  31,  31,
-};
-
-static RE_UINT8 re_alphabetic_stage_3[] = {
+static RE_UINT8 re_id_start_table_2[] = {
       0,   0,   1,   1,   0,   2,   3,   3,   4,   4,   4,   4,   4,   4,   4,   4,
-      4,   4,   4,   4,   4,   4,   5,   6,   0,   0,   7,   8,   9,  10,   4,  11,
-      4,   4,   4,   4,  12,   4,   4,   4,   4,  13,  14,   4,  15,  16,  17,  18,
-     19,   4,  20,  21,   4,   4,  22,  23,  24,   4,  25,   4,   4,  26,  27,  28,
-     29,  30,  31,  32,   0,  33,  34,  35,   4,  36,  37,  38,  39,  40,  41,  42,
-     43,  44,  45,  46,  47,  48,  49,  50,  51,  48,  52,  53,  54,  55,  56,   0,
-     57,  58,  59,  60,  57,  61,  62,  63,  57,  64,  65,  66,  67,  68,  69,  70,
-     71,  72,  73,   0,  74,  75,  76,   0,  77,   0,  78,  79,  80,  81,   0,   0,
-      4,  82,  24,   4,  83,   4,  84,  85,   4,   4,  86,   4,  87,  88,  89,   4,
-     90,   4,  72,   0,  91,   4,   4,  92,  71,   4,   4,   4,   4,   4,   4,   4,
-      4,   4,   4,  93,   1,   4,   4,  94,  95,  96,  96,  97,   4,  98,  99,   0,
-      0,   4,   4,  31,   4, 100,   4, 101, 102, 103,  24, 104,   4, 105, 106,   0,
-    107,   4, 102, 108,   0, 109,   0,   0,   4, 110, 111,   0,   4, 112,   4, 113,
-      4, 114, 115, 116, 117,  64,   0, 118,   4,   4,   4,   4,   4,   4,   0, 119,
-     92,   4, 120, 116,   4, 121, 122, 123,   0,   0,   0, 124, 125,   0,   0,   0,
-    126, 127, 128,   4,  15,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0, 129,   4, 106,   4, 130, 102,   4,   4,   4,   4, 131,
-      4,  84,   4, 132, 114, 133, 133,   4,   0, 134,   0,   0,   0,   0,   0,   0,
-    135, 136,  71,   4, 137,  71,   4,  85, 138,  13,   4,   4, 139,  72,   0,  24,
-      4,   4,   4,   4,   4, 101,   0,   0,   4,   4,   4,   4,   4,   4,   4,  91,
-      4,   4,   4,   4,  30,   0,  24, 116, 140, 141,   4, 142,   4,   4,   4,  91,
-    143, 144,   4,   4, 145,   4, 146, 143, 147, 148,   4,  96,   4,   4, 149, 150,
-     27, 100, 151,  81,   4, 152, 134, 153,   4, 114, 154, 155,   4, 102, 156, 157,
-    158, 159,  85, 160,   4,   4,   4,  32,   4,   4,   4,   4,   4, 161, 162, 107,
-      4,   4,   4, 163,   4,   4, 164,   0, 165, 166, 167,   4,   4,  26, 168,   4,
-      4, 116,  24,   4, 169,   4, 148, 170,   0,   0,   0, 171,   4,   4,   4,  81,
-      0,   1,   1, 172,   4, 102, 173,   0, 174, 175, 176,   0,   4,   4,   4,  72,
-      0,   0,   4, 177,   0,   0,   0,   0,   0,   0,   0,   0,  81,   4, 178,   0,
-      4,  25, 100,  72, 116,   4, 179,   0,   4,   4,   4,   4, 116,  24, 180, 107,
-      4, 160,   4,  60,   0,   0,   0,   0,   4, 114, 101, 148,   0,   0,   0,   0,
-    181, 182, 101, 114, 102,   0,   0, 183, 101, 164,   0,   0,   4, 184,   0,   0,
-    185, 101,   0,  81,  81,   0,  78, 186,   4, 101, 101, 151,  26,   0,   0,   0,
-      4,   4,  15,   0,   4, 151,   4, 151,   4, 148,   0,   0,   0,   0,   0,   0,
-     81, 187, 188,   0,   0,   0,   0, 114,   4,   4, 188,   0, 144,  31,  24,  15,
-      4, 151, 189, 190,   4,   4, 191,   0, 192, 193,   0,   0, 194, 117,   4,  15,
-     39,  48, 195,  60,   0,   0,   0,   0,   4,   4, 196,   0,   4,   4, 197,   0,
-      0,   0,   0,   0,   4, 198, 199,   0,   4, 102, 200,   0,   4, 201,   0,   0,
-     64,  32,   0,   0,   0,   0,   0,   0,   4,  31,   0,   0,   0,   4,   4, 202,
-      0,   0,   0,   0,   0, 203,  29, 204,   4, 205,  24,   4, 206,   0,   4,  31,
-    207, 208,  77, 209, 169, 210,   0,   0, 211, 212, 213, 214, 215,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0, 114,   4,   4,   4,   4, 164,   0,   0,   0,
-      4,   4,   4, 139,   4,   4,   4,   4,   4,   4,  60,   0,   0,   0,   0,   0,
-      4, 139,   0,   0,   0,   0,   0,   0,   4,   4, 216,   0,   0,   0,   0,   0,
-      4,  31, 102,   0,   0,   0,  24, 154,   4,  91,  60, 217,  91,   0,   0,   0,
-      0,   0,   4,   4,   0,   0,   0,   0,   4,   4, 218,   4, 219,   0,   0, 220,
-      4,   4,   4,   4,   4,   4,   4, 221,   4,   4,   4,   4,   4,   4,   4, 151,
-    102,   0, 222, 223,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4, 107,
-      4,   4,   4, 224, 225,   0,   0,   0,   4,   4, 226,   4, 227, 228, 229,   4,
-    230, 231, 232,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4, 233, 234,  85,
-    226, 226, 130, 130, 207, 207, 235,   0, 236, 237,   0,   0,   0,   0,   0,   0,
-      4, 238, 239,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   4, 240,
-      4,   4,   4,   4,   4,   4, 186,   0,   4,   4, 241,   0,   0,   0,   0,   0,
-    229, 242, 243, 244, 245, 246,   0,   0,   0,  24, 247, 247, 106,   0,   0,   0,
-      4,   4,   4,   4,   4,   4, 114,   0,   4, 177,   4,   4,   4,   4,   4,   4,
-    116,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4, 248,   4,   4,
-      4,   4,   4,   4,   4,   4,   4,  77, 116,   0,   0,   0,   0,   0,   0,   0,
+      4,   4,   4,   4,   4,   4,   5,   6,   0,   0,   0,   7,   8,   9,   4,  10,
+      4,   4,   4,   4,  11,   4,   4,   4,   4,  12,  13,   4,  14,   0,  15,  16,
+      0,   4,  17,  18,   4,   4,  19,  20,  21,  22,  23,   4,   4,  24,  25,  26,
+     27,  28,  29,  17,   0,  30,  31,   0,  32,  33,  34,  35,  36,  37,  38,  39,
+     40,  41,  42,  43,  44,  45,  46,  47,  48,  45,  49,  50,  51,  52,  46,   0,
+     53,  54,  55,  56,  57,  58,  59,  60,  61,  62,  63,  64,  65,  66,  67,   0,
+     68,  69,  67,   0,  70,  71,  72,   0,  73,   0,  74,  75,  76,   0,   0,   0,
+      4,  77,  78,  79,  80,   4,  81,  82,   4,   4,   4,   4,   4,   4,   4,   4,
+      4,   4,  83,   4,  84,  85,  86,   4,  87,   4,  88,   0,  22,   4,   4,  89,
+     68,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
+      4,   4,   4,  90,   1,   4,   4,  91,  92,  93,  93,  94,   4,  95,  96,   0,
+      0,   4,   4,  29,   4,  97,   4,  98,  99,   0,  15, 100,   4, 101, 102,   0,
+    103,   4, 104,   0,   0, 105,   0,   0, 106,  95, 107,   0, 108, 109,   4, 110,
+      4, 111, 112, 113, 114, 115,   0, 116,   4,   4,   4,   4,   4,   4,   0,   0,
+      4,   4,   4,   4,   4,   4,   4,   4,  89,   4, 117, 113,   4, 118, 119, 120,
+      0,   0,   0, 121, 122,   0,   0,   0, 123, 124, 125,   4,  14,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      4, 126,  99,   4,   4,   4,   4, 127,   4,  81,   4, 128, 103, 129, 129,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    130, 131,  68,   4, 132,  68,   4,  82, 106,  12,   4,   4, 133,   4,   0,  15,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
+      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
+      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   0,   0,
+      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
+      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
+      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4, 134,
+      4,   4,   4,   4,  75,   0,  15, 113,   4,   4,   4,   4,   4,   4,   4,   4,
+    135, 136,   4, 137, 113,   4,   4,  22, 138, 139,   4,   4, 140,   4, 141, 142,
+    143, 144,   4,  95, 139,  95,   0, 145,  25, 146,  67, 134,  32, 147, 148, 149,
+      4,  14, 150, 151,   4, 152, 153, 154, 155, 156,  82, 157,   4,   4,   4, 144,
+      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
+      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4, 158, 159, 160,
+      0,   0,   0,   0,   0,   0,   0,   0,   4,   4,   4,   4,   4,   4,   4,   4,
+      4,   4,   4, 161,   4,   4, 162,   0, 163, 164, 165,   4,   4,  93, 166,   4,
+      4,   4,   4,   4,   4,   4,   4,   4,   4, 113,  15,   4, 167,   4,  31, 168,
+      0,   0,   0, 169,   4,   4,   4, 134,   0,   1,   1, 170,   4,  99, 171,   0,
+    172, 173, 174,   0,   4,   4,   4,  88,   0,   0,   4, 104,   0,   0,   0,   0,
+      0,   0,   0,   0, 134,   4, 175,   0,   4,  23, 176,  98, 113,   4, 177,   0,
+      4,   4,   4,   4, 113,  15, 178, 160,   4, 179,   4, 111,   0,   0,   0,   0,
+      4,   4,   4,   4,   4,   4,   4,   4,   4, 103,  98,  31,   0,   0,   0,   0,
+    180, 181,  98, 103,  99,   0,   0, 182,  98, 162,   0,   0,   4, 183,   0,   0,
+    184,  98,   0, 134, 134,   0,  74, 185,   4,  98,  98, 147,  93,   0,   0,   0,
+      4,   4,  14,   0,   4, 147,   4, 147,   4, 111,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   4, 186,   0,   0, 134, 187, 110,   0,   0,  15, 185, 103,
+    108, 188,   0,   0, 108,  22,  15,  14, 108,  67, 189, 190, 108, 147, 191,   0,
+    192, 193,   0,   0, 194, 114,  99,   0,  48,  45, 195,  56,   0,   0,   0,   0,
+      4, 104, 196,  56,   4,  22, 197,   0,   0,   0,   0,   0,   4, 133, 198,   0,
+      4,  22, 199,   0,   4, 200,   0,   0,  88,   0,   0,   0,   0,   0,   0,   0,
+      4, 193,   0,   0,   0,   4,   4, 201, 202, 203, 204,   0,   0, 205, 175, 206,
+    207, 208, 209,   4, 210,   0,   4,  29,   0,   0,   0,   0,   0,   0,   0,   0,
+    211, 133,  73, 212,  22,   0,   0,   0, 213, 175, 214, 215, 216,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0, 147,   0,   0,   0,   0,   0,  46,   0,   0,
+      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
+      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4, 162,   0,   0,   0,
+      4,   4,   4, 133,   4,   4,   4,   4,   4,   4, 111,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      4, 133,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
+      4,   4,  67,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
+      4,  29,  99,   0,   0,   0,  15, 217,   4,  22, 111, 218,  22,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   4,   4,   0,   0,   0,   0,   4,   4, 219,   0, 166,   0,   0, 220,
+      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
+      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4, 188,
+      4,   4,   4,   4,   4,   4,  98,   0,  14,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      4,   4,   4,   4,   4,   4,   4,   4,  99,   0, 221, 222,   4,   4,   4,   4,
+      4,   4,   4,   4,   4,   4,   4, 160,   0,   0,   0,   0,   0,   0,   0,   0,
+      4,   4,   4, 223, 224,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      4,   4,  30,   4, 225, 226, 227,   4, 228, 229, 230,   4,   4,   4,   4,   4,
+      4,   4,   4,   4,   4, 231, 232,  82,  30,  30, 126, 126, 211, 211, 150,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   4, 233, 234,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   4, 193,   0,   0,   0,   0,   0,   0,   0,   0,
+      4,   4,   4,   4,   4,   4, 185,   0,   4,   4, 235,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    227, 236, 237, 238, 239, 240,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
+      4,   4,   4,   4,   4,   4, 113,   0,   4,   4,   4,   4,   4,   4,   4,   4,
+      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
+      4,   4,   4,   4,   4,   4,   4,   4,   4, 104,   4,   4,   4,   4,   4,   4,
+    113,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
+      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
+      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
+      4,   4,   4,   4,   4, 241,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
+      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
+      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,  73,
+      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
+    113,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
+      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,  17,   0,   0,   0,   0,   0
 };
 
-static RE_UINT8 re_alphabetic_stage_4[] = {
+static RE_UINT8 re_id_start_table_3[] = {
       0,   0,   0,   0, 254, 255, 255,   7,   0,   4,  32,   4, 255, 255, 127, 255,
-    255, 255, 255, 255, 195, 255,   3,   0,  31,  80,   0,   0,  32,   0,   0,   0,
-      0,   0, 223, 188,  64, 215, 255, 255, 251, 255, 255, 255, 255, 255, 191, 255,
-      3, 252, 255, 255, 255, 255, 254, 255, 255, 255, 127,   2, 255,   1,   0,   0,
-      0,   0, 255, 191, 182,   0, 255, 255, 255, 135,   7,   0,   0,   0, 255,   7,
-    255, 255, 255, 254,   0, 192, 255, 255, 255, 255, 239,  31, 254, 225,   0, 156,
-      0,   0, 255, 255,   0, 224, 255, 255, 255, 255,   3,   0,   0, 252, 255, 255,
-    255,   7,  48,   4, 255, 255, 255, 252, 255,  31,   0,   0, 255, 255, 255,   1,
-    255,   7,   0,   0, 255, 255, 223,  63,   0,   0, 240, 255, 248,   3, 255, 255,
-    255, 255, 255, 239, 255, 223, 225, 255,  15,   0, 254, 255, 239, 159, 249, 255,
-    255, 253, 197, 227, 159,  89, 128, 176,  15,   0,   3,  16, 238, 135, 249, 255,
-    255, 253, 109, 195, 135,  25,   2,  94,   0,   0,  63,   0, 238, 191, 251, 255,
-    255, 253, 237, 227, 191,  27,   1,   0,  15,   0,   0,  30, 238, 159, 249, 255,
-    159,  25, 192, 176,  15,   0,   2,   0, 236, 199,  61, 214,  24, 199, 255, 195,
-    199,  29, 129,   0, 239, 223, 253, 255, 255, 253, 255, 227, 223,  29,  96,   7,
-     15,   0,   0,   0, 255, 253, 239, 227, 223,  29,  96,  64,  15,   0,   6,   0,
-    255, 255, 255, 231, 223,  93, 240, 128,  15,   0,   0, 252, 236, 255, 127, 252,
-    255, 255, 251,  47, 127, 128,  95, 255,   0,   0,  12,   0, 254, 255, 255, 255,
-    255, 255, 255,   7, 127,  32,   0,   0, 214, 247, 255, 255, 175, 255, 255,  59,
-     95,  32,   0, 240,   1,   0,   0,   0, 255, 254, 255, 255, 255,  31, 254, 255,
-      3, 255, 255, 254, 255, 255, 255,  31, 255, 255, 127, 249, 255, 255,   0,  60,
-    191,  32, 255, 255, 255, 255, 255, 247, 255,  61, 127,  61, 255,  61, 255, 255,
-    255, 255,  61, 127,  61, 255, 127, 255, 255, 255,  61, 255, 255, 255,   0,   0,
-    255, 255,  63,  63, 255, 159, 255, 255, 255, 199, 255,   1, 255, 223,  15,   0,
-    255, 255,  15,   0, 255, 223,  13,   0, 255, 255, 207, 255, 255,   1, 128,  16,
-    255,   7, 255, 255, 255, 255,  63,   0, 255, 255, 255, 127, 255,  15, 255,   1,
-    255,  63,  31,   0, 255,  15, 255, 255, 255,   3,   0,   0, 255, 255, 255,  15,
-    254, 255,  31,   0, 128,   0,   0,   0, 255, 255, 239, 255, 239,  15,   0,   0,
-    255, 243,   0, 252, 191, 255,   3,   0, 255, 255, 127,   0,   0, 224,   0, 252,
-    255, 255, 255,  63, 255,   1, 255, 255,   0, 222, 111,   4, 128, 255,  31,   0,
-     63,  63, 255, 170, 255, 255, 223,  95, 220,  31, 207,  15, 255,  31, 220,  31,
-      0,   0,   2, 128,   0,   0, 255,  31, 132, 252,  47,  62,  80, 189, 255, 243,
-    224,  67,   0,   0,   0,   0, 192, 255, 255, 127, 255, 255,  31, 120,  12,   0,
-    255, 128,   0,   0, 127, 127, 127, 127,   0, 128,   0,   0, 224,   0,   0,   0,
-    254,   3,  62,  31, 255, 255, 127, 224, 224, 255, 255, 255, 255, 127,   0,   0,
-    255,  31, 255, 255,   0,  12,   0,   0, 255, 127, 240, 143,   0,   0, 128, 255,
-    252, 255, 255, 255, 255, 249, 255, 255, 124,   0,   0,   0, 191, 255, 255, 255,
-    255,   0,   0,   0,  47,   0,   0,   0,   0,   0, 252, 232, 255, 255,   7,   0,
-    255, 255, 247, 255, 255, 255,   0, 124, 255,  63,   0,   0, 255, 255, 127, 252,
-      5,   0,   0,  56, 255, 255,  60,   0, 126, 126, 126,   0, 127, 127, 255, 255,
-    255,   0, 255, 255,  15,   0, 255, 255, 127, 248, 255, 255, 255,  63, 255, 255,
-    255, 255, 255,   3, 127,   0, 248, 224, 255, 253, 127,  95, 219, 255, 255, 255,
-      0,   0, 248, 255, 255, 255, 252, 255,   0,   0, 255,  15,   0,   0, 223, 255,
-    192, 255, 255, 255, 252, 252, 252,  28, 255, 239, 255, 255, 127, 255, 255, 183,
-    255,  63, 255,  63, 255, 255,  31,   0, 255, 255,   1,   0,  15, 255,  62,   0,
-    255, 255,  15, 255,  63, 253, 255, 255, 255, 255, 191, 145, 255, 255,  55,   0,
-    255, 255, 255, 192, 111, 240, 239, 254,  31,   0,   0,   0, 128,   0, 255, 255,
-     63,   0,   0,   0, 112,   0, 255, 255, 255, 255,  71,   0,  30,   0,   0,  20,
-    255, 255, 251, 255, 255, 255, 159,  64, 127, 189, 255, 191, 159,  25, 129, 224,
-    187,   7,   0, 128, 179,   0,   0,   0, 255, 255,  63, 127,   0,   0,   0,  63,
-     17,   0,   0,   0, 255, 255,  63,   1,   0,   0,   0, 128, 255, 252, 255, 255,
-     26,   0,   0,   0, 255, 255, 231, 127, 255, 255, 255,  32, 255, 253, 255, 255,
-    255, 255, 127, 127,   0,   0, 252, 255, 255, 254, 127,   0, 127, 251, 255, 255,
-    255, 255, 127, 180, 203,   0,   0,   0, 191, 253, 255, 255, 255, 127, 123,   1,
-    127,   0,   0,   0, 248, 255, 255, 224, 255, 135, 255, 255, 255, 128, 255, 255,
-     11,   0,   0,   0, 255, 255, 255,   0,   0,   0,   7,   0, 240,   0, 255, 255,
-    255,   7, 255,  31, 255,   1, 255,  67, 255, 255, 223, 255, 255, 255, 255, 223,
-    100, 222, 255, 235, 239, 255, 255, 255, 191, 231, 223, 223, 255, 255, 255, 123,
-     95, 252, 253, 255,  63, 255, 255, 255, 253, 255, 255, 247, 247,  15,   0,   0,
-    127, 255, 255, 249, 219,   7,   0,   0, 255,  31, 128,  63,   0,  64,   0,   0,
-    255,  15,   0,   0, 143,   8,   0,   0, 150, 254, 247,  10, 132, 234, 150, 170,
-    150, 247, 247,  94, 255, 251, 255,  15, 238, 251, 255,  15, 255,   3, 255, 255,
-      3,   0, 255, 255,
-};
-
-/* Alphabetic: 2596 bytes. */
-
-RE_UINT32 re_get_alphabetic(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-
-    f = ch >> 12;
-    code = ch ^ (f << 12);
-    pos = (RE_UINT32)re_alphabetic_stage_1[f] << 4;
-    f = code >> 8;
-    code ^= f << 8;
-    pos = (RE_UINT32)re_alphabetic_stage_2[pos + f] << 3;
-    f = code >> 5;
-    code ^= f << 5;
-    pos = (RE_UINT32)re_alphabetic_stage_3[pos + f] << 5;
-    pos += code;
-    value = (re_alphabetic_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1;
-
-    return value;
+    255, 255, 255, 255, 195, 255,   3,   0,  31,  80,   0,   0,   0,   0, 223, 188,
+     64, 215, 255, 255, 251, 255, 255, 255, 255, 255, 191, 255,   3, 252, 255, 255,
+    255, 255, 254, 255, 255, 255, 127,   2, 255,   1,   0,   0,   0,   0, 255, 255,
+    255, 135,   7,   0, 255,   7,   0,   0,   0, 192, 254, 255, 255, 255,  47,   0,
+     96, 192,   0, 156,   0,   0, 253, 255, 255, 255,   0,   0,   0, 224, 255, 255,
+     63,   0,   2,   0,   0, 252, 255, 255, 255,   7,  48,   4, 255, 255,  63,   4,
+     16,   1,   0,   0, 255, 255, 255,   1, 255, 255, 223, 255, 255,   0,   0,   0,
+    240, 255, 255, 255, 255, 255, 255,  35,   0,   0,   1, 255,   3,   0, 254, 255,
+    225, 159, 249, 255, 255, 253, 197,  35,   0,  64,   0, 176,   3,   0,   3,  16,
+    224, 135, 249, 255, 255, 253, 109,   3,   0,   0,   0,  94,   0,   0,  28,   0,
+    224, 191, 251, 255, 255, 253, 237,  35,   0,   0,   1,   0,   3,   0,   0,   2,
+    224, 159, 249, 255,   0,   0,   0, 176,   3,   0,   2,   0, 232, 199,  61, 214,
+     24, 199, 255,   3, 224, 223, 253, 255, 255, 253, 255,  35,   0,   0,   0,   7,
+      3,   0,   0,   0, 225, 223, 253, 255, 255, 253, 239,  35,   0,   0,   0,  64,
+      3,   0,   6,   0, 240, 223, 253, 255, 255, 255, 255,  39,   0,  64, 112, 128,
+      3,   0,   0, 252, 224, 255, 127, 252, 255, 255, 251,  47, 127,   0,   0,   0,
+    254, 255, 255, 255, 255, 255,  13,   0, 214, 247, 255, 255, 175, 255,  13,  32,
+     95,   0,   0, 240,   1,   0,   0,   0, 255, 254, 255, 255, 255,  31,   0,   0,
+      0,  31,   0,   0, 255,   7,   0, 128,   0,   0,  63,  60,  98, 192, 225, 255,
+      3,  64,   0,   0, 191,  32, 255, 255, 255, 255, 255, 247, 255,  61, 127,  61,
+    255,  61, 255, 255, 255, 255,  61, 127,  61, 255, 127, 255, 255, 255,  61, 255,
+    255, 255, 255,   7, 255, 255,  63,  63, 255, 159, 255, 255, 255, 199, 255,   1,
+    255, 223,   3,   0, 255, 255,   3,   0, 255, 223,   1,   0, 255, 255,  15,   0,
+      0,   0, 128,  16, 255,   5, 255, 255, 255, 255,  63,   0, 255, 255, 255, 127,
+    255,  63,  31,   0, 255,  15, 255, 255, 255,   3,   0,   0, 255, 255, 127,   0,
+    255, 255,  31,   0, 128,   0,   0,   0, 224, 255, 255, 255, 224,  15,   0,   0,
+    248, 255, 255, 255,   1, 192,   0, 252,  63,   0,   0,   0,  15,   0,   0,   0,
+      0, 224,   0, 252, 255, 255, 255,  63, 255,   1, 255, 255, 255, 255, 255, 231,
+      0, 222, 111,   4,  63,  63, 255, 170, 255, 255, 223,  95, 220,  31, 207,  15,
+    255,  31, 220,  31,   0,   0,   2, 128,   0,   0, 255,  31, 132, 252,  47,  63,
+     80, 253, 255, 243, 224,  67,   0,   0, 255, 127, 255, 255,  31, 120,  12,   0,
+    255, 128,   0,   0, 127, 127, 127, 127, 224,   0,   0,   0, 254,   3,  62,  31,
+    255, 255, 127, 248, 255, 127,   0,   0, 255, 255, 255,  31, 255,  31, 255, 255,
+      0,  12,   0,   0, 255, 127,   0, 128,   0,   0, 128, 255, 252, 255, 255, 255,
+    255, 249, 255, 255, 252,   7,   0,   0,   0,   0, 224, 255, 187, 247, 255, 255,
+      7,   0,   0,   0,   0,   0, 252, 104,  63,   0, 255, 255, 255, 255,   7,   0,
+      0, 128,   0,   0, 223, 255,   0, 124, 247,  15,   0,   0, 255, 255, 127, 196,
+    255, 255,  98,  62,   5,   0,   0,  56, 255,   7,  28,   0, 126, 126, 126,   0,
+    127, 127, 255, 255, 255,   3, 255, 255,  15,   0, 255, 255, 127, 248, 255, 255,
+    255, 255, 255,  15, 255,  63, 255, 255, 255, 255, 255,   3, 127,   0, 248, 160,
+    255, 253, 127,  95, 219, 255, 255, 255,   0,   0, 248, 255, 255, 255, 252, 255,
+      0,   0, 255,  15,   0,   0, 223, 255, 192, 255, 255, 255, 252, 252, 252,  28,
+    255, 239, 255, 255, 127, 255, 255, 183, 255,  63, 255,  63, 255, 255,   1,   0,
+    255,   7, 255, 255,  15, 255,  62,   0, 255, 255,  15, 255, 255,   0, 255, 255,
+     63, 253, 255, 255, 255, 255, 191, 145, 255, 255,  55,   0, 255, 255, 255, 192,
+      1,   0, 239, 254,  31,   0,   0,   0, 255,   3,   3,   0, 128,   0, 255, 255,
+    255, 255, 255,   0, 144,   0, 255, 255, 255, 255,  71,   0,  30,   0,   0,  20,
+    255, 255, 251, 255, 255,  15,   0,   0, 127, 189, 255, 191,   0,   0,   1, 224,
+    128,   7,   0, 128, 176,   0,   0,   0,   0,   0,   0,  15,  16,   0,   0,   0,
+    255,   7,   0,   1,   0,   0,   0, 128, 127, 242, 111, 255, 255, 255,   0, 128,
+      2,   0,   0,   0, 255, 252, 255, 255,  10,   0,   0,   0,   1, 248, 255, 255,
+    255, 255,   7,   4,   0,   0,   1, 240, 255,   3,   0,  32, 255, 253, 255, 255,
+      0,   0, 252, 255, 127, 251, 255, 255,  64,   0,   0,   0, 191, 253, 255, 255,
+    255,   3,   0,   1, 255,  63,   0,   0, 248, 255, 255, 224, 255,   7,   1,   0,
+     11,   0,   0,   0,   0,   0,   7,   0, 240,   0, 255, 255, 255,   7, 255,  31,
+    255,   1, 255,   3, 255, 255, 255, 223, 100, 222, 255, 235, 239, 255, 255, 255,
+    191, 231, 223, 223, 255, 255, 255, 123,  95, 252, 253, 255,  63, 255, 255, 255,
+    253, 255, 255, 247, 255,  31, 128,  63,   0,  64,   0,   0,  15,   8,   0,   0,
+    150, 254, 247,  10, 132, 234, 150, 170, 150, 247, 247,  94, 255, 251, 255,  15,
+    238, 251, 255,  15,   3,   0, 255, 255
+};
+
+RE_UINT32 re_get_id_start(RE_UINT32 codepoint) {
+    RE_UINT32 field_2;
+    RE_UINT32 field_1;
+    RE_UINT32 field_0;
+    RE_UINT32 offset;
+    RE_UINT32 v;
+
+    field_2 = codepoint >> 10;
+    field_1 = (codepoint >> 5) & 0x1F;
+    field_0 = (codepoint >> 3) & 0x3;
+    offset = codepoint & 0x7;
+
+    v = re_id_start_table_1[field_2];
+    v = re_id_start_table_2[(v << 5) | field_1];
+    v = re_id_start_table_3[(v << 2) | field_0];
+
+    return (v >> offset) & 0x1;
 }
 
-/* Lowercase. */
-
-static RE_UINT8 re_lowercase_stage_1[] = {
-    0, 1, 2, 2, 2, 3, 2, 4, 5, 2, 2, 6, 2, 2, 7, 8,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2,
-};
-
-static RE_UINT8 re_lowercase_stage_2[] = {
-     0,  1,  2,  3,  3,  3,  3,  3,  4,  5,  3,  3,  3,  3,  6,  7,
-     8,  3,  9,  3,  3,  3, 10,  3,  3,  3,  3,  3,  3,  3,  3,  3,
-     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
-     3,  3,  3, 11,  3, 12,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
-     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3, 13,  3, 14,
-     3,  3, 15,  3,  3,  3, 16,  3,  3,  3,  3,  3, 17,  3,  3,  3,
-     3,  3,  3,  3,  3,  3,  3, 18,  3,  3,  3,  3,  3,  3,  3,  3,
-     3,  3,  3,  3,  3,  3,  3,  3,  3,  3, 19, 20,  3,  3,  3,  3,
-     3,  3,  3,  3, 21,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
-};
-
-static RE_UINT8 re_lowercase_stage_3[] = {
-     0,  0,  0,  1,  0,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12,
-     5, 13, 14, 15, 16, 17, 18, 19,  0,  0, 20, 21, 22, 23, 24, 25,
-     0, 26, 15,  5, 27,  5, 28,  5,  5, 29,  0, 15, 30,  0,  0,  0,
-     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0, 26, 31,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 32,
-     0,  0,  0,  0, 30,  0,  0,  0, 15, 15, 15, 15, 15, 15,  0,  0,
-     5,  5,  5,  5, 33,  5,  5,  5, 34, 35, 36, 37, 35, 38, 39, 40,
-     0,  0,  0, 41, 42,  0,  0,  0, 43, 44, 45, 26, 46,  0,  0,  0,
-     0,  0,  0,  0,  0,  0, 26, 47,  0,  0,  0,  0,  0,  0,  0,  0,
-     0, 26, 48, 49,  5,  5,  5, 50, 15, 51,  0,  0,  0,  0,  0,  0,
-     0,  0,  5, 52, 53,  0,  0,  0,  0, 54,  5, 55, 56, 57, 58, 59,
-     0,  0,  0,  0,  0,  0,  0,  0,  0, 26, 60, 61, 15, 15,  0,  0,
-     0,  0,  0,  0,  0,  0,  0,  0, 62,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  0,  0,  0,  0,  0,
-     0, 63, 64,  0,  0,  0, 65, 66,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0, 15, 67,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0, 15,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0, 15,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 68, 69, 81,
-    71, 72, 82, 64, 75, 83, 84, 85, 86, 82, 87, 26, 88, 75, 89,  0,
-     0,  0,  0,  0,  0,  0,  0,  0,  0, 90, 91,  0,  0,  0,  0,  0,
-};
-
-static RE_UINT8 re_lowercase_stage_4[] = {
-      0,   0,   0,   0, 254, 255, 255,   7,   0,   4,  32,   4,   0,   0,   0, 128,
-    255, 255, 127, 255, 170, 170, 170, 170, 170, 170, 170,  85,  85, 171, 170, 170,
-    170, 170, 170, 212,  41,  49,  36,  78,  42,  45,  81, 230,  64,  82,  85, 181,
-    170, 170,  41, 170, 170, 170, 250, 147, 133, 170, 255, 255, 255, 255, 255, 255,
-    255, 255, 239, 255, 255, 255, 255,   1,   3,   0,   0,   0,  31,   0,   0,   0,
-     32,   0,   0,   0,   0,   0, 138,  60,   0,   0,   1,   0,   0, 240, 255, 255,
-    255, 127, 227, 170, 170, 170,  47,  25,   0,   0, 255, 255,   2, 168, 170, 170,
-     84, 213, 170, 170, 170, 170,   0,   0, 255,   1,   0,   0, 255, 255, 255, 231,
-      0,   0,   0,  63, 170, 170, 234, 191, 255,   0,  63,   0, 255,   0, 255,   0,
-     63,   0, 255,   0, 255,   0, 255,  63, 255,   0, 223,  64, 220,   0, 207,   0,
-    255,   0, 220,   0,   0,   0,   2, 128,   0,   0, 255,  31,   0, 196,   8,   0,
-      0, 128,  16,  50, 192,  67,   0,   0,  16,   0,   0,   0, 255,   3,   0,   0,
-    255, 255, 255, 127,  98,  21, 218,  63,  26,  80,   8,   0, 191,  32,   0,   0,
-    170,  42,   0,   0, 170, 170, 170,  58, 168, 170, 171, 170, 170, 170, 255, 149,
-    170,  80, 186, 170, 170, 130, 160, 170,   8,   0,   0,   0,   0,   0,   0,   7,
-    255, 255, 255, 247, 255,   0, 255, 255, 127,   0, 248,   0,   0, 255, 255, 255,
-    255, 255,   0,   0,   0,   0,   0, 255, 255, 255, 255,  15, 255, 255,   7,   0,
-      0,   0,   0, 252, 255, 255,  15,   0,   0, 192, 223, 255, 255,   0,   0,   0,
-    252, 255, 255,  15,   0,   0, 192, 235, 239, 255,   0,   0,   0, 252, 255, 255,
-     15,   0,   0, 192, 255, 255, 255,   0,   0,   0, 252, 255, 255,  15,   0,   0,
-    192, 255, 255, 255,   0, 192, 255, 255,   0,   0, 192, 255,  63,   0,   0,   0,
-    252, 255, 255, 247,   3,   0,   0, 240, 255, 255, 223,  15, 255, 127,  63,   0,
-    255, 253,   0,   0, 247,  11,   0,   0, 252, 255, 255, 255,  15,   0,   0,   0,
-};
+/* IDS_Trinary_Operator. */
+RE_UINT32 re_get_ids_trinary_operator(RE_UINT32 codepoint) {
+    if (0x2FF2 <= codepoint && codepoint <= 0x2FF3)
+        return 1;
 
-/* Lowercase: 1000 bytes. */
-
-RE_UINT32 re_get_lowercase(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-
-    f = ch >> 13;
-    code = ch ^ (f << 13);
-    pos = (RE_UINT32)re_lowercase_stage_1[f] << 4;
-    f = code >> 9;
-    code ^= f << 9;
-    pos = (RE_UINT32)re_lowercase_stage_2[pos + f] << 4;
-    f = code >> 5;
-    code ^= f << 5;
-    pos = (RE_UINT32)re_lowercase_stage_3[pos + f] << 5;
-    pos += code;
-    value = (re_lowercase_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1;
-
-    return value;
+    return 0;
 }
 
-/* Uppercase. */
-
-static RE_UINT8 re_uppercase_stage_1[] = {
-    0, 1, 2, 2, 2, 3, 2, 4, 5, 2, 2, 6, 2, 2, 7, 8,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2,
-};
-
-static RE_UINT8 re_uppercase_stage_2[] = {
-     0,  1,  2,  3,  3,  3,  3,  3,  4,  5,  3,  3,  3,  3,  6,  7,
-     8,  3,  9,  3,  3,  3, 10,  3,  3,  3,  3,  3,  3,  3,  3,  3,
-     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
-     3,  3,  3, 11,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
-     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3, 12,
-     3,  3, 13,  3,  3,  3, 14,  3,  3,  3,  3,  3, 15,  3,  3,  3,
-     3,  3,  3,  3,  3,  3,  3, 16,  3,  3,  3,  3,  3,  3,  3,  3,
-     3,  3,  3,  3,  3,  3,  3,  3,  3,  3, 17, 18,  3,  3,  3,  3,
-     3,  3,  3,  3, 19,  3,  3,  3, 20,  3,  3,  3,  3,  3,  3,  3,
-};
-
-static RE_UINT8 re_uppercase_stage_3[] = {
-     0,  0,  1,  0,  0,  0,  2,  0,  3,  4,  5,  6,  7,  8,  9, 10,
-     3, 11, 12,  0,  0,  0,  0,  0,  0,  0,  0, 13, 14, 15, 16, 17,
-    18, 19,  0,  3, 20,  3, 21,  3,  3, 22, 23,  0,  0,  0,  0,  0,
+/* Indic_Positional_Category. */
+static RE_UINT8 re_indic_positional_category_table_1[] = {
+     0,  0,  1,  2,  3,  4,  5,  6,  7,  0,  0,  0,  0,  0,  0,  0,
      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0, 18, 24,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 18, 18, 25,
-     0,  0,  0,  0, 26, 27,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     3,  3,  3,  3, 28,  3,  3,  3, 29, 30, 31, 32,  0, 33, 34, 35,
-     0,  0,  0,  0,  0,  0,  0,  0, 36, 37, 38, 19, 39,  0,  0,  0,
-     0,  0,  0,  0,  0, 40, 19,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    18, 41,  0, 42,  3,  3,  3, 43,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  3, 44, 45,  0,  0,  0,  0, 46,  3, 47, 48, 49, 50,  0,
-     0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  0,  0,  0,  0,  0,  0,
-    18, 51,  0,  0,  0, 26, 52,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0, 18, 53,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0, 18,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0, 18,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    54, 55, 56, 57, 58, 59, 26, 60, 61, 62, 63, 64, 65, 54, 55, 56,
-    57, 66, 25, 26, 60, 57, 67, 68, 69, 70, 40, 41, 26, 71, 72,  0,
-     0,  0,  0,  0,  0,  0,  0,  0, 18, 73,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0,  0,  0,  0, 26, 74, 74, 60,  0,  0,  0,
-};
-
-static RE_UINT8 re_uppercase_stage_4[] = {
-      0,   0,   0,   0, 254, 255, 255,   7, 255, 255, 127, 127,  85,  85,  85,  85,
-     85,  85,  85, 170, 170,  84,  85,  85,  85,  85,  85,  43, 214, 206, 219, 177,
-    213, 210, 174,  17, 144, 164, 170,  74,  85,  85, 210,  85,  85,  85,   5, 108,
-    122,  85,   0,   0,   0,   0,  69, 128,  64, 215, 254, 255, 251,  15,   0,   0,
-      0, 128,  28,  85,  85,  85, 144, 230, 255, 255, 255, 255, 255, 255,   0,   0,
-      1,  84,  85,  85, 171,  42,  85,  85,  85,  85, 254, 255, 255, 255, 127,   0,
-    191,  32,   0,   0, 255, 255,  63,   0,   0,   0, 255, 255, 255, 255, 255, 231,
-     85,  85,  21,  64,   0, 255,   0,  63,   0, 255,   0, 255,   0,  63,   0, 170,
-      0, 255,   0,   0,   0,   0,   0,  15,   0,  15,   0,  15,   0,  31,   0,  15,
-    132,  56,  39,  62,  80,  61,  15, 192,  32,   0,   0,   0,   8,   0,   0,   0,
-      0,   0, 192, 255, 255, 127,   0,   0, 157, 234,  37, 192,   5,  40,   4,   0,
-     85,  21,   0,   0,  85,  85,  85,   5,  84,  85,  84,  85,  85,  85,   0, 106,
-     85,  40,  69,  85,  85, 125,  95,  85, 116,   0,   0,   0, 255,   0,   0,   0,
-    255, 255,  15,   0, 255, 255,   7,   0, 255, 255, 255,   3,   0,   0, 240, 255,
-    255,  63,   0,   0,   0, 255, 255, 255,   3,   0,   0, 208, 100, 222,  63,   0,
-    255,   3,   0,   0, 176, 231, 223,  31,   0,   0,   0, 123,  95, 252,   1,   0,
-      0, 240, 255, 255,  63,   0,   0,   0,   3,   0,   0, 240,   1,   0,   0,   0,
-    252, 255, 255,   7,   0,   0,   0, 240, 255, 255,  31,   0, 255,   1,   0,   0,
-      0,   4,   0,   0,   3,   0,   0,   0, 255,   3, 255, 255,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  8,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  9,  0, 10, 11, 12, 13,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0
 };
 
-/* Uppercase: 916 bytes. */
-
-RE_UINT32 re_get_uppercase(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-
-    f = ch >> 13;
-    code = ch ^ (f << 13);
-    pos = (RE_UINT32)re_uppercase_stage_1[f] << 4;
-    f = code >> 9;
-    code ^= f << 9;
-    pos = (RE_UINT32)re_uppercase_stage_2[pos + f] << 4;
-    f = code >> 5;
-    code ^= f << 5;
-    pos = (RE_UINT32)re_uppercase_stage_3[pos + f] << 5;
-    pos += code;
-    value = (re_uppercase_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1;
-
-    return value;
-}
-
-/* Cased. */
-
-static RE_UINT8 re_cased_stage_1[] = {
-    0, 1, 2, 2, 2, 3, 2, 4, 5, 2, 2, 6, 2, 2, 7, 8,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2,
+static RE_UINT8 re_indic_positional_category_table_2[] = {
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   1,   2,   3,   4,   5,   6,   7,   8,
+      9,   6,  10,  11,   9,   6,  12,  13,   5,  14,  15,   4,  16,  17,  18,   0,
+     19,  20,  21,   4,   5,  14,  22,   4,  23,  24,  25,   4,   5,   0,  26,  27,
+      0,  28,  29,   0,   0,  30,  31,   0,  32,  33,   0,  34,  35,  36,  37,   0,
+      0,  38,  39,  40,  41,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,  42,  42,  43,  43,   0,  44,  45,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,  46,   0,   0,   0,  47,  48,   0,
+     49,   0,  50,  51,   0,   0,   0,   0,  52,  53,  54,  55,  56,  57,   0,  58,
+      0,  59,   0,   0,   0,   0,  60,  61,   0,   0,   0,   0,   0,   0,   0,  62,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,  63,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     64,  65,   0,   0,  66,  67,  68,  69,   0,  70,  71,   0,   1,  72,  73,  74,
+      0,  75,  76,  77,   0,  78,  79,  80,   0,   0,   0,   0,   0,   0,   0,  81,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     82,  83,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     84,  85,  86,   0,  56,  87,   0,   0,  88,  89,  90,  91,  56,  92,  93,   0,
+      0,  94,   0,   0,   0,   0,  95,  96,  23,  97,  98,  99,   0,   0,   0,   0,
+      0, 100, 101,   0,   0, 102, 103,   0,   0,   0,   0,   0,   0, 104, 105,   0,
+      0, 106, 107,   0,   0, 108,   0,   0, 109, 110,   0,   0,   0,   0,   0,   0,
+      0, 111,   0,   0,   0,   0,   0,   0,   0, 112, 113,   0,   0,   0, 114, 115,
+    116, 117, 118,   0, 119,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0, 120,   0,   0, 121, 122,   0,   0,   0, 123, 124,   0, 125,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0, 126,   0,   0,   0,   0,   0,   0,   0,   0
 };
 
-static RE_UINT8 re_cased_stage_2[] = {
-     0,  1,  2,  3,  3,  3,  3,  3,  4,  5,  3,  3,  3,  3,  6,  7,
-     8,  3,  9,  3,  3,  3, 10,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+static RE_UINT8 re_indic_positional_category_table_3[] = {
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     1,  1,  1,  2,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  2,  3,  0,  2,  4,
+     2,  3,  3,  3,  3,  1,  1,  1,  1,  2,  2,  2,  2,  3,  4,  2,
+     0,  1,  3,  1,  1,  1,  3,  3,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  3,  3,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  1,  2,  2,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  3,  0,  2,  4,
+     2,  3,  3,  3,  3,  0,  0,  4,  4,  0,  0,  5,  5,  3,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  2,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  3,  3,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  0,
+     0,  1,  1,  2,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     2,  3,  3,  0,  0,  0,  0,  1,  1,  0,  0,  1,  1,  3,  0,  0,
+     0,  3,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     1,  1,  0,  0,  0,  3,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     2,  3,  3,  3,  3,  1,  0,  1,  1,  6,  0,  2,  2,  3,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  3,  3,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  1,  1,  1,  1,  1,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  3,  0,  2,  1,
+     2,  3,  3,  3,  3,  0,  0,  4,  7,  0,  0,  5,  8,  3,  0,  0,
+     0,  0,  0,  0,  0,  1,  1,  6,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  2,  2,
+     1,  2,  2,  0,  0,  0,  4,  4,  4,  0,  5,  5,  5,  1,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  2,  0,  0,  0,  0,  0,  0,  0,  0,
+     1,  2,  2,  2,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  1,
+     1,  2,  2,  2,  2,  0,  1,  1,  9,  0,  1,  1,  1,  1,  0,  0,
+     0,  0,  0,  0,  0,  1,  3,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     6,  2,  2,  2,  2,  0,  1,  6,  6,  0,  6,  6,  1,  1,  0,  0,
+     0,  0,  0,  0,  0,  2,  2,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     1,  1,  2,  2,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  1,  0,  2,  2,
+     2,  2,  2,  3,  3,  0,  4,  4,  4,  0,  5,  5,  5,  1,  1,  0,
+     0,  0,  0,  0,  0,  0,  0,  2,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  0,  0,  0,  0,  2,
+     2,  2,  1,  1,  3,  0,  3,  0,  2,  4,  7,  4,  5,  8,  5,  2,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  2,  2,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     2,  1,  2,  2,  1,  1,  1,  1,  3,  3,  3,  0,  0,  0,  0,  0,
+    10, 10, 10, 10, 10,  2,  0,  1,  1,  1,  1,  1,  1,  1,  1,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     2,  1,  2,  2,  1,  1,  1,  1,  3,  3,  3,  1,  3,  0,  0,  0,
+    10, 10, 10, 10, 10,  0,  0,  0,  1,  1,  1,  1,  1,  1,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  3,  3,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  3,  0,  3,  0,  1,  0,  0,  0,  0,  2,  4,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  3,  1,  9,  3,  3,  9,  9,  9,  9,  1,  1,  1,  1,  1,  2,
+     1,  9,  1,  1,  3,  0,  1,  1,  0,  0,  0,  0,  0,  3,  3,  3,
+     3,  3,  3,  3,  3,  3,  3,  3,  0,  3,  3,  3,  3,  3,  3,  3,
      3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
-     3,  3,  3, 11,  3, 12,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
-     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3, 13,  3, 14,
-     3,  3, 15,  3,  3,  3, 16,  3,  3,  3,  3,  3, 17,  3,  3,  3,
-     3,  3,  3,  3,  3,  3,  3, 18,  3,  3,  3,  3,  3,  3,  3,  3,
-     3,  3,  3,  3,  3,  3,  3,  3,  3,  3, 19, 20,  3,  3,  3,  3,
-     3,  3,  3,  3, 21,  3,  3,  3, 22,  3,  3,  3,  3,  3,  3,  3,
-};
-
-static RE_UINT8 re_cased_stage_3[] = {
-     0,  0,  1,  1,  0,  2,  3,  3,  4,  4,  4,  4,  4,  5,  6,  4,
-     4,  4,  4,  4,  7,  8,  9, 10,  0,  0, 11, 12, 13, 14,  4, 15,
-     4,  4,  4,  4, 16,  4,  4,  4,  4, 17, 18,  4, 19,  0,  0,  0,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  3,  0,  0,  0,  0,  0,  0,  0,  0,  0,
      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  4, 20, 21,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  4,  4, 22,
-     0,  0,  0,  0, 23, 21,  0,  0,  4,  4,  4,  4,  4,  4,  0,  0,
-     4,  4,  4,  4,  4,  4,  4,  4, 22,  4, 24, 25,  4, 26, 27, 28,
-     0,  0,  0, 29, 30,  0,  0,  0, 31, 32, 33,  4, 34,  0,  0,  0,
-     0,  0,  0,  0,  0, 35,  4, 36,  0,  0,  0,  0,  0,  0,  0,  0,
-     4, 37, 38,  4,  4,  4,  4, 39,  4, 40,  0,  0,  0,  0,  0,  0,
-     0,  0,  4, 41, 25,  0,  0,  0,  0, 42,  4,  4, 43,  4, 44, 45,
-     0,  0,  0,  0,  0,  0,  0,  0,  0, 46,  5, 47,  4,  4,  0,  0,
-     0,  0,  0,  0,  0,  0,  0,  0, 48,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  1,  0,  0,  0,  0,  0,
-     4,  4, 49,  0,  0, 46, 50, 51,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  4, 52,  4, 52,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  4,  4,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  4,  4,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     4,  4, 53,  4, 54, 55, 56,  4, 57, 58, 59,  4,  4,  4,  4,  4,
-     4,  4,  4,  4,  4, 60, 61,  5, 53, 53, 37, 37, 62, 62, 63,  0,
-     0,  0,  0,  0,  0,  0,  0,  0,  4,  4, 64,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0,  0,  0,  0, 46, 65, 65, 36,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  2,  2,  1,  1,  3,
+     3,  4,  1,  1,  1,  1,  1,  3,  2,  0,  1,  2, 11,  3,  3,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  2,  2,  3,  3,  0,  0,  0,  0,  3,  3,
+     3,  0,  2,  2,  2,  0,  0,  2,  2,  2,  2,  2,  2,  2,  0,  0,
+     0,  1,  1,  1,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  3,  2,  4,  1,  1,  2,  2,  2,  2,  2,  2,  3,  0,  2,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  2,  2,  2,  1,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  1,  3,  3,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  1,  3,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  2,  1,  1,  1,  1,  3,  3,  3,  7,  8,
+     5,  4,  4,  4,  5,  5,  1,  2,  2,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  0,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  0,  0,
+     1,  1,  3,  2,  2,  6,  6,  1,  1,  2,  2,  2,  0,  0,  0,  0,
+     2,  2,  3,  2,  2,  2,  2,  2,  2,  3,  1,  3,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     2,  2,  2,  2,  2, 10, 10, 10,  2,  2, 10,  2,  2,  2,  2,  2,
+     2,  0,  0,  0,  0,  0,  0,  0,  2,  2,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  1,  3,  4,  2,  1,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  4,  3,  2,  1,  1,  1,  3,  3,  3,  3,  0,
+     0,  2,  1,  2,  2,  1,  1,  1,  1,  3,  3,  1,  3,  2,  4,  4,
+     4,  4,  4,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  0,  0,  3,
+     1,  1,  1,  1,  2,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  1,  2,  1,  1,  3,  3,  3, 12,  9, 13,  4,  4,
+     5,  5,  1,  6,  2,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  3,  1,  1,  1,
+     1,  1,  1,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     1,  1,  2,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  2,  3,  3,  1,  3,  4,  2,  1,  1,  2,  0,  3,  3,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  1,  2,  1,  1,  2,  2,  2,  1,  2,  1,
+     1,  1,  2,  2,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  2,  2,  2,  4,  4,  7,  2,  2,  3,  1,  1,  1,
+     1,  1,  1,  1,  4,  4,  1,  3,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     1,  1,  1,  0, 14,  3,  3,  3,  3,  3,  1,  1,  3,  3,  3,  3,
+     1,  2, 14, 14, 14, 14, 14, 14, 14,  0,  0,  0,  0,  3,  0,  0,
+     0,  0,  0,  0,  1,  0,  0,  2,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  1,  0,  0,  0,  1,  0,  0,  0,  0,  1,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  2,  2,  3,  1,  2,  0,  0,  0,  0,  3,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     2,  2,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  3,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  3,  3,  3,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  3,  3,  3,  1,  3,  3,  3,  3,  1,
+     1,  1,  2,  2,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  1,  2,  2,  1,  1,  3,  3,  4,  4,  1,  3, 12, 15,
+    12,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  1,  1,  1,  3,  1,  4,
+     4,  1,  3,  2,  4,  3,  3,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  1,  0,  0,  0,  0,  0,  0,  0,  0,  1,  2,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  2,  1,  2,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     1,  2,  1,  1,  3, 10, 10,  1,  1, 10,  2, 10, 10,  2,  1,  1,
+     0,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  4,  3,  1,  4,  2,
+     0,  0,  0,  0,  0,  2,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  2,  2,  1,  2,  2,  3,  2,  2,  0,  2,  3,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0, 14,  3,  3,  0,  1, 14,  0,  0,  0,  0,  0,  3,  3,  3,  1,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  1,  3,  3,  0,  0,  0,  0,  0,
+     2,  1,  2,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  1,  1,  1,  1,  3,  3,  3,  3,
+     3,  3,  1,  1,  1,  1,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     2,  4,  2,  3,  3,  1,  1,  2,  2,  3,  3,  0,  0,  0,  0,  0,
+     1,  1,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  1,  1,  1,  3,  3,  4,  1,  9,  9,
+     1,  3,  3,  0,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  2,  2,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  3,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  2,  4,  2,  3,  3,  3,  3,  3,  3,  1,  1,  1,  6,
+     2,  0,  1,  1,  0,  0,  0,  0,  0,  3,  3,  1,  3,  0,  4,  1,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  2,  2,  2,  3,
+     1,  1,  6,  6,  1,  2,  1,  1,  0,  0,  0,  0,  0,  0,  1,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,
+     2,  4,  2,  3,  3,  1,  1,  1,  1,  3,  3,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  3,  3,  0,  2,  2,
+     1,  2,  2,  2,  2,  0,  0,  4,  4,  0,  0,  5,  5,  2,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  2,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  2,  2,  0,  0,  1,  1,  1,  1,  1,  1,  1,  0,  0,  0,
+     1,  1,  1,  1,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  2,  4,  2,  3,  3,  3,  3,  3,  3,  1,  1,
+     2,  2,  3,  1,  1,  2,  3,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     2,  4,  2,  3,  3,  3,  3,  3,  3,  4,  1,  7,  5,  2,  5,  1,
+     1,  2,  3,  3,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  2,
+     4,  2,  3,  3,  3,  3,  0,  0,  4,  7,  5,  8,  1,  1,  2,  3,
+     3,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  3,  3,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     2,  2,  2,  3,  3,  3,  3,  3,  3,  1,  1,  2,  2,  1,  2,  3,
+     1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  2,  1,  4,  2,
+     3,  3,  1,  1,  1,  1,  2,  3,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  3, 11,  1,
+     2,  2,  1,  1,  3,  3,  4,  1,  3,  1,  1,  1,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  2,  4,  2,  3,
+     3,  3,  3,  1,  1,  1,  1,  1,  2,  3,  3,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     2,  2,  2,  2,  2,  4,  0,  4,  5,  0,  0,  1,  1,  2,  0,  1,
+     2,  1, 12,  3,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  2,  4,  2,  3,  3,  3,  3,  0,  0,  1,  1,  2,  2,  2,  2,
+     3,  0,  0,  0,  4,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  1,  3,  3,  1,  1,  1,  1,  1,  1,  3,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  3,  3,  1,  1,  1,  1,  2,  1,  3,  3,  3,  3,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  1,  3,  3,  1,  1,  1,  2,  2,  3,  3,  3,  0,  0,  0,  0,
+     0,  0,  0,  0,  1,  1,  1,  1,  1,  1,  3,  3,  3,  3,  3,  3,
+     3,  3,  3,  3,  3,  3,  1,  2,  1,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  2,
+     1,  1,  3,  3,  3,  3,  3,  0,  1,  1,  1,  1,  1,  1,  2,  3,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+     3,  3,  3,  3,  3,  3,  3,  3,  0,  2,  3,  3,  3,  3,  3,  3,
+     3,  4,  3,  1,  2,  1,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  1,  1,  1,  1,  1,  3,  0,  0,  0,  1,  0,  1,  1,  0,  1,
+     1,  1,  3,  1,  3,  0,  2,  3,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  2,  2,  2,  2,  2,  0,
+     1,  1,  0,  2,  2,  1,  2,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  1,  3,  4,  2,  0,  0,  0,  0,  0,  0,  0,  0,  0
 };
 
-static RE_UINT8 re_cased_stage_4[] = {
-      0,   0,   0,   0, 254, 255, 255,   7,   0,   4,  32,   4, 255, 255, 127, 255,
-    255, 255, 255, 255, 255, 255, 255, 247, 240, 255, 255, 255, 255, 255, 239, 255,
-    255, 255, 255,   1,   3,   0,   0,   0,  31,   0,   0,   0,  32,   0,   0,   0,
-      0,   0, 207, 188,  64, 215, 255, 255, 251, 255, 255, 255, 255, 255, 191, 255,
-      3, 252, 255, 255, 255, 255, 254, 255, 255, 255, 127,   0, 255,   1,   0,   0,
-    191,  32, 255, 255, 255, 255, 255, 231, 255, 255,  63,  63, 255,   1, 255, 255,
-     63,  63, 255, 170, 255, 255, 255,  63, 255, 255, 223,  95, 220,  31, 207,  15,
-    255,  31, 220,  31,   0,   0,   2, 128,   0,   0, 255,  31, 132, 252,  47,  62,
-     80, 189,  31, 242, 224,  67,   0,   0,  24,   0,   0,   0,   0,   0, 192, 255,
-    255,   3,   0,   0, 255, 127, 255, 255, 255, 255, 255, 127,  31, 120,  12,   0,
-    191,  32,   0,   0, 255,  63,   0,   0, 252, 255, 255, 255, 255, 120, 255, 255,
-    124,   0,   0,   0,   0,   0,   0,   7,   0,   0, 255, 255, 255,   0, 255, 255,
-    127,   0, 248,   0, 255, 255,   0,   0, 255, 255,  15, 255, 255, 255, 255,  15,
-    255, 255,   7,   0, 255, 255, 223, 255, 255, 255, 255, 223, 100, 222, 255, 235,
-    239, 255, 255, 255, 191, 231, 223, 223, 255, 255, 255, 123,  95, 252, 253, 255,
-     63, 255, 255, 255, 253, 255, 255, 247, 255, 253, 255, 255, 247,  15,   0,   0,
-     15,   0,   0,   0, 255,   3, 255, 255,
-};
+RE_UINT32 re_get_indic_positional_category(RE_UINT32 codepoint) {
+    RE_UINT32 field_2;
+    RE_UINT32 field_1;
+    RE_UINT32 field_0;
+    RE_UINT32 v;
 
-/* Cased: 912 bytes. */
-
-RE_UINT32 re_get_cased(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-
-    f = ch >> 13;
-    code = ch ^ (f << 13);
-    pos = (RE_UINT32)re_cased_stage_1[f] << 4;
-    f = code >> 9;
-    code ^= f << 9;
-    pos = (RE_UINT32)re_cased_stage_2[pos + f] << 4;
-    f = code >> 5;
-    code ^= f << 5;
-    pos = (RE_UINT32)re_cased_stage_3[pos + f] << 5;
-    pos += code;
-    value = (re_cased_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1;
-
-    return value;
-}
+    field_2 = codepoint >> 10;
+    field_1 = (codepoint >> 5) & 0x1F;
+    field_0 = codepoint & 0x1F;
 
-/* Case_Ignorable. */
+    v = re_indic_positional_category_table_1[field_2];
+    v = re_indic_positional_category_table_2[(v << 5) | field_1];
+    v = re_indic_positional_category_table_3[(v << 5) | field_0];
 
-static RE_UINT8 re_case_ignorable_stage_1[] = {
-     0,  1,  2,  2,  2,  3,  2,  4,  5,  6,  2,  7,  2,  8,  9, 10,
-     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
-     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
-     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
-     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
-     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
-     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
-    11,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
-     2,  2,  2,  2,  2,  2,  2,  2,
-};
+    return v;
+}
 
-static RE_UINT8 re_case_ignorable_stage_2[] = {
-     0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15,
-    16,  1,  1, 17,  1,  1,  1, 18, 19, 20, 21, 22, 23, 24,  1, 25,
-    26,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1, 27, 28, 29,  1,
-    30,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+/* Indic_Syllabic_Category. */
+static RE_UINT8 re_indic_syllabic_category_table_1[] = {
+     0,  1,  2,  3,  4,  5,  6,  7,  8,  9,  1,  1,  1,  1,  1,  1,
      1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1, 10,  1,  1,  1,  1,  1,
      1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
-    31,  1,  1,  1, 32,  1, 33, 34, 35, 36, 37, 38,  1,  1,  1,  1,
+     1,  1, 11,  1, 12, 13, 14, 15,  1,  1,  1,  1,  1,  1,  1,  1,
      1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
      1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
-     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1, 39,  1,  1, 40, 41,
-     1, 42, 43, 44,  1,  1,  1,  1,  1,  1, 45,  1,  1, 46,  1, 47,
-    48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58,  1, 59, 60, 61,  1,
      1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
-     1,  1,  1,  1, 62,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
-     1,  1,  1,  1,  1,  1,  1,  1,  1,  1, 63, 64,  1,  1,  1, 65,
      1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
      1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
-     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1, 66,  1,  1,  1,
      1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
-     1, 67, 68,  1,  1,  1,  1,  1,  1,  1, 69,  1,  1,  1,  1,  1,
-    70, 71, 72,  1,  1,  1,  1,  1, 73, 74,  1,  1,  1,  1,  1,  1,
-     1,  1,  1, 75,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
-    76, 77,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
      1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1
 };
 
-static RE_UINT8 re_case_ignorable_stage_3[] = {
-      0,   1,   2,   3,   0,   4,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   5,   6,   6,   6,   6,   6,   7,   8,   0,   0,   0,
-      0,   0,   0,   0,   9,   0,   0,   0,   0,   0,  10,   0,  11,  12,  13,  14,
-     15,   0,  16,  17,   0,   0,  18,  19,  20,   5,  21,   0,   0,  22,   0,  23,
-     24,  25,  26,   0,   0,   0,  27,   6,  28,  29,  30,  31,  32,  33,  34,  35,
-     36,  33,  37,  38,  36,  33,  39,  40,  32,  41,  42,  43,  44,   0,  45,   0,
-     46,  47,  48,  43,  32,  41,  49,  43,  50,  51,  34,  43,   0,   0,  52,   0,
-      0,  53,  54,   0,   0,  55,  56,   0,  57,  58,   0,  59,  60,  61,  62,   0,
-      0,  63,  64,  65,  66,   0,   0,  33,   0,   0,  67,   0,   0,   0,   0,   0,
-     68,  68,  69,  69,   0,  70,  71,   0,  72,   0,  73,   0,  74,  75,   0,   0,
-      0,  76,   0,   0,   0,   0,   0,   0,  77,   0,  78,  79,   0,  80,   0,   0,
-     81,  82,  44,  83,  50,  84,   0,  85,   0,  86,   0,  87,   0,   0,  88,  89,
-      0,  90,   6,  91,  92,   6,   6,  93,   0,   0,   0,   0,   0,  94,  95,  96,
-     97,  98,   0,  99, 100,   0,   5, 101,   0,   0,   0, 102,   0,   0,   0, 103,
-      0,   0,   0, 104,   0,   0,   0,   6,   0, 105,   0,   0,   0,   0,   0,   0,
-    106, 107,   0,   0, 108,   0,   0, 109, 110,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,  87, 111,   0,   0, 112, 113,   0,   0, 114,
-      6,  50,   0,  17, 115,   0,   0,  57, 116,  74,   0,   0,   0,   0, 117, 118,
-      0, 119, 120,   0,  28, 121, 105,  74,   0, 122, 123, 124,   0, 125, 126, 127,
-      0,   0,  92,   0,   0,   0,   0, 128,   2,   0,   0,   0,   0, 129,  50,   0,
-    130, 131, 132,   0,   0,   0,   0, 133,   1,   2,   3,  17,  47,   0,   0, 134,
-      0,   0,   0,   0,   0,   0,   0, 135,   0,   0,   0,   0,   0,   0,   0,   3,
-      0,   0,   0, 136,   0,   0,   0,   0, 137, 138,   0,   0,   0,   0,   0,  74,
-      0, 139,   0,   0,   0,   0,   0,   0,   0,   0,  22,   0,   0,   0,   0,   0,
-     32, 140, 141, 133,  50, 142, 143,   0,  28, 144,   0, 145,  50, 146, 147,   0,
-      0, 148,   0,   0,   0,   0, 133, 149,  50,  51,   3, 150,   0,   0,   0,   0,
-      0, 140, 151,   0,   0, 152, 153,   0,   0,   0,   0,   0,   0, 154, 155,   0,
-      0, 156,   3,   0,   0, 157,   0,   0,  67, 158,   0,   0,   0,   0,   0,   0,
-      0, 159,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 160,   3,
-    161, 162, 163,   0, 164,   0,   0,   0,   0, 165,   0,   0, 129, 166,   0,   0,
-      0, 167, 168,   0, 169,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 170,
-      0, 171,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 172,
-      0, 173,  81,   0,   0,   0,   0,   0,   0,   0, 105,   0, 174,   0,   0, 175,
-      0,   0,   0,   0, 176,  81,   0,   0,   0,   0,   0, 177, 178, 179,   0,   0,
-      0,   0, 180,   0,   0,   0,   0,   0,   6, 181,   6, 182, 183, 184,   0,   0,
-    185, 186,   0,   0,   0,   0,   0,   0,   0, 187,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0, 188,   0,   0,   0,   0,   0,   0, 173,   0,
-      0,   0, 189,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  92,
-     32,   6,   6,   6,   0,   0,   0,   0,   6,   6,   6,   6,   6,   6,   6, 131,
-};
-
-static RE_UINT8 re_case_ignorable_stage_4[] = {
-      0,   0,   0,   0, 128,  64,   0,   4,   0,   0,   0,  64,   1,   0,   0,   0,
-      0, 161, 144,   1,   0,   0, 255, 255, 255, 255, 255, 255, 255, 255,  48,   4,
-    176,   0,   0,   0, 248,   3,   0,   0,   0,   0,   0,   2,   0,   0, 254, 255,
-    255, 255, 255, 191, 182,   0,   0,   0,   0,   0,  16,   0,  63,   0, 255,  23,
-      1, 248, 255, 255,   0,   0,   1,   0,   0,   0, 192, 191, 255,  61,   0,   0,
-      0, 128,   2,   0, 255,   7,   0,   0, 192, 255,   1,   0,   0, 248,  63,  36,
-      0,   0, 192, 255, 255,  63,   0,   0,   0,   0,   0,  14,   0,   0, 248, 255,
-      7,   0,   0,   0,   0,   0,   0,  20, 254,  33, 254,   0,  12,   0,   2,   0,
-      2,   0,   0,   0,   0,   0,   0,  16,  30,  32,   0,   0,  12,   0,   0,  64,
-      6,   0,   0,   0, 134,  57,   2,   0,   0,   0,  35,   0, 190,  33,   0,   0,
-     12,   0,   0, 252,   0,   0,   0, 144,  30,  32,  64,   0,  12,   0,   0,   0,
-      4,   0,   0,   0,   1,  32,   0,   0,  17,   0,   0,   0,   0,   0,   0, 192,
-    193,  61,  96,   0,  64,  48,   0,   0,   3,   0,   0,   0,   0,   0,   0,  24,
-      0,   4,  92,   0,   0,   0, 242,   7, 192, 127,   0,   0,   0,   0, 242,  31,
-     64,  63,   0,   0,   0,   0,   0,   3,   0,   0, 160,   2,   0,   0, 254, 127,
-    223, 224, 255, 254, 255, 255, 255,  31,  64,   0,   0,   0,   0, 224, 253, 102,
-      0,   0,   0, 195,   1,   0,  30,   0, 100,  32,   0,  32,   0,   0,   0, 224,
-      0,   0,  28,   0,   0,   0,  12,   0,   0,   0, 176,  63,  64, 254, 143,  32,
-      0, 120,   0,   0,   8,   0,   0,   0,  96,   0,   0,   0,   0,   2,   0,   0,
-    135,   1,   4,  14,   0,   0, 128,   9,   0,   0,  64, 127, 229,  31, 248, 159,
-    128,   0, 255, 127,  15,   0,   0,   0,   0,   0, 208,  23,   0, 248,  15,   0,
-     60,  59,   0,   0,  64, 163,   3,   0,   0, 240, 207,   0,   0,   0,   0,  63,
-      0,   0, 247, 255, 253,  33,  16,   3,   0, 240, 255, 255, 255,   7,   0,   1,
-      0,   0,   0, 248, 255, 255, 255, 251,   0,   0,   0, 160,   3, 224,   0, 224,
-      0, 224,   0,  96,   0, 248,   0,   3, 144, 124,   0,   0, 223, 255,   2, 128,
-      0,   0, 255,  31, 255, 255,   1,   0,   0,   0,   0,  48,   0, 128,   3,   0,
-      0, 128,   0, 128,   0, 128,   0,   0,  32,   0,   0,   0,   0,  60,  62,   8,
-      0,   0,   0, 126,   0,   0,   0, 112,   0,   0,  32,   0,   0,  16,   0,   0,
-      0, 128, 247, 191,   0,   0,   0, 240,   0,   0,   3,   0,   0,   7,   0,   0,
-     68,   8,   0,   0,  48,   0,   0,   0, 255, 255,   3, 128, 192,  63,   0,   0,
-    128, 255,   3,   0,   0,   0, 200,  51,   0, 126, 102,   0,   8,  16,   0,   0,
-      0,   0,   1,  16,   0,   0, 157, 193,   2,   0,   0,  32,   0,  48,  88,   0,
-     32,  33,   0,   0,   0,   0, 252, 255, 255, 255,   8,   0, 255, 255,   0,   0,
-      0,   0,  36,   0,   0,   0,   0, 128,   8,   0,   0,  14,   0,   0,   0,  32,
-      0,   0, 192,   7, 110, 240,   0,   0,   0,   0,   0, 135, 240,   0,   0,   0,
-      0,   0,   0, 255, 127,   0,   0,   0,   0,   0, 120,  38,   0,  32,   0,   0,
-    128, 239,  31,   0,   0,   0,   8,   0,   0,   0, 192, 127,   0,  30,   0,   0,
-      0, 128, 211,  64, 248,   7,   0,   0, 192,  31,  31,   0,  92,   0,   0,  64,
-      0,   0, 248, 133,  13,   0,   0,   0,   0,   0,  60, 176,   1,   0,   0,  48,
-      0,   0, 248, 167,   0,  40, 191,   0, 188,  15,   0,   0,   0, 128, 255,   6,
-      0,   0, 240,  12, 254,   7,   0,   0,   0,   0, 248, 121, 128,   0, 126,  14,
-      0, 252, 127,   3,   0,   0, 127, 191, 255, 252, 109,   0,   0,   0, 126, 180,
-    191,   0,   0,   0,   0,   0, 163,   0,   0,   0,  24,   0,   0,   0, 255,   1,
-      0,   0,  31,   0,   0,   0, 127,   0,   0, 128, 255, 255,  11,   0,   0,   0,
-      0,   0,   0,  96, 128,   3, 248, 255, 231,  15,   0,   0,   0,  60,   0,   0,
-     28,   0,   0,   0, 255, 255, 127, 248, 255,  31,  32,   0,  16,   0,   0, 248,
-    254, 255,   0,   0, 127, 255, 255, 249, 219,   7,   0,   0,   0,   0, 255,  63,
-      0, 240,   0,   0, 240,  15,   0,   0,
-};
-
-/* Case_Ignorable: 1904 bytes. */
-
-RE_UINT32 re_get_case_ignorable(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-
-    f = ch >> 13;
-    code = ch ^ (f << 13);
-    pos = (RE_UINT32)re_case_ignorable_stage_1[f] << 5;
-    f = code >> 8;
-    code ^= f << 8;
-    pos = (RE_UINT32)re_case_ignorable_stage_2[pos + f] << 3;
-    f = code >> 5;
-    code ^= f << 5;
-    pos = (RE_UINT32)re_case_ignorable_stage_3[pos + f] << 5;
-    pos += code;
-    value = (re_case_ignorable_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1;
-
-    return value;
-}
-
-/* Changes_When_Lowercased. */
-
-static RE_UINT8 re_changes_when_lowercased_stage_1[] = {
-    0, 1, 2, 2, 2, 3, 2, 4, 5, 2, 2, 6, 2, 2, 2, 7,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2,
-};
-
-static RE_UINT8 re_changes_when_lowercased_stage_2[] = {
-     0,  1,  2,  3,  3,  3,  3,  3,  4,  5,  3,  3,  3,  3,  6,  7,
-     8,  3,  9,  3,  3,  3, 10,  3,  3,  3,  3,  3,  3,  3,  3,  3,
-     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
-     3,  3,  3, 11,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
-     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3, 12,
-     3,  3, 13,  3,  3,  3, 14,  3,  3,  3,  3,  3, 15,  3,  3,  3,
-     3,  3,  3,  3,  3,  3,  3, 16,  3,  3,  3,  3,  3,  3,  3,  3,
-     3,  3,  3,  3, 17,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+static RE_UINT8 re_indic_syllabic_category_table_2[] = {
+      0,   1,   0,   0,   0,   2,   3,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   4,   5,   6,   7,   8,   9,  10,  11,
+     12,  13,  14,  15,  16,  17,  18,  19,  20,  17,  21,  22,  23,  24,  25,  26,
+     27,  28,  29,  30,  31,  32,  33,  34,  27,  35,  36,  37,  38,  39,  40,  41,
+     42,  43,  44,   0,  45,  46,  47,   0,   0,  48,  49,  50,  51,  52,  53,   0,
+     54,  55,  56,  57,  58,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,  59,  60,  61,  62,  54,  63,  64,  65,
+      0,   0,   0,   0,   0,   0,   0,   0,  66,  67,  68,  69,  54,  70,  71,   0,
+     72,  54,  73,  74,  75,   0,   0,   0,  76,  77,  78,   0,  79,  80,  54,  81,
+     54,  82,  83,   0,   0,   0,  84,  85,   0,   0,   0,   0,   0,   0,   0,  86,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     87,   0,   0,  88,  89,   0,   0,  90,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  91,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     92,  93,  94,  95,  96,  97,  98,  99, 100, 101, 102,   0, 103, 104, 105, 106,
+    107, 108, 109, 110,  54, 111, 112, 113,   0,   0,   0,   0,   0,   0, 114, 115,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    116, 117, 118,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    119, 120, 121, 122, 123, 124,   0,   0, 125, 126, 127, 128, 129, 130, 131, 132,
+    133, 134,   0,   0, 135, 136, 137, 138, 139, 140, 141, 142,   0,   0,   0,   0,
+    143, 144, 145, 146, 147, 148, 149,   0,   0,   0,   0,   0, 143, 150, 151,   0,
+    143, 152, 153,   0, 154, 155,  65,   0, 156, 157,   0,   0,   0,   0,   0,   0,
+    154, 158,   0,   0,   0,   0,   0,   0, 159, 160, 161,   0,   0, 162, 163, 164,
+    165, 166, 167,  54, 168,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    169, 170, 171, 172, 173, 174,   0,   0, 175, 176, 177, 178, 179,  65,   0,   0,
+      0,   0,   0,   0,   0,   0,   0, 180,   0,   0,   0,   0,   0,   0,   0,   0
 };
 
-static RE_UINT8 re_changes_when_lowercased_stage_3[] = {
-     0,  0,  1,  0,  0,  0,  2,  0,  3,  4,  5,  6,  7,  8,  9, 10,
-     3, 11, 12,  0,  0,  0,  0,  0,  0,  0,  0, 13, 14, 15, 16, 17,
-    18, 19,  0,  3, 20,  3, 21,  3,  3, 22, 23,  0,  0,  0,  0,  0,
+static RE_UINT8 re_indic_syllabic_category_table_3[] = {
      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0, 18, 24,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 18, 18, 25,
-     0,  0,  0,  0, 26, 27,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     3,  3,  3,  3, 28,  3,  3,  3, 29, 30, 31, 32, 30, 33, 34, 35,
-     0,  0,  0,  0,  0,  0,  0,  0,  0, 36,  0, 19, 37,  0,  0,  0,
-     0,  0,  0,  0,  0, 38, 19,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    18, 39,  0, 40,  3,  3,  3, 41,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  3, 42, 43,  0,  0,  0,  0, 44,  3, 45, 46, 47, 48,  0,
-     0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  0,  0,  0,  0,  0,  0,
-    18, 49,  0,  0,  0, 26, 50,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0, 18, 51,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0, 18,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0, 18,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0,  0,  0, 18, 52,  0,  0,  0,  0,  0,  0,
-};
-
-static RE_UINT8 re_changes_when_lowercased_stage_4[] = {
-      0,   0,   0,   0, 254, 255, 255,   7, 255, 255, 127, 127,  85,  85,  85,  85,
-     85,  85,  85, 170, 170,  84,  85,  85,  85,  85,  85,  43, 214, 206, 219, 177,
-    213, 210, 174,  17, 176, 173, 170,  74,  85,  85, 214,  85,  85,  85,   5, 108,
-    122,  85,   0,   0,   0,   0,  69, 128,  64, 215, 254, 255, 251,  15,   0,   0,
-      0, 128,   0,  85,  85,  85, 144, 230, 255, 255, 255, 255, 255, 255,   0,   0,
-      1,  84,  85,  85, 171,  42,  85,  85,  85,  85, 254, 255, 255, 255, 127,   0,
-    191,  32,   0,   0, 255, 255,  63,   0,   0,   0, 255, 255, 255, 255, 255, 231,
-     85,  85,  21,  64,   0, 255,   0,  63,   0, 255,   0, 255,   0,  63,   0, 170,
-      0, 255,   0,   0,   0, 255,   0,  31,   0,  31,   0,  15,   0,  31,   0,  31,
-     64,  12,   4,   0,   8,   0,   0,   0,   0,   0, 192, 255, 255, 127,   0,   0,
-    157, 234,  37, 192,   5,  40,   4,   0,  85,  21,   0,   0,  85,  85,  85,   5,
-     84,  85,  84,  85,  85,  85,   0, 106,  85,  40,  69,  85,  85, 125,  95,  85,
-    116,   0,   0,   0, 255,   0,   0,   0, 255, 255,  15,   0, 255, 255,   7,   0,
-      3,   0,   0,   0,
-};
-
-/* Changes_When_Lowercased: 764 bytes. */
-
-RE_UINT32 re_get_changes_when_lowercased(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-
-    f = ch >> 13;
-    code = ch ^ (f << 13);
-    pos = (RE_UINT32)re_changes_when_lowercased_stage_1[f] << 4;
-    f = code >> 9;
-    code ^= f << 9;
-    pos = (RE_UINT32)re_changes_when_lowercased_stage_2[pos + f] << 4;
-    f = code >> 5;
-    code ^= f << 5;
-    pos = (RE_UINT32)re_changes_when_lowercased_stage_3[pos + f] << 5;
-    pos += code;
-    value = (re_changes_when_lowercased_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1;
-
-    return value;
-}
-
-/* Changes_When_Uppercased. */
-
-static RE_UINT8 re_changes_when_uppercased_stage_1[] = {
-    0, 1, 2, 2, 2, 3, 2, 4, 5, 2, 2, 6, 2, 2, 2, 7,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  0,  0,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  0,  0,  0,  0,  0,  0,
+     1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  3,  3,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  1,  0,  0,  0,  0,  0,  0,  0,  0,
+     4,  4,  4,  5,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,
+     6,  6,  6,  6,  6,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  8,  8,  9, 10,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8, 11,  8,  8,
+     0, 12, 12,  0,  0,  8,  8,  8,  7,  7,  7,  7,  7,  7,  7,  7,
+     6,  6,  8,  8,  0,  0,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     0,  0,  6,  6,  6,  6,  6,  6,  7,  7,  7,  7,  7,  7,  7,  7,
+     1,  4,  4,  5,  0,  6,  6,  6,  6,  6,  6,  6,  6,  0,  0,  6,
+     6,  0,  0,  6,  6,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  0,  7,  7,  7,  7,  7,  7,
+     7,  0,  7,  0,  0,  0,  7,  7,  7,  7,  0,  0,  9, 10,  8,  8,
+     8,  8,  8,  8,  8,  0,  0,  8,  8,  0,  0,  8,  8, 11, 13,  0,
+     0,  0,  0,  0,  0,  0,  0,  8,  0,  0,  0,  0,  7,  7,  0,  7,
+     6,  6,  8,  8,  0,  0,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     7,  7,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  4,  0,  3,  0,
+     0,  4,  4,  5,  0,  6,  6,  6,  6,  6,  6,  0,  0,  0,  0,  6,
+     6,  0,  0,  6,  6,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  0,  7,  7,  7,  7,  7,  7,
+     7,  0,  7,  7,  0,  7,  7,  0,  7,  7,  0,  0,  9,  0,  8,  8,
+     8,  8,  8,  0,  0,  0,  0,  8,  8,  0,  0,  8,  8, 11,  0,  0,
+     0, 12,  0,  0,  0,  0,  0,  0,  0,  7,  7,  7,  7,  0,  7,  0,
+     0,  0,  0,  0,  0,  0,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     4, 14,  1,  1,  0, 15,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  4,  4,  5,  0,  6,  6,  6,  6,  6,  6,  6,  6,  6,  0,  6,
+     6,  6,  0,  6,  6,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  0,  7,  7,  7,  7,  7,  7,
+     7,  0,  7,  7,  0,  7,  7,  7,  7,  7,  0,  0,  9, 10,  8,  8,
+     8,  8,  8,  8,  8,  8,  0,  8,  8,  8,  0,  8,  8, 11,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     6,  6,  8,  8,  0,  0,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  7, 12, 12, 12,  9,  9,  9,
+     0,  4,  4,  5,  0,  6,  6,  6,  6,  6,  6,  6,  6,  0,  0,  6,
+     6,  0,  0,  6,  6,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     8,  8,  8,  8,  8,  0,  0,  8,  8,  0,  0,  8,  8, 11,  0,  0,
+     0,  0,  0,  0,  0,  8,  8,  8,  0,  0,  0,  0,  7,  7,  0,  7,
+     6,  6,  8,  8,  0,  0,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     0,  7,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  4, 16,  0,  6,  6,  6,  6,  6,  6,  0,  0,  0,  6,  6,
+     6,  0,  6,  6,  6,  7,  0,  0,  0,  7,  7,  0,  7,  0,  7,  7,
+     0,  0,  0,  7,  7,  0,  0,  0,  7,  7,  7,  0,  0,  0,  7,  7,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  0,  0,  0,  0,  8,  8,
+     8,  8,  8,  0,  0,  0,  8,  8,  8,  0,  8,  8,  8, 11,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  8,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     4,  4,  4,  5,  4,  6,  6,  6,  6,  6,  6,  6,  6,  0,  6,  6,
+     6,  0,  6,  6,  6,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  0,  7,  7,  7,  7,  7,  7,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  0,  0,  0, 10,  8,  8,
+     8,  8,  8,  8,  8,  0,  8,  8,  8,  0,  8,  8,  8, 11,  0,  0,
+     0,  0,  0,  0,  0,  8,  8,  0,  7,  7,  7,  0,  0,  0,  0,  0,
+     6,  6,  8,  8,  0,  0,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     4,  4,  4,  5,  0,  6,  6,  6,  6,  6,  6,  6,  6,  0,  6,  6,
+     6,  0,  6,  6,  6,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  0,  7,  7,  7,  7,  7,  7,
+     7,  7,  7,  7,  0,  7,  7,  7,  7,  7,  0,  0,  9, 10,  8,  8,
+     8,  8,  8,  8,  8,  0,  8,  8,  8,  0,  8,  8,  8, 11,  0,  0,
+     0,  0,  0,  0,  0,  8,  8,  0,  0,  0,  0,  0,  0,  0,  7,  0,
+     6,  6,  8,  8,  0,  0,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     0, 17, 17,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7, 18, 18, 10,  8,  8,
+     8,  8,  8,  8,  8,  0,  8,  8,  8,  0,  8,  8,  8, 11, 19,  0,
+     0,  0,  0,  0, 13, 13, 13,  8,  0,  0,  0,  0,  0,  0,  0,  6,
+     6,  6,  8,  8,  0,  0,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 13, 13, 13, 13, 13, 13,
+     0,  4,  4,  5,  0,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,
+     6,  6,  6,  6,  6,  6,  6,  0,  0,  0,  7,  7,  7,  7,  7,  7,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     7,  7,  0,  7,  7,  7,  7,  7,  7,  7,  7,  7,  0,  7,  0,  0,
+     7,  7,  7,  7,  7,  7,  7,  0,  0,  0, 11,  0,  0,  0,  0,  8,
+     8,  8,  8,  8,  8,  0,  8,  0,  8,  8,  8,  8,  8,  8,  8,  8,
+     0,  0,  0,  0,  0,  0,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     0,  0,  8,  8,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  0,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8, 18,  0,  0,  0,  0,  0,
+     8,  8,  8,  8,  8,  8,  0,  8, 20, 20, 20, 20, 21,  4, 18,  0,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  0,  0,  0,  0,  0,  0,
+     0,  7,  7,  0,  7,  0,  7,  7,  7,  7,  7,  0,  7,  7,  7,  7,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     7,  7,  7,  7,  0,  7,  0,  7,  7,  7,  7,  7,  7,  7,  7,  0,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8, 18,  8, 15, 15,  0,  0,
+     8,  8,  8,  8,  8,  0,  0,  0, 20, 20, 20, 20,  0,  4,  0,  0,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  0,  0,  7,  7,  7,  7,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  0,  3,  0,  3,  0,  9,  0,  0,  0,  0,  0,  0,
+     7,  7,  7,  7,  7,  7,  7,  7,  0,  7,  7,  7,  7,  7,  7,  7,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  0,  0,  0,
+     0,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  4,  5,
+     8,  8,  4,  4, 18, 10,  0,  0, 22, 22, 22, 22, 22, 23, 23, 23,
+    23, 23, 23, 23, 23, 23, 23, 23,  0, 23, 23, 23, 23, 23, 23, 23,
+    23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
+    23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  3,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     7,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  4, 20,  5, 24, 18, 15, 15, 15, 15,  7,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  0,  1,  0,  0,  1,  0,
+     7,  7,  6,  6,  6,  6,  8,  8,  8,  8,  7,  7,  7,  7, 15, 15,
+    15,  7,  8, 20, 20,  7,  7,  8,  8, 20, 20, 20, 20, 20,  7,  7,
+     7,  8,  8,  8,  8,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     7,  7, 15,  8,  8,  8,  8, 20, 20, 20, 20, 20, 20, 20,  7, 20,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2, 20, 20,  8,  8,  0,  0,
+     6,  6,  6,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  0,  7,  7,
+     7,  7,  8,  8, 18,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     6,  6,  6,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     7,  7,  8,  8, 18,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     6,  6,  6,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     7,  7,  8,  8,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     6,  6,  6,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  0,  7,  7,
+     7,  0,  8,  8,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     7,  7,  7,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,
+     6,  6,  6,  6,  0,  0,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  4,  5,  8, 25, 25,  3, 26, 21,  3,  3,
+     3, 18, 24,  3,  0,  0,  0,  0,  0,  0,  0,  0, 10,  3,  0,  0,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     1,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  0,
+     8,  8,  8,  8,  8,  8,  8,  8,  8, 23, 23, 23,  0,  0,  0,  0,
+    27, 27,  4, 27, 27, 27, 27, 27, 27, 27,  8,  3,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     7,  7,  7, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,  0,  0,
+    29, 29, 29, 29, 29,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  0,  0,  0,  0,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8, 27, 27, 27, 27, 27, 27, 27, 20, 20,  0,  0,  0,  0,  0,  0,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  0,  0,  0,  0,  0,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     7,  7,  7,  7,  7,  7,  7,  8,  8,  8,  8,  8,  0,  0,  0,  0,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  6,  6,  6,
+     6,  6,  6,  7,  7, 15, 15, 23, 27, 27, 30, 23, 23, 23, 23,  0,
+    24,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  4, 20, 20, 20, 20, 20, 18,  3,  3,  0,  0,  3,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  0,  0,  0,  0,  0,  0,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  0,  0,  0,  0,  0,  0,
+     4,  4,  4, 26,  5,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,
+     6,  6,  6,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     7,  7,  7,  7,  9,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8, 11,  7,  7,  7,  7,  7,  7,  7,  0,  0,  0,  0,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  0,  0,  0,  0,  0,  0,
+     4, 26,  5,  6,  6,  6,  6,  6,  6,  6,  7,  7,  7,  7,  7,  7,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     7, 23, 23, 23,  8,  8,  8,  8,  8,  8, 18, 24, 23, 23,  7,  7,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2, 10,  7,  7,  7, 27, 27,
+     7,  7,  7,  7,  6,  6,  9,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+    27, 27, 18, 18,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     7,  7,  7,  7, 23, 23,  8,  8,  8,  8,  8,  8,  8, 27, 27, 27,
+    27, 27, 27, 27,  4,  4,  3,  9,  0,  0,  0,  0,  0,  0,  0,  0,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  0,  0,  0,  7,  7,  7,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    12, 12, 12,  0, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+    12, 12,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0, 13, 13, 12, 17, 17, 12, 12, 12,  1,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  3,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 31, 32,  0,  0,
+     1,  1,  1,  1,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  3,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  3,  3,  3,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    12,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     6,  6,  8,  6,  6,  6, 11,  7,  7,  7,  7,  4,  7,  7,  7,  7,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     7,  7,  7,  8,  8,  8,  8,  8,  0,  0,  0,  0, 18,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7, 28, 28,
+    28, 28,  7,  7,  7,  7, 28, 23, 23,  7,  7,  7,  7,  7,  7,  7,
+     7, 23,  7,  4,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     4,  5,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,
+     6,  6,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     7,  7,  7,  7, 15,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8, 11,  4,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  0,  0,  0,  0,  0,  0,
+    12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+    12, 12,  4,  4,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  6,  8,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  7,  7,  7,  7,  7,  7,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     7,  7, 28, 28, 28, 28, 28, 28, 28, 28, 28, 20, 20, 20,  0,  0,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     7,  7,  7,  7,  7,  7,  7,  8,  8,  8,  8,  8,  8,  8,  8, 27,
+    27, 27, 27, 18,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     4,  4, 26,  5,  6,  6,  6,  6,  6,  7,  7,  7,  6,  6,  6,  7,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     7,  7,  7,  9,  8,  8,  8,  8,  8,  8,  8,  8,  8, 15, 15, 15,
+    11,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  0,  0,  0,  0,  0,  0,
+     7,  7,  7,  7,  7,  8,  0,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  7,  7,  7,  7,  7,  0,
+     6,  6,  6,  6,  6,  6,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8, 15, 15, 15, 15,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,  0,  0,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  0,  0,  0,  0,  0,  0,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     0,  7,  7,  7,  1,  1,  1,  0,  0,  0,  7, 20, 20, 20,  7,  7,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8, 20,
+    29, 20, 29,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     6,  6,  7,  7,  7,  7,  7,  7,  7,  7,  7,  8,  8,  8,  8,  8,
+     0,  0,  0,  0,  0,  5, 24,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  6,  6,
+     7,  6,  7,  7,  7,  7,  7,  7,  7,  7,  7, 27, 27, 27, 27, 27,
+    27, 27, 27,  8,  8,  8,  8,  8,  8,  8,  8,  0, 20, 18,  0,  0,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  0,  0,  0,  0,  0,  0,
+     7,  8,  8,  8,  0,  8,  8,  0,  0,  0,  0,  0,  8,  8,  4,  5,
+     7,  7,  7,  7,  0,  7,  7,  7,  0,  7,  7,  7,  7,  7,  7,  7,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     7,  7,  7,  7,  7,  7,  0,  0,  9,  9,  9,  0,  0,  0,  0, 24,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     4,  4,  5, 17, 17,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,
+     6,  6,  6,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     7,  7,  7,  7,  7,  7,  7,  7,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8, 11,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33,
+    33, 33, 33, 33, 33, 33,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 34,
+     4,  4,  5,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  7,  7,  7,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     8,  8,  8,  8,  8,  8,  8,  8,  8, 11,  9,  0,  0,  0,  0,  0,
+     4,  4,  5,  6,  6,  6,  6,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     7,  7,  7,  7,  7,  7,  7,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8, 24, 18,  0,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     0,  0,  0,  0,  7,  8,  8,  7,  0,  0,  0,  0,  0,  0,  0,  0,
+    28, 28, 28, 28, 28,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     7,  7,  7,  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     4,  4,  5,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,
+     6,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     7,  7,  7,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+    11, 10, 35, 35,  0,  0,  0,  0,  0,  3,  9,  8,  8,  0,  8,  4,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  0,  0,  0,  0,  0,  0,
+     0,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     6,  6,  6,  6,  6,  6,  6,  6,  7,  7,  7,  7,  7,  7,  7,  7,
+     7,  7,  0,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  8,  8,  8,  8,
+     8,  8,  8,  8,  4, 11,  9, 14,  0,  0,  0,  0,  0,  0, 12,  0,
+     6,  6,  6,  6,  7,  7,  7,  0,  7,  0,  7,  7,  7,  7,  0,  7,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  0,  7,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  0,  0,  0,  0,  0,  0,  0,
+     6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  7,  7,  7,  7,  7,  7,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  4,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  9, 18,  0,  0,  0,  0,  0,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  0,  0,  0,  0,  0,  0,
+     4,  4,  4,  5,  0,  6,  6,  6,  6,  6,  6,  6,  6,  0,  0,  6,
+     6,  0,  0,  6,  6,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  0,  7,  7,  7,  7,  7,  7,
+     7,  0,  7,  7,  0,  7,  7,  7,  7,  7,  0,  9,  9, 10,  8,  8,
+     8,  8,  8,  8,  8,  0,  0,  8,  8,  0,  0,  8,  8, 11,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  8,  0,  0,  0,  0,  0,  0,  4,  4,
+     6,  6,  8,  8,  0,  0, 12, 12, 12, 12, 12, 12, 12,  0,  0,  0,
+    12, 12, 12, 12, 12,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  7,  7,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     7,  7,  7,  7,  7,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8, 11,  4,  4,  5,  9, 10,  0,  0,  0,  0,  0,  0,  0,  0,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  0,  0,  0,  0,  3,  4,
+    17, 17,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  7,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  4,
+     4,  5, 11,  9, 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  0,  0,  0,  0,  0,  0,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  8,
+     8,  8,  8,  8,  8,  8,  0,  0,  8,  8,  8,  8,  4,  4,  5, 11,
+     9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  6,  6,  6,  6,  8,  8,  0,  0,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  4,  5, 11,
+     8,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  0,  0,  0,  0,  0,  0,
+     6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  7,  7,  7,  7,  7,  7,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  4,  5,  8,  8,  8,
+     8,  8,  8,  8,  8,  8, 11,  9,  7,  0,  0,  0,  0,  0,  0,  0,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  0,  0, 15, 15, 15,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8, 18,  0,  0,  0,  0,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  0,  0,  0,  0,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  4,  5, 11,  9,  0,  0,  0,  0,  0,
+     6,  6,  6,  6,  6,  6,  6,  0,  0,  6,  0,  0,  7,  7,  7,  7,
+     7,  7,  7,  7,  0,  7,  7,  0,  7,  7,  7,  7,  7,  7,  7,  7,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     8,  8,  8,  8,  8,  8,  0,  8,  8,  0,  0,  4,  4, 18, 24, 35,
+    15, 19, 15,  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  0,  0,  0,  0,  0,  0,
+     6,  6,  6,  6,  6,  6,  6,  6,  0,  0,  6,  6,  6,  6,  7,  7,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     7,  8,  8,  8,  8,  8,  8,  8,  0,  0,  8,  8,  8,  8,  4,  5,
+    11, 10,  0,  0,  8,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     6,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  7,  7,  7,  7,  7,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     7,  7,  7,  3, 18,  4,  4,  4,  4,  5, 35, 15, 15, 15, 15,  1,
+     0,  0,  0,  0,  0,  1,  0, 24,  0,  0,  0,  0,  0,  0,  0,  0,
+     6,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  7,  7,  7,  7,
+     7,  7,  7,  7, 35, 35, 35, 35, 35, 35, 27, 27, 27, 27, 27, 27,
+    27, 27, 27, 27, 27, 27,  4,  5, 14, 24,  0,  0,  0, 10,  0,  0,
+     6,  6,  6,  6,  6,  6,  6,  6,  6,  0,  6,  6,  6,  6,  7,  7,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  8,
+     8,  8,  8,  8,  8,  8,  8,  0,  8,  8,  8,  8,  4,  4,  5, 11,
+    10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  0,  0,  0,
+     0,  0,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     0,  0, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
+    23, 23, 23, 23, 23, 23, 23, 23,  0, 23, 23, 23, 23, 23, 23, 23,
+     8,  8,  8,  8,  8,  4,  4,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     6,  6,  6,  6,  6,  6,  6,  0,  6,  6,  0,  6,  7,  7,  7,  7,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     7,  8,  8,  8,  8,  8,  8,  0,  0,  0,  8,  0,  8,  8,  0,  8,
+     4,  5,  9,  8, 18, 24, 19, 15,  0,  0,  0,  0,  0,  0,  0,  0,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  0,  0,  0,  0,  0,  0,
+     6,  6,  6,  6,  6,  6,  0,  6,  6,  0,  6,  6,  7,  7,  7,  7,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  8,  8,  8,  8,  8,  0,
+     8,  8,  0,  8,  8,  4,  5, 24,  0,  0,  0,  0,  0,  0,  0,  0,
+     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+     7,  7,  1,  8,  8,  8,  8,  0,  0,  0,  0,  0,  0,  0,  0,  0
 };
 
-static RE_UINT8 re_changes_when_uppercased_stage_2[] = {
-     0,  1,  2,  3,  3,  3,  3,  3,  4,  5,  3,  3,  3,  3,  6,  7,
-     8,  3,  9,  3,  3,  3, 10,  3,  3,  3,  3,  3,  3,  3,  3,  3,
-     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
-     3,  3,  3, 11,  3, 12,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
-     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3, 13,  3, 14,
-     3,  3, 15,  3,  3,  3, 16,  3,  3,  3,  3,  3, 17,  3,  3,  3,
-     3,  3,  3,  3,  3,  3,  3, 18,  3,  3,  3,  3,  3,  3,  3,  3,
-     3,  3,  3,  3, 19,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
-};
+RE_UINT32 re_get_indic_syllabic_category(RE_UINT32 codepoint) {
+    RE_UINT32 field_2;
+    RE_UINT32 field_1;
+    RE_UINT32 field_0;
+    RE_UINT32 v;
 
-static RE_UINT8 re_changes_when_uppercased_stage_3[] = {
-     0,  0,  0,  1,  0,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12,
-     5, 13, 14, 15, 16,  0,  0,  0,  0,  0, 17, 18, 19, 20, 21, 22,
-     0, 23, 24,  5, 25,  5, 26,  5,  5, 27,  0, 28, 29,  0,  0,  0,
-     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0, 23, 30,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 31,
-     0,  0,  0,  0, 32,  0,  0,  0,  0,  0,  0, 33, 34,  0,  0,  0,
-     5,  5,  5,  5, 35,  5,  5,  5, 36, 37, 38, 39, 24, 40, 41, 42,
-     0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 34, 23, 43,  0,  0,  0,
-     0,  0,  0,  0,  0,  0, 23, 44,  0,  0,  0,  0,  0,  0,  0,  0,
-     0, 23, 45, 46,  5,  5,  5, 47, 24, 48,  0,  0,  0,  0,  0,  0,
-     0,  0,  5, 49, 50,  0,  0,  0,  0, 51,  5, 52, 53, 54, 55,  0,
-     0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 56, 23, 24, 24,  0,  0,
-     0,  0,  0,  0,  0,  0,  0,  0, 57,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  0,  0,  0,  0,  0,
-     0, 58, 59,  0,  0,  0, 60, 61,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0, 24, 62,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0, 24,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0, 24,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0,  0,  0,  0, 63, 64,  0,  0,  0,  0,  0,
-};
+    field_2 = codepoint >> 10;
+    field_1 = (codepoint >> 5) & 0x1F;
+    field_0 = codepoint & 0x1F;
 
-static RE_UINT8 re_changes_when_uppercased_stage_4[] = {
-      0,   0,   0,   0, 254, 255, 255,   7,   0,   0,  32,   0,   0,   0,   0, 128,
-    255, 255, 127, 255, 170, 170, 170, 170, 170, 170, 170,  84,  85, 171, 170, 170,
-    170, 170, 170, 212,  41,  17,  36,  70,  42,  33,  81, 162,  96,  91,  85, 181,
-    170, 170,  45, 170, 168, 170,  10, 144, 133, 170, 223,  26, 107, 159,  38,  32,
-    141,  31,   4,  96,  32,   0,   0,   0,   0,   0, 138,  56,   0,   0,   1,   0,
-      0, 240, 255, 255, 255, 127, 227, 170, 170, 170,  47,   9,   0,   0, 255, 255,
-    255, 255, 255, 255,   2, 168, 170, 170,  84, 213, 170, 170, 170, 170,   0,   0,
-    254, 255, 255, 255, 255,   0,   0,   0, 255, 255, 255, 231,   0,   0,   0,  63,
-    255,   1,   0,   0,   0,   0,   0,  34,   0,  64,   0,   0, 170, 170, 234,  15,
-    255,   0,  63,   0, 255,   0, 255,   0,  63,   0, 255,   0, 255,   0, 255,  63,
-    255, 255, 223,  80, 220,  16, 207,   0, 255,   0, 220,  16,  16,   0,   0,   0,
-    255,   3,   0,   0, 255, 255, 255, 127,  98,  21,  72,   0,  10,  80,   8,   0,
-    191,  32,   0,   0, 170,  42,   0,   0, 170, 170, 170,  10, 168, 170, 168, 170,
-    170, 170,   0, 148, 170,  16, 154, 170, 170,   2, 160, 170,   8,   0,   0,   0,
-      0,   0,   8,   0, 127,   0, 248,   0,   0, 255, 255, 255, 255, 255,   0,   0,
-      0,   0,   0, 255, 255, 255, 255,  15, 255, 255,   7,   0, 252, 255, 255, 255,
-     15,   0,   0,   0,
-};
+    v = re_indic_syllabic_category_table_1[field_2];
+    v = re_indic_syllabic_category_table_2[(v << 5) | field_1];
+    v = re_indic_syllabic_category_table_3[(v << 5) | field_0];
 
-/* Changes_When_Uppercased: 844 bytes. */
-
-RE_UINT32 re_get_changes_when_uppercased(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-
-    f = ch >> 13;
-    code = ch ^ (f << 13);
-    pos = (RE_UINT32)re_changes_when_uppercased_stage_1[f] << 4;
-    f = code >> 9;
-    code ^= f << 9;
-    pos = (RE_UINT32)re_changes_when_uppercased_stage_2[pos + f] << 4;
-    f = code >> 5;
-    code ^= f << 5;
-    pos = (RE_UINT32)re_changes_when_uppercased_stage_3[pos + f] << 5;
-    pos += code;
-    value = (re_changes_when_uppercased_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1;
-
-    return value;
+    return v;
 }
 
-/* Changes_When_Titlecased. */
-
-static RE_UINT8 re_changes_when_titlecased_stage_1[] = {
-    0, 1, 2, 2, 2, 3, 2, 4, 5, 2, 2, 6, 2, 2, 2, 7,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2,
-};
+/* Join_Control. */
+RE_UINT32 re_get_join_control(RE_UINT32 codepoint) {
+    if (0x200C <= codepoint && codepoint <= 0x200D)
+        return 1;
 
-static RE_UINT8 re_changes_when_titlecased_stage_2[] = {
-     0,  1,  2,  3,  3,  3,  3,  3,  3,  4,  3,  3,  3,  3,  5,  6,
-     7,  3,  8,  3,  3,  3,  9,  3,  3,  3,  3,  3,  3,  3,  3,  3,
-     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
-     3,  3,  3, 10,  3, 11,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
-     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3, 12,  3, 13,
-     3,  3, 14,  3,  3,  3, 15,  3,  3,  3,  3,  3, 16,  3,  3,  3,
-     3,  3,  3,  3,  3,  3,  3, 17,  3,  3,  3,  3,  3,  3,  3,  3,
-     3,  3,  3,  3, 18,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
-};
+    return 0;
+}
 
-static RE_UINT8 re_changes_when_titlecased_stage_3[] = {
-     0,  0,  0,  1,  0,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12,
-     5, 13, 14, 15, 16,  0,  0,  0,  0,  0, 17, 18, 19, 20, 21, 22,
-     0, 23, 24,  5, 25,  5, 26,  5,  5, 27,  0, 28, 29,  0,  0,  0,
+/* Joining_Group. */
+static RE_UINT8 re_joining_group_table_1[] = {
+    0, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 3, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+};
+
+static RE_UINT8 re_joining_group_table_2[] = {
      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 30,
-     0,  0,  0,  0, 31,  0,  0,  0,  0,  0,  0, 32, 33,  0,  0,  0,
-     5,  5,  5,  5, 34,  5,  5,  5, 35, 36, 37, 38, 36, 39, 40, 41,
-     0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 33, 23, 42,  0,  0,  0,
-     0,  0,  0,  0,  0,  0, 23, 43,  0,  0,  0,  0,  0,  0,  0,  0,
-     0, 23, 44, 45,  5,  5,  5, 46, 24, 47,  0,  0,  0,  0,  0,  0,
-     0,  0,  5, 48, 49,  0,  0,  0,  0, 50,  5, 51, 52, 53, 54,  0,
-     0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 55, 23, 24, 24,  0,  0,
-     0,  0,  0,  0,  0,  0,  0,  0, 56,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  0,  0,  0,  0,  0,
-     0, 57, 58,  0,  0,  0, 59, 60,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0, 24, 61,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0, 24,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0, 24,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0,  0,  0,  0, 62, 63,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11,  0,  0,  0,  0,
+     0,  0,  0, 12,  0, 13, 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0, 15, 16,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0, 17, 18,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0
 };
 
-static RE_UINT8 re_changes_when_titlecased_stage_4[] = {
-      0,   0,   0,   0, 254, 255, 255,   7,   0,   0,  32,   0,   0,   0,   0, 128,
-    255, 255, 127, 255, 170, 170, 170, 170, 170, 170, 170,  84,  85, 171, 170, 170,
-    170, 170, 170, 212,  41,  17,  36,  70,  42,  33,  81, 162, 208,  86,  85, 181,
-    170, 170,  43, 170, 168, 170,  10, 144, 133, 170, 223,  26, 107, 159,  38,  32,
-    141,  31,   4,  96,  32,   0,   0,   0,   0,   0, 138,  56,   0,   0,   1,   0,
-      0, 240, 255, 255, 255, 127, 227, 170, 170, 170,  47,   9,   0,   0, 255, 255,
-    255, 255, 255, 255,   2, 168, 170, 170,  84, 213, 170, 170, 170, 170,   0,   0,
-    254, 255, 255, 255, 255,   0,   0,   0,   0,   0,   0,  63, 255,   1,   0,   0,
-      0,   0,   0,  34,   0,  64,   0,   0, 170, 170, 234,  15, 255,   0,  63,   0,
-    255,   0, 255,   0,  63,   0, 255,   0, 255,   0, 255,  63, 255,   0, 223,  64,
-    220,   0, 207,   0, 255,   0, 220,   0,  16,   0,   0,   0, 255,   3,   0,   0,
-    255, 255, 255, 127,  98,  21,  72,   0,  10,  80,   8,   0, 191,  32,   0,   0,
-    170,  42,   0,   0, 170, 170, 170,  10, 168, 170, 168, 170, 170, 170,   0, 148,
-    170,  16, 154, 170, 170,   2, 160, 170,   8,   0,   0,   0,   0,   0,   8,   0,
-    127,   0, 248,   0,   0, 255, 255, 255, 255, 255,   0,   0,   0,   0,   0, 255,
-    255, 255, 255,  15, 255, 255,   7,   0, 252, 255, 255, 255,  15,   0,   0,   0,
+static RE_UINT8 re_joining_group_table_3[] = {
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      1,   0,   2,   2,   3,   2,   1,   2,   4,   5,   4,   4,   6,   6,   6,   7,
+      7,   8,   8,   9,   9,  10,  10,  11,  11,  12,  12,  13,  13,  14,  14,  14,
+      0,  15,  16,  17,  18,  19,  20,  21,   3,   1,   1,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   4,  16,
+      0,   2,   2,   2,   0,   2,   3,   3,   1,   4,   4,   4,   4,   4,   4,   4,
+      4,   6,   6,   6,   6,   6,   6,   6,   7,   7,   7,   7,   7,   7,   7,   7,
+      7,   8,   8,   8,   8,   8,   8,   8,   8,   8,   9,   9,   9,  10,  10,  11,
+     12,  15,  15,  15,  15,  15,  15,  16,  16,  13,  22,  13,  17,  17,  17,  13,
+     13,  13,  13,  13,  13,  18,  18,  18,  18,  20,  20,  20,  20,  23,  24,   6,
+      5,  25,  25,  26,   3,   3,   3,   3,   3,   3,   3,   3,  14,  27,  14,   3,
+      1,   1,  28,  28,   0,   5,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   7,   8,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   9,  10,  12,   0,   0,  24,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     29,   0,  30,  31,  31,  32,  32,  33,  34,  35,  36,  37,  37,  38,  39,  40,
+     41,  42,  43,  44,  45,  46,  47,  48,  49,  50,  32,  51,  52,  30,  31,  32,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  53,  54,  55,
+      4,   4,   4,   4,   4,   4,   4,   6,   6,   7,   7,   8,   9,  12,  12,  12,
+     15,  15,  13,  13,  13,  19,  19,  20,  20,  20,  18,   8,   8,   9,   6,   6,
+      9,   8,   6,   2,   2,  14,  14,   1,   3,   3,  56,  56,   6,   9,   9,  17,
+     57,  58,  59,  60,  61,  62,  63,  64,  65,  66,  67,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      4,   4,   6,  11,  15,  16,  18,  19,   1,   1,   8,   3,  68,   0,   7,  10,
+     13,  69,   8,  12,  17,   0,   4,   4,   4,   8,   1,  70,  71,  72,   4,   4,
+      4,   6,  13,  12,  71,   6,   6,  18,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     73,  74,  74,  75,  75,  76,   0,  77,   0,  78,  78,   0,   0,  79,  80,  81,
+     82,  82,  82,  83,  84,  85,  86,  87,  88,  89,  89,  90,  90,  91,  92,  92,
+     92,  93,   0,   0,  94,   0,   0,   0,   0,   0,   0,  95,  96,  97,  98,  99,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0, 100,   0,   0,   0,   0,   0,   0, 100,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0, 101,   0,   0, 100,   0, 101,   0,
+    101,   0,   0, 101,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0
 };
 
-/* Changes_When_Titlecased: 824 bytes. */
-
-RE_UINT32 re_get_changes_when_titlecased(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-
-    f = ch >> 13;
-    code = ch ^ (f << 13);
-    pos = (RE_UINT32)re_changes_when_titlecased_stage_1[f] << 4;
-    f = code >> 9;
-    code ^= f << 9;
-    pos = (RE_UINT32)re_changes_when_titlecased_stage_2[pos + f] << 4;
-    f = code >> 5;
-    code ^= f << 5;
-    pos = (RE_UINT32)re_changes_when_titlecased_stage_3[pos + f] << 5;
-    pos += code;
-    value = (re_changes_when_titlecased_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1;
-
-    return value;
-}
+RE_UINT32 re_get_joining_group(RE_UINT32 codepoint) {
+    RE_UINT32 field_2;
+    RE_UINT32 field_1;
+    RE_UINT32 field_0;
+    RE_UINT32 v;
 
-/* Changes_When_Casefolded. */
+    field_2 = codepoint >> 10;
+    field_1 = (codepoint >> 5) & 0x1F;
+    field_0 = codepoint & 0x1F;
 
-static RE_UINT8 re_changes_when_casefolded_stage_1[] = {
-    0, 1, 2, 2, 2, 3, 2, 4, 5, 2, 2, 6, 2, 2, 2, 7,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2,
-};
+    v = re_joining_group_table_1[field_2];
+    v = re_joining_group_table_2[(v << 5) | field_1];
+    v = re_joining_group_table_3[(v << 5) | field_0];
 
-static RE_UINT8 re_changes_when_casefolded_stage_2[] = {
-     0,  1,  2,  3,  3,  3,  3,  3,  4,  5,  3,  3,  3,  3,  6,  7,
-     8,  3,  9,  3,  3,  3, 10,  3,  3,  3,  3,  3,  3,  3,  3,  3,
-     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
-     3,  3,  3, 11,  3, 12,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
-     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3, 13,  3, 14,
-     3,  3, 15,  3,  3,  3, 16,  3,  3,  3,  3,  3, 17,  3,  3,  3,
-     3,  3,  3,  3,  3,  3,  3, 18,  3,  3,  3,  3,  3,  3,  3,  3,
-     3,  3,  3,  3, 19,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
-};
+    return v;
+}
 
-static RE_UINT8 re_changes_when_casefolded_stage_3[] = {
-     0,  0,  1,  0,  0,  2,  3,  0,  4,  5,  6,  7,  8,  9, 10, 11,
-     4, 12, 13,  0,  0,  0,  0,  0,  0,  0, 14, 15, 16, 17, 18, 19,
-    20, 21,  0,  4, 22,  4, 23,  4,  4, 24, 25,  0, 26,  0,  0,  0,
-     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0, 20, 27,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 28,
-     0,  0,  0,  0, 29, 30,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     4,  4,  4,  4, 31,  4,  4,  4, 32, 33, 34, 35, 20, 36, 37, 38,
-     0,  0,  0,  0,  0,  0,  0,  0,  0, 39,  0, 21, 40,  0,  0,  0,
-     0,  0,  0,  0,  0, 41, 21,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    20, 42,  0, 43,  4,  4,  4, 44,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  4, 45, 46,  0,  0,  0,  0, 47,  4, 48, 49, 50, 51,  0,
-     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 52, 20, 20,  0,  0,
-     0,  0,  0,  0,  0,  0,  0,  0, 53,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  0,  0,  0,  0,  0,  0,
-    20, 54,  0,  0,  0, 52, 55,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0, 20, 56,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0, 20,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0, 20,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0,  0,  0, 20, 57,  0,  0,  0,  0,  0,  0,
+/* Joining_Type. */
+static RE_UINT8 re_joining_type_table_1[] = {
+     0,  1,  2,  3,  4,  5,  6,  7,  8,  9,  9, 10, 11,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9, 12, 13,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9, 14, 15,
+    16,  9, 17, 18, 19, 20, 21, 22,  9,  9,  9,  9,  9, 23,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9, 24, 25,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9, 26,
+     9,  9,  9,  9, 27,  9, 28,  9, 29,  9, 30,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+    31,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9
 };
 
-static RE_UINT8 re_changes_when_casefolded_stage_4[] = {
-      0,   0,   0,   0, 254, 255, 255,   7,   0,   0,  32,   0, 255, 255, 127, 255,
-     85,  85,  85,  85,  85,  85,  85, 170, 170,  86,  85,  85,  85,  85,  85, 171,
-    214, 206, 219, 177, 213, 210, 174,  17, 176, 173, 170,  74,  85,  85, 214,  85,
-     85,  85,   5, 108, 122,  85,   0,   0,  32,   0,   0,   0,   0,   0,  69, 128,
-     64, 215, 254, 255, 251,  15,   0,   0,   4, 128,  99,  85,  85,  85, 179, 230,
-    255, 255, 255, 255, 255, 255,   0,   0,   1,  84,  85,  85, 171,  42,  85,  85,
-     85,  85, 254, 255, 255, 255, 127,   0, 128,   0,   0,   0, 191,  32,   0,   0,
-      0,   0,   0,  63, 255,   1, 255, 255, 255, 255, 255, 231,  85,  85,  21,  76,
-      0, 255,   0,  63,   0, 255,   0, 255,   0,  63,   0, 170,   0, 255,   0,   0,
-    255, 255, 156,  31, 156,  31,   0,  15,   0,  31, 156,  31,  64,  12,   4,   0,
-      8,   0,   0,   0,   0,   0, 192, 255, 255, 127,   0,   0, 157, 234,  37, 192,
-      5,  40,   4,   0,  85,  21,   0,   0,  85,  85,  85,   5,  84,  85,  84,  85,
-     85,  85,   0, 106,  85,  40,  69,  85,  85, 125,  95,  85, 116,   0,   0,   0,
-      0,   0, 255, 255, 127,   0, 248,   0, 255,   0,   0,   0, 255, 255,  15,   0,
-    255, 255,   7,   0,   3,   0,   0,   0,
+static RE_UINT8 re_joining_type_table_2[] = {
+      0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   2,   2,   2,   3,   0,   0,   0,   0,
+      0,   0,   0,   0,   4,   0,   0,   0,   0,   0,   0,   0,   5,   6,   7,   0,
+      8,   9,  10,  11,  12,  13,  14,  15,  16,  17,  18,  19,   0,  20,  21,  22,
+     23,  24,  25,  26,   0,  27,  28,  29,  30,  31,  32,  33,  34,  35,  36,  37,
+     38,  35,  39,  40,  38,  35,  41,  42,  34,  43,  44,  33,  45,   0,  46,   0,
+     47,  48,  49,  33,  34,  43,  50,  33,  51,  52,  36,  33,  34,   0,  53,   0,
+      0,  54,  55,   0,   0,  56,  57,   0,  58,  59,   0,  60,  61,  62,  63,   0,
+      0,  64,  65,  66,  67,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  68,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,  69,  69,  70,  70,   0,  71,  72,   0,
+     73,  13,  13,  74,  75,  76,   0,   0,   0,  77,   0,   0,   0,   0,   0,   0,
+     78,   0,  79,  80,   0,  81,  82,   0,  83,  84,  45,  85,  51,  86,   0,  87,
+      0,  88,   0,   0,   0,   0,  89,  90,   0,   0,   0,   0,   0,   0,   2,  91,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     92,  93,   0,  94,   0,   0,  81,  95,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,  96,   0,   0,   0,  97,   0,   0,   0,   2,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,  98,   0,   0,  99,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0, 100,  48,   0,   0, 101,   0,   0,   0,   0,   0,   0,   0,   0,
+    102, 103,  13, 104,   0,   0, 105, 106,   0, 107, 108,   0,  30, 109,   0, 110,
+      0, 111, 112,  35,   0, 113,  34, 114,   0,   0,   0,   0,   0,   0,   0, 115,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0, 116,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      3,   3,   0,   0,   0,   0,   0,  97,   0,   0,   0,   0,   0,   0,   0, 117,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 118,
+      0,   0,   0,   0,   0,   0,   0,  82,   0,   0,   0, 119,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    120, 121,   0,   0,   0,   0, 122, 123,   0,   0,   0,   0, 124, 125,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0, 126, 127,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0, 128,   0,   0,   0, 129, 130,   0,   0, 131, 132,   0,
+     34, 133, 134,  97,  51, 135,   0,   0,  30, 136,   0, 137,  51, 138, 139,   0,
+      0, 140,   0,   0,   0,   0,  97, 141,  51,  52,  82, 142,   0,   0,   0,   0,
+      0, 133, 143,   0,   0, 144, 145,   0,   0,   0,   0,   0,   0, 146, 147,   0,
+      0, 148,  82,   0,   0, 149,   0,   0,  68, 150,   0,   0,   0,   0,   0,   0,
+      0, 151,   0,   0,   0,   0,   0,   0,   0, 152, 153,   0,   0,   0, 154,  82,
+    155, 156, 157,   0, 158,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0, 159,   0,   0, 160, 161,   0,   0,   0, 162, 163,   0, 164,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0, 165,   0,   0,   0,   0,   0,   0,   0,   0,
+      0, 166,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0, 167,   0, 168,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 169,   0, 170,   0,   0, 171,
+      0,   0,   0,   0, 172,  83,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 173, 174,  98,   0,   0,
+      0,   0, 175,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      2, 176,   2, 177, 178, 179,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    180, 181,   0,   0,   0,   0,   0,   0,   0, 168,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0, 182,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0, 168,   0,  13,  13, 183,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     34,   2,   2,   2,   0,   0,   0,   0,   2,   2,   2,   2,   2,   2,   2,   3,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0
 };
 
-/* Changes_When_Casefolded: 816 bytes. */
-
-RE_UINT32 re_get_changes_when_casefolded(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-
-    f = ch >> 13;
-    code = ch ^ (f << 13);
-    pos = (RE_UINT32)re_changes_when_casefolded_stage_1[f] << 4;
-    f = code >> 9;
-    code ^= f << 9;
-    pos = (RE_UINT32)re_changes_when_casefolded_stage_2[pos + f] << 4;
-    f = code >> 5;
-    code ^= f << 5;
-    pos = (RE_UINT32)re_changes_when_casefolded_stage_3[pos + f] << 5;
-    pos += code;
-    value = (re_changes_when_casefolded_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1;
-
-    return value;
-}
-
-/* Changes_When_Casemapped. */
-
-static RE_UINT8 re_changes_when_casemapped_stage_1[] = {
-    0, 1, 2, 2, 2, 3, 2, 4, 5, 2, 2, 6, 2, 2, 2, 7,
+static RE_UINT8 re_joining_type_table_3[] = {
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1,
+    0, 1, 1, 0, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0,
+    2, 0, 3, 3, 3, 3, 2, 3, 2, 3, 2, 2, 2, 2, 2, 3,
+    3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    4, 2, 2, 2, 2, 2, 2, 2, 3, 2, 2, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2,
+    1, 3, 3, 3, 0, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3,
+    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2,
     2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
     2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    3, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 3, 2, 3,
+    2, 2, 3, 3, 0, 3, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1,
+    1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 1, 3, 3,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 0, 0, 2,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
+    3, 1, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 2, 2, 3, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 3, 2, 3, 2, 3, 2, 2, 3,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 3, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 2, 2, 2,
+    2, 3, 2, 3, 3, 2, 2, 2, 3, 3, 2, 2, 2, 2, 2, 2,
+    0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2,
     2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 4, 0, 0, 1, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    3, 2, 2, 2, 2, 2, 3, 3, 2, 3, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 3, 2, 3, 3, 3, 1, 1, 1, 0, 0, 0, 0,
+    2, 0, 2, 2, 2, 2, 0, 3, 2, 3, 3, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 0, 3, 2,
+    2, 3, 3, 2, 2, 0, 2, 2, 2, 3, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0,
+    0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0,
+    0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,
+    0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0,
+    0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0,
+    0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
+    0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0,
+    0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1,
+    1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0,
+    0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0,
+    0, 0, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0,
+    1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1,
+    1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 1, 1, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1,
+    1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0,
+    0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 4, 1, 1, 1, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
     2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2,
     2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0,
+    1, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0,
+    0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 1, 0, 1,
+    1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1,
+    1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0,
+    0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 4, 1, 1,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
+    1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
+    1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
     2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
+    0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0,
+    0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0,
+    0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    1, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0,
+    0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0,
+    0, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1,
+    2, 2, 2, 2, 2, 3, 0, 3, 0, 3, 3, 0, 0, 5, 3, 3,
+    3, 3, 3, 2, 2, 2, 2, 5, 2, 2, 2, 2, 2, 3, 2, 2,
+    2, 3, 0, 0, 3, 1, 1, 0, 0, 0, 0, 2, 2, 2, 2, 3,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    2, 3, 2, 3, 3, 3, 2, 2, 2, 3, 2, 2, 3, 2, 3, 3,
+    2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 2, 2, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    5, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
     2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 3, 2, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    2, 2, 2, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 2, 2, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    2, 0, 2, 2, 3, 3, 3, 0, 2, 3, 3, 2, 2, 3, 2, 2,
+    0, 2, 3, 3, 2, 0, 0, 0, 0, 3, 2, 5, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1,
+    1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
+    1, 1, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0,
+    0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0,
+    1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 1,
+    1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1,
+    1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 1,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0,
+    1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0,
+    0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0,
+    0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0,
+    0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1,
+    1, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 1, 1, 0, 1,
+    1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    1, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
+    1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0,
+    0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0,
+    0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1,
+    0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1,
+    1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
 };
 
-static RE_UINT8 re_changes_when_casemapped_stage_2[] = {
-     0,  1,  2,  3,  3,  3,  3,  3,  4,  5,  3,  3,  3,  3,  6,  7,
-     8,  3,  9,  3,  3,  3, 10,  3,  3,  3,  3,  3,  3,  3,  3,  3,
-     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
-     3,  3,  3, 11,  3, 12,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
-     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3, 13,  3, 14,
-     3,  3, 15,  3,  3,  3, 16,  3,  3,  3,  3,  3, 17,  3,  3,  3,
-     3,  3,  3,  3,  3,  3,  3, 18,  3,  3,  3,  3,  3,  3,  3,  3,
-     3,  3,  3,  3, 19,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
-};
+RE_UINT32 re_get_joining_type(RE_UINT32 codepoint) {
+    RE_UINT32 field_2;
+    RE_UINT32 field_1;
+    RE_UINT32 field_0;
+    RE_UINT32 v;
 
-static RE_UINT8 re_changes_when_casemapped_stage_3[] = {
-     0,  0,  1,  1,  0,  2,  3,  3,  4,  5,  4,  4,  6,  7,  8,  4,
-     4,  9, 10, 11, 12,  0,  0,  0,  0,  0, 13, 14, 15, 16, 17, 18,
-     4,  4,  4,  4, 19,  4,  4,  4,  4, 20, 21, 22, 23,  0,  0,  0,
-     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  4, 24, 25,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  4,  4, 26,
-     0,  0,  0,  0, 27, 25,  0,  0,  0,  0,  0, 28, 29,  0,  0,  0,
-     4,  4,  4,  4, 30,  4,  4,  4, 26,  4, 31, 32,  4, 33, 34, 35,
-     0,  0,  0,  0,  0,  0,  0,  0,  0, 36, 29,  4, 37,  0,  0,  0,
-     0,  0,  0,  0,  0, 38,  4, 39,  0,  0,  0,  0,  0,  0,  0,  0,
-     4, 40, 41, 42,  4,  4,  4, 43,  4, 44,  0,  0,  0,  0,  0,  0,
-     0,  0,  4, 45, 46,  0,  0,  0,  0, 47,  4, 48, 49, 40, 50,  0,
-     0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 51, 52,  4,  4,  0,  0,
-     0,  0,  0,  0,  0,  0,  0,  0, 53,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  1,  0,  0,  0,  0,  0,
-     4,  4, 54,  0,  0, 52, 55, 46,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  4, 56,  4, 56,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  4,  4,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  4,  4,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0,  0,  0,  4,  4, 57,  0,  0,  0,  0,  0,
-};
+    field_2 = codepoint >> 10;
+    field_1 = (codepoint >> 5) & 0x1F;
+    field_0 = codepoint & 0x1F;
 
-static RE_UINT8 re_changes_when_casemapped_stage_4[] = {
-      0,   0,   0,   0, 254, 255, 255,   7,   0,   0,  32,   0, 255, 255, 127, 255,
-    255, 255, 255, 255, 255, 255, 255, 254, 255, 223, 255, 247, 255, 243, 255, 179,
-    240, 255, 255, 255, 253, 255,  15, 252, 255, 255, 223,  26, 107, 159,  38,  32,
-    141,  31,   4,  96,  32,   0,   0,   0,   0,   0, 207, 184,  64, 215, 255, 255,
-    251, 255, 255, 255, 255, 255, 227, 255, 255, 255, 191, 239,   3, 252, 255, 255,
-    255, 255, 254, 255, 255, 255, 127,   0, 254, 255, 255, 255, 255,   0,   0,   0,
-    191,  32, 255, 255, 255, 255, 255, 231, 255, 255,  63,  63, 255,   1, 255, 255,
-      0,   0,   0,  34,   0,  64,   0,   0, 255, 255, 255,  79,  63,  63, 255, 170,
-    255, 255, 255,  63, 255, 255, 223,  95, 220,  31, 207,  15, 255,  31, 220,  31,
-     64,  12,   4,   0,  24,   0,   0,   0,   0,   0, 192, 255, 255,   3,   0,   0,
-    255, 127, 255, 255, 255, 255, 255, 127, 255, 255, 109, 192,  15, 120,  12,   0,
-    191,  32,   0,   0, 255,  63,   0,   0, 255, 255, 255,  15, 252, 255, 252, 255,
-    255, 255,   0, 254, 255,  56, 223, 255, 124,   0,   0,   0,   0,   0,   8,   0,
-      0,   0, 255, 255, 127,   0, 248,   0, 255, 255,   0,   0, 255, 255,  15, 255,
-    255, 255,   7,   0,  15,   0,   0,   0,
-};
+    v = re_joining_type_table_1[field_2];
+    v = re_joining_type_table_2[(v << 5) | field_1];
+    v = re_joining_type_table_3[(v << 5) | field_0];
 
-/* Changes_When_Casemapped: 816 bytes. */
-
-RE_UINT32 re_get_changes_when_casemapped(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-
-    f = ch >> 13;
-    code = ch ^ (f << 13);
-    pos = (RE_UINT32)re_changes_when_casemapped_stage_1[f] << 4;
-    f = code >> 9;
-    code ^= f << 9;
-    pos = (RE_UINT32)re_changes_when_casemapped_stage_2[pos + f] << 4;
-    f = code >> 5;
-    code ^= f << 5;
-    pos = (RE_UINT32)re_changes_when_casemapped_stage_3[pos + f] << 5;
-    pos += code;
-    value = (re_changes_when_casemapped_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1;
-
-    return value;
+    return v;
 }
 
-/* ID_Start. */
-
-static RE_UINT8 re_id_start_stage_1[] = {
-     0,  1,  2,  3,  4,  5,  5,  5,  5,  6,  7,  5,  5,  8,  9, 10,
-    11, 12, 13, 14, 15,  9, 16,  5, 17,  9,  9, 18,  9, 19, 20,  9,
-     5,  5,  5,  5,  5,  5,  5,  5,  5,  5, 21, 22, 23,  5, 24, 25,
+/* Line_Break. */
+static RE_UINT8 re_line_break_table_1[] = {
+     0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 13, 13,
+    13, 13, 13, 14, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 15, 16, 17, 18, 19, 20, 21, 22,
+    23, 24, 18, 19, 20, 25, 26, 26, 27, 27, 27, 27, 27, 27, 28, 29,
+    30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 27, 27, 40, 41, 27, 27,
+    27, 42, 27, 27, 27, 27, 27, 27, 27, 27, 43, 44, 13, 13, 13, 13,
+    13, 45, 46, 47, 27, 27, 27, 27, 27, 27, 27, 27, 48, 27, 27, 49,
+    27, 27, 27, 27, 50, 51, 52, 27, 53, 27, 54, 55, 56, 57, 58, 59,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 59,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 59,
+    27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
+    27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
+    27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
+    27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
+    27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
+    27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
+    27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
+    27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
+    27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
+    27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
+    27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
+    27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
+    27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
+    27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
+    27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
+    27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
+    27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
+    27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
+    27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
+    27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
+    27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
+    27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
+    27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
+    27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
+    27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
+    27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
+    27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
+    27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
+    27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
+    27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
+    27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
+    27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
+    27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
+    27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
+    27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
+    27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
+    27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
+    27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
+    27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
+    27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
+    60, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
+    27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
+    27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
+    27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
+    27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
+    27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
+    27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
+    27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
+    27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
+    27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
+    27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
+    27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27
+};
+
+static RE_UINT16 re_line_break_table_2[] = {
+      0,   1,   2,   3,   4,   5,   6,   6,   7,   7,   7,   7,   7,   7,   7,   7,
+      7,   7,   7,   7,   7,   7,   8,   7,   9,   9,  10,  11,  12,  13,   7,   7,
+      7,   7,   7,   7,  14,   7,   7,   7,   7,  15,  16,   7,  17,  18,  19,  20,
+     21,   7,  22,  23,   7,   7,  24,  25,  26,  27,  28,   7,   7,  29,  30,  31,
+     32,  33,  34,  35,  36,  37,  38,  39,  40,  41,  42,  43,  44,  45,  46,  47,
+     48,  49,  50,  51,  52,  53,  54,  55,  56,  53,  57,  58,  59,  60,  61,  62,
+     63,  64,  65,  66,  67,  68,  69,  70,  71,  72,  73,  74,  75,  76,  77,  78,
+     79,  80,  81,  36,  82,  83,  84,  36,  85,  86,  87,  88,  89,  90,  91,  36,
+     92,  92,  93,  92,  94,   7,  95,   7,  96,  96,  96,  97,  97,  98,  99,  99,
+      7,   7, 100,   7, 101, 102, 103,   7, 104,   7, 105, 106, 107,   7,   7, 108,
+    109,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
+      7,   7,   7,   7, 110,   7,   7, 111, 112, 113, 114, 115,  92,  92, 116, 117,
+    118,   7,   7, 119, 120, 121,   7, 122, 123, 124, 125, 126,  92, 127, 128,   7,
+    129,  92, 130, 131, 132, 133, 134,  36, 135, 136, 137, 138, 139, 140,   7, 141,
+      7, 142, 143, 144, 145, 146, 147, 148,   7,   7,   7,   7,   7,   7,   9, 149,
+      7,   7,   7,   7,   7,   7,   7,   7, 108,   7, 150, 151,   7,  37, 152, 153,
+    154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166,   7, 167,   7,
+    168, 169, 170, 171, 172, 173,   7, 174, 175, 176,   7,   7,   7,   7,   7, 177,
+      7, 178,  35, 179, 179, 179, 179, 180, 179, 179, 181, 182, 183, 184, 185, 186,
+    187, 188, 189, 190, 191, 192, 193, 194, 195,   7, 196, 197, 198,   7, 199, 200,
+      7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7, 201,   7, 202, 203,
+      7,   7,   7,   7,   7,   7,   7,   7,   7,   7, 204, 205, 206,   7,   7,   7,
+      7, 207, 123,   7,   7,   7,   7, 208,   7,  95,   7, 209, 210, 211, 211,   9,
+    212, 213, 214,  36, 215, 216, 216, 217, 216, 216, 216, 216, 216, 216, 218, 219,
+    220, 221, 222, 223, 224, 225, 223, 226, 227, 228, 216, 216, 229, 216, 216, 230,
+    231, 216, 232, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216,
+    216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216,
+    216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216,
+    216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216,   7,   7,
+    216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216,
+    233, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216,
+    216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216,
+    216, 216, 216, 216, 234, 216, 235, 144,   7,   7,   7,   7,   7,   7,   7,   7,
+    236, 237,   7, 238, 239,   7,   7, 240,   7,   7,   7,   7,   7,   7, 241, 242,
+    243, 244,   7, 245, 246, 136, 247, 248,  30, 249, 250, 251,  40, 252, 253, 254,
+      7, 255, 256,  92,  92,  92, 257, 258, 259, 260,   7, 261,   7,   7,   7, 262,
+    263, 264, 265, 266, 267, 268, 269, 263, 264, 265, 266, 267, 268, 269, 263, 264,
+    265, 266, 267, 268, 269, 263, 264, 265, 266, 267, 268, 269, 263, 264, 265, 266,
+    267, 268, 269, 263, 264, 265, 266, 267, 268, 269, 263, 264, 265, 266, 267, 268,
+    269, 263, 264, 265, 266, 267, 268, 269, 263, 264, 265, 266, 267, 268, 269, 263,
+    264, 265, 266, 267, 268, 269, 263, 264, 265, 266, 267, 268, 269, 263, 264, 265,
+    266, 267, 268, 269, 263, 264, 265, 266, 267, 268, 269, 263, 264, 265, 266, 267,
+    268, 269, 263, 264, 265, 266, 267, 268, 269, 263, 264, 265, 266, 267, 268, 269,
+    263, 264, 265, 266, 267, 268, 269, 263, 264, 265, 266, 267, 268, 269, 263, 264,
+    265, 266, 267, 268, 269, 263, 264, 265, 266, 267, 268, 269, 263, 264, 265, 266,
+    267, 268, 269, 263, 264, 265, 266, 267, 268, 269, 263, 264, 265, 266, 267, 268,
+    269, 263, 264, 265, 266, 267, 268, 269, 263, 264, 265, 266, 267, 268, 269, 263,
+    264, 265, 266, 267, 268, 269, 263, 264, 265, 266, 267, 268, 269, 263, 264, 265,
+    266, 267, 268, 269, 263, 264, 265, 266, 267, 268, 269, 263, 264, 265, 266, 267,
+    268, 269, 263, 264, 265, 266, 267, 268, 269, 263, 264, 265, 266, 267, 268, 269,
+    268, 269, 263, 264, 265, 266, 267, 268, 269, 263, 264, 265, 266, 267, 268, 269,
+    263, 264, 265, 266, 267, 268, 269, 263, 264, 265, 266, 267, 268, 270, 271, 272,
+    273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273,
+    273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273,
+     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,
+     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,
+     36,  36,  36,  36,  36,  36,  36,  36, 216, 216, 216, 216, 216, 216, 216, 216,
+    216, 216, 216, 216, 216, 216, 216, 216, 274, 275, 276,   7,   7,   7, 277,   7,
+      7,   7,   7,   7,   7,   7,   7,   7,   7, 278, 279,   7, 280,   7, 281, 282,
+    283, 284, 285, 286,   7,   7,   7, 287, 288, 289, 290, 291, 292, 231, 293, 294,
+    295, 296, 297,  36,   7,   7,   7, 298, 299, 300,   7,   7, 301, 302, 279, 303,
+     36,  36,  36,  36, 304,   7, 305, 306,   7, 307, 308, 309, 310,   7, 311,  36,
+      7,   7,   7,   7, 151, 312, 313, 314,   7, 315,   7, 316,  36,  36,  36,  36,
+      7,   7,   7,   7,   7,   7,   7,   7,   7, 210, 122, 281,  36,  36,  36,  36,
+    317, 318, 319,   7, 123, 320,  36, 321, 322, 323,  36,  36,   7, 324, 280,   7,
+    325, 326, 327,   7,   7,  36,   7, 328,   7, 329, 330, 331, 332, 333,  36,  36,
+      7,   7, 334,  36,   7, 335,   7, 336,   7, 337,  36,  36,  36,  36,  36,  36,
+     36,  36,  36, 123,   7, 338,  36,  36,   7, 315, 339,  36,  36, 279, 340, 210,
+    139, 341, 342, 343, 139, 344, 345, 346, 139, 347, 348, 349, 139, 252, 350, 351,
+    352, 353,  36,  36, 354, 355, 356, 357, 358, 359, 360, 361,  36,  36,  36,  36,
+      7, 362, 363, 364,   7,  27, 365,  36,  36,  36,  36,  36,   7, 366, 367,  36,
+      7,  27, 368, 369,   7, 370, 371,  36, 372, 373,  36,  36,  36,  36,  36,  36,
+      7, 374,  36,  36,  36,   7,   7, 375, 376, 377, 378,  36,  36, 379, 380, 381,
+    382, 383, 384,   7, 385, 386,   7, 119,  36,  36,  36,  36,  36,  36,  36,  36,
+    387, 388, 389, 390, 391, 392,  36,  36, 393, 394, 395, 396, 397, 371,  36,  36,
+     36,  36,  36,  36,  36,  36,  36, 398,  36,  36,  36,  36,  36, 399, 400, 401,
+      7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
+      7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7, 107,  36,  36,  36,
+      7,   7,   7, 402,   7,   7,   7,   7,   7,   7, 403,  36,  36,  36,  36,  36,
+     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,
+      7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
+      7,   7, 404,   7, 405,   7,   7,   7,   7,   7,   7, 406,   7,   7,   7,   7,
+      7, 407,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,
+     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,
+      7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7, 408,   7,
+      7,   7, 178,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,
+      7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
+      7, 119, 123, 409,  36,  36, 279, 410,   7, 411, 412, 413, 414,  36,  36,  36,
+     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,
+     36,  36,   7,   7, 415,  36,  36,  36,   7,   7, 416,   9, 417,  36,  36, 418,
+    216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216,
+    216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 419,
+    216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216,
+    216, 216, 216, 216, 216, 216, 216, 216,   7,   7,   7,   7,   7,   7,   7,   7,
+      7,   7,   7,   7,   7,   7, 122,  36, 420,  36,  36,  36,  36,  36,  36,  36,
+     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,
+    216, 216, 216, 216, 216, 216, 216, 216, 231,  36, 421, 422, 216, 216, 216, 216,
+    216, 216, 216, 216, 216, 216, 216, 423,  36,  36,  36,  36,  36,  36,  36,  36,
+      7,   7,   7, 424, 425, 426,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,
+     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,
+      7,   7,   7,   7,   7,   7,   7, 122,   7, 427,   7, 428, 429, 430,   7, 334,
+      7,   7, 431,  36,  36,  36,  36, 432,   7,   7, 210, 119,  36,  36,  36,  36,
+      7,   7,  37,   7, 433, 434, 435,   7, 436, 437, 438,   7,   7,   7,   7,   7,
+      7,   7,   7,   7,   7, 439,   7,   7,   7,   7,   7,   7,   7,   7, 440, 441,
+      7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
+      9, 442,   9, 443, 444, 445,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,
+    446, 447,  36,  36,  36,  36,  36,  36,   7, 448, 449,  36,  36,  36,  36,  36,
+     36,  36,  36,  36,  36,  36,   7, 450,  36,  36,  36,  36,  36,  36,  36,  36,
+      7,   7,   7,   7,   7,   7, 451,  36,   7,   7, 452,  36,  36,  36,  36,  36,
+     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,
+     36,  36,  36, 453,   7, 454,  36,  36, 455, 151,  36,  36,  36,  36,  36,  36,
+    435, 456, 457, 458, 459, 460,  36, 461,  36,  36,  36,  36,  36,  36,  36,  36,
+    216, 216, 216, 216, 216, 216, 216, 216, 462, 463, 179, 464, 179, 465, 216, 466,
+    216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 467, 468, 469, 470,
+    216, 216, 471, 472, 473, 474, 216, 216, 475, 476, 477, 478, 479, 216, 480, 481,
+    216, 216, 482, 483, 216, 484, 485, 216,   7,   7,   7, 486,   7,   7, 487, 216,
+    488,   7, 489,   7, 490, 491, 216, 216, 492, 493, 216, 494, 216, 495, 496, 216,
+      7,   7, 486, 216, 216, 216, 216, 216,   7,   7,   7,   7, 497,   7,  35, 498,
+    216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216,
+    216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 499,
+    500,   9,   9,   9,  36,  36,  36,  36,   9,   9,   9,   9,   9,   9,   9, 501,
+     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36
+};
+
+static RE_UINT8 re_line_break_table_3[] = {
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  2,  3,  4,  4,  5,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     6,  7,  8,  9, 10, 11,  9,  8, 12, 13,  9, 10, 14, 15, 14, 16,
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 14, 14,  9,  9,  9,  7,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9, 12, 10, 13,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9, 12,  2, 18,  9,  1,
+     1,  1,  1,  1,  1, 19,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+    20, 12, 11, 10, 10, 10,  9, 21, 21,  9, 21,  8,  9,  2,  9,  9,
+    11, 10, 21, 21, 22,  9, 21, 21, 21, 21, 21,  8, 21, 21, 21, 12,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9, 21,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9, 21, 22, 21, 21, 21, 22, 21,  9,  9,
+    21,  9,  9,  9,  9,  9,  9,  9, 21, 21, 21, 21,  9, 21,  9, 22,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1, 20,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1, 20, 20, 20, 20,
+    20, 20, 20,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  9,  9,  9,  9, 14,  9,
+     0,  0,  0,  0,  9,  9,  9,  9,  9,  9,  9,  0,  9,  0,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  0,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  1,  1,  1,  1,  1,  1,  1,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     0,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  0,  0,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9, 14,  2,  0,  0,  9,  9, 10,
+     0,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  2,  1,
+     9,  1,  1,  9,  1,  1,  7,  1,  0,  0,  0,  0,  0,  0,  0,  0,
+    23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
+    23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,  0,  0,  0,  0, 23,
+    23, 23, 23,  9,  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9, 11, 11, 11, 14, 14,  9,  9,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  7,  1,  0,  7,  7,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 11, 17, 17,  9,  9,  9,
+     1,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  7,  9,  1,  1,  1,  1,  1,  1,  1,  9,  9,  1,
+     1,  1,  1,  1,  1,  9,  9,  1,  1,  9,  1,  1,  1,  1,  9,  9,
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  9,
+     9,  1,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  0,  0,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  9,  9,  9,  9, 14,  7,  9,  0,  0,  1, 10, 10,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  1,  1,  1,  1,  9,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  9,  1,  1,  1,  9,  1,  1,  1,  1,  1,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  1,  1,  1,  0,  0,  9,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  0,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  9,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  1,  1,  1,  9,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     9,  1,  1,  1,  1,  1,  1,  1,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  1,  1,  2,  2, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  1,  1,  1,  0,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  9,
+     9,  0,  0,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  9,  9,  9,  9,  9,  9,
+     9,  0,  9,  0,  0,  0,  9,  9,  9,  9,  0,  0,  1,  9,  1,  1,
+     1,  1,  1,  1,  1,  0,  0,  1,  1,  0,  0,  1,  1,  1,  9,  0,
+     0,  0,  0,  0,  0,  0,  0,  1,  0,  0,  0,  0,  9,  9,  0,  9,
+     9,  9,  1,  1,  0,  0, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+     9,  9, 11, 11,  9,  9,  9,  9,  9, 11,  9, 10,  9,  9,  1,  0,
+     0,  1,  1,  1,  0,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,  9,
+     9,  0,  0,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  9,  9,  9,  9,  9,  9,
+     9,  0,  9,  9,  0,  9,  9,  0,  9,  9,  0,  0,  1,  0,  1,  1,
+     1,  1,  1,  0,  0,  0,  0,  1,  1,  0,  0,  1,  1,  1,  0,  0,
+     0,  1,  0,  0,  0,  0,  0,  0,  0,  9,  9,  9,  9,  0,  9,  0,
+     0,  0,  0,  0,  0,  0, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+     1,  1,  9,  9,  9,  1,  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  1,  1,  1,  0,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  9,
+     9,  9,  0,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  9,  9,  9,  9,  9,  9,
+     9,  0,  9,  9,  0,  9,  9,  9,  9,  9,  0,  0,  1,  9,  1,  1,
+     1,  1,  1,  1,  1,  1,  0,  1,  1,  1,  0,  1,  1,  1,  0,  0,
+     9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     9,  9,  1,  1,  0,  0, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+     9, 10,  0,  0,  0,  0,  0,  0,  0,  9,  1,  1,  1,  1,  1,  1,
+     0,  1,  1,  1,  0,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  9,
+     9,  0,  0,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     1,  1,  1,  1,  1,  0,  0,  1,  1,  0,  0,  1,  1,  1,  0,  0,
+     0,  0,  0,  0,  0,  1,  1,  1,  0,  0,  0,  0,  9,  9,  0,  9,
+     9,  9,  1,  1,  0,  0, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+     9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  1,  9,  0,  9,  9,  9,  9,  9,  9,  0,  0,  0,  9,  9,
+     9,  0,  9,  9,  9,  9,  0,  0,  0,  9,  9,  0,  9,  0,  9,  9,
+     0,  0,  0,  9,  9,  0,  0,  0,  9,  9,  9,  0,  0,  0,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,  1,  1,
+     1,  1,  1,  0,  0,  0,  1,  1,  1,  0,  1,  1,  1,  1,  0,  0,
+     9,  0,  0,  0,  0,  0,  0,  1,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+     9,  9,  9,  9,  9,  9,  9,  9,  9, 10,  9,  0,  0,  0,  0,  0,
+     1,  1,  1,  1,  1,  9,  9,  9,  9,  9,  9,  9,  9,  0,  9,  9,
+     9,  0,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  9,  1,  1,
+     1,  1,  1,  1,  1,  0,  1,  1,  1,  0,  1,  1,  1,  1,  0,  0,
+     0,  0,  0,  0,  0,  1,  1,  0,  9,  9,  9,  0,  0,  0,  0,  0,
+     9,  9,  1,  1,  0,  0, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+     0,  0,  0,  0,  0,  0,  0, 22,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  1,  1,  1, 22,  9,  9,  9,  9,  9,  9,  9,  9,  0,  9,  9,
+     9,  0,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  0,  9,  9,  9,  9,  9,  0,  0,  1,  9,  1,  1,
+     1,  1,  1,  1,  1,  0,  1,  1,  1,  0,  1,  1,  1,  1,  0,  0,
+     0,  0,  0,  0,  0,  1,  1,  0,  0,  0,  0,  0,  0,  0,  9,  0,
+     9,  9,  1,  1,  0,  0, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+     0,  9,  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     1,  1,  1,  1,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  9,  9,
+     9,  0,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  1,  1,  9,  1,  1,
+     1,  1,  1,  1,  1,  0,  1,  1,  1,  0,  1,  1,  1,  1,  9,  9,
+     0,  0,  0,  0,  9,  9,  9,  1,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  1,  1,  0,  0, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+     9,  9,  9,  9,  9,  9,  9,  9,  9, 11,  9,  9,  9,  9,  9,  9,
+     0,  1,  1,  1,  0,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  0,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  9,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  1,  0,  0,  0,  0,  1,
+     1,  1,  1,  1,  1,  0,  1,  0,  1,  1,  1,  1,  1,  1,  1,  1,
+     0,  0,  0,  0,  0,  0, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+     0,  0,  1,  1,  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
+    24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
+    24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
+    24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,  0,  0,  0,  0, 10,
+    24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,  9,
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17,  2,  2,  0,  0,  0,  0,
+     0, 24, 24,  0, 24,  0, 24, 24, 24, 24, 24,  0, 24, 24, 24, 24,
+    24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
+    24, 24, 24, 24,  0, 24,  0, 24, 24, 24, 24, 24, 24, 24, 24, 24,
+    24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,  0,  0,
+    24, 24, 24, 24, 24,  0, 24,  0, 24, 24, 24, 24, 24, 24,  0,  0,
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17,  0,  0, 24, 24, 24, 24,
+     9, 22, 22, 22, 22,  9, 22, 22, 20, 22, 22,  2, 20,  7,  7,  7,
+     7,  7, 20,  9,  7,  9,  9,  9,  1,  1,  9,  9,  9,  9,  9,  9,
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  2,  1,  9,  1,  9,  1, 12, 18, 12, 18,  1,  1,
+     9,  9,  9,  9,  9,  9,  9,  9,  0,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,
+     0,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  2,
+     1,  1,  1,  1,  1,  2,  1,  1,  9,  9,  9,  9,  9,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  0,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  0,  2,  2,
+     9,  9,  9,  9,  9,  9,  1,  9,  9,  9,  9,  9,  9,  0,  9,  9,
+    22, 22,  2, 22,  9,  9,  9,  9,  9, 20, 20,  0,  0,  0,  0,  0,
+    24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
+    24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17,  2,  2,  9,  9,  9,  9,
+    24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
+    24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 24, 24, 24, 24, 24, 24,
+     9,  9,  9,  9,  9,  9,  0,  9,  0,  0,  0,  0,  0,  9,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+    25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+    25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+    26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
+    26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
+    26, 26, 26, 26, 26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 27,
+    27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
+    27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
+    27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  9,  9,  9,  9,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  0,  9,  0,  9,  9,  9,  9,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  9,  9,  9,  9,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  0,  9,  9,  9,  9,  0,  0,  9,  9,  9,  9,  9,  9,  9,  0,
+     9,  0,  9,  9,  9,  9,  0,  0,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  0,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  0,  9,  9,  9,  9,  0,  0,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  1,  1,  1,
+     9,  2,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  0,  0,  9,  9,  9,  9,  9,  9,  0,  0,
+     2,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     2,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9, 12, 18,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  2,  2,  2,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  9,  9,
+     9,  9,  1,  1,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  1,  1,  1,  2,  2,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  1,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  9,  9,
+     9,  0,  1,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
+    24, 24, 24, 24,  2,  2, 28, 24,  2,  9,  2, 10, 24, 24,  0,  0,
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17,  0,  0,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,  0,  0,
+     9,  9,  7,  7,  2,  2, 22,  9,  7,  7,  9,  1,  1,  1, 20,  0,
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17,  0,  0,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  1,  1,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  1,  9,  0,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  0,  0,  0,  0,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  0,  0,  0,  0,
+     9,  0,  0,  0,  7,  7, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+    24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
+    24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,  0,  0,
+    24, 24, 24, 24, 24,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,  0,  0,  0,  0,
+    24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
+    24, 24, 24, 24, 24, 24, 24, 24, 24, 24,  0,  0,  0,  0,  0,  0,
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 24,  0,  0,  0, 24, 24,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  1,  1,  1,  1,  1,  0,  0,  9,  9,
+    24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
+    24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,  0,
+    24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
+    24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,  0,  0,  1,
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17,  0,  0,  0,  0,  0,  0,
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17,  0,  0,  0,  0,  0,  0,
+    24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,  0,  0,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     1,  1,  1,  1,  1,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17,  2,  2,  9,  2,  2,  2,
+     2,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,
+     1,  1,  1,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  9,  9,
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  0,  0,  0,  0,  0,  0,  0,  0,  9,  9,  9,  9,
+     9,  9,  9,  9,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  0,  0,  0,  2,  2,  2,  2,  2,
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17,  0,  0,  0,  9,  9,  9,
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  2,  2,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,  0,  0,  0,  0,
+     1,  1,  1,  9,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  9,  9,  9,  9,  1,  9,  9,
+     9,  9,  9,  9,  1,  9,  9,  1,  1,  1,  9,  0,  0,  0,  0,  0,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  0,  1,  1,  1,  1,  1,
+     9,  9,  9,  9,  9,  9,  0,  0,  9,  9,  9,  9,  9,  9,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  0,  9,  0,  9,  0,  9,  0,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,
+     9,  9,  9,  9,  9,  0,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  0,  0,  9,  9,  9,  9,  9,  9,  0,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     0,  0,  9,  9,  9,  0,  9,  9,  9,  9,  9,  9,  9, 22,  9,  0,
+     2,  2,  2,  2,  2,  2,  2, 20,  2,  2,  2, 29,  1, 30,  1,  1,
+     2, 20,  2,  2, 31, 21, 21,  9,  8,  8, 12,  8,  8,  8, 12,  8,
+    21, 21,  9,  9, 32, 32, 32,  2,  4,  4,  1,  1,  1,  1,  1, 20,
+    11, 11, 11, 11, 11, 11, 11, 11,  9,  8,  8, 21, 28, 28,  9,  9,
+     9,  9,  9,  9, 14, 12, 18, 28, 28, 28,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  2,  9,  2,  2,  2,  2,  9,  2,  2,  2,
+    33,  9,  9,  9,  9,  0,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     9,  9,  0,  0, 21,  9,  9,  9,  9,  9,  9,  9,  9, 12, 18, 21,
+     9, 21, 21, 21, 21,  9,  9,  9,  9,  9,  9,  9,  9, 12, 18,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,
+    10, 10, 10, 10, 10, 10, 10, 11, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 11, 10, 10, 10, 10, 11, 10, 10, 11, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     9,  9,  9, 11,  9, 21,  9,  9,  9, 11,  9,  9,  9,  9,  9,  9,
+     9,  9,  9, 21,  9,  9, 10,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9, 21, 21,  9,  9,  9,  9,  9,  9,  9,  9, 21,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9, 21, 21,  9,  9,  9,  9,  9, 21,  9,  9, 21,  9,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,  9,  9,  9,  9,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9, 21,  9,  9,  0,  0,  0,  0,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9, 21,  9, 21,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+    21,  9, 21, 21,  9,  9,  9, 21, 21,  9,  9, 21,  9,  9,  9, 21,
+     9, 21, 10, 10,  9, 21,  9,  9,  9,  9, 21,  9,  9, 21, 21, 21,
+    21,  9,  9, 21,  9, 21,  9, 21, 21, 21, 21, 21, 21,  9, 21,  9,
+     9,  9,  9,  9, 21, 21, 21, 21,  9,  9,  9,  9, 21, 21,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9, 21,  9,  9,  9, 21,  9,  9,  9,
+     9,  9, 21,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+    21, 21,  9,  9, 21, 21, 21, 21,  9,  9, 21, 21,  9,  9, 21, 21,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9, 21, 21,  9,  9, 21, 21,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9, 21,  9,  9,  9, 21,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9, 21,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9, 21,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9, 32,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9, 12, 18, 12, 18,  9,  9,  9,  9,
+     9,  9, 21,  9,  9,  9,  9,  9,  9,  9, 34, 34,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9, 12, 18,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+    34, 34, 34, 34,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,  9,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,  9,  9,  9,  9,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+     9,  9, 21, 21, 21, 21,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+    21, 21,  9, 21, 21, 21, 21, 21, 21, 21,  9,  9,  9,  9,  9,  9,
+     9,  9, 21, 21,  9,  9, 21, 21,  9,  9,  9,  9, 21, 21,  9,  9,
+    21, 21,  9,  9,  9,  9, 21, 21, 21,  9,  9, 21,  9,  9, 21, 21,
+    21, 21,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9, 21, 21, 21, 21,  9,  9,  9,  9,  9,  9,  9,  9,  9, 21,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+    34, 34, 34, 34,  9, 21, 21,  9,  9, 21,  9,  9,  9,  9, 21, 21,
+     9,  9,  9,  9, 34, 34, 21, 21, 34,  9, 34, 34, 34, 35, 34, 34,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9, 34, 34, 34,  9,  9,  9,  9,
+    21,  9, 21,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+    21, 21,  9, 21, 21, 21,  9, 21, 34, 21, 21,  9, 21, 21,  9, 21,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9, 34,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9, 21, 21,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9, 34, 34, 34,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 21, 21, 21, 21, 34,  9, 34,
+    34, 34, 21, 34, 34, 21, 21, 21, 34, 34, 21, 21, 34, 21, 21, 34,
+    34, 34,  9, 21,  9,  9,  9,  9, 21, 21, 34, 21, 21, 21, 21, 21,
+    21, 34, 34, 34, 34, 34, 21, 34, 34, 35, 34, 21, 21, 34, 34, 34,
+    34, 34, 34, 34, 34,  9,  9,  9, 34, 34, 35, 35, 35, 35,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9, 21,  9,  9,  9,  8,  8,  8,  8,  8,
+     8,  9,  7,  7, 34,  9,  9,  9, 12, 18, 12, 18, 12, 18, 12, 18,
+    12, 18, 12, 18, 12, 18, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9, 12, 18,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9, 12, 18, 12, 18, 12, 18, 12, 18, 12, 18,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9, 12, 18, 12, 18, 12, 18, 12, 18, 12, 18, 12, 18, 12,
+    18, 12, 18, 12, 18, 12, 18, 12, 18,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9, 12, 18, 12, 18,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9, 12, 18,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9, 21, 21, 21, 21, 21,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  0,  0,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  0,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  1,
+     1,  1,  9,  9,  0,  0,  0,  0,  0,  7,  2,  2,  2,  9,  7,  2,
+     9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,  0,  0,  0,  9,
+     2,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  0,  9,  9,  9,  9,  9,  9,  9,  0,
+     9,  9,  9,  9,  9,  9,  9,  0,  9,  9,  9,  9,  9,  9,  9,  0,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  2,  2,
+     2,  2,  2,  2,  2,  2,  9,  2, 12,  2,  9,  9,  8,  8,  9,  9,
+     8,  8, 12, 18, 12, 18, 12, 18, 12, 18,  2,  2,  2,  2,  7,  9,
+     2,  2,  9,  2,  2,  9,  9,  9,  9,  9, 31, 31,  2,  2,  2,  9,
+     2,  2, 12,  2,  2,  2,  2,  2,  2,  2,  2,  9,  2,  9,  2,  2,
+     9,  9,  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34,  0, 34, 34, 34, 34, 34,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    34, 34, 34, 34,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    34, 34, 34, 34, 34, 34,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,  0,  0,  0,  0,
+     2, 18, 18, 34, 34, 28, 34, 34, 12, 18, 12, 18, 12, 18, 12, 18,
+    12, 18, 34, 34, 12, 18, 12, 18, 12, 18, 12, 18, 28, 12, 18, 18,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34,  1,  1,  1,  1,  1,  1,
+    34, 34, 34, 34, 34,  1, 34, 34, 34, 34, 34, 28, 28, 34, 34, 34,
+     0, 36, 34, 36, 34, 36, 34, 36, 34, 36, 34, 34, 34, 34, 34, 34,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    34, 34, 34, 36, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    34, 34, 34, 36, 34, 36, 34, 36, 34, 34, 34, 34, 34, 34, 36, 34,
+    34, 34, 34, 34, 34, 36, 36,  0,  0,  1,  1, 28, 28, 28, 28, 34,
+    28, 36, 34, 36, 34, 36, 34, 36, 34, 36, 34, 34, 34, 34, 34, 34,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    34, 34, 34, 36, 34, 36, 34, 36, 34, 34, 34, 34, 34, 34, 36, 34,
+    34, 34, 34, 34, 34, 36, 36, 34, 34, 34, 34, 28, 36, 28, 28, 34,
+     0,  0,  0,  0,  0, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+     0, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,  0,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    34, 34, 34, 34,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,  0,
+    34, 34, 34, 34, 34, 34, 34, 34, 21, 21, 21, 21, 21, 21, 21, 21,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    34, 34, 34, 34, 34, 28, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,  0,  0,  0,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    34, 34, 34, 34, 34, 34, 34,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  2,  7,  2,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17,  9,  9,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  1,
+     1,  1,  1,  9,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  1,  1,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     1,  1,  9,  2,  2,  2,  2,  2,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  1,  9,  9,  9,  1,  9,  9,  9,  9,  1,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  1,  1,  1,  1,  1,  9,  9,  9,  9,  1,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9, 11,  9,  0,  0,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9, 22, 22,  7,  7,  0,  0,  0,  0,  0,  0,  0,  0,
+     1,  1,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     1,  1,  1,  1,  1,  1,  0,  0,  0,  0,  0,  0,  0,  0,  2,  2,
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17,  0,  0,  0,  0,  0,  0,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9, 22,  9,  9,  1,
+     9,  9,  9,  9,  9,  9,  1,  1,  1,  1,  1,  1,  1,  1,  2,  2,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  9,
+    25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+    25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  9,  9,  9,  9,  9,  9,  2,  2,  2,  9,  9,  9,  9,  0,  9,
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17,  0,  0,  0,  0,  9,  9,
+    24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 24, 24, 24, 24, 24,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     9,  9,  9,  1,  9,  9,  9,  9,  9,  9,  9,  9,  1,  1,  0,  0,
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17,  0,  0,  9,  2,  2,  2,
+    24, 24, 24,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 24, 24, 24, 24, 24,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  1,  1,  1,  1,  1,
+     2,  2,  9,  9,  9,  1,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  9,  9,  9,  9,  9,  9,  0,  0,  9,  9,  9,  9,  9,  9,  0,
+     0,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  0,  9,  9,  9,  9,  9,  9,  9,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  1,  1,  1,  1,  1,  1,  1,  1,  2,  1,  1,  0,  0,
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17,  0,  0,  0,  0,  0,  0,
+    37, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38,
+    38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 37, 38, 38, 38,
+    38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38,
+    38, 38, 38, 38, 38, 38, 38, 38, 37, 38, 38, 38, 38, 38, 38, 38,
+    38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38,
+    38, 38, 38, 38, 37, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38,
+    38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38,
+    37, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38,
+    38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 37, 38, 38, 38,
+    38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38,
+    38, 38, 38, 38, 38, 38, 38, 38, 37, 38, 38, 38, 38, 38, 38, 38,
+    38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38,
+    38, 38, 38, 38, 37, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38,
+    38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38,
+    38, 38, 38, 38,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
+    26, 26, 26, 26, 26, 26, 26,  0,  0,  0,  0, 27, 27, 27, 27, 27,
+    27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
+    27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
+    27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,  0,  0,  0,  0,
+    39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39,
+    39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39,
+     9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  9,  9,  9,  9,  9,  0,  0,  0,  0,  0, 23,  1, 23,
+    23, 23, 23, 23, 23, 23, 23, 23, 23,  9, 23, 23, 23, 23, 23, 23,
+    23, 23, 23, 23, 23, 23, 23,  0, 23, 23, 23, 23, 23,  0, 23,  0,
+    23, 23,  0, 23, 23,  0, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9, 18, 12,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     0,  0,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9, 11,  9,  0,  0,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+    14, 18, 18, 14, 14,  7,  7, 12, 18, 32,  0,  0,  0,  0,  0,  0,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+    34, 34, 34, 34, 34, 12, 18, 12, 18, 12, 18, 12, 18, 12, 18, 12,
+    18, 12, 18, 12, 18, 34, 34, 12, 18, 34, 34, 34, 34, 34, 34, 34,
+    18, 34, 18,  0, 28, 28,  7,  7, 34, 12, 18, 12, 18, 12, 18, 34,
+    34, 34, 34, 34, 34, 34, 34,  0, 34, 10, 11, 34,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  0,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0, 33,
+     0,  7, 34, 34, 10, 11, 34, 34, 12, 18, 34, 34, 18, 34, 18, 34,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 28, 28, 34, 34, 34,  7,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 12, 34, 18, 34, 34,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 12, 34, 18, 34, 12,
+    18, 18, 12, 18, 18, 28, 34, 36, 36, 36, 36, 36, 36, 36, 36, 36,
+    36, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 28, 28,
+     0,  0, 34, 34, 34, 34, 34, 34,  0,  0, 34, 34, 34, 34, 34, 34,
+     0,  0, 34, 34, 34, 34, 34, 34,  0,  0, 34, 34, 34,  0,  0,  0,
+    11, 10, 34, 34, 34, 10, 10,  0,  9,  9,  9,  9,  9,  9,  9,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  1,  1, 40, 21,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  0,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  9,  9,  0,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,  0,
+     2,  2,  2,  0,  0,  0,  0,  9,  9,  9,  9,  9,  9,  9,  9,  9,
      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  0,  0,  0,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,
+     9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  1,  0,  0,
      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,
      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     1,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,
+     9,  9,  9,  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  9,  9,  9,
      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,  0,
      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  1,  1,  1,  1,  1,  0,  0,  0,  0,  0,
      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  2,
+     9,  9,  9,  9,  0,  0,  0,  0,  9,  9,  9,  9,  9,  9,  9,  9,
+     2,  9,  9,  9,  9,  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17,  0,  0,  0,  0,  0,  0,
      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  0,  0,  0,  0,  9,  9,  9,  9,  9,  9,  9,  9,
      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,  0,  0,  0,  0,
      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  9,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  0,  0,  9,  0,  9,  9,  9,  9,  9,  9,
      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
-};
-
-static RE_UINT8 re_id_start_stage_2[] = {
-      0,   1,   2,   3,   4,   5,   6,   7,   8,   9,  10,  11,  12,  13,  14,  15,
-     16,   1,  17,  18,  19,   1,  20,  21,  22,  23,  24,  25,  26,  27,   1,  28,
-     29,  30,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  32,  33,  31,  31,
-     34,  35,  31,  31,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,  36,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,  37,
-      1,   1,   1,   1,  38,   1,  39,  40,  41,  42,  43,  44,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,  45,  31,  31,  31,  31,  31,  31,  31,  31,
-     31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,
-     31,  31,  31,  31,  31,  31,  31,  31,  31,   1,  46,  47,   1,  48,  49,  50,
-     51,  52,  53,  54,  55,  56,   1,  57,  58,  59,  60,  61,  62,  63,  31,  64,
-     65,  66,  67,  68,  69,  70,  71,  72,  73,  74,  75,  31,  76,  77,  78,  31,
-      1,   1,   1,  79,  80,  81,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,
-      1,   1,   1,   1,  82,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,
-     31,  31,  31,  31,   1,   1,  83,  31,  31,  31,  31,  31,  31,  31,  31,  31,
-     31,  31,  31,  31,  31,  31,  31,  31,   1,   1,  84,  85,  31,  31,  86,  87,
-      1,   1,   1,   1,   1,   1,   1,  88,   1,   1,  89,  31,  31,  31,  31,  31,
-      1,  90,  91,  31,  31,  31,  31,  31,  31,  31,  31,  31,  92,  31,  31,  31,
-     31,  31,  31,  31,  93,  94,  95,  96,  31,  31,  31,  31,  31,  31,  31,  31,
-     31,  97,  98,  31,  31,  31,  31,  31,  99, 100,  31,  31,  31,  31, 101,  31,
-      1,   1,   1,   1,   1,   1, 102,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1, 103, 104,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1, 105,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1, 106,  31,  31,  31,  31,
-     31,  31,  31,  31,  31,  31,  31,  31,   1,   1, 107,  31,  31,  31,  31,  31,
-};
-
-static RE_UINT8 re_id_start_stage_3[] = {
-      0,   0,   1,   1,   0,   2,   3,   3,   4,   4,   4,   4,   4,   4,   4,   4,
-      4,   4,   4,   4,   4,   4,   5,   6,   0,   0,   0,   7,   8,   9,   4,  10,
-      4,   4,   4,   4,  11,   4,   4,   4,   4,  12,  13,   4,  14,   0,  15,  16,
-      0,   4,  17,  18,   4,   4,  19,  20,  21,  22,  23,   4,   4,  24,  25,  26,
-     27,  28,  29,  17,   0,  30,   0,   0,  31,  32,  33,  34,  35,  36,  37,  38,
-     39,  40,  41,  42,  43,  44,  45,  46,  47,  44,  48,  49,  50,  51,  45,   0,
-     52,  53,  54,  55,  56,  57,  58,  59,  52,  60,  61,  62,  63,  64,  65,   0,
-     66,  67,  65,   0,  68,  69,  70,   0,  71,   0,  72,  73,  74,   0,   0,   0,
-      4,  75,  76,  77,  78,   4,  79,  80,   4,   4,  81,   4,  82,  83,  84,   4,
-     85,   4,  86,   0,  22,   4,   4,  87,  66,   4,   4,   4,   4,   4,   4,   4,
-      4,   4,   4,  88,   1,   4,   4,  89,  90,  91,  91,  92,   4,  93,  94,   0,
-      0,   4,   4,  29,   4,  95,   4,  96,  97,   0,  15,  98,   4,  99, 100,   0,
-    101,   4, 102,   0,   0, 103,   0,   0, 104,  93, 105,   0, 106, 107,   4, 108,
-      4, 109, 110, 111, 112, 113,   0, 114,   4,   4,   4,   4,   4,   4,   0,   0,
-     87,   4, 115, 111,   4, 116, 117, 118,   0,   0,   0, 119, 120,   0,   0,   0,
-    121, 122, 123,   4,  14,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      4, 124,  97,   4,   4,   4,   4, 125,   4,  79,   4, 126, 101, 127, 127,   0,
-    128, 129,  66,   4, 130,  66,   4,  80, 104,  12,   4,   4, 131,  86,   0,  15,
-      4,   4,   4,   4,   4,  96,   0,   0,   4,   4,   4,   4,   4,   4,   4,  22,
-      4,   4,   4,   4,  73,   0,  15, 111, 132, 133,   4, 134, 111,   4,   4,  22,
-    135, 136,   4,   4, 137,   4, 138, 135, 139, 140,   4,  93, 136,  93,   0, 141,
-     25, 142,  65, 143,  31, 144, 145, 146,   4,  14, 147, 148,   4, 149, 150, 151,
-    152, 153,  80, 154,   4,   4,   4, 140,   4,   4,   4,   4,   4, 155, 156, 157,
-      4,   4,   4, 158,   4,   4, 159,   0, 160, 161, 162,   4,   4,  91, 163,   4,
-      4, 111,  15,   4, 164,   4, 165, 166,   0,   0,   0, 167,   4,   4,   4, 143,
-      0,   1,   1, 168,   4,  97, 169,   0, 170, 171, 172,   0,   4,   4,   4,  86,
-      0,   0,   4, 102,   0,   0,   0,   0,   0,   0,   0,   0, 143,   4, 173,   0,
-      4,  23, 174,  96, 111,   4, 175,   0,   4,   4,   4,   4, 111,  15, 176, 157,
-      4, 154,   4, 109,   0,   0,   0,   0,   4, 101,  96, 165,   0,   0,   0,   0,
-    177, 178,  96, 101,  97,   0,   0, 179,  96, 159,   0,   0,   4, 180,   0,   0,
-    181,  96,   0, 143, 143,   0,  72, 182,   4,  96,  96, 144,  91,   0,   0,   0,
-      4,   4,  14,   0,   4, 144,   4, 144,   4, 109,   0,   0,   0,   0,   0,   0,
-    143, 183, 108,   0,   0,   0,   0, 101, 106, 184,   0,   0, 106,  22,  15,  14,
-    106,  65, 185, 186, 106, 144, 187,   0, 188, 189,   0,   0, 190, 112,  97,   0,
-     47,  44, 191,  55,   0,   0,   0,   0,   4, 102, 192,   0,   4,  22, 193,   0,
-      0,   0,   0,   0,   4, 131, 194,   0,   4,  22, 195,   0,   4, 196,   0,   0,
-     86,   0,   0,   0,   0,   0,   0,   0,   4, 189,   0,   0,   0,   4,   4, 197,
-      0,   0,   0,   0,   0, 198, 173, 199, 200, 201, 202,   4, 203,   0,   4,  29,
-    204, 131,  71, 205,  22,   0,   0,   0, 206, 173, 207, 208, 209,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0, 144,   4,   4,   4,   4, 159,   0,   0,   0,
-      4,   4,   4, 131,   4,   4,   4,   4,   4,   4, 109,   0,   0,   0,   0,   0,
-      4, 131,   0,   0,   0,   0,   0,   0,   4,   4,  65,   0,   0,   0,   0,   0,
-      4,  29,  97,   0,   0,   0,  15, 210,   4,  22, 109, 211,  22,   0,   0,   0,
-      0,   0,   4,   4,   0,   0,   0,   0,   4,   4, 212,   0, 163,   0,   0, 213,
-      4,   4,   4,   4,   4,   4,   4, 184,   4,   4,   4,   4,   4,   4,   4, 144,
-     97,   0, 214, 215,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4, 157,
-      4,   4,   4, 216, 217,   0,   0,   0,   4,   4, 218,   4, 219, 220, 221,   4,
-    222, 223, 224,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4, 225, 226,  80,
-    218, 218, 124, 124, 204, 204, 147,   0,   4, 227, 228,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   4, 189,   4,   4,   4,   4,   4,   4, 182,   0,
-      4,   4, 229,   0,   0,   0,   0,   0, 221, 230, 231, 232, 233, 234,   0,   0,
-      4,   4,   4,   4,   4,   4, 101,   0,   4, 102,   4,   4,   4,   4,   4,   4,
-    111,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4, 235,   4,   4,
-      4,   4,   4,   4,   4,   4,   4,  71, 111,   0,   0,   0,   0,   0,   0,   0,
-};
-
-static RE_UINT8 re_id_start_stage_4[] = {
-      0,   0,   0,   0, 254, 255, 255,   7,   0,   4,  32,   4, 255, 255, 127, 255,
-    255, 255, 255, 255, 195, 255,   3,   0,  31,  80,   0,   0,   0,   0, 223, 188,
-     64, 215, 255, 255, 251, 255, 255, 255, 255, 255, 191, 255,   3, 252, 255, 255,
-    255, 255, 254, 255, 255, 255, 127,   2, 255,   1,   0,   0,   0,   0, 255, 255,
-    255, 135,   7,   0, 255,   7,   0,   0,   0, 192, 254, 255, 255, 255,  47,   0,
-     96, 192,   0, 156,   0,   0, 253, 255, 255, 255,   0,   0,   0, 224, 255, 255,
-     63,   0,   2,   0,   0, 252, 255, 255, 255,   7,  48,   4, 255, 255,  63,   4,
-     16,   1,   0,   0, 255, 255, 255,   1, 255, 255, 223,  63, 240, 255, 255, 255,
-    255, 255, 255,  35,   0,   0,   1, 255,   3,   0, 254, 255, 225, 159, 249, 255,
-    255, 253, 197,  35,   0,  64,   0, 176,   3,   0,   3,  16, 224, 135, 249, 255,
-    255, 253, 109,   3,   0,   0,   0,  94,   0,   0,  28,   0, 224, 191, 251, 255,
-    255, 253, 237,  35,   0,   0,   1,   0,   3,   0,   0,   2, 224, 159, 249, 255,
-      0,   0,   0, 176,   3,   0,   2,   0, 232, 199,  61, 214,  24, 199, 255,   3,
-    224, 223, 253, 255, 255, 253, 255,  35,   0,   0,   0,   7,   3,   0,   0,   0,
-    225, 223, 253, 255, 255, 253, 239,  35,   0,   0,   0,  64,   3,   0,   6,   0,
-    255, 255, 255,  39,   0,  64, 112, 128,   3,   0,   0, 252, 224, 255, 127, 252,
-    255, 255, 251,  47, 127,   0,   0,   0, 254, 255, 255, 255, 255, 255,  13,   0,
-    214, 247, 255, 255, 175, 255,  13,  32,  95,   0,   0, 240,   1,   0,   0,   0,
-    255, 254, 255, 255, 255,  31,   0,   0,   0,  31,   0,   0, 255,   7,   0, 128,
-      0,   0,  63,  60,  98, 192, 225, 255,   3,  64,   0,   0, 191,  32, 255, 255,
-    255, 255, 255, 247, 255,  61, 127,  61, 255,  61, 255, 255, 255, 255,  61, 127,
-     61, 255, 127, 255, 255, 255,  61, 255, 255, 255, 255,   7, 255, 255,  63,  63,
-    255, 159, 255, 255, 255, 199, 255,   1, 255, 223,   3,   0, 255, 255,   3,   0,
-    255, 223,   1,   0, 255, 255,  15,   0,   0,   0, 128,  16, 255,   5, 255, 255,
-    255, 255,  63,   0, 255, 255, 255, 127, 255,  63,  31,   0, 255,  15, 255, 255,
-    255,   3,   0,   0, 255, 255, 127,   0, 255, 255,  31,   0, 128,   0,   0,   0,
-    224, 255, 255, 255, 224,  15,   0,   0, 248, 255, 255, 255,   1, 192,   0, 252,
-     63,   0,   0,   0,  15,   0,   0,   0,   0, 224,   0, 252, 255, 255, 255,  63,
-    255,   1, 255, 255, 255, 255, 255, 231,   0, 222, 111,   4,  63,  63, 255, 170,
-    255, 255, 223,  95, 220,  31, 207,  15, 255,  31, 220,  31,   0,   0,   2, 128,
-      0,   0, 255,  31, 132, 252,  47,  63,  80, 253, 255, 243, 224,  67,   0,   0,
-    255, 127, 255, 255,  31, 120,  12,   0, 255, 128,   0,   0, 127, 127, 127, 127,
-    224,   0,   0,   0, 254,   3,  62,  31, 255, 255, 127, 248, 255, 127,   0,   0,
-    255,  31, 255, 255,   0,  12,   0,   0, 255, 127,   0, 128,   0,   0, 128, 255,
-    252, 255, 255, 255, 255, 249, 255, 255, 124,   0,   0,   0, 187, 247, 255, 255,
-      7,   0,   0,   0,   0,   0, 252, 104,  63,   0, 255, 255, 255, 255, 255,  31,
-    255, 255,   7,   0,   0, 128,   0,   0, 223, 255,   0, 124, 247,  15,   0,   0,
-    255, 255, 127, 196, 255, 255,  98,  62,   5,   0,   0,  56, 255,   7,  28,   0,
-    126, 126, 126,   0, 127, 127, 255, 255, 255,   0, 255, 255,  15,   0, 255, 255,
-    127, 248, 255, 255, 255, 255, 255,  15, 255,  63, 255, 255, 255, 255, 255,   3,
-    127,   0, 248, 160, 255, 253, 127,  95, 219, 255, 255, 255,   0,   0, 248, 255,
-    255, 255, 252, 255, 255,   0,   0,   0,   0,   0, 255,  15,   0,   0, 223, 255,
-    192, 255, 255, 255, 252, 252, 252,  28, 255, 239, 255, 255, 127, 255, 255, 183,
-    255,  63, 255,  63, 255, 255,   1,   0, 255,   7, 255, 255,  15, 255,  62,   0,
-    255, 255,  15, 255,  63, 253, 255, 255, 255, 255, 191, 145, 255, 255,  55,   0,
-    255, 255, 255, 192,   1,   0, 239, 254,  31,   0,   0,   0, 128,   0, 255, 255,
-    255, 255, 255,   0,  16,   0, 255, 255, 255, 255,  71,   0,  30,   0,   0,  20,
-    255, 255, 251, 255, 255,  15,   0,   0, 127, 189, 255, 191,   0,   0,   1, 224,
-    128,   7,   0, 128, 176,   0,   0,   0,   0,   0,   0,  15,  16,   0,   0,   0,
-    255,   7,   0,   1,   0,   0,   0, 128, 255, 252, 255, 255,  10,   0,   0,   0,
-      1, 248, 255, 255, 255, 255,   7,   4,   0,   0,   1, 240, 255,   3,   0,  32,
-    255, 253, 255, 255,   0,   0, 252, 255, 127, 251, 255, 255,  64,   0,   0,   0,
-    191, 253, 255, 255, 255,   3,   0,   1, 255,  63,   0,   0, 248, 255, 255, 224,
-    255,   7,   1,   0,  11,   0,   0,   0,   0,   0,   7,   0, 240,   0, 255, 255,
-    255,   7, 255,  31, 255,   1, 255,   3, 255, 255, 223, 255, 255, 255, 255, 223,
-    100, 222, 255, 235, 239, 255, 255, 255, 191, 231, 223, 223, 255, 255, 255, 123,
-     95, 252, 253, 255,  63, 255, 255, 255, 253, 255, 255, 247, 255,  31, 128,  63,
-      0,  64,   0,   0,  15,   8,   0,   0, 150, 254, 247,  10, 132, 234, 150, 170,
-    150, 247, 247,  94, 255, 251, 255,  15, 238, 251, 255,  15,   3,   0, 255, 255,
-};
-
-/* ID_Start: 2496 bytes. */
-
-RE_UINT32 re_get_id_start(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-
-    f = ch >> 12;
-    code = ch ^ (f << 12);
-    pos = (RE_UINT32)re_id_start_stage_1[f] << 4;
-    f = code >> 8;
-    code ^= f << 8;
-    pos = (RE_UINT32)re_id_start_stage_2[pos + f] << 3;
-    f = code >> 5;
-    code ^= f << 5;
-    pos = (RE_UINT32)re_id_start_stage_3[pos + f] << 5;
-    pos += code;
-    value = (re_id_start_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1;
-
-    return value;
-}
-
-/* ID_Continue. */
-
-static RE_UINT8 re_id_continue_stage_1[] = {
-     0,  1,  2,  3,  4,  5,  5,  5,  5,  6,  7,  5,  5,  8,  9, 10,
-    11, 12, 13, 14, 15,  9, 16,  5, 17,  9,  9, 18,  9, 19, 20,  9,
-     5,  5,  5,  5,  5,  5,  5,  5,  5,  5, 21, 22, 23,  5, 24, 25,
      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  0,  9,  9,  0,  0,  0,  9,  0,  0,  9,
      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  0,  2,  9,  9,  9,  9,  9,  9,  9,  9,
+     0,  0,  0,  0,  0,  0,  0,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  0,  9,  9,  0,  0,  0,  0,  0,  9,  9,  9,  9,  9,
      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  2,
      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,  0,  9,
      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,  9,  9,  9,  9,
+     9,  1,  1,  1,  0,  1,  1,  0,  0,  0,  0,  0,  1,  1,  1,  1,
+     9,  9,  9,  9,  0,  9,  9,  9,  0,  9,  9,  9,  9,  9,  9,  9,
      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  0,  0,  1,  1,  1,  0,  0,  0,  0,  1,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,  0,  0,  0,
+     2,  2,  2,  2,  2,  2,  2,  2,  9,  0,  0,  0,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  1,  1,  0,  0,  0,  0,  9,  9,  9,  9,  9,
+     2,  2,  2,  2,  2,  2, 32,  0,  0,  0,  0,  0,  0,  0,  0,  0,
      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  0,  0,  0,  2,  2,  2,  2,  2,  2,  2,
      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  0,  0,  9,  9,  9,  9,  9,  9,  9,  9,
      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  0,  0,  0,  0,  0,  9,  9,  9,  9,  9,  9,  9,  9,
      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
-    26,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  0,  0,  0,  0,  0,  0,  0,  9,  9,  9,  9,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  9,  9,  9,  9,  9,  9,  9,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
-};
-
-static RE_UINT8 re_id_continue_stage_2[] = {
-      0,   1,   2,   3,   4,   5,   6,   7,   8,   9,  10,  11,  12,  13,  14,  15,
-     16,   1,  17,  18,  19,   1,  20,  21,  22,  23,  24,  25,  26,  27,   1,  28,
-     29,  30,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  32,  33,  31,  31,
-     34,  35,  31,  31,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,  36,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,  37,
-      1,   1,   1,   1,  38,   1,  39,  40,  41,  42,  43,  44,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,  45,  31,  31,  31,  31,  31,  31,  31,  31,
-     31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,
-     31,  31,  31,  31,  31,  31,  31,  31,  31,   1,  46,  47,   1,  48,  49,  50,
-     51,  52,  53,  54,  55,  56,   1,  57,  58,  59,  60,  61,  62,  63,  31,  64,
-     65,  66,  67,  68,  69,  70,  71,  72,  73,  74,  75,  31,  76,  77,  78,  31,
-      1,   1,   1,  79,  80,  81,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,
-      1,   1,   1,   1,  82,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,
-     31,  31,  31,  31,   1,   1,  83,  31,  31,  31,  31,  31,  31,  31,  31,  31,
-     31,  31,  31,  31,  31,  31,  31,  31,   1,   1,  84,  85,  31,  31,  86,  87,
-      1,   1,   1,   1,   1,   1,   1,  88,   1,   1,  89,  31,  31,  31,  31,  31,
-      1,  90,  91,  31,  31,  31,  31,  31,  31,  31,  31,  31,  92,  31,  31,  31,
-     31,  93,  94,  31,  95,  96,  97,  98,  31,  31,  99,  31,  31,  31,  31,  31,
-    100, 101, 102,  31,  31,  31,  31,  31, 103, 104,  31,  31,  31,  31, 105,  31,
-      1,   1,   1,   1,   1,   1, 106,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1, 107, 108,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1, 109,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1, 110,  31,  31,  31,  31,
-     31,  31,  31,  31,  31,  31,  31,  31,   1,   1, 111,  31,  31,  31,  31,  31,
-     31,  37,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,
-};
-
-static RE_UINT8 re_id_continue_stage_3[] = {
-      0,   0,   0,   1,   2,   3,   2,   4,   0,   0,   5,   6,   7,   8,   7,   8,
-      7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
-      7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   9,  10,  11,   0,
-      7,   7,   7,   7,   7,   7,   7,  12,  13,   7,  14,   7,   7,   7,   7,  15,
-      7,   7,   7,   7,   7,   7,   7,   7,  16,   7,   7,   7,   7,   7,   7,   7,
-      7,   7,   7,   2,   7,  17,   7,   7,  18,   2,   7,  19,  20,   7,   3,  21,
-      0,   4,   7,   7,   7,   7,  22,   7,   7,   7,   7,   7,   7,  23,  24,  25,
-      0,   7,   7,   7,  26,   7,   7,   7,   7,   7,   7,  10,   7,   7,   7,  27,
-      7,   7,  28,   0,   7,  29,   4,   0,   0,   0,   7,  30,   0,  31,  14,   7,
-      7,   7,   7,   7,   7,   7,  32,   2,  23,  33,  24,  34,  35,  36,  32,  37,
-     38,  33,  24,  39,  40,  41,  42,  43,  44,  14,  24,  45,  46,  47,  32,  48,
-     49,  33,  24,  45,  50,  51,  32,  52,  53,  54,  55,  22,  56,  57,  42,   0,
-     58,  59,  24,  60,  61,  62,  32,   0,  63,  59,  24,  64,  61,  65,  32,  66,
-     63,  59,   7,   7,  67,  68,  32,  69,  70,  71,   7,  72,  73,  74,  42,  75,
-      2,   7,   7,   4,  76,   1,   0,   0,  77,   7,  78,  28,  79,  80,   0,   0,
-     47,  81,   1,  82,  83,   7,  84,   2,  85,  83,   7,  84,  86,   0,   0,   0,
-      7,   7,   7,   7,   1,   7,   7,   7,   7,  28,   7,   7,  87,   7,   7,  88,
-      7,   7,   7,   7,  89,  90,   7,   7,  89,   7,   7,  91,  92,   8,   7,   7,
-      7,  92,   7,   7,   7,  26,  48,  10,   7,   0,   7,   7,   7,   7,   7,  93,
-      2,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
-      7,   7,   7,   7,   7,   7,  25,   7,   2,   4,   7,   7,   7,   7,  94,  18,
-     58,  95,   7,  95,   7,  96,  58,  97,   7,   7,   7,   7,   7,  98,   1,   0,
-     99,   1,   7,   7,   7,   7,   7,  18,   7,   7,   4,   7,   7,   7,   7,  43,
-      7,  76,  29,  29,  42,   7,  28,  95,   7,   7,  29,   7,   1,   4,   0,   0,
-      7,  29,   7,   7,   7,  76,   7,  25,   1,   1, 100,  28,   0,   0,   0,   0,
-      7,   7,   7,   7,  29,   1, 101,  96,   7,   7,   7,   7,   7,   7,   7,  96,
-      7,   7,   7, 102,  60,   7,   7,  28,  18,   7,   7,  26,   0, 103,   7,   4,
-      7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7, 104,
-      7,  93,   7,   7,  93, 105,   7,  28,   7,   7,   7, 106, 107, 108,  84, 107,
-      0,   0,   0, 109,  47, 110,   0, 111,   0,  84,   0,   0,   0,  84, 112,  47,
-    113, 114, 115,  80, 116,   0,   7,   7,  18,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      7,   7,  76,   7,   7,  76,   7,   7,   7,   7,   7,   7,   7,   7, 117,  96,
-      7,   7,  87,   7,   7,   7, 118, 109,   7, 119, 120, 120, 120, 120,   7,   7,
-    121,   0,   2, 122,   2,   7,   7,   7,   7, 123,   2,   7,   7,   7,   7,  88,
-    124,   7,   7,   2,   7,   7,   7,   7,  76,   0,   7,   4,   0,   0,   0,   7,
-      7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,  43,   0,   0,   0,   0,
-      7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   0,
-      7,   7,   7,   7,   7,   7,   7,   7,  84,   0,   0,   0,   0,   7,   7,  28,
-     84,   7,  29,   0,   7,   7,   7, 125,   7,   7,   7,   7,   7,   7,   7,  10,
-      0, 126, 127,   7,   7,   7,   7,   7, 128,   7,   7,   7, 129,   0,   0, 126,
-      7,   7, 102,   0,   7,   7,   7,  96,   7,   7,   7,   7,  43,   1,   7, 130,
-      7,   7,  28,   7,   7,  96,   7,  84,   7,   7,   7,   7, 131,   1,   7,  76,
-      7,   7,   7, 119,  28,   1,   7,  71,   7,   7,   7,   7,  21,  99,   7, 129,
-    132, 133, 120,   7,   7,  88, 102,   7,   7,   7,   7,   7,   7,   7, 134,   1,
-      7,   7,   7,   7,   7,   7,   7,   7,   7,   7,  96,   7, 135,   7,   7,  29,
-      7,   7,   7,   7,   7,   7,  28,   7,   7,   7,   7,   7,   7,   1,   0,   0,
-    119, 136,  24, 137, 138,   7,   7,   7,   7,   7,   7,  10,   0,  31,   7,   7,
-      7,   7,   7,  28,   0,   7,   7,   7,   7, 127,   7,   7, 102,   0,   0,  29,
-      7,   0,   7, 139, 140,   0,   0,  85,   7,   7,   7,   7,   7,   7,   7,  84,
-      0,   1,   2,   3,   2,   4,  42,   7,   7,   7,   7,  76, 141, 142,   0,   0,
-    143,   7,   8, 144,  28,  28,   0,   0,   7,   7,   7,   7,   7,   7,   7,   4,
-      0,   0,   0,   0,   7,   7,   7,  95,   0,   0,   0,   0,   0,   0,   0, 145,
-      0,   0,   0,   0,   0,   0,   0,   0,   7,  84,   7,   7,   7,  47,  47,   0,
-      7,   7, 140,   7,   4,   7,   7,   4,   7,  28,   7,   7, 146, 147,   0,   0,
-      7,   7,   7,   7,   7,   7,   7,   7,   7,  28,   1,   7,   7, 146,   7,  29,
-      7,   7, 102,   7,   7,   7,  96,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      7,   7,   7, 119,   7,  43, 102,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-    148,   7,   7, 149,   7,  43,   7, 119,   7,  76,   0,   0,   0,   0,   7, 150,
-      7,  43,   7,   1,   0,   0,   0,   0,   7,   7,   7, 151,   0,   0,   0,   0,
-    152, 153,   7, 154,   0,   0,   7,  84,   7,  84,   0,   0,  83,   7, 119,   0,
-      7,   7,   7,  43,   7,  43,   7,  21,   7,  10,   0,   0,   0,   0,   0,   0,
-      7,   7,   7,   7,  18,   0,   0,   0,   7,   7,   7,  21,   7,   7,   7,  21,
-      7,   7, 102,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      7,  84, 100,   7,   7,  47,   0,   0,   0,   0,   0,   0,   0,   0,   7, 119,
-      7,   7,   7,   7, 119,   0,  42, 109,   7,   7,   7,   4,   0,   7,  18,   1,
-      7,   7,   7,  85, 155,   7,   7, 156,   7,   7,   7,   7, 157, 158,   0,   0,
-      7,  14,   7, 159,   0,   0,   0,   0, 160,  19,  18,   7,   7,   7,   4,   1,
-     23,  33,  24, 161,  50, 162, 163,  95,   0,   0,   0,   0,   0,   0,   0,   0,
-      7,   7,   7,   7,   4,  22,   0,   0,   7,   7,   7,   7, 164,   1,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   7,   7,   7, 165,  47, 166,   0,   0,
-      7,   7,   7,   7, 167,   1,   0,   0,   7,   7,   7,  18,   1,   0,   0,   0,
-      7,  26,  29,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      7,   7,   7,   4,   0,   0,   0,   0,   0,   0,   7,   7,   7,   7,   1, 109,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 168,   7,   7, 168, 169,   0,
-      7,   7,   7,  76, 100,   7,   7,   7,   7, 170,   0,   0,   7,   7,   7,  18,
-     24,   7,   7,   8,  47,   1,   0, 127,   7, 127,  83, 119,   0,   0,   0,   0,
-    171,   7,   7, 172, 102,   1, 173,   7,  76, 174,   1,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   7, 119,
-      7,   7,   7,   7,   7,   7,   7,   7,   7,   1,   0,   0,   0,   0,   0,   0,
-      7,   7,   7,   7,   7,   7,  76,   0,   7,   7,   7,   7,   7,   7,   7,   7,
-      7,   7,   7,   7,  96,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      7,   7,  76,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      7,   7,   7,   7, 119,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      7,   7,   7,  18,   7,  76,   1,   0,   0,   0,   0,   0,   0,   7,  28,  95,
-      7,   7,   7, 119,  96,   1,  31, 175,   7,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   7,   7,   7,   7,   0,   0,   0,   0,   0,   0,   0,   0,
-      7,   7,   7,   7,   3,   7,   7,   7, 118,   7,   0,   0,   0,   0, 176,   0,
-      7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7, 102,
-      7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,  21,
-      7,  76,   0,   0,   0,  21, 177,   7,   7,   7,   7,   7,   7,   7,   7,   7,
-      7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,  29,
-      7,   7,   7,   7,   7,   7,   4,  84,  18, 178,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0, 179, 180, 181,   0, 182,   0,   0,   0,   0,   0,
-      0,   0,   0,   0, 183,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      7,   7,   7,   7,   7,  85,   7,   7,   7,  58, 184, 185, 186,   7,   7,   7,
-    187, 188,   7, 189, 190,  59,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
-      7,   7,   7,   7,   7,   7,   7,   7,   7,   7, 165,   7,  59,  88,   7,  88,
-      7,  85,   7,  85,  76,   7,  76,   7,  24,   7,  24,   7, 191,   7,   7,   7,
-      7,   7,   7, 135,   7,   7,  84, 192, 110, 101,   2,   0,   0,   0,   0,   0,
-      8, 128, 193,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      7,   7,  84,  28, 194,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   7,   7,   7,   1,
-      7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,  95, 119,   0,   0,
-      7,   7,   7,   7,  29,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-    186,   7, 195, 196, 197, 198, 199, 200, 104,  29, 201,  29,   0,   0,   0,   0,
-      7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7, 119,   0,   0,
-      7,   7,   7,  95,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
-      7,  28,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
-      7,   7,   7,   7,   7,   7,   7,   7,   7,   7,  10,   7,   7,   7,   7,   7,
-      7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,  47,   0,
-      7,  28,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-};
-
-static RE_UINT8 re_id_continue_stage_4[] = {
-      0,   0, 255,   3, 254, 255, 255, 135, 255,   7,   0,   4, 160,   4, 255, 255,
-    127, 255, 195, 255,   3,   0,  31,  80, 223, 188, 192, 215, 251, 255, 191, 255,
-    251, 252, 127,   2, 255,   1, 255, 191, 182,   0,   7,   0, 255, 195, 239, 159,
-    255, 253, 255, 159, 255, 231,  63,  36, 255,  63, 255,  15, 223,  63, 248, 255,
-    207, 255, 249, 255, 197, 243, 159, 121, 128, 176,   3,  80, 238, 135, 109, 211,
-    135,  57,   2,  94, 192, 255,  63,   0, 238, 191, 237, 243, 191,  59,   1,   0,
-      0, 254, 238, 159, 159,  57, 192, 176,   2,   0, 236, 199,  61, 214,  24, 199,
-    199,  61, 129,   0, 255, 223, 253, 255, 255, 227, 223,  61,  96,   7, 239, 223,
-    239, 243,  96,  64,   6,   0, 223, 125, 240, 128,   0, 252, 236, 255, 127, 252,
-    251,  47, 127, 132,  95, 255,  12,   0, 255, 127, 214, 247, 175, 255,  95,  63,
-    255, 243,   0,   3, 160, 194, 255, 254, 255,  31, 223, 255,  64,   0, 191,  32,
-    255, 247, 255,  61, 127,  61,  61, 127,  61, 255,  63,  63, 255, 199,  31,   0,
-     15,   0,  13,   0, 143,  48,   0,  56, 128,   0,   0, 248, 255,   0, 247, 255,
-    255, 251, 255, 170, 223,  95, 220,  31, 207,  15,   0, 128,  16,   0,   2, 128,
-    226, 255, 132, 252,  47,  63,  80, 253, 224,  67,  31, 248, 255, 128, 127,   0,
-    127, 127, 224,   0,  62,  31, 127, 254, 224, 255, 240, 191, 128, 255, 252, 255,
-    255, 249, 124,   0, 255, 232,   1, 128, 126, 126, 126,   0, 255,  55, 127, 248,
-    248, 224, 127,  95, 219, 255,  24,   0,   0, 224, 252, 252, 252,  28, 255, 239,
-    255, 183,   0,  32,  15, 255,  62,   0,  63, 253, 191, 145,  55,   0, 255, 192,
-    111, 240, 239, 254,  63, 135, 112,   0,  79,   0,  31,  30, 255,  23, 255,  64,
-    127, 189, 237, 251, 129, 224, 207,  31, 191,   0,  63, 255,   0,  63,  17,   0,
-    255, 252,  27,   0, 255,  35, 127, 251, 127, 180, 191, 253, 251,   1, 255, 224,
-     11,   0, 240,   0, 255,  99, 224, 227,   7, 248, 231,  15,   0,  60,  28,   0,
-    100, 222, 255, 235, 239, 255, 191, 231, 223, 223, 255, 123,  95, 252, 247, 207,
-     32,   0, 219,   7, 255,  67, 150, 254, 247,  10, 132, 234, 150, 170, 150, 247,
-    247,  94, 238, 251,
-};
-
-/* ID_Continue: 2900 bytes. */
-
-RE_UINT32 re_get_id_continue(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-
-    f = ch >> 12;
-    code = ch ^ (f << 12);
-    pos = (RE_UINT32)re_id_continue_stage_1[f] << 4;
-    f = code >> 8;
-    code ^= f << 8;
-    pos = (RE_UINT32)re_id_continue_stage_2[pos + f] << 4;
-    f = code >> 4;
-    code ^= f << 4;
-    pos = (RE_UINT32)re_id_continue_stage_3[pos + f] << 4;
-    pos += code;
-    value = (re_id_continue_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1;
-
-    return value;
-}
-
-/* XID_Start. */
-
-static RE_UINT8 re_xid_start_stage_1[] = {
-     0,  1,  2,  3,  4,  5,  5,  5,  5,  6,  7,  5,  5,  8,  9, 10,
-    11, 12, 13, 14, 15,  9, 16,  5, 17,  9,  9, 18,  9, 19, 20,  9,
-     5,  5,  5,  5,  5,  5,  5,  5,  5,  5, 21, 22, 23,  5, 24, 25,
+     9,  9,  9,  0,  0,  0,  0,  0,  0,  0,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  1,  1,  1,  1,  0,  0,  0,  0,  0,  0,  0,  0,
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17,  0,  0,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  1,  1,  2,  0,  0,
+     9,  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  2,  2,  9,  9,  9,  9,  9,  0,  0,
+     0,  0,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,
      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  9,  9,  9,  2,  2,
+     2,  2,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  9,  0,  0,
      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,  0,  0,  0,
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17,  0,  0,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  0, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+     2,  2,  2,  2,  9,  1,  1,  9,  0,  0,  0,  0,  0,  0,  0,  0,
      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  1,  9, 22,  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     1,  9,  9,  9,  9,  2,  2,  9,  2,  1,  1,  1,  1,  9,  1,  1,
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17,  9, 22,  9,  2,  2,  2,
+     0,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  0,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  2,  2,  9,  2,  2,  9,  1,  0,
+     9,  9,  9,  9,  9,  9,  9,  0,  9,  0,  9,  9,  9,  9,  0,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  2,  0,  0,  0,  0,  0,  0,
      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  0,  0,  0,  0,  0,
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17,  0,  0,  0,  0,  0,  0,
+     1,  1,  1,  1,  0,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  9,
+     9,  0,  0,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  9,  9,  9,  9,  9,  9,
+     9,  0,  9,  9,  0,  9,  9,  9,  9,  9,  0,  1,  1,  9,  1,  1,
+     1,  1,  1,  1,  1,  0,  0,  1,  1,  0,  0,  1,  1,  1,  0,  0,
+     9,  0,  0,  0,  0,  0,  0,  1,  0,  0,  0,  0,  0,  9,  9,  9,
+     9,  9,  1,  1,  0,  0,  1,  1,  1,  1,  1,  1,  1,  0,  0,  0,
+     1,  1,  1,  1,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  9,  9,  9,  9,  2,  2,  2,  2,  9,
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17,  2,  2,  0,  9,  1,  9,
+     9,  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     1,  1,  1,  1,  9,  9,  9,  9,  0,  0,  0,  0,  0,  0,  0,  0,
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17,  0,  0,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  1,
+     1,  1,  1,  1,  1,  1,  0,  0,  1,  1,  1,  1,  1,  1,  1,  1,
+     1, 22,  2,  2,  7,  7,  9,  9,  9,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  9,  9,  9,  9,  1,  1,  0,  0,
+     1,  2,  2,  9,  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17,  0,  0,  0,  0,  0,  0,
+    22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  9,  0,  0,  0,  0,  0,  0,  0,
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
+    24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,  0,  0, 24, 24, 24,
+    24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,  0,  0,  0,  0,
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 24, 24,  2,  2,  2, 24,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  9,  0,  0,  0,  0,
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  9,
+     9,  9,  9,  9,  9,  9,  9,  0,  0,  9,  0,  0,  9,  9,  9,  9,
+     9,  9,  9,  9,  0,  9,  9,  0,  9,  9,  9,  9,  9,  9,  9,  9,
      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     1,  1,  1,  1,  1,  1,  0,  1,  1,  0,  0,  1,  1,  1,  1,  9,
+     1,  9,  1,  1,  2,  2,  2,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17,  0,  0,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  9,  9,  9,  9,  9,  9,
      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  1,  1,  1,  1,  1,  1,  1,  0,  0,  1,  1,  1,  1,  1,  1,
+     1,  9, 22,  9,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     9,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  9,  9,  9,  9,  9,
      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
-};
-
-static RE_UINT8 re_xid_start_stage_2[] = {
-      0,   1,   2,   3,   4,   5,   6,   7,   8,   9,  10,  11,  12,  13,  14,  15,
-     16,   1,  17,  18,  19,   1,  20,  21,  22,  23,  24,  25,  26,  27,   1,  28,
-     29,  30,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  32,  33,  31,  31,
-     34,  35,  31,  31,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,  36,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,  37,
-      1,   1,   1,   1,  38,   1,  39,  40,  41,  42,  43,  44,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,  45,  31,  31,  31,  31,  31,  31,  31,  31,
-     31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,
-     31,  31,  31,  31,  31,  31,  31,  31,  31,   1,  46,  47,  48,  49,  50,  51,
-     52,  53,  54,  55,  56,  57,   1,  58,  59,  60,  61,  62,  63,  64,  31,  65,
-     66,  67,  68,  69,  70,  71,  72,  73,  74,  75,  76,  31,  77,  78,  79,  31,
-      1,   1,   1,  80,  81,  82,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,
-      1,   1,   1,   1,  83,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,
-     31,  31,  31,  31,   1,   1,  84,  31,  31,  31,  31,  31,  31,  31,  31,  31,
-     31,  31,  31,  31,  31,  31,  31,  31,   1,   1,  85,  86,  31,  31,  87,  88,
-      1,   1,   1,   1,   1,   1,   1,  89,   1,   1,  90,  31,  31,  31,  31,  31,
-      1,  91,  92,  31,  31,  31,  31,  31,  31,  31,  31,  31,  93,  31,  31,  31,
-     31,  31,  31,  31,  94,  95,  96,  97,  31,  31,  31,  31,  31,  31,  31,  31,
-     31,  98,  99,  31,  31,  31,  31,  31, 100, 101,  31,  31,  31,  31, 102,  31,
-      1,   1,   1,   1,   1,   1, 103,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1, 104, 105,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1, 106,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1, 107,  31,  31,  31,  31,
-     31,  31,  31,  31,  31,  31,  31,  31,   1,   1, 108,  31,  31,  31,  31,  31,
-};
-
-static RE_UINT8 re_xid_start_stage_3[] = {
-      0,   0,   1,   1,   0,   2,   3,   3,   4,   4,   4,   4,   4,   4,   4,   4,
-      4,   4,   4,   4,   4,   4,   5,   6,   0,   0,   0,   7,   8,   9,   4,  10,
-      4,   4,   4,   4,  11,   4,   4,   4,   4,  12,  13,   4,  14,   0,  15,  16,
-      0,   4,  17,  18,   4,   4,  19,  20,  21,  22,  23,   4,   4,  24,  25,  26,
-     27,  28,  29,  17,   0,  30,   0,   0,  31,  32,  33,  34,  35,  36,  37,  38,
-     39,  40,  41,  42,  43,  44,  45,  46,  47,  44,  48,  49,  50,  51,  45,   0,
-     52,  53,  54,  55,  56,  57,  58,  59,  52,  60,  61,  62,  63,  64,  65,   0,
-     66,  67,  65,   0,  68,  69,  70,   0,  71,   0,  72,  73,  74,   0,   0,   0,
-      4,  75,  76,  77,  78,   4,  79,  80,   4,   4,  81,   4,  82,  83,  84,   4,
-     85,   4,  86,   0,  22,   4,   4,  87,  66,   4,   4,   4,   4,   4,   4,   4,
-      4,   4,   4,  88,   1,   4,   4,  89,  90,  91,  91,  92,   4,  93,  94,   0,
-      0,   4,   4,  29,   4,  95,   4,  96,  97,   0,  15,  98,   4,  99, 100,   0,
-    101,   4, 102,   0,   0, 103,   0,   0, 104,  93, 105,   0, 106, 107,   4, 108,
-      4, 109, 110, 111, 112, 113,   0, 114,   4,   4,   4,   4,   4,   4,   0,   0,
-     87,   4, 115, 111,   4, 116, 117, 118,   0,   0,   0, 119, 120,   0,   0,   0,
-    121, 122, 123,   4,  14,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      4, 124,  97,   4,   4,   4,   4, 125,   4,  79,   4, 126, 101, 127, 127,   0,
-    128, 129,  66,   4, 130,  66,   4,  80, 104,  12,   4,   4, 131,  86,   0,  15,
-      4,   4,   4,   4,   4,  96,   0,   0,   4,   4,   4,   4,   4,   4,   4,  22,
-      4,   4,   4,   4,  73,   0,  15, 111, 132, 133,   4, 134, 111,   4,   4,  22,
-    135, 136,   4,   4, 137,   4, 138, 135, 139, 140,   4,  93, 136,  93,   0, 141,
-     25, 142,  65, 143,  31, 144, 145, 146,   4,  14, 147, 148,   4, 149, 150, 151,
-    152, 153,  80, 154,   4,   4,   4, 140,   4,   4,   4,   4,   4, 155, 156, 157,
-      4,   4,   4, 158,   4,   4, 159,   0, 160, 161, 162,   4,   4,  91, 163,   4,
-      4,   4, 111,  31,   4,   4,   4,   4,   4, 111,  15,   4, 164,   4, 165, 166,
-      0,   0,   0, 167,   4,   4,   4, 143,   0,   1,   1, 168, 111,  97, 169,   0,
-    170, 171, 172,   0,   4,   4,   4,  86,   0,   0,   4, 102,   0,   0,   0,   0,
-      0,   0,   0,   0, 143,   4, 173,   0,   4,  23, 174,  96, 111,   4, 175,   0,
-      4,   4,   4,   4, 111,  15, 176, 157,   4, 154,   4, 109,   0,   0,   0,   0,
-      4, 101,  96, 165,   0,   0,   0,   0, 177, 178,  96, 101,  97,   0,   0, 179,
-     96, 159,   0,   0,   4, 180,   0,   0, 181,  96,   0, 143, 143,   0,  72, 182,
-      4,  96,  96, 144,  91,   0,   0,   0,   4,   4,  14,   0,   4, 144,   4, 144,
-      4, 109,   0,   0,   0,   0,   0,   0, 143, 183, 108,   0,   0,   0,   0, 101,
-    106, 184,   0,   0, 106,  22,  15,  14, 106,  65, 185, 186, 106, 144, 187,   0,
-    188, 189,   0,   0, 190, 112,  97,   0,  47,  44, 191,  55,   0,   0,   0,   0,
-      4, 102, 192,   0,   4,  22, 193,   0,   0,   0,   0,   0,   4, 131, 194,   0,
-      4,  22, 195,   0,   4, 196,   0,   0,  86,   0,   0,   0,   0,   0,   0,   0,
-      4, 189,   0,   0,   0,   4,   4, 197,   0,   0,   0,   0,   0, 198, 173, 199,
-    200, 201, 202,   4, 203,   0,   4,  29, 204, 131,  71, 205,  22,   0,   0,   0,
-    206, 173, 207, 208, 209,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 144,
-      4,   4,   4,   4, 159,   0,   0,   0,   4,   4,   4, 131,   4,   4,   4,   4,
-      4,   4, 109,   0,   0,   0,   0,   0,   4, 131,   0,   0,   0,   0,   0,   0,
-      4,   4,  65,   0,   0,   0,   0,   0,   4,  29,  97,   0,   0,   0,  15, 210,
-      4,  22, 109, 211,  22,   0,   0,   0,   0,   0,   4,   4,   0,   0,   0,   0,
-      4,   4, 212,   0, 163,   0,   0, 213,   4,   4,   4,   4,   4,   4,   4, 184,
-      4,   4,   4,   4,   4,   4,   4, 144,  97,   0, 214, 215,   4,   4,   4,   4,
-      4,   4,   4,   4,   4,   4,   4, 157,   4,   4,   4, 216, 217,   0,   0,   0,
-      4,   4, 218,   4, 219, 220, 221,   4, 222, 223, 224,   4,   4,   4,   4,   4,
-      4,   4,   4,   4,   4, 225, 226,  80, 218, 218, 124, 124, 204, 204, 147,   0,
-      4, 227, 228,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   4, 189,
-      4,   4,   4,   4,   4,   4, 182,   0,   4,   4, 229,   0,   0,   0,   0,   0,
-    221, 230, 231, 232, 233, 234,   0,   0,   4,   4,   4,   4,   4,   4, 101,   0,
-      4, 102,   4,   4,   4,   4,   4,   4, 111,   4,   4,   4,   4,   4,   4,   4,
-      4,   4,   4,   4,   4, 235,   4,   4,   4,   4,   4,   4,   4,   4,   4,  71,
-    111,   0,   0,   0,   0,   0,   0,   0,
-};
-
-static RE_UINT8 re_xid_start_stage_4[] = {
-      0,   0,   0,   0, 254, 255, 255,   7,   0,   4,  32,   4, 255, 255, 127, 255,
-    255, 255, 255, 255, 195, 255,   3,   0,  31,  80,   0,   0,   0,   0, 223, 184,
-     64, 215, 255, 255, 251, 255, 255, 255, 255, 255, 191, 255,   3, 252, 255, 255,
-    255, 255, 254, 255, 255, 255, 127,   2, 255,   1,   0,   0,   0,   0, 255, 255,
-    255, 135,   7,   0, 255,   7,   0,   0,   0, 192, 254, 255, 255, 255,  47,   0,
-     96, 192,   0, 156,   0,   0, 253, 255, 255, 255,   0,   0,   0, 224, 255, 255,
-     63,   0,   2,   0,   0, 252, 255, 255, 255,   7,  48,   4, 255, 255,  63,   4,
-     16,   1,   0,   0, 255, 255, 255,   1, 255, 255, 223,  63, 240, 255, 255, 255,
-    255, 255, 255,  35,   0,   0,   1, 255,   3,   0, 254, 255, 225, 159, 249, 255,
-    255, 253, 197,  35,   0,  64,   0, 176,   3,   0,   3,  16, 224, 135, 249, 255,
-    255, 253, 109,   3,   0,   0,   0,  94,   0,   0,  28,   0, 224, 191, 251, 255,
-    255, 253, 237,  35,   0,   0,   1,   0,   3,   0,   0,   2, 224, 159, 249, 255,
-      0,   0,   0, 176,   3,   0,   2,   0, 232, 199,  61, 214,  24, 199, 255,   3,
-    224, 223, 253, 255, 255, 253, 255,  35,   0,   0,   0,   7,   3,   0,   0,   0,
-    225, 223, 253, 255, 255, 253, 239,  35,   0,   0,   0,  64,   3,   0,   6,   0,
-    255, 255, 255,  39,   0,  64, 112, 128,   3,   0,   0, 252, 224, 255, 127, 252,
-    255, 255, 251,  47, 127,   0,   0,   0, 254, 255, 255, 255, 255, 255,   5,   0,
-    214, 247, 255, 255, 175, 255,   5,  32,  95,   0,   0, 240,   1,   0,   0,   0,
-    255, 254, 255, 255, 255,  31,   0,   0,   0,  31,   0,   0, 255,   7,   0, 128,
-      0,   0,  63,  60,  98, 192, 225, 255,   3,  64,   0,   0, 191,  32, 255, 255,
-    255, 255, 255, 247, 255,  61, 127,  61, 255,  61, 255, 255, 255, 255,  61, 127,
-     61, 255, 127, 255, 255, 255,  61, 255, 255, 255, 255,   7, 255, 255,  63,  63,
-    255, 159, 255, 255, 255, 199, 255,   1, 255, 223,   3,   0, 255, 255,   3,   0,
-    255, 223,   1,   0, 255, 255,  15,   0,   0,   0, 128,  16, 255,   5, 255, 255,
-    255, 255,  63,   0, 255, 255, 255, 127, 255,  63,  31,   0, 255,  15, 255, 255,
-    255,   3,   0,   0, 255, 255, 127,   0, 255, 255,  31,   0, 128,   0,   0,   0,
-    224, 255, 255, 255, 224,  15,   0,   0, 248, 255, 255, 255,   1, 192,   0, 252,
-     63,   0,   0,   0,  15,   0,   0,   0,   0, 224,   0, 252, 255, 255, 255,  63,
-    255,   1, 255, 255, 255, 255, 255, 231,   0, 222, 111,   4,  63,  63, 255, 170,
-    255, 255, 223,  95, 220,  31, 207,  15, 255,  31, 220,  31,   0,   0,   2, 128,
-      0,   0, 255,  31, 132, 252,  47,  63,  80, 253, 255, 243, 224,  67,   0,   0,
-    255, 127, 255, 255,  31, 120,  12,   0, 255, 128,   0,   0, 127, 127, 127, 127,
-    224,   0,   0,   0, 254,   3,  62,  31, 255, 255, 127, 224, 255, 127,   0,   0,
-    255,  31, 255, 255,   0,  12,   0,   0, 255, 127,   0, 128,   0,   0, 128, 255,
-    252, 255, 255, 255, 255, 249, 255, 255, 124,   0,   0,   0, 187, 247, 255, 255,
-      7,   0,   0,   0,   0,   0, 252, 104,  63,   0, 255, 255, 255, 255, 255,  31,
-    255, 255,   7,   0,   0, 128,   0,   0, 223, 255,   0, 124, 247,  15,   0,   0,
-    255, 255, 127, 196, 255, 255,  98,  62,   5,   0,   0,  56, 255,   7,  28,   0,
-    126, 126, 126,   0, 127, 127, 255, 255, 255,   0, 255, 255,  15,   0, 255, 255,
-    127, 248, 255, 255, 255, 255, 255,  15, 255,  63, 255, 255, 255, 255, 255,   3,
-    127,   0, 248, 160, 255, 253, 127,  95, 219, 255, 255, 255,   0,   0, 248, 255,
-    255, 255, 252, 255, 255,   0,   0,   0,   0,   0, 255,   3,   0,   0, 138, 170,
-    192, 255, 255, 255, 252, 252, 252,  28, 255, 239, 255, 255, 127, 255, 255, 183,
-    255,  63, 255,  63, 255, 255,   1,   0, 255,   7, 255, 255,  15, 255,  62,   0,
-    255, 255,  15, 255,  63, 253, 255, 255, 255, 255, 191, 145, 255, 255,  55,   0,
-    255, 255, 255, 192,   1,   0, 239, 254,  31,   0,   0,   0, 128,   0, 255, 255,
-    255, 255, 255,   0,  16,   0, 255, 255, 255, 255,  71,   0,  30,   0,   0,  20,
-    255, 255, 251, 255, 255,  15,   0,   0, 127, 189, 255, 191,   0,   0,   1, 224,
-    128,   7,   0, 128, 176,   0,   0,   0,   0,   0,   0,  15,  16,   0,   0,   0,
-    255,   7,   0,   1,   0,   0,   0, 128, 255, 252, 255, 255,  10,   0,   0,   0,
-      1, 248, 255, 255, 255, 255,   7,   4,   0,   0,   1, 240, 255,   3,   0,  32,
-    255, 253, 255, 255,   0,   0, 252, 255, 127, 251, 255, 255,  64,   0,   0,   0,
-    191, 253, 255, 255, 255,   3,   0,   1, 255,  63,   0,   0, 248, 255, 255, 224,
-    255,   7,   1,   0,  11,   0,   0,   0,   0,   0,   7,   0, 240,   0, 255, 255,
-    255,   7, 255,  31, 255,   1, 255,   3, 255, 255, 223, 255, 255, 255, 255, 223,
-    100, 222, 255, 235, 239, 255, 255, 255, 191, 231, 223, 223, 255, 255, 255, 123,
-     95, 252, 253, 255,  63, 255, 255, 255, 253, 255, 255, 247, 255,  31, 128,  63,
-      0,  64,   0,   0,  15,   8,   0,   0, 150, 254, 247,  10, 132, 234, 150, 170,
-    150, 247, 247,  94, 255, 251, 255,  15, 238, 251, 255,  15,   3,   0, 255, 255,
-};
-
-/* XID_Start: 2504 bytes. */
-
-RE_UINT32 re_get_xid_start(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-
-    f = ch >> 12;
-    code = ch ^ (f << 12);
-    pos = (RE_UINT32)re_xid_start_stage_1[f] << 4;
-    f = code >> 8;
-    code ^= f << 8;
-    pos = (RE_UINT32)re_xid_start_stage_2[pos + f] << 3;
-    f = code >> 5;
-    code ^= f << 5;
-    pos = (RE_UINT32)re_xid_start_stage_3[pos + f] << 5;
-    pos += code;
-    value = (re_xid_start_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1;
-
-    return value;
-}
-
-/* XID_Continue. */
-
-static RE_UINT8 re_xid_continue_stage_1[] = {
-     0,  1,  2,  3,  4,  5,  5,  5,  5,  6,  7,  5,  5,  8,  9, 10,
-    11, 12, 13, 14, 15,  9, 16,  5, 17,  9,  9, 18,  9, 19, 20,  9,
-     5,  5,  5,  5,  5,  5,  5,  5,  5,  5, 21, 22, 23,  5, 24, 25,
+     9,  9,  9,  1,  1,  1,  1,  1,  1,  1,  9,  1,  1,  1,  1, 22,
+     9,  2,  2,  2,  2, 22,  9,  1,  0,  0,  0,  0,  0,  0,  0,  0,
+     9,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  2,  2,  2,  9, 22, 22,
+    22,  2,  2,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  1,
+     1,  1,  1,  1,  1,  1,  1,  0,  1,  1,  1,  1,  1,  1,  1,  1,
+     9,  2,  2,  2,  2,  2,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,
+    22,  7,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     0,  0,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  0,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  0,  9,  9,  0,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  1,  1,  1,  1,  1,  1,  0,  0,  0,  1,  0,  1,  1,  0,  1,
+     1,  1,  1,  1,  1,  1,  9,  1,  0,  0,  0,  0,  0,  0,  0,  0,
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17,  0,  0,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  0,  9,  9,  0,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  1,  1,  1,  1,  1,  0,
+     1,  1,  0,  1,  1,  1,  1,  1,  9,  0,  0,  0,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  1,  1,  1,  1,  9,  9,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9, 11, 11, 11,
+    11,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  2,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,
+     2,  2,  2,  2,  2,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     9,  9,  9,  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9, 12, 12, 12, 18, 18, 18,  9,  9,
+     9,  9, 18,  9,  9,  9, 12, 18, 12, 18,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9, 12, 18, 18,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,
+    20, 20, 20, 20, 20, 20, 20, 12, 18,  0,  0,  0,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9, 12, 18,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17,  0,  0,  0,  0,  2,  2,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,
+     1,  1,  1,  1,  1,  2,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     1,  1,  1,  1,  1,  1,  1,  2,  2,  2,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  2,  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17,  0,  9,  9,  9,  9,  9,
+     9,  9,  0,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,  0,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  2,  2,  9,  9,  0,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,  1,
+     9,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  0,  0,  0,  0,  0,  0,  0,  1,
+     1,  1,  1,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+    28, 28, 28, 28, 20,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     1,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    34, 34, 34, 34, 34, 34, 34, 34,  0,  0,  0,  0,  0,  0,  0,  0,
+    34, 34, 34, 34, 34, 34, 34, 34, 34,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    36, 36, 36,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0, 36, 36, 36, 36,  0,  0,  0,  0,  0,  0,  0,  0,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  9,  1,  1,  2,
+     1,  1,  1,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  0,  0,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  1,  1,  1,  1,  1,  9,  9,  9,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  9,  9,  1,  1,  1,  1,  1,  1,  1,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  1,  1,  1,  1,  9,  9,
      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  1,  1,  1,  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  9,  9,
+     0,  0,  9,  0,  0,  9,  9,  0,  0,  9,  9,  9,  9,  0,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  9,  0,  9,  9,  9,
+     9,  9,  9,  9,  0,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  0,  9,  9,  9,  9,  0,  0,  9,  9,  9,
+     9,  9,  9,  9,  9,  0,  9,  9,  9,  9,  9,  9,  9,  0,  9,  9,
      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  9,  9,  9,  9,  0,
+     9,  9,  9,  9,  9,  0,  9,  0,  0,  0,  9,  9,  9,  9,  9,  9,
+     9,  0,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  0,  0,  9,  9,  9,  9,  9,  9,  9,  9,
      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0, 17, 17,
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  9,  9,  9,  9,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  9,  9,  9,
+     9,  9,  9,  9,  9,  1,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  1,  9,  9,  2,  2,  2,  2,  9,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  1,  1,  1,  1,
+     0,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     1,  1,  1,  1,  1,  1,  1,  0,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  0,  0,  1,  1,  1,  1,  1,
+     1,  1,  0,  1,  1,  0,  1,  1,  1,  1,  1,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,
+     1,  1,  1,  1,  1,  1,  1,  9,  9,  9,  9,  9,  9,  9,  0,  0,
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17,  0,  0,  0,  0,  9,  9,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  1,  1,  1,  1,
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17,  0,  0,  0,  0,  0, 10,
+     9,  9,  9,  9,  9,  0,  0,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     1,  1,  1,  1,  1,  1,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     9,  9,  9,  9,  1,  1,  1,  1,  1,  1,  1,  9,  0,  0,  0,  0,
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17,  0,  0,  0,  0, 12, 12,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9, 11,  9,  9,  9,
+    11,  9,  9,  9,  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     0,  9,  9,  0,  9,  0,  0,  9,  0,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  0,  9,  9,  9,  9,  0,  9,  0,  9,  0,  0,  0,  0,
+     0,  0,  9,  0,  0,  0,  0,  9,  0,  9,  0,  9,  0,  9,  9,  9,
+     0,  9,  9,  0,  9,  0,  0,  9,  0,  9,  0,  9,  0,  9,  0,  9,
+     0,  9,  9,  0,  9,  0,  0,  9,  9,  9,  9,  0,  9,  9,  9,  9,
+     9,  9,  9,  0,  9,  9,  9,  9,  0,  9,  9,  9,  9,  0,  9,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,
+     0,  9,  9,  9,  0,  9,  9,  9,  9,  9,  0,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     9,  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 34, 34, 34,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,  9,  9,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21,  9,  9,  9, 34, 34, 34,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 34, 34, 34,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    34, 34, 34, 34, 34, 34, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41,
+    41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41,
+    34, 34, 34, 34, 34, 35, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,  9,  9, 34, 34,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    34, 34, 34, 34, 34,  9,  9, 34, 34, 34, 34, 34,  9, 34, 34, 34,
+    34, 34, 35, 35, 35, 34, 34, 35, 34, 34, 35, 35, 35, 34, 34, 34,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 42, 42, 42, 42, 42,
+    34, 34, 35, 35, 34, 34, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+    35, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    34, 34, 34, 34, 34, 34, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+    35, 35, 35, 35, 35, 35, 35, 35, 35, 34, 34, 34, 35, 34, 34, 34,
+    34, 35, 35, 35, 34, 35, 35, 35, 34, 34, 34, 34, 34, 34, 34, 35,
+    34, 35, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+     9, 34,  9, 34,  9, 34, 34, 34, 34, 34, 35, 34, 34, 34, 34,  9,
+    34,  9,  9, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+     9,  9,  9,  9,  9,  9,  9, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    34, 34, 34, 34, 34, 34, 34,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    34, 34,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9, 34, 34, 34, 34, 34, 34,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    34, 34, 34, 34, 35, 35, 34, 34, 34, 34, 35, 34, 34, 34, 34, 34,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    35, 34, 34, 34, 34, 35, 35, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    34, 34, 34, 34,  9,  9,  9,  9,  9,  9,  9,  9, 34, 34, 34, 34,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    34, 34, 34, 34,  9,  9,  9,  9,  9,  9, 34, 34, 34, 34, 34, 34,
+    34, 34, 34, 34, 34, 35, 35, 35, 34, 34, 34, 35, 35, 35, 35, 35,
      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  8,  8,  8, 28, 28, 28,  9,  9,  9,  9,
+    34, 34, 34, 35, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    34, 34, 34, 34, 35, 35, 35, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    35, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 35, 34, 34, 34,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9, 34, 34, 34, 34,
      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
-    26,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9, 34, 34, 34, 34, 34, 34, 34, 34,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9, 34, 34, 34, 34, 34, 34,
+     9,  9,  9,  9,  9,  9,  9,  9, 34, 34, 34, 34, 34, 34, 34, 34,
      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9, 34, 34,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9, 35, 34, 34, 35,
+    34, 34, 34, 34, 34, 34, 34, 34, 35, 35, 35, 35, 35, 35, 35, 35,
+    34, 34, 34, 34, 34, 34, 35, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 34, 34, 35, 35, 35, 34,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    34, 34, 34, 34, 34, 34, 34, 35, 34, 34, 34, 34, 34, 34, 34, 34,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    34, 34, 34, 34, 34, 35, 35, 34, 35, 35, 34, 35, 34, 34, 34, 34,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 35, 35, 35,
+    34, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 34, 34,
      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  0,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17,  0,  0,  0,  0,  0,  0,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,  0,  0,
+     0,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0
 };
 
-static RE_UINT8 re_xid_continue_stage_2[] = {
-      0,   1,   2,   3,   4,   5,   6,   7,   8,   9,  10,  11,  12,  13,  14,  15,
-     16,   1,  17,  18,  19,   1,  20,  21,  22,  23,  24,  25,  26,  27,   1,  28,
-     29,  30,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  32,  33,  31,  31,
-     34,  35,  31,  31,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,  36,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,  37,
-      1,   1,   1,   1,  38,   1,  39,  40,  41,  42,  43,  44,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,  45,  31,  31,  31,  31,  31,  31,  31,  31,
-     31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,
-     31,  31,  31,  31,  31,  31,  31,  31,  31,   1,  46,  47,  48,  49,  50,  51,
-     52,  53,  54,  55,  56,  57,   1,  58,  59,  60,  61,  62,  63,  64,  31,  65,
-     66,  67,  68,  69,  70,  71,  72,  73,  74,  75,  76,  31,  77,  78,  79,  31,
-      1,   1,   1,  80,  81,  82,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,
-      1,   1,   1,   1,  83,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,
-     31,  31,  31,  31,   1,   1,  84,  31,  31,  31,  31,  31,  31,  31,  31,  31,
-     31,  31,  31,  31,  31,  31,  31,  31,   1,   1,  85,  86,  31,  31,  87,  88,
-      1,   1,   1,   1,   1,   1,   1,  89,   1,   1,  90,  31,  31,  31,  31,  31,
-      1,  91,  92,  31,  31,  31,  31,  31,  31,  31,  31,  31,  93,  31,  31,  31,
-     31,  94,  95,  31,  96,  97,  98,  99,  31,  31, 100,  31,  31,  31,  31,  31,
-    101, 102, 103,  31,  31,  31,  31,  31, 104, 105,  31,  31,  31,  31, 106,  31,
-      1,   1,   1,   1,   1,   1, 107,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1, 108, 109,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1, 110,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1, 111,  31,  31,  31,  31,
-     31,  31,  31,  31,  31,  31,  31,  31,   1,   1, 112,  31,  31,  31,  31,  31,
-     31,  37,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,
+RE_UINT32 re_get_line_break(RE_UINT32 codepoint) {
+    RE_UINT32 field_2;
+    RE_UINT32 field_1;
+    RE_UINT32 field_0;
+    RE_UINT32 v;
+
+    field_2 = codepoint >> 10;
+    field_1 = (codepoint >> 5) & 0x1F;
+    field_0 = codepoint & 0x1F;
+
+    v = re_line_break_table_1[field_2];
+    v = re_line_break_table_2[(v << 5) | field_1];
+    v = re_line_break_table_3[(v << 5) | field_0];
+
+    return v;
+}
+
+/* Logical_Order_Exception. */
+RE_UINT32 re_get_logical_order_exception(RE_UINT32 codepoint) {
+    if (0x0E40 <= codepoint && codepoint <= 0x0E44)
+        return 1;
+    if (0x0EC0 <= codepoint && codepoint <= 0x0EC4)
+        return 1;
+    if (0x19B5 <= codepoint && codepoint <= 0x19B7)
+        return 1;
+    if (codepoint == 0x19BA)
+        return 1;
+    if (0xAAB5 <= codepoint && codepoint <= 0xAAB6)
+        return 1;
+    if (codepoint == 0xAAB9)
+        return 1;
+    if (0xAABB <= codepoint && codepoint <= 0xAABC)
+        return 1;
+
+    return 0;
+}
+
+/* Lowercase. */
+static RE_UINT8 re_lowercase_table_1[] = {
+     0,  1,  2,  2,  3,  2,  2,  4,  5,  6,  2,  7,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  8,  9,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2, 10, 11,
+     2, 12,  2, 13,  2,  2, 14,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2, 15,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2, 16,  2,  2,  2,  2, 17,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2
+};
+
+static RE_UINT8 re_lowercase_table_2[] = {
+     0,  0,  0,  1,  0,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12,
+     5, 13, 14, 15, 16, 17, 18, 19,  0,  0, 20, 21, 22, 23, 24, 25,
+     0, 26, 15,  5, 27,  5, 28,  5,  5, 29,  0, 15, 30,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0, 26, 31,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 32,
+     0,  0,  0,  0, 30,  0,  0,  0, 15, 15, 15, 15, 15, 15,  0,  0,
+     5,  5,  5,  5, 33,  5,  5,  5, 34, 35, 36, 37, 35, 38, 39, 40,
+     0,  0,  0, 41, 42,  0,  0,  0, 43, 44, 45, 26, 46,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0, 26, 47,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0, 26, 48, 49,  5,  5,  5, 50, 15, 51,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  5, 52, 53,  0,  0,  0,  0, 54,  5, 55, 56, 57, 58, 59,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0, 26, 60, 61, 15, 15,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0, 62,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  0,  0,  0,  0,  0,
+     0, 63, 64,  0,  0,  0, 65, 66,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0, 15, 67,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0, 15,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0, 15,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 68, 69, 81,
+    71, 72, 82, 64, 75, 83, 84, 85, 86, 82, 87, 26, 88, 75, 89,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0, 90, 91,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0
+};
+
+static RE_UINT8 re_lowercase_table_3[] = {
+      0,   0,   0,   0, 254, 255, 255,   7,   0,   4,  32,   4,   0,   0,   0, 128,
+    255, 255, 127, 255, 170, 170, 170, 170, 170, 170, 170,  85,  85, 171, 170, 170,
+    170, 170, 170, 212,  41,  49,  36,  78,  42,  45,  81, 230,  64,  82,  85, 181,
+    170, 170,  41, 170, 170, 170, 250, 147, 133, 170, 255, 255, 255, 255, 255, 255,
+    255, 255, 239, 255, 255, 255, 255,   1,   3,   0,   0,   0,  31,   0,   0,   0,
+     32,   0,   0,   0,   0,   0, 138,  60,   0,   0,   1,   0,   0, 240, 255, 255,
+    255, 127, 227, 170, 170, 170,  47,  25,   0,   0, 255, 255,   2, 168, 170, 170,
+     84, 213, 170, 170, 170, 170,   0,   0, 255,   1,   0,   0, 255, 255, 255, 231,
+      0,   0,   0,  63, 170, 170, 234, 191, 255,   0,  63,   0, 255,   0, 255,   0,
+     63,   0, 255,   0, 255,   0, 255,  63, 255,   0, 223,  64, 220,   0, 207,   0,
+    255,   0, 220,   0,   0,   0,   2, 128,   0,   0, 255,  31,   0, 196,   8,   0,
+      0, 128,  16,  50, 192,  67,   0,   0,  16,   0,   0,   0, 255,   3,   0,   0,
+    255, 255, 255, 127,  98,  21, 218,  63,  26,  80,   8,   0, 191,  32,   0,   0,
+    170,  42,   0,   0, 170, 170, 170,  58, 168, 170, 171, 170, 170, 170, 255, 149,
+    170,  80, 186, 170, 170, 130, 160, 170,   8,   5,   0,   0,   0,   0,  64,   7,
+    255, 255, 255, 247, 255,   1, 255, 255, 127,   0, 248,   0,   0, 255, 255, 255,
+    255, 255,   0,   0,   0,   0,   0, 255, 255, 255, 255,  15, 255, 255,   7,   0,
+      0,   0,   0, 252, 255, 255,  15,   0,   0, 192, 223, 255, 255,   0,   0,   0,
+    252, 255, 255,  15,   0,   0, 192, 235, 239, 255,   0,   0,   0, 252, 255, 255,
+     15,   0,   0, 192, 255, 255, 255,   0,   0,   0, 252, 255, 255,  15,   0,   0,
+    192, 255, 255, 255,   0, 192, 255, 255,   0,   0, 192, 255,  63,   0,   0,   0,
+    252, 255, 255, 247,   3,   0,   0, 240, 255, 255, 223,  15, 255, 127,  63,   0,
+    255, 253,   0,   0, 247,  11,   0,   0, 252, 255, 255, 255,  15,   0,   0,   0
 };
 
-static RE_UINT8 re_xid_continue_stage_3[] = {
-      0,   0,   0,   1,   2,   3,   2,   4,   0,   0,   5,   6,   7,   8,   7,   8,
-      7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
-      7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   9,  10,  11,   0,
-      7,   7,   7,   7,   7,   7,   7,  12,  13,   7,  14,   7,   7,   7,   7,  15,
-      7,   7,   7,   7,   7,   7,   7,   7,  16,   7,   7,   7,   7,   7,   7,   7,
-      7,   7,   7,   2,   7,  17,   7,   7,  18,   2,   7,  19,  20,   7,   3,  21,
-      0,   4,   7,   7,   7,   7,  22,   7,   7,   7,   7,   7,   7,  23,  24,  25,
-      0,   7,   7,   7,  26,   7,   7,   7,   7,   7,   7,  10,   7,   7,   7,  27,
-      7,   7,  28,   0,   7,  29,   4,   0,   0,   0,   7,  30,   0,  31,  14,   7,
-      7,   7,   7,   7,   7,   7,  32,   2,  23,  33,  24,  34,  35,  36,  32,  37,
-     38,  33,  24,  39,  40,  41,  42,  43,  44,  14,  24,  45,  46,  47,  32,  48,
-     49,  33,  24,  45,  50,  51,  32,  52,  53,  54,  55,  22,  56,  57,  42,   0,
-     58,  59,  24,  60,  61,  62,  32,   0,  63,  59,  24,  64,  61,  65,  32,  66,
-     63,  59,   7,   7,  67,  68,  32,  69,  70,  71,   7,  72,  73,  74,  42,  75,
-      2,   7,   7,   4,  76,   1,   0,   0,  77,   7,  78,  28,  79,  80,   0,   0,
-     47,  81,   1,  82,  83,   7,  84,   2,  85,  83,   7,  84,  86,   0,   0,   0,
-      7,   7,   7,   7,   1,   7,   7,   7,   7,  28,   7,   7,  87,   7,   7,  88,
-      7,   7,   7,   7,  89,  90,   7,   7,  89,   7,   7,  91,  92,   8,   7,   7,
-      7,  92,   7,   7,   7,  26,  48,  10,   7,   0,   7,   7,   7,   7,   7,  93,
-      2,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
-      7,   7,   7,   7,   7,   7,  25,   7,   2,   4,   7,   7,   7,   7,  94,  18,
-     58,  95,   7,  95,   7,  96,  58,  97,   7,   7,   7,   7,   7,  98,   1,   0,
-     99,   1,   7,   7,   7,   7,   7,  18,   7,   7,   4,   7,   7,   7,   7,  43,
-      7,  76,  29,  29,  42,   7,  28,  95,   7,   7,  29,   7,   1,   4,   0,   0,
-      7,  29,   7,   7,   7,  76,   7,  25,   1,   1, 100,  28,   0,   0,   0,   0,
-      7,   7,   7,   7,  29,   1, 101,  96,   7,   7,   7,   7,   7,   7,   7,  96,
-      7,   7,   7, 102,  60,   7,   7,  28,  18,   7,   7,  26,   0, 103,   7,   4,
-      7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7, 104,
-      7,  93,   7,   7,  93, 105,   7,  28,   7,   7,   7, 106, 107, 108,  84, 107,
-      0,   0,   0, 109,  47, 110,   0, 111,   0,  84,   0,   0,   0,  84, 112,  47,
-    113, 114, 115,  80, 116,   0,   7,   7,  18,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      7,   7,  76,   7,   7,  76,   7,   7,   7,   7,   7,   7,   7,   7, 117,  96,
-      7,   7,  87,   7,   7,   7, 118, 109,   7, 119, 120, 120, 120, 120,   7,   7,
-    121,   0,   2, 122,   2,   7,   7,   7,   7, 123,   2,   7,   7,   7,   7,  88,
-    124,   7,   7,   2,   7,   7,   7,   7,  76,   0,   7,   4,   0,   0,   0,   7,
-      7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,  43,   0,   0,   0,   0,
-      7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   0,
-      7,   7,   7,   7,   7,   7,   7,   7,  84,   0,   0,   0,   0,   7,   7,  28,
-     84,   7,  29,   0,   7,   7,   7, 125,   7,   7,   7,   7,   7,   7,   7,  10,
-      0, 126, 127,   7,   7,   7,   7,   7, 128,   7,   7,   7, 129,   0,   0, 126,
-      7,   7, 102,   0,   7,   7,   7,  96,   7,   7,   7,   7,  43,   1,   7, 130,
-      7,   7,  28,   7,   7,  96,   7,  84,   7,   7,   7,   7, 131,   1,   7,  76,
-      7,   7,   7, 119,  28,   1,   7,  71,   7,   7,   7,   7,  21,  99,   7, 129,
-    132, 133, 120,   7,   7,  88, 102,   7,   7,   7,   7,   7,   7,   7, 134,   1,
-      7,   7,   7,   7,   7,   7,   7,   7,   7,   7,  96,   7, 135,   7,   7,  29,
-      7,   7,   7,   7,   7,   7,  28,   7,   7,   7,   7,   7,   7,   1,   0,   0,
-    119, 136,  24, 137, 138,   7,   7,   7,   7,   7,   7,  10,   0,  31,   7,   7,
-      7,   7,   7,   7,   7,  28, 139,   7,   7,   7,   7,   7,   7,   7,   7,   7,
-      7,   7,   7,  28,   0,   7,   7,   7,   7, 127,   7,   7, 102,   0,   0,   1,
-      7,   0,   7, 140, 141,   0,   0, 142,   7,   7,   7,   7,   7,   7,   7,  84,
-      0,   1,   2,   3,   2,   4,  42,   7,   7,   7,   7,  76, 143, 144,   0,   0,
-    145,   7,   8, 146,  28,  28,   0,   0,   7,   7,   7,   7,   7,   7,   7,   4,
-      0,   0,   0,   0,   7,   7,   7,  95,   0,   0,   0,   0,   0,   0,   0, 147,
-      0,   0,   0,   0,   0,   0,   0,   0,   7,  84,   7,   7,   7,  47,  47,   0,
-      7,   7, 141,   7,   4,   7,   7,   4,   7,  28,   7,   7, 148, 149,   0,   0,
-      7,   7,   7,   7,   7,   7,   7,   7,   7,  28,   1,   7,   7, 148,   7,  29,
-      7,   7, 102,   7,   7,   7,  96,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      7,   7,   7, 119,   7,  43, 102,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-    150,   7,   7, 151,   7,  43,   7, 119,   7,  76,   0,   0,   0,   0,   7, 152,
-      7,  43,   7,   1,   0,   0,   0,   0,   7,   7,   7, 153,   0,   0,   0,   0,
-    154, 155,   7, 156,   0,   0,   7,  84,   7,  84,   0,   0,  83,   7, 119,   0,
-      7,   7,   7,  43,   7,  43,   7,  21,   7,  10,   0,   0,   0,   0,   0,   0,
-      7,   7,   7,   7,  18,   0,   0,   0,   7,   7,   7,  21,   7,   7,   7,  21,
-      7,   7, 102,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      7,  84, 100,   7,   7,  47,   0,   0,   0,   0,   0,   0,   0,   0,   7, 119,
-      7,   7,   7,   7, 119,   0,  42, 109,   7,   7,   7,   4,   0,   7,  18,   1,
-      7,   7,   7,  85, 157,   7,   7, 158,   7,   7,   7,   7, 159, 160,   0,   0,
-      7,  14,   7, 161,   0,   0,   0,   0, 162,  19,  18,   7,   7,   7,   4,   1,
-     23,  33,  24, 163,  50, 164, 165,  95,   0,   0,   0,   0,   0,   0,   0,   0,
-      7,   7,   7,   7,   4,  22,   0,   0,   7,   7,   7,   7, 166,   1,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   7,   7,   7, 167,  47, 168,   0,   0,
-      7,   7,   7,   7, 169,   1,   0,   0,   7,   7,   7,  18,   1,   0,   0,   0,
-      7,  26,  29,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      7,   7,   7,   4,   0,   0,   0,   0,   0,   0,   7,   7,   7,   7,   1, 109,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 170,   7,   7, 170, 171,   0,
-      7,   7,   7,  76, 100,   7,   7,   7,   7, 172,   0,   0,   7,   7,   7,  18,
-     24,   7,   7,   8,  47,   1,   0, 127,   7, 127,  83, 119,   0,   0,   0,   0,
-    173,   7,   7, 174, 102,   1, 175,   7,  76, 176,   1,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   7, 119,
-      7,   7,   7,   7,   7,   7,   7,   7,   7,   1,   0,   0,   0,   0,   0,   0,
-      7,   7,   7,   7,   7,   7,  76,   0,   7,   7,   7,   7,   7,   7,   7,   7,
-      7,   7,   7,   7,  96,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      7,   7,  76,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      7,   7,   7,   7, 119,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      7,   7,   7,  18,   7,  76,   1,   0,   0,   0,   0,   0,   0,   7,  28,  95,
-      7,   7,   7, 119,  96,   1,  31, 177,   7,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   7,   7,   7,   7,   0,   0,   0,   0,   0,   0,   0,   0,
-      7,   7,   7,   7,   3,   7,   7,   7, 118,   7,   0,   0,   0,   0, 178,   0,
-      7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7, 102,
-      7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,  21,
-      7,  76,   0,   0,   0,  21, 179,   7,   7,   7,   7,   7,   7,   7,   7,   7,
-      7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,  29,
-      7,   7,   7,   7,   7,   7,   4,  84,  18, 180,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0, 181, 182, 183,   0, 184,   0,   0,   0,   0,   0,
-      0,   0,   0,   0, 185,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      7,   7,   7,   7,   7,  85,   7,   7,   7,  58, 186, 187, 188,   7,   7,   7,
-    189, 190,   7, 191, 192,  59,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
-      7,   7,   7,   7,   7,   7,   7,   7,   7,   7, 167,   7,  59,  88,   7,  88,
-      7,  85,   7,  85,  76,   7,  76,   7,  24,   7,  24,   7, 193,   7,   7,   7,
-      7,   7,   7, 135,   7,   7,  84, 194, 110, 101,   2,   0,   0,   0,   0,   0,
-      8, 128, 195,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      7,   7,  84,  28, 196,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   7,   7,   7,   1,
-      7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,  95, 119,   0,   0,
-      7,   7,   7,   7,  29,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-    188,   7, 197, 198, 199, 200, 201, 202, 104,  29, 203,  29,   0,   0,   0,   0,
-      7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7, 119,   0,   0,
-      7,   7,   7,  95,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
-      7,  28,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
-      7,   7,   7,   7,   7,   7,   7,   7,   7,   7,  10,   7,   7,   7,   7,   7,
-      7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,  47,   0,
-      7,  28,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-};
+RE_UINT32 re_get_lowercase(RE_UINT32 codepoint) {
+    RE_UINT32 field_2;
+    RE_UINT32 field_1;
+    RE_UINT32 field_0;
+    RE_UINT32 offset;
+    RE_UINT32 v;
 
-static RE_UINT8 re_xid_continue_stage_4[] = {
-      0,   0, 255,   3, 254, 255, 255, 135, 255,   7,   0,   4, 160,   4, 255, 255,
-    127, 255, 195, 255,   3,   0,  31,  80, 223, 184, 192, 215, 251, 255, 191, 255,
-    251, 252, 127,   2, 255,   1, 255, 191, 182,   0,   7,   0, 255, 195, 239, 159,
-    255, 253, 255, 159, 255, 231,  63,  36, 255,  63, 255,  15, 223,  63, 248, 255,
-    207, 255, 249, 255, 197, 243, 159, 121, 128, 176,   3,  80, 238, 135, 109, 211,
-    135,  57,   2,  94, 192, 255,  63,   0, 238, 191, 237, 243, 191,  59,   1,   0,
-      0, 254, 238, 159, 159,  57, 192, 176,   2,   0, 236, 199,  61, 214,  24, 199,
-    199,  61, 129,   0, 255, 223, 253, 255, 255, 227, 223,  61,  96,   7, 239, 223,
-    239, 243,  96,  64,   6,   0, 223, 125, 240, 128,   0, 252, 236, 255, 127, 252,
-    251,  47, 127, 132,  95, 255,  12,   0, 255, 127, 214, 247, 175, 255,  95,  63,
-    255, 243,   0,   3, 160, 194, 255, 254, 255,  31, 223, 255,  64,   0, 191,  32,
-    255, 247, 255,  61, 127,  61,  61, 127,  61, 255,  63,  63, 255, 199,  31,   0,
-     15,   0,  13,   0, 143,  48,   0,  56, 128,   0,   0, 248, 255,   0, 247, 255,
-    255, 251, 255, 170, 223,  95, 220,  31, 207,  15,   0, 128,  16,   0,   2, 128,
-    226, 255, 132, 252,  47,  63,  80, 253, 224,  67,  31, 248, 255, 128, 127,   0,
-    127, 127, 224,   0,  62,  31, 127, 230, 224, 255, 240, 191, 128, 255, 252, 255,
-    255, 249, 124,   0, 255, 232,   1, 128, 126, 126, 126,   0, 255,  55, 127, 248,
-    248, 224, 127,  95, 219, 255, 240, 255,  24,   0,   0, 224, 138, 170, 252, 252,
-    252,  28, 255, 239, 255, 183,   0,  32,  15, 255,  62,   0,  63, 253, 191, 145,
-     55,   0, 255, 192, 111, 240, 239, 254,  63, 135, 112,   0,  79,   0,  31,  30,
-    255,  23, 255,  64, 127, 189, 237, 251, 129, 224, 207,  31, 191,   0,  63, 255,
-      0,  63,  17,   0, 255, 252,  27,   0, 255,  35, 127, 251, 127, 180, 191, 253,
-    251,   1, 255, 224,  11,   0, 240,   0, 255,  99, 224, 227,   7, 248, 231,  15,
-      0,  60,  28,   0, 100, 222, 255, 235, 239, 255, 191, 231, 223, 223, 255, 123,
-     95, 252, 247, 207,  32,   0, 219,   7, 255,  67, 150, 254, 247,  10, 132, 234,
-    150, 170, 150, 247, 247,  94, 238, 251,
-};
+    field_2 = codepoint >> 10;
+    field_1 = (codepoint >> 5) & 0x1F;
+    field_0 = (codepoint >> 3) & 0x3;
+    offset = codepoint & 0x7;
 
-/* XID_Continue: 2920 bytes. */
-
-RE_UINT32 re_get_xid_continue(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-
-    f = ch >> 12;
-    code = ch ^ (f << 12);
-    pos = (RE_UINT32)re_xid_continue_stage_1[f] << 4;
-    f = code >> 8;
-    code ^= f << 8;
-    pos = (RE_UINT32)re_xid_continue_stage_2[pos + f] << 4;
-    f = code >> 4;
-    code ^= f << 4;
-    pos = (RE_UINT32)re_xid_continue_stage_3[pos + f] << 4;
-    pos += code;
-    value = (re_xid_continue_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1;
-
-    return value;
-}
+    v = re_lowercase_table_1[field_2];
+    v = re_lowercase_table_2[(v << 5) | field_1];
+    v = re_lowercase_table_3[(v << 2) | field_0];
 
-/* Default_Ignorable_Code_Point. */
+    return (v >> offset) & 0x1;
+}
 
-static RE_UINT8 re_default_ignorable_code_point_stage_1[] = {
-    0, 1, 2, 2, 2, 2, 2, 3, 2, 2, 2, 2, 2, 4, 5, 2,
+/* Math. */
+static RE_UINT8 re_math_table_1[] = {
+    0, 1, 2, 2, 2, 2, 2, 2, 3, 4, 5, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 6, 7,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 8, 2, 2, 2, 2, 2, 9, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
     2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
     2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
     2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
     2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
     2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
     2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    6, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2
 };
 
-static RE_UINT8 re_default_ignorable_code_point_stage_2[] = {
-     0,  1,  2,  3,  2,  2,  2,  2,  4,  2,  2,  5,  6,  2,  2,  2,
-     7,  2,  2,  2,  2,  2,  2,  2,  8,  2,  2,  2,  2,  2,  2,  2,
-     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
-     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  9,
-     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2, 10,  2,
-     2,  2,  2,  2,  2,  2,  2,  2, 11,  2,  2,  2,  2,  2,  2,  2,
-    12, 12, 12, 12, 12, 12, 12, 12,  2,  2,  2,  2,  2,  2,  2,  2,
+static RE_UINT8 re_math_table_2[] = {
+     0,  1,  2,  3,  0,  4,  5,  5,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  6,  7,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     8,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     9, 10, 11, 12, 13,  0, 14, 15, 16, 17, 18,  0, 19, 20, 21, 22,
+    23, 23, 23, 23, 23, 23, 23, 23, 24, 25,  0, 26, 27, 28, 29, 30,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 31, 32, 33,
+    34,  0, 35, 36,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 23, 23,
+     0,  0,  0,  0,  0,  0,  0,  0, 23, 23, 23, 23, 23, 23, 23, 23,
+    23, 23, 23, 23, 23, 23, 23, 23,  0, 19, 37,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0, 38,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0, 39,  0,  0,  0,  0,  1,  3,  3,  0,  0,  0,  0, 40,
+    23, 23, 41, 23, 42, 43, 44, 23, 45, 46, 47, 23, 23, 23, 23, 23,
+    23, 23, 23, 23, 23, 48, 23, 23, 23, 23, 23, 23, 23, 23, 49, 23,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    44, 50, 51, 52, 53, 54,  0, 55,  0,  0,  0,  0,  0,  0,  0,  0
 };
 
-static RE_UINT8 re_default_ignorable_code_point_stage_3[] = {
-     0,  0,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  2,  0,  0,
-     0,  0,  0,  0,  0,  0,  0,  0,  3,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  4,  0,  0,  0,  0,  0,  0,  0,  0,  5,  0,
-     6,  0,  0,  0,  0,  0,  0,  0,  7,  8,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  9,  0,  0, 10,  0,  0, 11,  0,  0, 12, 13,
-     0,  0, 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 15,  0,  0,
-    16, 16, 16, 16, 16, 16, 16, 16,
+static RE_UINT8 re_math_table_3[] = {
+      0,   0,   0,   0,   0,   8,   0, 112,   0,   0,   0,  64,   0,   0,   0,  80,
+      0,  16,   2,   0,   0,   0, 128,   0,   0,   0,  39,   0,   0,   0, 115,   0,
+    192,   1,   0,   0,   0,   0,  64,   0,   0,   0,  28,   0,  17,   0,   4,   0,
+     30,   0,   0, 124,   0, 124,   0,   0,   0,   0, 255,  31,  98, 248,   0,   0,
+    132, 252,  47,  63,  16, 179, 251, 241, 255,  11,   0,   0,   0,   0, 255, 255,
+    255, 126, 195, 240, 255, 255, 255,  47,  48,   0, 240, 255, 255, 255, 255, 255,
+      0,  15,   0,   0,   3,   0,   0,   0,   0,   0,   0,  16,   0,   0,   0, 248,
+    255, 255, 191,   0,   0,   0,   1, 240,   7,   0,   0,   0,   3, 192, 255, 240,
+    195, 140,  15,   0, 148,  31,   0, 255,  96,   0,   0,   0,   5,   0,   0,   0,
+     15, 224,   0,   0, 159,  31,   0,   0,   0,   2,   0,   0, 126,   1,   0,   0,
+      4,  30,   0,   0, 255, 255, 223, 255, 255, 255, 255, 223, 100, 222, 255, 235,
+    239, 255, 255, 255, 191, 231, 223, 223, 255, 255, 255, 123,  95, 252, 253, 255,
+     63, 255, 255, 255, 255, 207, 255, 255, 150, 254, 247,  10, 132, 234, 150, 170,
+    150, 247, 247,  94, 255, 251, 255,  15, 238, 251, 255,  15,   0,   0,   3,   0
 };
 
-static RE_UINT8 re_default_ignorable_code_point_stage_4[] = {
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  32,   0,   0,
-      0, 128,   0,   0,   0,   0,   0,   0,   0,   0,   0,  16,   0,   0,   0,   0,
-      0,   0,   0, 128,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,  48,   0,
-      0, 120,   0,   0,   0,   0,   0,   0,   0, 248,   0,   0,   0, 124,   0,   0,
-      0,   0,   0,   0, 255, 255,   0,   0,   0,   0,   0,   0,  16,   0,   0,   0,
-    255, 255,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 128,
-      0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0, 255,   1,
-      0,   0,   0,   0,  15,   0,   0,   0,   0,   0,   0,   0,   0,   0, 248,   7,
-    255, 255, 255, 255, 255, 255, 255, 255,
-};
+RE_UINT32 re_get_math(RE_UINT32 codepoint) {
+    RE_UINT32 field_2;
+    RE_UINT32 field_1;
+    RE_UINT32 field_0;
+    RE_UINT32 offset;
+    RE_UINT32 v;
+
+    field_2 = codepoint >> 10;
+    field_1 = (codepoint >> 5) & 0x1F;
+    field_0 = (codepoint >> 3) & 0x3;
+    offset = codepoint & 0x7;
+
+    v = re_math_table_1[field_2];
+    v = re_math_table_2[(v << 5) | field_1];
+    v = re_math_table_3[(v << 2) | field_0];
 
-/* Default_Ignorable_Code_Point: 488 bytes. */
-
-RE_UINT32 re_get_default_ignorable_code_point(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-
-    f = ch >> 13;
-    code = ch ^ (f << 13);
-    pos = (RE_UINT32)re_default_ignorable_code_point_stage_1[f] << 4;
-    f = code >> 9;
-    code ^= f << 9;
-    pos = (RE_UINT32)re_default_ignorable_code_point_stage_2[pos + f] << 3;
-    f = code >> 6;
-    code ^= f << 6;
-    pos = (RE_UINT32)re_default_ignorable_code_point_stage_3[pos + f] << 6;
-    pos += code;
-    value = (re_default_ignorable_code_point_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1;
-
-    return value;
+    return (v >> offset) & 0x1;
 }
 
-/* Grapheme_Extend. */
+/* NFC_Quick_Check. */
+static RE_UINT8 re_nfc_quick_check_table_1[] = {
+     0,  1,  2,  3,  4,  5,  6,  7,  8,  5,  9,  5, 10,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5, 11,  5,
+     5,  5,  5,  5, 12, 13, 14,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5, 15,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5, 16,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5
+};
 
-static RE_UINT8 re_grapheme_extend_stage_1[] = {
-     0,  1,  2,  2,  2,  3,  2,  4,  5,  2,  2,  6,  2,  7,  8,  9,
-     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
-     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
-     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
-     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
-     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
-     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
-    10,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
-     2,  2,  2,  2,  2,  2,  2,  2,
+static RE_UINT8 re_nfc_quick_check_table_2[] = {
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  1,  2,  3,  4,  5,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  6,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  7,  8,  0,  0,  9, 10,  0,
+     0, 11, 12,  0,  0,  0,  0,  0,  0,  9, 13,  0,  0,  9, 14,  0,
+     0,  0, 15,  0,  0,  0, 16,  0,  0,  9, 14,  0,  0,  0, 17,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 18, 19, 20, 21,  0,  0,
+     0, 22,  0,  0,  0,  0,  0,  0,  0,  0,  0, 23,  0, 24, 25,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0, 26,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 27,  0, 28, 29, 30,
+    31,  0,  0,  0,  0,  0,  0,  0,  0, 32,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0, 33,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0, 34,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0, 35,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0, 36, 36, 36, 36, 36, 36, 36, 36,
+    37, 38, 36, 39, 36, 36, 40,  0, 41, 42, 43,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0, 44,  0,  0,  0, 45,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  9, 14,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0, 46,  0,  0,  0,  0,  0,  0,  0, 47,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0, 48,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 49, 50,  0, 51, 52,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
+    53,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0
+};
+
+static RE_UINT8 re_nfc_quick_check_table_3[] = {
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 2,
+    1, 2, 1, 2, 2, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1,
+    1, 1, 1, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 2, 2, 1,
+    2, 2, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1,
+    0, 0, 2, 0, 0, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1,
+    1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 0, 0, 1, 0,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 2, 2, 1, 1, 1, 1, 0, 0, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2,
+    1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1,
+    1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1,
+    1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1,
+    1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1,
+    1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1,
+    1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1,
+    0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 1, 1, 1, 1, 1,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1,
+    0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
+    0, 1, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1,
+    0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 2, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0,
+    0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0,
+    0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1
 };
 
-static RE_UINT8 re_grapheme_extend_stage_2[] = {
-     0,  0,  0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13,
-    14,  0,  0, 15,  0,  0,  0, 16, 17, 18, 19, 20, 21, 22,  0,  0,
-    23,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 24, 25,  0,  0,
-    26,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+RE_UINT32 re_get_nfc_quick_check(RE_UINT32 codepoint) {
+    RE_UINT32 field_2;
+    RE_UINT32 field_1;
+    RE_UINT32 field_0;
+    RE_UINT32 v;
+
+    field_2 = codepoint >> 10;
+    field_1 = (codepoint >> 5) & 0x1F;
+    field_0 = codepoint & 0x1F;
+
+    v = re_nfc_quick_check_table_1[field_2];
+    v = re_nfc_quick_check_table_2[(v << 5) | field_1];
+    v = re_nfc_quick_check_table_3[(v << 5) | field_0];
+
+    return v;
+}
+
+/* NFD_Quick_Check. */
+static RE_UINT8 re_nfd_quick_check_table_1[] = {
+     0,  1,  2,  3,  4,  5,  6,  7,  8,  5,  9,  5, 10,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 12,  5,  5,  5,  5,  5,  5,  5,  5, 13,  5,
+     5,  5,  5,  5, 14, 15, 16,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5, 17,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5, 18,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5
+};
+
+static RE_UINT8 re_nfd_quick_check_table_2[] = {
+     0,  0,  0,  0,  0,  0,  1,  2,  3,  4,  5,  6,  0,  7,  8,  9,
+    10, 11,  0,  0,  0,  0,  0,  0,  0,  0, 12, 13, 14, 15, 16,  0,
+    17, 18, 19, 20,  0,  0, 21, 22,  0,  0,  0,  0,  0,  0,  0,  0,
+     0, 23,  0,  0,  0,  0, 24,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0, 25, 26,  0,  0,  0, 27,  0,
+     0, 28, 29,  0,  0,  0,  0,  0,  0,  0, 30,  0, 31,  0, 32,  0,
+     0,  0, 33,  0,  0,  0, 34,  0,  0,  0, 32,  0,  0,  0, 35,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 36, 37, 38, 39,  0,  0,
+     0, 40,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0, 27,  0, 28, 29, 30, 31,  0,  0,  0,  0,
      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 32,  0,  0, 33, 34,
-     0, 35, 36, 37,  0,  0,  0,  0,  0,  0, 38,  0,  0, 39,  0, 40,
-    41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51,  0, 52, 53, 54,  0,
-     0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 55, 56,  0,  0,  0, 57,
+     0,  0,  0,  0,  0,  0,  0,  0, 41, 42, 43,  0,  0,  0,  0,  0,
      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    44, 44, 44, 44, 45, 44, 44, 46, 47, 44, 48, 49, 44, 50, 51, 52,
+    53,  0,  0,  0,  0,  0,  0,  0,  0, 54,  0,  0, 55, 56, 57,  0,
+    58, 59, 60, 61, 62, 63,  0, 64,  0, 65,  0,  0,  0,  0,  0,  0,
      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 58,  0,  0,  0,
+     0,  0,  0,  0,  0,  0, 66,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0, 67, 68, 13, 67, 68, 69,  0,  0,  0,  0,  0,  0,  0,  0,
      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0, 59, 60,  0,  0,  0,  0,  0,  0,  0, 61,  0,  0,  0,  0,  0,
-    62, 56, 63,  0,  0,  0,  0,  0, 64, 65,  0,  0,  0,  0,  0,  0,
+    44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44,
+    44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44,
+    44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44,
+    44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 70,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0, 44, 44, 44, 44, 44, 44, 44, 44,
+    71, 72, 44, 73, 44, 44, 46,  0, 74, 75, 76,  0,  0,  0,  0,  0,
+     0,  0,  0,  0, 77, 78,  0,  0,  0, 79,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 80,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0, 81,  0,  0,  0,  0,  0,  0,  0, 55,  0,  0,
      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    66, 67,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0, 82,  0,  0,  0,  0,  0,  0,
      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-};
-
-static RE_UINT8 re_grapheme_extend_stage_3[] = {
-      0,   0,   0,   0,   0,   0,   0,   0,   1,   1,   1,   2,   0,   0,   0,   0,
-      0,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   4,   5,   6,   0,
-      7,   0,   8,   9,   0,   0,  10,  11,  12,  13,  14,   0,   0,  15,   0,  16,
-     17,  18,  19,   0,   0,   0,  20,  21,  22,  23,  24,  25,  26,  27,  28,  29,
-     30,  31,  32,  33,  30,  31,  34,  35,  26,  36,  37,  25,  38,  39,  40,   0,
-     41,  42,  43,  25,  26,  44,  45,  25,  46,  47,  28,  25,   0,   0,  48,   0,
-      0,  49,  50,   0,   0,  51,  52,   0,  53,  54,   0,  55,  56,  57,  58,   0,
-      0,  59,  60,  61,  62,   0,   0,   0,   0,   0,  63,   0,   0,   0,   0,   0,
-     64,  64,  65,  65,   0,  66,  67,   0,  68,   0,   0,   0,  69,  70,   0,   0,
-      0,  71,   0,   0,   0,   0,   0,   0,  72,   0,  73,  74,   0,  75,   0,   0,
-     76,  77,  38,  78,  46,  79,   0,  80,   0,  81,   0,   0,   0,   0,  82,  83,
-      0,   0,   0,   0,   0,   0,   1,  84,  85,   0,   0,   0,   0,   0,  13,  86,
-      0,   0,   0,   0,   0,   0,   0,  87,   0,   0,   0,  88,   0,   0,   0,   1,
-      0,  89,   0,   0,  90,   0,   0,   0,   0,   0,   0,  91,  42,   0,   0,  92,
-     93,  69,   0,   0,   0,   0,  94,  95,   0,  96,  97,   0,  22,  98,   0,  99,
-      0, 100, 101,  31,   0, 102,  26, 103,   0,   0,   0,   0,   0,   0,   0, 104,
-     39,   0,   0,   0,   0,   0,   0,   0,   2,   2,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,  42,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 105,
-      0,   0,   0,   0,   0,   0,   0, 106,   0,   0,   0, 107,   0,   0,   0,   0,
-    108, 109,   0,   0,   0,   0,   0,  69,   0, 110,   0,   0,   0,   0,   0,   0,
-      0,   0,  15,   0,   0,   0,   0,   0,  26, 111, 112,  88,  46, 113,   0,   0,
-     22, 114,   0, 115,  46, 116, 117,   0,   0, 118,   0,   0,   0,   0,  88, 119,
-     46,  47, 120, 121,   0,   0,   0,   0,   0, 111, 122,   0,   0, 123, 124,   0,
-      0,   0,   0,   0,   0, 125, 126,   0,   0, 127, 106,   0,   0, 128,   0,   0,
-     63, 129,   0,   0,   0,   0,   0,   0,   0, 130,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0, 131, 106, 132, 133, 134,   0, 135,   0,   0,   0,
-      0, 136,   0,   0, 137, 138,   0,   0,   0, 139, 140,   0, 141,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0, 142,   0,   0,   0,   0,   0,   0,   0, 143,
-      0, 144,   0,   0,   0,   0,   0,   0,   0,   0, 145,   0, 146,   0,   0,   0,
-      0,   0,   0,   0, 147,   0,   0,   0,   0,   0,   0, 148, 149, 150,   0,   0,
-      0,   0, 151,   0,   0,   0,   0,   0,   1, 152,   1, 153, 154, 155,   0,   0,
-    156, 157,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 158,
-      0,   0,   0,   0,   0,   0, 144,   0,   0,   0, 159,   0,   0,   0,   0,   0,
-      0,   1,   1,   1,   0,   0,   0,   0,   1,   1,   1,   1,   1,   1,   1,   2,
-};
-
-static RE_UINT8 re_grapheme_extend_stage_4[] = {
-      0,   0,   0,   0, 255, 255, 255, 255, 255, 255,   0,   0, 248,   3,   0,   0,
-      0,   0, 254, 255, 255, 255, 255, 191, 182,   0,   0,   0,   0,   0, 255,   7,
-      0, 248, 255, 255,   0,   0,   1,   0,   0,   0, 192, 159, 159,  61,   0,   0,
-      0,   0,   2,   0,   0,   0, 255, 255, 255,   7,   0,   0, 192, 255,   1,   0,
-      0, 248,  15,  32,   0,   0, 192, 251, 239,  62,   0,   0,   0,   0,   0,  14,
-      0,   0, 248, 255, 251, 255, 255, 255,   7,   0,   0,   0,   0,   0,   0,  20,
-    254,  33, 254,   0,  12,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,  80,
-     30,  32, 128,   0,  12,   0,   0,  64,   6,   0,   0,   0,   0,   0,   0,  16,
-    134,  57,   2,   0,   0,   0,  35,   0, 190,  33,   0,   0,  12,   0,   0, 252,
-      0,   0,   0, 208,  30,  32, 192,   0,   4,   0,   0,   0,   0,   0,   0,  64,
-      1,  32, 128,   0,  17,   0,   0,   0,   0,   0,   0, 192, 193,  61,  96,   0,
-      0,   0,   0, 144,  68,  48,  96,   0,   3,   0,   0,   0,   0,   0,   0,  88,
-      0, 132,  92, 128,   0,   0, 242,   7, 128, 127,   0,   0,   0,   0, 242,  31,
-      0,  63,   0,   0,   0,   0,   0,   3,   0,   0, 160,   2,   0,   0, 254, 127,
-    223, 224, 255, 254, 255, 255, 255,  31,  64,   0,   0,   0,   0, 224, 253, 102,
-      0,   0,   0, 195,   1,   0,  30,   0, 100,  32,   0,  32,   0,   0,   0, 224,
-      0,   0,  28,   0,   0,   0,  12,   0,   0,   0, 176,  63,  64, 254,  15,  32,
-      0,  56,   0,   0,  96,   0,   0,   0,   0,   2,   0,   0, 135,   1,   4,  14,
-      0,   0, 128,   9,   0,   0,  64, 127, 229,  31, 248, 159,   0,   0, 255, 127,
-     15,   0,   0,   0,   0,   0, 240,  23,   0, 248,  15,   0,  60,  59,   0,   0,
-     64, 163,   3,   0,   0, 240, 207,   0,   0,   0, 247, 255, 253,  33,  16,   3,
-    255, 255, 255, 251,   0,  16,   0,   0, 255, 255,   1,   0,   0, 128,   3,   0,
-      0,   0,   0, 128,   0, 252,   0,   0,   0,   0,   0,   6,   0, 128, 247,  63,
-      0,   0,   3,   0,  68,   8,   0,   0,  48,   0,   0,   0, 255, 255,   3, 128,
-    192,  63,   0,   0, 128, 255,   3,   0,   0,   0, 200,  51,  32,   0,   0,   0,
-      0, 126, 102,   0,   8,  16,   0,   0,   0,   0, 157, 193,   0,  48,  64,   0,
-     32,  33,   0,   0,   0,   0,   0,  32,   1,   0,   0,   0,   0,   0, 192,   7,
-    110, 240,   0,   0,   0,   0,   0, 135, 240,   0,   0,   0,   0,   0,   0, 255,
-    127,   0,   0,   0,   0,   0, 120,   6, 128, 239,  31,   0,   0,   0,   8,   0,
-      0,   0, 192, 127,   0,  30,   0,   0,   0, 128, 211,  64, 248,   7,   0,   0,
-      1,   0, 128,   0, 192,  31,  31,   0,  92,   0,   0,  64,   0,   0, 249, 165,
-     13,   0,   0,   0,   0, 128,  60, 176,   1,   0,   0,  48,   0,   0, 248, 167,
-      0,  40, 191,   0, 188,  15,   0,   0,   0, 128, 255,   6,   0,   0, 240,  12,
-    254,   7,   0,   0,   0,   0, 248, 121, 128,   0, 126,  14,   0, 252, 127,   3,
-      0,   0, 127, 191,   0,   0, 252, 255, 255, 252, 109,   0,   0,   0, 126, 180,
-    191,   0,   0,   0,   0,   0, 163,   0,   0,   0,  24,   0,   0,   0,  31,   0,
-      0,   0, 127,   0,   0, 128,   0,   0,   0, 128,   7,   0,   0,   0,   0,  96,
-    160, 195,   7, 248, 231,  15,   0,   0,   0,  60,   0,   0,  28,   0,   0,   0,
-    255, 255, 127, 248, 255,  31,  32,   0,  16,   0,   0, 248, 254, 255,   0,   0,
-    127, 255, 255, 249, 219,   7,   0,   0,   0, 240,   0,   0, 240,   7,   0,   0,
-};
-
-/* Grapheme_Extend: 1672 bytes. */
-
-RE_UINT32 re_get_grapheme_extend(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-
-    f = ch >> 13;
-    code = ch ^ (f << 13);
-    pos = (RE_UINT32)re_grapheme_extend_stage_1[f] << 5;
-    f = code >> 8;
-    code ^= f << 8;
-    pos = (RE_UINT32)re_grapheme_extend_stage_2[pos + f] << 3;
-    f = code >> 5;
-    code ^= f << 5;
-    pos = (RE_UINT32)re_grapheme_extend_stage_3[pos + f] << 5;
-    pos += code;
-    value = (re_grapheme_extend_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1;
-
-    return value;
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 83, 84,  0, 85, 86,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44,
+    49,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0
+};
+
+static RE_UINT8 re_nfd_quick_check_table_3[] = {
+    255, 255, 255, 255,  64,   0, 129, 193,  64,   0, 129,  65,   0,   0,   3,   0,
+    192,   0,  14, 129,   7,  14,  12,   0, 192,   0,   0, 128, 252, 127, 254, 255,
+    255,  31,   0,  32,  48,   0, 206,   0,   0,   0,   0,  48,  63,   0, 240, 255,
+    228, 255, 255, 255, 255, 255, 239, 191,  31,  40, 254, 255, 255,   3, 254, 255,
+    255, 131, 231, 255, 116, 143, 255, 253, 255, 255, 255, 253, 255, 255, 116, 143,
+    255, 255,  63, 255, 249, 255,  48,   3,   3,   3, 192, 252, 131, 255, 255, 255,
+    250, 255, 247, 255, 255, 253, 237, 255, 255, 255, 255,   0, 255, 231, 255,  79,
+    255, 255, 183, 255, 255, 255, 255, 177, 255, 230, 255, 207, 255, 255, 239, 255,
+    255, 227, 255, 255, 255, 254, 255, 255, 126, 242, 255, 255, 255, 255, 255, 139,
+    247, 223, 123, 239, 255, 253, 151, 254, 253, 255, 247, 223, 123, 239, 255, 253,
+    191, 255, 255, 255, 191, 170, 251, 255, 255, 255, 255, 215, 244, 255, 255, 255,
+      0,   0,   0,   0,   0,   0,   0, 244,   0,   0,   0, 252,   0,   0, 192, 192,
+    192, 192,   0,  85,   0,   0,   0, 192,   0,   0,  32, 160,  33,   0,  48,  16,
+      0,   0,  35, 192, 252, 255, 255, 255, 191, 243, 255, 255, 255, 255, 255, 243,
+    255, 191, 255, 255, 255,  31, 255, 255, 239, 237, 255, 255, 175, 255, 255, 255,
+    109, 253, 255, 255, 250,  31, 204, 252, 204, 252, 255, 255, 255,  15, 255, 255,
+    240, 195, 255, 255, 255, 249, 255, 255, 255, 255, 255, 239, 255, 175, 170, 170,
+     90, 253,  36, 201, 255, 255, 111, 184, 240, 255, 255, 255,   0, 192,  26, 128,
+    154,   3,   0,   0,   0, 192,   0,   0, 255, 255, 255,  95, 255,   3, 128, 160,
+     36, 128, 255, 255, 255, 255, 255, 235, 255, 247, 255, 255, 255,  63, 255, 255,
+    255, 231, 255, 255, 255, 255, 255, 167, 255, 255, 255, 254, 255, 255, 255,  63,
+    224, 255, 255, 255, 255, 255, 255,   7, 254, 255, 255, 255
+};
+
+RE_UINT32 re_get_nfd_quick_check(RE_UINT32 codepoint) {
+    RE_UINT32 field_2;
+    RE_UINT32 field_1;
+    RE_UINT32 field_0;
+    RE_UINT32 offset;
+    RE_UINT32 v;
+
+    field_2 = codepoint >> 10;
+    field_1 = (codepoint >> 5) & 0x1F;
+    field_0 = (codepoint >> 3) & 0x3;
+    offset = codepoint & 0x7;
+
+    v = re_nfd_quick_check_table_1[field_2];
+    v = re_nfd_quick_check_table_2[(v << 5) | field_1];
+    v = re_nfd_quick_check_table_3[(v << 2) | field_0];
+
+    return (v >> offset) & 0x1;
 }
 
-/* Grapheme_Base. */
-
-static RE_UINT8 re_grapheme_base_stage_1[] = {
-    0, 1, 2, 3, 4, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
-    6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
-    6, 6,
-};
-
-static RE_UINT8 re_grapheme_base_stage_2[] = {
-     0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 13, 13,
-    13, 13, 13, 14, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-    13, 13, 13, 13, 13, 13, 13, 15, 13, 16, 17, 13, 13, 13, 13, 13,
-    13, 13, 13, 13, 13, 18, 19, 19, 19, 19, 19, 19, 19, 19, 20, 21,
-    22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 19, 19, 13, 32, 19, 19,
-    19, 33, 19, 19, 19, 19, 19, 19, 19, 19, 34, 35, 13, 13, 13, 13,
-    13, 36, 37, 19, 19, 19, 19, 19, 19, 19, 19, 19, 38, 19, 19, 39,
-    19, 19, 19, 19, 40, 41, 42, 19, 43, 19, 44, 45, 46, 47, 48, 19,
-    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-    13, 13, 13, 13, 13, 13, 13, 13, 13, 49, 13, 13, 13, 50, 51, 13,
-    13, 13, 13, 52, 13, 13, 13, 13, 13, 13, 53, 19, 19, 19, 54, 19,
-    19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
-    19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
-};
-
-static RE_UINT8 re_grapheme_base_stage_3[] = {
-      0,   1,   2,   2,   2,   2,   3,   4,   2,   5,   6,   7,   8,   9,  10,  11,
-     12,  13,  14,  15,  16,  17,  18,  19,  20,  21,  22,  23,  24,  25,  26,  27,
-     28,  29,   2,   2,  30,  31,  32,  33,   2,   2,   2,   2,   2,  34,  35,  36,
-     37,  38,  39,  40,  41,  42,  43,  44,  45,  46,   2,  47,   2,   2,  48,  49,
-     50,  51,   2,  52,   2,   2,   2,   2,  53,   2,   2,   2,   2,   2,   2,   2,
-      2,   2,   2,   2,   2,   2,  54,  55,  56,  57,  58,  59,  60,  61,   2,  62,
-     63,  64,  65,  66,  67,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
-      2,   2,   2,  68,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,  69,
-      2,  70,   2,   2,  71,  72,   2,  73,  74,  75,  76,  77,  78,  79,  80,  81,
-      2,   2,   2,   2,   2,   2,   2,  82,  83,  83,  83,  83,  83,  83,  83,  83,
-     83,  83,   2,   2,  84,  85,  86,  87,   2,   2,  88,  89,  90,  91,  92,  93,
-     94,  95,  96,  97,  83,  98,  99, 100,   2, 101, 102,  83,   2,   2, 103,  83,
-    104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114,  83, 115,  83, 116, 117,
-    118, 119, 120, 121, 122, 123, 124,  83, 125, 126,  83, 127, 128, 129, 130,  83,
-    131, 132,  83, 133, 134, 135,  83,  83, 136, 137, 138, 139,  83, 140,  83, 141,
-      2,   2,   2,   2,   2,   2,   2, 142, 143,   2, 144,  83,  83,  83,  83,  83,
-    145,  83,  83,  83,  83,  83,  83,  83,   2,   2,   2,   2, 146,  83,  83,  83,
-      2,   2,   2,   2, 147, 148, 149, 150,  83,  83,  83,  83, 151, 152, 153, 154,
-      2,   2,   2,   2,   2,   2,   2, 155,   2,   2,   2,   2,   2, 156,  83,  83,
-      2,   2, 157,   2,   2, 158,  83,  83, 159, 160,  83,  83,  83,  83,  83,  83,
-      2, 161, 162, 163, 164, 165, 166,  83, 167, 168, 169,   2,   2, 170,   2, 171,
-      2,   2,   2,   2, 172, 173,  83,  83,  83,  83, 174,  83,  83, 175,  83,  83,
-      2, 176, 177,  83,  83,  83,  83,  83, 178, 179, 180,  83, 181, 182,  83,  83,
-    183, 184, 185, 186, 187,  83,   2,   2,   2,   2,   2,   2,   2, 188, 189, 190,
-    191, 192, 193, 194, 195, 196,  83,  83,   2,   2,   2,   2,   2, 197,   2,   2,
-      2,   2,   2,   2,   2,   2, 198,   2, 199,   2,   2,   2,   2,   2,   2,   2,
-      2,   2,   2,   2,   2, 200,   2,   2,   2,   2,   2,   2,   2,   2,   2, 201,
-      2,   2,   2,   2, 202,  83,  83,  83,
+/* NFKC_Quick_Check. */
+static RE_UINT8 re_nfkc_quick_check_table_1[] = {
+     0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5, 13, 14,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5, 15, 16,
+     5,  5,  5,  5, 17, 18, 19,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5, 20, 21,  5,  5,  5,  5,  5, 22, 23,  5, 24,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5, 25,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5
 };
 
-static RE_UINT8 re_grapheme_base_stage_4[] = {
-      0,   0,   0,   0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 127,
-      0,   0,   0,   0, 255, 223, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
-    255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 255, 252,
-    240, 215, 255, 255, 251, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
-      7, 252, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
-    255, 255, 255, 255, 255, 255, 254, 255, 255, 255, 127, 254, 255, 255, 255, 255,
-    255, 231,   0,   0,   0,   0,   0,  64,  73,   0, 255, 255, 255, 135,  31,   0,
-    192, 255,   0, 200, 255, 255, 255, 255, 255,   7,   0,   0, 255, 255, 254, 255,
-    255, 255, 255, 255, 255, 255, 255, 255, 255, 255,  63,  64,  96, 194, 255, 255,
-    255,  63, 253, 255, 255, 255,   0,   0,   0, 224, 255, 255, 255, 255, 255, 255,
-    255, 255, 255, 255,  63,   0,   2,   0, 255, 255, 255, 255, 255,   7, 240, 199,
-    255, 255,  63,   4,  16,   1, 255, 127, 255, 255, 255,  65, 255,   7,   0,   0,
-      0,   0,   0,   0, 255, 255, 223,  63,   0,   0,   0,   0,   0,   0,   0,   0,
-    248, 255, 255, 255, 255, 255, 255, 235,   1, 222,   1, 255, 243, 255, 255, 255,
-    237, 159, 249, 255, 255, 253, 197, 163, 129,  89,   0, 176, 195, 255, 255,  63,
-    232, 135, 249, 255, 255, 253, 109, 195,   1,   0,   0,  94, 192, 255,  92,   0,
-    232, 191, 251, 255, 255, 253, 237, 227,   1,  26,   1,   0, 195, 255,   3,   2,
-    236, 159, 249, 255, 255, 253, 237,  35, 129,  25,   0, 176, 195, 255, 255,   0,
-    232, 199,  61, 214,  24, 199, 255, 131, 198,  29,   1,   0, 192, 255, 255,   7,
-    238, 223, 253, 255, 255, 253, 255,  35,  30,   0,   0,   7, 195, 255, 128, 255,
-    253, 223, 253, 255, 255, 253, 239,  99, 155,  13,   0,  64, 195, 255,   6,   0,
-    236, 223, 253, 255, 255, 255, 255, 167, 193, 221, 112, 255, 195, 255, 255, 255,
-    236, 255, 127, 252, 255, 255, 251,  47, 127,   0,   3, 127, 192, 255,  28,   0,
-    254, 255, 255, 255, 255, 255,  13, 128, 127, 128, 255,  15,   0,   0,   0,   0,
-    214, 247, 255, 255, 175, 255,  13,  32,  95,   0, 255, 243,   0,   0,   0,   0,
-    255, 255, 255, 252, 255, 255,  95, 253, 255, 254, 255, 255, 255,  31,   0, 128,
-     32,  31,   0,   0,   0,   0,   0, 192, 191, 223, 255,   7,   0,   0,   0,   0,
-    255, 255, 255, 255, 255,  31,   2, 153, 255, 255, 255,  60, 254, 255, 225, 255,
-    155, 223, 255, 223, 255, 255, 255, 255, 191,  32, 255, 255, 255, 255, 255, 255,
-    255, 255, 255, 255, 255, 255, 255, 255, 255,  61, 127,  61, 255, 255, 255, 255,
-    255,  61, 255, 255, 255, 255,  61, 127,  61, 255, 127, 255, 255, 255, 255, 255,
-    255, 255,  61, 255, 255, 255, 255, 255, 255, 255, 255,   7, 255, 255, 255,  31,
-    255, 255, 255,   3, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,  63,  63,
-    255, 255, 255,  31, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,   1,
-    255, 223,   3,   0, 255, 255,  99,   0, 255, 255,   3,   0, 255, 223,   1,   0,
-    255, 255, 255, 255, 255, 255,  79, 192, 191,   1, 240,  31, 255,   3, 255,   3,
-    255,   7, 255,   3, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,   1,
-    159, 255, 255, 255, 255,   5, 255, 255, 255, 255, 255, 255, 255, 255,  63,   0,
-    255, 255, 255, 127, 120,  14, 251,   1, 241, 255, 255, 255, 255,  63,  31,   0,
-    255, 255, 255, 255, 255,  15, 255, 255, 255,   3, 255, 199, 255, 255, 255, 255,
-    255, 255, 127, 198, 255, 255, 255, 255, 255, 255, 191,   0,  26, 224,   7,   0,
-    255,   3, 255,   3, 255,  63,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-    240, 255, 255, 255, 255, 255,  15, 232, 251,  15, 255, 255, 255,   7, 240,  31,
-    252, 255, 255, 255, 195, 196, 255, 255, 255, 255, 255, 255, 191,  92,  12, 240,
-    255, 255, 255, 255, 255,  15,  48, 248, 255, 227, 255, 255, 255, 255, 255, 255,
-    255,   1, 255, 255, 255, 255, 255, 231, 255,   0,   8,   0,   2, 222, 239,   4,
-    255, 255, 255, 255, 255, 255, 255, 255,   0,   0,   0,   0,   0,   0,   0,   0,
-    255, 255,  63,  63, 255, 255, 255, 255,  63,  63, 255, 170, 255, 255, 255,  63,
-    255, 255, 255, 255, 255, 255, 223, 255, 223, 255, 207, 239, 255, 255, 220, 127,
-    255,   7, 255, 255, 255, 128, 255, 255, 255, 255, 255, 255,   0,   0, 243, 255,
-    255, 127, 255,  31, 255, 255, 255, 255,   0,   0,   0,   0,   0,   0,   0,   0,
-    255,  15, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
-    255, 255, 255, 255, 127,   0,   0,   0, 255,   7,   0,   0, 255, 255, 255, 255,
-    255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 207, 255,
-    255, 255,  63, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
-    255, 255, 255, 255, 255, 127, 255, 255, 255, 255, 255, 127, 255, 255, 255, 255,
-    255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 127,  12, 254,
-    255, 255, 255, 255, 191,  32, 255, 255, 255, 255, 255, 255, 255, 128,   1,   0,
-    255, 255, 127,   0, 127, 127, 127, 127, 127, 127, 127, 127,   0,   0,   0,   0,
-    255, 255, 255, 255, 255, 255, 255, 255, 255, 255,   0,   0,   0,   0,   0,   0,
-    255, 255, 255, 251, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,  15,   0,
-    255, 255, 255, 255, 255, 255, 255, 255, 255, 255,  63,   0,   0,   0, 255,  15,
-    255, 255, 255, 255, 255,   3, 255, 255, 254, 255, 255, 255, 255, 255, 255, 255,
-    255, 255, 127, 248, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
-    224, 255, 255, 255, 255, 255, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255,
-    255, 127, 255, 255, 255, 255, 255,   7, 255, 255, 255, 255,  15,   0, 255, 255,
-    255, 255, 255, 127, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
-    255, 255, 255, 255, 255, 255,  63,   0, 255, 255, 255, 255, 255, 255, 255, 255,
-    255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,   0,   0,
-    255,  31, 255, 255, 255, 255, 255, 255, 127,   0, 255, 255, 255, 255, 255, 255,
-    255, 255, 255, 255, 255,  15,   0,   0, 255, 255, 255, 255, 255, 127,   8, 192,
-    255, 255, 255,  63, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 252,   0,
-    255, 255, 255, 255, 255, 255, 255, 255, 124,   0,   0,   0,   0,   0, 128, 255,
-    187, 247, 255, 255, 159,  15, 255,   3, 255, 255, 255, 255, 255, 255, 255,   0,
-    255, 255, 255, 255, 255, 255, 255, 255,  15, 192, 255,   3,   0,   0, 252, 127,
-    255, 255, 255, 255,  63, 192, 255, 255, 127,   0,  12, 128, 255, 255, 255,  31,
-    248, 255, 255, 255, 255, 255,  55, 204, 255, 191, 255, 195, 223, 255, 255, 127,
-    255, 255, 255, 255, 255, 129,  25,   0, 247,  47, 255, 243, 255, 255, 255, 239,
-    255, 255, 255, 255, 255, 255,  98,  62,   5,   0,   0, 248, 255, 207,  63,   0,
-    126, 126, 126,   0, 127, 127, 255, 255, 255, 255, 255, 255, 255,   0, 255, 255,
-    255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 223,  30, 255,   3,
-    255, 255, 255, 255,  15,   0, 255, 255, 127, 248, 255, 255, 255, 255, 255,  15,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-    255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,  63, 255, 255,
-    255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,   3,   0,   0,   0,   0,
-    127,   0, 248, 160, 255, 255, 127,  95, 219, 255, 255, 255, 255, 255, 255, 255,
-    255, 255, 255, 255, 255, 255, 255, 255,   3,   0, 248, 255, 255, 255, 255, 255,
-    255, 255, 255, 255, 255, 255, 255, 255,   0,   0, 255, 255, 255, 255, 255, 255,
-    255, 255, 252, 255, 255, 255, 255, 255, 255,   0,   0,   0,   0,   0, 255,  63,
-      0,   0, 255,   3,   0,   0, 255, 255, 255, 255, 247, 255, 127,  15, 223, 255,
-    255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,  31,
-    254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
-    255, 255, 255,  63, 255, 255, 255, 127, 252, 252, 252,  28, 127, 127,   0,  48,
-    255, 239, 255, 255, 127, 255, 255, 183, 255,  63, 255,  63,   0,   0,   0,   0,
-    255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,   7,
-    135, 255, 255, 255, 255, 255, 143, 255, 255, 255, 255, 255, 255, 255, 255, 255,
-    255, 127, 255,  15,   1,   0,   0,   0,   0,   0, 255, 255, 255, 255, 255,  31,
-    255, 255, 255,  31, 255, 255, 255, 255, 255, 255,   1,   0, 254, 255, 255,  15,
-    255, 255, 255, 255,  15, 224, 255, 255, 255,   7, 255, 255, 255, 255,  63,   0,
-    255, 255, 255, 191, 255, 255, 255, 255,  15, 255,  63,   0,   0,   0,   0,   0,
-    255, 255, 255,  63, 255,   3, 255, 255, 255, 255,  15, 255, 255, 255, 255,  15,
-    255, 255, 255, 255, 255,   0, 255, 255, 255, 255, 255, 255,  15, 128,   0,   0,
-    255, 255, 255, 255, 255, 255, 127,   0, 255, 255,  63,   0, 255,   0,   0,   0,
-     63, 253, 255, 255, 255, 255, 191, 145, 255, 255, 191, 255, 255, 255, 255, 255,
-    255, 255, 255, 127, 128, 255,   0,   0,   0,   0,   0,   0, 255, 255,  55, 248,
-    255, 255, 255, 143, 255, 255, 255, 131,   0,   0,   0,   0,   0,   0,   0,   0,
-    255, 255, 255, 255, 255, 255, 255, 240, 255, 255, 252, 255, 255, 255, 255, 255,
-      1,   0, 239, 254, 255, 255,  63,   0, 255,   1, 255,   1, 255, 255, 255, 255,
-    255, 255, 255, 255,   0,   0,   0,   0, 255, 255, 255, 255,  31, 248, 127,   0,
-    255, 255, 255, 255, 255, 255,  63, 254, 255, 255,  63, 255, 255, 255,   7, 255,
-    255, 255,   3,  30,   0, 254,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-    255, 255, 255, 255, 255, 255, 255, 255, 255,   1,   0,   0,   0,   0,   0,   0,
-    255, 255, 255, 255, 255, 255,   7,   0, 255, 255, 255, 255, 255, 255,   7, 252,
-    255, 255, 255, 255,  15,   0, 255,   3,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 255, 255, 255, 127,
-    255, 255, 255, 255, 255,   0, 255, 255,  63,   0, 254,   3,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 255, 255, 127,   0,
-    253, 255, 255, 255, 255, 255, 255,   0, 128,  63, 252, 255, 255, 255,   0,   0,
-    252, 255, 255, 255, 255, 255, 135, 217,   3,   0, 255, 255, 255,   1, 255,   3,
-    248, 255, 255, 255, 127,  16, 192, 255, 127,   0, 255, 255, 255, 255, 119,   0,
-    252, 255, 255, 255, 255, 255,  63, 128, 255,  33, 255, 255, 254, 255,  31,   0,
-    255, 255, 251, 255, 255, 127,  44,  63,   0,   0,   0,   0,   0,   0,   0,   0,
-    127, 189, 255, 191, 255,   3, 255, 255, 255, 255, 255, 127,   7,   0, 255,   3,
-    236, 159, 249, 255, 255, 253, 237, 163, 158,  57,   1, 224,  15,   0,   0,   0,
-    255, 255, 255, 255, 255, 255, 255,   0, 163, 255, 255, 171,   0,   0,   0,   0,
-    255, 255, 255, 255, 255, 255,   6,  90, 242,   0, 255,   3,   0,   0,   0,   0,
-    255, 255, 255, 255, 255, 127,   3,  79, 254, 255, 255,  15,   0,   0,   0,   0,
-    255, 255, 255, 255, 255, 255,   7,  88,  30,   0, 255,   3, 255,  31,   0,   0,
-    255, 255, 255, 255, 255, 215,  64,   1, 255,   3,   0,   0,   0,   0,   0,   0,
-    255, 255, 255,   7,  67,   0, 255, 255,   0,   0,   0,   0,   0,   0,   0,   0,
-    255, 255, 255, 255, 255, 127,   0,   9,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,   7, 128,
-      0,   0,   0,   0, 255, 252, 255, 255, 255, 255,  15, 240,  30,   0,   0,   0,
-      1, 248, 255, 255, 255, 255,   7, 134, 127,   0, 129, 241, 255, 255, 255, 255,
-    255,   3, 128, 252,   7,   0,   0,   0, 255, 255, 255, 255, 255, 255, 255,   1,
-    255, 253, 255, 255, 255, 255,   0,  64,  63,   0, 255, 255, 255,  31, 255, 255,
-    255, 255,   0,   0,   0,   2,  18,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-    127, 251, 255, 255, 255, 255,   1,   0,  64,   0, 255,   3, 191, 253, 255, 255,
-    255, 127,  88,   1, 255,   3,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 255, 255, 231,   1,
-      0,   0,   0,   0,   0,   0,   0,   0, 255, 255, 255, 255, 255, 255,   3, 128,
-    255, 255, 255,   3,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-    255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 127,  31,   0,
-    255, 255, 255, 255, 255, 255, 255, 255,  15,   0,   0,   0,   0,   0,   0,   0,
-    255, 255, 255, 255, 255, 127,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-    255, 255, 255, 255, 255, 255, 255, 255, 127,   0,   0,   0,   0,   0,   0,   0,
-    255, 255, 255, 255, 255, 255, 255,   1, 255, 255, 255, 127, 255, 195,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 255, 255, 255,  63,  32,   0,
-    255, 255, 255, 255, 255, 255, 128, 255,  63,   0, 255, 251, 251, 255, 255, 224,
-    255, 255,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0, 255, 255, 255, 255, 255, 255, 255, 255,
-    255, 255, 255,   7,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-    255, 255, 255, 255, 255, 255, 255, 255, 255,   7, 255, 255, 255, 255, 255, 255,
-    255,   0, 248, 255,   0,   0,   0,   0,   0,   0,   0,   0,  15,   0,   0,   0,
-    255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,   0,
-    255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,   7,   0,
-    255, 255, 255, 127,   0,   0,   0,   0,   0,   0,   7,   0, 240,   0, 255, 255,
-    255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,  15,
-    255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,   7, 255,  31,
-    255,   1, 255, 147,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-    255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,  63,   0,
-    255, 255, 255, 255, 127, 254, 255, 255, 255, 255, 255, 255,  95,  60,   0,   0,
-     24, 240, 255, 255, 255, 195, 255, 255, 255, 255, 255, 255, 255,   1,   0,   0,
-    255, 255, 255, 255, 255, 255, 255, 255,  35,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 255, 255,  15,   0,
-    255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 127,   0, 255, 255, 255,   1,
-    255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 223, 255, 255, 255, 255, 255,
-    255, 255, 255, 223, 100, 222, 255, 235, 239, 255, 255, 255, 255, 255, 255, 255,
-    191, 231, 223, 223, 255, 255, 255, 123,  95, 252, 253, 255, 255, 255, 255, 255,
-    255, 255, 255, 255,  63, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
-    255, 255, 255, 255, 255, 255, 255, 255, 255, 207, 255, 255, 255, 255, 255, 255,
-      0,   0,   0,   0,   0,   0, 128,   7,   0,   0,   0,   0,   0, 224, 223, 255,
-    239,  15,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-    255, 255, 255, 255, 255,  31, 128,  63, 255, 195,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0, 255, 255, 255, 255, 255,  15, 255, 131,
-    255, 255, 255, 255, 255, 255, 255, 255, 159, 255,   0,   0,   0,   0,   0,   0,
-    255, 255, 255, 255, 255, 255, 255, 255,  15,   8, 255, 195,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 254, 255,
-    255, 255, 255, 255, 255, 255,  31,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-    254, 255, 255, 255, 255, 255, 255,  63,   0,   0,   0,   0,   0,   0,   0,   0,
-    239, 255, 255, 255, 150, 254, 247,  10, 132, 234, 150, 170, 150, 247, 247,  94,
-    255, 251, 255,  15, 238, 251, 255,  15,   0,   0,   0,   0,   0,   0,   3,   0,
-    255, 255, 255, 255, 255,  15, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
-    255, 255,  15,   0, 255, 127, 254, 255, 254, 255, 254, 255, 255, 255,  63,   0,
-    255,  31, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,  31, 255, 255,
-    255, 255, 255, 255, 255,  31,   0,   0,   0,   0,   0,   0, 192, 255, 255, 255,
-      7,   0, 255, 255, 255, 255, 255,  15, 255,   1,   3,   0,  63,   0,   0,   0,
-    255, 255, 255, 255, 255, 255, 255, 255, 255, 255,  63,   0, 255,  31, 255,   7,
-    255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,  15,   0,
-    255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,   1, 255,  15,   0,   0,
-    255,  15, 255, 255, 255, 255, 255, 255, 255,   0, 255,   3, 255, 255, 255, 255,
-    255,   0, 255, 255, 255,  63,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-    255, 239, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 123, 252,
-    255, 255, 255, 255, 231, 199, 255, 255, 255, 231, 255, 255, 255, 255, 255, 255,
-    255, 255, 255, 255, 255, 255, 255, 255, 255, 255,  15,   0, 255,  63,  15,   7,
-      7,   0,  63,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-    255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 127,   0,   0,   0,   0,   0,
-    255, 255, 255, 255, 255, 255,  31,   0, 255, 255, 255, 255, 255, 255, 255, 255,
-    255, 255, 255,  63, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
-    255, 255, 255, 255,   3,   0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
-    255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,   1,   0,   0,   0,
-    255, 255, 255,  63,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+static RE_UINT8 re_nfkc_quick_check_table_2[] = {
+      0,   0,   0,   0,   0,   1,   0,   0,   0,   2,   3,   4,   0,   0,   5,   6,
+      0,   0,   0,   0,   0,   7,   8,   9,  10,  11,  12,  13,  14,   0,  15,  16,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  17,   0,   0,   0,
+      0,   0,  18,  19,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,  20,  21,   0,   0,  22,  23,   0,
+      0,  24,  25,   0,   0,   0,   0,   0,   0,  22,  26,   0,   0,  22,  27,   0,
+      0,   0,  28,   0,   0,   0,  29,   0,   0,  22,  27,   0,   0,   0,  30,   0,
+      0,  31,   0,   0,   0,  31,  32,   0,  33,   0,  34,  35,  36,  37,   0,   0,
+      0,  38,   0,   0,   0,   0,   0,  39,   0,   0,   0,  40,   0,  41,  42,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,  43,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,  44,  45,  46,  47,  48,   0,   0,
+      0,   0,   0,   0,  49,   0,   0,   0,   0,   0,   0,  50,   0,  51,  52,  53,
+     54,  55,  56,  57,  58,  59,   0,   0,  60,  61,  62,  48,  63,   0,   0,   0,
+      0,  64,   0,   0,   0,   0,   0,   0,   0,  65,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,  48,  48,  48,  48,  66,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     33,   0,   0,  67,   0,   0,  39,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,  32,   0,   0,   0,   0,   0,   0,   0,  68,   0,   0,   0,   0,
+      0,   0,   0,   0,   4,   0,   0,  31,  48,  48,  48,  48,  48,  48,  69,   0,
+     70,  71,   0,   0,  72,   0,   0,   4,   0,  73,  48,  48,  74,   0,   0,   0,
+     75,  48,  76,  75,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,  32,   0,   0,   0,   0,   0,   0,  77,   0,   0,   0,  78,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  79,  63,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,  48,  48,  48,  48,  48,  48,  48,  48,
+     80,  81,  48,  82,  48,  48,  83,   0,  84,  85,  86,  48,  48,  87,  88,  48,
+     48,  48,  48,  48,  48,  48,  48,  48,  48,  89,  90,  48,  91,  48,  92,  93,
+     94,  90,  95,  96,  48,  48,  48,  97,  98,  48,  48,  48,  48,  75,  99, 100,
+      0,   0,   0,   0,   0, 101,   0,   0,   0, 102,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,  22,  27,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0, 103,   0,   0,   0,   0,   0,   0,   0, 104,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0, 105,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 106,   9,   0,  47,  70,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     48,  48, 107,  48, 108, 109, 110,  48, 111, 112, 113,  48,  48,  48,  48,  48,
+     48,  48,  48,  48,  48, 114,  48,  48,  48,  48,  48,  48,  48,  48, 115,  48,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    110, 116, 117, 118, 119, 120,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0, 121, 122, 123, 124,  77,   0,   0,   0,
+    125, 126, 127,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  94,
+     48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,
+     89,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0
 };
 
-/* Grapheme_Base: 3946 bytes. */
-
-RE_UINT32 re_get_grapheme_base(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-
-    f = ch >> 15;
-    code = ch ^ (f << 15);
-    pos = (RE_UINT32)re_grapheme_base_stage_1[f] << 5;
-    f = code >> 10;
-    code ^= f << 10;
-    pos = (RE_UINT32)re_grapheme_base_stage_2[pos + f] << 3;
-    f = code >> 7;
-    code ^= f << 7;
-    pos = (RE_UINT32)re_grapheme_base_stage_3[pos + f] << 7;
-    pos += code;
-    value = (re_grapheme_base_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1;
-
-    return value;
-}
-
-/* Grapheme_Link. */
-
-static RE_UINT8 re_grapheme_link_stage_1[] = {
-    0, 1, 2, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+static RE_UINT8 re_nfkc_quick_check_table_3[] = {
     1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
     1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 0,
+    1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1,
     1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1,
-};
-
-static RE_UINT8 re_grapheme_link_stage_2[] = {
-     0,  0,  1,  2,  3,  4,  5,  0,  0,  0,  0,  6,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  7,  0,  0,  0,  0,  0,
-     0,  0,  8,  0,  9, 10, 11, 12,  0,  0,  0,  0,  0,  0,  0,  0,
-};
-
-static RE_UINT8 re_grapheme_link_stage_3[] = {
-     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  1,  0,  1,  0,  1,  0,  1,  0,  1,  0,  1,
-     0,  1,  0,  1,  2,  1,  0,  3,  4,  0,  4,  0,  0,  0,  5,  0,
-     6,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  7,  0,  0,  8,
-     0,  0,  0,  0,  0,  0,  0,  0,  0,  9,  0,  0,  0,  5, 10, 11,
-     0,  0,  0,  0,  0, 12,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    13,  0,  0,  5,  0, 14,  0, 15,  0,  0,  0, 16,  0,  0,  0, 17,
-     0,  0,  0,  0,  0,  0,  0,  0, 12,  0,  0,  0,  0,  0,  0,  0,
-     0, 18, 19,  0, 20,  0,  0, 15, 21,  0,  0, 22,  0,  1,  0,  0,
-     0, 23,  0, 23,  0,  0, 12,  0, 12,  0, 16,  0, 24,  0,  0,  0,
-    19,  0,  0,  0,  0,  0,  0,  9, 25, 26, 27,  0,  0,  0,  0,  0,
-    12,  0,  0,  0,  0, 28, 29,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-};
-
-static RE_UINT8 re_grapheme_link_stage_4[] = {
-      0,   0,   0,   0,   0,   0,   0,   0,   0,  32,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,  24,   0,   4,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   4,  16,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   6,   0,   0,  16,   0,   0,   0,  16,   0,
-      0,   0,   4,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,
-      0,   0,   0,   0,   0,  12,   0,   0,   0,   0,   0,   0,   0,   0,  12,   0,
-      0,   0,   0,   0,   0,   0,   0, 128,  64,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   8,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,  64,   0,   0,   0,   0,   0,   0,  32,   0,   0,
-     64,   0,   0,   0,   0,   0,   0, 128,   0,   0,   0,   0,   0,   0,   0,   2,
-      0,   0,   0,   0,   0,   0,  24,   0,   0,   0,   0,   0,   0,   0,  32,   0,
-      0,   0,   0,   0,   0,   4,   0,   0,   4,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   8,   0,   0,   0,   0,   0,   0,   0,   0,  16,   0,
-    128,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   0,
-     48,   0,   0,   0,   0,   0,   0,   0,   0,   0, 128,   0,   0,   0,   0,   0,
-};
-
-/* Grapheme_Link: 580 bytes. */
-
-RE_UINT32 re_get_grapheme_link(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-
-    f = ch >> 14;
-    code = ch ^ (f << 14);
-    pos = (RE_UINT32)re_grapheme_link_stage_1[f] << 4;
-    f = code >> 10;
-    code ^= f << 10;
-    pos = (RE_UINT32)re_grapheme_link_stage_2[pos + f] << 4;
-    f = code >> 6;
-    code ^= f << 6;
-    pos = (RE_UINT32)re_grapheme_link_stage_3[pos + f] << 6;
-    pos += code;
-    value = (re_grapheme_link_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1;
-
-    return value;
-}
-
-/* White_Space. */
-
-static RE_UINT8 re_white_space_stage_1[] = {
+    1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0,
+    0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0,
+    1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1,
+    0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 2,
+    1, 2, 1, 2, 2, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1,
+    1, 1, 1, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 2, 2, 1,
+    2, 2, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1,
+    0, 0, 2, 0, 0, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1,
+    1, 1, 1, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 0, 0, 1, 0,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 2, 2, 1, 1, 1, 1, 0, 0, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1,
+    1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1,
+    1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1,
+    1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1,
+    1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0,
+    0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 0, 0,
+    1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0,
+    1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 0, 1,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1,
+    1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0,
+    1, 1, 1, 0, 0, 1, 0, 0, 1, 1, 1, 1, 0, 1, 0, 1,
+    1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1,
+    0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0,
+    0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0,
+    0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0,
+    0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
     0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
     1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1,
-};
-
-static RE_UINT8 re_white_space_stage_2[] = {
-    0, 1, 1, 1, 1, 2, 1, 1, 3, 1, 1, 1, 4, 1, 1, 1,
     1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1,
     1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 0, 0, 1, 1, 0,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
+    1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
+    0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
     1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-};
-
-static RE_UINT8 re_white_space_stage_3[] = {
-    0, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 3, 2, 2, 4, 2, 2, 2, 2, 2, 2, 2,
-    3, 2, 2, 2, 2, 2, 2, 2,
-};
-
-static RE_UINT8 re_white_space_stage_4[] = {
-      0,  62,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     32,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-    255,   7,   0,   0,   0, 131,   0,   0,   0,   0,   0, 128,   0,   0,   0,   0,
-};
-
-/* White_Space: 218 bytes. */
-
-RE_UINT32 re_get_white_space(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-
-    f = ch >> 15;
-    code = ch ^ (f << 15);
-    pos = (RE_UINT32)re_white_space_stage_1[f] << 5;
-    f = code >> 10;
-    code ^= f << 10;
-    pos = (RE_UINT32)re_white_space_stage_2[pos + f] << 3;
-    f = code >> 7;
-    code ^= f << 7;
-    pos = (RE_UINT32)re_white_space_stage_3[pos + f] << 7;
-    pos += code;
-    value = (re_white_space_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1;
-
-    return value;
-}
-
-/* Bidi_Control. */
-
-static RE_UINT8 re_bidi_control_stage_1[] = {
     0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
     1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1,
-};
-
-static RE_UINT8 re_bidi_control_stage_2[] = {
-    0, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1,
     1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-};
-
-static RE_UINT8 re_bidi_control_stage_3[] = {
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1,
+    0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
+    0, 1, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0,
     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-};
-
-static RE_UINT8 re_bidi_control_stage_4[] = {
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,  16,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0, 192,   0,   0,   0, 124,   0,   0,   0,   0,   0,   0, 192,   3,   0,   0,
-};
-
-/* Bidi_Control: 162 bytes. */
-
-RE_UINT32 re_get_bidi_control(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-
-    f = ch >> 15;
-    code = ch ^ (f << 15);
-    pos = (RE_UINT32)re_bidi_control_stage_1[f] << 4;
-    f = code >> 11;
-    code ^= f << 11;
-    pos = (RE_UINT32)re_bidi_control_stage_2[pos + f] << 4;
-    f = code >> 7;
-    code ^= f << 7;
-    pos = (RE_UINT32)re_bidi_control_stage_3[pos + f] << 7;
-    pos += code;
-    value = (re_bidi_control_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1;
-
-    return value;
-}
-
-/* Join_Control. */
-
-static RE_UINT8 re_join_control_stage_1[] = {
-    0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1,
+    0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1,
+    0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
     1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1,
-};
-
-static RE_UINT8 re_join_control_stage_2[] = {
-    0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-};
-
-static RE_UINT8 re_join_control_stage_3[] = {
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-};
-
-static RE_UINT8 re_join_control_stage_4[] = {
-     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0, 48,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-};
-
-/* Join_Control: 130 bytes. */
-
-RE_UINT32 re_get_join_control(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-
-    f = ch >> 15;
-    code = ch ^ (f << 15);
-    pos = (RE_UINT32)re_join_control_stage_1[f] << 4;
-    f = code >> 11;
-    code ^= f << 11;
-    pos = (RE_UINT32)re_join_control_stage_2[pos + f] << 4;
-    f = code >> 7;
-    code ^= f << 7;
-    pos = (RE_UINT32)re_join_control_stage_3[pos + f] << 7;
-    pos += code;
-    value = (re_join_control_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1;
-
-    return value;
-}
-
-/* Dash. */
-
-static RE_UINT8 re_dash_stage_1[] = {
-    0, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1,
     1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
     1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1,
     1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1,
-};
-
-static RE_UINT8 re_dash_stage_2[] = {
-    0, 1, 2, 1, 1, 1, 1, 1, 1, 1, 3, 1, 4, 1, 1, 1,
-    5, 6, 1, 1, 1, 1, 1, 7, 8, 1, 1, 1, 1, 1, 1, 1,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1,
+    0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1,
+    0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1,
+    1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0,
+    1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1,
+    0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1,
     1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
     1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1,
     1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 9,
-};
-
-static RE_UINT8 re_dash_stage_3[] = {
-     0,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
-     1,  1,  1,  1,  1,  1,  2,  1,  3,  1,  1,  1,  1,  1,  1,  1,
-     4,  1,  1,  1,  1,  1,  1,  1,  5,  6,  7,  1,  1,  1,  1,  1,
-     8,  1,  1,  1,  1,  1,  1,  1,  9,  3,  1,  1,  1,  1,  1,  1,
-    10,  1, 11,  1,  1,  1,  1,  1, 12, 13,  1,  1, 14,  1,  1,  1,
-};
-
-static RE_UINT8 re_dash_stage_4[] = {
-      0,   0,   0,   0,   0,  32,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   4,   0,   0,   0,   0,   0,  64,   1,   0,   0,   0,   0,   0,   0,   0,
-     64,   0,   0,   0,   0,   0,   0,   0,   0,   0,  63,   0,   0,   0,   0,   0,
-      0,   0,   8,   0,   0,   0,   0,   8,   0,   8,   0,   0,   0,   0,   0,   0,
-      0,   0,   4,   0,   0,   0,   0,   0,   0,   0, 128,   4,   0,   0,   0,  12,
-      0,   0,   0,  16,   0,   0,   1,   0,   0,   0,   0,   0,   1,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   6,   0,   0,   0,   0,   1,   8,   0,   0,   0,
-      0,  32,   0,   0,   0,   0,   0,   0,
-};
-
-/* Dash: 364 bytes. */
-
-RE_UINT32 re_get_dash(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-
-    f = ch >> 14;
-    code = ch ^ (f << 14);
-    pos = (RE_UINT32)re_dash_stage_1[f] << 5;
-    f = code >> 9;
-    code ^= f << 9;
-    pos = (RE_UINT32)re_dash_stage_2[pos + f] << 3;
-    f = code >> 6;
-    code ^= f << 6;
-    pos = (RE_UINT32)re_dash_stage_3[pos + f] << 6;
-    pos += code;
-    value = (re_dash_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1;
-
-    return value;
-}
-
-/* Hyphen. */
-
-static RE_UINT8 re_hyphen_stage_1[] = {
-    0, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
     1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 2, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2,
     1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
     1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1,
-};
-
-static RE_UINT8 re_hyphen_stage_2[] = {
-    0, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1,
-    4, 1, 1, 1, 1, 1, 1, 5, 6, 1, 1, 1, 1, 1, 1, 1,
+    2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
     1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0,
+    1, 1, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0,
+    0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0,
+    0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1,
+    0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0,
+    0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 1,
+    1, 1, 0, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0,
+    1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0,
+    1, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0,
+    0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1,
+    1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
     1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1,
     1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 7,
+    0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1,
+    0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
 };
 
-static RE_UINT8 re_hyphen_stage_3[] = {
-    0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 2, 1, 3, 1, 1, 1, 1, 1, 1, 1,
-    4, 1, 1, 1, 1, 1, 1, 1, 5, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 6, 1, 1, 1, 1, 1, 7, 1, 1, 8, 9, 1, 1,
-};
+RE_UINT32 re_get_nfkc_quick_check(RE_UINT32 codepoint) {
+    RE_UINT32 field_2;
+    RE_UINT32 field_1;
+    RE_UINT32 field_0;
+    RE_UINT32 v;
 
-static RE_UINT8 re_hyphen_stage_4[] = {
-      0,   0,   0,   0,   0,  32,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   4,   0,   0,   0,   0,   0,   0,  64,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   3,   0,   0,   0,   0,   0,   0,   0, 128,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   8,   0,   0,   0,   0,   8,   0,   0,   0,
-      0,  32,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  32,   0,   0,   0,
-};
+    field_2 = codepoint >> 10;
+    field_1 = (codepoint >> 5) & 0x1F;
+    field_0 = codepoint & 0x1F;
 
-/* Hyphen: 308 bytes. */
-
-RE_UINT32 re_get_hyphen(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-
-    f = ch >> 14;
-    code = ch ^ (f << 14);
-    pos = (RE_UINT32)re_hyphen_stage_1[f] << 5;
-    f = code >> 9;
-    code ^= f << 9;
-    pos = (RE_UINT32)re_hyphen_stage_2[pos + f] << 3;
-    f = code >> 6;
-    code ^= f << 6;
-    pos = (RE_UINT32)re_hyphen_stage_3[pos + f] << 6;
-    pos += code;
-    value = (re_hyphen_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1;
-
-    return value;
-}
+    v = re_nfkc_quick_check_table_1[field_2];
+    v = re_nfkc_quick_check_table_2[(v << 5) | field_1];
+    v = re_nfkc_quick_check_table_3[(v << 5) | field_0];
 
-/* Quotation_Mark. */
+    return v;
+}
 
-static RE_UINT8 re_quotation_mark_stage_1[] = {
-    0, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1,
+/* NFKD_Quick_Check. */
+static RE_UINT8 re_nfkd_quick_check_table_1[] = {
+     0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5, 13, 14, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 16,  5,  5,  5,  5,  5,  5,  5,  5, 17, 18,
+     5,  5,  5,  5, 19, 20, 21,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5, 22, 23,  5,  5,  5,  5,  5, 24, 25,  5, 26,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5, 27,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5
 };
 
-static RE_UINT8 re_quotation_mark_stage_2[] = {
-    0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    2, 1, 1, 1, 1, 1, 1, 3, 4, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 5,
+static RE_UINT8 re_nfkd_quick_check_table_2[] = {
+      0,   0,   0,   0,   0,   1,   2,   3,   4,   5,   6,   7,   0,   8,   9,  10,
+     11,  12,   0,   0,   0,  13,  14,  15,   0,   0,  16,  17,  18,  19,  20,  21,
+     22,  23,  24,  25,   0,   0,  26,  27,   0,   0,   0,   0,  28,   0,   0,   0,
+      0,  29,   0,  30,   0,   0,  31,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,  32,  33,   0,   0,   0,  34,   0,
+      0,  35,  36,   0,   0,   0,   0,   0,   0,   0,  37,   0,  38,   0,  39,   0,
+      0,   0,  40,   0,   0,   0,  41,   0,   0,   0,  39,   0,   0,   0,  42,   0,
+      0,  43,   0,   0,   0,  43,  44,   0,  45,   0,  46,  47,  48,  49,   0,   0,
+      0,  50,   0,   0,   0,   0,   0,  51,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,  52,  53,  54,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,  55,  56,  57,  58,  59,   0,   0,
+     59,  59,  59,  59,  60,  59,  59,  61,  62,  59,  63,  64,  59,  65,  66,  67,
+     68,  69,  70,  71,  72,  40,   0,   0,  73,  74,  75,  59,  76,  77,  78,   0,
+     79,  80,  81,  82,  83,  84,   0,  85,   0,  86,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,  59,  59,  59,  59,  87,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     45,   0,   0,  88,   0,   0,  51,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,  44,   0,   0,   0,   0,   0,   0,   0,  89,   0,   0,   0,   0,
+      0,   0,   0,   0,  90,   0,   0,  43,  59,  59,  59,  59,  59,  59,  91,   0,
+     92,  93,  94,  95,  96,  94,  95,  97,   0,  98,  59,  59,  99,   0,   0,   0,
+    100,  59, 101, 100,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,  44,   0,   0,   0,   0,   0,   0, 102,   0,   0,   0, 103,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 104, 105,   0,   0,   0,   0,
+     59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,
+     59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,
+     59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,
+     59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59, 106,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,  59,  59,  59,  59,  59,  59,  59,  59,
+    107, 108,  59, 109,  59,  59,  61,   0, 110, 111, 112,  59,  59, 113, 114,  59,
+     59,  59,  59,  59,  59,  59,  59,  59,  59,  64, 115,  59,   4,  59, 116, 117,
+    118, 115, 119, 120,  59,  59,  59, 121, 122,  59,  59,  59,  59, 100, 123, 124,
+      0,   0,   0,   0, 125, 126,   0,   0,   0, 127,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 128,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0, 129,   0,   0,   0,   0,   0,   0,   0, 130,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0, 131,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 132,  15,   0,  58,  92,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     59,  59,  65,  59, 133, 134, 135,  59, 136, 137, 138,  59,  59,  59,  59,  59,
+     59,  59,  59,  59,  59,   7,  59,  59,  59,  59,  59,  59,  59,  59, 139,  59,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    135, 140, 141, 142, 143, 144,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0, 145, 146, 147,  39, 102,   0,   0,   0,
+    148,  60, 149,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 118,
+     59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,
+     64,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0
+};
+
+static RE_UINT8 re_nfkd_quick_check_table_3[] = {
+    255, 255, 255, 255, 254, 122, 195, 136,  64,   0, 129, 193,  64,   0, 129,  65,
+      0,   0,   3,   0, 192,   0,   2,   1,   6,  12,  12,   0, 192,   0,   0,   0,
+    252, 127, 254, 255,  15,   0,   0,  32,  48,   0, 192,   0,   0,   0,   0,  48,
+     63,   0, 240, 255, 255, 255,   0, 254, 255, 255, 255, 192, 224, 255, 255, 255,
+    228, 255, 255, 255, 255, 255, 239, 187,  15,  40, 254, 255, 255,   3, 254, 255,
+    255, 131, 128, 255, 255, 255, 200, 253, 116, 143, 255, 253, 255, 255, 255, 253,
+    255, 255, 116, 143, 255, 255,  63, 255, 249, 255,  48,   3,   3,   3, 192, 252,
+    127, 255, 255, 255, 131, 255, 255, 255, 255, 255,  31, 254, 250, 255, 247, 255,
+    255, 253, 237, 255, 255, 255, 255,   0, 255, 231, 255,  79, 255, 255, 183, 255,
+    255, 255, 255, 177, 255, 230, 255, 207, 255, 255, 239, 255, 255, 227, 255, 255,
+    255, 254, 255, 255, 126, 242, 255, 255, 255, 255, 255, 139, 255, 255, 247, 255,
+    255, 255, 255, 207, 255, 239, 255, 255, 247, 223, 123, 239, 255, 253,  23, 252,
+    253, 255, 247, 223, 123, 239, 255, 253, 191, 255, 255, 255, 255, 255, 255, 239,
+    191, 170, 251, 255, 255, 255, 255, 215, 244, 255, 255, 255, 255, 143,   0,   8,
+      0,  64,   0,   0,   0, 248, 255, 254, 255, 255, 255,   7,   0,   0,   0,   0,
+      0,   0,   0, 240,   0,   0,   0, 252,   0,   0, 192, 192, 192, 192,   0,  85,
+      0,   0,   0, 192,   0,   0,  32,   0,  32,   0,  48,  16,   0,   0,  35, 128,
+      0, 248, 125, 255, 143, 127,  39, 175, 127, 252, 127, 127, 255, 255,  12,   0,
+      0, 128,   0, 224,  16,   1, 144, 193, 168,  66,   4,   4,  30, 252,   0,   0,
+    255, 253, 255, 243, 255, 191, 255, 255, 255,  31, 255, 255, 239, 237, 255, 255,
+    175,  79, 254, 255, 109, 253, 255, 255, 250,  31, 204, 252, 204, 252, 255, 255,
+    255,  15, 255, 255, 240, 195, 255, 255, 255, 249, 255, 255,   0, 248, 255, 255,
+    255, 255, 143, 255, 255, 127, 255, 255, 255, 255, 255, 127,   0,   0, 192, 255,
+    254, 255, 255, 255, 255, 255, 191, 248, 255, 175, 170, 170,  90, 253,  36, 201,
+    255, 255, 239,  39, 255, 255, 111,  56, 255, 255,   1,   0,   0, 128,   3,   0,
+      0,   0,   0, 128,   0, 255,   0,   0, 255, 255, 254, 255, 255, 255, 255, 252,
+    255, 255, 255,  15, 255, 253, 255, 255, 240, 255, 255, 255,   0, 192,  26, 128,
+    154,   3,   0,   0,   0, 192,   0,   0, 128, 255,   7,  95,   0,   0, 128, 160,
+     36,   0,   0,   0,   0,   0, 252, 255, 255, 255,   7,   0, 255, 255,   0,   0,
+      0, 255, 255, 255, 255, 255,   0, 224, 255, 255,   0, 252,  96,   0,   8,   0,
+    128, 240,  40,   0,   0,   0,   0, 224,   1,   0,   0,   0,   3,   3,   3, 227,
+    128, 128, 255, 255, 255, 255, 255, 235, 255, 247, 255, 255, 255,  63, 255, 255,
+    255, 231, 255, 255, 255, 255, 255, 167, 255, 255, 255, 243, 255, 255, 255, 254,
+    255, 255, 255,  63,   0,   0,   0,  32, 155,  33,   0,  20,  16,   0,   0,   0,
+     64,  24,  32,  32,   0,   0,   0, 132, 160,   3,   2,   0,   0,  48,   0,   0,
+    105,   1,   8, 245, 123,  21, 105,  85, 105,   8,   8, 161,   0,   4,   0, 240,
+     17,   4,   0, 240,   0, 248,   0,   0,   0, 128,   0,   0,   0,   0, 255, 255,
+    248, 255,   0,   0,   0, 254, 252, 255
+};
+
+RE_UINT32 re_get_nfkd_quick_check(RE_UINT32 codepoint) {
+    RE_UINT32 field_2;
+    RE_UINT32 field_1;
+    RE_UINT32 field_0;
+    RE_UINT32 offset;
+    RE_UINT32 v;
+
+    field_2 = codepoint >> 10;
+    field_1 = (codepoint >> 5) & 0x1F;
+    field_0 = (codepoint >> 3) & 0x3;
+    offset = codepoint & 0x7;
+
+    v = re_nfkd_quick_check_table_1[field_2];
+    v = re_nfkd_quick_check_table_2[(v << 5) | field_1];
+    v = re_nfkd_quick_check_table_3[(v << 2) | field_0];
+
+    return (v >> offset) & 0x1;
+}
+
+/* Noncharacter_Code_Point. */
+static RE_UINT8 re_noncharacter_code_point_table_1[] = {
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2
 };
 
-static RE_UINT8 re_quotation_mark_stage_3[] = {
-    0, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    3, 1, 1, 1, 1, 1, 1, 1, 1, 4, 1, 1, 1, 1, 1, 1,
-    5, 1, 1, 1, 1, 1, 1, 1, 1, 6, 1, 1, 7, 8, 1, 1,
+static RE_UINT8 re_noncharacter_code_point_table_2[] = {
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3
 };
 
-static RE_UINT8 re_quotation_mark_stage_4[] = {
-      0,   0,   0,   0, 132,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   8,   0,   8,   0,   0,   0, 255,   0,   0,   0,   6,
-      4,   0,   0,   0,   0,   0,   0,   0,   0, 240,   0, 224,   0,   0,   0,   0,
-     30,   0,   0,   0,   0,   0,   0,   0, 132,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,  12,   0,   0,   0,
+static RE_UINT8 re_noncharacter_code_point_table_3[] = {
+      0,   0,   0,   0,   0,   0, 255, 255, 255, 255,   0,   0,   0,   0,   0, 192
 };
 
-/* Quotation_Mark: 284 bytes. */
-
-RE_UINT32 re_get_quotation_mark(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-
-    f = ch >> 14;
-    code = ch ^ (f << 14);
-    pos = (RE_UINT32)re_quotation_mark_stage_1[f] << 5;
-    f = code >> 9;
-    code ^= f << 9;
-    pos = (RE_UINT32)re_quotation_mark_stage_2[pos + f] << 3;
-    f = code >> 6;
-    code ^= f << 6;
-    pos = (RE_UINT32)re_quotation_mark_stage_3[pos + f] << 6;
-    pos += code;
-    value = (re_quotation_mark_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1;
-
-    return value;
-}
+RE_UINT32 re_get_noncharacter_code_point(RE_UINT32 codepoint) {
+    RE_UINT32 field_2;
+    RE_UINT32 field_1;
+    RE_UINT32 field_0;
+    RE_UINT32 offset;
+    RE_UINT32 v;
 
-/* Terminal_Punctuation. */
+    field_2 = codepoint >> 10;
+    field_1 = (codepoint >> 5) & 0x1F;
+    field_0 = (codepoint >> 3) & 0x3;
+    offset = codepoint & 0x7;
 
-static RE_UINT8 re_terminal_punctuation_stage_1[] = {
-    0, 1, 2, 2, 2, 3, 2, 4, 5, 6, 2, 7, 2, 8, 9, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2,
-};
+    v = re_noncharacter_code_point_table_1[field_2];
+    v = re_noncharacter_code_point_table_2[(v << 5) | field_1];
+    v = re_noncharacter_code_point_table_3[(v << 2) | field_0];
 
-static RE_UINT8 re_terminal_punctuation_stage_2[] = {
-     0,  1,  1,  2,  1,  3,  4,  5,  6,  7,  1,  1,  1,  1,  8,  9,
-    10,  1,  1, 11,  1,  1, 12, 13, 14, 15, 16, 17, 18,  1,  1,  1,
-    19,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1, 20,  1,
-    21,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
-     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
-     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
-     1,  1,  1,  1, 22,  1, 23,  1, 24, 25, 26, 27,  1,  1,  1,  1,
-     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
-     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
-     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1, 28, 29,
-     1,  1,  1, 30,  1,  1,  1,  1, 31, 32, 33, 34,  1,  1,  1, 35,
-    36, 37, 38,  1, 39, 40, 41, 42,  1,  1, 43,  1, 44,  1, 45,  1,
-     1,  1,  1,  1, 46,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
-     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
-     1,  1,  1,  1,  1,  1,  1,  1,  1,  1, 47, 48,  1,  1, 49,  1,
-     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
-     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
-     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1, 50,  1,  1,  1,
-     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
-     1,  1,  1,  1,  1,  1,  1,  1,  1,  1, 51,  1,  1,  1,  1,  1,
-};
+    return (v >> offset) & 0x1;
+}
 
-static RE_UINT8 re_terminal_punctuation_stage_3[] = {
-     0,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  2,  3,  0,  0,  0,  0,  0,  0,  0,  4,  0,  5,  0,
-     6,  0,  0,  0,  0,  0,  7,  0,  8,  0,  0,  0,  0,  0,  0,  9,
-     0, 10,  2,  0,  0,  0,  0,  0,  0,  0,  0, 11,  0,  0,  0,  0,
-     0,  0, 12,  0,  0,  0,  0,  0, 13,  0,  0,  0,  0,  0,  0,  0,
-     0,  0, 14,  0,  0,  0,  0,  0,  0,  0,  0, 15,  0,  0,  0,  0,
-     0,  0,  0, 16,  0,  0,  0, 17,  0, 18,  0,  0,  0,  0, 19,  0,
-    20,  0,  0,  0,  0,  0,  0,  0,  0,  0, 11,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0, 21,  0,  0,  0,  0, 22,  0,  0,  0,  0,  0,
-     0, 23,  0, 24,  0,  0,  0,  0,  0, 25, 26,  0,  0,  0,  0,  0,
-     0, 27, 28,  0,  0,  0,  0,  0, 29,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0,  0, 24, 30,  0,  0,  0,  0,  0,  0, 31,
-     0,  0,  0, 32,  0,  0, 33,  0,  0, 34,  0,  0,  0,  0, 26,  0,
-     0,  0, 35,  0,  0,  0, 36, 37,  0,  0,  0,  0,  0,  0,  0, 38,
-     0,  0, 39,  0,  0,  0,  0,  0,  1,  0,  0, 40,  0,  0,  0,  0,
-     0,  0,  0,  0, 36,  0, 41,  0,  0,  0, 42,  0,  0,  0,  0,  0,
-    36,  0,  0,  0,  0,  0,  0,  0,  0,  0, 32,  0,  0,  0,  0, 43,
-     0, 44,  0,  0, 45,  0,  0,  0,  0,  0, 46,  0,  0,  0,  0,  0,
-     0,  0, 47,  0,  0, 24, 48,  0,  0,  0, 49,  0,  0,  0, 50,  0,
-     0, 51,  0,  0,  0,  4,  0,  0,  0,  0, 52,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0, 53,  0,  0,  0, 29,  0,  0,  0,  0,  0,
-     0, 54,  0,  0,  0,  0,  0,  0,  0,  0, 55,  0, 56, 29,  0,  0,
-     0,  0, 49, 57,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 58,
-     0,  0,  0, 59,  0,  0,  0,  0,  0,  0,  0, 33,  0,  0,  0, 60,
-     0, 61, 62,  0,  0,  0,  0,  0,  0,  0,  0,  0, 58,  0,  0,  0,
-     0,  0,  0,  0, 36,  0,  0,  0,  0,  0,  0,  0, 63,  0,  0,  0,
+/* Numeric_Type. */
+static RE_UINT8 re_numeric_type_table_1[] = {
+     0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 10,
+    10, 10, 10, 15, 16, 17, 18, 19, 20, 21, 10, 22, 23, 24, 10, 10,
+    25, 26, 10, 27, 10, 28, 10, 10, 10, 29, 30, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 31, 32,
+    33, 34, 35, 36, 37, 38, 39, 40, 10, 41, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 42, 43, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 44, 45, 10, 10, 46, 10, 47, 48, 49, 10, 50, 10,
+    51, 10, 52, 10, 10, 10, 10, 10, 53, 10, 54, 10, 10, 10, 55, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 56, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 57, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10
 };
 
-static RE_UINT8 re_terminal_punctuation_stage_4[] = {
-      0,   0,   0,   0,   2,  80,   0, 140,   0,   0,   0,  64, 128,   0,   0,   0,
-      0,   2,   0,   0,   8,   0,   0,   0,   0,  16,   0, 200,   0,   0,  16,   0,
-    255,  23,   0,   0,   0,   0,   0,   3,   0,   0, 255, 127,  48,   0,   0,   0,
-      0,   0,   0,  12,   0, 225,   7,   0,   0,  12,   0,   0, 254,   1,   0,   0,
-      0,  64,   0,   0,   0,  56,   0,   0,   0,   0,  96,   0,   0,   0, 112,   4,
-     60,   3,   0,   0,   0,  15,   0,   0,   0,   0,   0, 236,   0,   0,   0, 248,
-      0,   0,   0, 192,   0,   0,   0,  48, 128,   3,   0,   0,   0,  64,   0,  16,
-      2, 208,   0,   0,   6,   0,   0,   0,   0, 224,   0,   0,   0,   0, 248,   0,
-      0,   0, 192,   0,   0, 192,   0,   0,   0, 128,   0,   0,   0,   0,   0, 224,
-      0,   0,   0, 128,   0,   0,   3,   0,   0,   8,   0,   0,   0,   0, 247,   0,
-     18,   0,   0,   0,   0,   0,   1,   0,   0,   0, 128,   0,   0,   0,  63,   0,
-      0,   0,   0, 252,   0,   0,   0,  30,   0,   0, 224,   3, 128,  63,   0,   0,
-      3,   0,   0,   0,  14,   0,   0,   0,  96,  32,   0, 192,   0,   0,   0,  31,
-      0,  56,   0,   8,  60, 254, 255,   0,   0,   0,   0, 112,  12,   0,   0,   0,
-      0,   0,   0,  24,   0,   0,   2,   0,   0,   0, 128,   1,   0,   0,  31,   0,
-      0,   0,  32,   0,   0,   0, 128,   3,  16,   0,   0,   0, 128,   7,   0,   0,
+static RE_UINT8 re_numeric_type_table_2[] = {
+      0,   1,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   3,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   3,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   4,   0,   0,   0,   5,
+      0,   0,   0,   4,   0,   0,   0,   4,   0,   0,   0,   6,   0,   0,   0,   7,
+      0,   0,   0,   8,   0,   0,   0,   4,   0,   0,   9,  10,   0,   0,   0,   4,
+      0,   0,   1,   0,   0,   0,   1,   0,   0,  11,   0,   0,   0,   0,   0,   0,
+      0,   0,   3,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  12,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,  13,   0,   0,   0,   0,   0,   0,   0,  14,
+      1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   4,   0,   0,   0,  15,   0,
+      0,   0,   0,   0,  16,   0,   0,   0,   0,   0,   1,   0,   0,   1,   0,   0,
+      0,   0,  16,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,  17,  18,   0,   0,   0,   0,   0,  19,  20,  21,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,  22,  23,   0,   0,  24,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  25,  26,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,  27,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     28,  29,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  30,   0,   0,   0,
+      0,  31,  32,   0,  31,  33,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     34,   0,   0,   0,  35,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,  36,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  37,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     38,   0,  27,   0,  39,  40,  41,  42,  37,   0,   0,  43,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,  44,   0,  45,  46,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  47,   0,   0,   0,  48,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,  49,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,  50,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,  51,   0,   0,   0,  52,  53,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,  54,   0,   0,  55,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  56,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,  45,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  57,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,  54,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,  45,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,  55,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,  58,   0,   0,   0,  43,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,  59,  60,  61,   0,   0,   0,  57,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   3,   0,   0,   0,   0,   0,  62,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,  63,   0,   0,   0,   0,   1,   0,   3,   0,   0,   0,   0,   0,   1,   1,
+      0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  64,   0,  56,  65,  27,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,  66,  67,  20,  68,  69,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,  70,   0,  71,  72,   0,   0,   0,  73,   0,
+      0,   0,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,  74,  75,   0,  76,   0,  77,  78,   0,   0,   0,   0,  79,  80,  20,
+      0,   0,  81,  82,  83,   0,   0,  84,   0,   0,  74,  74,   0,  85,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,  86,   0,   1,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,  87,   0,   0,   0,   0,  83,  88,  89,   0,   0,   0,  90,   0,
+      0,   0,  91,  92,   0,   0,   0,   1,   0,  93,   0,   0,   0,   0,   1,  94,
+      0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   1,   0,   0,   0,   3,   0,   0,  95,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,  96,   0,   0,   1,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,  97,  98,   0,   0,   0,   0,   0,   0,   1,   0,   0,   3,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  99,   0,
+     20,  20,  20, 100,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   3,   0,   0,   0,   0,   0,   0, 101, 102,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0, 103,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,  67,   0,   0,   0,  68,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 104, 105,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,  76,   0,   0,   0,   1,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,  33,  20, 106,   0,   0, 107, 108,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0, 109,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,
+     59,   0,   0,  44,   0,   0,   0, 110,   0,  59,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,  36,   0,   0, 111,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0, 112, 113,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  43,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  61,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,  49,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,  37,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,  43,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0
 };
 
-/* Terminal_Punctuation: 1128 bytes. */
-
-RE_UINT32 re_get_terminal_punctuation(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-
-    f = ch >> 13;
-    code = ch ^ (f << 13);
-    pos = (RE_UINT32)re_terminal_punctuation_stage_1[f] << 5;
-    f = code >> 8;
-    code ^= f << 8;
-    pos = (RE_UINT32)re_terminal_punctuation_stage_2[pos + f] << 3;
-    f = code >> 5;
-    code ^= f << 5;
-    pos = (RE_UINT32)re_terminal_punctuation_stage_3[pos + f] << 5;
-    pos += code;
-    value = (re_terminal_punctuation_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1;
-
-    return value;
-}
-
-/* Other_Math. */
-
-static RE_UINT8 re_other_math_stage_1[] = {
-    0, 1, 1, 2, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1,
+static RE_UINT8 re_numeric_type_table_3[] = {
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 2, 2, 0, 0, 0, 0, 0, 2, 0, 0, 3, 3, 3, 0,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    0, 0, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 0,
+    0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 3, 3, 3, 3, 3,
+    3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3,
+    3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0,
+    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 0, 0, 0, 0, 0,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    2, 0, 0, 0, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+    3, 3, 3, 0, 0, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3,
+    3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3,
+    3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 3, 3, 3, 3,
+    3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 2,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3,
+    0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+    0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    3, 0, 0, 3, 0, 0, 0, 3, 0, 3, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,
+    0, 0, 0, 0, 3, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+    3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+    0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 3, 0, 3, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 3, 0, 3, 3, 3, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 3, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 0,
+    3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0,
+    0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 3, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0,
+    0, 0, 0, 3, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 3, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+    3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+    3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0,
+    3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3,
+    0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 0, 0,
+    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+    0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+    2, 2, 2, 2, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3,
+    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0,
+    3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3,
+    3, 3, 3, 3, 3, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+    3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 3, 0, 0, 0, 0,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 3, 3, 3, 3, 3,
+    3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 3, 3, 3, 3, 3,
+    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+    3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 3, 3, 3, 3, 3,
+    3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+    3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1,
     1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
     1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
     1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1,
+    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 3, 3, 3,
+    0, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 3,
+    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0
 };
 
-static RE_UINT8 re_other_math_stage_2[] = {
-    0, 1, 1, 1, 1, 1, 1, 1, 2, 3, 4, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 5,
-    1, 1, 1, 1, 1, 6, 1, 1, 1, 1, 1, 7, 1, 1, 1, 1,
-};
+RE_UINT32 re_get_numeric_type(RE_UINT32 codepoint) {
+    RE_UINT32 field_2;
+    RE_UINT32 field_1;
+    RE_UINT32 field_0;
+    RE_UINT32 v;
 
-static RE_UINT8 re_other_math_stage_3[] = {
-     0,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  2,
-     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     3,  4,  5,  6,  7,  8,  9, 10,  0,  0,  0,  0, 11,  0, 12, 13,
-     0,  0,  0,  0,  0,  0, 14, 15, 16, 17,  0,  0,  0,  0,  0, 18,
-     0,  0,  0,  0,  0,  0, 19, 20,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0,  0,  0,  0, 21,  0,  0, 22,  0,  0,  0,
-    23, 24, 25, 26, 27, 28, 23, 23, 23, 23, 29, 30, 31, 32, 33, 34,
-     0,  0,  0,  0,  0,  0,  0,  0, 35, 36, 37,  0,  0,  0,  0,  0,
-};
+    field_2 = codepoint >> 10;
+    field_1 = (codepoint >> 5) & 0x1F;
+    field_0 = codepoint & 0x1F;
 
-static RE_UINT8 re_other_math_stage_4[] = {
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  64,   0,   0,   0,   0,
-      0,   0,  39,   0,   0,   0,  51,   0,   0,   0,  64,   0,   0,   0,  28,   0,
-      1,   0,   0,   0,  30,   0,   0,  96,   0,  96,   0,   0,   0,   0,   0,   0,
-      0,   0, 255,  31,  98, 248,   0,   0, 132, 252,  47,  62,  16, 179, 251, 241,
-    224,   3,   0,   0,   0,   0,   0,   0,   0,   0, 224, 243, 182,  62, 195, 240,
-    255,  63, 235,  47,  48,   0,   0,   0,   0,  15,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0, 176,   0,   0,   0,   1,   0,   4,   0,   0,   0,
-      0,   0,   0,   0,   3, 192, 127, 240, 193, 140,  15,   0, 148,  31,   0,   0,
-     96,   0,   0,   0,   0,   0,   0,   0,   5,   0,   0,   0,  15,  96,   0,   0,
-     96,   0,   0,   0, 192, 255,   0,   0, 248, 255, 255,   1,   0,   0,   0,   0,
-      0,   0,   0,  15,   0,   0,   0,  48,   0,   0,   0,   0,  10,   1,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,  80, 255, 255, 255, 255, 255, 255, 255, 255,
-    255, 255, 223, 255, 255, 255, 255, 255, 255, 255, 255, 223, 100, 222, 255, 235,
-    239, 255, 255, 255, 255, 255, 255, 255, 191, 231, 223, 223, 255, 255, 255, 123,
-     95, 252, 253, 255, 255, 255, 255, 255, 255, 255, 255, 255,  63, 255, 255, 255,
-    253, 255, 255, 247, 255, 255, 255, 247, 255, 255, 223, 255, 255, 255, 223, 255,
-    255, 127, 255, 255, 255, 127, 255, 255, 255, 253, 255, 255, 255, 253, 255, 255,
-    247, 207, 255, 255, 255, 255, 255, 255, 239, 255, 255, 255, 150, 254, 247,  10,
-    132, 234, 150, 170, 150, 247, 247,  94, 255, 251, 255,  15, 238, 251, 255,  15,
-};
+    v = re_numeric_type_table_1[field_2];
+    v = re_numeric_type_table_2[(v << 5) | field_1];
+    v = re_numeric_type_table_3[(v << 5) | field_0];
 
-/* Other_Math: 564 bytes. */
-
-RE_UINT32 re_get_other_math(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-
-    f = ch >> 14;
-    code = ch ^ (f << 14);
-    pos = (RE_UINT32)re_other_math_stage_1[f] << 4;
-    f = code >> 10;
-    code ^= f << 10;
-    pos = (RE_UINT32)re_other_math_stage_2[pos + f] << 4;
-    f = code >> 6;
-    code ^= f << 6;
-    pos = (RE_UINT32)re_other_math_stage_3[pos + f] << 6;
-    pos += code;
-    value = (re_other_math_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1;
-
-    return value;
+    return v;
 }
 
-/* Hex_Digit. */
-
-static RE_UINT8 re_hex_digit_stage_1[] = {
-    0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1,
-};
-
-static RE_UINT8 re_hex_digit_stage_2[] = {
-    0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-};
-
-static RE_UINT8 re_hex_digit_stage_3[] = {
-    0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1,
+/* Numeric_Value. */
+static RE_UINT8 re_numeric_value_table_1[] = {
+     0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 10,
+    10, 10, 10, 15, 16, 17, 18, 19, 20, 21, 10, 22, 23, 24, 10, 10,
+    25, 26, 10, 27, 10, 28, 10, 10, 10, 29, 30, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 31, 32,
+    33, 34, 35, 36, 37, 38, 39, 40, 10, 41, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 42, 43, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 44, 45, 10, 10, 46, 10, 47, 48, 49, 10, 50, 10,
+    51, 10, 52, 10, 10, 10, 10, 10, 53, 10, 54, 10, 10, 10, 55, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 56, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 57, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10
 };
 
-static RE_UINT8 re_hex_digit_stage_4[] = {
-      0,   0,   0,   0,   0,   0, 255,   3, 126,   0,   0,   0, 126,   0,   0,   0,
+static RE_UINT8 re_numeric_value_table_2[] = {
+      0,   1,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0, 255,   3, 126,   0,   0,   0, 126,   0,   0,   0,   0,   0,   0,   0,
-};
-
-/* Hex_Digit: 177 bytes. */
-
-RE_UINT32 re_get_hex_digit(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-
-    f = ch >> 16;
-    code = ch ^ (f << 16);
-    pos = (RE_UINT32)re_hex_digit_stage_1[f] << 5;
-    f = code >> 11;
-    code ^= f << 11;
-    pos = (RE_UINT32)re_hex_digit_stage_2[pos + f] << 4;
-    f = code >> 7;
-    code ^= f << 7;
-    pos = (RE_UINT32)re_hex_digit_stage_3[pos + f] << 7;
-    pos += code;
-    value = (re_hex_digit_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1;
-
-    return value;
-}
-
-/* ASCII_Hex_Digit. */
-
-static RE_UINT8 re_ascii_hex_digit_stage_1[] = {
-    0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1,
-};
-
-static RE_UINT8 re_ascii_hex_digit_stage_2[] = {
-    0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-};
-
-static RE_UINT8 re_ascii_hex_digit_stage_3[] = {
-    0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-};
-
-static RE_UINT8 re_ascii_hex_digit_stage_4[] = {
-      0,   0,   0,   0,   0,   0, 255,   3, 126,   0,   0,   0, 126,   0,   0,   0,
       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   3,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   3,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   4,   0,   0,   0,   5,
+      0,   0,   0,   4,   0,   0,   0,   4,   0,   0,   0,   6,   0,   0,   0,   7,
+      0,   0,   0,   8,   0,   0,   0,   4,   0,   0,   9,  10,   0,   0,   0,   4,
+      0,   0,   1,   0,   0,   0,   1,   0,   0,  11,   0,   0,   0,   0,   0,   0,
+      0,   0,   3,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  12,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,  13,   0,   0,   0,   0,   0,   0,   0,  14,
+      1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   4,   0,   0,   0,  15,   0,
+      0,   0,   0,   0,  14,   0,   0,   0,   0,   0,   1,   0,   0,   1,   0,   0,
+      0,   0,  14,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,  16,   3,   0,   0,   0,   0,   0,  17,  18,  19,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,  20,  21,   0,   0,  22,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  23,  24,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,  25,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     26,  27,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  28,   0,   0,   0,
+      0,  29,  30,   0,  29,  31,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     32,   0,   0,   0,  33,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,  34,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  35,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     36,   0,  37,   0,  38,  39,  40,  41,  42,   0,   0,  43,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,  44,   0,  45,  46,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  47,   0,   0,   0,  48,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,  49,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,  50,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,  51,   0,   0,   0,  52,  53,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,  54,   0,   0,  55,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  56,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,  57,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  58,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,  59,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,  60,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,  61,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,  62,   0,   0,   0,  63,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,  64,  65,  66,   0,   0,   0,  67,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   3,   0,   0,   0,   0,   0,  68,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,  69,   0,   0,   0,   0,   1,   0,   3,   0,   0,   0,   0,   0,   1,   1,
+      0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  70,   0,  71,  72,  73,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,  74,  75,  76,  77,  78,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,  79,   0,  80,  81,   0,   0,   0,  82,   0,
+      0,   0,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,  83,  84,   0,  85,   0,  86,  87,   0,   0,   0,   0,  88,  89,  90,
+      0,   0,  91,  92,  93,   0,   0,  94,   0,   0,  95,  95,   0,  96,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,  97,   0,   1,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,  98,   0,   0,   0,   0,  99, 100, 101,   0,   0,   0, 102,   0,
+      0,   0, 103, 104,   0,   0,   0,   1,   0, 105,   0,   0,   0,   0,   1, 106,
+      0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   1,   0,   0,   0,   3,   0,   0, 107,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0, 108,   0,   0,   1,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0, 109, 110,   0,   0,   0,   0,   0,   0,   1,   0,   0,   3,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 111,   0,
+    112, 113, 114, 115,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   3,   0,   0,   0,   0,   0,   0, 116, 117,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0, 118,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0, 119,   0,   0,   0, 120,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 121, 122,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0, 123,   0,   0,   0,   1,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0, 124, 125, 126,   0,   0, 127, 128,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0, 129,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,
+    130,   0,   0, 131,   0,   0,   0, 132,   0, 133,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0, 134,   0,   0, 135,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0, 136, 137,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  63,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 138,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0, 139,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0, 140,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0, 141,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0
 };
 
-/* ASCII_Hex_Digit: 130 bytes. */
-
-RE_UINT32 re_get_ascii_hex_digit(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-
-    f = ch >> 15;
-    code = ch ^ (f << 15);
-    pos = (RE_UINT32)re_ascii_hex_digit_stage_1[f] << 4;
-    f = code >> 11;
-    code ^= f << 11;
-    pos = (RE_UINT32)re_ascii_hex_digit_stage_2[pos + f] << 4;
-    f = code >> 7;
-    code ^= f << 7;
-    pos = (RE_UINT32)re_ascii_hex_digit_stage_3[pos + f] << 7;
-    pos += code;
-    value = (re_ascii_hex_digit_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1;
-
-    return value;
-}
-
-/* Other_Alphabetic. */
-
-static RE_UINT8 re_other_alphabetic_stage_1[] = {
-    0, 1, 2, 2, 2, 3, 2, 4, 5, 2, 2, 6, 2, 7, 2, 8,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2,
+static RE_UINT8 re_numeric_value_table_3[] = {
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      1,   2,   3,   4,   5,   6,   7,   8,   9,  10,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   3,   4,   0,   0,   0,   0,   0,   2,   0,   0,  11,  12,  13,   0,
+      1,   2,   3,   4,   5,   6,   7,   8,   9,  10,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   1,   2,   3,   4,   5,   6,   7,   8,   9,  10,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   1,   2,   3,   4,   5,   6,   7,   8,   9,  10,
+      0,   0,   0,   0,  14,  15,  16,  11,  13,  17,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   1,   2,   3,   4,   5,   6,   7,   8,   9,  10,
+      0,   0,  11,  12,  13,  14,  15,  16,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   1,   2,   3,   4,   5,   6,   7,   8,   9,  10,
+     18,  19,  20,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   1,   2,   3,   4,   5,   6,   7,   8,   9,  10,
+      0,   0,   0,   0,   0,   0,   0,   0,   1,   2,   3,   4,   2,   3,   4,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,  21,  22,  23,  24,  25,  26,  27,   0,
+      0,   0,   0,   0,   0,   0,   1,   2,   3,   4,   5,   6,   7,   8,   9,  10,
+     18,  19,  20,  11,  12,  13,  14,  15,  16,   0,   0,   0,   0,   0,   0,   0,
+      1,   2,   3,   4,   5,   6,   7,   8,   9,  10,  12,  28,  29,  30,  31,  32,
+     33,  34,  35,  36,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   3,   4,   5,   6,   7,   8,
+      9,  10,  18,  37,  38,  39,  40,  41,  42,  43,  44,  19,  45,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  46,  47,
+     48,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      1,   2,   3,   4,   5,   6,   7,   8,   9,  10,   0,   0,   0,   0,   0,   0,
+      1,   2,   3,   4,   5,   6,   7,   8,   9,  10,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      1,   2,   3,   4,   5,   6,   7,   8,   9,  10,   2,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      1,   0,   0,   0,   5,   6,   7,   8,   9,  10,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     49,  50,  25,  51,  52,  27,  53,  54,  55,  56,  57,  15,  58,  59,  60,   2,
+      2,   3,   4,   5,   6,   7,   8,   9,  10,  18,  61,  62,  40,  19,  63,  20,
+      2,   3,   4,   5,   6,   7,   8,   9,  10,  18,  61,  62,  40,  19,  63,  20,
+     20,  64,  45,   0,   0,   7,  40,  65,  66,   1,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      2,   3,   4,   5,   6,   7,   8,   9,  10,  18,  61,  62,  67,  68,  69,  17,
+     46,  47,  48,  37,   2,   3,   4,   5,   6,   7,   8,   9,  10,  18,  61,  62,
+     67,  68,  69,  17,  46,  47,  48,  37,   2,   3,   4,   5,   6,   7,   8,   9,
+     10,  18,  61,  62,  67,  68,  69,  17,  46,  47,  48,  37,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,  61,  62,  67,  68,  69,
+     17,  46,  47,  48,  37,   2,   3,   4,   5,   6,   7,   8,   9,  10,  18,   1,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   2,   3,   4,   5,   6,   7,   8,   9,  10,  18,
+      2,   3,   4,   5,   6,   7,   8,   9,  10,  18,   2,   3,   4,   5,   6,   7,
+      8,   9,  10,  18,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  12,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   2,   3,   4,   5,   6,   7,   8,   9,  10,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,  18,  37,  38,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   2,   3,   4,   5,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      2,   3,   4,   5,   6,   7,   8,   9,  10,  18,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,  18,  37,  38,  39,  40,  41,  42,  43,
+      0,  70,  71,  72,  73,  74,  75,  76,  77,  78,  38,  79,  80,  81,  82,  83,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,  84,  85,  86,  87,  39,  88,  89,  90,  91,  92,  93,  94,  95,  96,  40,
+      0,   0,   0,   0,   0,   6,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   6,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   8,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      2,   0,   0,   8,   0,   0,   0,  45,   0,   4,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  10,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,
+      0,   0,   0,   0,   6,   0,   5,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  97,
+     18,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  20,
+      0,   0,   0,   0,   0,   0,   0,   0,   4,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   6,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     19,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,  97,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,  98,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   9,   0,   7,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,  18,   0,  20,  37,  38,   0,   0,   0,   0,   0,   0,  39,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   4,   4,   4,   4,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   5,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   2,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  10,  37,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   3,   4,   0,
+      3,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  18,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   9,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   8,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   8,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,  10,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  19,   0,
+      0,   0,   0,   0,   0,   0,   5,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  45,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,
+      0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      3,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,  20,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   7,   0,   0,   0,   0,   0,  19,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   7,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   2,   3,   4,   5,   6,   7,   8,   9,  10,   1,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     11,  12,  13,  14,  15,  16,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   4,   0,   0,   0,   0,
+      0,   0,   0,  18,   0,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   7,   0,   7,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  18,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   2,   3,   4,   5,   6,   7,   8,   9,  10,
+     18,  37,  38,  39,  40,  41,  42,  43,  44,  19,  99, 100, 101,  63, 102, 103,
+    104, 105,  20, 106, 107, 108,  64, 109, 110, 111, 112,  45, 113, 114, 115,  65,
+    116, 117, 118, 119,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     11,  12,   2,   6,  40,  63,  64,  65,   6,  18,  40,  19,  63,  20,  64,   6,
+     18,  40,  19,  63,  20,  45,  65,  18,   2,   2,   2,   3,   3,   3,   3,   6,
+     18,  18,  18,  18,  18,  38,  40,  40,  40,  40,  19, 100,  63,  63,  63,  63,
+     63,  20,  64,   6,  40,  12,  12,  52,  13,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,  11,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   2,   3,   4,   5,   6,   7,   8,   9,  10,  18,  37,  38,  39,  40,  41,
+     42,  43,  44,  19,  99, 100, 101,  63, 102, 103, 104, 105,   0,   0,   0,   0,
+      2,   6,  18,  40,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,  44,   0,   0,   0,   0,   0,   0,   0,   0, 105,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   2,   3,  18,  37,  19,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   2,   3,   4,  18,  37,  19,  20,  45,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   3,   4,   5,   6,  18,  37,
+      0,   0,   0,   0,   0,   0,   0,   2,   3,   4,   5,   5,   6,  18,  37,  19,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   6,  18,  37,  19,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   2,  18,  37,  19,   3,   4,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 120,  12,   0,   0,
+      2,   3,   4,   5,   6,   7,   8,   9,  10,  18,  37,  38,  39,  40,  41,  42,
+      0,   0,  19,  99, 100, 101,  63, 102, 103, 104, 105,  20, 106, 107, 108,  64,
+    109, 110, 111, 112,  45, 113, 114, 115,  65, 116, 117, 118, 119,  66, 121, 122,
+    123, 124, 125, 126, 127, 128, 129,  56,  11,  51, 130,  12, 131,  52,  13,  57,
+      2,   3,   4,   5,  18,  37,  19,  20,  12,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,  40,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,  18,  37,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   6,  18,  37,  19,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   2,   3,   4,   5,  18,  37,  19,  20,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   3,   4,   5,  18,  37,  19,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   6,  18,  40,  19,  20,
+      2,   3,   4,   5,   6,   7,   8,   9,  10,  18,  37,  38,  39,  40,  41,  42,
+     43,  44,  19,  99, 100, 101,  63, 102, 103, 104, 105,  12,  11,  51,  52,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   3,   4,
+      5,   6,  18,  37,  38,  19,  12,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   2,  18,  37,  19,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   2,   3,   4,   5,  18,  37,  19,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   2,   3,   4,   5,   6,   7,   8,   9,  10,  18,  37,  38,  39,  40,
+     41,  42,  43,  44,  19,  20,   1,   2,   3,   4,   5,   6,   7,   8,   9,  10,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   1,   2,   3,   4,   5,   6,   7,   8,   9,  10,
+      0,   2,   3,   4,   5,   6,   7,   8,   9,  10,  18,  37,  38,  39,  40,  41,
+     42,  43,  44,  19,  20,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      1,   2,   3,   4,   5,   6,   7,   8,   9,  10,  18,  37,   0,   0,   0,   0,
+      1,   2,   3,   4,   5,   6,   7,   8,   9,  10,  18,  37,  38,  39,  40,  41,
+     42,  43,  44,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      1,   2,   3,   4,   5,   6,   7,   8,   9,  10,   2,   3,   4,   5,   6,   7,
+      8,   9,  10,  18,  37,  38,  39,  40,  41,  42,  43,  44,  19,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    132,  21, 133, 134,  22, 135,  23, 136,  24,  14,  14,  25,  15,  26,  16,  27,
+     11,  12,  12,  13, 132,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      3,   4,   5,   6,   7,   8,   9,  10,   4,   5,   6,   7,   8,   9,  10,   5,
+      6,   7,   8,   9,  10,   2,   3,   4,   5,   6,   7,   8,   9,  10,   2,   3,
+      4,   5,   6,   3,   4,   4,   5,   6,   7,   8,   9,  10,   2,   3,   4,   4,
+      5,   6, 137, 138,   2,   3,   4,   4,   5,   6,   4,   4,   5,   5,   5,   5,
+      7,   8,   8,   8,   9,   9,  10,  10,  10,  10,   3,   4,   5,   6,   7,   2,
+      3,   4,   5,   5,   6,   6,   3,   4,   2,   3,  51,  52,  57,  51,  52,  15,
+     11,  56,  11,  11,  12,  51,  52,  39,  40,   5,   6,   7,   8,   9,  10,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      1,   2,   3,   4,   5,   6,   7,   8,   9,  10,   0,  18,  19,  45, 139,  97,
+    140,  98,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      1,   2,   3,   4,   5,   6,   7,   8,   9,  10,  18,  61,  62,  67,  68,  69,
+     17,  46,  47,  48,   2,   3,   4,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      1,   2,   3,   4,   5,   6,   7,   8,   9,  10,  18,  61,  62,  67,  68,  69,
+     17,  46,  47,  48,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      2,   3,   4,   5,   6,   7,   8,   9,  10,  18,  37,  38,  39,  40,  41,  42,
+     43,  44,   2,   3,   4,   5,   6,   2,   6,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   2,
+      3,   4,   5,   6,   7,   8,   9,  10,   1,   2,   3,   4,   5,   6,   7,   8,
+      9,  10,   1,   2,   3,   4,   5,   6,   7,   8,   9,  10,   1,   2,   3,   4,
+      5,   6,   7,   8,   9,  10,   1,   2,   3,   4,   5,   6,   7,   8,   9,  10,
+      0,   0,   0,   0,   0,   0,   0,   2,   3,   4,   5,   6,   7,   8,   9,  10,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   2,   3,   4,   5,   6,   7,   8,   9,  10,  18,  37,  38,  39,  40,  41,
+     42,  43,  44,  19,  99, 100, 101,  63, 102, 103, 104, 105,  20, 106, 107, 108,
+     64, 109, 110, 111, 112,  45, 113, 114, 115,  65, 116, 117, 118, 119,  66, 121,
+     66, 141, 142,   2,   3,   4,   5,   6,   7,   8,   9,  10,   0,  11,  12,  13,
+      0,   2,   3,  45,  66,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   2,   3,   4,   5,   6,   7,   8,   9,  10,  18,  37,  38,  39,  40,  41,
+     42,  43,  44,  19,  99, 100, 101,  63, 102, 103, 104, 105,  20, 106, 107, 108,
+     64, 109, 110, 111, 112,  45, 113, 114, 115,  65, 116, 117, 118, 119,   0,   3,
+      4,   5,   6,   7,   8,   9,  10,  18, 101, 102, 106,  45,  12,  56,   0,   0,
+      1,   1,   2,   3,   4,   5,   6,   7,   8,   9,  10,   1,   1,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   8,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   5,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   5,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   6,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,  38,   0,   0,   0,   0,   0,   0,   0,   0,  39,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  39,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   7,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   4,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   4,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   4,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   4,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   5,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     10,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0
 };
 
-static RE_UINT8 re_other_alphabetic_stage_2[] = {
-     0,  0,  0,  1,  0,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12,
-    13,  0,  0,  0,  0,  0,  0, 14, 15, 16, 17, 18, 19, 20,  0,  0,
-     0,  0,  0,  0, 21,  0,  0,  0,  0,  0,  0,  0,  0, 22,  0,  0,
-     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0, 23,  0, 24, 25, 26, 27,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 28,  0,  0,  0,  0,
-     0,  0,  0, 29,  0,  0,  0,  0,  0,  0, 30,  0,  0, 31,  0,  0,
-    32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42,  0, 43, 44, 45,  0,
-     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 46,
-     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 47,  0,  0,  0,
-    48,  0,  0,  0,  0,  0,  0,  0,  0, 49,  0,  0,  0,  0,  0,  0,
-     0, 50,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+RE_UINT32 re_get_numeric_value(RE_UINT32 codepoint) {
+    RE_UINT32 field_2;
+    RE_UINT32 field_1;
+    RE_UINT32 field_0;
+    RE_UINT32 v;
+
+    field_2 = codepoint >> 10;
+    field_1 = (codepoint >> 5) & 0x1F;
+    field_0 = codepoint & 0x1F;
+
+    v = re_numeric_value_table_1[field_2];
+    v = re_numeric_value_table_2[(v << 5) | field_1];
+    v = re_numeric_value_table_3[(v << 5) | field_0];
+
+    return v;
+}
+
+/* Other_Alphabetic. */
+static RE_UINT8 re_other_alphabetic_table_1[] = {
+     0,  1,  2,  3,  4,  5,  6,  7,  8,  9,  8, 10,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8, 11, 12,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8, 13,  8,
+    14,  8, 15, 16, 17, 18, 19, 20,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8, 21,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8, 22,
+     8,  8,  8,  8,  8,  8,  8,  8, 23,  8, 24,  8, 25,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8
 };
 
-static RE_UINT8 re_other_alphabetic_stage_3[] = {
+static RE_UINT8 re_other_alphabetic_table_2[] = {
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   2,   3,   0,   4,   0,   5,   6,   0,   0,   7,   8,
-      9,  10,   0,   0,   0,  11,   0,   0,  12,  13,   0,   0,   0,   0,  14,  15,
-     16,  17,  18,  19,  20,  21,  22,  19,  20,  21,  23,  24,  20,  21,  25,  26,
-     20,  21,  27,  19,  28,  21,  29,   0,  16,  21,  30,  19,  20,  21,  30,  19,
-     16,  21,  31,  19,  19,   0,  32,  33,   0,  34,  35,   0,   0,  36,  35,   0,
-      0,   0,   0,  37,  38,  39,   0,   0,   0,  40,  41,  42,  43,   0,   0,   0,
-     33,  33,  33,  33,   0,  44,  45,   0,   0,   0,   0,   0,  46,  47,   0,   0,
-      0,  48,   0,   0,   0,   0,   0,   0,  49,   0,  50,  51,   0,   0,   0,   0,
-     52,  53,  16,   0,  54,  55,   0,  56,   0,  57,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,  58,   0,   0,   0,   0,   0,  44,  59,  60,
-      0,   0,   0,   0,   0,   0,   0,  59,   0,   0,   0,  61,  21,   0,   0,   0,
-     62,  63,   0,   0,  64,  14,  65,  66,   0,  67,  68,   0,  16,  14,   0,   1,
-      0,  69,  70,  71,   0,  72,   0,  73,   0,   0,   0,   0,   0,   0,   0,  74,
-     75,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  76,   0,   0,   0,   0,
-     77,   0,   0,   0,   0,   0,   0,   0,   0,  78,   0,   0,   0,   0,   0,   0,
-     54,  79,  80,   0,  28,  81,   0,   0,  54,  68,  46,   0,  54,  82,   0,   0,
-      0,  83,   0,   0,   0,   0,  66,  45,  16,  21,  22,  19,   0,   0,   0,   0,
-      0,  53,  84,   0,   0,  10,  64,   0,   0,   0,   0,   0,   0,  85,  86,   0,
-      0,  87,  88,   0,   0,  89,   0,   0,  90,  91,   0,   0,   0,   0,   0,   0,
-      0,  92,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  93,  94,
-     95,  96,  97,   0,  98,   0,   0,   0,   0,  99,   0,   0, 100, 101,   0,   0,
-      0, 102, 103,   0, 104,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 105,
-      0,   0, 106,  59, 107,   0,   0,   0,   0,   0,   0,   0,  75,   0,   0,   0,
-    108, 109,   0,   0,   0,   0,   0,   0,   0,   0, 110,   0,   0,   0,   0,   0,
-      0,  10, 111, 111,  60,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   3,   0,
+      4,   0,   5,   6,   0,   0,   7,   8,   9,  10,   0,   0,   0,  11,   0,   0,
+     12,  13,   0,   0,   0,   0,  14,  15,  16,  17,  18,  19,  20,  21,  22,  19,
+     20,  21,  23,  24,  20,  21,  25,  26,  20,  21,  27,  19,  28,  21,  29,   0,
+     16,  21,  30,  19,  20,  21,  30,  19,  16,  21,  31,  19,  20,   0,  32,  33,
+      0,  34,  35,   0,   0,  36,  35,   0,   0,   0,   0,  37,  38,  39,   0,   0,
+      0,  40,  41,  42,  43,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,  33,  33,  33,  33,   0,  44,  45,   0,
+      0,   0,   0,   0,  46,  47,   0,   0,   0,  48,   0,   0,   0,   0,   0,   0,
+     49,   0,  50,  51,   0,  52,  53,   0,  54,  55,  16,   0,  56,  57,   0,  58,
+      0,  59,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  60,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,  44,  61,  62,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  61,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,  63,  21,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     64,  65,   0,   0,  66,  14,  67,  52,   0,  68,  69,   0,  16,  14,   0,   1,
+      0,  70,  71,  72,   0,  73,   0,  74,   0,   0,   0,   0,   0,   0,   0,  75,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,  76,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  77,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     78,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,  79,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,  80,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     56,  81,  82,   0,  28,  83,   0,   0,  56,  69,  46,   0,  56,  84,  85,   0,
+      0,  86,   0,   0,   0,   0,  52,  45,  16,  21,  22,  19,   0,   0,   0,   0,
+      0,  55,  87,   0,   0,  10,  66,   0,   0,   0,   0,   0,   0,  88,  89,   0,
+      0,  90,  53,   0,   0,  91,   0,   0,  92,  93,   0,   0,   0,   0,   0,   0,
+      0,  94,   0,   0,   0,   0,   0,   0,   0,  95,  96,   0,   0,   0,  97,  98,
+     99, 100, 101,   0, 102,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0, 103,   0,   0, 104, 105,   0,   0,   0, 106, 107,   0, 108,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0, 109,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 110,  61, 111,   0,   0, 112,
+      0,   0,   0,   0,  76,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    113, 114,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 115,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,  10, 116, 116,  62,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0
 };
 
-static RE_UINT8 re_other_alphabetic_stage_4[] = {
+static RE_UINT8 re_other_alphabetic_table_3[] = {
       0,   0,   0,   0,  32,   0,   0,   0,   0,   0, 255, 191, 182,   0,   0,   0,
       0,   0, 255,   7,   0, 248, 255, 254,   0,   0,   1,   0,   0,   0, 192,  31,
     158,  33,   0,   0,   0,   0,   2,   0,   0,   0, 255, 255, 192, 255,   1,   0,
@@ -10596,5620 +18401,7541 @@ static RE_UINT8 re_other_alphabetic_stage_4[] = {
       0, 248, 127, 121,   0,   0, 192, 195, 157,  63,  30,   0, 252, 191,   0,  60,
       0,   0, 192, 255, 255,   1,   0,   0,  96,   0,   0,   0,   0,   2,   0,   0,
     255,  15, 255,   1,   0,   0, 128,  15,   0,   0, 224, 127, 254, 255,  31,   0,
-     31,   0,   0,   0,   0,   0, 224, 255,   7,   0,   0,   0, 254,  51,   0,   0,
-    128, 255,   3,   0, 240, 255, 127,   0, 128, 255,  31,   0, 255, 255, 255, 255,
-    255,   3,   0,   0,   0,   0, 240,  15,   4,   8,   0,   0, 248,   0,   0,   0,
-      3,   0,   0,   0,  47,   0,   0,   0,   0,   0,   0, 128, 192,   7,   0,   0,
-    128, 255,   7,   0,   0, 254, 127,   0,   8,  48,   0,   0,   0,   0,   0,  56,
-      0,   0, 157,  65,   0, 248,  32,   0, 248,   7,   0,   0,   0,   0,   0,  64,
-      0,   0, 192,   7, 110, 240,   0,   0, 240,   0,   0,   0,   0,   0,   0, 255,
-     63,   0,   0,   0,   0,   0, 255,   1,   0,   0, 248, 255,   0, 240, 159,  64,
-     59,   0,   0,   0,   0, 128,  63, 127,   0,   0,   0,  48,   0,   0, 255, 127,
-      1,   0,   0,   0,   0, 248,  63,   0,   0,   0,   0, 224, 255,   7,   0,   0,
-      0, 240, 255,   1,   0,   0, 254, 252,  16,   0,   0,   0, 254,   7,   0,   0,
+      0,   0,   0, 128,   1,   0,   0,   0,  31,   0,   0,   0,   0,   0, 224, 255,
+      7,   0,   0,   0, 254,  51,   0,   0, 128, 255,   3,   0, 240, 255, 127,   0,
+    128, 255,  31,   0, 255, 255, 255, 255, 255,   3,   0,   0,   0,   0, 240,  15,
+      4,   8,   0,   0, 248,   0,   0,   0,   3,   0,   0,   0,  47,   0,   0,   0,
+    192,   7,   0,   0, 128, 255,   7,   0,   0, 254, 127,   0,   8,  48,   0,   0,
+      0,   0,   0,  56,   0,   0, 157,  65,   0, 248,  32,   0, 248,   7,   0,   0,
+      0,   0,   0,  64,   0,   0, 192,   7, 110, 240,   0,   0, 240,   0,   0,   0,
+      0,  24,   0,   0,   0,   0,   0, 255,  63,   0,   0,   0,   0,   0, 255,   1,
+      0,   0, 248, 255,   0, 192,   0,   0,   0, 240, 159,  64,  59,   0,   0,   0,
+      0, 128,  63, 127,   0,   0,   0,  48,   0,   0, 255, 127,   0, 248,  63,   0,
+      0,   0,   0, 224, 255,   7,   0,   0,   0, 240, 255,   1,   0,   0, 191,  25,
+      5,   0,   0,   0,   0,   0, 254, 252,  16,   0,   0,   0, 254,   7,   0,   0,
       0,   0, 224, 123,   0,   0, 254,  15,   0, 252, 255,   0,   0, 128, 127, 127,
       0,   0, 252, 255, 255, 254, 127,   0,   0,   0, 126, 180, 139,   0,   0,   0,
       0, 124, 123,   0,   0,   0, 120,   0,   0, 128, 254, 255, 255, 128,   7,   0,
-    127, 255, 255, 249, 219,   7,   0,   0, 128,   0,   0,   0, 255,   3, 255, 255,
-};
-
-/* Other_Alphabetic: 1280 bytes. */
-
-RE_UINT32 re_get_other_alphabetic(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-
-    f = ch >> 13;
-    code = ch ^ (f << 13);
-    pos = (RE_UINT32)re_other_alphabetic_stage_1[f] << 5;
-    f = code >> 8;
-    code ^= f << 8;
-    pos = (RE_UINT32)re_other_alphabetic_stage_2[pos + f] << 3;
-    f = code >> 5;
-    code ^= f << 5;
-    pos = (RE_UINT32)re_other_alphabetic_stage_3[pos + f] << 5;
-    pos += code;
-    value = (re_other_alphabetic_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1;
-
-    return value;
-}
-
-/* Ideographic. */
-
-static RE_UINT8 re_ideographic_stage_1[] = {
-     0,  1,  2,  3,  4,  0,  0,  5,  0,  0,  0,  6,  7,  8,  0,  0,
-     3,  3,  3,  3,  3,  9, 10, 11,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0,  0,  0,
-};
-
-static RE_UINT8 re_ideographic_stage_2[] = {
-     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0,  0,  0,  1,  0,  2,  2,  2,  2,  2,  2,
-     2,  2,  2,  2,  2,  2,  3,  2,  2,  2,  2,  2,  2,  2,  2,  2,
-     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
-     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  4,
-     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  5,  6,  0,  0,
-     0,  0,  0,  0,  0,  0,  0,  0,  2,  2,  2,  2,  2,  2,  2,  2,
-     2,  2,  2,  7,  2,  8,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0,  0,  0,  9, 10,  0,  0,  0,  0,  0,  0,
-     2,  2,  2, 11,  2,  2,  2,  2,  2,  2,  2, 12, 13,  2,  2,  2,
-     2,  2,  2,  2,  2,  2,  2, 14,  2,  2,  2,  2,  2,  2,  2,  2,
-     2,  2,  2,  2,  2, 15,  0,  0,  0,  0,  0,  0,  2, 16,  0,  0,
-};
-
-static RE_UINT8 re_ideographic_stage_3[] = {
-     0,  0,  0,  0,  0,  0,  0,  0,  1,  0,  0,  0,  0,  0,  0,  0,
-     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  3,  0,
-     2,  2,  2,  2,  2,  2,  2,  4,  0,  0,  0,  0,  2,  2,  2,  2,
-     2,  5,  2,  6,  0,  0,  0,  0,  2,  2,  2,  2,  2,  2,  2,  7,
-     2,  2,  2,  8,  0,  0,  0,  0,  0,  0,  0,  0,  0,  9,  2,  2,
-     2,  2,  2, 10,  0,  0,  0,  0,  2,  2,  2, 11,  2,  2,  2,  2,
-     2,  2,  2,  2, 12,  2,  2,  2, 13,  2,  2,  2,  2,  2,  2,  2,
-     2,  2, 14,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2, 15,
-    16,  0,  0,  0,  0,  0,  0,  0,
-};
-
-static RE_UINT8 re_ideographic_stage_4[] = {
-      0,   0,   0,   0,   0,   0,   0,   0, 192,   0,   0,   0, 254,   3,   0,   7,
-    255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,  63,   0,
-    255, 255, 255, 255, 255, 255,   0,   0, 255, 255, 255, 255, 255,  63, 255, 255,
-    255, 255, 255,   3,   0,   0,   0,   0, 255, 255, 255, 255, 255, 255, 255,   0,
-    255, 255, 255, 255, 255, 255,   7,   0,   0,   0,   0,   0,   0,   0, 255, 255,
-    255, 255, 255, 255, 255, 255, 255,  15, 255, 255, 127,   0,   0,   0,   0,   0,
-    255, 255, 255, 255, 255, 255,  31,   0, 255, 255, 255,  63, 255, 255, 255, 255,
-    255, 255, 255, 255,   3,   0, 255, 255, 255, 255, 255, 255,   1,   0,   0,   0,
-    255, 255, 255,  63,   0,   0,   0,   0,
-};
-
-/* Ideographic: 600 bytes. */
-
-RE_UINT32 re_get_ideographic(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-
-    f = ch >> 13;
-    code = ch ^ (f << 13);
-    pos = (RE_UINT32)re_ideographic_stage_1[f] << 4;
-    f = code >> 9;
-    code ^= f << 9;
-    pos = (RE_UINT32)re_ideographic_stage_2[pos + f] << 3;
-    f = code >> 6;
-    code ^= f << 6;
-    pos = (RE_UINT32)re_ideographic_stage_3[pos + f] << 6;
-    pos += code;
-    value = (re_ideographic_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1;
-
-    return value;
-}
-
-/* Diacritic. */
-
-static RE_UINT8 re_diacritic_stage_1[] = {
-    0, 1, 2, 2, 2, 3, 2, 4, 5, 2, 2, 6, 2, 2, 7, 8,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2,
-};
-
-static RE_UINT8 re_diacritic_stage_2[] = {
-     0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15,
-    16,  1,  1, 17,  1,  1,  1, 18,  1, 19, 20, 21, 22, 23,  1, 24,
-     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1, 25,  1, 26,  1,
-    27,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
-     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
-     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
-     1,  1,  1,  1,  1,  1, 28, 29, 30, 31, 32, 33,  1,  1,  1,  1,
-     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
-     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
-     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1, 34,  1,  1, 35, 36,
-     1,  1, 37,  1,  1,  1,  1,  1,  1,  1, 38,  1,  1, 39,  1, 40,
-    41, 42, 43, 44, 45, 46, 47, 48, 49, 37, 50,  1, 51, 52,  1,  1,
-     1,  1,  1,  1,  1,  1,  1,  1,  1,  1, 53, 54,  1,  1,  1, 55,
-     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
-     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
-     1, 56,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
-     1, 54, 57,  1,  1,  1,  1,  1, 58, 59,  1,  1,  1,  1,  1,  1,
-     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
-};
-
-static RE_UINT8 re_diacritic_stage_3[] = {
-     0,  0,  1,  2,  0,  3,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  4,  5,  5,  5,  5,  6,  7,  8,  0,  0,  0,
-     0,  0,  0,  0,  9,  0,  0,  0,  0,  0, 10,  0, 11, 12, 13,  0,
-     0,  0, 14,  0,  0,  0, 15, 16,  0,  4, 17,  0,  0, 18,  0, 19,
-    20,  0,  0,  0,  0,  0,  0, 21,  0, 22, 23, 24,  0, 22, 25,  0,
-     0, 22, 25,  0,  0, 22, 25, 26,  0, 22, 25,  0,  0,  0, 25,  0,
-     0,  0, 25,  0,  0, 22, 25,  0,  0, 27, 25,  0,  0,  0, 28,  0,
-     0,  0, 29,  0,  0, 30, 31,  0, 20, 32,  0,  0, 33,  0, 34,  0,
-     0, 35,  0, 36, 37,  0,  0,  0,  0,  0, 26,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0, 38,  0,  0, 39,  0,  0,  0,  0,  0,  0,
-     0,  0,  0, 40,  0, 41,  0,  0,  0, 42, 43, 44,  0, 45,  0,  0,
-     0, 46,  0, 47,  0,  0,  4, 48,  0, 49,  5, 17,  0,  0, 50, 51,
-     0,  0,  0,  0,  0, 52, 53, 54,  0,  0,  0,  0,  0,  0,  0, 55,
-     0, 56,  0,  0,  0,  0,  0,  0,  0, 57,  0,  0, 58,  0,  0, 22,
-     0,  0,  0, 59, 60,  0,  0, 61,  5, 62,  0,  0, 63,  0,  0, 20,
-     0,  0,  0,  0,  0,  0, 43, 64,  0, 65, 66,  0,  0, 66,  2, 67,
-     0,  0,  0, 68,  0, 15, 69, 70,  0,  0, 71,  0,  0,  0,  0, 72,
-     1,  0,  0,  0,  0,  0,  0,  0,  0, 73,  0,  0,  0,  0,  0,  0,
-     0,  1,  2, 74, 75,  0,  0, 76,  0,  0,  0,  0,  0,  0,  0,  2,
-     0,  0,  0,  0,  0,  0,  0, 77,  0, 78,  0,  0,  0,  0,  0,  0,
-     0,  0, 18,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 79,  0,  0,
-     0, 80,  0, 66,  0,  0, 81,  0,  0, 82,  0,  0,  0,  0,  0, 83,
-     0, 22, 25, 84,  0,  0,  0,  0,  0,  0, 85,  0,  0,  0, 86,  0,
-     0,  0,  0,  0,  0, 15,  2,  0,  0, 15,  0,  0,  0, 46,  0,  0,
-     0, 87,  0,  0,  0,  0,  0,  0,  0, 79,  0,  0,  0,  0,  0,  0,
-     0, 42, 88,  0, 10,  0,  0,  0,  0, 15,  0,  0,  0,  0,  0,  0,
-     0,  0, 89,  0, 90,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 91,
-     0, 92,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 93,  0,  0,  0,
-     0,  0,  0, 94, 95, 96,  0,  0,  0,  0,  0,  0,  0,  0,  0, 97,
-     0,  0,  0,  0,  0,  0, 92,  0,  0,  0, 98,  0,  0,  0,  0,  0,
-};
-
-static RE_UINT8 re_diacritic_stage_4[] = {
-      0,   0,   0,   0,   0,   0,   0,  64,   1,   0,   0,   0,   0, 129, 144,   1,
-      0,   0, 255, 255, 255, 255, 255, 255, 255, 127, 255, 224,   7,   0,  48,   4,
-     48,   0,   0,   0, 248,   0,   0,   0,   0,   0,   0,   2,   0,   0, 254, 255,
-    251, 255, 255, 191,  22,   0,   0,   0,   0, 248, 135,   1,   0,   0,   0, 128,
-     97,  28,   0,   0, 255,   7,   0,   0, 192, 255,   1,   0,   0, 248,  63,   0,
-      0,   0,   0,   3, 248, 255, 255, 127,   0,   0,   0,  16,   0,  32,  30,   0,
-      0,   0,   2,   0,   0,  32,   0,   0,   0,   0,   0, 224,   0,   0,   0,  24,
-      0,   4,   0,   0, 128,  95,   0,   0,   0,   0,   0,   4,   0,  31,   0,   0,
-      0,   0, 160, 194, 220,   0,   0,   0,  64,   0,   0,   0,   0,   0, 128,   6,
-     24,  62,   0,   0, 128, 191,   0,  12,   0, 254,  15,  32,   0,   0,   0,  14,
-      0,   0, 224, 159,   0,   0, 255,  63,   0,   0,  16,   0,  16,   0,   0,   0,
-      0, 248,  15,   0,   0,  12,   0,   0,   0,   0, 192,   0,   0,   0,   0,  63,
-    255,  33, 144,   3,   0, 240, 255, 255, 240, 255,   0,   0,   0,   0, 224, 227,
-      0,   0,   0, 160,   3, 224,   0, 224,   0, 224,   0,  96,   0, 128,   3,   0,
-      0, 128,   0,   0,   0, 252,   0,   0,   0,   0,   0,  30,   0, 128,   0, 176,
-      0,   0,   0,  48,   0,   0,   3,   0,   3,   0,   0,   0,   0,   7,   0,   0,
-    255, 255,   3,   0,   0, 120,   0,   0,   0,   0,   8,   0,  32,   0,   0,   0,
-      0,   0,   0,  56,   7,   0,   0,   0,   0,   0,  64,   0,   0,   0,   0, 248,
-      0,  48,   0,   0, 255, 255,   0,   0,   0,   0,   1,   0,   0,   0,   0, 192,
-      8,   0,   0,   0,  96,   0,   0,   0, 252,   0,   0,   0,   0,   0,   0,   6,
-      0,   0,  24,   0,   1,  28,   0,   0,   0,   0,  96,   0,   0,   6,   0,   0,
-    192,  31,  31,   0,  68,   0,   0,   0,  12,   0,   0,   0,   0,   8,   0,   0,
-    128,   0,   0,   0,  52,   0,   0,   0,   0,   0, 128,   0,   0,   0,  31,   0,
-      0,   0, 127,   0,   0, 128, 255, 255, 128, 227,   7, 248, 231,  15,   0,   0,
-      0,  60,   0,   0,   0, 240,   0,   0, 112,   7,   0,   0,
-};
-
-/* Diacritic: 1300 bytes. */
-
-RE_UINT32 re_get_diacritic(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-
-    f = ch >> 13;
-    code = ch ^ (f << 13);
-    pos = (RE_UINT32)re_diacritic_stage_1[f] << 5;
-    f = code >> 8;
-    code ^= f << 8;
-    pos = (RE_UINT32)re_diacritic_stage_2[pos + f] << 3;
-    f = code >> 5;
-    code ^= f << 5;
-    pos = (RE_UINT32)re_diacritic_stage_3[pos + f] << 5;
-    pos += code;
-    value = (re_diacritic_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1;
-
-    return value;
-}
-
-/* Extender. */
-
-static RE_UINT8 re_extender_stage_1[] = {
-    0, 1, 2, 2, 2, 3, 2, 4, 5, 2, 2, 6, 2, 2, 2, 7,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2,
+      0,   0,   3,   0, 127, 255, 255, 249, 219,   7,   0,   0, 128,   0,   0,   0,
+    255,   3, 255, 255
 };
 
-static RE_UINT8 re_extender_stage_2[] = {
-     0,  1,  2,  3,  2,  2,  2,  4,  2,  2,  2,  2,  5,  6,  7,  2,
-     2,  2,  2,  2,  2,  2,  2,  2,  8,  2,  2,  2,  2,  2,  2,  2,
-     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
-     9,  2,  2, 10, 11, 12,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
-     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2, 13,
-     2,  2,  2,  2,  2,  2,  2,  2,  2, 14, 15,  2,  2, 16,  2,  2,
-     2,  2,  2,  2,  2, 17,  2, 18,  2,  2,  2,  2,  2,  2,  2,  2,
-    19,  2,  2,  2, 20,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
-};
+RE_UINT32 re_get_other_alphabetic(RE_UINT32 codepoint) {
+    RE_UINT32 field_2;
+    RE_UINT32 field_1;
+    RE_UINT32 field_0;
+    RE_UINT32 offset;
+    RE_UINT32 v;
 
-static RE_UINT8 re_extender_stage_3[] = {
-     0,  0,  1,  0,  0,  0,  0,  0,  0,  0,  0,  2,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0,  0,  0,  0,  3,  0,  0,  0,  0,  0,  4,
-     0,  5,  0,  5,  0,  0,  0,  0,  6,  7,  0,  0,  0,  0,  0,  0,
-     0,  0,  8,  0,  0,  0,  0,  0,  9, 10,  0,  0,  0,  0,  0,  0,
-    11,  0, 12, 13,  0,  0,  0,  0, 14,  0,  0,  0,  0,  0,  0,  0,
-    15,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 16,
-     0, 17,  0, 18,  0,  0,  0,  0,  0,  0,  0,  0,  0, 17,  0,  0,
-     0,  0,  0,  0,  0, 19,  0,  0,  0,  0,  0,  0,  0,  0,  0, 20,
-     0,  0, 21,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 22,  0,  0,
-     0,  0,  0,  0,  0,  0,  0, 23,  0,  0,  0,  0, 24,  0,  0,  0,
-     0,  0,  0,  0,  0, 25,  0,  0,
-};
+    field_2 = codepoint >> 10;
+    field_1 = (codepoint >> 5) & 0x1F;
+    field_0 = (codepoint >> 3) & 0x3;
+    offset = codepoint & 0x7;
 
-static RE_UINT8 re_extender_stage_4[] = {
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 128,   0,
-      0,   0,   3,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   4,  64,   0,   0,   0,   0,   0,   0,   0,
-      0,   4,   0,   0,   0,   0,   0,   0,   8,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0, 128,   0,   0,   0,   0,   0,   0,   0,   0,   0,  64,   0,
-      0,   0,   0,   0,   0,   0,   0,   8,  32,   0,   0,   0,   0,   0,  62,   0,
-      0,   0,   0,  96,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 112,
-      0,   0,  32,   0,   0,   0,   0,   0,   0,  16,   0,   0,   0,   0,   0,   0,
-      0, 128,   0,   0,  64,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,
-      0,   0,   0,  32,   0,   0,  24,   0,   0,   0,   0,  32,   0,   0,   0,   0,
-    192,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,
-     12,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  11,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,  48, 112,   0,   0,   0,   0,   0,   0,   0,
-};
+    v = re_other_alphabetic_table_1[field_2];
+    v = re_other_alphabetic_table_2[(v << 5) | field_1];
+    v = re_other_alphabetic_table_3[(v << 2) | field_0];
 
-/* Extender: 640 bytes. */
-
-RE_UINT32 re_get_extender(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-
-    f = ch >> 13;
-    code = ch ^ (f << 13);
-    pos = (RE_UINT32)re_extender_stage_1[f] << 4;
-    f = code >> 9;
-    code ^= f << 9;
-    pos = (RE_UINT32)re_extender_stage_2[pos + f] << 3;
-    f = code >> 6;
-    code ^= f << 6;
-    pos = (RE_UINT32)re_extender_stage_3[pos + f] << 6;
-    pos += code;
-    value = (re_extender_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1;
-
-    return value;
+    return (v >> offset) & 0x1;
 }
 
-/* Other_Lowercase. */
-
-static RE_UINT8 re_other_lowercase_stage_1[] = {
-    0, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+/* Other_Default_Ignorable_Code_Point. */
+static RE_UINT8 re_other_default_ignorable_code_point_table_1[] = {
+    0, 1, 1, 1, 2, 3, 1, 1, 4, 1, 1, 1, 5, 1, 1, 1,
     1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
     1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 6,
     1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1,
-};
-
-static RE_UINT8 re_other_lowercase_stage_2[] = {
-    0, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 2,
-    4, 2, 5, 2, 2, 2, 6, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 7, 2, 8, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-};
-
-static RE_UINT8 re_other_lowercase_stage_3[] = {
-     0,  0,  1,  0,  0,  0,  0,  0,  0,  0,  2,  3,  0,  4,  0,  0,
-     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  5,  6,  7,  0,
-     0,  8,  9,  0,  0, 10,  0,  0,  0,  0,  0, 11,  0,  0,  0,  0,
-     0, 12,  0,  0,  0,  0,  0,  0,  0,  0, 13,  0,  0, 14,  0, 15,
-     0,  0,  0,  0,  0, 16,  0,  0,
-};
-
-static RE_UINT8 re_other_lowercase_stage_4[] = {
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   4,   0,   4,
-      0,   0,   0,   0,   0,   0, 255,   1,   3,   0,   0,   0,  31,   0,   0,   0,
-     32,   0,   0,   0,   0,   0,   0,   4,   0,   0,   0,   0,   0, 240, 255, 255,
-    255, 255, 255, 255, 255,   7,   0,   1,   0,   0,   0, 248, 255, 255, 255, 255,
-      0,   0,   0,   0,   0,   0,   2, 128,   0,   0, 255,  31,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0, 255, 255,   0,   0, 255, 255, 255,   3,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,  48,   0,   0,   0,  48,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   3,
-      0,   0,   0, 240,   0,   0,   0,   0,
-};
-
-/* Other_Lowercase: 372 bytes. */
-
-RE_UINT32 re_get_other_lowercase(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-
-    f = ch >> 14;
-    code = ch ^ (f << 14);
-    pos = (RE_UINT32)re_other_lowercase_stage_1[f] << 5;
-    f = code >> 9;
-    code ^= f << 9;
-    pos = (RE_UINT32)re_other_lowercase_stage_2[pos + f] << 3;
-    f = code >> 6;
-    code ^= f << 6;
-    pos = (RE_UINT32)re_other_lowercase_stage_3[pos + f] << 6;
-    pos += code;
-    value = (re_other_lowercase_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1;
-
-    return value;
-}
-
-/* Other_Uppercase. */
-
-static RE_UINT8 re_other_uppercase_stage_1[] = {
-    0, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
     1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1,
-};
-
-static RE_UINT8 re_other_uppercase_stage_2[] = {
-    0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0,
-};
-
-static RE_UINT8 re_other_uppercase_stage_3[] = {
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 1, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0,
-    0, 0, 3, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    7, 8, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
 };
 
-static RE_UINT8 re_other_uppercase_stage_4[] = {
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 255, 255,   0,   0,
-      0,   0,   0,   0,   0,   0, 192, 255, 255, 255,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0, 255, 255, 255,   3, 255, 255, 255,   3, 255, 255,
-    255,   3,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+static RE_UINT8 re_other_default_ignorable_code_point_table_2[] = {
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  2,  3,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  4,  0,  0,
+     0,  0,  0,  5,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  6,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  3,  0,  7,
+     8,  0,  0,  0,  9,  9,  9,  9,  0,  0,  0,  0,  0,  0,  0, 10,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9
 };
 
-/* Other_Uppercase: 210 bytes. */
-
-RE_UINT32 re_get_other_uppercase(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-
-    f = ch >> 15;
-    code = ch ^ (f << 15);
-    pos = (RE_UINT32)re_other_uppercase_stage_1[f] << 4;
-    f = code >> 11;
-    code ^= f << 11;
-    pos = (RE_UINT32)re_other_uppercase_stage_2[pos + f] << 4;
-    f = code >> 7;
-    code ^= f << 7;
-    pos = (RE_UINT32)re_other_uppercase_stage_3[pos + f] << 7;
-    pos += code;
-    value = (re_other_uppercase_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1;
-
-    return value;
-}
-
-/* Noncharacter_Code_Point. */
-
-static RE_UINT8 re_noncharacter_code_point_stage_1[] = {
-    0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1,
+static RE_UINT8 re_other_default_ignorable_code_point_table_3[] = {
+      0,   0,   0,   0,   0, 128,   0,   0,   0,   0,   0, 128,   1,   0,   0,   0,
+      0,   0,  48,   0,  32,   0,   0,   0,  16,   0,   0,   0,   0,   0, 255,   1,
+    253, 255, 255, 255, 255, 255, 255, 255,   0,   0, 255, 255
 };
 
-static RE_UINT8 re_noncharacter_code_point_stage_2[] = {
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2,
-};
+RE_UINT32 re_get_other_default_ignorable_code_point(RE_UINT32 codepoint) {
+    RE_UINT32 field_2;
+    RE_UINT32 field_1;
+    RE_UINT32 field_0;
+    RE_UINT32 offset;
+    RE_UINT32 v;
 
-static RE_UINT8 re_noncharacter_code_point_stage_3[] = {
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 2,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2,
-};
+    field_2 = codepoint >> 10;
+    field_1 = (codepoint >> 5) & 0x1F;
+    field_0 = (codepoint >> 3) & 0x3;
+    offset = codepoint & 0x7;
 
-static RE_UINT8 re_noncharacter_code_point_stage_4[] = {
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 255, 255, 255, 255,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 192,
-};
+    v = re_other_default_ignorable_code_point_table_1[field_2];
+    v = re_other_default_ignorable_code_point_table_2[(v << 5) | field_1];
+    v = re_other_default_ignorable_code_point_table_3[(v << 2) | field_0];
 
-/* Noncharacter_Code_Point: 177 bytes. */
-
-RE_UINT32 re_get_noncharacter_code_point(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-
-    f = ch >> 16;
-    code = ch ^ (f << 16);
-    pos = (RE_UINT32)re_noncharacter_code_point_stage_1[f] << 5;
-    f = code >> 11;
-    code ^= f << 11;
-    pos = (RE_UINT32)re_noncharacter_code_point_stage_2[pos + f] << 4;
-    f = code >> 7;
-    code ^= f << 7;
-    pos = (RE_UINT32)re_noncharacter_code_point_stage_3[pos + f] << 7;
-    pos += code;
-    value = (re_noncharacter_code_point_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1;
-
-    return value;
+    return (v >> offset) & 0x1;
 }
 
 /* Other_Grapheme_Extend. */
-
-static RE_UINT8 re_other_grapheme_extend_stage_1[] = {
-    0, 1, 1, 2, 3, 1, 1, 4, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 5, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1,
-};
-
-static RE_UINT8 re_other_grapheme_extend_stage_2[] = {
+static RE_UINT8 re_other_grapheme_extend_table_1[] = {
      0,  0,  1,  2,  0,  0,  3,  0,  4,  0,  0,  0,  5,  0,  0,  0,
      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  6,
-     0,  0,  0,  0,  7,  8,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  7,  8,  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0, 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    11,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0
 };
 
-static RE_UINT8 re_other_grapheme_extend_stage_3[] = {
-     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  0,  0,  1,  1,
-     0,  2,  1,  3,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  4,  0,
-     5,  0,  0,  0,  0,  0,  0,  0,  6,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0,  0,  7,  0,  0,  0,  0,  0,  0,  1,  0,
-     0,  8,  0,  9,  0,  0,  0,  0,  0,  0, 10,  0,  0,  0,  0,  0,
-    11,  0,  0,  0,  0,  0,  0,  0,
+static RE_UINT8 re_other_grapheme_extend_table_2[] = {
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  2,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  2,  0,  0,  1,  2,  0,
+     0,  0,  0,  0,  0,  0,  3,  0,  0,  1,  2,  0,  0,  0,  4,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  5,  0,  0,  0,  0,  0,  0,
+     6,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  7,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  8,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  2,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  9,  0,  0,  0,  0,  0,  0,  0, 10,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0, 11,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 12,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0, 13, 13, 13,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0
 };
 
-static RE_UINT8 re_other_grapheme_extend_stage_4[] = {
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,  64,   0,   0, 128,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   4,   0,  96,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0, 128,   0, 128,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,  32,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,  16,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0, 192,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0, 192,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   1,  32,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0, 128,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  32, 192,   7,   0,
-      0,   0,   0,   0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
+static RE_UINT8 re_other_grapheme_extend_table_3[] = {
+      0,   0,   0,   0,   0,   0,   0,  64,   0,   0, 128,   0,   4,   0,  96,   0,
+      0, 128,   0, 128,   0,   0,  32,   0,   0,  16,   0,   0,   0, 192,   0,   0,
+      0,   0,   0, 192,   0,   0,   1,  32,   0, 128,   0,   0,   0,   0,   1,   0,
+     32, 192,   7,   0, 255, 255, 255, 255
 };
 
-/* Other_Grapheme_Extend: 444 bytes. */
-
-RE_UINT32 re_get_other_grapheme_extend(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-
-    f = ch >> 14;
-    code = ch ^ (f << 14);
-    pos = (RE_UINT32)re_other_grapheme_extend_stage_1[f] << 4;
-    f = code >> 10;
-    code ^= f << 10;
-    pos = (RE_UINT32)re_other_grapheme_extend_stage_2[pos + f] << 3;
-    f = code >> 7;
-    code ^= f << 7;
-    pos = (RE_UINT32)re_other_grapheme_extend_stage_3[pos + f] << 7;
-    pos += code;
-    value = (re_other_grapheme_extend_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1;
-
-    return value;
+RE_UINT32 re_get_other_grapheme_extend(RE_UINT32 codepoint) {
+    RE_UINT32 field_2;
+    RE_UINT32 field_1;
+    RE_UINT32 field_0;
+    RE_UINT32 offset;
+    RE_UINT32 v;
+
+    field_2 = codepoint >> 10;
+    field_1 = (codepoint >> 5) & 0x1F;
+    field_0 = (codepoint >> 3) & 0x3;
+    offset = codepoint & 0x7;
+
+    v = re_other_grapheme_extend_table_1[field_2];
+    v = re_other_grapheme_extend_table_2[(v << 5) | field_1];
+    v = re_other_grapheme_extend_table_3[(v << 2) | field_0];
+
+    return (v >> offset) & 0x1;
 }
 
-/* IDS_Binary_Operator. */
+/* Other_ID_Continue. */
+RE_UINT32 re_get_other_id_continue(RE_UINT32 codepoint) {
+    if (codepoint == 0xB7)
+        return 1;
+    if (codepoint == 0x0387)
+        return 1;
+    if (0x1369 <= codepoint && codepoint <= 0x1371)
+        return 1;
+    if (codepoint == 0x19DA)
+        return 1;
+
+    return 0;
+}
 
-static RE_UINT8 re_ids_binary_operator_stage_1[] = {
-    0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+/* Other_ID_Start. */
+RE_UINT32 re_get_other_id_start(RE_UINT32 codepoint) {
+    if (0x1885 <= codepoint && codepoint <= 0x1886)
+        return 1;
+    if (codepoint == 0x2118)
+        return 1;
+    if (codepoint == 0x212E)
+        return 1;
+    if (0x309B <= codepoint && codepoint <= 0x309C)
+        return 1;
+
+    return 0;
+}
+
+/* Other_Lowercase. */
+static RE_UINT8 re_other_lowercase_table_1[] = {
+    0, 1, 1, 1, 1, 1, 1, 2, 3, 4, 1, 5, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 6, 7, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
     1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
 };
 
-static RE_UINT8 re_ids_binary_operator_stage_2[] = {
-    0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+static RE_UINT8 re_other_lowercase_table_2[] = {
+     0,  0,  0,  0,  0,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  2,  3,  4,  0,  0,  5,  6,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  7,  8,  9, 10,  8,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0, 11, 12,  0,  0,  0,  0,  0,  0, 13,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0, 13, 14,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0, 15,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0, 15,  0,  0,  0,  0,  0,  0, 16,  0,  0,  0, 17,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 18,  0,  0,  0,  0,  0
 };
 
-static RE_UINT8 re_ids_binary_operator_stage_3[] = {
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
+static RE_UINT8 re_other_lowercase_table_3[] = {
+      0,   0,   0,   0,   0,   4,   0,   4,   0,   0, 255,   1,   3,   0,   0,   0,
+     31,   0,   0,   0,  32,   0,   0,   0,   0,   0,   0,   4,   0, 240, 255, 255,
+    255, 255, 255, 255, 255,   7,   0,   1,   0,   0,   0, 248,   0,   0,   2, 128,
+      0,   0, 255,  31,   0,   0, 255, 255, 255,   3,   0,   0,   0,   0,   0,  48,
+      0,   0,   1,   0,   0,   0,   0,   3,   0,   0,   0, 240
 };
 
-static RE_UINT8 re_ids_binary_operator_stage_4[] = {
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 243,  15,
-};
+RE_UINT32 re_get_other_lowercase(RE_UINT32 codepoint) {
+    RE_UINT32 field_2;
+    RE_UINT32 field_1;
+    RE_UINT32 field_0;
+    RE_UINT32 offset;
+    RE_UINT32 v;
 
-/* IDS_Binary_Operator: 130 bytes. */
-
-RE_UINT32 re_get_ids_binary_operator(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-
-    f = ch >> 15;
-    code = ch ^ (f << 15);
-    pos = (RE_UINT32)re_ids_binary_operator_stage_1[f] << 4;
-    f = code >> 11;
-    code ^= f << 11;
-    pos = (RE_UINT32)re_ids_binary_operator_stage_2[pos + f] << 4;
-    f = code >> 7;
-    code ^= f << 7;
-    pos = (RE_UINT32)re_ids_binary_operator_stage_3[pos + f] << 7;
-    pos += code;
-    value = (re_ids_binary_operator_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1;
-
-    return value;
-}
+    field_2 = codepoint >> 10;
+    field_1 = (codepoint >> 5) & 0x1F;
+    field_0 = (codepoint >> 3) & 0x3;
+    offset = codepoint & 0x7;
 
-/* IDS_Trinary_Operator. */
+    v = re_other_lowercase_table_1[field_2];
+    v = re_other_lowercase_table_2[(v << 5) | field_1];
+    v = re_other_lowercase_table_3[(v << 2) | field_0];
 
-static RE_UINT8 re_ids_trinary_operator_stage_1[] = {
-    0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    return (v >> offset) & 0x1;
+}
+
+/* Other_Math. */
+static RE_UINT8 re_other_math_table_1[] = {
+    0, 1, 1, 1, 1, 1, 1, 1, 2, 3, 4, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 5,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 6, 1, 1, 1, 1, 1, 7, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
     1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1,
-};
-
-static RE_UINT8 re_ids_trinary_operator_stage_2[] = {
-    0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-};
-
-static RE_UINT8 re_ids_trinary_operator_stage_3[] = {
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
 };
 
-static RE_UINT8 re_ids_trinary_operator_stage_4[] = {
+static RE_UINT8 re_other_math_table_2[] = {
+     0,  0,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  2,  3,
      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 12,  0,
-};
-
-/* IDS_Trinary_Operator: 130 bytes. */
-
-RE_UINT32 re_get_ids_trinary_operator(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-
-    f = ch >> 15;
-    code = ch ^ (f << 15);
-    pos = (RE_UINT32)re_ids_trinary_operator_stage_1[f] << 4;
-    f = code >> 11;
-    code ^= f << 11;
-    pos = (RE_UINT32)re_ids_trinary_operator_stage_2[pos + f] << 4;
-    f = code >> 7;
-    code ^= f << 7;
-    pos = (RE_UINT32)re_ids_trinary_operator_stage_3[pos + f] << 7;
-    pos += code;
-    value = (re_ids_trinary_operator_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1;
-
-    return value;
-}
-
-/* Radical. */
-
-static RE_UINT8 re_radical_stage_1[] = {
-    0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     4,  5,  6,  7,  8,  0,  9, 10, 11, 12, 13,  0, 14, 15, 16, 17,
+     0,  0,  0,  0,  0,  0,  0,  0, 18,  0,  0,  0,  0, 19, 20, 21,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 22, 23, 24,
+    25,  0, 26, 27,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 25, 28,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 29,  0, 30, 31,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0, 32,  0,  0,  0,  0,  0, 33,  0,  0,  0,  0,  0,  0,
+    34, 34, 35, 34, 36, 37, 38, 34, 39, 40, 41, 34, 34, 34, 34, 34,
+    34, 34, 34, 34, 34, 42, 43, 44, 35, 35, 45, 45, 46, 46, 47, 34,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    38, 48, 49, 50, 51, 52,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0
+};
+
+static RE_UINT8 re_other_math_table_3[] = {
+      0,   0,   0,   0,   0,   0,   0,  64,   0,   0,  39,   0,   0,   0,  51,   0,
+      0,   0,  64,   0,   0,   0,  28,   0,   1,   0,   0,   0,  30,   0,   0,  96,
+      0,  96,   0,   0,   0,   0, 255,  31,  98, 248,   0,   0, 132, 252,  47,  62,
+     16, 179, 251, 241, 224,   3,   0,   0,   0,   0, 224, 243, 182,  62, 195, 240,
+    255,  63, 235,  47,  48,   0,   0,   0,   0,  15,   0,   0,   0,   0, 176,   0,
+      0,   0,   1,   0,   4,   0,   0,   0,   3, 192, 127, 240, 193, 140,  15,   0,
+    148,  31,   0,   0,  96,   0,   0,   0,   5,   0,   0,   0,  15,  96,   0,   0,
+    192, 255,   0,   0, 248, 255, 255,   1,   0,   0,   0,  15,   0,   0,   0,  48,
+     10,   1,   0,   0,   0,   0,   0,  80, 255, 255, 255, 255, 255, 255, 223, 255,
+    255, 255, 255, 223, 100, 222, 255, 235, 239, 255, 255, 255, 191, 231, 223, 223,
+    255, 255, 255, 123,  95, 252, 253, 255,  63, 255, 255, 255, 253, 255, 255, 247,
+    255, 255, 255, 247, 255, 127, 255, 255, 255, 253, 255, 255, 247, 207, 255, 255,
+    150, 254, 247,  10, 132, 234, 150, 170, 150, 247, 247,  94, 255, 251, 255,  15,
+    238, 251, 255,  15
 };
 
-static RE_UINT8 re_radical_stage_2[] = {
-    0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-};
+RE_UINT32 re_get_other_math(RE_UINT32 codepoint) {
+    RE_UINT32 field_2;
+    RE_UINT32 field_1;
+    RE_UINT32 field_0;
+    RE_UINT32 offset;
+    RE_UINT32 v;
 
-static RE_UINT8 re_radical_stage_3[] = {
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3,
-};
+    field_2 = codepoint >> 10;
+    field_1 = (codepoint >> 5) & 0x1F;
+    field_0 = (codepoint >> 3) & 0x3;
+    offset = codepoint & 0x7;
 
-static RE_UINT8 re_radical_stage_4[] = {
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-    255, 255, 255, 251, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,  15,   0,
-    255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
-    255, 255, 255, 255, 255, 255, 255, 255, 255, 255,  63,   0,   0,   0,   0,   0,
-};
+    v = re_other_math_table_1[field_2];
+    v = re_other_math_table_2[(v << 5) | field_1];
+    v = re_other_math_table_3[(v << 2) | field_0];
 
-/* Radical: 162 bytes. */
-
-RE_UINT32 re_get_radical(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-
-    f = ch >> 15;
-    code = ch ^ (f << 15);
-    pos = (RE_UINT32)re_radical_stage_1[f] << 4;
-    f = code >> 11;
-    code ^= f << 11;
-    pos = (RE_UINT32)re_radical_stage_2[pos + f] << 4;
-    f = code >> 7;
-    code ^= f << 7;
-    pos = (RE_UINT32)re_radical_stage_3[pos + f] << 7;
-    pos += code;
-    value = (re_radical_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1;
-
-    return value;
+    return (v >> offset) & 0x1;
 }
 
-/* Unified_Ideograph. */
-
-static RE_UINT8 re_unified_ideograph_stage_1[] = {
-    0, 1, 2, 2, 3, 4, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2,
-};
+/* Other_Uppercase. */
+RE_UINT32 re_get_other_uppercase(RE_UINT32 codepoint) {
+    if (0x2160 <= codepoint && codepoint <= 0x216F)
+        return 1;
+    if (0x24B6 <= codepoint && codepoint <= 0x24CF)
+        return 1;
+    if (0x01F130 <= codepoint && codepoint <= 0x01F149)
+        return 1;
+    if (0x01F150 <= codepoint && codepoint <= 0x01F169)
+        return 1;
+    if (0x01F170 <= codepoint && codepoint <= 0x01F189)
+        return 1;
+
+    return 0;
+}
 
-static RE_UINT8 re_unified_ideograph_stage_2[] = {
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1,
-    1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+/* Pattern_Syntax. */
+static RE_UINT8 re_pattern_syntax_table_1[] = {
+    0, 1, 1, 1, 1, 1, 1, 1, 2, 3, 4, 5, 6, 1, 1, 1,
     1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
     1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 5, 1, 1, 1, 6, 7, 1,
-    1, 1, 1, 8, 1, 1, 1, 1, 1, 1, 9, 0, 0, 0, 0, 0,
-};
-
-static RE_UINT8 re_unified_ideograph_stage_3[] = {
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 7,
     1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 2, 0, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3,
-    0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 5, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 6, 1, 1, 1,
-    7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 8, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 9,
-};
-
-static RE_UINT8 re_unified_ideograph_stage_4[] = {
-      0,   0,   0,   0,   0,   0,   0,   0, 255, 255, 255, 255, 255, 255, 255, 255,
-    255, 255, 255, 255, 255, 255,  63,   0, 255, 255, 255, 255, 255, 255,   0,   0,
-      0, 192,  26, 128, 154,   3,   0,   0, 255, 255, 127,   0,   0,   0,   0,   0,
-    255, 255, 255, 255, 255, 255,  31,   0, 255, 255, 255,  63, 255, 255, 255, 255,
-    255, 255, 255, 255,   3,   0, 255, 255, 255, 255, 255, 255,   1,   0,   0,   0,
-};
-
-/* Unified_Ideograph: 434 bytes. */
-
-RE_UINT32 re_get_unified_ideograph(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-
-    f = ch >> 15;
-    code = ch ^ (f << 15);
-    pos = (RE_UINT32)re_unified_ideograph_stage_1[f] << 5;
-    f = code >> 10;
-    code ^= f << 10;
-    pos = (RE_UINT32)re_unified_ideograph_stage_2[pos + f] << 4;
-    f = code >> 6;
-    code ^= f << 6;
-    pos = (RE_UINT32)re_unified_ideograph_stage_3[pos + f] << 6;
-    pos += code;
-    value = (re_unified_ideograph_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1;
-
-    return value;
-}
-
-/* Other_Default_Ignorable_Code_Point. */
-
-static RE_UINT8 re_other_default_ignorable_code_point_stage_1[] = {
-    0, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
     1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
     1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1,
-};
-
-static RE_UINT8 re_other_default_ignorable_code_point_stage_2[] = {
-    0, 1, 0, 0, 0, 0, 0, 0, 2, 0, 0, 3, 0, 0, 0, 0,
-    4, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6,
-    7, 8, 8, 8, 8, 8, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-};
-
-static RE_UINT8 re_other_default_ignorable_code_point_stage_3[] = {
-     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  0,  0,
-     0,  0,  0,  0,  0,  2,  0,  0,  0,  0,  0,  0,  0,  0,  3,  0,
-     0,  4,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  5,  0,  0,
-     0,  0,  0,  0,  0,  0,  6,  7,  8,  0,  9,  9,  0,  0,  0, 10,
-     9,  9,  9,  9,  9,  9,  9,  9,
-};
-
-static RE_UINT8 re_other_default_ignorable_code_point_stage_4[] = {
-      0,   0,   0,   0,   0,   0,   0,   0,   0, 128,   0,   0,   0,   0,   0,   0,
-      0,   0,   0, 128,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,  48,   0,
-      0,   0,   0,   0,  32,   0,   0,   0,   0,   0,   0,   0,  16,   0,   0,   0,
-      0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0, 255,   1,
-    253, 255, 255, 255,   0,   0,   0,   0, 255, 255, 255, 255, 255, 255, 255, 255,
-      0,   0,   0,   0,   0,   0, 255, 255,
-};
-
-/* Other_Default_Ignorable_Code_Point: 356 bytes. */
-
-RE_UINT32 re_get_other_default_ignorable_code_point(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-
-    f = ch >> 14;
-    code = ch ^ (f << 14);
-    pos = (RE_UINT32)re_other_default_ignorable_code_point_stage_1[f] << 5;
-    f = code >> 9;
-    code ^= f << 9;
-    pos = (RE_UINT32)re_other_default_ignorable_code_point_stage_2[pos + f] << 3;
-    f = code >> 6;
-    code ^= f << 6;
-    pos = (RE_UINT32)re_other_default_ignorable_code_point_stage_3[pos + f] << 6;
-    pos += code;
-    value = (re_other_default_ignorable_code_point_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1;
-
-    return value;
-}
-
-/* Deprecated. */
-
-static RE_UINT8 re_deprecated_stage_1[] = {
-    0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
     1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
     1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1,
-};
-
-static RE_UINT8 re_deprecated_stage_2[] = {
-    0, 1, 1, 2, 1, 1, 1, 3, 1, 1, 1, 4, 1, 1, 1, 1,
-    5, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
     1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
     1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
     1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-};
-
-static RE_UINT8 re_deprecated_stage_3[] = {
-    0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0,
-    0, 0, 0, 0, 0, 0, 4, 0, 0, 5, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 6, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0,
-};
-
-static RE_UINT8 re_deprecated_stage_4[] = {
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   8,   0,   0,   0,   0,   0,   0,   0, 128,   2,
-      0,   0,   0,   0,  24,   0,   0,   0,   0,   0,   0,   0,   0, 252,   0,   0,
-      0,   0,   0,   0,   0,   6,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,
-};
-
-/* Deprecated: 292 bytes. */
-
-RE_UINT32 re_get_deprecated(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-
-    f = ch >> 14;
-    code = ch ^ (f << 14);
-    pos = (RE_UINT32)re_deprecated_stage_1[f] << 5;
-    f = code >> 9;
-    code ^= f << 9;
-    pos = (RE_UINT32)re_deprecated_stage_2[pos + f] << 3;
-    f = code >> 6;
-    code ^= f << 6;
-    pos = (RE_UINT32)re_deprecated_stage_3[pos + f] << 6;
-    pos += code;
-    value = (re_deprecated_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1;
-
-    return value;
-}
-
-/* Soft_Dotted. */
-
-static RE_UINT8 re_soft_dotted_stage_1[] = {
-    0, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1,
     1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
     1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
     1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1,
-};
-
-static RE_UINT8 re_soft_dotted_stage_2[] = {
-    0, 1, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 5,
-    6, 3, 3, 3, 3, 3, 7, 3, 3, 3, 3, 3, 3, 3, 3, 3,
-    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
-    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
-    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 8, 9, 3, 3, 3, 3,
-    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
 };
 
-static RE_UINT8 re_soft_dotted_stage_3[] = {
-     0,  0,  0,  1,  0,  0,  0,  0,  0,  2,  0,  0,  0,  0,  0,  0,
-     0,  0,  3,  4,  5,  6,  0,  0,  0,  0,  0,  0,  0,  0,  0,  7,
-     0,  0,  8,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+static RE_UINT8 re_pattern_syntax_table_2[] = {
+     0,  1,  2,  2,  0,  3,  4,  4,  0,  0,  0,  0,  0,  0,  0,  0,
      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  9, 10, 11,  0,  0,
-     0, 12,  0,  0,  0,  0, 13,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0, 14,  0,  0,  0,  0,  0,  0, 15,  0,  0,  0,  0,  0,
-     0,  0,  0, 16,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0, 17, 18,  0, 19, 20,  0, 21,  0, 22, 23,  0, 24,  0, 17, 18,
-     0, 19, 20,  0, 21,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-};
-
-static RE_UINT8 re_soft_dotted_stage_4[] = {
-      0,   0,   0,   0,   0,   6,   0,   0,   0, 128,   0,   0,   0,   2,   0,   0,
-      0,   1,   0,   0,   0,   0,   0,  32,   0,   0,   4,   0,   0,   0,   8,   0,
-      0,   0,  64,   1,   4,   0,   0,   0,   0,   0,  64,   0,  16,   1,   0,   0,
-      0,  32,   0,   0,   0,   8,   0,   0,   0,   0,   2,   0,   0,   3,   0,   0,
-      0,   0,   0,  16,  12,   0,   0,   0,   0,   0, 192,   0,   0,  12,   0,   0,
-      0,   0,   0, 192,   0,   0,  12,   0, 192,   0,   0,   0,   0,   0,   0,  12,
-      0, 192,   0,   0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     5,  6,  7,  0,  0,  0,  0,  0,  0,  0,  0,  0,  5,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  0,  0,  0,  0,  0,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  9, 10,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     8,  8,  8,  8,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    11, 12,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0, 13,  0,  0,  0,  0,  0,  0,
+     0,  0, 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0
 };
 
-/* Soft_Dotted: 424 bytes. */
-
-RE_UINT32 re_get_soft_dotted(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-
-    f = ch >> 14;
-    code = ch ^ (f << 14);
-    pos = (RE_UINT32)re_soft_dotted_stage_1[f] << 5;
-    f = code >> 9;
-    code ^= f << 9;
-    pos = (RE_UINT32)re_soft_dotted_stage_2[pos + f] << 4;
-    f = code >> 5;
-    code ^= f << 5;
-    pos = (RE_UINT32)re_soft_dotted_stage_3[pos + f] << 5;
-    pos += code;
-    value = (re_soft_dotted_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1;
-
-    return value;
-}
-
-/* Logical_Order_Exception. */
-
-static RE_UINT8 re_logical_order_exception_stage_1[] = {
-    0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1,
+static RE_UINT8 re_pattern_syntax_table_3[] = {
+      0,   0,   0,   0, 254, 255,   0, 252,   1,   0,   0, 120, 254,  90,  67, 136,
+      0,   0, 128,   0,   0,   0, 255, 255, 255,   0, 255, 127, 254, 255, 239, 127,
+    255, 255, 255, 255, 255, 255,  63,   0,   0,   0, 240, 255,  14, 255, 255, 255,
+      1,   0,   1,   0,   0,   0,   0, 192,  96,   0,   0,   0
 };
 
-static RE_UINT8 re_logical_order_exception_stage_2[] = {
-    0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-};
+RE_UINT32 re_get_pattern_syntax(RE_UINT32 codepoint) {
+    RE_UINT32 field_2;
+    RE_UINT32 field_1;
+    RE_UINT32 field_0;
+    RE_UINT32 offset;
+    RE_UINT32 v;
 
-static RE_UINT8 re_logical_order_exception_stage_3[] = {
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0,
-    0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-};
+    field_2 = codepoint >> 10;
+    field_1 = (codepoint >> 5) & 0x1F;
+    field_0 = (codepoint >> 3) & 0x3;
+    offset = codepoint & 0x7;
 
-static RE_UINT8 re_logical_order_exception_stage_4[] = {
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,  31,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0, 224,   4,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,  96,  26,   0,   0,   0,   0,   0,   0,   0,   0,
-};
+    v = re_pattern_syntax_table_1[field_2];
+    v = re_pattern_syntax_table_2[(v << 5) | field_1];
+    v = re_pattern_syntax_table_3[(v << 2) | field_0];
 
-/* Logical_Order_Exception: 209 bytes. */
-
-RE_UINT32 re_get_logical_order_exception(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-
-    f = ch >> 16;
-    code = ch ^ (f << 16);
-    pos = (RE_UINT32)re_logical_order_exception_stage_1[f] << 5;
-    f = code >> 11;
-    code ^= f << 11;
-    pos = (RE_UINT32)re_logical_order_exception_stage_2[pos + f] << 4;
-    f = code >> 7;
-    code ^= f << 7;
-    pos = (RE_UINT32)re_logical_order_exception_stage_3[pos + f] << 7;
-    pos += code;
-    value = (re_logical_order_exception_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1;
-
-    return value;
+    return (v >> offset) & 0x1;
 }
 
-/* Other_ID_Start. */
-
-static RE_UINT8 re_other_id_start_stage_1[] = {
-    0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1,
-};
-
-static RE_UINT8 re_other_id_start_stage_2[] = {
-    0, 0, 0, 0, 0, 0, 1, 0, 2, 0, 0, 0, 3, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-};
-
-static RE_UINT8 re_other_id_start_stage_3[] = {
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-};
+/* Pattern_White_Space. */
+RE_UINT32 re_get_pattern_white_space(RE_UINT32 codepoint) {
+    if (0x09 <= codepoint && codepoint <= 0x0D)
+        return 1;
+    if (codepoint == 0x20)
+        return 1;
+    if (codepoint == 0x85)
+        return 1;
+    if (0x200E <= codepoint && codepoint <= 0x200F)
+        return 1;
+    if (0x2028 <= codepoint && codepoint <= 0x2029)
+        return 1;
+
+    return 0;
+}
 
-static RE_UINT8 re_other_id_start_stage_4[] = {
-     0,  0,  0,  0,  0,  0,  0,  0, 96,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  1,  0, 64,  0,  0,  0,  0,  0, 24,  0,  0,  0,  0,
+/* Posix_AlNum. */
+static RE_UINT8 re_posix_alnum_table_1[] = {
+     0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 13, 13,
+    13, 13, 13, 14, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 15, 13, 16, 17, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 18, 10, 10, 10, 10, 10, 10, 10, 10, 19, 20,
+    21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 10, 10, 13, 31, 10, 10,
+    10, 32, 10, 10, 10, 10, 10, 10, 10, 10, 33, 34, 13, 13, 13, 13,
+    13, 35, 13, 36, 10, 10, 10, 10, 10, 10, 10, 10, 37, 10, 10, 38,
+    10, 10, 10, 10, 10, 39, 10, 10, 40, 10, 41, 42, 43, 10, 10, 10,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 44, 13, 13, 13, 45, 46, 13,
+    13, 13, 13, 47, 13, 13, 13, 13, 13, 13, 48, 10, 10, 10, 49, 10,
+    13, 13, 13, 13, 50, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10
 };
 
-/* Other_ID_Start: 194 bytes. */
-
-RE_UINT32 re_get_other_id_start(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-
-    f = ch >> 15;
-    code = ch ^ (f << 15);
-    pos = (RE_UINT32)re_other_id_start_stage_1[f] << 5;
-    f = code >> 10;
-    code ^= f << 10;
-    pos = (RE_UINT32)re_other_id_start_stage_2[pos + f] << 4;
-    f = code >> 6;
-    code ^= f << 6;
-    pos = (RE_UINT32)re_other_id_start_stage_3[pos + f] << 6;
-    pos += code;
-    value = (re_other_id_start_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1;
-
-    return value;
-}
-
-/* Other_ID_Continue. */
-
-static RE_UINT8 re_other_id_continue_stage_1[] = {
-    0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1,
+static RE_UINT8 re_posix_alnum_table_2[] = {
+      0,   1,   2,   2,   0,   3,   4,   4,   5,   5,   5,   5,   5,   5,   5,   5,
+      5,   5,   5,   5,   5,   5,   6,   7,   0,   0,   8,   9,  10,  11,   5,  12,
+      5,   5,   5,   5,  13,   5,   5,   5,   5,  14,  15,   5,  16,  17,  18,  19,
+     20,   5,  21,  22,   5,   5,  23,  24,  25,   5,  26,   5,   5,  27,  28,  29,
+     30,  31,  32,  33,   0,  34,  35,  36,   5,  37,  38,  39,  40,  41,  42,  43,
+     44,  45,  46,  47,  48,  49,  50,  51,  52,  49,  53,  54,  55,  56,  57,   0,
+     58,  59,  60,  61,  58,  62,  63,  64,  65,  66,  67,  68,  69,  70,  71,  72,
+     73,  74,  75,   0,  76,  77,  78,   0,  79,   0,  80,  81,  82,  83,   0,   0,
+      5,  84,  25,   5,  85,   5,  86,  87,   5,   5,   5,   5,   5,   5,   5,   5,
+      5,   5,  88,   5,  89,  90,  91,   5,  92,   5,  74,   0,  93,   5,   5,  94,
+     73,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
+      5,   5,   5,  95,   2,   5,   5,  96,  97,  98,  98,  99,   5, 100, 101,   0,
+      0,   5,   5,  32,   5, 102,   5, 103, 104, 105,  25, 106,   5, 107, 108,   0,
+    109,   5, 104, 110,   0, 111,  79,   0,   5, 112, 113,   0,   5, 114,   5, 115,
+      5, 116, 117, 118, 119,  66,   0, 120,   5,   5,   5,   5,   5,   5,   0, 121,
+      5,   5,   5,   5,   5,   5,   5,   5,  94,   5, 122, 118,   5, 123, 124, 125,
+      0,   0,   0, 126, 127,   0,   0,   0, 128, 129, 130,   5,  16,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0, 131,   5, 108,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      5, 132, 104,   5,   5,   5,   5, 133,   5,  86,   5, 134, 116, 135, 135,   5,
+      0, 136,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    137, 138,  73,   5, 139,  73,   5,  87, 140,  14,   5,   5, 141,   5,   0,  25,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
+      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
+      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   0,   0,
+      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
+      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
+      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,  83,
+      5,   5,   5,   5,  31,   0,  25, 118,   5,   5,   5,   5,   5,   5,   5,   5,
+    142, 143,   5, 144,   5,   5,   5,  93, 145, 146,   5,   5, 147,   5, 148, 149,
+    150, 151,   5,  98,   5,   5, 152, 153,  28, 102, 154,  83,   5, 155, 136, 156,
+      5, 116, 157, 158,   5, 104, 159, 160, 161, 162,  87, 163,   5,   5,   5,  33,
+      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
+      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5, 164, 165, 109,
+      0,   0,   0,   0,   0,   0,   0,   0,   5,   5,   5,   5,   5,   5,   5,   5,
+      5,   5,   5, 166,   5,   5, 167,   0, 168, 169, 170,   5,   5,  27, 171,   5,
+      5,   5,   5,   5,   5,   5,   5,   5,   5, 118,  25,   5, 172,   5, 151, 173,
+      0,   0,   0, 174,   5,   5,   5,  83,   0,   2,   2, 175,   5, 104, 176,   0,
+    177, 178, 179,   0,   5,   5,   5,  74,   0,   0,   5, 180,   0,   0,   0,   0,
+      0,   0,   0,   0,  83,   5, 181,   0,   5,  26, 102,  74, 118,   5, 182,   0,
+      5,   5,   5,   5, 118,  25, 183, 109,   5, 184,   5,  61,   0,   0,   0,   0,
+      5,   5,   5,   5,   5,   5,   5,   5,   5, 116, 103, 151,   0,   0,   0,   0,
+    185, 186, 103, 116, 104,   0,   0, 187, 103, 167,   0,   0,   5, 188,   0,   0,
+    189, 103,   0,  83,  83,   0,  80, 190,   5, 103, 103, 154,  27,   0,   0,   0,
+      5,   5,  16,   0,   5, 154,   5, 154,   5, 151,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   5, 191,   0,   0,  83, 192, 193,   0,   0,  25, 190, 116,
+      5,   5, 193,   0, 146,  32,  25,  16,   5, 154, 194, 195,   5,   5, 196,   0,
+    197, 198,   0,   0, 199, 119,   5,  16,  40,  49, 200,  61,   0,   0,   0,   0,
+      5,   5, 201, 202,   5,   5, 203,   0,   0,   0,   0,   0,   5, 204, 205,   0,
+      5, 104, 206,   0,   5, 207,   0,   0,  66,  33,   0,   0,   0,   0,   0,   0,
+      5,  32,   0,   0,   0,   5,   5, 208, 209, 210, 211,   0,   0, 212,  30, 213,
+      5, 214,  25,   5, 215,   0,   5,  32,   0,   0,   0,   0,   0,   0,   0,   0,
+    216, 217,  79, 218, 172, 219,   0,   0, 220, 221, 222, 223, 224,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0, 116,   0,   0,   0,   0,   0, 225,   0,   0,
+      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
+      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5, 167,   0,   0,   0,
+      5,   5,   5, 141,   5,   5,   5,   5,   5,   5,  61,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      5, 141,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
+      5,   5, 226,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
+      5,  32, 104,   0,   0,   0,  25, 157,   5,  93,  61, 227,  93,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   5,   5,   0,   0,   0,   0,   5,   5, 228,   5, 229,   0,   0, 230,
+      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
+      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5, 231,
+      5,   5,   5,   5,   5,   5, 103,   0,  16,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      5,   5,   5,   5,   5,   5,   5,   5, 104,   0, 232, 194,   5,   5,   5,   5,
+      5,   5,   5,   5,   5,   5,   5, 109,   0,   0,   0,   0,   0,   0,   0,   0,
+      5,   5,   5, 233, 234,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      5,   5,  34,   5, 235, 236, 237,   5, 238, 239, 240,   5,   5,   5,   5,   5,
+      5,   5,   5,   5,   5, 241, 242,  87,  34,  34, 132, 132, 216, 216, 243,   0,
+    244, 245,   0,   0,   0,   0,   0,   0,   5, 246, 247,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   5, 248,   0,   0,   0,   0,   0,   0,   0,   0,
+      5,   5,   5,   5,   5,   5, 190,   0,   5,   5, 249,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    237, 250, 251, 252, 253, 254,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,  25, 163, 163, 108,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
+      5,   5,   5,   5,   5,   5, 118,   0,   5,   5,   5,   5,   5,   5,   5,   5,
+      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
+      5,   5,   5,   5,   5,   5,   5,   5,   5, 180,   5,   5,   5,   5,   5,   5,
+    118,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
+      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
+      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
+      5,   5,   5,   5,   5, 255,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
+      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
+      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,  79,
+      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
+    118,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
+      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,  33,   0,   0,   0,   0,   0
+};
+
+static RE_UINT8 re_posix_alnum_table_3[] = {
+      0,   0,   0,   0,   0,   0, 255,   3, 254, 255, 255,   7,   0,   4,  32,   4,
+    255, 255, 127, 255, 255, 255, 255, 255, 195, 255,   3,   0,  31,  80,   0,   0,
+     32,   0,   0,   0,   0,   0, 223, 188,  64, 215, 255, 255, 251, 255, 255, 255,
+    255, 255, 191, 255,   3, 252, 255, 255, 255, 255, 254, 255, 255, 255, 127,   2,
+    255,   1,   0,   0,   0,   0, 255, 191, 182,   0, 255, 255, 255, 135,   7,   0,
+      0,   0, 255,   7, 255, 255, 255, 254,   0, 192, 255, 255, 255, 255, 239,  31,
+    254, 225,   0, 156,   0,   0, 255, 255,   0, 224, 255, 255, 255, 255,   3,   0,
+      0, 252, 255, 255, 255,   7,  48,   4, 255, 255, 255, 252, 255,  31,   0,   0,
+    255, 255, 255,   1, 255,   7,   0,   0, 255, 255, 223, 255, 255,   0, 240, 255,
+    248,   3, 255, 255, 255, 255, 255, 239, 255, 223, 225, 255,  15,   0, 254, 255,
+    239, 159, 249, 255, 255, 253, 197, 227, 159,  89, 128, 176,  15,   0,   3,  16,
+    238, 135, 249, 255, 255, 253, 109, 195, 135,  25,   2,  94,   0,   0,  63,   0,
+    238, 191, 251, 255, 255, 253, 237, 227, 191,  27,   1,   0,  15,   0,   0,  30,
+    238, 159, 249, 255, 159,  25, 192, 176,  15,   0,   2,   0, 236, 199,  61, 214,
+     24, 199, 255, 195, 199,  29, 129,   0, 239, 223, 253, 255, 255, 253, 255, 227,
+    223,  29,  96,   7,  15,   0,   0,   0, 255, 253, 239, 227, 223,  29,  96,  64,
+     15,   0,   6,   0, 255, 223, 253, 255, 255, 255, 255, 231, 223,  93, 240, 128,
+     15,   0,   0, 252, 238, 255, 127, 252, 255, 255, 251,  47, 127, 128,  95, 255,
+      0,   0,  12,   0, 254, 255, 255, 255, 255, 255, 255,   7, 127,  32,   0,   0,
+    214, 247, 255, 255, 175, 255, 255,  59,  95,  32,   0, 240,   1,   0,   0,   0,
+    255, 254, 255, 255, 255,  31, 254, 255,   3, 255, 255, 254, 255, 255, 255,  31,
+    255, 255, 127, 249, 255, 255,   0,  60, 191,  32, 255, 255, 255, 255, 255, 247,
+    255,  61, 127,  61, 255,  61, 255, 255, 255, 255,  61, 127,  61, 255, 127, 255,
+    255, 255,  61, 255, 255, 255,   0,   0, 255, 255,  63,  63, 255, 159, 255, 255,
+    255, 199, 255,   1, 255, 223,  15,   0, 255, 255,  15,   0, 255, 223,  13,   0,
+    255, 255, 207, 255, 255,   1, 128,  16, 255,   7, 255, 255, 255, 255,  63,   0,
+    255, 255, 255, 127, 255,  15, 255,   1, 255,  63,  31,   0, 255,  15, 255, 255,
+    255,   3,   0,   0, 255, 255, 255,  15, 254, 255,  31,   0, 128,   0,   0, 128,
+    255, 255, 239, 255, 239,  15,   0,   0, 255, 243,   0, 252, 191, 255,   3,   0,
+    255, 255, 127,   0,   0, 224,   0, 252, 255, 255, 255,  63, 255,   1, 255, 255,
+      0, 222, 111,   4, 128, 255,  31,   0,  63,  63, 255, 170, 255, 255, 223,  95,
+    220,  31, 207,  15, 255,  31, 220,  31,   0,   0,   2, 128,   0,   0, 255,  31,
+    132, 252,  47,  62,  80, 189, 255, 243, 224,  67,   0,   0,   0,   0, 192, 255,
+    255, 127, 255, 255,  31, 120,  12,   0, 255, 128,   0,   0, 127, 127, 127, 127,
+      0, 128,   0,   0, 224,   0,   0,   0, 254,   3,  62,  31, 255, 255, 127, 224,
+    224, 255, 255, 255, 255, 127,   0,   0, 255,  31, 255, 255,   0,  12,   0,   0,
+    255, 127, 240, 143,   0,   0, 128, 255, 252, 255, 255, 255, 255, 249, 255, 255,
+    252,   7,   0,   0,   0,   0, 224, 255, 191, 255, 255, 255, 255,   0,   0,   0,
+     47,   0,   0,   0,   0,   0, 252, 232, 255, 255,   7,   0, 255, 255, 247, 255,
+    255, 255,   0, 124, 255,  63,   0,   0, 255, 255, 127, 252,   5,   0,   0,  56,
+    255, 255,  60,   0, 126, 126, 126,   0, 127, 127, 255, 255, 255,   3, 255, 255,
+     15,   0, 255, 255, 127, 248, 255, 255, 255,  63, 255, 255, 255, 255, 255,   3,
+    127,   0, 248, 224, 255, 253, 127,  95, 219, 255, 255, 255,   0,   0, 248, 255,
+    255, 255, 252, 255,   0,   0, 255,  15,   0,   0, 223, 255, 192, 255, 255, 255,
+    252, 252, 252,  28, 255, 239, 255, 255, 127, 255, 255, 183, 255,  63, 255,  63,
+    255, 255,  31,   0, 255, 255,   1,   0,  15, 255,  62,   0, 255, 255,  15, 255,
+    255,   0, 255, 255,  63, 253, 255, 255, 255, 255, 191, 145, 255, 255,  55,   0,
+    255, 255, 255, 192, 111, 240, 239, 254,  31,   0,   0,   0, 255,  27,   3,   0,
+    128,   0, 255, 255,  63,   0,   0,   0, 240,   0, 255, 255, 255, 255,  71,   0,
+     30, 192,   0,  20, 255, 255, 251, 255, 255, 255, 159,  64, 127, 189, 255, 191,
+    159,  25, 129, 224, 187,   7,   0, 128,   3,   0,   0,   0, 179,   0,   0,   0,
+    255, 255,  63, 127,   0,   0,   0,  63,  17,   0,   0,   0, 255, 255,  63,   1,
+      0,   0,   0, 128, 127, 242, 111, 255, 255, 255, 191, 153,   7,   0,   0,   0,
+    255, 252, 255, 255,  26,   0,   0,   0, 255, 255, 231, 127, 255, 255, 255,  32,
+    255, 253, 255, 255, 255, 255, 127, 127,   0,   0, 252, 255, 255, 254, 127,   0,
+    127, 251, 255, 255, 255, 255, 127, 180, 203,   0,   0,   0, 191, 253, 255, 255,
+    255, 127, 123,   1,   0,   0,   1,   0, 127,   0,   0,   0, 248, 255, 255, 224,
+    255, 135, 255, 255, 255, 128, 255, 255,  11,   0,   3,   0, 255, 255, 255,   0,
+      0,   0,   7,   0, 255,   7, 255,  31, 255,   1, 255,  67, 255, 255, 255, 223,
+    100, 222, 255, 235, 239, 255, 255, 255, 191, 231, 223, 223, 255, 255, 255, 123,
+     95, 252, 253, 255,  63, 255, 255, 255, 253, 255, 255, 247, 247,  15,   0,   0,
+    127, 255, 255, 249, 219,   7,   0,   0, 255,  31, 128,  63,   0,  64,   0,   0,
+    255,  15,   0,   0, 143,   8,   0,   0, 150, 254, 247,  10, 132, 234, 150, 170,
+    150, 247, 247,  94, 255, 251, 255,  15, 238, 251, 255,  15,   3,   0, 255, 255
 };
 
-static RE_UINT8 re_other_id_continue_stage_2[] = {
-    0, 1, 1, 1, 2, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-};
+RE_UINT32 re_get_posix_alnum(RE_UINT32 codepoint) {
+    RE_UINT32 field_2;
+    RE_UINT32 field_1;
+    RE_UINT32 field_0;
+    RE_UINT32 offset;
+    RE_UINT32 v;
 
-static RE_UINT8 re_other_id_continue_stage_3[] = {
-    0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0,
-};
+    field_2 = codepoint >> 10;
+    field_1 = (codepoint >> 5) & 0x1F;
+    field_0 = (codepoint >> 3) & 0x3;
+    offset = codepoint & 0x7;
 
-static RE_UINT8 re_other_id_continue_stage_4[] = {
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 128,   0,
-    128,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 254,   3,   0,
-      0,   0,   0,   4,   0,   0,   0,   0,
-};
+    v = re_posix_alnum_table_1[field_2];
+    v = re_posix_alnum_table_2[(v << 5) | field_1];
+    v = re_posix_alnum_table_3[(v << 2) | field_0];
 
-/* Other_ID_Continue: 202 bytes. */
-
-RE_UINT32 re_get_other_id_continue(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-
-    f = ch >> 15;
-    code = ch ^ (f << 15);
-    pos = (RE_UINT32)re_other_id_continue_stage_1[f] << 5;
-    f = code >> 10;
-    code ^= f << 10;
-    pos = (RE_UINT32)re_other_id_continue_stage_2[pos + f] << 4;
-    f = code >> 6;
-    code ^= f << 6;
-    pos = (RE_UINT32)re_other_id_continue_stage_3[pos + f] << 6;
-    pos += code;
-    value = (re_other_id_continue_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1;
-
-    return value;
+    return (v >> offset) & 0x1;
 }
 
-/* Sentence_Terminal. */
+/* Posix_Digit. */
+RE_UINT32 re_get_posix_digit(RE_UINT32 codepoint) {
+    if (0x30 <= codepoint && codepoint <= 0x39)
+        return 1;
 
-static RE_UINT8 re_sentence_terminal_stage_1[] = {
-    0, 1, 2, 2, 2, 3, 2, 4, 5, 2, 2, 6, 2, 7, 8, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2,
-};
+    return 0;
+}
 
-static RE_UINT8 re_sentence_terminal_stage_2[] = {
-     0,  1,  1,  1,  1,  2,  3,  4,  5,  6,  1,  1,  1,  1,  1,  1,
-     7,  1,  1,  8,  1,  1,  9, 10, 11, 12, 13, 14, 15,  1,  1,  1,
-    16,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1, 17,  1,
-    18,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
-     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
-     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
-     1,  1,  1,  1, 19,  1, 20,  1, 21, 22, 23, 24,  1,  1,  1,  1,
-     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
-     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
-     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1, 25, 26,
-     1,  1,  1,  1,  1,  1,  1,  1,  1,  1, 27,  1,  1,  1,  1, 28,
-    29, 30, 31,  1, 32, 33, 34, 35,  1,  1, 36,  1, 34,  1, 37,  1,
-     1,  1,  1,  1,  1,  1,  1,  1,  1,  1, 38, 39,  1,  1, 40,  1,
-     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
-     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
-     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1, 41,  1,  1,  1,
-     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
-     1,  1,  1,  1,  1,  1,  1,  1,  1,  1, 42,  1,  1,  1,  1,  1,
+/* Posix_Punct. */
+static RE_UINT8 re_posix_punct_table_1[] = {
+     0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 13, 13,
+    13, 13, 13, 14, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 15, 16, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 17, 18,
+    19, 20, 21, 22, 23, 24, 25, 26, 13, 27, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 28, 29, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 30,
+    13, 13, 13, 13, 31, 32, 33, 13, 34, 13, 35, 36, 37, 38, 39, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13
 };
 
-static RE_UINT8 re_sentence_terminal_stage_3[] = {
-     0,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  2,  0,  0,  0,  3,  0,  0,  0,  0,  0,  4,  0,
-     5,  0,  0,  0,  0,  0,  0,  6,  0,  7,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  8,  0,  0,  0,  0,  0,  0,  9,  0,  0,  0,  0,  0,
-     0,  0,  0, 10,  0,  0,  0,  0,  0,  0,  0, 11,  0,  0,  0,  0,
-     0, 12,  0,  0,  0,  0,  0,  0, 13,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  8,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 14,  0,  0,
-     0,  0, 15,  0,  0,  0,  0,  0,  0, 16,  0,  3,  0,  0,  0,  0,
-     0, 17, 18,  0,  0,  0,  0,  0,  0, 19,  0,  0,  0,  0,  0,  0,
-    20,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 21,
-    22,  0,  0,  0,  0,  0,  0, 23,  0,  0,  0, 24,  0,  0, 22,  0,
-     0, 25,  0,  0,  0,  0, 26,  0,  0,  0, 27,  0,  0,  0,  0, 28,
-     0,  0,  0,  0,  0,  0,  0, 29,  0,  0, 30,  0,  0,  0,  0,  0,
-     1,  0,  0, 31,  0,  0,  0,  0,  0,  0, 24,  0,  0,  0,  0,  0,
-     0,  0, 32,  0,  0,  0,  0,  0,  0,  0, 33,  0,  0,  3, 34,  0,
-     0,  0, 35,  0,  0,  0, 36,  0,  0, 37,  0,  0,  0,  2,  0,  0,
-     0,  0, 38,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 39,  0,
-     0,  0, 40,  0,  0,  0,  0,  0,  0, 41,  0,  0,  0,  0,  0,  0,
-     0,  0, 42,  0, 16,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 43,
-     0,  0,  0, 22,  0,  0,  0, 44,  0, 43, 45,  0,  0,  0,  0,  0,
-     0,  0,  0,  0, 46,  0,  0,  0,  0,  0,  0,  0, 21,  0,  0,  0,
-     0,  0,  0,  0, 47,  0,  0,  0,
-};
+static RE_UINT8 re_posix_punct_table_2[] = {
+      0,   1,   2,   3,   0,   4,   5,   5,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   6,   7,   0,   0,   0,   8,   9,   0,   0,  10,
+      0,   0,   0,   0,  11,   0,   0,   0,   0,   0,  12,   0,  13,  14,  15,  16,
+     17,   0,   0,  18,   0,   0,  19,  20,  21,   0,   0,   0,   0,   0,   0,  22,
+      0,  23,  14,   0,   0,   0,   0,   0,   0,   0,   0,  24,   0,   0,   0,  25,
+      0,   0,   0,  10,   0,   0,   0,  26,   0,   0,   0,  27,   0,   0,   0,  28,
+      0,   0,   0,  29,  30,   0,   0,   0,   0,   0,  31,  32,   0,   0,   0,  33,
+      0,  34,  35,   0,   0,   0,   0,   0,  36,  37,   0,   0,  38,  39,  40,   0,
+      0,   0,  41,   0,  39,   0,   0,  42,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  43,  44,   0,   0,   0,
+     45,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,  46,  47,   0,   0,  48,   0,  49,   0,   0,   0,   0,  50,   0,
+     51,   0,   0,   0,   0,   0,   0,   0,   0,   0,  52,   0,   0,   0,  39,  53,
+     39,   0,   0,   0,   0,  54,   0,   0,   0,   0,  12,  55,   0,   0,   0,  56,
+      0,  57,   0,  39,   0,   0,  58,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  59,  60,  61,
+     62,  63,  64,  65,  66,  53,   0,   0,  67,  68,  69,   0,  70,  53,  53,  53,
+     53,  53,  53,  53,  53,  53,  53,  53,  53,  53,  53,  53,  53,  53,  53,  53,
+     53,  71,  51,   0,  56,  72,   0,   0,  53,  53,  53,  53,  53,  53,  53,  53,
+     53,  53,  53,  53,  53,  53,  53,  53,  53,  53,  53,  72,  73,  53,  53,  53,
+     53,  53,  53,  53,  53,  53,  53,  53,  53,  53,  53,  53,  53,  53,  53,  53,
+     53,  53,  53,  53,  53,  53,  53,  53,  53,  53,  53,  74,  75,  53,  53,  53,
+      0,   0,   0,   0,   0,   0,   0,  76,   0,   0,   0,  27,   0,   0,   0,   0,
+     53,  77,  78,   0,  79,  53,  53,  80,  53,  53,  53,  53,  53,  53,  72,  81,
+     82,  83,   0,   0,  47,  45,   0,  42,   0,   0,   0,   0,  84,   0,  53,  85,
+     64,  86,  87,  53,  86,  88,  53,  53,  53,  53,  53,  53,  53,  53,  53,  53,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  53,  53,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,  62,  53,  71,  39,   0,   0,   0,   0,   0,   0,   0,   0,
+     89,   0,   0,  90,   0,   0,   0,  91,  92,  93,   0,   0,  94,   0,   0,   0,
+      0,  95,   0,  96,   0,   0,  97,  98,   0,  97,  34,   0,   0,   0,  99,   0,
+      0,   0,  56, 100,   0,   0,  39,  26,   0,   0,  42, 101,   0,   0,   0, 102,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0, 103,   0,   0,   0, 104,  93,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,  39,   0,   0,   0,   0,   0, 105,
+     44,  62, 106, 107,   0,   0,   0,   0,   1,   2,   2, 108,   0,   0,   0, 109,
+      0,   0,   0,   0,   0,   0,   0,   0, 110, 111,   0, 112, 113,  45,  62, 114,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  34,   0,  27,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  31,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   5, 115,   0,   0,   0,   0,  34,  34,   0,   0,   0,   0,   0,   0,
+      0,   0, 116,  34,   0,   0, 117, 118,   0, 112,   0,   0, 119,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0, 120,   0,   0,   0,   0, 121,   0,   0,   0,   0,   0,
+      0,   0, 122,   0,   0, 123,  93,   0,   0,   0,  85, 124,   0,   0, 125,   0,
+      0, 126,   0,   0,   0, 103,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0, 127,   0,   0,   0, 128,   0,   0,   0,   0,   0,   0,   0, 129,   0,
+      0,   0, 130, 131,   0,   0,   0,   0,   0,  56,   0,   0,   0,   0,   0,   0,
+      0,  42,   0,   0,   0,   0,   0,   0,   0,   0, 132,   0,   0,   0,   0,  11,
+      0,  34,  71,   0, 133, 110,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0, 134,  26,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0, 115,   0,   0,   0,   0,   0,   0, 135, 136,
+      0,   0,   0, 137,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,  97,   0,   0,   0, 138,   0, 111, 139,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0, 140,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  11,
+      0,   0,   0,   0, 141,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     53,  53,  53,  53,  53,  53,  53,  72,  53, 142,  53, 143, 144, 145,  53,  43,
+     53,  53, 146,   0,   0,   0,   0,   0,  53,  53,  92,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0, 147,  42, 138, 138,  31,  31, 103, 103, 148,   0,
+     53,  53,  53,  53,  53,  53,  53,  53,  53,  53,  53,  53,  53,  53,  53,  53,
+      0, 140,   0, 149, 150,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  31,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,  34,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  39,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0, 151,   0,   0,   0, 152,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,  26,   0,   0,   0,   0,   0,   0,   0,   0,
+     53, 153,  53,  53,  80, 154, 155,  72, 156, 157,  41,  41,  86,  21,   0, 158,
+    159, 160, 161, 108,   0,   0,   0,   0,  53,  53,  53,  53,  53,  53,  53,  53,
+     53,  53,  53,  53,  53,  53,  53,  53,  53,  53,  53,  53,  53,  53,  53,  53,
+     53,  53,  53,  53,  53,  53, 162, 163,  53,  53,  53,  80,  53,  53, 164, 165,
+    153,  53, 166,  53,  63, 167,   0,   0,  53,  53,  53, 168,  53,  53, 169,  53,
+     53,  53,  80, 170, 171, 172, 173,   0,  53,  53,  53,  53, 106,  53,  51,   0
+};
+
+static RE_UINT8 re_posix_punct_table_3[] = {
+      0,   0,   0,   0, 254, 255,   0, 252,   1,   0,   0, 248,   1,   0,   0, 120,
+    254, 219, 211, 137,   0,   0, 128,   0,  60,   0, 252, 255, 224, 175, 255, 255,
+      0,   0,  32,  64, 176,   0,   0,   0,   0,   0,  64,   0,   4,   0,   0,   0,
+      0,   0,   0, 252,   0, 230,   0,   0,   0,   0,   0,  64,  73,   0,   0,   0,
+      0,   0,  24,   0, 192, 255,   0, 200,   0,  60,   0,   0,   0,   0,  16,  64,
+      0,   2,   0,  96, 255,  63,   0,   0,   0,   0, 192, 195,   0,   0, 255, 127,
+     48,   0,   1,   0,   0,   0,  12,  44,   0,   0,   3,   0,   0,   0,   1,   0,
+      0,   0, 248,   7,   0,   0, 128, 128,  16,   0,   0,   0,   0, 128,   0,   0,
+      0,   0,   0,   2,   0,   0,  16,   0,   0,   0,   0, 128,   0, 128,   0,  12,
+    254, 255, 255, 252,   0,   0,  80,  61,  32,   0,   0,   0,   0,   0,   0, 192,
+    191, 223, 255,   7,   0, 252,   0,   0,   0,   0,   0,   8, 255,   1,   0,   0,
+      0,   0, 255,   3,   1,   0,   0,   0,   0,  96,   0,   0,   0,   0,   0,  24,
+      0,  56,   0,   0,   0,   0,  96,   0,   0,   0, 112,  15, 255,   7,   0,   0,
+     49,   0,   0,   0, 255, 255, 255, 255, 127,  63,   0,   0, 255,   7, 240,  31,
+      0,   0,   0, 240,   0,   0,   0, 248, 255,   0,   8,   0,   0,   0,   0, 160,
+      3, 224,   0, 224,   0, 224,   0,  96,   0,   0, 255, 255, 255,   0, 255, 255,
+    255, 255, 255, 127,   0,   0,   0, 124,   0, 124,   0,   0, 123,   3, 208, 193,
+    175,  66,   0,  12,  31, 188,   0,   0,   0,  12, 255, 255, 127,   0,   0,   0,
+    255, 255,  63,   0,   0,   0, 240, 255, 255, 255, 207, 255, 255, 255, 191, 255,
+    224,   7,   0, 222, 255, 127, 255, 255, 255, 255,   7,   0, 255, 255, 255, 251,
+    255, 255,  15,   0,   0,   0, 255,  15,  30, 255, 255, 255,   1,   0, 193, 224,
+      0,   0, 195, 255,  15,   0,   0,   0,   0, 252, 255, 255, 255,   0,   1,   0,
+    255, 255,   1,   0,   0, 224,   0,   0,   0,   0,   8,  64,   0,   0, 252,   0,
+    255, 255, 127,   0,   3,   0,   0,   0,   0,   6,   0,   0,   0,  15, 192,   3,
+      0,   0, 240,   0,   0, 192,   0,   0,   0,   0,   0,  23, 254,  63,   0, 192,
+      0,   0, 128,   3,   0,  12,   0,   0,   0,   8,   0,   0,   0,   2,   0,   0,
+      0,   0, 252, 255,   0,   0,   0,  48, 255, 255, 247, 255, 127,  15,   0,   0,
+     63,   0,   0,   0, 127, 127,   0,  48,   7,   0,   0,   0,   0,   0, 128, 255,
+      0,   0,   0, 254, 255, 115, 255,  31, 255, 255, 255,  31,   0,   0, 128,   1,
+      0,   0, 255,   1,   0,   1,   0,   0,   0,   0, 127,   0,   0,   0,   0,  30,
+      0,  32,   0,   0,   0,   0, 224,   3, 128,  63,   0,   0,   0,   0,   0, 216,
+      0,   0,  48,   0, 224,  33,   0, 232,   0,   0,   0,  63,   0, 248,   0,  44,
+     64,   0,   0,   0, 254, 255, 255,   0,  14,   0,   0,   0, 255,  31,   0,   0,
+    112,   0,   0,   0,   0,   0,   0, 220,  62,   0,   0,   0,   0,   0, 224, 255,
+    255, 255,   3, 128,   0,   0,  31,   0,   0,   0,  32,   0,  48,   0,   0,   0,
+      0,   0, 128,   7,   0,   0,   0, 144, 127, 254, 255, 255,  31,  28,   0,   0,
+     24, 240, 255, 255, 255, 195, 255, 255,  35,   0,   0,   0,   2,   0,   0,   8,
+      8,   0,   0,   0,   0, 224, 223, 255, 239,  15,   0,   0,   0,  16,   1,   0,
+      0,  64,   0,   0, 255,  15, 255, 255, 255, 127, 254, 255, 254, 255, 254, 255,
+      0, 224, 255, 255, 255, 255,   0,   0, 192, 255, 255, 255,   7,   0, 255, 255,
+    255, 255, 255,  15, 255,   1,   3,   0, 255, 255, 255,   0, 255,  31, 255,  31,
+    255, 255, 255,   1, 255,  15,   0,   0, 255,   0, 255,   3, 255,  63,   3,   0,
+    255, 255, 255, 253, 255, 239, 255, 255, 255,  63,  31,   7, 127,   0, 255, 255,
+    255,   1, 127,   0,   7,   0, 127,   0
+};
+
+RE_UINT32 re_get_posix_punct(RE_UINT32 codepoint) {
+    RE_UINT32 field_2;
+    RE_UINT32 field_1;
+    RE_UINT32 field_0;
+    RE_UINT32 offset;
+    RE_UINT32 v;
+
+    field_2 = codepoint >> 10;
+    field_1 = (codepoint >> 5) & 0x1F;
+    field_0 = (codepoint >> 3) & 0x3;
+    offset = codepoint & 0x7;
+
+    v = re_posix_punct_table_1[field_2];
+    v = re_posix_punct_table_2[(v << 5) | field_1];
+    v = re_posix_punct_table_3[(v << 2) | field_0];
+
+    return (v >> offset) & 0x1;
+}
 
-static RE_UINT8 re_sentence_terminal_stage_4[] = {
-      0,   0,   0,   0,   2,  64,   0, 128,   0,   2,   0,   0,   0,   0,   0, 192,
-      0,   0,  16,   0,   7,   0,   0,   0,   0,   0,   0,   2,   0,   0, 128,  98,
-     48,   0,   0,   0,   0,  12,   0,   0, 132,   1,   0,   0,   0,  64,   0,   0,
-      0,   0,  96,   0,   8,   2,   0,   0,   0,  15,   0,   0,   0,   0,   0, 204,
-      0,   0,   0,  24,   0,   0,   0,  48, 128,   3,   0,   0,   0,  64,   0,  16,
-      4,   0,   0,   0,   0,   0,   0, 128,   0, 192,   0,   0,   0,   0, 136,   0,
-      0,   0, 192,   0,   0, 128,   0,   0,   0,   3,   0,   0,   0,   0,   0, 224,
-      0,   0,   3,   0,   0,   8,   0,   0,   0,   0, 196,   0,   2,   0,   0,   0,
-      0,   0, 224,   3, 128,   1,   0,   0,   3,   0,   0,   0,  14,   0,   0,   0,
-     96,  32,   0, 192,   0,   0,   0,  27,   0,  24,   0,   0,  12, 254, 255,   0,
-      6,   0,   0,   0,   0,   0,   0, 112,  12,   0,   0,   0,   0,   0, 128,   1,
-      0,   0,  32,   0,  16,   0,   0,   0,   0,   0,   0,   1,   0,   1,   0,   0,
-};
+/* Posix_XDigit. */
+RE_UINT32 re_get_posix_xdigit(RE_UINT32 codepoint) {
+    if (0x30 <= codepoint && codepoint <= 0x39)
+        return 1;
+    if (0x41 <= codepoint && codepoint <= 0x46)
+        return 1;
+    if (0x61 <= codepoint && codepoint <= 0x66)
+        return 1;
+
+    return 0;
+}
 
-/* Sentence_Terminal: 960 bytes. */
-
-RE_UINT32 re_get_sentence_terminal(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-
-    f = ch >> 13;
-    code = ch ^ (f << 13);
-    pos = (RE_UINT32)re_sentence_terminal_stage_1[f] << 5;
-    f = code >> 8;
-    code ^= f << 8;
-    pos = (RE_UINT32)re_sentence_terminal_stage_2[pos + f] << 3;
-    f = code >> 5;
-    code ^= f << 5;
-    pos = (RE_UINT32)re_sentence_terminal_stage_3[pos + f] << 5;
-    pos += code;
-    value = (re_sentence_terminal_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1;
-
-    return value;
+/* Prepended_Concatenation_Mark. */
+RE_UINT32 re_get_prepended_concatenation_mark(RE_UINT32 codepoint) {
+    if (0x0600 <= codepoint && codepoint <= 0x0605)
+        return 1;
+    if (codepoint == 0x06DD)
+        return 1;
+    if (codepoint == 0x070F)
+        return 1;
+    if (codepoint == 0x08E2)
+        return 1;
+    if (codepoint == 0x0110BD)
+        return 1;
+    if (codepoint == 0x0110CD)
+        return 1;
+
+    return 0;
 }
 
-/* Variation_Selector. */
+/* Print. */
+static RE_UINT8 re_print_table_1[] = {
+     0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 14, 13, 15, 16, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 17, 18, 18, 13, 13, 13, 13, 13, 13, 19, 20,
+    21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 18, 18, 13, 31, 18, 18,
+    18, 32, 18, 18, 18, 18, 18, 18, 18, 18, 33, 34, 13, 13, 13, 13,
+    13, 35, 13, 36, 18, 18, 18, 18, 18, 18, 18, 18, 37, 18, 18, 38,
+    18, 18, 18, 18, 39, 40, 41, 18, 42, 18, 43, 44, 45, 46, 47, 18,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 48, 13, 13, 13, 49, 50, 13,
+    13, 13, 13, 51, 13, 13, 13, 13, 13, 13, 52, 18, 18, 18, 53, 18,
+    13, 13, 13, 13, 54, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    55, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 56,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 56
+};
 
-static RE_UINT8 re_variation_selector_stage_1[] = {
-    0, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1,
+static RE_UINT16 re_print_table_2[] = {
+      0,   1,   1,   2,   0,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   3,   4,   5,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   6,   7,   1,   8,   1,   9,  10,
+     11,   1,   1,   1,   1,   1,   1,   1,  12,   1,  13,   1,   1,  14,   1,  15,
+      1,  16,  17,  18,   0,  19,  20,   1,   1,   1,   1,   1,  21,  22,  23,  24,
+     25,  26,  27,  28,  29,  30,  31,  32,  33,  30,  34,  35,  36,  37,  38,  39,
+     40,  41,  42,  43,  40,  44,  45,  46,  40,   1,  47,  48,  49,  50,  51,  52,
+     53,  54,  55,   0,  56,  57,  58,   0,   1,   1,  59,  60,  61,  11,  62,   0,
+      1,   1,   1,   1,   1,   1,  63,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,  64,   1,  65,  66,  67,   1,  68,   1,  15,  69,  70,   1,   1,  71,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,  69,   1,   1,  72,  73,  74,  75,  76,   1,   1,  77,  78,
+     79,   1,   1,  72,   1,  80,   1,  81,   2,  82,  83,  84,   1,  85,  86,   1,
+     87,   1,   2,  88,  78,  89,  90,   0,   1,   1,  85,  69,   1,   1,   1,  91,
+      1,  92,  93,   1,  94,  15,   9,  95,   1,   1,   1,   1,   1,   1,   1,  96,
+      1,   1,   1,   1,   1,   1,   1,   1,  71,   1,  97,  77,   1,  19,  98,  99,
+      1, 100,   1, 101, 102,   1, 103, 104,   1,   1,   1,   1,  85,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1, 105,  18,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1, 106, 107,   1,   1,   1,
+      1, 108,   2,   1,   1,   1,   1, 109,   1,  63,   1, 110,  74, 111, 111,   1,
+      1,   1, 112,   0,  96,   1,   1,  75,   1,   1,   1,   1,   1,   1,  81, 113,
+      1,   1,  53,   1,   7,   1,   1,   1, 114,   6,   1,   1, 108,   1,   1, 115,
+      2,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,  69,
+      1,   1,   1,   1, 116,   1, 117,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1, 118,   1,   1,   1,   1,   1, 119,   1,   1,   1,   1,   1,   1, 120, 121,
+      1, 122,   1, 119,   1,   1, 123,   1,   1,   1, 124,  69,   1,   1, 125,   2,
+      1,  74, 126,   1,   1,   1, 127,  74, 128, 129,   1,  85,   1,   1,   1, 130,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1, 115, 131,  55,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,  89,   1,   1,  70,   0, 132, 133, 134,   1,   1,   1, 135,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1, 103,   1, 136,   1, 137, 138,
+     70,   1, 139, 140,   1,   1,   1,  88,  53,   1,   1,   1,   1,   2, 141, 142,
+    143, 144, 145,   0,   1,   1,   1,  95, 146, 147,   1,   1, 102,  90, 103,  77,
+      0,   0,   0,   0,  69,   1, 104,  55,   1, 148,  80,  95, 149,   1, 150,   0,
+      1,   1,   1,   1,  77, 151, 152,  55,   1,   9,   1, 153,   0,   0,   0,   0,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,  74,  81, 137,   0,   0,   0,   0,
+    154, 155, 107,   1,   2, 156,   0, 157, 158, 159,   0,   0,   1, 160, 136,   1,
+    161, 162, 163,   1,   1,   0,   1, 164,   1, 165, 166, 167, 168, 169,   0,   0,
+      1,   1, 170,   0,   1, 112,   1, 171,   1, 172,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   2,   1, 173,   0,   0,   1,   9,  70,   0,   0, 103, 118,  74,
+      1,   1, 174, 175,   1,   1, 176, 177,   1,  19,   9,  74,   1,   1,   1, 178,
+    179,   2,   0,   0, 180, 151,   1, 181,  21, 182, 183, 184,   0,   0,   0,   0,
+      1,   1, 185, 186,   1,   1, 172,   0,   0,   0,   0,   0,   1, 166,  77,   0,
+      1,   1, 187, 188,   1,  72, 189,   0,  15,  85,   0,   0,   0,   0,   0,   0,
+      1,  55,   0,   0,   0,   1,   1, 190, 191, 192, 193,   0,   0, 100,   3, 194,
+      1,   1,   9,   1,   1, 195,   1,  72,   0,   0,   0,   0,   0,   0,   0,   0,
+    196, 197, 198, 116, 136, 199,   0,   0, 200, 201, 172, 202, 203, 189,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,  72,   0,   0,   0,   0,   0, 204,   1, 205,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,  70,   0,   0,   0,
+      1,   1,   1, 206,   1,   1,   1,   1,   1,   1, 207,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      1, 208,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1, 105,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,  72,   2, 209,   0,   0, 103, 210,   1,   1, 211, 212, 213,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   1,   1,  95,   0,   0,   0,   1,   1, 214,   1, 215,   0,   0, 216,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1, 119,
+      1,   1,   1,   1,   1,   1,  81,   0, 170,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      1,   1,   1,   1,   1,   1,   1,   1,   2,   0, 217, 218,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,  55,   0,   0,   0,   0,   0,   0,   0,   0,
+      1,   1,   1, 219, 220, 207,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      1,   1,   1,   1,   1,   1,   1,  81,   1, 221,   1,   1,   1,   1,   1, 170,
+      1,   1, 222,   0,   0,   0,   0,  75,   1,   1,  74,  72,   0,   0,   0,   0,
+      1,   1,  19,   1,  11, 223, 224,   1, 225, 226, 227,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1, 228,   1,   1,   1,   1,   1,   1,   1,   1, 229,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1, 230, 231,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    232, 233,   0,   0,   0,   0,   0,   0,   1, 234, 209,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   1, 159,   0,   0,   0,   0,   0,   0,   0,   0,
+      1,   1,   1,   1,   1,   1, 235,   0,   1,   1, 236,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0, 237,   1, 238,   0,   0,  53,  77,   0,   0,   0,   0,   0,   0,
+    224, 239, 240, 241, 242, 243,   0, 244,   0,   0,   0,   0,   0,   0,   0,   0,
+      1,  85,   1,   1,  75, 245, 246,  81,   1,   1,   1,   1,   1, 247,   0, 248,
+    249,  55, 250, 222,   0,   0,   0,   0,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1, 119, 251,   1,   1,   1,  75,   1,   1,  72, 118,
+     85,   1, 172,   1,   9, 252,   0,   0,   1,   1,   1, 253,   1,   1, 143,   1,
+      1,   1,  75, 254, 117, 255, 256,   0,   1,   1,   1,   1, 139,   1,  18, 257,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,  77,   0,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1, 238,   1,   1,   1,   1,   1,   1,
+     77,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1, 258,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,  90,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+     77,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,  18,   0,   0,   0,   0,   0,
+    259,   1,   1,   1,   0,   0,   0,   0,   1,   1,   1,   1,   1,   1,   1, 213,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,  77
 };
 
-static RE_UINT8 re_variation_selector_stage_2[] = {
-    0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2,
-    3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+static RE_UINT8 re_print_table_3[] = {
+      0,   0,   0,   0, 255, 255, 255, 255, 255, 255, 255, 127, 255, 255, 255, 252,
+    240, 215, 255, 255, 251, 255, 255, 255, 255, 255, 254, 255, 255, 255, 127, 254,
+    255, 231, 254, 255, 255,   0, 255, 255, 255, 135,  31,   0, 255, 255, 255, 223,
+    255, 191, 255, 255, 255, 231, 255, 255, 255, 255,   3,   0, 255, 255, 255, 231,
+    255,  63, 255, 127, 255, 255, 255,  79, 255,   7,   0,   0, 255, 255, 223, 255,
+    255,   0, 248, 255, 239, 159, 249, 255, 255, 253, 197, 243, 159, 121, 128, 176,
+    207, 255, 255, 127, 238, 135, 249, 255, 255, 253, 109, 211, 135,  57,   2,  94,
+    192, 255, 127,   0, 238, 191, 251, 255, 255, 253, 237, 243, 191,  59,   1,   0,
+    207, 255,   3, 254, 238, 159, 249, 255, 159,  57, 224, 176, 207, 255, 255,   0,
+    236, 199,  61, 214,  24, 199, 255, 195, 199,  61, 129,   0, 192, 255, 255,   7,
+    255, 223, 253, 255, 255, 253, 255, 227, 223,  61,  96,   7, 207, 255, 128, 255,
+    255, 253, 239, 243, 223,  61,  96,  64, 207, 255,   6,   0, 223, 253, 240, 255,
+    207, 255, 255, 255, 238, 255, 127, 252, 255, 255, 251,  47, 127, 132,  95, 255,
+    192, 255,  28,   0, 254, 255, 255, 255, 255, 255, 255, 135, 255, 255, 255,  15,
+    214, 247, 255, 255, 175, 255, 255,  63,  95,  63, 255, 243, 255, 254, 255, 255,
+    255,  31, 254, 255, 255, 255, 255, 254, 255, 223, 255,   7, 191,  32, 255, 255,
+    255,  61, 127,  61, 255,  61, 255, 255, 255, 255,  61, 127,  61, 255, 127, 255,
+    255, 255,  61, 255, 255, 255, 255,  31, 255, 255, 255,   3, 255, 255,  63,  63,
+    255, 255, 255,   1, 255, 223,  31,   0, 255, 255, 127,   0, 255, 255,  15,   0,
+    255, 223,  13,   0, 255, 255, 255,  63, 255,   3, 255,   3, 255, 127, 255,   3,
+    255,   7, 255, 255, 255, 255,  63,   0, 255,  15, 255,  15, 241, 255, 255, 255,
+    255,  63,  31,   0, 255,  15, 255, 255, 255,   3, 255, 199, 255, 255, 255, 207,
+    255, 255, 255, 159, 255,  63, 255, 255,   1,   0,   0,   0, 255, 255,  15, 240,
+    255, 255, 255, 248, 255, 227, 255, 255, 255,   1, 255, 255, 255, 255, 255,   7,
+    255, 255, 255, 251,  63,  63, 255, 170, 223, 255, 207, 239, 255, 255, 220, 127,
+    255, 252, 255, 255, 223, 255, 243, 255, 255, 127, 255,  31,   0,   0, 255, 255,
+    255, 255,   1,   0, 127,   0,   0,   0, 255, 255, 207, 255, 255, 255, 191, 255,
+    255, 127, 255, 255, 255, 255,  15, 254, 255, 128,   1, 128, 127, 127, 127, 127,
+    255, 255,   7,   0,   0,   0, 255,  15, 224, 255, 255, 255,  15,   0, 255, 255,
+    255,  31, 255, 255, 127,   0, 255, 255, 255,  15,   0,   0, 255, 255, 255,   0,
+    252,   7,   0,   0,   0,   0, 224, 255, 255,  31, 255,   3,  63, 192, 255,   3,
+    255, 255,  15, 128, 255, 191, 255, 195, 255,  63, 255, 243,   7,   0,   0, 248,
+    126, 126, 126,   0, 127, 127, 255, 255, 255,  63, 255,   3, 127, 248, 255, 255,
+    127,   0, 248, 224, 255, 255, 127,  95, 219, 255, 255, 255,   3,   0, 248, 255,
+    255, 255, 252, 255, 255,   0,   0,   0,   0,   0, 255,  63, 255, 255, 247, 255,
+    127,  15, 223, 255, 252, 252, 252,  28, 127, 127,   0,  62, 255, 239, 255, 255,
+    127, 255, 255, 183, 255,  63, 255,  63, 135, 255, 255, 255, 255, 255, 143, 255,
+     15, 224, 255, 255, 255, 255, 255, 191,  15, 255,  63,   0, 255,   3, 255, 255,
+    255, 255,  15, 255,  15, 128,   0,   0,  63, 253, 255, 255, 255, 255, 191, 145,
+    128, 255,   0,   0, 255, 255,  55, 248, 255, 255, 255, 143, 255, 255, 255, 131,
+    255, 255, 255, 240, 111, 240, 239, 254, 255, 255,  63, 135, 255,   1, 255,   1,
+    127, 248, 127,   0, 255, 255,  63, 254, 255, 255,  63, 255, 255, 255,   7, 255,
+    255, 255,   3,  30,   0, 254,   0,   0, 255,   1,   0,   0, 255, 255,   7, 252,
+    255,   0, 255,   3, 255,  59,   3,   0, 255,  63, 252, 255, 255, 255,   0, 128,
+      3,  32, 255, 255, 255,   1, 255,   3, 254, 255,  31,   0, 255, 255, 251, 255,
+    127, 189, 255, 191, 255,   7, 255,   3, 255, 253, 237, 251, 159,  57, 129, 224,
+    207,  31,  31,   0, 255, 255, 255, 239,   3,   0,   0,   0,  31,   0, 255,   3,
+    255,  31,   0,   0, 255,   3,   0,   0, 255, 255,   7, 128, 127, 242, 111, 255,
+    255, 255, 191, 249, 127,   0, 255,   3,  31,   0,   0,   0,   7,   0,   0,   0,
+    255, 253, 255, 255, 255, 255, 127, 255,  63,   0, 255, 255, 255, 254, 127,   0,
+    127, 251, 255, 255, 255, 255, 127, 180, 191, 253, 255, 255, 255, 127, 251,   1,
+      0,   0,   1,   0, 255, 255,   3, 128, 255, 127,  31,   0,  15,   0,   0,   0,
+    255, 127, 255,   1, 255, 195,   0,   0, 255,  63,  63,   0,  63,   0, 255, 251,
+    251, 255, 255, 224, 255, 255,   0,   0, 255, 135, 255, 255, 255, 128, 255, 255,
+     31,   0,   3,   0,   0,   0,   7,   0, 240,   0, 255, 255, 255,   7, 255,  31,
+    255,   1, 255, 243, 127, 254, 255, 255,  63,   0,   0,   0, 100, 222, 255, 235,
+    239, 255, 255, 255, 191, 231, 223, 223, 255, 255, 255, 123,  95, 252, 253, 255,
+     63, 255, 255, 255, 255, 207, 255, 255, 255,  15,   0, 248, 254, 255,   0,   0,
+    127, 255, 255, 249, 219,   7,   0,   0, 255,  31, 255,  63, 159, 255, 127,   0,
+    255,  15, 255, 195,   0,   0, 254, 255, 255, 255,  31,   0, 150, 254, 247,  10,
+    132, 234, 150, 170, 150, 247, 247,  94, 255, 251, 255,  15, 238, 251, 255,  15,
+      0,   0,   3,   0, 255, 127, 254, 255, 254, 255, 254, 255, 255,  63,   0,   0,
+    192, 255, 255, 255,   7,   0, 255, 255, 255,   1,   3,   0, 255,  31, 255,  31,
+    255,  63,   3,   0, 255, 255, 255, 253, 255,  63,  31,   7, 255,   1, 127,   0,
+      7,   0, 127,   0,   0,   0, 255,   3,   3,   0, 255, 255,   2,   0,   0,   0
 };
 
-static RE_UINT8 re_variation_selector_stage_3[] = {
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 3, 3, 3, 4, 0, 0, 0, 0, 0, 0, 0, 0,
-};
+RE_UINT32 re_get_print(RE_UINT32 codepoint) {
+    RE_UINT32 field_2;
+    RE_UINT32 field_1;
+    RE_UINT32 field_0;
+    RE_UINT32 offset;
+    RE_UINT32 v;
 
-static RE_UINT8 re_variation_selector_stage_4[] = {
-      0,   0,   0,   0,   0,   0,   0,   0,   0,  56,   0,   0,   0,   0,   0,   0,
-    255, 255,   0,   0,   0,   0,   0,   0, 255, 255, 255, 255, 255, 255, 255, 255,
-    255, 255, 255, 255, 255, 255,   0,   0,
-};
+    field_2 = codepoint >> 10;
+    field_1 = (codepoint >> 5) & 0x1F;
+    field_0 = (codepoint >> 3) & 0x3;
+    offset = codepoint & 0x7;
 
-/* Variation_Selector: 236 bytes. */
-
-RE_UINT32 re_get_variation_selector(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-
-    f = ch >> 14;
-    code = ch ^ (f << 14);
-    pos = (RE_UINT32)re_variation_selector_stage_1[f] << 4;
-    f = code >> 10;
-    code ^= f << 10;
-    pos = (RE_UINT32)re_variation_selector_stage_2[pos + f] << 4;
-    f = code >> 6;
-    code ^= f << 6;
-    pos = (RE_UINT32)re_variation_selector_stage_3[pos + f] << 6;
-    pos += code;
-    value = (re_variation_selector_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1;
-
-    return value;
-}
+    v = re_print_table_1[field_2];
+    v = re_print_table_2[(v << 5) | field_1];
+    v = re_print_table_3[(v << 2) | field_0];
 
-/* Pattern_White_Space. */
+    return (v >> offset) & 0x1;
+}
 
-static RE_UINT8 re_pattern_white_space_stage_1[] = {
-    0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+/* Quotation_Mark. */
+static RE_UINT8 re_quotation_mark_table_1[] = {
+    0, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 3, 4, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 5,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
     1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1,
-};
-
-static RE_UINT8 re_pattern_white_space_stage_2[] = {
-    0, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1,
     1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
     1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
     1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-};
-
-static RE_UINT8 re_pattern_white_space_stage_3[] = {
-    0, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
     1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-};
-
-static RE_UINT8 re_pattern_white_space_stage_4[] = {
-      0,  62,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     32,   0,   0,   0,   0,   0,   0,   0,   0, 192,   0,   0,   0,   3,   0,   0,
-};
-
-/* Pattern_White_Space: 178 bytes. */
-
-RE_UINT32 re_get_pattern_white_space(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-
-    f = ch >> 15;
-    code = ch ^ (f << 15);
-    pos = (RE_UINT32)re_pattern_white_space_stage_1[f] << 5;
-    f = code >> 10;
-    code ^= f << 10;
-    pos = (RE_UINT32)re_pattern_white_space_stage_2[pos + f] << 4;
-    f = code >> 6;
-    code ^= f << 6;
-    pos = (RE_UINT32)re_pattern_white_space_stage_3[pos + f] << 6;
-    pos += code;
-    value = (re_pattern_white_space_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1;
-
-    return value;
-}
-
-/* Pattern_Syntax. */
-
-static RE_UINT8 re_pattern_syntax_stage_1[] = {
-    0, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
     1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
     1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
     1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1,
-};
-
-static RE_UINT8 re_pattern_syntax_stage_2[] = {
-    0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    2, 3, 4, 5, 3, 3, 1, 6, 7, 1, 1, 1, 1, 1, 1, 1,
     1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
     1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
     1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 8, 9,
-};
-
-static RE_UINT8 re_pattern_syntax_stage_3[] = {
-     0,  1,  2,  3,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
-     5,  6,  4,  4,  4,  4,  7,  8,  8,  8,  8,  8,  8,  8,  8,  8,
-     8,  9,  4,  4,  8,  8,  8,  8,  8,  8,  8,  8,  8, 10, 11,  8,
-     8,  8,  4,  4,  4,  4,  4,  4, 12,  4,  4,  4,  4,  4,  4,  4,
-     4,  4,  4,  4, 13,  4,  4,  4,  4, 14,  4,  4,  4,  4,  4,  4,
-};
-
-static RE_UINT8 re_pattern_syntax_stage_4[] = {
-      0,   0,   0,   0, 254, 255,   0, 252,   1,   0,   0, 120,   1,   0,   0, 120,
-      0,   0,   0,   0, 254,  90,  67, 136,   0,   0, 128,   0,   0,   0, 128,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 255, 255, 255,   0, 255, 127,
-    254, 255, 239, 127,   0,   0,   0,   0,   0,   0, 255, 255, 255, 255, 255, 255,
-    255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,   0,   0,   0,   0,
-    255, 255, 255, 255, 255, 255,  63,   0,   0,   0, 240, 255, 255, 255, 255, 255,
-     14, 255, 255, 255,   1,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0, 192,
-     96,   0,   0,   0,   0,   0,   0,   0,
-};
-
-/* Pattern_Syntax: 364 bytes. */
-
-RE_UINT32 re_get_pattern_syntax(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-
-    f = ch >> 14;
-    code = ch ^ (f << 14);
-    pos = (RE_UINT32)re_pattern_syntax_stage_1[f] << 5;
-    f = code >> 9;
-    code ^= f << 9;
-    pos = (RE_UINT32)re_pattern_syntax_stage_2[pos + f] << 3;
-    f = code >> 6;
-    code ^= f << 6;
-    pos = (RE_UINT32)re_pattern_syntax_stage_3[pos + f] << 6;
-    pos += code;
-    value = (re_pattern_syntax_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1;
-
-    return value;
-}
-
-/* Prepended_Concatenation_Mark. */
-
-static RE_UINT8 re_prepended_concatenation_mark_stage_1[] = {
-    0, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
     1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
     1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
     1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
 };
 
-static RE_UINT8 re_prepended_concatenation_mark_stage_2[] = {
-    0, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+static RE_UINT8 re_quotation_mark_table_2[] = {
+    0, 1, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-};
-
-static RE_UINT8 re_prepended_concatenation_mark_stage_3[] = {
     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 2, 3, 0, 0, 0,
-    0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 5, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-};
-
-static RE_UINT8 re_prepended_concatenation_mark_stage_4[] = {
-      0,   0,   0,   0,   0,   0,   0,   0,  63,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,  32,   0,   0,   0,   0,   0, 128,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   4,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  32,
-      0,  32,   0,   0,   0,   0,   0,   0,
-};
-
-/* Prepended_Concatenation_Mark: 236 bytes. */
-
-RE_UINT32 re_get_prepended_concatenation_mark(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-
-    f = ch >> 14;
-    code = ch ^ (f << 14);
-    pos = (RE_UINT32)re_prepended_concatenation_mark_stage_1[f] << 4;
-    f = code >> 10;
-    code ^= f << 10;
-    pos = (RE_UINT32)re_prepended_concatenation_mark_stage_2[pos + f] << 4;
-    f = code >> 6;
-    code ^= f << 6;
-    pos = (RE_UINT32)re_prepended_concatenation_mark_stage_3[pos + f] << 6;
-    pos += code;
-    value = (re_prepended_concatenation_mark_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1;
-
-    return value;
-}
-
-/* Regional_Indicator. */
-
-static RE_UINT8 re_regional_indicator_stage_1[] = {
-    0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0,
-};
-
-static RE_UINT8 re_regional_indicator_stage_2[] = {
+    3, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0,
-};
-
-static RE_UINT8 re_regional_indicator_stage_3[] = {
     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 7, 0, 0, 0, 0, 0, 1, 0, 0, 8, 0, 0, 0, 0
 };
 
-static RE_UINT8 re_regional_indicator_stage_4[] = {
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 192, 255, 255, 255,
+static RE_UINT8 re_quotation_mark_table_3[] = {
+      0,   0,   0,   0, 132,   0,   0,   0,   0,   8,   0,   8,   0,   0,   0, 255,
+      0,   0,   0,   6,   4,   0,   0,   0,   0, 240,   0, 224,  30,   0,   0,   0,
+     12,   0,   0,   0
 };
 
-/* Regional_Indicator: 130 bytes. */
-
-RE_UINT32 re_get_regional_indicator(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-
-    f = ch >> 15;
-    code = ch ^ (f << 15);
-    pos = (RE_UINT32)re_regional_indicator_stage_1[f] << 4;
-    f = code >> 11;
-    code ^= f << 11;
-    pos = (RE_UINT32)re_regional_indicator_stage_2[pos + f] << 4;
-    f = code >> 7;
-    code ^= f << 7;
-    pos = (RE_UINT32)re_regional_indicator_stage_3[pos + f] << 7;
-    pos += code;
-    value = (re_regional_indicator_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1;
-
-    return value;
-}
-
-/* Hangul_Syllable_Type. */
-
-static RE_UINT8 re_hangul_syllable_type_stage_1[] = {
-    0, 1, 1, 1, 1, 2, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1,
-};
+RE_UINT32 re_get_quotation_mark(RE_UINT32 codepoint) {
+    RE_UINT32 field_2;
+    RE_UINT32 field_1;
+    RE_UINT32 field_0;
+    RE_UINT32 offset;
+    RE_UINT32 v;
 
-static RE_UINT8 re_hangul_syllable_type_stage_2[] = {
-     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0,  0,  0,  0,  2,  0,  0,  3,  4,  5,  6,
-     7,  8,  9,  3,  4,  5,  6,  7,  8,  9,  3,  4,  5,  6,  7,  8,
-     9,  3,  4,  5,  6,  7,  8,  9,  3,  4,  5,  6,  7,  8,  9,  3,
-     4,  5,  6,  7,  8,  9,  3, 10,  0,  0,  0,  0,  0,  0,  0,  0,
-};
+    field_2 = codepoint >> 10;
+    field_1 = (codepoint >> 5) & 0x1F;
+    field_0 = (codepoint >> 3) & 0x3;
+    offset = codepoint & 0x7;
 
-static RE_UINT8 re_hangul_syllable_type_stage_3[] = {
-     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     1,  1,  1,  1,  1,  1,  2,  2,  2,  2,  3,  4,  4,  4,  4,  4,
-     0,  0,  0,  0,  0,  0,  1,  5,  0,  0,  0,  0,  0,  0,  0,  0,
-     6,  7,  8,  9,  8, 10,  8,  6,  7,  8,  9,  8, 10,  8,  6,  7,
-     8,  9,  8, 10,  8,  6,  7,  8,  9,  8, 10,  8,  6,  7,  8,  9,
-     8, 10,  8,  6,  7,  8,  9,  8, 10,  8,  6,  7,  8,  9,  8, 10,
-     8,  6,  7,  8,  9,  8, 10,  8,  6,  7,  8,  9,  8, 10,  8,  6,
-     7,  8,  9,  8, 10,  8,  6,  7,  8,  9,  8, 10,  8,  6,  7,  8,
-     9,  8, 10,  8,  6,  7,  8,  9,  8, 10,  8,  6,  7,  8,  9,  8,
-    10,  8,  6,  7,  8,  9,  8, 10,  8,  6,  7,  8,  9,  8, 10,  8,
-     8,  9,  8, 10,  8,  6,  7,  8,  9,  8, 11,  2, 12,  4,  4, 13,
-};
+    v = re_quotation_mark_table_1[field_2];
+    v = re_quotation_mark_table_2[(v << 5) | field_1];
+    v = re_quotation_mark_table_3[(v << 2) | field_0];
 
-static RE_UINT8 re_hangul_syllable_type_stage_4[] = {
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3,
-    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0,
-    4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
-    5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 4, 5, 5, 5,
-    5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
-    5, 5, 5, 5, 5, 5, 5, 5, 4, 5, 5, 5, 5, 5, 5, 5,
-    5, 5, 5, 5, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
-    5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 3, 3, 3, 3, 3,
-    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0,
-};
+    return (v >> offset) & 0x1;
+}
 
-/* Hangul_Syllable_Type: 664 bytes. */
-
-RE_UINT32 re_get_hangul_syllable_type(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-
-    f = ch >> 13;
-    code = ch ^ (f << 13);
-    pos = (RE_UINT32)re_hangul_syllable_type_stage_1[f] << 5;
-    f = code >> 8;
-    code ^= f << 8;
-    pos = (RE_UINT32)re_hangul_syllable_type_stage_2[pos + f] << 4;
-    f = code >> 4;
-    code ^= f << 4;
-    pos = (RE_UINT32)re_hangul_syllable_type_stage_3[pos + f] << 4;
-    value = re_hangul_syllable_type_stage_4[pos + code];
-
-    return value;
+/* Radical. */
+RE_UINT32 re_get_radical(RE_UINT32 codepoint) {
+    if (0x2E80 <= codepoint && codepoint <= 0x2E99)
+        return 1;
+    if (0x2E9B <= codepoint && codepoint <= 0x2EF3)
+        return 1;
+    if (0x2F00 <= codepoint && codepoint <= 0x2FD5)
+        return 1;
+
+    return 0;
 }
 
-/* Bidi_Class. */
+/* Regional_Indicator. */
+RE_UINT32 re_get_regional_indicator(RE_UINT32 codepoint) {
+    if (0x01F1E6 <= codepoint && codepoint <= 0x01F1FF)
+        return 1;
 
-static RE_UINT8 re_bidi_class_stage_1[] = {
-     0,  1,  2,  3,  4,  5,  5,  5,  5,  5,  6,  5,  5,  5,  5,  7,
-     8,  9,  5,  5,  5,  5, 10,  5,  5,  5,  5, 11,  5, 12, 13, 14,
-     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5, 15,
-     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5, 15,
-     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5, 15,
-     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5, 15,
-     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5, 15,
-     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5, 15,
-     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5, 15,
-     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5, 15,
-     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5, 15,
-     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5, 15,
-     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5, 15,
-     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5, 15,
-    16,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5, 15,
-     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5, 15,
-     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5, 15,
-};
+    return 0;
+}
 
-static RE_UINT8 re_bidi_class_stage_2[] = {
-      0,   1,   2,   3,   4,   4,   4,   4,   4,   4,   5,   6,   7,   8,   9,  10,
-      4,   4,  11,   4,   4,   4,  12,  13,  14,  15,  16,  17,  18,  19,  20,  21,
-     22,  23,  24,  25,  26,  27,  28,  29,  30,  31,  30,  32,  33,  34,  35,  36,
-     37,  38,  28,  39,  40,  41,   4,  42,  43,  44,  45,  46,  47,  48,  49,  50,
-     51,  52,  53,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,  54,  55,   4,
-     56,   4,   4,   4,   4,   4,   4,   4,   4,   4,  57,   4,  58,  59,  60,  61,
-     62,   4,  63,   4,  64,  65,   4,  66,  67,  68,  69,   4,  70,  71,  72,  73,
-     74,   4,   4,  75,   4,   4,   4,  76,   4,   4,   4,   4,   4,   4,  77,  78,
-     79,  80,  81,  82,  83,  84,  85,  86,  87,  86,  86,  86,  88,  89,  90,  86,
-     91,  92,  93,  94,  86,  86,  86,  86,  86,  86,  95,  86,  86,  86,  86,  86,
-      4,   4,   4,   4,  86,  86,  86,  86,  86,  86,  86,  86,  86,  96,  97,  86,
-      4,   4,   4,  98,   4,  99,   4, 100,  86, 101, 102, 103,  86,  86,  86, 104,
-    105,   4, 106, 107,   4,   4,   4, 108, 109, 110, 111, 112,   4, 113,   4, 114,
-      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
-      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
-      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
-      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
-      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
-      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
-      4,   4,   4,   4,   4,   4,   4,  86,   4,   4,   4,   4,   4,   4,   4,   4,
-      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
-      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
-      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
-      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
-      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
-      4,   4, 115, 116,   4,   4,   4,   4, 117, 118, 119, 120, 121,   4, 122,   4,
-    123, 124,   4, 125, 126, 127, 128, 129, 130, 131, 132, 133,   4,   4,   4, 134,
-      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
-      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
-      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
-      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4, 135, 136,  16,  16,
-     16,  16,  16,  16, 137,  16,  16, 138, 139, 140,  16, 141, 142, 143,   4, 144,
-      4,   4,   4,   4, 145,  86, 146, 147,   4,   4,   4, 148,   4, 149,   4,   4,
-      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
-    150, 150, 150, 150, 151, 150, 150, 150, 152, 150, 150, 153, 154, 150, 150, 150,
-    150, 150, 150, 150, 155, 150, 150, 150, 150, 156, 150, 150, 157, 158, 150, 150,
-    159, 160, 161,   4, 162, 163, 164, 165, 166,   4,   4, 167,  40, 168,   4,   4,
-    169, 170, 171, 172,   4,   4, 173, 174, 175, 176, 177,   4, 178,   4,   4,   4,
-    179,   4,   4,   4,   4,   4,   4, 180, 181, 182, 183,   4,   4,   4,   4,   4,
-    184,   4, 185,   4, 186, 187, 188,   4,   4,   4,   4, 189,   4,   4,   4, 190,
-      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
-      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
-      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4, 191, 192,   4,   4,   4,
-      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4, 193, 194, 195,
-      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
-      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
-      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
-      4,   4, 196,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
-      4,   4,   4,   4,   4, 197, 198,   4,  86, 199,   4,   4,  86, 200,   4,   4,
-      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4, 201, 202, 203, 204, 205,
-      4,   4,   4,   4,   4,   4,   4,   4, 206, 207, 208,   4,   4,   4,   4,   4,
-      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
-    209,   4,   4,   4, 192,   4,   4,   4,   4,   4,   4, 210,   4,   4,   4,   4,
-      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
-    150, 150, 150, 211, 150, 212, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150,
-    150, 157,  16, 150,  16, 213, 150, 150,  16,  16,  16, 214, 150, 150, 150, 150,
-    215,  86, 216, 217, 218, 219,   4,   4,   4, 220,   4,   4,  86,  86,  86,  86,
-     86,  86,  86,  86,  86,  86,  86,  86,  86,  86,  86, 221,  86, 103,  86, 222,
-    223, 224, 225,   4, 226, 227, 228, 229,  86, 230, 231,   4,   4,   4,   4,   4,
-      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4, 232,
+/* Script. */
+static RE_UINT8 re_script_table_1[] = {
+     0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 13, 13,
+    13, 13, 13, 14, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 15, 16, 17, 18, 19, 19, 19, 19, 19,
+    19, 19, 19, 19, 19, 20, 21, 21, 21, 21, 21, 21, 21, 21, 22, 23,
+    24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 21, 21, 34, 35, 21, 21,
+    21, 36, 21, 21, 21, 21, 21, 21, 21, 21, 37, 38, 39, 39, 39, 39,
+    39, 40, 41, 42, 21, 21, 21, 21, 21, 21, 21, 21, 43, 21, 21, 44,
+    21, 21, 21, 21, 45, 46, 47, 21, 48, 21, 49, 50, 51, 52, 53, 21,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 54, 13, 13, 13, 55, 56, 13,
+    13, 13, 13, 57, 13, 13, 13, 13, 13, 13, 58, 21, 21, 21, 59, 21,
+    13, 13, 13, 13, 60, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    61, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21
+};
+
+static RE_UINT16 re_script_table_2[] = {
+      0,   0,   1,   1,   0,   2,   3,   3,   4,   4,   4,   4,   4,   4,   4,   4,
+      4,   4,   4,   4,   4,   5,   0,   6,   7,   7,   7,   8,   9,  10,  11,  12,
+     13,  13,  13,  13,  14,  13,  13,  13,  13,  15,  16,  17,  18,  19,  20,  21,
+     22,  23,  24,  25,  23,  23,  26,  23,  27,  28,  29,  23,  30,  31,  32,  33,
+     34,  35,  36,  37,  38,  39,  40,  41,  42,  42,  43,  44,  45,  46,  47,  48,
+     49,  50,  51,  52,  53,  54,  55,  56,  57,  58,  59,  60,  61,  62,  63,  64,
+     65,  66,  67,  68,  69,  70,  71,  72,  73,  74,  75,  76,  77,  78,  79,  80,
+     81,  82,  83,  38,  84,  85,  86,  38,  87,  87,  88,  89,  90,  91,  92,  38,
+     93,  93,  93,  93,  93,  94,  95,  96,  97,  97,  97,  97,  97,  97,  97,  97,
+     98,  98,  99,  98, 100, 101, 102,  98, 103,  98, 104, 105, 106, 107, 107, 108,
+    109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109,
+    109, 109, 109, 109, 110, 111, 111, 112, 113, 114, 115, 116, 117, 117, 118, 119,
+    120, 121, 121, 122, 121, 123, 109, 124, 125, 126, 127, 128, 129, 130, 131, 117,
+    132, 133, 134, 135, 136, 137, 138,  38, 139, 139, 140, 141, 142, 142, 143, 144,
+    145, 146, 147, 148, 149, 150, 151, 152,   4, 153, 154, 155,   4, 156,   7, 157,
+      4,   4,   4,   4,   4,   4,   4,   4, 158,  11, 159, 160,  11, 161, 162, 163,
+    164,   0,   0, 165, 166,   0, 167, 168,   0, 169, 170,   4, 171,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0, 172, 173,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    174, 174, 174, 174, 174, 174, 174, 174,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 175, 176,   0,   0,   0,
+    177, 178, 179,   4, 180, 180, 180, 181,  94, 182, 183, 184, 185, 186, 186,  13,
+      0,   0, 187,  38, 188, 189, 189, 190, 189, 189, 189, 189, 189, 189, 191, 192,
+    193, 194, 195, 196, 197, 198, 199, 200, 201, 202,  97,  97, 203, 204,   0, 205,
+    206,   0,   0, 207,   0,   0, 208, 209, 199, 199, 210,   0,   0,   0,   0,   0,
+    189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189,
+    189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189,
+    189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189,   0,   0,
+    189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189,
+    189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189,
+    189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 211,
+    212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212,
+    212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212,
+    212, 212, 212, 212, 213, 212, 214, 215, 216, 216, 216, 216, 216, 216, 216, 216,
+    216, 217,  13,  13,  13, 218, 218, 219,   0, 220,   4,   4, 221,   4, 222, 223,
+    224, 225, 226, 227, 228, 228, 229,  42, 230, 231, 232, 233, 234, 234, 235, 236,
+    237, 238, 239,  93, 240, 240, 241, 242, 243, 244, 245, 246, 107, 107, 247, 248,
+     97,  97,  97,  97,  97,  97,  97,  97,  97,  97,  97,  97,  97,  97,  97,  97,
+     97,  97,  97,  97,  97,  97,  97,  97,  97,  97,  97,  97,  97,  97,  97,  97,
+     97,  97,  97,  97,  97,  97,  97,  97,  97,  97,  97,  97,  97,  97,  97,  97,
+     97,  97,  97,  97,  97,  97,  97,  97,  97,  97,  97,  97,  97, 249, 250, 251,
+     38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,
+     38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,
+     38,  38,  38,  38,  38,  38,  38,  38, 189, 189, 189, 189, 189, 189, 189, 189,
+    189, 189, 189, 252, 189, 189, 253,  38, 254, 255, 256,  23,  23,  23, 257,  23,
+     23,  23,  23,  23,  23,  23,  23,  23,  23, 258, 259,  23, 260,  23, 261, 262,
+    263, 264, 265, 266,  23,  23,  23, 267, 268,   1,   1, 269, 270, 206, 271, 272,
+    273, 274, 275,  38, 276, 276, 276, 277, 278, 279,  11,  11, 280, 281, 282, 283,
+     38,  38,  38,  38, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294,  38,
+    295, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305,  38,  38,  38,  38,
+    306, 306, 306, 306, 306, 306, 306, 306, 306, 307, 308, 309,  38,  38,  38,  38,
+    310, 311, 312, 313, 314, 315,  38, 316, 317, 318,  38,  38, 319, 320, 321, 322,
+    323, 324, 325, 326, 327,  38, 328, 329, 330, 331, 332, 333, 334, 335,  38,  38,
+    336, 336, 337,  38, 338, 339, 338, 340, 341, 342,  38,  38,  38,  38,  38,  38,
+     38,  38,  38, 343, 344, 345,  38,  38, 346, 347, 348,  38,  38, 349, 350, 351,
+    352, 352, 353, 354, 355, 355, 356, 357, 358, 359, 360, 361, 362, 362, 362, 363,
+    364, 365,  38,  38, 366, 367, 368, 369, 370, 371, 372, 373,  38,  38,  38,  38,
+    374, 374, 375, 376, 377, 377, 378,  38,  38,  38,  38,  38, 379, 380, 381,  38,
+    382, 382, 383, 384, 385, 386, 387,  38, 388, 389,  38,  38,  38,  38,  38,  38,
+    390, 391,  38,  38,  38, 392, 392, 393, 394, 395, 396,  38,  38, 397, 398, 399,
+    400, 400, 401, 402, 402, 403, 404, 405,  38,  38,  38,  38,  38,  38,  38,  38,
+    406, 407, 408, 409, 410, 411,  38,  38, 412, 413, 414, 415, 416, 417,  38,  38,
+     38,  38,  38,  38,  38,  38,  38, 418,  38,  38,  38,  38,  38, 419, 420, 421,
+    422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422,
+    422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 423,  38,  38,  38,
+    422, 422, 422, 424, 422, 422, 422, 422, 422, 422, 425,  38,  38,  38,  38,  38,
+     38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,
+    426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426,
+    426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426,
+    426, 427,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,
+     38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,
+    428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428,
+    428, 428, 429,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,
+    218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218,
+    218, 430, 431, 432,  38,  38, 433, 434, 435, 435, 436, 437, 438,  38,  38,  38,
+     38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,
+     38,  38, 439, 439, 440,  38,  38,  38, 441, 441, 442, 441, 443,  38,  38, 444,
+    445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445,
+    445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445,
+    445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445,
+    445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 446,
+    445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445,
+    445, 445, 445, 445, 445, 445, 445, 445, 447, 447, 447, 447, 447, 447, 447, 447,
+    447, 447, 447, 447, 447, 447, 448,  38, 449,  38,  38,  38,  38,  38,  38,  38,
+     38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,
+    450, 196, 196, 196, 196, 196, 196, 196, 451,  38, 452, 453, 454, 454, 454, 454,
+    454, 454, 454, 454, 454, 454, 454, 455,  38,  38,  38,  38,  38,  38,  38,  38,
+    456, 456, 456, 457, 458, 459,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,
+     38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,
+      0,   0,   0,   0,   0,   0,   0, 460,   0, 461,   0, 462, 463, 464,   0, 465,
+     11,  11, 466,  38,  38,  38,  38, 467,   0,   0, 468, 469,  38,  38,  38,  38,
+      0,   0, 470,   0, 471, 472, 473,   0, 474, 475, 476,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0, 477,   0,   0,   0,   0,   0,   0,   0,   0, 478,   0,
+    479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479,
+    479, 479, 479, 479, 480, 481,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,
+    482, 483,  38,  38,  38,  38,  38,  38, 484, 485, 486,  38,  38,  38,  38,  38,
+     38,  38,  38,  38,  38,  38, 487, 488,  38,  38,  38,  38,  38,  38,  38,  38,
+    489, 489, 489, 489, 489, 489, 490,  38, 491, 491, 492,  38,  38,  38,  38,  38,
+     38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,
+     38,  38,  38, 493,   0, 494,  38,  38, 268, 495,  38,  38,  38,  38,  38,  38,
+    496, 497, 498, 499, 500, 501,  38, 502,  38,  38,  38,  38,  38,  38,  38,  38,
+      0, 503,   0,   0, 467, 504, 505, 460,   0,   0,   0,   0,   0, 506,  38, 507,
+    508, 509, 510, 511,  38,  38,  38,  38,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0, 512, 513,   0,   0,   0, 467,   0,   0, 469, 514,
+    503,   0, 515,   0, 516, 517,  38,  38,   0,   0,   0, 518,   0,   0, 519,   0,
+      0,   0, 467, 520, 521, 522, 523,  38,   0,   0,   0,   0, 265,   0, 173, 524,
+    189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189,
+    189, 189, 189, 189, 189, 189, 525,  38, 189, 189, 189, 189, 189, 189, 189, 189,
+    189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189,
+    189, 189, 189, 189, 189, 189, 189, 189, 189, 526, 189, 189, 189, 189, 189, 189,
+    525, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189,
+    189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189,
+    189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189,
+    189, 189, 189, 189, 189, 527, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189,
+    189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189,
+    189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 528,
+    189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189,
+    525,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,
+    189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189,
+    189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 529,  38,  38,  38,  38,  38,
+    530,   0,   0,   0,  38,  38,  38,  38,   7,   7,   7,   7,   7,   7,   7, 531,
+     38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38
+};
+
+static RE_UINT8 re_script_table_3[] = {
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
+      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   2,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   2,   1,   1,   1,   1,   1,
+      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
+      2,   2,   2,   2,   2,   2,   2,   1,   2,   2,   2,   2,   2,   2,   2,   2,
+      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
+      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
+      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
+      2,   2,   2,   2,   2,   2,   2,   2,   2,   1,   1,   1,   1,   1,   1,   1,
+      2,   2,   2,   2,   2,   1,   1,   1,   1,   1,   3,   3,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
       4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
       4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
       4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
-      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4, 232,
-    233, 233, 233, 233,   7,   7,   7, 234, 233, 233, 233, 233, 233, 233, 233, 233,
-    233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233,
-    233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233,
-    233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233,
-};
-
-static RE_UINT8 re_bidi_class_stage_3[] = {
-      0,   1,   0,   2,   3,   4,   5,   6,   7,   8,   8,   9,   7,   8,   8,  10,
-     11,   0,   0,   0,  12,  13,  14,  15,   8,   8,  16,   8,   8,   8,  16,   8,
-      8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,  17,
-     18,  19,  18,  19,  20,  21,  19,  19,  22,  22,  22,  22,  22,  22,  22,  22,
-     22,  22,  22,  22,  22,  22,  23,  24,  25,   8,   8,   8,   8,   8,   8,   8,
-      8,   8,   8,   8,   8,   8,  24,   8,  26,  27,   8,   8,   8,   8,   8,   8,
-      8,  28,  29,  22,  22,  22,  22,  30,  31,  32,  32,  32,  32,  32,  32,  32,
-     33,  34,  22,  35,  36,  36,  36,  36,  36,  37,  22,  22,  38,  39,  40,  36,
-     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  41,  42,  43,  44,   5,  45,
-     36,  36,  46,  36,  36,  36,  22,  22,  22,  35,  36,  36,  36,  36,  36,  36,
-     36,  36,  36,  36,  41,  22,  40,  36,  32,  32,  32,  32,  32,  47,  48,  49,
-     32,  32,  50,  51,  52,  53,  32,  32,  32,  32,  32,  54,  36,  36,  32,  32,
-     32,  32,  32,  32,  36,  36,  36,  36,  36,  36,  37,  22,  55,  22,  22,  22,
-     56,   8,   8,   8,   8,   8,   8,  57,  58,  59,  58,   8,  60,   8,   8,   8,
-     61,   8,   8,   8,   8,   8,   8,  62,  63,  64,   8,   8,  60,   8,  65,  66,
-     67,   8,   8,   8,   8,   8,   8,  62,  68,  69,  61,   8,   8,   8,  70,   8,
-     71,  59,   8,   8,  60,   8,  72,  73,  61,   8,   8,   8,   8,   8,   8,  74,
-     63,  64,  75,   8,  60,   8,   8,   8,  76,   8,   8,   8,   8,   8,   8,   8,
-     77,  64,   8,   8,   8,   8,   9,  78,  79,   8,   8,   8,   8,   8,   8,  80,
-     81,  82,  83,   8,  60,   8,   8,  84,   8,  85,   8,   8,  60,   8,   8,   8,
-     27,   8,   8,   8,   8,   8,   8,  86,  63,  64,   8,   8,  60,   8,   8,   8,
-      8,  76,  87,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,  88,  89,
-     90,  91,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,  88,  92,
-      8,  93,   8,   8,   8,   8,   8,   8,   8,   8,   8,  27,   8,   8,  94,  95,
-      8,   8,   8,   8,   8,   8,  58,  91,  96,  97,  22,  58,  22,  22,  22,  92,
-     75,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,  97,  98,  99,
-      8,   8,   8, 100,  77,   8,  63,   8, 101,  64,   8,  64,   8,   8,   8,   8,
-      8,   8,   8,  97,   8,   8,   8,   8,   8,   8,  19, 102,   8,   8,   8,   8,
-      7,   8,   8,   8,   8,   8,   8,   8, 103,   8,   8, 104,   8,   8,   8,   8,
-      8,   8, 105,   8,   8,   8, 105,   8,   8,   8,  60,   8,   8,   8,  60,   8,
-      8,   8,   8,   8,   8,   8, 106,  93,  75,  58, 107, 108,   8,   8,  19, 102,
-     19, 109,   8,   8,   8,   8,   8,   8,  83,   8,   8,   8,   8,  61,   8,   8,
-      8,   8,   8,   8, 110,  77,  76, 111, 112,   8,   8,   8,   8,   8,   8,   8,
-      8,   8,   8, 113,  19,  19,  19,  19,   8,   8,  90, 114,   8,   8,   8,   8,
-      8,   8,  75,  91, 115,  92,  26, 116,   8,   8,   8,   8,   8,   8,  22,  91,
-    107,   8,   8,   8,   8,   8, 117, 118,  76,   8,   8,   8,   8,  26, 107,   8,
-     27,   8,   8,   8, 119, 120,   8,   8,   8,   8,   8,   8,  75, 121,  27,   8,
-      8,   8,   8,   8,   8, 122, 123,   8,   8,   8, 124,  22,  98,  59,  62,  27,
-     22,  22,  22,  22,  22,  22,  22, 125,   8,   8,   8,   8,   8,   8,   8, 126,
-    102,  20,   8,  20,   8,  20,   8, 127, 128, 129,  19,  19,  19, 130, 131,  19,
-    132,  19,  19, 133, 134, 135, 136, 137,   5, 137,   8,   8, 138, 138, 138, 138,
-    138, 138,  22,  22,  22,  22,  77,   8, 139, 102, 140, 141, 142, 143,   8, 144,
-    145, 146,  19,  19,   8,   8,   8,   8,   8, 147,  19,  19,  19,  19,  19,  19,
-     19,  19,  19,  19,  19,  19,  19,  19,  19,  19, 148,  19,  19,  19,  19,  19,
-     19,  19,  19,  19,  19,  19, 149,   8,   8,   8,   8,   8,   8,   8,   8,   9,
-     19,  19, 150,  19,  19,  19,  19,  19,  19,  19,  19,  19,  84,   8,   8,   8,
-     19, 151,   8,   8,  19,  19,  19,  19,  19,   5,   5, 152,   8,   8,   8,   8,
-      8,   8,   8,   8,   8,  18,  19,  19,  19,  19,  19,  19,  19, 153,  19,  19,
-     19,  19,  19,  19,  19,  19, 154,  19,  19,  19, 149,  19,  19,  19,  19,  19,
-      8,   8,   8,   8,  20, 155,  27, 156,   8,   8,   8,   8,   8,   8,   8,  90,
-      8,   8,   8,   8,  22,  22,  22,  22,  19,  19,   8,   8,   8,   8,   8,   8,
-     19,  19,  19, 157,  19,  19,  19,  19,  19,  19,  19,  19,  19,  19, 158,   8,
-     19,  19, 149,   8,   8,   8,  19, 158, 159,  19,  19,  19,   7, 119, 141,  20,
-      8,   8,   8, 160,   7,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8, 161,
-     19,  19,  19,  19, 158,   8,   8,   8,   8,   8,   8, 127,   8,   8,   8,   8,
-      8,   8,  19,  19,   8,   8,   8, 162,   8,   8,   8,   8,   8,   8, 156,  19,
-      8, 163,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,  16, 151,
-      8,   8,   8, 113,   8,   8,   8,  16,   8,   8,  19,  19,  19,  19,  19,  19,
-     84,   8,   8,   8,   8,   8,   8,   8,   8,  20,   8,   8,   8,   8,   8,   8,
-      8,   8,   8,   8,   8,  90, 164, 165,   8,   8,   8,  80,   8,   8,   8,   8,
-      8,   8,   8,   8,   8,   8,  27,   8,  19,  19,  19,  19, 102,   8,   8,   8,
-      8,   7,   8,   8,   8,   8,   8,   8, 166, 167,   8,   8,  83, 158,   8, 168,
-      8,   8,   8,   8,   8,   8, 163,   8,  85,   8,   8,   8,  22,  22,  27,  90,
-      8,   8,   8,   8,  80,  93,   8,   8,  90,  22,  27,   8,   8,   8,   8,   8,
-     56,   8,   8,   8,   8,   8, 169, 170,   8,   8,   8,   8,  64,   8,   8,   8,
-      8,   8,   8,   8,   8, 171,  99,   8, 167,  62,   8,   8,   8,   8,   8,  62,
-      8,   8,   8,   8,   8,   8, 172,  81,  61,   8,   8,   8,   8,  85,  75,   8,
-      8,   8,   8,   8,  64,  59,   8,   8,   8,   8,   8, 173,  32, 174,  32,  32,
-     32,  32,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36, 175,
-     36,  36,   0,   0,   0,   0,  36, 176,  22,  22,  19, 102,  22,  22,  19,  19,
-     19,  19, 177, 178, 179, 180,  36,  36,  36,  36,  36,  36,  36,  36,  36, 181,
-    182,   4,   5,   6,   7,   8,   8,   9,   7,   8,   8,   9, 149,   8,   8,   8,
-      8,   8,   8,   8, 183,  84,   0, 184, 185,   8,   8,   8,   8,   8,   8,   8,
-     19, 145,  19, 158,   7,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,  64,
-      8,   8,   8,   8, 186,   5,   5, 152,   8,   8,   8,   8,   8,   8,  80,  56,
-     32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32, 187,  32,  32,  32,  32,
-    188, 189,  32,  32,  32,  32,  32, 190,  32,  32,  32,  32, 191,  32,  32,  32,
-     32,  32,  32,  32,  32,  32,  32, 192,  36,  36,  36,  36, 193,  36,  38, 194,
-     32,  32,  32,  32,  38,  38,  38, 195,  32,  32,  32,  32,  32,  32,  36,  36,
-     41,  22,  40,  36,  36,  36,  32,  32,  61,   8,   8,   8,   8,   8,   8,  22,
-     91,   8,  18,  19, 149,   8,   8,  90,  27,   8,   8,   8,   8,   8, 196,  67,
-     56,   8,   8,   8,  90, 197,  92,   8,   8,   8,   8,   8,   8,   8, 167,   8,
-     27,   8,   8,   8,   8,   8,  80,  91,   8,  63,   8,   8,   8,   8,   8,   8,
-      8,   8,   8,   8,   8,  90, 198,  75,   8,   8,   8,  90,  26,  56,   8,   8,
-     77,   8,   8,   8,  80,  92,  92,   8,   8,   8,   8,   8,   8,   8,   8,  22,
-     87,   8,   8,  75,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,  26, 199,
-    200,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8, 119, 106,
-     77,   8,   8,  85,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,  26, 201,
-     77,   8,   8,   8,  19, 145,   8,   8,   8,   8,   8,   8,   8, 202, 203,   8,
-      8,   8,   8,  97, 204, 107,   8,   8,   8,   8,   8,   8,   8,  90,  22,  67,
-      8,   8, 122,  60,  77,   8,   8,   8, 171,  67,   8,   8,   8,   8,  26, 205,
-     90,   8, 171, 111,   8,   8,   8,   8,   8,  73,  91,  27,   8,   8,   8,   8,
-      8,   8,   8,   8,   8,   8,  91,  93,   8,   8,  73,  22,  22,  73, 206,   8,
-      8,   8,   8,   8,   8,   8, 171, 207, 203,   8,   8,   8,   8,   8,   8,   8,
-      8,   8, 121,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,  86,   8,
-      8,   8,  20, 208, 209,  19, 102,   8,   8,   8,   8,   8,   8,   8,  92,   8,
-      8,   8,   8,   8,   8,   8,  91,   8,   8,  90,   8,   8,   8,   8,   8,   8,
-      8,  90,  56,   8,   8,   8,   8,   8,   8,   8,   8,   8, 210,   8,   8,   8,
-      8,   8,   8,  83, 211,   8,   8,   8,   8,   8,   8,   8,  90,  27, 212, 213,
-    214, 107,   8,   8,   8, 119,   8,   8, 215,   8,   8,   8,   8,   8,   8,   8,
-     19,  19,  84,   8,   8,   8,   8,   8,   8,   8,   8, 161,   8,   8,   8,   8,
-      8,   8, 216,   8,   8,   8,   8,   8,   8,  16,   8,   8,   8,   8,   8,   8,
-      8, 185,   8,   8,   8,   8,   8,   8, 161, 217,   5,   5,   5,   5,   5,   5,
-     22,  22,  22,  22,  22,  22,  91,  26,  22,  22,  22,  22,  22,  92,  64,   8,
-     62,   8,   8,  26,  58,  22,   8,   8,  91,  22,  22, 218, 219,  56,   8,   8,
-      8,   8,   8,   8,   8, 122,   8, 220,  32,  32, 221,  32,  32,  32,  32,  32,
-    189, 222,  32,  32,  32,  32,  32,  32,  36,  36,  32,  32,  32,  32,  32,  32,
-     36,  36,  36,  36,  36,  36, 223,  36,  19,  19,  19,  19,  19, 158,  19,  19,
-     19,  19, 158,   8,  19,  84, 156,  19, 156,  19, 156,  19,  19,  19, 149,   8,
-      5, 224,   8,   8,   8,  16,   8,   8,   8,   8,   8,   8,   8, 225,   8,   8,
-      8,   8,   8,   8, 149,   8,   8,   8,  19,  19, 149,   8,  19, 145,  19, 151,
-     19,  19,  19,   7,  19, 158,   8,   8,  19, 158,  19,  19,  19,  19,  19,  19,
-     19,   8,  19, 102,  19,  19,  19,  19,  19,   8,  19,  19,  19, 149,   8,   8,
-     19, 153,  19,  19,  19,  19,  19,  19,  19,  19,  19,  19,  19,  19, 139,  18,
-     19,  19,  19,  19, 226, 227,  19,  19,  19, 226,  19,  19,  19,  19,  19,  19,
-     19,  19, 158,   8,  19, 149, 158, 151, 151,   8, 149,   8,   8,   8,   8,   8,
-      8,   8,   8,   8,   8,   8,   8, 228,   0,   0,   0,   0,   0,   0,   0,   0,
-     22,  22,  22,  22,  22,  22,   0,   0,
-};
-
-static RE_UINT8 re_bidi_class_stage_4[] = {
-    11, 11, 11, 11, 11, 11, 11, 11, 11,  8,  7,  8,  9,  7, 11, 11,
-    11, 11, 11, 11,  7,  7,  7,  8,  9, 10, 10,  4,  4,  4, 10, 10,
-    10, 10, 10,  3,  6,  3,  6,  6,  2,  2,  2,  2,  2,  2,  2,  2,
-     2,  2,  6, 10, 10, 10, 10, 10, 10,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 10, 10, 10, 10, 10,
-     0,  0,  0, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11,  7, 11, 11,
-     6, 10,  4,  4,  4,  4, 10, 10, 10, 10,  0, 10, 10, 11, 10, 10,
-     4,  4,  2,  2, 10,  0, 10, 10, 10,  2,  0, 10, 10, 10, 10, 10,
-     0,  0,  0,  0,  0,  0,  0, 10,  0, 10, 10,  0,  0,  0,  0,  0,
-     0,  0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
-     0,  0,  0,  0,  0, 10, 10, 10, 10, 10, 10, 10, 10, 10,  0, 10,
-    12, 12, 12, 12, 12, 12, 12, 12,  0,  0,  0,  0, 10, 10,  0,  0,
-     0,  0,  0,  0,  0,  0, 10,  0,  0,  0,  0,  0, 10, 10,  0, 10,
-     0,  0,  0, 12, 12, 12, 12, 12, 12, 12,  0,  0,  0,  0,  0,  0,
-     0,  0, 10,  0,  0, 10, 10,  4,  1, 12, 12, 12, 12, 12, 12, 12,
-    12, 12, 12, 12, 12, 12,  1, 12,  1, 12, 12,  1, 12, 12,  1, 12,
-     1,  1,  1,  1,  1,  1,  1,  1,  5,  5,  5,  5,  5,  5, 10, 10,
-    13,  4,  4, 13,  6, 13, 10, 10, 12, 12, 12, 13, 13, 13, 13, 13,
-    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 12, 12, 12, 12, 12,
-     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  4,  5,  5, 13, 13, 13,
-    12, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 12, 12,
-    12, 12, 12, 12, 12,  5, 10, 12, 12, 12, 12, 12, 12, 13, 13, 12,
-    12, 10, 12, 12, 12, 12, 13, 13,  2,  2, 13, 13, 13, 13, 13, 13,
-    13, 12, 13, 13, 13, 13, 13, 13,  1,  1,  1, 12, 12, 12, 12, 12,
-    12, 12, 12, 12,  1,  1, 10, 10, 10, 10,  1,  1,  1, 12,  1,  1,
-     1,  1,  1,  1,  1,  1, 12, 12, 12, 12,  1, 12, 12, 12, 12, 12,
-    12, 12, 12, 12,  1, 12, 12, 12,  1, 12, 12, 12, 12, 12,  1,  1,
-     1, 12, 12, 12,  1,  1,  1,  1, 12, 12,  5, 12, 12, 12, 12, 12,
-    12, 12, 12,  0,  0,  0,  0,  0,  0,  0, 12,  0, 12,  0,  0,  0,
-     0, 12, 12, 12, 12, 12, 12, 12, 12,  0,  0,  0,  0, 12,  0,  0,
-     0,  0, 12, 12,  0,  0,  0,  0,  0, 12,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0, 12,  0,  0,  0,  0, 12, 12, 12, 12,  0,  0,  0,
-     0,  0,  0,  0,  0, 12,  0,  0,  0,  0,  4,  4,  0,  0,  0,  0,
-     0,  0,  0,  4,  0,  0, 12,  0,  0, 12, 12,  0,  0,  0,  0,  0,
-     0, 12, 12,  0,  0,  0,  0, 12, 12,  0,  0, 12, 12, 12,  0,  0,
-    12, 12,  0,  0,  0, 12,  0,  0,  0, 12, 12, 12, 12, 12,  0, 12,
-     0,  4,  0,  0,  0,  0,  0,  0,  0,  0, 12, 12, 12, 12, 12, 12,
-     0,  0,  0,  0, 12,  0,  0, 12,  0,  0,  0,  0,  0,  0, 12,  0,
-     0,  0, 12,  0,  0,  0,  0,  0, 12,  0,  0,  0,  0,  0,  0,  0,
-    10,  4, 10,  0,  0,  0,  0,  0, 12,  0,  0,  0, 12,  0,  0,  0,
-     0,  0,  0,  0,  0,  0, 12, 12, 12,  0,  0,  0,  0,  0, 12, 12,
-    12,  0, 12, 12, 12, 12,  0,  0,  0,  0,  0,  0,  0, 12, 12,  0,
-    10, 10, 10, 10, 10, 10, 10,  0,  0,  0,  0,  0, 12, 12,  0,  0,
-     0,  0,  0, 12, 12,  0,  0,  0,  0,  0, 12, 12, 12,  0, 12,  0,
-     0, 12,  0,  0, 12, 12, 12, 12, 12, 12, 12,  0,  0,  0,  0,  4,
-     0,  0,  0,  0,  0,  0,  0, 12, 12, 12, 12, 12, 12, 12, 12,  0,
-    12, 12, 12, 12, 12,  0,  0,  0, 12, 12, 12, 12, 12, 12,  0,  0,
-     0,  0,  0,  0,  0, 12,  0, 12,  0, 12, 10, 10, 10, 10,  0,  0,
-    12, 12, 12, 12, 12,  0, 12, 12,  0,  0,  0,  0,  0, 12, 12, 12,
-    12,  0, 12, 12, 12, 12, 12, 12,  0, 12, 12,  0,  0, 12, 12,  0,
-    12, 12,  0,  0,  0,  0, 12, 12,  0,  0, 12,  0,  0, 12, 12,  0,
-    10, 10,  0,  0,  0,  0,  0,  0,  9,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0, 10, 10,  0,  0,  0,  0,  0, 12, 12, 12,  0,  0,  0,
-     0,  0,  0,  0, 12, 12,  0, 12, 12, 12, 12, 12,  0,  0,  0,  0,
-     0,  0,  0,  4,  0, 12,  0,  0, 10, 10, 10, 12, 12, 12, 11,  0,
-    12, 12, 12,  0,  0,  0,  0, 12,  0, 12, 12, 12,  0,  0,  0,  0,
-    10,  0,  0,  0, 10, 10,  0,  0,  0,  0,  0,  0,  0,  0, 10, 10,
-    12,  0,  0, 12,  0,  0,  0,  0, 12,  0, 12,  0,  0, 12, 12, 12,
-    12, 12, 12, 12, 12,  0,  0, 12,  0,  0,  0,  0, 12,  0, 12, 12,
-    12, 12, 12,  0, 12,  0,  0,  0,  0,  0, 12, 12, 12, 12,  0,  0,
-    12, 12,  0, 12, 12, 12,  0,  0, 12, 12,  0,  0,  0, 12,  0, 12,
-     0,  0,  0,  0, 12, 12, 12, 12, 12, 12, 12, 12,  0,  0, 12, 12,
-    12, 12, 12,  0, 12, 12, 12, 12, 12, 12,  0, 12, 12, 12, 12, 12,
-     0,  0,  0,  0,  0, 10,  0, 10,  0,  0,  0,  0,  0, 10, 10,  0,
-     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9, 11, 11, 11,  0,  1,
-     9,  7, 16, 17, 18, 14, 15,  6,  4,  4,  4,  4,  4, 10, 10, 10,
-    10, 10, 10, 10,  6, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,  9,
-    11, 11, 11, 11, 11, 11, 19, 20, 21, 22, 11, 11, 11, 11, 11, 11,
-     2,  0,  0,  0,  2,  2,  2,  2,  2,  2,  3,  3, 10, 10, 10,  0,
-     4,  4,  4,  4,  4,  4,  4,  4, 10, 10,  0, 10, 10, 10, 10,  0,
-     0,  0,  0,  0, 10,  0, 10, 10, 10,  0,  0,  0,  0,  0, 10, 10,
-    10, 10, 10, 10,  0, 10,  0, 10,  0, 10,  0,  0,  0,  0,  4,  0,
-     0,  0, 10, 10,  0,  0,  0,  0, 10, 10, 10, 10, 10,  0,  0,  0,
-     0,  0, 10, 10, 10, 10,  0,  0,  0, 10, 10, 10,  0,  0,  0,  0,
-    10, 10,  3,  4, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,  0,  0,
-    10, 10, 10, 10, 10,  0, 10, 10, 10, 10, 10,  0,  0,  0,  0,  0,
-     2,  2,  2,  2,  0,  0,  0,  0, 10, 10, 10, 10,  0, 10, 10, 10,
-    10, 10, 10, 10,  0,  0, 10, 10, 10, 10, 10,  0,  0,  0,  0, 12,
-     0, 10, 10, 10, 10, 10, 10, 10, 10, 10,  0, 10, 10, 10, 10, 10,
-    10, 10, 10, 10,  0,  0,  0,  0,  9, 10, 10, 10, 10,  0,  0,  0,
-     0, 12, 12, 10, 10,  0,  0,  0,  0,  0,  0, 10,  0,  0,  0,  0,
-     0,  0,  0,  0, 10, 10, 10,  0,  0,  0,  0,  0, 10, 10, 10, 10,
-    12, 12, 12, 10, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 10, 10,
-     0,  0, 12,  0,  0,  0, 12,  0,  0,  0,  0, 12,  0,  0,  0,  0,
-     4,  4,  0,  0,  0,  0,  0,  0,  0,  0,  0, 12,  0,  0, 12, 12,
-    12, 12,  0,  0, 12, 12,  0,  0,  0, 12, 12, 12, 12, 12, 12,  0,
-    12,  0, 12, 12, 12,  0,  0, 12,  0,  0,  0,  0,  0,  1, 12,  1,
-     1,  3,  1,  1,  1,  1,  1,  1, 13, 13, 13, 13, 13, 13, 10, 10,
-    13, 13, 13, 13, 13, 10, 13, 13,  6, 10,  6,  0, 10,  6, 10, 10,
-    10, 10, 10, 10, 10, 10, 10,  4, 10, 10,  3,  3, 10, 10, 10,  0,
-    10,  4,  4, 10,  0,  0,  0,  0, 13, 13, 13, 13, 13, 13, 13, 11,
-     0, 10, 10,  4,  4,  4, 10, 10,  4,  4, 10, 10, 10,  4,  4,  0,
-    11, 10, 10, 10, 10, 10, 11, 11,  0, 10,  0,  0,  0,  0,  0,  0,
-    12,  2,  2,  2,  2,  2,  2,  2,  1,  1,  1,  1,  1,  1,  1, 10,
-     1, 12, 12, 12,  1, 12, 12,  1,  1,  1,  1,  1, 12, 12, 12, 12,
-    12, 12, 12,  1,  1,  1,  1, 12,  1,  1,  1,  1,  1, 12, 12,  1,
-     1, 10, 10, 10, 10, 10, 10, 10, 13, 13, 13, 13, 12, 12, 12, 12,
-     5,  5, 13, 13, 13, 13, 13, 13,  5,  5,  5,  5,  5,  5,  5,  1,
-     0,  0,  0, 12, 12, 12, 12,  0, 12, 12, 12, 12,  0, 12, 12, 12,
-    12, 12,  0,  0, 12,  0, 12, 12, 12,  0, 12,  0,  0,  0,  0, 12,
-    12,  0, 12, 12,  0,  0,  0,  0, 12, 12, 12,  0,  0, 12,  0, 12,
-     0,  0,  0, 12,  0, 12,  0,  0, 12, 12, 12, 12, 12, 12,  0, 12,
-     0,  0, 12, 12, 12, 12,  0, 12, 12,  0,  0, 12, 12, 12, 12,  0,
-    12,  0, 12, 12,  0, 12, 12,  0,  0,  0, 12,  0, 12, 12,  0, 12,
-    10, 10, 10, 10, 10,  4,  4,  4,  4, 10, 10, 10, 10, 10, 10, 10,
-     0,  0, 10,  0,  0,  0,  0,  0, 11, 11, 11, 11,  0,  0,  0,  0,
-     0,  0,  0, 11, 11, 11, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12,
-    12, 12, 12,  0,  0, 12, 12, 12, 10, 10, 12, 12, 12, 10,  0,  0,
-     0,  0,  0,  0,  0, 10,  0,  0,  0,  0,  0,  0,  0,  0,  2,  2,
-    12,  0,  0, 12, 12, 12, 12, 12, 12, 12,  0, 12, 12,  0, 12, 12,
-     0,  0,  0,  0,  0,  0,  0,  4, 12, 12, 12, 12, 12, 12, 12,  1,
-    12, 12, 12,  1,  1,  1,  1,  1, 10, 10, 13, 13, 13, 13, 13, 13,
-     2,  2,  2, 10, 10,  0,  0,  0,  0,  0, 10, 10, 10,  0,  0,  0,
-    10, 10, 10,  0,  0, 10, 10, 10, 10, 10, 10,  0,  0,  0, 10, 10,
-     0,  0,  0,  0,  0,  0, 11, 11,
-};
-
-/* Bidi_Class: 5072 bytes. */
-
-RE_UINT32 re_get_bidi_class(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-
-    f = ch >> 12;
-    code = ch ^ (f << 12);
-    pos = (RE_UINT32)re_bidi_class_stage_1[f] << 6;
-    f = code >> 6;
-    code ^= f << 6;
-    pos = (RE_UINT32)re_bidi_class_stage_2[pos + f] << 3;
-    f = code >> 3;
-    code ^= f << 3;
-    pos = (RE_UINT32)re_bidi_class_stage_3[pos + f] << 3;
-    value = re_bidi_class_stage_4[pos + code];
-
-    return value;
-}
-
-/* Canonical_Combining_Class. */
-
-static RE_UINT8 re_canonical_combining_class_stage_1[] = {
-     0,  1,  2,  3,  4,  4,  4,  4,  4,  4,  5,  4,  4,  4,  4,  6,
-     7,  8,  4,  4,  4,  4,  9,  4,  4,  4,  4, 10,  4, 11, 12,  4,
-     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
-     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
-     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
-     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
-     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
-     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
-     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
-     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
-     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
-     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
-     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
-     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
-     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
-     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
-     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
-};
-
-static RE_UINT8 re_canonical_combining_class_stage_2[] = {
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   2,   0,   0,
-      0,   0,   3,   0,   0,   0,   4,   5,   6,   7,   0,   8,   9,  10,   0,  11,
-     12,  13,   0,  14,  15,  16,  15,  17,  15,  18,  15,  18,  15,  18,   0,  18,
-      0,  19,  15,  18,  20,  18,   0,  21,  22,  23,  24,  25,  26,  27,  28,  29,
-     30,   0,  31,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  32,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  33,   0,   0,  34,
-      0,   0,  35,   0,  36,   0,   0,   0,  37,  38,  39,   0,  40,  41,  42,  43,
-     44,   0,   0,  45,   0,   0,   0,  46,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,  47,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,  48,   0,  49,   0,  50,   0,   0,   0,   0,   0,   0,   0,   0,
-     51,   0,  52,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      5,   5,   5,   5,   1,   5,   5,   5,   0,   0,   5,   5,   5,   5,   1,   5,
+      0,   0,   0,   0,   5,   1,   5,   1,   5,   5,   5,   0,   5,   0,   5,   5,
+      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
+      5,   5,   0,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
+      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
+      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
+      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
+      5,   5,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,
+      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
+      7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
+      7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
+      7,   7,   7,   7,   7,   4,   4,   7,   7,   7,   7,   7,   7,   7,   7,   7,
+      7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
+      7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
+      0,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,
+      8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,
+      8,   8,   8,   8,   8,   8,   8,   0,   0,   8,   8,   8,   8,   8,   8,   8,
+      8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,
+      8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,
+      8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   0,   0,   8,   8,   8,
+      0,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,
+      9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,
+      9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,
+      9,   9,   9,   9,   9,   9,   9,   9,   0,   0,   0,   0,   0,   0,   0,   0,
+      9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,
+      9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   0,   0,   0,   0,   9,
+      9,   9,   9,   9,   9,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     10,  10,  10,  10,  10,   1,  10,  10,  10,  10,  10,  10,   1,  10,  10,  10,
+     10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,   1,  10,   0,  10,   1,
+     10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,
+     10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,
+      1,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,   4,   4,   4,   4,   4,
+      4,   4,   4,   4,   4,   4,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,
+     10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,
+      4,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,
+     10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,
+     10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,   1,  10,  10,
+     11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,   0,  11,
+     11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,
+     11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,
+     11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,
+     11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,   0,   0,  11,  11,  11,
+     10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,
+     12,  12,  12,  12,  12,  12,  12,  12,  12,  12,  12,  12,  12,  12,  12,  12,
+     12,  12,  12,  12,  12,  12,  12,  12,  12,  12,  12,  12,  12,  12,  12,  12,
+     12,  12,  12,  12,  12,  12,  12,  12,  12,  12,  12,  12,  12,  12,  12,  12,
+     12,  12,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     13,  13,  13,  13,  13,  13,  13,  13,  13,  13,  13,  13,  13,  13,  13,  13,
+     13,  13,  13,  13,  13,  13,  13,  13,  13,  13,  13,  13,  13,  13,  13,  13,
+     13,  13,  13,  13,  13,  13,  13,  13,  13,  13,  13,  13,  13,  13,  13,  13,
+     13,  13,  13,  13,  13,  13,  13,  13,  13,  13,  13,   0,   0,  13,  13,  13,
+     14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,
+     14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,
+     14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,   0,   0,
+     14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,   0,
+     15,  15,  15,  15,  15,  15,  15,  15,  15,  15,  15,  15,  15,  15,  15,  15,
+     15,  15,  15,  15,  15,  15,  15,  15,  15,  15,  15,  15,   0,   0,  15,   0,
+     11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,
+     10,  10,  10,  10,  10,   0,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,
+     10,  10,  10,  10,  10,  10,  10,  10,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,
+     10,  10,   1,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,
+     10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,
+     16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,
+     16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,
+     16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,
+     16,   4,   4,   4,   4,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,
+     16,  16,  16,  16,   1,   1,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,
+     16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,
+     17,  17,  17,  17,   0,  17,  17,  17,  17,  17,  17,  17,  17,   0,   0,  17,
+     17,   0,   0,  17,  17,  17,  17,  17,  17,  17,  17,  17,  17,  17,  17,  17,
+     17,  17,  17,  17,  17,  17,  17,  17,  17,   0,  17,  17,  17,  17,  17,  17,
+     17,   0,  17,   0,   0,   0,  17,  17,  17,  17,   0,   0,  17,  17,  17,  17,
+     17,  17,  17,  17,  17,   0,   0,  17,  17,   0,   0,  17,  17,  17,  17,   0,
+      0,   0,   0,   0,   0,   0,   0,  17,   0,   0,   0,   0,  17,  17,   0,  17,
+     17,  17,  17,  17,   0,   0,  17,  17,  17,  17,  17,  17,  17,  17,  17,  17,
+     17,  17,  17,  17,  17,  17,  17,  17,  17,  17,  17,  17,  17,  17,  17,   0,
+      0,  18,  18,  18,   0,  18,  18,  18,  18,  18,  18,   0,   0,   0,   0,  18,
+     18,   0,   0,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,
+     18,  18,  18,  18,  18,  18,  18,  18,  18,   0,  18,  18,  18,  18,  18,  18,
+     18,   0,  18,  18,   0,  18,  18,   0,  18,  18,   0,   0,  18,   0,  18,  18,
+     18,  18,  18,   0,   0,   0,   0,  18,  18,   0,   0,  18,  18,  18,   0,   0,
+      0,  18,   0,   0,   0,   0,   0,   0,   0,  18,  18,  18,  18,   0,  18,   0,
+      0,   0,   0,   0,   0,   0,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,
+     18,  18,  18,  18,  18,  18,  18,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,  19,  19,  19,   0,  19,  19,  19,  19,  19,  19,  19,  19,  19,   0,  19,
+     19,  19,   0,  19,  19,  19,  19,  19,  19,  19,  19,  19,  19,  19,  19,  19,
+     19,  19,  19,  19,  19,  19,  19,  19,  19,   0,  19,  19,  19,  19,  19,  19,
+     19,   0,  19,  19,   0,  19,  19,  19,  19,  19,   0,   0,  19,  19,  19,  19,
+     19,  19,  19,  19,  19,  19,   0,  19,  19,  19,   0,  19,  19,  19,   0,   0,
+     19,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     19,  19,  19,  19,   0,   0,  19,  19,  19,  19,  19,  19,  19,  19,  19,  19,
+     19,  19,   0,   0,   0,   0,   0,   0,   0,  19,  19,  19,  19,  19,  19,  19,
+      0,  20,  20,  20,   0,  20,  20,  20,  20,  20,  20,  20,  20,   0,   0,  20,
+     20,   0,   0,  20,  20,  20,  20,  20,  20,  20,  20,  20,  20,  20,  20,  20,
+     20,  20,  20,  20,  20,  20,  20,  20,  20,   0,  20,  20,  20,  20,  20,  20,
+     20,   0,  20,  20,   0,  20,  20,  20,  20,  20,   0,   0,  20,  20,  20,  20,
+     20,  20,  20,  20,  20,   0,   0,  20,  20,   0,   0,  20,  20,  20,   0,   0,
+      0,   0,   0,   0,   0,  20,  20,  20,   0,   0,   0,   0,  20,  20,   0,  20,
+     20,  20,  20,  20,   0,   0,  20,  20,  20,  20,  20,  20,  20,  20,  20,  20,
+     20,  20,  20,  20,  20,  20,  20,  20,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,  21,  21,   0,  21,  21,  21,  21,  21,  21,   0,   0,   0,  21,  21,
+     21,   0,  21,  21,  21,  21,   0,   0,   0,  21,  21,   0,  21,   0,  21,  21,
+      0,   0,   0,  21,  21,   0,   0,   0,  21,  21,  21,   0,   0,   0,  21,  21,
+     21,  21,  21,  21,  21,  21,  21,  21,  21,  21,   0,   0,   0,   0,  21,  21,
+     21,  21,  21,   0,   0,   0,  21,  21,  21,   0,  21,  21,  21,  21,   0,   0,
+     21,   0,   0,   0,   0,   0,   0,  21,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,
+     21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,   0,   0,   0,   0,   0,
+     22,  22,  22,  22,  22,  22,  22,  22,  22,  22,  22,  22,  22,   0,  22,  22,
+     22,   0,  22,  22,  22,  22,  22,  22,  22,  22,  22,  22,  22,  22,  22,  22,
+     22,  22,  22,  22,  22,  22,  22,  22,  22,   0,  22,  22,  22,  22,  22,  22,
+     22,  22,  22,  22,  22,  22,  22,  22,  22,  22,   0,   0,   0,  22,  22,  22,
+     22,  22,  22,  22,  22,   0,  22,  22,  22,   0,  22,  22,  22,  22,   0,   0,
+      0,   0,   0,   0,   0,  22,  22,   0,  22,  22,  22,   0,   0,   0,   0,   0,
+     22,  22,  22,  22,   0,   0,  22,  22,  22,  22,  22,  22,  22,  22,  22,  22,
+      0,   0,   0,   0,   0,   0,   0,  22,  22,  22,  22,  22,  22,  22,  22,  22,
+     23,  23,  23,  23,  23,  23,  23,  23,  23,  23,  23,  23,  23,   0,  23,  23,
+     23,   0,  23,  23,  23,  23,  23,  23,  23,  23,  23,  23,  23,  23,  23,  23,
+     23,  23,  23,  23,  23,  23,  23,  23,  23,   0,  23,  23,  23,  23,  23,  23,
+     23,  23,  23,  23,   0,  23,  23,  23,  23,  23,   0,   0,  23,  23,  23,  23,
+     23,  23,  23,  23,  23,   0,  23,  23,  23,   0,  23,  23,  23,  23,   0,   0,
+      0,   0,   0,   0,   0,  23,  23,   0,   0,   0,   0,   0,   0,   0,  23,   0,
+     23,  23,  23,  23,   0,   0,  23,  23,  23,  23,  23,  23,  23,  23,  23,  23,
+      0,  23,  23,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     24,  24,  24,  24,  24,  24,  24,  24,  24,  24,  24,  24,  24,   0,  24,  24,
+     24,   0,  24,  24,  24,  24,  24,  24,  24,  24,  24,  24,  24,  24,  24,  24,
+     24,  24,  24,  24,  24,  24,  24,  24,  24,  24,  24,  24,  24,  24,  24,  24,
+     24,  24,  24,  24,  24,  24,  24,  24,  24,  24,  24,  24,  24,  24,  24,  24,
+     24,  24,  24,  24,  24,   0,  24,  24,  24,   0,  24,  24,  24,  24,  24,  24,
+      0,   0,   0,   0,  24,  24,  24,  24,  24,  24,  24,  24,  24,  24,  24,  24,
+     24,  24,  24,  24,   0,   0,  24,  24,  24,  24,  24,  24,  24,  24,  24,  24,
+     24,  24,  24,  24,  24,  24,  24,  24,  24,  24,  24,  24,  24,  24,  24,  24,
+      0,  25,  25,  25,   0,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,
+     25,  25,  25,  25,  25,  25,  25,   0,   0,   0,  25,  25,  25,  25,  25,  25,
+     25,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,
+     25,  25,   0,  25,  25,  25,  25,  25,  25,  25,  25,  25,   0,  25,   0,   0,
+     25,  25,  25,  25,  25,  25,  25,   0,   0,   0,  25,   0,   0,   0,   0,  25,
+     25,  25,  25,  25,  25,   0,  25,   0,  25,  25,  25,  25,  25,  25,  25,  25,
+      0,   0,   0,   0,   0,   0,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,
+      0,   0,  25,  25,  25,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
+     26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
+     26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
+     26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,   0,   0,   0,   0,   1,
+     26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
+     26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,   0,   0,   0,   0,
+      0,  27,  27,   0,  27,   0,  27,  27,  27,  27,  27,   0,  27,  27,  27,  27,
+     27,  27,  27,  27,  27,  27,  27,  27,  27,  27,  27,  27,  27,  27,  27,  27,
+     27,  27,  27,  27,   0,  27,   0,  27,  27,  27,  27,  27,  27,  27,  27,  27,
+     27,  27,  27,  27,  27,  27,  27,  27,  27,  27,  27,  27,  27,  27,   0,   0,
+     27,  27,  27,  27,  27,   0,  27,   0,  27,  27,  27,  27,  27,  27,   0,   0,
+     27,  27,  27,  27,  27,  27,  27,  27,  27,  27,   0,   0,  27,  27,  27,  27,
+     28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,
+     28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,
+     28,  28,  28,  28,  28,  28,  28,  28,   0,  28,  28,  28,  28,  28,  28,  28,
+     28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,
+     28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,   0,   0,   0,
+      0,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,
+     28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,
+     28,  28,  28,  28,  28,  28,  28,  28,   0,  28,  28,  28,  28,  28,  28,  28,
+     28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,
+     28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,   0,  28,  28,
+     28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,   0,  28,  28,
+     28,  28,  28,  28,  28,   1,   1,   1,   1,  28,  28,   0,   0,   0,   0,   0,
+     29,  29,  29,  29,  29,  29,  29,  29,  29,  29,  29,  29,  29,  29,  29,  29,
+     29,  29,  29,  29,  29,  29,  29,  29,  29,  29,  29,  29,  29,  29,  29,  29,
+     30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,
+     30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,
+     30,  30,  30,  30,  30,  30,   0,  30,   0,   0,   0,   0,   0,  30,   0,   0,
+     30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,
+     30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,
+     30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,   1,  30,  30,  30,  30,
+     31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,
+     31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,
+     32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,
+     32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,
+     32,  32,  32,  32,  32,  32,  32,  32,  32,   0,  32,  32,  32,  32,   0,   0,
+     32,  32,  32,  32,  32,  32,  32,   0,  32,   0,  32,  32,  32,  32,   0,   0,
+     32,  32,  32,  32,  32,  32,  32,  32,  32,   0,  32,  32,  32,  32,   0,   0,
+     32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,
+     32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,
+     32,   0,  32,  32,  32,  32,   0,   0,  32,  32,  32,  32,  32,  32,  32,   0,
+     32,   0,  32,  32,  32,  32,   0,   0,  32,  32,  32,  32,  32,  32,  32,  32,
+     32,  32,  32,  32,  32,  32,  32,   0,  32,  32,  32,  32,  32,  32,  32,  32,
+     32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,
+     32,   0,  32,  32,  32,  32,   0,   0,  32,  32,  32,  32,  32,  32,  32,  32,
+     32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,
+     32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,   0,   0,  32,  32,  32,
+     32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,
+     32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,   0,   0,   0,
+     32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,
+     32,  32,  32,  32,  32,  32,  32,  32,  32,  32,   0,   0,   0,   0,   0,   0,
+     33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,
+     33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,
+     33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,
+     33,  33,  33,  33,  33,  33,   0,   0,  33,  33,  33,  33,  33,  33,   0,   0,
+     34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,
+     34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,
+     35,  35,  35,  35,  35,  35,  35,  35,  35,  35,  35,  35,  35,  35,  35,  35,
+     35,  35,  35,  35,  35,  35,  35,  35,  35,  35,  35,  35,  35,   0,   0,   0,
+     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,
+     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,
+     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,   1,   1,   1,  36,  36,
+     36,  36,  36,  36,  36,  36,  36,  36,  36,   0,   0,   0,   0,   0,   0,   0,
+     37,  37,  37,  37,  37,  37,  37,  37,  37,  37,  37,  37,  37,   0,  37,  37,
+     37,  37,  37,  37,  37,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,
+     38,  38,  38,  38,  38,   1,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,
+     39,  39,  39,  39,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,   0,  40,  40,
+     40,   0,  40,  40,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     41,  41,  41,  41,  41,  41,  41,  41,  41,  41,  41,  41,  41,  41,  41,  41,
+     41,  41,  41,  41,  41,  41,  41,  41,  41,  41,  41,  41,  41,  41,  41,  41,
+     41,  41,  41,  41,  41,  41,  41,  41,  41,  41,  41,  41,  41,  41,  41,  41,
+     41,  41,  41,  41,  41,  41,  41,  41,  41,  41,  41,  41,  41,  41,   0,   0,
+     41,  41,  41,  41,  41,  41,  41,  41,  41,  41,   0,   0,   0,   0,   0,   0,
+     41,  41,  41,  41,  41,  41,  41,  41,  41,  41,   0,   0,   0,   0,   0,   0,
+     42,  42,   1,   1,  42,   1,  42,  42,  42,  42,  42,  42,  42,  42,  42,   0,
+     42,  42,  42,  42,  42,  42,  42,  42,  42,  42,   0,   0,   0,   0,   0,   0,
+     42,  42,  42,  42,  42,  42,  42,  42,  42,  42,  42,  42,  42,  42,  42,  42,
+     42,  42,  42,  42,  42,  42,  42,  42,  42,  42,  42,  42,  42,  42,  42,  42,
+     42,  42,  42,  42,  42,  42,  42,  42,  42,  42,  42,  42,  42,  42,  42,  42,
+     42,  42,  42,  42,  42,  42,  42,  42,  42,   0,   0,   0,   0,   0,   0,   0,
+     42,  42,  42,  42,  42,  42,  42,  42,  42,  42,  42,   0,   0,   0,   0,   0,
+     34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,
+     34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,
+     34,  34,  34,  34,  34,  34,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     43,  43,  43,  43,  43,  43,  43,  43,  43,  43,  43,  43,  43,  43,  43,  43,
+     43,  43,  43,  43,  43,  43,  43,  43,  43,  43,  43,  43,  43,  43,  43,   0,
+     43,  43,  43,  43,  43,  43,  43,  43,  43,  43,  43,  43,   0,   0,   0,   0,
+     43,  43,  43,  43,  43,  43,  43,  43,  43,  43,  43,  43,   0,   0,   0,   0,
+     43,   0,   0,   0,  43,  43,  43,  43,  43,  43,  43,  43,  43,  43,  43,  43,
+     44,  44,  44,  44,  44,  44,  44,  44,  44,  44,  44,  44,  44,  44,  44,  44,
+     44,  44,  44,  44,  44,  44,  44,  44,  44,  44,  44,  44,  44,  44,   0,   0,
+     44,  44,  44,  44,  44,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,
+     45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,
+     45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,   0,   0,   0,   0,
+     45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,
+     45,  45,  45,  45,  45,  45,  45,  45,  45,  45,   0,   0,   0,   0,   0,   0,
+     45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,   0,   0,   0,  45,  45,
+     46,  46,  46,  46,  46,  46,  46,  46,  46,  46,  46,  46,  46,  46,  46,  46,
+     46,  46,  46,  46,  46,  46,  46,  46,  46,  46,  46,  46,   0,   0,  46,  46,
+     47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,
+     47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,
+     47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,
+     47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,   0,
+     47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,
+     47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,   0,   0,  47,
+     47,  47,  47,  47,  47,  47,  47,  47,  47,  47,   0,   0,   0,   0,   0,   0,
+     47,  47,  47,  47,  47,  47,  47,  47,  47,  47,   0,   0,   0,   0,   0,   0,
+     47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,   0,   0,
+      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
+      4,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,
+     48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,
+     48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,   0,   0,   0,   0,
+     48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,
+     48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,
+     48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,   0,   0,   0,
+     49,  49,  49,  49,  49,  49,  49,  49,  49,  49,  49,  49,  49,  49,  49,  49,
+     49,  49,  49,  49,  49,  49,  49,  49,  49,  49,  49,  49,  49,  49,  49,  49,
+     50,  50,  50,  50,  50,  50,  50,  50,  50,  50,  50,  50,  50,  50,  50,  50,
+     50,  50,  50,  50,  50,  50,  50,  50,  50,  50,  50,  50,  50,  50,  50,  50,
+     50,  50,  50,  50,  50,  50,  50,  50,  50,  50,  50,  50,  50,  50,  50,  50,
+     50,  50,  50,  50,   0,   0,   0,   0,   0,   0,   0,   0,  50,  50,  50,  50,
+     51,  51,  51,  51,  51,  51,  51,  51,  51,  51,  51,  51,  51,  51,  51,  51,
+     51,  51,  51,  51,  51,  51,  51,  51,  51,  51,  51,  51,  51,  51,  51,  51,
+     51,  51,  51,  51,  51,  51,  51,  51,  51,  51,  51,  51,  51,  51,  51,  51,
+     51,  51,  51,  51,  51,  51,  51,  51,   0,   0,   0,  51,  51,  51,  51,  51,
+     51,  51,  51,  51,  51,  51,  51,  51,  51,  51,   0,   0,   0,  51,  51,  51,
+     52,  52,  52,  52,  52,  52,  52,  52,  52,  52,  52,  52,  52,  52,  52,  52,
+     52,  52,  52,  52,  52,  52,  52,  52,  52,  52,  52,  52,  52,  52,  52,  52,
+     52,  52,  52,  52,  52,  52,  52,  52,  52,  52,  52,  52,  52,  52,  52,  52,
+      7,   7,   7,   7,   7,   7,   7,   7,   7,   0,   0,   0,   0,   0,   0,   0,
+     30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,
+     30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,
+     30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,   0,   0,  30,  30,  30,
+     49,  49,  49,  49,  49,  49,  49,  49,   0,   0,   0,   0,   0,   0,   0,   0,
+      4,   4,   4,   1,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
+      4,   1,   4,   4,   4,   4,   4,   4,   4,   1,   1,   1,   1,   4,   1,   1,
+      1,   1,   1,   1,   4,   1,   1,   1,   4,   4,   1,   0,   0,   0,   0,   0,
+      2,   2,   2,   2,   2,   2,   5,   5,   5,   5,   5,   7,   2,   2,   2,   2,
+      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
+      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
+      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   5,   5,   5,
+      5,   5,   2,   2,   2,   2,   5,   5,   5,   5,   5,   2,   2,   2,   2,   2,
+      2,   2,   2,   2,   2,   2,   2,   2,   7,   2,   2,   2,   2,   2,   2,   2,
+      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
+      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   5,
+      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
+      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   0,   4,   4,   4,   4,   4,
+      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
+      5,   5,   5,   5,   5,   5,   0,   0,   5,   5,   5,   5,   5,   5,   0,   0,
+      5,   5,   5,   5,   5,   5,   0,   0,   5,   5,   5,   5,   5,   5,   0,   0,
+      5,   5,   5,   5,   5,   5,   5,   5,   0,   5,   0,   5,   0,   5,   0,   5,
+      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
+      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   0,   0,
+      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
+      5,   5,   5,   5,   5,   0,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
+      5,   5,   5,   5,   5,   0,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
+      5,   5,   5,   5,   0,   0,   5,   5,   5,   5,   5,   5,   0,   5,   5,   5,
+      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
+      0,   0,   5,   5,   5,   0,   5,   5,   5,   5,   5,   5,   5,   5,   5,   0,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   4,   4,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   0,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   2,   0,   0,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   2,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   0,
+      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   0,   0,   0,
       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
+      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
+      4,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      1,   1,   1,   1,   1,   1,   5,   1,   1,   1,   2,   2,   1,   1,   1,   1,
+      1,   1,   2,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   2,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      2,   2,   2,   2,   2,   2,   2,   2,   2,   1,   1,   1,   0,   0,   0,   0,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,
       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   0,   0,   0,   0,   0,
       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     53,  53,  53,  53,  53,  53,  53,  53,  53,  53,  53,  53,  53,  53,  53,  53,
+     53,  53,  53,  53,  53,  53,  53,  53,  53,  53,  53,  53,  53,  53,  53,  53,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   0,   0,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   0,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+     54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,
+     54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,
+     54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,   0,
+     54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,
+     54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,
+     54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,   0,
+      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,
+      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,
+      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,
+      6,   6,   6,   6,   0,   0,   0,   0,   0,   6,   6,   6,   6,   6,   6,   6,
+     30,  30,  30,  30,  30,  30,   0,  30,   0,   0,   0,   0,   0,  30,   0,   0,
+     55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,
+     55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,
+     55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,
+     55,  55,  55,  55,  55,  55,  55,  55,   0,   0,   0,   0,   0,   0,   0,  55,
+     55,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  55,
+     32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,
+     32,  32,  32,  32,  32,  32,  32,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     32,  32,  32,  32,  32,  32,  32,   0,  32,  32,  32,  32,  32,  32,  32,   0,
+     32,  32,  32,  32,  32,  32,  32,   0,  32,  32,  32,  32,  32,  32,  32,   0,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,
+     56,  56,  56,  56,  56,  56,  56,  56,  56,  56,   0,  56,  56,  56,  56,  56,
+     56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,
+     56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,
+     56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,
+     56,  56,  56,  56,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,
+     56,  56,  56,  56,  56,  56,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   0,   0,   0,   0,
+      1,   1,   1,   1,   1,  56,   1,  56,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,  56,  56,  56,  56,  56,  56,  56,  56,  56,   4,   4,   4,   4,  31,  31,
+      1,   1,   1,   1,   1,   1,   1,   1,  56,  56,  56,  56,   1,   1,   1,   1,
+      0,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,
+     57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,
+     57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,
+     57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,
+     57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,
+     57,  57,  57,  57,  57,  57,  57,   0,   0,   4,   4,   1,   1,  57,  57,  57,
+      1,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,
+     58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,
+     58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,
+     58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,
+     58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,
+     58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,   1,   1,  58,  58,  58,
+      0,   0,   0,   0,   0,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,
+      3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,
+      3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,
+      0,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,
+     31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,   0,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,
+      3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,
+      1,   1,   1,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,
+     31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,
+     31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,   0,
+     31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,
+     31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+     58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,
+     58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,
+     58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,   1,
+     58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,
+     58,  58,  58,  58,  58,  58,  58,  58,   1,   1,   1,   1,   1,   1,   1,   1,
+     56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,
+     56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,   0,   0,   0,
+     59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,
+     59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,
+     59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,   0,   0,   0,
+     59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,
+     59,  59,  59,  59,  59,  59,  59,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,
+     60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,
+     60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,
+     61,  61,  61,  61,  61,  61,  61,  61,  61,  61,  61,  61,  61,  61,  61,  61,
+     61,  61,  61,  61,  61,  61,  61,  61,  61,  61,  61,  61,  61,  61,  61,  61,
+     61,  61,  61,  61,  61,  61,  61,  61,  61,  61,  61,  61,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     62,  62,  62,  62,  62,  62,  62,  62,  62,  62,  62,  62,  62,  62,  62,  62,
+     62,  62,  62,  62,  62,  62,  62,  62,  62,  62,  62,  62,  62,  62,  62,  62,
+     62,  62,  62,  62,  62,  62,  62,  62,  62,  62,  62,  62,  62,  62,  62,  62,
+     62,  62,  62,  62,  62,  62,  62,  62,   0,   0,   0,   0,   0,   0,   0,   0,
+      1,   1,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
+      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
+      2,   2,   2,   2,   2,   2,   2,   2,   1,   1,   1,   2,   2,   2,   2,   2,
+      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
+      0,   0,   2,   2,   2,   2,   2,   2,   2,   2,   2,   0,   0,   0,   0,   0,
       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
+     63,  63,  63,  63,  63,  63,  63,  63,  63,  63,  63,  63,  63,  63,  63,  63,
+     63,  63,  63,  63,  63,  63,  63,  63,  63,  63,  63,  63,  63,  63,  63,  63,
+     63,  63,  63,  63,  63,  63,  63,  63,  63,  63,  63,  63,  63,   0,   0,   0,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   0,   0,   0,   0,   0,   0,
+     64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,
+     64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,
+     64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,
+     64,  64,  64,  64,  64,  64,  64,  64,   0,   0,   0,   0,   0,   0,   0,   0,
+     65,  65,  65,  65,  65,  65,  65,  65,  65,  65,  65,  65,  65,  65,  65,  65,
+     65,  65,  65,  65,  65,  65,  65,  65,  65,  65,  65,  65,  65,  65,  65,  65,
+     65,  65,  65,  65,  65,  65,   0,   0,   0,   0,   0,   0,   0,   0,  65,  65,
+     65,  65,  65,  65,  65,  65,  65,  65,  65,  65,   0,   0,   0,   0,   0,   0,
+     66,  66,  66,  66,  66,  66,  66,  66,  66,  66,  66,  66,  66,  66,  66,  66,
+     66,  66,  66,  66,  66,  66,  66,  66,  66,  66,  66,  66,  66,  66,  66,  66,
+     66,  66,  66,  66,  66,  66,  66,  66,  66,  66,  66,  66,  66,  66,   1,  66,
+     67,  67,  67,  67,  67,  67,  67,  67,  67,  67,  67,  67,  67,  67,  67,  67,
+     67,  67,  67,  67,  67,  67,  67,  67,  67,  67,  67,  67,  67,  67,  67,  67,
+     67,  67,  67,  67,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  67,
+     31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,
+     31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,   0,   0,   0,
+     68,  68,  68,  68,  68,  68,  68,  68,  68,  68,  68,  68,  68,  68,  68,  68,
+     68,  68,  68,  68,  68,  68,  68,  68,  68,  68,  68,  68,  68,  68,  68,  68,
+     68,  68,  68,  68,  68,  68,  68,  68,  68,  68,  68,  68,  68,  68,   0,   1,
+     68,  68,  68,  68,  68,  68,  68,  68,  68,  68,   0,   0,   0,   0,  68,  68,
+     29,  29,  29,  29,  29,  29,  29,  29,  29,  29,  29,  29,  29,  29,  29,  29,
+     29,  29,  29,  29,  29,  29,  29,  29,  29,  29,  29,  29,  29,  29,  29,   0,
+     69,  69,  69,  69,  69,  69,  69,  69,  69,  69,  69,  69,  69,  69,  69,  69,
+     69,  69,  69,  69,  69,  69,  69,  69,  69,  69,  69,  69,  69,  69,  69,  69,
+     69,  69,  69,  69,  69,  69,  69,  69,  69,  69,  69,  69,  69,  69,  69,  69,
+     69,  69,  69,  69,  69,  69,  69,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     69,  69,  69,  69,  69,  69,  69,  69,  69,  69,  69,  69,  69,  69,   0,   0,
+     69,  69,  69,  69,  69,  69,  69,  69,  69,  69,   0,   0,  69,  69,  69,  69,
+     70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  70,
+     70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  70,
+     70,  70,  70,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  70,  70,  70,  70,  70,
+     71,  71,  71,  71,  71,  71,  71,  71,  71,  71,  71,  71,  71,  71,  71,  71,
+     71,  71,  71,  71,  71,  71,  71,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,  32,  32,  32,  32,  32,  32,   0,   0,  32,  32,  32,  32,  32,  32,   0,
+      0,  32,  32,  32,  32,  32,  32,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     32,  32,  32,  32,  32,  32,  32,   0,  32,  32,  32,  32,  32,  32,  32,   0,
+      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
+      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
+      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   1,   2,   2,   2,   2,
+      2,   2,   2,   2,   2,   5,   2,   2,   2,   2,   1,   1,   0,   0,   0,   0,
+     33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,
+     71,  71,  71,  71,  71,  71,  71,  71,  71,  71,  71,  71,  71,  71,  71,  71,
+     71,  71,  71,  71,  71,  71,  71,  71,  71,  71,  71,  71,  71,  71,  71,  71,
+     71,  71,  71,  71,  71,  71,  71,  71,  71,  71,  71,  71,  71,  71,   0,   0,
+     71,  71,  71,  71,  71,  71,  71,  71,  71,  71,   0,   0,   0,   0,   0,   0,
+     31,  31,  31,  31,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,
+     31,  31,  31,  31,  31,  31,  31,   0,   0,   0,   0,  31,  31,  31,  31,  31,
+     31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,
+     31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,
+     31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,   0,   0,   0,   0,
+     56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,   0,   0,
+     56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,
+     56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,
+     56,  56,  56,  56,  56,  56,  56,  56,  56,  56,   0,   0,   0,   0,   0,   0,
+      2,   2,   2,   2,   2,   2,   2,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   8,   8,   8,   8,   8,   0,   0,   0,   0,   0,   9,   9,   9,
+      9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,
+      9,   9,   9,   9,   9,   9,   9,   0,   9,   9,   9,   9,   9,   0,   9,   0,
+      9,   9,   0,   9,   9,   0,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,
+     10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,
+     10,  10,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,
+     10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,
+     10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,   1,   1,
       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,  53,  54,  55,   0,   0,   0,   0,
-     56,   0,   0,  57,  58,  59,  60,  61,   0,   0,  62,  63,   0,   0,   0,  64,
+     10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,
+     10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,
+      0,   0,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,
+     10,  10,  10,  10,  10,  10,  10,  10,   0,   0,   0,   0,   0,   0,   0,   0,
       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,   0,   0,
+      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   0,   0,   0,   0,   0,   0,
+      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   7,   7,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   0,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   0,   1,   1,   1,   1,   0,   0,   0,   0,
+     10,  10,  10,  10,  10,   0,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,
+     10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,
+     10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,   0,   0,   1,
+      0,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,
+      1,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,
+     58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,
+     58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,   1,   1,
+      0,   0,  31,  31,  31,  31,  31,  31,   0,   0,  31,  31,  31,  31,  31,  31,
+      0,   0,  31,  31,  31,  31,  31,  31,   0,   0,  31,  31,  31,   0,   0,   0,
+      1,   1,   1,   1,   1,   1,   1,   0,   1,   1,   1,   1,   1,   1,   1,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   1,   1,   1,   1,   0,   0,
+     72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,   0,  72,  72,  72,
+     72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,
+     72,  72,  72,  72,  72,  72,  72,   0,  72,  72,  72,  72,  72,  72,  72,  72,
+     72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,   0,  72,  72,   0,  72,
+     72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,   0,   0,
+     72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,   0,   0,
+     72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,
+     72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,
+     72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,
+     72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,   0,   0,   0,   0,   0,
+      1,   1,   1,   0,   0,   0,   0,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   0,   0,   0,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   0,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   0,   0,   0,
+      5,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  65,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,  66,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,  67,   0,   0,   0,  68,   0,  69,   0,   0,
       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,  70,   0,   0,  71,   0,   0,   0,   0,
-      0,   0,   0,   0,  72,   0,   0,   0,   0,   0,   0,   0,   0,  73,   0,   0,
-      0,  74,  75,   0,  76,  60,   0,  77,  78,   0,   0,  79,  80,  81,   0,   0,
-      0,  82,   0,  83,   0,   0,  49,  84,  49,   0,  85,   0,  86,   0,   0,   0,
-     75,   0,   0,   0,   0,   0,   0,  87,  88,  89,  90,   0,   0,   0,   0,   0,
-     49,   0,   0,   0,   0,  91,  92,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   4,   0,   0,
+     73,  73,  73,  73,  73,  73,  73,  73,  73,  73,  73,  73,  73,  73,  73,  73,
+     73,  73,  73,  73,  73,  73,  73,  73,  73,  73,  73,  73,  73,   0,   0,   0,
+     74,  74,  74,  74,  74,  74,  74,  74,  74,  74,  74,  74,  74,  74,  74,  74,
+     74,  74,  74,  74,  74,  74,  74,  74,  74,  74,  74,  74,  74,  74,  74,  74,
+     74,  74,  74,  74,  74,  74,  74,  74,  74,  74,  74,  74,  74,  74,  74,  74,
+     74,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      4,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   0,   0,   0,   0,
+     75,  75,  75,  75,  75,  75,  75,  75,  75,  75,  75,  75,  75,  75,  75,  75,
+     75,  75,  75,  75,  75,  75,  75,  75,  75,  75,  75,  75,  75,  75,  75,  75,
+     75,  75,  75,  75,   0,   0,   0,   0,   0,   0,   0,   0,   0,  75,  75,  75,
+     76,  76,  76,  76,  76,  76,  76,  76,  76,  76,  76,  76,  76,  76,  76,  76,
+     76,  76,  76,  76,  76,  76,  76,  76,  76,  76,  76,   0,   0,   0,   0,   0,
+     77,  77,  77,  77,  77,  77,  77,  77,  77,  77,  77,  77,  77,  77,  77,  77,
+     77,  77,  77,  77,  77,  77,  77,  77,  77,  77,  77,  77,  77,  77,  77,  77,
+     77,  77,  77,  77,  77,  77,  77,  77,  77,  77,  77,   0,   0,   0,   0,   0,
+     78,  78,  78,  78,  78,  78,  78,  78,  78,  78,  78,  78,  78,  78,  78,  78,
+     78,  78,  78,  78,  78,  78,  78,  78,  78,  78,  78,  78,  78,  78,   0,  78,
+     79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,
+     79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,
+     79,  79,  79,  79,   0,   0,   0,   0,  79,  79,  79,  79,  79,  79,  79,  79,
+     79,  79,  79,  79,  79,  79,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     80,  80,  80,  80,  80,  80,  80,  80,  80,  80,  80,  80,  80,  80,  80,  80,
+     80,  80,  80,  80,  80,  80,  80,  80,  80,  80,  80,  80,  80,  80,  80,  80,
+     80,  80,  80,  80,  80,  80,  80,  80,  80,  80,  80,  80,  80,  80,  80,  80,
+     81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,
+     81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,
+     81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,
+     82,  82,  82,  82,  82,  82,  82,  82,  82,  82,  82,  82,  82,  82,  82,  82,
+     82,  82,  82,  82,  82,  82,  82,  82,  82,  82,  82,  82,  82,  82,   0,   0,
+     82,  82,  82,  82,  82,  82,  82,  82,  82,  82,   0,   0,   0,   0,   0,   0,
+     83,  83,  83,  83,  83,  83,  83,  83,  83,  83,  83,  83,  83,  83,  83,  83,
+     83,  83,  83,  83,  83,  83,  83,  83,  83,  83,  83,  83,  83,  83,  83,  83,
+     83,  83,  83,  83,   0,   0,   0,   0,  83,  83,  83,  83,  83,  83,  83,  83,
+     83,  83,  83,  83,  83,  83,  83,  83,  83,  83,  83,  83,  83,  83,  83,  83,
+     83,  83,  83,  83,  83,  83,  83,  83,  83,  83,  83,  83,   0,   0,   0,   0,
+     84,  84,  84,  84,  84,  84,  84,  84,  84,  84,  84,  84,  84,  84,  84,  84,
+     84,  84,  84,  84,  84,  84,  84,  84,  84,  84,  84,  84,  84,  84,  84,  84,
+     84,  84,  84,  84,  84,  84,  84,  84,   0,   0,   0,   0,   0,   0,   0,   0,
+     85,  85,  85,  85,  85,  85,  85,  85,  85,  85,  85,  85,  85,  85,  85,  85,
+     85,  85,  85,  85,  85,  85,  85,  85,  85,  85,  85,  85,  85,  85,  85,  85,
+     85,  85,  85,  85,  85,  85,  85,  85,  85,  85,  85,  85,  85,  85,  85,  85,
+     85,  85,  85,  85,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  85,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     86,  86,  86,  86,  86,  86,  86,  86,  86,  86,  86,  86,  86,  86,  86,  86,
+     86,  86,  86,  86,  86,  86,  86,  86,  86,  86,  86,  86,  86,  86,  86,  86,
+     86,  86,  86,  86,  86,  86,  86,  86,  86,  86,  86,  86,  86,  86,  86,  86,
+     86,  86,  86,  86,  86,  86,  86,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     86,  86,  86,  86,  86,  86,  86,  86,  86,  86,  86,  86,  86,  86,  86,  86,
+     86,  86,  86,  86,  86,  86,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     86,  86,  86,  86,  86,  86,  86,  86,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     87,  87,  87,  87,  87,  87,   0,   0,  87,   0,  87,  87,  87,  87,  87,  87,
+     87,  87,  87,  87,  87,  87,  87,  87,  87,  87,  87,  87,  87,  87,  87,  87,
+     87,  87,  87,  87,  87,  87,  87,  87,  87,  87,  87,  87,  87,  87,  87,  87,
+     87,  87,  87,  87,  87,  87,   0,  87,  87,   0,   0,   0,  87,   0,   0,  87,
+     88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,
+     88,  88,  88,  88,  88,  88,   0,  88,  88,  88,  88,  88,  88,  88,  88,  88,
+     89,  89,  89,  89,  89,  89,  89,  89,  89,  89,  89,  89,  89,  89,  89,  89,
+     89,  89,  89,  89,  89,  89,  89,  89,  89,  89,  89,  89,  89,  89,  89,  89,
+     90,  90,  90,  90,  90,  90,  90,  90,  90,  90,  90,  90,  90,  90,  90,  90,
+     90,  90,  90,  90,  90,  90,  90,  90,  90,  90,  90,  90,  90,  90,  90,   0,
+      0,   0,   0,   0,   0,   0,   0,  90,  90,  90,  90,  90,  90,  90,  90,  90,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     91,  91,  91,  91,  91,  91,  91,  91,  91,  91,  91,  91,  91,  91,  91,  91,
+     91,  91,  91,   0,  91,  91,   0,   0,   0,   0,   0,  91,  91,  91,  91,  91,
+     92,  92,  92,  92,  92,  92,  92,  92,  92,  92,  92,  92,  92,  92,  92,  92,
+     92,  92,  92,  92,  92,  92,  92,  92,  92,  92,  92,  92,   0,   0,   0,  92,
+     93,  93,  93,  93,  93,  93,  93,  93,  93,  93,  93,  93,  93,  93,  93,  93,
+     93,  93,  93,  93,  93,  93,  93,  93,  93,  93,   0,   0,   0,   0,   0,  93,
+     94,  94,  94,  94,  94,  94,  94,  94,  94,  94,  94,  94,  94,  94,  94,  94,
+     94,  94,  94,  94,  94,  94,  94,  94,  94,  94,  94,  94,  94,  94,  94,  94,
+     95,  95,  95,  95,  95,  95,  95,  95,  95,  95,  95,  95,  95,  95,  95,  95,
+     95,  95,  95,  95,  95,  95,  95,  95,   0,   0,   0,   0,  95,  95,  95,  95,
+     95,  95,  95,  95,  95,  95,  95,  95,  95,  95,  95,  95,  95,  95,  95,  95,
+      0,   0,  95,  95,  95,  95,  95,  95,  95,  95,  95,  95,  95,  95,  95,  95,
+     95,  95,  95,  95,  95,  95,  95,  95,  95,  95,  95,  95,  95,  95,  95,  95,
+     95,  95,  95,  95,  95,  95,  95,  95,  95,  95,  95,  95,  95,  95,  95,  95,
+     96,  96,  96,  96,   0,  96,  96,   0,   0,   0,   0,   0,  96,  96,  96,  96,
+     96,  96,  96,  96,   0,  96,  96,  96,   0,  96,  96,  96,  96,  96,  96,  96,
+     96,  96,  96,  96,  96,  96,  96,  96,  96,  96,  96,  96,  96,  96,  96,  96,
+     96,  96,  96,  96,  96,  96,   0,   0,  96,  96,  96,   0,   0,   0,   0,  96,
+     96,  96,  96,  96,  96,  96,  96,  96,  96,   0,   0,   0,   0,   0,   0,   0,
+     96,  96,  96,  96,  96,  96,  96,  96,  96,   0,   0,   0,   0,   0,   0,   0,
+     97,  97,  97,  97,  97,  97,  97,  97,  97,  97,  97,  97,  97,  97,  97,  97,
+     97,  97,  97,  97,  97,  97,  97,  97,  97,  97,  97,  97,  97,  97,  97,  97,
+     98,  98,  98,  98,  98,  98,  98,  98,  98,  98,  98,  98,  98,  98,  98,  98,
+     98,  98,  98,  98,  98,  98,  98,  98,  98,  98,  98,  98,  98,  98,  98,  98,
+     99,  99,  99,  99,  99,  99,  99,  99,  99,  99,  99,  99,  99,  99,  99,  99,
+     99,  99,  99,  99,  99,  99,  99,  99,  99,  99,  99,  99,  99,  99,  99,  99,
+     99,  99,  99,  99,  99,  99,  99,   0,   0,   0,   0,  99,  99,  99,  99,  99,
+     99,  99,  99,  99,  99,  99,  99,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100,
+    100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100,
+    100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100,
+    100, 100, 100, 100, 100, 100,   0,   0,   0, 100, 100, 100, 100, 100, 100, 100,
+    101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101,
+    101, 101, 101, 101, 101, 101,   0,   0, 101, 101, 101, 101, 101, 101, 101, 101,
+    102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102,
+    102, 102, 102,   0,   0,   0,   0,   0, 102, 102, 102, 102, 102, 102, 102, 102,
+    103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103,
+    103, 103,   0,   0,   0,   0,   0,   0,   0, 103, 103, 103, 103,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0, 103, 103, 103, 103, 103, 103, 103,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104,
+    104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104,
+    104, 104, 104, 104, 104, 104, 104, 104, 104,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105,
+    105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105,
+    105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105,
+    105, 105, 105,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105,
+    105, 105, 105,   0,   0,   0,   0,   0,   0,   0, 105, 105, 105, 105, 105, 105,
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106,
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106,
+    106, 106, 106, 106, 106, 106, 106, 106,   0,   0,   0,   0,   0,   0,   0,   0,
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106,   0,   0,   0,   0,   0,   0,
+     10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,
+     10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,   0,
+    107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107,
+    107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107,
+    107, 107, 107, 107, 107, 107, 107, 107, 107, 107,   0, 107, 107, 107,   0,   0,
+    107, 107,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108,
+    108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108,
+    108, 108, 108, 108, 108, 108, 108, 108,   0,   0,   0,   0,   0,   0,   0,   0,
+    109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109,
+    109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109,
+    109, 109, 109, 109, 109, 109, 109, 109, 109, 109,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110,
+    110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111,
+    111, 111, 111, 111, 111, 111, 111,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112,
+    112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112,
+    112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112,   0,   0,
+      0,   0, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112,
+    112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 112,
+    113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+    113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+    113, 113,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 113,   0,   0,
+    114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114,
+    114, 114, 114, 114, 114, 114, 114, 114, 114,   0,   0,   0,   0,   0,   0,   0,
+    114, 114, 114, 114, 114, 114, 114, 114, 114, 114,   0,   0,   0,   0,   0,   0,
+    115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115,
+    115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115,
+    115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115,
+    115, 115, 115, 115, 115,   0, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115,
+    115, 115, 115, 115, 115, 115, 115, 115,   0,   0,   0,   0,   0,   0,   0,   0,
+    116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116,
+    116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116,
+    116, 116, 116, 116, 116, 116, 116,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117,
+    117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117,
+      0,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,
+     25,  25,  25,  25,  25,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118,
+    118, 118,   0, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118,
+    118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118,
+    118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118,   0,
+    119, 119, 119, 119, 119, 119, 119,   0, 119,   0, 119, 119, 119, 119,   0, 119,
+    119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119,   0, 119,
+    119, 119, 119, 119, 119, 119, 119, 119, 119, 119,   0,   0,   0,   0,   0,   0,
+    120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
+    120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
+    120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
+    120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,   0,   0,   0,   0,   0,
+    120, 120, 120, 120, 120, 120, 120, 120, 120, 120,   0,   0,   0,   0,   0,   0,
+    121, 121, 121, 121,   0, 121, 121, 121, 121, 121, 121, 121, 121,   0,   0, 121,
+    121,   0,   0, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+    121, 121, 121, 121, 121, 121, 121, 121, 121,   0, 121, 121, 121, 121, 121, 121,
+    121,   0, 121, 121,   0, 121, 121, 121, 121, 121,   0,   4, 121, 121, 121, 121,
+    121, 121, 121, 121, 121,   0,   0, 121, 121,   0,   0, 121, 121, 121,   0,   0,
+    121,   0,   0,   0,   0,   0,   0, 121,   0,   0,   0,   0,   0, 121, 121, 121,
+    121, 121, 121, 121,   0,   0, 121, 121, 121, 121, 121, 121, 121,   0,   0,   0,
+    121, 121, 121, 121, 121,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+    122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+    122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+    122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122,   0, 122, 122, 122,
+    122, 122,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+    123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+    123, 123, 123, 123, 123, 123, 123, 123,   0,   0,   0,   0,   0,   0,   0,   0,
+    123, 123, 123, 123, 123, 123, 123, 123, 123, 123,   0,   0,   0,   0,   0,   0,
+    124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+    124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+    124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+    124, 124, 124, 124, 124, 124,   0,   0, 124, 124, 124, 124, 124, 124, 124, 124,
+    124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+    124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,   0,   0,
+    125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+    125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+    125, 125, 125, 125, 125,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    125, 125, 125, 125, 125, 125, 125, 125, 125, 125,   0,   0,   0,   0,   0,   0,
+     42,  42,  42,  42,  42,  42,  42,  42,  42,  42,  42,  42,  42,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+    126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+    126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+    126, 126, 126, 126, 126, 126, 126, 126, 126,   0,   0,   0,   0,   0,   0,   0,
+    126, 126, 126, 126, 126, 126, 126, 126, 126, 126,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,   0,   0, 127, 127, 127,
+    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,   0,   0,   0,   0,
+    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,   0,   0,   0,   0,
+    129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+    129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+    129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+    129, 129, 129,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 129,
+    130, 130, 130, 130, 130, 130, 130,   0,   0, 130,   0,   0, 130, 130, 130, 130,
+    130, 130, 130, 130,   0, 130, 130,   0, 130, 130, 130, 130, 130, 130, 130, 130,
+    130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+    130, 130, 130, 130, 130, 130,   0, 130, 130,   0,   0, 130, 130, 130, 130, 130,
+    130, 130, 130, 130, 130, 130, 130,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    130, 130, 130, 130, 130, 130, 130, 130, 130, 130,   0,   0,   0,   0,   0,   0,
+    131, 131, 131, 131, 131, 131, 131, 131,   0,   0, 131, 131, 131, 131, 131, 131,
+    131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+    131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+    131, 131, 131, 131, 131, 131, 131, 131,   0,   0, 131, 131, 131, 131, 131, 131,
+    131, 131, 131, 131, 131,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+    132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+    132, 132, 132, 132, 132, 132, 132, 132,   0,   0,   0,   0,   0,   0,   0,   0,
+    133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+    133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+    133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+    133, 133, 133,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+    134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+    134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+    134, 134, 134, 134, 134, 134, 134, 134, 134,   0,   0,   0,   0,   0,   0,   0,
+    135, 135, 135, 135, 135, 135, 135, 135, 135,   0, 135, 135, 135, 135, 135, 135,
+    135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+    135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+    135, 135, 135, 135, 135, 135, 135,   0, 135, 135, 135, 135, 135, 135, 135, 135,
+    135, 135, 135, 135, 135, 135,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+    135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135,   0,   0,   0,
+    136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+    136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+      0,   0, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+    136, 136, 136, 136, 136, 136, 136, 136,   0, 136, 136, 136, 136, 136, 136, 136,
+    136, 136, 136, 136, 136, 136, 136,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    137, 137, 137, 137, 137, 137, 137,   0, 137, 137,   0, 137, 137, 137, 137, 137,
+    137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+    137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+    137, 137, 137, 137, 137, 137, 137,   0,   0,   0, 137,   0, 137, 137,   0, 137,
+    137, 137, 137, 137, 137, 137, 137, 137,   0,   0,   0,   0,   0,   0,   0,   0,
+    137, 137, 137, 137, 137, 137, 137, 137, 137, 137,   0,   0,   0,   0,   0,   0,
+    138, 138, 138, 138, 138, 138,   0, 138, 138,   0, 138, 138, 138, 138, 138, 138,
+    138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138,
+    138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138,   0,
+    138, 138,   0, 138, 138, 138, 138, 138, 138,   0,   0,   0,   0,   0,   0,   0,
+    138, 138, 138, 138, 138, 138, 138, 138, 138, 138,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139,
+    139, 139, 139, 139, 139, 139, 139, 139, 139,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     60,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,
+     21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,
+     21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,
+     21,  21,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  21,
+    140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,
+    140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,
+    140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,
+    140, 140, 140, 140, 140, 140, 140, 140, 140, 140,   0,   0,   0,   0,   0,   0,
+    140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,   0,
+    140, 140, 140, 140, 140,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    140, 140, 140, 140,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141,
+    141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141,
+    141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141,   0,
+    141, 141, 141, 141, 141, 141, 141, 141, 141,   0,   0,   0,   0,   0,   0,   0,
+    142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142,
+    142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142,
+    142, 142, 142, 142, 142, 142, 142,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     62,  62,  62,  62,  62,  62,  62,  62,  62,  62,  62,  62,  62,  62,  62,  62,
+     62,  62,  62,  62,  62,  62,  62,  62,  62,   0,   0,   0,   0,   0,   0,   0,
+    143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143,
+    143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143,   0,
+    143, 143, 143, 143, 143, 143, 143, 143, 143, 143,   0,   0,   0,   0, 143, 143,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144,
+    144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144,   0,   0,
+    144, 144, 144, 144, 144, 144,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145,
+    145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145,
+    145, 145, 145, 145, 145, 145,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    145, 145, 145, 145, 145, 145, 145, 145, 145, 145,   0, 145, 145, 145, 145, 145,
+    145, 145,   0, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145,
+    145, 145, 145, 145, 145, 145, 145, 145,   0,   0,   0,   0,   0, 145, 145, 145,
+    145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146,
+    146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146,
+    146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146,
+    146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146,   0,   0,   0,   0,   0,
+    147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147,
+    147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147,
+    147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147,   0,   0,   0,   0, 147,
+    147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147,
+    147, 147, 147, 147, 147, 147, 147, 147,   0,   0,   0,   0,   0,   0,   0, 147,
+    147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147,
+    148, 149,   1,   1, 150,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     56,  56,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148,
+    148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148,
+    148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148,
+    148, 148, 148, 148, 148, 148, 148, 148,   0,   0,   0,   0,   0,   0,   0,   0,
+    150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150,
+    150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150,
+    150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150,
+    150, 150, 150, 150, 150, 150,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    148, 148, 148, 148, 148, 148, 148, 148, 148,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     58,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,
+     57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,
+     57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,
+     57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,   0,
       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  93,  94,   0,   0,   0,
+     57,  57,  57,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,  58,  58,  58,  58,   0,   0,   0,   0,   0,   0,   0,   0,
+    149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149,
+    149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149,
+    149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149,
+    149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149,
+    149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149,   0,   0,   0,   0,
+    151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151,
+    151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151,
+    151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151,   0,   0,   0,   0,   0,
+    151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151,   0,   0,   0,
+    151, 151, 151, 151, 151, 151, 151, 151, 151,   0,   0,   0,   0,   0,   0,   0,
+    151, 151, 151, 151, 151, 151, 151, 151, 151, 151,   0,   0, 151, 151, 151, 151,
+      1,   1,   1,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      1,   1,   1,   1,   1,   1,   1,   0,   0,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   4,   4,   4,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   4,   4,   4,   4,   4,
+      4,   4,   4,   1,   1,   4,   4,   4,   4,   4,   4,   4,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   4,   4,   4,   4,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   0,   0,   0,   0,   0,   0,   0,
       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      5,   5,   5,   5,   5,   5,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   0,   0,   0,   0,   0,   0,   0,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   0,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   0,   1,   1,
+      0,   0,   1,   0,   0,   1,   1,   0,   0,   1,   1,   1,   1,   0,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   0,   1,   0,   1,   1,   1,
+      1,   1,   1,   1,   0,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   0,   1,   1,   1,   1,   0,   0,   1,   1,   1,
+      1,   1,   1,   1,   1,   0,   1,   1,   1,   1,   1,   1,   1,   0,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   0,   1,   1,   1,   1,   0,
+      1,   1,   1,   1,   1,   0,   1,   0,   0,   0,   1,   1,   1,   1,   1,   1,
+      1,   0,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   0,   0,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   0,   0,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+    152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152,
+    152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152,
+    152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 152, 152, 152, 152, 152,
+      0, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     54,  54,  54,  54,  54,  54,  54,   0,  54,  54,  54,  54,  54,  54,  54,  54,
+     54,  54,  54,  54,  54,  54,  54,  54,  54,   0,   0,  54,  54,  54,  54,  54,
+     54,  54,   0,  54,  54,   0,  54,  54,  54,  54,  54,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153,
+    153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153,
+    153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153,   0,   0,   0,
+    153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153,   0,   0,
+    153, 153, 153, 153, 153, 153, 153, 153, 153, 153,   0,   0,   0,   0, 153, 153,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154,
+    154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154,
+    154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154,
+    154, 154, 154, 154, 154, 154, 154, 154, 154, 154,   0,   0,   0,   0,   0, 154,
+    155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155,
+    155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155,
+    155, 155, 155, 155, 155,   0,   0, 155, 155, 155, 155, 155, 155, 155, 155, 155,
+    155, 155, 155, 155, 155, 155, 155,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156,
+    156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156,
+    156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156,   0,   0,   0,   0,
+    156, 156, 156, 156, 156, 156, 156, 156, 156, 156,   0,   0,   0,   0, 156, 156,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   0,   0,
+     10,  10,  10,  10,   0,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,
+     10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,
+      0,  10,  10,   0,  10,   0,   0,  10,   0,  10,  10,  10,  10,  10,  10,  10,
+     10,  10,  10,   0,  10,  10,  10,  10,   0,  10,   0,  10,   0,   0,   0,   0,
+      0,   0,  10,   0,   0,   0,   0,  10,   0,  10,   0,  10,   0,  10,  10,  10,
+      0,  10,  10,   0,  10,   0,   0,  10,   0,  10,   0,  10,   0,  10,   0,  10,
+      0,  10,  10,   0,  10,   0,   0,  10,  10,  10,  10,   0,  10,  10,  10,  10,
+     10,  10,  10,   0,  10,  10,  10,  10,   0,  10,  10,  10,  10,   0,  10,   0,
+     10,  10,  10,  10,  10,  10,  10,  10,  10,  10,   0,  10,  10,  10,  10,  10,
+     10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,   0,   0,   0,   0,
+      0,  10,  10,  10,   0,  10,  10,  10,  10,  10,   0,  10,  10,  10,  10,  10,
+     10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     10,  10,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   0,   0,   0,   0,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   0,
+      0,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      0,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      0,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   0,   0,
       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,  95,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,  96,  97,   0,   0,  98,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+     57,   1,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   0,   0,   0,   0,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   0,   0,   0,   0,   0,   0,   0,
+      1,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      1,   1,   1,   1,   1,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   0,   0,   0,   0,   0,   0,   0,   0,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   0,   0,   0,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   0,   0,   0,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      1,   1,   1,   1,   1,   1,   1,   1,   0,   0,   0,   0,   0,   0,   0,   0,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   0,   0,   0,   0,   0,   0,
+      1,   1,   1,   1,   1,   1,   1,   1,   0,   0,   0,   0,   0,   0,   0,   0,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   0,   0,
+      1,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   0,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   0,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   0,   0,
+      1,   1,   1,   1,   1,   0,   0,   0,   1,   1,   1,   0,   0,   0,   0,   0,
+      1,   1,   1,   1,   1,   1,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   0,   0,   0,   0,   0,   0,   0,
+      1,   1,   1,   1,   1,   1,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      1,   1,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      1,   1,   1,   1,   1,   1,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,
       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   0,   0,   0,   0,   0,   0,
+     56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,
+     56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,   0,   0,
+     56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,
+     56,  56,  56,  56,  56,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     56,  56,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,
+     56,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     99,   0,   0,   0,  94,   0,   0,   0,   0,   0,   0, 100,   0,   0,   0,   0,
+     56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,   0,   0,   0,   0,   0,
       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0, 101,   0, 102,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0
 };
 
-static RE_UINT8 re_canonical_combining_class_stage_3[] = {
-      0,   0,   0,   0,   0,   0,   0,   0,   1,   1,   2,   3,   4,   5,   6,   7,
-      8,   9,  10,  11,  12,   1,   0,   0,  13,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,  14,  15,  16,  17,  18,  19,  20,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   1,  21,   0,   0,   0,   0,   0,  22,  23,  24,   0,   0,  25,   0,
-      0,   0,  26,  27,  28,  29,   0,   0,   0,   0,  30,   0,   0,   0,  31,  32,
-     33,  34,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  13,  35,  36,
-      0,   0,  26,  37,  38,  39,   0,   0,   0,   0,   0,  40,   0,   0,   0,   0,
-      0,   0,  41,   1,  42,  43,  44,  45,   0,   0,   0,   0,   0,   0,   0,  46,
-      0,  47,  48,   0,   0,   0,   0,   0,   0,  47,   0,   0,   0,   0,   0,  49,
-      0,  47,   0,   0,   0,   0,   0,   0,   0,  47,  50,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,  51,   0,  52,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,  53,   0,  54,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,  55,   0,  56,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,  57,   0,   0,  58,  59,   0,   0,   0,   0,   0,   0,  60,  61,
-     62,   0,   0,   0,   0,   0,   0,   0,  63,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,  64,  65,   0,  36,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,  66,   0,   0,   0,   0,   0,   0,  67,   0,   0,   0,  67,   0,
-      0,   0,  52,  68,   0,   0,   0,   0,   0,   0,   0,   0,   0,  69,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,  70,   0,   0,  71,  72,   0,   0,   0,   0,
-      0,   0,   0,   0,  73,   0,  66,  74,   0,   0,   0,   0,   0,   0,  75,  76,
-      0,   0,   0,   0,   0,   0,  46,   0,  67,   0,   0,   0,   0,  77,  78,   0,
-      0,   0,   0,   0,   0,  79,   0,   0,   0,   0,   0,   0,  80,   0,  79,   0,
-      0,   0,   0,   0,   0,   0,  64,   0,   0,   0,  81,  82,  83,  84,  85,  86,
-     87,  88,  89,   1,   1,   1,  90,  91,   0,   0,  92,  93,  94,  95,  96,   0,
-      0,   0,   0,   0,   0,  71,  86,   0,   0,   0,   0,   0,   0,   0,   0,  97,
-      0,   0,   0,   0,   1,   1,   1,   1,   0,   0,   0,   0,   0,  98,   0,   0,
-      0,   0,   0,  99,   0,   0,   0,   0,   0,   0,   0,   0,   0,  71, 100, 101,
-      0,   0,   0,  26,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  86,   0,
-    102,   0,   0,   0,   0,   0,   0,   0,  67,   0,   0,   0,   1,   1,  86,   0,
-      0,   0,   0,   0,   0, 103,   0,   0,   0,   0, 104,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0, 105,   0,  73,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0, 106, 107, 108,   0,   0,   0,   0,   0, 102,   0,
-      0,   0,   0,   0,   0,  47,   0,   0,   0,   0,   0, 109,   0,   0,   0,   0,
-      0,   0,   0,   0, 110, 111,   0,   0,   0,   0,   0,   0,   0,   0,   0,  36,
-      0,   0,   0,   0,  72,   0,   0,   0,   0,   0,   0,   0,   0,   0,  26, 112,
-      0, 113,   0,   0,   0,   0,   0, 114,   0,   0,   0,   0, 115,   0,   0,   0,
-      0,   0,   0,   0, 100,   0,   0,   0, 116, 117,  72,   0,   0,   0,   0,   0,
-    102,   0,   0,   0,   0,   0,   0,  97,   0,   0,   0,   0,   0,   0,   0, 118,
-    112,   0,   0,   0,   0,   0,  51,   0,  73, 119,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0, 120,   0,   0,   0,   0,   0,   0, 121,   0,   0,
-      0,   0,   0,   0,   0,   0,   0, 122,   0,  47,   0,   0,  26, 123, 123,   0,
-    124,   0,   0,  49,   0,   0,   0,   0, 125,   0,   0,   0,   0,   0,   0,   0,
-    126,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 127,   0,
-      0,   0,   0,   0,   0, 104,   0,   0,   0,   0,   0,   0,  73,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,  67,   0,  97,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0, 128,   0,   0,   0,   0, 129,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,  97,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 130,   0,
-      0,   0,   0,   0,   0,   0, 131,   0,   0,   0,   0, 132,   0,   0,   0,   0,
-      0,   0,   0,   0, 133, 134, 135, 136, 137, 138,   0,   0,   0, 139,   0,   0,
-    140,   0,   0,   0,   0,   0,   0,   0, 131,   1,   1, 141, 142, 112,   0,   0,
-      0,   0,   0,   0,   0, 100,   0,   0,   0,   0, 143,   0,   0,   0,   0,   0,
-    100, 144,   0,   0,   0,   0,   0,   0,
-};
-
-static RE_UINT8 re_canonical_combining_class_stage_4[] = {
-     0,  0,  0,  0,  0,  0,  0,  0, 50, 50, 50, 50, 50, 50, 50, 50,
-    50, 50, 50, 50, 50, 51, 45, 45, 45, 45, 51, 43, 45, 45, 45, 45,
-    45, 41, 41, 45, 45, 45, 45, 41, 41, 45, 45, 45, 45, 45, 45, 45,
-    45, 45, 45, 45,  1,  1,  1,  1,  1, 45, 45, 45, 45, 50, 50, 50,
-    50, 50, 50, 50, 50, 54, 50, 45, 45, 45, 50, 50, 50, 45, 45,  0,
-    50, 50, 50, 45, 45, 45, 45, 50, 51, 45, 45, 50, 52, 53, 53, 52,
-    53, 53, 52, 50, 50, 50, 50, 50,  0,  0,  0, 50, 50, 50, 50, 50,
-     0, 45, 50, 50, 50, 50, 45, 50, 50, 50, 46, 45, 50, 50, 50, 50,
-    50, 50, 45, 45, 45, 45, 45, 45, 50, 50, 45, 50, 50, 46, 49, 50,
-     5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 14, 15, 16, 17,  0, 18,
-     0, 19, 20,  0, 50, 45,  0, 13, 25, 26, 27,  0,  0,  0,  0,  0,
-     0,  0,  0, 22, 23, 24, 25, 26, 27, 28, 29, 50, 50, 45, 45, 50,
-    50, 50, 50, 50, 45, 50, 50, 45, 30,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0, 50, 50, 50, 50, 50, 50, 50,  0,  0, 50,
-    50, 50, 50, 45, 50,  0,  0, 50, 50,  0, 45, 50, 50, 45,  0,  0,
-     0, 31,  0,  0,  0,  0,  0,  0, 50, 45, 50, 50, 45, 50, 50, 45,
-    45, 45, 50, 45, 45, 50, 45, 50, 50, 50, 45, 50, 45, 50, 45, 50,
-    45, 50, 50,  0,  0,  0,  0,  0, 50, 50, 45, 50,  0,  0,  0,  0,
-     0,  0,  0,  0,  0, 45,  0,  0, 50, 50,  0, 50, 50, 50, 50, 50,
-    50, 50, 50, 50,  0, 50, 50, 50,  0, 50, 50, 50, 50, 50,  0,  0,
-     0, 45, 45, 45,  0,  0,  0,  0,  0,  0,  0, 45, 50, 50, 50, 50,
-    50, 50,  0, 45, 50, 50, 45, 50, 50, 45, 50, 50, 50, 45, 45, 45,
-    22, 23, 24, 50, 50, 50, 45, 50, 50, 45, 45, 50, 50, 50, 50, 50,
-     0,  0,  0,  0,  2,  0,  0,  0,  0,  0,  0,  0,  0,  4,  0,  0,
-     0, 50, 45, 50, 50,  0,  0,  0,  0,  0,  0,  0,  0,  0, 50,  0,
-     0,  0,  0,  0,  0, 32, 33,  0,  0,  0,  0,  4,  4,  0,  0,  0,
-     0,  0,  4,  0,  0,  0,  0,  0, 34, 34,  4,  0,  0,  0,  0,  0,
-    35, 35, 35, 35,  0,  0,  0,  0, 36, 36,  4,  0,  0,  0,  0,  0,
-    37, 37, 37, 37,  0,  0,  0,  0, 45, 45,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0, 45,  0, 45,  0, 43,  0,  0,  0,  0,  0,  0,
-     0, 38, 39,  0, 40,  0,  0,  0,  0,  0, 39, 39, 39, 39,  0,  0,
-    39,  0, 50, 50,  4,  0, 50, 50,  0,  0,  0,  0,  0,  0, 45,  0,
-     0,  0,  0,  0,  0,  0,  0,  2,  0,  4,  4,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0, 50, 50, 50,  0,  0,  0,  0,  4,  0,  0,  0,
-     0,  0,  0,  0,  0, 50,  0,  0,  0, 49,  0,  0,  0,  0,  0,  0,
-     0, 46, 50, 45,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 50,
-    45,  0,  0,  0,  0,  0,  0,  0,  4,  0,  0,  0,  0,  0,  0,  0,
-    50, 50, 50, 50, 50,  0,  0, 45, 50, 50, 50, 50, 50, 45, 45, 45,
-    45, 45, 45, 50, 50, 45,  0,  0,  0,  0,  0, 50, 45, 50, 50, 50,
-    50, 50, 50, 50,  0,  0,  0,  0,  0,  0,  4,  4,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0,  2,  0, 50, 50, 50,  0,  1, 45, 45, 45,
-    45, 45, 50, 50, 45, 45, 45, 45, 50,  0,  1,  1,  1,  1,  1,  1,
-     1,  0,  0,  0,  0, 45,  0,  0,  0,  0,  0,  0, 50,  0,  0,  0,
-    50, 50,  0,  0,  0,  0,  0,  0, 50, 50, 45, 50, 50, 50, 50, 50,
-    50, 50, 45, 50, 50, 53, 42, 45, 41, 50, 50, 50, 50, 50, 50, 50,
-    50, 50, 50, 50, 50, 50, 51, 49, 49, 45,  0, 50, 52, 45, 50, 45,
-    50, 50,  1,  1, 50, 50, 50, 50,  1,  1,  1, 50, 50,  0,  0,  0,
-     0, 50,  0,  0,  0,  1,  1, 50, 45, 50,  1,  1, 45, 45, 45, 45,
-    50,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  4,
-     0,  0, 44, 49, 51, 46, 47, 47,  0,  3,  3,  0,  0,  0,  0,  0,
-     0,  0,  0,  0, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,  0,  0,
-     0,  0,  0,  0,  0,  0,  4,  0,  0,  0,  0, 45, 45, 45,  0,  0,
-     0,  0,  0,  4,  0,  0,  0,  0,  0,  0,  0,  2,  0,  0,  0,  0,
-    50,  0, 50, 50, 45,  0,  0, 50, 50,  0,  0,  0,  0,  0, 50, 50,
-     0, 50,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 21,  0,
-    50, 50, 50, 50, 50, 50, 50, 45, 45, 45, 45, 45, 45, 45, 50, 50,
-    50, 50, 50,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 45,  0, 50,
-    50,  1, 45,  0,  0,  0,  0,  4,  0,  0,  0,  0,  0, 50, 45,  0,
-     0,  0,  0,  0,  0,  0, 45, 45, 50, 50, 50, 45, 50, 45, 45, 45,
-     0,  4,  2,  0,  0,  0,  0,  0,  0,  0,  2,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  4,  2,  0,  0,  2,  4,  0,  0,  0,  0,  0,
-     0,  0,  0,  2,  2,  0,  0,  0, 50, 50, 50, 50, 50,  0,  0,  0,
-     0,  0,  4,  0,  0,  0,  2,  0,  0,  0,  4,  2,  0,  0,  0,  0,
-     2,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  4,  2,
-     0,  4,  0,  0,  0,  0,  0,  0,  0,  0,  2,  0,  4,  4,  0,  0,
-     1,  1,  1,  1,  1,  0,  0,  0, 50, 50, 50, 50, 50, 50, 50,  0,
-     0,  0,  0,  0,  0,  0,  1,  0,  0,  0,  0,  0,  0, 43, 43,  1,
-     1,  1,  0,  0,  0, 48, 43, 43, 43, 43, 43,  0,  0,  0,  0,  0,
-     0,  0,  0, 45, 45, 45, 45, 45, 45, 45, 45,  0,  0, 50, 50, 50,
-    50, 50, 45, 45,  0,  0,  0,  0,  0,  0, 50, 50, 50, 50,  0,  0,
-     0,  0, 50, 50, 50,  0,  0,  0, 50,  0,  0, 50, 50, 50, 50, 50,
-    50, 50,  0, 50, 50,  0, 50, 50, 45, 45, 45, 45, 45, 45, 45,  0,
-    50, 50,  2,  0,  0,  0,  0,  0,
-};
+RE_UINT32 re_get_script(RE_UINT32 codepoint) {
+    RE_UINT32 field_2;
+    RE_UINT32 field_1;
+    RE_UINT32 field_0;
+    RE_UINT32 v;
 
-/* Canonical_Combining_Class: 3088 bytes. */
-
-RE_UINT32 re_get_canonical_combining_class(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-
-    f = ch >> 12;
-    code = ch ^ (f << 12);
-    pos = (RE_UINT32)re_canonical_combining_class_stage_1[f] << 6;
-    f = code >> 6;
-    code ^= f << 6;
-    pos = (RE_UINT32)re_canonical_combining_class_stage_2[pos + f] << 3;
-    f = code >> 3;
-    code ^= f << 3;
-    pos = (RE_UINT32)re_canonical_combining_class_stage_3[pos + f] << 3;
-    value = re_canonical_combining_class_stage_4[pos + code];
-
-    return value;
-}
+    field_2 = codepoint >> 10;
+    field_1 = (codepoint >> 5) & 0x1F;
+    field_0 = codepoint & 0x1F;
 
-/* Decomposition_Type. */
+    v = re_script_table_1[field_2];
+    v = re_script_table_2[(v << 5) | field_1];
+    v = re_script_table_3[(v << 5) | field_0];
 
-static RE_UINT8 re_decomposition_type_stage_1[] = {
-     0,  1,  2,  3,  4,  5,  6,  7,  7,  7,  7,  7,  7,  7,  7,  7,
-     7,  7,  7,  7,  8,  9, 10, 10, 10, 10, 11,  7,  7,  7,  7, 12,
-     7,  7, 13,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
-     7,  7,  7,  7,  7,  7,  7,  7,  7,  7, 14,  7,  7, 15, 16,  7,
-     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
-     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7, 17,
-     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
-     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
-     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
-     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
-     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
-     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
-     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
-     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
-     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
-     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
-     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
-     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
-     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
-     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
-     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
-     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
-     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
-     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
-     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
-     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
-     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
-     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
-     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
-     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
-     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
-     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
-     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
-     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
-};
+    return v;
+}
 
-static RE_UINT8 re_decomposition_type_stage_2[] = {
-      0,   0,   0,   0,   0,   1,   2,   3,   4,   5,   6,   7,   0,   8,   9,  10,
-     11,  12,   0,   0,   0,  13,  14,  15,   0,   0,  16,  17,  18,  19,  20,  21,
-     22,  23,  24,  25,   0,   0,  26,  27,   0,   0,   0,   0,  28,   0,   0,   0,
-      0,  29,   0,  30,   0,   0,  31,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,  32,  33,   0,   0,   0,  34,   0,
-      0,  35,  36,   0,   0,   0,   0,   0,   0,   0,  37,   0,  38,   0,  39,   0,
-      0,   0,  40,   0,   0,   0,  41,   0,   0,   0,  39,   0,   0,   0,  42,   0,
-      0,  43,   0,   0,   0,  43,  44,   0,  45,   0,  46,  47,  48,  49,   0,   0,
-      0,  50,   0,   0,   0,   0,   0,  51,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+/* Script_Extensions. */
+static RE_UINT8 script_extensions_table_1[] = {
+     0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 13, 13,
+    13, 13, 13, 14, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 15, 16, 17, 18, 19, 19, 19, 19, 19,
+    19, 19, 19, 19, 19, 20, 21, 21, 21, 21, 21, 21, 21, 21, 22, 23,
+    24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 21, 21, 34, 35, 21, 21,
+    21, 36, 21, 21, 21, 21, 21, 21, 21, 21, 37, 38, 39, 39, 39, 39,
+    39, 40, 41, 42, 21, 21, 21, 21, 21, 21, 21, 21, 43, 21, 21, 44,
+    21, 21, 21, 21, 45, 46, 47, 21, 48, 21, 49, 50, 51, 52, 53, 21,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 54, 13, 13, 13, 55, 56, 13,
+    13, 13, 13, 57, 13, 13, 13, 13, 13, 13, 58, 21, 21, 21, 59, 21,
+    13, 13, 13, 13, 60, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    61, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21
+};
+static RE_UINT16 script_extensions_table_2[] = {
+      0,   0,   1,   1,   0,   2,   3,   3,   4,   4,   4,   4,   4,   4,   4,   4,
+      4,   4,   4,   4,   4,   5,   0,   6,   7,   7,   8,   9,  10,  11,  12,  13,
+     14,  14,  14,  14,  15,  14,  14,  14,  14,  16,  17,  18,  19,  20,  21,  22,
+     23,  24,  25,  26,  24,  24,  27,  24,  28,  29,  30,  24,  31,  32,  33,  34,
+     35,  36,  37,  38,  39,  40,  41,  42,  43,  43,  44,  45,  46,  47,  48,  49,
+     50,  51,  52,  53,  54,  55,  56,  57,  58,  59,  60,  61,  62,  63,  64,  65,
+     66,  67,  68,  69,  70,  71,  72,  73,  74,  75,  76,  77,  78,  79,  80,  81,
+     82,  83,  84,  39,  85,  86,  87,  39,  88,  88,  89,  90,  91,  92,  93,  39,
+     94,  94,  95,  94,  94,  96,  97,  98,  99,  99,  99,  99,  99,  99,  99,  99,
+    100, 100, 101, 100, 102, 103, 104, 100, 105, 100, 106, 107, 108, 109, 109, 110,
+    111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111,
+    111, 111, 111, 111, 112, 113, 113, 114, 115, 116, 117, 118, 119, 119, 120, 121,
+    122, 123, 123, 124, 123, 125, 111, 126, 127, 128, 129, 130, 131, 132, 133, 119,
+    134, 135, 136, 137, 138, 139, 140,  39, 141, 141, 142, 143, 144, 144, 145, 146,
+    147, 148, 149, 150, 151, 152, 153, 154,   4, 155, 156, 157,   4, 158, 159, 160,
+      4,   4,   4,   4,   4,   4,   4,   4, 161,  12, 162, 163,  12, 164, 165, 166,
+    167, 168,   0, 169, 170,   0, 171, 172,   0, 173, 174,   4, 175,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0, 176, 177,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    178, 178, 178, 178, 178, 178, 178, 178,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 179, 180,   0,   0,   0,
+    181, 182, 183,   4, 184, 184, 184, 185,  96, 186, 187, 188, 189, 190, 190,  14,
+      0,   0, 191,  39, 192, 193, 193, 194, 193, 193, 193, 193, 193, 193, 195, 196,
+    197, 198, 199, 200, 201, 202, 203, 204, 205, 206,  99,  99, 207, 208, 209, 210,
+    211, 209, 212, 213, 209, 214, 215, 216, 203, 203, 217, 218,   0,   0,   0, 219,
+    193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193,
+    193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193,
+    193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193,   0,   0,
+    193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193,
+    193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193,
+    193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 220,
+    221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221,
+    221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221,
+    221, 221, 221, 221, 222, 221, 223, 224, 225, 225, 225, 225, 225, 225, 225, 225,
+    225, 226,  14, 227,  14, 228, 228, 229, 230, 231,   4,   4, 232,   4, 233, 234,
+    235, 236, 237, 238, 239, 239, 240, 241, 242, 243, 244, 245, 246, 246, 247, 248,
+    249, 250, 251,  94, 252, 252, 253, 254, 255, 256, 257, 258, 109, 109, 259, 260,
+     99,  99,  99,  99,  99,  99,  99,  99,  99,  99,  99,  99,  99,  99,  99,  99,
+     99,  99,  99,  99,  99,  99,  99,  99,  99,  99,  99,  99,  99,  99,  99,  99,
+     99,  99,  99,  99,  99,  99,  99,  99,  99,  99,  99,  99,  99,  99,  99,  99,
+     99,  99,  99,  99,  99,  99,  99,  99,  99,  99,  99,  99,  99, 261, 262, 263,
+     39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,
+     39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,
+     39,  39,  39,  39,  39,  39,  39,  39, 193, 193, 193, 193, 193, 193, 193, 193,
+    193, 193, 193, 264, 193, 193, 265,  39, 266, 267, 268,  24,  24,  24, 269,  24,
+     24,  24,  24,  24,  24,  24,  24,  24,  24, 270, 271,  24, 272,  24, 273, 274,
+    275, 276, 277, 278,  24,  24,  24, 279, 280,   1,   1, 281, 282, 211, 283, 284,
+    285, 286, 287,  39, 288, 288, 288, 289, 290, 291,  12,  12, 292, 293, 294, 295,
+     39,  39,  39,  39, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306,  39,
+    307, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317,  39,  39,  39,  39,
+    318, 318, 318, 318, 318, 318, 318, 318, 318, 319, 320, 321,  39,  39,  39,  39,
+    322, 323, 324, 325, 326, 327,  39, 328, 329, 330,  39,  39, 331, 332, 333, 334,
+    335, 336, 337, 338, 339,  39, 340, 341, 342, 343, 344, 345, 346, 347,  39,  39,
+    348, 348, 349,  39, 350, 351, 350, 352, 353, 354,  39,  39,  39,  39,  39,  39,
+     39,  39,  39, 355, 356, 357,  39,  39, 358, 359, 360,  39,  39, 361, 362, 363,
+    364, 364, 365, 366, 367, 367, 368, 369, 370, 371, 372, 373, 374, 374, 374, 375,
+    376, 377,  39,  39, 378, 379, 380, 381, 382, 383, 384, 385,  39,  39,  39,  39,
+    386, 386, 387, 388, 389, 389, 390,  39,  39,  39,  39,  39, 391, 392, 393,  39,
+    394, 394, 395, 396, 397, 398, 399,  39, 400, 401,  39,  39,  39,  39,  39,  39,
+    402, 403,  39,  39,  39, 404, 404, 405, 406, 407, 408,  39,  39, 409, 410, 411,
+    412, 412, 413, 414, 414, 415, 416, 417,  39,  39,  39,  39,  39,  39,  39,  39,
+    418, 419, 420, 421, 422, 423,  39,  39, 424, 425, 426, 427, 428, 429,  39,  39,
+     39,  39,  39,  39,  39,  39,  39, 430,  39,  39,  39,  39,  39, 431, 432, 433,
+    434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434,
+    434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 435,  39,  39,  39,
+    434, 434, 434, 436, 434, 434, 434, 434, 434, 434, 437,  39,  39,  39,  39,  39,
+     39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,
+    438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438,
+    438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438,
+    438, 439,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,
+     39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,
+    440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440,
+    440, 440, 441,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,
+    228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228,
+    228, 442, 443, 444,  39,  39, 445, 446, 447, 447, 448, 449, 450,  39,  39,  39,
+     39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,
+     39,  39, 451, 451, 452,  39,  39,  39, 453, 453, 454, 453, 455,  39,  39, 456,
+    457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457,
+    457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457,
+    457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457,
+    457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 458,
+    457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457,
+    457, 457, 457, 457, 457, 457, 457, 457, 459, 459, 459, 459, 459, 459, 459, 459,
+    459, 459, 459, 459, 459, 459, 460,  39, 461,  39,  39,  39,  39,  39,  39,  39,
+     39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,
+    462, 200, 200, 200, 200, 200, 200, 200, 463,  39, 464, 465, 466, 466, 466, 466,
+    466, 466, 466, 466, 466, 466, 466, 467,  39,  39,  39,  39,  39,  39,  39,  39,
+    468, 468, 468, 469, 470, 471,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,
+     39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,
+      0,   0,   0,   0,   0,   0,   0, 472,   0, 473,   0, 474, 475, 476,   0, 477,
+     12,  12, 478,  39,  39,  39,  39, 479,   0,   0, 480, 481,  39,  39,  39,  39,
+      0,   0, 482,   0, 483, 484, 485,   0, 486, 487, 488,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0, 489,   0,   0,   0,   0,   0,   0,   0,   0, 490,   0,
+    491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491,
+    491, 491, 491, 491, 492, 493,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,
+    494, 495,  39,  39,  39,  39,  39,  39, 496, 497, 498,  39,  39,  39,  39,  39,
+     39,  39,  39,  39,  39,  39, 499, 500,  39,  39,  39,  39,  39,  39,  39,  39,
+    501, 501, 501, 501, 501, 501, 502,  39, 503, 503, 504,  39,  39,  39,  39,  39,
+     39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,
+     39,  39,  39, 505,   0, 506,  39,  39, 280, 507,  39,  39,  39,  39,  39,  39,
+    508, 509, 510, 511, 512, 513,  39, 514,  39,  39,  39,  39,  39,  39,  39,  39,
+      0, 515,   0,   0, 479, 516, 517, 472,   0,   0,   0,   0,   0, 518,  39, 519,
+    520, 521, 522, 523,  39,  39,  39,  39,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0, 524, 525,   0,   0,   0, 479,   0,   0, 526, 527,
+    515,   0, 528,   0, 529, 530,  39,  39,   0,   0,   0, 531,   0,   0, 532,   0,
+      0,   0, 479, 533, 534, 535, 536,  39,   0,   0,   0,   0, 537,   0, 177, 538,
+    193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193,
+    193, 193, 193, 193, 193, 193, 539,  39, 193, 193, 193, 193, 193, 193, 193, 193,
+    193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193,
+    193, 193, 193, 193, 193, 193, 193, 193, 193, 540, 193, 193, 193, 193, 193, 193,
+    539, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193,
+    193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193,
+    193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193,
+    193, 193, 193, 193, 193, 541, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193,
+    193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193,
+    193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 542,
+    193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193,
+    539,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,
+    193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193,
+    193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 543,  39,  39,  39,  39,  39,
+    544,   0,   0,   0,  39,  39,  39,  39,   7,   7,   7,   7,   7,   7,   7, 545,
+     39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39
+};
+static RE_UINT8 script_extensions_table_3[] = {
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
+      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   2,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   2,   1,   1,   1,   1,   1,
+      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
+      2,   2,   2,   2,   2,   2,   2,   1,   2,   2,   2,   2,   2,   2,   2,   2,
+      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
+      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
+      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
+      2,   2,   2,   2,   2,   2,   2,   2,   2,   1,   1,   1,   1,   1,   1,   1,
+      2,   2,   2,   2,   2,   1,   1,   1,   1,   1,   3,   3,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
+      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
+      4,   4, 158,   4,   4, 158,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
+      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
+      4,   4,   4, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+      5,   5,   5,   5,   1,   5,   5,   5,   0,   0,   5,   5,   5,   5,   1,   5,
+      0,   0,   0,   0,   5,   1,   5,   1,   5,   5,   5,   0,   5,   0,   5,   5,
+      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
+      5,   5,   0,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
+      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
+      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
+      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
+      5,   5,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,
+      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
+      7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
+      7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
+      7,   7,   7, 160, 161, 162, 162, 161,   7,   7,   7,   7,   7,   7,   7,   7,
+      7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
+      7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
+      0,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,
+      8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,
+      8,   8,   8,   8,   8,   8,   8,   0,   0,   8,   8,   8,   8,   8,   8,   8,
+      8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,
+      8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,
+      8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   0,   0,   8,   8,   8,
+      0,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,
+      9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,
+      9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,
+      9,   9,   9,   9,   9,   9,   9,   9,   0,   0,   0,   0,   0,   0,   0,   0,
+      9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,
+      9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   0,   0,   0,   0,   9,
+      9,   9,   9,   9,   9,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     10,  10,  10,  10,  10,   1,  10,  10,  10,  10,  10,  10, 163,  10,  10,  10,
+     10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10, 163, 164,   0,  10, 163,
+     10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,
+     10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,
+    165,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10, 166, 166, 166, 166, 166,
+    166, 166, 166, 166, 166, 166,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,
+    167, 167, 167, 167, 167, 167, 167, 167, 167, 167,  10,  10,  10,  10,  10,  10,
+    166,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,
+     10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,
+     10,  10,  10,  10, 168,  10,  10,  10,  10,  10,  10,  10,  10,   1,  10,  10,
+     11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,   0,  11,
+     11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,
+     11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,
+     11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,
+     11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,   0,   0,  11,  11,  11,
+     10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,
+     12,  12,  12,  12,  12,  12,  12,  12,  12,  12,  12,  12,  12,  12,  12,  12,
+     12,  12,  12,  12,  12,  12,  12,  12,  12,  12,  12,  12,  12,  12,  12,  12,
+     12,  12,  12,  12,  12,  12,  12,  12,  12,  12,  12,  12,  12,  12,  12,  12,
+     12,  12,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     13,  13,  13,  13,  13,  13,  13,  13,  13,  13,  13,  13,  13,  13,  13,  13,
+     13,  13,  13,  13,  13,  13,  13,  13,  13,  13,  13,  13,  13,  13,  13,  13,
+     13,  13,  13,  13,  13,  13,  13,  13,  13,  13,  13,  13,  13,  13,  13,  13,
+     13,  13,  13,  13,  13,  13,  13,  13,  13,  13,  13,   0,   0,  13,  13,  13,
+     14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,
+     14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,
+     14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,   0,   0,
+     14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,   0,
+     15,  15,  15,  15,  15,  15,  15,  15,  15,  15,  15,  15,  15,  15,  15,  15,
+     15,  15,  15,  15,  15,  15,  15,  15,  15,  15,  15,  15,   0,   0,  15,   0,
+     11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,
+     10,  10,  10,  10,  10,   0,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,
+     10,  10,  10,  10,  10,  10,  10,  10,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,
+     10,  10,   1,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,
+     10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,
+     16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,
+     16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,
+     16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,
+     16, 169, 170,   4,   4,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,
+     16,  16,  16,  16, 171, 172, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173,
+     16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,
+     17,  17,  17,  17,   0,  17,  17,  17,  17,  17,  17,  17,  17,   0,   0,  17,
+     17,   0,   0,  17,  17,  17,  17,  17,  17,  17,  17,  17,  17,  17,  17,  17,
+     17,  17,  17,  17,  17,  17,  17,  17,  17,   0,  17,  17,  17,  17,  17,  17,
+     17,   0,  17,   0,   0,   0,  17,  17,  17,  17,   0,   0,  17,  17,  17,  17,
+     17,  17,  17,  17,  17,   0,   0,  17,  17,   0,   0,  17,  17,  17,  17,   0,
+      0,   0,   0,   0,   0,   0,   0,  17,   0,   0,   0,   0,  17,  17,   0,  17,
+     17,  17,  17,  17,   0,   0, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174,
+     17,  17,  17,  17,  17,  17,  17,  17,  17,  17,  17,  17,  17,  17,  17,   0,
+      0,  18,  18,  18,   0,  18,  18,  18,  18,  18,  18,   0,   0,   0,   0,  18,
+     18,   0,   0,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,
+     18,  18,  18,  18,  18,  18,  18,  18,  18,   0,  18,  18,  18,  18,  18,  18,
+     18,   0,  18,  18,   0,  18,  18,   0,  18,  18,   0,   0,  18,   0,  18,  18,
+     18,  18,  18,   0,   0,   0,   0,  18,  18,   0,   0,  18,  18,  18,   0,   0,
+      0,  18,   0,   0,   0,   0,   0,   0,   0,  18,  18,  18,  18,   0,  18,   0,
+      0,   0,   0,   0,   0,   0, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175,
+     18,  18,  18,  18,  18,  18,  18,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,  19,  19,  19,   0,  19,  19,  19,  19,  19,  19,  19,  19,  19,   0,  19,
+     19,  19,   0,  19,  19,  19,  19,  19,  19,  19,  19,  19,  19,  19,  19,  19,
+     19,  19,  19,  19,  19,  19,  19,  19,  19,   0,  19,  19,  19,  19,  19,  19,
+     19,   0,  19,  19,   0,  19,  19,  19,  19,  19,   0,   0,  19,  19,  19,  19,
+     19,  19,  19,  19,  19,  19,   0,  19,  19,  19,   0,  19,  19,  19,   0,   0,
+     19,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     19,  19,  19,  19,   0,   0, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176,
+     19,  19,   0,   0,   0,   0,   0,   0,   0,  19,  19,  19,  19,  19,  19,  19,
+      0,  20,  20,  20,   0,  20,  20,  20,  20,  20,  20,  20,  20,   0,   0,  20,
+     20,   0,   0,  20,  20,  20,  20,  20,  20,  20,  20,  20,  20,  20,  20,  20,
+     20,  20,  20,  20,  20,  20,  20,  20,  20,   0,  20,  20,  20,  20,  20,  20,
+     20,   0,  20,  20,   0,  20,  20,  20,  20,  20,   0,   0,  20,  20,  20,  20,
+     20,  20,  20,  20,  20,   0,   0,  20,  20,   0,   0,  20,  20,  20,   0,   0,
+      0,   0,   0,   0,   0,  20,  20,  20,   0,   0,   0,   0,  20,  20,   0,  20,
+     20,  20,  20,  20,   0,   0,  20,  20,  20,  20,  20,  20,  20,  20,  20,  20,
+     20,  20,  20,  20,  20,  20,  20,  20,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,  21,  21,   0,  21,  21,  21,  21,  21,  21,   0,   0,   0,  21,  21,
+     21,   0,  21,  21,  21,  21,   0,   0,   0,  21,  21,   0,  21,   0,  21,  21,
+      0,   0,   0,  21,  21,   0,   0,   0,  21,  21,  21,   0,   0,   0,  21,  21,
+     21,  21,  21,  21,  21,  21,  21,  21,  21,  21,   0,   0,   0,   0,  21,  21,
+     21,  21,  21,   0,   0,   0,  21,  21,  21,   0,  21,  21,  21,  21,   0,   0,
+     21,   0,   0,   0,   0,   0,   0,  21,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177,
+    177, 177, 177, 177,  21,  21,  21,  21,  21,  21,  21,   0,   0,   0,   0,   0,
+     22,  22,  22,  22,  22,  22,  22,  22,  22,  22,  22,  22,  22,   0,  22,  22,
+     22,   0,  22,  22,  22,  22,  22,  22,  22,  22,  22,  22,  22,  22,  22,  22,
+     22,  22,  22,  22,  22,  22,  22,  22,  22,   0,  22,  22,  22,  22,  22,  22,
+     22,  22,  22,  22,  22,  22,  22,  22,  22,  22,   0,   0,   0,  22,  22,  22,
+     22,  22,  22,  22,  22,   0,  22,  22,  22,   0,  22,  22,  22,  22,   0,   0,
+      0,   0,   0,   0,   0,  22,  22,   0,  22,  22,  22,   0,   0,   0,   0,   0,
+     22,  22,  22,  22,   0,   0,  22,  22,  22,  22,  22,  22,  22,  22,  22,  22,
+      0,   0,   0,   0,   0,   0,   0,  22,  22,  22,  22,  22,  22,  22,  22,  22,
+     23,  23,  23,  23,  23,  23,  23,  23,  23,  23,  23,  23,  23,   0,  23,  23,
+     23,   0,  23,  23,  23,  23,  23,  23,  23,  23,  23,  23,  23,  23,  23,  23,
+     23,  23,  23,  23,  23,  23,  23,  23,  23,   0,  23,  23,  23,  23,  23,  23,
+     23,  23,  23,  23,   0,  23,  23,  23,  23,  23,   0,   0,  23,  23,  23,  23,
+     23,  23,  23,  23,  23,   0,  23,  23,  23,   0,  23,  23,  23,  23,   0,   0,
+      0,   0,   0,   0,   0,  23,  23,   0,   0,   0,   0,   0,   0,   0,  23,   0,
+     23,  23,  23,  23,   0,   0, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+      0,  23,  23,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     24,  24,  24,  24,  24,  24,  24,  24,  24,  24,  24,  24,  24,   0,  24,  24,
+     24,   0,  24,  24,  24,  24,  24,  24,  24,  24,  24,  24,  24,  24,  24,  24,
+     24,  24,  24,  24,  24,  24,  24,  24,  24,  24,  24,  24,  24,  24,  24,  24,
+     24,  24,  24,  24,  24,  24,  24,  24,  24,  24,  24,  24,  24,  24,  24,  24,
+     24,  24,  24,  24,  24,   0,  24,  24,  24,   0,  24,  24,  24,  24,  24,  24,
+      0,   0,   0,   0,  24,  24,  24,  24,  24,  24,  24,  24,  24,  24,  24,  24,
+     24,  24,  24,  24,   0,   0,  24,  24,  24,  24,  24,  24,  24,  24,  24,  24,
+     24,  24,  24,  24,  24,  24,  24,  24,  24,  24,  24,  24,  24,  24,  24,  24,
+      0,  25,  25,  25,   0,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,
+     25,  25,  25,  25,  25,  25,  25,   0,   0,   0,  25,  25,  25,  25,  25,  25,
+     25,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,
+     25,  25,   0,  25,  25,  25,  25,  25,  25,  25,  25,  25,   0,  25,   0,   0,
+     25,  25,  25,  25,  25,  25,  25,   0,   0,   0,  25,   0,   0,   0,   0,  25,
+     25,  25,  25,  25,  25,   0,  25,   0,  25,  25,  25,  25,  25,  25,  25,  25,
+      0,   0,   0,   0,   0,   0,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,
+      0,   0,  25,  25,  25,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
+     26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
+     26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
+     26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,   0,   0,   0,   0,   1,
+     26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
+     26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,   0,   0,   0,   0,
+      0,  27,  27,   0,  27,   0,  27,  27,  27,  27,  27,   0,  27,  27,  27,  27,
+     27,  27,  27,  27,  27,  27,  27,  27,  27,  27,  27,  27,  27,  27,  27,  27,
+     27,  27,  27,  27,   0,  27,   0,  27,  27,  27,  27,  27,  27,  27,  27,  27,
+     27,  27,  27,  27,  27,  27,  27,  27,  27,  27,  27,  27,  27,  27,   0,   0,
+     27,  27,  27,  27,  27,   0,  27,   0,  27,  27,  27,  27,  27,  27,   0,   0,
+     27,  27,  27,  27,  27,  27,  27,  27,  27,  27,   0,   0,  27,  27,  27,  27,
+     28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,
+     28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,
+     28,  28,  28,  28,  28,  28,  28,  28,   0,  28,  28,  28,  28,  28,  28,  28,
+     28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,
+     28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,   0,   0,   0,
+      0,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,
+     28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,
+     28,  28,  28,  28,  28,  28,  28,  28,   0,  28,  28,  28,  28,  28,  28,  28,
+     28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,
+     28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,   0,  28,  28,
+     28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,   0,  28,  28,
+     28,  28,  28,  28,  28,   1,   1,   1,   1,  28,  28,   0,   0,   0,   0,   0,
+     29,  29,  29,  29,  29,  29,  29,  29,  29,  29,  29,  29,  29,  29,  29,  29,
+     29,  29,  29,  29,  29,  29,  29,  29,  29,  29,  29,  29,  29,  29,  29,  29,
+    179, 179, 179, 179, 179, 179, 179, 179, 179, 179,  29,  29,  29,  29,  29,  29,
+     29,  29,  29,  29,  29,  29,  29,  29,  29,  29,  29,  29,  29,  29,  29,  29,
+     30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,
+     30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,
+     30,  30,  30,  30,  30,  30,   0,  30,   0,   0,   0,   0,   0,  30,   0,   0,
+     30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,
+     30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,
+     30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30, 180,  30,  30,  30,  30,
+     31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,
+     31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,
+     32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,
+     32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,
+     32,  32,  32,  32,  32,  32,  32,  32,  32,   0,  32,  32,  32,  32,   0,   0,
+     32,  32,  32,  32,  32,  32,  32,   0,  32,   0,  32,  32,  32,  32,   0,   0,
+     32,  32,  32,  32,  32,  32,  32,  32,  32,   0,  32,  32,  32,  32,   0,   0,
+     32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,
+     32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,
+     32,   0,  32,  32,  32,  32,   0,   0,  32,  32,  32,  32,  32,  32,  32,   0,
+     32,   0,  32,  32,  32,  32,   0,   0,  32,  32,  32,  32,  32,  32,  32,  32,
+     32,  32,  32,  32,  32,  32,  32,   0,  32,  32,  32,  32,  32,  32,  32,  32,
+     32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,
+     32,   0,  32,  32,  32,  32,   0,   0,  32,  32,  32,  32,  32,  32,  32,  32,
+     32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,
+     32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,   0,   0,  32,  32,  32,
+     32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,
+     32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,   0,   0,   0,
+     32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,
+     32,  32,  32,  32,  32,  32,  32,  32,  32,  32,   0,   0,   0,   0,   0,   0,
+     33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,
+     33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,
+     33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,
+     33,  33,  33,  33,  33,  33,   0,   0,  33,  33,  33,  33,  33,  33,   0,   0,
+     34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,
+     34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,
+     35,  35,  35,  35,  35,  35,  35,  35,  35,  35,  35,  35,  35,  35,  35,  35,
+     35,  35,  35,  35,  35,  35,  35,  35,  35,  35,  35,  35,  35,   0,   0,   0,
+     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,
+     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,
+     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,   1,   1,   1,  36,  36,
+     36,  36,  36,  36,  36,  36,  36,  36,  36,   0,   0,   0,   0,   0,   0,   0,
+     37,  37,  37,  37,  37,  37,  37,  37,  37,  37,  37,  37,  37,   0,  37,  37,
+     37,  37,  37,  37,  37,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,
+     38,  38,  38,  38,  38, 181, 181,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,
+     39,  39,  39,  39,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,   0,  40,  40,
+     40,   0,  40,  40,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     41,  41,  41,  41,  41,  41,  41,  41,  41,  41,  41,  41,  41,  41,  41,  41,
+     41,  41,  41,  41,  41,  41,  41,  41,  41,  41,  41,  41,  41,  41,  41,  41,
+     41,  41,  41,  41,  41,  41,  41,  41,  41,  41,  41,  41,  41,  41,  41,  41,
+     41,  41,  41,  41,  41,  41,  41,  41,  41,  41,  41,  41,  41,  41,   0,   0,
+     41,  41,  41,  41,  41,  41,  41,  41,  41,  41,   0,   0,   0,   0,   0,   0,
+     41,  41,  41,  41,  41,  41,  41,  41,  41,  41,   0,   0,   0,   0,   0,   0,
+     42,  42, 182, 182,  42, 182,  42,  42,  42,  42,  42,  42,  42,  42,  42,   0,
+     42,  42,  42,  42,  42,  42,  42,  42,  42,  42,   0,   0,   0,   0,   0,   0,
+     42,  42,  42,  42,  42,  42,  42,  42,  42,  42,  42,  42,  42,  42,  42,  42,
+     42,  42,  42,  42,  42,  42,  42,  42,  42,  42,  42,  42,  42,  42,  42,  42,
+     42,  42,  42,  42,  42,  42,  42,  42,  42,  42,  42,  42,  42,  42,  42,  42,
+     42,  42,  42,  42,  42,  42,  42,  42,  42,   0,   0,   0,   0,   0,   0,   0,
+     42,  42,  42,  42,  42,  42,  42,  42,  42,  42,  42,   0,   0,   0,   0,   0,
+     34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,
+     34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,
+     34,  34,  34,  34,  34,  34,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     43,  43,  43,  43,  43,  43,  43,  43,  43,  43,  43,  43,  43,  43,  43,  43,
+     43,  43,  43,  43,  43,  43,  43,  43,  43,  43,  43,  43,  43,  43,  43,   0,
+     43,  43,  43,  43,  43,  43,  43,  43,  43,  43,  43,  43,   0,   0,   0,   0,
+     43,  43,  43,  43,  43,  43,  43,  43,  43,  43,  43,  43,   0,   0,   0,   0,
+     43,   0,   0,   0,  43,  43,  43,  43,  43,  43,  43,  43,  43,  43,  43,  43,
+     44,  44,  44,  44,  44,  44,  44,  44,  44,  44,  44,  44,  44,  44,  44,  44,
+     44,  44,  44,  44,  44,  44,  44,  44,  44,  44,  44,  44,  44,  44,   0,   0,
+     44,  44,  44,  44,  44,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,
+     45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,
+     45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,   0,   0,   0,   0,
+     45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,
+     45,  45,  45,  45,  45,  45,  45,  45,  45,  45,   0,   0,   0,   0,   0,   0,
+     45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,   0,   0,   0,  45,  45,
+     46,  46,  46,  46,  46,  46,  46,  46,  46,  46,  46,  46,  46,  46,  46,  46,
+     46,  46,  46,  46,  46,  46,  46,  46,  46,  46,  46,  46,   0,   0,  46,  46,
+     47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,
+     47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,
+     47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,
+     47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,   0,
+     47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,
+     47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,   0,   0,  47,
+     47,  47,  47,  47,  47,  47,  47,  47,  47,  47,   0,   0,   0,   0,   0,   0,
+     47,  47,  47,  47,  47,  47,  47,  47,  47,  47,   0,   0,   0,   0,   0,   0,
+     47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,   0,   0,
+      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
+      4,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,
+     48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,
+     48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,   0,   0,   0,   0,
+     48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,
+     48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,
+     48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,   0,   0,   0,
+     49,  49,  49,  49,  49,  49,  49,  49,  49,  49,  49,  49,  49,  49,  49,  49,
+     49,  49,  49,  49,  49,  49,  49,  49,  49,  49,  49,  49,  49,  49,  49,  49,
+     50,  50,  50,  50,  50,  50,  50,  50,  50,  50,  50,  50,  50,  50,  50,  50,
+     50,  50,  50,  50,  50,  50,  50,  50,  50,  50,  50,  50,  50,  50,  50,  50,
+     50,  50,  50,  50,  50,  50,  50,  50,  50,  50,  50,  50,  50,  50,  50,  50,
+     50,  50,  50,  50,   0,   0,   0,   0,   0,   0,   0,   0,  50,  50,  50,  50,
+     51,  51,  51,  51,  51,  51,  51,  51,  51,  51,  51,  51,  51,  51,  51,  51,
+     51,  51,  51,  51,  51,  51,  51,  51,  51,  51,  51,  51,  51,  51,  51,  51,
+     51,  51,  51,  51,  51,  51,  51,  51,  51,  51,  51,  51,  51,  51,  51,  51,
+     51,  51,  51,  51,  51,  51,  51,  51,   0,   0,   0,  51,  51,  51,  51,  51,
+     51,  51,  51,  51,  51,  51,  51,  51,  51,  51,   0,   0,   0,  51,  51,  51,
+     52,  52,  52,  52,  52,  52,  52,  52,  52,  52,  52,  52,  52,  52,  52,  52,
+     52,  52,  52,  52,  52,  52,  52,  52,  52,  52,  52,  52,  52,  52,  52,  52,
+     52,  52,  52,  52,  52,  52,  52,  52,  52,  52,  52,  52,  52,  52,  52,  52,
+      7,   7,   7,   7,   7,   7,   7,   7,   7,   0,   0,   0,   0,   0,   0,   0,
+     30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,
+     30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,
+     30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,   0,   0,  30,  30,  30,
+     49,  49,  49,  49,  49,  49,  49,  49,   0,   0,   0,   0,   0,   0,   0,   0,
+    183, 184, 183, 185, 184, 186, 186, 187, 186, 187, 188, 184, 187, 187, 184, 184,
+    187, 186, 184, 184, 184, 184, 184, 184, 184, 189, 186, 184, 184, 186, 184, 184,
+    184, 184, 190, 185, 191, 186, 186, 192, 185, 185, 193,   0,   0,   0,   0,   0,
+      2,   2,   2,   2,   2,   2,   5,   5,   5,   5,   5,   7,   2,   2,   2,   2,
+      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
+      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
+      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   5,   5,   5,
+      5,   5,   2,   2,   2,   2,   5,   5,   5,   5,   5,   2,   2,   2,   2,   2,
+      2,   2,   2,   2,   2,   2,   2,   2,   7,   2,   2,   2,   2,   2,   2,   2,
+      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
+      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   5,
+    158, 158,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
+      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
+      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
+      4,   4,   4,   4,   4,   4,   4,   4, 194,   4,   0,   4,   4,   4,   4,   4,
+      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
+      5,   5,   5,   5,   5,   5,   0,   0,   5,   5,   5,   5,   5,   5,   0,   0,
+      5,   5,   5,   5,   5,   5,   0,   0,   5,   5,   5,   5,   5,   5,   0,   0,
+      5,   5,   5,   5,   5,   5,   5,   5,   0,   5,   0,   5,   0,   5,   0,   5,
+      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
+      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   0,   0,
+      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
+      5,   5,   5,   5,   5,   0,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
+      5,   5,   5,   5,   5,   0,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
+      5,   5,   5,   5,   0,   0,   5,   5,   5,   5,   5,   5,   0,   5,   5,   5,
+      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
+      0,   0,   5,   5,   5,   0,   5,   5,   5,   5,   5,   5,   5,   5,   5,   0,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   4,   4,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1, 195,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   0,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   2,   0,   0,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   2,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   0,
+      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   0,   0,   0,
       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
+      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
+    196,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      1,   1,   1,   1,   1,   1,   5,   1,   1,   1,   2,   2,   1,   1,   1,   1,
+      1,   1,   2,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   2,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      2,   2,   2,   2,   2,   2,   2,   2,   2,   1,   1,   1,   0,   0,   0,   0,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,
       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,  52,  53,  54,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,  55,  56,  57,  58,  59,   0,   0,
-     60,  60,  60,  60,  61,  60,  60,  62,  63,  60,  64,  65,  60,  66,  67,  68,
-     69,  70,  71,  72,  73,  74,   0,   0,  75,  76,  77,  78,  79,  80,  81,   0,
-     82,  83,  84,  85,  86,  87,   0,  88,   0,  89,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,  90,  78,  91,  92,  93,   0,   0,   0,   0,   0,   0,   0,   0,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   0,   0,   0,   0,   0,
       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     53,  53,  53,  53,  53,  53,  53,  53,  53,  53,  53,  53,  53,  53,  53,  53,
+     53,  53,  53,  53,  53,  53,  53,  53,  53,  53,  53,  53,  53,  53,  53,  53,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   0,   0,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   0,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+     54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,
+     54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,
+     54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,   0,
+     54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,
+     54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,
+     54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  54,   0,
+      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,
+      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,
+      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,
+      6,   6,   6,   6,   0,   0,   0,   0,   0,   6,   6,   6,   6,   6,   6,   6,
+     30,  30,  30,  30,  30,  30,   0,  30,   0,   0,   0,   0,   0,  30,   0,   0,
+     55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,
+     55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,
+     55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,
+     55,  55,  55,  55,  55,  55,  55,  55,   0,   0,   0,   0,   0,   0,   0,  55,
+     55,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  55,
+     32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,
+     32,  32,  32,  32,  32,  32,  32,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     32,  32,  32,  32,  32,  32,  32,   0,  32,  32,  32,  32,  32,  32,  32,   0,
+     32,  32,  32,  32,  32,  32,  32,   0,  32,  32,  32,  32,  32,  32,  32,   0,
+      1,   1,   1, 161,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,
+     56,  56,  56,  56,  56,  56,  56,  56,  56,  56,   0,  56,  56,  56,  56,  56,
+     56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,
+     56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,
+     56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,
+     56,  56,  56,  56,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,
+     56,  56,  56,  56,  56,  56,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   0,   0,   0,   0,
+      1, 197, 197, 198,   1,  56, 199,  56, 197, 197, 197, 197, 197, 197, 197, 197,
+    197, 197,   1, 198, 197, 197, 197, 197, 197, 197, 197, 197, 198, 198, 198, 198,
+      1,  56,  56,  56,  56,  56,  56,  56,  56,  56, 200, 200, 200, 200,  31,  31,
+    198, 201, 201, 201, 201, 201,   1, 198,  56,  56,  56,  56, 202, 202, 199, 199,
+      0,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,
+     57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,
+     57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,
+     57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,
+     57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,
+     57,  57,  57,  57,  57,  57,  57,   0,   0, 201, 201, 201, 201,  57,  57,  57,
+    201,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,
+     58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,
+     58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,
+     58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,
+     58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,
+     58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58, 197, 201,  58,  58,  58,
+      0,   0,   0,   0,   0,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,
+      3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,
+      3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,
+      0,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,
+     31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,   0,
+    199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199,
+      3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,
+      3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,
+    199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199,
+    199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199,
+    199, 199, 199, 199,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,
+     31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,
+     31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,   0,
+    199, 199, 199, 199, 199, 199, 199, 199,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+     31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,
+     31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,   1,
+    199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199,
+    199,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+    199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199,   1,   1,   1,   1,
+     58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,
+     58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,
+     58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58, 199,
+     58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,
+     58,  58,  58,  58,  58,  58,  58,  58, 199, 199, 199, 199, 199, 199, 199, 199,
+    199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199,
+    199,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1, 199, 199, 199, 199, 199,
+    199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199,
+    199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199,   1,
+     56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,
+     56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,   0,   0,   0,
+     59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,
+     59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,
+     59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,   0,   0,   0,
+     59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,
+     59,  59,  59,  59,  59,  59,  59,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,
+     60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,
+     60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,
+     61,  61,  61,  61,  61,  61,  61,  61,  61,  61,  61,  61,  61,  61,  61,  61,
+     61,  61,  61,  61,  61,  61,  61,  61,  61,  61,  61,  61,  61,  61,  61,  61,
+     61,  61,  61,  61,  61,  61,  61,  61,  61,  61,  61,  61,   0,   0,   0,   0,
       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     94,   0,   0,  95,   0,   0,  96,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,  97,   0,   0,   0,   0,   0,   0,   0,  98,   0,   0,   0,   0,
-      0,   0,   0,   0,  99,   0,   0,  43,  78,  78,  78,  78,  78,  78, 100,   0,
-    101, 102, 103, 104, 105, 103, 104, 106,   0, 107,  78,  78, 108,   0,   0,   0,
-    109,  78, 110, 111,  92,  92, 112, 113, 114, 114, 115, 116, 114, 114, 114, 117,
+      7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7, 161,
+      7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
+     62,  62,  62,  62,  62,  62,  62,  62,  62,  62,  62,  62,  62,  62,  62,  62,
+     62,  62,  62,  62,  62,  62,  62,  62,  62,  62,  62,  62,  62,  62,  62,  62,
+     62,  62,  62,  62,  62,  62,  62,  62,  62,  62,  62,  62,  62,  62,  62,  62,
+     62,  62,  62,  62,  62,  62,  62,  62,   0,   0,   0,   0,   0,   0,   0,   0,
+    203, 203, 203, 203, 203, 203, 203, 203,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
+      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
+      2,   2,   2,   2,   2,   2,   2,   2,   1,   1,   1,   2,   2,   2,   2,   2,
+      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
+      0,   0,   2,   2,   2,   2,   2,   2,   2,   2,   2,   0,   0,   0,   0,   0,
       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
+     63,  63,  63,  63,  63,  63,  63,  63,  63,  63,  63,  63,  63,  63,  63,  63,
+     63,  63,  63,  63,  63,  63,  63,  63,  63,  63,  63,  63,  63,  63,  63,  63,
+     63,  63,  63,  63,  63,  63,  63,  63,  63,  63,  63,  63,  63,   0,   0,   0,
+    204, 204, 204, 205, 205, 205, 206, 206, 206, 206,   0,   0,   0,   0,   0,   0,
+     64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,
+     64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,
+     64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,
+     64,  64,  64,  64,  64,  64,  64,  64,   0,   0,   0,   0,   0,   0,   0,   0,
+     65,  65,  65,  65,  65,  65,  65,  65,  65,  65,  65,  65,  65,  65,  65,  65,
+     65,  65,  65,  65,  65,  65,  65,  65,  65,  65,  65,  65,  65,  65,  65,  65,
+     65,  65,  65,  65,  65,  65,   0,   0,   0,   0,   0,   0,   0,   0,  65,  65,
+     65,  65,  65,  65,  65,  65,  65,  65,  65,  65,   0,   0,   0,   0,   0,   0,
+     16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,
+     16, 186,  16, 207,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,
+     66,  66,  66,  66,  66,  66,  66,  66,  66,  66,  66,  66,  66,  66,  66,  66,
+     66,  66,  66,  66,  66,  66,  66,  66,  66,  66,  66,  66,  66,  66,  66,  66,
+     66,  66,  66,  66,  66,  66,  66,  66,  66,  66,  66,  66,  66,  66, 208,  66,
+     67,  67,  67,  67,  67,  67,  67,  67,  67,  67,  67,  67,  67,  67,  67,  67,
+     67,  67,  67,  67,  67,  67,  67,  67,  67,  67,  67,  67,  67,  67,  67,  67,
+     67,  67,  67,  67,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  67,
+     31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,
+     31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,   0,   0,   0,
+     68,  68,  68,  68,  68,  68,  68,  68,  68,  68,  68,  68,  68,  68,  68,  68,
+     68,  68,  68,  68,  68,  68,  68,  68,  68,  68,  68,  68,  68,  68,  68,  68,
+     68,  68,  68,  68,  68,  68,  68,  68,  68,  68,  68,  68,  68,  68,   0, 209,
+     68,  68,  68,  68,  68,  68,  68,  68,  68,  68,   0,   0,   0,   0,  68,  68,
+     29,  29,  29,  29,  29,  29,  29,  29,  29,  29,  29,  29,  29,  29,  29,  29,
+     29,  29,  29,  29,  29,  29,  29,  29,  29,  29,  29,  29,  29,  29,  29,   0,
+     69,  69,  69,  69,  69,  69,  69,  69,  69,  69,  69,  69,  69,  69,  69,  69,
+     69,  69,  69,  69,  69,  69,  69,  69,  69,  69,  69,  69,  69,  69,  69,  69,
+     69,  69,  69,  69,  69,  69,  69,  69,  69,  69,  69,  69,  69,  69,  69,  69,
+     69,  69,  69,  69,  69,  69,  69,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     69,  69,  69,  69,  69,  69,  69,  69,  69,  69,  69,  69,  69,  69,   0,   0,
+     69,  69,  69,  69,  69,  69,  69,  69,  69,  69,   0,   0,  69,  69,  69,  69,
+     70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  70,
+     70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  70,  70,
+     70,  70,  70,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  70,  70,  70,  70,  70,
+     71,  71,  71,  71,  71,  71,  71,  71,  71,  71,  71,  71,  71,  71,  71,  71,
+     71,  71,  71,  71,  71,  71,  71,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,  32,  32,  32,  32,  32,  32,   0,   0,  32,  32,  32,  32,  32,  32,   0,
+      0,  32,  32,  32,  32,  32,  32,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     32,  32,  32,  32,  32,  32,  32,   0,  32,  32,  32,  32,  32,  32,  32,   0,
+      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
+      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
+      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   1,   2,   2,   2,   2,
+      2,   2,   2,   2,   2,   5,   2,   2,   2,   2,   1,   1,   0,   0,   0,   0,
+     33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,
+     71,  71,  71,  71,  71,  71,  71,  71,  71,  71,  71,  71,  71,  71,  71,  71,
+     71,  71,  71,  71,  71,  71,  71,  71,  71,  71,  71,  71,  71,  71,  71,  71,
+     71,  71,  71,  71,  71,  71,  71,  71,  71,  71,  71,  71,  71,  71,   0,   0,
+     71,  71,  71,  71,  71,  71,  71,  71,  71,  71,   0,   0,   0,   0,   0,   0,
+     31,  31,  31,  31,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,
+     31,  31,  31,  31,  31,  31,  31,   0,   0,   0,   0,  31,  31,  31,  31,  31,
+     31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,
+     31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,
+     31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,   0,   0,   0,   0,
+     56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,   0,   0,
+     56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,
+     56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,
+     56,  56,  56,  56,  56,  56,  56,  56,  56,  56,   0,   0,   0,   0,   0,   0,
+      2,   2,   2,   2,   2,   2,   2,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   8,   8,   8,   8,   8,   0,   0,   0,   0,   0,   9,   9,   9,
+      9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,
+      9,   9,   9,   9,   9,   9,   9,   0,   9,   9,   9,   9,   9,   0,   9,   0,
+      9,   9,   0,   9,   9,   0,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,
+     10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,
+     10,  10,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,
+     10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,
+     10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,   1,   1,
       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,
+     10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,
+      0,   0,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,
+     10,  10,  10,  10,  10,  10,  10,  10,   0,   0,   0,   0,   0,   0,   0,   0,
       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     10,  10, 210,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10, 210,   0,   0,
+      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   0,   0,   0,   0,   0,   0,
+      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   7,   7,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1, 198, 198,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   0,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   0,   1,   1,   1,   1,   0,   0,   0,   0,
+     10,  10,  10,  10,  10,   0,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,
+     10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,
+     10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,   0,   0,   1,
+      0,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1, 197, 197, 197, 197, 197,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,
+    201,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,
+     58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,
+     58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58, 201, 201,
+      0,   0,  31,  31,  31,  31,  31,  31,   0,   0,  31,  31,  31,  31,  31,  31,
+      0,   0,  31,  31,  31,  31,  31,  31,   0,   0,  31,  31,  31,   0,   0,   0,
+      1,   1,   1,   1,   1,   1,   1,   0,   1,   1,   1,   1,   1,   1,   1,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   1,   1,   1,   1,   0,   0,
+     72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,   0,  72,  72,  72,
+     72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,
+     72,  72,  72,  72,  72,  72,  72,   0,  72,  72,  72,  72,  72,  72,  72,  72,
+     72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,   0,  72,  72,   0,  72,
+     72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,   0,   0,
+     72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,   0,   0,
+     72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,
+     72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,
+     72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,
+     72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,   0,   0,   0,   0,   0,
+    211, 211, 211,   0,   0,   0,   0, 212, 212, 212, 212, 212, 212, 212, 212, 212,
+    212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212,
+    212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212,
+    212, 212, 212, 212,   0,   0,   0, 211, 211, 211, 211, 211, 211, 211, 211, 211,
+      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   0,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   0,   0,   0,
+      5,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   4,   0,   0,
+     73,  73,  73,  73,  73,  73,  73,  73,  73,  73,  73,  73,  73,  73,  73,  73,
+     73,  73,  73,  73,  73,  73,  73,  73,  73,  73,  73,  73,  73,   0,   0,   0,
+     74,  74,  74,  74,  74,  74,  74,  74,  74,  74,  74,  74,  74,  74,  74,  74,
+     74,  74,  74,  74,  74,  74,  74,  74,  74,  74,  74,  74,  74,  74,  74,  74,
+     74,  74,  74,  74,  74,  74,  74,  74,  74,  74,  74,  74,  74,  74,  74,  74,
+     74,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213,
+    213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213,   0,   0,   0,   0,
+     75,  75,  75,  75,  75,  75,  75,  75,  75,  75,  75,  75,  75,  75,  75,  75,
+     75,  75,  75,  75,  75,  75,  75,  75,  75,  75,  75,  75,  75,  75,  75,  75,
+     75,  75,  75,  75,   0,   0,   0,   0,   0,   0,   0,   0,   0,  75,  75,  75,
+     76,  76,  76,  76,  76,  76,  76,  76,  76,  76,  76,  76,  76,  76,  76,  76,
+     76,  76,  76,  76,  76,  76,  76,  76,  76,  76,  76,   0,   0,   0,   0,   0,
+     77,  77,  77,  77,  77,  77,  77,  77,  77,  77,  77,  77,  77,  77,  77,  77,
+     77,  77,  77,  77,  77,  77,  77,  77,  77,  77,  77,  77,  77,  77,  77,  77,
+     77,  77,  77,  77,  77,  77,  77,  77,  77,  77,  77,   0,   0,   0,   0,   0,
+     78,  78,  78,  78,  78,  78,  78,  78,  78,  78,  78,  78,  78,  78,  78,  78,
+     78,  78,  78,  78,  78,  78,  78,  78,  78,  78,  78,  78,  78,  78,   0,  78,
+     79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,
+     79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,
+     79,  79,  79,  79,   0,   0,   0,   0,  79,  79,  79,  79,  79,  79,  79,  79,
+     79,  79,  79,  79,  79,  79,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     80,  80,  80,  80,  80,  80,  80,  80,  80,  80,  80,  80,  80,  80,  80,  80,
+     80,  80,  80,  80,  80,  80,  80,  80,  80,  80,  80,  80,  80,  80,  80,  80,
+     80,  80,  80,  80,  80,  80,  80,  80,  80,  80,  80,  80,  80,  80,  80,  80,
+     81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,
+     81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,
+     81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,
+     82,  82,  82,  82,  82,  82,  82,  82,  82,  82,  82,  82,  82,  82,  82,  82,
+     82,  82,  82,  82,  82,  82,  82,  82,  82,  82,  82,  82,  82,  82,   0,   0,
+     82,  82,  82,  82,  82,  82,  82,  82,  82,  82,   0,   0,   0,   0,   0,   0,
+     83,  83,  83,  83,  83,  83,  83,  83,  83,  83,  83,  83,  83,  83,  83,  83,
+     83,  83,  83,  83,  83,  83,  83,  83,  83,  83,  83,  83,  83,  83,  83,  83,
+     83,  83,  83,  83,   0,   0,   0,   0,  83,  83,  83,  83,  83,  83,  83,  83,
+     83,  83,  83,  83,  83,  83,  83,  83,  83,  83,  83,  83,  83,  83,  83,  83,
+     83,  83,  83,  83,  83,  83,  83,  83,  83,  83,  83,  83,   0,   0,   0,   0,
+     84,  84,  84,  84,  84,  84,  84,  84,  84,  84,  84,  84,  84,  84,  84,  84,
+     84,  84,  84,  84,  84,  84,  84,  84,  84,  84,  84,  84,  84,  84,  84,  84,
+     84,  84,  84,  84,  84,  84,  84,  84,   0,   0,   0,   0,   0,   0,   0,   0,
+     85,  85,  85,  85,  85,  85,  85,  85,  85,  85,  85,  85,  85,  85,  85,  85,
+     85,  85,  85,  85,  85,  85,  85,  85,  85,  85,  85,  85,  85,  85,  85,  85,
+     85,  85,  85,  85,  85,  85,  85,  85,  85,  85,  85,  85,  85,  85,  85,  85,
+     85,  85,  85,  85,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  85,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     86,  86,  86,  86,  86,  86,  86,  86,  86,  86,  86,  86,  86,  86,  86,  86,
+     86,  86,  86,  86,  86,  86,  86,  86,  86,  86,  86,  86,  86,  86,  86,  86,
+     86,  86,  86,  86,  86,  86,  86,  86,  86,  86,  86,  86,  86,  86,  86,  86,
+     86,  86,  86,  86,  86,  86,  86,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     86,  86,  86,  86,  86,  86,  86,  86,  86,  86,  86,  86,  86,  86,  86,  86,
+     86,  86,  86,  86,  86,  86,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     86,  86,  86,  86,  86,  86,  86,  86,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     87,  87,  87,  87,  87,  87,   0,   0,  87,   0,  87,  87,  87,  87,  87,  87,
+     87,  87,  87,  87,  87,  87,  87,  87,  87,  87,  87,  87,  87,  87,  87,  87,
+     87,  87,  87,  87,  87,  87,  87,  87,  87,  87,  87,  87,  87,  87,  87,  87,
+     87,  87,  87,  87,  87,  87,   0,  87,  87,   0,   0,   0,  87,   0,   0,  87,
+     88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,  88,
+     88,  88,  88,  88,  88,  88,   0,  88,  88,  88,  88,  88,  88,  88,  88,  88,
+     89,  89,  89,  89,  89,  89,  89,  89,  89,  89,  89,  89,  89,  89,  89,  89,
+     89,  89,  89,  89,  89,  89,  89,  89,  89,  89,  89,  89,  89,  89,  89,  89,
+     90,  90,  90,  90,  90,  90,  90,  90,  90,  90,  90,  90,  90,  90,  90,  90,
+     90,  90,  90,  90,  90,  90,  90,  90,  90,  90,  90,  90,  90,  90,  90,   0,
+      0,   0,   0,   0,   0,   0,   0,  90,  90,  90,  90,  90,  90,  90,  90,  90,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     91,  91,  91,  91,  91,  91,  91,  91,  91,  91,  91,  91,  91,  91,  91,  91,
+     91,  91,  91,   0,  91,  91,   0,   0,   0,   0,   0,  91,  91,  91,  91,  91,
+     92,  92,  92,  92,  92,  92,  92,  92,  92,  92,  92,  92,  92,  92,  92,  92,
+     92,  92,  92,  92,  92,  92,  92,  92,  92,  92,  92,  92,   0,   0,   0,  92,
+     93,  93,  93,  93,  93,  93,  93,  93,  93,  93,  93,  93,  93,  93,  93,  93,
+     93,  93,  93,  93,  93,  93,  93,  93,  93,  93,   0,   0,   0,   0,   0,  93,
+     94,  94,  94,  94,  94,  94,  94,  94,  94,  94,  94,  94,  94,  94,  94,  94,
+     94,  94,  94,  94,  94,  94,  94,  94,  94,  94,  94,  94,  94,  94,  94,  94,
+     95,  95,  95,  95,  95,  95,  95,  95,  95,  95,  95,  95,  95,  95,  95,  95,
+     95,  95,  95,  95,  95,  95,  95,  95,   0,   0,   0,   0,  95,  95,  95,  95,
+     95,  95,  95,  95,  95,  95,  95,  95,  95,  95,  95,  95,  95,  95,  95,  95,
+      0,   0,  95,  95,  95,  95,  95,  95,  95,  95,  95,  95,  95,  95,  95,  95,
+     95,  95,  95,  95,  95,  95,  95,  95,  95,  95,  95,  95,  95,  95,  95,  95,
+     95,  95,  95,  95,  95,  95,  95,  95,  95,  95,  95,  95,  95,  95,  95,  95,
+     96,  96,  96,  96,   0,  96,  96,   0,   0,   0,   0,   0,  96,  96,  96,  96,
+     96,  96,  96,  96,   0,  96,  96,  96,   0,  96,  96,  96,  96,  96,  96,  96,
+     96,  96,  96,  96,  96,  96,  96,  96,  96,  96,  96,  96,  96,  96,  96,  96,
+     96,  96,  96,  96,  96,  96,   0,   0,  96,  96,  96,   0,   0,   0,   0,  96,
+     96,  96,  96,  96,  96,  96,  96,  96,  96,   0,   0,   0,   0,   0,   0,   0,
+     96,  96,  96,  96,  96,  96,  96,  96,  96,   0,   0,   0,   0,   0,   0,   0,
+     97,  97,  97,  97,  97,  97,  97,  97,  97,  97,  97,  97,  97,  97,  97,  97,
+     97,  97,  97,  97,  97,  97,  97,  97,  97,  97,  97,  97,  97,  97,  97,  97,
+     98,  98,  98,  98,  98,  98,  98,  98,  98,  98,  98,  98,  98,  98,  98,  98,
+     98,  98,  98,  98,  98,  98,  98,  98,  98,  98,  98,  98,  98,  98,  98,  98,
+     99,  99,  99,  99,  99,  99,  99,  99,  99,  99,  99,  99,  99,  99,  99,  99,
+     99,  99,  99,  99,  99,  99,  99,  99,  99,  99,  99,  99,  99,  99,  99,  99,
+     99,  99,  99,  99,  99,  99,  99,   0,   0,   0,   0,  99,  99,  99,  99,  99,
+     99,  99,  99,  99,  99,  99,  99,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100,
+    100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100,
+    100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100,
+    100, 100, 100, 100, 100, 100,   0,   0,   0, 100, 100, 100, 100, 100, 100, 100,
+    101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101,
+    101, 101, 101, 101, 101, 101,   0,   0, 101, 101, 101, 101, 101, 101, 101, 101,
+    102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102,
+    102, 102, 102,   0,   0,   0,   0,   0, 102, 102, 102, 102, 102, 102, 102, 102,
+    103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103,
+    103, 103,   0,   0,   0,   0,   0,   0,   0, 103, 103, 103, 103,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0, 103, 103, 103, 103, 103, 103, 103,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104,
+    104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104,
+    104, 104, 104, 104, 104, 104, 104, 104, 104,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105,
+    105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105,
+    105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105,
+    105, 105, 105,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105,
+    105, 105, 105,   0,   0,   0,   0,   0,   0,   0, 105, 105, 105, 105, 105, 105,
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106,
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106,
+    106, 106, 106, 106, 106, 106, 106, 106,   0,   0,   0,   0,   0,   0,   0,   0,
+    106, 106, 106, 106, 106, 106, 106, 106, 106, 106,   0,   0,   0,   0,   0,   0,
+     10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,
+     10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,   0,
+    107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107,
+    107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107,
+    107, 107, 107, 107, 107, 107, 107, 107, 107, 107,   0, 107, 107, 107,   0,   0,
+    107, 107,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108,
+    108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108,
+    108, 108, 108, 108, 108, 108, 108, 108,   0,   0,   0,   0,   0,   0,   0,   0,
+    109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109,
+    109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109,
+    109, 109, 109, 109, 109, 109, 109, 109, 109, 109,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110,
+    110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111,
+    111, 111, 111, 111, 111, 111, 111,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112,
+    112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112,
+    112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112,   0,   0,
+      0,   0, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112,
+    112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 112,
+    113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+    113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+    113, 113,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 113,   0,   0,
+    114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114,
+    114, 114, 114, 114, 114, 114, 114, 114, 114,   0,   0,   0,   0,   0,   0,   0,
+    114, 114, 114, 114, 114, 114, 114, 114, 114, 114,   0,   0,   0,   0,   0,   0,
+    115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115,
+    115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115,
+    115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115,
+    115, 115, 115, 115, 115,   0, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115,
+    115, 115, 115, 115, 115, 115, 115, 115,   0,   0,   0,   0,   0,   0,   0,   0,
+    116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116,
+    116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116,
+    116, 116, 116, 116, 116, 116, 116,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117,
+    117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117,
+      0,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,
+     25,  25,  25,  25,  25,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118,
+    118, 118,   0, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118,
+    118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118,
+    118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118,   0,
+    119, 119, 119, 119, 119, 119, 119,   0, 119,   0, 119, 119, 119, 119,   0, 119,
+    119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119,   0, 119,
+    119, 119, 119, 119, 119, 119, 119, 119, 119, 119,   0,   0,   0,   0,   0,   0,
+    120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
+    120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
+    120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
+    120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,   0,   0,   0,   0,   0,
+    120, 120, 120, 120, 120, 120, 120, 120, 120, 120,   0,   0,   0,   0,   0,   0,
+    121, 177, 121, 177,   0, 121, 121, 121, 121, 121, 121, 121, 121,   0,   0, 121,
+    121,   0,   0, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+    121, 121, 121, 121, 121, 121, 121, 121, 121,   0, 121, 121, 121, 121, 121, 121,
+    121,   0, 121, 121,   0, 121, 121, 121, 121, 121,   0, 177, 177, 121, 121, 121,
+    121, 121, 121, 121, 121,   0,   0, 121, 121,   0,   0, 121, 121, 121,   0,   0,
+    121,   0,   0,   0,   0,   0,   0, 121,   0,   0,   0,   0,   0, 121, 121, 121,
+    121, 121, 121, 121,   0,   0, 121, 121, 121, 121, 121, 121, 121,   0,   0,   0,
+    121, 121, 121, 121, 121,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+    122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+    122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+    122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122,   0, 122, 122, 122,
+    122, 122,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+    123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+    123, 123, 123, 123, 123, 123, 123, 123,   0,   0,   0,   0,   0,   0,   0,   0,
+    123, 123, 123, 123, 123, 123, 123, 123, 123, 123,   0,   0,   0,   0,   0,   0,
+    124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+    124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+    124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+    124, 124, 124, 124, 124, 124,   0,   0, 124, 124, 124, 124, 124, 124, 124, 124,
+    124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+    124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,   0,   0,
+    125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+    125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+    125, 125, 125, 125, 125,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    125, 125, 125, 125, 125, 125, 125, 125, 125, 125,   0,   0,   0,   0,   0,   0,
+     42,  42,  42,  42,  42,  42,  42,  42,  42,  42,  42,  42,  42,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+    126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+    126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+    126, 126, 126, 126, 126, 126, 126, 126, 126,   0,   0,   0,   0,   0,   0,   0,
+    126, 126, 126, 126, 126, 126, 126, 126, 126, 126,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,   0,   0, 127, 127, 127,
+    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,   0,   0,   0,   0,
+    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,   0,   0,   0,   0,
+    129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+    129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+    129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+    129, 129, 129,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 129,
+    130, 130, 130, 130, 130, 130, 130,   0,   0, 130,   0,   0, 130, 130, 130, 130,
+    130, 130, 130, 130,   0, 130, 130,   0, 130, 130, 130, 130, 130, 130, 130, 130,
+    130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+    130, 130, 130, 130, 130, 130,   0, 130, 130,   0,   0, 130, 130, 130, 130, 130,
+    130, 130, 130, 130, 130, 130, 130,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    130, 130, 130, 130, 130, 130, 130, 130, 130, 130,   0,   0,   0,   0,   0,   0,
+    131, 131, 131, 131, 131, 131, 131, 131,   0,   0, 131, 131, 131, 131, 131, 131,
+    131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+    131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+    131, 131, 131, 131, 131, 131, 131, 131,   0,   0, 131, 131, 131, 131, 131, 131,
+    131, 131, 131, 131, 131,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+    132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+    132, 132, 132, 132, 132, 132, 132, 132,   0,   0,   0,   0,   0,   0,   0,   0,
+    133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+    133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+    133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+    133, 133, 133,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+    134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+    134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+    134, 134, 134, 134, 134, 134, 134, 134, 134,   0,   0,   0,   0,   0,   0,   0,
+    135, 135, 135, 135, 135, 135, 135, 135, 135,   0, 135, 135, 135, 135, 135, 135,
+    135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+    135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+    135, 135, 135, 135, 135, 135, 135,   0, 135, 135, 135, 135, 135, 135, 135, 135,
+    135, 135, 135, 135, 135, 135,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+    135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135,   0,   0,   0,
+    136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+    136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+      0,   0, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+    136, 136, 136, 136, 136, 136, 136, 136,   0, 136, 136, 136, 136, 136, 136, 136,
+    136, 136, 136, 136, 136, 136, 136,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    137, 137, 137, 137, 137, 137, 137,   0, 137, 137,   0, 137, 137, 137, 137, 137,
+    137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+    137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+    137, 137, 137, 137, 137, 137, 137,   0,   0,   0, 137,   0, 137, 137,   0, 137,
+    137, 137, 137, 137, 137, 137, 137, 137,   0,   0,   0,   0,   0,   0,   0,   0,
+    137, 137, 137, 137, 137, 137, 137, 137, 137, 137,   0,   0,   0,   0,   0,   0,
+    138, 138, 138, 138, 138, 138,   0, 138, 138,   0, 138, 138, 138, 138, 138, 138,
+    138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138,
+    138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138,   0,
+    138, 138,   0, 138, 138, 138, 138, 138, 138,   0,   0,   0,   0,   0,   0,   0,
+    138, 138, 138, 138, 138, 138, 138, 138, 138, 138,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139,
+    139, 139, 139, 139, 139, 139, 139, 139, 139,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     60,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,
+    177, 177,  21, 177,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,
+     21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,  21,
+     21,  21,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  21,
+    140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,
+    140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,
+    140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,
+    140, 140, 140, 140, 140, 140, 140, 140, 140, 140,   0,   0,   0,   0,   0,   0,
+    140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,   0,
+    140, 140, 140, 140, 140,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    140, 140, 140, 140,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141,
+    141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141,
+    141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141,   0,
+    141, 141, 141, 141, 141, 141, 141, 141, 141,   0,   0,   0,   0,   0,   0,   0,
+    142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142,
+    142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142,
+    142, 142, 142, 142, 142, 142, 142,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     62,  62,  62,  62,  62,  62,  62,  62,  62,  62,  62,  62,  62,  62,  62,  62,
+     62,  62,  62,  62,  62,  62,  62,  62,  62,   0,   0,   0,   0,   0,   0,   0,
+    143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143,
+    143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143,   0,
+    143, 143, 143, 143, 143, 143, 143, 143, 143, 143,   0,   0,   0,   0, 143, 143,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144,
+    144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144,   0,   0,
+    144, 144, 144, 144, 144, 144,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145,
+    145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145,
+    145, 145, 145, 145, 145, 145,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    145, 145, 145, 145, 145, 145, 145, 145, 145, 145,   0, 145, 145, 145, 145, 145,
+    145, 145,   0, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145,
+    145, 145, 145, 145, 145, 145, 145, 145,   0,   0,   0,   0,   0, 145, 145, 145,
+    145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146,
+    146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146,
+    146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146,
+    146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146,   0,   0,   0,   0,   0,
+    147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147,
+    147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147,
+    147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147,   0,   0,   0,   0, 147,
+    147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147,
+    147, 147, 147, 147, 147, 147, 147, 147,   0,   0,   0,   0,   0,   0,   0, 147,
+    147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147,
+    148, 149,   1,   1, 150,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     56,  56,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148,
+    148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148,
+    148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148,
+    148, 148, 148, 148, 148, 148, 148, 148,   0,   0,   0,   0,   0,   0,   0,   0,
+    150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150,
+    150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150,
+    150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150,
+    150, 150, 150, 150, 150, 150,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    148, 148, 148, 148, 148, 148, 148, 148, 148,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     58,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,
+     57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,
+     57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,
+     57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,  57,   0,
       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0, 118,   0,   0,   0,   0,   0,   0, 119,   0,   0,   0, 120,
+     57,  57,  57,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,  58,  58,  58,  58,   0,   0,   0,   0,   0,   0,   0,   0,
+    149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149,
+    149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149,
+    149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149,
+    149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149,
+    149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149,   0,   0,   0,   0,
+    151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151,
+    151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151,
+    151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151,   0,   0,   0,   0,   0,
+    151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151,   0,   0,   0,
+    151, 151, 151, 151, 151, 151, 151, 151, 151,   0,   0,   0,   0,   0,   0,   0,
+    151, 151, 151, 151, 151, 151, 151, 151, 151, 151,   0,   0, 151, 151, 151, 151,
+    214, 214, 214, 214,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 121,   0,   0,   0,   0,   0,
-     60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,
-     60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,
-     60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,
-     60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,
-     60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,
-     60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,
-     60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,
-     60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,
-     60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,
-     60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60, 122,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,  60,  60,  60,  60,  60,  60,  60,  60,
-    123, 124,  60, 125,  60,  60,  62,   0, 126, 127, 128, 129, 130, 131, 132, 133,
-    134, 134, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147,
-    148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 157, 158, 159, 160, 161, 162,
-      0,   0,   0,   0, 163, 164,   0,   0,   0, 165,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 166,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0, 167,   0,   0,   0,   0,   0,   0,   0, 168,   0,   0,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      1,   1,   1,   1,   1,   1,   1,   0,   0,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   4,   4,   4,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   4,   4,   4,   4,   4,
+      4,   4,   4,   1,   1,   4,   4,   4,   4,   4,   4,   4,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   4,   4,   4,   4,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   0,   0,   0,   0,   0,   0,   0,
       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 169, 170,   0, 171, 172,   0,
+      5,   5,   5,   5,   5,   5,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-    173, 173, 174, 173, 175, 176, 177, 173, 178, 179, 180, 173, 173, 173, 173, 173,
-    173, 173, 173, 173, 173, 181, 173, 173, 173, 173, 173, 173, 173, 173, 182, 173,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199,
+    199, 199,   1,   1,   1,   1,   1,   1,   1,   0,   0,   0,   0,   0,   0,   0,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   0,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   0,   1,   1,
+      0,   0,   1,   0,   0,   1,   1,   0,   0,   1,   1,   1,   1,   0,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   0,   1,   0,   1,   1,   1,
+      1,   1,   1,   1,   0,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   0,   1,   1,   1,   1,   0,   0,   1,   1,   1,
+      1,   1,   1,   1,   1,   0,   1,   1,   1,   1,   1,   1,   1,   0,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   0,   1,   1,   1,   1,   0,
+      1,   1,   1,   1,   1,   0,   1,   0,   0,   0,   1,   1,   1,   1,   1,   1,
+      1,   0,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   0,   0,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   0,   0,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+    152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152,
+    152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152,
+    152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 152, 152, 152, 152, 152,
+      0, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     54,  54,  54,  54,  54,  54,  54,   0,  54,  54,  54,  54,  54,  54,  54,  54,
+     54,  54,  54,  54,  54,  54,  54,  54,  54,   0,   0,  54,  54,  54,  54,  54,
+     54,  54,   0,  54,  54,   0,  54,  54,  54,  54,  54,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153,
+    153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153,
+    153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153,   0,   0,   0,
+    153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153,   0,   0,
+    153, 153, 153, 153, 153, 153, 153, 153, 153, 153,   0,   0,   0,   0, 153, 153,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154,
+    154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154,
+    154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154,
+    154, 154, 154, 154, 154, 154, 154, 154, 154, 154,   0,   0,   0,   0,   0, 154,
+    155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155,
+    155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155,
+    155, 155, 155, 155, 155,   0,   0, 155, 155, 155, 155, 155, 155, 155, 155, 155,
+    155, 155, 155, 155, 155, 155, 155,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156,
+    156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156,
+    156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156,   0,   0,   0,   0,
+    156, 156, 156, 156, 156, 156, 156, 156, 156, 156,   0,   0,   0,   0, 156, 156,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   0,   0,
+     10,  10,  10,  10,   0,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,
+     10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,
+      0,  10,  10,   0,  10,   0,   0,  10,   0,  10,  10,  10,  10,  10,  10,  10,
+     10,  10,  10,   0,  10,  10,  10,  10,   0,  10,   0,  10,   0,   0,   0,   0,
+      0,   0,  10,   0,   0,   0,   0,  10,   0,  10,   0,  10,   0,  10,  10,  10,
+      0,  10,  10,   0,  10,   0,   0,  10,   0,  10,   0,  10,   0,  10,   0,  10,
+      0,  10,  10,   0,  10,   0,   0,  10,  10,  10,  10,   0,  10,  10,  10,  10,
+     10,  10,  10,   0,  10,  10,  10,  10,   0,  10,  10,  10,  10,   0,  10,   0,
+     10,  10,  10,  10,  10,  10,  10,  10,  10,  10,   0,  10,  10,  10,  10,  10,
+     10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,   0,   0,   0,   0,
+      0,  10,  10,  10,   0,  10,  10,  10,  10,  10,   0,  10,  10,  10,  10,  10,
+     10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     10,  10,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   0,   0,   0,   0,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   0,
+      0,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      0,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      0,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   0,   0,
       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+     57,   1,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   0,   0,   0,   0,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   0,   0,   0,   0,   0,   0,   0,
+    199, 199,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      1,   1,   1,   1,   1,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   0,   0,   0,   0,   0,   0,   0,   0,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   0,   0,   0,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   0,   0,   0,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   0,   0,   0,   0,   0,   0,   0,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   0,   0,   0,   0,
       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-    177, 183, 184, 185, 186, 187,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0, 188, 189, 190, 191, 192,   0,   0,   0,
-    193, 194, 195,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      1,   1,   1,   1,   1,   1,   1,   1,   0,   0,   0,   0,   0,   0,   0,   0,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   0,   0,   0,   0,   0,   0,
+      1,   1,   1,   1,   1,   1,   1,   1,   0,   0,   0,   0,   0,   0,   0,   0,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   0,   0,
+      1,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   0,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   0,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   0,   0,
+      1,   1,   1,   1,   1,   0,   0,   0,   1,   1,   1,   0,   0,   0,   0,   0,
+      1,   1,   1,   1,   1,   1,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   0,   0,   0,   0,   0,   0,   0,
+      1,   1,   1,   1,   1,   1,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      1,   1,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      1,   1,   1,   1,   1,   1,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   0,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   0,   0,   0,   0,   0,   0,
+     56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,
+     56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,   0,   0,
+     56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,
+     56,  56,  56,  56,  56,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     56,  56,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,
+     56,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,
-     65,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,   0,   0,   0,   0,   0,
       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-};
+      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0
+};
+static RE_UINT16 script_extensions_table_4[] = {
+      0,   2,   4,   7,  10,  13,  19,  23,  32,  35,  39,  42,  56,  69,  90, 112,
+    117, 121, 124, 127, 130, 133, 137, 140, 145, 148, 153, 155, 158, 161, 164, 171,
+    174, 183, 187, 189, 191, 194, 197, 201, 208, 214, 216, 219, 222, 226, 229, 244,
+    258, 270, 273, 277, 280, 283, 286, 290, 293
+};
+static RE_UINT8 script_extensions_table_5[] = {
+      5,   0,   2,   0,   7,  77,   0,   7,  54,   0,   7,   2,   0,  10, 106,  11,
+     12, 107,   0,  10,  11,  12,   0, 156,  10,  15,  99, 103, 106, 109,  11,   0,
+     10,  11,   0,  10,  12, 107,   0,  10, 106,   0,  17,  16, 121,  19,  18,  23,
+      2,  24,  20, 117,  21,  22, 123,   0,  17,  16, 121,  19,  18,  23,   2,  24,
+     20,  21,  22, 123,   0,  17,  16, 128, 138, 137, 121,  19,  18,  23, 116,  24,
+    131,  20, 120,  25,  63, 126,  21,  22, 123,   0,  17,  16, 128, 138, 137, 121,
+     19,  18,  23,  43, 116,  24, 131,  20, 120,  25,  63, 126,  21,  22, 123,   0,
+     16, 128, 113, 116,   0,  17, 115,  63,   0,  18, 119,   0,  19, 118,   0, 121,
+     21,   0,  23, 131,   0, 115,  29,  44,   0,  30,   2,   0,  39,  38,  40,  37,
+      0,  42,  64,   0,  17,  16, 121,  23,   0,  16,   0,  16, 121,   0,  17,  16,
+      0,  16, 117,   0,  16,  23,  24,  20,  21,  22,   0,  16, 131,   0,  17,  16,
+    121,  23, 131,  20,  22, 123,   0,  16, 121,  23,   0,  17,   0, 131,   0,   7,
+     11,   0,   2,  42,   0,  16, 121,   2,   0,   3,  31,  56,  57,  58,  59,   0,
+      3,  31,  56,  57,  58,   0,  56,   0,   3,  56,   0,  57,  58,   0,  56,  57,
+     58,   0,  56,   2,   0,  16, 128,  19,  18, 118,  23, 113, 116,  24, 125, 131,
+    120, 126, 123,   0,  16, 128,  19,  18, 118,  23, 113, 116, 125, 131, 120, 126,
+    123,   0,  16, 128,  19,  18, 118, 113, 116, 125, 120, 126, 123,   0,  16,  21,
+      0,  66,   2,  29,   0,  46,  68,   0,  10,  12,   0,  87,  72,   0,  87,  86,
+     72,   0,  10,   6,   0, 151,   0
+};
+
+int re_get_script_extensions(RE_UINT32 codepoint, RE_UINT8* scripts) {
+    RE_UINT32 field_2;
+    RE_UINT32 field_1;
+    RE_UINT32 field_0;
+    RE_UINT32 v;
+    int offset;
+    int count;
 
-static RE_UINT8 re_decomposition_type_stage_3[] = {
-      0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   2,   3,   4,   5,   6,   7,
-      8,   9,   8,   8,  10,  11,  10,  12,   8,   9,   8,   8,  10,  11,  10,   9,
-      8,   8,   8,   8,  13,   8,   8,   8,   8,  12,   8,   8,  14,   8,  10,  15,
-     16,   8,  17,   8,  12,   8,   8,   8,   8,  12,   8,   8,   8,   8,   8,  15,
-     12,   0,   0,  18,  19,   0,   0,   0,   0,  20,  20,  21,   8,   8,   8,  22,
-      8,  13,   8,   8,  23,  12,   8,   8,   8,   8,   8,   8,   8,   8,   8,  13,
-      0,  13,   8,   8,   8,   0,   0,   0,   0,   0,   0,   0,  24,  24,  25,   0,
-      0,   0,   0,   0,   0,   0,  20,   5,  24,  25,   0,   0,   0,   0,   0,   0,
-      9,  19,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  19,  26,  27,
-      0,  21,  11,  22,  19,   0,   0,   0,   0,   0,  13,   8,  19,   0,   0,   0,
-      0,   0,  13,  11,  28,  29,   0,   0,   0,   0,   0,   0,  30,   5,  31,   0,
-      9,  18,   0,  11,   0,   0,  32,   0,   0,   0,   0,   0,   0,   0,  32,   0,
-      0,   0,   0,   0,   9,  18,   0,  11,   0,   0,   0,   0,   0,  13,   0,   0,
-     33,   0,   0,   0,   8,  13,  13,   8,  13,   8,  13,   8,   8,  12,  12,   0,
-      0,   3,   0,   0,   0,   0,   0,   0,  13,  11,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,  34,  35,   0,  36,   0,   0,   0,  18,   0,   0,   0,
-      0,   0,  32,   0,  32,  19,   0,   0,   0,   0,   0,   0,   0,   0,   8,   8,
-      0,   0,  18,  19,   0,   0,   0,   9,   0,   0,   0,   0,  18,  27,   0,   0,
-      0,   0,   0,   0,   0,   0,  10,  27,   0,   0,  37,  19,   0,   0,   0,  12,
-      0,   0,   0,   0,   0,  19,   0,   0,   0,   0,  13,  19,   0,   0,   0,   0,
-      0,   0,  19,   0,   0,   0,   0,   0,  19,  18,  22,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,  27,  11,   0,   0,   0,   0,   3,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   5,   0,   0,   0,   1,   0,   0,   0,   0,
-     18,   0,   0,  32,  27,  18,   0,  19,   0,   0,  32,   0,  18,  38,  17,   0,
-     32,   0,   0,   0,  18,   0,   0,  32,  27,  18,   0,  19,   0,   0,  32,   0,
-      0,  27,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  25,
-      0,  27,  36,  36,  27,   0,   0,   0,   0,   0,   0,   0,   0,   0,  18,  32,
-      9,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  39,  24,  24,  39,  24,
-     24,  24,  24,  40,  24,  24,  24,  24,  41,  42,  43,   0,   0,   0,  25,   0,
-      0,   0,   0,   0,   0,   0,  44,  24,  24,  24,  24,  24,  24,  24,  24,  24,
-      8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,  45,   0,
-      8,   8,   8,   8,   8,   8,  12,   0,   8,   8,   8,   8,   8,  12,   8,  12,
-      8,  12,   8,  12,   8,   8,  46,  46,   8,   8,   8,   8,   8,   8,   8,  12,
-      8,   8,   8,   8,   8,  22,   8,  47,  21,  22,   8,   8,   8,  13,   8,  10,
-      8,   8,   8,   8,  13,  22,   8,  48,  49,  50,  30,   0,  51,   3,   0,   0,
-      0,  30,   0,  52,   3,  53,   0,  54,   0,   3,   5,   0,   0,   3,   0,   3,
-      0,   0,   0,   0,  55,  24,  24,  24,  42,  42,  42,  43,  42,  42,  42,  56,
-      0,   0,  35,   0,   0,   0,   0,   0,  57,  34,  58,  59,  59,  60,  61,  62,
-     63,  64,  65,  66,  66,  67,  68,  59,  69,  61,  62,   0,  70,  70,  70,  70,
-     20,  20,  20,  20,  20,  20,  20,  20,   0,   0,  71,   0,   0,   0,  13,   0,
-      0,   0,   0,  27,   0,   0,   0,   0,   0,   0,   0,  10,   0,   0,   0,   0,
-      0,  19,  32,  19,   0,   0,   0,   0,   0,  36,   0,  72,  35,   0,   0,   0,
-     32,  37,  32,   0,   0,   0,   0,   0,  36,   0,   0,  10,  12,  12,  12,   0,
-     12,  12,  12,   0,   0,   0,   0,   0,   0,   0,   0,   8,   0,   0,   0,   0,
-      8,   0,  13,  12,   0,   0,   0,   0,   0,   0,  33,   0,   0,   0,   0,   0,
-     73,  73,  73,  73,  73,  20,  20,  20,  20,  20,  20,  20,  20,  74,  73,  73,
-     73,  73,  73,  73,  73,  73,  73,  73,  73,  73,  75,   0,   0,   0,   0,   0,
-      0,   0,   0,  35,   0,   0,   0,   0,   0,   0,   0,   0,   0,  30,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,  19,   0,   0,   0,   0,   0,   0,   0,  76,
-      0,   0,   0,  44,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,
-     20,  20,  20,  20,  20,   5,   0,   0,  77,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,  26,  30,   0,   0,   0,   0,  36,  36,  36,  36,  36,
-     36,  46,  32,   0,   9,  22,  33,  12,   0,   0,   0,   0,   0,  19,   3,  78,
-      0,   0,   0,   0,   0,  37,  11,  79,   0,   0,   0,   0,  34,  20,  20,  20,
-     20,  20,  20,  30,   4,  24,  24,  24,  20,  20,  20,  20,  20,  20,  20,  30,
-     20,  73,   0,   0,  80,  73,  73,  73,  73,  73,  73,  73,  73,  73,  73,  75,
-     20,  20,  20,  81,  73,  73,  73,  73,  73,  73,  73,  73,  73,  73,  73,  82,
-     81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  20,  20,
-     20,  20,  20,  20,  83,  81,  81,  81,  20,  20,  20,  20,  20,  20,  20,  84,
-      0,   0,   0,   0,   0,   0,   0,  55,   0,   0,   0,   0,  25,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,  55,   0,   0,   0,   0,   0,   0,   0,   0,  24,
-      8,   0,   0,   0,   0,   0,   0,   0,   8,   8,   8,  12,  36,  10,   8,  11,
-     36,  33,  13,   8,   8,   8,   8,   8,   8,   8,   8,  12,   8,   8,   8,   8,
-     20,  30,   0,   0,   3,  20,   0,  46,  59,  59,  85,   8,   8,  11,   8,  36,
-      9,  22,   8,  15,  86,  87,  87,  87,  87,  87,  87,  87,  87,  87,  87,  87,
-     87,  86,  86,  86,  87,  87,  87,  87,  88,  86,  87,  87,  89,   0,   0,   0,
-      0,   0,   0,   0,  90,  91,  92,  93,  86,  88,  87,  86,  86,  86,  94,  88,
-     95,  95,  95,  95,  95,  95,  95,  95,  95,  96,  96,  96,  96,  96,  96,  96,
-     96,  96,  96,  96,  96,  97,  98,  98,  98,  98,  98,  98,  98,  98,  98,  98,
-     98,  98,  98,  98,  98,  98,  98,  99, 100, 100, 100, 100, 100, 101,  95,  95,
-     95,  95,  95,  95, 102,  96,  96,  96,  96,  96,  96, 103,  98, 100, 100, 104,
-      0,   0,   0,   0, 105,  98, 106, 107, 108, 106, 109, 106, 105,  97,  96, 106,
-     97, 110, 111,  98, 112, 107, 113, 106,  96,  96,  96,  96,  96, 107, 114,  96,
-     97, 107,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  95,  95,  95, 115,
-      0,   0,   0,   0, 116, 116, 117,   0,   0,   0,   0,   0, 116, 116, 116, 116,
-    116, 118, 119,  20, 120, 121, 121, 121, 121, 120, 121,   0, 122, 123, 124, 124,
-    125,  92, 126, 127,  91, 126, 128, 128, 128, 128, 127,  92, 126, 128, 128, 128,
-    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 127, 126, 127,  92, 129,
-    130, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-    132, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-    133, 133, 133, 133, 133, 133, 133, 134, 135, 133, 135, 133, 135, 133, 135, 136,
-    131, 137, 133, 134,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  27,  19,
-      0,   0,  18,   0,   0,   0,   0,   0,   0,   0,   0,  13,   0,   0,   0,   0,
-      0,   0,  18,  19,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  18,  36,
-      0,   0,   0,   0,   0,   0,  13,   0,   0,   0,   0,   0,   0,   0,   0,  13,
-      8,  19,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  18,   8,
-     19,   0,   0,   0,   0,   0,   0,   0,  59,  59,  59,  59,  59,  59,  59,  59,
-     59,  59,  59,  59,  59, 138,  59,  59,  59,  59,  59,  59,  59,  59,  59, 138,
-    139, 140,  61, 138,  59,  59,  66,  61,  59,  61,  59,  59,  59,  59,  59,  59,
-     59,  66, 141,  61,  59, 138,  59, 138,  59,  59,  59,  59,  59,  59,  66, 141,
-     59, 142, 143,  59, 138,  59,  59,  59,  59,  62,  59,  59,  59,  59,  59,  59,
-     59,  59,  59, 143,  59,  59,  59,  59, 140, 144,  61,  59, 141,  59, 145,   0,
-    139, 146, 145,  61, 140, 144, 145, 145, 140, 144, 141,  59, 141,  59,  61, 142,
-     59,  59,  66,  59,  59,  59,  59,   0,  61,  61,  66,  59,  59,  59,  59,   0,
-     20,  20,  30,   0,  20,  20,  20,  20,  20,  20, 147,  75,  81,  81,  81,  81,
-     81,  81,  81,  81,   0,   0,   0,   0,   0,   0,   4,  25,   0,   0,   0,   0,
-      0,   0,   0,   0, 148,   0,   0,   0, 149,   0,   0,   0,  81,  81,  81,  81,
-     81,  81,  81,  81,  81,  81,  81,   0,  20,  20,  35,   0, 150,   0,   0,   0,
-};
+    field_2 = codepoint >> 10;
+    field_1 = (codepoint >> 5) & 0x1F;
+    field_0 = codepoint & 0x1F;
 
-static RE_UINT8 re_decomposition_type_stage_4[] = {
-     0,  0,  0,  0,  4,  0,  0,  0,  2,  0, 10,  0,  0,  0,  0,  2,
-     0,  0, 10, 10,  2,  2,  0,  0,  2, 10, 10,  0, 17, 17, 17,  0,
-     1,  1,  1,  1,  1,  1,  0,  1,  0,  1,  1,  1,  1,  1,  1,  0,
-     1,  1,  0,  0,  0,  0,  1,  1,  1,  0,  2,  2,  1,  1,  1,  2,
-     2,  0,  0,  1,  1,  2,  0,  0,  0,  0,  0,  1,  1,  0,  0,  0,
-     2,  2,  2,  2,  2,  1,  1,  1,  1,  0,  1,  1,  1,  2,  2,  2,
-    10, 10, 10, 10, 10,  0,  0,  0,  0,  0,  2,  0,  0,  0,  1,  0,
-     2,  2,  2,  1,  1,  2,  2,  0,  2,  2,  2,  0,  0,  2,  0,  0,
-     0,  1,  0,  0,  0,  1,  1,  0,  0,  2,  2,  2,  2,  0,  0,  0,
-     1,  0,  1,  0,  1,  0,  0,  1,  0,  1,  1,  2, 10, 10, 10,  0,
-    10, 10,  0, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11,  0,
-     0,  0,  0, 10,  1,  1,  2,  1,  0,  1,  0,  1,  1,  2,  1,  2,
-     1,  1,  2,  0,  1,  1,  2,  2,  2,  2,  2,  4,  0,  4,  0,  0,
-     0,  0,  0,  4,  2,  0,  2,  2,  2,  0,  2,  0, 10, 10,  0,  0,
-    11,  0,  0,  0,  2,  2,  3,  2,  0,  2,  3,  3,  3,  3,  3,  3,
-     0,  3,  2,  0,  0,  3,  3,  3,  3,  3,  0,  0, 10,  2, 10,  0,
-     3,  0,  1,  0,  3,  0,  1,  1,  3,  3,  0,  3,  3,  2,  2,  2,
-     2,  3,  0,  2,  3,  0,  0,  0, 17, 17, 17, 17,  0, 17,  0,  0,
-     2,  2,  0,  2,  9,  9,  9,  9,  2,  2,  9,  9,  9,  9,  9,  0,
-    11, 10,  0,  0, 13,  0,  0,  0,  2,  0,  1, 12,  0,  0,  1, 12,
-    16,  9,  9,  9, 16, 16, 16, 16,  9,  9,  9, 16,  2, 16, 16, 16,
-     2,  2,  2, 16,  3,  3,  1,  1,  8,  7,  8,  7,  5,  6,  8,  7,
-     8,  7,  5,  6,  8,  7,  0,  0,  0,  0,  0,  8,  7,  5,  6,  8,
-     7,  8,  7,  8,  7,  8,  8,  7,  5,  8,  7,  5,  8,  8,  8,  8,
-     7,  7,  7,  7,  7,  7,  7,  5,  5,  5,  5,  5,  5,  5,  5,  6,
-     6,  6,  6,  6,  6,  8,  8,  8,  8,  7,  7,  7,  7,  5,  5,  5,
-     7,  8,  0,  0,  5,  7,  5,  5,  7,  5,  7,  7,  5,  5,  7,  7,
-     5,  5,  7,  5,  5,  7,  7,  5,  7,  7,  5,  7,  5,  5,  5,  7,
-     0,  0,  5,  5,  5,  7,  7,  7,  5,  7,  5,  7,  8,  0,  0,  0,
-    12, 12, 12, 12, 12, 12,  0,  0, 12,  0,  0, 12, 12,  2,  2,  2,
-    15, 15, 15,  0, 15, 15, 15, 15,  8,  6,  8,  0,  8,  0,  8,  6,
-     8,  6,  8,  6,  8,  8,  7,  8,  7,  8,  7,  5,  6,  8,  7,  8,
-     6,  8,  7,  5,  7,  0,  0,  0,  0, 13, 13, 13, 13, 13, 13, 13,
-    13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,  0,  0,  0, 14, 14,
-    14,  0,  0,  0, 13, 13, 13,  0,  3,  0,  3,  3,  0,  0,  3,  0,
-     0,  3,  3,  0,  3,  3,  3,  0,  3,  0,  3,  0,  0,  0,  3,  3,
-     3,  0,  0,  3,  0,  3,  0,  3,  0,  0,  0,  3,  2,  2,  2,  9,
-    16,  0,  0,  0, 16, 16, 16,  0,  9,  9,  0,  0,
-};
+    v = script_extensions_table_1[field_2];
+    v = script_extensions_table_2[(v << 5) | field_1];
+    v = script_extensions_table_3[(v << 5) | field_0];
+
+    if (v < 158) {
+        scripts[0] = v;
 
-/* Decomposition_Type: 3868 bytes. */
-
-RE_UINT32 re_get_decomposition_type(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-
-    f = ch >> 11;
-    code = ch ^ (f << 11);
-    pos = (RE_UINT32)re_decomposition_type_stage_1[f] << 6;
-    f = code >> 5;
-    code ^= f << 5;
-    pos = (RE_UINT32)re_decomposition_type_stage_2[pos + f] << 3;
-    f = code >> 2;
-    code ^= f << 2;
-    pos = (RE_UINT32)re_decomposition_type_stage_3[pos + f] << 2;
-    value = re_decomposition_type_stage_4[pos + code];
-
-    return value;
+        return 1;
+    }
+
+    offset = script_extensions_table_4[v - 158];
+    count = 0;
+
+    do {
+        scripts[count] = script_extensions_table_5[offset + count];
+        ++count;
+    } while (script_extensions_table_5[offset + count] != 0);
+
+    return count;
 }
 
-/* East_Asian_Width. */
+/* Sentence_Break. */
+static RE_UINT8 re_sentence_break_table_1[] = {
+     0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 13, 13,
+    13, 13, 13, 14, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 15, 13, 16, 17, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 18, 19, 19, 19, 19, 19, 19, 19, 19, 20, 21,
+    22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 19, 19, 13, 32, 19, 19,
+    19, 33, 19, 19, 19, 19, 19, 19, 19, 19, 34, 35, 13, 13, 13, 13,
+    13, 36, 13, 37, 19, 19, 19, 19, 19, 19, 19, 19, 38, 19, 19, 39,
+    19, 19, 19, 19, 40, 41, 42, 19, 43, 19, 44, 45, 46, 47, 48, 19,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 49, 13, 13, 13, 50, 51, 13,
+    13, 13, 13, 52, 13, 13, 13, 13, 13, 13, 53, 19, 19, 19, 54, 19,
+    13, 13, 13, 13, 55, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+    19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+    19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+    19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+    19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+    19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+    19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+    19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+    19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+    19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+    19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+    19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+    19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+    19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+    19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+    19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+    19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+    19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+    19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+    19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+    19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+    19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+    19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+    19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+    19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+    19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+    19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+    19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+    19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+    19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+    19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+    19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+    19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+    19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+    19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+    19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+    19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+    19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+    19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+    19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+    19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+    19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+    19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+    19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+    56, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+    19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+    19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+    19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+    19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+    19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+    19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+    19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+    19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+    19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+    19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+    19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19
+};
 
-static RE_UINT8 re_east_asian_width_stage_1[] = {
-     0,  1,  2,  3,  4,  5,  5,  5,  5,  5,  6,  5,  5,  7,  8,  9,
-    10, 10, 10, 10, 10, 10, 11,  5, 12, 10, 10, 13, 10, 10, 10, 14,
-     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5, 15,
-     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5, 15,
+static RE_UINT16 re_sentence_break_table_2[] = {
+      0,   1,   2,   3,   4,   5,   6,   7,   8,   9,  10,  11,  12,  13,  14,  15,
+      8,  16,  17,  18,  19,  20,  21,  22,  23,  23,  23,  24,  25,  26,  27,  28,
+     29,  30,  18,   8,  31,   8,  32,   8,   8,  33,  34,  18,  35,  36,  37,  38,
+     39,  40,  41,  42,  40,  40,  43,  44,  45,  46,  47,  40,  40,  48,  49,  50,
+     51,  52,  53,  54,  55,  56,  57,  58,  59,  60,  61,  62,  63,  64,  65,  66,
+     67,  68,  69,  70,  71,  72,  73,  74,  75,  72,  76,  77,  78,  79,  80,  81,
+     82,  83,  84,  85,  86,  87,  88,  89,  90,  91,  92,  93,  94,  95,  96,  97,
+     98,  99, 100,  55, 101, 102, 103,  55, 104, 105, 106, 107, 108, 109, 110,  55,
+     40, 111, 112, 113, 114,  29, 115, 116,  40,  40,  40,  40,  40,  40,  40,  40,
+     40,  40, 117,  40, 118, 119, 120,  40, 121,  40, 122, 123, 124,  29,  29, 125,
+     98,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,
+     40,  40,  40, 126, 127,  40,  40, 128, 129, 130, 131, 132,  40, 133, 134, 135,
+    136,  40,  40, 137, 138, 139,  40, 140, 141, 142, 143, 144,  40, 145, 146,  55,
+    147,  40, 148, 149, 150, 151, 152,  55, 153, 133, 154, 155, 156, 157,  40, 158,
+     40, 159, 160, 161, 162, 163, 164, 165,  18,  18,  18,  18,  18,  18,  23, 166,
+      8,   8,   8,   8, 167,   8,   8,   8, 168, 169, 170, 171, 169, 172, 173, 174,
+    175, 176, 177, 178, 179,  55, 180, 181, 182, 183, 184,  30, 185,  55,  55,  55,
+     55,  55,  55,  55,  55,  55,  55,  55, 186, 187,  55,  55,  55,  55,  55,  55,
+     55,  55,  55,  55,  55, 188,  30, 189,  55,  55,  55,  55,  55,  55,  55,  55,
+     55,  55,  55,  55,  55,  55,  55,  55,  55,  55, 190, 191,  55,  55, 192, 193,
+     55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55, 194,  55, 195, 196,
+     55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,
+     29, 197, 198, 199,   8,   8,   8, 200,  18, 201,  40, 202, 203, 204, 204,  23,
+    205, 206, 207,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,
+    208, 209,  98,  40, 210,  98,  40, 116, 211, 212,  40,  40, 213,  40,  55, 214,
+     55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,
+     40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,
+     40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,
+     40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  55,  55,
+     40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,
+     40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,
+     40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40, 215,
+     40,  40,  40,  40, 216,  55, 214, 217,  40,  40,  40,  40,  40,  40,  40,  40,
+    218, 219,   8, 220, 221,  40,  40, 222, 223, 224,   8, 225, 226, 227, 228, 229,
+    230, 231,  40, 232, 233, 133, 234, 235,  49, 236, 237, 215,  59, 238, 239, 240,
+     40, 241, 242, 243,  40, 244, 245, 246, 247, 248, 249, 250,  18,  18,  40, 251,
+     40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,
+     40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40, 252, 253, 254,
+     55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,
+     55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,
+     55,  55,  55,  55,  55,  55,  55,  55,  40,  40,  40,  40,  40,  40,  40,  40,
+     40,  40,  40, 255,  40,  40, 256,  55, 257, 258, 259,  40,  40, 260, 261,  40,
+     40,  40,  40,  40,  40,  40,  40,  40,  40, 262, 214,  40, 263,  40, 264, 265,
+    266, 267, 268, 269,  40,  40,  40, 270, 271,   2, 272, 273, 274, 141, 275, 276,
+    277, 278, 279,  55,  40,  40,  40, 280,  55,  55,  40, 281,  55,  55,  55, 282,
+     55,  55,  55,  55, 215,  40, 283, 152,  40, 284, 285, 286, 287,  40, 288,  55,
+     29, 289, 290,  40, 287, 291, 292, 293,  40, 294,  40, 295,  55,  55,  55,  55,
+     40,  40,  40,  40,  40,  40,  40,  40,  40, 203, 140, 264,  55,  55,  55,  55,
+    296, 297, 140, 203, 141,  55,  55, 298, 140, 256,  55,  55,  40, 299,  55,  55,
+    300, 301, 302, 215, 215,  55, 106, 303,  40, 140, 140, 304, 260,  55,  55,  55,
+     40,  40, 305,  55,  29, 306,  18, 307,  40, 308,  55,  55,  55,  55,  55,  55,
+     55,  55,  55,  55,  40, 309,  55,  55, 215, 310, 311,  55,  55, 214, 312, 203,
+    156, 313, 314, 315, 156, 316, 317, 318, 156, 319, 320, 321, 156, 238, 322,  55,
+    323, 324,  55,  55, 325, 326, 327, 328, 329, 330, 331, 332,  55,  55,  55,  55,
+     40, 333, 334, 335,  40,  46, 336,  55,  55,  55,  55,  55,  40, 337, 338,  55,
+     40,  46, 339,  55,  40, 340, 135,  55, 122, 341,  55,  55,  55,  55,  55,  55,
+     40, 342,  55,  55,  55,  29,  18, 343, 344, 345, 346,  55,  55, 347, 348, 349,
+    350, 351, 352,  40, 353,  55,  40, 137,  55,  55,  55,  55,  55,  55,  55,  55,
+    354, 355, 356, 357, 358, 359,  55,  55, 360, 361, 362, 363, 364, 135,  55,  55,
+     55,  55,  55,  55,  55,  55,  55, 365,  55,  55,  55,  55,  55, 366,  55,  55,
+     40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,
+     40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40, 256,  55,  55,  55,
+     40,  40,  40, 213,  40,  40,  40,  40,  40,  40, 295,  55,  55,  55,  55,  55,
+     55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,
+     40, 367,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,
+     55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,
+     40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,
+     40,  40, 368,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,
+     40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,
+     40, 137, 141, 369,  55,  55, 214, 370,  40, 371, 372, 373, 124,  55,  55,  55,
+     55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,
+     55,  55,  29,  18, 374,  55,  55,  55,  40,  40, 375,  23, 376,  55,  55, 377,
+     40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,
+     40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40, 378,
+     40,  40,  40,  40,  40,  40, 140,  55, 305,  55,  55,  55,  55,  55,  55,  55,
+     55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,
+     40,  40,  40,  40,  40,  40,  40,  40, 141,  55, 379, 380,  40,  40,  40,  40,
+     40,  40,  40,  40,  40,  40,  40, 254,  55,  55,  55,  55,  55,  55,  55,  55,
+     40,  40,  40, 381, 382, 383,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,
+     55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,
+     55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55, 384, 385, 386,  55,  55,
+     55,  55, 387,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,
+    388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, 388, 389, 401,
+    391, 402, 403, 404, 395, 405, 406, 407, 408, 409, 410, 197, 411, 412, 413, 414,
+     55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,
+     23, 415,  23, 416, 417, 418,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,
+    419, 420,  55,  55,  55,  55,  55,  55,  40, 421, 422,  55,  55,  55,  55,  55,
+     55,  55,  55,  55,  55,  55,  40, 423,  55,  55,  55,  55,  55,  55,  55,  55,
+     40,  40,  40,  40,  40,  40, 424,  55,  29, 425, 426,  55,  55,  55,  55,  55,
+     55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,
+     55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,
+    427, 428, 429, 430, 431, 432,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,
+     55,  55,  55,  55,  55,  55,  55,  55,  55, 433, 434, 434, 435,  55,  55,  55,
+     55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,
+     55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,
+     55,  55,  55, 436,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,
+     55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,
+     55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55, 437,
+     40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,
+     40,  40,  40,  40,  40,  40, 287,  55,  40,  40,  40,  40,  40,  40,  40,  40,
+     40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,
+     40,  40,  40,  40,  40,  40,  40,  40,  40, 281,  40,  40,  40,  40,  40,  40,
+    287,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,
+     40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,
+     40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,
+     40,  40,  40,  40,  40, 438,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,
+     40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,
+     40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40, 439,
+     40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,
+    287,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,
+     40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,
+     40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  54,  55,  55,  55,  55,  55,
+    440,  23,  23,  23,  55,  55,  55,  55,  23,  23,  23,  23,  23,  23,  23, 441,
+     55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55,  55
+};
+
+static RE_UINT8 re_sentence_break_table_3[] = {
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  2,  1,  1,  3,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     1,  4,  5,  0,  0,  0,  0,  5,  5,  5,  0,  0,  6,  6,  7,  0,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  6,  0,  0,  0,  0,  4,
+     0,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  5,  0,  5,  0,  0,
+     0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,  5,  0,  5,  0,  0,
+     0,  0,  0,  0,  0, 11,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     1,  0,  0,  0,  0,  0,  0,  0,  0,  0, 10,  5,  0, 12,  0,  0,
+     0,  0,  0,  0,  0, 10,  0,  0,  0,  0, 10,  5,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  0,  9,  9,  9,  9,  9,  9,  9, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10,  0, 10, 10, 10, 10, 10, 10, 10, 10,
+     9, 10,  9, 10,  9, 10,  9, 10,  9, 10,  9, 10,  9, 10,  9, 10,
+     9, 10,  9, 10,  9, 10,  9, 10,  9, 10,  9, 10,  9, 10,  9, 10,
+     9, 10,  9, 10,  9, 10,  9, 10,  9, 10,  9, 10,  9, 10,  9, 10,
+     9, 10,  9, 10,  9, 10,  9, 10, 10,  9, 10,  9, 10,  9, 10,  9,
+    10,  9, 10,  9, 10,  9, 10,  9, 10, 10,  9, 10,  9, 10,  9, 10,
+     9, 10,  9, 10,  9, 10,  9, 10,  9, 10,  9, 10,  9, 10,  9, 10,
+     9, 10,  9, 10,  9, 10,  9, 10,  9, 10,  9, 10,  9, 10,  9, 10,
+     9, 10,  9, 10,  9, 10,  9, 10,  9,  9, 10,  9, 10,  9, 10, 10,
+    10,  9,  9, 10,  9, 10,  9,  9, 10,  9,  9,  9, 10, 10,  9,  9,
+     9,  9, 10,  9,  9, 10,  9,  9,  9, 10, 10, 10,  9,  9, 10,  9,
+     9, 10,  9, 10,  9, 10,  9,  9, 10,  9, 10, 10,  9, 10,  9,  9,
+    10,  9,  9,  9, 10,  9, 10,  9,  9, 10, 10, 13,  9, 10, 10, 10,
+    13, 13, 13, 13,  9,  9, 10,  9,  9, 10,  9,  9, 10,  9, 10,  9,
+    10,  9, 10,  9, 10,  9, 10,  9, 10,  9, 10,  9, 10, 10,  9, 10,
+     9, 10,  9, 10,  9, 10,  9, 10,  9, 10,  9, 10,  9, 10,  9, 10,
+    10,  9,  9, 10,  9, 10,  9,  9,  9, 10,  9, 10,  9, 10,  9, 10,
+     9, 10,  9, 10,  9, 10,  9, 10,  9, 10,  9, 10,  9, 10,  9, 10,
+     9, 10,  9, 10, 10, 10, 10, 10, 10, 10,  9,  9, 10,  9,  9, 10,
+    10,  9, 10,  9,  9,  9,  9, 10,  9, 10,  9, 10,  9, 10,  9, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 13, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 13, 13, 13, 13, 13, 13, 13,
+    10, 10,  0,  0,  0,  0, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    10, 10, 10, 10, 10,  0,  0,  0,  0,  0,  0,  0, 13,  0, 13,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+     9, 10,  9, 10, 13,  0,  9, 10,  0,  0, 10, 10, 10, 10,  0,  9,
+     0,  0,  0,  0,  0,  0,  9,  0,  9,  9,  9,  0,  9,  0,  9,  9,
+    10,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  0,  9,  9,  9,  9,  9,  9,  9,  9,  9, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,  9,
+    10, 10,  9,  9,  9, 10, 10, 10,  9, 10,  9, 10,  9, 10,  9, 10,
+     9, 10,  9, 10,  9, 10,  9, 10,  9, 10,  9, 10,  9, 10,  9, 10,
+    10, 10, 10, 10,  9, 10,  0,  9, 10,  9,  9, 10, 10,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+     9, 10,  0, 14, 14, 14, 14, 14, 14, 14,  9, 10,  9, 10,  9, 10,
+     9, 10,  9, 10,  9, 10,  9, 10,  9, 10,  9, 10,  9, 10,  9, 10,
+     9,  9, 10,  9, 10,  9, 10,  9, 10,  9, 10,  9, 10,  9, 10, 10,
+     9, 10,  9, 10,  9, 10,  9, 10,  9, 10,  9, 10,  9, 10,  9, 10,
+     9, 10,  9, 10,  9, 10,  9, 10,  9, 10,  9, 10,  9, 10,  9, 10,
+     0,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  0,  0, 13,  0,  0,  0,  6,  0,  0,
+    10, 10, 10, 10, 10, 10, 10, 10, 10,  4,  0,  0,  0,  0,  0,  0,
+     0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,  0, 14,
+     0, 14, 14,  0, 14, 14,  0, 14,  0,  0,  0,  0,  0,  0,  0,  0,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,  0,  0,  0,  0, 13,
+    13, 13, 13, 13,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    12, 12, 12, 12, 12, 12,  0,  0,  0,  0,  0,  0,  6,  6,  0,  0,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,  0, 12,  0,  4,  4,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  0,  8,  8,  0, 13, 13,
+    14, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13,  4, 13, 14, 14, 14, 14, 14, 14, 14, 12,  0, 14,
+    14, 14, 14, 14, 14, 13, 13, 14, 14,  0, 14, 14, 14, 14, 13, 13,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8, 13, 13, 13,  0,  0, 13,
+     4,  4,  4,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 12,
+    13, 14, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,  0,  0, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 13,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 13, 13,  0,  0,  6,  4, 13,  0,  0, 14,  0,  0,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 13, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 13, 14, 14, 14, 13, 14, 14, 14, 14, 14,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  4,  0,  4,  0,  0,  0,  4,  4,  0,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14,  0,  0,  0,  0,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13,  0, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 12, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 13, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    13, 14, 14, 14, 14, 14, 14, 14, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 14, 14,  4,  4,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     0, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 14, 14, 14,  0, 13, 13, 13, 13, 13, 13, 13, 13,  0,  0, 13,
+    13,  0,  0, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13,  0, 13, 13, 13, 13, 13, 13,
+    13,  0, 13,  0,  0,  0, 13, 13, 13, 13,  0,  0, 14, 13, 14, 14,
+    14, 14, 14, 14, 14,  0,  0, 14, 14,  0,  0, 14, 14, 14, 13,  0,
+     0,  0,  0,  0,  0,  0,  0, 14,  0,  0,  0,  0, 13, 13,  0, 13,
+    13, 13, 14, 14,  0,  0,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+    13, 13,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 13,  0, 14,  0,
+     0, 14, 14, 14,  0, 13, 13, 13, 13, 13, 13,  0,  0,  0,  0, 13,
+    13,  0,  0, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13,  0, 13, 13, 13, 13, 13, 13,
+    13,  0, 13, 13,  0, 13, 13,  0, 13, 13,  0,  0, 14,  0, 14, 14,
+    14, 14, 14,  0,  0,  0,  0, 14, 14,  0,  0, 14, 14, 14,  0,  0,
+     0, 14,  0,  0,  0,  0,  0,  0,  0, 13, 13, 13, 13,  0, 13,  0,
+     0,  0,  0,  0,  0,  0,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+    14, 14, 13, 13, 13, 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0, 14, 14, 14,  0, 13, 13, 13, 13, 13, 13, 13, 13, 13,  0, 13,
+    13, 13,  0, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13,  0, 13, 13, 13, 13, 13, 13,
+    13,  0, 13, 13,  0, 13, 13, 13, 13, 13,  0,  0, 14, 13, 14, 14,
+    14, 14, 14, 14, 14, 14,  0, 14, 14, 14,  0, 14, 14, 14,  0,  0,
+    13,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    13, 13, 14, 14,  0,  0,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     0,  0,  0,  0,  0,  0,  0,  0,  0, 13, 14, 14, 14, 14, 14, 14,
+     0, 14, 14, 14,  0, 13, 13, 13, 13, 13, 13, 13, 13,  0,  0, 13,
+    13,  0,  0, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    14, 14, 14, 14, 14,  0,  0, 14, 14,  0,  0, 14, 14, 14,  0,  0,
+     0,  0,  0,  0,  0, 14, 14, 14,  0,  0,  0,  0, 13, 13,  0, 13,
+    13, 13, 14, 14,  0,  0,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     0, 13,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0, 14, 13,  0, 13, 13, 13, 13, 13, 13,  0,  0,  0, 13, 13,
+    13,  0, 13, 13, 13, 13,  0,  0,  0, 13, 13,  0, 13,  0, 13, 13,
+     0,  0,  0, 13, 13,  0,  0,  0, 13, 13, 13,  0,  0,  0, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13,  0,  0,  0,  0, 14, 14,
+    14, 14, 14,  0,  0,  0, 14, 14, 14,  0, 14, 14, 14, 14,  0,  0,
+    13,  0,  0,  0,  0,  0,  0, 14,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    14, 14, 14, 14, 14, 13, 13, 13, 13, 13, 13, 13, 13,  0, 13, 13,
+    13,  0, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13,  0, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13,  0,  0,  0, 13, 14, 14,
+    14, 14, 14, 14, 14,  0, 14, 14, 14,  0, 14, 14, 14, 14,  0,  0,
+     0,  0,  0,  0,  0, 14, 14,  0, 13, 13, 13,  0,  0,  0,  0,  0,
+    13, 13, 14, 14,  0,  0,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    13, 14, 14, 14,  0, 13, 13, 13, 13, 13, 13, 13, 13,  0, 13, 13,
+    13,  0, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13,  0, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13,  0, 13, 13, 13, 13, 13,  0,  0, 14, 13, 14, 14,
+    14, 14, 14, 14, 14,  0, 14, 14, 14,  0, 14, 14, 14, 14,  0,  0,
+     0,  0,  0,  0,  0, 14, 14,  0,  0,  0,  0,  0,  0,  0, 13,  0,
+    13, 13, 14, 14,  0,  0,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     0, 13, 13,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    14, 14, 14, 14, 13, 13, 13, 13, 13, 13, 13, 13, 13,  0, 13, 13,
+    13,  0, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 13, 14, 14,
+    14, 14, 14, 14, 14,  0, 14, 14, 14,  0, 14, 14, 14, 14, 13,  0,
+     0,  0,  0,  0, 13, 13, 13, 14,  0,  0,  0,  0,  0,  0,  0, 13,
+    13, 13, 14, 14,  0,  0,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 13, 13, 13, 13, 13, 13,
+     0, 14, 14, 14,  0, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13,  0,  0,  0, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13,  0, 13, 13, 13, 13, 13, 13, 13, 13, 13,  0, 13,  0,  0,
+    13, 13, 13, 13, 13, 13, 13,  0,  0,  0, 14,  0,  0,  0,  0, 14,
+    14, 14, 14, 14, 14,  0, 14,  0, 14, 14, 14, 14, 14, 14, 14, 14,
+     0,  0,  0,  0,  0,  0,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     0,  0, 14, 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 14, 13, 13, 14, 14, 14, 14, 14, 14, 14,  0,  0,  0,  0,  0,
+    13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14,  0,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  0,  0,  0,  0,  0,  0,
+     0, 13, 13,  0, 13,  0, 13, 13, 13, 13, 13,  0, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13,  0, 13,  0, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 14, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 13,  0,  0,
+    13, 13, 13, 13, 13,  0, 13,  0, 14, 14, 14, 14, 14, 14,  0,  0,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  0,  0, 13, 13, 13, 13,
+    13,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0, 14, 14,  0,  0,  0,  0,  0,  0,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0, 14,  0, 14,  0, 14,  5,  5,  5,  5, 14, 14,
+    13, 13, 13, 13, 13, 13, 13, 13,  0, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,  0,  0,  0,
+     0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14,  0, 14, 14, 13, 13, 13, 13, 13, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14,  0, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,  0,  0,  0,
+     0,  0,  0,  0,  0,  0, 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 13,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  4,  4,  0,  0,  0,  0,
+    13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 13, 13, 13, 13, 14, 14,
+    14, 13, 14, 14, 14, 13, 13, 14, 14, 14, 14, 14, 14, 14, 13, 13,
+    13, 14, 14, 14, 14, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 13, 14,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8, 14, 14, 14, 14,  0,  0,
+     9,  9,  9,  9,  9,  9,  0,  9,  0,  0,  0,  0,  0,  9,  0,  0,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,  0, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13,  0, 13, 13, 13, 13,  0,  0,
+    13, 13, 13, 13, 13, 13, 13,  0, 13,  0, 13, 13, 13, 13,  0,  0,
+    13, 13, 13, 13, 13, 13, 13, 13, 13,  0, 13, 13, 13, 13,  0,  0,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13,  0, 13, 13, 13, 13,  0,  0, 13, 13, 13, 13, 13, 13, 13,  0,
+    13,  0, 13, 13, 13, 13,  0,  0, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13,  0, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13,  0, 13, 13, 13, 13,  0,  0, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,  0,  0, 14, 14, 14,
+     0,  0,  4,  0,  0,  0,  0,  4,  4,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  0,  0, 10, 10, 10, 10, 10, 10,  0,  0,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,  0,  4, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+     1, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,  5,  5,  0,  0,  0,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,  0,  0,  0, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13,  0,  0,  0,  0,  0,  0,  0,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,  0, 13, 13,
+    13, 13, 14, 14, 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 14, 14, 14,  4,  4,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 14, 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,  0, 13, 13,
+    13,  0, 14, 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14,  0,  0,  0, 13,  0,  0,  0,  0, 13, 14,  0,  0,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  6,  4,  0,  0,  0,  0,  6,  4,  0, 14, 14, 14, 12,  0,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  0,  0,  0,  0,  0,  0,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13,  0,  0,  0,  0,  0,  0,  0,
+    13, 13, 13, 13, 13, 14, 14, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 13,  0,  0,  0,  0,  0,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,  0,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,  0,  0,  0,  0,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,  0,  0,  0,  0,
+     0,  0,  0,  0,  4,  4,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,  0,  0,
+    13, 13, 13, 13, 13,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,  0,  0,  0,  0,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13,  0,  0,  0,  0,  0,  0,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  0,  0,  0,  0,  0,  0,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14,  0,  0,  0,  0,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,  0,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,  0,  0, 14,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  0,  0,  0,  0,  0,  0,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0, 13,  4,  4,  4,  4,  0,  0,  0,  0,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    14, 14, 14, 14, 14, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    14, 14, 14, 14, 14, 13, 13, 13, 13, 13, 13, 13,  0,  0,  0,  0,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  4,  4,  0,  0,  4,  4,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 14, 14, 14, 14, 14,
+    14, 14, 14, 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    14, 14, 14, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 13, 13,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14,  0,  0,  0,  4,  4,  0,  0,  0,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  0,  0,  0, 13, 13, 13,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,  4,  4,
+    10, 10, 10, 10, 10, 10, 10, 10, 10,  0,  0,  0,  0,  0,  0,  0,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,  0,  0, 13, 13, 13,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    14, 14, 14,  0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 13, 13, 13, 13, 14, 13, 13,
+    13, 13, 13, 13, 14, 13, 13, 14, 14, 14, 13,  0,  0,  0,  0,  0,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14,  0, 14, 14, 14, 14, 14,
+     9, 10,  9, 10,  9, 10,  9, 10,  9, 10,  9, 10,  9, 10,  9, 10,
+     9, 10,  9, 10,  9, 10, 10, 10, 10, 10, 10, 10, 10, 10,  9, 10,
+    10, 10, 10, 10, 10, 10, 10, 10,  9,  9,  9,  9,  9,  9,  9,  9,
+    10, 10, 10, 10, 10, 10,  0,  0,  9,  9,  9,  9,  9,  9,  0,  0,
+    10, 10, 10, 10, 10, 10, 10, 10,  9,  9,  9,  9,  9,  9,  9,  9,
+    10, 10, 10, 10, 10, 10, 10, 10,  9,  9,  9,  9,  9,  9,  9,  9,
+    10, 10, 10, 10, 10, 10,  0,  0,  9,  9,  9,  9,  9,  9,  0,  0,
+    10, 10, 10, 10, 10, 10, 10, 10,  0,  9,  0,  9,  0,  9,  0,  9,
+    10, 10, 10, 10, 10, 10, 10, 10,  9,  9,  9,  9,  9,  9,  9,  9,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,  0,  0,
+    10, 10, 10, 10, 10, 10, 10, 10,  9,  9,  9,  9,  9,  9,  9,  9,
+    10, 10, 10, 10, 10,  0, 10, 10,  9,  9,  9,  9,  9,  0, 10,  0,
+     0,  0, 10, 10, 10,  0, 10, 10,  9,  9,  9,  9,  9,  0,  0,  0,
+    10, 10, 10, 10,  0,  0, 10, 10,  9,  9,  9,  9,  0,  0,  0,  0,
+    10, 10, 10, 10, 10, 10, 10, 10,  9,  9,  9,  9,  9,  0,  0,  0,
+     0,  0, 10, 10, 10,  0, 10, 10,  9,  9,  9,  9,  9,  0,  0,  0,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1, 12, 14, 14, 12, 12,
+     0,  0,  0,  6,  6,  0,  0,  0,  5,  5,  5,  5,  5,  5,  5,  5,
+     0,  0,  0,  0,  7,  0,  0,  0, 11, 11, 12, 12, 12, 12, 12,  1,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  5,  5,  0,  4,  4,  0,  0,
+     0,  0,  0,  0,  0,  5,  5,  4,  4,  4,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,
+    12, 12, 12, 12, 12,  0, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+     0, 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  5,  5, 10,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  5,  5,  0,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  9,  0,  0,  0,  0,  9,  0,  0, 10,  9,  9,  9, 10, 10,
+     9,  9,  9, 10,  0,  9,  0,  0,  0,  9,  9,  9,  9,  9,  0,  0,
+     0,  0,  0,  0,  9,  0,  9,  0,  9,  0,  9,  9,  9,  9,  0, 10,
+     9,  9,  9,  9, 10, 13, 13, 13, 13, 10,  0,  0, 10, 10,  9,  9,
+     0,  0,  0,  0,  0,  9, 10, 10, 10, 10,  0,  0,  0,  0, 10,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    13, 13, 13,  9, 10, 13, 13, 13, 13,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  5,  5,  5,  5,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  5,  5,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  5,  5,  5,  5,  5,
+     5,  0,  0,  0,  0,  0,  0,  0,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  5,  5,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  5,  5,  5,  5,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  5,  5,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,  0,
+     9, 10,  9,  9,  9, 10, 10,  9, 10,  9, 10,  9, 10,  9,  9,  9,
+     9, 10,  9, 10, 10,  9, 10, 10, 10, 10, 10, 10, 10, 10,  9,  9,
+     9, 10,  9, 10, 10,  0,  0,  0,  0,  0,  0,  9, 10,  9, 10, 14,
+    14, 14,  9, 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    10, 10, 10, 10, 10, 10,  0, 10,  0,  0,  0,  0,  0, 10,  0,  0,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13,  0,  0,  0,  0,  0,  0,  0, 13,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 14,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    13, 13, 13, 13, 13, 13, 13,  0, 13, 13, 13, 13, 13, 13, 13,  0,
+    13, 13, 13, 13, 13, 13, 13,  0, 13, 13, 13, 13, 13, 13, 13,  0,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  5,  5,  0,  0,
+     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  0,  0,  0,  0,  4, 13,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  4,  0,  0,  0,
+     0,  0,  5,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     1,  6,  4,  0,  0, 13, 13, 13,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  0,  0,  5,  5,  5,  5,  5,  5,  5,  5,  0,  5,  5,  5,
+     0, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14,
+     0, 13, 13, 13, 13, 13,  0,  0, 13, 13, 13, 13, 13,  0,  0,  0,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13,  0,  0, 14, 14,  0,  0, 13, 13, 13,
+     0,  0,  0,  0,  0, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+     0, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,  0,  0,  0,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,  0,  4,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,  0,  4,  4,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8, 13, 13,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     9, 10,  9, 10,  9, 10,  9, 10,  9, 10,  9, 10,  9, 10, 13, 14,
+    14, 14, 14,  0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,  0, 13,
+     9, 10,  9, 10,  9, 10,  9, 10,  9, 10,  9, 10,  9, 10,  9, 10,
+     9, 10,  9, 10,  9, 10,  9, 10,  9, 10,  9, 10, 10, 10, 14, 14,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    14, 14,  0,  4,  0,  0,  0,  4,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+     0,  0,  9, 10,  9, 10,  9, 10,  9, 10,  9, 10,  9, 10,  9, 10,
+    10, 10,  9, 10,  9, 10,  9, 10,  9, 10,  9, 10,  9, 10,  9, 10,
+     9, 10,  9, 10,  9, 10,  9, 10,  9, 10,  9, 10,  9, 10,  9, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10,  9, 10,  9, 10,  9,  9, 10,
+     9, 10,  9, 10,  9, 10,  9, 10, 13,  0,  0,  9, 10,  9, 10, 13,
+     9, 10,  9, 10, 10, 10,  9, 10,  9, 10,  9, 10,  9, 10,  9, 10,
+     9, 10,  9, 10,  9, 10,  9, 10,  9, 10,  9,  9,  9,  9,  9, 10,
+     9,  9,  9,  9,  9, 10,  9, 10,  9, 10,  9, 10,  9, 10,  9, 10,
+     0,  0,  9, 10,  9,  9,  9,  9, 10,  9, 10,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  9, 10, 13, 10, 10, 10, 13, 13, 13, 13, 13,
+    13, 13, 14, 13, 13, 13, 14, 13, 13, 13, 13, 14, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 14, 14, 14, 14, 14,  0,  0,  0,  0, 14,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13,  0,  0,  4,  4,  0,  0,  0,  0,  0,  0,  0,  0,
+    14, 14, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    14, 14, 14, 14, 14, 14,  0,  0,  0,  0,  0,  0,  0,  0,  4,  4,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  0,  0,  0,  0,  0,  0,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 13, 13, 13, 13, 13, 13,  0,  0,  0, 13,  0, 13, 13, 14,
+    13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14,  0,  4,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14,  0,  0,  0,  0,  0,  0,  0,  4,  4,  0,  0,  0,  0,  0, 13,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  0,  0,  0,  0,  0,  0,
+    13, 13, 13, 13, 13, 14, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8, 13, 13, 13, 13, 13,  0,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    13, 13, 13, 14, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14,  0,  0,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  0,  0,  0,  4,  4,  4,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13,  0,  0,  0, 13, 14, 14, 14, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    14, 13, 14, 14, 14, 13, 13, 14, 14, 13, 13, 13, 13, 13, 14, 14,
+    13, 14, 13,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 13, 13, 13,  0,  0,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14,
+     4,  4, 13, 13, 13, 14, 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0, 13, 13, 13, 13, 13, 13,  0,  0, 13, 13, 13, 13, 13, 13,  0,
+     0, 13, 13, 13, 13, 13, 13,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    13, 13, 13, 13, 13, 13, 13,  0, 13, 13, 13, 13, 13, 13, 13,  0,
     10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
     10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,  0, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 13,  0,  0,  0,  0,  0,  0,
     10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14,  4, 14, 14,  0,  0,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  0,  0,  0,  0,  0,  0,
+    13, 13, 13, 13,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13,  0,  0,  0,  0, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,  0,  0,  0,  0,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,  0,  0,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13,  0,  0,  0,  0,  0,  0,
+    10, 10, 10, 10, 10, 10, 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0, 10, 10, 10, 10, 10,  0,  0,  0,  0,  0, 13, 14, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13,  0, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13,  0, 13, 13, 13, 13, 13,  0, 13,  0,
+    13, 13,  0, 13, 13,  0, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,  5,  5,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+     0,  0, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,  0,  0,  0,  0,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+     6,  6,  0,  6,  0,  0,  0,  5,  5,  0,  0,  0,  0,  0,  0,  0,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+     0,  6,  6,  0,  0,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+     5,  5,  5,  5,  5,  0,  0,  5,  5,  0,  0,  0,  0,  0,  0,  0,
+     6,  6,  7,  0,  0,  6,  4,  4,  6,  5,  5,  5,  5,  5,  5,  0,
+     0,  0,  0,  6,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    13, 13, 13, 13, 13,  0, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,  0,  0, 12,
+     0,  4,  0,  0,  0,  0,  0,  0,  5,  5,  0,  0,  6,  6,  7,  0,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  6,  0,  0,  0,  0,  4,
+     0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,  5,  0,  5,  0,  5,
+     5,  4,  5,  5,  6,  0, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14,
+     0,  0, 13, 13, 13, 13, 13, 13,  0,  0, 13, 13, 13, 13, 13, 13,
+     0,  0, 13, 13, 13, 13, 13, 13,  0,  0, 13, 13, 13,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0, 12, 12, 12,  0,  0,  0,  0,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,  0, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13,  0, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,  0, 13, 13,  0, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,  0,  0,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,  0,  0,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,  0,  0,  0,  0,  0,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 14,  0,  0,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,  0,  0,  0,  0,  0,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14,  0,  0,  0,  0,  0,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,  0,  0,
+    13, 13, 13, 13,  0,  0,  0,  0, 13, 13, 13, 13, 13, 13, 13, 13,
+     0, 13, 13, 13, 13, 13,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9, 10, 10, 10, 10, 10, 10, 10, 10,
     10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
     10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  0,  0,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  0,  0,  0,  0, 10, 10, 10, 10, 10, 10, 10, 10,
     10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,  0,  0,  0,  0,
+    13, 13, 13, 13, 13, 13, 13, 13,  0,  0,  0,  0,  0,  0,  0,  0,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    13, 13, 13, 13, 13, 13,  0,  0, 13,  0, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13,  0, 13, 13,  0,  0,  0, 13,  0,  0, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13,  0, 13, 13,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13,  0,  0,  0,  0,  0,  0, 13, 13,
+    13, 14, 14, 14,  0, 14, 14,  0,  0,  0,  0,  0, 14, 14, 14, 14,
+    13, 13, 13, 13,  0, 13, 13, 13,  0, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13,  0,  0, 14, 14, 14,  0,  0,  0,  0, 14,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  4,  4,  0,  0,  0,  0,  0,  0,  0,  0,
+    13, 13, 13, 13, 13, 14, 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    13, 13, 13, 13, 13, 13, 13, 13, 13,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
     10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    13, 13, 13, 13, 14, 14, 14, 14,  0,  0,  0,  0,  0,  0,  0,  0,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  0,  0,  0,  0,  0,  0,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13,  0, 14, 14,  0,  0,  0,
+    13, 13,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0, 13,  0,  0,  0,  0,  0,  0,  0,  0,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14,  0,  0,  0,  0,  4,  4,  4,  4,  4,  0,  0,  0,  0,  0,  0,
+    13, 13, 13, 13, 13,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14,  4,  4,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 14,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,  0,  0, 12,  4,  4,
+     4,  4,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 12,  0,  0,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13,  0,  0,  0,  0,  0,  0,  0,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  0,  0,  0,  0,  0,  0,
+    13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14,  0,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     0,  4,  4,  4, 13, 14, 14, 13,  0,  0,  0,  0,  0,  0,  0,  0,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 14,  0,  0, 13,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    14, 13, 13, 13, 13,  4,  4,  0,  0, 14, 14, 14, 14,  4, 14, 14,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8, 13,  0, 13,  0,  4,  4,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13,  0, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14,  4,  4,  0,  4,  4,  0, 14,  0,
+    13, 13, 13, 13, 13, 13, 13,  0, 13,  0, 13, 13, 13, 13,  0, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,  0, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13,  4,  0,  0,  0,  0,  0,  0,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,  0,  0,  0,  0,  0,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  0,  0,  0,  0,  0,  0,
+    14, 14, 14, 14,  0, 13, 13, 13, 13, 13, 13, 13, 13,  0,  0, 13,
+    13,  0,  0, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13,  0, 13, 13, 13, 13, 13, 13,
+    13,  0, 13, 13,  0, 13, 13, 13, 13, 13,  0, 14, 14, 13, 14, 14,
+    14, 14, 14, 14, 14,  0,  0, 14, 14,  0,  0, 14, 14, 14,  0,  0,
+    13,  0,  0,  0,  0,  0,  0, 14,  0,  0,  0,  0,  0, 13, 13, 13,
+    13, 13, 14, 14,  0,  0, 14, 14, 14, 14, 14, 14, 14,  0,  0,  0,
+    14, 14, 14, 14, 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 13, 13, 13, 13,  4,  4,  0,  0,  0,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  0,  0,  0,  0, 14, 13,
+    13, 13,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    14, 14, 14, 14, 13, 13,  0, 13,  0,  0,  0,  0,  0,  0,  0,  0,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  0,  0,  0,  0,  0,  0,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14,
+    14, 14, 14, 14, 14, 14,  0,  0, 14, 14, 14, 14, 14, 14, 14, 14,
+    14,  0,  4,  4,  0,  0,  0,  0,  0,  4,  4,  4,  4,  4,  4,  4,
+     4,  4,  4,  4,  4,  4,  4,  4, 13, 13, 13, 13, 14, 14,  0,  0,
+    14,  4,  4,  0, 13,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  0,  0,  0,  0,  0,  0,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 13,  0,  0,  0,  0,  0,  0,  0,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,  0,  0,  0,  0,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  0,  0,  4,  4,  4,  0,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,  0,  0,  0,  0,  0,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 13,
+    13, 13, 13, 13, 13, 13, 13,  0,  0, 13,  0,  0, 13, 13, 13, 13,
+    13, 13, 13, 13,  0, 13, 13,  0, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    14, 14, 14, 14, 14, 14,  0, 14, 14,  0,  0, 14, 14, 14, 14, 13,
+    14, 13, 14, 14,  4,  0,  4,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  0,  0,  0,  0,  0,  0,
+    13, 13, 13, 13, 13, 13, 13, 13,  0,  0, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 14, 14, 14, 14, 14, 14, 14,  0,  0, 14, 14, 14, 14, 14, 14,
+    14, 13,  0, 13, 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 13, 14, 14, 14, 14,  0,
+     0,  0,  4,  4,  0,  0,  0, 14,  0,  0,  0,  0,  0,  0,  0,  0,
+    13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14,  0,  4,  4, 13,  0,  0,
+    13, 13, 13, 13, 13, 13, 13, 13, 13,  0, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14,
+    14, 14, 14, 14, 14, 14, 14,  0, 14, 14, 14, 14, 14, 14, 14, 14,
+    13,  4,  4,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+     0,  0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14,  0, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    13, 13, 13, 13, 13, 13, 13,  0, 13, 13,  0, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 14, 14, 14, 14, 14, 14,  0,  0,  0, 14,  0, 14, 14,  0, 14,
+    14, 14, 14, 14, 14, 14, 13, 14,  0,  0,  0,  0,  0,  0,  0,  0,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  0,  0,  0,  0,  0,  0,
+    13, 13, 13, 13, 13, 13,  0, 13, 13,  0, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14,  0,
+    14, 14,  0, 14, 14, 14, 14, 14, 13,  0,  0,  0,  0,  0,  0,  0,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 14, 14, 14, 14,  4,  4,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    13,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,  0,
+    12, 12, 12, 12, 12, 12, 12, 12, 12,  0,  0,  0,  0,  0,  0,  0,
+    13, 13, 13, 13, 13, 13, 13,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  0,  0,  0,  0,  4,  4,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,  0,  0,
+    14, 14, 14, 14, 14,  4,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    14, 14, 14, 14, 14, 14, 14,  4,  4,  0,  0,  0,  0,  0,  0,  0,
+    13, 13, 13, 13,  4,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  0,  0,  0,  0,  0,  0,
+     0,  0,  0, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13,  0,  0,  0,  0,  0, 13, 13, 13,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  4,  0,  0,  0,  0,  0,  0,  0,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,  0,  0,  0,  0, 14,
+    13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14,  0,  0,  0,  0,  0,  0,  0, 14,
+    14, 14, 14, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13,  0, 13, 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    14, 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    13, 13, 13,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0, 13, 13, 13, 13,  0,  0,  0,  0,  0,  0,  0,  0,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,  0,  0,  0,  0,  0,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,  0,  0,  0,
+    13, 13, 13, 13, 13, 13, 13, 13, 13,  0,  0,  0,  0,  0,  0,  0,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13,  0,  0,  0, 14, 14,  4,
+    12, 12, 12, 12,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0, 14, 14, 14, 14, 14,  0,  0,  0, 14, 14, 14,
+    14, 14, 14, 12, 12, 12, 12, 12, 12, 12, 12, 14, 14, 14, 14, 14,
+    14, 14, 14,  0,  0, 14, 14, 14, 14, 14, 14, 14,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 14, 14, 14, 14,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0, 14, 14, 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9, 10, 10, 10, 10, 10, 10,
     10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9, 10, 10,
+    10, 10, 10, 10, 10,  0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,  9,  0,  9,  9,
+     0,  0,  9,  0,  0,  9,  9,  0,  0,  9,  9,  9,  9,  0,  9,  9,
+     9,  9,  9,  9,  9,  9, 10, 10, 10, 10,  0, 10,  0, 10, 10, 10,
+    10, 10, 10, 10,  0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9, 10, 10, 10, 10, 10, 10,
     10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10,  9,  9,  0,  9,  9,  9,  9,  0,  0,  9,  9,  9,
+     9,  9,  9,  9,  9,  0,  9,  9,  9,  9,  9,  9,  9,  0, 10, 10,
     10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
-    16, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
-     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8, 17,
-     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8, 17,
-};
-
-static RE_UINT8 re_east_asian_width_stage_2[] = {
-     0,  1,  2,  3,  4,  5,  6,  7,  8,  9,  9,  9,  9,  9,  9,  9,
+    10, 10, 10, 10, 10, 10, 10, 10,  9,  9,  0,  9,  9,  9,  9,  0,
+     9,  9,  9,  9,  9,  0,  9,  0,  0,  0,  9,  9,  9,  9,  9,  9,
+     9,  0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,  9,  9,  9,  9,
      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
-     9,  9, 10,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+     9,  9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,  9,  9,  9,  9,
      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
-    11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26,
-     9,  9,  9, 27,  9,  9, 28,  9,  9,  9,  9,  9,  9, 29, 30, 31,
-    32, 33, 34, 35, 36, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30,
-    30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30,
-    30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30,
-    30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 37, 30, 30, 30, 30,
-    30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30,
-    30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30,
-    30, 30, 30, 30, 30, 30, 30, 30, 30, 38,  9,  9,  9,  9,  9,  9,
-     9,  9, 39,  9,  9,  9,  9,  9, 30, 30, 30, 30, 30, 30, 30, 30,
-    30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 40,
+     9,  9,  9,  9,  9,  9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
-    41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41,
-    41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41,
-    41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41,
-    41, 41, 30, 30, 30, 30,  9,  9,  9,  9,  9,  9, 42,  9, 43, 44,
+    10, 10, 10, 10, 10, 10,  0,  0,  9,  9,  9,  9,  9,  9,  9,  9,
      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,  0, 10, 10, 10, 10,
+    10, 10,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10,  0, 10, 10, 10, 10, 10, 10,  9,  9,  9,  9,
      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,  0,
+    10, 10, 10, 10, 10, 10,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+    10, 10, 10, 10, 10, 10, 10, 10, 10,  0, 10, 10, 10, 10, 10, 10,
      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
-     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9, 45,
-    30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 46,
-    30, 30, 30, 30, 30, 47,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
-    30, 30, 48, 30, 30, 49,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  0, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10,  0, 10, 10, 10, 10, 10, 10,  9, 10,  0,  0,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14,  0,  0,  0,  0, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,  0,  0,  0,
+     0,  0,  0,  0,  0, 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0, 14,  0,  0,  0,  4,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 14, 14, 14, 14, 14,
+     0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    14, 14, 14, 14, 14, 14, 14,  0, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14,  0,  0, 14, 14, 14, 14, 14,
+    14, 14,  0, 14, 14,  0, 14, 14, 14, 14, 14,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,  0,  0,  0,
+    14, 14, 14, 14, 14, 14, 14, 13, 13, 13, 13, 13, 13, 13,  0,  0,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  0,  0,  0,  0, 13,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  0,  0,  0,  0,  0,  0,
+    13, 13, 13, 13, 13,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    14, 14, 14, 14, 14, 14, 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     9,  9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 14, 14, 14, 14, 14, 14, 14, 13,  0,  0,  0,  0,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  0,  0,  0,  0,  0,  0,
+    13, 13, 13, 13,  0, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+     0, 13, 13,  0, 13,  0,  0, 13,  0, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13,  0, 13, 13, 13, 13,  0, 13,  0, 13,  0,  0,  0,  0,
+     0,  0, 13,  0,  0,  0,  0, 13,  0, 13,  0, 13,  0, 13, 13, 13,
+     0, 13, 13,  0, 13,  0,  0, 13,  0, 13,  0, 13,  0, 13,  0, 13,
+     0, 13, 13,  0, 13,  0,  0, 13, 13, 13, 13,  0, 13, 13, 13, 13,
+    13, 13, 13,  0, 13, 13, 13, 13,  0, 13, 13, 13, 13,  0, 13,  0,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13,  0, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,  0,  0,  0,  0,
+     0, 13, 13, 13,  0, 13, 13, 13, 13, 13,  0, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
-    50, 51, 52, 53, 54,  9, 55, 56, 57, 58, 59, 60, 61, 62,  9, 63,
-     9,  9, 64, 65, 66, 67,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
-    30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30,
-    30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 68,
-     9,  9, 41,  6,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,  0,  0,
      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
-    41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41,
-    41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 69,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  5,  5,  5,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  0,  0,  0,  0,  0,  0,
+    13, 13,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0, 12,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0
+};
+
+RE_UINT32 re_get_sentence_break(RE_UINT32 codepoint) {
+    RE_UINT32 field_2;
+    RE_UINT32 field_1;
+    RE_UINT32 field_0;
+    RE_UINT32 v;
+
+    field_2 = codepoint >> 10;
+    field_1 = (codepoint >> 5) & 0x1F;
+    field_0 = codepoint & 0x1F;
+
+    v = re_sentence_break_table_1[field_2];
+    v = re_sentence_break_table_2[(v << 5) | field_1];
+    v = re_sentence_break_table_3[(v << 5) | field_0];
+
+    return v;
+}
+
+/* Sentence_Terminal. */
+static RE_UINT8 re_sentence_terminal_table_1[] = {
+     0,  1,  2,  3,  4,  5,  6,  7,  8,  3,  3,  9, 10,  3,  3,  3,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+     3,  3,  3,  3,  3,  3,  3,  3,  3, 11, 12,  3,  3,  3,  3,  3,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3, 13,
+     3,  3, 14, 15, 16, 17, 18, 19,  3,  3,  3,  3,  3,  3,  3,  3,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  3, 20, 21,  3,  3,  3,  3,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3, 22,
+     3,  3,  3,  3,  3,  3, 23,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3
 };
 
-static RE_UINT8 re_east_asian_width_stage_3[] = {
-      0,   0,   0,   0,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   2,
-      0,   0,   0,   0,   3,   4,   5,   6,   7,   0,   8,   9,  10,  11,  12,  13,
-     14,   0,  15,  16,  17,  16,  18,   8,  19,  20,  21,   0,  17,  16,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   7,  22,  23,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  14,   0,  14,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,  24,  25,  26,  27,   0,   0,   0,   0,
-     28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,   0,   0,
-      0,   0,  29,  28,  30,  31,  29,  28,  30,  31,   0,   0,   0,   0,   0,   0,
-     14,   0,  28,  28,  28,  28,  28,  28,  28,  28,  14,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,   0,   0,   0,   0,
-      0,   0,  33,  34,   6,   0,  35,  36,   0,   0,   0,   0,   0,   0,  37,  38,
-     39,   0,   0,   0,   0,  40,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     41,  14,  36,   0,  42,  16,   0,   0,   0,   0,  43,  44,  28,  45,  28,  31,
-      0,  14,  28,  31,   0,   0,   0,  31,   0,   0,  46,   0,  38,   0,   0,   0,
-     12,  47,  48,  49,  50,  51,  52,  53,   0,  54,  55,   0,  56,  57,   0,   0,
-     57,   0,  58,  14,  58,   0,   0,  38,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,  55,  59,   0,  60,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  61,  62,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  28,  28,  28,  28,
-     28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  30,  28,  28,
-     28,  28,  28,  28,  28,  28,  28,  28,  28,  45,  28,  28,  28,  28,  45,   0,
-     28,  28,  63,   0,  30,  31,  57,  53,  64,  65,  31,   0,  63,  38,   0,  66,
-     67,  68,  69,  70,   0,   0,   0,   0,  71,  32,  72,   0,  73,  74,   0,  75,
-      0,   0,  76,  17,  77,  59,   0,  78,  79,  80,  81,  28,  82,  83,  84,  85,
-     86,  59,   0,   0,   0,  87,   0,  58,   0,  88,  89,   0,   0,   0,  17,  28,
-      0,   0,  90,   0,   0,   0,  87,  75,   0,   0,   0,   0,  91,  92,   0,   0,
-     93,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,  94,   0,   0,   0,   0,   0,   0,  95,  31,   0,   0,   0,   0,
-     32,  32,  32,  96,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  72,   0,
-     32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,
-     32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  97,   0,   0,   0,  32,  72,
-     98,  32,  32,  32,  32,  32,  32,  99, 100,  32,  32,  32,  32,  32,  32,  32,
-     32,  32,  99, 100,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,
-     90,  32,  32,  32,  32,  32, 100,  32,  32,  32,  32,  32,  32,  32,  32,  32,
-     32,  99,  32,  32,  32,  32,  32, 101,  32,  32,  32,  32,  72,   0,  32,  32,
-     32,  32,  32,  99,  32,  32,  32,  32,  32,  28,  32,  32,  32,  32,  32,  32,
-     32,  32,  32,  32,  32,  32,  32,  32,   0,   0,   0,   0,   0,   0,   0,   0,
-     32, 102,  32,  32,  32,  32,  32,  32,  99,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  32,  32,  32, 102,
-     32,  32,  32,  32,  72,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,
-     28,  28,  32, 103,   0,   0,  32,  32,  32,  32, 104,  32,  99,  72,   0,   0,
-    105, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 107, 108, 108, 108,
-    108, 108, 108, 108, 108, 108, 108, 109, 110, 110, 110, 111, 112, 109,   0,  58,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  72,   0,   0,   0,
-     32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,   0,
-     32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32, 101,   0,
-     32,  32,  32,  99,   0,   0,   0,   0,   0,   0, 101,   0, 113,   0,  32,  32,
-     32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  72,
-    114,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,  75,   0,   0,   0,   0,   0,   0,
-     28, 115,  28,  28,  28, 116,  28,  28,  28,  28,  28,  28,  28,  31,  28,  28,
-     28,  80, 117, 118,  28, 119,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-    101,   0,  32,  32,  32,  32,  32,  72,  32,  87, 103,   0,  97,   0,   0,   0,
-     32,  32,  32,  32,  87,  90, 120,  32,  32,  32,  32,  32,  32,  32,  32, 121,
-     32,  32,  72,   0,  32,  32,  32,  32,  32, 122,  72,   0,  32,  32, 123,  32,
-     32,  32,  32,  32,  32,  32,  32,  99, 124,  32,  32,  32,  32,  32,  32,  32,
-     32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32, 125,
-     32,  32,  32,  32,  32,  32,  32,  97,   0, 126,  32,  32,  32,   0,   0, 127,
-      0,   0,  66,   0, 114,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 128,
-     32,  32,  32,  32,  32,  32,  32,  32,  32,  32,   0,   0,   0,   0,   0,   0,
-     32,  32,  32,  32,  32,  32,  32,  32,  97, 114, 129,   0,   0,  94, 113, 101,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  32,  72,   0,   0,
-      0,  90,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32, 130, 131,
-     32,  32,  32,  32, 132, 133,  32,  32,  32, 132,  32,  32,  32,  32,  32,  32,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  72, 101,
-    101,   0,  97,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  97,
-     28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,  28, 116,
+static RE_UINT8 re_sentence_terminal_table_2[] = {
+     0,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  2,  0,  0,  0,
+     3,  0,  0,  0,  0,  0,  4,  0,  5,  0,  0,  0,  0,  0,  0,  6,
+     0,  7,  0,  0,  0,  0,  0,  0,  0,  0,  0,  8,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 10,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0, 11,  0,  0,  0,  0,  0, 12,  0,  0,  0,  0,  0,  0,
+    13,  0,  0,  0,  0,  0,  0,  0,  0,  0,  8,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0, 14,  0,  0,  0,  0, 15,  0,  0,  0,  0,  0,
+     0, 16,  0,  3,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0, 17, 18,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0, 19,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    20,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0, 21,  0,  0,  0,  0,  0,  0,  0,  0,
+    22,  0,  0,  0,  0,  0,  0, 23,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0, 24,  0,  0, 22,  0,  0, 25,  0,  0,  0,  0, 26,  0,
+     0,  0, 27,  0,  0,  0,  0, 28,  0,  0,  0,  0,  0,  0,  0, 29,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0, 30,  0,  0,  0,  0,  0,  1,  0,  0, 31,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0, 24,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 32,  0,  0,  0,  0,  0,
+     0,  0, 33,  0,  0,  3, 34,  0,  0,  0, 35,  0,  0,  0, 36,  0,
+     0, 37,  0,  0,  0,  2,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0, 38,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 39,  0,
+     0,  0, 40,  0,  0,  0,  0,  0,  0, 41,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 42,  0,  0,  0,  0,  0,
+     0,  0, 43,  0, 16,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0, 40,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0, 44,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0, 22,  0,  0,  0, 45,  0, 44, 46,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0, 47,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0, 21,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0, 48,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0
 };
 
-static RE_UINT8 re_east_asian_width_stage_4[] = {
-    0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5,
-    5, 5, 5, 5, 5, 5, 5, 0, 0, 1, 5, 5, 1, 5, 5, 1,
-    1, 0, 1, 0, 5, 1, 1, 5, 1, 1, 1, 1, 1, 0, 1, 1,
-    1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0,
-    1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1,
-    1, 1, 0, 0, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 0, 0,
-    1, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 1, 0, 1, 0,
-    0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0,
-    0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1,
-    0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 1, 0, 0, 0,
-    1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0,
-    1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0,
-    0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1, 0, 0,
-    1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 0, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0,
-    3, 3, 3, 3, 3, 3, 3, 3, 1, 0, 0, 1, 1, 1, 1, 0,
-    1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0,
-    0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0,
-    0, 2, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0,
-    0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0,
-    0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0,
-    0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1,
-    0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1,
-    1, 0, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0,
-    0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0,
-    1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0,
-    1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1,
-    0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 3, 3, 0, 0, 0, 0,
-    0, 3, 3, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 0, 0, 0,
-    3, 0, 0, 3, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0,
-    1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 1, 1,
-    0, 0, 0, 0, 0, 3, 3, 0, 0, 0, 0, 0, 0, 1, 1, 0,
-    0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 3, 3, 0, 0,
-    0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0,
-    3, 3, 3, 3, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 0, 1,
-    1, 1, 1, 0, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 3,
-    0, 0, 0, 3, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 3, 3, 1, 0, 0, 0, 0, 3, 3, 1, 1,
-    1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 3, 1, 1, 1,
-    1, 1, 0, 1, 0, 0, 0, 0, 1, 1, 3, 1, 1, 1, 1, 1,
-    1, 1, 3, 3, 1, 3, 1, 1, 1, 1, 3, 1, 1, 3, 1, 1,
-    0, 0, 0, 0, 0, 3, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 3, 0, 3, 0, 0, 0, 0, 3, 3, 3, 0, 3,
-    0, 0, 0, 0, 0, 3, 3, 3, 0, 0, 0, 0, 0, 0, 5, 5,
-    5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 5, 5, 0,
-    0, 0, 0, 3, 3, 0, 0, 0, 3, 0, 0, 0, 0, 3, 1, 1,
-    3, 3, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0,
-    4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0,
-    0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0,
-    3, 3, 3, 3, 3, 0, 0, 0, 3, 3, 0, 0, 0, 0, 0, 0,
-    3, 3, 3, 0, 3, 3, 3, 3, 0, 4, 4, 4, 4, 4, 4, 4,
-    4, 4, 4, 4, 4, 4, 4, 4, 4, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0,
-    0, 0, 2, 2, 2, 2, 2, 2, 0, 0, 2, 2, 2, 0, 0, 0,
-    4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 3, 3, 3, 3,
-    0, 0, 0, 0, 3, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0,
-    1, 1, 1, 1, 1, 1, 0, 0, 1, 3, 3, 3, 3, 3, 3, 3,
-    3, 3, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0,
-    3, 3, 3, 3, 3, 3, 0, 3, 3, 3, 3, 3, 3, 0, 3, 3,
-    3, 3, 3, 0, 0, 0, 0, 3, 3, 0, 0, 0, 3, 0, 0, 0,
-    3, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 3,
-    0, 0, 0, 3, 3, 3, 3, 0, 0, 0, 3, 0, 0, 0, 0, 0,
-    0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 3, 0, 0,
-    3, 3, 0, 3, 3, 3, 3, 0, 0, 0, 3, 3, 3, 3, 3, 3,
-    3, 3, 3, 0, 0, 3, 3, 3, 3, 3, 3, 0, 0, 0, 3, 3,
+static RE_UINT8 re_sentence_terminal_table_3[] = {
+      0,   0,   0,   0,   2,  64,   0, 128,   0,   2,   0,   0,   0,   0,   0, 192,
+      0,   0,  16,   0,   7,   0,   0,   0,   0,   0,   0,   2,   0,   0, 128,  98,
+     48,   0,   0,   0,   0,  12,   0,   0, 132,   1,   0,   0,   0,  64,   0,   0,
+      0,   0,  96,   0,   8,   2,   0,   0,   0,  15,   0,   0,   0,   0,   0, 204,
+      0,   0,   0,  24,   0,   0,   0,  48, 128,   3,   0,   0,   0,  64,   0,  16,
+      4,   0,   0,   0,   0,   0,   0, 128,   0, 192,   0,   0,   0,   0, 136,   0,
+      0,   0, 192,   0,   0, 128,   0,   0,   0,   3,   0,   0,   0,   0,   0, 224,
+      0,   0,   3,   0,   0,   8,   0,   0,   0,   0, 196,   0,   2,   0,   0,   0,
+      0,   0, 224,   3, 128,   1,   0,   0,   3,   0,   0,   0,  14,   0,   0,   0,
+     96,  32,   0, 192,   0,   0,   0,  27,   0,  24,   0,   0,  12, 254, 255,   0,
+      6,   0,   0,   0,   0,   0,   0, 112,  80,   0,   0,   0,  12,   0,   0,   0,
+      0,   0, 128,   1,   0,   0,  32,   0,  16,   0,   0,   0,   0,   0,   0,   1,
+      0,   1,   0,   0
 };
 
-/* East_Asian_Width: 3040 bytes. */
-
-RE_UINT32 re_get_east_asian_width(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-
-    f = ch >> 12;
-    code = ch ^ (f << 12);
-    pos = (RE_UINT32)re_east_asian_width_stage_1[f] << 5;
-    f = code >> 7;
-    code ^= f << 7;
-    pos = (RE_UINT32)re_east_asian_width_stage_2[pos + f] << 4;
-    f = code >> 3;
-    code ^= f << 3;
-    pos = (RE_UINT32)re_east_asian_width_stage_3[pos + f] << 3;
-    value = re_east_asian_width_stage_4[pos + code];
-
-    return value;
-}
+RE_UINT32 re_get_sentence_terminal(RE_UINT32 codepoint) {
+    RE_UINT32 field_2;
+    RE_UINT32 field_1;
+    RE_UINT32 field_0;
+    RE_UINT32 offset;
+    RE_UINT32 v;
 
-/* Joining_Group. */
+    field_2 = codepoint >> 10;
+    field_1 = (codepoint >> 5) & 0x1F;
+    field_0 = (codepoint >> 3) & 0x3;
+    offset = codepoint & 0x7;
 
-static RE_UINT8 re_joining_group_stage_1[] = {
-    0, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1,
-};
+    v = re_sentence_terminal_table_1[field_2];
+    v = re_sentence_terminal_table_2[(v << 5) | field_1];
+    v = re_sentence_terminal_table_3[(v << 2) | field_0];
 
-static RE_UINT8 re_joining_group_stage_2[] = {
-    0, 0, 0, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 3, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    return (v >> offset) & 0x1;
+}
+
+/* Soft_Dotted. */
+static RE_UINT8 re_soft_dotted_table_1[] = {
+    0, 1, 2, 2, 2, 2, 2, 3, 4, 2, 2, 5, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 6, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2
 };
 
-static RE_UINT8 re_joining_group_stage_3[] = {
+static RE_UINT8 re_soft_dotted_table_2[] = {
+     0,  0,  0,  1,  0,  0,  0,  0,  0,  2,  0,  0,  0,  0,  0,  0,
+     0,  0,  3,  4,  5,  6,  0,  0,  0,  0,  0,  0,  0,  0,  0,  7,
+     0,  0,  8,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  1,  2,  3,  0,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13,
-     0, 14, 15,  0, 16, 17, 18, 19,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0, 20,  0,  0,  0, 21, 22,  0,  0,  0,  0,
      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 23, 24, 25,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  9, 10, 11,  0,  0,
+     0, 12,  0,  0,  0,  0, 13,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0, 14,  0,  0,  0,  0,  0,  0, 15,  0,  0,  0,  0,  0,
      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0, 16,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    26, 27, 28,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-};
-
-static RE_UINT8 re_joining_group_stage_4[] = {
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     45,   0,   3,   3,  43,   3,  45,   3,   4,  41,   4,   4,  13,  13,  13,   6,
-      6,  31,  31,  35,  35,  33,  33,  39,  39,   1,   1,  11,  11,  55,  55,  55,
-      0,   9,  29,  19,  22,  24,  26,  16,  43,  45,  45,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   4,  29,
-      0,   3,   3,   3,   0,   3,  43,  43,  45,   4,   4,   4,   4,   4,   4,   4,
-      4,  13,  13,  13,  13,  13,  13,  13,   6,   6,   6,   6,   6,   6,   6,   6,
-      6,  31,  31,  31,  31,  31,  31,  31,  31,  31,  35,  35,  35,  33,  33,  39,
-      1,   9,   9,   9,   9,   9,   9,  29,  29,  11,  38,  11,  19,  19,  19,  11,
-     11,  11,  11,  11,  11,  22,  22,  22,  22,  26,  26,  26,  26,  56,  21,  13,
-     41,  17,  17,  14,  43,  43,  43,  43,  43,  43,  43,  43,  55,  47,  55,  43,
-     45,  45,  46,  46,   0,  41,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   6,  31,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  35,  33,   1,   0,   0,  21,
-      2,   0,   5,  12,  12,   7,   7,  15,  44,  50,  18,  42,  42,  48,  49,  20,
-     23,  25,  27,  36,  10,   8,  28,  32,  34,  30,   7,  37,  40,   5,  12,   7,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  51,  52,  53,
-      4,   4,   4,   4,   4,   4,   4,  13,  13,   6,   6,  31,  35,   1,   1,   1,
-      9,   9,  11,  11,  11,  24,  24,  26,  26,  26,  22,  31,  31,  35,  13,  13,
-     35,  31,  13,   3,   3,  55,  55,  45,  43,  43,  54,  54,  13,  35,  35,  19,
-     89,  90,  91,  92,  93,  94,  95,  96,  97,  98,  99,   0,   0,   0,   0,   0,
-      4,   4,  13,  39,   9,  29,  22,  24,  45,  45,  31,  43,  57,   0,   6,  33,
-     11,  58,  31,   1,  19,   0,   4,   4,   4,  31,  45,  86,  87,  88,   0,   0,
-     59,  61,  61,  65,  65,  62,   0,  83,   0,  85,  85,   0,   0,  66,  80,  84,
-     68,  68,  68,  69,  63,  81,  70,  71,  77,  60,  60,  73,  73,  76,  74,  74,
-     74,  75,   0,   0,  78,   0,   0,   0,   0,   0,   0,  72,  64,  79,  82,  67,
-      0,   0, 100,   0,   0,   0,   0,   0,   0, 100,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0, 101,   0,   0, 100,   0, 101,   0,
-    101,   0,   0, 101,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     0, 17, 18,  0, 19, 20,  0, 21,  0, 22, 23,  0, 24,  0, 17, 18,
+     0, 19, 20,  0, 21,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0
 };
 
-/* Joining_Group: 788 bytes. */
-
-RE_UINT32 re_get_joining_group(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-
-    f = ch >> 14;
-    code = ch ^ (f << 14);
-    pos = (RE_UINT32)re_joining_group_stage_1[f] << 5;
-    f = code >> 9;
-    code ^= f << 9;
-    pos = (RE_UINT32)re_joining_group_stage_2[pos + f] << 5;
-    f = code >> 4;
-    code ^= f << 4;
-    pos = (RE_UINT32)re_joining_group_stage_3[pos + f] << 4;
-    value = re_joining_group_stage_4[pos + code];
-
-    return value;
-}
-
-/* Joining_Type. */
-
-static RE_UINT8 re_joining_type_stage_1[] = {
-     0,  1,  2,  3,  4,  4,  4,  4,  4,  4,  5,  4,  4,  4,  4,  6,
-     7,  8,  4,  9,  4,  4, 10,  4,  4,  4,  4, 11,  4, 12, 13,  4,
-     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
-     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
-     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
-     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
-     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
-     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
-     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
-     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
-     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
-     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
-     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
-     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
-    14,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
-     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
-     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
+static RE_UINT8 re_soft_dotted_table_3[] = {
+      0,   0,   0,   0,   0,   6,   0,   0,   0, 128,   0,   0,   0,   2,   0,   0,
+      0,   1,   0,   0,   0,   0,   0,  32,   0,   0,   4,   0,   0,   0,   8,   0,
+      0,   0,  64,   1,   4,   0,   0,   0,   0,   0,  64,   0,  16,   1,   0,   0,
+      0,  32,   0,   0,   0,   8,   0,   0,   0,   0,   2,   0,   0,   3,   0,   0,
+      0,   0,   0,  16,  12,   0,   0,   0,   0,   0, 192,   0,   0,  12,   0,   0,
+      0,   0,   0, 192,   0,   0,  12,   0, 192,   0,   0,   0,   0,   0,   0,  12,
+      0, 192,   0,   0
 };
 
-static RE_UINT8 re_joining_type_stage_2[] = {
-      0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   3,   0,   0,
-      0,   0,   4,   0,   0,   0,   5,   6,   7,   8,   9,  10,  11,  12,  13,  14,
-     15,  16,  17,  18,  19,  20,  21,  22,  23,  24,  23,  25,  26,  27,  28,  29,
-     30,  31,  26,  32,  33,  34,   0,  35,  36,  37,  38,  39,  40,  41,  42,  43,
-     44,  45,  46,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  47,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  48,  49,  50,  51,
-     52,  53,  54,   0,  55,   0,   0,   0,  56,  57,  58,   0,  59,  60,  61,  62,
-     63,   0,   0,  64,   0,   0,   0,  65,   0,   0,   0,   0,   0,   0,   0,   0,
-     66,  67,   0,  68,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,  69,   0,  70,   0,  71,   0,   0,   0,   0,   0,   0,   0,   0,
-     72,   0,  73,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,  74,  75,  76,   0,   0,   0,   0,
-     77,  78,   0,  79,  80,  81,  82,  83,  84,  85,  86,  87,   0,   0,   0,  88,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  89,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,  90,   0,   0,  70,   0,   0,   0,  91,
-      0,   0,   0,   0,   0,   0,   0,  92,   0,   0,   0,  93,   0,  94,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,  95,   0,   0,  96,   0,   0,  97,   0,
-      0,   0,   0,   0,  98,   0,   0,   0,   0,   0,   0,   0,  99, 100,   0,   0,
-    101, 102, 103,   0, 104, 105, 106, 107, 108,   0,   0, 109,  33, 110,   0,   0,
-    111, 112, 113, 114,   0,   0, 115, 116, 117, 118, 119,   0, 120,   0,   0,   0,
-    121,   0,   0,   0,   0,   0,   0, 122, 123, 124, 125,   0,   0,   0,   0,   0,
-    126,   0, 127,   0, 128, 129, 130,   0,   0,   0,   0, 131,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-    132,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 133, 134,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 135, 136,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0, 137,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0, 138, 139,   0,   0, 140,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0, 141, 142, 143,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-    144,   0,   0,   0, 134,   0,   0,   0,   0,   0,   0, 145,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0, 146, 147, 148,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-    149,   2,   0,   0,   2,   2,   2,   3,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-};
+RE_UINT32 re_get_soft_dotted(RE_UINT32 codepoint) {
+    RE_UINT32 field_2;
+    RE_UINT32 field_1;
+    RE_UINT32 field_0;
+    RE_UINT32 offset;
+    RE_UINT32 v;
 
-static RE_UINT8 re_joining_type_stage_3[] = {
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,
-      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   0,   0,
-      3,   4,   0,   0,   0,   0,   0,   0,   0,   0,   5,   2,   2,   2,   2,   6,
-      7,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   8,   9,  10,  11,  12,
-     13,  14,   2,   2,   0,  15,  16,  12,  12,  17,  17,  18,  12,  12,  12,  12,
-     19,  20,  21,  22,  22,  23,   0,  24,   0,  25,  26,  27,  12,  28,   2,   2,
-      2,  29,  12,  30,  12,  31,  32,  18,   0,   0,   0,   0,  33,   2,  34,   0,
-      0,  35,  12,  12,  12,  36,  37,  38,   0,   0,  33,  39,  40,  41,   0,   0,
-     42,  43,  44,  45,  46,  47,   0,   0,   0,   0,   0,   0,  12,  48,  49,  50,
-      0,   0,   3,   2,  39,   2,   2,   2,  51,   0,   0,   0,   0,   0,   0,  52,
-      5,  53,   5,   0,  54,   0,   0,   0,  55,   0,   0,   0,   0,   0,   0,  56,
-     57,   1,   0,   0,  54,   0,   0,  58,  59,   0,   0,   0,   0,   0,   0,  56,
-     60,  61,  55,   0,   0,   0,  62,   0,  63,  53,   0,   0,  54,   0,   0,  64,
-     55,   0,   0,   0,   0,   0,   0,  65,  57,   1,  58,   0,  54,   0,   0,   0,
-     66,   0,   0,   0,   0,   0,   0,   0,  34,   1,   0,   0,   0,   0,   0,   0,
-     67,   0,   0,   0,   0,   0,   0,  33,  68,  69,  70,   0,  54,   0,   0,   0,
-     58,  71,   0,   0,  54,   0,   0,   0,   4,   0,   0,   0,   0,   0,   0,  72,
-     57,   1,   0,   0,  54,   0,   0,   0,   0,  66,  73,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,  74,  51,  25,  75,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,  74,  76,   0,  77,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   4,   0,   0,  78,  55,   0,   0,   0,   0,   0,   0,   5,  75,
-     79,  80,   2,   5,   2,   2,   2,  76,  58,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,  80,  81,  82,   0,   0,   0,  83,  34,   0,  57,   0,
-     84,   1,   0,   1,   0,   0,   0,   0,   0,   0,   0,  80,   0,   0,   0,   0,
-      0,   0,  85,   0,   0,   0,  85,   0,   0,   0,  54,   0,   0,   0,  54,   0,
-      0,   0,   0,   0,   0,   0,  86,  77,  58,   5,  37,   1,   0,   0,   0,   0,
-     87,  88,   0,   0,  12,  12,  12,  12,  12,  12,  12,  12,  12,  12,  12,  89,
-     90,  12,  12,  12,  12,  91,   0,   0,   0,   0,   0,   0,  92,  34,  66,  45,
-      0,   0,  25,  93,   0,   0,   0,   0,   0,   0,  58,  75,  94,  76,   3,  22,
-      0,   0,   0,   0,   0,   0,   2,  75,  37,   0,   0,   0,   0,   0,  95,   8,
-     66,   0,   0,   0,   0,   3,  37,   0,   4,   0,   0,   0,  96,  97,   0,   0,
-      0,   0,   0,   0,  58,  98,   4,   0,   0,   0,   0,   0,   0,  99, 100,   0,
-      0,   0, 101,   2,  81,  53,  56,   4,   2,   2,   2,   2,   2,   2,   2,  39,
-      0, 102,   0,   0,   0, 103,   0,   0,   0,   0,   0,   0,  76,  64,   0,   0,
-      0,   0,   2,   2,   2,   2,  34,   0,   0,   0,   0,   0,   0,  25,   4,   0,
-      0,   0,   0,   0,   0,   0,   0,  25,   0,   0,   0,   0,   2,   2,   2,   2,
-      0,   0,   0,   0,   0,  96,   0,   0,   0,   0,   0,  59,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,  25, 101,  77,   0,   0,   0,  33,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   4,   0, 104, 105,   0,   0,  70,   0,   0,   0,
-     12,  12,  12,  12,  12,  12, 106,   0,  71,   0,   0,   0,   2,   2,   4,  25,
-      0,   0,   0,   0,  33,  77,   0,   0,  25,   2,   4,   0,   0,   0,   0,   0,
-     51,   0,   0,   0,   0,   0, 107, 108,   0,   0,   0,   0,   1,   0,   0,   0,
-      0,   0,   0,   0,   0, 109,  82,   0, 105,  56,   0,   0,   0,   0,   0,  56,
-      0,   0,   0,   0,   0,   0, 110,  68,  55,   0,   0,   0,   0,  71,  58,   0,
-      0,   0,   0,   0,   1,  53,   0,   0,   0,   0,   0,  58,   0,   0,   0,   0,
-      2,   2,   0,   0,   2,   2,   0,   0,   0,   0,   0,   0,   0,   0,   0,  45,
-      0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,  34,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,  33,  51, 111,  99,   0,   0,   0,   0,   0,  92,
-    112, 113, 114, 115, 116, 117,   0,   0, 118, 119, 120,   0,   0, 121,   0,   0,
-    122,  12,  12,  12, 123,   0,   0,   0,   0,   0,   0,   0,   0,   0, 124,  12,
-    125,   2, 126,   0,   0,   0,   0,   0,  55,   0,   0,   0,   0,   0,   0,   2,
-     75,   0,   0,   0,   0,   0,   0,  25,   4,   0,   0,   0,   0,   0, 127,  59,
-     51,   0,   0,   0,  25,  40,  76,   0,   0,   0,   0,   0,   0,   0, 105,   0,
-      4,   0,   0,   0,   0,   0,  33,  75,   0,  57,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,  25, 128,  58,   0,   0,   0,  25,   3,  51,   0,   0,
-     34,   0,   0,   0,  33,  76,  76,   0,   0,   0,   0,   0,   0,   0,   0,   2,
-     73,   0,   0,  58,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3, 129,
-    130,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  96,  86,
-     34,   0,   0,  71,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3, 131,
-     34,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 132,   6,   0,
-      0,   0,   0,  80, 133,  37,   0,   0,   0,   0,   0,   0,   0,  25,   2,  59,
-      0,   0,  99,  54,  34,   0,   0,   0,   5,  51,   0,   0,   0,   0,   3, 134,
-     25,   0, 109,  45,   0,   0,   0,   0,   0,  64,  75,   4,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,  75,   6,   0,   0,  64,   2,   2,  64, 135,   0,
-      0,   0,   0,   0,   0,   0, 109, 136,   6,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,  98,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  72,   0,
-      0,   0,   0,   0,   0,   0,   2,  34,   0,   0,   0,   0,   0,   0,  76,   0,
-      0,   0,   0,   0,   0,   0,  75,   0,   0,  25,   0,   0,   0,   0,   0,   0,
-      0,  25,  51,   0,   0,   0,   0,   0,   0,   0,   0,  70,  37,   0,   0,   0,
-      0,   0,   0,   0,  25,   4,   3,   2, 137,  37,   0,   0,   0,  96,   0,   0,
-     85,   0,   0,   0,   0,   0,   0,   0,   2,   2,   2,   2,   2,   2,  75,   3,
-      2,   2,   2,   2,   2,  76,   1,   0,  56,   0,   0,   3,   5,   2,   0,   0,
-     75,   2,   2, 138, 139,  51,   0,   0,   0,   0,   0,   0,   0,  99,   0,   0,
-      0,   0,  75,   0,   0,   0,   0,   0,  12,  12,  12,  12,  12,  12,  12,  12,
-    140,  37,   0,   0,   0,   0,   0,   0,  55,   0,   0,   0,   2,   2,   2,   2,
-};
+    field_2 = codepoint >> 10;
+    field_1 = (codepoint >> 5) & 0x1F;
+    field_0 = (codepoint >> 3) & 0x3;
+    offset = codepoint & 0x7;
 
-static RE_UINT8 re_joining_type_stage_4[] = {
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0,
-    5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 5, 5, 5, 5, 5,
-    5, 5, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5,
-    5, 5, 5, 5, 5, 5, 0, 5, 0, 5, 5, 0, 5, 5, 0, 5,
-    5, 5, 5, 0, 5, 0, 0, 0, 2, 0, 3, 3, 3, 3, 2, 3,
-    2, 3, 2, 2, 2, 2, 2, 3, 3, 3, 3, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2,
-    3, 2, 2, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 2, 2,
-    5, 3, 3, 3, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
-    3, 3, 2, 2, 2, 2, 2, 2, 3, 2, 2, 3, 3, 3, 3, 3,
-    3, 3, 3, 3, 2, 3, 2, 3, 2, 2, 3, 3, 0, 3, 5, 5,
-    5, 5, 5, 5, 5, 0, 0, 5, 5, 0, 5, 5, 5, 5, 3, 3,
-    0, 0, 2, 2, 2, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 5,
-    3, 5, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 2, 2, 3, 2,
-    3, 2, 3, 2, 3, 2, 2, 3, 5, 5, 5, 0, 0, 3, 2, 2,
-    2, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 3, 3, 2, 2, 2,
-    2, 3, 2, 3, 3, 2, 2, 2, 0, 0, 0, 0, 0, 0, 5, 5,
-    5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0,
-    0, 0, 1, 0, 0, 5, 0, 0, 5, 5, 0, 5, 5, 5, 5, 5,
-    5, 5, 5, 5, 0, 5, 5, 5, 0, 5, 5, 5, 5, 5, 0, 0,
-    3, 2, 2, 2, 2, 2, 3, 3, 2, 3, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 3, 2, 0, 0, 0, 5, 5, 5, 0, 0, 0, 0,
-    2, 0, 2, 2, 2, 2, 0, 3, 2, 3, 3, 0, 0, 0, 0, 0,
-    2, 2, 3, 3, 3, 0, 3, 2, 2, 3, 3, 2, 2, 0, 2, 2,
-    2, 3, 2, 2, 2, 2, 0, 0, 5, 5, 5, 0, 0, 0, 0, 0,
-    0, 0, 5, 0, 5, 0, 0, 0, 5, 0, 0, 0, 0, 5, 0, 0,
-    0, 0, 5, 5, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 5, 0, 0, 0, 0, 5, 5, 5, 5, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 5, 0, 0, 5, 5, 0, 0, 0, 0, 0,
-    0, 5, 5, 0, 0, 0, 0, 5, 5, 0, 0, 5, 5, 5, 0, 0,
-    5, 5, 0, 0, 0, 5, 0, 0, 0, 5, 5, 5, 5, 5, 0, 5,
-    0, 0, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 5, 0, 0, 5,
-    0, 0, 5, 0, 0, 0, 0, 0, 5, 0, 0, 0, 5, 0, 0, 0,
-    5, 0, 0, 0, 0, 0, 5, 5, 5, 0, 5, 5, 5, 5, 0, 0,
-    0, 0, 0, 0, 0, 5, 5, 0, 0, 0, 0, 0, 5, 5, 0, 0,
-    0, 0, 0, 5, 5, 0, 0, 0, 0, 0, 5, 5, 5, 0, 5, 0,
-    0, 5, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0,
-    5, 5, 5, 5, 5, 0, 0, 0, 5, 5, 5, 5, 5, 5, 0, 0,
-    0, 0, 0, 0, 0, 5, 0, 5, 5, 5, 5, 5, 5, 0, 5, 5,
-    0, 0, 0, 0, 0, 5, 5, 5, 5, 0, 5, 5, 5, 5, 5, 5,
-    0, 5, 5, 0, 0, 5, 5, 0, 5, 5, 0, 0, 0, 0, 5, 5,
-    0, 0, 5, 0, 0, 5, 5, 0, 0, 0, 5, 5, 5, 0, 0, 0,
-    0, 0, 0, 0, 5, 5, 0, 5, 0, 0, 0, 0, 0, 0, 0, 2,
-    0, 0, 1, 5, 5, 5, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 5, 5, 2, 2, 5, 2, 0, 0, 0, 0, 0,
-    5, 5, 5, 0, 0, 0, 0, 5, 5, 0, 0, 5, 0, 0, 0, 0,
-    5, 0, 5, 0, 0, 5, 5, 5, 0, 0, 0, 0, 5, 0, 5, 5,
-    0, 0, 5, 5, 5, 5, 0, 0, 5, 5, 0, 5, 5, 5, 0, 0,
-    5, 5, 0, 0, 0, 5, 0, 5, 0, 0, 0, 0, 5, 5, 5, 5,
-    5, 5, 5, 5, 0, 0, 5, 5, 5, 5, 5, 0, 5, 5, 5, 5,
-    0, 0, 0, 5, 0, 1, 5, 5, 0, 0, 5, 5, 5, 5, 5, 0,
-    0, 0, 5, 0, 0, 0, 5, 0, 0, 0, 0, 5, 0, 0, 0, 0,
-    2, 2, 4, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 5, 5,
-    5, 5, 0, 0, 5, 5, 0, 0, 0, 5, 5, 5, 5, 5, 5, 0,
-    5, 0, 5, 5, 5, 0, 0, 5, 0, 5, 5, 5, 0, 5, 5, 0,
-    2, 2, 2, 2, 2, 3, 0, 3, 0, 3, 3, 0, 0, 4, 3, 3,
-    3, 3, 3, 2, 2, 2, 2, 4, 2, 2, 2, 2, 2, 3, 2, 2,
-    2, 3, 0, 0, 3, 5, 5, 0, 0, 0, 0, 2, 2, 2, 2, 3,
-    2, 3, 2, 3, 3, 3, 2, 2, 2, 3, 2, 2, 3, 2, 3, 3,
-    2, 3, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 2, 2, 0,
-    4, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 2, 5, 5, 5, 5,
-    2, 2, 2, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 5, 5,
-    5, 2, 2, 2, 3, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 0,
-    5, 5, 0, 0, 5, 0, 5, 5, 5, 0, 5, 0, 0, 0, 0, 5,
-    5, 0, 5, 5, 0, 0, 0, 0, 5, 5, 5, 0, 0, 5, 0, 5,
-    0, 0, 0, 5, 0, 5, 0, 0, 0, 0, 5, 5, 5, 5, 0, 5,
-    5, 0, 0, 5, 5, 5, 5, 0, 5, 0, 5, 5, 0, 5, 5, 0,
-    0, 0, 5, 0, 5, 5, 0, 5, 5, 5, 5, 0, 0, 5, 5, 5,
-    5, 0, 0, 5, 5, 5, 5, 5, 5, 5, 0, 5, 5, 0, 5, 5,
-    2, 2, 2, 2, 5, 5, 5, 5,
-};
+    v = re_soft_dotted_table_1[field_2];
+    v = re_soft_dotted_table_2[(v << 5) | field_1];
+    v = re_soft_dotted_table_3[(v << 2) | field_0];
 
-/* Joining_Type: 3560 bytes. */
-
-RE_UINT32 re_get_joining_type(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-
-    f = ch >> 12;
-    code = ch ^ (f << 12);
-    pos = (RE_UINT32)re_joining_type_stage_1[f] << 6;
-    f = code >> 6;
-    code ^= f << 6;
-    pos = (RE_UINT32)re_joining_type_stage_2[pos + f] << 3;
-    f = code >> 3;
-    code ^= f << 3;
-    pos = (RE_UINT32)re_joining_type_stage_3[pos + f] << 3;
-    value = re_joining_type_stage_4[pos + code];
-
-    return value;
+    return (v >> offset) & 0x1;
 }
 
-/* Line_Break. */
-
-static RE_UINT8 re_line_break_stage_1[] = {
-     0,  1,  2,  3,  4,  5,  5,  5,  5,  5,  6,  7,  8,  9, 10, 11,
-    12, 13, 14, 15, 16, 10, 17,  5, 18, 10, 10, 19, 10, 20, 21, 22,
-     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5, 23,
-     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5, 23,
-    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
-    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
-    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
-    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
-    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
-    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
-    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
-    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
-    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
-    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
-    24, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
-    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
-    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
-};
-
-static RE_UINT8 re_line_break_stage_2[] = {
-      0,   1,   2,   2,   2,   3,   4,   5,   2,   6,   7,   8,   9,  10,  11,  12,
-     13,  14,  15,  16,  17,  18,  19,  20,  21,  22,  23,  24,  25,  26,  27,  28,
-     29,  30,  31,  32,  33,  34,  35,  36,  37,   2,   2,   2,   2,  38,  39,  40,
-     41,  42,  43,  44,  45,  46,  47,  48,  49,  50,   2,  51,   2,   2,  52,  53,
-     54,  55,  56,  57,  58,  59,  60,  61,  62,  63,  64,  65,  66,  67,  68,  69,
-      2,   2,   2,  70,   2,   2,  71,  72,  73,  74,  75,  76,  77,  78,  79,  80,
-     81,  82,  83,  84,  85,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,
-     79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,
-     79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,
-     79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  86,  79,  79,  79,  79,
-     79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,
-     79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,
-     87,  79,  79,  79,  79,  79,  79,  79,  79,  88,   2,   2,  89,  90,   2,  91,
-     92,  93,  94,  95,  96,  97,  98,  99, 100, 101, 102, 103, 104, 105, 106, 100,
-    101, 102, 103, 104, 105, 106, 100, 101, 102, 103, 104, 105, 106, 100, 101, 102,
-    103, 104, 105, 106, 100, 101, 102, 103, 104, 105, 106, 100, 101, 102, 103, 104,
-    105, 106, 100, 101, 102, 103, 104, 105, 106, 100, 101, 102, 103, 104, 105, 106,
-    100, 101, 102, 103, 104, 105, 106, 100, 101, 102, 103, 104, 105, 106, 100, 101,
-    102, 103, 104, 105, 106, 100, 101, 102, 103, 104, 105, 106, 100, 101, 102, 107,
-    108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108,
-    109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109,
-    109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109,
-    109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109,
-    109, 109,  79,  79,  79,  79, 110, 111,   2,   2, 112, 113, 114, 115, 116, 117,
-    118, 119, 120, 121, 109, 122, 123, 124,   2, 125, 126, 109,   2,   2, 127, 109,
-    128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 109, 139, 109, 140, 141,
-    142, 143, 144, 145, 146, 147, 148, 109, 149, 150, 109, 151, 152, 153, 154, 109,
-    155, 156, 109, 157, 158, 159, 109, 109, 160, 161, 162, 163, 109, 164, 109, 165,
-      2,   2,   2,   2,   2,   2,   2, 166, 167,   2, 168, 109, 109, 109, 109, 109,
-    109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109,
-      2,   2,   2,   2, 169, 170, 171,   2, 172, 109, 109, 109, 109, 109, 109, 109,
-    109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109,
-    109, 109, 109, 109, 109, 109, 109, 109,   2,   2,   2, 173, 174, 109, 109, 109,
-    109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109,
-    109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109,
-      2,   2,   2,   2, 175, 176, 177, 178, 109, 109, 109, 109, 179, 180, 181, 182,
-     79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79, 183,
-     79,  79,  79,  79,  79, 184, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109,
-     79,  79, 185,  79,  79, 186, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109,
-    109, 109, 109, 109, 109, 109, 109, 109, 187, 188, 109, 109, 109, 109, 109, 109,
-      2, 189, 190, 191, 192, 193, 194, 109, 195, 196, 197,   2,   2, 198,   2, 199,
-      2,   2,   2,   2, 200, 201, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109,
-    202, 109, 203, 109, 109, 204, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109,
-      2, 205, 206, 109, 109, 109, 109, 109, 207, 208, 209, 109, 210, 211, 109, 109,
-     79,  79, 212, 213,  79,  79,  79, 214, 215, 216, 217, 218, 219, 220, 221, 222,
-    223, 224, 225, 226, 227,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79, 228,
-     79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,
-     79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79, 228,
-    229, 109, 230, 231, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109,
-    109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109,
-};
-
-static RE_UINT16 re_line_break_stage_3[] = {
-      0,   1,   0,   0,   2,   3,   4,   5,   6,   6,   6,   7,   6,   6,   6,   8,
-      9,   0,   0,   0,  10,  11,  12,  13,   6,   6,  14,   6,   6,   6,  14,   6,
-      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,
-      6,   6,   6,   6,   6,   6,   6,   6,  14,  15,  16,  17,   6,   6,   6,   6,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,  18,   0,  19,  20,   0,   6,  21,
-     22,  23,   6,   6,  24,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,
-     25,  26,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,
-      6,   6,   6,   6,   6,   6,  27,   6,   6,   6,  28,  27,   6,   6,   6,   6,
-      6,  29,  30,   0,   0,   0,   0,  31,  32,  33,  34,  34,  34,  35,  36,  33,
-      6,  37,   0,  38,   6,   6,   6,   6,   6,  25,   0,   0,   4,  39,  40,   6,
-      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,  41,  42,  42,  43,   4,  44,
-      6,  45,  46,   6,   6,   6,   0,   0,   0,  47,   6,   6,   6,   6,   6,   6,
-      6,   6,   6,   6,  48,   0,  49,  33,   4,  44,   6,   6,   6,  25,  50,  51,
-      6,   6,  48,  52,  53,  54,   6,  28,   6,   6,   6,  55,   6,  56,  33,  33,
-     33,  33,  33,  33,   6,   6,  57,  58,  33,  33,  59,   0,  52,   0,   0,   0,
-     50,   6,   6,   6,   6,   6,   6,  60,   0,   0,  61,   6,  62,   4,   6,   6,
-     63,  64,  65,   6,   6,  66,  67,  68,  69,  70,  71,  72,  73,   4,  74,  75,
-     76,  77,  65,   6,   6,  66,  78,  79,  80,  81,  82,  83,  84,   4,  85,  33,
-     76,  45,  24,   6,   6,  66,  86,  68,  87,  88,  89,  33,  73,   4,  90,  91,
-     76,  64,  65,   6,   6,  66,  86,  68,  69,  81,  92,  72,  73,   4,   6,  33,
-     93,  94,  95,  96,  97,  94,   6,  98,  99, 100, 101,  33,  84,   4,   6, 102,
-    103,  57,  66,   6,   6,  66,   6, 104, 105, 100, 106,  56,  73,   4, 107,   6,
-    108,  57,  66,   6,   6,  66, 109,  68, 105, 100, 106, 110,  73,   4, 111,  33,
-    112,  57,  66,   6,   6,   6,   6, 113, 105, 114, 115,   6,  73,   4,   6, 116,
-    117,   6,  28, 118,   6,   6,  24, 119,  28, 120, 121,   0,  84,   4, 122,  33,
-    123, 124, 124, 124, 124, 124, 124, 125, 124, 126,   4, 127,  33,  33,  33,  33,
-    128, 129, 124, 124, 130, 124, 124, 131, 132, 131,   4, 133,  33,  33,  33,  33,
-    134, 135, 136,  26,   4,  44, 137, 138,   6,  27,   6,   6,   6, 139,  30, 140,
-    141, 142,   0,  30,   0,   0,   0, 143, 144,  57, 145, 146,  33,  33,  33,  33,
-    124, 124, 124, 124, 124, 124, 124, 124,   4, 147, 124, 124, 124, 124, 124, 124,
-    124, 124,   4, 148,   6,   6,   6,   6,  45, 149,   6,   6,   6,   6,   6,   6,
-    150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 151, 151, 151, 151,
-    151, 151, 151, 151, 151, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152,
-      6,   6,   6,   6,   6,   6,   6,   6,   6,  95,  28,  95,   6,   6,   6,   6,
-      6,  95,   6,   6,   6,   6,  95,  28,  95,   6,  28,   6,   6,   6,   6,   6,
-      6,   6,  95,   6,   6,   6,   6,   6,   6,   6,   6, 153, 154,   6,   6, 139,
-      6,   6,   6, 155,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,  58,  58,
-    156,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,
-    156,   6,   6, 157,   6,   6,   6,   6,   6,   6,   6,   6,   6, 158,   6,  89,
-      6,  57, 159,  33,   6,   6, 160,  33,   6,   6, 161,  33,   6,  57, 162,  33,
-    124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 163, 164,   4, 165,   6, 155,
-    166, 167,   4, 165,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,  89,
-    168,   6,   6,   6,   6, 169,   6,   6,   6,   6,   6,   6,   6,   6,  58,  33,
-      6,   6,   6,  28,   0, 170,   0, 170, 171,   4, 124, 124, 124, 131, 172,  33,
-    124, 124, 124, 124, 124, 173, 124, 124, 124, 174,   4, 175,   6,   6,   6,   6,
-      6,   6, 176, 177, 124, 124, 124, 124, 124, 124, 124, 178, 124, 124, 124, 179,
-      4, 165,   4, 165, 124, 131,   0, 180,  33,  33,  33,  33,  33,  33,  33,  33,
-    103,   6,   6,   6,   6,   6, 181,   0, 103, 182,   4, 183, 156,  25,  50, 139,
-    184,   6,   6,   6,  61, 185,   4,  44,   6,   6,   6,   6,  48,   0, 170,  22,
-      6,   6,   6,   6, 181,   0,   0, 186,   4, 187,   4,  44,   6,   6,   6, 188,
-      6,  89,   6,   6,   6,   6,   6, 189,   6,  33, 190,   0,   0, 191, 192, 193,
-      6,   6,   6,   6,   6,   6,   6,   6,   0,   0,   0,   0,   0,   0,   0, 194,
-      6,   6,  58,  58,   6,   6,   6,   6,  58,  58,   6, 195,   6,   6,   6,  58,
-      6,   6,   6,   6,   6,   6,  57,   6,  57,   6, 196, 109,   6,   6, 197, 198,
-    199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211,   0, 212, 213,
-    214, 215,   6, 139, 216, 217, 218, 219, 217, 217,   0,   0,   0,   0, 220,  33,
-    221, 116, 222,   6, 223, 224,   6,   6,   6,   6, 225, 226, 227, 228, 227, 229,
-      6, 230, 227, 229,   6,   6,   6,   6,   6,   6, 231,   6,   6,   6,   6,   6,
-    232, 233, 234, 235, 236, 237, 238, 225,   6, 239, 240,   6, 241, 242,   6,   6,
-    242,   6, 243, 244, 243,   6,   6,  14,   6,   6,   6,   6,   6, 245,   6,   6,
-      6, 246, 240, 247,   6, 248,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,
-      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6, 249,   6,
-      6,   6,   6,   6,  28,  33,  33,  33,   6,  56,  33,  33, 227, 227, 227, 227,
-    227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 250,
-    227, 227, 227, 227, 227, 227, 227, 227, 227, 228, 227, 227, 227, 227, 251,   6,
-    227, 227, 252,   6, 253, 229, 242, 225, 254, 255, 229,   6, 252,  14,   6,   6,
-    256, 257, 258, 259,   6,   6,   6, 260, 261,   6,   6,   6, 262, 263,   6, 264,
-      6,   6,   6, 265,   6,   6,   6, 266, 267, 268, 269, 270, 271, 272, 273, 274,
-    275, 276,   6,   6,   6,   6,   6,   6,   6,   6,  14, 277, 278, 279, 280, 227,
-    227, 227, 228,   6,   6,   6,   6,   6, 281,   6,   6,   6, 282, 279,   6,   6,
-    283, 284, 284, 285,   6,   6,   6,   6,   6,   6,   6, 246,   6,   6,   6, 286,
-      6,   6,   6,   6,   6,   6,   6,   6,   6,   6, 287, 229,   6,   6, 196,   6,
-      6,   6,  58,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,
-      6,   6,   6,   6,   6,  28,   6,   6,   6,   6,   6,  28,   6,   6,   6,   6,
-      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6, 176, 288, 289,
-      6,   6,   6,   6,  45, 149,   6,   6,   6,   6,   6,   6,   6, 290, 291,  71,
-      6,   6,  28,  33,  28,  28,  28,  28,  28,  28,  28,  28,   0,   0,   0,   0,
-    292, 293, 294, 295, 296, 297, 298, 299, 300, 301,  33,  33,  33,  33,  33,  33,
-    267, 267, 267, 302, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 303,  33,
-    267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267,
-    267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 304,  33,  33,  33, 267, 303,
-    305, 279, 306, 307, 267, 308, 309, 310, 311, 312, 267, 267, 313, 267, 267, 267,
-    314, 315, 316, 317, 318, 312, 267, 267, 313, 267, 267, 267, 314, 315, 319, 320,
-    321, 267, 267, 267, 267, 267, 322, 267, 267, 267, 267, 267, 267, 267, 267, 267,
-    267, 323, 267, 267, 267, 267, 267, 324, 267, 267, 267, 267, 303,  33, 325, 325,
-    267, 267, 267, 323, 267, 267, 267, 267, 267, 227, 267, 267, 267, 267, 267, 267,
-    267, 267, 267, 267, 267, 267, 267, 267,   6,   6,   6,   6,   6,   6,   6,   6,
-    267, 267, 326, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267,
-    267, 327, 267, 267, 267, 267, 267, 267, 323,  33,   6,   6,   6,   6,   6, 188,
-      6, 328,   6,   6,   4, 329,  33,  33,   6,   6,   6,   6,   6, 176, 190, 185,
-      6,   6,   6,  48,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6, 330,  33,
-      6,   6,   6,   6,   6,   6,   6,   6, 331,  33,  33,  33,  33,  33, 290,   6,
-    332, 333,   6,   6,  25, 182,   6, 334,   6,   6,   6,   6,   6,   6, 335,  33,
-     26,   6,   6,   6,   6,   6, 181,   0, 336, 337,   4, 165,   0,   0,  26, 338,
-      4,  44,   6,   6,  48, 339,   6,   6, 176,   0, 170, 290, 150, 150, 150, 340,
-     50,   6,   6,   6,   6,   6,  25,   0, 341, 342,   4, 343, 124, 124,   4, 344,
-      6,   6,   6,   6,   6,  61, 180,  33, 333, 345,   4, 346, 124, 124, 124, 124,
-    124, 124, 124, 124, 124, 124, 124, 124, 347,  33,  33, 348,   6,  25, 349,  33,
-    350, 350, 350,  33,  28,  28,   6,   6,   6,   6,   6,   6,   6,  33,   6,   6,
-      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,  25, 351,   4, 165,
-    352, 353, 353, 354, 353, 353, 353, 352, 353, 353, 354, 353, 353, 353, 352, 353,
-    353, 354, 353, 353, 353, 352, 353, 353, 354, 353, 353, 353, 352, 353, 353, 354,
-    353, 353, 353, 352, 353, 353, 354, 353, 353, 353, 352, 353, 353, 354, 353, 353,
-    353, 352, 353, 353, 354, 353, 353, 353, 352, 353, 353, 354, 353, 353, 353, 352,
-    353, 353, 354, 353, 353, 353, 352, 353, 353, 354, 353, 353, 353, 352, 353, 353,
-    354, 353, 353, 353, 352, 353, 353, 354, 353, 353, 353, 352, 353, 353, 354, 353,
-    353, 353, 352, 353, 353, 354, 353, 353, 353, 352, 353, 353, 354, 353, 353, 353,
-    353, 352, 353, 353, 355,  33, 151, 151, 356, 357, 152, 152, 152, 152, 152, 358,
-    359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359,
-     33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,
-     28,  33, 360, 361,  34, 362, 363, 364, 365,  34,   6,   6,   6,   6,   6,   6,
-      6,   6,   6,   6,   6,   6,   6,   6, 155,  33, 360,   6,   6,   6,   6,   6,
-      6,   6,   6,   6,   6,   6,   6, 366,  33,  33,   6,   6,   6,   6,   6,   6,
-      6,   6, 118,   6,   6,   6,   6,   6,   6,  33,  33,  33,  33,  33,   6, 367,
-      0,   0, 368, 369,   0,   0, 370, 284, 371, 372, 373, 374, 323, 375,  57,   6,
-      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6, 376,
-    377, 378, 267, 379, 267, 267, 267, 380, 267, 267, 267, 381, 382, 325, 383, 267,
-    267, 267, 267, 384, 267, 267, 267, 323, 385, 385, 385, 386, 387,  28,  33, 388,
-      6, 109,   6,   6,  28,   6,   6, 389,   6,  58,   6,  58,  33,  33,  33,  33,
-      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,  56,
-    390,   6,   6,   6,   6,   6, 391,   6,   6,   6,   6,   6,   6,   6,   6,   6,
-      6,  28,   6, 182,  89,  33,  33,  33,  33,  33,   6,   6,   6,   6,   6, 392,
-      6,   6,   6, 139,   6,   6,   6,   6,   6,   6,  89,  33,  40,   6,   6, 182,
-      6,   6,   6,   6, 182, 393,   6,   6,   6,  56,   6,   6,   6,   6,  48, 394,
-      6,   6,   6, 395,   6,   6,   6,   6, 182,   6, 396,  33,  33,  33,  33,  33,
-      6,   6,   6,  58,   4, 165,   6,   6,   6,   6, 182,   6,   6,   6,   6, 182,
-      6,   6,   6,   6,   6,  33,   6,   6,   6,   6,   6,   6, 182, 290,  33,  33,
-      6,   6,   6,   6,   6,   6,  28,  33,   6,   6,  58,  33,   6,  33,  33,  33,
-     58,  66,   6,   6,   6,   6,  45, 397,   6,   6, 395,   6,   6,   6,   6,   6,
-      6,   6,   6,  28, 290,   6,  33,  33,  33,  33,  33,  33,   6,   6, 398, 360,
-      6,   6,   6, 399,   6,   6,   6, 400,  33,  33,  33,  33,  33,  33,  33,  33,
-      6,   6,   6,   6,   6,   6,   6,  22,   6,   6, 118,   6,   6,   6,   6,   6,
-    401, 402, 109,  27,   6,   6,  58,  80,   6,  89, 403,  89,   6,   6,   6,   6,
-      6,   6,   6,   6,  33,  33,  33,  33,   6,   6,   6,   6, 404, 360, 405,  33,
-      6,   6,   6,   6,   6,   6,  58, 406,   6,   6,  58,   6,   6,   6,  56,   6,
-      6,   6, 155, 407,  33,  27,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,
-      6,   6,   6,   6,   6,   6,   6,   6,   6,  89,  33,  33,  33,  33,  33,  33,
-      6,   6,   6,   6,   6,   6,  56,  33,   6,   6,   6,   6,   6,   6,  56, 118,
-      6,   6,   6,   6, 181,  33,   4, 165,  33,  33,  33,  33,  33,  33,  33,  33,
-     33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,   6,   6,   6,  28,
-      6,   6,   6,   6,   6,  33,   6,   6,  48,   0,  40, 155,  33,  33,  33,  33,
-     33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,   6,   6,  28,  33,
-    184,   6,   6,   6,   6,   6,   6,   0, 140, 396, 118,   6, 408,   4,  33,  71,
-    184,   6,   6,   6,   6,   6,   0, 409, 410, 149,   6,   6,   6,  89,   4, 165,
-    184,   6,   6,   6, 176,   0, 411,   4, 412,  33,   6,   6,   6,   6, 413,  33,
-    184,   6,   6,   6,   6,   6,  25,   0, 414, 415,   4, 416,  27,   6, 139,  33,
-      6,   6,  24,   6,   6, 181,   0, 417,  33,  33,  33,  33,  33,  33,  33,  33,
-     28, 418,   6,  45,   6, 419,   6,   6,   6,   6,   6, 176,   0, 394,   4, 165,
-    112,  64,  65,   6,   6,  66,  86, 420,  69,  81, 101, 393, 421, 422, 422,  33,
-      6,   6,   6,   6,   6,   6, 142,   0, 423, 424,   4, 425,  33,  33,  33,  33,
-      6,   6,   6,   6,   6,   6,   0,   0,  50,  33,   4, 165,  33,  33,  33,  33,
-      6,   6,   6,   6,   6, 176, 336,   0, 426, 427, 403, 345,  33,  33,  33,  33,
-      6,   6,   6,   6,   6,   6,   0,   0, 428,  33,   4, 165, 429, 430,  33,  33,
-      6,   6,   6,   6,   6,  25,   0,  89,   4, 165,  33,  33,  33,  33,  33,  33,
-    124, 124, 124, 431, 124, 173,   4, 432,  33,  33,  33,  33,  33,  33,  33,  33,
-      6,   6,   6,   6,   6, 181,   0, 433,  33,  33,  33,  33,  33,  33,  33,  33,
-     33,  33,  33,  33,   6,   6,   6,   6,   6,   6,   6,   6,   4,  44,  56, 290,
-     33,  33,  33,  33,   6, 118,   6,   6,   6,   6,  61, 434, 435,  33,  33,  33,
-     61, 184,   6,   6,   6,   6,  25, 436, 437,  33,  61,  50,   6,   6,   6,   6,
-      6, 438,   0, 439, 440,  33,  33,  33,   6,   6,   6,   6,   6,   6,   6,  89,
-      6,  66,   6,   6,   6, 176, 180,   0, 441,  33,   4,  44,   6, 139, 442,   6,
-      6,   6, 434,   0,   0,  30, 180,  33,  33,  33,  33,  33,  33,  33,  33,  33,
-     28,  24,   6,   6,   6,   6, 443, 444, 445,  33,   4, 165,  45,  66,   6,   6,
-      6, 446, 194,  89,   4, 165,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,
-     33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,   6,   6, 447,  89,
-     33,  33,  33,  33,  33,  33,  33,  33,   6,   6,   6, 448, 449,   6, 155, 450,
-      6,   6,   6, 155,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,
-      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,  28, 451,  33,
-      6,   6,   6,   6,   6,   6,   6,   6, 182,  33,  33,  33,  33,  33,  33,  33,
-      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6, 452,   6,   6,   6,   6,
-    453, 454,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,
-      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6, 455,
-      6,   6,   6,   6,   6,  28, 456, 457,  33,  33,  33,  33,  33,  33,  33,  33,
-      6,   6,   6,   6,   6,   6,   6,   6,   6, 282,   6,   6,   6,   6,   6,   6,
-      6,   6,   6,   6,   6,   6,   6,   6,  28,  33,  33,  33,  33,  33,  33,  33,
-      6,   6,   6,   6,   6,   6,   6,  89,   6,   6,   6,  28,   4, 458,  33,  33,
-     33,  33,  33,  33,  33,  33,  33,  33,  33,  33,   6,   6,   6,  58, 459,  33,
-      6,   6,   6,   6,   6,   6, 140, 460, 461,  33,   4, 462,  24,   6,   6, 393,
-      6,   6,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,
-     33,  33,  33,  33,  33,  33,  33,  33,   6,   6,   6,   6,   6,   6,   6,   6,
-      6,   6, 463, 464,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,
-      6,   6,   6,   6,   6,   6,   6,   6,   6, 465,  61,   0,   0,   0,   0,   0,
-      0,  71, 184,   6,  33,  33,  33,  33,  33,  33,  33,  33, 466,  33,  33,  33,
-    267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267,  33,
-    267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 324,  33,
-    267, 267, 267, 323,  33,  33,  33,  33,  33,  33, 467,  33, 468,  33, 267, 267,
-    267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 303,
-      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,  56,   6, 139,
-      6,  89,   6, 469, 170,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,
-      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,  58,  33,
-      6,   6,   6,   6,  28,  27,   6,   6,   6,   6,   6,   6, 142, 470,   0,   0,
-    471,  50,   6,   6,   6, 472,   6,   6,   6,   6,   6,   6,   6,  89,  33,  33,
-      6,   6,   6,   6,   6,   6,   6,   6, 473,  33,  33,  33,  33,  33,  33,  33,
-     33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,   6,   6, 182,  33,
-      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,  28,  33,   6,   6,   6,  89,
-      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,  57,   6,   6,   6,   6,   6,
-      6,   6,   6,  57, 474, 475,   6, 476, 109,   6,   6,   6,   6,   6,   6,   6,
-     45, 189,  57,  57,   6,   6,   6, 477, 478, 118,  66,   6,   6,   6,   6,   6,
-      6,   6,   6,   6,  58,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,
-      6,   6,   6,   6,   6,   6,   6,   6,   6, 479,   4,   4,   4,   4,   4,   4,
-      0,   0,   0,   0,   0,   0, 423,  25,   0,   0,   0,   0,   0, 103, 480,   6,
-    481, 482,  33,  59,  30,   0,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,
-    180,   0,   0, 483, 484, 394,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,
-      6,   6,   6,   6,   6, 139, 423,  58,   4, 343,  33,  33,  33,  33,  33,  33,
-     33,  33,  33,  33,  33,  33,  33,  33,   6,   6,   6,   6,   6, 181,   4, 485,
-      6,   6,   6,   6,   6,   6,   6,   6,  64,   6, 180,  33,  33,  33,  33,  33,
-      6,   6,   6,   6,   6,   6,   6,   6, 181, 433,   4, 486,  33,  33,  33,  33,
-     33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  33,  27,   6,
-      6,   6,   6,   6,   6, 487, 488,  33,  33,  33,  33,  33,  33,  33,  33,  33,
-     27,   6,   6,   6,   6,   6,   6,  58,  33,  33,  33,  33,  33,  33,  33,  33,
-    109,   6,   6,   6, 489,  27, 490, 491, 492, 493, 489, 195, 489, 490, 490,  83,
-      6,  24,   6, 182, 494,  24,   6, 182,  33,  33,  33,  33,  33,  33, 155,  33,
-    227, 495, 227, 227, 227, 496, 227, 227, 227, 227, 227, 227, 227, 497, 227, 227,
-    227, 227, 227, 227, 227, 495, 267, 267, 267, 267, 267, 267, 498, 499, 499, 499,
-    500, 267, 267, 501, 267, 267, 502, 503, 504, 505, 267, 267, 267, 267, 267, 506,
-    267, 267, 267, 267, 267, 267, 267, 267, 507, 508, 509, 267, 510, 508, 508, 511,
-    512, 513, 514, 267, 515, 516, 517, 267, 267, 267, 267, 267, 267, 267, 267, 267,
-    264, 267, 518,   6, 266, 267, 519,   6,   6, 520, 267, 267, 267, 267, 521, 522,
-    267, 267, 523, 267, 267, 267, 267, 267, 267, 267, 249, 524, 267, 267, 249, 520,
-    267, 267, 267, 267, 267, 267, 267, 267, 525, 526,   6,   6,   6,   6, 527, 528,
-    267, 267, 267, 267, 529, 267, 530, 267, 509, 531, 267, 267, 267, 267, 267, 267,
-      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6, 524, 267,
-      6,   6,   6,   6,   6,   6,   6,   6,   6,   6, 266, 267, 267, 267, 267, 267,
-      6, 524,   6,   6,   6,   6,   6,   6,   6, 267,   6, 520,   6,   6,   6,   6,
-      6, 267,   6,   6,   6, 532, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267,
-      6, 533, 267, 508, 534, 267, 508, 535, 267, 267, 267, 267, 267, 267, 267, 267,
-    267, 267, 267, 267, 267, 267, 536, 537, 267, 525, 538, 539, 267, 267, 267, 267,
-      6,   6,   6,   6,   6,   6,   6,   6,   6,   6, 524, 267, 267, 267, 267, 267,
-    267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 304,
-     82,  33,  33,  33,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  33,  33,
+/* Terminal_Punctuation. */
+static RE_UINT8 re_terminal_punctuation_table_1[] = {
+     0,  1,  2,  3,  4,  5,  6,  7,  8,  9,  9, 10, 11,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9, 12, 13,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9, 14,
+    15,  9, 16, 17, 18, 19, 20, 21,  9, 22,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9, 23, 24,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9, 25,
+     9,  9,  9,  9,  9,  9, 26,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9
 };
 
-static RE_UINT8 re_line_break_stage_4[] = {
-    16, 16, 16, 16, 16, 16, 16, 16, 16, 18, 22, 20, 20, 21, 16, 16,
-    19,  6,  3, 12,  9, 10, 12,  3,  1, 36, 12,  9,  8, 15,  8,  7,
-    11, 11, 11, 11, 11, 11, 11, 11, 11, 11,  8,  8, 12, 12, 12,  6,
-    12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,  1,  9, 36, 12, 12,
-    12, 12, 12,  1, 18,  2, 12, 16, 16, 16, 16, 16, 16, 29, 16, 16,
-     4,  1, 10,  9,  9,  9, 12, 25, 25, 12, 25,  3, 12, 18, 12, 12,
-    10,  9, 25, 25, 17, 12, 25, 25, 25, 25, 25,  3, 25, 25, 25,  1,
-    12, 12, 12, 12, 12, 12, 12, 25, 17, 25, 25, 25, 17, 25, 12, 12,
-    25, 12, 12, 12, 12, 12, 12, 12, 25, 25, 25, 25, 12, 25, 12, 17,
-    16, 16, 16, 16, 16, 16, 16,  4, 16, 16, 16, 16,  4,  4,  4,  4,
-     4,  4,  4, 16, 16, 16, 16, 16,  0,  0, 12, 12, 12, 12,  8, 12,
-     0,  0,  0,  0, 12, 12, 12, 12, 12, 12, 12,  0, 12,  0, 12, 12,
-    12, 12,  0, 12, 12, 12, 12, 12, 12, 12, 12, 16, 16, 16, 16, 16,
-    16, 16, 12, 12, 12, 12, 12, 12,  0, 12, 12, 12, 12, 12, 12, 12,
-    12, 12, 12, 12, 12, 12, 12,  0, 12,  8, 18,  0,  0, 12, 12,  9,
-     0, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 18, 16,
-    12, 16, 16, 12, 16, 16,  6, 16,  0,  0,  0,  0,  0,  0,  0,  0,
-    37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,  0,  0,  0,  0, 37,
-    37, 37, 37, 12, 12,  0,  0,  0, 12, 10, 10, 10,  8,  8, 12, 12,
-    16, 16, 16,  6, 16,  0,  6,  6, 11, 11, 10, 11, 11, 12, 12, 12,
-    16, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,  6, 12, 16, 16,
-    16, 16, 16, 16, 16, 12, 12, 16, 16, 12, 16, 16, 16, 16, 12, 12,
-    11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,  0, 12,
-    12, 16, 12, 12, 12, 12, 12, 12, 16, 16, 16,  0,  0, 12, 12, 12,
-    12, 12, 12, 12, 12, 12, 16, 16, 16, 12,  0,  0,  0,  0,  0,  0,
-    16, 16, 16, 16, 12, 12, 12, 12,  8,  6, 12,  0,  0, 16,  9,  9,
-    16, 16, 12, 16, 16, 16, 16, 16, 16, 16, 16, 16, 12, 16, 16, 16,
-    12, 16, 16, 16, 16, 16,  0,  0, 12, 16, 16, 16,  0,  0, 12,  0,
-    12, 12, 12,  0,  0,  0,  0,  0, 12, 12, 12, 12, 12,  0, 12, 12,
-    12, 12, 12, 12, 12, 12,  0,  0,  0,  0,  0, 16, 16, 16, 16, 16,
-    12, 12, 16, 16, 16, 12, 16, 16, 12, 16, 16, 16, 16, 16, 16, 16,
-    12, 12, 16, 16, 18, 18, 11, 11, 12, 16, 16, 16,  0, 12, 12, 12,
-    12, 12, 12, 12, 12,  0,  0, 12, 12,  0,  0, 12, 12, 12, 12, 12,
-    12,  0, 12, 12, 12, 12, 12, 12, 12,  0, 12,  0,  0,  0, 12, 12,
-    12, 12,  0,  0, 16, 12, 16, 16, 16, 16, 16, 16, 16,  0,  0, 16,
-    16,  0,  0, 16, 16, 16, 12,  0,  0,  0,  0,  0,  0,  0,  0, 16,
-     0,  0,  0,  0, 12, 12,  0, 12, 12, 12, 16, 16,  0,  0, 11, 11,
-    12, 12, 10, 10, 12, 12, 12, 12, 12, 10, 12,  9, 12, 12, 16,  0,
-     0, 16, 16, 16,  0, 12, 12, 12, 12, 12, 12,  0,  0,  0,  0, 12,
-    12,  0, 12, 12,  0, 12, 12,  0, 12, 12,  0,  0, 16,  0, 16, 16,
-    16, 16, 16,  0,  0,  0,  0, 16, 16,  0,  0, 16, 16, 16,  0,  0,
-     0, 16,  0,  0,  0,  0,  0,  0,  0, 12, 12, 12, 12,  0, 12,  0,
-     0,  0,  0,  0,  0,  0, 11, 11, 16, 16, 12, 12, 12, 16, 12,  0,
-    12,  0, 12, 12,  0, 12, 12, 12, 16, 16, 16, 16, 16, 16,  0, 16,
-    16, 16,  0, 16, 16, 16,  0,  0, 12,  0,  0,  0,  0,  0,  0,  0,
-    12,  9,  0,  0,  0,  0,  0,  0,  0, 12, 16, 16, 16, 16, 16, 16,
-     0,  0,  0,  0,  0,  0, 16, 16,  0,  0, 16, 12,  0, 12, 12, 12,
-    12, 12, 12,  0,  0,  0, 12, 12, 12,  0, 12, 12, 12, 12,  0,  0,
-     0, 12, 12,  0, 12,  0, 12, 12,  0,  0,  0, 12, 12,  0,  0,  0,
-    12, 12,  0,  0,  0,  0, 16, 16, 16, 16, 16,  0,  0,  0, 16, 16,
-    16,  0, 16, 16, 16, 16,  0,  0, 12,  0,  0,  0,  0,  0,  0, 16,
-    12,  9, 12,  0,  0,  0,  0,  0, 16, 16, 16, 16, 16, 12, 12, 12,
-    12, 12,  0,  0,  0, 12, 16, 16, 16, 16, 16, 16, 16,  0, 16, 16,
-     0,  0,  0,  0,  0, 16, 16,  0,  0,  0,  0,  0,  0,  0,  0, 17,
-    12, 16, 16, 16, 17, 12, 12, 12, 12, 12, 12, 12,  0, 12, 12, 12,
-     0,  0,  0,  0,  0,  0, 12,  0,  0, 12, 12,  0,  0,  0,  0,  0,
-    16, 16, 16, 16,  0, 12, 12, 12, 12, 12, 12, 16, 16, 12, 16, 16,
-    16,  0, 16, 16, 16, 16, 12, 12,  0,  0,  0,  0, 12, 12, 12, 16,
-    12, 10, 12, 12, 12, 12, 12, 12,  0,  0, 16, 16,  0, 12, 12, 12,
-     0,  0, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,  0, 12,  0,  0,
-     0,  0, 16,  0,  0,  0,  0, 16, 16, 16, 16, 16, 16,  0, 16,  0,
-     0,  0, 16, 16, 12,  0,  0,  0,  0, 24, 24, 24, 24, 24, 24, 24,
-    24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,  0,  0,  0,  0,  9,
-    24, 24, 24, 24, 24, 24, 24, 12, 11, 11, 18, 18,  0,  0,  0,  0,
-     0, 24, 24,  0, 24,  0, 24, 24, 24, 24, 24,  0, 24, 24, 24, 24,
-    24, 24, 24, 24,  0, 24,  0, 24, 24, 24, 24, 24, 24, 24,  0,  0,
-    24, 24, 24, 24, 24,  0, 24,  0, 11, 11,  0,  0, 24, 24, 24, 24,
-    12, 17, 17, 17, 17, 12, 17, 17,  4, 17, 17, 18,  4,  6,  6,  6,
-     6,  6,  4, 12,  6, 12, 12, 12, 12, 12, 12, 12, 18, 16, 12, 16,
-    12, 16,  1,  2,  1,  2, 16, 16, 12, 12, 12, 12, 12,  0,  0,  0,
-    16, 16, 16, 16, 16, 16, 16, 18, 16, 16, 16, 16, 16, 18, 16, 16,
-    12, 12, 12, 12, 12, 16, 16, 16, 16, 16, 16, 16, 16,  0, 18, 18,
-    12, 12, 12, 12, 12, 12, 16, 12, 17, 17, 18, 17, 12, 12, 12, 12,
-    12,  4,  4,  0,  0,  0,  0,  0, 11, 11, 18, 18, 12, 12, 12, 12,
-    11, 11, 24, 24, 24, 24, 24, 24,  0,  0,  0,  0,  0, 12,  0,  0,
-    31, 31, 31, 31, 31, 31, 31, 31, 32, 32, 32, 32, 32, 32, 32, 32,
-    33, 33, 33, 33, 33, 33, 33, 33, 12, 12, 12,  0,  0, 16, 16, 16,
-    12, 18, 12, 12, 12, 12, 12, 12, 12, 12,  0,  0,  0,  0,  0,  0,
-    18, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,  1,  2,  0,  0,  0,
-    12, 12, 12, 18, 18, 18, 12, 12, 12, 12, 16, 16, 16,  0,  0,  0,
-    12, 12, 16, 16, 16, 18, 18,  0, 12, 12, 16, 16,  0,  0,  0,  0,
-    12,  0, 16, 16,  0,  0,  0,  0, 24, 24, 24, 24, 18, 18,  5, 24,
-    18, 12, 18,  9, 24, 24,  0,  0, 11, 11,  0,  0,  0,  0,  0,  0,
-    12, 12,  6,  6, 18, 18, 17, 12,  6,  6, 12, 16, 16, 16,  4,  0,
-    12, 12, 12, 12, 12, 16, 16, 12, 12, 16, 12,  0,  0,  0,  0,  0,
-    16, 16, 16, 16,  0,  0,  0,  0, 12,  0,  0,  0,  6,  6, 11, 11,
-    24, 24, 24, 24, 24,  0,  0,  0, 24, 24, 24, 24,  0,  0,  0,  0,
-    24, 24,  0,  0,  0,  0,  0,  0, 11, 11, 24,  0,  0,  0, 24, 24,
-    12, 12, 12, 12, 12, 12, 12, 16, 16, 16, 16, 16,  0,  0, 12, 12,
-    24, 24, 24, 24, 24, 24, 24,  0, 24, 24, 24, 24, 24,  0,  0, 16,
-    16, 16, 16, 16, 16, 16, 16,  0, 12, 12, 12, 12, 16, 16, 16, 16,
-    12, 12, 12, 12,  0,  0,  0,  0, 11, 11, 18, 18, 12, 18, 18, 18,
-    16, 16, 16, 12, 12, 12, 12, 12, 16, 16, 16, 16, 16, 16, 12, 12,
-     0,  0,  0, 18, 18, 18, 18, 18, 11, 11,  0,  0,  0, 12, 12, 12,
-    12, 12, 12, 12, 12, 12, 18, 18, 12, 12, 12,  0,  0, 12, 12, 12,
-    16, 16, 16, 12, 16, 16, 16, 16, 16, 12, 12, 12, 12, 16, 12, 12,
-    12, 12, 12, 12, 16, 12, 12, 16, 16, 16, 12,  0,  0,  0,  0,  0,
-    16, 16,  0, 16, 16, 16, 16, 16,  0, 12,  0, 12,  0, 12,  0, 12,
-    12, 12, 12, 12,  0,  0, 12, 12,  0,  0, 12, 12, 12,  0, 12, 12,
-    12, 12, 12, 12, 12, 17, 12,  0, 18, 18, 18, 18, 18, 18, 18,  4,
-    18, 18, 18, 28, 16, 42, 16, 16, 18,  4, 18, 18, 26, 25, 25, 12,
-     3,  3,  1,  3,  3,  3,  1,  3, 25, 25, 12, 12, 14, 14, 14, 18,
-    20, 20, 16, 16, 16, 16, 16,  4, 10, 10, 10, 10, 10, 10, 10, 10,
-    12,  3,  3, 25,  5,  5, 12, 12, 12, 12, 12, 12,  8,  1,  2,  5,
-     5,  5, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 18, 12,
-    18, 18, 18, 18, 12, 18, 18, 18, 30, 12, 12, 12, 12,  0, 16, 16,
-    12, 12,  0,  0, 25, 12, 12, 12, 12, 12, 12, 12, 12,  1,  2, 25,
-    12, 25, 25, 25, 25, 12, 12, 12, 12, 12, 12, 12, 12,  1,  2,  0,
-     9,  9,  9,  9,  9,  9,  9, 10,  9,  9,  9,  9,  9,  9,  9,  9,
-     9,  9,  9,  9,  9,  9, 10,  9,  9,  9,  9, 10,  9,  9, 10,  9,
-    16,  0,  0,  0,  0,  0,  0,  0, 12, 12, 12, 10, 12, 25, 12, 12,
-    12, 12, 12, 25, 12, 12,  9, 12, 12, 25, 25, 12, 12, 12, 12, 12,
-    12, 12, 12, 25, 12, 12, 12, 12, 12, 12, 12, 12, 25, 25, 12, 12,
-    12, 12, 12, 25, 12, 12, 25, 12, 25, 25, 25, 25, 25, 25, 25, 25,
-    25, 25, 25, 25, 12, 12, 12, 12, 25, 25, 12, 12, 12, 12, 12, 12,
-    12, 25, 12, 12,  0,  0,  0,  0, 12, 12, 25, 12, 25, 12, 12, 12,
-    25, 12, 25, 25, 12, 12, 12, 25, 25, 12, 12, 25, 12, 12, 12, 25,
-    12, 25,  9,  9, 12, 25, 12, 12, 12, 12, 25, 12, 12, 25, 25, 25,
-    25, 12, 12, 25, 12, 25, 12, 25, 25, 25, 25, 25, 25, 12, 25, 12,
-    12, 12, 12, 12, 25, 25, 25, 25, 25, 12, 12, 12, 25, 12, 12, 12,
-    12, 12, 25, 12, 12, 12, 12, 12, 25, 25, 12, 12, 25, 25, 25, 25,
-    12, 12, 25, 25, 12, 12, 25, 25, 12, 12, 12, 12, 12, 25, 12, 12,
-    12, 25, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 14,
-     1,  2,  1,  2, 12, 12, 12, 12, 12, 12, 13, 13, 12, 12, 12, 12,
-    12,  1,  2, 12, 12, 12, 12, 12, 13, 13, 13, 13, 12, 12, 12, 12,
-    25, 25, 25, 25, 25, 25, 25, 12, 25, 25, 25, 25, 25, 12, 12, 12,
-    12, 12, 25, 25, 25, 25, 12, 12, 25, 25, 12, 25, 25, 25, 25, 25,
-    25, 25, 12, 12, 12, 12, 25, 25, 25, 12, 12, 25, 12, 12, 25, 25,
-    13, 13, 13, 13, 12, 25, 25, 12, 12, 25, 12, 12, 12, 12, 25, 25,
-    12, 12, 12, 12, 13, 13, 25, 25, 13, 12, 13, 13, 13, 40, 13, 13,
-    12, 13, 13, 13, 12, 12, 12, 12, 25, 12, 25, 12, 12, 12, 12, 12,
-    25, 25, 12, 25, 25, 25, 12, 25, 13, 25, 25, 12, 25, 25, 12, 25,
-    12, 12, 12, 12, 12, 12, 12, 13, 12, 12, 12, 12, 12, 12, 25, 25,
-    12, 12, 12, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-    13, 25, 25, 25, 25, 13, 12, 13, 13, 13, 25, 13, 13, 25, 25, 25,
-    13, 13, 25, 25, 13, 25, 25, 13, 13, 13, 12, 25, 12, 12, 12, 12,
-    25, 25, 13, 25, 25, 25, 25, 25, 25, 13, 13, 13, 13, 13, 25, 13,
-    13, 40, 13, 25, 25, 13, 13, 13, 13, 13, 13, 13, 13, 12, 12, 12,
-    13, 13, 40, 40, 40, 40, 12, 12, 12, 12, 12,  3,  3,  3,  3,  3,
-     3, 12,  6,  6, 13, 12, 12, 12,  1,  2,  1,  2,  1,  2,  1,  2,
-     1,  2,  1,  2,  1,  2, 25, 25, 12, 12, 12, 12, 12,  1,  2, 12,
-    12, 12, 12, 12, 12, 12,  1,  2, 12, 12, 12,  1,  2,  1,  2,  1,
-     2,  1,  2,  1,  2,  1,  2,  1,  2, 12, 12, 12, 12, 12, 12, 12,
-    12, 12, 12, 12,  1,  2, 12, 12, 12, 12, 12, 12, 12, 25, 25, 25,
-    16, 16, 12, 12,  0,  0,  0,  0,  0,  6, 18, 18, 18, 12,  6, 18,
-     0,  0,  0,  0,  0,  0,  0, 12, 18,  0,  0,  0,  0,  0,  0,  0,
-     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3, 18, 18,
-    18, 18, 18, 18, 18, 18, 12, 18,  1, 18, 12, 12,  3,  3, 12, 12,
-     3,  3,  1,  2,  1,  2,  1,  2,  1,  2, 18, 18, 18, 18,  6, 12,
-    18, 18, 12, 18, 18, 12, 12, 12, 12, 12, 26, 26, 18, 18, 18, 12,
-    18, 18,  1, 18, 18, 18, 18, 18, 18, 18, 18, 12, 18, 12, 18, 18,
-    13, 13,  0, 13, 13, 13, 13, 13, 13, 13, 13, 13,  0,  0,  0,  0,
-    13, 13, 13, 13, 13, 13,  0,  0, 18,  2,  2, 13, 13,  5, 13, 13,
-     1,  2, 13, 13,  1,  2,  1,  2,  1,  2,  1,  2,  5,  1,  2,  2,
-    13, 13, 16, 16, 16, 16, 16, 16, 13, 13, 13, 13, 13, 16, 13, 13,
-    13, 13, 13,  5,  5, 13, 13, 13,  0, 38, 13, 38, 13, 38, 13, 38,
-    13, 38, 13, 13, 13, 13, 13, 13, 13, 13, 13, 38, 13, 13, 13, 13,
-    13, 13, 13, 38, 13, 38, 13, 38, 13, 13, 13, 13, 13, 13, 38, 13,
-    13, 13, 13, 13, 13, 38, 38,  0,  0, 16, 16,  5,  5,  5,  5, 13,
-     5, 38, 13, 38, 13, 38, 13, 38, 13, 13, 13, 13, 13, 38, 38, 13,
-    13, 13, 13,  5, 38,  5,  5, 13,  0,  0,  0,  0,  0, 13, 13, 13,
-     0, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,  0,
-    13, 13, 13,  0,  0,  0,  0,  0, 38, 38, 38, 38, 38, 38, 38, 38,
-    13, 13, 13, 13, 13,  5, 13, 13, 13, 13, 13, 13, 13,  0,  0,  0,
-    12, 12, 12, 12, 12, 18,  6, 18, 11, 11, 12, 12,  0,  0,  0,  0,
-    16, 16, 12, 18, 18, 18, 18, 18,  0,  0, 12, 12, 12, 12, 12,  0,
-    12, 12, 16, 12, 12, 12, 16, 12, 12, 12, 12, 16, 12, 12, 12, 12,
-    10, 12,  0,  0,  0,  0,  0,  0, 12, 12, 12, 12, 17, 17,  6,  6,
-    16, 16, 16, 16, 16, 16,  0,  0,  0,  0,  0,  0,  0,  0, 18, 18,
-    12, 12, 12, 12, 17, 12, 12, 16, 16, 16, 16, 16, 16, 16, 18, 18,
-    31, 31, 31, 31, 31,  0,  0,  0, 16, 12, 12, 12, 12, 12, 12, 18,
-    18, 18, 12, 12, 12, 12,  0, 12, 11, 11,  0,  0,  0,  0, 12, 12,
-    11, 11, 24, 24, 24, 24, 24,  0, 12, 12, 12, 12, 16, 16,  0,  0,
-    11, 11,  0,  0, 12, 18, 18, 18, 24, 24, 24,  0,  0,  0,  0,  0,
-     0,  0,  0, 24, 24, 24, 24, 24, 18, 18, 12, 12, 12, 16, 16,  0,
-     0, 12, 12, 12, 12, 12, 12,  0, 16, 16, 16, 18, 16, 16,  0,  0,
-    34, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
-    35, 35, 35, 35, 34, 35, 35, 35, 35, 35, 35, 35,  0,  0,  0,  0,
-    32, 32, 32, 32, 32, 32, 32,  0,  0,  0,  0, 33, 33, 33, 33, 33,
-    33, 33, 33, 33,  0,  0,  0,  0, 27, 27, 27, 27, 27, 27, 27, 27,
-     0,  0,  0, 12, 12, 12, 12, 12,  0,  0,  0,  0,  0, 37, 16, 37,
-    37, 12, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,  0,
-    37, 37, 37, 37, 37,  0, 37,  0, 37, 37,  0, 37, 37,  0, 37, 37,
-    12, 12, 12, 12, 12, 12,  2,  1, 12, 12, 12, 12, 10, 12,  0,  0,
-     8,  2,  2,  8,  8,  6,  6,  1,  2, 14,  0,  0,  0,  0,  0,  0,
-    13, 13, 13, 13, 13,  1,  2,  1,  2,  1,  2,  1,  2, 13, 13,  1,
-     2, 13, 13, 13, 13, 13, 13, 13,  2, 13,  2,  0,  5,  5,  6,  6,
-    13,  1,  2,  1,  2,  1,  2, 13, 13,  9, 10, 13,  0,  0,  0,  0,
-    12, 12, 12, 12, 12,  0,  0, 30,  0,  6, 13, 13,  9, 10, 13, 13,
-     1,  2, 13, 13,  2, 13,  2, 13, 13, 13,  5,  5, 13, 13, 13,  6,
-    13, 13, 13,  1, 13,  2, 13, 13, 13, 13, 13,  1, 13,  2, 13,  1,
-     2,  2,  1,  2,  2,  5, 13, 38, 38, 13, 13, 13, 13, 13, 13, 13,
-    13, 13, 13, 13, 13, 13,  5,  5,  0,  0, 13, 13, 13, 13, 13, 13,
-     0,  0, 13, 13, 13,  0,  0,  0, 10,  9, 13, 13, 13,  9,  9,  0,
-     0, 16, 16, 16, 23, 25,  0,  0, 12, 12, 12,  0, 12, 12,  0, 12,
-    18, 18, 18,  0,  0,  0,  0, 12, 12, 12, 12, 12,  0,  0,  0, 12,
-    12, 12, 12, 12, 12, 16,  0,  0,  0,  0,  0,  0,  0, 12, 12, 12,
-    16, 16, 16,  0,  0,  0,  0,  0, 12, 12, 12, 12, 12, 12,  0, 18,
-    18, 12, 12, 12, 12, 12,  0,  0, 12,  0,  0,  0, 12,  0,  0, 12,
-    12, 12, 12,  0, 12, 12,  0,  0, 12, 12, 12, 12,  0,  0,  0, 18,
-    12, 12,  0,  0,  0,  0,  0, 12, 12, 16, 16, 16,  0, 16, 16,  0,
-     0,  0,  0,  0, 16, 16, 16, 16, 18, 18, 18, 18, 18, 18, 18, 18,
-    12, 12, 12, 12, 12, 16, 16,  0, 18, 18, 18, 18, 18, 18, 14,  0,
-     0, 18, 18, 18, 18, 18, 18, 18,  0, 12, 12, 12, 12,  0,  0,  0,
-    12, 12, 12, 12, 12, 12, 11, 11, 16, 16, 16, 12, 12, 12, 18, 18,
-    18, 18,  0,  0,  0,  0,  0,  0, 16, 16, 16, 16, 16,  0, 11, 11,
-    18, 18, 18, 18, 12, 16, 16,  0, 12, 12, 12, 16, 12, 17, 12,  0,
-    16, 12, 12, 12, 12, 18, 18, 12, 18, 16, 16, 16, 16, 12,  0,  0,
-    11, 11, 12, 17, 12, 18, 18, 18, 18, 18, 12, 18, 18, 12, 16,  0,
-    12,  0, 12, 12, 12, 12,  0, 12, 12, 18,  0,  0,  0,  0,  0,  0,
-    12, 12,  0, 16, 16, 12, 16, 16, 12, 12, 16, 16,  0,  0, 16, 16,
-    16, 16, 16, 16, 16,  0,  0,  0, 16, 16, 16, 16, 16, 16, 16, 12,
-    12, 12, 12, 18, 18, 18, 18, 12, 11, 11,  0, 18,  0, 12, 16, 12,
-    16, 17, 18, 18,  6,  6, 12, 12, 12, 18, 18, 18, 18, 18, 18, 18,
-    16, 18, 18, 12, 12,  0,  0,  0, 17, 17, 17, 17, 17, 17, 17, 17,
-    17, 17, 17, 17, 17,  0,  0,  0, 24, 24, 24,  0,  0, 24, 24, 24,
-    11, 11, 24, 24, 18, 18, 18, 24, 16, 16, 16, 12,  0,  0,  0,  0,
-     0,  0, 16, 16, 16, 16, 16, 16, 16, 12, 17, 12, 16,  0,  0,  0,
-    16, 16, 12, 16, 16, 16, 16, 17, 12, 18, 18, 18, 18, 17, 12, 16,
-    12, 12, 16, 16, 16, 16, 16, 16, 16, 16, 18, 18, 18, 12, 17, 17,
-    17, 18, 18,  0,  0,  0,  0,  0, 12, 18, 18, 18, 18, 18,  0,  0,
-    17,  6, 12, 12, 12, 12, 12, 12, 12, 16, 16, 16, 16, 16, 16,  0,
-     0,  0, 16,  0, 16, 16,  0, 16, 16, 16, 16, 16, 16, 16, 12, 16,
-    12, 12, 16, 16, 16, 16, 16,  0, 12, 12, 12, 16, 16, 16, 16, 12,
-    12, 12, 12, 12, 12, 10, 10, 10, 10, 12, 12, 12, 12, 12, 12, 12,
-     0,  0,  0,  0,  0,  0,  0, 18, 18, 18, 18, 18, 18,  0,  0,  0,
-     1,  1,  1,  2,  2,  2, 12, 12, 12, 12,  2, 12, 12, 12,  1,  2,
-     1,  2, 12, 12, 12, 12, 12, 12, 12,  1,  2,  2, 12, 12, 12, 12,
-     4,  4,  4,  4,  4,  4,  4,  1,  2,  0,  0,  0,  0,  0,  0,  0,
-    11, 11,  0,  0,  0,  0, 18, 18, 16, 16, 16, 16, 16, 18,  0,  0,
-    18, 18, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 18, 12,  0,  0,
-    11, 11,  0, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 18,
-    18, 12, 12,  0,  0,  0,  0,  0, 12, 12, 12,  0,  0,  0,  0, 16,
-     5,  5,  5,  5,  0,  0,  0,  0, 38, 38, 38,  0,  0,  0,  0,  0,
-     0,  0,  0,  0, 38, 38, 38, 38, 12, 12,  0,  0, 12, 16, 16, 18,
-    16, 16, 12, 12, 12, 16, 16, 16, 16, 16, 16, 12, 12, 16, 16, 16,
-    12, 12, 16, 16, 16, 16, 12, 12, 12, 12, 16, 16, 16, 12,  0,  0,
-     0,  0, 12,  0,  0, 12, 12,  0,  0, 12, 12, 12, 12,  0, 12, 12,
-    12, 12,  0, 12,  0, 12, 12, 12, 12, 12,  0, 12, 12, 12, 12,  0,
-    12, 12, 12, 12, 12,  0, 12,  0, 12, 12, 12, 12,  0,  0, 11, 11,
-    12, 12, 12, 12, 12, 16, 12, 12, 12, 12, 12, 12, 16, 12, 12, 18,
-    18, 18, 18, 12,  0,  0,  0,  0, 16,  0,  0, 16, 16, 16, 16, 16,
-    16, 16,  0, 16, 16,  0, 16, 16, 11, 11,  0,  0,  0,  0,  0,  9,
-    11, 11,  0,  0,  0,  0,  1,  1, 12, 12, 12, 12, 10, 12, 12, 12,
-    10, 12, 12, 12, 12,  0,  0,  0,  0, 12, 12,  0, 12,  0,  0, 12,
-    12, 12, 12,  0, 12, 12, 12, 12,  0, 12,  0, 12,  0,  0,  0,  0,
-     0,  0, 12,  0,  0,  0,  0, 12,  0, 12,  0, 12,  0, 12, 12, 12,
-     0, 12, 12, 12,  0, 12, 12, 12, 25, 25, 25, 25, 25, 13, 13, 13,
-    25, 25, 25, 25, 25, 25, 12, 12, 25, 25, 12, 12, 12, 13, 13, 13,
-    13, 13, 13, 13, 13, 13, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39,
-    13, 13, 13, 13, 13, 40, 13, 13, 13, 13, 13, 13, 12, 12, 13, 13,
-    13, 13, 13, 13, 13, 12, 12, 13, 13, 13, 13, 13, 12, 13, 13, 13,
-    13, 13, 40, 40, 40, 13, 13, 40, 13, 13, 40, 40, 40, 13, 13, 13,
-    13, 13, 13, 41, 41, 41, 41, 41, 13, 13, 40, 40, 13, 13, 40, 40,
-    40, 40, 40, 40, 40, 40, 40, 40, 40, 13, 13, 13, 13, 13, 13, 13,
-    13, 13, 13, 13, 13, 13, 40, 40, 40, 13, 13, 13, 40, 13, 13, 13,
-    13, 40, 40, 40, 13, 40, 40, 40, 13, 13, 13, 13, 13, 13, 13, 40,
-    13, 40, 13, 13, 13, 13, 13, 13, 12, 13, 12, 13, 12, 13, 13, 13,
-    13, 13, 40, 13, 13, 13, 13, 12, 13, 12, 12, 13, 13, 13, 13, 13,
-    13, 13, 13, 13, 13, 13, 13, 12, 13, 13, 12, 12, 12, 12, 12, 12,
-    12, 12, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 40, 40, 13, 13,
-    13, 13, 40, 13, 13, 13, 13, 13, 40, 13, 13, 13, 13, 40, 40, 13,
-    12, 12, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13, 13, 40, 40, 40,
-    13, 13, 13, 40, 40, 40, 40, 40, 12, 12, 12, 12, 12, 12,  3,  3,
-     3,  5,  5,  5, 12, 12, 12, 12, 13, 13, 13, 40, 13, 13, 13, 13,
-    13, 13, 13, 13, 40, 40, 40, 13, 13, 13, 13, 13, 40, 13, 13, 13,
-    12, 12, 12, 12, 12, 12, 13, 13, 12, 12, 12, 12, 13, 13, 13, 40,
-    13, 13, 13, 13, 13, 13, 40, 13, 40, 40, 13, 13, 40, 40, 40, 13,
-    13, 13, 13, 13, 13, 40, 40, 13, 40, 40, 13, 40, 13, 13, 13, 13,
-    13, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 13, 13,
+static RE_UINT8 re_terminal_punctuation_table_2[] = {
+     0,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  2,  3,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  4,  0,  5,  0,
+     6,  0,  0,  0,  0,  0,  7,  0,  8,  0,  0,  0,  0,  0,  0,  9,
+     0, 10,  2,  0,  0,  0,  0,  0,  0,  0,  0, 11,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0, 12,  0,  0,  0,  0,  0, 13,  0,  0,  0,  0,  0,  0,  0,
+     0,  0, 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 15,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0, 16,  0,  0,  0, 17,  0, 18,  0,  0,  0,  0, 19,  0,
+    20,  0,  0,  0,  0,  0,  0,  0,  0,  0, 11,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0, 21,  0,  0,  0,  0, 22,  0,  0,  0,  0,  0,
+     0, 23,  0, 24,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0, 25, 26,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0, 27, 28,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    29,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0, 24,  0,  0,  0,  0,  0,  0,  0,  0,
+    30,  0,  0,  0,  0,  0,  0, 31,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0, 32,  0,  0, 33,  0,  0, 34,  0,  0,  0,  0, 26,  0,
+     0,  0, 35,  0,  0,  0, 36, 37,  0,  0,  0,  0,  0,  0,  0, 38,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0, 39,  0,  0,  0,  0,  0,  1,  0,  0, 40,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 36,  0, 41,  0,
+     0,  0, 42,  0,  0,  0,  0,  0, 36,  0,  0,  0,  0,  0,  0,  0,
+     0,  0, 32,  0,  0,  0,  0, 43,  0, 44,  0,  0, 45,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 46,  0,  0,  0,  0,  0,
+     0,  0, 47,  0,  0, 24, 48,  0,  0,  0, 49,  0,  0,  0, 50,  0,
+     0, 51,  0,  0,  0,  4,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0, 52,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 53,  0,
+     0,  0, 29,  0,  0,  0,  0,  0,  0, 54,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 55,  0,  0,  0,  0,  0,
+     0,  0, 56,  0, 57, 29,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0, 49, 58,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0, 59,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0, 60,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0, 33,  0,  0,  0, 61,  0, 62, 63,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0, 59,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0, 36,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0, 64,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0
 };
 
-/* Line_Break: 12816 bytes. */
-
-RE_UINT32 re_get_line_break(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-
-    f = ch >> 12;
-    code = ch ^ (f << 12);
-    pos = (RE_UINT32)re_line_break_stage_1[f] << 5;
-    f = code >> 7;
-    code ^= f << 7;
-    pos = (RE_UINT32)re_line_break_stage_2[pos + f] << 4;
-    f = code >> 3;
-    code ^= f << 3;
-    pos = (RE_UINT32)re_line_break_stage_3[pos + f] << 3;
-    value = re_line_break_stage_4[pos + code];
-
-    return value;
-}
-
-/* Numeric_Type. */
-
-static RE_UINT8 re_numeric_type_stage_1[] = {
-     0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14,  8,
-    15, 16, 17,  8, 18, 19,  8,  8,  8,  8,  8,  8,  8,  8,  8, 20,
-    21, 22, 23, 24, 25,  8,  8,  8,  8,  8,  8,  8,  8, 26,  8,  8,
-     8,  8,  8,  8,  8,  8,  8,  8,  8,  8, 27,  8, 28, 29, 30,  8,
-    31, 32,  8,  8, 33, 34,  8, 35,  8,  8,  8,  8, 36,  8,  8,  8,
-     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8, 37,
-     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
-     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
-     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
-     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
-     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
-     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
-     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
-     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
-     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
-     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
-     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
-     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
-     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
-     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
-     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
-     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
-     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
-     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
-     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
-     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
-     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
-     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
-     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
-     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
-     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
-     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
-     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
-     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+static RE_UINT8 re_terminal_punctuation_table_3[] = {
+      0,   0,   0,   0,   2,  80,   0, 140,   0,   0,   0,  64, 128,   0,   0,   0,
+      0,   2,   0,   0,   8,   0,   0,   0,   0,  16,   0, 200,   0,   0,  16,   0,
+    255,  23,   0,   0,   0,   0,   0,   3,   0,   0, 255, 127,  48,   0,   0,   0,
+      0,   0,   0,  12,   0, 225,   7,   0,   0,  12,   0,   0, 254,   1,   0,   0,
+      0,  64,   0,   0,   0,  56,   0,   0,   0,   0,  96,   0,   0,   0, 112,   4,
+     60,   3,   0,   0,   0,  15,   0,   0,   0,   0,   0, 236,   0,   0,   0, 248,
+      0,   0,   0, 192,   0,   0,   0,  48, 128,   3,   0,   0,   0,  64,   0,  16,
+      2, 208,   0,   0,   6,   0,   0,   0,   0, 224,   0,   0,   0,   0, 248,   0,
+      0,   0, 192,   0,   0, 192,   0,   0,   0, 128,   0,   0,   0,   0,   0, 224,
+      0,   0,   0, 128,   0,   0,   3,   0,   0,   8,   0,   0,   0,   0, 247,   0,
+     18,   0,   0,   0,   0,   0,   1,   0,   0,   0, 128,   0,   0,   0,  63,   0,
+      0,   0,   0, 252,   0,   0,   0,  30,   0,   0, 224,   3, 128,  63,   0,   0,
+      3,   0,   0,   0,  14,   0,   0,   0,  96,  32,   0, 192,   0,   0,   0,  31,
+      0,  56,   0,  12,  60, 254, 255,   0,   0,   0,   0, 112,  80,   0,   0,   0,
+     12,   0,   0,   0,   0,   0,   0,  24,   0,   0,   2,   0,   0,   0, 128,   1,
+      0,   0,  31,   0,   0,   0,  32,   0,   0,   0, 128,   3,  16,   0,   0,   0,
+    128,   7,   0,   0
 };
 
-static RE_UINT8 re_numeric_type_stage_2[] = {
-      0,   1,   2,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   3,   1,   0,   1,   1,   1,   4,
-      1,   1,   1,   1,   1,   5,   1,   6,   1,   5,   1,   5,   1,   7,   1,   8,
-      1,   9,   1,   5,   1,  10,   1,   5,   1,  11,   1,  11,  12,   1,   1,   1,
-      1,   4,  11,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,  13,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,  14,   1,   1,   1,  15,
-     11,   1,   1,   1,   1,  16,   1,  17,   1,   1,  18,   1,   1,  11,   0,   1,
-      1,  18,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,  19,  20,   1,   1,  21,  22,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,  23,  24,  25,   1,   1,   1,   1,   1,   1,   1,   1,   1,  26,  27,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   1,  28,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-     29,   1,   1,   1,   1,   1,  30,   1,  31,  32,  33,   1,   1,   1,   1,   1,
-     34,   1,  35,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-     36,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,  37,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,  38,  39,  40,  41,  37,  42,   1,   1,
-      1,   1,   1,   1,  43,  44,   1,   1,   1,   1,   1,   1,   1,  45,   1,  46,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,  47,   1,   1,   1,   1,
-      1,   1,   1,  48,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,  49,   1,  50,  51,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,  52,   1,  53,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,  54,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,  55,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,  56,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,  52,   1,   1,   1,   1,   1,   1,
-      1,   1,  55,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-     57,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,  58,   1,  42,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,  59,  60,   1,  61,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   3,   1,   1,  62,   1,   1,   1,   1,
-     63,   1,   1,  11,   4,   1,   1,  64,   1,  11,   1,   1,   1,   1,   1,   0,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,  65,  66,  67,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,  11,   1,   1,   1,
-      1,   1,   1,   1,  68,  69,  70,   1,   1,   1,   1,  71,  72,  73,   1,  74,
-      1,   1,   3,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,  75,  76,  77,  78,   1,  79,  80,   1,  81,  82,  83,   1,  84,  85,   1,
-      1,   1,   1,  86,   0,   1,   1,   1,   1,  87,   1,   1,  88,  89,   1,   1,
-      1,  90,   1,   0,  91,   1,   1,  92,   1,   1,   1,   0,   1,   1,   1,   1,
-      1,  11,   1,  11,   1,   1,   1,   1,   1,  11,   1,   4,  93,   1,   1,   1,
-      1,   1,   1,  94,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,  95,   1,   1,   1,  11,   3,   1,   1,   1,   1,   1,   1,   1,   1,  96,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-     97,  98,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   3,   1,   1,   1,  99,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1, 100,   1,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1, 101,   1, 102,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1, 103,
-      1,   1,   1,   1,   1,   4,   1,   1,   1,   1,   1,   0,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   1, 104,   1,  11,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1, 105, 106,   1, 107,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   1,   1, 108,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-    109, 110,   1, 111,  59,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   1,   1,  36,   1, 112,   1,   1,   1,   1, 113, 114,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1, 115,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1, 116,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,  47,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1, 117,   1,   1,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,   1, 115,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-};
+RE_UINT32 re_get_terminal_punctuation(RE_UINT32 codepoint) {
+    RE_UINT32 field_2;
+    RE_UINT32 field_1;
+    RE_UINT32 field_0;
+    RE_UINT32 offset;
+    RE_UINT32 v;
 
-static RE_UINT8 re_numeric_type_stage_3[] = {
-     0,  0,  0,  0,  0,  0,  1,  2,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0,  3,  4,  0,  0,  0,  0,  1,  2,  0,  0,
-     1,  2,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  5,  1,  0,  0,
-     0,  0,  0,  0,  5,  1,  6,  7,  0,  0,  0,  0,  5,  1,  8,  0,
-     0,  0,  0,  0,  5,  1,  9,  0,  0,  0,  0,  0,  5,  1,  0, 10,
-     0,  0,  0, 10,  5,  1, 11, 12,  0,  0,  1,  2,  0,  0,  0,  0,
-     0,  0,  0,  0,  1, 13, 14,  0,  0,  0,  0,  0,  0, 15, 16, 17,
-     0,  0,  0,  0,  0, 18, 12,  0,  0,  0,  0,  0,  1,  2, 11,  7,
-     5,  1,  0,  0,  0,  0,  0,  0,  0,  0,  1, 19,  0,  0,  0,  0,
-     1,  2,  1,  2,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 20, 21,
-    22, 21,  0,  0,  0,  0,  0,  0,  0,  0, 11, 11, 11, 11, 11, 11,
-    23,  7,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 22, 24, 25, 26,
-    11, 22, 24, 14,  0,  0,  0,  0,  0,  0,  0,  0,  0, 27, 28, 29,
-     0,  0,  0,  0,  0,  0, 30, 31, 22, 32, 33,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0,  0, 34, 35,  0,  0,  0, 36,  7,  0,  9,
-     0,  0, 37,  0,  0,  0,  0,  0,  0,  0,  0,  0, 11,  7,  0,  0,
-     0, 11, 36, 11,  0,  0,  0,  0, 11,  7,  0,  0,  0,  0, 36, 11,
-    34,  0,  0,  0,  0,  0,  0,  0, 38,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0, 39,  0,  0,  0, 34,  0,  0,  0,  0,  0,  0,
-    40, 41,  0,  0,  0,  0,  0,  0,  0,  0,  0, 34,  0,  0,  0,  0,
-     0, 42, 43,  0,  0,  0,  0, 35, 12,  0,  0, 35,  0, 12,  0,  0,
-     0,  0,  0,  0,  0,  0, 12,  0, 42,  0,  0,  0,  0,  0,  0,  0,
-    44,  0,  0,  0,  0, 45,  0,  0, 46, 42,  0,  0,  0,  0,  0,  0,
-    47,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 38,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0, 41, 41,  0,  0,  0,  0,  0,  0,  0, 39,
-     0,  0,  0,  0,  0,  0,  0, 18,  0, 48, 12,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0,  0, 44,  0, 42,  0,  0,  0,  0,  0,  0,
-     0,  0, 39,  0,  0,  0,  0,  0, 44,  0,  0,  0,  0,  0,  0,  0,
-     0,  0, 44,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 42,  0,  0,
-     0,  0,  0,  0,  0, 44, 38,  0,  0,  0,  0,  0, 41,  0,  0,  0,
-    44, 42,  0,  0,  0,  0,  0, 12,  0,  0,  0,  0,  0,  0, 44,  0,
-     0,  0,  0,  0, 18, 11,  0,  0,  0,  0,  0,  0,  0,  0, 49,  0,
-     0,  0,  1,  2,  0,  0,  1,  2,  0,  0,  0,  0,  0, 38, 38, 12,
-     0,  0,  0,  0,  0,  0, 39,  0,  0,  0, 50,  0,  0,  0,  0, 34,
-    35, 11, 11, 11, 11, 11, 14,  0, 11, 11, 11, 11, 11, 11, 11, 12,
-     0, 51,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 36, 11, 11, 14,
-     0,  0,  0,  0, 14,  0,  0,  0, 41, 39,  0,  0,  0,  0,  0,  0,
-     0,  0, 52,  0,  0,  0,  0,  0,  0,  0,  0, 11,  0,  0,  0, 36,
-     0,  0,  0,  0, 35, 11,  0,  0,  0,  0,  0,  0,  0,  0,  0, 53,
-     0,  0, 18, 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 54,
-    11, 11,  8, 11, 11, 11, 11, 11, 55, 12,  0,  0,  0,  0,  0, 56,
-     0,  0,  0, 57,  0,  0,  0,  0,  0,  0,  0,  0,  0, 53,  0,  0,
-     0,  0,  0, 11,  0,  0,  0, 11,  0,  0,  0,  0,  0, 36,  0,  0,
-     0,  0,  0,  0,  0,  0,  0,  8,  0,  0,  0,  0, 22, 24, 11, 10,
-     0,  0,  0, 57, 10,  0,  0,  0,  0,  0, 47,  0,  0,  0,  0,  0,
-     0,  0, 58, 59, 60,  1,  0,  0,  0,  0,  0,  0,  0,  0,  5,  1,
-     0,  0,  1,  2, 36, 11, 17,  0,  0,  0,  0,  0,  0,  0,  1, 61,
-     0,  0,  0,  0,  1, 13,  9,  0,  0,  0,  1, 13, 11, 17,  0,  0,
-    11, 11, 17,  0,  0,  0,  0,  0, 11, 11, 11, 11, 11, 11, 11, 11,
-    11, 11, 11, 11, 11, 10,  0,  0,  0,  0,  1, 62,  7,  0,  0,  0,
-    11, 11, 10,  0,  0,  0,  0,  0,  0,  0,  0,  0, 11, 11, 14,  0,
-     0,  0,  0,  0, 11, 11, 11, 12,  0,  5,  1,  1,  1,  1,  1,  1,
-    35, 11,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 36, 11,
-    11, 11, 11, 11, 11, 63, 47,  0, 36, 11, 11, 11, 11, 64, 11, 49,
-    22, 65,  0,  0,  0,  0,  0,  0, 41,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0, 42,  0,  0,  0,  0,  0,  0,  0, 39,  0,  0,  0,
-    38, 42,  0, 42,  0,  0,  0,  0,  0,  0,  0,  0,  0, 39,  0, 34,
-     0,  0,  0, 41,  0,  0,  0,  0,  0,  0, 12,  0,  0,  0,  0,  0,
-     0,  0,  0, 12,  0,  0,  0,  0,  0,  0,  0,  0,  0, 34,  0,  0,
-};
+    field_2 = codepoint >> 10;
+    field_1 = (codepoint >> 5) & 0x1F;
+    field_0 = (codepoint >> 3) & 0x3;
+    offset = codepoint & 0x7;
 
-static RE_UINT8 re_numeric_type_stage_4[] = {
-    0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3,
-    3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0,
-    0, 2, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 3, 3,
-    0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0,
-    0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0,
-    1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 0, 0, 0, 0, 0, 0, 0, 3, 3, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 1, 1, 3, 3, 2, 0, 0, 0, 0, 0,
-    2, 0, 0, 0, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0,
-    2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 0, 0, 1, 1, 1,
-    2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 1, 1, 1, 0, 0, 2, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2,
-    0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1,
-    2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
-    0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0,
-    0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0,
-    1, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0,
-    0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 0,
-    0, 1, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0,
-    0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0,
-    0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0,
-    0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1,
-    0, 0, 0, 0, 1, 1, 0, 0, 2, 2, 2, 2, 1, 1, 1, 1,
-    0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1,
-    0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 3, 3, 3, 3, 1, 1, 0, 0, 0, 0,
-    3, 3, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 0, 1, 2, 2, 2, 1, 1, 0, 0, 0,
-};
+    v = re_terminal_punctuation_table_1[field_2];
+    v = re_terminal_punctuation_table_2[(v << 5) | field_1];
+    v = re_terminal_punctuation_table_3[(v << 2) | field_0];
 
-/* Numeric_Type: 3232 bytes. */
-
-RE_UINT32 re_get_numeric_type(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-
-    f = ch >> 11;
-    code = ch ^ (f << 11);
-    pos = (RE_UINT32)re_numeric_type_stage_1[f] << 5;
-    f = code >> 6;
-    code ^= f << 6;
-    pos = (RE_UINT32)re_numeric_type_stage_2[pos + f] << 3;
-    f = code >> 3;
-    code ^= f << 3;
-    pos = (RE_UINT32)re_numeric_type_stage_3[pos + f] << 3;
-    value = re_numeric_type_stage_4[pos + code];
-
-    return value;
+    return (v >> offset) & 0x1;
 }
 
-/* Numeric_Value. */
-
-static RE_UINT8 re_numeric_value_stage_1[] = {
-     0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14,  8,
-    15, 16, 17,  8, 18, 19,  8,  8,  8,  8,  8,  8,  8,  8,  8, 20,
-    21, 22, 23, 24, 25,  8,  8,  8,  8,  8,  8,  8,  8, 26,  8,  8,
-     8,  8,  8,  8,  8,  8,  8,  8,  8,  8, 27,  8, 28, 29, 30,  8,
-    31, 32,  8,  8, 33, 34,  8, 35,  8,  8,  8,  8, 36,  8,  8,  8,
-     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8, 37,
-     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
-     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
-     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
-     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
-     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
-     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
-     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
-     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
-     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
-     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
-     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
-     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
-     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
-     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
-     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
-     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
-     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
-     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
-     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
-     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
-     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
-     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
-     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
-     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
-     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
-     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
-     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
-     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+/* Unified_Ideograph. */
+static RE_UINT8 re_unified_ideograph_table_1[] = {
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  1,  1,
+     1,  1,  1,  2,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  3,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  4,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  5,  1,  1,  1,  6,  7,  1,
+     1,  1,  1,  8,  1,  1,  1,  1,  1,  1,  9,  0,  0,  0,  0,  0,
+     1,  1,  1,  1, 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0
 };
 
-static RE_UINT8 re_numeric_value_stage_2[] = {
-      0,   1,   2,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   3,   1,   0,   1,   1,   1,   4,
-      1,   1,   1,   1,   1,   5,   1,   6,   1,   5,   1,   5,   1,   7,   1,   8,
-      1,   9,   1,   5,   1,  10,   1,   5,   1,  11,   1,  11,  12,   1,   1,   1,
-      1,   4,  11,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,  13,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,  14,   1,   1,   1,  15,
-     11,   1,   1,   1,   1,  16,   1,  17,   1,   1,  18,   1,   1,  11,   0,   1,
-      1,  18,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,  19,   4,   1,   1,  20,  21,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,  22,  23,  24,   1,   1,   1,   1,   1,   1,   1,   1,   1,  25,  26,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   1,  27,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-     28,   1,   1,   1,   1,   1,  29,   1,  30,  31,  32,   1,   1,   1,   1,   1,
-     33,   1,  34,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-     35,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,  36,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,  37,  38,  39,  40,  41,  42,   1,   1,
-      1,   1,   1,   1,  43,  44,   1,   1,   1,   1,   1,   1,   1,  45,   1,  46,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,  47,   1,   1,   1,   1,
-      1,   1,   1,  48,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,  49,   1,  50,  51,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,  52,   1,  53,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,  54,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,  55,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,  56,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,  57,   1,   1,   1,   1,   1,   1,
-      1,   1,  58,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-     59,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,  60,   1,  61,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,  62,  63,   1,  64,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   3,   1,   1,  65,   1,   1,   1,   1,
-     66,   1,   1,  11,   4,   1,   1,  67,   1,  11,   1,   1,   1,   1,   1,   0,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,  68,  69,  70,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,  11,   1,   1,   1,
-      1,   1,   1,   1,  71,  72,  73,   1,   1,   1,   1,  74,  75,  76,   1,  77,
-      1,   1,   3,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,  78,  79,  80,  81,   1,  82,  83,   1,  84,  85,  86,   1,  87,  88,   1,
-      1,   1,   1,  89,   0,   1,   1,   1,   1,  90,   1,   1,  91,  92,   1,   1,
-      1,  93,   1,   0,  94,   1,   1,  95,   1,   1,   1,   0,   1,   1,   1,   1,
-      1,  11,   1,  11,   1,   1,   1,   1,   1,  11,   1,   4,  96,   1,   1,   1,
-      1,   1,   1,  97,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,  98,   1,   1,   1,  11,   3,   1,   1,   1,   1,   1,   1,   1,   1,  99,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-    100, 101,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   3,   1,   1,   1, 102,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1, 103,   1,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1, 104,   1, 105,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1, 106,
-      1,   1,   1,   1,   1,   4,   1,   1,   1,   1,   1,   0,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   1, 107,   1,  11,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1, 108, 109,   1, 110,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   1,   1, 111,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-    112, 113,   1, 114, 115,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   1,   1, 116,   1, 117,   1,   1,   1,   1, 118, 119,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1, 120,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1, 121,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1, 122,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1, 123,   1,   1,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,   1, 124,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+static RE_UINT8 re_unified_ideograph_table_2[] = {
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    3, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 5, 0, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 6, 1, 1, 1, 1, 1, 1,
+    5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 8,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 9, 0, 0, 0, 0, 0
 };
 
-static RE_UINT8 re_numeric_value_stage_3[] = {
-      0,   0,   0,   0,   0,   0,   1,   2,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   3,   4,   0,   0,   0,   0,   1,   2,   0,   0,
-      1,   2,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   5,   6,   0,   0,
-      0,   0,   0,   0,   5,   6,   7,   8,   0,   0,   0,   0,   5,   6,   9,   0,
-      0,   0,   0,   0,   5,   6,  10,   0,   0,   0,   0,   0,   5,   6,   0,  11,
-      0,   0,   0,  12,   5,   6,  13,  14,   0,   0,   1,   2,   0,   0,   0,   0,
-      0,   0,   0,   0,   1,  15,  16,   0,   0,   0,   0,   0,   0,  17,  18,  19,
-      0,   0,   0,   0,   0,  20,  21,   0,   0,   0,   0,   0,   1,   2,   1,   2,
-      5,   6,   0,   0,   0,   0,   0,   0,   0,   0,   1,  22,   0,   0,   0,   0,
-      1,   2,   1,   2,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  23,   2,
-      0,   0,  24,  25,  26,  27,  26,  27,  28,  29,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,  26,  30,  31,  32,  33,  26,  30,  34,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,  35,  36,  37,   0,   0,   0,   0,   0,   0,  38,  39,
-     26,  40,  41,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  42,
-     43,   0,   0,   0,  17,   2,   0,  44,   0,   0,  45,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,  26,  46,   0,   0,   0,  47,  48,  49,   0,   0,   0,   0,
-     26,  46,   0,   0,   0,   0,  50,  51,  52,   0,   0,   0,   0,   0,   0,   0,
-     53,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  54,   0,   0,
-      0,  55,   0,   0,   0,   0,   0,   0,  56,  57,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,  58,   0,   0,   0,   0,   0,  59,  60,   0,   0,   0,   0,  61,
-     62,   0,   0,  63,   0,  64,   0,   0,   0,  52,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,  65,   0,  66,   0,   0,   0,   0,   0,   0,   0,
-     67,   0,   0,   0,   0,  68,   0,   0,  69,  70,   0,   0,   0,   0,   0,   0,
-     71,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  72,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,  73,  73,   0,   0,   0,   0,   0,   0,   0,  74,
-      0,   0,   0,   0,   0,   0,   0,  75,   0,  76,  77,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,  78,   0,  79,   0,   0,   0,   0,   0,   0,
-      0,   0,  80,   0,   0,   0,   0,   0,  81,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,  82,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  83,
-     84,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  85,   0,   0,
-      0,   0,   0,   0,   0,  86,  53,   0,   0,   0,   0,   0,   0,   0,  77,   0,
-      0,   0,   0,   0,  87,   0,   0,   0,  88,  89,   0,   0,   0,   0,   0,  90,
-      0,   0,   0,   0,   0,   0,  91,   0,   0,   0,   0,   0,  38,  92,   0,   0,
-      0,   0,   0,   0,   0,   0,  93,   0,   0,   0,   1,   2,   0,   0,   1,   2,
-      0,   0,   0,   0,   0,  94,  95,  77,   0,   0,   0,   0,   0,   0,  96,   0,
-      0,   0,  97,   0,   0,   0,   0,  98,  99,   6,  47, 100, 101, 102, 103,   0,
-    104, 105, 106, 107, 108, 109, 110, 111,   0, 112,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,  17,  18, 113, 114,   0,   0,   0,   0, 115,   0,   0,   0,
-    116, 117,   0,   0,   0,   0,   0,   0,   0,   0, 118,   0,   0,   0,   0,   0,
-      0,   0,   0, 119,   0,   0,   0, 120,   0,   0,   0,   0,  99, 121,   0,   0,
-      0,   0,   0,   0,   0,   0,   0, 122,   0,   0, 123, 124,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0, 125,  26, 126, 127, 128, 129, 130, 131, 132,
-    133, 134,   0,   0,   0,   0,   0, 135,   0,   0,   0, 136,   0,   0,   0,   0,
-      0,   0,   0,   0,   0, 122,   0,   0,   0,   0,   0, 133,   0,   0,   0, 133,
-      0,   0,   0,   0,   0, 137,   0,   0,   0,   0,   0,   0,   0,   0,   0, 138,
-      0,   0,   0,   0,  26, 126, 139, 140,   0,   0,   0, 141, 142,   0,   0,   0,
-      0,   0, 143,   0,   0,   0,   0,   0,   0,   0, 144, 145, 146,   6,   0,   0,
-      0,   0,   0,   0,   0,   0,   5,   6,   0,   0,   1,   2,  17,  18, 147,   0,
-      0,   0,   0,   0,   0,   0,   1, 148,   0,   0,   0,   0,   1,  18, 149,   0,
-      0,   0,   1, 150, 145, 151,   0,   0, 152, 153, 154,   0,   0,   0,   0,   0,
-      6, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167,   0,   0,
-      0,   0,   1, 168, 169,   0,   0,   0,   1, 170, 171,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   1, 170, 172,   0,   0,   0,   0,   0,  26, 126, 173, 174,
-      0,   5,   6,   1, 175, 176, 177,   6,  99,   6,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,  17,  18, 113, 178, 179, 180, 181, 182, 183,   0,
-     17,  18, 113, 178, 179, 184,  39, 185, 186, 187,   0,   0,   0,   0,   0,   0,
-    188,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 189,   0,   0,   0,
-      0,   0,   0,   0, 190,   0,   0,   0,   0,   0,   0,   0, 191,   0,   0,   0,
-      0,   0,   0,   0,   0,  74,   0,   0, 192,  70,   0,  70,   0,   0,   0,   0,
-      0,   0,   0,   0,   0, 193,   0, 194,   0,   0,   0,  57,   0,   0,   0,   0,
-      0,   0,  77,   0,   0,   0,   0,   0,   0,   0,   0,  64,   0,   0,   0,   0,
-      0,   0,   0,  94,   0,   0,   0,   0,   0,   0,   0,   0,   0, 195,   0,   0,
-      0,   0, 196,   0,   0,   0,   0,   0,
+static RE_UINT8 re_unified_ideograph_table_3[] = {
+      0,   0,   0,   0, 255, 255, 255, 255, 255, 255, 255,  31,   0, 192,  26, 128,
+    154,   3,   0,   0, 255, 255, 255,  63, 255, 255,  31,   0,   3,   0, 255, 255,
+      1,   0,   0,   0, 255,   7,   0,   0
 };
 
-static RE_UINT8 re_numeric_value_stage_4[] = {
-      0,   0,   0,   0,   0,   0,   0,   0,   2,  37,  39,  41,  43,  45,  47,  49,
-     51,  53,   0,   0,   0,   0,   0,   0,   0,   0,  39,  41,   0,   0,   0,   0,
-      0,  37,   0,   0,  22,  27,  32,   0,   0,   0,   0,   0,   0,   0,   2,  37,
-     39,  41,  43,  45,  47,  49,  51,  53,   0,   0,   0,   0,  12,  16,  20,  22,
-     32,  60,   0,   0,   0,   0,   0,   0,   0,   0,  22,  27,  32,  12,  16,  20,
-     54,  99, 108,   0,   0,   0,   0,   0,   2,  37,  39,  41,  37,  39,  41,   0,
-      4,   7,   9,  11,  14,  18,  21,   0,  54,  99, 108,  22,  27,  32,  12,  16,
-     20,   0,   0,   0,   0,   0,   0,   0,  51,  53,  27,  38,  40,  42,  44,  46,
-     48,  50,  52,   1,   0,   0,   0,   0,   0,  37,  39,  41,  43,  45,  47,  49,
-     51,  53,  54,  64,  74,  84,  94,  95,  96,  97,  98,  99, 117,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,  61,  62,  63,   0,   0,   0,   0,   0,   0,   0,
-     51,  53,  37,   0,   0,   0,   0,   0,   2,   0,   0,   0,  43,  45,  47,  49,
-     17,  15,  14,  23,  31,  21,  25,  29,  33,  19,  34,  16,  24,  30,  35,  37,
-     37,  39,  41,  43,  45,  47,  49,  51,  53,  54,  55,  56,  94,  99, 103, 108,
-    108, 112, 117,   0,   0,  47,  94, 121, 126,   2,   0,   0,   0,   0,   0,   0,
-     53,  54,  55,  56,  57,  58,  59,  60,  61,  62,  63,  64,  37,  39,  41,  43,
-     45,  47,  49,  51,  53,  54,  55,  56,  57,  58,  59,  60,  61,  62,  63,  64,
-     61,  62,  63,  64,   0,   0,   0,   0,   0,   0,   2,  55,  56,  57,  58,  59,
-     60,  61,  62,  63,  64,  37,  39,  41,  43,  45,  47,  49,  51,  53,  54,   2,
-      0,   0,   0,   0,   0,   0,  37,  39,  41,  43,  45,  47,  49,  51,  53,  54,
-     53,  54,  37,  39,  41,  43,  45,  47,  49,  51,  53,  54,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,  27,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,
-     54,  64,  74,   0,   0,   0,   0,   0,   0,   0,  37,  39,  41,  43,   0,   0,
-     53,  54,   0,   0,   0,   0,   0,   0,  54,  64,  74,  84,  94,  95,  96,  97,
-      0,  65,  66,  67,  68,  69,  70,  71,  72,  73,  74,  75,  76,  77,  78,  79,
-      0,  80,  81,  82,  83,  84,  85,  86,  87,  88,  89,  90,  91,  92,  93,  94,
-      0,   0,   0,   0,   0,  45,   0,   0,   0,   0,   0,  39,   0,   0,   0,   0,
-      0,   0,  45,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  49,   0,   0,
-     37,   0,   0,  49,   0,   0,   0, 117,   0,  41,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,  53,   0,   0,   0,   0,   0,   0,  39,   0,   0,   0,
-      0,   0,   0,   0,  45,   0,  43,   0,   0,   0,   0,   0,   0,   0,   0, 140,
-     54,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 108,
-     41,   0,   0,   0,   0,   0,   0,   0,  99,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0, 140,   0,   0,   0,   0,   0,   0,   0,   0,   0, 142,   0,
-      0,  39,   0,  51,   0,  47,   0,   0,   0,  54,   0, 108,  64,  74,   0,   0,
-      0,   0,   0,   0,  84,   0,   0,   0,   0,  41,  41,  41,  41,   0,   0,   0,
-      0,   0,   0,  43,   0,   0,   0,   0,   0,  37,   0,   0,   0,   0,   0,   0,
-      0,   0,  37,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  53,  64,
-      0,   0,   0,   0,  37,  39,  41,   0,  39,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,  54,   0,   0,   0,   0,   0,  51,   0,   0,   0,
-      0,   0,  49,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  49,   0,
-      0,   0,   0,   0,   0,   0,  53,   0,   0,   0,   0,   0,   0,   0,  99,   0,
-      0,   0,   0,   0,   0,   0,  43,   0,   0,   0,   0,   0, 117,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,  39,   0,   0, 108,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,  47,   0,   0,   0,   0,   0,  99,   0,   0,   0,
-     47,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,
-     41,  43,  45,  47,  49,  51,  53,   2,  22,  27,  32,  12,  16,  20,   0,   0,
-      0,   0,   0,  41,   0,   0,   0,   0,   0,   0,   0,  54,   0,   0,   0,   0,
-      0,   0,   2,   0,   0,   0,   0,   0,   0,  47,   0,  47,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,  54,   0,   0,   0,   0,   0,   0,   0,   0,   0,  37,
-     98,  99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113,
-    114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125,   0,   0,   0,   0,
-     22,  27,  37,  45,  94, 103, 112, 121,  45,  54,  94,  99, 103, 108, 112,  45,
-     54,  94,  99, 103, 108, 117, 121,  54,  37,  37,  37,  39,  39,  39,  39,  45,
-     54,  54,  54,  54,  54,  74,  94,  94,  94,  94,  99, 101, 103, 103, 103, 103,
-    103, 108, 112,  45,  94,  27,  27,  31,  32,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   2,  22,   0,   0,   0,   0,  96,  97,  98,  99, 100, 101, 102, 103,
-    104, 105, 106, 107,   0,   0,   0,   0,  37,  45,  54,  94,   0,   0,   0,   0,
-      0,  98,   0,   0,   0,   0,   0,   0,   0,   0, 107,   0,   0,   0,   0,   0,
-      0,  37,  39,  54,  64,  99,   0,   0,  37,  39,  41,  54,  64,  99, 108, 117,
-      0,  37,  39,  41,  43,  45,  54,  64,  39,  41,  43,  43,  45,  54,  64,  99,
-      0,   0,   0,  37,  45,  54,  64,  99,   0,   0,   0,   0,   0,   0,  37,  54,
-     64,  99,  39,  41,   0,   0,   0,   0,   0,   0,   0,   0,  36,  27,   0,   0,
-     53,  54,  64,  74,  84,  94,  95,  96,   0,   0,  99, 100, 101, 102, 103, 104,
-    105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120,
-    121, 122, 123, 124, 125, 126, 127, 129, 130, 132, 133, 134, 135, 136,  13,  19,
-     22,  23,  26,  27,  28,  31,  32,  34,  37,  39,  41,  43,  54,  64,  99, 108,
-     27,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  37,  94,   0,
-      0,   0,   0,   0,   0,  37,  54,  64,   0,  37,  39,  41,  43,  54,  64,  99,
-      0,   0,  37,  45,  54,  94,  99, 108,  97,  98,  99, 100, 101, 102, 103, 104,
-    105, 106, 107,  27,  22,  23,  31,   0,   0,   0,   0,   0,   0,  37,  39,  41,
-     43,  45,  54,  64,  74,  99,  27,   0,   0,  37,  54,  64,  99,   0,   0,   0,
-      0,   0,  37,  39,  41,  43,  45,  47,  49,  51,  53,  54,  64,  74,  84,  94,
-     95,  96,  97,  98,  99, 108,   2,  37,  96,  97,  98,  99, 108,   0,   0,   0,
-     51,  53,  54,  64,   0,   0,   0,   0,  96,  97,  98,   0,   0,   0,   0,   0,
-     51,  53,  37,  39,  41,  43,  45,  47,  95,  96,  97,  98,  99,   0,   0,   0,
-      3,   4,   5,   6,   7,   8,   9,  10,  11,  12,  12,  14,  16,  18,  20,  21,
-     22,  27,  27,  32,   3,   0,   0,   0,  41,  43,  45,  47,  49,  51,  53,  43,
-     45,  47,  49,  51,  53,  37,  39,  41,  43,  45,  47,  49,  51,  53,  37,  39,
-     41,  43,  45,  39,  41,  41,  43,  45,  47,  49,  51,  53,  37,  39,  41,  41,
-     43,  45, 128, 131,  37,  39,  41,  41,  43,  45,  41,  41,  43,  43,  43,  43,
-     47,  49,  49,  49,  51,  51,  53,  53,  53,  53,  39,  41,  43,  45,  47,  37,
-     39,  41,  43,  43,  45,  45,  39,  41,  37,  39,  23,  31,  34,  23,  31,  16,
-     22,  19,  22,  22,  27,  23,  31,  84,  94,  43,  45,  47,  49,  51,  53,   0,
-     51,  53,   0,  54,  99, 117, 137, 140, 141, 142,   0,   0,   0,   0,   0,   0,
-     51,  53,  54,  55,  56,  57,  58,  59,  60,  61,  62,  63,  37,  39,  41,   0,
-     60,  61,  62,  63,   0,   0,   0,   0,  97,  98,  37,  39,  41,  43,  45,  37,
-     45,   0,   0,   0,   0,   0,   0,   0,  51,  53,   2,  37,  39,  41,  43,  45,
-     47,  49,  51,  53,   2,  37,  39,  41,  43,  45,  47,  49,  51,  53,   2,  37,
-    104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119,
-    120, 121, 122, 123, 124, 125, 126, 127, 126, 138, 139,  37,  39,  41,  43,  45,
-     47,  49,  51,  53,   0,  22,  27,  32,   0,  37,  39, 117, 126,   0,   0,   0,
-    120, 121, 122, 123, 124, 125,   0,  39, 102, 104, 109, 117,  27,  19,   0,   0,
-      2,   2,  37,  39,  41,  43,  45,  47,  49,  51,  53,   2,   2,   0,   0,   0,
-      0,  49,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  43,   0,   0,   0,
-      0,   0,  43,   0,   0,   0,   0,   0,   0,  45,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,  74,   0,   0,   0,   0,   0,   0,  47,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,  41,   0,   0,   0,   0,   0,   0,   0,  43,   0,   0,
-     53,   0,   0,   0,   0,   0,   0,   0,
+RE_UINT32 re_get_unified_ideograph(RE_UINT32 codepoint) {
+    RE_UINT32 field_2;
+    RE_UINT32 field_1;
+    RE_UINT32 field_0;
+    RE_UINT32 offset;
+    RE_UINT32 v;
+
+    field_2 = codepoint >> 10;
+    field_1 = (codepoint >> 5) & 0x1F;
+    field_0 = (codepoint >> 3) & 0x3;
+    offset = codepoint & 0x7;
+
+    v = re_unified_ideograph_table_1[field_2];
+    v = re_unified_ideograph_table_2[(v << 5) | field_1];
+    v = re_unified_ideograph_table_3[(v << 2) | field_0];
+
+    return (v >> offset) & 0x1;
+}
+
+/* Uppercase. */
+static RE_UINT8 re_uppercase_table_1[] = {
+     0,  1,  2,  2,  3,  2,  2,  4,  5,  6,  2,  7,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  8,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  9,
+     2, 10,  2, 11,  2,  2, 12,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2, 13,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2, 14,  2,  2,  2,  2, 15,  2, 16,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2
+};
+
+static RE_UINT8 re_uppercase_table_2[] = {
+     0,  0,  1,  0,  0,  0,  2,  0,  3,  4,  5,  6,  7,  8,  9, 10,
+     3, 11, 12,  0,  0,  0,  0,  0,  0,  0,  0, 13, 14, 15, 16, 17,
+    18, 19,  0,  3, 20,  3, 21,  3,  3, 22, 23,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0, 18, 24,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 18, 18, 25,
+     0,  0,  0,  0, 26, 27,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     3,  3,  3,  3, 28,  3,  3,  3, 29, 30, 31, 32,  0, 33, 34, 35,
+     0,  0,  0,  0,  0,  0,  0,  0, 36, 37, 38, 19, 39,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0, 40, 19,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    18, 41,  0, 42,  3,  3,  3, 43,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  3, 44, 45,  0,  0,  0,  0, 46,  3, 47, 48, 49, 50, 51,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  0,  0,  0,  0,  0,  0,
+    18, 52,  0,  0,  0, 26, 53,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0, 18, 54,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0, 18,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0, 18,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    55, 56, 57, 58, 59, 60, 26, 61, 62, 63, 64, 65, 66, 55, 56, 57,
+    58, 67, 25, 26, 61, 58, 68, 69, 70, 71, 40, 41, 26, 72, 73,  0,
+     0,  0,  0,  0,  0,  0,  0,  0, 18, 74,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0, 26, 75, 75, 61,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0
 };
 
-/* Numeric_Value: 4336 bytes. */
-
-RE_UINT32 re_get_numeric_value(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-
-    f = ch >> 11;
-    code = ch ^ (f << 11);
-    pos = (RE_UINT32)re_numeric_value_stage_1[f] << 5;
-    f = code >> 6;
-    code ^= f << 6;
-    pos = (RE_UINT32)re_numeric_value_stage_2[pos + f] << 3;
-    f = code >> 3;
-    code ^= f << 3;
-    pos = (RE_UINT32)re_numeric_value_stage_3[pos + f] << 3;
-    value = re_numeric_value_stage_4[pos + code];
-
-    return value;
+static RE_UINT8 re_uppercase_table_3[] = {
+      0,   0,   0,   0, 254, 255, 255,   7, 255, 255, 127, 127,  85,  85,  85,  85,
+     85,  85,  85, 170, 170,  84,  85,  85,  85,  85,  85,  43, 214, 206, 219, 177,
+    213, 210, 174,  17, 144, 164, 170,  74,  85,  85, 210,  85,  85,  85,   5, 108,
+    122,  85,   0,   0,   0,   0,  69, 128,  64, 215, 254, 255, 251,  15,   0,   0,
+      0, 128,  28,  85,  85,  85, 144, 230, 255, 255, 255, 255, 255, 255,   0,   0,
+      1,  84,  85,  85, 171,  42,  85,  85,  85,  85, 254, 255, 255, 255, 127,   0,
+    191,  32,   0,   0, 255, 255,  63,   0,   0,   0, 255, 255, 255, 255, 255, 231,
+     85,  85,  21,  64,   0, 255,   0,  63,   0, 255,   0, 255,   0,  63,   0, 170,
+      0, 255,   0,   0,   0,   0,   0,  15,   0,  15,   0,  15,   0,  31,   0,  15,
+    132,  56,  39,  62,  80,  61,  15, 192,  32,   0,   0,   0,   8,   0,   0,   0,
+      0,   0, 192, 255, 255, 127,   0,   0, 157, 234,  37, 192,   5,  40,   4,   0,
+     85,  21,   0,   0,  85,  85,  85,   5,  84,  85,  84,  85,  85,  85,   0, 106,
+     85,  40,  69,  85,  85, 125,  95,  85, 244,   2,   0,   0,   0,   0,  32,   0,
+    255,   0,   0,   0, 255, 255,  15,   0, 255, 255,   7,   0, 255, 255, 255,   3,
+      0,   0, 240, 255, 255,  63,   0,   0,   0, 255, 255, 255,   3,   0,   0, 208,
+    100, 222,  63,   0, 255,   3,   0,   0, 176, 231, 223,  31,   0,   0,   0, 123,
+     95, 252,   1,   0,   0, 240, 255, 255,  63,   0,   0,   0,   3,   0,   0, 240,
+      1,   0,   0,   0, 252, 255, 255,   7,   0,   0,   0, 240, 255, 255,  31,   0,
+    255,   1,   0,   0,   0,   4,   0,   0,   3,   0,   0,   0, 255,   3, 255, 255
+};
+
+RE_UINT32 re_get_uppercase(RE_UINT32 codepoint) {
+    RE_UINT32 field_2;
+    RE_UINT32 field_1;
+    RE_UINT32 field_0;
+    RE_UINT32 offset;
+    RE_UINT32 v;
+
+    field_2 = codepoint >> 10;
+    field_1 = (codepoint >> 5) & 0x1F;
+    field_0 = (codepoint >> 3) & 0x3;
+    offset = codepoint & 0x7;
+
+    v = re_uppercase_table_1[field_2];
+    v = re_uppercase_table_2[(v << 5) | field_1];
+    v = re_uppercase_table_3[(v << 2) | field_0];
+
+    return (v >> offset) & 0x1;
 }
 
-/* Bidi_Mirrored. */
+/* Variation_Selector. */
+RE_UINT32 re_get_variation_selector(RE_UINT32 codepoint) {
+    if (0x180B <= codepoint && codepoint <= 0x180D)
+        return 1;
+    if (0xFE00 <= codepoint && codepoint <= 0xFE0F)
+        return 1;
+    if (0x0E0100 <= codepoint && codepoint <= 0x0E01EF)
+        return 1;
+
+    return 0;
+}
 
-static RE_UINT8 re_bidi_mirrored_stage_1[] = {
-    0, 1, 1, 2, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1,
+/* White_Space. */
+static RE_UINT8 re_white_space_table_1[] = {
+    0, 1, 1, 1, 1, 2, 1, 1, 3, 1, 1, 1, 4, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
     1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
     1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
     1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
 };
 
-static RE_UINT8 re_bidi_mirrored_stage_2[] = {
-     0,  1,  1,  1,  1,  1,  1,  2,  1,  1,  1,  3,  1,  1,  1,  1,
-     4,  5,  1,  6,  7,  8,  1,  9, 10,  1,  1,  1,  1,  1,  1,  1,
-     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
-     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
-     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
-     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1, 11,
-     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1, 12,  1,  1,  1,  1,
-     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+static RE_UINT8 re_white_space_table_2[] = {
+    0, 1, 2, 2, 3, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    4, 5, 6, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2
 };
 
-static RE_UINT8 re_bidi_mirrored_stage_3[] = {
-     0,  1,  2,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
-     3,  3,  3,  3,  4,  3,  3,  3,  3,  3,  5,  3,  3,  3,  3,  3,
-     6,  7,  8,  3,  3,  9,  3,  3, 10, 11, 12, 13, 14,  3,  3,  3,
-     3,  3,  3,  3,  3, 15,  3, 16,  3,  3,  3,  3,  3,  3, 17, 18,
-    19, 20, 21, 22,  3,  3,  3, 23, 24,  3,  3,  3,  3,  3,  3,  3,
-    25,  3,  3,  3,  3,  3,  3,  3,  3, 26,  3,  3, 27, 28,  3,  3,
-     3,  3,  3, 29, 30, 31, 32, 33,
+static RE_UINT8 re_white_space_table_3[] = {
+      0,  62,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,  32,   0,   0,   0,
+    255,   7,   0,   0,   0, 131,   0,   0,   0,   0,   0, 128
 };
 
-static RE_UINT8 re_bidi_mirrored_stage_4[] = {
-      0,   0,   0,   0,   0,   3,   0,  80,   0,   0,   0,  40,   0,   0,   0,  40,
-      0,   0,   0,   0,   0,   8,   0,   8,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,  60,   0,   0,   0,  24,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   6,  96,   0,   0,   0,   0,   0,   0,  96,
-      0,  96,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,
-     30,  63,  98, 188,  87, 248,  15, 250, 255,  31,  60, 128, 245, 207, 255, 255,
-    255, 159,   7,   1, 204, 255, 255, 193,   0,  62, 195, 255, 255,  63, 255, 255,
-      0,  15,   0,   0,   3,   6,   0,   0,   0,   0,   0,   0,   0, 255,  63,   0,
-    121,  59, 120, 112, 252, 255,   0,   0, 248, 255, 255, 249, 253, 255,   0,   1,
-     63, 194,  55,  31,  58,   3, 240,  51,   0, 252, 255, 223,  83, 122,  48, 112,
-      0,   0, 128,   1,  48, 188,  25, 254, 255, 255, 255, 255, 207, 191, 255, 255,
-    255, 255, 127,  80, 124, 112, 136,  47,   0,   0,   0,   0,   0,   0,   0,  64,
-     60,  54,   0,  48, 255,   3,   0,   0,   0, 255, 243,  15,   0,   0,   0,   0,
-      0,   0,   0, 126,  48,   0,   0,   0,   0,   3,   0,  80,   0,   0,   0,  40,
-      0,   0,   0, 168,  13,   0,   0,   0,   0,   0,   0,   8,   0,   0,   0,   0,
-      0,   0,  32,   0,   0,   0,   0,   0,   0, 128,   0,   0,   0,   0,   0,   0,
-      0,   2,   0,   0,   0,   0,   0,   0,   8,   0,   0,   0,   0,   0,   0,   0,
-};
+RE_UINT32 re_get_white_space(RE_UINT32 codepoint) {
+    RE_UINT32 field_2;
+    RE_UINT32 field_1;
+    RE_UINT32 field_0;
+    RE_UINT32 offset;
+    RE_UINT32 v;
 
-/* Bidi_Mirrored: 572 bytes. */
-
-RE_UINT32 re_get_bidi_mirrored(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-
-    f = ch >> 14;
-    code = ch ^ (f << 14);
-    pos = (RE_UINT32)re_bidi_mirrored_stage_1[f] << 5;
-    f = code >> 9;
-    code ^= f << 9;
-    pos = (RE_UINT32)re_bidi_mirrored_stage_2[pos + f] << 3;
-    f = code >> 6;
-    code ^= f << 6;
-    pos = (RE_UINT32)re_bidi_mirrored_stage_3[pos + f] << 6;
-    pos += code;
-    value = (re_bidi_mirrored_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1;
-
-    return value;
-}
+    field_2 = codepoint >> 10;
+    field_1 = (codepoint >> 5) & 0x1F;
+    field_0 = (codepoint >> 3) & 0x3;
+    offset = codepoint & 0x7;
 
-/* Indic_Positional_Category. */
+    v = re_white_space_table_1[field_2];
+    v = re_white_space_table_2[(v << 5) | field_1];
+    v = re_white_space_table_3[(v << 2) | field_0];
 
-static RE_UINT8 re_indic_positional_category_stage_1[] = {
-    0, 1, 2, 3, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 6, 7, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    return (v >> offset) & 0x1;
+}
+
+/* Word. */
+static RE_UINT8 re_word_table_1[] = {
+     0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 13, 13,
+    13, 13, 13, 14, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 15, 13, 16, 17, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 18, 10, 10, 10, 10, 10, 10, 10, 10, 19, 20,
+    21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 10, 10, 13, 31, 10, 10,
+    10, 32, 10, 10, 10, 10, 10, 10, 10, 10, 33, 34, 13, 13, 13, 13,
+    13, 35, 13, 36, 10, 10, 10, 10, 10, 10, 10, 10, 37, 10, 10, 38,
+    10, 10, 10, 10, 39, 40, 41, 10, 42, 10, 43, 44, 45, 10, 46, 10,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 13, 13, 13, 13, 47, 13, 13, 13, 48, 49, 13,
+    13, 13, 13, 50, 13, 13, 13, 13, 13, 13, 51, 10, 10, 10, 52, 10,
+    13, 13, 13, 13, 53, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    54, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10
 };
 
-static RE_UINT8 re_indic_positional_category_stage_2[] = {
+static RE_UINT16 re_word_table_2[] = {
+      0,   1,   2,   3,   0,   4,   5,   5,   6,   6,   6,   6,   6,   6,   6,   6,
+      6,   6,   6,   6,   6,   6,   7,   8,   6,   6,   6,   9,  10,  11,   6,  12,
+      6,   6,   6,   6,  11,   6,   6,   6,   6,  13,  14,   6,  15,  16,  17,  18,
+     19,   6,   6,  20,   6,   6,  21,  22,  23,   6,  24,   6,   6,  25,   6,  26,
+      6,  27,  28,  29,   0,  30,  31,  11,   6,   6,   6,  32,  33,  34,  35,  36,
+     37,  38,  39,  40,  41,  42,  43,  44,  45,  42,  46,  47,  48,  49,  50,  51,
+     52,  53,  54,  55,  56,  57,  58,  59,  52,   6,  60,  61,  62,  63,  64,  65,
+     66,  67,  68,   0,  69,  70,  71,   0,  72,  73,  74,  75,  76,  77,  78,   0,
+      6,   6,  79,   6,  80,   6,  81,  82,   6,   6,   6,   6,   6,   6,   6,   6,
+      6,   6,  83,   6,  84,  85,  86,   6,  87,   6,  88,   0,  89,   6,   6,  90,
+     66,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,
+      6,   6,   6,  91,   3,   6,   6,  92,  93,  94,  95,  96,   6,   6,  97,  98,
+     99,   6,   6, 100,   6, 101,   6, 102, 103, 104, 105, 106,   6, 107, 108,   0,
+     28,   6, 103, 109, 108, 110, 111,   0,   6,   6, 112, 113,   6,   6,   6,  95,
+      6, 114, 115,  80, 116,  88, 117,  67,   6,   6,   6,   6,   6,   6,   6, 118,
+      6,   6,   6,   6,   6,   6,   6,   6,  90,   6, 119,  80,   6, 120, 121, 122,
+    123, 124, 125, 126, 127,   0,  23, 128, 129, 130, 131,   6, 132,   0,   0,   0,
       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0, 133,   6,  98,   0,   0,   0,   0,   0,   0,   0,   0,
       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   1,   2,   3,   4,   5,   6,   7,   8,
-      9,   6,  10,  11,   9,   6,  12,  13,   5,  14,  15,   4,  16,  17,  18,   0,
-     19,  20,  21,   4,   5,  14,  22,   4,  23,  24,  25,   4,  26,   0,  27,  28,
-      0,  29,  30,   0,   0,  31,  32,   0,  33,  34,   0,  35,  36,  37,  38,   0,
-      0,  39,  40,  41,  42,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,  43,  43,  44,  44,   0,  45,  46,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,  47,   0,   0,   0,  48,  49,   0,
-     50,   0,  51,  52,   0,   0,   0,   0,  53,  54,  55,  56,  57,  58,   0,  59,
-      0,  60,   0,   0,   0,   0,  61,  62,   0,   0,   0,   0,   0,   0,   0,  63,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,  64,   0,   0,   0,   0,   0,   0,   0,   0,
+      6, 134, 103,   6,   6,   6,   6, 135,   6,  81,   6, 136, 137, 138, 138,   6,
+      0, 139,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    140, 141,  66,   6, 142,  66,   6,  82, 143,  13,   6,   6, 144,   6,   0,  23,
       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,
+      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,
+      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   0,   0,
+      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,
+      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,
+      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,  77,
+      6,   6,   6,   6, 145,   0,  23,  80,   6,   6,   6,   6,   6,   6,   6,   6,
+    146, 147,   6, 148,   6,   6,   6,  25, 149, 150,   6,   6, 151,   6, 152, 153,
+      6, 154,   6,  95,   6,   6, 155, 156,   6, 157,  95,  77,   6,   6, 158, 103,
+      6, 137, 159, 160,   6,   6, 161, 162, 163, 164,  82,  79,   6,   6,   6, 165,
+      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,
+      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6, 166, 167,  28,
+      0,   0,   0,   0,   0,   0,   0,   0,   6,   6,   6,   6,   6,   6,   6,   6,
+      6,   6,   6, 157,   6,   6, 168,   0, 169, 170, 171,   6,   6,  25, 172,   6,
+      6,   6,   6,   6,   6,   6,   6,   6,   6,  80,  23,   6, 173,   6, 174, 175,
+     89, 176, 177, 178,   6,   6,   6,  77,   1,   2,   3, 105,   6, 103, 179,   0,
+    180, 181, 182,   0,   6,   6,   6,  67,   0,   0,   6,  94,   0,   0,   0, 183,
+      0,   0,   0,   0,  77,   6, 128, 111,   6, 184, 101,  67,  80,   6, 185,   0,
+      6,   6,   6,   6,  80,  79, 186,  28,   6, 187,   6, 188,   0,   0,   0,   0,
+      6,   6,   6,   6,   6,   6,   6,   6,   6, 137, 102, 174,   0,   0,   0,   0,
+    189, 190, 102, 137, 103,   0,   0, 191, 102, 168,   0,   0,   6, 192,   0,   0,
+    193, 194,   0,  77,  77,   0,  74, 195,   6, 102, 102, 196,  25,   0,   0,   0,
+      6,   6, 132,   0,   6, 196,   6, 196,   6, 197,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   6, 198,   0,   0,  77, 110, 128,   0,   0,  23, 199, 137,
+      6,   6, 195, 200,   6,  67,  23, 201,   6,  30, 202, 203,   6,   6, 204,   0,
+    205, 206,   0,   0, 207, 116,   6, 208,  33, 209, 210, 211,   0,   0,   0,   0,
+      6,   6, 212, 213,   6,   6, 214,   0,   0,   0,   0,   0,   6, 215, 216,   0,
+      6,   6, 217,   0,   6, 100,  98,   0,  88, 112,   0,   0,   0,   0,   0,   0,
+      6,  67,   0,   0,   0,   6,   6, 218, 219, 220, 221,   0,   0, 222, 223, 224,
+      6, 103, 110,   6, 225,   0,   6, 100,   0,   0,   0,   0,   0,   0,   0,   0,
+    226,   5, 227, 228, 173, 229,   0,   0, 230, 231, 197, 232, 233,  98,   0,   0,
+      0,   0,   0,   0,   0,   0,   0, 137,   0,   0,   0,   0,   0, 234,   0,   0,
+      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,
+      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6, 168,   0,   0,   0,
+      6,   6,   6, 144,   6,   6,   6,   6,   6,   6, 188,   0,   0,   0,   0,   0,
       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      6, 144,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     65,  66,   0,   0,  67,  68,  69,  70,   0,  71,  72,   0,   1,  73,  74,  75,
-      0,  76,  77,  78,   0,  79,  80,  81,   0,   0,   0,   0,   0,   0,   0,  82,
+      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,
+      6,   6, 195,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,
+      6, 100, 103,  98,   0,   0,  23, 106,   6, 137, 221, 235,  89,   0,   0,   0,
       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   6,   6,   0,   0,   0,   0,   6,   6, 236,   6, 237,   0,   0, 238,
+      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,
+      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6, 114,
+      6,   6,   6,   6,   6,   6, 102,   0, 132,   0,   0,   0,   0,   0,   0,   0,
       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      6,   6,   6,   6,   6,   6,   6,   6, 103,   0, 239, 202,   6,   6,   6,   6,
+      6,   6,   6,   6,   6,   6,   6,  28,   0,   0,   0,   0,   0,   0,   0,   0,
+      6,   6,   6, 240, 241,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     83,  84,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 242, 243, 244,   0,   0,
+      0,   0, 245,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      6,   6,  30,   6, 246, 247, 248,   6, 249, 250, 251,   6,   6,   6,   6,   6,
+      6,   6,   6,   6,   6, 252, 253,  82,  30,  30, 134, 134, 226, 226, 254,   6,
       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      6, 255,   6, 256, 257, 258,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    259, 260,   0,   0,   0,   0,   0,   0,   6, 261, 262,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   6, 168,   0,   0,   0,   0,   0,   0,   0,   0,
+      6,   6,   6,   6,   6,   6, 263,   0,   6,   6, 112,   0,   0,   0,   0,   0,
       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     85,  86,  87,   0,  57,  88,   0,   0,  89,  90,  91,  92,  57,  93,  94,   0,
-      0,  95,   0,   0,   0,   0,  96,  97,  23,  98,  99, 100,   0,   0,   0,   0,
-      0, 101, 102,   0,   0, 103, 104,   0,   0,   0,   0,   0,   0, 105, 106,   0,
-      0, 107, 108,   0,   0, 109,   0,   0, 110, 111,   0,   0,   0,   0,   0,   0,
-      0, 112,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 113, 114,
-    115, 116, 117,   0, 118,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0, 119,   0,   0, 120, 121,   0,   0,   0, 122, 123,   0, 124,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0, 125,   0,   0,   0,   0,   0,   0,   0,   0,
-};
-
-static RE_UINT8 re_indic_positional_category_stage_3[] = {
-      0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   2,   3,   4,   5,   6,   7,   8,   9,   0,   0,
-     10,   0,   0,   0,   0,   0,   0,   0,  11,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   3,   4,  12,  13,  14,   0,  15,   0,   0,
-     10,   0,   0,   0,   0,   0,   0,  16,  17,   0,   0,   0,   0,   0,   0,   0,
-     18,  19,  20,  21,  22,   0,   0,   0,   0,   0,   0,   0,  23,  22,   0,   0,
-      4,  24,  25,  26,   0,   0,   0,   0,  10,   0,   0,   0,   0,   0,  27,  28,
-      0,   0,   0,   0,   0,   0,   0,  29,   4,  12,  30,  31,   0,  32,   0,   0,
-     16,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  33,
-     34,  35,  36,  37,   0,  15,   0,   0,   6,  38,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,  27,   6,  39,  40,  23,   0,  41,   0,   0,
-     42,  43,  44,  23,   0,  45,   0,   0,  46,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,  19,  47,  48,  49,  36,  37,   0,  15,   0,   0,
-     33,   0,   0,   0,   0,   0,   0,   0,   0,   0,  16,  15,  50,  51,  52,  53,
-      0,   0,   0,   0,  33,   0,   0,   0,   0,   0,   0,   0,  54,  28,  55,   0,
-     56,  57,  28,  58,   0,   0,   0,   0,   0,   0,   0,   0,  54,  28,  59,  60,
-     56,  61,  28,  23,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  62,   0,
-      0,   0,   0,   0,   0,  63,  64,  65,   0,   0,   0,   0,  66,  67,  68,   1,
-     69,  70,   0,  71,  72,  72,  71,  72,  72,  72,  72,  72,  72,  72,  72,  60,
-      0,  73,   0,   0,   0,   0,   0,   0,   0,   0,  15,  74,  75,  76,  77,  78,
-      0,   0,   0,   0,   0,  33,  62,  10,  79,  80,  81,  82,  83,  38,   0,   0,
-     84,  85,  81,  86,   0,   0,  33,  87,   0,   0,   0,   0,  88,  60,   0,   0,
-      0,   0,   0,   0,  88,   0,   0,   0,   0,   0,   0,   0,   0,  89,  76,  90,
-     91,  92,  93,  28,  94,   0,   0,  64,  95,  96,   6,   0,  97,  81,  98,   0,
-      0,   0,   0,   0,  81,  99, 100,  81, 101,   0,  82,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,  19, 102,   0,   0,   0,   0,   0,   0, 103,  76,  55,
-    104,  93, 105, 106, 107,  28,  28, 108,  28, 101,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0, 109, 110, 111, 112, 101,   0,   0,   0,   0,   0,   0,
-      0,   0,  19,   5,  28,   0,   0,   0, 113,   0,   0,   0,   0,   0,   0,   0,
-    114, 115, 113,  62,   0,   0,   0,   0,   0,   2,  46, 116,  46,   0,   0,   0,
-      0, 117, 118,   5,  28, 119,   0,   0,   0,   0,   0,   0,  58, 120, 121,  72,
-    122, 123, 124,  22,   0, 125,   0,   0,   0,   0,   0,   0,   0,   0,  19,   0,
-      0,   0,   0,   0,  38,   0,   0,   0,  16,  16,  19,   0,   0,   0,   0,   0,
-     15, 126,   0,   0,   0,   0,   0,   0,  82,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,  81,  81,  81,  81, 127,   0,   0,   0,   0,   0,   0,
-     28,  28,  28,  28,  23,   0,   0,  19,   0,   0, 128,  62,   0,   0,   0,   0,
-      0, 128, 129,  59,  46,   0,   0,   0,   0,   0,   0,   0,  19,  50, 130, 131,
-    132,   0,   0,   0,   0,   0,   0,   0,   0,  64,   0,   0,   0,   0,   0,   0,
-      0,   0,  83, 133, 134, 135,   0,   0,  19,   0,   0, 136,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,  15, 136,   0,   0,   0,   0, 109, 137, 138, 139,
-     64,   0,   0,   0,   0,   0,   0,   0,   0,   0, 140, 141,   0, 142,   0,   0,
-     15,  54, 143,  26,   0,   0,   0,   0, 144, 145,   0,  59,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0, 146,   0, 147,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,  28,  72, 121,  58,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0, 148, 149,  18,   0,  58,   0,   0,   0,   0,   0,   0,   0,
-      0,  19,   9, 150, 146,  38,   0,   0,   0,  45,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0, 128,   0,   0,   0,   0,   0,   0,   0,  15, 151,  72, 152,
-    101,   0, 153,  60,   0,   0,   0,   0,   0,   0,   0,  48, 154, 109,   0,  16,
-      0,   0,   0,   0,   0,   0,   0,  19, 148,   5, 146,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0, 128,  79,   6, 155,  13, 156,   0,  15,   0,   0,
-     33,  27,  28,  38,  28,  38,   0,   0,   0,   0,   0,   0,   0, 157,  72, 121,
-    158, 159,   0,   0,   0,   0,   0,  16,   0,   0,   0,   0, 148,  72, 160, 161,
-    162,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  15, 151,  62, 163, 164,
-     60,   0,   0,   0,   0,   0,   0,  62,   0,   0,   0,   0,  48,  72, 149, 165,
-     38,   0,   0,   0,   0,   0,   0,   0,   0,   0,  19, 166, 121, 164,   0,   0,
-      0,   0,   0,   0,   0,   0,   0, 167,  50, 168,   5,   0,   0,   0,   0,   0,
-      0,   0,   0, 148,  59,  28,  18,   0,   0,   0,   0,   0, 157,  72,  27,  81,
-     60, 169,   0,   0,   0,   0,   0,   0, 170,  28, 171,   0,   0,   0,   0,   0,
-      0,   0,   0,   0, 128,   5, 172,  55,   0,   0,   0,   0, 170,   1,   4,   0,
-      0,   0,  10,  72,  72, 173,  38,   0,   0,   0,   0,  15,   9,  55,  28, 164,
-      0,   0,   0,   0,  10,  72,  72,  72,  72,  72, 114,  72, 174, 175,   0,   0,
-      0,   0,   0,   0,  83, 171,  16,  94, 176, 177,   0,   0,   0,   0,   0,   0,
-      0,   0,  33, 178, 179, 147,   0,   0,   0,   0,   0,   0,  19, 180,   0,   0,
-};
-
-static RE_UINT8 re_indic_positional_category_stage_4[] = {
-     0,  0,  0,  0,  5,  5,  5,  1,  0,  0,  5,  1,  6,  0,  1,  2,
-     1,  6,  6,  6,  6,  5,  5,  5,  5,  1,  1,  1,  1,  6,  2,  1,
-     0,  5,  6,  5,  5,  5,  6,  6,  0,  0,  6,  6,  0,  5,  1,  1,
-     6,  0,  0,  2,  2,  0,  0,  4,  4,  6,  0,  0,  0,  0,  0,  1,
-     0,  0,  5,  0,  0,  5,  5,  1,  1,  6,  6,  0,  0,  0,  0,  5,
-     5,  0,  0,  5,  5,  6,  0,  0,  0,  6,  0,  0,  5,  5,  0,  0,
-     6,  5,  0,  5,  5,  8,  0,  1,  1,  6,  0,  0,  0,  0,  5,  5,
-     5,  5,  5,  5,  6,  0,  1,  5,  9,  0,  0,  4, 10,  6,  0,  0,
-     0,  0,  5,  8,  0,  0,  1,  1,  5,  1,  1,  0,  0,  0,  2,  2,
-     2,  0,  4,  4,  4,  5,  0,  0,  5,  0,  0,  0,  1,  0,  5,  5,
-     7,  0,  5,  5,  0,  5,  6,  0,  8,  1,  1,  1,  1,  0,  5,  8,
-     8,  0,  8,  8,  0,  1,  1,  0,  5,  5,  1,  1,  5,  0,  1,  1,
-     1,  1,  1,  6,  6,  0,  2,  2,  1,  1,  5,  5,  6,  0,  6,  0,
-     1,  2,  9,  2,  4, 10,  4,  1,  1,  5,  1,  1,  6,  6,  6,  0,
-     3,  3,  3,  3,  3,  1,  0,  5,  5,  5,  5,  0,  6,  6,  6,  5,
-     6,  0,  0,  0,  3,  0,  0,  0,  6,  6,  0,  0,  0,  6,  0,  6,
-     0,  5,  0,  0,  0,  0,  1,  2,  0,  6,  5,  7,  6,  6,  7,  7,
-     7,  7,  5,  5,  5,  7,  5,  5,  6,  0,  5,  5,  0,  6,  6,  6,
-     6,  6,  6,  6,  0,  0,  6,  0,  1,  5,  5,  6,  6,  2,  5,  5,
-     5,  5,  5,  6,  1,  0,  5,  1,  0,  6,  6,  0,  6,  0,  1,  1,
-     1,  0,  0,  1,  1,  1,  1,  1,  1,  1,  0,  0,  0,  5,  5,  5,
-     0,  0,  6,  1,  2,  5,  5,  1,  1,  6,  0,  1,  1,  5,  0,  0,
-     0,  0,  5,  6,  0,  0,  1,  5,  6,  6,  9, 10,  4,  2,  2,  2,
-     4,  4,  5,  1,  1,  5,  5,  5,  5,  5,  0,  5,  5,  5,  6,  1,
-     1,  8,  8,  5,  1,  1,  6,  1,  1,  6,  5,  6,  1,  3,  3,  3,
-     1,  1,  3,  1,  1,  0,  0,  0,  6,  2,  1,  5,  0,  2,  6,  1,
-     0,  1,  5,  1,  5,  6,  6,  5,  6,  1,  2,  2,  2,  2,  2,  5,
-     5,  0,  0,  6,  5,  1,  5,  5,  6,  6,  6, 11,  7, 13,  2,  2,
-     4,  4,  5,  8,  5,  5,  1,  0,  0,  1,  6,  6,  5,  6,  2,  1,
-     1,  5,  1,  5,  1,  1,  1,  2,  2,  9,  1,  1,  2,  2,  5,  6,
-    14,  6,  6,  6,  6,  6,  5,  5,  5,  1, 14, 14, 14, 14, 14, 14,
-    14,  0,  0,  0,  5,  0,  0,  1,  1,  6,  5,  1,  6,  5,  0,  0,
-     0,  0,  0,  6,  6,  6,  5,  6,  6,  6,  2,  2,  5,  6,  1, 12,
-    11,  0,  0,  0,  5,  6,  5,  2,  2,  5,  6,  1,  2,  6,  6,  0,
-     5,  1,  0,  0,  6,  3,  3,  5,  5,  3,  1,  3,  3,  1,  5,  5,
-     0,  0,  0,  2,  6,  5,  2,  1,  0,  1,  0,  0,  6,  1,  1,  0,
-     0, 14,  6,  6,  0,  5, 14,  0,  5,  6,  6,  0,  1,  5,  1,  0,
-     1,  2,  1,  6,  6,  5,  5,  1,  2,  5,  7,  7,  2,  1,  6,  6,
-     5,  5,  5,  8,  0,  6,  6,  5,  5,  5,  8,  8,  1,  0,  0,  2,
-     4,  1,  0,  0,  0,  1,  2,  1,  1,  1,  6,  5,  5,  1,  6,  0,
-     6,  2,  5,  9,  4,  1,  4,  5,  5,  1,  6,  6,  2,  9,  4, 10,
-     5,  5,  1,  6,  1,  5,  1,  6,  1,  5,  2,  1,  0,  6,  0,  5,
-     6,  6,  2,  5,  2,  0,  0,  0,  0,  5,  6,  6,  5,  5,  6,  0,
-     5,  1,  0,  6,  6,  6,  5,  1,  6,  2,  6,  5,  1,  5,  5,  0,
-     5,  5,  6,  5,  6,  0,  0,  6,  1,  1,  1,  0,  5,  5,  0,  1,
-     6,  2,  1,  0,
-};
-
-/* Indic_Positional_Category: 2852 bytes. */
-
-RE_UINT32 re_get_indic_positional_category(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-
-    f = ch >> 11;
-    code = ch ^ (f << 11);
-    pos = (RE_UINT32)re_indic_positional_category_stage_1[f] << 6;
-    f = code >> 5;
-    code ^= f << 5;
-    pos = (RE_UINT32)re_indic_positional_category_stage_2[pos + f] << 3;
-    f = code >> 2;
-    code ^= f << 2;
-    pos = (RE_UINT32)re_indic_positional_category_stage_3[pos + f] << 2;
-    value = re_indic_positional_category_stage_4[pos + code];
-
-    return value;
-}
-
-/* Indic_Syllabic_Category. */
-
-static RE_UINT8 re_indic_syllabic_category_stage_1[] = {
-    0, 1, 2, 2, 2, 3, 2, 2, 4, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2,
-};
-
-static RE_UINT8 re_indic_syllabic_category_stage_2[] = {
-     0,  1,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
-     2,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16,
-    17, 18,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2, 19, 20,
-     2,  2, 21, 22, 23, 24, 25, 26, 27, 28,  2, 29,  2,  2,  2,  2,
-    30, 31,  2,  2,  2,  2,  2,  2,  2,  2,  2, 32,  2,  2,  2,  2,
-     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
-     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
-     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
-     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
-     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
-     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
-     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
-     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
-    33, 34, 35, 36, 37, 38,  2, 39,  2,  2,  2,  2,  2,  2,  2,  2,
-     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
-     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
-     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
-     2,  2,  2,  2, 40,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
-    41, 42, 43, 44, 45, 46, 47,  2, 48, 49,  2, 50, 51, 52, 53,  2,
-    54,  2,  2, 55, 56, 57,  2,  2, 58, 59, 60, 61,  2, 62,  2,  2,
-};
-
-static RE_UINT8 re_indic_syllabic_category_stage_3[] = {
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   2,   2,   3,   0,
       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   4,   0,   0,   0,   5,   0,   0,   0,
-      0,   0,   0,   0,   0,   6,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    248, 264, 265, 266, 267, 268,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,  23,  79,  79,  98,   0,   0,   0,
       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      7,   8,   8,   8,   8,   9,  10,  10,  10,  10,  10,  10,  10,  10,  11,  12,
-     13,  13,  13,  14,  15,  16,  10,  10,  17,  18,   2,   2,  19,   8,  10,  10,
-     20,  21,   8,  22,  22,   9,  10,  10,  10,  10,  23,  10,  24,  25,  26,  12,
-     13,  27,  27,  28,   0,  29,   0,  30,  17,  18,   2,   2,  26,   0,   0,  31,
-     32,  21,  33,  34,  22,   9,  10,  10,  10,  10,  23,  10,  23,  35,  26,  36,
-     37,  29,  27,  38,  39,   0,  40,  24,   0,  18,   2,   2,  41,  42,   0,   0,
-     32,  21,   8,  43,  43,   9,  10,  10,  10,  10,  23,  10,  23,  40,  26,  12,
-     13,  44,  44,  38,   0,   0,   0,   0,  17,  18,   2,   2,   0,   0,  45,  46,
-     32,  21,   8,  22,  22,   9,  10,  10,  10,  10,  23,  10,  23,  40,  26,  12,
-     13,  27,  27,  38,   0,  47,   0,  30,  17,  18,   2,   2,  48,   0,   0,   0,
-     49,  21,  33,  19,  50,  51,  35,  23,  52,  53,  54,  25,  10,  10,  26,  47,
-     37,  47,  55,  38,   0,  29,   0,   0,   0,  18,   2,   2,   0,   0,   0,   0,
-      7,  56,   8,  50,  50,   9,  10,  10,  10,  10,  23,  10,  10,  10,  26,  57,
-     13,  55,  55,  38,   0,  58,  54,   0,  17,  18,   2,   2,   0,   0,   0,   0,
-      7,  21,   8,  50,  50,   9,  10,  10,  10,  10,  23,  10,  10,  40,  26,  12,
-     13,  55,  55,  38,   0,  58,   0,  59,  17,  18,   2,   2,  60,   0,   0,   0,
-      7,  21,   8,  50,  50,   9,  10,  10,  10,  10,  10,  10,  10,  10,  61,  62,
-     13,  55,  55,  63,   0,  64,   0,  34,  17,  18,   2,   2,   0,   0,  65,  66,
-     67,  21,   8,   8,   8,  33,  25,  10,  10,  10,  10,  10,  30,  10,  10,  48,
-     10,  54,  68,  29,  13,  69,  13,  13,   0,  18,   2,   2,  47,   0,   0,   0,
-     40,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  54,  13,  13,  70,   0,
-     13,  44,  71,  72,   2,   2,   3,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     35,  23,  54,  10,  10,  10,  10,  10,  10,  73,  10,  54,  13,  13,  74,  75,
-     13,  76,  71,  77,   2,   2,   3,  10,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   2,   2,   2,   2,   2,  78,  79,   0,
-     10,  10,  40,  10,  10,  10,  10,  10,  10,  10,  10,  53,  16,  13,  13,  80,
-     81,  82,  83,  84,  85,  85,  86,  85,  85,  85,  85,  85,  85,  85,  85,  87,
-      0,  88,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     10,  10,  10,  10,  10,  10,  10,  10,  89,   8,  90,  13,  13,  91,  92,  93,
-      2,   2,  94,  95,  96,  17,  97,  98,  99, 100, 101, 102, 103, 104,  10,  10,
-    105, 106,  71, 107,   2,   2, 108, 109,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-    110,  10,  10,  23,  11, 111,   0,   0, 110,  10,  10,  10,  11, 111,   0,   0,
-    110,  10,  10,  10,  11,   0,   0,   0, 110,  10,  10,  23, 112,   0,   0,   0,
-     10,  10,  10,  10,  10,  10,  10,  10, 113,   8,   8,   8,   8,  47,  13,  13,
-     13,  80, 114, 115, 116,   0,   0, 117,   2,   2,   3,   0,   0,   0,   0,   0,
-    118,  10,  10,  10,  10,  10,  10,  54,  13,  13, 119,   0, 120, 121, 122,   0,
-      0,  18,   2,   2,  10,  10,  10,  10, 123, 124, 124, 125, 126, 127,   0,   0,
-     10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,   0,  13,  13,  13,  13,
-    128, 121, 129,   0,   2,   2, 130,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     10,  10,  10,  10,  10, 131,  13,   0,  10,  10,  10,  10,  10,  10,  10,  10,
-     10,  10,  10,  89, 110, 132, 133, 134, 135,  13,  13,  13,  13, 136, 137, 138,
-      2,   2,   3,   0,   2,   2,   3,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-    139, 140,   8,   8, 110,  10,  10,  10,  10,  10,  10,  10,  10, 141,  13,  13,
-     13, 142,  10,   0,   2,   2,   3,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-    143,   8, 144,  10,  10,  10,  10,  10, 145,  13, 146, 147,   2,   2, 148, 149,
-     10,  10,  10,  10,  10,  10,  10,  10,  10, 150,  13,  13, 151,   0,   0,   0,
-     10,  10,  10,  10,  10,  10,  10,  10,  10, 152,  13, 128, 121, 153,   0,   0,
-      2,   2,   3,  40,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0, 154, 155, 155, 155, 156,   0,   0,   0,  65, 157, 158,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 159,   0,
-      0,   0,   0, 160, 161,   4,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 162,   0,   0,
-      5, 162,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 163,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   4,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-    164, 165, 166,  10,  10,  10,  10,  10, 131,  13,   0,   0,   0,   0,   0,   0,
-     10,  10,  10,  10,  10,  10,  10, 167, 168, 169, 170,  10, 171,   0,   0,   0,
-    172,   8,   8,   8, 144,  10,  10,  10,  10,  10,  10,  10,  10, 173,  13,  13,
-     13, 174,   0,   0,   2,   2,   3,   0, 155, 155, 155, 155, 175,   0,   0, 176,
-      2,   2, 177,  10,  10,  10,  10,  10, 167, 124, 178, 129,  10,  10,  10,  10,
-     10, 131,  13, 179, 180,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-    181,   8,   9, 110,  10,  10,  10,  10,  10,  10,  10,  10, 182,  13,  13, 183,
-    184,   0,   0,   0,   2,   2,   3,   0,  10, 185,  10,  10,   2,   2, 177,  54,
-      8, 144,  10,  10,  10,  10,  10,  10,  10,  10, 103,  13, 186, 187,   0,   0,
-    121, 121, 121, 188,   2,   2,   3,   0,  10,  10,  10,  10,  40, 189, 190, 102,
-     10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  13,  13,  13, 106,
-    191,   0,   0,   0,   0,   0,   0,   0, 144,  10, 131,  13,   0, 192,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     10,  10,  10,  96, 193,  10, 194, 121, 195,  13,  37, 196,   2,   2,   3,   0,
-    103,  58,   0,  80,  10,  40,  40,  10,  10,  10,  10,  10,  10,  26, 197, 198,
-      2,   2, 199,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-    200, 201,   8,   8, 110,  10,  10,  10,  10,  10,  10,  10,  10,  10,  13,  13,
-     13, 202,   0,   0, 203, 204, 204, 204, 204, 205,   2,   2,   0,   0,   0, 206,
-    207,   8,   8,   9,  10,  10,  10,  10,  10,  10,  10,  10,  13,  13, 208,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-    207, 110,  10,  10,  10,  10,  10,  10,  10, 131,  13,  13, 209, 210,   2,   2,
-      0, 211,   0,   0, 124, 212,  10,  10,  10,  10,  10,  10, 182,   0,   0,   0,
-    207,   8,   8,   8,   9,  10,  10,  10,  10,  10,  10,  10, 131,  13,  13,  13,
-    213,   0, 214,  76,   2,   2,   3,   0, 215,   2,   2,   2,   2, 199,   0,   0,
-      8,   8,  10,  10,  30,  10,  10,  10,  10,  10,  10,  13,  13, 216,   0, 217,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      8,  54,  23,  30,  10,  10,  10,  30,  10,  10,  53,   0,   8,   8, 144,  10,
-     10,  10,  10,  10,  10,  10,  10, 166,  13,  13, 218,   0,   2,   2,   3,   0,
-      7,  21,   8,  22,  22,   9,  10,  10,  10,  10,  23,  10,  23,  40, 219,  12,
-     13,  27,  27,  38,   0,  29,   0, 220,  17, 221, 155, 163, 155, 163,   0,   0,
-      8,   8,   8, 144,  10,  10,  10,  10,  10,  10,  10,  10,  10, 103,  13,  13,
-    222, 223,   0,   0,   2,   2,   3, 224,   0,   0,   0,   0,   0,   0,   0,   0,
-     21,   8,   8, 110,  10,  10,  10,  10,  10,  10,  10,  10,  13,  13,  13, 225,
-    226, 227,   0,   0,   2,   2,   3,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      8,   8,   8, 144,  10,  10,  10,  10,  10,  10,  10, 131,  13, 109,  13, 228,
-    229,   0,   0,   0,   0,   0,   8, 109,   0,   0,   0,   0,   0,   0,   0,   0,
-      8,   8,   8, 144,  10,  10,  10,  10,  10,  10,  10,  10,  13,  13,  13, 230,
-     76,   0,   0,   0,   2,   2,   3,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      8,   8, 144,  10,  10,  10,  10,  10,  10,  10, 166, 231,  13, 232,  53,   0,
-      2,   2,   3,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     10,  10,  10,  10,  10,  10,  54, 233,  13,  13, 234,   0,   2,   2,   2,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      8,   8, 144,  10,  10,  10,  10,  10,  10,  10,  10,  13,  13, 225, 235,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   8,   8,  19, 144,  10,  10,  10,  10,
-     10,  10,  10,  10, 103,  13,  47,  80, 236,  76,   0,   0,   0,   0,   0,   0,
-    237,  13, 238,  10,  10,  10,  10,  10,  10,  10,  10,  10, 239, 240, 241, 242,
-      0, 243,   0,   0, 237,  13,  13,  10,  10,  10,  10,  10,  10,  10,  10,  10,
-     10, 244, 245, 121, 121, 246, 247, 248,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      8,   8,  50, 144,  10,  10,  10,  10,  10,  10,  10, 131,  13,  37,  13, 228,
-    227,   0,   0,   0,   2,   2,   2,   2,   2,   2,   2, 199,  25,  10,  10,  10,
-     10,  10,  10,  10, 249,  85,  85,  85,  85,  85,  86,  85,  13, 250,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      8,  33,  43,  10,  10,  10,  10,  10,  10,  10,  10,  10, 103,  37, 251,  44,
-    252, 253,   0,   0,   2,   2,   3,   0,   8,  43,  50,  10,  10,  10,  10,  10,
-     10,  10,  11,  37,  44, 254,   0,   0,   2,   2,   3,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,  10,  10,  10,  10, 255,  37,   0,   0,
-};
-
-static RE_UINT8 re_indic_syllabic_category_stage_4[] = {
-     0,  0,  0,  0,  0, 11,  0,  0, 34, 34, 34, 34, 34, 34,  0,  0,
-    11,  0,  0,  0,  0,  0, 29, 29,  0,  0,  0, 11,  1,  1,  1,  2,
-     8,  8,  8,  8,  8, 12, 12, 12, 12, 12, 12, 12, 12, 12,  9,  9,
-     4,  3,  9,  9,  9,  9,  9,  9,  9,  5,  9,  9,  0, 27, 27,  0,
-     0,  9,  9,  9,  8,  8,  9,  9,  0,  0, 34, 34,  0,  0,  8,  8,
-    11,  1,  1,  2,  0,  8,  8,  8,  8,  0,  0,  8, 12,  0, 12, 12,
-    12,  0, 12,  0,  0,  0, 12, 12, 12, 12,  0,  0,  9,  0,  0,  9,
-     9,  5, 13,  0,  0,  0,  0,  9, 12, 12,  0, 12,  1,  0, 29,  0,
-     0,  1,  1,  2,  8,  8,  8,  0,  0,  0,  0,  8,  0, 12, 12,  0,
-     4,  0,  9,  9,  9,  9,  9,  0,  9,  5,  0,  0,  0, 27,  0,  0,
-     0, 12, 12, 12,  1, 26, 11, 11,  0, 20,  0,  0,  8,  8,  0,  8,
-     9,  9,  0,  9,  0, 12, 27, 27, 27,  4,  4,  4,  0,  0,  9,  9,
-     0, 12,  0,  0,  0,  0,  1, 23,  8,  0,  8,  8,  8, 12,  0,  0,
-     0,  0,  0, 12, 12,  0,  0,  0, 12, 12, 12,  0,  9,  0,  9,  9,
-     1,  8,  8,  8,  0,  3,  9,  9,  0,  9,  9,  0,  0,  0, 12,  0,
-     0, 14, 14,  0, 12, 12, 12,  6,  6,  3,  9,  9,  9,  5, 16,  0,
-    13, 13, 13,  9,  0,  0, 13, 13, 13, 13, 13, 13,  0,  0,  1,  2,
-     0,  0,  5,  0,  9,  0,  9,  0,  9,  9,  6,  0, 25, 25, 25, 25,
-    30,  1,  6,  0,  0, 12,  0, 12,  9,  9,  6,  9, 20, 20,  0,  0,
-     9,  0,  0,  0,  0,  1,  0,  0,  0, 29,  0, 29,  0,  4,  0,  0,
-     9,  9,  1,  2,  9,  9,  1,  1,  6,  3,  0,  0, 22, 22, 22, 22,
-    22, 19, 19, 19, 19, 19, 19, 19,  0, 19, 19, 19, 19,  0,  0,  0,
-     0,  0, 29,  0, 12,  8,  8,  8,  8,  8,  8,  9,  9,  9,  1, 25,
-     2,  7,  6, 20, 20, 20, 20, 12, 34, 34,  0, 11,  0,  0, 11,  0,
-    12, 12,  8,  8,  9,  9, 12, 12, 12, 12, 20, 20, 20, 12,  9, 25,
-    25, 12, 12,  9,  9, 25, 25, 25, 25, 25, 12, 12, 12,  9,  9,  9,
-     9, 12, 12, 12, 12, 12, 20,  9,  9,  9,  9, 25, 25, 25, 12, 25,
-    34, 34, 25, 25,  9,  9,  0,  0,  8,  8,  8, 12,  6,  0,  0,  0,
-    12,  0,  9,  9, 12, 12, 12,  8,  9, 28, 28, 29, 18, 30, 29, 29,
-    29,  6,  7, 29,  3, 29,  0,  0, 11, 12, 12, 12,  9, 19, 19, 19,
-    21, 21,  1, 21, 21, 21, 21, 21, 21, 21,  9, 29, 12, 12, 12, 10,
-    10, 10, 10, 10, 10, 10,  0,  0, 24, 24, 24, 24, 24,  0,  0,  0,
-     9, 21, 21, 21, 25, 25,  0,  0, 34, 34, 34,  0, 12, 12, 12,  9,
-    12, 20, 20, 19, 21, 21, 17, 19, 19, 19, 19,  0,  7,  9,  9,  9,
-     1, 25, 25, 25, 25, 25,  6, 29, 29,  0,  0, 29,  1,  1,  1, 18,
-     2,  8,  8,  8,  4,  9,  9,  9,  5, 12, 12, 12,  1, 18,  2,  8,
-     8,  8, 12, 12, 12, 19, 19, 19,  9,  9,  6,  7, 19, 19, 12, 12,
-    34, 34,  3, 12, 12, 12, 21, 21,  8,  8,  4,  9, 21, 21,  6,  6,
-    19, 19,  9,  9,  1,  1, 29,  4, 27, 27, 27,  0, 27, 27, 27, 27,
-    27, 27,  0,  0, 27, 14, 14, 27, 27, 27, 11,  0,  0,  0,  0, 29,
-    31, 32,  0,  0, 11, 11, 11, 11, 29,  0,  0,  0, 27,  0,  0,  0,
-     8,  8,  9,  8,  8,  8,  5, 12, 12, 12, 12,  1, 12, 12, 10, 10,
-    10, 10, 12, 12, 12, 12, 10, 19, 19, 12, 12, 12, 12, 19, 12,  1,
-     1,  2,  8,  8, 20,  9,  9,  9,  5,  1,  0,  0, 27, 27,  1,  1,
-     0,  0,  8,  9, 34, 34, 12, 12, 10, 10, 10, 25,  9,  9,  9, 21,
-    21, 21, 21,  6,  1,  1, 18,  2, 12, 12, 12,  4,  9, 20, 20, 20,
-     5,  0,  0,  0, 12,  9,  0, 12,  9,  9,  9, 20, 20, 20, 20,  0,
-    21, 21,  0,  0, 11, 11, 11,  0,  0,  0, 12, 25, 24, 25, 24,  0,
-     0,  2,  7,  0, 12,  8, 12, 12, 12, 12, 12, 21, 21, 21, 21,  9,
-    25,  6,  0,  0,  4,  4,  4,  0,  0,  0,  0,  7, 34,  0,  0,  0,
-     1,  1,  2, 14, 14,  8,  8,  8,  9,  9,  5,  0,  0,  0, 35, 35,
-    35, 35, 35, 35, 35, 35, 34, 34,  0,  0,  0, 33,  1,  1,  2,  8,
-     9,  5,  4,  0,  9,  9,  9,  7,  6,  0, 34, 34, 12,  9,  9,  0,
-    10, 12, 12, 12,  5,  3, 15, 15,  0, 29,  4,  9,  0, 34, 34, 34,
-     1,  5,  4, 26,  0,  0, 27,  0,  9,  4,  6,  0, 12, 12,  0,  4,
-     0,  0,  1,  1,  0,  0, 27, 27,  9,  9,  5,  1,  1,  2,  4,  3,
-     0,  0, 29,  1,  9,  9,  9,  1,  1,  2,  5,  4,  3,  0,  0,  0,
-     1,  1,  2,  5,  4,  0,  0,  0,  9,  1,  2,  5,  2,  9,  9,  9,
-     9,  9,  5,  4,  0, 20, 20, 20,  9,  9,  9,  6,  2,  5,  4,  0,
-     5,  3,  0,  0,  8,  9,  9,  9,  9,  9,  9, 12, 12, 12, 12, 29,
-     6,  1,  1,  1,  1,  2, 15, 20, 20, 20, 20, 11,  0, 11,  0,  7,
-    15, 15, 15, 15, 15, 15, 21, 21, 21, 21,  1,  2, 26,  7,  0,  0,
-     0,  3,  0,  0,  0,  0, 19, 19,  9,  1,  1,  0,  0,  0,  9,  0,
-     1,  2,  4,  9,  6,  7, 16, 20,  9,  1,  2,  7, 12, 12, 11,  9,
-};
-
-/* Indic_Syllabic_Category: 3496 bytes. */
-
-RE_UINT32 re_get_indic_syllabic_category(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-
-    f = ch >> 13;
-    code = ch ^ (f << 13);
-    pos = (RE_UINT32)re_indic_syllabic_category_stage_1[f] << 6;
-    f = code >> 7;
-    code ^= f << 7;
-    pos = (RE_UINT32)re_indic_syllabic_category_stage_2[pos + f] << 5;
-    f = code >> 2;
-    code ^= f << 2;
-    pos = (RE_UINT32)re_indic_syllabic_category_stage_3[pos + f] << 2;
-    value = re_indic_syllabic_category_stage_4[pos + code];
-
-    return value;
-}
-
-/* Emoji. */
-
-static RE_UINT8 re_emoji_stage_1[] = {
-    0, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1,
-};
-
-static RE_UINT8 re_emoji_stage_2[] = {
-    0, 1, 1, 1, 1, 1, 1, 1, 2, 3, 4, 1, 5, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 6, 7, 8, 1,
-};
-
-static RE_UINT8 re_emoji_stage_3[] = {
-     0,  1,  2,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
-     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
-     3,  4,  1,  1,  5,  1,  6,  1,  1,  1,  1,  1,  7,  1,  1,  8,
-     1,  1,  1,  9,  1,  1, 10, 11, 12, 13, 14, 15, 16, 17, 18,  1,
-     1,  1,  1,  1, 19,  1,  1,  1,  1,  1,  1,  1, 20, 21,  1,  1,
-    22,  1,  1,  1,  1,  1,  1,  1,  1,  1, 23,  1,  1,  1,  1,  1,
-    24,  1,  1, 25,  1, 26, 27, 28, 29, 30,  1,  1, 31, 32, 33, 34,
-    32, 32, 32, 35, 36, 37, 38, 39, 32, 40, 32, 41,  1,  1,  1, 42,
-     1,  1,  1,  1, 43, 44, 45, 46,  1, 47, 48,  1,  1,  1,  1,  1,
-};
-
-static RE_UINT8 re_emoji_stage_4[] = {
-      0,   0,   0,   0,   8,   4, 255,   3,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,  66,   0,   0,   0,   0,   0,   0,   0,   0,   0,  16,
-      0,   2,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   4,   0,   0,   2,
-      0,   0, 240,   3,   0,   6,   0,   0,   0,   0,   0,  12,   0,   1,   0,   0,
-      0, 128,   0,   0,   0, 254,  15,   7,   4,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,  12,  64,   0,   1,   0,   0,   0,   0,   0,   0, 120,
-     31,  64,  50,  33,  77, 196,   0,   7,   5, 255,  15, 128, 105,   1,   0, 200,
-      0,   0, 252,  26,   3,  12,   3,  96,  48, 193,  26,   0,   0,   6, 191,  39,
-     36, 191,  84,  32,   2,   1,  24,   0, 144,  80, 184,   0,  24,   0,   0,   0,
-      0,   0, 224,   0,   2,   0,   1, 128,   0,   0,   0,   0,   0,   0,  48,   0,
-    224,   0,   0,  24,   0,   0,   0,   0,   0,   0,  33,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   1,  32,   0,   0, 128,   2,   0,   0,   0,   0,
-     16,   0,   0,   0,   0,   0,   0,   0,   0, 128,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   3, 192,   0,  64, 254,   7,   0,   0,   0,   0,
-      0,   0,   0,   0, 192, 255, 255, 255,   6,   0,   0,   4,   0, 128, 252,   7,
-      0,   0,   3,   0,   0,   0,   0,   0, 255, 255, 255, 255, 243, 255, 255, 255,
-    255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 207, 206, 255, 255, 255, 255,
-    255, 255, 255, 255, 255, 255, 185, 255, 255, 255, 255, 255, 255, 255, 255, 191,
-    255, 255, 255, 255, 255, 255, 255,  63,   0, 126, 255, 255, 255, 128, 249,   7,
-    128,  60,  97,   0,  48,   1,   6,  16,  28,   0,  14, 112,  10, 129,   8, 252,
-    255, 255,   0,   0,   0,   0,   0,   0,  63, 248,  39,   0,  63,  26, 249,   7,
-      0,   0,   0,   0, 255,  15,   0,   0,   0, 224, 255, 255, 255, 255, 255, 247,
-    191, 255, 255, 255, 255, 255, 123, 252, 255, 255, 255, 255, 231, 199, 255, 255,
-    255, 231, 255, 255, 255, 255, 255, 255,   0,   0,   0,   0,   0,   0,  15,   7,
-      7,   0,  63,   0,   0,   0,   0,   0,
-};
-
-/* Emoji: 652 bytes. */
-
-RE_UINT32 re_get_emoji(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-
-    f = ch >> 14;
-    code = ch ^ (f << 14);
-    pos = (RE_UINT32)re_emoji_stage_1[f] << 4;
-    f = code >> 10;
-    code ^= f << 10;
-    pos = (RE_UINT32)re_emoji_stage_2[pos + f] << 4;
-    f = code >> 6;
-    code ^= f << 6;
-    pos = (RE_UINT32)re_emoji_stage_3[pos + f] << 6;
-    pos += code;
-    value = (re_emoji_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1;
-
-    return value;
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,
+      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,
+      6,   6,   6,   6,   6,   6,  80,   0,   6,   6,   6,   6,   6,   6,   6,   6,
+      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,
+      6,   6,   6,   6,   6,   6,   6,   6,   6,  94,   6,   6,   6,   6,   6,   6,
+     80,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,
+      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,
+      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,
+      6,   6,   6,   6,   6, 269,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,
+      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,
+      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6, 111,
+      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,
+     80,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,
+      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,  29,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   6,   6,   6,   6,   6,   6,   6,  89,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0
+};
+
+static RE_UINT8 re_word_table_3[] = {
+      0,   0,   0,   0,   0,   0, 255,   3, 254, 255, 255, 135, 254, 255, 255,   7,
+      0,   4,  32,   4, 255, 255, 127, 255, 255, 255, 255, 255, 195, 255,   3,   0,
+     31,  80,   0,   0, 255, 255, 223, 188,  64, 215, 255, 255, 251, 255, 255, 255,
+    255, 255, 191, 255, 255, 255, 254, 255, 255, 255, 127,   2, 255,   1, 254, 255,
+    255, 255, 255, 191, 182,   0, 255, 255, 255, 135,   7,   0,   0,   0, 255,   7,
+    255, 195, 255, 255, 255, 255, 239, 159, 255, 253, 255, 159,   0,   0, 255, 255,
+    255, 231, 255, 255, 255, 255,   3,   0, 255, 255,  63,  36, 255,  63,   0,   0,
+    255, 255, 255,  15, 255,   7,   0,   0, 255, 255, 223, 255, 255,   0, 248, 255,
+    207, 255, 254, 255, 239, 159, 249, 255, 255, 253, 197, 243, 159, 121, 128, 176,
+    207, 255,   3,  80, 238, 135, 249, 255, 255, 253, 109, 211, 135,  57,   2,  94,
+    192, 255,  63,   0, 238, 191, 251, 255, 255, 253, 237, 243, 191,  59,   1,   0,
+    207, 255,   0, 254, 238, 159, 249, 255, 159,  57, 224, 176, 207, 255,   2,   0,
+    236, 199,  61, 214,  24, 199, 255, 195, 199,  61, 129,   0, 192, 255,   0,   0,
+    255, 223, 253, 255, 255, 253, 255, 227, 223,  61,  96,   7, 207, 255,   0,   0,
+    239, 223, 253, 255, 255, 253, 239, 243, 223,  61,  96,  64, 207, 255,   6,   0,
+    223, 125, 240, 128, 207, 255,   0, 252, 238, 255, 127, 252, 255, 255, 251,  47,
+    127, 132,  95, 255, 192, 255,  12,   0, 254, 255, 255, 255, 255, 255, 255,   7,
+    255, 127, 255,   3, 214, 247, 255, 255, 175, 255, 255,  63,  95,  63, 255, 243,
+      1,   0,   0,   3, 255,   3, 160, 194, 255, 254, 255, 255, 255,  31, 254, 255,
+    223, 255, 255, 254, 255, 255, 255,  31,  64,   0,   0,   0, 255,   3, 255, 255,
+    255, 255, 255,  63, 191,  32, 255, 255, 255, 255, 255, 247, 255,  61, 127,  61,
+    255,  61, 255, 255, 255, 255,  61, 127,  61, 255, 127, 255, 255, 255,  61, 255,
+    255, 255, 255, 231, 255, 255,   0,   0, 255, 255,  63,  63, 255, 159, 255, 255,
+    255, 199, 255,   1, 255, 223,  31,   0, 255, 255,  31,   0, 255, 255,  15,   0,
+    255, 223,  13,   0, 255, 255, 143,  48, 255,   3,   0,   0,   0,  56, 255,   3,
+    255, 255, 255,   1, 255,   7, 255, 255, 255, 255,  63,   0, 255, 255, 255, 127,
+    255,  15, 255,  15, 192, 255, 255, 255, 255,  63,  31,   0, 255,  15, 255, 255,
+    255,   3, 255,   3, 255, 255, 255, 159, 128,   0, 255, 255,   1,   0,   0,   0,
+    255,  15, 255,   3,   0, 248,  15,   0, 255, 255, 255,   0, 255, 227, 255, 255,
+    255,   1, 255, 255,   0,   0, 247, 255, 255, 255, 255, 251,  63,  63, 255, 170,
+    255, 255, 223,  95, 220,  31, 207,  15, 255,  31, 220,  31,   0,  48,   0,   0,
+      0,   0,   0, 128,   1,   0,  16,   0,   0,   0,   2, 128,   0,   0, 255,  31,
+    255, 255,   1,   0, 132, 252,  47,  62,  80, 189, 255, 243, 224,  67,   0,   0,
+    255,   1,   0,   0,   0,   0, 192, 255, 255, 127, 255, 255,  31, 248,  15,   0,
+    255, 128,   0, 128, 255, 255, 127,   0, 127, 127, 127, 127,   0, 128,   0,   0,
+    224,   0,   0,   0, 254, 255,  62,  31, 255, 255, 127, 230, 224, 255, 255, 255,
+    255, 127,   0,   0, 255,  31,   0,   0, 255,  31, 255, 255, 255,  15,   0,   0,
+    255, 255, 247, 191,   0,   0, 128, 255, 252, 255, 255, 255, 255, 249, 255, 255,
+    252,   7,   0,   0,   0,   0, 224, 255, 255,  16,   0,   0,  63,   0, 255,   3,
+    255, 255, 255, 232, 255,  63, 255, 255,   1, 128, 255,   3, 255,  63, 255,   3,
+    255, 255, 127, 252,   7,   0,   0,  56, 255, 255, 124,   0, 126, 126, 126,   0,
+    127, 127, 255, 255, 255,  55, 255,   3,  15,   0, 255, 255, 127, 248, 255, 255,
+    255, 255, 255,   3, 127,   0, 248, 224, 255, 253, 127,  95, 219, 255, 255, 255,
+      0,   0, 248, 255, 255, 255, 252, 255, 255,   0,   0,   0,   0,   0, 255,  15,
+    255, 255,  24,   0,   0, 224,   0,   0,   0,   0, 223, 255, 252, 252, 252,  28,
+    255, 239, 255, 255, 127, 255, 255, 183, 255,  63, 255,  63,   0,   0,   0,  32,
+      0, 224, 255, 255,  15, 255,  62,   0, 255, 255,  15, 255, 255,   0, 255, 255,
+     15,   0,   0,   0,  63, 253, 255, 255, 255, 255, 191, 145, 255, 255,  55,   0,
+    255, 255, 255, 192, 111, 240, 239, 254, 255, 255,  63, 135, 127,   0,   0,   0,
+    255, 255,   7,   0, 255,   0, 255,   3, 255,  27,   3,   0,  31,   0,   0,   0,
+    192, 255,   0, 128, 255,   1, 255,   3, 240,   0, 255, 255, 255, 255,  79,   0,
+     31, 222, 255,  23, 255, 255, 251, 255, 255, 255, 255,  64, 127, 189, 255, 191,
+    255,   7, 255,   3, 255, 253, 237, 251, 159,  57, 129, 224, 207,  31,  31,   0,
+    255,   7, 255, 195,   3,   0,   0,   0, 191,   0, 255,   3, 255, 255,  63, 255,
+      1,   0,   0,  63,  17,   0, 255,   3, 255,   3,   0, 128, 127, 242, 111, 255,
+    255, 255, 191, 249,  15,   0, 255,   3, 255, 252, 255, 255, 255, 255, 255, 252,
+     27,   0,   0,   0, 255, 255, 255,  35, 255, 253, 255, 255,   1,   0, 255,   3,
+      0,   0, 252, 255, 255, 254, 127,   0, 127, 251, 255, 255, 255, 255, 127, 180,
+    191, 253, 255, 255, 255, 127, 251,   1,   0,   0,   1,   0, 248, 255, 255, 224,
+    255, 135, 255, 255, 255, 128, 255, 255,  27,   0,   3,   0,   0,   0,   7,   0,
+    255,   7, 255,  31, 255,   1, 255,  99, 224, 227,   7, 248, 231,  15,   0,   0,
+      0,  60,   0,   0,  28,   0,   0,   0, 255, 255, 255, 223, 100, 222, 255, 235,
+    239, 255, 255, 255, 191, 231, 223, 223, 255, 255, 255, 123,  95, 252, 253, 255,
+     63, 255, 255, 255, 253, 255, 255, 247, 247, 207, 255, 255, 255, 255, 127, 248,
+    255,  31,  32,   0,  16,   0,   0, 248, 254, 255,   0,   0, 127, 255, 255, 249,
+    219,   7,   0,   0, 255,  31, 255,  63, 255,  67,   0,   0,  31,   0, 127,   0,
+    150, 254, 247,  10, 132, 234, 150, 170, 150, 247, 247,  94, 255, 251, 255,  15,
+    238, 251, 255,  15,   3,   0, 255, 255
+};
+
+RE_UINT32 re_get_word(RE_UINT32 codepoint) {
+    RE_UINT32 field_2;
+    RE_UINT32 field_1;
+    RE_UINT32 field_0;
+    RE_UINT32 offset;
+    RE_UINT32 v;
+
+    field_2 = codepoint >> 10;
+    field_1 = (codepoint >> 5) & 0x1F;
+    field_0 = (codepoint >> 3) & 0x3;
+    offset = codepoint & 0x7;
+
+    v = re_word_table_1[field_2];
+    v = re_word_table_2[(v << 5) | field_1];
+    v = re_word_table_3[(v << 2) | field_0];
+
+    return (v >> offset) & 0x1;
 }
 
-/* Emoji_Presentation. */
-
-static RE_UINT8 re_emoji_presentation_stage_1[] = {
-    0, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1,
+/* Word_Break. */
+static RE_UINT8 re_word_break_table_1[] = {
+     0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 13, 14, 15, 13, 13, 13, 13, 13,
+    13, 13, 13, 13, 13, 16, 10, 10, 10, 10, 10, 10, 10, 10, 17, 18,
+    19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 10, 10, 13, 29, 10, 10,
+    10, 30, 10, 10, 10, 10, 10, 10, 10, 10, 31, 32, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 33, 10, 10, 34,
+    10, 10, 10, 10, 35, 36, 37, 10, 38, 10, 39, 40, 41, 10, 42, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    43, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10
+};
+
+static RE_UINT16 re_word_break_table_2[] = {
+      0,   1,   2,   3,   4,   5,   6,   6,   7,   7,   7,   7,   7,   7,   7,   7,
+      7,   7,   7,   7,   7,   7,   8,   7,   9,   9,   9,  10,  11,  12,   7,  13,
+      7,   7,   7,   7,  14,   7,   7,   7,   7,  15,  16,   7,  17,  18,  19,  20,
+     21,   7,  22,  23,   7,   7,  24,  25,  26,  27,  28,   7,   7,  29,  30,  31,
+     32,  33,  34,  35,  36,  37,  38,  39,  40,  41,  42,  43,  44,  45,  46,  47,
+     48,  49,  50,  51,  52,  53,  54,  55,  56,  53,  57,  58,  59,  60,  61,  62,
+     63,  64,  65,  66,  67,  68,  69,  70,  71,  72,  73,  74,  75,  76,  77,  78,
+     36,  79,  80,  36,  36,  81,  82,  36,  83,  84,  85,  86,  87,  88,  89,  36,
+     36,  90,  91,  92,  93,   7,  94,  95,   7,   7,   7,   7,   7,   7,   7,   7,
+      7,   7,  96,   7,  97,  98,  99,   7, 100,   7, 101,  36, 102,   7,   7, 103,
+    104,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
+      7,   7,   7, 105, 106,   7,   7, 107, 108, 109, 110, 111,  36, 112, 113, 114,
+    115,   7,   7, 116, 117, 118,   7, 119, 120, 121,  62,  36,  36,  36, 122,  36,
+    123,  36, 124, 125, 126, 127, 128,  36, 129, 130, 131, 132, 133, 134,   7, 135,
+      7, 136, 137, 138, 139, 140, 141, 142,   7,   7,   7,   7,   7,   7,   9, 143,
+      7,   7,   7,   7,   7,   7,   7,   7, 103,   7, 144, 138,   7, 145, 146, 147,
+    148, 149, 150, 151, 152,  36, 127, 153, 154, 155, 156,   7, 157,  36,  36,  36,
+     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,
+     36,  36,  36,  36,  36, 158,   7, 159,  36,  36,  36,  36,  36,  36,  36,  36,
+     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,
+     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,
+     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,
+      7, 160, 120,   7,   7,   7,   7, 161,   7,  94,   7, 162, 163, 164, 164,   9,
+     36, 165,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,
+    166, 167,  36,  36, 168, 169, 169, 170, 171,  15,   7,   7, 172,   7,  36, 173,
+     36,  36,  36,  36,  36,  36, 173, 174, 169, 169, 175,  36,  36,  36,  36,  36,
+      7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
+      7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
+      7,   7,   7,   7, 176,  36, 177, 138,   7,   7,   7,   7,   7,   7,   7,   7,
+    178, 179,   7, 180, 181,   7,   7, 182, 183,   7,   7,   7,   7,   7, 184, 185,
+    186, 187,   7, 188, 189, 130, 190, 191,  30, 192, 193, 194,  40, 195, 196, 197,
+      7, 198, 199, 200,  36, 201, 202, 203, 204, 205,   7, 206,   7,   7,   7, 207,
+      7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
+      7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7, 208, 209, 210,
+     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,
+     36,  36,  36,  36,  36,  36,  36,  36, 211, 212, 213,   7,   7, 214, 215,   7,
+      7,   7,   7,   7,   7,   7,   7,   7,   7, 138, 177,   7, 216,   7, 217, 218,
+    219, 220, 221, 222,   7,   7,   7, 223, 224,   2,   3, 225, 226, 120, 227, 228,
+    229, 230, 231,  36,   7,   7,   7, 232,  36,  36,   7, 233,  36,  36,  36, 234,
+     36,  36,  36,  36, 194,   7, 235, 128,   7, 236, 237, 238, 138,   7, 239,  36,
+      7,   7,   7,   7, 138, 240, 241, 210,   7, 242,   7, 243,  36,  36,  36,  36,
+      7,   7,   7,   7,   7,   7,   7,   7,   7, 163, 119, 217,  36,  36,  36,  36,
+    244, 245, 119, 163, 120,  36,  36, 246, 119, 247,  36,  36,   7,   8,  36,  36,
+    248, 249,  36, 194, 194,  36,  85, 250,   7, 119, 119, 251, 214,  36,  36,  36,
+      7,   7, 157,  36,   7, 251,   7, 251,   7, 252,  36,  36,  36,  36,  36,  36,
+     36,  36,  36,  36,   7, 253,  36,  36, 194, 254, 255,  36,  36, 177, 256, 163,
+    133, 257, 258, 259, 133, 260, 261, 262, 133, 263, 264, 265, 133, 195, 266,  36,
+    267, 268,  36,  36, 269, 139, 270, 271, 272, 273, 274, 275,  36,  36,  36,  36,
+      7, 276, 277, 278,   7,  27, 279,  36,  36,  36,  36,  36,   7, 280, 281,  36,
+      7,  27, 282,  36,   7, 283, 114,  36, 284, 285,  36,  36,  36,  36,  36,  36,
+      7, 286,  36,  36,  36,   7,   7, 287, 288, 289, 290,  36,  36, 291, 292, 293,
+    294, 295, 296,   7, 297,  36,   7, 116,  36,  36,  36,  36,  36,  36,  36,  36,
+    298, 299, 300, 301, 302, 303,  36,  36, 304, 305, 306, 307, 308, 114,  36,  36,
+     36,  36,  36,  36,  36,  36,  36, 309,  36,  36,  36,  36,  36, 310,  36,  36,
+      7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
+      7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7, 247,  36,  36,  36,
+      7,   7,   7, 172,   7,   7,   7,   7,   7,   7, 243,  36,  36,  36,  36,  36,
+     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,
+      7, 311,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,
+     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,
+      7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
+      7,   7, 312,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,
+      7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
+      7, 116, 120, 114,  36,  36, 177, 313,   7, 314, 315, 316, 102,  36,  36,  36,
+     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,
+     36,  36,   7,   7,  36,  36,  36,  36,   7,   7, 317,   9, 318,  36,  36, 319,
+    320,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36, 321,  36,  36,  36,  36,
+     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,
+      7,   7,   7, 322, 323, 324,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,
+     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,
+     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36, 325, 326, 327,  36,  36,
+     36,  36, 328,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,
+      7,   7,  37,   7, 329, 330, 331,   7, 332, 333, 334,   7,   7,   7,   7,   7,
+      7,   7,   7,   7,   7, 335, 336,  95,  37,  37, 160, 160, 298, 298, 337, 338,
+     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,
+      9, 339,   9, 340, 341, 342,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,
+    343, 344,  36,  36,  36,  36,  36,  36,   7, 345, 346,  36,  36,  36,  36,  36,
+     36,  36,  36,  36,  36,  36,   7, 347,  36,  36,  36,  36,  36,  36,  36,  36,
+      7,   7,   7,   7,   7,   7, 348,  36,   7,   7, 349,  36,  36,  36,  36,  36,
+     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,
+     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,
+    331, 350, 351, 352, 353, 354,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,
+     36,  36,  36,  36,  36,  36,  36,  36,  36, 177, 206, 206, 159,  36,  36, 355,
+     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36, 356,
+     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,
+     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36, 122,
+    357,   9,   9,   9,  36,  36,  36,  36,   9,   9,   9,   9,   9,   9,   9, 358,
+     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36
 };
 
-static RE_UINT8 re_emoji_presentation_stage_2[] = {
+static RE_UINT8 re_word_break_table_3[] = {
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  2,  2,  3,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     4,  0,  5,  0,  0,  0,  0,  6,  0,  0,  0,  0,  7,  0,  8,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9, 10,  7,  0,  0,  0,  0,
+     0, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,  0,  0,  0,  0, 12,
+     0, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  2,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 11,  0,  0, 13,  0,  0,
+     0,  0,  0,  0,  0, 11,  0, 10,  0,  0, 11,  0,  0,  0,  0,  0,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11,  0, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11,  0,  0,  0,  0,  0,  0, 11, 11,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    11, 11, 11, 11, 11,  0, 11, 11,  0,  0, 11, 11, 11, 11,  7, 11,
+     0,  0,  0,  0,  0,  0, 11, 10, 11, 11, 11,  0, 11,  0, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11,  0, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11,  0, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11,  0, 14, 14, 14, 14, 14, 14, 14, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+     0, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11,  0,  0, 11, 11, 11, 11,  0, 11, 10,
+    11, 11, 11, 11, 11, 11, 11, 11, 11,  7, 11,  0,  0,  0,  0,  0,
+     0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,  0, 14,
+     0, 14, 14,  0, 14, 14,  0, 14,  0,  0,  0,  0,  0,  0,  0,  0,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,  0,  0,  0,  0, 15,
+    15, 15, 15, 11, 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    13, 13, 13, 13, 13, 13,  0,  0,  0,  0,  0,  0,  7,  7,  0,  0,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,  0, 13,  0,  0,  0,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  9,  7,  0, 11, 11,
+    14, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11,  0, 11, 14, 14, 14, 14, 14, 14, 14, 13,  0, 14,
+    14, 14, 14, 14, 14, 11, 11, 14, 14,  0, 14, 14, 14, 14, 11, 11,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9, 11, 11, 11,  0,  0, 11,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 13,
+    11, 14, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,  0,  0, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 11,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 11, 11,  0,  0,  7,  0, 11,  0,  0, 14,  0,  0,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 14, 14, 14, 14, 11, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 11, 14, 14, 14, 11, 14, 14, 14, 14, 14,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 14, 14, 14,  0,  0,  0,  0,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11,  0, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 14, 14, 14, 11, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    11, 14, 14, 14, 14, 14, 14, 14, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 14, 14,  0,  0,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     0, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 14, 14, 14,  0, 11, 11, 11, 11, 11, 11, 11, 11,  0,  0, 11,
+    11,  0,  0, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11,  0, 11, 11, 11, 11, 11, 11,
+    11,  0, 11,  0,  0,  0, 11, 11, 11, 11,  0,  0, 14, 11, 14, 14,
+    14, 14, 14, 14, 14,  0,  0, 14, 14,  0,  0, 14, 14, 14, 11,  0,
+     0,  0,  0,  0,  0,  0,  0, 14,  0,  0,  0,  0, 11, 11,  0, 11,
+    11, 11, 14, 14,  0,  0,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+    11, 11,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 11,  0, 14,  0,
+     0, 14, 14, 14,  0, 11, 11, 11, 11, 11, 11,  0,  0,  0,  0, 11,
+    11,  0,  0, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11,  0, 11, 11, 11, 11, 11, 11,
+    11,  0, 11, 11,  0, 11, 11,  0, 11, 11,  0,  0, 14,  0, 14, 14,
+    14, 14, 14,  0,  0,  0,  0, 14, 14,  0,  0, 14, 14, 14,  0,  0,
+     0, 14,  0,  0,  0,  0,  0,  0,  0, 11, 11, 11, 11,  0, 11,  0,
+     0,  0,  0,  0,  0,  0,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+    14, 14, 11, 11, 11, 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0, 14, 14, 14,  0, 11, 11, 11, 11, 11, 11, 11, 11, 11,  0, 11,
+    11, 11,  0, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11,  0, 11, 11, 11, 11, 11, 11,
+    11,  0, 11, 11,  0, 11, 11, 11, 11, 11,  0,  0, 14, 11, 14, 14,
+    14, 14, 14, 14, 14, 14,  0, 14, 14, 14,  0, 14, 14, 14,  0,  0,
+    11,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    11, 11, 14, 14,  0,  0,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     0,  0,  0,  0,  0,  0,  0,  0,  0, 11, 14, 14, 14, 14, 14, 14,
+     0, 14, 14, 14,  0, 11, 11, 11, 11, 11, 11, 11, 11,  0,  0, 11,
+    11,  0,  0, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    14, 14, 14, 14, 14,  0,  0, 14, 14,  0,  0, 14, 14, 14,  0,  0,
+     0,  0,  0,  0,  0, 14, 14, 14,  0,  0,  0,  0, 11, 11,  0, 11,
+    11, 11, 14, 14,  0,  0,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     0, 11,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0, 14, 11,  0, 11, 11, 11, 11, 11, 11,  0,  0,  0, 11, 11,
+    11,  0, 11, 11, 11, 11,  0,  0,  0, 11, 11,  0, 11,  0, 11, 11,
+     0,  0,  0, 11, 11,  0,  0,  0, 11, 11, 11,  0,  0,  0, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11,  0,  0,  0,  0, 14, 14,
+    14, 14, 14,  0,  0,  0, 14, 14, 14,  0, 14, 14, 14, 14,  0,  0,
+    11,  0,  0,  0,  0,  0,  0, 14,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    14, 14, 14, 14, 14, 11, 11, 11, 11, 11, 11, 11, 11,  0, 11, 11,
+    11,  0, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11,  0, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11,  0,  0,  0, 11, 14, 14,
+    14, 14, 14, 14, 14,  0, 14, 14, 14,  0, 14, 14, 14, 14,  0,  0,
+     0,  0,  0,  0,  0, 14, 14,  0, 11, 11, 11,  0,  0,  0,  0,  0,
+    11, 11, 14, 14,  0,  0,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    11, 14, 14, 14,  0, 11, 11, 11, 11, 11, 11, 11, 11,  0, 11, 11,
+    11,  0, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11,  0, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11,  0, 11, 11, 11, 11, 11,  0,  0, 14, 11, 14, 14,
+    14, 14, 14, 14, 14,  0, 14, 14, 14,  0, 14, 14, 14, 14,  0,  0,
+     0,  0,  0,  0,  0, 14, 14,  0,  0,  0,  0,  0,  0,  0, 11,  0,
+    11, 11, 14, 14,  0,  0,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     0, 11, 11,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    14, 14, 14, 14, 11, 11, 11, 11, 11, 11, 11, 11, 11,  0, 11, 11,
+    11,  0, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 14, 14, 11, 14, 14,
+    14, 14, 14, 14, 14,  0, 14, 14, 14,  0, 14, 14, 14, 14, 11,  0,
+     0,  0,  0,  0, 11, 11, 11, 14,  0,  0,  0,  0,  0,  0,  0, 11,
+    11, 11, 14, 14,  0,  0,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 11, 11, 11, 11, 11, 11,
+     0, 14, 14, 14,  0, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11,  0,  0,  0, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11,  0, 11, 11, 11, 11, 11, 11, 11, 11, 11,  0, 11,  0,  0,
+    11, 11, 11, 11, 11, 11, 11,  0,  0,  0, 14,  0,  0,  0,  0, 14,
+    14, 14, 14, 14, 14,  0, 14,  0, 14, 14, 14, 14, 14, 14, 14, 14,
+     0,  0,  0,  0,  0,  0,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     0,  0, 14, 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0, 14,  0,  0, 14, 14, 14, 14, 14, 14, 14,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0, 14, 14, 14, 14, 14, 14, 14, 14,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0, 14,  0,  0, 14, 14, 14, 14, 14, 14, 14, 14, 14,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0, 14, 14, 14, 14, 14, 14,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,  0,  0,
+    11,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0, 14, 14,  0,  0,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0, 14,  0, 14,  0, 14,  0,  0,  0,  0, 14, 14,
+    11, 11, 11, 11, 11, 11, 11, 11,  0, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,  0,  0,  0,
+     0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14,  0, 14, 14, 11, 11, 11, 11, 11, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14,  0, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,  0,  0,  0,
+     0,  0,  0,  0,  0,  0, 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0, 14, 14, 14, 14,  0,  0,  0,  0, 14, 14,
+    14,  0, 14, 14, 14,  0,  0, 14, 14, 14, 14, 14, 14, 14,  0,  0,
+     0, 14, 14, 14, 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,  0, 14,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9, 14, 14, 14, 14,  0,  0,
+    11, 11, 11, 11, 11, 11,  0, 11,  0,  0,  0,  0,  0, 11,  0,  0,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,  0, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11,  0, 11, 11, 11, 11,  0,  0,
+    11, 11, 11, 11, 11, 11, 11,  0, 11,  0, 11, 11, 11, 11,  0,  0,
+    11, 11, 11, 11, 11, 11, 11, 11, 11,  0, 11, 11, 11, 11,  0,  0,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11,  0, 11, 11, 11, 11,  0,  0, 11, 11, 11, 11, 11, 11, 11,  0,
+    11,  0, 11, 11, 11, 11,  0,  0, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11,  0, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11,  0, 11, 11, 11, 11,  0,  0, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,  0,  0, 14, 14, 14,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11,  0,  0, 11, 11, 11, 11, 11, 11,  0,  0,
+     0, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,  0,  0, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+     4, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,  0,  0,  0,  0,  0,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,  0,  0,  0, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11,  0,  0,  0,  0,  0,  0,  0,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,  0, 11, 11,
+    11, 11, 14, 14, 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 14, 14, 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 14, 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,  0, 11, 11,
+    11,  0, 14, 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14,  0,  0,  0,  0,  0,  0,  0,  0,  0, 14,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 14, 14, 14, 13,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,  0,  0,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11,  0,  0,  0,  0,  0,  0,  0,
+    11, 11, 11, 11, 11, 14, 14, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 14, 11,  0,  0,  0,  0,  0,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,  0,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,  0,  0,  0,  0,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,  0,  0,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 14, 14, 14, 14, 14,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,  0,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,  0,  0, 14,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    14, 14, 14, 14, 14, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 11, 11, 11, 11, 11, 11, 11,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 14, 14, 14, 14, 14,
+    14, 14, 14, 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    14, 14, 14, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 11, 11,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    11, 11, 11, 11, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14,  0,  0,  0,  0,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0, 11, 11, 11,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,  0,  0,
+    11, 11, 11, 11, 11, 11, 11, 11, 11,  0,  0,  0,  0,  0,  0,  0,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,  0,  0, 11, 11, 11,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    14, 14, 14,  0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 11, 11, 11, 11, 14, 11, 11,
+    11, 11, 11, 11, 14, 11, 11, 14, 14, 14, 11,  0,  0,  0,  0,  0,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14,  0, 14, 14, 14, 14, 14,
+    11, 11, 11, 11, 11, 11,  0,  0, 11, 11, 11, 11, 11, 11,  0,  0,
+    11, 11, 11, 11, 11, 11, 11, 11,  0, 11,  0, 11,  0, 11,  0, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11,  0, 11, 11, 11, 11, 11, 11, 11,  0, 11,  0,
+     0,  0, 11, 11, 11,  0, 11, 11, 11, 11, 11, 11, 11,  0,  0,  0,
+    11, 11, 11, 11,  0,  0, 11, 11, 11, 11, 11, 11,  0,  0,  0,  0,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,  0,  0,  0,
+     0,  0, 11, 11, 11,  0, 11, 11, 11, 11, 11, 11, 11,  0,  0,  0,
+     4,  4,  4,  4,  4,  4,  4,  0,  4,  4,  4,  0, 14, 16, 13, 13,
+     0,  0,  0,  0,  0,  0,  0,  0,  8,  8,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  8,  0,  0, 10,  2,  2, 13, 13, 13, 13, 13, 12,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 12,
+    12,  0,  0,  0,  7,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0, 12,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  4,
+    13, 13, 13, 13, 13,  0, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+     0, 11,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 11,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,  0,  0,  0,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0, 11,  0,  0,  0,  0, 11,  0,  0, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11,  0, 11,  0,  0,  0, 11, 11, 11, 11, 11,  0,  0,
+     0,  0,  0,  0, 11,  0, 11,  0, 11,  0, 11, 11, 11, 11,  0, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11,  0,  0, 11, 11, 11, 11,
+     0,  0,  0,  0,  0, 11, 11, 11, 11, 11,  0,  0,  0,  0, 11,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    11, 11, 11, 11, 11, 11, 11, 11, 11,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,  0,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11,  0,  0,  0,  0,  0,  0, 11, 11, 11, 11, 14,
+    14, 14, 11, 11,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    11, 11, 11, 11, 11, 11, 11, 11,  0,  0,  0,  0,  0,  0,  0, 11,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 14,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    11, 11, 11, 11, 11, 11, 11,  0, 11, 11, 11, 11, 11, 11, 11,  0,
+    11, 11, 11, 11, 11, 11, 11,  0, 11, 11, 11, 11, 11, 11, 11,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 11,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     4,  0,  0,  0,  0, 11,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 14, 14, 14, 14, 14, 14,
+     0, 17, 17, 17, 17, 17,  0,  0,  0,  0,  0, 11, 11,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0, 14, 14, 17, 17,  0,  0,  0,
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,  0, 17, 17, 17, 17,
+     0,  0,  0,  0,  0, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,  0,
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+    17, 17, 17, 17, 17, 17, 17, 17,  0,  0,  0,  0,  0,  0,  0,  0,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,  0,  0,  0,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9, 11, 11,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 14,
+    14, 14, 14,  0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,  0, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 14, 14,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    14, 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+     0,  0, 11, 11, 11, 11, 11, 11, 11, 11, 11,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 14, 11, 11, 11, 14, 11, 11, 11, 11, 14, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 14, 14, 14, 14, 14,  0,  0,  0,  0, 14,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    14, 14, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    14, 14, 14, 14, 14, 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,  0,  0,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 11, 11, 11, 11, 11, 11,  0,  0,  0, 11,  0, 11, 11, 14,
+    11, 11, 11, 11, 11, 11, 14, 14, 14, 14, 14, 14, 14, 14,  0,  0,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,  0,  0,  0,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 11,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0, 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,  0,  0,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    11, 11, 11, 14, 11, 11, 11, 11, 11, 11, 11, 11, 14, 14,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 14, 14, 14,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    14,  0, 14, 14, 14,  0,  0, 14, 14,  0,  0,  0,  0,  0, 14, 14,
+     0, 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 14, 14, 14, 14, 14,
+     0,  0, 11, 11, 11, 14, 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0, 11, 11, 11, 11, 11, 11,  0,  0, 11, 11, 11, 11, 11, 11,  0,
+     0, 11, 11, 11, 11, 11, 11,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    11, 11, 11, 11, 11, 11, 11,  0, 11, 11, 11, 11, 11, 11, 11,  0,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11,  0,  0,  0,  0,  0,  0,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 14, 14, 14, 14, 14, 14, 14, 14,  0, 14, 14,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,  0,  0,
+    11, 11, 11, 11,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11,  0,  0,  0,  0, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,  0,  0,  0,  0,
+    11, 11, 11, 11, 11, 11, 11,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0, 11, 11, 11, 11, 11,  0,  0,  0,  0,  0, 15, 14, 15,
+    15, 15, 15, 15, 15, 15, 15, 15, 15,  0, 15, 15, 15, 15, 15, 15,
+    15, 15, 15, 15, 15, 15, 15,  0, 15, 15, 15, 15, 15,  0, 15,  0,
+    15, 15,  0, 15, 15,  0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+     0,  0, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,  0,  0,  0,  0,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+     7,  0,  0, 10,  7,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+     0,  0,  0, 12, 12,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 12, 12, 12,
+     7,  0,  8,  0,  7, 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    11, 11, 11, 11, 11,  0, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,  0,  0, 13,
+     0,  0,  0,  0,  0,  0,  0,  8,  0,  0,  0,  0,  7,  0,  8,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9, 10,  7,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 14, 14,
+     0,  0, 11, 11, 11, 11, 11, 11,  0,  0, 11, 11, 11, 11, 11, 11,
+     0,  0, 11, 11, 11, 11, 11, 11,  0,  0, 11, 11, 11,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0, 13, 13, 13,  0,  0,  0,  0,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,  0, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11,  0, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,  0, 11, 11,  0, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,  0,  0,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,  0,  0,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,  0,  0,  0,  0,  0,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 14,  0,  0,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,  0,  0,  0,  0,  0,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 14, 14, 14, 14, 14,  0,  0,  0,  0,  0,
+    11, 11, 11, 11,  0,  0,  0,  0, 11, 11, 11, 11, 11, 11, 11, 11,
+     0, 11, 11, 11, 11, 11,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,  0,  0,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11,  0,  0,  0,  0, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11,  0,  0,  0,  0,  0,  0,  0,  0,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    11, 11, 11, 11, 11, 11,  0,  0, 11,  0, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11,  0, 11, 11,  0,  0,  0, 11,  0,  0, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11,  0, 11, 11,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11,  0,  0,  0,  0,  0,  0,
+    11, 14, 14, 14,  0, 14, 14,  0,  0,  0,  0,  0, 14, 14, 14, 14,
+    11, 11, 11, 11,  0, 11, 11, 11,  0, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11,  0,  0, 14, 14, 14,  0,  0,  0,  0, 14,
+    11, 11, 11, 11, 11, 14, 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,
      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  1,  2,  3,  0,  4,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    11, 11, 11, 11, 14, 14, 14, 14,  0,  0,  0,  0,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,  0,  0,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11,  0, 14, 14,  0,  0,  0,
+    11, 11,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0, 11,  0,  0,  0,  0,  0,  0,  0,  0,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    11, 11, 11, 11, 11,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,
      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 14,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,  0,  0, 13,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 13,  0,  0,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11,  0,  0,  0,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,  0,  0,
+    11, 11, 11, 11, 11, 11, 11, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14,  0,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     0,  0,  0,  0, 11, 14, 14, 11,  0,  0,  0,  0,  0,  0,  0,  0,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 14,  0,  0, 11,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    14, 11, 11, 11, 11,  0,  0,  0,  0, 14, 14, 14, 14,  0, 14, 14,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9, 11,  0, 11,  0,  0,  0,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11,  0, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14,  0,  0,  0,  0,  0,  0, 14,  0,
+    11, 11, 11, 11, 11, 11, 11,  0, 11,  0, 11, 11, 11, 11,  0, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,  0, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,  0,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,  0,  0,
+    14, 14, 14, 14,  0, 11, 11, 11, 11, 11, 11, 11, 11,  0,  0, 11,
+    11,  0,  0, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11,  0, 11, 11, 11, 11, 11, 11,
+    11,  0, 11, 11,  0, 11, 11, 11, 11, 11,  0, 14, 14, 11, 14, 14,
+    14, 14, 14, 14, 14,  0,  0, 14, 14,  0,  0, 14, 14, 14,  0,  0,
+    11,  0,  0,  0,  0,  0,  0, 14,  0,  0,  0,  0,  0, 11, 11, 11,
+    11, 11, 14, 14,  0,  0, 14, 14, 14, 14, 14, 14, 14,  0,  0,  0,
+    14, 14, 14, 14, 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 11, 11, 11, 11,  0,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0, 14, 11,
+    11, 11,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0,  0,  0,  5,  6,  7,  8,  9, 10,  0,  0,
-};
-
-static RE_UINT8 re_emoji_presentation_stage_3[] = {
+    14, 14, 14, 14, 11, 11,  0, 11,  0,  0,  0,  0,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,  0,  0,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 14,
+    14, 14, 14, 14, 14, 14,  0,  0, 14, 14, 14, 14, 14, 14, 14, 14,
+    14,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0, 11, 11, 11, 11, 14, 14,  0,  0,
+    14,  0,  0,  0, 11,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,  0,  0,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 11,  0,  0,  0,  0,  0,  0,  0,
      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0,  0,  0,  1,  0,  0,  0,  0,  0,  0,  2,
-     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  3,
-     4,  0,  5,  6,  7,  8,  9, 10, 11, 12, 13,  0, 14, 15,  0,  0,
-     0,  0,  0,  0,  0,  0,  0,  0, 16,  0, 17,  0,  0,  0,  0,  0,
-    18,  0,  0,  0,  0,  0, 19,  0,  0,  0,  0,  0, 20,  0,  0, 21,
-    22, 23, 24,  0,  0,  0,  0,  0, 25, 26, 25, 27, 28, 25, 29, 30,
-    25, 31, 32, 25, 25, 25, 25, 33, 25, 34, 35, 36, 37, 18,  0, 38,
-    25, 25, 39,  0, 25, 25, 40, 41,  0,  0,  0,  0,  0,  0,  0, 42,
-     0,  0,  0,  0,  0,  0,  0,  0, 43, 44, 45, 46, 25, 47, 48, 25,
-     0,  0,  0, 49, 50,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-};
-
-static RE_UINT8 re_emoji_presentation_stage_4[] = {
-      0,   0,   0,   0,   0,   0,   0,  12,   0,  30,   9,   0,   0,   0,   0,  96,
-      0,   0,  48,   0,   0, 255,  15,   0,   0,   0,   0, 128,   0,   0,   8,   0,
-      2,  12,   0,  96,  48,  64,  16,   0,   0,   4,  44,  36,  32,  12,   0,   0,
-      0,   1,   0,   0,   0,  80, 184,   0,   0,   0, 224,   0,   0,   0,   1, 128,
-      0,   0,   0,  24,   0,   0,  33,   0,  16,   0,   0,   0,   0, 128,   0,   0,
-      0,  64, 254,   7, 192, 255, 255, 255,   2,   0,   0,   4,   0, 128, 124,   7,
-      0,   0,   3,   0, 255, 255, 255, 255,   1, 224, 191, 255, 255, 255, 255, 223,
-    255, 255,  15,   0, 255, 135,  15,   0, 255, 255,  17, 255, 255, 255, 255, 127,
-    253, 255, 255, 255, 255, 255, 255, 159, 255, 255, 255,  63,   0, 120, 255, 255,
-    255,   0,   0,   4,   0,   0,  96,   0,   0,   0,   0, 248, 255, 255,   0,   0,
-     63,  16,  39,   0,   0,  24, 240,   7, 255,  15,   0,   0,   0, 224, 255, 255,
-    255, 255, 255, 247, 191, 255, 255, 255, 255, 255, 123, 252, 231, 199, 255, 255,
-    255, 231, 255, 255,   0,   0,  15,   7,   7,   0,  63,   0,
-};
-
-/* Emoji_Presentation: 544 bytes. */
-
-RE_UINT32 re_get_emoji_presentation(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-
-    f = ch >> 14;
-    code = ch ^ (f << 14);
-    pos = (RE_UINT32)re_emoji_presentation_stage_1[f] << 5;
-    f = code >> 9;
-    code ^= f << 9;
-    pos = (RE_UINT32)re_emoji_presentation_stage_2[pos + f] << 4;
-    f = code >> 5;
-    code ^= f << 5;
-    pos = (RE_UINT32)re_emoji_presentation_stage_3[pos + f] << 5;
-    pos += code;
-    value = (re_emoji_presentation_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1;
-
-    return value;
-}
-
-/* Emoji_Modifier. */
-
-static RE_UINT8 re_emoji_modifier_stage_1[] = {
-    0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0,
-};
-
-static RE_UINT8 re_emoji_modifier_stage_2[] = {
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0,
-};
-
-static RE_UINT8 re_emoji_modifier_stage_3[] = {
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
-};
-
-static RE_UINT8 re_emoji_modifier_stage_4[] = {
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 248,
-};
-
-/* Emoji_Modifier: 130 bytes. */
-
-RE_UINT32 re_get_emoji_modifier(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-
-    f = ch >> 15;
-    code = ch ^ (f << 15);
-    pos = (RE_UINT32)re_emoji_modifier_stage_1[f] << 4;
-    f = code >> 11;
-    code ^= f << 11;
-    pos = (RE_UINT32)re_emoji_modifier_stage_2[pos + f] << 4;
-    f = code >> 7;
-    code ^= f << 7;
-    pos = (RE_UINT32)re_emoji_modifier_stage_3[pos + f] << 7;
-    pos += code;
-    value = (re_emoji_modifier_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1;
-
-    return value;
-}
-
-/* Emoji_Modifier_Base. */
-
-static RE_UINT8 re_emoji_modifier_base_stage_1[] = {
-    0, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1,
-};
-
-static RE_UINT8 re_emoji_modifier_base_stage_2[] = {
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 4, 0,
-};
-
-static RE_UINT8 re_emoji_modifier_base_stage_3[] = {
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,  0,  0,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,  0,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 11,
+    11, 11, 11, 11, 11, 11, 11,  0,  0, 11,  0,  0, 11, 11, 11, 11,
+    11, 11, 11, 11,  0, 11, 11,  0, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    14, 14, 14, 14, 14, 14,  0, 14, 14,  0,  0, 14, 14, 14, 14, 11,
+    14, 11, 14, 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,  0,  0,
+    11, 11, 11, 11, 11, 11, 11, 11,  0,  0, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 14, 14, 14, 14, 14, 14, 14,  0,  0, 14, 14, 14, 14, 14, 14,
+    14, 11,  0, 11, 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0,  0,  0,  1,  0,  0,  2,  3,  0,  0,  0,
-     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  4,  5,
-     0,  6,  7,  0,  0,  8,  9,  0,  0, 10, 11, 12,  0,  0,  0,  0,
-     0,  0,  0,  0, 13,  0, 14, 15,  0,  0,  0,  0,  0,  0,  0,  0,
-};
-
-static RE_UINT8 re_emoji_modifier_base_stage_4[] = {
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  32,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   2,   0,  60,   0,   0,   0,   0,   0,   0,
-     32,   0,   0,   0,   0,   0,   0,   0, 156,  28,   0,   0,   0,   0,   0,   0,
-    204, 255,   1,   0, 192, 255, 255,  17, 238, 128,   2,   0,   0,   4,   0,   0,
-      0,   0,   0,   0,   0,   0,  48,   4,   0,   0,  97,   0,   0,   0,   0,   0,
-    224, 248,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   8,   0, 112,   0,
-      1,  16,   0,   0,   0,   0,   0,   0,   0, 128,   0, 255,  64,   0, 255, 115,
-      0,   0,   0,   0,   0,   0,  96,  11,   0, 224, 254,  63,   0,   0,   0,   0,
-};
-
-/* Emoji_Modifier_Base: 324 bytes. */
-
-RE_UINT32 re_get_emoji_modifier_base(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-
-    f = ch >> 14;
-    code = ch ^ (f << 14);
-    pos = (RE_UINT32)re_emoji_modifier_base_stage_1[f] << 4;
-    f = code >> 10;
-    code ^= f << 10;
-    pos = (RE_UINT32)re_emoji_modifier_base_stage_2[pos + f] << 4;
-    f = code >> 6;
-    code ^= f << 6;
-    pos = (RE_UINT32)re_emoji_modifier_base_stage_3[pos + f] << 6;
-    pos += code;
-    value = (re_emoji_modifier_base_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1;
-
-    return value;
-}
-
-/* Emoji_Component. */
-
-static RE_UINT8 re_emoji_component_stage_1[] = {
-    0, 1, 1, 2, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 4, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1,
-};
-
-static RE_UINT8 re_emoji_component_stage_2[] = {
-    0, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, 1, 5, 1,
-    6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-};
-
-static RE_UINT8 re_emoji_component_stage_3[] = {
-    0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    2, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 4, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 5, 1, 1, 1, 1, 1, 1, 1, 6,
-    1, 1, 1, 1, 1, 1, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    8, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-};
-
-static RE_UINT8 re_emoji_component_stage_4[] = {
-      0,   0,   0,   0,   8,   4, 255,   3,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,  32,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   8,   0,   0,   0,
-      0, 128,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 192, 255, 255, 255,
-      0,   0,   0,   0,   0,   0,   0, 248,   0,   0,   0,   0,   0,   0,  15,   0,
-      0,   0,   0,   0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
-};
-
-/* Emoji_Component: 340 bytes. */
-
-RE_UINT32 re_get_emoji_component(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-
-    f = ch >> 14;
-    code = ch ^ (f << 14);
-    pos = (RE_UINT32)re_emoji_component_stage_1[f] << 4;
-    f = code >> 10;
-    code ^= f << 10;
-    pos = (RE_UINT32)re_emoji_component_stage_2[pos + f] << 4;
-    f = code >> 6;
-    code ^= f << 6;
-    pos = (RE_UINT32)re_emoji_component_stage_3[pos + f] << 6;
-    pos += code;
-    value = (re_emoji_component_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1;
-
-    return value;
-}
-
-/* Extended_Pictographic. */
-
-static RE_UINT8 re_extended_pictographic_stage_1[] = {
-    0, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1,
-};
-
-static RE_UINT8 re_extended_pictographic_stage_2[] = {
-    0, 1, 1, 1, 1, 1, 1, 1, 2, 3, 4, 1, 5, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 6, 7, 8, 9,
-};
-
-static RE_UINT8 re_extended_pictographic_stage_3[] = {
-     0,  0,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    11, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 14, 14, 14, 14, 14, 14, 14, 11, 14, 14, 14, 14,  0,
+     0,  0,  0,  0,  0,  0,  0, 14,  0,  0,  0,  0,  0,  0,  0,  0,
+    11, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14,  0,  0,  0, 11,  0,  0,
+    11, 11, 11, 11, 11, 11, 11, 11, 11,  0, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 14,
+    14, 14, 14, 14, 14, 14, 14,  0, 14, 14, 14, 14, 14, 14, 14, 14,
+    11,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,  0,  0,
      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     2,  3,  0,  0,  4,  0,  5,  0,  0,  0,  0,  0,  6,  0,  7,  8,
-     0,  0,  0,  9,  0,  0, 10, 11, 12, 13, 14, 13, 15, 16, 17,  0,
-     0,  0,  0,  0, 18,  0,  0,  0,  0,  0,  0,  0, 19, 20,  0,  0,
-    21,  0,  0,  0,  0,  0,  0,  0,  0,  0, 22,  0,  0,  0,  0,  0,
-    13, 13, 13, 13, 23, 24, 25, 26, 27, 28, 13, 13, 13, 13, 13, 29,
-    13, 13, 13, 13, 30, 31, 13, 13, 13, 32, 13, 13,  0, 33,  0, 34,
-    35, 36, 37, 13, 38, 39, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 30,
-};
-
-static RE_UINT8 re_extended_pictographic_stage_4[] = {
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  66,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,  16,   0,   2,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   4,   0,   0,   2,   0,   0, 240,   3,   0,   6,   0,   0,
-      0,   0,   0,  12,   0,   1,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,
-      0, 128,   0,   0,   0, 254,  15,   7,   4,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,  12,  64,   0,   1,   0,   0,   0,   0,   0,   0, 120,
-    191, 255, 247, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
-     63,   0, 255, 255, 255, 255, 255, 255,  63, 255,  87,  32,   2,   1,  24,   0,
-    144,  80, 184,   0, 248,   0,   0,   0,   0,   0, 224,   0,   2,   0,   1, 128,
-      0,   0,   0,   0,   0,   0,  48,   0, 224,   0,   0,  24,   0,   0,   0,   0,
-      0,   0,  33,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,  32,
-      0,   0, 128,   2,   0,   0,   0,   0,   0, 224,   0,   0,   0, 128,   0,   0,
-      0,   0,   0,   0,   0, 240,   3, 192,   0,  64, 254,   7,   0, 224, 255, 255,
-    255, 255, 255, 255,  63,   0,   0,   0, 254, 255,   0,   4,   0, 128, 252, 247,
-      0, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,   7,
-    255, 255, 255, 255, 255, 255, 255,  63, 192, 255, 255, 255, 255, 255, 255, 255,
-    255, 255,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 240, 255,
-      0,   0, 224, 255, 255, 255, 255, 255,   0, 240,   0,   0,   0,   0,   0,   0,
-      0, 255,   0, 252,   0,   0,   0,   0,   0, 255,   0,   0,   0, 192, 255, 255,
-      0, 240, 255, 255, 255, 255, 255, 247, 191, 255, 255, 255, 255, 255, 255, 255,
-};
-
-/* Extended_Pictographic: 596 bytes. */
-
-RE_UINT32 re_get_extended_pictographic(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-
-    f = ch >> 14;
-    code = ch ^ (f << 14);
-    pos = (RE_UINT32)re_extended_pictographic_stage_1[f] << 4;
-    f = code >> 10;
-    code ^= f << 10;
-    pos = (RE_UINT32)re_extended_pictographic_stage_2[pos + f] << 4;
-    f = code >> 6;
-    code ^= f << 6;
-    pos = (RE_UINT32)re_extended_pictographic_stage_3[pos + f] << 6;
-    pos += code;
-    value = (re_extended_pictographic_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1;
-
-    return value;
-}
-
-/* NFD_Quick_Check. */
-
-static RE_UINT8 re_nfd_quick_check_stage_1[] = {
-    0, 1, 2, 3, 4, 1, 1, 5, 1, 1, 1, 6, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1,
-};
-
-static RE_UINT8 re_nfd_quick_check_stage_2[] = {
-     0,  1,  2,  3,  4,  5,  6,  7,  8,  5,  9,  5, 10,  5,  5,  5,
-     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
-     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5, 11, 11, 11, 11, 11,
-    11, 11, 11, 11, 11, 12,  5,  5,  5,  5,  5,  5,  5,  5, 13,  5,
-     5,  5,  5,  5, 14, 15,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
-     5,  5,  5,  5, 16,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
-     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5, 17,  5,
-};
-
-static RE_UINT8 re_nfd_quick_check_stage_3[] = {
-     0,  0,  0,  1,  2,  3,  4,  5,  6,  0,  0,  0,  0,  7,  8,  9,
-    10, 11,  0, 12,  0,  0,  0,  0, 13,  0,  0, 14,  0,  0,  0,  0,
-     0,  0,  0,  0, 15, 16,  0, 17, 18, 19,  0,  0,  0, 20, 21, 22,
-     0, 23,  0, 24,  0, 22,  0, 25,  0,  0,  0,  0,  0, 26, 27,  0,
-    28,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 29, 30,  0,  0,
-     0,  0,  0,  0,  0,  0,  0,  0, 31, 31, 32, 33, 34, 35, 36, 37,
-    38,  0,  0,  0, 39,  0, 40, 41, 42, 43, 44, 45, 46,  0,  0,  0,
-     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 47,  0,  0,  0,  0,
-     0, 48, 49, 50,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31,
-    31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 51,  0,
-     0,  0,  0,  0, 31, 31, 31, 31, 52, 53, 31, 54, 55, 56,  0,  0,
-     0,  0, 57,  0, 58,  0,  0,  0,  0,  0,  0,  0,  0, 59,  0,  0,
-     0,  0, 60,  0,  0,  0, 61,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0, 62, 63, 64,  0,  0,  0,  0,  0,  0,  0,  0,
-    31, 31, 31, 31, 31, 31, 31, 31, 65,  0,  0,  0,  0,  0,  0,  0,
-};
-
-static RE_UINT8 re_nfd_quick_check_stage_4[] = {
-      0,   0,   0,   0,   0,   0,   0,   0, 191, 255, 126,  62, 191, 255, 126, 190,
-    255, 255, 252, 255,  63, 255, 241, 126, 248, 241, 243, 255,  63, 255, 255, 127,
-      0,   0,   0,   0,   3, 128,   1,   0,   0, 224, 255, 223, 207, 255,  49, 255,
-    255, 255, 255, 207, 192, 255,  15,   0,  27,   0,   0,   0,   0,   0,  16,  64,
-    224, 215,   1,   0,   0, 252,   1,   0,   0, 124,  24,   0,   0,   0,   0,   0,
-    139, 112,   0,   2,   0,   0,   0,   2,   0,   0, 139, 112,   0,   0, 192,   0,
-      6,   0, 207, 252, 252, 252,  63,   3,   0,   0,   0,   0, 124,   0,   0,   0,
-      5,   0,   8,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,  18,   0,
-      0,   0,   0, 255,   0,   0,   0,   0,   0,  24,   0, 176,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,  72,   0,   0,   0,   0,  78,   0,   0,   0,   0,
-      0,  25,   0,  48,   0,   0,   0,   0,   0,   0,  16,   0,   0,   0,   0,   0,
-      0,  28,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,
-    129,  13,   0,   0,   0,   0,   0,   0,   0,   0,   0, 116,   0,   0,   0,   0,
-      8,  32, 132,  16,   0,   2, 104,   1,   2,   0,   8,  32, 132,  16,   0,   2,
-      0,   0,   0,   0,  64,   0,   0,   0,  64,  85,   4,   0,   0,   0,   0,  40,
-     11,   0,   0,   0,   0,   0,   0,   0, 255, 255, 255, 255, 255, 255, 255, 255,
-    255, 255, 255,  11, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,   3,
-    255, 255,  63,  63, 255, 255, 255, 255,  63,  63, 255, 170, 255, 255, 255,  63,
-    255, 255, 255, 255, 255, 255, 223,  95, 222, 255, 207, 239, 255, 255, 220,  63,
-      3,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  64,  12,   0,   0,
-      0,   0,   0,  12,   0,  64,   0,   0,   0, 224,   0,   0,   0,   0,   0,   0,
-     16,  18,   0,   0,  80,   0,   0,   0, 146,   2,   0,   0,   5, 224,  51,   3,
-     51,   3,   0,   0,   0, 240,   0,   0,   0,   0,   0,   0,  15,  60,   0,   0,
-      0,   0,   0,   0,   0,   6,   0,   0,   0,   0,   0,  16,   0,   0,   0,   0,
-      0,  80,  85,  85, 165,   2, 219,  54,   0,   0,  16,  64,   0,  80,  85,  85,
-    165,   2, 219,  54,   0,   0, 144,  71, 255, 255, 255, 255,  15,   0,   0,   0,
-    255,  63, 229, 127, 101, 252, 255, 255, 255, 255, 255, 255, 255,  63, 255, 255,
-    255, 255, 255,   3,   0,   0,   0,   0,   0,   0,   0, 160,   0, 252, 127,  95,
-    219, 127,   0,   0,   0,   0,   0,   0,   0,   0,   0,  20,   0,   8,   0,   0,
-      0,   0,   0,   0,   0, 192,   0,   0,   0,  24,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,  88,   0,   0,   0,   0,   0,   0,   0,  12,
-      0,   0,   0, 192,  31,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 248,
-      1,   0,   0,   0,   0,   0,   0,   0, 255, 255, 255,  63,   0,   0,   0,   0,
-};
-
-/* NFD_Quick_Check: 996 bytes. */
-
-RE_UINT32 re_get_nfd_quick_check(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-
-    f = ch >> 14;
-    code = ch ^ (f << 14);
-    pos = (RE_UINT32)re_nfd_quick_check_stage_1[f] << 4;
-    f = code >> 10;
-    code ^= f << 10;
-    pos = (RE_UINT32)re_nfd_quick_check_stage_2[pos + f] << 4;
-    f = code >> 6;
-    code ^= f << 6;
-    pos = (RE_UINT32)re_nfd_quick_check_stage_3[pos + f] << 6;
-    pos += code;
-    value = (re_nfd_quick_check_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1;
-
-    return value;
-}
-
-/* NFC_Quick_Check. */
-
-static RE_UINT8 re_nfc_quick_check_stage_1[] = {
-    0, 1, 2, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5,
-    4, 6, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 4, 4,
-    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 8,
-    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
-    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
-    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
-    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
-    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
-    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
-    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
-    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
-    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
-    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
-    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
-    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
-    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
-    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
-};
-
-static RE_UINT8 re_nfc_quick_check_stage_2[] = {
-     0,  0,  0,  0,  0,  0,  1,  2,  0,  0,  0,  0,  3,  0,  0,  0,
-     0,  0,  4,  5,  6,  0,  7,  8,  9, 10,  8, 11,  0,  0, 12, 13,
-    14,  0, 15, 16,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0, 17,  0,  0,  0,  0,  0,  0,  0, 18, 19,
-    20,  0, 21,  0,  0,  0, 22,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0, 23,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0, 24,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+     0,  0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14,  0, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    11, 11, 11, 11, 11, 11, 11,  0, 11, 11,  0, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 14, 14, 14, 14, 14, 14,  0,  0,  0, 14,  0, 14, 14,  0, 14,
+    14, 14, 14, 14, 14, 14, 11, 14,  0,  0,  0,  0,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,  0,  0,
+    11, 11, 11, 11, 11, 11,  0, 11, 11,  0, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 14, 14, 14, 14, 14,  0,
+    14, 14,  0, 14, 14, 14, 14, 14, 11,  0,  0,  0,  0,  0,  0,  0,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 14, 14, 14, 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,
      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    11,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,  0,
+    13, 13, 13, 13, 13, 13, 13, 13, 13,  0,  0,  0,  0,  0,  0,  0,
+    11, 11, 11, 11, 11, 11, 11,  0,  0,  0,  0,  0,  0,  0,  0,  0,
      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,  0,  0,
+    14, 14, 14, 14, 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    14, 14, 14, 14, 14, 14, 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    11, 11, 11, 11,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,  0,  0,
+     0,  0,  0, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11,  0,  0,  0,  0,  0, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,  0,  0,  0,  0, 14,
+    11, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14,  0,  0,  0,  0,  0,  0,  0, 14,
+    14, 14, 14, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11,  0, 11, 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    14, 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    17,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0, 17, 17, 17, 17,  0,  0,  0,  0,  0,  0,  0,  0,
      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0, 25, 25, 26, 27, 28,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0, 29, 30,  0,  0,  0,  8,  0,  0, 31,  0, 32,  0,  0,  0,  0,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,  0,  0,  0,  0,  0,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,  0,  0,  0,
+    11, 11, 11, 11, 11, 11, 11, 11, 11,  0,  0,  0,  0,  0,  0,  0,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11,  0,  0,  0, 14, 14,  0,
+    13, 13, 13, 13,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0, 33, 34,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0, 14, 14, 14, 14, 14,  0,  0,  0, 14, 14, 14,
+    14, 14, 14, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14,
+    14, 14, 14,  0,  0, 14, 14, 14, 14, 14, 14, 14,  0,  0,  0,  0,
      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 14, 14, 14, 14,  0,  0,
      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    25, 25, 25, 25, 35,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-};
-
-static RE_UINT8 re_nfc_quick_check_stage_3[] = {
+     0,  0, 14, 14, 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     1,  2,  3,  4,  5,  6,  7,  8,  9,  0,  0,  0,  0,  0, 10, 11,
-    12,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 13,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0,  0, 14,  0,  0,  0, 15,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0,  0, 16,  0,  0, 17, 18,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0, 19,  0,  0,  0,  0, 20,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0,  0, 16,  0,  0, 21, 22,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0,  0, 16,  0,  0, 17,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 16,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0,  0,  0, 23,  0, 24,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0,  0,  0,  0, 25,  0, 17,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0,  0,  0, 26, 27, 28, 10,  0, 29, 30, 31,
-    29,  0, 26, 27, 28, 10,  0, 29,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0, 16,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 32, 33, 34,  0,
-     0,  0,  0,  0,  0, 33, 33, 33, 35,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0, 36,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 37, 38,
-     0,  0,  0,  0,  0,  0,  0, 19,  0, 39, 26, 26, 26, 40,  0, 38,
-    41,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0, 11, 42,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0, 43,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 10,  0,  0,  0,  0,
-     0,  0,  0, 44,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-    15, 45, 46, 47, 48, 49, 15, 15, 15, 15, 15, 15, 15, 45, 15, 15,
-    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 41,  0,  0,  0,  0,
-     0,  0,  0, 50,  0, 49, 47, 51, 52, 47,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0,  0, 23,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0, 17,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0,  8, 53,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0, 17,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 54, 55,  0,  0,  0,
-     0,  0,  0,  0,  0,  0,  0, 56, 31,  0,  0,  0,  0,  0,  0,  0,
-    15, 15, 15, 45,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-};
-
-static RE_UINT8 re_nfc_quick_check_stage_4[] = {
-    0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 0, 2, 2,
-    2, 2, 2, 2, 2, 0, 0, 2, 0, 2, 0, 2, 2, 0, 0, 0,
-    0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2,
-    2, 0, 0, 0, 0, 2, 2, 0, 2, 2, 0, 0, 0, 0, 0, 0,
-    2, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 1, 1, 2, 0, 0,
-    0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0,
-    0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 2, 2, 2, 0, 0,
-    0, 0, 0, 0, 2, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1,
-    0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 2,
-    0, 0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0,
-    0, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 2,
-    0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 2, 0, 0, 0, 0, 2,
-    0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0,
-    0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0,
-    0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 0, 0, 2, 2, 2, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 2, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1,
-    0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0,
-    0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0,
-    0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0,
-    0, 2, 2, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0,
-    1, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0,
-    1, 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1,
-    0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0,
-    1, 1, 0, 1, 1, 0, 1, 1, 0, 0, 2, 0, 0, 2, 0, 0,
-    0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0,
-    0, 0, 0, 1, 1, 1, 1, 1,
-};
-
-/* NFC_Quick_Check: 1592 bytes. */
-
-RE_UINT32 re_get_nfc_quick_check(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-
-    f = ch >> 12;
-    code = ch ^ (f << 12);
-    pos = (RE_UINT32)re_nfc_quick_check_stage_1[f] << 5;
-    f = code >> 7;
-    code ^= f << 7;
-    pos = (RE_UINT32)re_nfc_quick_check_stage_2[pos + f] << 4;
-    f = code >> 3;
-    code ^= f << 3;
-    pos = (RE_UINT32)re_nfc_quick_check_stage_3[pos + f] << 3;
-    value = re_nfc_quick_check_stage_4[pos + code];
-
-    return value;
-}
-
-/* NFKD_Quick_Check. */
-
-static RE_UINT8 re_nfkd_quick_check_stage_1[] = {
-    0, 1, 2, 2, 2, 3, 4, 5, 6, 2, 2, 2, 2, 2, 7, 8,
-    2, 2, 2, 2, 2, 2, 2, 9, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,  0, 11, 11,
+     0,  0, 11,  0,  0, 11, 11,  0,  0, 11, 11, 11, 11,  0, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11,  0, 11,  0, 11, 11, 11,
+    11, 11, 11, 11,  0, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11,  0, 11, 11, 11, 11,  0,  0, 11, 11, 11,
+    11, 11, 11, 11, 11,  0, 11, 11, 11, 11, 11, 11, 11,  0, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11,  0, 11, 11, 11, 11,  0,
+    11, 11, 11, 11, 11,  0, 11,  0,  0,  0, 11, 11, 11, 11, 11, 11,
+    11,  0, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11,  0,  0, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11,  0, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,  0, 11, 11, 11, 11,
+    11, 11, 11,  0, 11, 11, 11, 11, 11, 11, 11, 11,  0,  0,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14,  0,  0,  0,  0, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,  0,  0,  0,
+     0,  0,  0,  0,  0, 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0, 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 14, 14, 14, 14, 14,
+     0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    14, 14, 14, 14, 14, 14, 14,  0, 14, 14, 14, 14, 14, 14, 14, 14,
+    14, 14, 14, 14, 14, 14, 14, 14, 14,  0,  0, 14, 14, 14, 14, 14,
+    14, 14,  0, 14, 14,  0, 14, 14, 14, 14, 14,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,  0,  0,  0,
+    14, 14, 14, 14, 14, 14, 14, 11, 11, 11, 11, 11, 11, 11,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0, 11,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 14, 14, 14, 14,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,  0,  0,
+    11, 11, 11, 11, 11,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    14, 14, 14, 14, 14, 14, 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    11, 11, 11, 11, 14, 14, 14, 14, 14, 14, 14, 11,  0,  0,  0,  0,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,  0,  0,
+     0, 11, 11,  0, 11,  0,  0, 11,  0, 11, 11, 11, 11, 11, 11, 11,
+    11, 11, 11,  0, 11, 11, 11, 11,  0, 11,  0, 11,  0,  0,  0,  0,
+     0,  0, 11,  0,  0,  0,  0, 11,  0, 11,  0, 11,  0, 11, 11, 11,
+     0, 11, 11,  0, 11,  0,  0, 11,  0, 11,  0, 11,  0, 11,  0, 11,
+     0, 11, 11,  0, 11,  0,  0, 11, 11, 11, 11,  0, 11, 11, 11, 11,
+    11, 11, 11,  0, 11, 11, 11, 11,  0, 11, 11, 11, 11,  0, 11,  0,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11,  0, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,  0,  0,  0,  0,
+     0, 11, 11, 11,  0, 11, 11, 11, 11, 11,  0, 11, 11, 11, 11, 11,
+    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 14, 14, 14, 14, 14,
+     0, 13,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0
 };
 
-static RE_UINT8 re_nfkd_quick_check_stage_2[] = {
-     0,  1,  2,  3,  4,  5,  6,  7,  7,  8,  9, 10, 11, 12, 13, 14,
-    15,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7, 16,  7, 17, 18, 19,
-    20, 21, 22, 23, 24,  7,  7,  7,  7,  7, 25,  7, 26, 27, 28, 29,
-    30, 31, 32, 33,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
-     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
-     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
-     7,  7,  7,  7,  7,  7, 34, 35,  7,  7,  7, 36, 33, 33, 33, 33,
-    33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33,
-    33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33,
-    33, 33, 33, 33, 33, 33, 33, 37,  7,  7,  7,  7,  7,  7,  7,  7,
-     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
-     7,  7,  7,  7,  7,  7,  7,  7,  7, 33, 38, 39, 33, 40, 41, 42,
-     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
-    43, 44,  7, 45, 46, 47,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
-     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
-     7, 48,  7,  7, 49, 50, 51, 52,  7,  7,  7,  7,  7,  7,  7,  7,
-     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7, 53,  7,
-     7, 54, 55,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
-     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
-     7,  7,  7,  7,  7,  7,  7,  7, 33, 33, 56,  7,  7,  7,  7,  7,
-};
+RE_UINT32 re_get_word_break(RE_UINT32 codepoint) {
+    RE_UINT32 field_2;
+    RE_UINT32 field_1;
+    RE_UINT32 field_0;
+    RE_UINT32 v;
 
-static RE_UINT8 re_nfkd_quick_check_stage_3[] = {
-      0,   0,   0,   0,   0,   1,   2,   3,   4,   5,   6,   7,   0,   8,   9,  10,
-     11,  12,   0,   0,   0,  13,  14,  15,   0,   0,  16,  17,  18,  19,  20,  21,
-     22,  23,  24,  25,   0,   0,  26,  27,   0,   0,   0,   0,  28,   0,   0,   0,
-      0,  29,   0,  30,   0,   0,  31,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,  32,  33,   0,   0,   0,  34,   0,   0,  35,  36,   0,   0,   0,   0,   0,
-      0,   0,  37,   0,  38,   0,  39,   0,   0,   0,  40,   0,   0,   0,  41,   0,
-      0,   0,  39,   0,   0,   0,  42,   0,   0,  43,   0,   0,   0,  43,  44,   0,
-     45,   0,  46,  47,  48,  49,   0,   0,   0,  50,   0,   0,   0,   0,   0,  51,
-     52,  53,  54,   0,   0,   0,   0,   0,   0,  55,  56,  57,  58,  59,   0,   0,
-     59,  59,  59,  59,  60,  59,  59,  61,  62,  59,  63,  64,  59,  65,  66,  67,
-     68,  69,  70,  71,  72,  40,   0,   0,  73,  74,  75,  59,  76,  77,  78,   0,
-     79,  80,  81,  82,  83,  84,   0,  85,   0,  86,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,  59,  59,  59,  59,  87,  45,   0,   0,  88,   0,   0,  51,   0,
-      0,   0,   0,  44,   0,   0,   0,   0,   0,   0,   0,  89,   0,   0,   0,   0,
-      0,   0,   0,   0,  90,   0,   0,  43,  59,  59,  59,  59,  59,  59,  91,   0,
-     92,  93,  94,  95,  96,  94,  95,  97,   0,  98,  59,  59,  99,   0,   0,   0,
-    100,  59, 101, 100,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,
-      0,   0,   0,   0,  44,   0,   0,   0,   0,   0,   0, 102,   0,   0,   0, 103,
-      0,   0, 104,   0,   0,   0,   0,   0,  59,  59,  59,  59,  59, 105,   0,   0,
-    106, 107,  59, 108,  59,  59,  61,   0, 109, 110, 111,  59,  59, 112, 113,  59,
-     59,  64, 114,  59,   4,  59, 115, 116, 117, 114, 118, 119,  59,  59,  59, 120,
-    121,  59,  59,  59,  59, 100, 122, 123,   0,   0,   0,   0, 124, 125,   0,   0,
-      0, 126,   0,   0,   0,   0,   0,   0,   0,   0, 127,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0, 128,   0,   0,   0,   0,   0,   0,   0, 129,   0,   0,
-      0,   0, 130,  15,   0,  58,  92,   0,  59,  59,  65,  59, 131, 132, 133,  59,
-    134, 135, 136,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,   7,  59,  59,
-     59,  59,  59,  59,  59,  59, 137,  59, 133, 138, 139, 140, 141, 142,   0,   0,
-    143, 144, 145,  39, 102,   0,   0,   0, 146,  60, 147,   0,   0,   0,   0,   0,
-     64,   0,   0,   0,   0,   0,   0,   0,
-};
+    field_2 = codepoint >> 10;
+    field_1 = (codepoint >> 5) & 0x1F;
+    field_0 = codepoint & 0x1F;
 
-static RE_UINT8 re_nfkd_quick_check_stage_4[] = {
-      0,   0,   0,   0,   1, 133,  60, 119, 191, 255, 126,  62, 191, 255, 126, 190,
-    255, 255, 252, 255,  63, 255, 253, 254, 249, 243, 243, 255,  63, 255, 255, 255,
-      3, 128,   1,   0, 240, 255, 255, 223, 207, 255,  63, 255, 255, 255, 255, 207,
-    192, 255,  15,   0,   0,   0, 255,   1,   0,   0,   0,  63,  31,   0,   0,   0,
-     27,   0,   0,   0,   0,   0,  16,  68, 240, 215,   1,   0,   0, 252,   1,   0,
-      0, 124, 127,   0,   0,   0,  55,   2, 139, 112,   0,   2,   0,   0,   0,   2,
-      0,   0, 139, 112,   0,   0, 192,   0,   6,   0, 207, 252, 252, 252,  63,   3,
-    128,   0,   0,   0, 124,   0,   0,   0,   0,   0, 224,   1,   5,   0,   8,   0,
-      0,   2,  18,   0,   0,   0,   0, 255,   0,  24,   0, 176,   0,   0,  72,   0,
-      0,   0,   0,  78,   0,  25,   0,  48,   0,   0,  16,   0,   0,  28,   0,   0,
-      0,   1,   0,   0, 129,  13,   0,   0,   0,   0,   0, 116,   0,   0,   8,   0,
-      0,   0,   0,  48,   0,  16,   0,   0,   8,  32, 132,  16,   0,   2, 232,   3,
-      2,   0,   8,  32, 132,  16,   0,   2,  64,   0,   0,   0,   0,   0,   0,  16,
-     64,  85,   4,   0,   0,   0,   0,  40,  11,   0,   0,   0,   0, 112, 255, 247,
-    255, 191, 255, 255, 255,   7,   0,   1,   0,   0,   0, 248, 255, 255, 255, 255,
-    255, 255, 255,  15, 255, 255, 255,   3, 255, 255,  63,  63,  63,  63, 255, 170,
-    255, 255, 255,  63, 255, 255, 223, 255, 223, 255, 207, 239, 255, 255, 220, 127,
-    255,   7, 130,   0, 112, 128, 216,  80, 128,   3, 128, 128,   0,   0, 243, 255,
-    255, 127, 255,  31, 239, 254, 111,  62,  87, 189, 251, 251, 225,   3, 255, 255,
-      0,   2,   0,  12,   0,  64,   0,   0,   0, 224,   0,   0,  16,  18,   0,   0,
-     80, 176,   1,   0, 146,   2,   0,   0,   5, 224,  51,   3,  51,   3,   0,   0,
-      0, 240,   0,   0,  15,  60,   0,   0,   0,   6,   0,   0, 255,   7,   0,   0,
-      0,   0, 112,   0,   0, 128,   0,   0,   0,   0,   0, 128, 255, 255,  63,   0,
-      1,   0,   0,   0,   0,   0,  64,   7,   0,  80,  85,  85, 165,   2, 219,  54,
-      0,   0,  16, 216,   0,   0, 144, 199,   0,   0, 254, 255, 255, 127, 252, 255,
-    255, 255, 255, 127, 255,   0, 255, 255,   0,   0,   1,   0,   0,   0,   0,   3,
-      0,   0,   0, 240,  15,   0,   0,   0, 255,  63, 229, 127, 101, 252, 255, 255,
-    255,  63, 255, 255, 127,   0, 248, 160, 255, 255, 127,  95, 219, 255, 255, 255,
-    255, 255,   3,   0,   0,   0, 248, 255,   0,   0, 255, 255, 255,   0,   0,   0,
-      0,   0, 255,  31,   0,   0, 255,   3, 159, 255, 247, 255, 127,  15, 215, 255,
-    255, 255, 255,  31, 254, 255, 255, 255, 252, 252, 252,  28, 127, 127,   0,   0,
-      0,   0,   0,  20,   0,   8,   0,   0,   0, 192,   0,   0,   0,  24,   0,   0,
-      0,   0,   0,  88,   0,   0,   0,  12,   0,   0,   0, 192, 255, 255, 255, 223,
-    100, 222, 255, 235, 239, 255, 255, 255, 191, 231, 223, 223, 255, 255, 255, 123,
-     95, 252, 253, 255, 255, 207, 255, 255, 150, 254, 247,  10, 132, 234, 150, 170,
-    150, 247, 247,  94, 255, 251, 255,  15, 238, 251, 255,  15, 255,   7, 255, 255,
-    255, 127, 255, 255, 255, 255,   0,   0,   7,   0, 255, 255, 255,   1,   3,   0,
-};
+    v = re_word_break_table_1[field_2];
+    v = re_word_break_table_2[(v << 5) | field_1];
+    v = re_word_break_table_3[(v << 5) | field_0];
 
-/* NFKD_Quick_Check: 1504 bytes. */
-
-RE_UINT32 re_get_nfkd_quick_check(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-
-    f = ch >> 13;
-    code = ch ^ (f << 13);
-    pos = (RE_UINT32)re_nfkd_quick_check_stage_1[f] << 5;
-    f = code >> 8;
-    code ^= f << 8;
-    pos = (RE_UINT32)re_nfkd_quick_check_stage_2[pos + f] << 3;
-    f = code >> 5;
-    code ^= f << 5;
-    pos = (RE_UINT32)re_nfkd_quick_check_stage_3[pos + f] << 5;
-    pos += code;
-    value = (re_nfkd_quick_check_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1;
-
-    return value;
+    return v;
 }
 
-/* NFKC_Quick_Check. */
-
-static RE_UINT8 re_nfkc_quick_check_stage_1[] = {
-     0,  1,  2,  3,  4,  4,  4,  4,  4,  4,  5,  4,  4,  4,  4,  6,
-     4,  7,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  8,  9, 10,
-     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4, 11,
-     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
-     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
-     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
-     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
-     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
-     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
-     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
-     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
-     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
-     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
-     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
-     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
-     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
-     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
+/* XDigit. */
+static RE_UINT8 re_xdigit_table_1[] = {
+     0,  1,  2,  3,  4,  5,  6,  7,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  9, 10,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8, 11,
+     8, 12,  8, 13, 14, 15, 16, 17,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8, 18,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8, 19,  8,  8, 20,  8, 21,  8,  8,  8, 22,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8
 };
 
-static RE_UINT8 re_nfkc_quick_check_stage_2[] = {
-      0,   0,   1,   0,   2,   3,   0,   4,   0,   0,   5,   6,   7,   8,   9,  10,
-      0,   0,   0,   0,   0,   0,  11,   0,   0,  12,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,  13,  14,  15,  16,  17,  18,   0,   0,  15,  19,  15,  20,
-      0,  21,   0,  22,  15,  20,   0,  23,  24,   0,  24,  25,  26,  27,  28,   0,
-     29,   0,   0,  30,   0,  31,  32,  33,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  34,   0,   0,   0,
-      0,   0,   0,   0,  35,  36,  37,   0,   0,   0,  38,   0,   0,  39,  40,  41,
-     42,  43,  44,   0,  45,  46,  47,   0,  48,   0,   0,   0,  49,   0,   0,   0,
-      0,  50,  51,  52,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,  26,  53,   0,  54,   0,   0,   0,   0,
-      0,  55,   0,   0,   0,  56,   0,   0,   0,   0,  57,  24,  51,  51,  51,  58,
-     59,   0,  60,  61,  62,  51,  63,   0,  64,  65,  51,  51,  51,  51,  51,  51,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  25,   0,   0,  66,   0,  67,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  68,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,  51,  51,  51,  51,  69,  70,  51,  71,  72,  73,  74,  75,
-     51,  51,  51,  51,  76,  77,  78,  79,  80,  81,  51,  82,  83,  51,  84,  85,
-      0,   0,  86,   0,  87,   0,   0,   0,   0,   0,   0,   0,  15,  20,   0,   0,
-      0,   0,  88,   0,   0,   0,  89,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,  90,  91,  92,   0,   0,   0,   0,   0,   0,   0,   0,
-     51,  93,  94,  95,  96,  97,  51,  51,  51,  51,  98,  51,  51,  51,  51,  99,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0, 100, 101, 102,   0,   0,   0,   0,   0,
-      0,   0,   0,   0, 103, 104, 105,   0, 106, 107,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     51,  51,  51,  51,  51,  51,  51,  51, 108,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+static RE_UINT8 re_xdigit_table_2[] = {
+    0, 1, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 3, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4,
+    0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4,
+    0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4,
+    0, 0, 1, 0, 0, 0, 1, 0, 0, 3, 0, 0, 0, 0, 0, 0,
+    0, 0, 3, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+    1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 1, 0,
+    0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0,
+    0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 1, 0, 3, 0, 0, 0, 0, 0, 1, 1,
+    0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 2, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 4, 0, 0, 0, 1, 0, 6, 0, 0, 0, 0, 1, 0,
+    0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 1, 0, 0, 0, 3, 0, 0, 1, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 3, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 8,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1
 };
 
-static RE_UINT8 re_nfkc_quick_check_stage_3[] = {
-     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  2,  3,  4,
-     0,  0,  0,  0,  0,  0,  5,  6,  1,  7,  0,  0,  0,  0,  0,  6,
-     8,  9,  0,  0,  0,  0, 10,  0,  0,  0,  0,  0,  0,  0, 11,  1,
-     0,  0,  0, 12,  9,  0,  0,  0, 13, 14, 15, 16, 17, 18, 19, 20,
-    21,  0,  0,  0,  0,  0, 22, 23, 24,  0,  0,  0,  0,  0,  0,  0,
-     0,  0, 25,  0,  0,  0, 26,  7,  6,  0,  0,  0,  0,  0,  0,  0,
-     0,  0, 27,  0,  0,  0, 28,  1,  0,  0,  0,  0,  0,  0,  0, 29,
-     0,  0,  0, 11,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 30,
-     0,  0, 31, 24,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 32,  0,
-     0,  0,  0, 33,  0,  0,  0,  0,  0,  0, 34, 35,  0,  0,  0,  0,
-     0,  0, 31,  0,  0,  0,  0,  0,  0,  0, 30,  0,  0,  0,  0,  0,
-    36,  0, 37,  0,  0,  0,  0,  0,  0, 38,  0, 31,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0, 39,  0,  0,  0,  0, 35,  0,  0,  0,  0,
-     0, 22,  0,  0,  0,  0,  0,  0, 39, 40, 41, 22,  0,  7, 42, 43,
-     7,  0, 39, 40, 41, 22,  0,  7,  0,  0,  0,  0,  0, 30,  0,  0,
-     0,  0,  0,  0,  0,  0,  0, 22,  0,  0,  0,  0, 44, 45, 46,  0,
-     0,  0,  0,  0,  0, 45, 45, 45, 47,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0, 48,  0,  0,  0,  0,  0,  0, 49, 11, 50,
-    11, 51, 11, 11, 11, 52,  0,  1,  0,  0,  0, 53, 11, 11, 11, 11,
-     0,  0,  0,  5,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 54, 55,
-     0,  0,  0,  0,  0,  0,  0, 42, 43, 56, 39, 42, 39, 42,  0, 57,
-    11, 52, 58,  0, 49,  6, 59, 60,  6, 43,  6,  6,  0,  0, 61, 11,
-    11, 25, 11,  9,  0,  1,  0,  0, 62, 63, 64, 65, 66, 67, 68, 68,
-    69, 43, 11, 11, 11, 11, 11, 11,  0,  7,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0, 24,  1,  0,  0,  0,  0,  0,  0, 70,  0,  0,
-     0,  0,  0,  0, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
-    11, 11, 11, 11, 11, 52,  0,  0,  0,  0,  0,  0,  0,  0, 49,  0,
-     0,  0,  0, 22,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 35,
-     0,  0,  0,  0,  0,  6,  0,  0,  0,  0,  0,  6,  0,  0,  0,  0,
-    11, 11, 12,  0,  0,  0,  0,  0,  1,  0,  0,  0,  0,  0, 71, 52,
-     0,  0,  0, 72,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  6,
-     0,  0,  0,  0,  0,  0, 63, 11, 11, 25, 73, 11,  0,  0,  0,  0,
-    11, 11, 11, 25, 11, 11, 11, 11, 11,  0, 11, 11, 11, 11, 11, 25,
-     0,  0,  0,  0,  0,  0,  1,  0,  0,  0,  0,  0,  0,  0,  0, 43,
-     0,  0,  0,  8,  0,  0,  0,  0, 11, 12, 74, 25, 75, 73, 11, 11,
-    11, 11, 11, 11, 11, 12, 11, 11, 11, 11, 11, 43,  0,  0,  0,  0,
-    25,  0, 53, 76, 11, 11, 25, 77, 78, 11, 11, 11, 11, 11, 11, 11,
-    11, 11, 11, 11, 11, 11, 43,  0,  0,  0, 53, 11, 11, 11, 11, 11,
-    11, 11, 11, 11, 11, 11, 11, 12,  0,  0, 11, 11, 11, 11, 11, 11,
-    11, 11, 73, 11, 11, 11, 11, 11, 11,  0,  0,  0,  0,  0, 11,  9,
-     0,  0, 11, 43,  0,  0, 11, 11, 79, 11, 50, 11, 25, 80, 81, 11,
-    11, 11, 11, 11, 11, 11, 11,  9, 63, 11, 11, 11, 11, 11, 11, 11,
-    11, 11, 11, 11, 11, 11, 11, 25, 73, 73, 73, 82, 25, 25,  0,  0,
-     0,  0,  0,  0,  0,  0,  0, 36,  0,  0,  0,  0, 31,  0,  0,  0,
-     0,  0,  0,  0,  0,  0, 20, 83,  0,  0,  0,  0,  0, 31,  0,  0,
-     0,  0,  0, 84,  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 53,
-     1,  0,  0,  0,  0,  0,  0,  0, 11, 11, 85, 11, 11, 11, 11, 11,
-    11, 11, 11, 85, 86, 87, 11, 88, 62, 11, 11, 11, 11, 11, 11, 11,
-    51, 89, 85, 85, 11, 11, 11, 90, 77, 73, 91, 11, 11, 11, 11, 11,
-    11, 11, 11, 11, 12, 11, 11, 11, 11, 92, 11, 11, 11, 11, 11, 11,
-    62, 11, 11, 11, 93, 63, 50, 94, 41, 56, 93, 54, 93, 50, 50, 95,
-    11, 68, 11, 80, 96, 68, 11, 80, 11, 52, 11, 11, 11, 25, 11, 11,
-    11, 11,  0,  0,  0, 82,  0,  0,  0,  0,  1,  0,  0,  0,  0,  0,
-    52,  0, 11, 11, 11, 11, 11, 80, 11,  1, 43,  0,  0,  0,  0,  0,
-    11, 11, 11, 12,  0,  0,  0,  0,
+static RE_UINT8 re_xdigit_table_3[] = {
+      0,   0,   0,   0,   0,   0, 255,   3, 126,   0,   0,   0, 255,   3,   0,   0,
+    192, 255,   0,   0, 255,   3, 255,   3,   0,   0, 192, 255,   0, 192, 255, 255,
+    255, 255, 255, 255
 };
 
-static RE_UINT8 re_nfkc_quick_check_stage_4[] = {
-    0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
-    1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 0, 0,
-    1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0,
-    0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 0, 0, 2, 2, 2, 2, 2, 0, 2, 2,
-    2, 2, 2, 2, 2, 0, 0, 2, 0, 2, 0, 2, 2, 0, 0, 0,
-    0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2,
-    2, 0, 0, 0, 0, 2, 2, 0, 2, 2, 0, 0, 0, 0, 0, 0,
-    2, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 1, 1, 2, 0, 0,
-    0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0,
-    0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0,
-    1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 2, 2, 2, 0, 0,
-    0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 2, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 2,
-    0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0,
-    0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 1, 1, 0, 0,
-    0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 0,
-    0, 0, 2, 0, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1,
-    0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0,
-    0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 0, 0, 2, 2, 2, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0,
-    1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1,
-    1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1,
-    0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0,
-    0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 0,
-    0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 1, 1,
-    0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 1, 1, 1, 1,
-    1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0,
-    1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 0, 1,
-    1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1,
-    0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0,
-    0, 2, 2, 1, 1, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1,
-    1, 0, 1, 0, 0, 1, 1, 1, 1, 0, 1, 0, 0, 1, 1, 0,
-    0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0,
-    1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1,
-    1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 1, 0, 1, 1,
-    0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 2, 0, 0, 2, 0, 0,
-    0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1,
-    0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 1,
-    1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1,
-    1, 1, 0, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 1, 0, 0, 1,
-    0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 0,
-    0, 1, 1, 1, 0, 1, 1, 1,
-};
+RE_UINT32 re_get_xdigit(RE_UINT32 codepoint) {
+    RE_UINT32 field_2;
+    RE_UINT32 field_1;
+    RE_UINT32 field_0;
+    RE_UINT32 offset;
+    RE_UINT32 v;
 
-/* NFKC_Quick_Check: 2688 bytes. */
-
-RE_UINT32 re_get_nfkc_quick_check(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-
-    f = ch >> 12;
-    code = ch ^ (f << 12);
-    pos = (RE_UINT32)re_nfkc_quick_check_stage_1[f] << 6;
-    f = code >> 6;
-    code ^= f << 6;
-    pos = (RE_UINT32)re_nfkc_quick_check_stage_2[pos + f] << 3;
-    f = code >> 3;
-    code ^= f << 3;
-    pos = (RE_UINT32)re_nfkc_quick_check_stage_3[pos + f] << 3;
-    value = re_nfkc_quick_check_stage_4[pos + code];
-
-    return value;
-}
+    field_2 = codepoint >> 10;
+    field_1 = (codepoint >> 5) & 0x1F;
+    field_0 = (codepoint >> 3) & 0x3;
+    offset = codepoint & 0x7;
 
-/* Alphanumeric. */
+    v = re_xdigit_table_1[field_2];
+    v = re_xdigit_table_2[(v << 5) | field_1];
+    v = re_xdigit_table_3[(v << 2) | field_0];
 
-static RE_UINT8 re_alphanumeric_stage_1[] = {
-     0,  1,  2,  3,  4,  5,  5,  5,  5,  6,  7,  5,  5,  8,  9, 10,
-    11, 12, 13, 14, 15,  9, 16,  5, 17,  9,  9, 18,  9, 19, 20, 21,
-     5,  5,  5,  5,  5,  5,  5,  5,  5,  5, 22, 23, 24,  5, 25, 26,
+    return (v >> offset) & 0x1;
+}
+
+/* XID_Continue. */
+static RE_UINT8 re_xid_continue_table_1[] = {
+     0,  1,  2,  3,  4,  5,  6,  7,  8,  9,  9, 10, 11, 12, 12, 12,
+    12, 12, 12, 13, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+    12, 12, 12, 12, 12, 12, 12, 14, 12, 15, 16, 12, 12, 12, 12, 12,
+    12, 12, 12, 12, 12, 17,  9,  9,  9,  9,  9,  9,  9,  9, 18, 19,
+    20, 21, 22, 23, 24, 25, 26, 27, 28, 29,  9,  9, 12, 30,  9,  9,
+     9, 31,  9,  9,  9,  9,  9,  9,  9,  9, 32, 33, 12, 12, 12, 12,
+    12, 34, 12, 35,  9,  9,  9,  9,  9,  9,  9,  9, 36,  9,  9, 37,
+     9,  9,  9,  9, 38, 39, 40,  9, 41,  9, 42, 43,  9,  9, 44,  9,
+    12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+    12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+    12, 12, 12, 12, 12, 12, 12, 12, 12, 45, 12, 12, 12, 46, 47, 12,
+    12, 12, 12, 48, 12, 12, 12, 12, 12, 12, 49,  9,  9,  9, 50,  9,
+    12, 12, 12, 12, 51,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
@@ -16224,715 +25950,263 @@ static RE_UINT8 re_alphanumeric_stage_1[] = {
      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+    52,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9
 };
 
-static RE_UINT8 re_alphanumeric_stage_2[] = {
-      0,   1,   2,   3,   4,   5,   6,   7,   8,   9,  10,  11,  12,  13,  14,  15,
-     16,   1,  17,  18,  19,   1,  20,  21,  22,  23,  24,  25,  26,  27,   1,  28,
-     29,  30,  31,  31,  32,  31,  31,  31,  31,  31,  31,  31,  33,  34,  35,  31,
-     36,  37,  31,  31,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,  38,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,  39,
-      1,   1,   1,   1,  40,   1,  41,  42,  43,  44,  45,  46,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,  47,  31,  31,  31,  31,  31,  31,  31,  31,
-     31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,
-     31,  31,  31,  31,  31,  31,  31,  31,  31,   1,  48,  49,   1,  50,  51,  52,
-     53,  54,  55,  56,  57,  58,   1,  59,  60,  61,  62,  63,  64,  65,  31,  66,
-     67,  68,  69,  70,  71,  72,  73,  74,  75,  76,  77,  31,  78,  79,  80,  31,
-      1,   1,   1,  81,  82,  83,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,
-      1,   1,   1,   1,  84,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,
-     31,  31,  31,  31,   1,   1,  85,  31,  31,  31,  31,  31,  31,  31,  31,  31,
-     31,  31,  31,  31,  31,  31,  31,  31,   1,   1,  86,  87,  31,  31,  88,  89,
-      1,   1,   1,   1,   1,   1,   1,  90,   1,   1,  91,  31,  31,  31,  31,  31,
-      1,  92,  93,  31,  31,  31,  31,  31,  31,  31,  31,  31,  94,  31,  31,  31,
-     31,  31,  31,  31,  95,  96,  97,  98,  31,  31,  31,  31,  31,  31,  31,  31,
-     99, 100, 101,  31,  31,  31,  31,  31, 102, 103,  31,  31,  31,  31, 104,  31,
-     31, 105,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,
-      1,   1,   1,   1,   1,   1, 106,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1, 107, 108,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1, 109,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1, 110,  31,  31,  31,  31,
-     31,  31,  31,  31,  31,  31,  31,  31,   1,   1, 111,  31,  31,  31,  31,  31,
-};
-
-static RE_UINT8 re_alphanumeric_stage_3[] = {
-      0,   0,   0,   1,   2,   3,   2,   3,   0,   0,   4,   5,   6,   7,   6,   7,
+static RE_UINT16 re_xid_continue_table_2[] = {
+      0,   1,   2,   3,   0,   4,   5,   5,   6,   6,   6,   6,   6,   6,   6,   6,
+      6,   6,   6,   6,   6,   6,   7,   8,   6,   6,   6,   9,  10,  11,   6,  12,
+      6,   6,   6,   6,  13,   6,   6,   6,   6,  14,  15,   6,  16,  17,  18,  19,
+     20,   6,   6,  21,   6,   6,  22,  23,  24,   6,  25,   6,   6,  26,   6,  27,
+      6,  28,  29,  30,   0,  31,  32,  11,   6,   6,   6,  33,  34,  35,  36,  37,
+     38,  39,  40,  41,  42,  43,  44,  45,  46,  43,  47,  48,  49,  50,  51,  52,
+     53,  54,  55,  56,  57,  58,  59,  60,  53,   6,  61,  62,  63,  64,  65,  66,
+     67,  68,  69,   0,  70,  71,  72,   0,  73,  74,  75,  76,  77,  78,  79,   0,
+      6,   6,  80,   6,  81,   6,  82,  83,   6,   6,   6,   6,   6,   6,   6,   6,
+      6,   6,  84,   6,  85,  86,  87,   6,  88,   6,  89,  90,  91,   6,   6,  92,
+     67,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,
+      6,   6,   6,  93,   3,   6,   6,  94,  95,  96,  97,  98,   6,   6,  99, 100,
+    101,   6,   6, 102,   6, 103,   6, 104, 105, 106, 107, 108,   6, 109, 110,   0,
+     29,   6, 105, 111, 112, 113, 114,   0,   6,   6, 115, 116,   6,   6,   6,  97,
+      6, 117, 118,  81, 119,  89, 120,  68,   6,   6,   6,   6,   6,   6,   6, 121,
+      6,   6,   6,   6,   6,   6,   6,   6,  92,   6, 122,  81,   6, 123, 124, 125,
+      0, 126, 127, 128, 129,   0, 129, 130, 131, 132, 133,   6, 134,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      6, 135, 105,   6,   6,   6,   6, 136,   6,  82,   6, 137, 138, 139, 139,   6,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    140, 141,  67,   6, 142,  67,   6,  83, 143,  14,   6,   6, 144,   6,   0,  24,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
       6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,
-      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   8,   9,  10,   0,
-      0,   0,   0,   0,  11,   0,   0,  12,  13,   6,  14,   6,   6,   6,   6,  15,
-      6,   6,   6,   6,   6,   6,   6,   6,  16,   6,   6,   6,   6,   6,   6,   6,
-      6,   6,   6,   2,   6,  17,   6,   6,  18,   0,   0,  19,  20,   6,  21,  22,
-      0,   3,   6,   6,   6,  23,  24,   6,   6,   6,   6,   6,   6,  25,  26,  27,
-      0,   6,   6,   6,  28,   6,   6,   6,   6,   6,   6,   9,   6,   6,   3,  29,
-      6,  30,  31,   0,   6,  18,   3,   0,   0,   0,   6,  32,   0,  33,  34,   6,
-      6,   6,   6,  35,  36,  37,  38,   2,  39,  40,  41,  42,  43,  44,  38,  45,
-     46,  40,  41,  47,  48,  49,  50,  51,  52,  14,  41,  53,  54,  55,  38,  56,
-     57,  40,  41,  53,  58,  59,  38,  60,  61,  62,  63,  24,  64,  65,  50,   0,
-     66,  67,  41,  68,  69,  70,  38,   0,  66,  67,  41,  71,  69,  72,  38,  73,
-     66,  67,   6,  74,  75,  76,  38,  77,  78,  79,   6,  80,  81,  82,  50,  83,
-      2,   6,   6,   3,  84,   1,   0,   0,  85,   6,  86,  87,  88,  89,   0,   0,
-     55,   0,   1,   0,  23,   6,  31,   2,  90,  23,   6,  31,   0,   0,   0,   0,
-      6,   6,   6,  91,   1,   6,   6,   6,   6,  92,   6,   6,  93,   6,   6,  94,
-      6,   6,   6,   6,  95,  96,   6,   6,  95,   6,   6,  97,  98,   7,   6,   6,
-      6,  98,   6,   6,   6,   3,   0,   0,   6,   0,   6,   6,   6,   6,   6,  99,
-      2,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,
-      6,   6,   6,   6,   6,   6,  27,   6,   2,   3,   6,   6,   6,   6, 100,  18,
-     36, 101,   6, 101,   6, 101,  36, 102,   6,   6,   6,  38,  18, 103,   1,   0,
-      0,   1,   6,   6,   6,   6,   6,  18,   6,   6,   3,   6,   6,   6,   6,  51,
-      6, 104, 105,  18,  50,   6,  92, 106,   6,   6, 105,   6,   1,   1,   0,   0,
-      6, 105,   6,   6,   6, 104,   2, 106,   1,   1, 107,   0,   0,   0,   0,   0,
-      6,   6,   6, 108, 109,   1,   0,   0,   6,   6,  89,   6,   6,   6,  15,   9,
-      6,   6,   6, 110,  68,   6,   6,  92,  18,   6,   6,  74,   0,   0, 111, 112,
-      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   0,   0, 113, 106,
-      6,  99,   6,   6,  99, 114,   6,  92,   6,   6,   6, 115, 116, 117,  31, 116,
-      0,   0,   0,   0,   0,   0,   0, 118,   0,  31,   0,   0,   0,   0,   0,   0,
-    119, 120, 121,  89, 122,   0,   6,   6,  18,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  50,   6,   6,   1,   0,
-      6,   6, 104,   6,   6, 104,   6,   6,   6,   6,   6,   6,   6,   6, 123,  83,
-      6,   6,  93,   6,   6,   6, 124,   0,   6, 110, 125, 125, 125, 125,   6,   6,
-      0,   0, 126,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-    127,   0, 128, 129,   2,   6,   6,   6,   6, 130,   2,   6,   6,   6,   6,  94,
-    131,   6,   6,   2,   6,   6,   6,   6, 104,   0,   6,   3,   0,   0,   0,   6,
-      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,  51,   0,   0,   0,   0,
-      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   0,
-      6,   6,   6,   6,   6,   6,   6,   6,  31,   0,   0,   0,   0,   6,   6,  92,
-     31,   6, 105,   0,   6,   6, 104, 132,   6,   6,   6,   6,   6,   6,   6,   0,
-      0, 113, 133,   6,   6,   6,   6,   6, 134,   6,   6,   6, 135,   0,   0, 113,
-     15,   6, 136,   0,   6,   6,   6, 101,   6,   6,   6,   6, 137,   1,   0, 138,
-      6,   6,   3,   6,   6,  22,   6,  31,   6,   6,   6, 139, 126,   1,   6, 104,
-      6,   6,   6, 110,  92,   1,   6,  79,   6,   6,   6, 104, 140, 141,   6, 142,
-    143, 144, 125,   6,   6,  94, 136,   6,   6,   6,   6,   6,   6,   6,   3,   1,
-      6,   6,   6,   6,   6,   6,   6,   6,   6,   6, 101,   6, 145,   6,   6, 105,
-      6,   6,   6,   6,   6,   6,  92,   6,   6,   6,   6,   6,   6,   1,   0,   0,
-    110, 146,  41, 147, 148,   6,   6,   6,   6,   6,   6,   9,   0, 149,   6,   6,
-      6,   6,   6,  92,   0,   6,   6,   6,   6, 133,   6,   6, 136,   0,   0, 105,
-      0,   0,   0,   0,   0,   0,   0, 150,   6,   6,   6,   6,   6,   6,   6,  31,
-      0,   1,   2,   3,   2,   3,  50,   6,   6,   6,   6, 104, 151, 152,   0,   0,
-     35,   6,   7, 153,  92,  92,   0,   0,   6,   6,   6,   6,   6,   6,   6,   3,
-      0,   0,   0,   0,   6,   6,   6, 106,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   6,  31,   6,   6,   6,  55,   0,   0,
-      6,   6,  28,   6,   3,   6,   6,   3,   6,  92,   6,   6, 154, 155,   0,   0,
-      6,   6,   6,   6,   6,   6,   6,   6,   6,  92,   1,   6,   6, 154,   6, 105,
-      6,   6, 136,   6,   6,   6, 101,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      6,   6,   6, 110,   6,  51, 136,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-    156,   6,   6, 157,   6,  51,   6, 110,   6, 104,   0,   0,   0,   0,   6, 158,
-      6,  51,   6,   1,   0,   0,   0,   0,   6,   6,   6, 159,   0,   0,   0,   0,
-    160, 161,   6,  51,   0,   0,   6,  31,   6,  31,   0,   0,  23,   6, 106,   0,
-      6,   6,   6,  51,   6,  51,   6,  22,   6,   9,   0,   0,   0,   0,   0,   0,
-      6,   6,   6,   6,  18,   0,   0,   0,   6,   6,   6,  22,   6,   6,   6,  22,
-      6,   6, 136,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      6,  31, 107,   6,  51,   0,   0,   0,   0,   0,   0,   0,   0,   0,   6, 110,
-      6,   6,   6,   6,  51,   0,  50,   0, 133,   6,   6,  18,   0,   6,  18,   1,
-      6,   6,   6, 162, 163,   6,   6, 164,   6,   6,   6,   6, 165, 166,   0,   0,
-      6,  14,   6, 167,   0,   0,   0,   0, 168,  19,  18,   6,   6,   6,  18,   1,
-     39,  40,  41,  53,  58, 169, 101,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      6,   6,   6,   6, 170, 171,   0,   0,   6,   6,   6,   6, 172,   1,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   6,   6,   6, 173,   0, 174,   0,   0,
-      6,   6,   6, 104, 175,   1,   0,   0,   6,   6,   6, 176,   1,   0,   0,   0,
-      6,  74,   3,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      6,   6,   6,  18,   0,   0,   0,   0,   0,   0,   6,   6,   6,   6,   1, 126,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  30,   6,   6,  30, 177,   0,
-      6,   6,   6, 178,   0,   6,   6,   6,   6, 179,   0,   0,   6,   6,   6,  18,
-     41,   6,   6, 125,  55,   1,   0, 133,   6, 133,  23, 110,   0,   0,   0,   0,
-    180,   6,   6, 181, 182,   1, 183,   6, 104, 184,   1,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   6, 110,
-      6,   6,   6,   6,   6,   6,   6,   6,   6,   1,   0,   0,   0,   0,   0,   0,
-      6,   6,   6,   6,   6,   6, 104,   0,   6,   6,   6,   6,   6,   6,   6,   6,
-      6,   6,   6,   6, 101,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      6,   6, 104,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      6,   6,   6,   6, 110,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      6,   6,   6,  18,   6, 104,   1,   0,   0,   0,   0,   0,   0,   6,  92,   0,
-      6,   6,   6,   0, 101,   1, 149, 185,   6,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   6,   6,   6,   6,   0,   0,   0,   0,   0,   0,   0,   0,
-      6,   6,   6,   6,  21,   6,   6,   6, 124,   6,   0,   0,   0,   0, 186,   0,
-      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6, 136,
-      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,  22,
-      6, 104,   0,   0,   0,  22, 187,   6,   6,   6,   6,   6,   6,   6,   6,   6,
-      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6, 105,
-      6,   6,   6,   6,   6,   6,   3,  31,  18, 188,   0,   0,   0,   0,   0,   0,
-      6,   6,   6,   6,   6, 150,   6,   6,   6,  36, 189, 190, 108,   6,   6,   6,
-    191, 192,   6, 193, 194,  67,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,
-      6,   6,   6,   6,   6,   6,   6,   6,   6,   6, 195,   6,  67,  94,   6,  94,
-      6, 150,   6, 150, 104,   6, 104,   6,  41,   6,  41,   6, 196,   6,   6,   6,
-      7, 134, 197,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      6,   6,  31, 198, 188,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   6,   6, 105,   1,
-      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6, 106,   0,   0,   0,
-      6,   6,   6,   6, 199,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-    108,   6, 200, 201, 202, 203, 204, 205, 206, 105, 207, 105,   0,   0,   0,   0,
-      0,   0,   0,   6,   1,   6,   1,   6,   1,   0,   0,   0,   0,   0,   0,   0,
-      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6, 110,   0,   0,
-      6,   6,   6, 106,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,
-      6,  92,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,
-      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   9,   6,   6,   6,   6,   6,
-      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,  55,   0,
-      6,  92,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-};
-
-static RE_UINT8 re_alphanumeric_stage_4[] = {
-      0,   0, 255,   3, 254, 255, 255,   7,   0,   4,  32,   4, 255, 255, 127, 255,
-    195, 255,   3,   0,  31,  80,  32,   0, 223, 188,  64, 215, 251, 255, 191, 255,
-      3, 252, 127,   2, 255,   1, 255, 191, 182,   0, 255, 135,   7,   0, 255, 254,
-    255, 195, 239,  31, 254, 225, 255, 159,   0, 224,  48,   4, 255, 252, 255,  31,
-    223,  63, 240, 255, 248,   3, 255, 239, 255, 223, 225, 255, 207, 255, 239, 159,
-    249, 255, 255, 253, 197, 227, 159,  89, 128, 176,   3,  16, 238, 135, 109, 195,
-    135,  25,   2,  94, 192, 255,  63,   0, 238, 191, 237, 227, 191,  27,   1,   0,
-      0,  30, 238, 159, 159,  25, 192, 176,   2,   0, 236, 199,  61, 214,  24, 199,
-    199,  29, 129,   0, 239, 223, 253, 255, 255, 227, 223,  29,  96,   7, 239, 227,
-     96,  64,   6,   0, 255, 231, 223,  93, 240, 128,   0, 252, 236, 255, 127, 252,
-    251,  47, 127, 128,  95, 255,  12,   0, 127,  32, 214, 247, 175, 255, 255,  59,
-     95,  32, 255, 243,   3, 255, 127, 249, 255,  63, 191,  32, 255, 247, 255,  61,
-    127,  61,  61, 127,  61, 255,  63,  63, 255, 199,  15,   0,  13,   0, 128,  16,
-    255, 127, 255,  15,  31,   0, 128,   0, 239, 255, 239,  15, 127,   0,   0, 222,
-    111,   4, 128, 255, 255, 170, 223,  95, 220,  31, 207,  15,   2, 128, 132, 252,
-     47,  62,  80, 189, 224,  67,  31, 120, 255, 128, 127, 127,   0, 128, 224,   0,
-    254,   3,  62,  31, 127, 224, 224, 255, 240, 143, 252, 255, 255, 249, 124,   0,
-    255,   0,  47,   0, 252, 232, 247, 255,   5,   0,   0,  56,  60,   0, 126, 126,
-    126,   0, 127, 248, 248, 224, 127,  95, 219, 255, 248, 255, 223, 255, 252, 252,
-    252,  28, 255, 183,  15, 255,  62,   0,  63, 253, 191, 145,  55,   0, 255, 192,
-    111, 240, 239, 254, 199, 255, 112,   0,  71,   0,  30,   0, 255,  23, 159,  64,
-    127, 189, 129, 224, 187,   7, 255, 131, 179,   0,  63, 127,   0,  63,  17,   0,
-     63,   1,  26,   0, 231, 127, 255,  32, 127, 251, 127, 180, 203,   0, 191, 253,
-    123,   1, 255, 224,  11,   0, 240,   0, 255,  67, 100, 222, 255, 235, 191, 231,
-    223, 223, 255, 123,  95, 252,  63, 255, 247, 207, 219,   7, 128,  63, 143,   8,
-    150, 254, 247,  10, 132, 234, 150, 170, 150, 247, 247,  94, 255, 251, 238, 251,
-};
-
-/* Alphanumeric: 2912 bytes. */
-
-RE_UINT32 re_get_alphanumeric(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-
-    f = ch >> 12;
-    code = ch ^ (f << 12);
-    pos = (RE_UINT32)re_alphanumeric_stage_1[f] << 4;
-    f = code >> 8;
-    code ^= f << 8;
-    pos = (RE_UINT32)re_alphanumeric_stage_2[pos + f] << 4;
-    f = code >> 4;
-    code ^= f << 4;
-    pos = (RE_UINT32)re_alphanumeric_stage_3[pos + f] << 4;
-    pos += code;
-    value = (re_alphanumeric_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1;
-
-    return value;
-}
-
-/* Any. */
-
-RE_UINT32 re_get_any(RE_UINT32 ch) {
-    return 1;
-}
-
-/* Blank. */
-
-static RE_UINT8 re_blank_stage_1[] = {
-    0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1,
-};
-
-static RE_UINT8 re_blank_stage_2[] = {
-    0, 1, 1, 1, 1, 2, 1, 1, 3, 1, 1, 1, 4, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-};
-
-static RE_UINT8 re_blank_stage_3[] = {
-    0, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 3, 2, 2, 4, 2, 2, 2, 2, 2, 2, 2,
-    3, 2, 2, 2, 2, 2, 2, 2,
-};
-
-static RE_UINT8 re_blank_stage_4[] = {
-      0,   2,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,
+      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   0,   0,
+      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,
+      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,
+      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,  78,
+      6,   6,   6,   6, 145,   0,  24,  81,   6,   6,   6,   6,   6,   6,   6,   6,
+    146, 147,   6, 148,   6,   6,   6,  26, 149, 150,   6,   6, 151,   6, 152, 153,
+      6, 154,   6,  97,   6,   6, 155, 156,   6, 157,  97,  78,   6,   6, 158, 105,
+      6, 138, 159, 160,   6,   6, 161, 162, 163, 164,  83,  80,   6,   6,   6, 165,
+      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,
+      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6, 166, 167,  29,
+      0,   0,   0,   0,   0,   0,   0,   0,   6,   6,   6,   6,   6,   6,   6,   6,
+      6,   6,   6, 157,   6,   6, 168,   0, 169, 170, 171,   6,   6,  26, 172,   6,
+      6,   6,  81, 173,   6,   6,   6,   6,   6,  81,  24,   6, 174,   6, 175,   1,
+     91, 176, 177, 178,   6,   6,   6,  78,   1,   2,   3, 107,   6, 105, 179,   0,
+    180, 181, 182,   0,   6,   6,   6,  68,   0,   0,   6,  96,   0,   0,   0, 183,
+      0,   0,   0,   0,  78,   6, 184, 114,   6, 185, 103,  68,  81,   6, 186,   0,
+      6,   6,   6,   6,  81,  80, 187,  29,   6, 188,   6, 189,   0,   0,   0,   0,
+      6,   6,   6,   6,   6,   6,   6,   6,   6, 138, 104, 175,   0,   0,   0,   0,
+    190, 191, 104, 138, 105,   0,   0, 192, 104, 168,   0,   0,   6, 193,   0,   0,
+    194, 195,   0,  78,  78,   0,  75, 196,   6, 104, 104, 197,  26,   0,   0,   0,
+      6,   6, 134,   0,   6, 197,   6, 197,   6, 198,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   6, 199,   0,   0,  78, 200, 184,   0,   0,  24, 201, 138,
+      6,   6, 196, 202,   6,  68,  24, 203,   6,  31, 204, 205,   6,   6, 206,   0,
+    207, 208,   0,   0, 209, 119,   6, 210,  34, 211, 212, 213,   0,   0,   0,   0,
+      6,   6, 214, 215,   6,   6, 216,   0,   0,   0,   0,   0,   6, 217, 218,   0,
+      6,   6, 219,   0,   6, 102, 100,   0,  89, 115,   0,   0,   0,   0,   0,   0,
+      6,  68,   0,   0,   0,   6,   6, 220, 221, 222, 223,   0,   0, 224, 225, 226,
+      6, 105, 200,   6, 227,   0,   6, 102,   0,   0,   0,   0,   0,   0,   0,   0,
+    228,   5, 229, 230, 174, 231,   0,   0, 232, 233, 198, 234, 235, 100,   0,   0,
+      0,   0,   0,   0,   0,   0,   0, 138,   0,   0,   0,   0,   0, 236,   0,   0,
+      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,
+      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6, 168,   0,   0,   0,
+      6,   6,   6, 144,   6,   6,   6,   6,   6,   6, 189,   0,   0,   0,   0,   0,
       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-    255,   7,   0,   0,   0, 128,   0,   0,   0,   0,   0, 128,   0,   0,   0,   0,
-};
-
-/* Blank: 218 bytes. */
-
-RE_UINT32 re_get_blank(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-
-    f = ch >> 15;
-    code = ch ^ (f << 15);
-    pos = (RE_UINT32)re_blank_stage_1[f] << 5;
-    f = code >> 10;
-    code ^= f << 10;
-    pos = (RE_UINT32)re_blank_stage_2[pos + f] << 3;
-    f = code >> 7;
-    code ^= f << 7;
-    pos = (RE_UINT32)re_blank_stage_3[pos + f] << 7;
-    pos += code;
-    value = (re_blank_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1;
-
-    return value;
-}
-
-/* Graph. */
-
-static RE_UINT8 re_graph_stage_1[] = {
-     0,  1,  2,  3,  4,  5,  6,  7,  7,  8,  7,  7,  7,  7,  7,  7,
-     7,  7,  7,  9, 10, 11,  7,  7,  7,  7, 12, 13,  7,  7,  7, 14,
-    15, 16, 17, 18, 19, 13, 20, 13, 21, 13, 13, 13, 13, 22,  7,  7,
-    23, 24, 13, 13, 13, 13, 25, 26, 13, 13, 27, 28, 29, 30, 31, 32,
-     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
-     7,  7,  7,  7, 33,  7, 34, 35,  7, 36,  7,  7,  7, 37, 13, 38,
-    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-    39, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
-     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7, 40,
-     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
-     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7, 40,
-};
-
-static RE_UINT8 re_graph_stage_2[] = {
-      0,   1,   2,   2,   2,   2,   3,   4,   2,   2,   5,   6,   7,   2,   8,   9,
-     10,  11,   2,  12,  13,  14,  15,  16,  17,  18,  19,  20,  21,  22,  23,  24,
-      2,  25,   2,   2,  26,  27,  28,  29,   2,   2,   2,   2,   2,  30,  31,  32,
-     33,  34,  35,  36,  37,  38,  39,  40,  41,  42,   2,  43,   2,   2,  44,  45,
-     46,  47,   2,  48,   2,   2,   2,   2,  49,   2,   2,   2,   2,   2,   2,   2,
-      2,   2,   2,   2,   2,   2,  50,  51,  52,  53,  54,  55,  56,  57,   2,  58,
-     59,  60,  61,  62,  63,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
-      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
-      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,  64,   2,   2,   2,   2,
-      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,  65,
-      2,   2,   2,   2,   2,   2,   2,   2,   2,  66,   2,   2,  67,  68,   2,  69,
-     70,  71,  72,  73,  74,  75,  76,  77,   2,   2,   2,   2,   2,   2,   2,   2,
-      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,  78,
-     79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,
-      2,   2,   2,   2,  80,  81,  82,  83,   2,   2,  84,  85,  86,  87,  88,  89,
-     90,  91,  92,  93,  79,  94,  95,  96,   2,  97,  98,  79,   2,   2,  99,  79,
-    100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110,  79, 111,  79, 112, 113,
-    114, 115, 116, 117, 118, 119, 120,  79, 121, 122,  79, 123, 124, 125, 126,  79,
-    127, 128,  79, 129, 130, 131,  79,  79, 132, 133, 134, 135,  79, 136,  79, 137,
-      2,   2,   2,   2,   2,   2,   2, 138, 139,   2, 140,  79,  79,  79,  79,  79,
-      2,   2,   2,   2,   2,   2,   2,   2, 141,  79,  79,  79,  79,  79,  79,  79,
-     79,  79,  79,  79,  79,  79,  79,  79,   2,   2,   2,   2, 142,  79,  79,  79,
-      2,   2,   2,   2, 143, 144, 145, 146,  79,  79,  79,  79, 147, 148, 149, 150,
-      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,  68,
-      2,   2,   2,   2,   2, 151,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,
-      2,   2, 152,   2,   2, 153,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,
-     79,  79,  79,  79,  79,  79,  79,  79, 154, 155,  79,  79,  79,  79,  79,  79,
-      2, 156, 157, 158, 159, 160, 161,  79, 162, 163, 164,   2,   2, 165,   2, 166,
-      2,   2,   2,   2,   2, 167,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,
-    168,  79, 169,  79,  79, 170,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,
-      2, 171, 172,  79,  79,  79,  79,  79, 173, 174, 175,  79, 176, 177,  79,  79,
-    178, 179, 180, 181, 182,  79,   2,   2,   2,   2,   2,   2,   2, 183, 184, 185,
-    186, 187, 188, 189, 190, 191,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,
-      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2, 192,   2,   2,
-      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2, 193,   2,
-    194,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
-      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2, 195,   2,   2,
-      2,   2,   2,   2,   2,   2,   2, 196,  79,  79,  79,  79,  79,  79,  79,  79,
-      2,   2,   2,   2, 197,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,
-    198,  79,   2,  65,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,
-      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2, 199,
-};
-
-static RE_UINT8 re_graph_stage_3[] = {
-      0,   0,   1,   2,   2,   2,   2,   3,   0,   0,   1,   2,   2,   2,   2,   2,
-      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   4,
-      5,   2,   6,   2,   2,   2,   2,   2,   2,   2,   2,   1,   2,   7,   2,   2,
-      8,   1,   2,   2,   9,   2,  10,  11,   2,  12,   2,   2,   2,   2,   2,   2,
-     13,   2,   2,   2,   8,   2,   2,   2,   2,   2,   2,  14,   2,   2,   2,   8,
-      2,   2,  15,   3,   2,  16,  17,   0,   0,   0,   2,  18,   0,  19,   2,   2,
-     20,  21,  22,  23,  24,  25,  26,   3,  27,  21,  22,  28,  29,  30,  31,  32,
-     33,   6,  22,  34,  35,  36,  26,  37,  38,  21,  22,  34,  39,  40,  26,   9,
-     41,  42,  43,  44,  45,  46,  31,  17,  12,  47,  22,  48,  49,  50,  26,  51,
-     12,  47,  22,  52,  49,  53,  26,  54,  55,  47,   2,   2,  56,  57,  26,   2,
-     58,  59,   2,  60,  61,  62,  31,  63,   1,   2,   2,  10,   2,  64,   0,   0,
-     65,   2,  66,  15,  67,  68,   0,   0,   2,   2,   2,   2,  69,   2,  70,   1,
-      2,  69,   2,  12,  12,  17,   0,   0,   2,   2,   2,   2,  71,   2,   2,   2,
-      2,   2,   2,   2,  72,  73,   2,   2,  72,   2,   2,  74,  75,  76,   2,   2,
-      2,  75,   2,   2,   2,   8,   2,  70,   2,  77,   2,   2,   2,   2,   2,  78,
-      1,  70,   2,   2,   2,   2,   2,  79,  12,  11,   2,  32,   2,  80,  12,  81,
-      2,   2,   2,   2,   2,  15,  77,  77,   3,  77,   2,   2,   2,   2,   2,  79,
-      2,   2,  17,   2,   2,   2,   2,  82,   2,   3,  64,  64,  83,   2,  15,  11,
-      2,   2,  64,   2,  77,  84,   2,   2,   2,  85,   2,   2,   2,   3,   2,  86,
-     77,  77,  15,   3,   0,   0,   0,   0,   2,   2,   2,   2,  64,   2,   2,  70,
-      2,   2,   2,   2,   2,   2,   2,  87,   2,   2,   2,  88,  48,   2,   2,   2,
-     79,   2,   2,   8,   9,   2,   2,  17,   2,   2,   2,   2,   2,   2,   2,  89,
-      2,  78,   2,   2,  78,  90,   2,  15,   2,   2,   2,  91,  91,  92,   2,  93,
-     94,   2,  95,   2,   2,   3,  91,  96,   3,  70,   2,   2,   0,   2,   2,  36,
-     64,   2,   2,   2,   2,   2,   2,   2,   2,   2,  32,   0,  17,   0,   2,   2,
-      2,   2,   2,   2,   2,   2,   2,  26,   2,  97,   2,   2,   2,   2,   2,   2,
-      2,   2,   3,   2,   2,   3,   2,   2,   2,   2,   2,   2,   2,   2,   2,  98,
-      2,   2,  71,   2,   2,   2,  99, 100,   2,  32, 101, 101, 101, 101,   2,   2,
-      2,   2,   2,   2,   2,   0,   0,   0,   2,  89,   2,   2,   2,   2,   2,  80,
-      2,   2,   2,   2,   2,  82,   0,  64,   1,   2,   2,   2,   1,   2,   2,   2,
-      2,   7,   2,   2,   2,   2,   2,   2, 102,   2,   2,   1,   2,   2,   2,   2,
-      3,   2,   2,  17,   2,   2,  80,   2,   2,   3,   2,   2,   2,   2,   2,   2,
-      2,   2,   2,  82,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   0,
-     70,   2,   2,   2,  32,   2,   2,   2,   2,   2,  64,   0,   2,   2,   2,   2,
-      2,   2,   2,   2,   2,   2,   2,   9,   2,   2,   2,   2, 103,   0,   0,  51,
-      2,   2,  64,  77,   2,   2,   2,   9,   2,   2,   2,   2, 104,  77,   2,   2,
-      2,   2,   2,   2,   2, 105,   2,  70,   2,   2,   2,   2,  13,  44,   2,   3,
-      2,   2,   2,  32,  15,  68,   2,   2,   2,   2,   2,   2, 106,  94,   2,  32,
-    107, 108, 101,   2,   2,   2,   9,   2,   2,   2,   2,   2,   2,   2,  15,  77,
-      2,   2,  80,   2, 109,   2,   2,  64,   0,   0,   0,   0,   0,   0,   0,   0,
-      2,   2,   2,   2,   2,   2,  15,   2,   2,   2,   2,   2,   2,  77,   0,   0,
-     32, 110,   2, 111, 112,   2,   2,   2,   2,   2,   2,   2,  14,  19,   2,   2,
-      2,   2,   2,   2,   0,   2,   2,   2,   2, 113,   2,   2,   9,   0,   0,  15,
-      2,  77,   2,   2,   2, 114, 115,  91,   2,   2,   2,   2,   2,   2,   2,  86,
-      1,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   3, 116, 117, 101, 118,
-    119,   2,  76, 120,  15,  15,   0,   0,   2,   2,   2,   2,   2,   2,   2,  17,
-    121,   2,   2, 122,   2,   2,   2,   2,   3,  64,  36,   0,   0,   2,   2,  15,
-      2,  70,   2,   2,   2,  36,   2,  64,   2,   2, 123,   2,  17,   2,   2,  17,
-      2,  13,   2,   2, 124,  82,   0,   0,   2,  15,  77,   2,   2, 124,   2,  64,
-      2,   2,   9,   2,   2,   2, 105,   0,   2,   2,   2,  32,   2,  82,   9,   0,
-    125,   2,   2, 126,   2, 127,   2,   2,   2,   3,  51,   0,   0,   0,   2, 128,
-      2, 129,   2, 130,   0,   0,   0,   0,   2,   2,   2, 131,   2, 113,   2,   2,
-    132, 133,   2, 134,  79,  79,   2,   2,   2,   2,   0,   0,   2,   2, 109,  32,
-      2,   2,   2, 135,   2,  97,   2, 136,   2, 137, 138,   0,   0,   0,   0,   0,
-      2,   2,   2,   2,  79,   0,   0,   0,   2,   2,   2, 106,   2,   2,   2, 139,
-      2,   2,   9,  77,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   3,
-      2,   2,   9,   2,   2,  77,   0,   0,   0,   0,   0,   0,   0,   0,   2,  32,
-      2,   2,   2,   2,  15, 113,   2, 140,   2,   2,   2,   2, 141,   2,  79,  77,
-      2,   2,   2,  91,  32,   2,   2,  32,   2,   2,   2,   2,  15,   2,   1,  11,
-      2,   6,   2,   3,   0,   0,   0,   0, 142,  13,  77,   2,   2,   2,  17,  77,
-     20,  21,  22, 143,  39, 144, 145,  11,   2,   2,   2,   2,   2, 146,   0,   0,
-      2,   2,   2,   2,   9,  77,   0,   0,   2,   2,   2,  97,   2,  15,   0,   0,
-      2,   2,   2,   2,  11,  77,  70,   0,   2,   2,   2,  79,  77,   0,   0,   0,
-      2,   8,  64,   2,   0,   0,   0,   0,   2,   2,   2,  64,   0,   0,   0,   0,
-      0,   0,   2,   2,   2,   2,   2, 147,   0,   0,   4,   2,   2,   4,  11,   0,
-      2,   2,   2,   2,   9,   2,   2,   2,   2,   2, 106,   0,   2,   2,   2,  79,
-     22,   2,   2,  76,  82,   2,  70,   2,   2, 113,  69,  32,   0,   0,   0,   0,
-    148,   2,   2, 149,   9,  77, 150,   2,   3, 151,  77,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   2,  79,   0,   0,   0,   0,   2,   2,   2, 152,
-      2,  77,   0,   0,   0,   0,   0,   0,   2,   2,   2,   2,   2,   2,   3,  11,
-      2,   2,   2,   2,  80,   0,   0,   0,   2,   2,   3,  79,   0,   0,   0,   0,
-      2,   2,   2,   2,  32,   0,   0,   0,   2,   2,   2,  79,   2,   3,  44,   0,
-      0,   0,   0,   0,   0,   2,  15,  82,   2,   2,   2,   2,  82,  89,   6, 153,
-      2,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   2,   2,   2,
-      2,  17,   0,   0,   0,   0,   0,   0,   2,   2,   2,   2,  10,   2,   2,   2,
-     99,   2,   0,   0,   0,   0,  80,   0,   2,   2,   2,   2,   2,   2,   2, 106,
-      2,   3,   0,   0,   0, 106, 154,   2,   2,   2,   2,   2,   2,   2,   2,  64,
-      2,   2,   2,   2,   2,   2,  17,  70,  79,  68,  80,   0,   0,   0,   0,   0,
-      2,   2,   2,   2,   2,   2,   2,  82,   2,   2,   7,   2,   2,   2,   2,   2,
-      2,   2,   2,   2,   2,   2,  79,   0,   2,   2,   2,   2,  82,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   2,  80,   2,   2,   2,   2,   2,  32,   2,  79,
-      2,   2,   2,   2,   2,  91,   2,   2,   2,  12, 155, 146, 156,   2,   2,   2,
-    157, 158,   2, 159, 160,  47,   2,   2,   2,   2,  97,   2,   2,   2,   2,   2,
-      2,   2,   2,   2,  85,   2,   2,   2,  64,  94,   1,   0,   0,   0,   0,   0,
-     76, 161, 162,   0,   0,   0,   0,   0,   2,   2,  70,  15,  44,   0,   0,   0,
-      0,   0,   0,   0,   2,   2,   2, 130,   2,   2,   2,   2, 163,  32,   0,   0,
-      2,   2,   2,   2,  64,  44,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,
-      2,   2,   2,  11,   0,   0,   0,   0,   1,   2,   2,  15,   0,   0,   0,   0,
-    156,   2, 164, 165, 166, 167, 168, 169,  89,  64, 170,  64,   0,   0,   0,  14,
-      2,   2,  64,   2,   2,   2,   2,   2,   2,  80,   3,   1,   1,   1,   2,  82,
-     70,   2,   2,   2,   2,   2,  70,   2,   2,   2,  70,   0,   0,   0,  31,   2,
-    106,   2,   2,  64,  79,  14,  82,   0,   2,   2,   2,   2,   2,  82,  70,  17,
-      2,   2,   2,   2,   2,   2,   2,  80,   2,   2,   2,   2,   2,  79,  64,   0,
-     64,   2,   2,   2,   9,  77,   2,   2,   9,   2,  15,   0,   0,   0,   0,   0,
-    119,   2,   2,   2,   2,   2,   2, 171,   2,   2, 172,   2,   8,   2,   2,   2,
-      2,   2,   2,   2,   2,  80,  15, 173, 106,  82,   0,   0,   0,   0,   0,   0,
-      2,   2,   2,   2,   2,  32,   0,   0,   2,   2,   2,  11,   2,   2,   2,   2,
-      2,  15,   2,   2,   2,   2,   2,   2,   2,   2,  14,   2,   2,   2,   2,   2,
-      2,   2,   2,   2,   2,   2,  36,   0,   2,  15,   0,   0,   0,   0,   0,   0,
-    174,   0,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,  15,
-};
-
-static RE_UINT8 re_graph_stage_4[] = {
-      0,   0, 254, 255, 255, 255, 255, 127, 255, 252, 240, 215, 251, 255, 127, 254,
-    255, 231, 255,   0, 255, 135,  31,   0, 255, 223, 255, 191,   3,   0, 255,  63,
-    255,  79, 255,   7, 223,  63, 248, 255, 239, 159, 249, 255, 255, 253, 197, 243,
-    159, 121, 128, 176, 207, 255, 238, 135, 109, 211, 135,  57,   2,  94, 192, 255,
-    127,   0, 238, 191, 237, 243, 191,  59,   1,   0,   3, 254, 238, 159, 159,  57,
-    192, 176, 236, 199,  61, 214,  24, 199, 255, 195, 199,  61, 129,   0, 253, 255,
-    255, 227, 223,  61,  96,   7, 128, 255, 239, 243,  96,  64,   6,   0, 239, 223,
-    223, 253, 240, 255, 236, 255, 127, 252, 251,  47, 127, 132,  95, 255,  28,   0,
-    255,  15, 214, 247, 175, 255,  95,  63, 255, 243, 255, 254, 255,  31, 191,  32,
-    255,  61, 127,  61,  61, 127,  61, 255, 127, 255, 255,   3,  63,  63, 255,   1,
-     15,   0,  13,   0,  63,   0, 241, 255, 255, 199, 255, 207, 255, 159,  15, 240,
-    255, 248, 255, 251, 255, 170, 223, 255, 207, 239, 220, 127,   0, 248, 255, 124,
-    243, 255,  63, 255,  15, 254, 255, 128,   1, 128, 127, 127, 224, 255, 124,   0,
-     63, 192,  15, 128,   7,   0, 126, 126, 126,   0, 127, 248, 248, 224, 127,  95,
-    219, 255, 252, 255, 247, 255, 127,  15, 252, 252, 252,  28,   0,  62, 255, 239,
-    255, 183, 135, 255, 143, 255,  15, 224,  15, 255,  63, 253, 191, 145, 191, 255,
-     55, 248, 255, 143, 255, 131, 255, 240, 111, 240, 239, 254,  63, 135,  63, 254,
-      7, 255,   3,  30,   0, 254,   7, 252,   0, 128,   3,  32, 127, 189, 237, 251,
-    129, 224, 207,  31, 255, 235,   7, 128, 127, 251, 127, 180, 191, 253, 251,   1,
-      3, 128, 255, 224, 240,   0, 100, 222, 239, 255, 191, 231, 223, 223, 255, 123,
-     95, 252, 255, 249, 219,   7, 159, 255, 150, 254, 247,  10, 132, 234, 150, 170,
-    150, 247, 247,  94, 238, 251, 123, 252, 231, 199,  15,   7,   2,   0,
-};
-
-/* Graph: 3150 bytes. */
-
-RE_UINT32 re_get_graph(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-
-    f = ch >> 11;
-    code = ch ^ (f << 11);
-    pos = (RE_UINT32)re_graph_stage_1[f] << 4;
-    f = code >> 7;
-    code ^= f << 7;
-    pos = (RE_UINT32)re_graph_stage_2[pos + f] << 3;
-    f = code >> 4;
-    code ^= f << 4;
-    pos = (RE_UINT32)re_graph_stage_3[pos + f] << 4;
-    pos += code;
-    value = (re_graph_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1;
-
-    return value;
-}
-
-/* Print. */
-
-static RE_UINT8 re_print_stage_1[] = {
-     0,  1,  2,  3,  4,  5,  5,  5,  5,  6,  7,  5,  5,  8,  5,  9,
-    10, 11, 12, 13, 14, 15, 16,  5, 17, 15, 15, 18, 15, 19, 20, 21,
-     5,  5,  5,  5,  5,  5,  5,  5,  5,  5, 22, 23, 24,  5, 25, 26,
-    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-    27, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5, 28,
-     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5, 28,
-};
-
-static RE_UINT8 re_print_stage_2[] = {
-      0,   1,   1,   2,   1,   3,   4,   5,   6,   7,   8,   9,  10,  11,  12,  13,
-     14,   1,  15,  16,   1,   1,  17,  18,  19,  20,  21,  22,  23,  24,   1,  25,
-     26,  27,   1,   1,  28,   1,   1,   1,   1,   1,   1,  29,  30,  31,  32,  33,
-     34,  35,  36,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,  37,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,  38,
-      1,   1,   1,   1,  39,   1,  40,  41,  42,  43,  44,  45,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,  46,  47,  47,  47,  47,  47,  47,  47,  47,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,  48,  49,   1,  50,  51,  52,
-     53,  54,  55,  56,  57,  58,   1,  59,  60,  61,  62,  63,  64,  65,  66,  67,
-     68,  69,  70,  71,  72,  73,  74,  75,  76,  77,  78,  47,  79,  80,  81,  82,
-      1,   1,   1,  83,  84,  85,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,
-      1,   1,   1,   1,  86,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,
-     47,  47,  47,  47,   1,   1,  87,  47,  47,  47,  47,  47,  47,  47,  47,  47,
-     47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,
-     47,  47,  47,  47,  47,  47,  47,  47,   1,   1,  88,  89,  47,  47,  90,  91,
-      1,   1,   1,   1,   1,   1,   1,  92,   1,   1,  93,  47,  47,  47,  47,  47,
-      1,  94,  95,  47,  47,  47,  47,  47,  47,  47,  47,  47,  96,  47,  47,  47,
-     97,  98,  99, 100, 101, 102, 103, 104,   1,   1, 105,  47,  47,  47,  47,  47,
-    106, 107, 108,  47,  47,  47,  47,  47, 109, 110,  47,  47, 111, 112, 113,  47,
-    114, 115, 116,   1,   1,   1, 117, 118, 119, 120, 121,  47,  47,  47,  47,  47,
-      1,   1,   1,   1,   1,   1, 122,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1, 123, 124,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1, 125,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1, 126,  47,  47,  47,  47,
-     47,  47,  47,  47,  47,  47,  47,  47,   1,   1, 127,  47,  47,  47,  47,  47,
-    128,  38,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1, 129,
-};
-
-static RE_UINT8 re_print_stage_3[] = {
-      0,   1,   1,   2,   0,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   1,   3,   4,   5,   1,   1,   1,   6,   7,   1,   8,   1,   9,  10,
-     11,   1,   1,   1,   1,   1,   1,   1,  12,   1,  13,   1,   1,  14,   1,  15,
-      1,  16,  17,  18,   0,  19,  20,   1,   1,   1,   1,   1,  21,  22,  23,  24,
-     25,  26,  27,  28,  29,  30,  31,  32,  33,  30,  34,  35,  36,  37,  38,  39,
-     40,  41,  42,  43,  40,  44,  45,  46,  47,   1,  48,  49,  50,  51,  52,  53,
-     54,  55,  56,   0,  57,  58,  59,   0,   1,   1,  60,  61,  62,  11,  63,   0,
-      1,   1,   1,   1,   1,   1,  64,   1,   1,   1,  65,   1,  66,  67,  68,   1,
-     69,   1,  15,  70,  71,   1,   1,  72,   1,   1,   1,   1,  70,   1,   1,  73,
-     74,  75,  76,  77,   1,   1,  78,  79,  80,   1,   1,  73,   1,  81,   1,  82,
-      2,  83,  84,  85,   1,  86,  87,   1,  88,   1,   2,  89,  79,  16,   0,   0,
-      1,   1,  86,  70,   1,   1,   1,  90,   1,  91,  92,   1,  93,  15,   9,  94,
-      1,   1,   1,   1,   1,   1,   1,  95,  72,   1,  96,  78,   1,  97,  98,  99,
-      1, 100,   1, 101, 102,   1, 103, 104,   1,   1,   1,   1,  86,   1,   1,   1,
-      1, 105,  18,   1,   1,   1,   1,   1,   1,   1,   1, 106, 107,   1,   1,   1,
-      1, 108,   2,   1,   1,   1,   1, 109,   1,  64,   1, 110,  75, 111, 111,   1,
-      1,   1, 112,   0,  95,   1,   1,  76,   1,   1,   1,   1,   1,   1,  82, 113,
-      1,   1,  54,   1,   7,   1,   1,   1, 114,   6,   1,   1, 108,  94,   1, 115,
-      2,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,  82,   1,   1,
-      1,   1,   1,   1,   1,   1,   1, 112,   1,   1,   1,   1, 116,   1, 117,   1,
-      1, 118,   1,   1,   1,   1,   1, 119,   1,   1,   1,   1,   1,   1, 120, 121,
-      1, 122,   1, 119,   1,   1, 123,   1,   1,   1, 124,  70,   1,   1, 125,   2,
-      1,  75, 126,   1,   1,   1, 127,  75, 128, 129,   1,   9,   1,   1,   1, 130,
-      1,   1,   1,   1,   1, 115, 131,  56,   0,   0,   0,   0,   0,   0,   0,   0,
-      1,   1,   1, 132,   1,   1,  71,   0, 133, 134, 135,   1,   1,   1, 136,   1,
-      1,   1, 103,   1, 137,   1, 138, 139,  71,   1, 140, 141,   1,   1,   1,  89,
-     54,   1,   1,   1,   1,   2, 142, 143, 144, 145, 146,   0,   1,   1,   1,  94,
-    147, 148,   1,   1, 149, 150, 103,  78,   0,   0,   0,   0,  70,   1, 104,  56,
-      1, 151,  81,  94, 152,   1, 153,   0,   1,   1,   1,   1,  78, 154, 155,  56,
-      1,   9,   1, 156,   0,   0,   0,   0,   1,  75,  82, 138,   0,   0,   0,   0,
-    157, 158, 159,   1,   2, 160,   0, 161, 162, 163,   0,   0,   1, 164, 137,   1,
-    165, 166, 167,   1,   1,   0,   1, 168,   1, 169, 107, 170, 171, 172,   0,   0,
-      1,   1, 173,   0,   1, 174,   1, 175,   1, 176,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   2,   0,   0,   0,   0,   1,   9,  71,   0,   0,   0,   0,  75,
-      1,   1, 177, 178,   1,   1, 179, 180,   1,  97, 117,  75,   1,   1, 132, 181,
-    182,   2,   0,   0, 183, 154,   1, 184,  21, 185, 186, 187,   0,   0,   0,   0,
-      1,   1, 188,   0,   1,   1, 176,   0,   0,   0,   0,   0,   1, 107,  78,   0,
-      1,   1, 189, 190,   1,  73, 191,   0,  15,  86,   0,   0,   0,   0,   0,   0,
-      1,  56,   0,   0,   0,   1,   1, 192,   0,   0,   0,   0,   0, 100,   3, 193,
-      1,   1,   9,   1,   1, 194,   1,  73, 195, 196, 197, 116, 137, 198,   0,   0,
-    199, 200, 176, 201, 202, 191,   0,   0,   0,   0,   0,   0,   0,   0,   0,  73,
-      0,   0,   0,   0,   0,   0,   1, 203,   1,   1,   1,   1,  71,   0,   0,   0,
-      1,   1,   1, 204,   1,   1,   1,   1,   1,   1, 205,   0,   0,   0,   0,   0,
-      1, 206,   0,   0,   0,   0,   0,   0,   1,   1, 105,   0,   0,   0,   0,   0,
-      1,  73,   2, 207,   0,   0, 103, 208,   1,   1, 209, 210, 112,   0,   0,   0,
-      0,   0,   1,   1,  94,   0,   0,   0,   1,   1, 211,   1, 212,   0,   0, 205,
-      1,   1,   1,   1,   1,   1,   1, 119,   1,   1,   1,   1,   1,   1,   1, 174,
-      2,   0, 213, 214,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,  56,
-      1,   1,   1, 215, 216, 205,   0,   0,   1,   1,   1,   1,   1,   1,   1,  82,
-      1, 217,   1,   1,   1,   1,   1, 173,   1,   1, 218,   0,   0,   0,   0,  76,
-      1,   1,  75,  73,   0,   0,   0,   0,   1,   1,  97,   1,  11, 219, 220,   1,
-    221, 222, 223,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1, 224,   1,   1,
-      1,   1,   1,   1,   1,   1, 225,   1,   1,   1,   1,   1, 226, 227,   0,   0,
-    228, 229,   0,   0,   0,   0,   0,   0,   1, 230, 207,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   1, 163,   1,   1,   1,   1,   1,   1, 231,   0,
-      1,   1, 232,   0,   0,   0,   0,   0,   0,   0,   0, 233,   1, 234,   0,   0,
-     54,  78,   0,   0,   0,   0,   0,   0, 220, 235, 236, 237, 238, 239,   0, 240,
-      1,  86,   1,   1,  76, 241, 242,  82, 116,   1,   1, 116,   1, 190,   0, 243,
-    244,  56, 245, 218,   0,   0,   0,   0,   1,   1,   1,   1,   1,   1,  82, 246,
-      1,   1,   1,  76,   1,   1,  73, 118,  86,   1, 176,   1,   9, 247,   0,   0,
-    144,   1,   1, 248,   1, 249,  13,   1,   1,   1,  76, 250, 251,   0,   0,   0,
-      1,   1,   1,   1,   1,   1,  75,   0,   1, 234,   1,   1,   1,   1,   1,   1,
-     78,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1, 252,   1,   1,
-      1,   1,   1,   1,   1,   1,   1, 150,  78,   0,   0,   0,   0,   0,   0,   0,
-    253,   1,   1,   1,   0,   0,   0,   0,   1,   1,   1,   1,   1,   1,   1,  78,
-};
-
-static RE_UINT8 re_print_stage_4[] = {
-      0,   0,   0,   0, 255, 255, 255, 255, 255, 255, 255, 127, 255, 255, 255, 252,
-    240, 215, 255, 255, 251, 255, 255, 255, 255, 255, 254, 255, 255, 255, 127, 254,
-    255, 231, 254, 255, 255,   0, 255, 255, 255, 135,  31,   0, 255, 255, 255, 223,
-    255, 191, 255, 255, 255, 231, 255, 255, 255, 255,   3,   0, 255, 255, 255, 231,
-    255,  63, 255, 127, 255, 255, 255,  79, 255,   7,   0,   0, 255, 255, 223,  63,
-      0,   0, 248, 255, 239, 159, 249, 255, 255, 253, 197, 243, 159, 121, 128, 176,
-    207, 255, 255, 127, 238, 135, 249, 255, 255, 253, 109, 211, 135,  57,   2,  94,
-    192, 255, 127,   0, 238, 191, 251, 255, 255, 253, 237, 243, 191,  59,   1,   0,
-    207, 255,   3, 254, 238, 159, 249, 255, 159,  57, 192, 176, 207, 255, 255,   0,
-    236, 199,  61, 214,  24, 199, 255, 195, 199,  61, 129,   0, 192, 255, 255,   7,
-    255, 223, 253, 255, 255, 253, 255, 227, 223,  61,  96,   7, 207, 255, 128, 255,
-    255, 253, 239, 243, 223,  61,  96,  64, 207, 255,   6,   0, 239, 223, 253, 255,
-    223, 253, 240, 255, 207, 255, 255, 255, 236, 255, 127, 252, 255, 255, 251,  47,
-    127, 132,  95, 255, 192, 255,  28,   0, 254, 255, 255, 255, 255, 255, 255, 135,
-    255, 255, 255,  15, 214, 247, 255, 255, 175, 255, 255,  63,  95,  63, 255, 243,
-    255, 254, 255, 255, 255,  31, 254, 255, 255, 255, 255, 254, 255, 223, 255,   7,
-    191,  32, 255, 255, 255,  61, 127,  61, 255,  61, 255, 255, 255, 255,  61, 127,
-     61, 255, 127, 255, 255, 255,  61, 255, 255, 255, 255,  31, 255, 255, 255,   3,
-    255, 255,  63,  63, 255, 255, 255,   1, 255, 223,  31,   0, 255, 255, 127,   0,
-    255, 255,  15,   0, 255, 223,  13,   0, 255, 255, 255,  63, 255,   3, 255,   3,
-    255, 127, 255,   3, 255,   7, 255, 255, 255, 255,  63,   0, 255,  15, 255,  15,
-    241, 255, 255, 255, 255,  63,  31,   0, 255,  15, 255, 255, 255,   3, 255, 199,
-    255, 255, 255, 207, 255, 255, 255, 159, 255, 255,  15, 240, 255, 255, 255, 248,
-    255, 227, 255, 255, 255,   1, 255, 255, 255, 255, 255,   7, 255, 255, 255, 251,
-     63,  63, 255, 170, 255, 255, 223, 255, 223, 255, 207, 239, 255, 255, 220, 127,
-    255, 252, 255, 255, 223, 255, 243, 255, 255, 127, 255,  31,   0,   0, 255, 255,
-    255, 255,   1,   0, 127,   0,   0,   0, 255, 255, 207, 255, 255, 255,  63, 255,
-    255, 127, 255, 255, 255, 255,  15, 254, 255, 128,   1, 128, 127, 127, 127, 127,
-    255, 255,   0,   0,   0,   0, 255,  15, 224, 255, 255, 255,  15,   0, 255, 255,
-    255,  31, 255, 255, 127,   0, 255, 255, 255,  15,   0,   0, 255, 255, 255,   0,
-    124,   0,   0,   0,   0,   0, 128, 255, 255,  15, 255,   3,  63, 192, 255,   3,
-    255, 255,  15, 128, 255, 191, 255, 195, 255,  63, 255, 243,   7,   0,   0, 248,
-    126, 126, 126,   0, 127, 127, 255, 255, 255,  63, 255,   3, 127, 248, 255, 255,
-    255,  63, 255, 255, 127,   0, 248, 224, 255, 255, 127,  95, 219, 255, 255, 255,
-      3,   0, 248, 255, 255, 255, 252, 255, 255,   0,   0,   0,   0,   0, 255,  63,
-    255, 255, 247, 255, 127,  15, 223, 255, 252, 252, 252,  28, 127, 127,   0,  62,
-    255, 239, 255, 255, 127, 255, 255, 183, 255,  63, 255,  63, 135, 255, 255, 255,
-    255, 255, 143, 255, 255, 127, 255,  15,   1,   0,   0,   0,  15, 224, 255, 255,
-    255, 255, 255, 191,  15, 255,  63,   0, 255,   3, 255, 255, 255, 255,  15, 255,
-     15, 128,   0,   0,  63, 253, 255, 255, 255, 255, 191, 145, 255, 255, 191, 255,
-    128, 255,   0,   0, 255, 255,  55, 248, 255, 255, 255, 143, 255, 255, 255, 131,
-    255, 255, 255, 240, 111, 240, 239, 254, 255, 255,  63, 135, 255,   1, 255,   1,
-    127, 248, 127,   0, 255, 255,  63, 254, 255, 255,   7, 255, 255, 255,   3,  30,
-      0, 254,   0,   0, 255,   1,   0,   0, 255, 255,   7,   0, 255, 255,   7, 252,
-    255,   0, 255,   3, 255,  63, 252, 255, 255, 255,   0, 128,   3,  32, 255, 255,
-    255,   1, 255,   3, 254, 255,  31,   0, 255, 255, 251, 255, 127, 189, 255, 191,
-    255,   7, 255,   3, 255, 253, 237, 251, 159,  57, 129, 224, 207,  31,  31,   0,
-    255, 255, 255, 235,  31,   0, 255,   3, 255,  31,   0,   0, 255,   3,   0,   0,
-    255, 255,   7, 128,  31,   0,   0,   0,   7,   0,   0,   0, 255, 253, 255, 255,
-    255, 255, 127, 255,  63,   0, 255, 255, 255, 254, 127,   0, 127, 251, 255, 255,
-    255, 255, 127, 180, 191, 253, 255, 255, 255, 127, 251,   1, 255, 255,   3, 128,
-    255, 127,  31,   0,  15,   0,   0,   0, 255, 127, 255,   1, 255, 195,   0,   0,
-    255,  63,  63,   0,  63,   0, 255, 251, 251, 255, 255, 224, 255, 135, 255, 255,
-    255, 128, 255, 255,   0,   0,   7,   0, 240,   0, 255, 255, 255,   7, 255,  31,
-    255,   1, 255, 243, 127, 254, 255, 255,  63,   0,   0,   0, 100, 222, 255, 235,
-    239, 255, 255, 255, 191, 231, 223, 223, 255, 255, 255, 123,  95, 252, 253, 255,
-     63, 255, 255, 255, 255, 207, 255, 255, 255,  15,   0, 248, 254, 255,   0,   0,
-    127, 255, 255, 249, 219,   7,   0,   0, 255,  31, 255,  63, 159, 255, 127,   0,
-    255,  15, 255, 195,   0,   0, 254, 255, 255, 255,  31,   0, 150, 254, 247,  10,
-    132, 234, 150, 170, 150, 247, 247,  94, 255, 251, 255,  15, 238, 251, 255,  15,
-      0,   0,   3,   0, 255, 127, 254, 255, 254, 255, 254, 255, 192, 255, 255, 255,
-      7,   0, 255, 255, 255,   1,   3,   0, 255,  31, 255,   7, 255,  63,   0,   0,
-    255, 255, 123, 252, 231, 199, 255, 255, 255,  63,  15,   7,   7,   0,  63,   0,
-      3,   0, 255, 255,   2,   0,   0,   0,
+      6, 144,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,
+      6,   6, 196,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,
+      6, 102, 105, 100,   0,   0,  24, 108,   6, 138, 223, 237,  91,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   6,   6,   0,   0,   0,   0,   6,   6, 238,   6, 239,   0,   0, 240,
+      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,
+      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6, 117,
+      6,   6,   6,   6,   6,   6, 104,   0, 134,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      6,   6,   6,   6,   6,   6,   6,   6, 105,   0, 241, 204,   6,   6,   6,   6,
+      6,   6,   6,   6,   6,   6,   6,  29,   0,   0,   0,   0,   0,   0,   0,   0,
+      6,   6,   6, 242, 243,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 244, 245, 246,   0,   0,
+      0,   0, 247,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      6,   6,  31,   6, 248, 249, 250,   6, 251, 252, 253,   6,   6,   6,   6,   6,
+      6,   6,   6,   6,   6, 254, 255,  83,  31,  31, 135, 135, 228, 228, 256,   6,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      6, 257,   6, 258, 259, 260,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    261, 262,   0,   0,   0,   0,   0,   0,   6, 263, 264,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   6, 168,   0,   0,   0,   0,   0,   0,   0,   0,
+      6,   6,   6,   6,   6,   6, 265,   0,   6,   6, 115,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    250, 266, 267, 268, 269, 270,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,
+      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,
+      6,   6,   6,   6,   6,   6,  81,   0,   6,   6,   6,   6,   6,   6,   6,   6,
+      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,
+      6,   6,   6,   6,   6,   6,   6,   6,   6,  96,   6,   6,   6,   6,   6,   6,
+     81,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,
+      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,
+      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,
+      6,   6,   6,   6,   6, 271,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,
+      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,
+      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6, 114,
+      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,
+     81,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,   6,
+      6,   6,   6,   6,   6,   6,   6,   6,   6,   6,  30,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   6,   6,   6,   6,   6,   6,   6,  91,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0
+};
+
+static RE_UINT8 re_xid_continue_table_3[] = {
+      0,   0,   0,   0,   0,   0, 255,   3, 254, 255, 255, 135, 254, 255, 255,   7,
+      0,   4, 160,   4, 255, 255, 127, 255, 255, 255, 255, 255, 195, 255,   3,   0,
+     31,  80,   0,   0, 255, 255, 223, 184, 192, 215, 255, 255, 251, 255, 255, 255,
+    255, 255, 191, 255, 251, 252, 255, 255, 255, 255, 254, 255, 255, 255, 127,   2,
+    255,   1, 254, 255, 255, 255, 255, 191, 182,   0, 255, 255, 255, 135,   7,   0,
+      0,   0, 255,   7, 255, 195, 255, 255, 255, 255, 239, 159, 255, 253, 255, 159,
+      0,   0, 255, 255, 255, 231, 255, 255, 255, 255,   3,   0, 255, 255,  63,  36,
+    255,  63,   0,   0, 255, 255, 255,  15, 255,   7,   0,   0, 255, 255, 223, 255,
+    255,   0, 248, 255, 207, 255, 254, 255, 239, 159, 249, 255, 255, 253, 197, 243,
+    159, 121, 128, 176, 207, 255,   3,  80, 238, 135, 249, 255, 255, 253, 109, 211,
+    135,  57,   2,  94, 192, 255,  63,   0, 238, 191, 251, 255, 255, 253, 237, 243,
+    191,  59,   1,   0, 207, 255,   0, 254, 238, 159, 249, 255, 159,  57, 224, 176,
+    207, 255,   2,   0, 236, 199,  61, 214,  24, 199, 255, 195, 199,  61, 129,   0,
+    192, 255,   0,   0, 255, 223, 253, 255, 255, 253, 255, 227, 223,  61,  96,   7,
+    207, 255,   0,   0, 239, 223, 253, 255, 255, 253, 239, 243, 223,  61,  96,  64,
+    207, 255,   6,   0, 223, 125, 240, 128, 207, 255,   0, 252, 238, 255, 127, 252,
+    255, 255, 251,  47, 127, 132,  95, 255, 192, 255,  12,   0, 254, 255, 255, 255,
+    255, 255, 255,   7, 255, 127, 255,   3, 214, 247, 255, 255, 175, 255, 255,  63,
+     95,  63, 255, 243,   1,   0,   0,   3, 255,   3, 160, 194, 255, 254, 255, 255,
+    255,  31, 254, 255, 223, 255, 255, 254, 255, 255, 255,  31,  64,   0,   0,   0,
+    255,   3, 255, 255, 255, 255, 255,  63, 191,  32, 255, 255, 255, 255, 255, 247,
+    255,  61, 127,  61, 255,  61, 255, 255, 255, 255,  61, 127,  61, 255, 127, 255,
+    255, 255,  61, 255, 255, 255, 255, 231,   0, 254,   3,   0, 255, 255,   0,   0,
+    255, 255,  63,  63, 255, 159, 255, 255, 255, 199, 255,   1, 255, 223,  31,   0,
+    255, 255,  31,   0, 255, 255,  15,   0, 255, 223,  13,   0, 255, 255, 143,  48,
+    255,   3,   0,   0,   0,  56, 255,   3, 255, 255, 255,   1, 255,   7, 255, 255,
+    255, 255,  63,   0, 255, 255, 255, 127, 255,  15, 255,  15, 192, 255, 255, 255,
+    255,  63,  31,   0, 255,  15, 255, 255, 255,   3, 255,   7, 255, 255, 255, 159,
+    255,   3, 255,   3, 128,   0, 255, 191,   1,   0,   0,   0, 255,  15, 255,   3,
+      0, 248,  15,   0, 255, 255, 255,   0, 255, 227, 255, 255, 255,   1, 255, 255,
+      0,   0, 247, 255, 255, 255, 255, 251,  63,  63, 255, 170, 255, 255, 223,  95,
+    220,  31, 207,  15, 255,  31, 220,  31,   0,   0,   0, 128,   1,   0,  16,   0,
+      0,   0,   2, 128,   0,   0, 255,  31, 226, 255,   1,   0, 132, 252,  47,  63,
+     80, 253, 255, 243, 224,  67,   0,   0, 255,   1,   0,   0, 255, 127, 255, 255,
+     31, 248,  15,   0, 255, 128,   0, 128, 255, 255, 127,   0, 127, 127, 127, 127,
+    224,   0,   0,   0, 254, 255,  62,  31, 255, 255, 127, 230, 224, 255, 255, 255,
+    255, 127,   0,   0, 255,  31,   0,   0, 255,  31, 255, 255, 255,  15,   0,   0,
+    255, 255, 240, 191,   0,   0, 128, 255, 252, 255, 255, 255, 255, 249, 255, 255,
+    252,   7,   0,   0,   0,   0, 224, 255, 255,  16,   0,   0,  63,   0, 255,   3,
+    255, 255, 255, 232, 255,  63, 255, 255,   1, 128, 255,   3, 255,  63, 255,   3,
+    255, 255, 127, 252,   7,   0,   0,  56, 255, 255, 124,   0, 126, 126, 126,   0,
+    127, 127, 255, 255, 255,  55, 255,   3,  15,   0, 255, 255, 127, 248, 255, 255,
+    255, 255, 255,   3, 127,   0, 248, 224, 255, 253, 127,  95, 219, 255, 255, 255,
+      0,   0, 248, 255, 240, 255, 255, 255, 255, 255, 252, 255, 255,   0,   0,   0,
+    255, 255,  24,   0,   0, 224,   0,   0,   0,   0, 138, 170, 252, 252, 252,  28,
+    255, 239, 255, 255, 127, 255, 255, 183, 255,  63, 255,  63,   0,   0,   0,  32,
+    255, 255,   1,   0,   0, 224, 255, 255,  15, 255,  62,   0, 255, 255,  15, 255,
+    255,   0, 255, 255,  15,   0,   0,   0,  63, 253, 255, 255, 255, 255, 191, 145,
+    255, 255,  55,   0, 255, 255, 255, 192, 111, 240, 239, 254, 255, 255,  63, 135,
+    127,   0,   0,   0, 255, 255,   7,   0, 255,   0, 255,   3, 255,  27,   3,   0,
+    128,   0, 255, 255,  31,   0,   0,   0, 192, 255,   0, 128, 255,   1, 255,   3,
+    240,   0, 255, 255, 255, 255,  79,   0,  31, 222, 255,  23, 255, 255, 251, 255,
+    255, 255, 255,  64, 127, 189, 255, 191, 255,   7, 255,   3, 255, 253, 237, 251,
+    159,  57, 129, 224, 207,  31,  31,   0, 255,   7, 255, 195,   3,   0,   0,   0,
+    191,   0, 255,   3, 255, 255,  63, 255,   1,   0,   0,  63,  17,   0, 255,   3,
+    255,   3,   0, 128, 127, 242, 111, 255, 255, 255, 191, 249,  15,   0, 255,   3,
+    255, 252, 255, 255, 255, 255, 255, 252,  27,   0,   0,   0, 255, 255, 255,  35,
+    255, 253, 255, 255,   1,   0, 255,   3,   0,   0, 252, 255, 255, 254, 127,   0,
+    127, 251, 255, 255, 255, 255, 127, 180, 191, 253, 255, 255, 255, 127, 251,   1,
+      0,   0,   1,   0, 248, 255, 255, 224, 255, 135, 255, 255, 255, 128, 255, 255,
+     27,   0,   3,   0,   0,   0,   7,   0, 255,   7, 255,  31, 255,   1, 255,  99,
+    224, 227,   7, 248, 231,  15,   0,   0,   0,  60,   0,   0,  28,   0,   0,   0,
+    255, 255, 255, 223, 100, 222, 255, 235, 239, 255, 255, 255, 191, 231, 223, 223,
+    255, 255, 255, 123,  95, 252, 253, 255,  63, 255, 255, 255, 253, 255, 255, 247,
+    247, 207, 255, 255, 255, 255, 127, 248, 255,  31,  32,   0,  16,   0,   0, 248,
+    254, 255,   0,   0, 127, 255, 255, 249, 219,   7,   0,   0, 255,  31, 255,  63,
+    255,  67,   0,   0,  31,   0, 127,   0, 150, 254, 247,  10, 132, 234, 150, 170,
+    150, 247, 247,  94, 255, 251, 255,  15, 238, 251, 255,  15,   3,   0, 255, 255
 };
 
-/* Print: 2792 bytes. */
-
-RE_UINT32 re_get_print(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-
-    f = ch >> 12;
-    code = ch ^ (f << 12);
-    pos = (RE_UINT32)re_print_stage_1[f] << 4;
-    f = code >> 8;
-    code ^= f << 8;
-    pos = (RE_UINT32)re_print_stage_2[pos + f] << 3;
-    f = code >> 5;
-    code ^= f << 5;
-    pos = (RE_UINT32)re_print_stage_3[pos + f] << 5;
-    pos += code;
-    value = (re_print_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1;
-
-    return value;
-}
+RE_UINT32 re_get_xid_continue(RE_UINT32 codepoint) {
+    RE_UINT32 field_2;
+    RE_UINT32 field_1;
+    RE_UINT32 field_0;
+    RE_UINT32 offset;
+    RE_UINT32 v;
 
-/* Word. */
+    field_2 = codepoint >> 10;
+    field_1 = (codepoint >> 5) & 0x1F;
+    field_0 = (codepoint >> 3) & 0x3;
+    offset = codepoint & 0x7;
+
+    v = re_xid_continue_table_1[field_2];
+    v = re_xid_continue_table_2[(v << 5) | field_1];
+    v = re_xid_continue_table_3[(v << 2) | field_0];
+
+    return (v >> offset) & 0x1;
+}
 
-static RE_UINT8 re_word_stage_1[] = {
-     0,  1,  2,  3,  4,  5,  5,  5,  5,  6,  7,  5,  5,  8,  9, 10,
-    11, 12, 13, 14, 15,  9, 16,  5, 17,  9,  9, 18,  9, 19, 20, 21,
-     5,  5,  5,  5,  5,  5,  5,  5,  5,  5, 22, 23, 24,  5, 25, 26,
+/* XID_Start. */
+static RE_UINT8 re_xid_start_table_1[] = {
+     0,  1,  2,  3,  4,  5,  6,  7,  8,  9,  9, 10, 11, 12, 12, 12,
+    12, 12, 12, 13, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+    12, 12, 12, 12, 12, 12, 12, 14, 12, 15, 16, 12, 12, 12, 12, 12,
+    12, 12, 12, 12, 12, 17,  9,  9,  9,  9,  9,  9,  9,  9, 18, 19,
+    20, 21, 22, 23, 24, 25, 26, 27, 28, 29,  9,  9, 12, 30,  9,  9,
+     9, 31,  9,  9,  9,  9,  9,  9,  9,  9, 32, 33, 12, 12, 12, 12,
+    12, 34, 12, 35,  9,  9,  9,  9,  9,  9,  9,  9, 36,  9,  9, 37,
+     9,  9,  9,  9,  9, 38,  9,  9, 39,  9, 40, 41,  9,  9,  9,  9,
+    12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+    12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+    12, 12, 12, 12, 12, 12, 12, 12, 12, 42, 12, 12, 12, 43, 44, 12,
+    12, 12, 12, 45, 12, 12, 12, 12, 12, 12, 46,  9,  9,  9, 47,  9,
+    12, 12, 12, 12, 48,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
@@ -16944,339 +26218,8 @@ static RE_UINT8 re_word_stage_1[] = {
      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
-    27,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
-};
-
-static RE_UINT8 re_word_stage_2[] = {
-      0,   1,   2,   3,   4,   5,   6,   7,   8,   9,  10,  11,  12,  13,  14,  15,
-     16,   1,  17,  18,  19,   1,  20,  21,  22,  23,  24,  25,  26,  27,   1,  28,
-     29,  30,  31,  31,  32,  31,  31,  31,  31,  31,  31,  31,  33,  34,  35,  31,
-     36,  37,  31,  31,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,  38,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,  39,
-      1,   1,   1,   1,  40,   1,  41,  42,  43,  44,  45,  46,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,  47,  31,  31,  31,  31,  31,  31,  31,  31,
-     31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,
-     31,  31,  31,  31,  31,  31,  31,  31,  31,   1,  48,  49,   1,  50,  51,  52,
-     53,  54,  55,  56,  57,  58,   1,  59,  60,  61,  62,  63,  64,  65,  31,  66,
-     67,  68,  69,  70,  71,  72,  73,  74,  75,  76,  77,  31,  78,  79,  80,  31,
-      1,   1,   1,  81,  82,  83,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,
-      1,   1,   1,   1,  84,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,
-     31,  31,  31,  31,   1,   1,  85,  31,  31,  31,  31,  31,  31,  31,  31,  31,
-     31,  31,  31,  31,  31,  31,  31,  31,   1,   1,  86,  87,  31,  31,  88,  89,
-      1,   1,   1,   1,   1,   1,   1,  90,   1,   1,  91,  31,  31,  31,  31,  31,
-      1,  92,  93,  31,  31,  31,  31,  31,  31,  31,  31,  31,  94,  31,  31,  31,
-     31,  95,  96,  31,  97,  98,  99, 100,  31,  31, 101,  31,  31,  31,  31,  31,
-    102, 103, 104,  31,  31,  31,  31,  31, 105, 106,  31,  31,  31,  31, 107,  31,
-     31, 108,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,
-      1,   1,   1,   1,   1,   1, 109,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1, 110, 111,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1, 112,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1, 113,  31,  31,  31,  31,
-     31,  31,  31,  31,  31,  31,  31,  31,   1,   1, 114,  31,  31,  31,  31,  31,
-     31,  39,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,
-};
-
-static RE_UINT8 re_word_stage_3[] = {
-      0,   0,   0,   1,   2,   3,   2,   4,   0,   0,   5,   6,   7,   8,   7,   8,
-      7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
-      7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   9,  10,  11,   0,
-      7,   7,   7,   7,   7,   7,   7,  12,  13,   7,  14,   7,   7,   7,   7,  15,
-      7,   7,   7,   7,   7,   7,   7,   7,  14,   7,   7,   7,   7,   7,   7,   7,
-      7,   7,   7,   2,   7,  16,   7,   7,  17,   2,   7,  18,  19,   7,   3,  20,
-      0,   4,   7,   7,   7,   7,  21,   7,   7,   7,   7,   7,   7,  22,  23,  24,
-      0,   7,   7,   7,  25,   7,   7,   7,   7,   7,   7,  10,   7,   7,   7,  26,
-      7,   7,  27,   0,   7,  28,   4,   0,   0,   0,   7,  29,   0,  30,  14,   7,
-      7,   7,   7,   7,   7,   7,  31,   2,  22,  32,  23,  33,  34,  35,  31,  36,
-     37,  32,  23,  38,  39,  40,  41,  42,  43,  14,  23,  44,  45,  46,  31,  47,
-     48,  32,  23,  44,  49,  50,  31,  51,  52,  53,  54,  21,  55,  56,  41,   0,
-     57,  58,  23,  59,  60,  61,  31,   0,  62,  58,  23,  63,  60,  64,  31,  65,
-     62,  58,   7,   7,  66,  67,  31,  68,  69,  70,   7,  71,  72,  73,  41,  74,
-      2,   7,   7,   4,  75,   1,   0,   0,  76,   7,  77,  27,  78,  79,   0,   0,
-     46,  80,   1,  81,  82,   7,  83,   2,  84,  82,   7,  83,  85,   0,   0,   0,
-      7,   7,   7,   7,   1,   7,   7,   7,   7,  27,   7,   7,  86,   7,   7,  87,
-      7,   7,   7,   7,  88,  89,   7,   7,  88,   7,   7,  90,  91,   8,   7,   7,
-      7,  91,   7,   7,   7,  25,   0,   0,   7,   0,   7,   7,   7,   7,   7,  92,
-      2,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
-      7,   7,   7,   7,   7,   7,  24,   7,   2,   4,   7,   7,   7,   7,  93,  17,
-     57,  94,   7,  94,   7,  95,  57,  96,   7,   7,   7,   7,   7,  97,   1,   0,
-     98,   1,   7,   7,   7,   7,   7,  17,   7,   7,   4,   7,   7,   7,   7,  42,
-      7,  75,  28,  28,  41,   7,  27,  94,   7,   7,  28,   7,   1,   1,   0,   0,
-      7,  28,   7,   7,   7,  75,   7,  24,   1,   1,  99,  75,   0,   0,   0,   0,
-      7,   7,   7,   7,  28,   1, 100,  95,   7,   7,   7,   7,   7,   7,   7,  95,
-      7,   7,   7, 101,  59,   7,   7,  27,  17,   7,   7,  25,   0, 102,   7,   4,
-      7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7, 103,
-      7,  92,   7,   7,  92, 104,   7,  27,   7,   7,   7, 105, 106, 107,  83, 106,
-    108,   0,   0, 109,  46, 110,   0, 111,   0,  83,   0,   0,   0,   7,   7,  46,
-    112, 113, 114,  79, 115,   0,   7,   7,  17,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  41,   7,   7,   1,   0,
-      7,   7,  75,   7,   7,  75,   7,   7,   7,   7,   7,   7,   7,   7, 116,  95,
-      7,   7,  86,   7,   7,   7, 117, 109,   7, 118, 119, 119, 119, 119,   7,   7,
-      0,   0, 109,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-    120,   0,   2, 121,   2,   7,   7,   7,   7, 122,   2,   7,   7,   7,   7,  87,
-    123,   7,   7,   2,   7,   7,   7,   7,  75,   0,   7,   4,   0,   0,   0,   7,
-      7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,  42,   0,   0,   0,   0,
-      7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   0,
-      7,   7,   7,   7,   7,   7,   7,   7,  83,   0,   0,   0,   0,   7,   7,  27,
-     83,   7,  28,   0,   7,   7,   7, 124,   7,   7,   7,   7,   7,   7,   7,  10,
-      0, 125, 126,   7,   7,   7,   7,   7, 127,   7,   7,   7, 128,   0,   0, 125,
-      7,   7, 101,   0,   7,   7,   7,  95,   7,   7,   7,   7,  42,   1,   7, 129,
-      7,   7,  27,   7,   7,  95,   7,  83,   7,   7,   7,   7, 130,   1,   7,  75,
-      7,   7,   7, 118,  27,   1,   7,  70,   7,   7,   7,   7,  20,  98,   7, 128,
-    131, 132, 119,   7,   7,  87, 101,   7,   7,   7,   7,   7,   7,   7, 133,   1,
-      7,   7,   7,   7,   7,   7,   7,   7,   7,   7,  95,   7, 134,   7,   7,  28,
-      7,   7,   7,   7,   7,   7,  27,   7,   7,   7,   7,   7,   7,   1,   0,   0,
-    118, 135,  23, 136, 137,   7,   7,   7,   7,   7,   7,  10,   0,  30,   7,   7,
-      7,   7,   7,  27,   0,   7,   7,   7,   7, 126,   7,   7, 101,   0,   0,  28,
-      7,   0,   7, 138, 139,   0,   0,  84,   7,   7,   7,   7,   7,   7,   7,  83,
-      0,   1,   2,   3,   2,   4,  41,   7,   7,   7,   7,  75, 140, 141,   0,   0,
-    142,   7,   8, 143,  27,  27,   0,   0,   7,   7,   7,   7,   7,   7,   7,   4,
-      0,   0,   0,   0,   7,   7,   7,  94,   0,   0,   0,   0,   0,   0,   0, 144,
-      0,   0,   0,   0,   0,   0,   0,   0,   7,  83,   7,   7,   7,  46,  46,   0,
-      7,   7, 139,   7,   4,   7,   7,   4,   7,  27,   7,   7, 145, 146,   0,   0,
-      7,   7,   7,   7,   7,   7,   7,   7,   7,  27,   1,   7,   7, 145,   7,  28,
-      7,   7, 101,   7,   7,   7,  95,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      7,   7,   7, 118,   7,  42, 101,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-    147,   7,   7, 148,   7,  42,   7, 118,   7,  75,   0,   0,   0,   0,   7, 149,
-      7,  42,   7,   1,   0,   0,   0,   0,   7,   7,   7, 150,   0,   0,   0,   0,
-    151, 152,   7, 153,   0,   0,   7,  83,   7,  83,   0,   0,  82,   7, 118,   0,
-      7,   7,   7,  42,   7,  42,   7,  20,   7,  10,   0,   0,   0,   0,   0,   0,
-      7,   7,   7,   7,  17,   0,   0,   0,   7,   7,   7,  20,   7,   7,   7,  20,
-      7,   7, 101,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      7,  83,  99,   7,   7,  46,   0,   0,   0,   0,   0,   0,   0,   0,   7, 118,
-      7,   7,   7,   7, 118,   0,  41, 109,   7,   7,   7,   4,   0,   7,  17,   1,
-      7,   7,   7,  84, 154,   7,   7, 155,   7,   7,   7,   7, 156, 157,   0,   0,
-      7,  14,   7, 158,   0,   0,   0,   0, 159,  18,  17,   7,   7,   7,   4,   1,
-     22,  32,  23, 160,  49, 161, 162,  94,   0,   0,   0,   0,   0,   0,   0,   0,
-      7,   7,   7,   7,   4,  21,   0,   0,   7,   7,   7,   7, 163,   1,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   7,   7,   7, 164,  46, 165,   0,   0,
-      7,   7,   7,   7, 166,   1,   0,   0,   7,   7,   7,  17,   1,   0,   0,   0,
-      7,  25,  28,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      7,   7,   7,   4,   0,   0,   0,   0,   0,   0,   7,   7,   7,   7,   1, 109,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 167,   7,   7, 167, 168,   0,
-      7,   7,   7,  75,  99,   7,   7,   7,   7, 169,   0,   0,   7,   7,   7,  17,
-     23,   7,   7,   8,  46,   1,   0, 126,   7, 126,  82, 118,   0,   0,   0,   0,
-    170,   7,   7, 171, 101,   1, 172,   7,  75, 173,   1,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   7, 118,
-      7,   7,   7,   7,   7,   7,   7,   7,   7,   1,   0,   0,   0,   0,   0,   0,
-      7,   7,   7,   7,   7,   7,  75,   0,   7,   7,   7,   7,   7,   7,   7,   7,
-      7,   7,   7,   7,  95,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      7,   7,  75,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      7,   7,   7,   7, 118,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      7,   7,   7,  17,   7,  75,   1,   0,   0,   0,   0,   0,   0,   7,  27,  94,
-      7,   7,   7, 118,  95,   1,  30, 174,   7,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   7,   7,   7,   7,   0,   0,   0,   0,   0,   0,   0,   0,
-      7,   7,   7,   7,   3,   7,   7,   7, 117,   7,   0,   0,   0,   0, 175,   0,
-      7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7, 101,
-      7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,  20,
-      7,  75,   0,   0,   0,  20, 176,   7,   7,   7,   7,   7,   7,   7,   7,   7,
-      7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,  28,
-      7,   7,   7,   7,   7,   7,   4,  83,  17, 177,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0, 178, 179, 180,   0, 181,   0,   0,   0,   0,   0,
-      0,   0,   0,   0, 182,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      7,   7,   7,   7,   7,  84,   7,   7,   7,  57, 183, 184, 185,   7,   7,   7,
-    186, 187,   7, 188, 189,  58,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
-      7,   7,   7,   7,   7,   7,   7,   7,   7,   7, 164,   7,  58,  87,   7,  87,
-      7,  84,   7,  84,  75,   7,  75,   7,  23,   7,  23,   7, 190,   7,   7,   7,
-      7,   7,   7, 134,   7,   7,  83, 191, 110, 100,   2,   0,   0,   0,   0,   0,
-      8, 127, 192,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      7,   7,  83,  27, 193,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   7,   7,   7,   1,
-      7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,  94, 118,   0,   0,
-      7,   7,   7,   7,  28,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-    185,   7, 194, 195, 196, 197, 198, 199, 103,  28, 200,  28,   0,   0,   0,   0,
-      0,   0,   0,   7,   1,   7,   1,   7,   1,   0,   0,   0,   0,   0,   0,   0,
-      7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7, 118,   0,   0,
-      7,   7,   7,  94,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
-      7,  27,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
-      7,   7,   7,   7,   7,   7,   7,   7,   7,   7,  10,   7,   7,   7,   7,   7,
-      7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,  46,   0,
-      7,  27,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-};
-
-static RE_UINT8 re_word_stage_4[] = {
-      0,   0, 255,   3, 254, 255, 255, 135, 255,   7,   0,   4,  32,   4, 255, 255,
-    127, 255, 195, 255,   3,   0,  31,  80, 223, 188,  64, 215, 251, 255, 191, 255,
-    127,   2, 255,   1, 255, 191, 182,   0,   7,   0, 255, 195, 239, 159, 255, 253,
-    255, 159, 255, 231,  63,  36, 255,  63, 255,  15, 223,  63, 248, 255, 207, 255,
-    249, 255, 197, 243, 159, 121, 128, 176,   3,  80, 238, 135, 109, 211, 135,  57,
-      2,  94, 192, 255,  63,   0, 238, 191, 237, 243, 191,  59,   1,   0,   0, 254,
-    238, 159, 159,  57, 192, 176,   2,   0, 236, 199,  61, 214,  24, 199, 199,  61,
-    129,   0, 255, 223, 253, 255, 255, 227, 223,  61,  96,   7, 239, 223, 239, 243,
-     96,  64,   6,   0, 223, 125, 240, 128,   0, 252, 236, 255, 127, 252, 251,  47,
-    127, 132,  95, 255,  12,   0, 255, 127, 214, 247, 175, 255,  95,  63, 255, 243,
-      0,   3, 160, 194, 255, 254, 255,  31, 223, 255,  64,   0, 191,  32, 255, 247,
-    255,  61, 127,  61,  61, 127,  61, 255,  63,  63, 255, 199,  31,   0,  15,   0,
-     13,   0, 143,  48,   0,  56, 128,   0,   0, 248, 255,   0, 247, 255, 255, 251,
-    255, 170, 223,  95, 220,  31, 207,  15,   0,  48,   0, 128,  16,   0,   2, 128,
-    132, 252,  47,  62,  80, 189, 224,  67,  31, 248, 255, 128, 127,   0, 127, 127,
-    224,   0,  62,  31, 127, 230, 224, 255, 247, 191, 128, 255, 252, 255, 255, 249,
-    124,   0, 255, 232,   1, 128, 126, 126, 126,   0, 255,  55, 127, 248, 248, 224,
-    127,  95, 219, 255,  24,   0,   0, 224, 252, 252, 252,  28, 255, 239, 255, 183,
-      0,  32,  15, 255,  62,   0,  63, 253, 191, 145,  55,   0, 255, 192, 111, 240,
-    239, 254,  63, 135, 112,   0,  79,   0,  31,  30, 255,  23, 255,  64, 127, 189,
-    237, 251, 129, 224, 207,  31, 191,   0,  63, 255,   0,  63,  17,   0, 255, 252,
-     27,   0, 255,  35, 127, 251, 127, 180, 191, 253, 251,   1, 255, 224,  11,   0,
-    240,   0, 255,  99, 224, 227,   7, 248, 231,  15,   0,  60,  28,   0, 100, 222,
-    255, 235, 239, 255, 191, 231, 223, 223, 255, 123,  95, 252, 247, 207,  32,   0,
-    219,   7, 255,  67, 150, 254, 247,  10, 132, 234, 150, 170, 150, 247, 247,  94,
-    238, 251,
-};
-
-/* Word: 2962 bytes. */
-
-RE_UINT32 re_get_word(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-
-    f = ch >> 12;
-    code = ch ^ (f << 12);
-    pos = (RE_UINT32)re_word_stage_1[f] << 4;
-    f = code >> 8;
-    code ^= f << 8;
-    pos = (RE_UINT32)re_word_stage_2[pos + f] << 4;
-    f = code >> 4;
-    code ^= f << 4;
-    pos = (RE_UINT32)re_word_stage_3[pos + f] << 4;
-    pos += code;
-    value = (re_word_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1;
-
-    return value;
-}
-
-/* XDigit. */
-
-static RE_UINT8 re_xdigit_stage_1[] = {
-    0, 1, 1, 1, 1, 2, 1, 3, 4, 1, 1, 5, 1, 1, 6, 7,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1,
-};
-
-static RE_UINT8 re_xdigit_stage_2[] = {
-     0,  1,  1,  2,  3,  4,  4,  5,  6,  1,  1,  7,  8,  9, 10,  1,
-     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
-     1,  1,  1, 11, 12, 13,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
-     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1, 14,
-     1,  1, 15,  1,  1,  1, 16,  1, 17, 18, 19, 20, 21,  1, 22,  1,
-     1,  1,  1,  1,  1, 23,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
-     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1, 24,  1,  1,  1,  1,
-    25, 18,  1,  1, 26,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
-};
-
-static RE_UINT8 re_xdigit_stage_3[] = {
-     0,  1,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
-     2,  3,  2,  0,  2,  2,  2,  4,  2,  2,  2,  2,  2,  5,  2,  5,
-     2,  5,  2,  5,  2,  5,  2,  5,  2,  6,  2,  6,  3,  2,  2,  2,
-     2,  4,  6,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  3,
-     6,  2,  2,  2,  2,  7,  2,  6,  2,  2,  8,  2,  2,  6,  0,  2,
-     2,  8,  2,  2,  2,  2,  2,  2,  3,  2,  2,  2,  2,  2,  2,  2,
-     2,  2,  2,  6,  4,  2,  2,  9,  2,  6,  2,  2,  2,  2,  2,  0,
-     2,  2,  2,  2, 10, 11,  2,  2,  2,  2,  3,  2,  2,  2,  2,  2,
-     2,  2,  2,  2,  0,  2,  2,  2,  2,  5,  2,  0, 12,  2,  2,  6,
-     2,  2,  2,  0,  2,  2,  2,  2,  2,  6,  2,  6,  2,  2,  2,  2,
-     2,  6,  2,  4,  0,  2,  2,  2,  2,  2,  2,  3,  2,  2,  2,  2,
-     2,  6,  2,  2,  2,  6,  3,  2,  2,  3,  2,  2,  2,  6,  2,  2,
-     2,  2,  2,  2,  2,  2,  2, 13,  2,  2,  2,  2,  2,  4,  2,  2,
-     2,  2,  2,  2,  2,  6,  2,  2,
-};
-
-static RE_UINT8 re_xdigit_stage_4[] = {
-      0,   0,   0,   0,   0,   0, 255,   3, 126,   0,   0,   0, 126,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 255,   3,   0,   0,
-    255,   3,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 192, 255,   0,   0,
-      0,   0, 255,   3,   0,   0,   0,   0, 192, 255,   0,   0,   0,   0,   0,   0,
-    255,   3, 255,   3,   0,   0,   0,   0,   0,   0, 255,   3,   0,   0, 255,   3,
-      0,   0, 255,   3, 126,   0,   0,   0, 126,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0, 192, 255,   0, 192, 255, 255, 255, 255, 255, 255,
-};
-
-/* XDigit: 592 bytes. */
-
-RE_UINT32 re_get_xdigit(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-
-    f = ch >> 13;
-    code = ch ^ (f << 13);
-    pos = (RE_UINT32)re_xdigit_stage_1[f] << 4;
-    f = code >> 9;
-    code ^= f << 9;
-    pos = (RE_UINT32)re_xdigit_stage_2[pos + f] << 3;
-    f = code >> 6;
-    code ^= f << 6;
-    pos = (RE_UINT32)re_xdigit_stage_3[pos + f] << 6;
-    pos += code;
-    value = (re_xdigit_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1;
-
-    return value;
-}
-
-/* Posix_Digit. */
-
-static RE_UINT8 re_posix_digit_stage_1[] = {
-    0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1,
-};
-
-static RE_UINT8 re_posix_digit_stage_2[] = {
-    0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-};
-
-static RE_UINT8 re_posix_digit_stage_3[] = {
-    0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-};
-
-static RE_UINT8 re_posix_digit_stage_4[] = {
-      0,   0,   0,   0,   0,   0, 255,   3,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-};
-
-/* Posix_Digit: 130 bytes. */
-
-RE_UINT32 re_get_posix_digit(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-
-    f = ch >> 15;
-    code = ch ^ (f << 15);
-    pos = (RE_UINT32)re_posix_digit_stage_1[f] << 4;
-    f = code >> 11;
-    code ^= f << 11;
-    pos = (RE_UINT32)re_posix_digit_stage_2[pos + f] << 4;
-    f = code >> 7;
-    code ^= f << 7;
-    pos = (RE_UINT32)re_posix_digit_stage_3[pos + f] << 7;
-    pos += code;
-    value = (re_posix_digit_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1;
-
-    return value;
-}
-
-/* Posix_AlNum. */
-
-static RE_UINT8 re_posix_alnum_stage_1[] = {
-     0,  1,  2,  3,  4,  5,  5,  5,  5,  6,  7,  5,  5,  8,  9, 10,
-    11, 12, 13, 14, 15,  9, 16,  5, 17,  9,  9, 18,  9, 19, 20, 21,
-     5,  5,  5,  5,  5,  5,  5,  5,  5,  5, 22, 23, 24,  5, 25, 26,
      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
@@ -17291,1529 +26234,1580 @@ static RE_UINT8 re_posix_alnum_stage_1[] = {
      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9
 };
 
-static RE_UINT8 re_posix_alnum_stage_2[] = {
-      0,   1,   2,   3,   4,   5,   6,   7,   8,   9,  10,  11,  12,  13,  14,  15,
-     16,   1,  17,  18,  19,   1,  20,  21,  22,  23,  24,  25,  26,  27,   1,  28,
-     29,  30,  31,  31,  32,  31,  31,  31,  31,  31,  31,  31,  33,  34,  35,  31,
-     36,  37,  31,  31,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,  38,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,  39,
-      1,   1,   1,   1,  40,   1,  41,  42,  43,  44,  45,  46,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,  47,  31,  31,  31,  31,  31,  31,  31,  31,
-     31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,
-     31,  31,  31,  31,  31,  31,  31,  31,  31,   1,  48,  49,   1,  50,  51,  52,
-     53,  54,  55,  56,  57,  58,   1,  59,  60,  61,  62,  63,  64,  65,  31,  66,
-     67,  68,  69,  70,  71,  72,  73,  74,  75,  76,  77,  31,  78,  79,  80,  31,
-      1,   1,   1,  81,  82,  83,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,
-      1,   1,   1,   1,  84,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,
-     31,  31,  31,  31,   1,   1,  85,  31,  31,  31,  31,  31,  31,  31,  31,  31,
-     31,  31,  31,  31,  31,  31,  31,  31,   1,   1,  86,  87,  31,  31,  88,  89,
-      1,   1,   1,   1,   1,   1,   1,  90,   1,   1,  91,  31,  31,  31,  31,  31,
-      1,  92,  93,  31,  31,  31,  31,  31,  31,  31,  31,  31,  94,  31,  31,  31,
-     31,  31,  31,  31,  95,  96,  97,  98,  31,  31,  31,  31,  31,  31,  31,  31,
-     99, 100, 101,  31,  31,  31,  31,  31, 102, 103,  31,  31,  31,  31, 104,  31,
-     31, 105,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,
-      1,   1,   1,   1,   1,   1, 106,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1, 107, 108,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1, 109,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1, 110,  31,  31,  31,  31,
-     31,  31,  31,  31,  31,  31,  31,  31,   1,   1, 111,  31,  31,  31,  31,  31,
-};
-
-static RE_UINT8 re_posix_alnum_stage_3[] = {
-      0,   1,   2,   2,   0,   3,   4,   4,   5,   5,   5,   5,   5,   5,   5,   5,
-      5,   5,   5,   5,   5,   5,   6,   7,   0,   0,   8,   9,  10,  11,   5,  12,
-      5,   5,   5,   5,  13,   5,   5,   5,   5,  14,  15,   5,  16,  17,  18,  19,
-     20,   5,  21,  22,   5,   5,  23,  24,  25,   5,  26,   5,   5,  27,  28,  29,
-     30,  31,  32,  33,   0,  34,  35,  36,   5,  37,  38,  39,  40,  41,  42,  43,
-     44,  45,  46,  47,  48,  49,  50,  51,  52,  49,  53,  54,  55,  56,  57,   0,
-     58,  59,  60,  61,  58,  62,  63,  64,  58,  65,  66,  67,  68,  69,  70,  71,
-     72,  73,  74,   0,  75,  76,  77,   0,  78,   0,  79,  80,  81,  82,   0,   0,
-      5,  83,  25,   5,  84,   5,  85,  86,   5,   5,  87,   5,  88,  89,  90,   5,
-     91,   5,  73,   0,  92,   5,   5,  93,  72,   5,   5,   5,   5,   5,   5,   5,
-      5,   5,   5,  94,   2,   5,   5,  95,  96,  97,  97,  98,   5,  99, 100,   0,
-      0,   5,   5,  32,   5, 101,   5, 102, 103, 104,  25, 105,   5, 106, 107,   0,
-    108,   5, 103, 109,   0, 110,   0,   0,   5, 111, 112,   0,   5, 113,   5, 114,
-      5, 115, 116, 117, 118,  65,   0, 119,   5,   5,   5,   5,   5,   5,   0, 120,
-     93,   5, 121, 117,   5, 122, 123, 124,   0,   0,   0, 125, 126,   0,   0,   0,
-    127, 128, 129,   5,  16,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0, 130,   5, 107,   5, 131, 103,   5,   5,   5,   5, 132,
-      5,  85,   5, 133, 115, 134, 134,   5,   0, 135,   0,   0,   0,   0,   0,   0,
-    136, 137,  72,   5, 138,  72,   5,  86, 139,  14,   5,   5, 140,  73,   0,  25,
-      5,   5,   5,   5,   5, 102,   0,   0,   5,   5,   5,   5,   5,   5,   5,  92,
-      5,   5,   5,   5,  31,   0,  25, 117, 141, 142,   5, 143,   5,   5,   5,  92,
-    144, 145,   5,   5, 146,   5, 147, 144, 148, 149,   5,  97,   5,   5, 150, 151,
-     28, 101, 152,  82,   5, 153, 135, 154,   5, 115, 155, 156,   5, 103, 157, 158,
-    159, 160,  86, 161,   5,   5,   5,  33,   5,   5,   5,   5,   5, 162, 163, 108,
-      5,   5,   5, 164,   5,   5, 165,   0, 166, 167, 168,   5,   5,  27, 169,   5,
-      5, 117,  25,   5, 170,   5, 149, 171,   0,   0,   0, 172,   5,   5,   5,  82,
-      0,   2,   2, 173,   5, 103, 174,   0, 175, 176, 177,   0,   5,   5,   5,  73,
-      0,   0,   5, 178,   0,   0,   0,   0,   0,   0,   0,   0,  82,   5, 179,   0,
-      5,  26, 101,  73, 117,   5, 180,   0,   5,   5,   5,   5, 117,  25, 181, 108,
-      5, 161,   5,  61,   0,   0,   0,   0,   5, 115, 102, 149,   0,   0,   0,   0,
-    182, 183, 102, 115, 103,   0,   0, 184, 102, 165,   0,   0,   5, 185,   0,   0,
-    186, 102,   0,  82,  82,   0,  79, 187,   5, 102, 102, 152,  27,   0,   0,   0,
-      5,   5,  16,   0,   5, 152,   5, 152,   5, 149,   0,   0,   0,   0,   0,   0,
-     82, 188, 189,   0,   0,   0,   0, 115,   5,   5, 189,   0, 145,  32,  25,  16,
-      5, 152, 190, 191,   5,   5, 192,   0, 193, 194,   0,   0, 195, 118,   5,  16,
-     40,  49, 196,  61,   0,   0,   0,   0,   5,   5, 197,   0,   5,   5, 198,   0,
-      0,   0,   0,   0,   5, 199, 200,   0,   5, 103, 201,   0,   5, 202,   0,   0,
-     65,  33,   0,   0,   0,   0,   0,   0,   5,  32,   0,   0,   0,   5,   5, 203,
-      0,   0,   0,   0,   0, 204,  30, 205,   5, 206,  25,   5, 207,   0,   5,  32,
-    208, 209,  78, 210, 170, 211,   0,   0, 212, 213, 214, 215, 216,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0, 115,   5,   5,   5,   5, 165,   0,   0,   0,
-      5,   5,   5, 140,   5,   5,   5,   5,   5,   5,  61,   0,   0,   0,   0,   0,
-      5, 140,   0,   0,   0,   0,   0,   0,   5,   5, 217,   0,   0,   0,   0,   0,
-      5,  32, 103,   0,   0,   0,  25, 155,   5,  92,  61, 218,  92,   0,   0,   0,
-      0,   0,   5,   5,   0,   0,   0,   0,   5,   5, 219,   5, 220,   0,   0, 221,
-      5,   5,   5,   5,   5,   5,   5, 222,   5,   5,   5,   5,   5,   5,   5, 152,
-    103,   0, 223, 224,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5, 108,
-      5,   5,   5, 225, 226,   0,   0,   0,   5,   5, 227,   5, 228, 229, 230,   5,
-    231, 232, 233,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5, 234, 235,  86,
-    227, 227, 131, 131, 208, 208, 236,   0, 237, 238,   0,   0,   0,   0,   0,   0,
-      5, 239, 240,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   5, 241,
-      5,   5,   5,   5,   5,   5, 187,   0,   5,   5, 242,   0,   0,   0,   0,   0,
-    230, 243, 244, 245, 246, 247,   0,   0,   0,  25, 248, 248, 107,   0,   0,   0,
-      5,   5,   5,   5,   5,   5, 115,   0,   5, 178,   5,   5,   5,   5,   5,   5,
-    117,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5, 249,   5,   5,
-      5,   5,   5,   5,   5,   5,   5,  78, 117,   0,   0,   0,   0,   0,   0,   0,
-};
-
-static RE_UINT8 re_posix_alnum_stage_4[] = {
-      0,   0,   0,   0,   0,   0, 255,   3, 254, 255, 255,   7,   0,   4,  32,   4,
-    255, 255, 127, 255, 255, 255, 255, 255, 195, 255,   3,   0,  31,  80,   0,   0,
-     32,   0,   0,   0,   0,   0, 223, 188,  64, 215, 255, 255, 251, 255, 255, 255,
-    255, 255, 191, 255,   3, 252, 255, 255, 255, 255, 254, 255, 255, 255, 127,   2,
-    255,   1,   0,   0,   0,   0, 255, 191, 182,   0, 255, 255, 255, 135,   7,   0,
-      0,   0, 255,   7, 255, 255, 255, 254,   0, 192, 255, 255, 255, 255, 239,  31,
-    254, 225,   0, 156,   0,   0, 255, 255,   0, 224, 255, 255, 255, 255,   3,   0,
-      0, 252, 255, 255, 255,   7,  48,   4, 255, 255, 255, 252, 255,  31,   0,   0,
-    255, 255, 255,   1, 255,   7,   0,   0, 255, 255, 223,  63,   0,   0, 240, 255,
-    248,   3, 255, 255, 255, 255, 255, 239, 255, 223, 225, 255,  15,   0, 254, 255,
-    239, 159, 249, 255, 255, 253, 197, 227, 159,  89, 128, 176,  15,   0,   3,  16,
-    238, 135, 249, 255, 255, 253, 109, 195, 135,  25,   2,  94,   0,   0,  63,   0,
-    238, 191, 251, 255, 255, 253, 237, 227, 191,  27,   1,   0,  15,   0,   0,  30,
-    238, 159, 249, 255, 159,  25, 192, 176,  15,   0,   2,   0, 236, 199,  61, 214,
-     24, 199, 255, 195, 199,  29, 129,   0, 239, 223, 253, 255, 255, 253, 255, 227,
-    223,  29,  96,   7,  15,   0,   0,   0, 255, 253, 239, 227, 223,  29,  96,  64,
-     15,   0,   6,   0, 255, 255, 255, 231, 223,  93, 240, 128,  15,   0,   0, 252,
-    236, 255, 127, 252, 255, 255, 251,  47, 127, 128,  95, 255,   0,   0,  12,   0,
-    254, 255, 255, 255, 255, 255, 255,   7, 127,  32,   0,   0, 214, 247, 255, 255,
-    175, 255, 255,  59,  95,  32,   0, 240,   1,   0,   0,   0, 255, 254, 255, 255,
-    255,  31, 254, 255,   3, 255, 255, 254, 255, 255, 255,  31, 255, 255, 127, 249,
-    255, 255,   0,  60, 191,  32, 255, 255, 255, 255, 255, 247, 255,  61, 127,  61,
-    255,  61, 255, 255, 255, 255,  61, 127,  61, 255, 127, 255, 255, 255,  61, 255,
-    255, 255,   0,   0, 255, 255,  63,  63, 255, 159, 255, 255, 255, 199, 255,   1,
-    255, 223,  15,   0, 255, 255,  15,   0, 255, 223,  13,   0, 255, 255, 207, 255,
-    255,   1, 128,  16, 255,   7, 255, 255, 255, 255,  63,   0, 255, 255, 255, 127,
-    255,  15, 255,   1, 255,  63,  31,   0, 255,  15, 255, 255, 255,   3,   0,   0,
-    255, 255, 255,  15, 254, 255,  31,   0, 128,   0,   0,   0, 255, 255, 239, 255,
-    239,  15,   0,   0, 255, 243,   0, 252, 191, 255,   3,   0, 255, 255, 127,   0,
-      0, 224,   0, 252, 255, 255, 255,  63, 255,   1, 255, 255,   0, 222, 111,   4,
-    128, 255,  31,   0,  63,  63, 255, 170, 255, 255, 223,  95, 220,  31, 207,  15,
-    255,  31, 220,  31,   0,   0,   2, 128,   0,   0, 255,  31, 132, 252,  47,  62,
-     80, 189, 255, 243, 224,  67,   0,   0,   0,   0, 192, 255, 255, 127, 255, 255,
-     31, 120,  12,   0, 255, 128,   0,   0, 127, 127, 127, 127,   0, 128,   0,   0,
-    224,   0,   0,   0, 254,   3,  62,  31, 255, 255, 127, 224, 224, 255, 255, 255,
-    255, 127,   0,   0, 255,  31, 255, 255,   0,  12,   0,   0, 255, 127, 240, 143,
-      0,   0, 128, 255, 252, 255, 255, 255, 255, 249, 255, 255, 124,   0,   0,   0,
-    191, 255, 255, 255, 255,   0,   0,   0,  47,   0,   0,   0,   0,   0, 252, 232,
-    255, 255,   7,   0, 255, 255, 247, 255, 255, 255,   0, 124, 255,  63,   0,   0,
-    255, 255, 127, 252,   5,   0,   0,  56, 255, 255,  60,   0, 126, 126, 126,   0,
-    127, 127, 255, 255, 255,   0, 255, 255,  15,   0, 255, 255, 127, 248, 255, 255,
-    255,  63, 255, 255, 255, 255, 255,   3, 127,   0, 248, 224, 255, 253, 127,  95,
-    219, 255, 255, 255,   0,   0, 248, 255, 255, 255, 252, 255,   0,   0, 255,  15,
-      0,   0, 223, 255, 192, 255, 255, 255, 252, 252, 252,  28, 255, 239, 255, 255,
-    127, 255, 255, 183, 255,  63, 255,  63, 255, 255,  31,   0, 255, 255,   1,   0,
-     15, 255,  62,   0, 255, 255,  15, 255,  63, 253, 255, 255, 255, 255, 191, 145,
-    255, 255,  55,   0, 255, 255, 255, 192, 111, 240, 239, 254,  31,   0,   0,   0,
-    128,   0, 255, 255,  63,   0,   0,   0, 112,   0, 255, 255, 255, 255,  71,   0,
-     30,   0,   0,  20, 255, 255, 251, 255, 255, 255, 159,  64, 127, 189, 255, 191,
-    159,  25, 129, 224, 187,   7,   0, 128, 179,   0,   0,   0, 255, 255,  63, 127,
-      0,   0,   0,  63,  17,   0,   0,   0, 255, 255,  63,   1,   0,   0,   0, 128,
-    255, 252, 255, 255,  26,   0,   0,   0, 255, 255, 231, 127, 255, 255, 255,  32,
-    255, 253, 255, 255, 255, 255, 127, 127,   0,   0, 252, 255, 255, 254, 127,   0,
-    127, 251, 255, 255, 255, 255, 127, 180, 203,   0,   0,   0, 191, 253, 255, 255,
-    255, 127, 123,   1, 127,   0,   0,   0, 248, 255, 255, 224, 255, 135, 255, 255,
-    255, 128, 255, 255,  11,   0,   0,   0, 255, 255, 255,   0,   0,   0,   7,   0,
-    240,   0, 255, 255, 255,   7, 255,  31, 255,   1, 255,  67, 255, 255, 223, 255,
-    255, 255, 255, 223, 100, 222, 255, 235, 239, 255, 255, 255, 191, 231, 223, 223,
-    255, 255, 255, 123,  95, 252, 253, 255,  63, 255, 255, 255, 253, 255, 255, 247,
-    247,  15,   0,   0, 127, 255, 255, 249, 219,   7,   0,   0, 255,  31, 128,  63,
-      0,  64,   0,   0, 255,  15,   0,   0, 143,   8,   0,   0, 150, 254, 247,  10,
-    132, 234, 150, 170, 150, 247, 247,  94, 255, 251, 255,  15, 238, 251, 255,  15,
-    255,   3, 255, 255,   3,   0, 255, 255,
-};
-
-/* Posix_AlNum: 2600 bytes. */
-
-RE_UINT32 re_get_posix_alnum(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-
-    f = ch >> 12;
-    code = ch ^ (f << 12);
-    pos = (RE_UINT32)re_posix_alnum_stage_1[f] << 4;
-    f = code >> 8;
-    code ^= f << 8;
-    pos = (RE_UINT32)re_posix_alnum_stage_2[pos + f] << 3;
-    f = code >> 5;
-    code ^= f << 5;
-    pos = (RE_UINT32)re_posix_alnum_stage_3[pos + f] << 5;
-    pos += code;
-    value = (re_posix_alnum_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1;
-
-    return value;
-}
-
-/* Posix_Punct. */
-
-static RE_UINT8 re_posix_punct_stage_1[] = {
-     0,  1,  2,  3,  3,  4,  3,  5,  6,  7,  3,  8,  3,  9, 10, 11,
-     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
-     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
-     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
-     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
-     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
-     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
-     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
-     3,  3,  3,  3,  3,  3,  3,  3,
-};
-
-static RE_UINT8 re_posix_punct_stage_2[] = {
-     0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15,
-    16,  1,  1, 17, 18,  1, 19, 20, 21, 22, 23, 24, 25,  1,  1, 26,
-    27, 28, 29, 29, 30, 29, 29, 31, 29, 29, 29, 32, 33, 34, 35, 36,
-    37, 38, 39, 29,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
-     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1, 40,  1,  1,
-     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
-     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
-     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
-     1,  1,  1,  1, 41,  1, 42, 43, 44, 45, 46, 47,  1,  1,  1,  1,
-     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
-     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
-     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1, 48,  1, 49, 50, 51,
-     1, 52,  1, 53,  1, 54,  1,  1, 55, 56, 57, 58,  1,  1,  1, 59,
-    60, 61, 62,  1, 63, 64, 65, 66, 67, 68, 69,  1, 70,  1, 71, 72,
-     1,  1,  1,  1, 73,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
-     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
-     1,  1,  1,  1,  1,  1,  1,  1,  1,  1, 74, 75,  1,  1, 76, 68,
-     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
-     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
-     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1, 77,  1,  1,  1,
-     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
-    78, 79, 80, 81,  1,  1, 82, 83, 29, 29, 84,  1,  1,  1,  1,  1,
-     1, 85, 86,  1,  1,  1,  1,  1,  1, 87,  1,  1, 88, 89, 90,  1,
-    91, 92, 93, 29, 29, 29, 94, 95, 96, 97, 98,  1,  1,  1,  1,  1,
-};
-
-static RE_UINT8 re_posix_punct_stage_3[] = {
-      0,   1,   2,   3,   0,   4,   5,   5,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   6,   7,   0,   0,   0,   8,   9,   0,   0,  10,
-      0,   0,   0,   0,  11,   0,   0,   0,   0,   0,  12,   0,  13,  14,  15,  16,
-     17,   0,   0,  18,   0,   0,  19,  20,  21,   0,   0,   0,   0,   0,   0,  22,
-      0,  23,  14,   0,   0,   0,   0,   0,   0,   0,   0,  24,   0,   0,   0,  25,
-      0,   0,   0,  10,   0,   0,   0,  26,   0,   0,   0,  27,   0,   0,   0,  28,
-      0,   0,   0,  29,  30,   0,   0,   0,   0,   0,  31,  32,   0,   0,   0,  33,
-      0,  34,  35,   0,   0,   0,   0,   0,  36,  37,   0,   0,  38,  39,  40,   0,
-      0,   0,  41,   0,  39,   0,   0,  42,   0,   0,   0,  43,  44,   0,   0,   0,
-     45,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  46,  47,   0,   0,  48,
-      0,  49,   0,   0,   0,   0,  50,   0,  51,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,  52,   0,   0,   0,  39,  53,  39,   0,   0,   0,   0,  54,   0,   0,
-      0,   0,  12,  55,   0,   0,   0,  56,   0,  57,   0,  39,   0,   0,  58,   0,
-      0,   0,   0,   0,   0,  59,  60,  61,  62,  63,  64,  65,  66,  53,   0,   0,
-     67,  68,  69,   0,  70,  53,  53,  53,  53,  53,  53,  53,  53,  53,  53,  53,
-     53,  71,  51,   0,  56,  72,   0,   0,  53,  53,  53,  72,  73,  53,  53,  53,
-     53,  53,  53,  74,  75,  53,  53,  53,   0,   0,   0,   0,   0,   0,   0,  76,
-      0,   0,   0,  27,   0,   0,   0,   0,  53,  77,  78,   0,  79,  53,  53,  80,
-     53,  53,  53,  53,  53,  53,  72,  81,  82,  83,   0,   0,  47,  45,   0,  42,
-      0,   0,   0,   0,  84,   0,  53,  85,  64,  86,  87,  53,  86,  88,  53,  53,
-      0,   0,   0,   0,   0,   0,  53,  53,   0,   0,   0,   0,  62,  53,  71,  39,
-     89,   0,   0,  90,   0,   0,   0,  91,  92,  93,   0,   0,  94,   0,   0,   0,
-      0,  95,   0,  96,   0,   0,  97,  98,   0,  97,  34,   0,   0,   0,  99,   0,
-      0,   0,  56, 100,   0,   0,  39,  26,   0,   0,  42,   0,   0,   0,   0, 101,
-      0, 102,   0,   0,   0, 103,  93,   0,   0,  39,   0,   0,   0,   0,   0, 104,
-     44,  62, 105, 106,   0,   0,   0,   0,   1,   2,   2, 107,   0,   0,   0, 108,
-    109, 110,   0, 111, 112,  45,  62, 113,   0,   0,   0,   0,  34,   0,  27,   0,
-      0,   0,   0,  31,   0,   0,   0,   0,   0,   0,   5, 114,   0,   0,   0,   0,
-     34,  34,   0,   0,   0,   0,   0,   0,   0,   0, 115,  34,   0,   0, 116, 117,
-      0, 111,   0,   0, 118,   0,   0,   0,   0,   0, 119,   0,   0,   0,   0,   0,
-      0,   0, 120,   0,   0, 121,  93,   0,   0,   0,  85, 122,   0,   0, 123,   0,
-      0, 124,   0,   0,   0, 102,   0,   0,   0,   0, 125,   0,   0,   0, 126,   0,
-      0,   0,   0,   0,   0,   0, 127,   0,   0,   0, 128, 129,   0,   0,   0,   0,
-      0,  56,   0,   0,   0,   0,   0,   0,   0,  42,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,  11,   0,  34,  71,   0, 130, 109,   0,   0,
-      0,   0, 131,  26,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 114,
-      0,   0,   0,   0,   0,   0, 132, 133,   0,   0,   0, 134,   0,   0,   0,   0,
-      0,   0,   0,  97,   0,   0,   0, 135,   0, 110, 136,   0,   0,   0,   0,   0,
-      0,   0,   0,   0, 137,   0,   0,   0,   0,   0,   0,   0, 138,   0,   0,   0,
-     53,  53,  53,  53,  53,  53,  53,  72,  53, 139,  53, 140, 141, 142,  53,  43,
-     53,  53, 143,   0,   0,   0,   0,   0,  53,  53,  92,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0, 144,  42, 135, 135,  31,  31, 102, 102, 145,   0,
-      0, 137,   0, 146, 147,   0,   0,   0,   0,   0,  31,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,  34,   0,   0,  39,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0, 148,   0,   0,   0, 149,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,  26,  53, 150,  53,  53,  80, 151, 152,  72,
-     62,  78,  41, 153,  86, 129,   0, 154, 155, 156, 157, 107,   0,   0,   0,   0,
-     53,  53,  53,  53,  53,  53,  72, 158,  53,  53,  53,  80,  53,  53, 159, 160,
-    150,  53, 161,  53,  63,  21,   0,   0, 162,  53,  53, 163,  53, 164, 165,  53,
-     53,  53,  80, 166, 167,   0,   0,   0,
-};
-
-static RE_UINT8 re_posix_punct_stage_4[] = {
-      0,   0,   0,   0, 254, 255,   0, 252,   1,   0,   0, 248,   1,   0,   0, 120,
-    254, 219, 211, 137,   0,   0, 128,   0,  60,   0, 252, 255, 224, 175, 255, 255,
-      0,   0,  32,  64, 176,   0,   0,   0,   0,   0,  64,   0,   4,   0,   0,   0,
-      0,   0,   0, 252,   0, 230,   0,   0,   0,   0,   0,  64,  73,   0,   0,   0,
-      0,   0,  24,   0, 192, 255,   0, 200,   0,  60,   0,   0,   0,   0,  16,  64,
-      0,   2,   0,  96, 255,  63,   0,   0,   0,   0, 192, 195,   0,   0, 255, 127,
-     48,   0,   1,   0,   0,   0,  12,  44,   0,   0,   3,   0,   0,   0,   1,   0,
-      0,   0, 248,   7,   0,   0, 128, 128,  16,   0,   0,   0,   0, 128,   0,   0,
-      0,   0,   0,   2,   0,   0,  16,   0,   0,   0,   0, 128,   0, 128,   0,  12,
-    254, 255, 255, 252,   0,   0,  80,  61,  32,   0,   0,   0,   0,   0,   0, 192,
-    191, 223, 255,   7,   0, 252,   0,   0,   0,   0,   0,   8, 255,   1,   0,   0,
-      0,   0, 255,   3,   1,   0,   0,   0,   0,  96,   0,   0,   0,   0,   0,  24,
-      0,  56,   0,   0,   0,   0,  96,   0,   0,   0, 112,  15, 255,   7,   0,   0,
-     49,   0,   0,   0, 255, 255, 255, 255, 127,  63,   0,   0, 255,   7, 240,  31,
-      0,   0,   0, 240,   0,   0,   0, 248, 255,   0,   8,   0,   0,   0,   0, 160,
-      3, 224,   0, 224,   0, 224,   0,  96,   0,   0, 255, 255, 255,   0, 255, 255,
-    255, 255, 255, 127,   0,   0,   0, 124,   0, 124,   0,   0, 123,   3, 208, 193,
-    175,  66,   0,  12,  31, 188,   0,   0,   0,  12, 255, 255, 127,   0,   0,   0,
-    255, 255,  63,   0,   0,   0, 240, 255, 255, 255, 207, 255, 255, 255,  63, 255,
-    224,   7,   0, 222, 255, 127, 255, 255, 255, 255,   0,   0, 255, 255, 255, 251,
-    255, 255,  15,   0,   0,   0, 255,  15,  30, 255, 255, 255,   1,   0, 193, 224,
-      0,   0, 195, 255,  15,   0,   0,   0,   0, 252, 255, 255, 255,   0,   1,   0,
-    255, 255,   1,   0,   0, 224,   0,   0,   0,   0,   8,  64,   0,   0, 252,   0,
-    255, 255, 127,   0,   3,   0,   0,   0,   0,   6,   0,   0,   0,  15, 192,   3,
-      0,   0, 240,   0,   0, 192,   0,   0,   0,   0,   0,  23, 254,  63,   0, 192,
-      0,   0, 128,   3,   0,   8,   0,   0,   0,   2,   0,   0,   0,   0, 252, 255,
-      0,   0,   0,  48, 255, 255, 247, 255, 127,  15,   0,   0,  63,   0,   0,   0,
-    127, 127,   0,  48,   7,   0,   0,   0,   0,   0, 128, 255,   0,   0,   0, 254,
-    255, 115, 255,  15, 255, 255, 255,  31,   0,   0, 128,   1,   0,   0, 255,   1,
-      0,   1,   0,   0,   0,   0, 127,   0,   0,   0,   0,  30,   0,   0, 224,   3,
-    128,  63,   0,   0,   0,   0,   0, 216,   0,   0,  48,   0, 224,  33,   0, 232,
-      0,   0,   0,  63,   0, 248,   0,  40,  64,   0,   0,   0, 254, 255, 255,   0,
-     14,   0,   0,   0, 255,  31,   0,   0,   0,   0,   0, 220,  62,   0,   0,   0,
-      0,   0, 224, 255, 255, 255,   3, 128,   0,   0,  31,   0,   0,   0,  32,   0,
-     48,   0,   0,   0,   0,   0, 128,   7,   0,   0,   0, 144, 127, 254, 255, 255,
-     31,  28,   0,   0,  24, 240, 255, 255, 255, 195, 255, 255,  35,   0,   0,   0,
-      2,   0,   0,   8,   8,   0,   0,   0,   0, 224, 223, 255, 239,  15,   0,   0,
-      0,  16,   1,   0,   0,  64,   0,   0, 255,  15, 255, 255, 255, 127, 254, 255,
-    254, 255, 254, 255,   0,  28,   0,   0, 192, 255, 255, 255,   7,   0, 255, 255,
-    255, 255, 255,  15, 255,   1,   3,   0, 255,  31, 255,   7, 255, 255, 255,   1,
-    255,  15,   0,   0, 255,   0, 255,   3, 255, 239, 255, 255, 255, 255, 123, 252,
-    231, 199, 255, 255, 255, 231, 255, 255, 255,  63,  15,   7,   7,   0,  63,   0,
-};
-
-/* Posix_Punct: 1984 bytes. */
-
-RE_UINT32 re_get_posix_punct(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-
-    f = ch >> 13;
-    code = ch ^ (f << 13);
-    pos = (RE_UINT32)re_posix_punct_stage_1[f] << 5;
-    f = code >> 8;
-    code ^= f << 8;
-    pos = (RE_UINT32)re_posix_punct_stage_2[pos + f] << 3;
-    f = code >> 5;
-    code ^= f << 5;
-    pos = (RE_UINT32)re_posix_punct_stage_3[pos + f] << 5;
-    pos += code;
-    value = (re_posix_punct_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1;
-
-    return value;
-}
-
-/* Posix_XDigit. */
-
-static RE_UINT8 re_posix_xdigit_stage_1[] = {
-    0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1,
-};
-
-static RE_UINT8 re_posix_xdigit_stage_2[] = {
-    0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-};
-
-static RE_UINT8 re_posix_xdigit_stage_3[] = {
-    0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-};
-
-static RE_UINT8 re_posix_xdigit_stage_4[] = {
-      0,   0,   0,   0,   0,   0, 255,   3, 126,   0,   0,   0, 126,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-};
-
-/* Posix_XDigit: 130 bytes. */
-
-RE_UINT32 re_get_posix_xdigit(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-
-    f = ch >> 15;
-    code = ch ^ (f << 15);
-    pos = (RE_UINT32)re_posix_xdigit_stage_1[f] << 4;
-    f = code >> 11;
-    code ^= f << 11;
-    pos = (RE_UINT32)re_posix_xdigit_stage_2[pos + f] << 4;
-    f = code >> 7;
-    code ^= f << 7;
-    pos = (RE_UINT32)re_posix_xdigit_stage_3[pos + f] << 7;
-    pos += code;
-    value = (re_posix_xdigit_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1;
-
-    return value;
-}
-
-/* All_Cases. */
-
-static RE_UINT8 re_all_cases_stage_1[] = {
-    0, 1, 2, 2, 2, 3, 2, 4, 5, 2, 2, 6, 2, 2, 2, 7,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2,
-};
-
-static RE_UINT8 re_all_cases_stage_2[] = {
-     0,  1,  2,  3,  4,  5,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,
-     7,  6,  6,  8,  6,  6,  6,  6,  6,  6,  6,  6,  9, 10, 11, 12,
-     6, 13,  6,  6, 14,  6,  6,  6,  6,  6,  6,  6, 15, 16,  6,  6,
-     6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,
-     6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,
-     6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,
-     6,  6,  6,  6,  6,  6, 17, 18,  6,  6,  6, 19,  6,  6,  6,  6,
-     6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,
-     6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,
-     6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6, 20,  6,  6,  6, 21,
-     6,  6,  6,  6, 22,  6,  6,  6,  6,  6,  6,  6, 23,  6,  6,  6,
-     6,  6,  6,  6,  6,  6,  6,  6, 24,  6,  6,  6,  6,  6,  6,  6,
-     6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6, 25,  6,
-     6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,
-     6,  6,  6,  6,  6,  6,  6,  6,  6, 26,  6,  6,  6,  6,  6,  6,
-     6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,
-};
-
-static RE_UINT8 re_all_cases_stage_3[] = {
-      0,   0,   0,   0,   0,   0,   0,   0,   1,   2,   3,   4,   5,   6,   7,   8,
-      0,   0,   0,   0,   0,   0,   9,   0,  10,  11,  12,  13,  14,  15,  16,  17,
-     18,  18,  18,  18,  18,  18,  19,  20,  21,  22,  18,  18,  18,  18,  18,  23,
-     24,  25,  26,  27,  28,  29,  30,  31,  32,  33,  21,  34,  18,  18,  35,  18,
-     18,  18,  18,  18,  36,  18,  37,  38,  39,  18,  40,  41,  42,  43,  44,  45,
-     46,  47,  48,  49,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,  50,   0,   0,   0,   0,   0,  51,  52,
-     53,  54,  55,  56,  57,  58,  59,  60,  61,  62,  63,  18,  18,  18,  64,  65,
-     66,  66,  67,  68,  69,  70,  71,  72,  73,  74,  75,  75,  76,  18,  18,  18,
-     77,  78,  18,  18,  18,  18,  18,  18,  79,  80,  18,  18,  18,  18,  18,  18,
-     18,  18,  18,  18,  18,  18,  81,  82,  82,  82,  83,   0,  84,  85,  85,  85,
-     86,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+static RE_UINT8 re_xid_start_table_2[] = {
+      0,   0,   1,   1,   0,   2,   3,   3,   4,   4,   4,   4,   4,   4,   4,   4,
+      4,   4,   4,   4,   4,   4,   5,   6,   0,   0,   0,   7,   8,   9,   4,  10,
+      4,   4,   4,   4,  11,   4,   4,   4,   4,  12,  13,   4,  14,   0,  15,  16,
+      0,   4,  17,  18,   4,   4,  19,  20,  21,  22,  23,   4,   4,  24,  25,  26,
+     27,  28,  29,  17,   0,  30,  31,   0,  32,  33,  34,  35,  36,  37,  38,  39,
+     40,  41,  42,  43,  44,  45,  46,  47,  48,  45,  49,  50,  51,  52,  46,   0,
+     53,  54,  55,  56,  57,  58,  59,  60,  61,  62,  63,  64,  65,  66,  67,   0,
+     68,  69,  67,   0,  70,  71,  72,   0,  73,   0,  74,  75,  76,   0,   0,   0,
+      4,  77,  78,  79,  80,   4,  81,  82,   4,   4,   4,   4,   4,   4,   4,   4,
+      4,   4,  83,   4,  84,  85,  86,   4,  87,   4,  88,   0,  22,   4,   4,  89,
+     68,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
+      4,   4,   4,  90,   1,   4,   4,  91,  92,  93,  93,  94,   4,  95,  96,   0,
+      0,   4,   4,  29,   4,  97,   4,  98,  99,   0,  15, 100,   4, 101, 102,   0,
+    103,   4, 104,   0,   0, 105,   0,   0, 106,  95, 107,   0, 108, 109,   4, 110,
+      4, 111, 112, 113, 114, 115,   0, 116,   4,   4,   4,   4,   4,   4,   0,   0,
+      4,   4,   4,   4,   4,   4,   4,   4,  89,   4, 117, 113,   4, 118, 119, 120,
+      0,   0,   0, 121, 122,   0,   0,   0, 123, 124, 125,   4,  14,   0,   0,   0,
       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,  87,  87,  87,  87,  88,  89,  90,  90,  90,  90,  90,  91,
       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,  92,  92,  92,  92,  92,  92,  92,  92,  92,  92,  93,  94,
+      4, 126,  99,   4,   4,   4,   4, 127,   4,  81,   4, 128, 103, 129, 129,   0,
       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     95,  96,  97,  97,  97,  97,  97,  98,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  99,
-      0, 100,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18, 101,  18,  18,  18,
-     18,  18, 102, 103,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,
-    104, 105,  93,  94, 104, 105, 104, 105,  93,  94, 106, 107, 104, 105, 108, 109,
-    104, 105, 104, 105, 104, 105, 110, 111, 112, 113, 114, 115, 116, 117, 112, 118,
-      0,   0,   0,   0, 119, 120, 121,   0,   0, 122,   0,   0, 123, 123, 124, 124,
-    125,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    130, 131,  68,   4, 132,  68,   4,  82, 106,  12,   4,   4, 133,   4,   0,  15,
       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0, 126, 127, 127, 127, 128, 128, 128, 129,   0,   0,
-     82,  82,  82,  82,  82,  83,  85,  85,  85,  85,  85,  86, 130, 131, 132, 133,
-     18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  37, 134, 135,   0,
-    136, 136, 136, 136, 137, 138,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
+      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
+      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   0,   0,
+      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
+      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
+      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4, 134,
+      4,   4,   4,   4,  75,   0,  15, 113,   4,   4,   4,   4,   4,   4,   4,   4,
+    135, 136,   4, 137, 113,   4,   4,  22, 138, 139,   4,   4, 140,   4, 141, 142,
+    143, 144,   4,  95, 139,  95,   0, 145,  25, 146,  67, 134,  32, 147, 148, 149,
+      4,  14, 150, 151,   4, 152, 153, 154, 155, 156,  82, 157,   4,   4,   4, 144,
+      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
+      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4, 158, 159, 160,
+      0,   0,   0,   0,   0,   0,   0,   0,   4,   4,   4,   4,   4,   4,   4,   4,
+      4,   4,   4, 161,   4,   4, 162,   0, 163, 164, 165,   4,   4,  93, 166,   4,
+      4,   4, 113,  32,   4,   4,   4,   4,   4, 113,  15,   4, 167,   4,  31, 168,
+      0,   0,   0, 169,   4,   4,   4, 134,   0,   1,   1, 170, 113,  99, 171,   0,
+    172, 173, 174,   0,   4,   4,   4,  88,   0,   0,   4, 104,   0,   0,   0,   0,
+      0,   0,   0,   0, 134,   4, 175,   0,   4,  23, 176,  98, 113,   4, 177,   0,
+      4,   4,   4,   4, 113,  15, 178, 160,   4, 179,   4, 111,   0,   0,   0,   0,
+      4,   4,   4,   4,   4,   4,   4,   4,   4, 103,  98,  31,   0,   0,   0,   0,
+    180, 181,  98, 103,  99,   0,   0, 182,  98, 162,   0,   0,   4, 183,   0,   0,
+    184,  98,   0, 134, 134,   0,  74, 185,   4,  98,  98, 147,  93,   0,   0,   0,
+      4,   4,  14,   0,   4, 147,   4, 147,   4, 111,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   4, 186,   0,   0, 134, 187, 110,   0,   0,  15, 185, 103,
+    108, 188,   0,   0, 108,  22,  15,  14, 108,  67, 189, 190, 108, 147, 191,   0,
+    192, 193,   0,   0, 194, 114,  99,   0,  48,  45, 195,  56,   0,   0,   0,   0,
+      4, 104, 196,  56,   4,  22, 197,   0,   0,   0,   0,   0,   4, 133, 198,   0,
+      4,  22, 199,   0,   4, 200,   0,   0,  88,   0,   0,   0,   0,   0,   0,   0,
+      4, 193,   0,   0,   0,   4,   4, 201, 202, 203, 204,   0,   0, 205, 175, 206,
+    207, 208, 209,   4, 210,   0,   4,  29,   0,   0,   0,   0,   0,   0,   0,   0,
+    211, 133,  73, 212,  22,   0,   0,   0, 213, 175, 214, 215, 216,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0, 147,   0,   0,   0,   0,   0,  46,   0,   0,
+      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
+      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4, 162,   0,   0,   0,
+      4,   4,   4, 133,   4,   4,   4,   4,   4,   4, 111,   0,   0,   0,   0,   0,
       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,  18, 139,  18,  18,  18, 102,   0,   0,
-     18,  18,  18,  37,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,  78,  18,  78,  18,  18,  18,  18,  18,  18,  18,   0, 140,
-     18, 141, 142,  18,  18, 143, 144,  18, 145,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 146,   0,   0,   0, 147, 147,
-    147, 147, 147, 147, 147, 147, 147, 147,   0,   0,   0,   0,   0,   0,   0,   0,
-    148,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      4, 133,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   1,  11,  11,   4,   5,  15,  15,   8,   0,   0,   0,   0,
+      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
+      4,   4,  67,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
+      4,  29,  99,   0,   0,   0,  15, 217,   4,  22, 111, 218,  22,   0,   0,   0,
       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-    149, 149, 149, 149, 149, 150, 150, 150, 150, 150,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0, 149, 149, 149, 149, 151, 150, 150, 150, 150, 152,
+      0,   0,   4,   4,   0,   0,   0,   0,   4,   4, 219,   0, 166,   0,   0, 220,
+      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
+      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4, 188,
+      4,   4,   4,   4,   4,   4,  98,   0,  14,   0,   0,   0,   0,   0,   0,   0,
       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-    153, 153, 153, 153, 153, 153, 154,   0, 155, 155, 155, 155, 155, 155, 156,   0,
+      4,   4,   4,   4,   4,   4,   4,   4,  99,   0, 221, 222,   4,   4,   4,   4,
+      4,   4,   4,   4,   4,   4,   4, 160,   0,   0,   0,   0,   0,   0,   0,   0,
+      4,   4,   4, 223, 224,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,  11,  11,  11,  11,  15,  15,  15,  15,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,  11,  11,  11,  11,  15,  15,  15,  15,
+      4,   4,  30,   4, 225, 226, 227,   4, 228, 229, 230,   4,   4,   4,   4,   4,
+      4,   4,   4,   4,   4, 231, 232,  82,  30,  30, 126, 126, 211, 211, 150,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   4, 233, 234,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   4, 193,   0,   0,   0,   0,   0,   0,   0,   0,
+      4,   4,   4,   4,   4,   4, 185,   0,   4,   4, 235,   0,   0,   0,   0,   0,
       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-    157, 157, 157, 157, 158, 159, 159, 159, 160,   0,   0,   0,   0,   0,   0,   0,
       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    227, 236, 237, 238, 239, 240,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
+      4,   4,   4,   4,   4,   4, 113,   0,   4,   4,   4,   4,   4,   4,   4,   4,
+      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
+      4,   4,   4,   4,   4,   4,   4,   4,   4, 104,   4,   4,   4,   4,   4,   4,
+    113,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
+      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
+      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
+      4,   4,   4,   4,   4, 241,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
+      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
+      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,  73,
+      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
+    113,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
+      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,  17,   0,   0,   0,   0,   0
 };
 
-static RE_UINT8 re_all_cases_stage_4[] = {
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   1,   1,   1,   1,   1,   1,
-      1,   2,   1,   3,   1,   1,   1,   1,   1,   1,   1,   4,   1,   1,   1,   1,
-      1,   1,   1,   0,   0,   0,   0,   0,   0,   5,   5,   5,   5,   5,   5,   5,
-      5,   6,   5,   7,   5,   5,   5,   5,   5,   5,   5,   8,   5,   5,   5,   5,
-      5,   5,   5,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   9,   0,   0,
-      1,   1,   1,   1,   1,  10,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   0,   1,   1,   1,   1,   1,   1,   1,  11,
-      5,   5,   5,   5,   5,  12,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
-      5,   5,   5,   5,   5,   5,   5,   0,   5,   5,   5,   5,   5,   5,   5,  13,
-     14,  15,  14,  15,  14,  15,  14,  15,  16,  17,  14,  15,  14,  15,  14,  15,
-      0,  14,  15,  14,  15,  14,  15,  14,  15,  14,  15,  14,  15,  14,  15,  14,
-     15,   0,  14,  15,  14,  15,  14,  15,  18,  14,  15,  14,  15,  14,  15,  19,
-     20,  21,  14,  15,  14,  15,  22,  14,  15,  23,  23,  14,  15,   0,  24,  25,
-     26,  14,  15,  23,  27,  28,  29,  30,  14,  15,  31,   0,  29,  32,  33,  34,
-     14,  15,  14,  15,  14,  15,  35,  14,  15,  35,   0,   0,  14,  15,  35,  14,
-     15,  36,  36,  14,  15,  14,  15,  37,  14,  15,   0,   0,  14,  15,   0,  38,
-      0,   0,   0,   0,  39,  40,  41,  39,  40,  41,  39,  40,  41,  14,  15,  14,
-     15,  14,  15,  14,  15,  42,  14,  15,   0,  39,  40,  41,  14,  15,  43,  44,
-     45,   0,  14,  15,  14,  15,  14,  15,  14,  15,  14,  15,   0,   0,   0,   0,
-      0,   0,  46,  14,  15,  47,  48,  49,  49,  14,  15,  50,  51,  52,  14,  15,
-     53,  54,  55,  56,  57,   0,  58,  58,   0,  59,   0,  60,  61,   0,   0,   0,
-     58,  62,   0,  63,   0,  64,  65,   0,  66,  67,  65,  68,  69,   0,   0,  67,
-      0,  70,  71,   0,   0,  72,   0,   0,   0,   0,   0,   0,   0,  73,   0,   0,
-     74,   0,  75,  74,   0,   0,   0,  76,  74,  77,  78,  78,  79,   0,   0,   0,
-      0,   0,  80,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  81,  82,   0,
-      0,   0,   0,   0,   0,  83,   0,   0,  14,  15,  14,  15,   0,   0,  14,  15,
-      0,   0,   0,  33,  33,  33,   0,  84,   0,   0,   0,   0,   0,   0,  85,   0,
-     86,  86,  86,   0,  87,   0,  88,  88,  89,   1,  90,   1,   1,  91,   1,   1,
-     92,  93,  94,   1,  95,   1,   1,   1,  96,  97,   0,  98,   1,   1,  99,   1,
-      1, 100,   1,   1, 101, 102, 102, 102, 103,   5, 104,   5,   5, 105,   5,   5,
-    106, 107, 108,   5, 109,   5,   5,   5, 110, 111, 112, 113,   5,   5, 114,   5,
-      5, 115,   5,   5, 116, 117, 117, 118, 119, 120,   0,   0,   0, 121, 122, 123,
-    124, 125, 126, 127, 128, 129,   0,  14,  15, 130,  14,  15,   0,  45,  45,  45,
-    131, 131, 131, 131, 131, 131, 131, 131,   1,   1, 132,   1, 133,   1,   1,   1,
-      1,   1,   1,   1,   1,   1, 134,   1,   1, 135, 136,   1,   1,   1,   1,   1,
-      1,   1, 137,   1,   1,   1,   1,   1,   5,   5, 138,   5, 139,   5,   5,   5,
-      5,   5,   5,   5,   5,   5, 140,   5,   5, 141, 142,   5,   5,   5,   5,   5,
-      5,   5, 143,   5,   5,   5,   5,   5, 144, 144, 144, 144, 144, 144, 144, 144,
-     14,  15, 145, 146,  14,  15,  14,  15,  14,  15,   0,   0,   0,   0,   0,   0,
-      0,   0,  14,  15,  14,  15,  14,  15, 147,  14,  15,  14,  15,  14,  15,  14,
-     15,  14,  15,  14,  15,  14,  15, 148,   0, 149, 149, 149, 149, 149, 149, 149,
-    149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149,   0,
-      0, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150,
-    150, 150, 150, 150, 150, 150, 150,   0, 151, 151, 151, 151, 151, 151, 151, 151,
-    151, 151, 151, 151, 151, 151,   0, 151,   0,   0,   0,   0,   0, 151,   0,   0,
-    152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152,   0,   0, 152, 152, 152,
-    153, 153, 153, 153, 153, 153, 153, 153, 118, 118, 118, 118, 118, 118,   0,   0,
-    123, 123, 123, 123, 123, 123,   0,   0, 154, 155, 156, 157, 158, 159, 160, 161,
-    162,   0,   0,   0,   0,   0,   0,   0, 163, 163, 163, 163, 163, 163, 163, 163,
-    163, 163, 163,   0,   0, 163, 163, 163,   0, 164,   0,   0,   0, 165,   0,   0,
-      0,   0,   0,   0,   0,   0, 166,   0, 167, 168,  14,  15,  14,  15,  14,  15,
-     14,  15,  14,  15,  14,  15,   0,   0,   0,   0,   0, 169,   0,   0, 170,   0,
-    118, 118, 118, 118, 118, 118, 118, 118, 123, 123, 123, 123, 123, 123, 123, 123,
-      0, 118,   0, 118,   0, 118,   0, 118,   0, 123,   0, 123,   0, 123,   0, 123,
-    171, 171, 172, 172, 172, 172, 173, 173, 174, 174, 175, 175, 176, 176,   0,   0,
-    118, 118,   0, 177,   0,   0,   0,   0, 123, 123, 178, 178, 179,   0, 180,   0,
-      0,   0,   0, 177,   0,   0,   0,   0, 181, 181, 181, 181, 179,   0,   0,   0,
-    118, 118,   0, 182,   0,   0,   0,   0, 123, 123, 183, 183,   0,   0,   0,   0,
-    118, 118,   0, 184,   0, 126,   0,   0, 123, 123, 185, 185, 130,   0,   0,   0,
-    186, 186, 187, 187, 179,   0,   0,   0,   0,   0,   0,   0,   0,   0, 188,   0,
-      0,   0, 189, 190,   0,   0,   0,   0,   0,   0, 191,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0, 192,   0, 193, 193, 193, 193, 193, 193, 193, 193,
-    194, 194, 194, 194, 194, 194, 194, 194,   0,   0,   0,  14,  15,   0,   0,   0,
-      0,   0,   0,   0,   0,   0, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195,
-    196, 196, 196, 196, 196, 196, 196, 196, 196, 196,   0,   0,   0,   0,   0,   0,
-     14,  15, 197, 198, 199, 200, 201,  14,  15,  14,  15,  14,  15, 202, 203, 204,
-    205,   0,  14,  15,   0,  14,  15,   0,   0,   0,   0,   0,   0,   0, 206, 206,
-      0,   0,   0,  14,  15,  14,  15,   0,   0,   0,  14,  15,   0,   0,   0,   0,
-    207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207,   0, 207,
-      0,   0,   0,   0,   0, 207,   0,   0,  14,  15, 208, 209,  14,  15,  14,  15,
-      0,  14,  15,  14,  15, 210,  14,  15,   0,   0,   0,  14,  15, 211,   0,   0,
-     14,  15,  14,  15, 149,   0,  14,  15,  14,  15, 212, 213, 214, 215, 212,   0,
-    216, 217, 218, 219,  14,  15,  14,  15,   0,   0,  14,  15, 150, 220, 221,   0,
-      0,   0,   0, 222,   0,   0,   0,   0, 223, 223, 223, 223, 223, 223, 223, 223,
-      0,   0,   0,   0,   0,  14,  15,   0, 224, 224, 224, 224, 224, 224, 224, 224,
-    225, 225, 225, 225, 225, 225, 225, 225, 224, 224, 224, 224,   0,   0,   0,   0,
-    225, 225, 225, 225,   0,   0,   0,   0,  87,  87,  87,  87,  87,  87,  87,  87,
-     87,  87,  87,   0,   0,   0,   0,   0, 116, 116, 116, 116, 116, 116, 116, 116,
-    116, 116, 116,   0,   0,   0,   0,   0, 226, 226, 226, 226, 226, 226, 226, 226,
-    226, 226, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227,
-    227, 227, 227, 227,   0,   0,   0,   0,
-};
+static RE_UINT8 re_xid_start_table_3[] = {
+      0,   0,   0,   0, 254, 255, 255,   7,   0,   4,  32,   4, 255, 255, 127, 255,
+    255, 255, 255, 255, 195, 255,   3,   0,  31,  80,   0,   0,   0,   0, 223, 184,
+     64, 215, 255, 255, 251, 255, 255, 255, 255, 255, 191, 255,   3, 252, 255, 255,
+    255, 255, 254, 255, 255, 255, 127,   2, 255,   1,   0,   0,   0,   0, 255, 255,
+    255, 135,   7,   0, 255,   7,   0,   0,   0, 192, 254, 255, 255, 255,  47,   0,
+     96, 192,   0, 156,   0,   0, 253, 255, 255, 255,   0,   0,   0, 224, 255, 255,
+     63,   0,   2,   0,   0, 252, 255, 255, 255,   7,  48,   4, 255, 255,  63,   4,
+     16,   1,   0,   0, 255, 255, 255,   1, 255, 255, 223, 255, 255,   0,   0,   0,
+    240, 255, 255, 255, 255, 255, 255,  35,   0,   0,   1, 255,   3,   0, 254, 255,
+    225, 159, 249, 255, 255, 253, 197,  35,   0,  64,   0, 176,   3,   0,   3,  16,
+    224, 135, 249, 255, 255, 253, 109,   3,   0,   0,   0,  94,   0,   0,  28,   0,
+    224, 191, 251, 255, 255, 253, 237,  35,   0,   0,   1,   0,   3,   0,   0,   2,
+    224, 159, 249, 255,   0,   0,   0, 176,   3,   0,   2,   0, 232, 199,  61, 214,
+     24, 199, 255,   3, 224, 223, 253, 255, 255, 253, 255,  35,   0,   0,   0,   7,
+      3,   0,   0,   0, 225, 223, 253, 255, 255, 253, 239,  35,   0,   0,   0,  64,
+      3,   0,   6,   0, 240, 223, 253, 255, 255, 255, 255,  39,   0,  64, 112, 128,
+      3,   0,   0, 252, 224, 255, 127, 252, 255, 255, 251,  47, 127,   0,   0,   0,
+    254, 255, 255, 255, 255, 255,   5,   0, 214, 247, 255, 255, 175, 255,   5,  32,
+     95,   0,   0, 240,   1,   0,   0,   0, 255, 254, 255, 255, 255,  31,   0,   0,
+      0,  31,   0,   0, 255,   7,   0, 128,   0,   0,  63,  60,  98, 192, 225, 255,
+      3,  64,   0,   0, 191,  32, 255, 255, 255, 255, 255, 247, 255,  61, 127,  61,
+    255,  61, 255, 255, 255, 255,  61, 127,  61, 255, 127, 255, 255, 255,  61, 255,
+    255, 255, 255,   7, 255, 255,  63,  63, 255, 159, 255, 255, 255, 199, 255,   1,
+    255, 223,   3,   0, 255, 255,   3,   0, 255, 223,   1,   0, 255, 255,  15,   0,
+      0,   0, 128,  16, 255,   5, 255, 255, 255, 255,  63,   0, 255, 255, 255, 127,
+    255,  63,  31,   0, 255,  15, 255, 255, 255,   3,   0,   0, 255, 255, 127,   0,
+    255, 255,  31,   0, 128,   0,   0,   0, 224, 255, 255, 255, 224,  15,   0,   0,
+    248, 255, 255, 255,   1, 192,   0, 252,  63,   0,   0,   0,  15,   0,   0,   0,
+      0, 224,   0, 252, 255, 255, 255,  63, 255,   1, 255, 255, 255, 255, 255, 231,
+      0, 222, 111,   4,  63,  63, 255, 170, 255, 255, 223,  95, 220,  31, 207,  15,
+    255,  31, 220,  31,   0,   0,   2, 128,   0,   0, 255,  31, 132, 252,  47,  63,
+     80, 253, 255, 243, 224,  67,   0,   0, 255, 127, 255, 255,  31, 120,  12,   0,
+    255, 128,   0,   0, 127, 127, 127, 127, 224,   0,   0,   0, 254,   3,  62,  31,
+    255, 255, 127, 224, 255, 127,   0,   0, 255, 255, 255,  31, 255,  31, 255, 255,
+      0,  12,   0,   0, 255, 127,   0, 128,   0,   0, 128, 255, 252, 255, 255, 255,
+    255, 249, 255, 255, 252,   7,   0,   0,   0,   0, 224, 255, 187, 247, 255, 255,
+      7,   0,   0,   0,   0,   0, 252, 104,  63,   0, 255, 255, 255, 255,   7,   0,
+      0, 128,   0,   0, 223, 255,   0, 124, 247,  15,   0,   0, 255, 255, 127, 196,
+    255, 255,  98,  62,   5,   0,   0,  56, 255,   7,  28,   0, 126, 126, 126,   0,
+    127, 127, 255, 255, 255,   3, 255, 255,  15,   0, 255, 255, 127, 248, 255, 255,
+    255, 255, 255,  15, 255,  63, 255, 255, 255, 255, 255,   3, 127,   0, 248, 160,
+    255, 253, 127,  95, 219, 255, 255, 255,   0,   0, 248, 255, 255, 255, 252, 255,
+      0,   0, 255,   3,   0,   0, 138, 170, 192, 255, 255, 255, 252, 252, 252,  28,
+    255, 239, 255, 255, 127, 255, 255, 183, 255,  63, 255,  63, 255, 255,   1,   0,
+    255,   7, 255, 255,  15, 255,  62,   0, 255, 255,  15, 255, 255,   0, 255, 255,
+     63, 253, 255, 255, 255, 255, 191, 145, 255, 255,  55,   0, 255, 255, 255, 192,
+      1,   0, 239, 254,  31,   0,   0,   0, 255,   3,   3,   0, 128,   0, 255, 255,
+    255, 255, 255,   0, 144,   0, 255, 255, 255, 255,  71,   0,  30,   0,   0,  20,
+    255, 255, 251, 255, 255,  15,   0,   0, 127, 189, 255, 191,   0,   0,   1, 224,
+    128,   7,   0, 128, 176,   0,   0,   0,   0,   0,   0,  15,  16,   0,   0,   0,
+    255,   7,   0,   1,   0,   0,   0, 128, 127, 242, 111, 255, 255, 255,   0, 128,
+      2,   0,   0,   0, 255, 252, 255, 255,  10,   0,   0,   0,   1, 248, 255, 255,
+    255, 255,   7,   4,   0,   0,   1, 240, 255,   3,   0,  32, 255, 253, 255, 255,
+      0,   0, 252, 255, 127, 251, 255, 255,  64,   0,   0,   0, 191, 253, 255, 255,
+    255,   3,   0,   1, 255,  63,   0,   0, 248, 255, 255, 224, 255,   7,   1,   0,
+     11,   0,   0,   0,   0,   0,   7,   0, 240,   0, 255, 255, 255,   7, 255,  31,
+    255,   1, 255,   3, 255, 255, 255, 223, 100, 222, 255, 235, 239, 255, 255, 255,
+    191, 231, 223, 223, 255, 255, 255, 123,  95, 252, 253, 255,  63, 255, 255, 255,
+    253, 255, 255, 247, 255,  31, 128,  63,   0,  64,   0,   0,  15,   8,   0,   0,
+    150, 254, 247,  10, 132, 234, 150, 170, 150, 247, 247,  94, 255, 251, 255,  15,
+    238, 251, 255,  15,   3,   0, 255, 255
+};
+
+RE_UINT32 re_get_xid_start(RE_UINT32 codepoint) {
+    RE_UINT32 field_2;
+    RE_UINT32 field_1;
+    RE_UINT32 field_0;
+    RE_UINT32 offset;
+    RE_UINT32 v;
+
+    field_2 = codepoint >> 10;
+    field_1 = (codepoint >> 5) & 0x1F;
+    field_0 = (codepoint >> 3) & 0x3;
+    offset = codepoint & 0x7;
+
+    v = re_xid_start_table_1[field_2];
+    v = re_xid_start_table_2[(v << 5) | field_1];
+    v = re_xid_start_table_3[(v << 2) | field_0];
+
+    return (v >> offset) & 0x1;
+}
 
-/* All_Cases: 2544 bytes. */
-
-static RE_AllCases re_all_cases_table[] = {
-    {{     0,     0,     0}},
-    {{    32,     0,     0}},
-    {{    32,   232,     0}},
-    {{    32,  8415,     0}},
-    {{    32,   300,     0}},
-    {{   -32,     0,     0}},
-    {{   -32,   199,     0}},
-    {{   -32,  8383,     0}},
-    {{   -32,   268,     0}},
-    {{   743,   775,     0}},
-    {{    32,  8294,     0}},
-    {{  7615,     0,     0}},
-    {{   -32,  8262,     0}},
-    {{   121,     0,     0}},
-    {{     1,     0,     0}},
-    {{    -1,     0,     0}},
-    {{  -199,     0,     0}},
-    {{  -232,     0,     0}},
-    {{  -121,     0,     0}},
-    {{  -300,  -268,     0}},
-    {{   195,     0,     0}},
-    {{   210,     0,     0}},
-    {{   206,     0,     0}},
-    {{   205,     0,     0}},
-    {{    79,     0,     0}},
-    {{   202,     0,     0}},
-    {{   203,     0,     0}},
-    {{   207,     0,     0}},
-    {{    97,     0,     0}},
-    {{   211,     0,     0}},
-    {{   209,     0,     0}},
-    {{   163,     0,     0}},
-    {{   213,     0,     0}},
-    {{   130,     0,     0}},
-    {{   214,     0,     0}},
-    {{   218,     0,     0}},
-    {{   217,     0,     0}},
-    {{   219,     0,     0}},
-    {{    56,     0,     0}},
-    {{     1,     2,     0}},
-    {{    -1,     1,     0}},
-    {{    -2,    -1,     0}},
-    {{   -79,     0,     0}},
-    {{   -97,     0,     0}},
-    {{   -56,     0,     0}},
-    {{  -130,     0,     0}},
-    {{ 10795,     0,     0}},
-    {{  -163,     0,     0}},
-    {{ 10792,     0,     0}},
-    {{ 10815,     0,     0}},
-    {{  -195,     0,     0}},
-    {{    69,     0,     0}},
-    {{    71,     0,     0}},
-    {{ 10783,     0,     0}},
-    {{ 10780,     0,     0}},
-    {{ 10782,     0,     0}},
-    {{  -210,     0,     0}},
-    {{  -206,     0,     0}},
-    {{  -205,     0,     0}},
-    {{  -202,     0,     0}},
-    {{  -203,     0,     0}},
-    {{ 42319,     0,     0}},
-    {{ 42315,     0,     0}},
-    {{  -207,     0,     0}},
-    {{ 42280,     0,     0}},
-    {{ 42308,     0,     0}},
-    {{  -209,     0,     0}},
-    {{  -211,     0,     0}},
-    {{ 10743,     0,     0}},
-    {{ 42305,     0,     0}},
-    {{ 10749,     0,     0}},
-    {{  -213,     0,     0}},
-    {{  -214,     0,     0}},
-    {{ 10727,     0,     0}},
-    {{  -218,     0,     0}},
-    {{ 42307,     0,     0}},
-    {{ 42282,     0,     0}},
-    {{   -69,     0,     0}},
-    {{  -217,     0,     0}},
-    {{   -71,     0,     0}},
-    {{  -219,     0,     0}},
-    {{ 42261,     0,     0}},
-    {{ 42258,     0,     0}},
-    {{    84,   116,  7289}},
-    {{   116,     0,     0}},
-    {{    38,     0,     0}},
-    {{    37,     0,     0}},
-    {{    64,     0,     0}},
-    {{    63,     0,     0}},
-    {{  7235,     0,     0}},
-    {{    32,    62,     0}},
-    {{    32,    96,     0}},
-    {{    32,    57,    92}},
-    {{   -84,    32,  7205}},
-    {{    32,    86,     0}},
-    {{  -743,    32,     0}},
-    {{    32,    54,     0}},
-    {{    32,    80,     0}},
-    {{    31,    32,     0}},
-    {{    32,    47,     0}},
-    {{    32,  7549,     0}},
-    {{   -38,     0,     0}},
-    {{   -37,     0,     0}},
-    {{  7219,     0,     0}},
-    {{   -32,    30,     0}},
-    {{   -32,    64,     0}},
-    {{   -32,    25,    60}},
-    {{  -116,   -32,  7173}},
-    {{   -32,    54,     0}},
-    {{  -775,   -32,     0}},
-    {{   -32,    22,     0}},
-    {{   -32,    48,     0}},
-    {{   -31,     1,     0}},
-    {{   -32,    -1,     0}},
-    {{   -32,    15,     0}},
-    {{   -32,  7517,     0}},
-    {{   -64,     0,     0}},
-    {{   -63,     0,     0}},
-    {{     8,     0,     0}},
-    {{   -62,   -30,     0}},
-    {{   -57,   -25,    35}},
-    {{   -47,   -15,     0}},
-    {{   -54,   -22,     0}},
-    {{    -8,     0,     0}},
-    {{   -86,   -54,     0}},
-    {{   -80,   -48,     0}},
-    {{     7,     0,     0}},
-    {{  -116,     0,     0}},
-    {{   -92,   -60,   -35}},
-    {{   -96,   -64,     0}},
-    {{    -7,     0,     0}},
-    {{    80,     0,     0}},
-    {{    32,  6254,     0}},
-    {{    32,  6253,     0}},
-    {{    32,  6244,     0}},
-    {{    32,  6242,     0}},
-    {{    32,  6242,  6243}},
-    {{    32,  6236,     0}},
-    {{   -32,  6222,     0}},
-    {{   -32,  6221,     0}},
-    {{   -32,  6212,     0}},
-    {{   -32,  6210,     0}},
-    {{   -32,  6210,  6211}},
-    {{   -32,  6204,     0}},
-    {{   -80,     0,     0}},
-    {{     1,  6181,     0}},
-    {{    -1,  6180,     0}},
-    {{    15,     0,     0}},
-    {{   -15,     0,     0}},
-    {{    48,     0,     0}},
-    {{   -48,     0,     0}},
-    {{  7264,     0,     0}},
-    {{  3008,     0,     0}},
-    {{ 38864,     0,     0}},
-    {{ -6254, -6222,     0}},
-    {{ -6253, -6221,     0}},
-    {{ -6244, -6212,     0}},
-    {{ -6242, -6210,     0}},
-    {{ -6242, -6210,     1}},
-    {{ -6243, -6211,    -1}},
-    {{ -6236, -6204,     0}},
-    {{ -6181, -6180,     0}},
-    {{ 35266, 35267,     0}},
-    {{ -3008,     0,     0}},
-    {{ 35332,     0,     0}},
-    {{  3814,     0,     0}},
-    {{ 35384,     0,     0}},
-    {{     1,    59,     0}},
-    {{    -1,    58,     0}},
-    {{   -59,   -58,     0}},
-    {{ -7615,     0,     0}},
-    {{    74,     0,     0}},
-    {{    86,     0,     0}},
-    {{   100,     0,     0}},
-    {{   128,     0,     0}},
-    {{   112,     0,     0}},
-    {{   126,     0,     0}},
-    {{     9,     0,     0}},
-    {{   -74,     0,     0}},
-    {{    -9,     0,     0}},
-    {{ -7289, -7205, -7173}},
-    {{   -86,     0,     0}},
-    {{ -7235,     0,     0}},
-    {{  -100,     0,     0}},
-    {{ -7219,     0,     0}},
-    {{  -112,     0,     0}},
-    {{  -128,     0,     0}},
-    {{  -126,     0,     0}},
-    {{ -7549, -7517,     0}},
-    {{ -8415, -8383,     0}},
-    {{ -8294, -8262,     0}},
-    {{    28,     0,     0}},
-    {{   -28,     0,     0}},
-    {{    16,     0,     0}},
-    {{   -16,     0,     0}},
-    {{    26,     0,     0}},
-    {{   -26,     0,     0}},
-    {{-10743,     0,     0}},
-    {{ -3814,     0,     0}},
-    {{-10727,     0,     0}},
-    {{-10795,     0,     0}},
-    {{-10792,     0,     0}},
-    {{-10780,     0,     0}},
-    {{-10749,     0,     0}},
-    {{-10783,     0,     0}},
-    {{-10782,     0,     0}},
-    {{-10815,     0,     0}},
-    {{ -7264,     0,     0}},
-    {{-35266,     1,     0}},
-    {{-35267,    -1,     0}},
-    {{-35332,     0,     0}},
-    {{-42280,     0,     0}},
-    {{-42308,     0,     0}},
-    {{-42319,     0,     0}},
-    {{-42315,     0,     0}},
-    {{-42305,     0,     0}},
-    {{-42258,     0,     0}},
-    {{-42282,     0,     0}},
-    {{-42261,     0,     0}},
-    {{   928,     0,     0}},
-    {{-42307,     0,     0}},
-    {{-35384,     0,     0}},
-    {{  -928,     0,     0}},
-    {{-38864,     0,     0}},
-    {{    40,     0,     0}},
-    {{   -40,     0,     0}},
-    {{    34,     0,     0}},
-    {{   -34,     0,     0}},
+/* All cases. */
+static RE_UINT8 re_all_cases_table_1[] = {
+     0,  1,  2,  2,  3,  2,  2,  4,  5,  6,  2,  7,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  8,  9,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2, 10,
+     2, 11,  2, 12,  2,  2, 13,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2, 14,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2, 15,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2
 };
 
-/* All_Cases: 2736 bytes. */
-
-int re_get_all_cases(RE_UINT32 ch, RE_UINT32* codepoints) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-    RE_AllCases* all_cases;
-    int count;
-
-    f = ch >> 13;
-    code = ch ^ (f << 13);
-    pos = (RE_UINT32)re_all_cases_stage_1[f] << 5;
-    f = code >> 8;
-    code ^= f << 8;
-    pos = (RE_UINT32)re_all_cases_stage_2[pos + f] << 5;
-    f = code >> 3;
-    code ^= f << 3;
-    pos = (RE_UINT32)re_all_cases_stage_3[pos + f] << 3;
-    value = re_all_cases_stage_4[pos + code];
-
-    all_cases = &re_all_cases_table[value];
-
-    codepoints[0] = ch;
-    count = 1;
-
-    while (count < RE_MAX_CASES && all_cases->diffs[count - 1] != 0) {
-        codepoints[count] = (RE_UINT32)((RE_INT32)ch + all_cases->diffs[count -
-          1]);
-        ++count;
-    }
-
-    return count;
+static RE_UINT8 re_all_cases_table_2[] = {
+     0,  0,  1,  2,  0,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13,
+     6, 14, 15, 16, 17,  0,  0,  0,  0,  0, 18, 19, 20, 21, 22, 23,
+    24, 25, 26, 27, 28,  6, 29,  6,  6, 30, 31, 32, 33,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0, 34, 35, 36,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 37, 38, 39,
+     0,  0,  0,  0, 40, 36,  0,  0,  0,  0,  0, 41, 42,  0,  0,  0,
+     6,  6,  6, 43, 44,  6,  6,  6, 45, 46, 47, 48, 46, 49, 50, 51,
+     0,  0,  0,  0,  0,  0,  0,  0,  0, 52, 53, 54, 55,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0, 56, 57, 58,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    59, 60, 61, 62,  6,  6,  6, 63, 34, 64,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0, 65, 66, 67,  0,  0,  0,  0, 68,  6, 69, 70, 71, 72, 73,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 74, 75, 76, 77,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0, 78, 78,  0,  0,  0,  0,  0,
+    79, 80, 81,  0,  0, 82, 83, 84,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0, 85, 86, 85, 86,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0, 87, 87,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0, 88, 88,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0, 89, 90, 91,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0
+};
+
+static RE_UINT8 re_all_cases_table_3[] = {
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   1,   1,   1,   1,   1,   1,   1,   1, 134,   1,   3,   1,   1,   1,   1,
+      1,   1,   1,   4,   1,   1,   1,   1,   1,   1,   1,   0,   0,   0,   0,   0,
+      0,   1,   1,   1,   1,   1,   1,   1,   1,   2,   1,   3,   1,   1,   1,   1,
+      1,   1,   1,   4,   1,   1,   1,   1,   1,   1,   1,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0, 145,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      1,   1,   1,   1,   1,   5,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   0,   1,   1,   1,   1,   1,   1,   1,  83,
+      1,   1,   1,   1,   1,   5,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   0,   1,   1,   1,   1,   1,   1,   1,  29,
+     16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,
+     16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,
+     16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,
+    133,  15,  16,  16,  16,  16,  16,  16,   0,  23,  23,  25,  25,  23,  23,  27,
+     27,  23,  23,  25,  25,  23,  23,  28,  28,   0,  16,  16,  16,  16,  16,  16,
+     16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,
+     16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,
+     16,  16,  16,  16,  16,  16,  16,  16,  29,  23,  23,  25,  25,  23,  23, 136,
+     53,  30,  16,  16,  16,  16,  30,  28,  28,  31,  32,  25,  25,   0,  33,  34,
+     35,  23,  23,  36,  37,  47,  38,  38,  16,  16,  51,   0,  36,  39,  49,  40,
+     16,  16,  16,  16,  16,  16,  41,  28,  28,  42,   0,   0,  16,  16,  41,  43,
+     43,  44,  45,  25,  25,  23,  23,  46,  16,  16,   0,   0,  16,  16,   0,  48,
+      0,   0,   0,   0, 155, 155,  24, 149, 149,  17, 156, 156,  26,  23,  23,  43,
+     43,  23,  23,  25,  25,  23,  23,  28,  28,  23,  23,  25,  25,  33,  16,  16,
+     16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,
+      0, 150, 150,  18,  16,  16,  47,  48,  16,  16,  16,  16,  16,  16,  16,  16,
+     49,   0,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,
+     16,  16,  16,  16,   0,   0,   0,   0,   0,   0,  50,  25,  25,  51,  52, 108,
+    106,  23,  23,  53,  54,  55,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,
+    106, 104, 107,  30,  30,   0,  31,  32,   0,  34,   0,  35, 112,   0,   0,   0,
+     36, 113,   0,  37,   0, 110, 111,   0,  38,  38, 115, 101, 114,   0,   0,  36,
+      0, 105,  39,   0,   0,  40,   0,   0,   0,   0,   0,   0,   0, 103,   0,   0,
+     41,   0, 120,  42,   0,   0,   0, 117,  41,  54,  44,  45,  55,   0,   0,   0,
+      0,   0,  46,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 118, 116,   0,
+      0,   0,   0,   0,   0, 142,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     16,  16,  16,  16,   0,   0,  16,  16,   0,   0,   0,  75,  76,  76,   0,  56,
+      0,   0,   0,   0,   0,   0,  57,   0,  58,  59,  58,   0,  60,   0,  61,  62,
+      0,   1,   6,   1,   1,   7,   1,   1,   8, 142,  10,   1, 145,   1,   1,   1,
+     63,  64,   0, 151,  65,  65,  66,  65,  65,  67,  65,  65,  57,  58,  59,  58,
+      0,   1,   6,   1,   1,   7,   1,   1,   8,   9,  10,   1,  11,   1,   1,   1,
+     63,  64, 151,  19,  65,  65,  66,  65,  65,  67,  65,  65,  60,  61,  62,  71,
+    138, 140,   0,   0,   0, 159, 157,  71,  16,  16,  16,  16,  16,  16,  16,  16,
+     16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,
+    144, 158,  74,  56, 141, 139,   0,  28,  28,  74,  16,  16,   0,  75,  76,  76,
+     77,  77,  77,  77,  77,  77,  77,  77,  77,  77,  77,  77,  77,  77,  77,  77,
+      1,   1,  12,   1,  13,   1,   1,   1,   1,   1,   1,   1,   1,   1,  14,   1,
+     65,  68,  69,  65,  65,  65,  65,  65,  65,  65,  70,  65,  65,  65,  65,  65,
+      1,   1,  12,   1,  13,   1,   1,   1,   1,   1,   1,   1,   1,   1,  14,   1,
+     65,  68,  69,  65,  65,  65,  65,  65,  65,  65,  70,  65,  65,  65,  65,  65,
+     77,  77,  77,  77,  77,  77,  77,  77,  77,  77,  77,  77,  77,  77,  77,  77,
+     16,  16,  20,  20,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,
+     16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,
+     16,  16,   0,   0,   0,   0,   0,   0,   0,   0,  16,  16,  16,  16,  16,  16,
+     16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,
+     28,  23,  23,  25,  25,  23,  23,  28,  28,  23,  23,  25,  25,  23,  23,  28,
+     16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,
+     16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,
+      0,  77,  77,  77,  77,  77,  77,  77,  77,  77,  77,  77,  77,  77,  77,  77,
+     73,  73,  73,  73,  73,  73,  73,  73,  73,  73,  73,  73,  73,  73,  73,  73,
+     78,  78,  78,  78,  78,  78,  78,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,  77,  77,  77,  77,  77,  77,  77,  77,  77,  77,  77,  77,  77,  77,  77,
+     73,  73,  73,  73,  73,  73,  73,  73,  73,  73,  73,  73,  73,  73,  73,  73,
+     78,  78,  78,  78,  78,  78,  78,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,
+     79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,  79,
+     80,  80,  80,  80,  80,  80,   0,  80,   0,   0,   0,   0,   0,  80,   0,   0,
+     82,  82,  82,  82,  82,  82,  82,  82,  82,  82,  82,  82,  82,  82,  82,  82,
+     82,  82,  82,  82,  82,  82,  82,  82,  82,  82,  82,  82,  82,  82,  82,  82,
+     82,  82,  82,  82,  82,  82,  82,  82,  82,  82,  82,   0,   0,  82,  82,  82,
+    122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+    123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+    124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+    125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+    124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+     81,  81,  81,  81,  81,  81,   0,   0,  81,  81,  81,  81,  81,  81,   0,   0,
+    146, 147, 148, 161, 162, 163, 164, 152, 154,   0,   0,   0,   0,   0,   0,   0,
+     82,  82,  82,  82,  82,  82,  82,  82,  82,  82,  82,  82,  82,  82,  82,  82,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0, 109,   0,   0,   0, 102,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 121,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     21,  21,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,
+     16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,
+     16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,
+     16,  16,  16,  16,  16,  16,   0,   0,   0,   0,   0, 153,   0,   0,  83,   0,
+     81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,
+     81,  81,  81,  81,  81,  81,   0,   0,  81,  81,  81,  81,  81,  81,   0,   0,
+     81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,
+     81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,
+     81,  81,  81,  81,  81,  81,   0,   0,  81,  81,  81,  81,  81,  81,   0,   0,
+      0,  81,   0,  81,   0,  81,   0,  81,   0,  81,   0,  81,   0,  81,   0,  81,
+     81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,
+     84,  84,  85,  85,  86,  86,  87,  87,  90,  90,  88,  88,  75,  75,   0,   0,
+     81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,
+     81,  81,   0,  28,   0,   0,   0,   0,  81,  81,  84,  84,  28,   0, 143,   0,
+      0,   0,   0,  28,   0,   0,   0,   0,  85,  85,  86,  86,  28,   0,   0,   0,
+     81,  81,   0,   0,   0,   0,   0,   0,  81,  81,  87,  87,   0,   0,   0,   0,
+     81,  81,   0,   0,   0,  89,   0,   0,  81,  81,  88,  88,  89,   0,   0,   0,
+      0,   0,   0,  28,   0,   0,   0,   0,  90,  90,  75,  75,  28,   0,   0,   0,
+      0,   0,   0,   0,   0,   0, 160,   0,   0,   0, 135, 137,   0,   0,   0,   0,
+      0,   0,  91,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  91,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     92,  92,  92,  92,  92,  92,  92,  92,  92,  92,  92,  92,  92,  92,  92,  92,
+     92,  92,  92,  92,  92,  92,  92,  92,  92,  92,  92,  92,  92,  92,  92,  92,
+      0,   0,   0,  25,  25,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,  93,  93,  94,  94,  95,  95,  94,  94,  93,  93,
+     96,  96,  97,  97,  96,  96,  98,  98,  57,  57,  99,  99,  57,  57,  98,  98,
+     93,  93,  94,  94,  95,  95,  94,  94,  93,  93,  96,  96,  97,  97,  96,  96,
+     98,  98,  57,  57,  99,  99,  57,  57,  98,  98,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     73,  73,  73,  73,  73,  73,  73,  73,  73,  73,  73,  73,  73,  73,  73,  73,
+     77,  77,  77,  77,  77,  77,  77,  77,  77,  77,  77,  77,  77,  77,  77,  77,
+    100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100,   0,
+     73,  73,  73,  73,  73,  73,  73,  73,  73,  73,  73,  73,  73,  73,  73,  73,
+     77,  77,  77,  77,  77,  77,  77,  77,  77,  77,  77,  77,  77,  77,  77,  77,
+    100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100,   0,
+     16,  16, 101, 102, 103,  50,  52,  28,  28,  23,  23,  25,  25, 104, 105, 106,
+    107,   0,  16,  16,   0,  23,  23,   0,   0,   0,   0,   0,   0,   0, 108, 106,
+     16,  16,  16,  16,   0,   0,   0,   0,   0,   0,   0,  25,  25,  23,  23,   0,
+      0,   0,  16,  16,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     80,  80,  80,  80,  80,  80,   0,  80,   0,   0,   0,   0,   0,  80,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     16,  16,  16,  16,  16,  16,  16,  16,  16,  16, 154,  22,  16,  16,  16,  16,
+     16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,
+     16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,
+     16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,   0,   0,   0,   0,
+      0,   0,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,
+      0,   0,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,
+     16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,  23,  23,  25,  25, 109,  16,  16,
+     16,  16,  16,  16,  16,  16,  16,  16,   0,   0,   0,  25,  25, 110,   0,   0,
+     16,  16,  16,  16,  77,   0,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,
+     16,  16,  16,  16,  16,  16,  16,  16,  16,  16, 111, 112, 113, 114, 115,   0,
+    116, 117, 118, 119,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,
+      0,   0,  16,  16,  77, 120, 121,  28,  28,  23,  23,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,  23,  23,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0, 119,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+    123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+    124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+    125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+    124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+      0,  65,  65,  65,  65,  65,  65,  65,  65,  65,  65,  65,  65,  65,  65,  65,
+     65,  65,  65,  65,  65,  65,  65,  65,  65,  65,  65,   0,   0,   0,   0,   0,
+    126, 126, 126, 126, 126, 126, 126, 126, 127, 127, 127, 127, 127, 127, 127, 127,
+    126, 126, 126, 126, 126, 126, 126, 126, 128, 128, 128, 128, 128, 128, 128, 128,
+    129, 129, 129, 129, 129, 129, 129, 129, 126, 126, 126, 126, 126, 126, 126, 126,
+    127, 127, 127, 127, 127, 127, 127, 127, 126, 126, 126, 126, 126, 126, 126, 126,
+    128, 128, 128, 128, 128, 128, 128, 128, 129, 129, 129, 129, 129, 129, 129, 129,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    129, 129, 129, 129, 129, 129, 129, 129, 128, 128, 128, 128, 128, 128, 128, 128,
+    126, 126, 126, 126, 126, 126, 126, 126, 127, 127, 127, 127, 127, 127, 127, 127,
+    126, 126, 126, 126,   0,   0,   0,   0, 129, 129, 129, 129, 129, 129, 129, 129,
+    128, 128, 128, 128, 128, 128, 128, 128, 126, 126, 126, 126, 126, 126, 126, 126,
+    127, 127, 127, 127, 127, 127, 127, 127, 126, 126, 126, 126,   0,   0,   0,   0,
+     60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,
+     60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,
+     60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,
+     60,  60,  60,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     65,  65,  65,  65,  65,  65,  65,  65,  65,  65,  65,  65,  65,  65,  65,  65,
+     65,  65,  65,  65,  65,  65,  65,  65,  65,  65,  65,  65,  65,  65,  65,  65,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
+    130, 130,  98,  98, 130, 130,  99,  99, 130, 130,  98,  98, 130, 130, 131, 131,
+    130, 130,  98,  98, 130, 130,  99,  99, 130, 130,  98,  98, 130, 130, 132, 132,
+     72,  72, 130, 130,  98,  98, 130, 130,  99,  99, 130, 130,  98,  98, 130, 130,
+    131, 131, 130, 130,  98,  98, 130, 130,  99,  99, 130, 130,  98,  98, 130, 130,
+    132, 132,  72,  72,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0
+};
+
+static RE_AllCases re_all_cases_table_4[] = {
+    {    0,     0,     0},
+    {   32,     0,     0},
+    {   32,   304,     0},
+    {   32,  8490,     0},
+    {   32,   383,     0},
+    {   32,  8491,     0},
+    {   32,   976,     0},
+    {   32,  1013,     0},
+    {   32,   977,  1012},
+    {  252,   921,  8126},
+    {   32,  1008,     0},
+    {  777,   924,     0},
+    {   32,  7296,     0},
+    {   32,  7297,     0},
+    {   32,  7298,     0},
+    {  376,     0,     0},
+    {    1,     0,     0},
+    {   14,   456,     0},
+    {    2,   498,     0},
+    {   96,   962,     0},
+    {    1,  7303,     0},
+    {    1,  7835,     0},
+    {47811, 42570,     0},
+    {    3,     0,     0},
+    {    2,   453,     0},
+    {    7,     0,     0},
+    {    6,   459,     0},
+    {  127,     0,     0},
+    {   15,     0,     0},
+    {  391,     0,     0},
+    {  978,     0,     0},
+    {  991,     0,     0},
+    {  989,     0,     0},
+    {   83,     0,     0},
+    {  982,     0,     0},
+    {  971,     0,     0},
+    { 1011,     0,     0},
+    { 1015,     0,     0},
+    { 1023,     0,     0},
+    { 1007,     0,     0},
+    { 1002,     0,     0},
+    {  806,     0,     0},
+    {  810,     0,     0},
+    {   31,     0,     0},
+    {  827,     0,     0},
+    {  825,     0,     0},
+    {  805,     0,     0},
+    {   99,     0,     0},
+    {   72,     0,     0},
+    {  958,     0,     0},
+    {11871,     0,     0},
+    {  935,     0,     0},
+    {11864,     0,     0},
+    {  963,     0,     0},
+    {  205,     0,     0},
+    {  201,     0,     0},
+    {  140,     0,     0},
+    {   42,     0,     0},
+    {   37,     0,     0},
+    {   39,     0,     0},
+    {   64,     0,     0},
+    {   67,     0,     0},
+    {   65,     0,     0},
+    {   96,   982,     0},
+    {   96,  1009,     0},
+    {   96,     0,     0},
+    {   96,   981,     0},
+    {   96,  8486,     0},
+    {   96,  7299,     0},
+    {   96,  7300,  7301},
+    {   96,  7302,     0},
+    {   24,     0,     0},
+    {   98,     0,     0},
+    {   48,     0,     0},
+    {   11,     0,     0},
+    {  134,     0,     0},
+    {  130,     0,     0},
+    {   80,     0,     0},
+    {  208,     0,     0},
+    {15776,     0,     0},
+    {15840,     0,     0},
+    {    8,     0,     0},
+    { 3136,     0,     0},
+    { 7745,     0,     0},
+    {  202,     0,     0},
+    {  186,     0,     0},
+    {  190,     0,     0},
+    {  172,     0,     0},
+    {  144,     0,     0},
+    {    9,     0,     0},
+    {  128,     0,     0},
+    {  124,     0,     0},
+    {   16,     0,     0},
+    {  102,     0,     0},
+    {  106,     0,     0},
+    {  110,     0,     0},
+    {   26,     0,     0},
+    {   30,     0,     0},
+    {   38,     0,     0},
+    {   46,     0,     0},
+    {  112,     0,     0},
+    {11785,     0,     0},
+    {12574,     0,     0},
+    {11801,     0,     0},
+    {11836,     0,     0},
+    {11807,     0,     0},
+    {11839,     0,     0},
+    {11810,     0,     0},
+    {11841,     0,     0},
+    {47620,     0,     0},
+    {42472,     0,     0},
+    {42444,     0,     0},
+    {42487,     0,     0},
+    {42445,     0,     0},
+    {42433,     0,     0},
+    {42436,     0,     0},
+    {42286,     0,     0},
+    {42294,     0,     0},
+    {42287,     0,     0},
+    { 3296,     0,     0},
+    {42311,     0,     0},
+    {47688,     0,     0},
+    {47312,     0,     0},
+    {47152,     0,     0},
+    {47184,     0,     0},
+    {47216,     0,     0},
+    {   40,     0,     0},
+    {   56,     0,     0},
+    {   88,     0,     0},
+    {  104,     0,     0},
+    {   34,     0,     0},
+    {   62,     0,     0},
+    {   94,     0,     0},
+    {  345,     0,     0},
+    {   32,   305,     0},
+    { 8545,   107,     0},
+    {  300,   115,     0},
+    { 8686,   229,     0},
+    {   66,   946,     0},
+    {   96,   949,     0},
+    {   73,   952,  1012},
+    {  108,   952,   977},
+    {  220,   953,  8126},
+    { 7419,   921,   953},
+    {  106,   954,     0},
+    {  809,   956,     0},
+    { 6290,  1074,     0},
+    { 6293,  1076,     0},
+    { 6300,  1086,     0},
+    {   15,   457,     0},
+    {    3,   499,     0},
+    {   97,   963,     0},
+    { 6373,  1123,     0},
+    {  251,  7777,     0},
+    {47810, 42571,     0},
+    {    1,   454,     0},
+    {    1,   460,     0},
+    {  118,   960,     0},
+    {   80,   961,     0},
+    {  115,   966,     0},
+    { 8847,   969,     0},
+    { 6306,  1089,     0},
+    { 6310,  1090,  7301},
+    { 6311,  1090,  7300},
+    { 6316,  1098,     0}
+};
+
+int re_get_all_cases(RE_UINT32 codepoint, RE_UINT32* cases) {
+    RE_UINT32 field_2;
+    RE_UINT32 field_1;
+    RE_UINT32 field_0;
+    RE_UINT32 v;
+
+    field_2 = codepoint >> 10;
+    field_1 = (codepoint >> 5) & 0x1F;
+    field_0 = codepoint & 0x1F;
+
+    v = re_all_cases_table_1[field_2];
+    v = re_all_cases_table_2[(v << 5) | field_1];
+    v = re_all_cases_table_3[(v << 5) | field_0];
+
+    cases[0] = codepoint;
+
+    if (re_all_cases_table_4[v].delta == 0)
+        return 1;
+
+    cases[1] = codepoint ^ re_all_cases_table_4[v].delta;
+
+    if (re_all_cases_table_4[v].others[0] == 0)
+        return 2;
+
+    cases[2] = re_all_cases_table_4[v].others[0];
+
+    if (re_all_cases_table_4[v].others[1] == 0)
+        return 3;
+
+    cases[3] = re_all_cases_table_4[v].others[1];
+
+    return 4;
 }
 
-/* Simple_Case_Folding. */
+/* Simple case folding. */
+static RE_UINT8 re_simple_folding_table_1[] = {
+     0,  1,  2,  2,  3,  2,  2,  4,  5,  6,  2,  7,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  8,  9,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2, 10,
+     2, 11,  2, 12,  2,  2, 13,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2, 14,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2, 15,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2
+};
 
-static RE_UINT8 re_simple_case_folding_stage_1[] = {
-    0, 1, 2, 2, 2, 3, 2, 4, 5, 2, 2, 6, 2, 2, 2, 7,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2,
+static RE_UINT8 re_simple_folding_table_2[] = {
+     0,  0,  1,  0,  0,  2,  3,  0,  4,  5,  6,  7,  8,  9, 10, 11,
+     4, 12, 13,  0,  0,  0,  0,  0,  0,  0, 14, 15, 16, 17, 18, 19,
+    20, 21,  0,  4, 22,  4, 23,  4,  4, 24, 25,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0, 26, 27,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 28,
+     0,  0,  0,  0, 29, 30,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     4,  4,  4,  4, 31,  4,  4,  4, 32, 33, 34, 35, 33, 36, 37, 38,
+     0,  0,  0,  0,  0,  0,  0,  0,  0, 39,  0, 40, 41,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0, 42, 43,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    44, 45,  0, 46,  4,  4,  4, 47,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  4, 48, 49,  0,  0,  0,  0, 50,  4, 51, 52, 53, 54, 55,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 56, 57, 58,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0, 59,  0,  0,  0,  0,  0,  0,
+    60, 61,  0,  0,  0, 62, 63,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0, 64, 65,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0, 66,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0, 67,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0, 68, 69,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0
 };
 
-static RE_UINT8 re_simple_case_folding_stage_2[] = {
-     0,  1,  2,  3,  4,  5,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,
-     7,  6,  6,  8,  6,  6,  6,  6,  6,  6,  6,  6,  9,  6, 10, 11,
-     6, 12,  6,  6, 13,  6,  6,  6,  6,  6,  6,  6, 14,  6,  6,  6,
-     6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,
-     6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,
-     6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,
-     6,  6,  6,  6,  6,  6, 15, 16,  6,  6,  6, 17,  6,  6,  6,  6,
-     6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,
-     6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,
-     6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6, 18,
-     6,  6,  6,  6, 19,  6,  6,  6,  6,  6,  6,  6, 20,  6,  6,  6,
-     6,  6,  6,  6,  6,  6,  6,  6, 21,  6,  6,  6,  6,  6,  6,  6,
-     6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6, 22,  6,
-     6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,
-     6,  6,  6,  6,  6,  6,  6,  6,  6, 23,  6,  6,  6,  6,  6,  6,
-     6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,
+static RE_UINT8 re_simple_folding_table_3[] = {
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,  18,  18,  18,  18,  18,  18,  18,  18,  66,  18,  18,  18,  18,  18,  18,
+     18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,  68,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,
+     18,  18,  18,  18,  18,  18,  18,   0,  18,  18,  18,  18,  18,  18,  18,   0,
+      1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,
+      1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,
+      1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,
+     65,   0,   1,   0,   1,   0,   1,   0,   0,   3,   0,   5,   0,   3,   0,  49,
+      0,   3,   0,   5,   0,   3,   0,  10,   0,   0,   1,   0,   1,   0,   1,   0,
+      1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,
+      1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,
+      1,   0,   1,   0,   1,   0,   1,   0,  67,   3,   0,   5,   0,   3,   0,  64,
+      0,  78,   1,   0,   1,   0,  78,  10,   0,  81,  80,   5,   0,   0,  36,  79,
+     77,   3,   0,  84,  85,   0,  86,  86,   1,   0,   0,   0,  84,  83,   0,  82,
+      1,   0,   1,   0,   1,   0,  70,  10,   0,  71,   0,   0,   1,   0,  70,  17,
+      0,  73,  72,   5,   0,   3,   0,  69,   1,   0,   0,   0,   1,   0,   0,   0,
+      0,   0,   0,   0,   2,   3,   0,   9,   1,   0,   4,   5,   0,   3,   0,  17,
+      0,   3,   0,   5,   0,   3,   0,  10,   0,   3,   0,   5,   0,   0,   1,   0,
+      1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,
+      0,   2,   1,   0,   1,   0,  41,  32,   1,   0,   1,   0,   1,   0,   1,   0,
+     75,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,
+      1,   0,   1,   0,   0,   0,   0,   0,   0,   0, 110,   5,   0,  74, 109,   0,
+      0,   3,   0,  76,  60,  58,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,  63,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      1,   0,   1,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,  53,
+      0,   0,   0,   0,   0,   0,  24,   0,  20,  22,  20,   0,  29,   0,  31,  30,
+      0,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,
+     39,  39,   0,  39,  39,  39,  39,  39,  39,  39,  39,  39,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  14,
+     40,  44,   0,   0,   0,  12,  13,   0,   1,   0,   1,   0,   1,   0,   1,   0,
+      1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,
+     33,  26,   0,   0,  34,  29,   0,  10,   0,   8,   1,   0,   0,  52,  51,  51,
+     35,  35,  35,  35,  35,  35,  35,  35,  35,  35,  35,  35,  35,  35,  35,  35,
+     18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,
+     39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   1,   0,   1,   0,
+      1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,
+     10,   3,   0,   5,   0,   3,   0,  10,   0,   3,   0,   5,   0,   3,   0,   0,
+      1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,
+      1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,
+      0,  35,  35,  35,  35,  35,  35,  35,  35,  35,  35,  35,  35,  35,  35,  35,
+     26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
+     61,  61,  61,  61,  61,  61,  61,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112,
+    112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112,
+    113, 113, 113, 113, 113, 113,   0, 113,   0,   0,   0,   0,   0, 113,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   6,   6,   6,   6,   6,   6,   0,   0,
+     89,  90,  91,  92,  93,  94,  95,  96, 130,   0,   0,   0,   0,   0,   0,   0,
+     87,  87,  87,  87,  87,  87,  87,  87,  87,  87,  87,  87,  87,  87,  87,  87,
+     87,  87,  87,  87,  87,  87,  87,  87,  87,  87,  87,  87,  87,  87,  87,  87,
+     87,  87,  87,  87,  87,  87,  87,  87,  87,  87,  87,   0,   0,  87,  87,  87,
+      1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,
+      1,   0,   1,   0,   1,   0,   0,   0,   0,   0,   0,  62,   0,   0,  98,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   6,   6,   6,   6,   6,   6,   6,   6,
+      0,   0,   0,   0,   0,   0,   0,   0,   6,   6,   6,   6,   6,   6,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   6,   6,   6,   6,   6,   6,   6,   6,
+      0,   0,   0,   0,   0,   0,   0,   0,   6,   6,   6,   6,   6,   6,   6,   6,
+      0,   0,   0,   0,   0,   0,   0,   0,   6,   6,   6,   6,   6,   6,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   6,   0,   6,   0,   6,   0,   6,
+      0,   0,   0,   0,   0,   0,   0,   0,   6,   6,   6,   6,   6,   6,   6,   6,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   6,   6,   6,   6,   6,   6,   6,   6,
+      0,   0,   0,   0,   0,   0,   0,   0,   6,   6,  59,  59,  10,   0,  97,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,  56,  56,  57,  57,  10,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   6,   6,  55,  55,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   6,   6,  54,  54,   7,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,  50,  50,  52,  52,  10,   0,   0,   0,
+      0,   0,   0,   0,   0,   0, 101,   0,   0,   0,  99, 100,   0,   0,   0,   0,
+      0,   0,  48,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   5,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,  42,  42,  45,  45,  46,  46,  45,  45,  42,  42,
+     15,  15,  16,  16,  15,  15,  21,  21,  24,  24,  25,  25,  24,  24,  21,  21,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
+     35,  35,  35,  35,  35,  35,  35,  35,  35,  35,  35,  35,  35,  35,  35,  35,
+     47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      1,   0, 102, 111, 103,   0,   0,  10,   0,   3,   0,   5,   0, 106, 104, 107,
+    105,   0,   1,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   0, 108, 107,
+      1,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   5,   0,   3,   0,   0,
+      0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,
+      1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   0,   0,   0,   0,
+      0,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,
+      0,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,
+      1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   5,   0, 128,   1,   0,
+      1,   0,   1,   0,   1,   0,   1,   0,   0,   0,   0,   5,   0, 122,   0,   0,
+      1,   0,   1,   0,   0,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,
+      1,   0,   1,   0,   1,   0,   1,   0,   1,   0, 120, 123, 121, 118, 119,   0,
+    114, 116, 115,  88,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,
+      0,   0,   1,   0,  35, 117, 129,  10,   0,   3,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+    124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+    125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+    126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+    125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+      0,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,
+     39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,   0,   0,   0,   0,   0,
+     23,  23,  23,  23,  23,  23,  23,  23,  27,  27,  27,  27,  27,  27,  27,  27,
+     23,  23,  23,  23,  23,  23,  23,  23,  37,  37,  37,  37,  37,  37,  37,  37,
+     43,  43,  43,  43,  43,  43,  43,  43,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     43,  43,  43,  43,  43,  43,  43,  43,  37,  37,  37,  37,  37,  37,  37,  37,
+     23,  23,  23,  23,  23,  23,  23,  23,  27,  27,  27,  27,  27,  27,  27,  27,
+     23,  23,  23,  23,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     29,  29,  29,  29,  29,  29,  29,  29,  29,  29,  29,  29,  29,  29,  29,  29,
+     29,  29,  29,  29,  29,  29,  29,  29,  29,  29,  29,  29,  29,  29,  29,  29,
+     29,  29,  29,  29,  29,  29,  29,  29,  29,  29,  29,  29,  29,  29,  29,  29,
+     29,  29,  29,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,
+     39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,
+     18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,
+     18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,
+     19,  19,  21,  21,  19,  19,  25,  25,  19,  19,  21,  21,  19,  19,  28,  28,
+     19,  19,  21,  21,  19,  19,  25,  25,  19,  19,  21,  21,  19,  19,  38,  38,
+     40,  40,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0
+};
+
+static RE_UINT16 re_simple_folding_table_4[] = {
+        0,     1,     2,     3,     6,     7,     8,     9,
+       11,    14,    15,    16,    19,    22,    24,    26,
+       30,    31,    32,    34,    37,    38,    39,    40,
+       42,    46,    48,    56,    62,    64,    65,    67,
+       72,    74,    76,    80,    83,    88,    94,    96,
+       98,    99,   102,   104,   105,   106,   110,   112,
+      124,   127,   128,   130,   134,   140,   144,   172,
+      186,   190,   201,   202,   205,   208,   250,   252,
+      268,   345,   376,   391,   777,   805,   806,   810,
+      825,   827,   935,   958,   963,   971,   978,   982,
+      989,   991,  1002,  1007,  1011,  1015,  1023,  3136,
+     3296,  6322,  6325,  6332,  6338,  6342,  6343,  6348,
+     6372,  7175,  7745,  8513,  8654,  8943, 11785, 11801,
+    11807, 11810, 11836, 11839, 11841, 11864, 11871, 12574,
+    15776, 15840, 42286, 42287, 42294, 42311, 42433, 42436,
+    42444, 42445, 42472, 42487, 47152, 47184, 47216, 47312,
+    47620, 47688, 47811
+};
+
+RE_UINT32 re_get_simple_case_folding(RE_UINT32 codepoint) {
+    RE_UINT32 field_2;
+    RE_UINT32 field_1;
+    RE_UINT32 field_0;
+    RE_UINT32 v;
+
+    field_2 = codepoint >> 10;
+    field_1 = (codepoint >> 5) & 0x1F;
+    field_0 = codepoint & 0x1F;
+
+    v = re_simple_folding_table_1[field_2];
+    v = re_simple_folding_table_2[(v << 5) | field_1];
+    v = re_simple_folding_table_3[(v << 5) | field_0];
+
+    return codepoint ^ re_simple_folding_table_4[v];
+}
+
+/* Full case folding. */
+static RE_UINT8 re_full_folding_table_1[] = {
+     0,  1,  2,  2,  3,  2,  2,  4,  5,  6,  2,  7,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  8,  9,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2, 10, 11,
+     2, 12,  2, 13,  2,  2, 14,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2, 15,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2, 16,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2
 };
 
-static RE_UINT8 re_simple_case_folding_stage_3[] = {
-     0,  0,  0,  0,  0,  0,  0,  0,  1,  2,  2,  3,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0,  4,  0,  2,  2,  5,  5,  0,  0,  0,  0,
-     6,  6,  6,  6,  6,  6,  7,  8,  8,  7,  6,  6,  6,  6,  6,  9,
-    10, 11, 12, 13, 14, 15, 16, 17, 18, 19,  8, 20,  6,  6, 21,  6,
-     6,  6,  6,  6, 22,  6, 23, 24, 25,  6,  0,  0,  0,  0,  0,  0,
+static RE_UINT8 re_full_folding_table_2[] = {
+     0,  0,  1,  0,  0,  2,  3,  0,  4,  5,  6,  7,  8,  9, 10, 11,
+     4, 12, 13,  0,  0,  0,  0,  0,  0,  0, 14, 15, 16, 17, 18, 19,
+    20, 21,  0,  4, 22,  4, 23,  4,  4, 24, 25,  0, 26,  0,  0,  0,
      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0,  0,  0, 26,  0,  0,  0,  0,  0, 27, 28,
-    29, 30,  1,  2, 31, 32,  0,  0, 33, 34, 35,  6,  6,  6, 36, 37,
-    38, 38,  2,  2,  2,  2,  0,  0,  0,  0,  0,  0,  6,  6,  6,  6,
-    39,  7,  6,  6,  6,  6,  6,  6, 40, 41,  6,  6,  6,  6,  6,  6,
-     6,  6,  6,  6,  6,  6, 42, 43, 43, 43, 44,  0,  0,  0,  0,  0,
      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0, 27, 28,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 29,
+     0,  0,  0,  0, 30, 31,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     4,  4,  4,  4, 32,  4,  4,  4, 33, 34, 35, 36, 37, 38, 39, 40,
+     0,  0,  0,  0,  0,  0,  0,  0,  0, 41,  0, 42, 43,  0,  0,  0,
      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0, 44, 45,  0,  0,  0,  0,  0,  0,  0,  0,  0,
      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0, 45, 45, 45, 45, 46, 47,  0,  0,  0,  0,  0,  0,
+    46, 47,  0, 48,  4,  4,  4, 49,  0,  0,  0,  0,  0,  0,  0,  0,
      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 48,
      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    49, 50, 51, 51, 51, 51, 51, 52,  0,  0,  0,  0,  0,  0,  0,  0,
-     6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,
-     6,  6, 53, 54,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,
-     0, 55,  0, 48,  0, 55,  0, 55,  0, 48,  0, 56,  0, 55,  0,  0,
-     0, 55,  0, 55,  0, 55,  0, 57,  0, 58,  0, 59,  0, 60,  0, 61,
-     0,  0,  0,  0, 62, 63, 64,  0,  0,  0,  0,  0, 65, 65,  0,  0,
-    66,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  4, 50, 51,  0,  0,  0,  0, 52,  4, 53, 54, 55, 56, 57,
      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0, 67, 68, 68, 68,  0,  0,  0,  0,  0,  0,
-    43, 43, 43, 43, 43, 44,  0,  0,  0,  0,  0,  0, 69, 70, 71, 72,
-     6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6, 23, 73, 33,  0,
-     0,  0,  0,  0,  0,  0,  0,  0,  6,  6,  6,  6,  6, 53,  0,  0,
-     6,  6,  6, 23,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  7,  6,  7,  6,  6,  6,  6,  6,  6,  6,  0, 74,
-     6, 75, 27,  6,  6, 76, 77,  6, 78,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 79, 79,
-    79, 79, 79, 79, 79, 79, 79, 79,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  1,  2,  2,  3,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 58, 59, 60,  0,  0,
      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    80, 80, 80, 80, 80,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0, 80, 80, 80, 80, 81,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0, 61,  0,  0,  0,  0,  0,  0,  0,
      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    82, 82, 82, 82, 82, 82, 83,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0, 62,  0,  0,  0,  0,  0,  0,
+    63, 64,  0,  0,  0, 65, 66,  0,  0,  0,  0,  0,  0,  0,  0,  0,
      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  2,  2,  2,  2,  0,  0,  0,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0,  0,  0,  2,  2,  2,  2,  0,  0,  0,  0,
+     0,  0,  0,  0, 67, 68,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    84, 84, 84, 84, 85,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0, 69,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0, 70,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0, 71, 72,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0
 };
 
-static RE_UINT8 re_simple_case_folding_stage_4[] = {
-     0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  1,  1,  1,  1,  1,  1,
-     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  2,  0,  0,  1,  1,  1,  1,  1,  1,  1,  0,
-     3,  0,  3,  0,  3,  0,  3,  0,  0,  0,  3,  0,  3,  0,  3,  0,
-     0,  3,  0,  3,  0,  3,  0,  3,  4,  3,  0,  3,  0,  3,  0,  5,
-     0,  6,  3,  0,  3,  0,  7,  3,  0,  8,  8,  3,  0,  0,  9, 10,
-    11,  3,  0,  8, 12,  0, 13, 14,  3,  0,  0,  0, 13, 15,  0, 16,
-     3,  0,  3,  0,  3,  0, 17,  3,  0, 17,  0,  0,  3,  0, 17,  3,
-     0, 18, 18,  3,  0,  3,  0, 19,  3,  0,  0,  0,  3,  0,  0,  0,
-     0,  0,  0,  0, 20,  3,  0, 20,  3,  0, 20,  3,  0,  3,  0,  3,
-     0,  3,  0,  3,  0,  0,  3,  0,  0, 20,  3,  0,  3,  0, 21, 22,
-    23,  0,  3,  0,  3,  0,  3,  0,  3,  0,  3,  0,  0,  0,  0,  0,
-     0,  0, 24,  3,  0, 25, 26,  0,  0,  3,  0, 27, 28, 29,  3,  0,
-     0,  0,  0,  0,  0, 30,  0,  0,  3,  0,  3,  0,  0,  0,  3,  0,
-     0,  0,  0,  0,  0,  0,  0, 30,  0,  0,  0,  0,  0,  0, 31,  0,
-    32, 32, 32,  0, 33,  0, 34, 34,  1,  1,  0,  1,  1,  1,  1,  1,
-     1,  1,  1,  1,  0,  0,  0,  0,  0,  0,  3,  0,  0,  0,  0,  0,
-     0,  0,  0,  0,  0,  0,  0, 35, 36, 37,  0,  0,  0, 38, 39,  0,
-    40, 41,  0,  0, 42, 43,  0,  3,  0, 44,  3,  0,  0, 23, 23, 23,
-    45, 45, 45, 45, 45, 45, 45, 45,  3,  0,  0,  0,  0,  0,  0,  0,
-    46,  3,  0,  3,  0,  3,  0,  3,  0,  3,  0,  3,  0,  3,  0,  0,
-     0, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
-    47, 47, 47, 47, 47, 47, 47,  0, 48, 48, 48, 48, 48, 48, 48, 48,
-    48, 48, 48, 48, 48, 48,  0, 48,  0,  0,  0,  0,  0, 48,  0,  0,
-    49, 49, 49, 49, 49, 49,  0,  0, 50, 51, 52, 53, 53, 54, 55, 56,
-    57,  0,  0,  0,  0,  0,  0,  0, 58, 58, 58, 58, 58, 58, 58, 58,
-    58, 58, 58,  0,  0, 58, 58, 58,  3,  0,  3,  0,  3,  0,  0,  0,
-     0,  0,  0, 59,  0,  0, 60,  0, 49, 49, 49, 49, 49, 49, 49, 49,
-     0, 49,  0, 49,  0, 49,  0, 49, 49, 49, 61, 61, 62,  0, 63,  0,
-    64, 64, 64, 64, 62,  0,  0,  0, 49, 49, 65, 65,  0,  0,  0,  0,
-    49, 49, 66, 66, 44,  0,  0,  0, 67, 67, 68, 68, 62,  0,  0,  0,
-     0,  0,  0,  0,  0,  0, 69,  0,  0,  0, 70, 71,  0,  0,  0,  0,
-     0,  0, 72,  0,  0,  0,  0,  0, 73, 73, 73, 73, 73, 73, 73, 73,
-     0,  0,  0,  3,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 74, 74,
-    74, 74, 74, 74, 74, 74, 74, 74,  3,  0, 75, 76, 77,  0,  0,  3,
-     0,  3,  0,  3,  0, 78, 79, 80, 81,  0,  3,  0,  0,  3,  0,  0,
-     0,  0,  0,  0,  0,  0, 82, 82,  0,  0,  0,  3,  0,  3,  0,  0,
-     0,  3,  0,  3,  0, 83,  3,  0,  0,  0,  0,  3,  0, 84,  0,  0,
-     3,  0, 85, 86, 87, 88, 85,  0, 89, 90, 91, 92,  3,  0,  3,  0,
-     0,  0,  3,  0, 41, 93, 94,  0, 95, 95, 95, 95, 95, 95, 95, 95,
-    96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96,  0,  0,  0,  0,
-    33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33,  0,  0,  0,  0,  0,
-    97, 97, 97, 97, 97, 97, 97, 97, 97, 97,  0,  0,  0,  0,  0,  0,
-};
-
-/* Simple_Case_Folding: 1848 bytes. */
-
-static RE_INT32 re_simple_case_folding_table[] = {
-         0,
-        32,
-       775,
-         1,
-      -121,
-      -268,
-       210,
-       206,
-       205,
-        79,
-       202,
-       203,
-       207,
-       211,
-       209,
-       213,
-       214,
-       218,
-       217,
-       219,
-         2,
-       -97,
-       -56,
-      -130,
-     10795,
-      -163,
-     10792,
-      -195,
-        69,
-        71,
-       116,
-        38,
-        37,
-        64,
-        63,
-         8,
-       -30,
-       -25,
-       -15,
-       -22,
-       -54,
-       -48,
-       -60,
-       -64,
-        -7,
-        80,
-        15,
-        48,
-      7264,
-        -8,
-     -6222,
-     -6221,
-     -6212,
-     -6210,
-     -6211,
-     -6204,
-     -6180,
-     35267,
-     -3008,
-       -58,
-     -7615,
-       -74,
-        -9,
-     -7173,
-       -86,
-      -100,
-      -112,
-      -128,
-      -126,
-     -7517,
-     -8383,
-     -8262,
-        28,
-        16,
-        26,
-    -10743,
-     -3814,
-    -10727,
-    -10780,
-    -10749,
-    -10783,
-    -10782,
-    -10815,
-    -35332,
-    -42280,
-    -42308,
-    -42319,
-    -42315,
-    -42305,
-    -42258,
-    -42282,
-    -42261,
-       928,
-    -42307,
-    -35384,
-    -38864,
-        40,
-        34,
-};
-
-/* Simple_Case_Folding: 392 bytes. */
-
-RE_UINT32 re_get_simple_case_folding(RE_UINT32 ch) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-    RE_INT32 diff;
-
-    f = ch >> 13;
-    code = ch ^ (f << 13);
-    pos = (RE_UINT32)re_simple_case_folding_stage_1[f] << 5;
-    f = code >> 8;
-    code ^= f << 8;
-    pos = (RE_UINT32)re_simple_case_folding_stage_2[pos + f] << 5;
-    f = code >> 3;
-    code ^= f << 3;
-    pos = (RE_UINT32)re_simple_case_folding_stage_3[pos + f] << 3;
-    value = re_simple_case_folding_stage_4[pos + code];
-
-    diff = re_simple_case_folding_table[value];
-
-    return (RE_UINT32)((RE_INT32)ch + diff);
-}
-
-/* Full_Case_Folding. */
-
-static RE_UINT8 re_full_case_folding_stage_1[] = {
-    0, 1, 2, 2, 2, 3, 2, 4, 5, 2, 2, 6, 2, 2, 2, 7,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2,
-};
-
-static RE_UINT8 re_full_case_folding_stage_2[] = {
-     0,  1,  2,  3,  4,  5,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,
-     7,  6,  6,  8,  6,  6,  6,  6,  6,  6,  6,  6,  9,  6, 10, 11,
-     6, 12,  6,  6, 13,  6,  6,  6,  6,  6,  6,  6, 14,  6,  6,  6,
-     6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,
-     6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,
-     6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,
-     6,  6,  6,  6,  6,  6, 15, 16,  6,  6,  6, 17,  6,  6,  6,  6,
-     6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,
-     6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,
-     6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6, 18,  6,  6,  6, 19,
-     6,  6,  6,  6, 20,  6,  6,  6,  6,  6,  6,  6, 21,  6,  6,  6,
-     6,  6,  6,  6,  6,  6,  6,  6, 22,  6,  6,  6,  6,  6,  6,  6,
-     6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6, 23,  6,
-     6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,
-     6,  6,  6,  6,  6,  6,  6,  6,  6, 24,  6,  6,  6,  6,  6,  6,
-     6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,
-};
-
-static RE_UINT8 re_full_case_folding_stage_3[] = {
-      0,   0,   0,   0,   0,   0,   0,   0,   1,   2,   2,   3,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   4,   0,   2,   2,   5,   6,   0,   0,   0,   0,
-      7,   7,   7,   7,   7,   7,   8,   9,   9,  10,   7,   7,   7,   7,   7,  11,
-     12,  13,  14,  15,  16,  17,  18,  19,  20,  21,   9,  22,   7,   7,  23,   7,
-      7,   7,   7,   7,  24,   7,  25,  26,  27,   7,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,  28,   0,   0,   0,   0,   0,  29,  30,
-     31,  32,  33,   2,  34,  35,  36,   0,  37,  38,  39,   7,   7,   7,  40,  41,
-     42,  42,   2,   2,   2,   2,   0,   0,   0,   0,   0,   0,   7,   7,   7,   7,
-     43,  44,   7,   7,   7,   7,   7,   7,  45,  46,   7,   7,   7,   7,   7,   7,
-      7,   7,   7,   7,   7,   7,  47,  48,  48,  48,  49,   0,   0,   0,   0,   0,
-     50,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,  51,  51,  51,  51,  52,  53,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  54,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     55,  56,  57,  57,  57,  57,  57,  58,   0,   0,   0,   0,   0,   0,   0,   0,
-      7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
-      7,   7,  59,  60,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
-      0,  61,   0,  54,   0,  61,   0,  61,   0,  54,  62,  63,   0,  61,   0,   0,
-     64,  65,  66,  67,  68,  69,  70,  71,  72,  73,  74,  75,  76,  77,  78,  79,
-      0,   0,   0,   0,  80,  81,  82,   0,   0,   0,   0,   0,  83,  83,   0,   0,
-     84,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,  85,  86,  86,  86,   0,   0,   0,   0,   0,   0,
-     48,  48,  48,  48,  48,  49,   0,   0,   0,   0,   0,   0,  87,  88,  89,  90,
-      7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,  25,  91,  37,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   7,   7,   7,   7,   7,  92,   0,   0,
-      7,   7,   7,  25,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,  44,   7,  44,   7,   7,   7,   7,   7,   7,   7,   0,  93,
-      7,  94,  29,   7,   7,  95,  96,   7,  97,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  98,  98,
-     98,  98,  98,  98,  98,  98,  98,  98,   0,   0,   0,   0,   0,   0,   0,   0,
-     99,   0, 100,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+static RE_UINT8 re_full_folding_table_3[] = {
       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   1,   2,   2,   3,   0,   0,   0,   0,   0,   0,   0,   0,
       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-    101, 101, 101, 101, 101,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0, 101, 101, 101, 101, 102,   0,   0,   0,   0,   0,
+      0,  18,  18,  18,  18,  18,  18,  18,  18,  80,  18,  18,  18,  18,  18,  18,
+     18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,   0,   0,   0,   0,   0,
       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-    103, 103, 103, 103, 103, 103, 104,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   2,   2,   2,   2,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   2,   2,   2,   2,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-    105, 105, 105, 105, 106,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-};
-
-static RE_UINT8 re_full_case_folding_stage_4[] = {
-      0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   2,   0,   0,   1,   1,   1,   1,   1,   1,   1,   0,
-      1,   1,   1,   1,   1,   1,   1,   3,   4,   0,   4,   0,   4,   0,   4,   0,
-      5,   0,   4,   0,   4,   0,   4,   0,   0,   4,   0,   4,   0,   4,   0,   4,
-      0,   6,   4,   0,   4,   0,   4,   0,   7,   4,   0,   4,   0,   4,   0,   8,
-      0,   9,   4,   0,   4,   0,  10,   4,   0,  11,  11,   4,   0,   0,  12,  13,
-     14,   4,   0,  11,  15,   0,  16,  17,   4,   0,   0,   0,  16,  18,   0,  19,
-      4,   0,   4,   0,   4,   0,  20,   4,   0,  20,   0,   0,   4,   0,  20,   4,
-      0,  21,  21,   4,   0,   4,   0,  22,   4,   0,   0,   0,   4,   0,   0,   0,
-      0,   0,   0,   0,  23,   4,   0,  23,   4,   0,  23,   4,   0,   4,   0,   4,
-      0,   4,   0,   4,   0,   0,   4,   0,  24,  23,   4,   0,   4,   0,  25,  26,
-     27,   0,   4,   0,   4,   0,   4,   0,   4,   0,   4,   0,   0,   0,   0,   0,
-      0,   0,  28,   4,   0,  29,  30,   0,   0,   4,   0,  31,  32,  33,   4,   0,
-      0,   0,   0,   0,   0,  34,   0,   0,   4,   0,   4,   0,   0,   0,   4,   0,
-      0,   0,   0,   0,   0,   0,   0,  34,   0,   0,   0,   0,   0,   0,  35,   0,
-     36,  36,  36,   0,  37,   0,  38,  38,  39,   1,   1,   1,   1,   1,   1,   1,
-      1,   1,   0,   1,   1,   1,   1,   1,   1,   1,   1,   1,   0,   0,   0,   0,
-     40,   0,   0,   0,   0,   0,   0,   0,   0,   0,   4,   0,   0,   0,   0,   0,
-      0,   0,   0,   0,   0,   0,   0,  41,  42,  43,   0,   0,   0,  44,  45,   0,
-     46,  47,   0,   0,  48,  49,   0,   4,   0,  50,   4,   0,   0,  27,  27,  27,
-     51,  51,  51,  51,  51,  51,  51,  51,   4,   0,   0,   0,   0,   0,   0,   0,
-      0,   0,   4,   0,   4,   0,   4,   0,  52,   4,   0,   4,   0,   4,   0,   4,
-      0,   4,   0,   4,   0,   4,   0,   0,   0,  53,  53,  53,  53,  53,  53,  53,
-     53,  53,  53,  53,  53,  53,  53,  53,  53,  53,  53,  53,  53,  53,  53,   0,
-      0,   0,   0,   0,   0,   0,   0,  54,  55,  55,  55,  55,  55,  55,  55,  55,
-     55,  55,  55,  55,  55,  55,   0,  55,   0,   0,   0,   0,   0,  55,   0,   0,
-     56,  56,  56,  56,  56,  56,   0,   0,  57,  58,  59,  60,  60,  61,  62,  63,
-     64,   0,   0,   0,   0,   0,   0,   0,  65,  65,  65,  65,  65,  65,  65,  65,
-     65,  65,  65,   0,   0,  65,  65,  65,   4,   0,   4,   0,   4,   0,  66,  67,
-     68,  69,  70,  71,   0,   0,  72,   0,  56,  56,  56,  56,  56,  56,  56,  56,
-     73,   0,  74,   0,  75,   0,  76,   0,   0,  56,   0,  56,   0,  56,   0,  56,
-     77,  77,  77,  77,  77,  77,  77,  77,  78,  78,  78,  78,  78,  78,  78,  78,
-     79,  79,  79,  79,  79,  79,  79,  79,  80,  80,  80,  80,  80,  80,  80,  80,
-     81,  81,  81,  81,  81,  81,  81,  81,  82,  82,  82,  82,  82,  82,  82,  82,
-      0,   0,  83,  84,  85,   0,  86,  87,  56,  56,  88,  88,  89,   0,  90,   0,
-      0,   0,  91,  92,  93,   0,  94,  95,  96,  96,  96,  96,  97,   0,   0,   0,
-      0,   0,  98,  99,   0,   0, 100, 101,  56,  56, 102, 102,   0,   0,   0,   0,
-      0,   0, 103, 104, 105,   0, 106, 107,  56,  56, 108, 108,  50,   0,   0,   0,
-      0,   0, 109, 110, 111,   0, 112, 113, 114, 114, 115, 115, 116,   0,   0,   0,
-      0,   0,   0,   0,   0,   0, 117,   0,   0,   0, 118, 119,   0,   0,   0,   0,
-      0,   0, 120,   0,   0,   0,   0,   0, 121, 121, 121, 121, 121, 121, 121, 121,
-      0,   0,   0,   4,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 122, 122,
-    122, 122, 122, 122, 122, 122, 122, 122,   4,   0, 123, 124, 125,   0,   0,   4,
-      0,   4,   0,   4,   0, 126, 127, 128, 129,   0,   4,   0,   0,   4,   0,   0,
-      0,   0,   0,   0,   0,   0, 130, 130,   0,   0,   0,   4,   0,   4,   0,   0,
-      4,   0,   4,   0,   4,   0,   0,   0,   0,   4,   0,   4,   0, 131,   4,   0,
-      0,   0,   0,   4,   0, 132,   0,   0,   4,   0, 133, 134, 135, 136, 133,   0,
-    137, 138, 139, 140,   4,   0,   4,   0,   0,   0,   4,   0,  47, 141, 142,   0,
-    143, 143, 143, 143, 143, 143, 143, 143, 144, 145, 146, 147, 148, 149, 150,   0,
-      0,   0,   0, 151, 152, 153, 154, 155, 156, 156, 156, 156, 156, 156, 156, 156,
-    156, 156, 156, 156,   0,   0,   0,   0,  37,  37,  37,  37,  37,  37,  37,  37,
-     37,  37,  37,   0,   0,   0,   0,   0, 157, 157, 157, 157, 157, 157, 157, 157,
-    157, 157,   0,   0,   0,   0,   0,   0,
-};
-
-/* Full_Case_Folding: 2048 bytes. */
-
-static RE_FullCaseFolding re_full_case_folding_table[] = {
-    {     0, {   0,   0}},
-    {    32, {   0,   0}},
-    {   775, {   0,   0}},
-    {  -108, { 115,   0}},
-    {     1, {   0,   0}},
-    {  -199, { 775,   0}},
-    {   371, { 110,   0}},
-    {  -121, {   0,   0}},
-    {  -268, {   0,   0}},
-    {   210, {   0,   0}},
-    {   206, {   0,   0}},
-    {   205, {   0,   0}},
-    {    79, {   0,   0}},
-    {   202, {   0,   0}},
-    {   203, {   0,   0}},
-    {   207, {   0,   0}},
-    {   211, {   0,   0}},
-    {   209, {   0,   0}},
-    {   213, {   0,   0}},
-    {   214, {   0,   0}},
-    {   218, {   0,   0}},
-    {   217, {   0,   0}},
-    {   219, {   0,   0}},
-    {     2, {   0,   0}},
-    {  -390, { 780,   0}},
-    {   -97, {   0,   0}},
-    {   -56, {   0,   0}},
-    {  -130, {   0,   0}},
-    { 10795, {   0,   0}},
-    {  -163, {   0,   0}},
-    { 10792, {   0,   0}},
-    {  -195, {   0,   0}},
-    {    69, {   0,   0}},
-    {    71, {   0,   0}},
-    {   116, {   0,   0}},
-    {    38, {   0,   0}},
-    {    37, {   0,   0}},
-    {    64, {   0,   0}},
-    {    63, {   0,   0}},
-    {    41, { 776, 769}},
-    {    21, { 776, 769}},
-    {     8, {   0,   0}},
-    {   -30, {   0,   0}},
-    {   -25, {   0,   0}},
-    {   -15, {   0,   0}},
-    {   -22, {   0,   0}},
-    {   -54, {   0,   0}},
-    {   -48, {   0,   0}},
-    {   -60, {   0,   0}},
-    {   -64, {   0,   0}},
-    {    -7, {   0,   0}},
-    {    80, {   0,   0}},
-    {    15, {   0,   0}},
-    {    48, {   0,   0}},
-    {   -34, {1410,   0}},
-    {  7264, {   0,   0}},
-    {    -8, {   0,   0}},
-    { -6222, {   0,   0}},
-    { -6221, {   0,   0}},
-    { -6212, {   0,   0}},
-    { -6210, {   0,   0}},
-    { -6211, {   0,   0}},
-    { -6204, {   0,   0}},
-    { -6180, {   0,   0}},
-    { 35267, {   0,   0}},
-    { -3008, {   0,   0}},
-    { -7726, { 817,   0}},
-    { -7715, { 776,   0}},
-    { -7713, { 778,   0}},
-    { -7712, { 778,   0}},
-    { -7737, { 702,   0}},
-    {   -58, {   0,   0}},
-    { -7723, { 115,   0}},
-    { -7051, { 787,   0}},
-    { -7053, { 787, 768}},
-    { -7055, { 787, 769}},
-    { -7057, { 787, 834}},
-    {  -128, { 953,   0}},
-    {  -136, { 953,   0}},
-    {  -112, { 953,   0}},
-    {  -120, { 953,   0}},
-    {   -64, { 953,   0}},
-    {   -72, { 953,   0}},
-    {   -66, { 953,   0}},
-    { -7170, { 953,   0}},
-    { -7176, { 953,   0}},
-    { -7173, { 834,   0}},
-    { -7174, { 834, 953}},
-    {   -74, {   0,   0}},
-    { -7179, { 953,   0}},
-    { -7173, {   0,   0}},
-    {   -78, { 953,   0}},
-    { -7180, { 953,   0}},
-    { -7190, { 953,   0}},
-    { -7183, { 834,   0}},
-    { -7184, { 834, 953}},
-    {   -86, {   0,   0}},
-    { -7189, { 953,   0}},
-    { -7193, { 776, 768}},
-    { -7194, { 776, 769}},
-    { -7197, { 834,   0}},
-    { -7198, { 776, 834}},
-    {  -100, {   0,   0}},
-    { -7197, { 776, 768}},
-    { -7198, { 776, 769}},
-    { -7203, { 787,   0}},
-    { -7201, { 834,   0}},
-    { -7202, { 776, 834}},
-    {  -112, {   0,   0}},
-    {  -118, { 953,   0}},
-    { -7210, { 953,   0}},
-    { -7206, { 953,   0}},
-    { -7213, { 834,   0}},
-    { -7214, { 834, 953}},
-    {  -128, {   0,   0}},
-    {  -126, {   0,   0}},
-    { -7219, { 953,   0}},
-    { -7517, {   0,   0}},
-    { -8383, {   0,   0}},
-    { -8262, {   0,   0}},
-    {    28, {   0,   0}},
-    {    16, {   0,   0}},
-    {    26, {   0,   0}},
-    {-10743, {   0,   0}},
-    { -3814, {   0,   0}},
-    {-10727, {   0,   0}},
-    {-10780, {   0,   0}},
-    {-10749, {   0,   0}},
-    {-10783, {   0,   0}},
-    {-10782, {   0,   0}},
-    {-10815, {   0,   0}},
-    {-35332, {   0,   0}},
-    {-42280, {   0,   0}},
-    {-42308, {   0,   0}},
-    {-42319, {   0,   0}},
-    {-42315, {   0,   0}},
-    {-42305, {   0,   0}},
-    {-42258, {   0,   0}},
-    {-42282, {   0,   0}},
-    {-42261, {   0,   0}},
-    {   928, {   0,   0}},
-    {-42307, {   0,   0}},
-    {-35384, {   0,   0}},
-    {-38864, {   0,   0}},
-    {-64154, { 102,   0}},
-    {-64155, { 105,   0}},
-    {-64156, { 108,   0}},
-    {-64157, { 102, 105}},
-    {-64158, { 102, 108}},
-    {-64146, { 116,   0}},
-    {-64147, { 116,   0}},
-    {-62879, {1398,   0}},
-    {-62880, {1381,   0}},
-    {-62881, {1387,   0}},
-    {-62872, {1398,   0}},
-    {-62883, {1389,   0}},
-    {    40, {   0,   0}},
-    {    34, {   0,   0}},
-};
-
-/* Full_Case_Folding: 1264 bytes. */
-
-int re_get_full_case_folding(RE_UINT32 ch, RE_UINT32* codepoints) {
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-    RE_FullCaseFolding* case_folding;
-    int count;
-
-    f = ch >> 13;
-    code = ch ^ (f << 13);
-    pos = (RE_UINT32)re_full_case_folding_stage_1[f] << 5;
-    f = code >> 8;
-    code ^= f << 8;
-    pos = (RE_UINT32)re_full_case_folding_stage_2[pos + f] << 5;
-    f = code >> 3;
-    code ^= f << 3;
-    pos = (RE_UINT32)re_full_case_folding_stage_3[pos + f] << 3;
-    value = re_full_case_folding_stage_4[pos + code];
-
-    case_folding = &re_full_case_folding_table[value];
-
-    codepoints[0] = (RE_UINT32)((RE_INT32)ch + case_folding->diff);
-    count = 1;
-
-    while (count < RE_MAX_FOLDED && case_folding->codepoints[count - 1] != 0) {
-        codepoints[count] = case_folding->codepoints[count - 1];
-        ++count;
-    }
-
-    return count;
+      0,   0,   0,   0,   0,  83,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,
+     18,  18,  18,  18,  18,  18,  18,   0,  18,  18,  18,  18,  18,  18,  18,  61,
+      1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,
+      1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,
+      1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,
+     79,   0,   1,   0,   1,   0,   1,   0,   0,   3,   0,   5,   0,   3,   0,  51,
+      0,   3,   0,   5,   0,   3,   0,  10,   0, 100,   1,   0,   1,   0,   1,   0,
+      1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,
+      1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,
+      1,   0,   1,   0,   1,   0,   1,   0,  81,   3,   0,   5,   0,   3,   0,  77,
+      0,  93,   1,   0,   1,   0,  93,  10,   0,  96,  95,   5,   0,   0,  37,  94,
+     92,   3,   0,  99, 101,   0, 102, 102,   1,   0,   0,   0,  99,  98,   0,  97,
+      1,   0,   1,   0,   1,   0,  85,  10,   0,  86,   0,   0,   1,   0,  85,  17,
+      0,  88,  87,   5,   0,   3,   0,  84,   1,   0,   0,   0,   1,   0,   0,   0,
+      0,   0,   0,   0,   2,   3,   0,   9,   1,   0,   4,   5,   0,   3,   0,  17,
+      0,   3,   0,   5,   0,   3,   0,  10,   0,   3,   0,   5,   0,   0,   1,   0,
+      1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,
+     82,   2,   1,   0,   1,   0,  42,  33,   1,   0,   1,   0,   1,   0,   1,   0,
+     90,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,
+      1,   0,   1,   0,   0,   0,   0,   0,   0,   0, 158,   5,   0,  89, 157,   0,
+      0,   3,   0,  91,  72,  70,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,  76,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      1,   0,   1,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,  57,
+      0,   0,   0,   0,   0,   0,  25,   0,  20,  22,  20,   0,  30,   0,  32,  31,
+     24,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,
+     40,  40,   0,  40,  40,  40,  40,  40,  40,  40,  40,  40,   0,   0,   0,   0,
+     49,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  14,
+     41,  45,   0,   0,   0,  12,  13,   0,   1,   0,   1,   0,   1,   0,   1,   0,
+      1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,
+     34,  27,   0,   0,  35,  30,   0,  10,   0,   8,   1,   0,   0,  55,  54,  54,
+     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,
+     18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,
+     40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   1,   0,   1,   0,
+      1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,
+     10,   3,   0,   5,   0,   3,   0,  10,   0,   3,   0,   5,   0,   3,   0,   0,
+      1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,
+      1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,
+      0,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,
+     27,  27,  27,  27,  27,  27,  27,  27,  27,  27,  27,  27,  27,  27,  27,  27,
+     73,  73,  73,  73,  73,  73,  73,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,  74,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+    160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+    161, 161, 161, 161, 161, 161,   0, 161,   0,   0,   0,   0,   0, 161,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   6,   6,   6,   6,   6,   6,   0,   0,
+    105, 106, 107, 108, 109, 110, 111, 112, 178,   0,   0,   0,   0,   0,   0,   0,
+    103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103,
+    103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103,
+    103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103,   0,   0, 103, 103, 103,
+      1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,
+      1,   0,   1,   0,   1,   0, 146, 142, 144, 141, 145,  75,   0,   0, 143,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   6,   6,   6,   6,   6,   6,   6,   6,
+      0,   0,   0,   0,   0,   0,   0,   0,   6,   6,   6,   6,   6,   6,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   6,   6,   6,   6,   6,   6,   6,   6,
+      0,   0,   0,   0,   0,   0,   0,   0,   6,   6,   6,   6,   6,   6,   6,   6,
+      0,   0,   0,   0,   0,   0,   0,   0,   6,   6,   6,   6,   6,   6,   0,   0,
+    139,   0, 140,   0, 137,   0, 138,   0,   0,   6,   0,   6,   0,   6,   0,   6,
+      0,   0,   0,   0,   0,   0,   0,   0,   6,   6,   6,   6,   6,   6,   6,   6,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     53,  53,  53,  53,  53,  53,  53,  53,  56,  56,  56,  56,  56,  56,  56,  56,
+     62,  62,  62,  62,  62,  62,  62,  62,  64,  64,  64,  64,  64,  64,  64,  64,
+     67,  67,  67,  67,  67,  67,  67,  67,  69,  69,  69,  69,  69,  69,  69,  69,
+      0,   0,  68, 113, 118,   0, 116, 114,   6,   6,  71,  71, 117,   0, 115,   0,
+      0,   0,  63, 135, 129,   0, 134, 133,  65,  65,  66,  66, 136,   0,   0,   0,
+      0,   0, 130, 128,   0,   0, 132, 131,   6,   6,  60,  60,   0,   0,   0,   0,
+      0,   0, 123, 122, 121,   0, 120, 119,   6,   6,  59,  59,   7,   0,   0,   0,
+      0,   0,  58, 125, 125,   0, 127, 126,  52,  52,  55,  55, 124,   0,   0,   0,
+      0,   0,   0,   0,   0,   0, 149,   0,   0,   0, 147, 148,   0,   0,   0,   0,
+      0,   0,  50,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   5,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,  43,  43,  46,  46,  47,  47,  46,  46,  43,  43,
+     15,  15,  16,  16,  15,  15,  21,  21,  25,  25,  26,  26,  25,  25,  21,  21,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     27,  27,  27,  27,  27,  27,  27,  27,  27,  27,  27,  27,  27,  27,  27,  27,
+     36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,  36,
+     48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      1,   0, 150, 159, 151,   0,   0,  10,   0,   3,   0,   5,   0, 154, 152, 155,
+    153,   0,   1,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   0, 156, 155,
+      1,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   5,   0,   3,   0,   0,
+      0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,
+      1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   0,   0,   0,   0,
+      0,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,
+      0,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,
+      1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   5,   0, 176,   1,   0,
+      1,   0,   1,   0,   1,   0,   1,   0,   0,   0,   0,   5,   0, 170,   0,   0,
+      1,   0,   1,   0,   0,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,
+      1,   0,   1,   0,   1,   0,   1,   0,   1,   0, 168, 171, 169, 166, 167,   0,
+    162, 164, 163, 104,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,
+      0,   0,   1,   0,  36, 165, 177,  10,   0,   3,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175,
+    172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172,
+    173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173,
+    174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174,
+    173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173,
+    182, 183, 180, 181, 179, 185, 184,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0, 189, 186, 187, 190, 188,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,
+     40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,   0,   0,   0,   0,   0,
+     23,  23,  23,  23,  23,  23,  23,  23,  28,  28,  28,  28,  28,  28,  28,  28,
+     23,  23,  23,  23,  23,  23,  23,  23,  38,  38,  38,  38,  38,  38,  38,  38,
+     44,  44,  44,  44,  44,  44,  44,  44,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     44,  44,  44,  44,  44,  44,  44,  44,  38,  38,  38,  38,  38,  38,  38,  38,
+     23,  23,  23,  23,  23,  23,  23,  23,  28,  28,  28,  28,  28,  28,  28,  28,
+     23,  23,  23,  23,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,
+     30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,
+     30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,
+     30,  30,  30,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,
+     40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,
+     18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,
+     18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,
+     19,  19,  21,  21,  19,  19,  26,  26,  19,  19,  21,  21,  19,  19,  29,  29,
+     19,  19,  21,  21,  19,  19,  26,  26,  19,  19,  21,  21,  19,  19,  39,  39,
+     41,  41,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0
+};
+
+static RE_FullCaseFolding re_full_folding_table_4[] = {
+    {    0,     0,     0},
+    {    1,     0,     0},
+    {    2,     0,     0},
+    {    3,     0,     0},
+    {    6,     0,     0},
+    {    7,     0,     0},
+    {    8,     0,     0},
+    {    9,     0,     0},
+    {   11,     0,     0},
+    {   14,     0,     0},
+    {   15,     0,     0},
+    {   16,     0,     0},
+    {   19,     0,     0},
+    {   22,     0,     0},
+    {   24,     0,     0},
+    {   26,     0,     0},
+    {   30,     0,     0},
+    {   31,     0,     0},
+    {   32,     0,     0},
+    {   34,     0,     0},
+    {   37,     0,     0},
+    {   38,     0,     0},
+    {   39,     0,     0},
+    {   40,     0,     0},
+    {   41,   776,   769},
+    {   42,     0,     0},
+    {   46,     0,     0},
+    {   48,     0,     0},
+    {   56,     0,     0},
+    {   62,     0,     0},
+    {   64,     0,     0},
+    {   65,     0,     0},
+    {   67,     0,     0},
+    {   72,     0,     0},
+    {   74,     0,     0},
+    {   76,     0,     0},
+    {   80,     0,     0},
+    {   83,     0,     0},
+    {   88,     0,     0},
+    {   94,     0,     0},
+    {   96,     0,     0},
+    {   98,     0,     0},
+    {   99,     0,     0},
+    {  102,     0,     0},
+    {  104,     0,     0},
+    {  105,     0,     0},
+    {  106,     0,     0},
+    {  110,     0,     0},
+    {  112,     0,     0},
+    {  117,   776,   769},
+    {  124,     0,     0},
+    {  127,     0,     0},
+    {  128,     0,     0},
+    {  128,   953,     0},
+    {  130,     0,     0},
+    {  134,     0,     0},
+    {  136,   953,     0},
+    {  140,     0,     0},
+    {  142,   953,     0},
+    {  144,     0,     0},
+    {  172,     0,     0},
+    {  172,   115,     0},
+    {  176,   953,     0},
+    {  182,   953,     0},
+    {  184,   953,     0},
+    {  186,     0,     0},
+    {  190,     0,     0},
+    {  192,   953,     0},
+    {  194,   953,     0},
+    {  200,   953,     0},
+    {  201,     0,     0},
+    {  202,     0,     0},
+    {  205,     0,     0},
+    {  208,     0,     0},
+    {  226,  1410,     0},
+    {  250,     0,     0},
+    {  252,     0,     0},
+    {  268,     0,     0},
+    {  345,     0,     0},
+    {  345,   775,     0},
+    {  376,     0,     0},
+    {  391,     0,     0},
+    {  410,   780,     0},
+    {  777,     0,     0},
+    {  805,     0,     0},
+    {  806,     0,     0},
+    {  810,     0,     0},
+    {  825,     0,     0},
+    {  827,     0,     0},
+    {  935,     0,     0},
+    {  958,     0,     0},
+    {  963,     0,     0},
+    {  971,     0,     0},
+    {  978,     0,     0},
+    {  982,     0,     0},
+    {  989,     0,     0},
+    {  991,     0,     0},
+    { 1002,     0,     0},
+    { 1007,     0,     0},
+    { 1011,     0,     0},
+    { 1013,   110,     0},
+    { 1015,     0,     0},
+    { 1023,     0,     0},
+    { 3136,     0,     0},
+    { 3296,     0,     0},
+    { 6322,     0,     0},
+    { 6325,     0,     0},
+    { 6332,     0,     0},
+    { 6338,     0,     0},
+    { 6342,     0,     0},
+    { 6343,     0,     0},
+    { 6348,     0,     0},
+    { 6372,     0,     0},
+    { 7170,   953,     0},
+    { 7174,   834,   953},
+    { 7175,     0,     0},
+    { 7175,   834,     0},
+    { 7181,   953,     0},
+    { 7192,   953,     0},
+    { 7202,   776,   834},
+    { 7203,   834,     0},
+    { 7205,   787,     0},
+    { 7206,   776,   769},
+    { 7207,   776,   768},
+    { 7221,   953,     0},
+    { 7226,   953,     0},
+    { 7230,   834,   953},
+    { 7231,   834,     0},
+    { 7274,   776,   769},
+    { 7274,   953,     0},
+    { 7275,   776,   768},
+    { 7278,   776,   834},
+    { 7279,   834,     0},
+    { 7280,   834,   953},
+    { 7281,   834,     0},
+    { 7284,   953,     0},
+    { 7291,   953,     0},
+    { 7313,   787,   769},
+    { 7315,   787,   834},
+    { 7317,   787,     0},
+    { 7319,   787,   768},
+    { 7904,   778,     0},
+    { 7907,   776,     0},
+    { 7917,   115,     0},
+    { 7919,   778,     0},
+    { 7931,   702,     0},
+    { 7934,   817,     0},
+    { 8513,     0,     0},
+    { 8654,     0,     0},
+    { 8943,     0,     0},
+    {11785,     0,     0},
+    {11801,     0,     0},
+    {11807,     0,     0},
+    {11810,     0,     0},
+    {11836,     0,     0},
+    {11839,     0,     0},
+    {11841,     0,     0},
+    {11864,     0,     0},
+    {11871,     0,     0},
+    {12574,     0,     0},
+    {15776,     0,     0},
+    {15840,     0,     0},
+    {42286,     0,     0},
+    {42287,     0,     0},
+    {42294,     0,     0},
+    {42311,     0,     0},
+    {42433,     0,     0},
+    {42436,     0,     0},
+    {42444,     0,     0},
+    {42445,     0,     0},
+    {42472,     0,     0},
+    {42487,     0,     0},
+    {47152,     0,     0},
+    {47184,     0,     0},
+    {47216,     0,     0},
+    {47312,     0,     0},
+    {47620,     0,     0},
+    {47688,     0,     0},
+    {47811,     0,     0},
+    {64354,   102,   108},
+    {64356,   108,     0},
+    {64357,   102,   105},
+    {64358,   102,     0},
+    {64359,   105,     0},
+    {64373,   116,     0},
+    {64374,   116,     0},
+    {65120,  1381,     0},
+    {65121,  1387,     0},
+    {65123,  1389,     0},
+    {65127,  1398,     0},
+    {65128,  1398,     0}
+};
+
+int re_get_full_case_folding(RE_UINT32 codepoint, RE_UINT32* folded) {
+    RE_UINT32 field_2;
+    RE_UINT32 field_1;
+    RE_UINT32 field_0;
+    RE_UINT32 v;
+    RE_UINT16* data;
+
+    field_2 = codepoint >> 10;
+    field_1 = (codepoint >> 5) & 0x1F;
+    field_0 = codepoint & 0x1F;
+
+    v = re_full_folding_table_1[field_2];
+    v = re_full_folding_table_2[(v << 5) | field_1];
+    v = re_full_folding_table_3[(v << 5) | field_0];
+
+    data = re_full_folding_table_4[v].data;
+    folded[0] = codepoint ^ data[0];
+
+    if (data[1] == 0)
+        return 1;
+
+    folded[1] = data[1];
+
+    if (data[2] == 0)
+        return 2;
+
+    folded[2] = data[2];
+
+    return 3;
 }
 
 /* Property function table. */
-
 RE_GetPropertyFunc re_get_property[] = {
-    re_get_general_category,
-    re_get_block,
-    re_get_script,
-    0,
-    re_get_word_break,
-    re_get_grapheme_cluster_break,
-    re_get_sentence_break,
-    re_get_math,
     re_get_alphabetic,
-    re_get_lowercase,
-    re_get_uppercase,
+    re_get_alphanumeric,
+    re_get_any,
+    re_get_ascii_hex_digit,
+    re_get_bidi_class,
+    re_get_bidi_control,
+    re_get_bidi_mirrored,
+    re_get_blank,
+    re_get_block,
+    re_get_canonical_combining_class,
     re_get_cased,
     re_get_case_ignorable,
-    re_get_changes_when_lowercased,
-    re_get_changes_when_uppercased,
-    re_get_changes_when_titlecased,
     re_get_changes_when_casefolded,
     re_get_changes_when_casemapped,
-    re_get_id_start,
-    re_get_id_continue,
-    re_get_xid_start,
-    re_get_xid_continue,
+    re_get_changes_when_lowercased,
+    re_get_changes_when_titlecased,
+    re_get_changes_when_uppercased,
+    re_get_dash,
+    re_get_decomposition_type,
     re_get_default_ignorable_code_point,
-    re_get_grapheme_extend,
+    re_get_deprecated,
+    re_get_diacritic,
+    re_get_east_asian_width,
+    re_get_emoji,
+    re_get_emoji_component,
+    re_get_emoji_modifier,
+    re_get_emoji_modifier_base,
+    re_get_emoji_presentation,
+    re_get_extended_pictographic,
+    re_get_extender,
+    re_get_general_category,
+    re_get_graph,
     re_get_grapheme_base,
+    re_get_grapheme_cluster_break,
+    re_get_grapheme_extend,
     re_get_grapheme_link,
-    re_get_white_space,
-    re_get_bidi_control,
-    re_get_join_control,
-    re_get_dash,
-    re_get_hyphen,
-    re_get_quotation_mark,
-    re_get_terminal_punctuation,
-    re_get_other_math,
+    re_get_hangul_syllable_type,
     re_get_hex_digit,
-    re_get_ascii_hex_digit,
-    re_get_other_alphabetic,
+    re_get_hyphen,
+    re_get_id_continue,
     re_get_ideographic,
-    re_get_diacritic,
-    re_get_extender,
-    re_get_other_lowercase,
-    re_get_other_uppercase,
-    re_get_noncharacter_code_point,
-    re_get_other_grapheme_extend,
     re_get_ids_binary_operator,
+    re_get_id_start,
     re_get_ids_trinary_operator,
-    re_get_radical,
-    re_get_unified_ideograph,
-    re_get_other_default_ignorable_code_point,
-    re_get_deprecated,
-    re_get_soft_dotted,
-    re_get_logical_order_exception,
-    re_get_other_id_start,
-    re_get_other_id_continue,
-    re_get_sentence_terminal,
-    re_get_variation_selector,
-    re_get_pattern_white_space,
-    re_get_pattern_syntax,
-    re_get_prepended_concatenation_mark,
-    re_get_regional_indicator,
-    re_get_hangul_syllable_type,
-    re_get_bidi_class,
-    re_get_canonical_combining_class,
-    re_get_decomposition_type,
-    re_get_east_asian_width,
+    re_get_indic_positional_category,
+    re_get_indic_syllabic_category,
+    re_get_join_control,
     re_get_joining_group,
     re_get_joining_type,
     re_get_line_break,
-    re_get_numeric_type,
-    re_get_numeric_value,
-    re_get_bidi_mirrored,
-    re_get_indic_positional_category,
-    re_get_indic_syllabic_category,
-    re_get_emoji,
-    re_get_emoji_presentation,
-    re_get_emoji_modifier,
-    re_get_emoji_modifier_base,
-    re_get_emoji_component,
-    re_get_extended_pictographic,
-    re_get_nfd_quick_check,
+    re_get_logical_order_exception,
+    re_get_lowercase,
+    re_get_math,
     re_get_nfc_quick_check,
-    re_get_nfkd_quick_check,
+    re_get_nfd_quick_check,
     re_get_nfkc_quick_check,
-    re_get_alphanumeric,
-    re_get_any,
-    re_get_blank,
-    re_get_graph,
-    re_get_print,
-    re_get_word,
-    re_get_xdigit,
-    re_get_posix_digit,
+    re_get_nfkd_quick_check,
+    re_get_noncharacter_code_point,
+    re_get_numeric_type,
+    re_get_numeric_value,
+    re_get_other_alphabetic,
+    re_get_other_default_ignorable_code_point,
+    re_get_other_grapheme_extend,
+    re_get_other_id_continue,
+    re_get_other_id_start,
+    re_get_other_lowercase,
+    re_get_other_math,
+    re_get_other_uppercase,
+    re_get_pattern_syntax,
+    re_get_pattern_white_space,
     re_get_posix_alnum,
+    re_get_posix_digit,
     re_get_posix_punct,
     re_get_posix_xdigit,
+    re_get_prepended_concatenation_mark,
+    re_get_print,
+    re_get_quotation_mark,
+    re_get_radical,
+    re_get_regional_indicator,
+    re_get_script,
+    0,
+    re_get_sentence_break,
+    re_get_sentence_terminal,
+    re_get_soft_dotted,
+    re_get_terminal_punctuation,
+    re_get_unified_ideograph,
+    re_get_uppercase,
+    re_get_variation_selector,
+    re_get_white_space,
+    re_get_word,
+    re_get_word_break,
+    re_get_xdigit,
+    re_get_xid_continue,
+    re_get_xid_start
 };
diff --git a/regex_3/_regex_unicode.h b/regex_3/_regex_unicode.h
index 77e5764..ea8e48c 100644
--- a/regex_3/_regex_unicode.h
+++ b/regex_3/_regex_unicode.h
@@ -13,7 +13,6 @@ typedef unsigned char BOOL;
 
 #define RE_ASCII_MAX 0x7F
 #define RE_LOCALE_MAX 0xFF
-#define RE_UNICODE_MAX 0x10FFFF
 
 #define RE_MAX_CASES 4
 #define RE_MAX_FOLDED 3
@@ -31,13 +30,13 @@ typedef struct RE_PropertyValue {
     RE_UINT16 id;
 } RE_PropertyValue;
 
-typedef RE_UINT32 (*RE_GetPropertyFunc)(RE_UINT32 ch);
+typedef RE_UINT32 (*RE_GetPropertyFunc)(RE_UINT32 codepoint);
 
-#define RE_PROP_GC 0x0
-#define RE_PROP_CASED 0xB
-#define RE_PROP_UPPERCASE 0xA
-#define RE_PROP_LOWERCASE 0x9
-#define RE_PROP_SCX 0x3
+#define RE_PROP_GC 0x1E
+#define RE_PROP_CASED 0xA
+#define RE_PROP_UPPERCASE 0x56
+#define RE_PROP_LOWERCASE 0x33
+#define RE_PROP_SCX 0x50
 
 #define RE_PROP_C 30
 #define RE_PROP_L 31
@@ -46,254 +45,254 @@ typedef RE_UINT32 (*RE_GetPropertyFunc)(RE_UINT32 ch);
 #define RE_PROP_P 34
 #define RE_PROP_S 35
 #define RE_PROP_Z 36
-#define RE_PROP_ASSIGNED 38
-#define RE_PROP_CASEDLETTER 37
+#define RE_PROP_ASSIGNED 37
+#define RE_PROP_CASEDLETTER 38
 
 #define RE_PROP_CN 0
-#define RE_PROP_LU 1
-#define RE_PROP_LL 2
-#define RE_PROP_LT 3
-#define RE_PROP_LM 4
-#define RE_PROP_LO 5
-#define RE_PROP_MN 6
-#define RE_PROP_ME 7
-#define RE_PROP_MC 8
+#define RE_PROP_CC 1
+#define RE_PROP_ZS 2
+#define RE_PROP_PO 3
+#define RE_PROP_SC 4
+#define RE_PROP_PS 5
+#define RE_PROP_PE 6
+#define RE_PROP_SM 7
+#define RE_PROP_PD 8
 #define RE_PROP_ND 9
-#define RE_PROP_NL 10
-#define RE_PROP_NO 11
-#define RE_PROP_ZS 12
-#define RE_PROP_ZL 13
-#define RE_PROP_ZP 14
-#define RE_PROP_CC 15
-#define RE_PROP_CF 16
-#define RE_PROP_CO 17
-#define RE_PROP_CS 18
-#define RE_PROP_PD 19
-#define RE_PROP_PS 20
-#define RE_PROP_PE 21
-#define RE_PROP_PC 22
-#define RE_PROP_PO 23
-#define RE_PROP_SM 24
-#define RE_PROP_SC 25
-#define RE_PROP_SK 26
-#define RE_PROP_SO 27
-#define RE_PROP_PI 28
-#define RE_PROP_PF 29
+#define RE_PROP_LU 10
+#define RE_PROP_SK 11
+#define RE_PROP_PC 12
+#define RE_PROP_LL 13
+#define RE_PROP_SO 14
+#define RE_PROP_LO 15
+#define RE_PROP_PI 16
+#define RE_PROP_CF 17
+#define RE_PROP_NO 18
+#define RE_PROP_PF 19
+#define RE_PROP_LT 20
+#define RE_PROP_LM 21
+#define RE_PROP_MN 22
+#define RE_PROP_ME 23
+#define RE_PROP_MC 24
+#define RE_PROP_NL 25
+#define RE_PROP_ZL 26
+#define RE_PROP_ZP 27
+#define RE_PROP_CS 28
+#define RE_PROP_CO 29
 
-#define RE_PROP_C_MASK 0x00078001
-#define RE_PROP_L_MASK 0x0000003E
-#define RE_PROP_M_MASK 0x000001C0
-#define RE_PROP_N_MASK 0x00000E00
-#define RE_PROP_P_MASK 0x30F80000
-#define RE_PROP_S_MASK 0x0F000000
-#define RE_PROP_Z_MASK 0x00007000
+#define RE_PROP_C_MASK 0x30020003
+#define RE_PROP_L_MASK 0x0030A400
+#define RE_PROP_M_MASK 0x01C00000
+#define RE_PROP_N_MASK 0x02040200
+#define RE_PROP_P_MASK 0x00091168
+#define RE_PROP_S_MASK 0x00004890
+#define RE_PROP_Z_MASK 0x0C000004
 
-#define RE_PROP_ALNUM 0x530001
-#define RE_PROP_ALPHA 0x080001
-#define RE_PROP_ANY 0x540001
-#define RE_PROP_ASCII 0x010001
-#define RE_PROP_BLANK 0x550001
-#define RE_PROP_CNTRL 0x00000F
-#define RE_PROP_DIGIT 0x000009
-#define RE_PROP_GRAPH 0x560001
-#define RE_PROP_LOWER 0x090001
-#define RE_PROP_PRINT 0x570001
-#define RE_PROP_SPACE 0x1A0001
-#define RE_PROP_UPPER 0x0A0001
-#define RE_PROP_WORD 0x580001
-#define RE_PROP_XDIGIT 0x590001
-#define RE_PROP_POSIX_ALNUM 0x5B0001
-#define RE_PROP_POSIX_DIGIT 0x5A0001
-#define RE_PROP_POSIX_PUNCT 0x5C0001
-#define RE_PROP_POSIX_XDIGIT 0x5D0001
+#define RE_PROP_ALNUM 0x010001
+#define RE_PROP_ALPHA 0x000001
+#define RE_PROP_ANY 0x020001
+#define RE_PROP_ASCII 0x080001
+#define RE_PROP_BLANK 0x070001
+#define RE_PROP_CNTRL 0x1E0001
+#define RE_PROP_DIGIT 0x1E0009
+#define RE_PROP_GRAPH 0x1F0001
+#define RE_PROP_LOWER 0x330001
+#define RE_PROP_PRINT 0x4B0001
+#define RE_PROP_SPACE 0x580001
+#define RE_PROP_UPPER 0x560001
+#define RE_PROP_WORD 0x590001
+#define RE_PROP_XDIGIT 0x5B0001
+#define RE_PROP_POSIX_ALNUM 0x460001
+#define RE_PROP_POSIX_DIGIT 0x470001
+#define RE_PROP_POSIX_PUNCT 0x480001
+#define RE_PROP_POSIX_XDIGIT 0x490001
 
 #define RE_WBREAK_OTHER 0
-#define RE_WBREAK_DOUBLEQUOTE 1
-#define RE_WBREAK_SINGLEQUOTE 2
-#define RE_WBREAK_HEBREWLETTER 3
-#define RE_WBREAK_CR 4
-#define RE_WBREAK_LF 5
-#define RE_WBREAK_NEWLINE 6
-#define RE_WBREAK_EXTEND 7
-#define RE_WBREAK_REGIONALINDICATOR 8
-#define RE_WBREAK_FORMAT 9
-#define RE_WBREAK_KATAKANA 10
+#define RE_WBREAK_LF 1
+#define RE_WBREAK_NEWLINE 2
+#define RE_WBREAK_CR 3
+#define RE_WBREAK_WSEGSPACE 4
+#define RE_WBREAK_DOUBLEQUOTE 5
+#define RE_WBREAK_SINGLEQUOTE 6
+#define RE_WBREAK_MIDNUM 7
+#define RE_WBREAK_MIDNUMLET 8
+#define RE_WBREAK_NUMERIC 9
+#define RE_WBREAK_MIDLETTER 10
 #define RE_WBREAK_ALETTER 11
-#define RE_WBREAK_MIDLETTER 12
-#define RE_WBREAK_MIDNUM 13
-#define RE_WBREAK_MIDNUMLET 14
-#define RE_WBREAK_NUMERIC 15
-#define RE_WBREAK_EXTENDNUMLET 16
-#define RE_WBREAK_ZWJ 17
-#define RE_WBREAK_WSEGSPACE 18
+#define RE_WBREAK_EXTENDNUMLET 12
+#define RE_WBREAK_FORMAT 13
+#define RE_WBREAK_EXTEND 14
+#define RE_WBREAK_HEBREWLETTER 15
+#define RE_WBREAK_ZWJ 16
+#define RE_WBREAK_KATAKANA 17
+#define RE_WBREAK_REGIONALINDICATOR 18
 #define RE_WBREAK_EBASE 19
 #define RE_WBREAK_EBASEGAZ 20
 #define RE_WBREAK_EMODIFIER 21
 #define RE_WBREAK_GLUEAFTERZWJ 22
 
 #define RE_GBREAK_OTHER 0
-#define RE_GBREAK_PREPEND 1
-#define RE_GBREAK_CR 2
-#define RE_GBREAK_LF 3
-#define RE_GBREAK_CONTROL 4
-#define RE_GBREAK_EXTEND 5
-#define RE_GBREAK_REGIONALINDICATOR 6
-#define RE_GBREAK_SPACINGMARK 7
-#define RE_GBREAK_L 8
-#define RE_GBREAK_V 9
-#define RE_GBREAK_T 10
+#define RE_GBREAK_CONTROL 1
+#define RE_GBREAK_LF 2
+#define RE_GBREAK_CR 3
+#define RE_GBREAK_EXTEND 4
+#define RE_GBREAK_PREPEND 5
+#define RE_GBREAK_SPACINGMARK 6
+#define RE_GBREAK_L 7
+#define RE_GBREAK_V 8
+#define RE_GBREAK_T 9
+#define RE_GBREAK_ZWJ 10
 #define RE_GBREAK_LV 11
 #define RE_GBREAK_LVT 12
-#define RE_GBREAK_ZWJ 13
+#define RE_GBREAK_REGIONALINDICATOR 13
 #define RE_GBREAK_EBASE 14
 #define RE_GBREAK_EBASEGAZ 15
 #define RE_GBREAK_EMODIFIER 16
 #define RE_GBREAK_GLUEAFTERZWJ 17
 
 #define RE_LBREAK_UNKNOWN 0
-#define RE_LBREAK_OPENPUNCTUATION 1
-#define RE_LBREAK_CLOSEPUNCTUATION 2
-#define RE_LBREAK_QUOTATION 3
-#define RE_LBREAK_GLUE 4
-#define RE_LBREAK_NONSTARTER 5
-#define RE_LBREAK_EXCLAMATION 6
-#define RE_LBREAK_BREAKSYMBOLS 7
-#define RE_LBREAK_INFIXNUMERIC 8
-#define RE_LBREAK_PREFIXNUMERIC 9
-#define RE_LBREAK_POSTFIXNUMERIC 10
-#define RE_LBREAK_NUMERIC 11
-#define RE_LBREAK_ALPHABETIC 12
-#define RE_LBREAK_IDEOGRAPHIC 13
-#define RE_LBREAK_INSEPARABLE 14
+#define RE_LBREAK_COMBININGMARK 1
+#define RE_LBREAK_BREAKAFTER 2
+#define RE_LBREAK_LINEFEED 3
+#define RE_LBREAK_MANDATORYBREAK 4
+#define RE_LBREAK_CARRIAGERETURN 5
+#define RE_LBREAK_SPACE 6
+#define RE_LBREAK_EXCLAMATION 7
+#define RE_LBREAK_QUOTATION 8
+#define RE_LBREAK_ALPHABETIC 9
+#define RE_LBREAK_PREFIXNUMERIC 10
+#define RE_LBREAK_POSTFIXNUMERIC 11
+#define RE_LBREAK_OPENPUNCTUATION 12
+#define RE_LBREAK_CLOSEPARENTHESIS 13
+#define RE_LBREAK_INFIXNUMERIC 14
 #define RE_LBREAK_HYPHEN 15
-#define RE_LBREAK_COMBININGMARK 16
-#define RE_LBREAK_BREAKBEFORE 17
-#define RE_LBREAK_BREAKAFTER 18
-#define RE_LBREAK_SPACE 19
-#define RE_LBREAK_MANDATORYBREAK 20
-#define RE_LBREAK_CARRIAGERETURN 21
-#define RE_LBREAK_LINEFEED 22
-#define RE_LBREAK_CONTINGENTBREAK 23
+#define RE_LBREAK_BREAKSYMBOLS 16
+#define RE_LBREAK_NUMERIC 17
+#define RE_LBREAK_CLOSEPUNCTUATION 18
+#define RE_LBREAK_NEXTLINE 19
+#define RE_LBREAK_GLUE 20
+#define RE_LBREAK_AMBIGUOUS 21
+#define RE_LBREAK_BREAKBEFORE 22
+#define RE_LBREAK_HEBREWLETTER 23
 #define RE_LBREAK_COMPLEXCONTEXT 24
-#define RE_LBREAK_AMBIGUOUS 25
-#define RE_LBREAK_BREAKBOTH 26
-#define RE_LBREAK_SURROGATE 27
-#define RE_LBREAK_ZWSPACE 28
-#define RE_LBREAK_NEXTLINE 29
-#define RE_LBREAK_WORDJOINER 30
-#define RE_LBREAK_JL 31
-#define RE_LBREAK_JV 32
-#define RE_LBREAK_JT 33
-#define RE_LBREAK_H2 34
-#define RE_LBREAK_H3 35
-#define RE_LBREAK_CLOSEPARENTHESIS 36
-#define RE_LBREAK_HEBREWLETTER 37
-#define RE_LBREAK_CONDITIONALJAPANESESTARTER 38
-#define RE_LBREAK_REGIONALINDICATOR 39
-#define RE_LBREAK_EBASE 40
-#define RE_LBREAK_EMODIFIER 41
-#define RE_LBREAK_ZWJ 42
+#define RE_LBREAK_JL 25
+#define RE_LBREAK_JV 26
+#define RE_LBREAK_JT 27
+#define RE_LBREAK_NONSTARTER 28
+#define RE_LBREAK_ZWSPACE 29
+#define RE_LBREAK_ZWJ 30
+#define RE_LBREAK_BREAKBOTH 31
+#define RE_LBREAK_INSEPARABLE 32
+#define RE_LBREAK_WORDJOINER 33
+#define RE_LBREAK_IDEOGRAPHIC 34
+#define RE_LBREAK_EBASE 35
+#define RE_LBREAK_CONDITIONALJAPANESESTARTER 36
+#define RE_LBREAK_H2 37
+#define RE_LBREAK_H3 38
+#define RE_LBREAK_SURROGATE 39
+#define RE_LBREAK_CONTINGENTBREAK 40
+#define RE_LBREAK_REGIONALINDICATOR 41
+#define RE_LBREAK_EMODIFIER 42
 
-extern char* re_strings[1425];
-extern RE_Property re_properties[168];
-extern RE_PropertyValue re_property_values[1568];
+extern char* re_strings[1447];
+extern RE_Property re_properties[173];
+extern RE_PropertyValue re_property_values[1589];
 extern RE_UINT16 re_expand_on_folding[104];
 extern RE_GetPropertyFunc re_get_property[94];
 
-RE_UINT32 re_get_general_category(RE_UINT32 ch);
-RE_UINT32 re_get_block(RE_UINT32 ch);
-RE_UINT32 re_get_script(RE_UINT32 ch);
-int re_get_script_extensions(RE_UINT32 ch, RE_UINT8* scripts);
-RE_UINT32 re_get_word_break(RE_UINT32 ch);
-RE_UINT32 re_get_grapheme_cluster_break(RE_UINT32 ch);
-RE_UINT32 re_get_sentence_break(RE_UINT32 ch);
-RE_UINT32 re_get_math(RE_UINT32 ch);
-RE_UINT32 re_get_alphabetic(RE_UINT32 ch);
-RE_UINT32 re_get_lowercase(RE_UINT32 ch);
-RE_UINT32 re_get_uppercase(RE_UINT32 ch);
-RE_UINT32 re_get_cased(RE_UINT32 ch);
-RE_UINT32 re_get_case_ignorable(RE_UINT32 ch);
-RE_UINT32 re_get_changes_when_lowercased(RE_UINT32 ch);
-RE_UINT32 re_get_changes_when_uppercased(RE_UINT32 ch);
-RE_UINT32 re_get_changes_when_titlecased(RE_UINT32 ch);
-RE_UINT32 re_get_changes_when_casefolded(RE_UINT32 ch);
-RE_UINT32 re_get_changes_when_casemapped(RE_UINT32 ch);
-RE_UINT32 re_get_id_start(RE_UINT32 ch);
-RE_UINT32 re_get_id_continue(RE_UINT32 ch);
-RE_UINT32 re_get_xid_start(RE_UINT32 ch);
-RE_UINT32 re_get_xid_continue(RE_UINT32 ch);
-RE_UINT32 re_get_default_ignorable_code_point(RE_UINT32 ch);
-RE_UINT32 re_get_grapheme_extend(RE_UINT32 ch);
-RE_UINT32 re_get_grapheme_base(RE_UINT32 ch);
-RE_UINT32 re_get_grapheme_link(RE_UINT32 ch);
-RE_UINT32 re_get_white_space(RE_UINT32 ch);
-RE_UINT32 re_get_bidi_control(RE_UINT32 ch);
-RE_UINT32 re_get_join_control(RE_UINT32 ch);
-RE_UINT32 re_get_dash(RE_UINT32 ch);
-RE_UINT32 re_get_hyphen(RE_UINT32 ch);
-RE_UINT32 re_get_quotation_mark(RE_UINT32 ch);
-RE_UINT32 re_get_terminal_punctuation(RE_UINT32 ch);
-RE_UINT32 re_get_other_math(RE_UINT32 ch);
-RE_UINT32 re_get_hex_digit(RE_UINT32 ch);
-RE_UINT32 re_get_ascii_hex_digit(RE_UINT32 ch);
-RE_UINT32 re_get_other_alphabetic(RE_UINT32 ch);
-RE_UINT32 re_get_ideographic(RE_UINT32 ch);
-RE_UINT32 re_get_diacritic(RE_UINT32 ch);
-RE_UINT32 re_get_extender(RE_UINT32 ch);
-RE_UINT32 re_get_other_lowercase(RE_UINT32 ch);
-RE_UINT32 re_get_other_uppercase(RE_UINT32 ch);
-RE_UINT32 re_get_noncharacter_code_point(RE_UINT32 ch);
-RE_UINT32 re_get_other_grapheme_extend(RE_UINT32 ch);
-RE_UINT32 re_get_ids_binary_operator(RE_UINT32 ch);
-RE_UINT32 re_get_ids_trinary_operator(RE_UINT32 ch);
-RE_UINT32 re_get_radical(RE_UINT32 ch);
-RE_UINT32 re_get_unified_ideograph(RE_UINT32 ch);
-RE_UINT32 re_get_other_default_ignorable_code_point(RE_UINT32 ch);
-RE_UINT32 re_get_deprecated(RE_UINT32 ch);
-RE_UINT32 re_get_soft_dotted(RE_UINT32 ch);
-RE_UINT32 re_get_logical_order_exception(RE_UINT32 ch);
-RE_UINT32 re_get_other_id_start(RE_UINT32 ch);
-RE_UINT32 re_get_other_id_continue(RE_UINT32 ch);
-RE_UINT32 re_get_sentence_terminal(RE_UINT32 ch);
-RE_UINT32 re_get_variation_selector(RE_UINT32 ch);
-RE_UINT32 re_get_pattern_white_space(RE_UINT32 ch);
-RE_UINT32 re_get_pattern_syntax(RE_UINT32 ch);
-RE_UINT32 re_get_prepended_concatenation_mark(RE_UINT32 ch);
-RE_UINT32 re_get_regional_indicator(RE_UINT32 ch);
-RE_UINT32 re_get_hangul_syllable_type(RE_UINT32 ch);
-RE_UINT32 re_get_bidi_class(RE_UINT32 ch);
-RE_UINT32 re_get_canonical_combining_class(RE_UINT32 ch);
-RE_UINT32 re_get_decomposition_type(RE_UINT32 ch);
-RE_UINT32 re_get_east_asian_width(RE_UINT32 ch);
-RE_UINT32 re_get_joining_group(RE_UINT32 ch);
-RE_UINT32 re_get_joining_type(RE_UINT32 ch);
-RE_UINT32 re_get_line_break(RE_UINT32 ch);
-RE_UINT32 re_get_numeric_type(RE_UINT32 ch);
-RE_UINT32 re_get_numeric_value(RE_UINT32 ch);
-RE_UINT32 re_get_bidi_mirrored(RE_UINT32 ch);
-RE_UINT32 re_get_indic_positional_category(RE_UINT32 ch);
-RE_UINT32 re_get_indic_syllabic_category(RE_UINT32 ch);
-RE_UINT32 re_get_emoji(RE_UINT32 ch);
-RE_UINT32 re_get_emoji_presentation(RE_UINT32 ch);
-RE_UINT32 re_get_emoji_modifier(RE_UINT32 ch);
-RE_UINT32 re_get_emoji_modifier_base(RE_UINT32 ch);
-RE_UINT32 re_get_emoji_component(RE_UINT32 ch);
-RE_UINT32 re_get_extended_pictographic(RE_UINT32 ch);
-RE_UINT32 re_get_nfd_quick_check(RE_UINT32 ch);
-RE_UINT32 re_get_nfc_quick_check(RE_UINT32 ch);
-RE_UINT32 re_get_nfkd_quick_check(RE_UINT32 ch);
-RE_UINT32 re_get_nfkc_quick_check(RE_UINT32 ch);
-RE_UINT32 re_get_alphanumeric(RE_UINT32 ch);
-RE_UINT32 re_get_any(RE_UINT32 ch);
-RE_UINT32 re_get_blank(RE_UINT32 ch);
-RE_UINT32 re_get_graph(RE_UINT32 ch);
-RE_UINT32 re_get_print(RE_UINT32 ch);
-RE_UINT32 re_get_word(RE_UINT32 ch);
-RE_UINT32 re_get_xdigit(RE_UINT32 ch);
-RE_UINT32 re_get_posix_digit(RE_UINT32 ch);
-RE_UINT32 re_get_posix_alnum(RE_UINT32 ch);
-RE_UINT32 re_get_posix_punct(RE_UINT32 ch);
-RE_UINT32 re_get_posix_xdigit(RE_UINT32 ch);
-int re_get_all_cases(RE_UINT32 ch, RE_UINT32* codepoints);
-RE_UINT32 re_get_simple_case_folding(RE_UINT32 ch);
-int re_get_full_case_folding(RE_UINT32 ch, RE_UINT32* codepoints);
+RE_UINT32 re_get_alphabetic(RE_UINT32 codepoint);
+RE_UINT32 re_get_alphanumeric(RE_UINT32 codepoint);
+RE_UINT32 re_get_any(RE_UINT32 codepoint);
+RE_UINT32 re_get_ascii_hex_digit(RE_UINT32 codepoint);
+RE_UINT32 re_get_bidi_class(RE_UINT32 codepoint);
+RE_UINT32 re_get_bidi_control(RE_UINT32 codepoint);
+RE_UINT32 re_get_bidi_mirrored(RE_UINT32 codepoint);
+RE_UINT32 re_get_blank(RE_UINT32 codepoint);
+RE_UINT32 re_get_block(RE_UINT32 codepoint);
+RE_UINT32 re_get_canonical_combining_class(RE_UINT32 codepoint);
+RE_UINT32 re_get_cased(RE_UINT32 codepoint);
+RE_UINT32 re_get_case_ignorable(RE_UINT32 codepoint);
+RE_UINT32 re_get_changes_when_casefolded(RE_UINT32 codepoint);
+RE_UINT32 re_get_changes_when_casemapped(RE_UINT32 codepoint);
+RE_UINT32 re_get_changes_when_lowercased(RE_UINT32 codepoint);
+RE_UINT32 re_get_changes_when_titlecased(RE_UINT32 codepoint);
+RE_UINT32 re_get_changes_when_uppercased(RE_UINT32 codepoint);
+RE_UINT32 re_get_dash(RE_UINT32 codepoint);
+RE_UINT32 re_get_decomposition_type(RE_UINT32 codepoint);
+RE_UINT32 re_get_default_ignorable_code_point(RE_UINT32 codepoint);
+RE_UINT32 re_get_deprecated(RE_UINT32 codepoint);
+RE_UINT32 re_get_diacritic(RE_UINT32 codepoint);
+RE_UINT32 re_get_east_asian_width(RE_UINT32 codepoint);
+RE_UINT32 re_get_emoji(RE_UINT32 codepoint);
+RE_UINT32 re_get_emoji_component(RE_UINT32 codepoint);
+RE_UINT32 re_get_emoji_modifier(RE_UINT32 codepoint);
+RE_UINT32 re_get_emoji_modifier_base(RE_UINT32 codepoint);
+RE_UINT32 re_get_emoji_presentation(RE_UINT32 codepoint);
+RE_UINT32 re_get_extended_pictographic(RE_UINT32 codepoint);
+RE_UINT32 re_get_extender(RE_UINT32 codepoint);
+RE_UINT32 re_get_general_category(RE_UINT32 codepoint);
+RE_UINT32 re_get_graph(RE_UINT32 codepoint);
+RE_UINT32 re_get_grapheme_base(RE_UINT32 codepoint);
+RE_UINT32 re_get_grapheme_cluster_break(RE_UINT32 codepoint);
+RE_UINT32 re_get_grapheme_extend(RE_UINT32 codepoint);
+RE_UINT32 re_get_grapheme_link(RE_UINT32 codepoint);
+RE_UINT32 re_get_hangul_syllable_type(RE_UINT32 codepoint);
+RE_UINT32 re_get_hex_digit(RE_UINT32 codepoint);
+RE_UINT32 re_get_hyphen(RE_UINT32 codepoint);
+RE_UINT32 re_get_id_continue(RE_UINT32 codepoint);
+RE_UINT32 re_get_ideographic(RE_UINT32 codepoint);
+RE_UINT32 re_get_ids_binary_operator(RE_UINT32 codepoint);
+RE_UINT32 re_get_id_start(RE_UINT32 codepoint);
+RE_UINT32 re_get_ids_trinary_operator(RE_UINT32 codepoint);
+RE_UINT32 re_get_indic_positional_category(RE_UINT32 codepoint);
+RE_UINT32 re_get_indic_syllabic_category(RE_UINT32 codepoint);
+RE_UINT32 re_get_join_control(RE_UINT32 codepoint);
+RE_UINT32 re_get_joining_group(RE_UINT32 codepoint);
+RE_UINT32 re_get_joining_type(RE_UINT32 codepoint);
+RE_UINT32 re_get_line_break(RE_UINT32 codepoint);
+RE_UINT32 re_get_logical_order_exception(RE_UINT32 codepoint);
+RE_UINT32 re_get_lowercase(RE_UINT32 codepoint);
+RE_UINT32 re_get_math(RE_UINT32 codepoint);
+RE_UINT32 re_get_nfc_quick_check(RE_UINT32 codepoint);
+RE_UINT32 re_get_nfd_quick_check(RE_UINT32 codepoint);
+RE_UINT32 re_get_nfkc_quick_check(RE_UINT32 codepoint);
+RE_UINT32 re_get_nfkd_quick_check(RE_UINT32 codepoint);
+RE_UINT32 re_get_noncharacter_code_point(RE_UINT32 codepoint);
+RE_UINT32 re_get_numeric_type(RE_UINT32 codepoint);
+RE_UINT32 re_get_numeric_value(RE_UINT32 codepoint);
+RE_UINT32 re_get_other_alphabetic(RE_UINT32 codepoint);
+RE_UINT32 re_get_other_default_ignorable_code_point(RE_UINT32 codepoint);
+RE_UINT32 re_get_other_grapheme_extend(RE_UINT32 codepoint);
+RE_UINT32 re_get_other_id_continue(RE_UINT32 codepoint);
+RE_UINT32 re_get_other_id_start(RE_UINT32 codepoint);
+RE_UINT32 re_get_other_lowercase(RE_UINT32 codepoint);
+RE_UINT32 re_get_other_math(RE_UINT32 codepoint);
+RE_UINT32 re_get_other_uppercase(RE_UINT32 codepoint);
+RE_UINT32 re_get_pattern_syntax(RE_UINT32 codepoint);
+RE_UINT32 re_get_pattern_white_space(RE_UINT32 codepoint);
+RE_UINT32 re_get_posix_alnum(RE_UINT32 codepoint);
+RE_UINT32 re_get_posix_digit(RE_UINT32 codepoint);
+RE_UINT32 re_get_posix_punct(RE_UINT32 codepoint);
+RE_UINT32 re_get_posix_xdigit(RE_UINT32 codepoint);
+RE_UINT32 re_get_prepended_concatenation_mark(RE_UINT32 codepoint);
+RE_UINT32 re_get_print(RE_UINT32 codepoint);
+RE_UINT32 re_get_quotation_mark(RE_UINT32 codepoint);
+RE_UINT32 re_get_radical(RE_UINT32 codepoint);
+RE_UINT32 re_get_regional_indicator(RE_UINT32 codepoint);
+RE_UINT32 re_get_script(RE_UINT32 codepoint);
+int re_get_script_extensions(RE_UINT32 codepoint, RE_UINT8* scripts);
+RE_UINT32 re_get_sentence_break(RE_UINT32 codepoint);
+RE_UINT32 re_get_sentence_terminal(RE_UINT32 codepoint);
+RE_UINT32 re_get_soft_dotted(RE_UINT32 codepoint);
+RE_UINT32 re_get_terminal_punctuation(RE_UINT32 codepoint);
+RE_UINT32 re_get_unified_ideograph(RE_UINT32 codepoint);
+RE_UINT32 re_get_uppercase(RE_UINT32 codepoint);
+RE_UINT32 re_get_variation_selector(RE_UINT32 codepoint);
+RE_UINT32 re_get_white_space(RE_UINT32 codepoint);
+RE_UINT32 re_get_word(RE_UINT32 codepoint);
+RE_UINT32 re_get_word_break(RE_UINT32 codepoint);
+RE_UINT32 re_get_xdigit(RE_UINT32 codepoint);
+RE_UINT32 re_get_xid_continue(RE_UINT32 codepoint);
+RE_UINT32 re_get_xid_start(RE_UINT32 codepoint);
+int re_get_all_cases(RE_UINT32 codepoint, RE_UINT32* cases);
+RE_UINT32 re_get_simple_case_folding(RE_UINT32 codepoint);
+int re_get_full_case_folding(RE_UINT32 codepoint, RE_UINT32* folded);
diff --git a/regex_3/regex/regex.py b/regex_3/regex.py
similarity index 91%
rename from regex_3/regex/regex.py
rename to regex_3/regex.py
index 5b28eda..a280ab8 100644
--- a/regex_3/regex/regex.py
+++ b/regex_3/regex.py
@@ -136,6 +136,7 @@ second character.
     \g<name>        Matches the text matched by the group named name.
     \G              Matches the empty string, but only at the position where
                     the search started.
+    \h              Matches horizontal whitespace.
     \K              Keeps only what follows for the entire match.
     \L<name>        Named list. The list is provided as a keyword argument.
     \m              Matches the empty string, but only at the start of a word.
@@ -239,54 +240,54 @@ __all__ = ["compile", "DEFAULT_VERSION", "escape", "findall", "finditer",
   "T", "TEMPLATE", "U", "UNICODE", "V0", "VERSION0", "V1", "VERSION1", "X",
   "VERBOSE", "W", "WORD", "error", "Regex", "__version__", "__doc__"]
 
-__version__ = "2.5.64"
+__version__ = "2.5.83"
 
 # --------------------------------------------------------------------
 # Public interface.
 
 def match(pattern, string, flags=0, pos=None, endpos=None, partial=False,
-  concurrent=None, timeout=None, **kwargs):
+  concurrent=None, timeout=None, ignore_unused=False, **kwargs):
     """Try to apply the pattern at the start of the string, returning a match
     object, or None if no match was found."""
-    return _compile(pattern, flags, kwargs).match(string, pos, endpos,
-      concurrent, partial, timeout)
+    return _compile(pattern, flags, ignore_unused, kwargs).match(string, pos,
+      endpos, concurrent, partial, timeout)
 
 def fullmatch(pattern, string, flags=0, pos=None, endpos=None, partial=False,
-  concurrent=None, timeout=None, **kwargs):
+  concurrent=None, timeout=None, ignore_unused=False, **kwargs):
     """Try to apply the pattern against all of the string, returning a match
     object, or None if no match was found."""
-    return _compile(pattern, flags, kwargs).fullmatch(string, pos, endpos,
-      concurrent, partial, timeout)
+    return _compile(pattern, flags, ignore_unused, kwargs).fullmatch(string,
+      pos, endpos, concurrent, partial, timeout)
 
 def search(pattern, string, flags=0, pos=None, endpos=None, partial=False,
-  concurrent=None, timeout=None, **kwargs):
+  concurrent=None, timeout=None, ignore_unused=False, **kwargs):
     """Search through string looking for a match to the pattern, returning a
     match object, or None if no match was found."""
-    return _compile(pattern, flags, kwargs).search(string, pos, endpos,
-      concurrent, partial, timeout)
+    return _compile(pattern, flags, ignore_unused, kwargs).search(string, pos,
+      endpos, concurrent, partial, timeout)
 
 def sub(pattern, repl, string, count=0, flags=0, pos=None, endpos=None,
-  concurrent=None, timeout=None, **kwargs):
+  concurrent=None, timeout=None, ignore_unused=False, **kwargs):
     """Return the string obtained by replacing the leftmost (or rightmost with a
     reverse pattern) non-overlapping occurrences of the pattern in string by the
     replacement repl. repl can be either a string or a callable; if a string,
     backslash escapes in it are processed; if a callable, it's passed the match
     object and must return a replacement string to be used."""
-    return _compile(pattern, flags, kwargs).sub(repl, string, count, pos,
-      endpos, concurrent, timeout)
+    return _compile(pattern, flags, ignore_unused, kwargs).sub(repl, string,
+      count, pos, endpos, concurrent, timeout)
 
 def subf(pattern, format, string, count=0, flags=0, pos=None, endpos=None,
-  concurrent=None, timeout=None, **kwargs):
+  concurrent=None, timeout=None, ignore_unused=False, **kwargs):
     """Return the string obtained by replacing the leftmost (or rightmost with a
     reverse pattern) non-overlapping occurrences of the pattern in string by the
     replacement format. format can be either a string or a callable; if a string,
     it's treated as a format string; if a callable, it's passed the match object
     and must return a replacement string to be used."""
-    return _compile(pattern, flags, kwargs).subf(format, string, count, pos,
-      endpos, concurrent, timeout)
+    return _compile(pattern, flags, ignore_unused, kwargs).subf(format, string,
+      count, pos, endpos, concurrent, timeout)
 
 def subn(pattern, repl, string, count=0, flags=0, pos=None, endpos=None,
-  concurrent=None, timeout=None, **kwargs):
+  concurrent=None, timeout=None, ignore_unused=False, **kwargs):
     """Return a 2-tuple containing (new_string, number). new_string is the string
     obtained by replacing the leftmost (or rightmost with a reverse pattern)
     non-overlapping occurrences of the pattern in the source string by the
@@ -294,11 +295,11 @@ def subn(pattern, repl, string, count=0, flags=0, pos=None, endpos=None,
     can be either a string or a callable; if a string, backslash escapes in it
     are processed; if a callable, it's passed the match object and must return a
     replacement string to be used."""
-    return _compile(pattern, flags, kwargs).subn(repl, string, count, pos,
-      endpos, concurrent, timeout)
+    return _compile(pattern, flags, ignore_unused, kwargs).subn(repl, string,
+      count, pos, endpos, concurrent, timeout)
 
 def subfn(pattern, format, string, count=0, flags=0, pos=None, endpos=None,
-  concurrent=None, timeout=None, **kwargs):
+  concurrent=None, timeout=None, ignore_unused=False, **kwargs):
     """Return a 2-tuple containing (new_string, number). new_string is the string
     obtained by replacing the leftmost (or rightmost with a reverse pattern)
     non-overlapping occurrences of the pattern in the source string by the
@@ -306,45 +307,46 @@ def subfn(pattern, format, string, count=0, flags=0, pos=None, endpos=None,
     can be either a string or a callable; if a string, it's treated as a format
     string; if a callable, it's passed the match object and must return a
     replacement string to be used."""
-    return _compile(pattern, flags, kwargs).subfn(format, string, count, pos,
-      endpos, concurrent, timeout)
+    return _compile(pattern, flags, ignore_unused, kwargs).subfn(format, string,
+      count, pos, endpos, concurrent, timeout)
 
 def split(pattern, string, maxsplit=0, flags=0, concurrent=None, timeout=None,
-  **kwargs):
+  ignore_unused=False, **kwargs):
     """Split the source string by the occurrences of the pattern, returning a
     list containing the resulting substrings.  If capturing parentheses are used
     in pattern, then the text of all groups in the pattern are also returned as
     part of the resulting list.  If maxsplit is nonzero, at most maxsplit splits
     occur, and the remainder of the string is returned as the final element of
     the list."""
-    return _compile(pattern, flags, kwargs).split(string, maxsplit, concurrent, timeout)
+    return _compile(pattern, flags, ignore_unused, kwargs).split(string,
+      maxsplit, concurrent, timeout)
 
 def splititer(pattern, string, maxsplit=0, flags=0, concurrent=None, timeout=None,
-  **kwargs):
+  ignore_unused=False, **kwargs):
     "Return an iterator yielding the parts of a split string."
-    return _compile(pattern, flags, kwargs).splititer(string, maxsplit,
-      concurrent, timeout)
+    return _compile(pattern, flags, ignore_unused, kwargs).splititer(string,
+      maxsplit, concurrent, timeout)
 
 def findall(pattern, string, flags=0, pos=None, endpos=None, overlapped=False,
-  concurrent=None, timeout=None, **kwargs):
+  concurrent=None, timeout=None, ignore_unused=False, **kwargs):
     """Return a list of all matches in the string. The matches may be overlapped
     if overlapped is True. If one or more groups are present in the pattern,
     return a list of groups; this will be a list of tuples if the pattern has
     more than one group. Empty matches are included in the result."""
-    return _compile(pattern, flags, kwargs).findall(string, pos, endpos,
-      overlapped, concurrent, timeout)
+    return _compile(pattern, flags, ignore_unused, kwargs).findall(string, pos,
+      endpos, overlapped, concurrent, timeout)
 
 def finditer(pattern, string, flags=0, pos=None, endpos=None, overlapped=False,
-  partial=False, concurrent=None, timeout=None, **kwargs):
+  partial=False, concurrent=None, timeout=None, ignore_unused=False, **kwargs):
     """Return an iterator over all matches in the string. The matches may be
     overlapped if overlapped is True. For each match, the iterator returns a
     match object. Empty matches are included in the result."""
-    return _compile(pattern, flags, kwargs).finditer(string, pos, endpos,
-      overlapped, concurrent, partial, timeout)
+    return _compile(pattern, flags, ignore_unused, kwargs).finditer(string, pos,
+      endpos, overlapped, concurrent, partial, timeout)
 
-def compile(pattern, flags=0, **kwargs):
+def compile(pattern, flags=0, ignore_unused=False, **kwargs):
     "Compile a regular expression pattern, returning a pattern object."
-    return _compile(pattern, flags, kwargs)
+    return _compile(pattern, flags, ignore_unused, kwargs)
 
 def purge():
     "Clear the regular expression cache"
@@ -353,7 +355,7 @@ def purge():
 
 def template(pattern, flags=0):
     "Compile a template pattern, returning a pattern object."
-    return _compile(pattern, flags | TEMPLATE)
+    return _compile(pattern, flags | TEMPLATE, False, {})
 
 def escape(pattern, special_only=True, literal_spaces=False):
     """Escape a string for use as a literal in a pattern. If special_only is
@@ -431,7 +433,7 @@ _locale_sensitive = {}
 _MAXCACHE = 500
 _MAXREPCACHE = 500
 
-def _compile(pattern, flags=0, kwargs={}):
+def _compile(pattern, flags, ignore_unused, kwargs):
     "Compiles a regular expression to a PatternObject."
 
     global DEFAULT_VERSION
@@ -577,6 +579,12 @@ def _compile(pattern, flags=0, kwargs={}):
         named_list_indexes[index] = items
         args_needed.add((name, values))
 
+    # Any unused keyword arguments, possibly resulting from a typo?
+    unused_kwargs = set(kwargs) - set(named_lists)
+    if unused_kwargs and not ignore_unused:
+        any_one = next(iter(unused_kwargs))
+        raise ValueError('unused keyword argument {!a}'.format(any_one))
+
     # Check the features of the groups.
     _check_group_features(info, parsed)
 
@@ -694,8 +702,8 @@ def _compile_replacement_helper(pattern, template):
     return compiled
 
 # We define Pattern here after all the support objects have been defined.
-Pattern = type(_compile('', 0, {}))
-Match = type(_compile('', 0).match(''))
+Pattern = type(_compile('', 0, False, {}))
+Match = type(_compile('', 0, False, {}).match(''))
 
 # We'll define an alias for the 'compile' function so that the repr of a
 # pattern object is eval-able.
diff --git a/regex_3/regex/test/__init__.py b/regex_3/regex/test/__init__.py
deleted file mode 100644
index e69de29..0000000
diff --git a/regex_3/regex/test/test_regex.py b/regex_3/test_regex.py
similarity index 97%
rename from regex_3/regex/test/test_regex.py
rename to regex_3/test_regex.py
index 0b0e3ff..245c042 100644
--- a/regex_3/regex/test/test_regex.py
+++ b/regex_3/test_regex.py
@@ -1,11 +1,10 @@
-import regex
-import string
 from weakref import proxy
-import unittest
 import copy
 import pickle
-from test.support import run_unittest
+import regex
+import string
 import sys
+import unittest
 
 # String subclasses for issue 18468.
 class StrSubclass(str):
@@ -1802,8 +1801,8 @@ class RegexTests(unittest.TestCase):
               ascii('\a\b\f\n\r\t\v')),
             (r'[\a][\b][\f][\n][\r][\t][\v]', '\a\b\f\n\r\t\v', '0',
               ascii('\a\b\f\n\r\t\v')),
-            (r'\c\e\g\h\i\j\k\o\p\q\y\z', 'ceghijkopqyz', '0',
-              ascii('ceghijkopqyz')),
+            (r'\c\e\g\i\j\k\o\p\q\y\z', 'cegijkopqyz', '0',
+              ascii('cegijkopqyz')),
             (r'\xff', '\377', '0', ascii(chr(255))),
 
             # New \x semantics.
@@ -4188,103 +4187,142 @@ thing
           ['\U0001F468\u200D\U0001F469\u200D\U0001F467\u200D\U0001F466'])
 
         # Hg issue 320: Abnormal performance
-        self.assertEquals(bool(regex.search(r'(?=a)a', 'a')), True)
-        self.assertEquals(bool(regex.search(r'(?!b)a', 'a')), True)
+        self.assertEqual(bool(regex.search(r'(?=a)a', 'a')), True)
+        self.assertEqual(bool(regex.search(r'(?!b)a', 'a')), True)
 
         # Hg issue 327: .fullmatch() causes MemoryError
-        self.assertEquals(regex.fullmatch(r'((\d)*?)*?', '123').span(), (0, 3))
+        self.assertEqual(regex.fullmatch(r'((\d)*?)*?', '123').span(), (0, 3))
 
         # Hg issue 329: Wrong group matches when question mark quantifier is used within a look behind
-        self.assertEquals(regex.search(r'''(?(DEFINE)(?<mydef>(?<wrong>THIS_SHOULD_NOT_MATCHx?)|(?<right>right))).*(?<=(?&mydef).*)''',
+        self.assertEqual(regex.search(r'''(?(DEFINE)(?<mydef>(?<wrong>THIS_SHOULD_NOT_MATCHx?)|(?<right>right))).*(?<=(?&mydef).*)''',
           'x right').capturesdict(), {'mydef': ['right'], 'wrong': [], 'right':
           ['right']})
 
+        # Hg issue 353: fuzzy changes negative indexes
+        self.assertEqual(regex.search(r'(?be)(AGTGTTCCCCGCGCCAGCGGGGATAAACCG){s<=5,i<=5,d<=5,s+i+d<=10}',
+          'TTCCCCGCGCCAGCGGGGATAAACCG').fuzzy_changes, ([], [], [0, 1, 3, 5]))
+
+        # Git issue 364: Contradictory values in fuzzy_counts and fuzzy_changes
+        self.assertEqual(regex.match(r'(?:bc){e}', 'c').fuzzy_counts, (1, 0,
+          1))
+        self.assertEqual(regex.match(r'(?:bc){e}', 'c').fuzzy_changes, ([0],
+          [], [1]))
+        self.assertEqual(regex.match(r'(?e)(?:bc){e}', 'c').fuzzy_counts, (0,
+          0, 1))
+        self.assertEqual(regex.match(r'(?e)(?:bc){e}', 'c').fuzzy_changes,
+          ([], [], [0]))
+        self.assertEqual(regex.match(r'(?b)(?:bc){e}', 'c').fuzzy_counts, (0,
+          0, 1))
+        self.assertEqual(regex.match(r'(?b)(?:bc){e}', 'c').fuzzy_changes,
+          ([], [], [0]))
+
+        # Git issue 370: Confusions about Fuzzy matching behavior
+        self.assertEqual(regex.match('(?e)(?:^(\\$ )?\\d{1,3}(,\\d{3})*(\\.\\d{2})$){e}',
+          '$ 10,112.111.12').fuzzy_counts, (6, 0, 5))
+        self.assertEqual(regex.match('(?e)(?:^(\\$ )?\\d{1,3}(,\\d{3})*(\\.\\d{2})$){s<=1}',
+          '$ 10,112.111.12').fuzzy_counts, (1, 0, 0))
+        self.assertEqual(regex.match('(?e)(?:^(\\$ )?\\d{1,3}(,\\d{3})*(\\.\\d{2})$){s<=1,i<=1,d<=1}',
+          '$ 10,112.111.12').fuzzy_counts, (1, 0, 0))
+        self.assertEqual(regex.match('(?e)(?:^(\\$ )?\\d{1,3}(,\\d{3})*(\\.\\d{2})$){s<=3}',
+          '$ 10,1a2.111.12').fuzzy_counts, (2, 0, 0))
+        self.assertEqual(regex.match('(?e)(?:^(\\$ )?\\d{1,3}(,\\d{3})*(\\.\\d{2})$){s<=2}',
+          '$ 10,1a2.111.12').fuzzy_counts, (2, 0, 0))
+
+        self.assertEqual(regex.fullmatch(r'(?e)(?:0?,0(?:,0)?){s<=1,d<=1}',
+          ',0;0').fuzzy_counts, (1, 0, 0))
+        self.assertEqual(regex.fullmatch(r'(?e)(?:0??,0(?:,0)?){s<=1,d<=1}',
+          ',0;0').fuzzy_counts, (1, 0, 0))
+
+        # Git issue 371: Specifying character set when fuzzy-matching allows characters not in the set
+        self.assertEqual(regex.search(r"\b(?e)(?:\d{6,20}){i<=5:[\-\\\/]}\b",
+          "cat dog starting at 00:01132.000. hello world"), None)
+
     def test_fuzzy_ext(self):
-        self.assertEquals(bool(regex.fullmatch(r'(?r)(?:a){e<=1:[a-z]}', 'e')),
+        self.assertEqual(bool(regex.fullmatch(r'(?r)(?:a){e<=1:[a-z]}', 'e')),
           True)
-        self.assertEquals(bool(regex.fullmatch(r'(?:a){e<=1:[a-z]}', 'e')),
+        self.assertEqual(bool(regex.fullmatch(r'(?:a){e<=1:[a-z]}', 'e')),
           True)
-        self.assertEquals(bool(regex.fullmatch(r'(?:a){e<=1:[a-z]}', '-')),
+        self.assertEqual(bool(regex.fullmatch(r'(?:a){e<=1:[a-z]}', '-')),
           False)
-        self.assertEquals(bool(regex.fullmatch(r'(?r)(?:a){e<=1:[a-z]}', '-')),
+        self.assertEqual(bool(regex.fullmatch(r'(?r)(?:a){e<=1:[a-z]}', '-')),
           False)
 
-        self.assertEquals(bool(regex.fullmatch(r'(?:a){e<=1:[a-z]}', 'ae')),
+        self.assertEqual(bool(regex.fullmatch(r'(?:a){e<=1:[a-z]}', 'ae')),
           True)
-        self.assertEquals(bool(regex.fullmatch(r'(?r)(?:a){e<=1:[a-z]}',
+        self.assertEqual(bool(regex.fullmatch(r'(?r)(?:a){e<=1:[a-z]}',
           'ae')), True)
-        self.assertEquals(bool(regex.fullmatch(r'(?:a){e<=1:[a-z]}', 'a-')),
+        self.assertEqual(bool(regex.fullmatch(r'(?:a){e<=1:[a-z]}', 'a-')),
           False)
-        self.assertEquals(bool(regex.fullmatch(r'(?r)(?:a){e<=1:[a-z]}',
+        self.assertEqual(bool(regex.fullmatch(r'(?r)(?:a){e<=1:[a-z]}',
           'a-')), False)
 
-        self.assertEquals(bool(regex.fullmatch(r'(?:ab){e<=1:[a-z]}', 'ae')),
+        self.assertEqual(bool(regex.fullmatch(r'(?:ab){e<=1:[a-z]}', 'ae')),
            True)
-        self.assertEquals(bool(regex.fullmatch(r'(?r)(?:ab){e<=1:[a-z]}',
+        self.assertEqual(bool(regex.fullmatch(r'(?r)(?:ab){e<=1:[a-z]}',
            'ae')), True)
-        self.assertEquals(bool(regex.fullmatch(r'(?:ab){e<=1:[a-z]}', 'a-')),
+        self.assertEqual(bool(regex.fullmatch(r'(?:ab){e<=1:[a-z]}', 'a-')),
            False)
-        self.assertEquals(bool(regex.fullmatch(r'(?r)(?:ab){e<=1:[a-z]}',
+        self.assertEqual(bool(regex.fullmatch(r'(?r)(?:ab){e<=1:[a-z]}',
            'a-')), False)
 
-        self.assertEquals(bool(regex.fullmatch(r'(a)\1{e<=1:[a-z]}', 'ae')),
+        self.assertEqual(bool(regex.fullmatch(r'(a)\1{e<=1:[a-z]}', 'ae')),
            True)
-        self.assertEquals(bool(regex.fullmatch(r'(?r)\1{e<=1:[a-z]}(a)',
+        self.assertEqual(bool(regex.fullmatch(r'(?r)\1{e<=1:[a-z]}(a)',
            'ea')), True)
-        self.assertEquals(bool(regex.fullmatch(r'(a)\1{e<=1:[a-z]}', 'a-')),
+        self.assertEqual(bool(regex.fullmatch(r'(a)\1{e<=1:[a-z]}', 'a-')),
            False)
-        self.assertEquals(bool(regex.fullmatch(r'(?r)\1{e<=1:[a-z]}(a)',
+        self.assertEqual(bool(regex.fullmatch(r'(?r)\1{e<=1:[a-z]}(a)',
            '-a')), False)
 
-        self.assertEquals(bool(regex.fullmatch(r'(?fiu)(?:\N{LATIN SMALL LETTER SHARP S}){e<=1:[a-z]}',
+        self.assertEqual(bool(regex.fullmatch(r'(?fiu)(?:\N{LATIN SMALL LETTER SHARP S}){e<=1:[a-z]}',
           'ts')), True)
-        self.assertEquals(bool(regex.fullmatch(r'(?fiu)(?:\N{LATIN SMALL LETTER SHARP S}){e<=1:[a-z]}',
+        self.assertEqual(bool(regex.fullmatch(r'(?fiu)(?:\N{LATIN SMALL LETTER SHARP S}){e<=1:[a-z]}',
           'st')), True)
-        self.assertEquals(bool(regex.fullmatch(r'(?firu)(?:\N{LATIN SMALL LETTER SHARP S}){e<=1:[a-z]}',
+        self.assertEqual(bool(regex.fullmatch(r'(?firu)(?:\N{LATIN SMALL LETTER SHARP S}){e<=1:[a-z]}',
           'st')), True)
-        self.assertEquals(bool(regex.fullmatch(r'(?firu)(?:\N{LATIN SMALL LETTER SHARP S}){e<=1:[a-z]}',
+        self.assertEqual(bool(regex.fullmatch(r'(?firu)(?:\N{LATIN SMALL LETTER SHARP S}){e<=1:[a-z]}',
           'ts')), True)
-        self.assertEquals(bool(regex.fullmatch(r'(?fiu)(?:\N{LATIN SMALL LETTER SHARP S}){e<=1:[a-z]}',
+        self.assertEqual(bool(regex.fullmatch(r'(?fiu)(?:\N{LATIN SMALL LETTER SHARP S}){e<=1:[a-z]}',
           '-s')), False)
-        self.assertEquals(bool(regex.fullmatch(r'(?fiu)(?:\N{LATIN SMALL LETTER SHARP S}){e<=1:[a-z]}',
+        self.assertEqual(bool(regex.fullmatch(r'(?fiu)(?:\N{LATIN SMALL LETTER SHARP S}){e<=1:[a-z]}',
           's-')), False)
-        self.assertEquals(bool(regex.fullmatch(r'(?firu)(?:\N{LATIN SMALL LETTER SHARP S}){e<=1:[a-z]}',
+        self.assertEqual(bool(regex.fullmatch(r'(?firu)(?:\N{LATIN SMALL LETTER SHARP S}){e<=1:[a-z]}',
           's-')), False)
-        self.assertEquals(bool(regex.fullmatch(r'(?firu)(?:\N{LATIN SMALL LETTER SHARP S}){e<=1:[a-z]}',
+        self.assertEqual(bool(regex.fullmatch(r'(?firu)(?:\N{LATIN SMALL LETTER SHARP S}){e<=1:[a-z]}',
           '-s')), False)
 
-        self.assertEquals(bool(regex.fullmatch(r'(?fiu)(\N{LATIN SMALL LETTER SHARP S})\1{e<=1:[a-z]}',
+        self.assertEqual(bool(regex.fullmatch(r'(?fiu)(\N{LATIN SMALL LETTER SHARP S})\1{e<=1:[a-z]}',
            'ssst')), True)
-        self.assertEquals(bool(regex.fullmatch(r'(?fiu)(\N{LATIN SMALL LETTER SHARP S})\1{e<=1:[a-z]}',
+        self.assertEqual(bool(regex.fullmatch(r'(?fiu)(\N{LATIN SMALL LETTER SHARP S})\1{e<=1:[a-z]}',
            'ssts')), True)
-        self.assertEquals(bool(regex.fullmatch(r'(?firu)\1{e<=1:[a-z]}(\N{LATIN SMALL LETTER SHARP S})',
+        self.assertEqual(bool(regex.fullmatch(r'(?firu)\1{e<=1:[a-z]}(\N{LATIN SMALL LETTER SHARP S})',
            'stss')), True)
-        self.assertEquals(bool(regex.fullmatch(r'(?firu)\1{e<=1:[a-z]}(\N{LATIN SMALL LETTER SHARP S})',
+        self.assertEqual(bool(regex.fullmatch(r'(?firu)\1{e<=1:[a-z]}(\N{LATIN SMALL LETTER SHARP S})',
            'tsss')), True)
-        self.assertEquals(bool(regex.fullmatch(r'(?fiu)(\N{LATIN SMALL LETTER SHARP S})\1{e<=1:[a-z]}',
+        self.assertEqual(bool(regex.fullmatch(r'(?fiu)(\N{LATIN SMALL LETTER SHARP S})\1{e<=1:[a-z]}',
            'ss-s')), False)
-        self.assertEquals(bool(regex.fullmatch(r'(?fiu)(\N{LATIN SMALL LETTER SHARP S})\1{e<=1:[a-z]}',
+        self.assertEqual(bool(regex.fullmatch(r'(?fiu)(\N{LATIN SMALL LETTER SHARP S})\1{e<=1:[a-z]}',
            'sss-')), False)
-        self.assertEquals(bool(regex.fullmatch(r'(?firu)(\N{LATIN SMALL LETTER SHARP S})\1{e<=1:[a-z]}',
+        self.assertEqual(bool(regex.fullmatch(r'(?firu)(\N{LATIN SMALL LETTER SHARP S})\1{e<=1:[a-z]}',
            '-s')), False)
-        self.assertEquals(bool(regex.fullmatch(r'(?firu)(\N{LATIN SMALL LETTER SHARP S})\1{e<=1:[a-z]}',
+        self.assertEqual(bool(regex.fullmatch(r'(?firu)(\N{LATIN SMALL LETTER SHARP S})\1{e<=1:[a-z]}',
            's-')), False)
 
-        self.assertEquals(bool(regex.fullmatch(r'(?fiu)(ss)\1{e<=1:[a-z]}',
+        self.assertEqual(bool(regex.fullmatch(r'(?fiu)(ss)\1{e<=1:[a-z]}',
            '\N{LATIN SMALL LETTER SHARP S}ts')), True)
-        self.assertEquals(bool(regex.fullmatch(r'(?fiu)(ss)\1{e<=1:[a-z]}',
+        self.assertEqual(bool(regex.fullmatch(r'(?fiu)(ss)\1{e<=1:[a-z]}',
            '\N{LATIN SMALL LETTER SHARP S}st')), True)
-        self.assertEquals(bool(regex.fullmatch(r'(?firu)\1{e<=1:[a-z]}(ss)',
+        self.assertEqual(bool(regex.fullmatch(r'(?firu)\1{e<=1:[a-z]}(ss)',
            'st\N{LATIN SMALL LETTER SHARP S}')), True)
-        self.assertEquals(bool(regex.fullmatch(r'(?firu)\1{e<=1:[a-z]}(ss)',
+        self.assertEqual(bool(regex.fullmatch(r'(?firu)\1{e<=1:[a-z]}(ss)',
            'ts\N{LATIN SMALL LETTER SHARP S}')), True)
-        self.assertEquals(bool(regex.fullmatch(r'(?fiu)(ss)\1{e<=1:[a-z]}',
+        self.assertEqual(bool(regex.fullmatch(r'(?fiu)(ss)\1{e<=1:[a-z]}',
            '\N{LATIN SMALL LETTER SHARP S}-s')), False)
-        self.assertEquals(bool(regex.fullmatch(r'(?fiu)(ss)\1{e<=1:[a-z]}',
+        self.assertEqual(bool(regex.fullmatch(r'(?fiu)(ss)\1{e<=1:[a-z]}',
            '\N{LATIN SMALL LETTER SHARP S}s-')), False)
-        self.assertEquals(bool(regex.fullmatch(r'(?firu)(ss)\1{e<=1:[a-z]}',
+        self.assertEqual(bool(regex.fullmatch(r'(?firu)(ss)\1{e<=1:[a-z]}',
            's-\N{LATIN SMALL LETTER SHARP S}')), False)
-        self.assertEquals(bool(regex.fullmatch(r'(?firu)(ss)\1{e<=1:[a-z]}',
+        self.assertEqual(bool(regex.fullmatch(r'(?firu)(ss)\1{e<=1:[a-z]}',
            '-s\N{LATIN SMALL LETTER SHARP S}')), False)
 
     def test_subscripted_captures(self):
@@ -4323,7 +4361,7 @@ if sys.version_info < (3, 2, 0):
     RegexTests.assertRaisesRegex = RegexTests.assertRaisesRegexp
 
 def test_main():
-    run_unittest(RegexTests)
+    unittest.main(verbosity=2)
 
 if __name__ == "__main__":
     test_main()
diff --git a/setup.cfg b/setup.cfg
new file mode 100644
index 0000000..4927abe
--- /dev/null
+++ b/setup.cfg
@@ -0,0 +1,4 @@
+[egg_info]
+tag_build = 
+tag_date = 0
+
diff --git a/setup.py b/setup.py
index 7bce303..edcd6b8 100644
--- a/setup.py
+++ b/setup.py
@@ -1,33 +1,25 @@
 #!/usr/bin/env python
-from os.path import abspath, dirname, join
+from setuptools import setup, Extension
+from os.path import join
 import sys
 
-try:
-    from setuptools import setup, Extension
-except ImportError:
-    from distutils.core import setup, Extension
-
 MAJOR, MINOR = sys.version_info[:2]
-BASE_DIR = dirname(abspath(__file__))
-print('BASE_DIR is %s' % BASE_DIR)
 
-PKG_BASE = 'regex_%i' % MAJOR
-DOCS_DIR = join(BASE_DIR, 'docs')
+SRC_BASE = 'regex_%i' % MAJOR
+
+with open('README.rst') as file:
+    long_description = file.read()
 
 setup(
     name='regex',
-    version='2019.08.19',
+    version='2020.7.14',
     description='Alternative regular expression module, to replace re.',
-    long_description=open(join(DOCS_DIR, 'Features.rst')).read(),
-
-    # PyPI does spam protection on email addresses, no need to do it here
+    long_description=long_description,
     author='Matthew Barnett',
     author_email='regex@mrabarnett.plus.com',
-
-    maintainer='Matthew Barnett',
-    maintainer_email='regex@mrabarnett.plus.com',
-
     url='https://bitbucket.org/mrabarnett/mrab-regex',
+    license='Python Software Foundation License',
+
     classifiers=[
         'Development Status :: 5 - Production/Stable',
         'Intended Audience :: Developers',
@@ -42,13 +34,11 @@ setup(
         'Topic :: Software Development :: Libraries :: Python Modules',
         'Topic :: Text Processing',
         'Topic :: Text Processing :: General',
-        ],
-    license='Python Software Foundation License',
+    ],
 
+    package_dir={'regex': SRC_BASE},
     py_modules=['regex.__init__', 'regex.regex', 'regex._regex_core',
-     'regex.test.__init__', 'regex.test.test_regex'],
-    package_dir={'': PKG_BASE},
-
-    ext_modules=[Extension('regex._regex', [join(PKG_BASE, '_regex.c'),
-      join(PKG_BASE, '_regex_unicode.c')])],
-    )
+     'regex.test_regex'],
+    ext_modules=[Extension('regex._regex', [join(SRC_BASE, '_regex.c'),
+      join(SRC_BASE, '_regex_unicode.c')])],
+)
diff --git a/tools/build_regex_unicode.py b/tools/build_regex_unicode.py
index c87f036..4457033 100644
--- a/tools/build_regex_unicode.py
+++ b/tools/build_regex_unicode.py
@@ -1,2353 +1,1776 @@
-#! python3.7
-# -*- coding: utf-8 -*-
-#
-# This Python script parses the Unicode data files and generates the C files
-# for the regex module.
-#
-# Written by MRAB.
-#
-from collections import defaultdict
-from json import dump, load
-from os import remove, rename
-from os.path import dirname, exists, isfile, join, splitext
-from shutil import copy2, move
-from urllib.error import HTTPError
-from urllib.parse import urljoin
-from urllib.request import urlretrieve
-
-def report(*args, **kwargs):
-    print(*args, **kwargs, flush=True)
-
-class UnicodeDataError(Exception):
-    pass
-
-def download_unicode_file(url, path):
-    'Downloads a Unicode file.'
-
-    report('Downloading {}'.format(url))
-
-    new_path = path + '.new'
-
-    try:
-        urlretrieve(url, new_path)
-    except ValueError:
-        # The download failed. Clean up.
-        try:
-            remove(new_path)
-        except OSError:
-            pass
-
-        raise
-
-    # Make a copy of the downloaded file with a versioned filename.
-    with open(new_path, encoding='utf-8') as file:
-        # The 1st line of the file should be a comment with a version filename.
-        line = file.readline()
-
-    if line.startswith('#') and line.endswith('.txt\n'):
-        versioned_name = line.strip('# \n')
-        versioned_path = join(unicode_folder, versioned_name)
-        if isfile(versioned_path):
-            # We already have this version.
-            remove(new_path)
-        else:
-            # It's a new version.
-            move(new_path, path)
-            copy2(path, versioned_path)
-
-            version = splitext(versioned_name)[0].partition('-')[2]
-            report('Updated to version {}'.format(versioned_name))
-
-class MultistageTable:
-    'A multi-stage table.'
-
-    def __init__(self, block_sizes, stages, is_binary):
-        self.block_sizes = block_sizes
-        self.stages = stages
-        self.is_binary = is_binary
-
-        self.num_stages = len(self.block_sizes) + 1
-
-        # How many bytes of storage are needed for this table?
-        if self.is_binary:
-            self.bytesize = (sum(smallest_datatype(min(stage), max(stage))[1] *
-              len(stage) for stage in self.stages[ : -1]) +
-              (len(self.stages[-1]) + 7) // 8)
-        else:
-            self.bytesize = sum(smallest_datatype(min(stage), max(stage))[1] *
-              len(stage) for stage in self.stages)
-
-        # Calculate the block-size products for lookup.
-        self._size_products = [product(self.block_sizes[stage : ]) for stage in
-          range(self.num_stages - 1)]
-
-class PropertySet:
-    'A collection of Unicode properties.'
-
-    def __init__(self):
-        self._property_list = []
-        self._property_dict = {}
-        self._munge_property_name = None
-
-    def add(self, property):
-        'Adds a property.'
-
-        if not self._munge_property_name:
-            self._munge_property_name = property.munge_name
-
-        if property.name in self:
-            raise ValueError('property set already has property {!a}'.format(property.name))
-
-        self._property_list.append(property)
-
-        for name in [property.name] + property.aliases:
-            self._property_dict[self._munge_property_name(name)] = property
-
-    def get(self, name, default=None):
-        if not self._property_dict:
-            return default
-
-        return self._property_dict.get(self._munge_property_name(name),
-          default)
-
-    def __len__(self):
-        return len(self._property_list)
-
-    def __getitem__(self, name):
-        property = self.get(self._munge_property_name(name))
-        if property is None:
-            raise KeyError(name)
-
-        return property
-
-    def __delitem__(self, name):
-        property = self[name]
-
-        self._property_list = [p for p in self._property_list if p is not
-          property]
-        self._property_dict = {n: p for n, p in self._property_dict.items() if
-          p is not property}
-
-    def __iter__(self):
-        for property in self._property_list:
-            yield property
-
-class Property:
-    'A Unicode property.'
-
-    def __init__(self, name, aliases=[]):
-        self.name = name
-        self.aliases = []
-        self.default = None
-        self.id = None
-        self._value_list = []
-        self._value_dict = {}
-        self._munge_value_name = None
-
-        # Ignore any duplicate names.
-        seen = {self.munge_name(self.name)}
-
-        for name in aliases:
-            munged_name = self.munge_name(name)
-            if munged_name not in seen:
-                self.aliases.append(name)
-                seen.add(munged_name)
-
-    def add(self, value):
-        'Adds a value.'
-
-        if not self._munge_value_name:
-            self._munge_value_name = value.munge_name
-
-        if value.name in self:
-            raise KeyError('property {!a} already has value {!a}'.format(self.name,
-              value.name))
-
-        self._value_list.append(value)
-
-        for munged_name in [value.name] + value.aliases:
-            self._value_dict[self._munge_value_name(munged_name)] = value
-
-    def munge_name(self, name):
-        'Munges a name into a standard form.'
-
-        return name.translate(self._munge_trans).upper()
-
-    _munge_trans = str.maketrans('', '', ' -_')
-
-    def get(self, name, default=None):
-        if not self._value_dict:
-            return default
-
-        return self._value_dict.get(self._munge_value_name(name), default)
-
-    def __len__(self):
-        return len(self._value_list)
-
-    def __getitem__(self, name):
-        value = self.get(name)
-        if value is None:
-            raise KeyError(name)
-
-        return value
-
-    def __iter__(self):
-        for value in self._value_list:
-            yield value
-
-    def _expand_entries(self):
-        'Expands the value dict into a list of entries.'
-
-        entries = [0] * NUM_CODEPOINTS
-
-        if self.name == 'Script_Extensions':
-            script = properties['Script']
-
-            for value in script._value_list:
-                for lower, upper in value.ranges:
-                    entries[lower : upper + 1] = [value.id] * (upper - lower +
-                      1)
-
-        for value in self._value_list:
-            if not value.mask:
-                for lower, upper in value.ranges:
-                    entries[lower : upper + 1] = [value.id] * (upper - lower +
-                      1)
-
-        return entries
-
-    def generate_code(self, h_file, c_file):
-        'Generates the code for a property.'
-
-        # Build the tables.
-        self._build_tables(MAX_STAGES)
-
-        report('Generating code for {!a}'.format(self.name))
-
-        table = self.table
-
-        # Write the property tables.
-        c_file.write('''
-/* {name}. */
-'''.format(name=self.name))
-
-        self.generate_tables(c_file)
-
-        if self.name == 'Script_Extensions':
-            rows = []
-            scripts = properties['Script']
-
-            for value in sorted(self, key=lambda value: value.id):
-                rows.append(sorted(scripts[name].id for name in
-                  value.name.split()))
-
-            max_cols = max(len(row) for row in rows)
-            fmt = '    {{' + ', '.join(['%3d'] * max_cols) + '}},'
-
-            rows = [fmt % tuple(row + [0] * (max_cols - len(row))) for row in
-              rows]
-            rows[-1] = rows[-1].rstrip(',')
-
-            c_file.write('''
-static RE_ScriptExt re_scripts_extensions_table[] = {
-''')
-
-            for row in rows:
-                c_file.write(row + '\n')
-
-            c_file.write('''\
-};
-''')
-
-        # Write the lookup function.
-        if self.name == 'Script_Extensions':
-            prototype = 'int re_get_script_extensions(RE_UINT32 ch, RE_UINT8* scripts)'
-        else:
-            prototype = 'RE_UINT32 re_get_{name}(RE_UINT32 ch)'.format(name=self.name.lower())
-
-        h_file.write('{prototype};\n'.format(prototype=prototype))
-
-        c_file.write('''
-{prototype} {{
-'''.format(prototype=prototype))
-
-        self._generate_locals(c_file)
-
-        c_file.write('\n')
-
-        self._generate_lookup(c_file)
-
-        if self.name == 'Script_Extensions':
-            c_file.write('''
-    scr = re_scripts_extensions_table[value].scripts;
-    scripts[0] = scr[0];
-    count = 1;
-
-    if (scr[0] != 0) {
-        while (count < RE_MAX_SCX && scr[count] != 0) {
-            scripts[count] = scr[count];
-            ++count;
-        }
-    }
-
-    return count;
-}
-''')
-        else:
-            c_file.write('''
-    return value;
-}
-''')
-
-    def generate_tables(self, c_file):
-        'Generates the tables.'
-
-        table = self.table
-
-        for stage in range(table.num_stages):
-            # The contents of this table.
-            entries = table.stages[stage]
-
-            # What data type should we use for the entries?
-            if self.is_binary and stage == table.num_stages - 1:
-                data_type = 'RE_UINT8'
-
-                entries = self._pack_to_bitflags(entries)
-            else:
-                data_type = smallest_datatype(min(entries), max(entries))[0]
-
-            # The entries will be stored in an array.
-            c_file.write('''
-static {data_type} re_{name}_stage_{stage}[] = {{
-'''.format(data_type=data_type, name=self.name.lower(), stage=stage + 1))
-
-            # Write the entries, nicely aligned in columns.
-            entries = ['{},'.format(e) for e in entries]
-
-            entry_width = max(len(e) for e in entries)
-            entries = [e.rjust(entry_width) for e in entries]
-
-            for start in range(0, len(entries), COLUMNS):
-                c_file.write('    {}\n'.format(' '.join(entries[start : start +
-                  COLUMNS])))
-
-            c_file.write('};\n')
-
-        # Write how much storage will be used by all of the tables.
-        c_file.write('''
-/* {name}: {bytesize} bytes. */
-'''.format(name=self.name, bytesize=table.bytesize))
-
-    def _pack_to_bitflags(self, entries):
-        entries = tuple(entries)
-        new_entries = []
-
-        for start in range(0, len(entries), 8):
-            new_entries.append(self.bitflag_dict[entries[start : start + 8]])
-
-        return new_entries
-
-    # Build a dict for converting 8-tuples into bytes.
-    bitflag_dict = {}
-
-    for byte in range(0x100):
-        bitflag_dict[tuple(map(int, '{:08b}'.format(byte)[ : : -1]))] = byte
-
-    def _generate_locals(self, c_file):
-        c_file.write('''\
-    RE_UINT32 code;
-    RE_UINT32 f;
-    RE_UINT32 pos;
-    RE_UINT32 value;
-''')
-
-        if self.name == 'Script_Extensions':
-            c_file.write('''\
-    RE_UINT8* scr;
-    int count;
-''')
-
-    def _generate_lookup(self, c_file):
-        'Generates the C lookup function.'
-
-        table = self.table
-        name = self.name.lower()
-
-        # Convert the block sizes into shift values.
-        shifts = [mul_to_shift(size) for size in table.block_sizes]
-
-        c_file.write('''\
-    f = ch >> {field_shift};
-    code = ch ^ (f << {field_shift});
-    pos = (RE_UINT32)re_{name}_stage_1[f] << {block_shift};
-'''.format(field_shift=sum(shifts), name=name, block_shift=shifts[0]))
-
-        for stage in range(1, table.num_stages - 1):
-            c_file.write('''\
-    f = code >> {field_shift};
-    code ^= f << {field_shift};
-    pos = (RE_UINT32)re_{name}_stage_{stage}[pos + f] << {block_shift};
-'''.format(field_shift=sum(shifts[stage : ]), name=name, stage=stage + 1,
-  block_shift=shifts[stage]))
-
-        # If it's a binary property, we're using bitflags.
-        if self.is_binary:
-            c_file.write('''\
-    pos += code;
-    value = (re_{name}_stage_{stage}[pos >> 3] >> (pos & 0x7)) & 0x1;
-'''.format(name=self.name.lower(), stage=table.num_stages))
-        else:
-            c_file.write('''\
-    value = re_{name}_stage_{stage}[pos + code];
-'''.format(name=self.name.lower(), stage=table.num_stages))
-
-    def _build_tables(self, max_stages):
-        'Calculates the block sizes and build the tables.'
-
-        entries = self._expand_entries()
-
-        self.is_binary = len(self._value_list) == 2
-
-        if self.name not in storage:
-            smallest_size = float('inf')
-
-            report('Determining smallest storage size')
-
-            # Try different numbers and sizes of blocks.
-            for block_sizes, bytesize in self._table_sizes(entries, 1,
-              max_stages, self.is_binary):
-                if bytesize < smallest_size:
-                    best_block_sizes = block_sizes
-                    smallest_size = bytesize
-
-            storage[self.name] = best_block_sizes, smallest_size
-        else:
-            best_block_sizes, smallest_size = storage[self.name]
-
-        report('The storage size is {} bytes'.format(smallest_size))
-
-        self._build_multistage_table(entries, best_block_sizes, smallest_size)
-
-    def _table_sizes(self, entries, num_stages, max_stages, binary):
-        '''Yields different numbers and sizes of blocks, up to max_stages.
-
-        All the sizes are powers of 2 and for a binary property the final block
-        size is at least 8 because the final stage of the table will be using
-        bitflags.
-        '''
-
-        # What if this is the top stage?
-        if binary:
-            bytesize = len(entries) // 8
-        else:
-            bytesize = (smallest_datatype(min(entries), max(entries))[1] *
-              len(entries))
-
-        yield [], bytesize
-
-        if num_stages >= max_stages:
-            return
-
-        entries = tuple(entries)
-
-        # Initialise the block size and double it on each iteration. Usually an
-        # index entry is 1 byte, so a data block should be at least 2 bytes.
-        size = 16 if binary else 2
-
-        # There should be at least 2 blocks.
-        while size * 2 <= len(entries) and len(entries) % size == 0:
-            # Group the entries into blocks.
-            indexes = []
-            block_dict = {}
-            for start in range(0, len(entries), size):
-                block = entries[start : start + size]
-                indexes.append(block_dict.setdefault(block, len(block_dict)))
-
-            # Collect all the blocks.
-            blocks = []
-            for block in sorted(block_dict, key=lambda block:
-              block_dict[block]):
-                blocks.extend(block)
-
-            # How much storage will the blocks stage need?
-            if binary:
-                block_bytesize = len(blocks) // 8
-            else:
-                block_bytesize = (smallest_datatype(min(blocks),
-                  max(blocks))[1] * len(blocks))
-
-            # Yield the higher stages for the indexes.
-            for block_sizes, total_bytesize in self._table_sizes(indexes,
-              num_stages + 1, max_stages, False):
-                yield block_sizes + [size], total_bytesize + block_bytesize
-
-            # Next size up.
-            size *= 2
-
-    def _build_multistage_table(self, entries, block_sizes, bytesize):
-        'Builds a multi-stage table.'
-
-        if product(block_sizes) > len(entries):
-            raise UnicodeDataError('product of block sizes greater than number of entries')
-
-        # Build the stages from the bottom one up.
-        stages = []
-
-        for block_size in reversed(block_sizes):
-            entries = tuple(entries)
-
-            # Group the entries into blocks.
-            block_dict = {}
-            indexes = []
-            for start in range(0, len(entries), block_size):
-                block = entries[start : start + block_size]
-                indexes.append(block_dict.setdefault(block, len(block_dict)))
-
-            # Collect all the blocks.
-            blocks = []
-            for block in sorted(block_dict, key=lambda block:
-              block_dict[block]):
-                blocks.extend(block)
-
-            # We have a new stage.
-            stages.append(blocks)
-
-            # Prepare for the next higher stage.
-            entries = indexes
-
-        # We have the top stage.
-        stages.append(entries)
-
-        # Put the stages into the correct order (top-down).
-        stages.reverse()
-
-        self.table = MultistageTable(block_sizes, stages, self.is_binary)
-
-def product(numbers):
-    'Returns the product of a series of numbers.'
-
-    if not product:
-        raise ValueError('product of empty sequence')
-
-    result = 1
-    for n in numbers:
-        result *= n
-
-    return result
-
-def mul_to_shift(number):
-    'Converts a multiplier into a shift.'
-
-    shift = number.bit_length() - 1
-    if shift < 0 or (1 << shift) != number:
-        raise ValueError("can't convert multiplier into shift")
-
-    return shift
-
-class AnyProperty(Property):
-    'The Any property.'
-
-    def __init__(self):
-        Property.__init__(self, 'Any')
-
-    def generate_code(self, h_file, c_file):
-        'Generates the code for a property.'
-
-        report('Generating code for Any')
-
-        # Write the lookup function.
-        prototype = 'RE_UINT32 re_get_any(RE_UINT32 ch)'
-
-        h_file.write('{prototype};\n'.format(prototype=prototype))
-
-        c_file.write('''
-/* Any. */
-
-{prototype} {{
-    return 1;
-}}
-'''.format(prototype=prototype))
-
-class Value:
-    'A Unicode value.'
-
-    def __init__(self, name, aliases=[], mask=0, id=None):
-        self.name = name
-        self.aliases = []
-        self.id = id
-        self.mask = mask
-        self._ranges = []
-        self._modified = False
-
-        # Ignore any duplicate names.
-        seen = {self.munge_name(self.name)}
-
-        for name in aliases:
-            munged_name = self.munge_name(name)
-            if munged_name not in seen:
-                self.aliases.append(name)
-                seen.add(munged_name)
-
-    def add(self, ranges):
-        'Adds a codepoint range.'
-
-        if isinstance(ranges, tuple):
-            self._ranges.append(ranges)
-        else:
-            self._ranges.extend(ranges)
-
-        self._modified = True
-
-    @property
-    def ranges(self):
-        if self._modified:
-            self._ranges = merge_ranges(self._ranges)
-            self._modified = False
-
-        return self._ranges
-
-    def munge_name(self, name):
-        'Munges a name into a standard form.'
-
-        return name.translate(self._munge_trans).upper()
-
-    _munge_trans = str.maketrans('', '', ' -_')
-
-    def __iter__(self):
-        for codepoints in self.ranges:
-            yield codepoints
-
-class NumericValue(Value):
-    'A Unicode numeric value.'
-
-    _munge_trans = str.maketrans('', '', ' _')
-
-class CaseProperty(Property):
-    'A case-folding property.'
-
-    def _expand_entries(self):
-        entries = [0] * NUM_CODEPOINTS
-
-        for id, key in enumerate(self._value_list):
-            for codepoint in self._value_dict[key]:
-                entries[codepoint] = id
-
-        return entries
-
-class AllCases(CaseProperty):
-    'All Unicode cases.'
-
-    def __init__(self, name, other_cases):
-        self.name = name
-
-        # How many other cases can there be?
-        max_other_cases = max(map(len, other_cases))
-        self.max_cases = max_other_cases + 1
-
-        extra = tuple([0] * max_other_cases)
-
-        self._value_list = [extra]
-        self._value_dict = {extra: []}
-
-        for diff, codepoints in sorted(other_cases.items()):
-            if diff:
-                key = (diff + extra)[ : max_other_cases]
-                self._value_list.append(key)
-                self._value_dict[key] = codepoints
-
-        self._value_list.sort(key=lambda diff: sorted(self._value_dict[diff]))
-
-    def generate_code(self, h_file, c_file):
-        'Generates the code for a property.'
-
-        report('Generating code for {}'.format(self.name))
-
-        # Build the tables.
-        self._build_tables(MAX_CASE_STAGES)
-
-        # Write the all-cases tables.
-        c_file.write('''
-/* {name}. */
-'''.format(name=self.name))
-
-        self.generate_tables(c_file)
-
-        # Calculate the size of the struct.
-        entry_size = (self.max_cases - 1) * 4
-
-        # Write the entries, nicely aligned in columns.
-        rows = [[str(e) for e in r] for r in self._value_list]
-        entry_widths = [max(len(e) for e in c) for c in zip(*rows)]
-        rows = [[e.rjust(w) for e, w in zip(r, entry_widths)] for r in rows]
-
-        c_file.write('''
-static RE_AllCases re_all_cases_table[] = {
-''')
-        for r in rows:
-            c_file.write('    {{%s}},\n' % ', '.join(r))
-
-        c_file.write('};\n')
-
-        # Write how much storage will be used by the table.
-        c_file.write('''
-/* {name}: {bytesize} bytes. */
-'''.format(name=self.name, bytesize=entry_size * len(rows)))
-
-        # Write the lookup function.
-        prototype = 'int re_get_{name}(RE_UINT32 ch, RE_UINT32* codepoints)'.format(name=self.name.lower())
-
-        h_file.write('{prototype};\n'.format(prototype=prototype))
-
-        c_file.write('''
-{prototype} {{
-'''.format(name=self.name, prototype=prototype))
-
-        self._generate_locals(c_file)
-
-        c_file.write('''\
-    RE_AllCases* all_cases;
-    int count;
-
-''')
-
-        self._generate_lookup(c_file)
-
-        c_file.write('''
-    all_cases = &re_all_cases_table[value];
-
-    codepoints[0] = ch;
-    count = 1;
-
-    while (count < RE_MAX_CASES && all_cases->diffs[count - 1] != 0) {
-        codepoints[count] = (RE_UINT32)((RE_INT32)ch + all_cases->diffs[count -
-          1]);
-        ++count;
-    }
-
-    return count;
-}
-''')
-
-class SimpleCaseFolding(CaseProperty):
-    'Unicode simple case-folding.'
-
-    def __init__(self, name, folding):
-        self.name = name
-        self._value_dict = dict(folding)
-        self._value_dict.setdefault(0, [])
-        self._value_list = list(self._value_dict)
-
-        self._value_list.sort(key=lambda diff: sorted(self._value_dict[diff]))
-
-    def generate_code(self, h_file, c_file):
-        'Generates the code for a property.'
-
-        report('Generating code for {}'.format(self.name))
-
-        # Build the tables.
-        self._build_tables(MAX_CASE_STAGES)
-
-        # Write the case-folding tables.
-        c_file.write('''
-/* {name}. */
-'''.format(name=self.name))
-
-        self.generate_tables(c_file)
-
-        # Calculate the size of an entry, including alignment.
-        entry_size = 4
-
-        # Write the entries, nicely aligned in columns.
-        rows = [str(r) for r in self._value_list]
-        entry_width = max(len(r) for r in rows)
-        rows = [r.rjust(entry_width) for r in rows]
-
-        c_file.write('''
-static RE_INT32 re_simple_case_folding_table[] = {
-''')
-        for r in rows:
-            c_file.write('    {},\n'.format(r))
-
-        c_file.write('};\n')
-
-        # Write how much storage will be used by the table.
-        c_file.write('''
-/* {name}: {bytesize} bytes. */
-'''.format(name=self.name, bytesize=entry_size * len(rows)))
-
-        # Write the lookup function.
-        prototype = 'RE_UINT32 re_get_{name}(RE_UINT32 ch)'.format(name=self.name.lower())
-
-        h_file.write('{prototype};\n'.format(prototype=prototype))
-
-        c_file.write('''
-{prototype} {{
-'''.format(name=self.name, prototype=prototype))
-
-        self._generate_locals(c_file)
-
-        c_file.write('''\
-    RE_INT32 diff;
-
-''')
-
-        self._generate_lookup(c_file)
-
-        c_file.write('''
-    diff = re_simple_case_folding_table[value];
-
-    return (RE_UINT32)((RE_INT32)ch + diff);
-}
-''')
-
-class FullCaseFolding(CaseProperty):
-    'Unicode full case-folding.'
-
-    def __init__(self, name, folding):
-        self.name = name
-        self.max_folded = max(map(len, folding))
-
-        extra = tuple([0] * self.max_folded)
-
-        self._value_dict = {extra: []}
-
-        for folded in folding:
-            key = (folded + extra)[ : self.max_folded]
-            self._value_dict[key] = folding[folded]
-
-        self._value_list = list(self._value_dict)
-        self._value_list.sort(key=lambda diff: sorted(self._value_dict[diff]))
-
-    def generate_code(self, h_file, c_file):
-        'Generates the code for a property.'
-
-        report('Generating code for {}'.format(self.name))
-
-        # Build the tables.
-        self._build_tables(MAX_CASE_STAGES)
-
-        # Write the case-folding tables.
-        c_file.write('''
-/* {name}. */
-'''.format(name=self.name))
-
-        self.generate_tables(c_file)
-
-        # What data type should we use for the case-folding entries?
-        rows = self._value_list
-
-        # The diff entry needs to be signed 32-bit, the others should be OK
-        # with unsigned 16-bit.
-        data = [e for r in rows for e in r[1 : ]]
-
-        # Verify that unsigned 16-bit is OK.
-        data_type = smallest_datatype(min(data), max(data))[0]
-        if data_type != 'RE_UINT16':
-            raise UnicodeDataError('full case-folding table entry too big')
-
-        # Calculate the size of an entry, including alignment.
-        entry_size = 4 + 2 * (self.max_folded - 1)
-        excess = entry_size % 4
-        if excess > 0:
-            entry_size += 4 - excess
-
-        # Write the entries, nicely aligned in columns.
-        rows = [[str(e) for e in r] for r in rows]
-        entry_widths = [max(len(e) for e in c) for c in zip(*rows)]
-        rows = [[e.rjust(w) for e, w in zip(r, entry_widths)] for r in rows]
-
-        c_file.write('''
-static RE_FullCaseFolding re_full_case_folding_table[] = {
-''')
-        for r in rows:
-            c_file.write('    {%s, {%s}},\n' % (r[0], ', '.join(r[1 : ])))
-
-        c_file.write('};\n')
-
-        # Write how much storage will be used by the table.
-        c_file.write('''
-/* {name}: {bytesize} bytes. */
-'''.format(name=self.name, bytesize=entry_size * len(rows)))
-
-        # Write the lookup function.
-        prototype = 'int re_get_{name}(RE_UINT32 ch, RE_UINT32* codepoints)'.format(name=self.name.lower())
-
-        h_file.write('{prototype};\n'.format(prototype=prototype))
-
-        c_file.write('''
-{prototype} {{
-'''.format(name=self.name, prototype=prototype))
-
-        self._generate_locals(c_file)
-
-        c_file.write('''\
-    RE_FullCaseFolding* case_folding;
-    int count;
-
-''')
-
-        self._generate_lookup(c_file)
-
-        c_file.write('''
-    case_folding = &re_full_case_folding_table[value];
-
-    codepoints[0] = (RE_UINT32)((RE_INT32)ch + case_folding->diff);
-    count = 1;
-
-    while (count < RE_MAX_FOLDED && case_folding->codepoints[count - 1] != 0) {
-        codepoints[count] = case_folding->codepoints[count - 1];
-        ++count;
-    }
-
-    return count;
-}
-''')
-
-def parse_property_files(unicode_folder, unicode_data_files, properties):
-    'Parses the Unicode data files.'
-
-    # Parse the property and value aliases files.
-    parse_property_aliases(join(unicode_folder, 'PropertyAliases.txt'),
-      properties)
-
-    parse_value_aliases(join(unicode_folder, 'PropertyValueAliases.txt'),
-      properties)
-
-    # Parse the other data files.
-    next_property_id = 0
-    it = iter(unicode_data_files.splitlines())
-
-    # Find the 'codepoints' section.
-    for line in it:
-        if line.startswith('[properties]'):
-            break
-
-    # Process the 'properties' section.
-    for line in it:
-        if line.startswith('['):
-            break
-
-        if line and not line.startswith('#'):
-            filename = line.rpartition('/')[2]
-            if filename == 'DerivedNumericValues.txt':
-                # Treat the numeric values file specially.
-                next_property_id = parse_numeric_values_file(unicode_folder,
-                  filename, next_property_id, properties)
-            elif filename == 'emoji-data.txt':
-                next_property_id = parse_emoji_file(unicode_folder, filename,
-                  next_property_id, properties)
-            elif filename == 'LineBreak.txt':
-                next_property_id = parse_linebreak_file(unicode_folder,
-                  filename, next_property_id, properties)
-            elif filename == 'ScriptExtensions.txt':
-                next_property_id = parse_script_extensions_file(unicode_folder,
-                  filename, next_property_id, properties)
-            else:
-                next_property_id = parse_unicode_data_file(unicode_folder,
-                  filename, next_property_id, properties)
-
-    if line.startswith('[normalisation]'):
-        filename = next(it).rpartition('/')[2]
-        next_property_id = parse_unicode_normalisation_file(unicode_folder,
-          filename, next_property_id, properties)
-
-    # Add the additional properties.
-    next_property_id = make_additional_properties(properties, next_property_id)
-
-    # Remove all the properties that have been named but not defined.
-    undefined = [property for property in properties  if property.id is None]
-
-    for property in undefined:
-        del properties[property.name]
-
-    report()
-
-def parse_property_aliases(path, properties):
-    'Parses the file listing the property aliases.'
-
-    with open(path, encoding='utf-8') as file:
-        for line in file:
-            line = line.rstrip()
-            if line and not line.startswith('#'):
-                # It's a data line.
-                #
-                # Ignore anything after the comment, if any.
-                line = line.partition('#')[0]
-
-                fields = [field.strip() for field in line.split(';')]
-
-                # The canonical name of the property is in field 2. The other
-                # fields contain other aliases.
-                properties.add(Property(fields[1], aliases=fields))
-
-def parse_value_aliases(path, properties):
-    'Parses the file listing the value aliases for each property.'
-
-    with open(path, encoding='utf-8') as file:
-        for line in file:
-            line = line.rstrip()
-            if line and not line.startswith('#'):
-                # It's a data line.
-                #
-                # Ignore anything after the comment, if any.
-                line = line.partition('#')[0]
-
-                fields = [field.strip() for field in line.split(';')]
-
-                # The name of the property is in field 1 and the canonical name
-                # of the value is in either field 3 or field 4. The other
-                # fields contain other aliases.
-                value_name = fields[3] if fields[0] == 'ccc' else fields[2]
-                properties[fields[0]].add(Value(value_name, aliases=fields[1 :
-                  ]))
-
-def parse_unicode_data_file(unicode_folder, filename, next_property_id,
-  properties):
-    'Parses a Unicode data file.'
-
-    report('Parsing {}'.format(filename))
-    property = None
-    value = None
-    is_binary = True
-    next_value_id = 0
-
-    with open(join(unicode_folder, filename), encoding='utf-8') as file:
-        for line in file:
-            line = line.rstrip()
-            if line.startswith('#'):
-                # It's a comment line.
-                if line.startswith(('# Property:',
-                  '#  All code points not explicitly listed for')):
-                    # This line is giving the name of the property.
-                    is_binary = False
-                    property = properties[line.split()[-1]]
-                    if property.id is None:
-                        property.id = next_property_id
-                        next_property_id += 1
-
-                    if property.name == 'General_Category':
-                        property.default = property['Unassigned']
-                elif line.startswith('# @missing:'):
-                    # This line is giving the name of the default value.
-                    is_binary = False
-                    value = property[line.split()[-1]]
-                    value.id = 0
-                    next_value_id = 1
-                    property.default = value
-            elif line:
-                # It's a data line.
-                fields = line.partition('#')[0].split(';')
-                codepoints = [int(c, 16) for c in fields[0].split('..')]
-                name = fields[1].strip()
-
-                if is_binary:
-                    # It's a binary property.
-                    property = properties[name]
-                    if property.id is None:
-                        property.id = next_property_id
-                        next_property_id += 1
-
-                    property.default = property['No']
-                    property['No'].id = 0
-                    property['Yes'].id = 1
-
-                    value = property['Yes']
-                else:
-                    # It's a multi-value property.
-                    value = property[name]
-                    if value.id is None:
-                        value.id = next_value_id
-                        next_value_id += 1
-
-                value.add((codepoints[0], codepoints[-1]))
-
-    return next_property_id
-
-def parse_numeric_values_file(unicode_folder, filename, next_property_id,
-  properties):
-    'Parses the Unicode numeric value data file.'
-
-    report('Parsing {}'.format(filename))
-    property = None
-    value = None
-    next_value_id = 0
-
-    with open(join(unicode_folder, filename), encoding='utf-8') as file:
-        for line in file:
-            line = line.rstrip()
-            if line.startswith('#'):
-                # It's a comment line.
-                if line.startswith('# Derived Property:'):
-                    # This line is giving the name of the property.
-                    property = properties[line.split()[-1]]
-                    if property.id is None:
-                        property.id = next_property_id
-                        next_property_id += 1
-
-                    if property.default is None:
-                        name= 'NaN'
-                        value = property.get(name)
-                        if value is None:
-                            value = NumericValue(name, id=0)
-                            next_value_id = 1
-                            property.add(value)
-
-                        property.default = value
-                elif line.startswith('# @missing:'):
-                    # This line is giving the name of the default value.
-                    name = line.split()[-1]
-                    value = property.get(name)
-                    if value is None:
-                        value = NumericValue(name, id=0)
-                        next_value_id = 1
-                        property.add(value)
-
-                    property.default = value
-            elif line:
-                # It's a data line.
-                fields = line.partition('#')[0].split(';')
-                codepoints = [int(c, 16) for c in fields[0].split('..')]
-                name = fields[3].strip()
-
-                value = property.get(name)
-                if value is None:
-                    value = NumericValue(name, id=next_value_id)
-                    next_value_id += 1
-                    property.add(value)
-
-                value.add((codepoints[0], codepoints[-1]))
-
-    return next_property_id
-
-def parse_emoji_file(unicode_folder, filename, next_property_id, properties):
-    'Parses the Unicode emoji data file.'
-
-    report('Parsing {}'.format(filename))
-    property = None
-    value = None
-    next_value_id = 0
-
-    with open(join(unicode_folder, filename), encoding='utf-8') as file:
-        for line in file:
-            line = line.rstrip()
-            if line.startswith('#'):
-                # It's a comment line.
-                if line.startswith('# @missing:'):
-                    # This line is giving the name of the property.
-                    fields = line.split()
-                    property = Property(fields[-3])
-                    properties.add(property)
-                    assert fields[-1] == 'No'
-                    if property.id is None:
-                        property.id = next_property_id
-                        next_property_id += 1
-
-                    if property.default is None:
-                        name = 'No'
-                        value = property.get(name)
-                        if value is None:
-                            value = Value(name, id=0)
-                            next_value_id = 1
-                            property.add(value)
-
-                        property.default = value
-            elif line:
-                # It's a data line.
-                fields = line.partition('#')[0].split(';')
-                codepoints = [int(c, 16) for c in fields[0].split('..')]
-                name = 'Yes'
-                value = property.get(name)
-                if value is None:
-                    value = Value(name, id=next_value_id)
-                    next_value_id += 1
-                    property.add(value)
-
-                value.add((codepoints[0], codepoints[-1]))
-
-    return next_property_id
-
-def parse_linebreak_file(unicode_folder, filename, next_property_id, properties):
-    'Parses the Unicode linebreak data file.'
-
-    report('Parsing {}'.format(filename))
-    property = Property('Line_Break')
-    properties.add(property)
-    if property.id is None:
-        property.id = next_property_id
-        next_property_id += 1
-
-    value = None
-    next_value_id = 0
-
-    with open(join(unicode_folder, filename), encoding='utf-8') as file:
-        for line in file:
-            line = line.rstrip()
-            if line.startswith('#'):
-                # It's a comment line.
-                if line.startswith('# @missing:'):
-                    # This line is giving the name of the default value.
-                    name = line.split(';')[-1].strip()
-                    value = property.get(name)
-                    if value is None:
-                        value = NumericValue(name, id=0)
-                        next_value_id = 1
-                        property.add(value)
-
-                    property.default = value
-            elif line:
-                # It's a data line.
-                fields = line.partition('#')[0].split(';')
-                codepoints = [int(c, 16) for c in fields[0].split('..')]
-                name = fields[1].strip()
-                value = property.get(name)
-                if value is None:
-                    value = Value(name, id=next_value_id)
-                    next_value_id += 1
-                    property.add(value)
-
-                value.add((codepoints[0], codepoints[-1]))
-
-    return next_property_id
-
-def parse_unicode_normalisation_file(unicode_folder, filename,
-  next_property_id, properties):
-    'Parses a Unicode normalisation file.'
-
-    report('Parsing {}'.format(filename))
-    property = None
-    value = None
-    next_value_id = 0
-
-    with open(join(unicode_folder, filename), encoding='utf-8') as file:
-        for line in file:
-            line = line.rstrip()
-            if line.startswith('#'):
-                # It's a comment line.
-                if line.startswith('# Derived Property:'):
-                    property = None
-                elif line.startswith('# Property:'):
-                    # This line is giving the name of the property.
-                    property = properties[line.split()[-1]]
-                    if property.id is None:
-                        property.id = next_property_id
-                        next_property_id += 1
-                elif property and line.startswith('# @missing:'):
-                    # This line is giving the name of the default value.
-                    value = property[line.split()[-1]]
-                    value.id = 0
-                    next_value_id = 1
-                    property.default = value
-            elif property and line:
-                # It's a data line.
-                fields = line.partition('#')[0].split(';')
-                codepoints = [int(c, 16) for c in fields[0].split('..')]
-                name = fields[2].strip()
-
-                # It's a multi-value property.
-                value = property[name]
-                if value.id is None:
-                    value.id = next_value_id
-                    next_value_id += 1
-
-                value.add((codepoints[0], codepoints[-1]))
-
-    return next_property_id
-
-def parse_script_extensions_file(unicode_folder, filename, next_property_id,
-  properties):
-    'Parses the Unicode Script Extensions file.'
-
-    report('Parsing {}'.format(filename))
-
-    scripts = properties['Script']
-
-    property = properties['ScriptExtensions']
-    if property.id is None:
-        property.id = next_property_id
-        property.default = scripts.default
-        next_property_id += 1
-
-    for value in scripts:
-        if value.id is not None:
-            property.add(Value(value.name, aliases=value.aliases, id=value.id))
-
-    next_value_id = max(value.id for value in property) + 1
-
-    with open(join(unicode_folder, filename), encoding='utf-8') as file:
-        for line in file:
-            line = line.rstrip()
-            if line.startswith('#'):
-                pass
-            elif line:
-                # It's a data line.
-                fields = line.partition('#')[0].split(';')
-                codepoints = [int(c, 16) for c in fields[0].split('..')]
-                script_names = fields[1].strip()
-
-                # Ensure that the script names are known.
-                for name in script_names.split():
-                    scripts[name]
-
-                try:
-                    value = property[script_names]
-                except KeyError:
-                    value = Value(script_names, id=next_value_id)
-                    property.add(value)
-                    next_value_id += 1
-
-                value.add((codepoints[0], codepoints[-1]))
-
-    return next_property_id
-
-def make_additional_properties(properties, next_property_id):
-    'Makes the additional properties.'
-
-    general_category = properties['General_Category']
-
-    # Make the 'Alphanumeric' property.
-    alphabetic = properties['Alphabetic']['Yes'].ranges
-    decimal_number = general_category['Decimal_Number'].ranges
-
-    next_property_id = make_binary_property(properties, next_property_id,
-      'Alphanumeric', alphabetic + decimal_number, aliases=['AlNum'])
-
-    # Make the 'Any' property.
-    next_property_id = make_Any_property(properties, next_property_id)
-
-    # General_Category has a compound value called 'Assigned'.
-    mask = 0
-    ranges = []
-
-    for value in general_category:
-        if value.id is not None:
-            mask |= 1 << value.id
-
-        if value.name != 'Unassigned':
-            ranges.extend(value.ranges)
-
-    value = Value('Assigned', mask=mask)
-    value.add(ranges)
-    general_category.add(value)
-
-    # Make the 'Blank' property.
-    assigned = []
-
-    for value in general_category:
-        if value is not general_category.default:
-            assigned.extend(value.ranges)
-
-    space_separator = general_category['Space_Separator'].ranges
-    blank = [(0x09, 0x09)] + space_separator
-
-    next_property_id = make_binary_property(properties, next_property_id,
-      'Blank', blank)
-
-    # Make the 'Graph' property.
-    whitespace = properties['White_Space']['Yes'].ranges
-    control = general_category['Control'].ranges
-    surrogate = general_category['Surrogate'].ranges
-
-    unassigned = range_difference([(0, MAX_CODEPOINT)], assigned)
-
-    graph = range_difference([(0, MAX_CODEPOINT)], whitespace + control +
-      surrogate + unassigned)
-
-    next_property_id = make_binary_property(properties, next_property_id,
-      'Graph', graph)
-
-    # Make the 'Print' property.
-    print_ = range_difference(graph + blank, control)
-
-    next_property_id = make_binary_property(properties, next_property_id,
-      'Print', print_)
-
-    # Make the 'Word' property.
-    enclosing_mark = general_category['Enclosing_Mark'].ranges
-    nonspacing_mark = general_category['Nonspacing_Mark'].ranges
-    spacing_mark = general_category['Spacing_Mark'].ranges
-    connector_punctuation = general_category['Connector_Punctuation'].ranges
-    join_control = properties['Join_Control']['Yes'].ranges
-
-    word = (alphabetic + enclosing_mark + nonspacing_mark + spacing_mark +
-      decimal_number + connector_punctuation + join_control)
-
-    next_property_id = make_binary_property(properties, next_property_id,
-      'Word', word)
-
-    # Make the 'XDigit' property.
-    hex_digit = properties['Hex_Digit']['Yes'].ranges
-
-    xdigit = decimal_number + hex_digit
-
-    next_property_id = make_binary_property(properties, next_property_id,
-      'XDigit', xdigit)
-
-    # Make the 'Posix_Digit' property.
-    posix_digit = [(ord('0'), ord('9'))]
-
-    next_property_id = make_binary_property(properties, next_property_id,
-      'Posix_Digit', posix_digit)
-
-    # Make the 'Posix_AlNum' property.
-    posix_alnum = alphabetic + posix_digit
-
-    next_property_id = make_binary_property(properties, next_property_id,
-      'Posix_AlNum', posix_alnum)
-
-    # Make the 'Posix_Punct' property.
-    punctuation = []
-    for name in 'Pd Ps Pe Pc Po Pi Pf'.split():
-        punctuation.extend(general_category[name].ranges)
-
-    symbol = general_category['Symbol'].ranges
-    for name in 'Sm Sc Sk So '.split():
-        symbol.extend(general_category[name].ranges)
-
-    posix_punct = range_difference(punctuation + symbol, alphabetic)
-
-    next_property_id = make_binary_property(properties, next_property_id,
-      'Posix_Punct', posix_punct)
-
-    # Make the 'Posix_XDigit' property.
-    posix_xdigit = [(ord('0'), ord('9')), (ord('A'), ord('F')), (ord('a'),
-     ord('f'))]
-
-    next_property_id = make_binary_property(properties, next_property_id,
-      'Posix_XDigit', posix_xdigit)
-
-    # The 'General_Category' property has a ompound value called 'Cased_Letter'.
-    lc_value = general_category['Cased_Letter']
-    ranges = []
-
-    for name in 'Lu Ll Lt'.split():
-        lc_value.mask |= 1 << general_category[name].id
-        ranges.extend(general_category[name].ranges)
-
-    lc_value.add(ranges)
-
-    # The 'General_Category' property has some compound values called 'Letter',
-    # 'Number', etc.
-    compound = []
-    ids = []
-
-    for value in general_category:
-        for alias in list(value.aliases):
-            if len(alias) == 1:
-                # Add the additional alias for the compound value.
-                value.aliases.append(alias + '&')
-                compound.append(alias)
-            elif len(alias) == 2 and alias.istitle():
-                # Build the mask for the compound value.
-                c_value = general_category[alias[0]]
-                c_value.mask |= 1 << value.id
-                c_value.add(value.ranges)
-                ids.append(value.id)
-
-    last_value_id = max(ids)
-
-    for id, name in enumerate(sorted(compound), start=last_value_id + 1):
-        general_category[name].id = id
-
-    last_value_id += len(compound)
-
-    for value in general_category:
-        if value.id is None:
-            last_value_id += 1
-            value.id = last_value_id
-
-    for property in properties:
-        used = []
-        not_defined = []
-        has_codepoints = False
-
-        for value in property:
-            if value.id is None:
-                not_defined.append(value)
-            else:
-                used.append(value.id)
-
-            if value.ranges:
-                has_codepoints = True
-
-        if used:
-            for id, value in enumerate(not_defined, start=max(used) + 1):
-                value.id = id
-        elif has_codepoints:
-            for id, value in enumerate(not_defined):
-                value.id = id
-
-    return next_property_id
-
-def make_binary_property(properties, next_property_id, name, ranges,
-  aliases=[]):
-    'Makes a binary property.'
-
-    yes_aliases = properties['Alphabetic']['Yes'].aliases
-    no_aliases = properties['Alphabetic']['No'].aliases
-
-    property = Property(name, aliases=aliases)
-    property.id = next_property_id
-
-    value = Value('No', aliases=no_aliases)
-    property.add(value)
-
-    property.default = value
-
-    value = Value('Yes', aliases=yes_aliases)
-    value.add(merge_ranges(ranges))
-    property.add(value)
-
-    properties.add(property)
-
-    return next_property_id + 1
-
-def make_Any_property(properties, next_property_id):
-    'Makes the Any property.'
-
-    yes_aliases = properties['Alphabetic']['Yes'].aliases
-    no_aliases = properties['Alphabetic']['No'].aliases
-
-    property = AnyProperty()
-    property.id = next_property_id
-
-    value = Value('No', aliases=no_aliases)
-    property.add(value)
-
-    property.default = value
-
-    value = Value('Yes', aliases=yes_aliases)
-    value.add((0x0000, MAX_CODEPOINT))
-    property.add(value)
-
-    properties.add(property)
-
-    return next_property_id + 1
-
-def parse_case_folding_file(path):
-    'Parses the Unicode CaseFolding file.'
-
-    simple_folding = defaultdict(list)
-    full_folding = defaultdict(list)
-    equivalent = defaultdict(set)
-    turkic_set = set()
-    empty_set = set()
-
-    with open(path, encoding='utf-8') as file:
-        for line in file:
-            line = line.rstrip()
-            if line and not line.startswith('#'):
-                # It's a data line.
-                fields = line.partition('#')[0].split(';')
-                codepoint = int(fields[0], 16)
-                fold_type = fields[1].strip()
-                folded = [int(f, 16) for f in fields[2].split()]
-
-                if fold_type in 'CFS':
-                    # We want to determine which codepoints are equivalent to
-                    # each other under case-folding.
-
-                    # These are equivalent to each other.
-                    equiv_set = {(codepoint, ), tuple(folded)}
-
-                    # First collect the existing equivalences.
-                    for x in list(equiv_set):
-                        equiv_set.update(equivalent.get(x, empty_set))
-
-                    # Then make them all refer to the same equivalence set.
-                    for x in equiv_set:
-                        equivalent[x] = equiv_set
-
-                # The first entry is the delta.
-                entries = tuple([folded[0] - codepoint] + folded[1 : ])
-
-                if fold_type in 'CS':
-                    # Common and simple case-folding.
-                    simple_folding[entries[0]].append(codepoint)
-
-                if fold_type in 'CF':
-                    # Common and fall case-folding.
-                    full_folding[entries].append(codepoint)
-
-                if fold_type == 'T':
-                    # Turkic case-folding.
-                    turkic_set.add((codepoint, tuple(folded)))
-
-    # Is the Turkic set what we expected?
-    if turkic_set != {(0x49, (0x131, )), (0x130, (0x69, ))}:
-        raise UnicodeDataError('Turkic set has changed')
-
-    # Which codepoints expand on full case-folding?
-    expand_set = set()
-
-    for expanded in full_folding:
-        if len(expanded) > 1:
-            expand_set.update(full_folding[expanded])
-
-    # Add the Turkic set to the equivalences. Note that:
-    #
-    #    dotted_capital == dotted_small
-    #
-    # and:
-    #
-    #    dotted_small == dotless_capital
-    #
-    # but:
-    #
-    #    dotted_capital != dotless_capital
-    #
-    for codepoint, folded in turkic_set:
-        char1, char2 = (codepoint, ), folded
-        equivalent[char1] = equivalent[char1] | {char2}
-        equivalent[char2] = equivalent[char2] | {char1}
-
-    # Collect and sort the equivalences. We want to know all of the possible
-    # case-forms for each codepoint.
-    other_cases = defaultdict(list)
-
-    for codepoint, equiv_set in equivalent.items():
-        if len(codepoint) == 1:
-            diff_list = []
-
-            for e in equiv_set - {codepoint}:
-                if len(e) == 1:
-                    diff_list.append(e[0] - codepoint[0])
-
-            other_cases[tuple(sorted(diff_list))].append(codepoint[0])
-
-    # Save the all-cases property.
-    all_prop = AllCases('All_Cases', other_cases)
-
-    # Save the simple case-folding property.
-    simple_folding_prop = SimpleCaseFolding('Simple_Case_Folding',
-      simple_folding)
-
-    # Save the full case-folding property.
-    full_folding_prop = FullCaseFolding('Full_Case_Folding', full_folding)
-
-    return all_prop, simple_folding_prop, full_folding_prop, expand_set
-
-def tabulate(rows):
-    'Creates a table with right-justified columns.'
-
-    # Convert all the entries to strings.
-    rows = [[str(e) for e in row] for row in rows]
-
-    # Determine the widths of the columns.
-    widths = [max(len(e) for e in column) for column in zip(*rows)]
-
-    # Pad all the entries.
-    rows = [[e.rjust(w) for e, w in zip(row, widths)] for row in rows]
-
-    return rows
-
-def write_properties_description(properties, properties_path):
-    'Writes the Unicode properties description file.'
-
-    with open(properties_path, 'w', encoding='utf-8', newline='\n') as file:
-        file.write('The following is a list of the {} properties which are supported by this module:\n'.format(len(properties)))
-
-        for property in sorted(properties, key=lambda property: property.name.upper()):
-            file.write('\n')
-
-            name = property.name
-            aliases = sorted(property.aliases, key=str.upper)
-            if aliases:
-                file.write('{} [{}]\n'.format(name, ', '.join(aliases)))
-            else:
-                file.write('{}\n'.format(name))
-
-            for value in sorted(property, key=lambda value: value.name.upper()):
-                name = value.name
-                aliases = sorted(value.aliases, key=str.upper)
-                if aliases:
-                    file.write('    {} [{}]\n'.format(name,
-                      ', '.join(aliases)))
-                else:
-                    file.write('    {}\n'.format(name))
-
-def store_properties(unicode_version, properties, path):
-    'Stores the Unicode properties in a file.'
-
-    with open(path, 'w', encoding='ascii') as file:
-        file.write('Version {}\n'.format(unicode_version))
-        for property in sorted(properties, key=lambda p: p.name.upper()):
-            aliases = [property.name] + sorted(property.aliases, key=str.upper)
-            file.write('Property {}\n'.format(', '.join('"{}"'.format(name) for
-              name in aliases)))
-
-            value = property.default
-            if value is None:
-                raise UnicodeDataError('property {!a} has no default value'.format(property.name))
-
-            aliases = [value.name] + sorted(value.aliases, key=str.upper)
-            file.write('DefaultValue {}\n'.format(', '.join('"{}"'.format(name)
-              for name in aliases)))
-
-            for value in sorted(property, key=lambda v: v.name.upper()):
-                if value is not property.default:
-                    aliases = [value.name] + sorted(value.aliases, key=str.upper)
-                    file.write('Value {}'.format(', '.join('"{}"'.format(name)
-                      for name in aliases)))
-
-                    if value.mask:
-                        file.write(' : 0x{:08X}\n'.format(value.mask))
-                    else:
-                        file.write('\n')
-
-                    for lower, upper in value.ranges:
-                        if lower == upper:
-                            file.write('{:04X}\n'.format(lower))
-                        else:
-                            file.write('{:04X}..{:04X}\n'.format(lower, upper))
-
-def check_unicode_version(unicode_data_files):
-    'Checks the Unicode version in the data files.'
-
-    versions = defaultdict(set)
-
-    # Read the version and filename from the first line of each data file.
-    for line in unicode_data_files.splitlines():
-        if line and line[0] != '#' and line[0] != '[':
-            name = line.rpartition('/')[-1]
-            path = join(unicode_folder, name)
-
-            with open(path, encoding='utf-8') as file:
-                line = file.readline()
-
-                if line == '# emoji-data.txt\n':
-                    for line in file:
-                        if line.startswith('# Version:'):
-                            ver = line.split()[-1]
-                            ver += '.0' * (2 - ver.count('.'))
-                            versions[ver].add(name)
-                            break
-                elif line.endswith('.txt\n'):
-                    ver = line[ : -5].rpartition('-')[2]
-                    versions[ver].add(name)
-
-    if len(versions) != 1:
-        if set(versions) == {'12.0.0', '12.1.0'} and versions['12.0.0'] == {'emoji-data.txt'}:
-            # Cannot find emoji-data.txt for version 12.1.0.
-            pass
-        else:
-            for ver, names in versions.items():
-                print(ver, '=>', [name.strip('# \n') for name in names])
-
-            raise ValueError('expected 1 version of Unicode, but found {}'.format(len(versions)))
-
-    def make_key(ver):
-        return tuple(map(int, ver.split('.')))
-
-    return max(versions, key=make_key)
-
-def download_files(unicode_version, unicode_data_files):
-    'Downloads the Unicode data files from the website.'
-
-    for line in unicode_data_files.splitlines():
-        if line and line[0] != '#' and line[0] != '[':
-            base, ext = splitext(line.rpartition('/')[-1])
-            versioned_path = join(unicode_folder, '{}-{}{}'.format(base, unicode_version, ext))
-
-            if not isfile(versioned_path):
-                url = urljoin(unicode_data_base, line)
-                path = join(unicode_folder, line.rpartition('/')[-1])
-
-                try:
-                    download_unicode_file(url, path)
-                except HTTPError:
-                    print('{} not found'.format(url))
-
-def merge_ranges(ranges):
-    'Sorts and merges a list of codepoint ranges.'
-
-    ranges = sorted(ranges)
-    new_ranges = ranges[ : 1]
-
-    for lower, upper in ranges:
-        if lower <= new_ranges[-1][1] + 1:
-            new_ranges[-1] = (new_ranges[-1][0], max(upper, new_ranges[-1][1]))
-        else:
-            new_ranges.append((lower, upper))
-
-    return new_ranges
-
-def range_difference(include_ranges, exclude_ranges):
-    'Returns the difference between a list of inclusive ranges and a list of exclusive ranges.'
-
-    new_ranges = []
-
-    include = IterRanges(merge_ranges(include_ranges))
-    exclude = IterRanges(merge_ranges(exclude_ranges))
-
-    lower = include.lower
-
-    while lower <= MAX_CODEPOINT:
-        if lower < include.lower:
-            # We're below the current include range.
-            # Advance into the range.
-            lower = include.lower
-        elif lower > include.upper:
-            # We're above the current include range.
-            # Advance into the next include range.
-            include.next()
-            lower = max(lower, include.lower)
-        elif lower < exclude.lower:
-            # We're below the current exclude range.
-            # Accept codepoints as far as the end of the include range.
-            upper = min(include.upper, exclude.lower - 1)
-            new_ranges.append((lower, upper))
-            lower = upper + 1
-        elif lower > exclude.upper:
-            # We're above the current exclude range.
-            exclude.next()
-        else:
-            # We're within both the include and exclude ranges.
-            # Advance out of the overlap.
-            upper = min(include.upper, exclude.upper)
-            lower = upper + 1
-
-    return new_ranges
-
-class IterRanges:
-    'Class for iterating over a list of codepoint ranges.'
-
-    def __init__(self, ranges):
-        self._ranges = ranges
-        self._index = 0
-
-        if self._index < len(self._ranges):
-            self.lower, self.upper = self._ranges[self._index]
-        else:
-            self.lower, self.upper = MAX_CODEPOINT + 1, MAX_CODEPOINT + 1
-
-    def next(self):
-        if self._index < len(self._ranges):
-            self._index += 1
-
-        if self._index < len(self._ranges):
-            self.lower, self.upper = self._ranges[self._index]
-        else:
-            self.lower, self.upper = MAX_CODEPOINT + 1, MAX_CODEPOINT + 1
-
-def generate_code():
-    'Generates the code.'
-
-    h_path = join(code_folder, '_regex_unicode.h')
-    c_path = join(code_folder, '_regex_unicode.c')
-
-    # Create the list of standardised strings.
-    strings = []
-
-    for property in properties:
-        strings.append(property.name)
-        strings.extend(property.aliases)
-
-        if property.name != 'Script_Extensions':
-            for value in property:
-                strings.append(value.name)
-                strings.extend(value.aliases)
-
-    def reduce_name(name):
-        return name.replace('_', '').upper()
-
-    def by_id(obj):
-        return obj.id
-
-    strings = sorted(set(map(reduce_name, strings)))
-
-    # The maximum number of scripts/codepoint in the Script_Extensions property.
-    max_scx = max(len(val.name.split()) for val in
-      properties['Script_Extensions'])
-
-    with open(h_path , 'w', encoding='ascii', newline='\n') as h_file, \
-      open(c_path, 'w', encoding='ascii', newline='\n') as c_file:
-        # Useful definitions.
-        h_file.write('''\
-typedef unsigned char RE_UINT8;
-typedef signed char RE_INT8;
-typedef unsigned short RE_UINT16;
-typedef signed short RE_INT16;
-typedef unsigned int RE_UINT32;
-typedef signed int RE_INT32;
-
-typedef unsigned char BOOL;
-#if !defined(FALSE) || !defined(TRUE)
-#define FALSE 0
-#define TRUE 1
-#endif
-
-#define RE_ASCII_MAX 0x7F
-#define RE_LOCALE_MAX 0xFF
-#define RE_UNICODE_MAX 0x10FFFF
-
-#define RE_MAX_CASES {max_cases}
-#define RE_MAX_FOLDED {max_folded}
-#define RE_MAX_SCX {max_scx}
-
-typedef struct RE_Property {{
-    RE_UINT16 name;
-    RE_UINT8 id;
-    RE_UINT8 value_set;
-}} RE_Property;
-
-typedef struct RE_PropertyValue {{
-    RE_UINT16 name;
-    RE_UINT8 value_set;
-    RE_UINT16 id;
-}} RE_PropertyValue;
-
-typedef RE_UINT32 (*RE_GetPropertyFunc)(RE_UINT32 ch);
-
-'''.format(max_cases=all_cases.max_cases,
-  max_folded=full_case_folding.max_folded, max_scx=max_scx))
-
-        RE_Property_size = 4
-        RE_PropertyValue_size = 4
-
-        for name in ('GC', 'Cased', 'Uppercase', 'Lowercase', 'SCX'):
-            h_file.write('#define RE_PROP_{} 0x{:X}\n'.format(name.upper(),
-              properties[name].id))
-
-        h_file.write('\n')
-
-        values = []
-        compound = []
-
-        for value in properties['GC']:
-            if value.mask:
-                for alias in value.aliases:
-                    if len(alias) == 1:
-                        compound.append((alias, value))
-                        break
-                else:
-                    compound.append((reduce_name(value.name.upper()), value))
-            else:
-                for alias in value.aliases:
-                    if len(alias) == 2 and alias.isalpha():
-                        values.append((alias, value))
-
-        values.sort(key=lambda pair: pair[1].id)
-        compound.sort(key=lambda pair: (len(pair[0]) > 1, pair[0]))
-
-        for alias, value in compound:
-            h_file.write('#define RE_PROP_{} {}\n'.format(alias, value.id))
-
-        h_file.write('\n')
-
-        for alias, value in values:
-            h_file.write('#define RE_PROP_{} {}\n'.format(alias.upper(),
-              value.id))
-
-        h_file.write('\n')
-
-        for alias, value in compound:
-            if len(alias) == 1:
-                h_file.write('#define RE_PROP_{}_MASK 0x{:08X}\n'.format(alias,
-                  value.mask))
-
-        h_file.write('\n')
-
-        # Common abbreviated properties.
-        common_properties = 'AlNum Alpha Any ASCII Blank Cntrl Digit Graph Lower Print Space Upper Word XDigit Posix_AlNum Posix_Digit Posix_Punct Posix_XDigit'
-
-        for name in common_properties.split():
-            property = properties.get(name)
-            if property is not None:
-                h_file.write('#define RE_PROP_{} 0x{:06X}\n'.format(name.upper(),
-                  property.id << 16 | 1))
-            else:
-                for prop_name in 'GC Script Block'.split():
-                    property = properties[prop_name]
-                    value = property.get(name)
-                    if value is not None:
-                        h_file.write('#define RE_PROP_{} 0x{:06X}\n'.format(name.upper(),
-                          property.id << 16 | value.id))
-                        break
-                else:
-                    raise UnicodeDataError('unknown abbreviated property: {!a}'.format(name))
-
-        h_file.write('\n')
-
-        for value in sorted(properties['Word_Break'], key=by_id):
-            h_file.write('#define RE_WBREAK_{} {}\n'.format(reduce_name(value.name),
-              value.id))
-
-        h_file.write('\n')
-
-        for value in sorted(properties['Grapheme_Cluster_Break'], key=by_id):
-            h_file.write('#define RE_GBREAK_{} {}\n'.format(reduce_name(value.name),
-              value.id))
-
-        h_file.write('\n')
-
-        for value in sorted(properties['Line_Break'], key=by_id):
-            h_file.write('#define RE_LBREAK_{} {}\n'.format(reduce_name(value.name),
-              value.id))
-
-        c_file.write('''/* For Unicode version {version} */
-
-#include "_regex_unicode.h"
-'''.format(version=unicode_version))
-
-        # Write the standardised strings.
-        c_file.write('''
-#define RE_BLANK_MASK ((1 << RE_PROP_ZL) | (1 << RE_PROP_ZP))
-#define RE_GRAPH_MASK ((1 << RE_PROP_CC) | (1 << RE_PROP_CS) | (1 << RE_PROP_CN))
-#define RE_WORD_MASK (RE_PROP_M_MASK | (1 << RE_PROP_ND) | (1 << RE_PROP_PC))
-
-typedef struct RE_ScriptExt {
-    RE_UINT8 scripts[RE_MAX_SCX];
-} RE_ScriptExt;
-
-typedef struct RE_AllCases {
-    RE_INT32 diffs[RE_MAX_CASES - 1];
-} RE_AllCases;
-
-typedef struct RE_FullCaseFolding {
-    RE_INT32 diff;
-    RE_UINT16 codepoints[RE_MAX_FOLDED - 1];
-} RE_FullCaseFolding;
-
-/* strings. */
-
-char* re_strings[] = {
-''')
-
-        bytesize = 0
-
-        for string in strings:
-            s = reduce_name(string)
-            c_file.write('    "{}",\n'.format(s))
-            bytesize += len(s) + 1
-
-        h_file.write('\nextern char* re_strings[{}];\n'.format(len(strings)))
-
-        c_file.write('''}};
-
-/* strings: {bytesize} bytes. */
-'''.format(bytesize=bytesize))
-
-        # Write the property name tables.
-        #
-        # Properties which are aliases have the same property id, and
-        # properties, such as binary properties, which have the same set of
-        # values have the same value set id.
-
-        # The rows of the property and value tables.
-        property_rows = []
-        value_rows = []
-
-        # The value sets.
-        value_sets = {}
-
-        # Give an id to each distinct property or value name.
-        strings = {string: id for id, string in enumerate(strings)}
-
-        for property in sorted(properties, key=by_id):
-            prop = property
-
-            if prop.name == 'Script_Extensions':
-                # The Script Extensions property name the same values as the
-                # Script property.
-                prop = properties['Script']
-
-            value_set = tuple((value.name, tuple(value.aliases)) for value in
-              prop)
-            new_value_set = value_set not in value_sets
-            value_set_id = value_sets.setdefault(value_set, len(value_sets))
-
-            # name of property, id of property, id of value set
-            property_rows.append((strings[reduce_name(property.name)],
-              property.id, value_set_id))
-            for alias in property.aliases:
-                property_rows.append((strings[reduce_name(alias)], property.id,
-                  value_set_id))
-
-            # We don't want to duplicate value sets.
-            if new_value_set:
-                for value in sorted(prop, key=by_id):
-                    # name of value, id of value set, value
-                    value_rows.append((strings[reduce_name(value.name)],
-                      value_set_id, value.id))
-                    for alias in value.aliases:
-                        value_rows.append((strings[reduce_name(alias)],
-                          value_set_id, value.id))
-
-        # Columns of RE_Property are:
-        #     RE_UINT16 name
-        #     RE_UINT8 id
-        #     RE_UINT8 value_set
-        fields = [('name', 16), ('id', 8), ('value_set', 8)]
-        max_values = [max(column) for column in zip(*property_rows)]
-
-        for (name, width), max_value in zip(fields, max_values):
-            if max_value >> width:
-                raise ValueError("'{}' field of RE_Property struct is too small".format(name))
-
-        # Columns of RE_PropertyValue are:
-        #     RE_UINT16 name
-        #     RE_UINT8 value_set
-        #     RE_UINT16 id
-        fields = [('name', 16), ('value_set', 8), ('id', 16)]
-        max_values = [max(column) for column in zip(*value_rows)]
-
-        for (name, width), max_value in zip(fields, max_values):
-            if max_value >> width:
-                raise ValueError("'{}' field of RE_PropertyValue struct is too small".format(name))
-
-        # Fix the column widths of the tables.
-        property_rows = tabulate(property_rows)
-        value_rows = tabulate(value_rows)
-
-        expand_data_type, expand_data_size = smallest_datatype(min(expand_set),
-          max(expand_set))
-
-        c_file.write('''
-/* properties. */
-
-RE_Property re_properties[] = {
-''')
-
-        h_file.write('''\
-extern RE_Property re_properties[{prop_rows}];
-extern RE_PropertyValue re_property_values[{val_rows}];
-extern {data_type} re_expand_on_folding[{expand_rows}];
-extern RE_GetPropertyFunc re_get_property[{func_count}];
-
-'''.format(prop_rows=len(property_rows), val_rows=len(value_rows),
-  data_type=expand_data_type, expand_rows=len(expand_set),
-  func_count=len(properties)))
-
-        for row in property_rows:
-            c_file.write('    {{{}}},\n'.format(', '.join(row)))
-
-        c_file.write('''\
-}};
-
-/* properties: {bytesize} bytes. */
-
-/* property values. */
-
-RE_PropertyValue re_property_values[] = {{
-'''.format(bytesize=RE_Property_size * len(property_rows)))
-
-        for row in value_rows:
-            c_file.write('    {{{}}},\n'.format(', '.join(row)))
-
-        c_file.write('''\
-}};
-
-/* property values: {bytesize} bytes. */
-
-/* Codepoints which expand on full case-folding. */
-
-{data_type} re_expand_on_folding[] = {{
-'''.format(bytesize=RE_PropertyValue_size * len(value_rows),
-  data_type=expand_data_type))
-
-        items = ['{},'.format(c) for c in sorted(expand_set)]
-        width = max(len(i) for i in items)
-        items = [i.rjust(width) for i in items]
-
-        columns = 8
-        for start in range(0, len(items), columns):
-            c_file.write('    {}\n'.format(' '.join(items[start : start +
-              columns])))
-
-        c_file.write('''}};
-
-/* expand_on_folding: {bytesize} bytes. */
-'''.format(bytesize=len(items) * expand_data_size))
-
-        # Build and write the property data tables.
-        for index, property in enumerate(sorted(properties, key=by_id)):
-            report('{} of {}: {}'.format(index + 1, len(properties),
-              property.name))
-            property.generate_code(h_file, c_file)
-            report()
-
-        all_cases.generate_code(h_file, c_file)
-        report()
-        simple_case_folding.generate_code(h_file, c_file)
-        report()
-        full_case_folding.generate_code(h_file, c_file)
-        report()
-
-        # Write the property function array.
-        c_file.write('''
-/* Property function table. */
-
-RE_GetPropertyFunc re_get_property[] = {
-''')
-
-        for property in sorted(properties, key=by_id):
-            report('{} is {}'.format(property.name, property.id))
-
-            if property.name == 'Script_Extensions':
-                c_file.write('    0,\n')
-                continue
-
-            c_file.write('    re_get_{},\n'.format(property.name.lower()))
-
-        c_file.write('};\n')
-
-def smallest_datatype(min_value, max_value):
-    'Determines the smallest C data type which can store values in a range.'
-
-    # 1 byte, unsigned and signed.
-    if 0 <= min_value <= max_value <= 0xFF:
-        return 'RE_UINT8', 1
-    if -0x80 <= min_value <= max_value <= 0x7F:
-        return 'RE_INT8', 1
-
-    # 2 bytes, unsigned and signed.
-    if 0 <= min_value <= max_value <= 0xFFFF:
-        return 'RE_UINT16', 2
-    if -0x8000 <= min_value <= max_value <= 0x7FFF:
-        return 'RE_INT16', 2
-
-    # 4 bytes, unsigned and signed.
-    if 0 <= min_value <= max_value <= 0xFFFFFFFF:
-        return 'RE_UINT32', 4
-    if -0x80000000 <= min_value <= max_value <= 0x7FFFFFFF:
-        return 'RE_INT32', 4
-
-    raise ValueError('value range too big for 32 bits')
-
-# Whether to update the Unicode data files from the Unicode website.
-UPDATE = False
-#UPDATE = True
-UNICODE_VERSION = '12.1.0'
-
-# Whether to recalculate the best block sizes for the tables.
-RECALC = False
-
-# The URL from which the Unicode data files can be obtained.
-unicode_data_base = 'http://www.unicode.org/Public/UNIDATA/'
-
-# The local folder in which the Unicode data files are stored.
-unicode_folder = r'D:\projects\Unicode\Data'
-
-# The local folder in which the generated C files should be written.
-code_folder = join(dirname(__file__), 'regex')
-
-# The path of the file in which the block sizes are stored.
-json_path = splitext(__file__)[0] + '.json'
-
-COLUMNS = 16
-MAX_CODEPOINT = 0x10FFFF
-NUM_CODEPOINTS = 0x110000
-MAX_STAGES = 4
-MAX_CASE_STAGES = 4 # Fewer stages for case info because it's used frequently.
-
-# The Unicode data files. The file names are given relative to the website URL.
-unicode_data_files = '''\
-[properties]
-extracted/DerivedGeneralCategory.txt
-Blocks.txt
-Scripts.txt
-ScriptExtensions.txt
-auxiliary/WordBreakProperty.txt
-auxiliary/GraphemeBreakProperty.txt
-auxiliary/SentenceBreakProperty.txt
-DerivedCoreProperties.txt
-PropList.txt
-HangulSyllableType.txt
-extracted/DerivedBidiClass.txt
-extracted/DerivedCombiningClass.txt
-extracted/DerivedDecompositionType.txt
-extracted/DerivedEastAsianWidth.txt
-extracted/DerivedJoiningGroup.txt
-extracted/DerivedJoiningType.txt
-extracted/DerivedLineBreak.txt
-extracted/DerivedNumericType.txt
-extracted/DerivedNumericValues.txt
-extracted/DerivedBinaryProperties.txt
-IndicPositionalCategory.txt
-IndicSyllabicCategory.txt
-emoji-data.txt
-#LineBreak.txt
-[normalisation]
-DerivedNormalizationProps.txt
-[others]
-PropertyAliases.txt
-PropertyValueAliases.txt
-PropList.txt
-CaseFolding.txt
-#UnicodeData.txt
-'''
-
-# Ensure that we have downloaded the Unicode data files for UNICODE_VERSION
-# from the Unicode website.
-#
-# Returns True if any we get any new ones.
-if UPDATE:
-    download_files(UNICODE_VERSION, unicode_data_files)
-
-# Which version of Unicode is it?
-unicode_version = check_unicode_version(unicode_data_files)
-
-# The set of properties.
-properties = PropertySet()
-
-# Parse the Unicode data files.
-parse_property_files(unicode_folder, unicode_data_files, properties)
-
-storage_path = join(dirname(__file__), 'codepoint_properties.txt')
-
-store_properties(unicode_version, properties, storage_path)
-base, ext = splitext(storage_path)
-copy2(storage_path, '{}-{}{}'.format(base, unicode_version, ext))
-
-# Parse the case-folding data specially.
-path = join(unicode_folder, 'CaseFolding.txt')
-all_cases, simple_case_folding, full_case_folding, expand_set = parse_case_folding_file(path)
-
-properties_path = join(dirname(__file__), 'UnicodeProperties.txt')
-write_properties_description(properties, properties_path)
-
-# Load the sizes of the table blocks.
-try:
-    with open(json_path, encoding='utf-8') as json_file:
-        storage = load(json_file)
-except (FileNotFoundError, ValueError):
-    storage = {}
-
-# If it's a different version of Unicode, forget the saved block sizes.
-if RECALC or storage.get('version') != unicode_version:
-    storage.clear()
-
-# Generate the _regex_unicode.h and _regex_unicode.c files.
-generate_code()
-
-# Store the sizes of the table blocks.
-storage['version'] = unicode_version
-
-with open(json_path, 'w', encoding='utf-8') as json_file:
-    dump(storage, json_file)
-
-report('\nThere are {} properties'.format(len(properties)))
-
-# Collect and summarise a few statistics.
-import re
-c_path = join(code_folder, '_regex_unicode.c')
-code = open(c_path).read()
-sizes = defaultdict(int)
-for n, s in re.findall(r'(\w+(?: \w+)*): (\d+) bytes', code):
-    sizes[n] += int(s)
-sizes = sorted(sizes.items(), key=lambda pair: pair[1], reverse=True)
-total_size = sum(s for n, s in sizes)
-report('\nTotal: {} bytes\n'.format(total_size))
-prop_width = max(len(row[0]) for row in sizes)
-prop_width = max(prop_width, 8)
-storage_width = max(len(str(row[1])) for row in sizes)
-storage_width = max(storage_width, 7)
-report('{:{}}  {:{}}  {}'.format('Property', prop_width, 'Storage',
-  storage_width, 'Percentage'))
-report('{:{}}  {:{}}  {}'.format('--------', prop_width, '-------',
-  storage_width, '----------'))
-format = '{{:<{}}}  {{:>{}}}    {{:>5.1%}}'.format(prop_width, storage_width)
-for n, s in sizes:
-    report(format.format(n, s, s / total_size))
-
-report('\nFinished!')
+#! python3.8
+# -*- coding: utf-8 -*-
+#
+# This Python script parses the Unicode data files and generates the C files
+# for the regex module.
+#
+# Written by MRAB.
+#
+from contextlib import suppress
+from itertools import chain
+from os import listdir, mkdir
+from os.path import basename, dirname, exists, join, normpath
+from urllib.parse import urljoin
+from urllib.request import urlretrieve
+from time import time
+
+import codecs
+import sys
+sys.stdout = codecs.getwriter('utf-8')(sys.stdout.detach())
+
+class Timed:
+    def __init__(self, message=None):
+        self._message = message
+
+    def __enter__(self):
+        self._start = time()
+
+    def __exit__(self, exc_type, exc_val, exc_tb):
+        finish = time()
+        elapsed = finish - self._start
+
+        if self._message is None:
+            print(f'Took {elapsed:0.2f} secs')
+        else:
+            print(f'{self._message} took {elapsed:0.2f} secs')
+
+        return False
+
+def unique(iterable, key=None):
+
+    if key is None:
+        def key(item):
+            return item
+
+    seen = set()
+
+    for item in iterable:
+        k = key(item)
+
+        if k not in seen:
+            seen.add(k)
+            yield item
+
+class IterRanges:
+    def __init__(self, ranges):
+        self._ranges = ranges
+        self._pos = 0
+        self._update()
+
+    def next(self):
+        if self._pos >= len(self._ranges):
+            return
+
+        self._pos += 1
+        self._update()
+
+    def _update(self):
+        if self._pos < len(self._ranges):
+            self.lower, self.upper = self._ranges[self._pos]
+        else:
+            self.lower = self.upper = NUM_CODEPOINTS
+
+class Ranges:
+    def __init__(self, initial=None):
+        self._ranges = []
+
+        if initial is not None:
+            self._ranges.extend(initial)
+
+        self._is_normalised = initial is None
+
+    def add(self, lower, upper=None):
+        if upper is None:
+            self._ranges.append((lower, lower))
+        else:
+            self._ranges.append((lower, upper))
+
+        self._is_normalised = False
+
+    def __or__(self, other):
+        return Ranges(self._ranges + other._ranges)
+
+    def __sub__(self, other):
+        self._normalise()
+        other._normalise()
+
+        include = IterRanges(self._ranges)
+        exclude = IterRanges(other._ranges)
+        new_ranges = []
+
+        lower = include.lower
+
+        while lower < NUM_CODEPOINTS:
+            if lower < include.lower:
+                # We're below the current include range.
+                # Advance into the range.
+                lower = include.lower
+            elif lower > include.upper:
+                # We're above the current include range.
+                # Advance into the next include range.
+                include.next()
+                lower = max(lower, include.lower)
+            elif lower < exclude.lower:
+                # We're below the current exclude range.
+                # Accept codepoints as far as the end of the include range.
+                upper = min(include.upper, exclude.lower - 1)
+                new_ranges.append((lower, upper))
+                lower = upper + 1
+            elif lower > exclude.upper:
+                # We're above the current exclude range.
+                exclude.next()
+            else:
+                # We're within both the include and exclude ranges.
+                # Advance out of the overlap.
+                upper = min(include.upper, exclude.upper)
+                lower = upper + 1
+
+        return Ranges(new_ranges)
+
+    def __iter__(self):
+        self._normalise()
+
+        return iter(self._ranges)
+
+    def __len__(self):
+        self._normalise()
+
+        return len(self._ranges)
+
+    def lowest(self):
+        self._normalise()
+
+        return self._ranges[0][0]
+
+    def __repr__(self):
+        self._normalise()
+
+        return 'Ranges({!r})'.format(self._ranges)
+
+    def _normalise(self):
+        if self._is_normalised:
+            return
+
+        if len(self._ranges) >= 2:
+            self._ranges.sort()
+
+            new_ranges = []
+            lower, upper = self._ranges[0]
+
+            for l, u in self._ranges[1 : ]:
+                if l - upper > 1:
+                    new_ranges.append((lower, upper))
+                    lower, upper = l, u
+                else:
+                    lower = min(lower, l)
+                    upper = max(upper, u)
+
+            new_ranges.append((lower, upper))
+
+            self._ranges = new_ranges
+
+        self._is_normalised = True
+
+munge_dict = str.maketrans({'-': '', '_': '', ' ': ''})
+
+def munge(value):
+    munged_value = value.translate(munge_dict).upper()
+
+    if value.startswith('-'):
+        munged_value = '-' + munged_value
+
+    return munged_value
+
+def download_unicode_files(unicode_data_base, data_files, data_folder):
+    for section in data_files.values():
+        for rel_path in section:
+            path = normpath(join(data_folder, basename(rel_path)))
+
+            if not exists(path):
+                url = urljoin(unicode_data_base, rel_path)
+                print('Downloading {} from {}'.format(rel_path, url),
+                  flush=True)
+                urlretrieve(url, path)
+
+def parse_property_aliases(data_folder):
+    properties = {}
+
+    path = join(data_folder, 'PropertyAliases.txt')
+
+    with open(path, encoding='utf-8') as file:
+        for line in file:
+            line = line.strip()
+
+            if not line or line.startswith('#'):
+                continue
+
+            fields = [field.strip() for field in line.split(';')]
+            prop_name = fields.pop(1)
+
+            property = {'names': list(unique([prop_name] + fields, key=munge))}
+
+            for name in property['names']:
+                properties[munge(name)] = property
+
+    return properties
+
+def parse_value_aliases(data_folder, properties):
+    path = join(data_folder, 'PropertyValueAliases.txt')
+
+    with open(path, encoding='utf-8') as file:
+        for line in file:
+            line = line.strip()
+
+            if not line or line.startswith('#'):
+                continue
+
+            line = line.partition('#')[0]
+            fields = [field.strip() for field in line.split(';')]
+            prop_name = fields.pop(0)
+            val_name = fields.pop(2 if prop_name == 'ccc' else 1)
+
+            property = properties[munge(prop_name)]
+            value = {'names': list(unique([val_name] + fields, key=munge))}
+            values = property.setdefault('values', {})
+
+            for name in value['names']:
+                values[munge(name)] = value
+
+def parse_binary(properties, path):
+    with open(path, encoding='utf-8') as file:
+        for line in file:
+            line = line.strip()
+
+            if not line or line.startswith('#'):
+                continue
+
+            line = line.partition('#')[0]
+            fields = [field.strip() for field in line.split(';')]
+            codepoints = [int(part, 16) for part in fields[0].split('..')]
+            prop_name = fields[1]
+            property = properties[munge(prop_name)]
+            property.setdefault('default', munge('No'))
+            value = property['values'][munge('Yes')]
+            value.setdefault('codepoints', Ranges()).add(codepoints[0],
+              codepoints[-1])
+
+def parse_emoji(properties, path):
+    with open(path, encoding='utf-8') as file:
+        for line in file:
+            line = line.strip()
+
+            if not line:
+                continue
+
+            if line.startswith('# @missing:'):
+                fields = line.split()
+                prop_name = fields[-3]
+
+                try:
+                    property = properties[munge(prop_name)]
+                except KeyError:
+                    property = {'names': [prop_name], 'values': {}}
+                    value = {'names': ['No', 'N']}
+                    property['values'][munge(value['names'][0])] = value
+                    value = {'names': ['Yes', 'Y']}
+                    property['values'][munge(value['names'][0])] = value
+                    properties[munge(prop_name)] = property
+
+                default = fields[-1]
+                property['default'] = munge(default)
+            elif not line.startswith('#'):
+                line = line.partition('#')[0]
+                fields = [field.strip() for field in line.split(';')]
+                codepoints = [int(part, 16) for part in fields[0].split('..')]
+                prop_name = fields[1]
+                property = properties[munge(prop_name)]
+                property.setdefault('default', munge('No'))
+
+                try:
+                    value = property['values'][munge('Yes')]
+                except KeyError:
+                    value = {'names': ['Yes']}
+                    property['values'][munge('Yes')] = value
+
+                value.setdefault('codepoints', Ranges()).add(codepoints[0],
+                  codepoints[-1])
+
+def parse_multivalue(properties, path):
+    with open(path, encoding='utf-8') as file:
+        for line in file:
+            line = line.strip()
+
+            if not line:
+                continue
+
+            if line.startswith('# Property:'):
+                prop_name = line.split()[-1]
+                property = properties[munge(prop_name)]
+            elif line.startswith('#  All code points not explicitly listed for'):
+                prop_name = line.split()[-1]
+                property = properties[munge(prop_name)]
+            elif line.startswith('# @missing:'):
+                default = line.split()[-1]
+                property['default'] = munge(default)
+            elif not line.startswith('#'):
+                line = line.partition('#')[0]
+                fields = [field.strip() for field in line.split(';')]
+                codepoints = [int(part, 16) for part in fields[0].split('..')]
+                val_name = fields[1]
+                value = property['values'][munge(val_name)]
+                value.setdefault('codepoints', Ranges()).add(codepoints[0],
+                  codepoints[-1])
+
+def parse_normalisation(properties, path):
+    property = None
+
+    with open(path, encoding='utf-8') as file:
+        for line in file:
+            line = line.strip()
+
+            if not line:
+                continue
+
+            if line.startswith('# Derived Property:'):
+                property = None
+            elif line.startswith('# Property:'):
+                prop_name = line.split()[-1]
+                property = properties[munge(prop_name)]
+            elif property:
+                if line.startswith('# @missing:'):
+                    default = line.split()[-1]
+                    property['default'] = munge(default)
+                elif not line.startswith('#'):
+                    line = line.partition('#')[0]
+                    fields = [field.strip() for field in line.split(';')]
+                    codepoints = [int(part, 16) for part in
+                      fields[0].split('..')]
+                    val_name = fields[2]
+
+                    value = property['values'][munge(val_name)]
+                    value.setdefault('codepoints', Ranges()).add(codepoints[0],
+                      codepoints[-1])
+
+def parse_numeric_values(properties, path):
+    with open(path, encoding='utf-8') as file:
+        for line in file:
+            line = line.strip()
+
+            if not line:
+                continue
+
+            if line.startswith('# Derived Property:'):
+                prop_name = line.split()[-1]
+                property = properties[munge(prop_name)]
+                default = {'names': ['NaN']}
+                property['values'] = {munge('NaN'): default}
+                property['default'] = munge('NaN')
+            elif line.startswith('# @missing:'):
+                default = line.split()[-1]
+                property['default'] = munge(default)
+            elif not line.startswith('#'):
+                line = line.partition('#')[0]
+                fields = [field.strip() for field in line.split(';')]
+                codepoints = [int(part, 16) for part in fields[0].split('..')]
+                val_name = fields[3]
+
+                try:
+                    value = property['values'][munge(val_name)]
+                except KeyError:
+                    value = {'names': [val_name]}
+                    property['values'][munge(val_name)] = value
+
+                value.setdefault('codepoints', Ranges()).add(codepoints[0],
+                  codepoints[-1])
+
+def parse_script_extensions(properties, path):
+    with open(path, encoding='utf-8') as file:
+        for line in file:
+            line = line.strip()
+
+            if not line:
+                continue
+
+            if line.startswith('# Property:'):
+                prop_name = line.split()[-1]
+                property = properties[munge(prop_name)]
+                property['values'] = {}
+            elif not line.startswith('#'):
+                line = line.partition('#')[0]
+                fields = [field.strip() for field in line.split(';')]
+                codepoints = [int(part, 16) for part in fields[0].split('..')]
+
+                key = tuple(sorted(fields[1].split(), key=str.lower))
+
+                try:
+                    value = property['values'][key]
+                except KeyError:
+                    value = {'codepoints': Ranges()}
+                    property['values'][key] = value
+
+                value['codepoints'].add(codepoints[0], codepoints[-1])
+
+def parse_case_folding(properties, path):
+    simple_folding = {}
+    full_folding = {}
+    turkic_set = set()
+
+    with open(path, encoding='utf-8') as file:
+        for line in file:
+            line = line.strip()
+
+            if not line or line.startswith('#'):
+                continue
+
+            line = line.partition('#')[0]
+            fields = line.split(';')
+            codepoint = int(fields[0], 16)
+            kind = fields[1].strip()
+            folded = [int(part, 16) for part in fields[2].split()]
+            delta = folded[0] ^ codepoint
+
+            if kind in {'S', 'C', 'T'}:
+                simple_folding.setdefault(delta, Ranges()).add(codepoint,
+                  codepoint)
+
+            if kind in {'F', 'C', 'T'}:
+                key = tuple([delta] + folded[1 : ])
+                full_folding.setdefault(key, Ranges()).add(codepoint,
+                  codepoint)
+
+            if kind == 'T':
+                turkic_set.add((codepoint, tuple(folded)))
+
+    # Is the Turkic set what we expected?
+    if turkic_set != {(0x49, (0x131, )), (0x130, (0x69, ))}:
+        raise ValueError('Turkic set has changed')
+
+    properties['simple_folding'] = simple_folding
+    properties['full_folding'] = full_folding
+
+def parse_unicode_files(data_files, data_folder):
+    properties = parse_property_aliases(data_folder)
+    parse_value_aliases(data_folder, properties)
+
+    def ignore(*args):
+        pass
+
+    parsers = {
+        'aliases': ignore,
+        'binary': parse_binary,
+        'emoji': parse_emoji,
+        'multivalue': parse_multivalue,
+        'normalisation': parse_normalisation,
+        'numeric_values': parse_numeric_values,
+        'script_extensions': parse_script_extensions,
+        'case_folding': parse_case_folding,
+    }
+
+    for section, rel_paths in data_files.items():
+        parse = parsers[section]
+
+        for rel_path in rel_paths:
+            data_file = basename(rel_path)
+
+            print('Parsing {}'.format(data_file), flush=True)
+            parse(properties, join(data_folder, data_file))
+
+    unicode_data = {'properties': {}}
+
+    for prop_name, property in properties.items():
+        if has_codepoints(property):
+            unicode_data['properties'][prop_name] = property
+        elif prop_name in {'simple_folding', 'full_folding'}:
+            unicode_data[prop_name] = property
+
+    properties = unicode_data['properties']
+    property = properties[munge('General_Category')]
+    property['default'] = munge('Unassigned')
+
+    values = property['values']
+
+    for val_name, value in list(values.items()):
+        if len(val_name) == 1:
+            new_name = val_name.upper() + '&'
+            values[munge(new_name)] = value
+            value['names'].append(new_name)
+
+    return unicode_data
+
+def make_binary_property(properties, names, codepoints):
+    no_value = {'names': ['No', 'N', 'F', 'False']}
+    yes_value = {'names': ['Yes', 'Y', 'T', 'True'], 'codepoints': codepoints}
+    values = {}
+
+    for value in [no_value, yes_value]:
+        for name in value['names']:
+            values[munge(name)] = value
+
+    property = {'names': names, 'values': values, 'default': munge('No')}
+
+    for name in names:
+        properties[munge(name)] = property
+
+def make_additional_properties(unicode_data):
+
+    def get_values(prop_name):
+        return properties[munge(prop_name)]['values']
+
+    def get_codepoints(prop_name, val_name):
+        return get_values(prop_name)[munge(val_name)]['codepoints']
+
+    properties = unicode_data['properties']
+
+    # Make the 'Alphanumeric' property.
+    alphabetic = get_codepoints('Alphabetic', 'Yes')
+    decimal_number = get_codepoints('General_Category', 'Decimal_Number')
+
+    make_binary_property(properties, ['Alphanumeric', 'AlNum'], alphabetic |
+      decimal_number)
+
+    # Make the 'Any' property.
+    make_binary_property(properties, ['Any'], Ranges([(0, NUM_CODEPOINTS -
+      1)]))
+
+    # General_Category has a compound value called 'Assigned'.
+    assigned = Ranges()
+
+    for value in unique(get_values('General_Category').values(), key=id):
+        if value['names'][0] != 'Unassigned':
+            try:
+                assigned |= value['codepoints']
+            except KeyError:
+                pass
+
+    value = {'names': ['Assigned']}
+    properties[munge('General_Category')]['values'][munge('Assigned')] = value
+
+    # Make the 'Blank' property.
+    space_separator = get_codepoints('General_Category', 'Space_Separator')
+    blank = Ranges([(0x09, 0x09)]) | space_separator
+
+    make_binary_property(properties, ['Blank'], blank)
+
+    # Make the 'Graph' property.
+    whitespace = get_codepoints('White_Space', 'Yes')
+    control = get_codepoints('General_Category', 'Control')
+    surrogate = get_codepoints('General_Category', 'Surrogate')
+
+    graph = assigned - (whitespace | control | surrogate)
+
+    make_binary_property(properties, ['Graph'], graph)
+
+    # Make the 'Print' property.
+    print_ = (graph | blank) - control
+
+    make_binary_property(properties, ['Print'], print_)
+
+    # Make the 'Word' property.
+    enclosing_mark = get_codepoints('General_Category', 'Enclosing_Mark')
+    nonspacing_mark = get_codepoints('General_Category', 'Nonspacing_Mark')
+    spacing_mark = get_codepoints('General_Category', 'Spacing_Mark')
+    connector_punctuation = get_codepoints('General_Category',
+      'Connector_Punctuation')
+    join_control = get_codepoints('Join_Control', 'Yes')
+
+    word = (alphabetic | enclosing_mark | nonspacing_mark | spacing_mark |
+      decimal_number | connector_punctuation | join_control)
+
+    make_binary_property(properties, ['Word'], word)
+
+    # Make the 'XDigit' property.
+    hex_digit = get_codepoints('Hex_Digit', 'Yes')
+
+    xdigit = decimal_number | hex_digit
+
+    make_binary_property(properties, ['XDigit'], xdigit)
+
+    # Make the 'Posix_Digit' property.
+    posix_digit = Ranges([(ord('0'), ord('9'))])
+
+    make_binary_property(properties, ['Posix_Digit'], posix_digit)
+
+    # Make the 'Posix_AlNum' property.
+    posix_alnum = alphabetic | posix_digit
+
+    make_binary_property(properties, ['Posix_AlNum'], posix_alnum)
+
+    # Make the 'Posix_Punct' property.
+    punctuation = Ranges()
+
+    for name in 'Pd Ps Pe Pc Po Pi Pf'.split():
+        punctuation |= get_codepoints('General_Category', name)
+
+    symbol = Ranges()
+
+    for name in 'Sm Sc Sk So '.split():
+        symbol |= get_codepoints('General_Category', name)
+
+    posix_punct = (punctuation | symbol) - alphabetic
+
+    make_binary_property(properties, ['Posix_Punct'], posix_punct)
+
+    # Make the 'Posix_XDigit' property.
+    posix_xdigit = Ranges([(ord('0'), ord('9')), (ord('A'), ord('F')),
+      (ord('a'), ord('f'))])
+
+    make_binary_property(properties, ['Posix_XDigit'], posix_xdigit)
+
+def preferred(d):
+    return munge(d['names'][0])
+
+def has_codepoints(property):
+    if 'values' not in property:
+        return False
+
+    return any('codepoints' in value for value in property['values'].values())
+
+def write_summary(unicode_data, tools_folder):
+    print('Writing summary')
+
+    properties = unicode_data['properties']
+
+    path = join(tools_folder, 'Unicode.txt')
+
+    with open(path, 'w', encoding='ascii') as file:
+        file.write('Version {}\n'.format(UNICODE_VERSION))
+
+        for property in sorted(unique(properties.values(), key=id),
+          key=preferred):
+            if not has_codepoints(property):
+                print(property['names'][0])
+                continue
+
+            file.write('Property {}\n'.format(' '.join(property['names'])))
+
+            values = property['values']
+
+            if property['names'][0] == 'Script_Extensions':
+                for key in sorted(values):
+                    value = values[key]
+                    file.write('Value {}\n'.format(' '.join(key)))
+
+                    for lower, upper in value.get('codepoints', []):
+                        if lower == upper:
+                            file.write('{:04X}\n'.format(lower))
+                        else:
+                            file.write('{:04X}..{:04X}\n'.format(lower, upper))
+            else:
+                if 'default' in property:
+                    default = values[property['default']]
+                    file.write('DefaultValue {}\n'.format(default['names'][0]))
+
+                for value in sorted(unique(values.values(), key=id),
+                  key=preferred):
+                    file.write('Value {}\n'.format(' '.join(value['names'])))
+
+                    for lower, upper in value.get('codepoints', []):
+                        if lower == upper:
+                            file.write('{:04X}\n'.format(lower))
+                        else:
+                            file.write('{:04X}..{:04X}\n'.format(lower, upper))
+
+        file.write('SimpleFolding\n')
+
+        for delta, ranges in unicode_data['simple_folding'].items():
+            file.write('Value {:04X}\n'.format(delta))
+
+            for lower, upper in ranges:
+                if lower == upper:
+                    file.write('{:04X}\n'.format(lower))
+                else:
+                    file.write('{:04X}..{:04X}\n'.format(lower, upper))
+
+        file.write('FullFolding\n')
+
+        for key, ranges in unicode_data['full_folding'].items():
+            file.write('Value {}\n'.format(' '.join('{:04X}'.format(value) for
+              value in key)))
+
+            for lower, upper in ranges:
+                if lower == upper:
+                    file.write('{:04X}\n'.format(lower))
+                else:
+                    file.write('{:04X}..{:04X}\n'.format(lower, upper))
+
+def make_binary_dict():
+    binary_dict = {}
+
+    for n in range(0x100):
+        key = tuple(map(int, format(n, '08b')[ : : -1]))
+        binary_dict[key] = n
+
+    return binary_dict
+
+def collect_strings(properties):
+    strings = []
+
+    for property in properties.values():
+        try:
+            strings.extend(property['names'])
+
+            for value in property['values'].values():
+                strings.extend(value['names'])
+        except KeyError:
+            pass
+
+    return sorted(set(munge(string) for string in strings))
+
+def chunked(iterable, chunk_size):
+    sequence = iterable
+    count = len(sequence)
+
+    for start in range(0, count, chunk_size):
+        chunk = sequence[start : start +  chunk_size]
+        yield chunk
+
+def determine_entry_type(iterable):
+    lower, upper = min(iterable), max(iterable)
+
+    if 0 <= lower <= upper <= 0xFF:
+        return 'RE_UINT8'
+
+    if 0 <= lower <= upper <= 0xFFFF:
+        return 'RE_UINT16'
+
+    raise ValueError('cannot determine C type for {}..{}'.format(lower, upper))
+
+def is_binary(property):
+    return sum(1 for val in val_list if val['id'] != 0) == 1
+
+def count_ranges(property):
+    count = 0
+    default_id = property['values'][munge(property['default'])]['id']
+
+    for value in unique(property['values'].values(), key=id):
+        if value['id'] != default_id:
+            count += len(value.get('codepoints', []))
+
+    return count
+
+def generate_small_lookup(property, c_file):
+    c_file.write('''
+/* {}. */
+RE_UINT32 re_get_{}(RE_UINT32 codepoint) {{
+'''.format(property['names'][0], property['names'][0].lower()))
+
+    default_id = property['values'][munge(property['default'])]['id']
+    ranges = []
+
+    for value in unique(property['values'].values(), key=id):
+        if value['id'] != default_id:
+            val_id = value['id']
+
+            for lower, upper in value.get('codepoints', []):
+                ranges.append((lower, upper, val_id))
+
+    if len(ranges) == 1 and ranges[0][ : 2] == (0, NUM_CODEPOINTS - 1):
+        c_file.write('    return {};\n}}\n'.format(ranges[0][2]))
+    else:
+        for lower, upper, val_id in ranges:
+            width = 2 if upper <= 0xFF else 4 if upper <= 0xFFFF else 6
+
+            if lower == upper:
+                c_file.write('''\
+    if (codepoint == 0x{:0{width}X})
+        return {};
+'''.format(lower, val_id, width=width))
+            else:
+                c_file.write('''\
+    if (0x{:0{width}X} <= codepoint && codepoint <= 0x{:0{width}X})
+        return {};
+'''.format(lower, upper, val_id, width=width))
+
+        c_file.write('\n    return {};\n}}\n'.format(default_id))
+
+def generate_table(table_name, values, c_file, max_columns=16, public=False):
+    entry_type = determine_entry_type(values)
+
+    if public:
+        c_file.write('{} {}[] = {{\n'.format(entry_type, table_name))
+    else:
+        c_file.write('static {} {}[] = {{\n'.format(entry_type, table_name))
+
+    entries = [str(value) for value in values]
+    max_width = max(len(entry) for entry in entries)
+    entries = [entry.rjust(max_width) + ',' for entry in entries]
+    entries[-1] = entries[-1].rstrip(',')
+
+    for chunk in chunked(entries, max_columns):
+        c_file.write('    %s\n' % ' '.join(chunk))
+
+    c_file.write('};\n')
+
+def generate_lookup(property, c_file):
+    val_list = list(unique(property['values'].values(), key=id))
+
+    if count_ranges(property) <= 8:
+        generate_small_lookup(property, c_file)
+        return
+
+    default_id = property['values'][munge(property['default'])]['id']
+    entries = [default_id] * NUM_CODEPOINTS
+
+    for value in val_list:
+        val_id = value['id']
+
+        for lower, upper in value.get('codepoints', []):
+            entries[lower : upper + 1] = [val_id] * (upper - lower + 1)
+
+    CHUNK_SIZE = 32
+
+    indexes = []
+    chunks = {}
+
+    for chunk in chunked(tuple(entries), CHUNK_SIZE):
+        indexes.append(chunks.setdefault(chunk, len(chunks)))
+
+    table_2 = list(chain(*sorted(chunks, key=chunks.get)))
+
+    entries = indexes
+    indexes = []
+    chunks = {}
+
+    for start in range(0, len(entries), CHUNK_SIZE):
+        chunk = tuple(entries[start : start + CHUNK_SIZE])
+        indexes.append(chunks.setdefault(chunk, len(chunks)))
+
+    table_1 = list(chain(*sorted(chunks, key=chunks.get)))
+
+    table_0 = indexes
+
+    c_file.write('\n/* {}. */\n'.format(property['names'][0]))
+
+    prop_name = property['names'][0].lower()
+    binary = set(table_2) == {0, 1}
+
+    for i, table in enumerate([table_0, table_1, table_2]):
+        if i == 2 and binary:
+            binary = True
+            entries = []
+
+            for start in range(0, len(table), 8):
+                entries.append(binary_dict[tuple(table[start : start + 8])])
+
+            table = entries
+
+        if i > 0:
+            c_file.write('\n')
+
+        generate_table('re_{}_table_{}'.format(prop_name, 1 + i), table,
+          c_file)
+
+    if binary:
+        c_file.write('''
+RE_UINT32 re_get_{0}(RE_UINT32 codepoint) {{
+    RE_UINT32 field_2;
+    RE_UINT32 field_1;
+    RE_UINT32 field_0;
+    RE_UINT32 offset;
+    RE_UINT32 v;
+
+    field_2 = codepoint >> 10;
+    field_1 = (codepoint >> 5) & 0x1F;
+    field_0 = (codepoint >> 3) & 0x3;
+    offset = codepoint & 0x7;
+
+    v = re_{0}_table_1[field_2];
+    v = re_{0}_table_2[(v << 5) | field_1];
+    v = re_{0}_table_3[(v << 2) | field_0];
+
+    return (v >> offset) & 0x1;
+}}
+'''.format(prop_name))
+    else:
+        c_file.write('''
+RE_UINT32 re_get_{0}(RE_UINT32 codepoint) {{
+    RE_UINT32 field_2;
+    RE_UINT32 field_1;
+    RE_UINT32 field_0;
+    RE_UINT32 v;
+
+    field_2 = codepoint >> 10;
+    field_1 = (codepoint >> 5) & 0x1F;
+    field_0 = codepoint & 0x1F;
+
+    v = re_{0}_table_1[field_2];
+    v = re_{0}_table_2[(v << 5) | field_1];
+    v = re_{0}_table_3[(v << 5) | field_0];
+
+    return v;
+}}
+'''.format(prop_name))
+
+def generate_script_extensions_lookup(properties, property, c_file):
+    entries = [0] * NUM_CODEPOINTS
+
+    # Initialise with script.
+    val_list = unique(properties[munge('Script')]['values'].values(), key=id)
+
+    for value in val_list:
+        val_id = value['id']
+
+        for lower, upper in value.get('codepoints', []):
+            entries[lower : upper + 1] = [val_id] * (upper - lower + 1)
+
+    script_count = 1 + max(value['id'] for value in
+      properties[munge('Script')]['values'].values())
+
+    val_list = unique(property['values'].values(), key=id)
+
+    for value in val_list:
+        val_id = value['id']
+
+        for lower, upper in value.get('codepoints', []):
+            entries[lower : upper + 1] = [val_id] * (upper - lower + 1)
+
+    CHUNK_SIZE = 32
+
+    indexes = []
+    chunks = {}
+
+    for chunk in chunked(entries, CHUNK_SIZE):
+        indexes.append(chunks.setdefault(tuple(chunk), len(chunks)))
+
+    table_2 = list(chain(*sorted(chunks, key=chunks.get)))
+
+    entries = indexes
+    indexes = []
+    chunks = {}
+
+    for start in range(0, len(entries), CHUNK_SIZE):
+        chunk = tuple(entries[start : start + CHUNK_SIZE])
+        indexes.append(chunks.setdefault(chunk, len(chunks)))
+
+    table_1 = list(chain(*sorted(chunks, key=chunks.get)))
+
+    table_0 = indexes
+
+    c_file.write('\n/* {}. */\n'.format(property['names'][0]))
+
+    prop_name = property['names'][0].lower()
+
+    for i, table in enumerate([table_0, table_1, table_2]):
+        generate_table('{}_table_{}'.format(prop_name, 1 + i), table, c_file)
+
+    script_values = properties[munge('Script')]['values']
+    ext_dict = {}
+
+    for key, value in property['values'].items():
+        ext_dict[value['id']] = [script_values[munge(name)]['id'] for name in
+          key]
+
+    offsets = []
+    entries = []
+
+    for key, value in sorted(ext_dict.items()):
+        offsets.append(len(entries))
+        entries.extend(value + [0])
+
+    generate_table('{}_table_4'.format(prop_name), offsets, c_file)
+
+    generate_table('{}_table_5'.format(prop_name), entries, c_file)
+
+    c_file.write('''
+int re_get_{0}(RE_UINT32 codepoint, RE_UINT8* scripts) {{
+    RE_UINT32 field_2;
+    RE_UINT32 field_1;
+    RE_UINT32 field_0;
+    RE_UINT32 v;
+    int offset;
+    int count;
+
+    field_2 = codepoint >> 10;
+    field_1 = (codepoint >> 5) & 0x1F;
+    field_0 = codepoint & 0x1F;
+
+    v = {0}_table_1[field_2];
+    v = {0}_table_2[(v << 5) | field_1];
+    v = {0}_table_3[(v << 5) | field_0];
+
+    if (v < {1}) {{
+        scripts[0] = v;
+
+        return 1;
+    }}
+
+    offset = {0}_table_4[v - {1}];
+    count = 0;
+
+    do {{
+        scripts[count] = {0}_table_5[offset + count];
+        ++count;
+    }} while ({0}_table_5[offset + count] != 0);
+
+    return count;
+}}
+'''.format(prop_name, script_count))
+
+def generate_all_cases(unicode_data, c_file):
+    simple_folding = unicode_data['simple_folding']
+
+    all_cases = {}
+
+    for delta, ranges in simple_folding.items():
+        for lower, upper in ranges:
+            for codepoint in range(lower, upper + 1):
+                folded = codepoint ^ delta
+                all_cases.setdefault(folded, set()).update({codepoint, folded})
+
+    for codepoint in list(all_cases):
+        cases = {codepoint} | all_cases.get(codepoint, set())
+
+        for c in list(cases):
+            cases |= all_cases.get(c, set())
+
+        for c in cases:
+            all_cases[c] = cases
+
+    all_cases[0x49] = {0x49, 0x69, 0x131} # Dotless capital I.
+    all_cases[0x69] = {0x69, 0x49, 0x130} # Dotted small I.
+    all_cases[0x130] = {0x130, 0x69} # Dotted capital I.
+    all_cases[0x131] = {0x131, 0x49} # Dotless small I.
+
+    entries = [0] * NUM_CODEPOINTS
+    others_dict = {(0, ): 0}
+
+    for codepoint, cases in all_cases.items():
+        others = sorted(cases - {codepoint})
+        key = tuple([others[0] ^ codepoint] + others[1 : ])
+        entries[codepoint] = others_dict.setdefault(key, len(others_dict))
+
+    CHUNK_SIZE = 32
+
+    indexes = []
+    chunks = {}
+
+    for chunk in chunked(entries, CHUNK_SIZE):
+        indexes.append(chunks.setdefault(tuple(chunk), len(chunks)))
+
+    table_2 = list(chain(*sorted(chunks, key=chunks.get)))
+
+    entries = indexes
+    indexes = []
+    chunks = {}
+
+    for start in range(0, len(entries), CHUNK_SIZE):
+        chunk = tuple(entries[start : start + CHUNK_SIZE])
+        indexes.append(chunks.setdefault(chunk, len(chunks)))
+
+    table_1 = list(chain(*sorted(chunks, key=chunks.get)))
+
+    table_0 = indexes
+
+    c_file.write('\n/* All cases. */\n')
+
+    for i, table in enumerate([table_0, table_1, table_2]):
+        if i > 0:
+            c_file.write('\n')
+
+        generate_table('re_all_cases_table_{}'.format(1 + i), table, c_file)
+
+    c_file.write('\nstatic RE_AllCases re_all_cases_table_4[] = {\n')
+
+    max_columns = max(len(value) for value in others_dict)
+
+    max_width = max(len(str(item)) for value in others_dict for item in value)
+    fmt = '    {{' + ', '.join(['{:%d}' % max_width] * max_columns) + '}},\n'
+
+    lines = []
+
+    for values in sorted(others_dict, key=others_dict.get):
+        values = list(values) + [0] * max_columns
+        lines.append(fmt.format(*values))
+
+    lines[-1] = lines[-1].rstrip(',\n') + '\n'
+
+    c_file.writelines(lines)
+
+    c_file.write('};\n')
+
+    c_file.write('''
+int re_get_all_cases(RE_UINT32 codepoint, RE_UINT32* cases) {
+    RE_UINT32 field_2;
+    RE_UINT32 field_1;
+    RE_UINT32 field_0;
+    RE_UINT32 v;
+
+    field_2 = codepoint >> 10;
+    field_1 = (codepoint >> 5) & 0x1F;
+    field_0 = codepoint & 0x1F;
+
+    v = re_all_cases_table_1[field_2];
+    v = re_all_cases_table_2[(v << 5) | field_1];
+    v = re_all_cases_table_3[(v << 5) | field_0];
+
+    cases[0] = codepoint;
+
+    if (re_all_cases_table_4[v].delta == 0)
+        return 1;
+
+    cases[1] = codepoint ^ re_all_cases_table_4[v].delta;
+
+    if (re_all_cases_table_4[v].others[0] == 0)
+        return 2;
+
+    cases[2] = re_all_cases_table_4[v].others[0];
+
+    if (re_all_cases_table_4[v].others[1] == 0)
+        return 3;
+
+    cases[3] = re_all_cases_table_4[v].others[1];
+
+    return 4;
+}
+''')
+
+def generate_simple_case_folding(unicode_data, c_file):
+    simple_folding = unicode_data['simple_folding']
+
+    entries = [0] * NUM_CODEPOINTS
+    value_dict = {0: 0}
+
+    for delta, ranges in sorted(simple_folding.items()):
+        val_id = value_dict.setdefault(delta, len(value_dict))
+
+        for lower, upper in ranges:
+            entries[lower : upper + 1] = [val_id] * (upper - lower + 1)
+
+    CHUNK_SIZE = 32
+
+    indexes = []
+    chunks = {}
+
+    for chunk in chunked(entries, CHUNK_SIZE):
+        indexes.append(chunks.setdefault(tuple(chunk), len(chunks)))
+
+    table_2 = list(chain(*sorted(chunks, key=chunks.get)))
+
+    entries = indexes
+    indexes = []
+    chunks = {}
+
+    for start in range(0, len(entries), CHUNK_SIZE):
+        chunk = tuple(entries[start : start + CHUNK_SIZE])
+        indexes.append(chunks.setdefault(chunk, len(chunks)))
+
+    table_1 = list(chain(*sorted(chunks, key=chunks.get)))
+
+    table_0 = indexes
+
+    c_file.write('\n/* Simple case folding. */\n')
+
+    for i, table in enumerate([table_0, table_1, table_2]):
+        if i > 0:
+            c_file.write('\n')
+
+        generate_table('re_simple_folding_table_{}'.format(1 + i), table, c_file)
+
+    c_file.write('\nstatic RE_UINT16 re_simple_folding_table_4[] = {\n')
+
+    entries = [str(value) for value in sorted(value_dict, key=value_dict.get)]
+    max_width = max(len(entry) for entry in entries)
+    entries = [entry.rjust(max_width) + ',' for  entry in entries]
+    entries[-1] = entries[-1].rstrip(',')
+
+    for chunk in chunked(entries, 8):
+        c_file.write('    %s\n' % ' '.join(chunk))
+
+    c_file.write('};\n')
+
+    c_file.write('''
+RE_UINT32 re_get_simple_case_folding(RE_UINT32 codepoint) {
+    RE_UINT32 field_2;
+    RE_UINT32 field_1;
+    RE_UINT32 field_0;
+    RE_UINT32 v;
+
+    field_2 = codepoint >> 10;
+    field_1 = (codepoint >> 5) & 0x1F;
+    field_0 = codepoint & 0x1F;
+
+    v = re_simple_folding_table_1[field_2];
+    v = re_simple_folding_table_2[(v << 5) | field_1];
+    v = re_simple_folding_table_3[(v << 5) | field_0];
+
+    return codepoint ^ re_simple_folding_table_4[v];
+}
+''')
+
+def generate_full_case_folding(unicode_data, c_file):
+    full_folding = unicode_data['full_folding']
+
+    entries = [0] * NUM_CODEPOINTS
+    value_dict = {(0, ): 0}
+
+    for delta, ranges in sorted(full_folding.items()):
+        val_id = value_dict.setdefault(delta, len(value_dict))
+
+        for lower, upper in ranges:
+            entries[lower : upper + 1] = [val_id] * (upper - lower + 1)
+
+    CHUNK_SIZE = 32
+
+    indexes = []
+    chunks = {}
+
+    for chunk in chunked(entries, CHUNK_SIZE):
+        indexes.append(chunks.setdefault(tuple(chunk), len(chunks)))
+
+    table_2 = list(chain(*sorted(chunks, key=chunks.get)))
+
+    entries = indexes
+    indexes = []
+    chunks = {}
+
+    for start in range(0, len(entries), CHUNK_SIZE):
+        chunk = tuple(entries[start : start + CHUNK_SIZE])
+        indexes.append(chunks.setdefault(chunk, len(chunks)))
+
+    table_1 = list(chain(*sorted(chunks, key=chunks.get)))
+
+    table_0 = indexes
+
+    c_file.write('\n/* Full case folding. */\n')
+
+    for i, table in enumerate([table_0, table_1, table_2]):
+        if i > 0:
+            c_file.write('\n')
+
+        generate_table('re_full_folding_table_{}'.format(1 + i), table, c_file)
+
+    c_file.write('\nstatic RE_FullCaseFolding re_full_folding_table_4[] = {\n')
+
+    max_folded = max(len(value) for value in value_dict)
+    max_width = max(len(str(item)) for value in value_dict for item in value)
+    rows = [(value + (0, ) * max_folded)[ : max_folded] for value in
+      sorted(value_dict, key=value_dict.get)]
+    fmt = ('    {{' + ', '.join(['{:%d}' % max_width] * max_folded) +
+      '}},\n').format
+    lines = []
+
+    for row in rows:
+        lines.append(fmt(*row))
+
+    lines[-1] = lines[-1].rstrip(',\n') + '\n'
+
+    c_file.writelines(lines)
+
+    c_file.write('};\n')
+
+    c_file.write('''
+int re_get_full_case_folding(RE_UINT32 codepoint, RE_UINT32* folded) {
+    RE_UINT32 field_2;
+    RE_UINT32 field_1;
+    RE_UINT32 field_0;
+    RE_UINT32 v;
+    RE_UINT16* data;
+
+    field_2 = codepoint >> 10;
+    field_1 = (codepoint >> 5) & 0x1F;
+    field_0 = codepoint & 0x1F;
+
+    v = re_full_folding_table_1[field_2];
+    v = re_full_folding_table_2[(v << 5) | field_1];
+    v = re_full_folding_table_3[(v << 5) | field_0];
+
+    data = re_full_folding_table_4[v].data;
+    folded[0] = codepoint ^ data[0];
+
+    if (data[1] == 0)
+        return 1;
+
+    folded[1] = data[1];
+
+    if (data[2] == 0)
+        return 2;
+
+    folded[2] = data[2];
+
+    return 3;
+}
+''')
+
+def generate_code(unicode_data, tools_folder):
+    print('Generating code')
+
+    # Codepoints that expand on full casefolding.
+    expanded = []
+
+    for key, ranges in unicode_data['full_folding'].items():
+        if len(key) > 1:
+            for lower, upper in ranges:
+                expanded.extend(range(lower, upper + 1))
+
+    expanded.sort()
+
+    # Assign the property and value IDs.
+    properties = unicode_data['properties']
+    prop_list = list(unique(properties.values(), key=id))
+    prop_list.sort(key=preferred)
+
+    unicode_data['property_tablee_count'] = len(properties)
+    unicode_data['property_count'] = len(prop_list)
+
+    no_yes_maybe = {
+        'NO', 'N', 'FALSE', 'F',
+        'YES', 'Y', 'TRUE', 'T',
+        'MAYBE', 'M',
+    }
+
+    yes_no_maybe_dict = {'No': 0, 'Yes': 1, 'Maybe': 2}
+
+    for prop_id, property in enumerate(prop_list):
+        property['id'] = prop_id
+
+        if property['names'][0] == 'Script_Extensions':
+            script_count = 1 + max(val['id'] for val in
+              properties[munge('Script')]['values'].values())
+
+            def make_key(value):
+                return value['codepoints'].lowest()
+
+            val_list = list(unique(property['values'].values(), key=id))
+            val_list.sort(key=make_key)
+
+            for val_id, value in enumerate(val_list):
+                value['id'] = script_count + val_id
+        else:
+            default = property['default']
+
+            if not (set(property['values']) - no_yes_maybe):
+
+                def make_key(value):
+                    return yes_no_maybe_dict[value['names'][0]]
+
+            else:
+
+                def make_key(value):
+                    if munge(value['names'][0]) == default:
+                        return (0, )
+
+                    if 'codepoints' not in value:
+                        return (2, )
+
+                    return 1, value['codepoints'].lowest()
+
+            val_list = list(unique(property['values'].values(), key=id))
+            val_list.sort(key=make_key)
+
+            def make_key(val):
+                name_list = [name for name in val['names'] if '&' in name]
+
+                if name_list:
+                    return 1, name_list[0][0]
+
+                return 0
+
+            if property['names'][0] == 'General_Category':
+
+                def make_key(value):
+                    for name in value['names']:
+                        if '&' in name:
+                            return (1, name)
+
+                    if value.get('codepoints'):
+                        return (0, )
+
+                    return (2, munge(value['names'][0]))
+
+                for val_id, value in enumerate(sorted(val_list, key=make_key)):
+                    value['id'] = val_id
+            else:
+                for val_id, value in enumerate(val_list):
+                    value['id'] = val_id
+
+    # Collect the value sets.
+    valueset_dict = {}
+
+    for property in sorted(prop_list, key=lambda prop: prop['id']):
+        prop_name = property['names'][0]
+
+        if prop_name == 'Script_Extensions':
+            property['valueset_id'] = properties[munge('Script')]['valueset_id']
+        else:
+            valueset = []
+
+            val_list = list(unique(property['values'].values(), key=id))
+
+            for value in sorted(val_list, key=lambda val: val['id']):
+                valueset.append(tuple(value['names']))
+
+            valueset_id = valueset_dict.setdefault(tuple(valueset),
+              len(valueset_dict))
+            property['valueset_id'] = valueset_id
+
+    strings = collect_strings(properties)
+
+    c_path = join(tools_folder, 'unicode.c')
+    h_path = join(tools_folder, 'unicode.h')
+
+    with open(c_path, 'w', newline='\n', encoding='ascii') as c_file:
+        c_file.write('''\
+/* For Unicode version {} */
+
+#include "_regex_unicode.h"
+
+#define RE_BLANK_MASK ((1 << RE_PROP_ZL) | (1 << RE_PROP_ZP))
+#define RE_GRAPH_MASK ((1 << RE_PROP_CC) | (1 << RE_PROP_CS) | (1 << RE_PROP_CN))
+#define RE_WORD_MASK (RE_PROP_M_MASK | (1 << RE_PROP_ND) | (1 << RE_PROP_PC))
+
+typedef struct {{
+    RE_UINT8 scripts[RE_MAX_SCX];
+}} RE_ScriptExt;
+
+typedef struct {{
+    RE_UINT32 delta;
+    RE_UINT16 others[RE_MAX_CASES - 1];
+}} RE_AllCases;
+
+typedef struct {{
+    RE_UINT16 data[RE_MAX_FOLDED];
+}} RE_FullCaseFolding;
+
+/* Strings. */
+char* re_strings[] = {{
+'''.format(UNICODE_VERSION))
+
+        lines = []
+
+        for string in strings:
+            lines.append('    "{}",\n'.format(string))
+
+        strings_dict = {string: i for i, string in enumerate(strings)}
+
+        unicode_data['string_count'] = len(strings_dict)
+
+        c_file.writelines(lines)
+        c_file.write('''\
+};
+
+/* Properties. */
+RE_Property re_properties[] = {
+''')
+
+        for prop_id, property in enumerate(sorted(prop_list, key=lambda prop:
+          prop['id'])):
+            for name in property['names']:
+                c_file.write('    {{{:4}, {:2}, {:2}}}, /* {} */\n'.format(strings_dict[munge(name)],
+                  prop_id, property['valueset_id'], munge(name)))
+
+        c_file.write('''\
+};
+
+/* Property values. */
+RE_PropertyValue re_property_values[] = {
+''')
+
+        def make_key(names):
+            if any(len(name) == 2 for name in names):
+                return 0
+
+            return 1
+
+        gc_valset_id = properties[munge('General_Category')]['valueset_id']
+        count = 0
+
+        for valset, valset_id in sorted(valueset_dict.items(), key=lambda pair:
+          pair[1]):
+            if valset_id == gc_valset_id:
+                valset = sorted(valset, key=make_key)
+
+            for val_id, names in enumerate(valset):
+                for name in names:
+                    c_file.write('''    {{{:4}, {:2}, {:3}}}, /* {} */\n'''.format(strings_dict[munge(name)],
+                      valset_id, val_id, munge(name)))
+
+                count += len(names)
+
+        unicode_data['valueset_table_count'] = count
+
+        c_file.write('};\n')
+
+        c_file.write('''\n/* Codepoints which expand on full case-folding. */\n''')
+
+        unicode_data['expanded_count'] = len(expanded)
+        generate_table('re_expand_on_folding', expanded, c_file, max_columns=8, public=True)
+
+        for property in prop_list:
+            print('    {}'.format(property['names'][0]), flush=True)
+
+            if property['names'][0] == 'Script_Extensions':
+                generate_script_extensions_lookup(properties, property, c_file)
+            else:
+                generate_lookup(property, c_file)
+
+        print('    All cases', flush=True)
+        generate_all_cases(unicode_data, c_file)
+
+        print('    Simple case folding', flush=True)
+        generate_simple_case_folding(unicode_data, c_file)
+
+        print('    Full case folding', flush=True)
+        generate_full_case_folding(unicode_data, c_file)
+
+        c_file.write('''
+/* Property function table. */
+RE_GetPropertyFunc re_get_property[] = {
+''')
+
+        lines = []
+
+        for property in prop_list:
+            prop_name = property['names'][0].lower()
+
+            if prop_name == 'script_extensions':
+                lines.append('    0,\n')
+            else:
+                lines.append('    re_get_{},\n'.format(prop_name))
+
+        lines[-1] = lines[-1].rstrip(',\n') + '\n'
+
+        c_file.writelines(lines)
+
+        c_file.write('};\n')
+
+    with open(h_path, 'w', newline='\n', encoding='ascii') as h_file:
+        property = unicode_data['properties'][munge('Script_Extensions')]
+        max_scx = max(len(key) for key in property['values'])
+
+        h_file.write('''\
+typedef unsigned char RE_UINT8;
+typedef signed char RE_INT8;
+typedef unsigned short RE_UINT16;
+typedef signed short RE_INT16;
+typedef unsigned int RE_UINT32;
+typedef signed int RE_INT32;
+
+typedef unsigned char BOOL;
+#if !defined(FALSE) || !defined(TRUE)
+#define FALSE 0
+#define TRUE 1
+#endif
+
+#define RE_ASCII_MAX 0x7F
+#define RE_LOCALE_MAX 0xFF
+
+#define RE_MAX_CASES 4
+#define RE_MAX_FOLDED 3
+#define RE_MAX_SCX {}
+
+typedef struct RE_Property {{
+    RE_UINT16 name;
+    RE_UINT8 id;
+    RE_UINT8 value_set;
+}} RE_Property;
+
+typedef struct RE_PropertyValue {{
+    RE_UINT16 name;
+    RE_UINT8 value_set;
+    RE_UINT16 id;
+}} RE_PropertyValue;
+
+typedef RE_UINT32 (*RE_GetPropertyFunc)(RE_UINT32 codepoint);
+'''.format(max_scx))
+
+        gc_id = properties[munge('General_Category')]['id']
+        cased_id = properties[munge('Cased')]['id']
+        upper_id = properties[munge('Uppercase')]['id']
+        lower_id = properties[munge('Lowercase')]['id']
+        scx_id = properties[munge('Script_Extensions')]['id']
+
+        h_file.write('''
+#define RE_PROP_GC 0x{:X}
+#define RE_PROP_CASED 0x{:X}
+#define RE_PROP_UPPERCASE 0x{:X}
+#define RE_PROP_LOWERCASE 0x{:X}
+#define RE_PROP_SCX 0x{:X}
+
+'''.format(gc_id, cased_id, upper_id, lower_id, scx_id))
+
+        gc_values = properties[munge('General_Category')]['values']
+        group_names = set('C L M N P S Z Assigned Cased_Letter'.split())
+
+        names = set(gc_values) & set(munge(name) for name in group_names)
+
+        for name in sorted(names, key=lambda name: gc_values[name]['id']):
+            h_file.write('#define RE_PROP_{} {}\n'.format(name,
+              gc_values[name]['id']))
+
+        h_file.write('\n')
+
+        val_list = []
+        masks = {}
+
+        for name in gc_values:
+            if len(name) != 2 or not name.isalpha():
+                continue
+
+            if not gc_values[name].get('codepoints'):
+                continue
+
+            val_id = gc_values[name]['id']
+            val_list.append((val_id, name))
+            masks.setdefault(name[0], 0)
+            masks[name[0]] |= 1 << val_id
+
+        for val_id, name in sorted(val_list):
+            h_file.write('#define RE_PROP_{} {}\n'.format(name, val_id))
+
+        h_file.write('\n')
+
+        for name, mask in sorted(masks.items()):
+            h_file.write('#define RE_PROP_{}_MASK 0x{:08X}\n'.format(name,
+              mask))
+
+        h_file.write('\n')
+
+        common = '''
+            Alnum Alpha Any Ascii Blank Cntrl Digit Graph Lower Print Space
+            Upper Word Xdigit Posix_Alnum Posix_Digit Posix_Punct Posix_Xdigit
+        '''
+
+        for name in common.split():
+            property = properties.get(munge(name))
+
+            if property is not None:
+                h_file.write('#define RE_PROP_{} 0x{:06X}\n'.format(name.upper(),
+                  (property['id'] << 16) | 1))
+            else:
+                for prop_name in ['GC', 'Script', 'Block']:
+                    property = properties[munge(prop_name)]
+                    value = property['values'].get(munge(name))
+
+                    if value is not None:
+                        h_file.write('#define RE_PROP_{} 0x{:06X}\n'.format(name.upper(),
+                          (property['id'] << 16) | value['id']))
+                        break
+
+        h_file.write('\n')
+
+        val_list = unique(properties[munge('Word_Break')]['values'].values(),
+          key=id)
+        values = [(value['id'], value['names'][0]) for value in val_list]
+
+        for val_id, name in sorted(values):
+            h_file.write('#define RE_WBREAK_{} {}\n'.format(munge(name),
+              val_id))
+
+        h_file.write('\n')
+
+        val_list = unique(properties[munge('Grapheme_Cluster_Break')]['values'].values(),
+          key=id)
+        values = [(value['id'], value['names'][0]) for value in val_list]
+
+        for val_id, name in sorted(values):
+            h_file.write('#define RE_GBREAK_{} {}\n'.format(munge(name),
+              val_id))
+
+        h_file.write('\n')
+
+        val_list = unique(properties[munge('Line_Break')]['values'].values(),
+          key=id)
+        values = [(value['id'], value['names'][0]) for value in val_list]
+
+        for val_id, name in sorted(values):
+            h_file.write('#define RE_LBREAK_{} {}\n'.format(munge(name),
+              val_id))
+
+        h_file.write('\n')
+
+        h_file.write('extern char* re_strings[{}];\n'.format(unicode_data['string_count']))
+        h_file.write('extern RE_Property re_properties[{}];\n'.format(unicode_data['property_tablee_count']))
+        h_file.write('extern RE_PropertyValue re_property_values[{}];\n'.format(unicode_data['valueset_table_count']))
+        h_file.write('extern RE_UINT16 re_expand_on_folding[{}];\n'.format(unicode_data['expanded_count']))
+        h_file.write('extern RE_GetPropertyFunc re_get_property[{}];\n'.format(unicode_data['property_count']))
+
+        h_file.write('\n')
+
+        for property in prop_list:
+            prop_name = property['names'][0]
+
+            if prop_name == 'Script_Extensions':
+                h_file.write('int re_get_{}(RE_UINT32 codepoint, RE_UINT8* scripts);\n'.format(prop_name.lower()))
+            else:
+                h_file.write('RE_UINT32 re_get_{}(RE_UINT32 codepoint);\n'.format(prop_name.lower()))
+
+        h_file.write('int re_get_all_cases(RE_UINT32 codepoint, RE_UINT32* cases);\n')
+        h_file.write('RE_UINT32 re_get_simple_case_folding(RE_UINT32 codepoint);\n')
+        h_file.write('int re_get_full_case_folding(RE_UINT32 codepoint, RE_UINT32* folded);\n')
+
+# Whether to update the Unicode data files from the Unicode website.
+UNICODE_VERSION = '13.0.0'
+
+# The URL from which the Unicode data files can be obtained.
+unicode_data_base = 'http://www.unicode.org/Public/UNIDATA/'
+
+NUM_CODEPOINTS = 0x110000
+
+# The Unicode data files. The file names are relative to the website URL.
+unicode_data_files = '''
+[aliases]
+PropertyAliases.txt
+PropertyValueAliases.txt
+[binary]
+PropList.txt
+extracted/DerivedBinaryProperties.txt
+DerivedCoreProperties.txt
+[emoji]
+emoji/emoji-data.txt
+[normalisation]
+DerivedNormalizationProps.txt
+[multivalue]
+auxiliary/GraphemeBreakProperty.txt
+auxiliary/SentenceBreakProperty.txt
+auxiliary/WordBreakProperty.txt
+Blocks.txt
+extracted/DerivedBidiClass.txt
+extracted/DerivedCombiningClass.txt
+extracted/DerivedDecompositionType.txt
+extracted/DerivedEastAsianWidth.txt
+extracted/DerivedGeneralCategory.txt
+extracted/DerivedJoiningGroup.txt
+extracted/DerivedJoiningType.txt
+extracted/DerivedLineBreak.txt
+extracted/DerivedNumericType.txt
+HangulSyllableType.txt
+IndicPositionalCategory.txt
+IndicSyllabicCategory.txt
+Scripts.txt
+[numeric_values]
+extracted/DerivedNumericValues.txt
+[case_folding]
+CaseFolding.txt
+[script_extensions]
+ScriptExtensions.txt
+'''
+
+data_files = {}
+section = ''
+
+for line in unicode_data_files.splitlines():
+    if line[ : 1] + line[-1 : ] == '[]':
+        section = line[1 : -1]
+    elif line:
+        data_files.setdefault(section, []).append(line)
+
+# The generated C files will be written into this folder.
+tools_folder = dirname(__file__)
+
+# The local folder in which the Unicode data files are stored.
+data_folder = join(tools_folder, 'unicode_data')
+
+with suppress(FileExistsError):
+    mkdir(data_folder)
+
+download_unicode_files(unicode_data_base, data_files, data_folder)
+
+unicode_data = parse_unicode_files(data_files, data_folder)
+make_additional_properties(unicode_data)
+write_summary(unicode_data, tools_folder)
+
+binary_dict = make_binary_dict()
+
+generate_code(unicode_data, tools_folder)
+
+print('\nFinished!')
-- 
GitLab