Removed need for GNU Libidn, included simple stringprep from libidn
authorPekka Riikonen <priikone@silcnet.org>
Wed, 6 Apr 2005 09:07:11 +0000 (09:07 +0000)
committerPekka Riikonen <priikone@silcnet.org>
Wed, 6 Apr 2005 09:07:11 +0000 (09:07 +0000)
to lib/contrib.

CHANGES
INSTALL
configure.in.pre
includes/silcincludes.h.in
lib/contrib/Makefile.am
lib/contrib/nfkc.c [new file with mode: 0644]
lib/contrib/rfc3454.c [new file with mode: 0644]
lib/contrib/stringprep.c [new file with mode: 0644]
lib/contrib/stringprep.h [new file with mode: 0644]
win32/libsilc/libsilc.def

diff --git a/CHANGES b/CHANGES
index e9de1f11d0a97d00e21ffe1749186a2d25bd888c..1b555aac3ed8f231c62f800eb2de0bf333d53ef8 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -3,6 +3,10 @@ Wed Apr  6 09:10:31 CEST 2005  Pekka Riikonen <priikone@silcnet.org>
        * Added pkg-config .pc file creation for silc core library
          and silcclient library.  A patch by c0ffee.
 
+       * Removed the need for GNU Libidn.  Added the simple stringprep
+         from libidn into lib/contrib/.  It is now used also on Windows
+         build.
+
 Mon Apr  4 15:15:46 EEST 2005  Pekka Riikonen <priikone@silcnet.org>
 
        * Simplified the invite and ban string handling in the
diff --git a/INSTALL b/INSTALL
index acfbb37f9ac9a75d1f9407f1f39a48cb8938a2c4..a6c12c0799ed300ab3ffda11b0aa68bcd350d49a 100644 (file)
--- a/INSTALL
+++ b/INSTALL
@@ -32,15 +32,7 @@ path in your system which contains lib/ and include/ for GMP library.
 GMP can be used as a fall-back if you have problems with the MPI library
 included within this package.
 
-'--with-libidn[=DIR]'
-
-   The SILC requires GNU Libidn for the stringprep() function.  If your
-system does not have it installed by default you will need to install it
-and possibly give this option to specify its location.  The DIR is the
-upper path in your system which contains lib/ and include/ for libidn
-(e.g. /usr/local).
-
-'--with-iconv[=DIR]'
+`--with-iconv[=DIR]'
 
    If your system doesn't provide iconv() function in its native libraries
 (usually libc) or if this function is broken (e.g. older Solaris systems),
index ae0645bdabc1f1844c4eb042488b06c3bef939c4..d1e6a379961b3c0bc353142d29f1ee1d6d76ffc2 100644 (file)
@@ -56,7 +56,6 @@ AC_DEFINE(SILC_DIST_DEFINE)
 
 __SILC_HAVE_PTHREAD=""
 __SILC_HAVE_SIM=""
-__SILC_HAVE_LIBIDN=""
 __SILC_ENABLE_DEBUG=""
 
 #
@@ -681,146 +680,6 @@ if test x$mp_gmp = xfalse; then
 fi
 
 
-# GNU Libidn (for stringprep) support
-#
-check_libidn=true
-has_libidn=false
-SAVE_LIBS="$LIBS"
-SAVE_CFLAGS="$CFLAGS"
-SAVE_LDFLAGS="$LDFLAGS"
-SAVE_CPPFLAGS="$CPPFLAGS"
-AC_MSG_CHECKING(whether to implicit search for libidn)
-AC_ARG_WITH(libidn,
-  [[  --with-libidn[=DIR]     use libidn [search in DIR/include and DIR/lib]]],
-  [
-    case "${withval}" in
-      no)
-        AC_MSG_RESULT(no)
-        AC_CHECK_HEADERS(stringprep.h,
-          [
-            AC_CHECK_FUNC(stringprep, has_libidn=true)
-          ])
-        check_libidn=false
-        ;;
-      *)
-        AC_MSG_RESULT(yes)
-        if test -d $withval/include; then
-          CPPFLAGS="$CPPFLAGS -I$withval/include"
-          CFLAGS="$CFLAGS -I$withval/include"
-        fi
-        if test -d $withval/lib; then
-          LDFLAGS="$LDFLAGS -L$withval/lib"
-        fi
-        ;;
-    esac
-  ],
-  [
-    AC_MSG_RESULT(no)
-    AC_CHECK_HEADERS(stringprep.h,
-      [
-        AC_CHECK_FUNCS(stringprep,
-          [
-            has_libidn=true
-            check_libidn=false
-          ])
-      ])
-  ])
-
-if test x$check_libidn = xtrue; then
-  AC_MSG_RESULT(Searching for libidn...)
-
-  AC_CHECK_HEADERS(stringprep.h,
-    [
-      LIBS="$LIBS -lidn"
-      AC_MSG_CHECKING(for stringprep in -lidn)
-      AC_TRY_LINK(
-        [
-          #include <stdlib.h>
-          #include <stringprep.h>
-        ],
-        [
-         (void)stringprep_locale_charset();
-        ],
-        [
-          echo "yes"
-          AC_DEFINE(HAVE_LIBIDN, 1, [Define if you have the stringprep() function.])
-          has_libidn=true
-          check_libidn=false
-        ],
-        [
-          echo "no"
-          LIBS="$SAVE_LIBS"
-          CFLAGS="$SAVE_CFLAGS"
-          LDFLAGS="$SAVE_LDFLAGS"
-          CPPFLAGS="$SAVE_CPPFLAGS"
-        ])
-     ])
-fi
-
-if test x$check_libidn = xtrue; then
-  # search for idn library..
-  SAVE_LIBS="$LIBS"
-  SAVE_CFLAGS="$CFLAGS"
-  SAVE_LDFLAGS="$LDFLAGS"
-  SAVE_CPPFLAGS="$CPPFLAGS"
-
-  for dir in `echo "/usr/local /usr/pkg /usr/contrib"`; do
-    if test x$has_libidn = xfalse; then
-      AC_MSG_RESULT(searching in $dir...)
-
-      if test -d $dir/include; then
-        CPPFLAGS="$CPPFLAGS -I$dir/include"
-        CFLAGS="$CFLAGS -I$dir/include"
-      fi
-      if test -d $dir/lib; then
-        LDFLAGS="$LDFLAGS -L$dir/lib"
-      fi
-
-      # XXX
-      unset ac_cv_header__stringprep_h_ ac_cv_header_stringprep_h || true
-
-      AC_CHECK_HEADERS(stringprep.h,
-        [
-          LIBS="$LIBS -lidn"
-          AC_MSG_CHECKING(for stringprep in -lidn)
-          AC_TRY_LINK(
-            [
-              #include <stdlib.h>
-              #include <stringprep.h>
-            ],
-            [
-             (void)stringprep_locale_charset();
-            ],
-            [
-              echo "yes"
-              has_libidn=true
-              AC_DEFINE(HAVE_LIBIDN, 1, [Define if you have the stringprep() function.])
-            ],
-            [
-              echo "no"
-              has_libidn=false
-
-              LIBS="$SAVE_LIBS"
-              CFLAGS="$SAVE_CFLAGS"
-              LDFLAGS="$SAVE_LDFLAGS"
-              CPPFLAGS="$SAVE_CPPFLAGS"
-            ])
-         ],
-         [
-           CFLAGS="$SAVE_CFLAGS"
-           LDFLAGS="$SAVE_LDFLAGS"
-           CPPFLAGS="$SAVE_CPPFLAGS"
-         ])
-      fi
-    done
-fi
-
-if test x$has_libidn = xtrue; then
-  __SILC_HAVE_LIBIDN="#define __SILC_HAVE_LIBIDN 1"
-else
-  AC_MSG_ERROR(Could not locate libidn.  GNU Libidn is required to compile SILC)
-fi
-
 # iconv support
 #
 check_iconv=true
@@ -1251,7 +1110,6 @@ AM_CONDITIONAL(SILC_LIBTOOLFIX, test x$libtoolfix = xtrue)
 
 AC_SUBST(__SILC_HAVE_PTHREAD)
 AC_SUBST(__SILC_HAVE_SIM)
-AC_SUBST(__SILC_HAVE_LIBIDN)
 AC_SUBST(__SILC_ENABLE_DEBUG)
 
 #
@@ -1357,15 +1215,9 @@ if test x$has_iconv = xfalse; then
 else
   iconv_support="yes"
 fi
-if test x$has_libidn = xfalse; then
-  libidn_support="no"
-else
-  libidn_support="yes"
-fi
 echo " SIM support ...................: $sim_support"
 echo " IPv6 support ..................: $summary_ipv6"
 echo " Iconv support .................: $iconv_support"
-echo " Idn support ...................: $libidn_support"
 if test x$want_asm = xfalse; then
   summary_asm="no"
 else
index e52fcc02f55b90ee8ca24aaa34afa402838f9f99..6752ce062bd1a493262bc2971aee71131727dc71 100644 (file)
@@ -80,7 +80,6 @@ extern "C" {
 /* Compilation time defines, for third-party software */
 @__SILC_HAVE_PTHREAD@
 @__SILC_HAVE_SIM@
-@__SILC_HAVE_LIBIDN@
 @__SILC_ENABLE_DEBUG@
 
 #if defined(HAVE_SILCDEFS_H)
index 6386103e45e42a81804bd2284133a75fa7a7d374..e204a5f82a78b8a0d3616fbccaacd094e0833f07 100644 (file)
@@ -1,14 +1,13 @@
 #
 #  Makefile.am
 #
-#  Author: Pekka Riikonen <priikone@poseidon.pspt.fi>
+#  Author: Pekka Riikonen <priikone@silcnet.org>
 #
-#  Copyright (C) 2000 Pekka Riikonen
+#  Copyright (C) 2000 - 2005 Pekka Riikonen
 #
 #  This program is free software; you can redistribute it and/or modify
 #  it under the terms of the GNU General Public License as published by
-#  the Free Software Foundation; either version 2 of the License, or
-#  (at your option) any later version.
+#  the Free Software Foundation; version 2 of the License.
 #
 #  This program is distributed in the hope that it will be useful,
 #  but WITHOUT ANY WARRANTY; without even the implied warranty of
 
 AUTOMAKE_OPTIONS = 1.0 no-dependencies foreign
 
-if HAVE_GETOPT_LONG
-if HAVE_REGEX
-noinst_LTLIBRARIES =
-else
-noinst_LTLIBRARIES = libcontrib.la
-endif
-else
 noinst_LTLIBRARIES = libcontrib.la
-endif
-
 
 if HAVE_GETOPT_LONG
 GETOPT =
@@ -44,13 +34,7 @@ endif
 if SILC_WIN32
 libcontrib_la_SOURCES =
 else
-libcontrib_la_SOURCES = \
-       $(GETOPT) \
-       $(REGEX)
-endif
-
-if SILC_DIST_TOOLKIT
-include_HEADERS = getopt.h regex.h
+libcontrib_la_SOURCES = nfkc.c rfc3454.c stringprep.c $(GETOPT) $(REGEX)
 endif
 
 EXTRA_DIST = *.c *.h
diff --git a/lib/contrib/nfkc.c b/lib/contrib/nfkc.c
new file mode 100644 (file)
index 0000000..e5eb4d0
--- /dev/null
@@ -0,0 +1,1054 @@
+/* nfkc.c      Unicode normalization utilities.
+ * Copyright (C) 2002, 2003, 2004, 2005  Simon Josefsson
+ *
+ * This file is part of GNU Libidn.
+ *
+ * GNU Libidn is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * GNU Libidn is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with GNU Libidn; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ */
+
+#include <stdlib.h>
+#include <string.h>
+
+#include "stringprep.h"
+
+/* This file contains functions from GLIB, including gutf8.c and
+ * gunidecomp.c, all licensed under LGPL and copyright hold by:
+ *
+ *  Copyright (C) 1999, 2000 Tom Tromey
+ *  Copyright 2000 Red Hat, Inc.
+ */
+
+/* Hacks to make syncing with GLIB code easier. */
+#define gboolean int
+#define gchar char
+#define guchar unsigned char
+#define glong long
+#define gint int
+#define guint unsigned int
+#define gushort unsigned short
+#define gint16 int16_t
+#define guint16 uint16_t
+#define gunichar uint32_t
+#define gsize size_t
+#define gssize ssize_t
+#define g_malloc malloc
+#define g_free free
+#define GError void
+#define g_set_error(a,b,c,d) ((void) 0)
+#define g_new(struct_type, n_structs)                                  \
+  ((struct_type *) g_malloc (((gsize) sizeof (struct_type)) * ((gsize) (n_structs))))
+#  if defined (__GNUC__) && !defined (__STRICT_ANSI__) && !defined (__cplusplus)
+#    define G_STMT_START       (void)(
+#    define G_STMT_END         )
+#  else
+#    if (defined (sun) || defined (__sun__))
+#      define G_STMT_START     if (1)
+#      define G_STMT_END       else (void)0
+#    else
+#      define G_STMT_START     do
+#      define G_STMT_END       while (0)
+#    endif
+#  endif
+#define g_return_val_if_fail(expr,val)         G_STMT_START{ (void)0; }G_STMT_END
+#define G_N_ELEMENTS(arr)              (sizeof (arr) / sizeof ((arr)[0]))
+#define TRUE 1
+#define FALSE 0
+
+/* Code from GLIB gunicode.h starts here. */
+
+typedef enum
+{
+  G_NORMALIZE_DEFAULT,
+  G_NORMALIZE_NFD = G_NORMALIZE_DEFAULT,
+  G_NORMALIZE_DEFAULT_COMPOSE,
+  G_NORMALIZE_NFC = G_NORMALIZE_DEFAULT_COMPOSE,
+  G_NORMALIZE_ALL,
+  G_NORMALIZE_NFKD = G_NORMALIZE_ALL,
+  G_NORMALIZE_ALL_COMPOSE,
+  G_NORMALIZE_NFKC = G_NORMALIZE_ALL_COMPOSE
+}
+GNormalizeMode;
+
+/* Code from GLIB gutf8.c starts here. */
+
+#define UTF8_COMPUTE(Char, Mask, Len)          \
+  if (Char < 128)                              \
+    {                                          \
+      Len = 1;                                 \
+      Mask = 0x7f;                             \
+    }                                          \
+  else if ((Char & 0xe0) == 0xc0)              \
+    {                                          \
+      Len = 2;                                 \
+      Mask = 0x1f;                             \
+    }                                          \
+  else if ((Char & 0xf0) == 0xe0)              \
+    {                                          \
+      Len = 3;                                 \
+      Mask = 0x0f;                             \
+    }                                          \
+  else if ((Char & 0xf8) == 0xf0)              \
+    {                                          \
+      Len = 4;                                 \
+      Mask = 0x07;                             \
+    }                                          \
+  else if ((Char & 0xfc) == 0xf8)              \
+    {                                          \
+      Len = 5;                                 \
+      Mask = 0x03;                             \
+    }                                          \
+  else if ((Char & 0xfe) == 0xfc)              \
+    {                                          \
+      Len = 6;                                 \
+      Mask = 0x01;                             \
+    }                                          \
+  else                                         \
+    Len = -1;
+
+#define UTF8_LENGTH(Char)                      \
+  ((Char) < 0x80 ? 1 :                         \
+   ((Char) < 0x800 ? 2 :                       \
+    ((Char) < 0x10000 ? 3 :                    \
+     ((Char) < 0x200000 ? 4 :                  \
+      ((Char) < 0x4000000 ? 5 : 6)))))
+
+
+#define UTF8_GET(Result, Chars, Count, Mask, Len)      \
+  (Result) = (Chars)[0] & (Mask);                      \
+  for ((Count) = 1; (Count) < (Len); ++(Count))                \
+    {                                                  \
+      if (((Chars)[(Count)] & 0xc0) != 0x80)           \
+       {                                               \
+         (Result) = -1;                                \
+         break;                                        \
+       }                                               \
+      (Result) <<= 6;                                  \
+      (Result) |= ((Chars)[(Count)] & 0x3f);           \
+    }
+
+#define UNICODE_VALID(Char)                    \
+  ((Char) < 0x110000 &&                                \
+   (((Char) & 0xFFFFF800) != 0xD800) &&                \
+   ((Char) < 0xFDD0 || (Char) > 0xFDEF) &&     \
+   ((Char) & 0xFFFE) != 0xFFFE)
+
+
+static const gchar utf8_skip_data[256] = {
+  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+  1, 1, 1, 1, 1, 1, 1,
+  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+  1, 1, 1, 1, 1, 1, 1,
+  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+  1, 1, 1, 1, 1, 1, 1,
+  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+  1, 1, 1, 1, 1, 1, 1,
+  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+  1, 1, 1, 1, 1, 1, 1,
+  1, 1, 1, 1, 1, 1, 1, 1, 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, 4, 4, 4, 4, 4, 4, 4, 4, 5,
+  5, 5, 5, 6, 6, 1, 1
+};
+
+static const gchar *const g_utf8_skip = utf8_skip_data;
+
+#define g_utf8_next_char(p) (char *)((p) + g_utf8_skip[*(guchar *)(p)])
+
+/*
+ * g_utf8_strlen:
+ * @p: pointer to the start of a UTF-8 encoded string.
+ * @max: the maximum number of bytes to examine. If @max
+ *       is less than 0, then the string is assumed to be
+ *       nul-terminated. If @max is 0, @p will not be examined and
+ *       may be %NULL.
+ *
+ * Returns the length of the string in characters.
+ *
+ * Return value: the length of the string in characters
+ **/
+static glong
+g_utf8_strlen (const gchar * p, gssize max)
+{
+  glong len = 0;
+  const gchar *start = p;
+  g_return_val_if_fail (p != NULL || max == 0, 0);
+
+  if (max < 0)
+    {
+      while (*p)
+       {
+         p = g_utf8_next_char (p);
+         ++len;
+       }
+    }
+  else
+    {
+      if (max == 0 || !*p)
+       return 0;
+
+      p = g_utf8_next_char (p);
+
+      while (p - start < max && *p)
+       {
+         ++len;
+         p = g_utf8_next_char (p);
+       }
+
+      /* only do the last len increment if we got a complete
+       * char (don't count partial chars)
+       */
+      if (p - start == max)
+       ++len;
+    }
+
+  return len;
+}
+
+/*
+ * g_utf8_get_char:
+ * @p: a pointer to Unicode character encoded as UTF-8
+ *
+ * Converts a sequence of bytes encoded as UTF-8 to a Unicode character.
+ * If @p does not point to a valid UTF-8 encoded character, results are
+ * undefined. If you are not sure that the bytes are complete
+ * valid Unicode characters, you should use g_utf8_get_char_validated()
+ * instead.
+ *
+ * Return value: the resulting character
+ **/
+static gunichar
+g_utf8_get_char (const gchar * p)
+{
+  int i, mask = 0, len;
+  gunichar result;
+  unsigned char c = (unsigned char) *p;
+
+  UTF8_COMPUTE (c, mask, len);
+  if (len == -1)
+    return (gunichar) - 1;
+  UTF8_GET (result, p, i, mask, len);
+
+  return result;
+}
+
+/*
+ * g_unichar_to_utf8:
+ * @c: a ISO10646 character code
+ * @outbuf: output buffer, must have at least 6 bytes of space.
+ *       If %NULL, the length will be computed and returned
+ *       and nothing will be written to @outbuf.
+ *
+ * Converts a single character to UTF-8.
+ *
+ * Return value: number of bytes written
+ **/
+static int
+g_unichar_to_utf8 (gunichar c, gchar * outbuf)
+{
+  guint len = 0;
+  int first;
+  int i;
+
+  if (c < 0x80)
+    {
+      first = 0;
+      len = 1;
+    }
+  else if (c < 0x800)
+    {
+      first = 0xc0;
+      len = 2;
+    }
+  else if (c < 0x10000)
+    {
+      first = 0xe0;
+      len = 3;
+    }
+  else if (c < 0x200000)
+    {
+      first = 0xf0;
+      len = 4;
+    }
+  else if (c < 0x4000000)
+    {
+      first = 0xf8;
+      len = 5;
+    }
+  else
+    {
+      first = 0xfc;
+      len = 6;
+    }
+
+  if (outbuf)
+    {
+      for (i = len - 1; i > 0; --i)
+       {
+         outbuf[i] = (c & 0x3f) | 0x80;
+         c >>= 6;
+       }
+      outbuf[0] = c | first;
+    }
+
+  return len;
+}
+
+/*
+ * g_utf8_to_ucs4_fast:
+ * @str: a UTF-8 encoded string
+ * @len: the maximum length of @str to use. If @len < 0, then
+ *       the string is nul-terminated.
+ * @items_written: location to store the number of characters in the
+ *                 result, or %NULL.
+ *
+ * Convert a string from UTF-8 to a 32-bit fixed width
+ * representation as UCS-4, assuming valid UTF-8 input.
+ * This function is roughly twice as fast as g_utf8_to_ucs4()
+ * but does no error checking on the input.
+ *
+ * Return value: a pointer to a newly allocated UCS-4 string.
+ *               This value must be freed with g_free().
+ **/
+static gunichar *
+g_utf8_to_ucs4_fast (const gchar * str, glong len, glong * items_written)
+{
+  gint j, charlen;
+  gunichar *result;
+  gint n_chars, i;
+  const gchar *p;
+
+  g_return_val_if_fail (str != NULL, NULL);
+
+  p = str;
+  n_chars = 0;
+  if (len < 0)
+    {
+      while (*p)
+       {
+         p = g_utf8_next_char (p);
+         ++n_chars;
+       }
+    }
+  else
+    {
+      while (p < str + len && *p)
+       {
+         p = g_utf8_next_char (p);
+         ++n_chars;
+       }
+    }
+
+  result = g_new (gunichar, n_chars + 1);
+  if (!result)
+    return NULL;
+
+  p = str;
+  for (i = 0; i < n_chars; i++)
+    {
+      gunichar wc = ((unsigned char *) p)[0];
+
+      if (wc < 0x80)
+       {
+         result[i] = wc;
+         p++;
+       }
+      else
+       {
+         if (wc < 0xe0)
+           {
+             charlen = 2;
+             wc &= 0x1f;
+           }
+         else if (wc < 0xf0)
+           {
+             charlen = 3;
+             wc &= 0x0f;
+           }
+         else if (wc < 0xf8)
+           {
+             charlen = 4;
+             wc &= 0x07;
+           }
+         else if (wc < 0xfc)
+           {
+             charlen = 5;
+             wc &= 0x03;
+           }
+         else
+           {
+             charlen = 6;
+             wc &= 0x01;
+           }
+
+         for (j = 1; j < charlen; j++)
+           {
+             wc <<= 6;
+             wc |= ((unsigned char *) p)[j] & 0x3f;
+           }
+
+         result[i] = wc;
+         p += charlen;
+       }
+    }
+  result[i] = 0;
+
+  if (items_written)
+    *items_written = i;
+
+  return result;
+}
+
+/*
+ * g_ucs4_to_utf8:
+ * @str: a UCS-4 encoded string
+ * @len: the maximum length of @str to use. If @len < 0, then
+ *       the string is terminated with a 0 character.
+ * @items_read: location to store number of characters read read, or %NULL.
+ * @items_written: location to store number of bytes written or %NULL.
+ *                 The value here stored does not include the trailing 0
+ *                 byte.
+ * @error: location to store the error occuring, or %NULL to ignore
+ *         errors. Any of the errors in #GConvertError other than
+ *         %G_CONVERT_ERROR_NO_CONVERSION may occur.
+ *
+ * Convert a string from a 32-bit fixed width representation as UCS-4.
+ * to UTF-8. The result will be terminated with a 0 byte.
+ *
+ * Return value: a pointer to a newly allocated UTF-8 string.
+ *               This value must be freed with g_free(). If an
+ *               error occurs, %NULL will be returned and
+ *               @error set.
+ **/
+static gchar *
+g_ucs4_to_utf8 (const gunichar * str,
+               glong len,
+               glong * items_read, glong * items_written, GError ** error)
+{
+  gint result_length;
+  gchar *result = NULL;
+  gchar *p;
+  gint i;
+
+  result_length = 0;
+  for (i = 0; len < 0 || i < len; i++)
+    {
+      if (!str[i])
+       break;
+
+      if (str[i] >= 0x80000000)
+       {
+         if (items_read)
+           *items_read = i;
+
+         g_set_error (error, G_CONVERT_ERROR,
+                      G_CONVERT_ERROR_ILLEGAL_SEQUENCE,
+                      _("Character out of range for UTF-8"));
+         goto err_out;
+       }
+
+      result_length += UTF8_LENGTH (str[i]);
+    }
+
+  result = g_malloc (result_length + 1);
+  if (!result)
+    return NULL;
+  p = result;
+
+  i = 0;
+  while (p < result + result_length)
+    p += g_unichar_to_utf8 (str[i++], p);
+
+  *p = '\0';
+
+  if (items_written)
+    *items_written = p - result;
+
+err_out:
+  if (items_read)
+    *items_read = i;
+
+  return result;
+}
+
+/* Code from GLIB gunidecomp.c starts here. */
+
+#include "gunidecomp.h"
+#include "gunicomp.h"
+
+#define CC_PART1(Page, Char) \
+  ((combining_class_table_part1[Page] >= G_UNICODE_MAX_TABLE_INDEX) \
+   ? (combining_class_table_part1[Page] - G_UNICODE_MAX_TABLE_INDEX) \
+   : (cclass_data[combining_class_table_part1[Page]][Char]))
+
+#define CC_PART2(Page, Char) \
+  ((combining_class_table_part2[Page] >= G_UNICODE_MAX_TABLE_INDEX) \
+   ? (combining_class_table_part2[Page] - G_UNICODE_MAX_TABLE_INDEX) \
+   : (cclass_data[combining_class_table_part2[Page]][Char]))
+
+#define COMBINING_CLASS(Char) \
+  (((Char) <= G_UNICODE_LAST_CHAR_PART1) \
+   ? CC_PART1 ((Char) >> 8, (Char) & 0xff) \
+   : (((Char) >= 0xe0000 && (Char) <= G_UNICODE_LAST_CHAR) \
+      ? CC_PART2 (((Char) - 0xe0000) >> 8, (Char) & 0xff) \
+      : 0))
+
+/* constants for hangul syllable [de]composition */
+#define SBase 0xAC00
+#define LBase 0x1100
+#define VBase 0x1161
+#define TBase 0x11A7
+#define LCount 19
+#define VCount 21
+#define TCount 28
+#define NCount (VCount * TCount)
+#define SCount (LCount * NCount)
+
+/*
+ * g_unicode_canonical_ordering:
+ * @string: a UCS-4 encoded string.
+ * @len: the maximum length of @string to use.
+ *
+ * Computes the canonical ordering of a string in-place.
+ * This rearranges decomposed characters in the string
+ * according to their combining classes.  See the Unicode
+ * manual for more information.
+ **/
+static void
+g_unicode_canonical_ordering (gunichar * string, gsize len)
+{
+  gsize i;
+  int swap = 1;
+
+  while (swap)
+    {
+      int last;
+      swap = 0;
+      last = COMBINING_CLASS (string[0]);
+      for (i = 0; i < len - 1; ++i)
+       {
+         int next = COMBINING_CLASS (string[i + 1]);
+         if (next != 0 && last > next)
+           {
+             gsize j;
+             /* Percolate item leftward through string.  */
+             for (j = i + 1; j > 0; --j)
+               {
+                 gunichar t;
+                 if (COMBINING_CLASS (string[j - 1]) <= next)
+                   break;
+                 t = string[j];
+                 string[j] = string[j - 1];
+                 string[j - 1] = t;
+                 swap = 1;
+               }
+             /* We're re-entering the loop looking at the old
+                character again.  */
+             next = last;
+           }
+         last = next;
+       }
+    }
+}
+
+/* http://www.unicode.org/unicode/reports/tr15/#Hangul
+ * r should be null or have sufficient space. Calling with r == NULL will
+ * only calculate the result_len; however, a buffer with space for three
+ * characters will always be big enough. */
+static void
+decompose_hangul (gunichar s, gunichar * r, gsize * result_len)
+{
+  gint SIndex = s - SBase;
+
+  /* not a hangul syllable */
+  if (SIndex < 0 || SIndex >= SCount)
+    {
+      if (r)
+       r[0] = s;
+      *result_len = 1;
+    }
+  else
+    {
+      gunichar L = LBase + SIndex / NCount;
+      gunichar V = VBase + (SIndex % NCount) / TCount;
+      gunichar T = TBase + SIndex % TCount;
+
+      if (r)
+       {
+         r[0] = L;
+         r[1] = V;
+       }
+
+      if (T != TBase)
+       {
+         if (r)
+           r[2] = T;
+         *result_len = 3;
+       }
+      else
+       *result_len = 2;
+    }
+}
+
+/* returns a pointer to a null-terminated UTF-8 string */
+static const gchar *
+find_decomposition (gunichar ch, gboolean compat)
+{
+  int start = 0;
+  int end = G_N_ELEMENTS (decomp_table);
+
+  if (ch >= decomp_table[start].ch && ch <= decomp_table[end - 1].ch)
+    {
+      while (TRUE)
+       {
+         int half = (start + end) / 2;
+         if (ch == decomp_table[half].ch)
+           {
+             int offset;
+
+             if (compat)
+               {
+                 offset = decomp_table[half].compat_offset;
+                 if (offset == G_UNICODE_NOT_PRESENT_OFFSET)
+                   offset = decomp_table[half].canon_offset;
+               }
+             else
+               {
+                 offset = decomp_table[half].canon_offset;
+                 if (offset == G_UNICODE_NOT_PRESENT_OFFSET)
+                   return NULL;
+               }
+
+             return &(decomp_expansion_string[offset]);
+           }
+         else if (half == start)
+           break;
+         else if (ch > decomp_table[half].ch)
+           start = half;
+         else
+           end = half;
+       }
+    }
+
+  return NULL;
+}
+
+/* L,V => LV and LV,T => LVT  */
+static gboolean
+combine_hangul (gunichar a, gunichar b, gunichar * result)
+{
+  gint LIndex = a - LBase;
+  gint SIndex = a - SBase;
+
+  gint VIndex = b - VBase;
+  gint TIndex = b - TBase;
+
+  if (0 <= LIndex && LIndex < LCount && 0 <= VIndex && VIndex < VCount)
+    {
+      *result = SBase + (LIndex * VCount + VIndex) * TCount;
+      return TRUE;
+    }
+  else if (0 <= SIndex && SIndex < SCount && (SIndex % TCount) == 0
+          && 0 <= TIndex && TIndex <= TCount)
+    {
+      *result = a + TIndex;
+      return TRUE;
+    }
+
+  return FALSE;
+}
+
+#define CI(Page, Char) \
+  ((compose_table[Page] >= G_UNICODE_MAX_TABLE_INDEX) \
+   ? (compose_table[Page] - G_UNICODE_MAX_TABLE_INDEX) \
+   : (compose_data[compose_table[Page]][Char]))
+
+#define COMPOSE_INDEX(Char) \
+     ((((Char) >> 8) > (COMPOSE_TABLE_LAST)) ? 0 : CI((Char) >> 8, (Char) & 0xff))
+
+static gboolean
+combine (gunichar a, gunichar b, gunichar * result)
+{
+  gushort index_a, index_b;
+
+  if (combine_hangul (a, b, result))
+    return TRUE;
+
+  index_a = COMPOSE_INDEX (a);
+
+  if (index_a >= COMPOSE_FIRST_SINGLE_START && index_a < COMPOSE_SECOND_START)
+    {
+      if (b == compose_first_single[index_a - COMPOSE_FIRST_SINGLE_START][0])
+       {
+         *result =
+           compose_first_single[index_a - COMPOSE_FIRST_SINGLE_START][1];
+         return TRUE;
+       }
+      else
+       return FALSE;
+    }
+
+  index_b = COMPOSE_INDEX (b);
+
+  if (index_b >= COMPOSE_SECOND_SINGLE_START)
+    {
+      if (a ==
+         compose_second_single[index_b - COMPOSE_SECOND_SINGLE_START][0])
+       {
+         *result =
+           compose_second_single[index_b - COMPOSE_SECOND_SINGLE_START][1];
+         return TRUE;
+       }
+      else
+       return FALSE;
+    }
+
+  if (index_a >= COMPOSE_FIRST_START && index_a < COMPOSE_FIRST_SINGLE_START
+      && index_b >= COMPOSE_SECOND_START
+      && index_b < COMPOSE_SECOND_SINGLE_START)
+    {
+      gunichar res =
+       compose_array[index_a - COMPOSE_FIRST_START][index_b -
+                                                    COMPOSE_SECOND_START];
+
+      if (res)
+       {
+         *result = res;
+         return TRUE;
+       }
+    }
+
+  return FALSE;
+}
+
+static gunichar *
+_g_utf8_normalize_wc (const gchar * str, gssize max_len, GNormalizeMode mode)
+{
+  gsize n_wc;
+  gunichar *wc_buffer;
+  const char *p;
+  gsize last_start;
+  gboolean do_compat = (mode == G_NORMALIZE_NFKC || mode == G_NORMALIZE_NFKD);
+  gboolean do_compose = (mode == G_NORMALIZE_NFC || mode == G_NORMALIZE_NFKC);
+
+  n_wc = 0;
+  p = str;
+  while ((max_len < 0 || p < str + max_len) && *p)
+    {
+      const gchar *decomp;
+      gunichar wc = g_utf8_get_char (p);
+
+      if (wc >= 0xac00 && wc <= 0xd7af)
+       {
+         gsize result_len;
+         decompose_hangul (wc, NULL, &result_len);
+         n_wc += result_len;
+       }
+      else
+       {
+         decomp = find_decomposition (wc, do_compat);
+
+         if (decomp)
+           n_wc += g_utf8_strlen (decomp, -1);
+         else
+           n_wc++;
+       }
+
+      p = g_utf8_next_char (p);
+    }
+
+  wc_buffer = g_new (gunichar, n_wc + 1);
+  if (!wc_buffer)
+    return NULL;
+
+  last_start = 0;
+  n_wc = 0;
+  p = str;
+  while ((max_len < 0 || p < str + max_len) && *p)
+    {
+      gunichar wc = g_utf8_get_char (p);
+      const gchar *decomp;
+      int cc;
+      gsize old_n_wc = n_wc;
+
+      if (wc >= 0xac00 && wc <= 0xd7af)
+       {
+         gsize result_len;
+         decompose_hangul (wc, wc_buffer + n_wc, &result_len);
+         n_wc += result_len;
+       }
+      else
+       {
+         decomp = find_decomposition (wc, do_compat);
+
+         if (decomp)
+           {
+             const char *pd;
+             for (pd = decomp; *pd != '\0'; pd = g_utf8_next_char (pd))
+               wc_buffer[n_wc++] = g_utf8_get_char (pd);
+           }
+         else
+           wc_buffer[n_wc++] = wc;
+       }
+
+      if (n_wc > 0)
+       {
+         cc = COMBINING_CLASS (wc_buffer[old_n_wc]);
+
+         if (cc == 0)
+           {
+             g_unicode_canonical_ordering (wc_buffer + last_start,
+                                           n_wc - last_start);
+             last_start = old_n_wc;
+           }
+       }
+
+      p = g_utf8_next_char (p);
+    }
+
+  if (n_wc > 0)
+    {
+      g_unicode_canonical_ordering (wc_buffer + last_start,
+                                   n_wc - last_start);
+      last_start = n_wc;
+    }
+
+  wc_buffer[n_wc] = 0;
+
+  /* All decomposed and reordered */
+
+  if (do_compose && n_wc > 0)
+    {
+      gsize i, j;
+      int last_cc = 0;
+      last_start = 0;
+
+      for (i = 0; i < n_wc; i++)
+       {
+         int cc = COMBINING_CLASS (wc_buffer[i]);
+
+         if (i > 0 &&
+             (last_cc == 0 || last_cc != cc) &&
+             combine (wc_buffer[last_start], wc_buffer[i],
+                      &wc_buffer[last_start]))
+           {
+             for (j = i + 1; j < n_wc; j++)
+               wc_buffer[j - 1] = wc_buffer[j];
+             n_wc--;
+             i--;
+
+             if (i == last_start)
+               last_cc = 0;
+             else
+               last_cc = COMBINING_CLASS (wc_buffer[i - 1]);
+
+             continue;
+           }
+
+         if (cc == 0)
+           last_start = i;
+
+         last_cc = cc;
+       }
+    }
+
+  wc_buffer[n_wc] = 0;
+
+  return wc_buffer;
+}
+
+/*
+ * g_utf8_normalize:
+ * @str: a UTF-8 encoded string.
+ * @len: length of @str, in bytes, or -1 if @str is nul-terminated.
+ * @mode: the type of normalization to perform.
+ *
+ * Converts a string into canonical form, standardizing
+ * such issues as whether a character with an accent
+ * is represented as a base character and combining
+ * accent or as a single precomposed character. You
+ * should generally call g_utf8_normalize() before
+ * comparing two Unicode strings.
+ *
+ * The normalization mode %G_NORMALIZE_DEFAULT only
+ * standardizes differences that do not affect the
+ * text content, such as the above-mentioned accent
+ * representation. %G_NORMALIZE_ALL also standardizes
+ * the "compatibility" characters in Unicode, such
+ * as SUPERSCRIPT THREE to the standard forms
+ * (in this case DIGIT THREE). Formatting information
+ * may be lost but for most text operations such
+ * characters should be considered the same.
+ * For example, g_utf8_collate() normalizes
+ * with %G_NORMALIZE_ALL as its first step.
+ *
+ * %G_NORMALIZE_DEFAULT_COMPOSE and %G_NORMALIZE_ALL_COMPOSE
+ * are like %G_NORMALIZE_DEFAULT and %G_NORMALIZE_ALL,
+ * but returned a result with composed forms rather
+ * than a maximally decomposed form. This is often
+ * useful if you intend to convert the string to
+ * a legacy encoding or pass it to a system with
+ * less capable Unicode handling.
+ *
+ * Return value: a newly allocated string, that is the
+ *   normalized form of @str.
+ **/
+static gchar *
+g_utf8_normalize (const gchar * str, gssize len, GNormalizeMode mode)
+{
+  gunichar *result_wc = _g_utf8_normalize_wc (str, len, mode);
+  gchar *result;
+
+  result = g_ucs4_to_utf8 (result_wc, -1, NULL, NULL, NULL);
+  g_free (result_wc);
+
+  return result;
+}
+
+/* Public Libidn API starts here. */
+
+/**
+ * stringprep_utf8_to_unichar:
+ * @p: a pointer to Unicode character encoded as UTF-8
+ *
+ * Converts a sequence of bytes encoded as UTF-8 to a Unicode character.
+ * If @p does not point to a valid UTF-8 encoded character, results are
+ * undefined.
+ *
+ * Return value: the resulting character.
+ **/
+uint32_t
+stringprep_utf8_to_unichar (const char *p)
+{
+  return g_utf8_get_char (p);
+}
+
+/**
+ * stringprep_unichar_to_utf8:
+ * @c: a ISO10646 character code
+ * @outbuf: output buffer, must have at least 6 bytes of space.
+ *       If %NULL, the length will be computed and returned
+ *       and nothing will be written to @outbuf.
+ *
+ * Converts a single character to UTF-8.
+ *
+ * Return value: number of bytes written.
+ **/
+int
+stringprep_unichar_to_utf8 (uint32_t c, char *outbuf)
+{
+  return g_unichar_to_utf8 (c, outbuf);
+}
+
+/**
+ * stringprep_utf8_to_ucs4:
+ * @str: a UTF-8 encoded string
+ * @len: the maximum length of @str to use. If @len < 0, then
+ *       the string is nul-terminated.
+ * @items_written: location to store the number of characters in the
+ *                 result, or %NULL.
+ *
+ * Convert a string from UTF-8 to a 32-bit fixed width
+ * representation as UCS-4, assuming valid UTF-8 input.
+ * This function does no error checking on the input.
+ *
+ * Return value: a pointer to a newly allocated UCS-4 string.
+ *               This value must be freed with free().
+ **/
+uint32_t *
+stringprep_utf8_to_ucs4 (const char *str, ssize_t len, size_t * items_written)
+{
+  return g_utf8_to_ucs4_fast (str, (glong) len, (glong *) items_written);
+}
+
+/**
+ * stringprep_ucs4_to_utf8:
+ * @str: a UCS-4 encoded string
+ * @len: the maximum length of @str to use. If @len < 0, then
+ *       the string is terminated with a 0 character.
+ * @items_read: location to store number of characters read read, or %NULL.
+ * @items_written: location to store number of bytes written or %NULL.
+ *                 The value here stored does not include the trailing 0
+ *                 byte.
+ *
+ * Convert a string from a 32-bit fixed width representation as UCS-4.
+ * to UTF-8. The result will be terminated with a 0 byte.
+ *
+ * Return value: a pointer to a newly allocated UTF-8 string.
+ *               This value must be freed with free(). If an
+ *               error occurs, %NULL will be returned and
+ *               @error set.
+ **/
+char *
+stringprep_ucs4_to_utf8 (const uint32_t * str, ssize_t len,
+                        size_t * items_read, size_t * items_written)
+{
+  return g_ucs4_to_utf8 (str, len, (glong *) items_read,
+                        (glong *) items_written, NULL);
+}
+
+/**
+ * stringprep_utf8_nfkc_normalize:
+ * @str: a UTF-8 encoded string.
+ * @len: length of @str, in bytes, or -1 if @str is nul-terminated.
+ *
+ * Converts a string into canonical form, standardizing
+ * such issues as whether a character with an accent
+ * is represented as a base character and combining
+ * accent or as a single precomposed character.
+ *
+ * The normalization mode is NFKC (ALL COMPOSE).  It standardizes
+ * differences that do not affect the text content, such as the
+ * above-mentioned accent representation. It standardizes the
+ * "compatibility" characters in Unicode, such as SUPERSCRIPT THREE to
+ * the standard forms (in this case DIGIT THREE). Formatting
+ * information may be lost but for most text operations such
+ * characters should be considered the same. It returns a result with
+ * composed forms rather than a maximally decomposed form.
+ *
+ * Return value: a newly allocated string, that is the
+ *   NFKC normalized form of @str.
+ **/
+char *
+stringprep_utf8_nfkc_normalize (const char *str, ssize_t len)
+{
+  return g_utf8_normalize (str, len, G_NORMALIZE_NFKC);
+}
+
+/**
+ * stringprep_ucs4_nfkc_normalize:
+ * @str: a Unicode string.
+ * @len: length of @str array, or -1 if @str is nul-terminated.
+ *
+ * Converts UCS4 string into UTF-8 and runs
+ * stringprep_utf8_nfkc_normalize().
+ *
+ * Return value: a newly allocated Unicode string, that is the NFKC
+ *   normalized form of @str.
+ **/
+uint32_t *
+stringprep_ucs4_nfkc_normalize (uint32_t * str, ssize_t len)
+{
+  char *p;
+  uint32_t *result_wc;
+
+  p = stringprep_ucs4_to_utf8 (str, len, 0, 0);
+  result_wc = _g_utf8_normalize_wc (p, -1, G_NORMALIZE_NFKC);
+  free (p);
+
+  return result_wc;
+}
diff --git a/lib/contrib/rfc3454.c b/lib/contrib/rfc3454.c
new file mode 100644 (file)
index 0000000..99d1677
--- /dev/null
@@ -0,0 +1,3544 @@
+/* This file is automatically generated.  DO NOT EDIT!
+   Instead, edit gen-stringprep-tables.pl and re-run.  */
+
+#include "stringprep.h"
+
+/*
+ * A.1 Unassigned code points in Unicode 3.2
+ * 
+ */
+
+const Stringprep_table_element stringprep_rfc3454_A_1[] = {
+  { 0x000221           },                                            /* 0221 */
+  { 0x000234, 0x00024F },                                       /* 0234-024F */
+  { 0x0002AE, 0x0002AF },                                       /* 02AE-02AF */
+  { 0x0002EF, 0x0002FF },                                       /* 02EF-02FF */
+  { 0x000350, 0x00035F },                                       /* 0350-035F */
+  { 0x000370, 0x000373 },                                       /* 0370-0373 */
+  { 0x000376, 0x000379 },                                       /* 0376-0379 */
+  { 0x00037B, 0x00037D },                                       /* 037B-037D */
+  { 0x00037F, 0x000383 },                                       /* 037F-0383 */
+  { 0x00038B           },                                            /* 038B */
+  { 0x00038D           },                                            /* 038D */
+  { 0x0003A2           },                                            /* 03A2 */
+  { 0x0003CF           },                                            /* 03CF */
+  { 0x0003F7, 0x0003FF },                                       /* 03F7-03FF */
+  { 0x000487           },                                            /* 0487 */
+  { 0x0004CF           },                                            /* 04CF */
+  { 0x0004F6, 0x0004F7 },                                       /* 04F6-04F7 */
+  { 0x0004FA, 0x0004FF },                                       /* 04FA-04FF */
+  { 0x000510, 0x000530 },                                       /* 0510-0530 */
+  { 0x000557, 0x000558 },                                       /* 0557-0558 */
+  { 0x000560           },                                            /* 0560 */
+  { 0x000588           },                                            /* 0588 */
+  { 0x00058B, 0x000590 },                                       /* 058B-0590 */
+  { 0x0005A2           },                                            /* 05A2 */
+  { 0x0005BA           },                                            /* 05BA */
+  { 0x0005C5, 0x0005CF },                                       /* 05C5-05CF */
+  { 0x0005EB, 0x0005EF },                                       /* 05EB-05EF */
+  { 0x0005F5, 0x00060B },                                       /* 05F5-060B */
+  { 0x00060D, 0x00061A },                                       /* 060D-061A */
+  { 0x00061C, 0x00061E },                                       /* 061C-061E */
+  { 0x000620           },                                            /* 0620 */
+  { 0x00063B, 0x00063F },                                       /* 063B-063F */
+  { 0x000656, 0x00065F },                                       /* 0656-065F */
+  { 0x0006EE, 0x0006EF },                                       /* 06EE-06EF */
+  { 0x0006FF           },                                            /* 06FF */
+  { 0x00070E           },                                            /* 070E */
+  { 0x00072D, 0x00072F },                                       /* 072D-072F */
+  { 0x00074B, 0x00077F },                                       /* 074B-077F */
+  { 0x0007B2, 0x000900 },                                       /* 07B2-0900 */
+  { 0x000904           },                                            /* 0904 */
+  { 0x00093A, 0x00093B },                                       /* 093A-093B */
+  { 0x00094E, 0x00094F },                                       /* 094E-094F */
+  { 0x000955, 0x000957 },                                       /* 0955-0957 */
+  { 0x000971, 0x000980 },                                       /* 0971-0980 */
+  { 0x000984           },                                            /* 0984 */
+  { 0x00098D, 0x00098E },                                       /* 098D-098E */
+  { 0x000991, 0x000992 },                                       /* 0991-0992 */
+  { 0x0009A9           },                                            /* 09A9 */
+  { 0x0009B1           },                                            /* 09B1 */
+  { 0x0009B3, 0x0009B5 },                                       /* 09B3-09B5 */
+  { 0x0009BA, 0x0009BB },                                       /* 09BA-09BB */
+  { 0x0009BD           },                                            /* 09BD */
+  { 0x0009C5, 0x0009C6 },                                       /* 09C5-09C6 */
+  { 0x0009C9, 0x0009CA },                                       /* 09C9-09CA */
+  { 0x0009CE, 0x0009D6 },                                       /* 09CE-09D6 */
+  { 0x0009D8, 0x0009DB },                                       /* 09D8-09DB */
+  { 0x0009DE           },                                            /* 09DE */
+  { 0x0009E4, 0x0009E5 },                                       /* 09E4-09E5 */
+  { 0x0009FB, 0x000A01 },                                       /* 09FB-0A01 */
+  { 0x000A03, 0x000A04 },                                       /* 0A03-0A04 */
+  { 0x000A0B, 0x000A0E },                                       /* 0A0B-0A0E */
+  { 0x000A11, 0x000A12 },                                       /* 0A11-0A12 */
+  { 0x000A29           },                                            /* 0A29 */
+  { 0x000A31           },                                            /* 0A31 */
+  { 0x000A34           },                                            /* 0A34 */
+  { 0x000A37           },                                            /* 0A37 */
+  { 0x000A3A, 0x000A3B },                                       /* 0A3A-0A3B */
+  { 0x000A3D           },                                            /* 0A3D */
+  { 0x000A43, 0x000A46 },                                       /* 0A43-0A46 */
+  { 0x000A49, 0x000A4A },                                       /* 0A49-0A4A */
+  { 0x000A4E, 0x000A58 },                                       /* 0A4E-0A58 */
+  { 0x000A5D           },                                            /* 0A5D */
+  { 0x000A5F, 0x000A65 },                                       /* 0A5F-0A65 */
+  { 0x000A75, 0x000A80 },                                       /* 0A75-0A80 */
+  { 0x000A84           },                                            /* 0A84 */
+  { 0x000A8C           },                                            /* 0A8C */
+  { 0x000A8E           },                                            /* 0A8E */
+  { 0x000A92           },                                            /* 0A92 */
+  { 0x000AA9           },                                            /* 0AA9 */
+  { 0x000AB1           },                                            /* 0AB1 */
+  { 0x000AB4           },                                            /* 0AB4 */
+  { 0x000ABA, 0x000ABB },                                       /* 0ABA-0ABB */
+  { 0x000AC6           },                                            /* 0AC6 */
+  { 0x000ACA           },                                            /* 0ACA */
+  { 0x000ACE, 0x000ACF },                                       /* 0ACE-0ACF */
+  { 0x000AD1, 0x000ADF },                                       /* 0AD1-0ADF */
+  { 0x000AE1, 0x000AE5 },                                       /* 0AE1-0AE5 */
+  { 0x000AF0, 0x000B00 },                                       /* 0AF0-0B00 */
+  { 0x000B04           },                                            /* 0B04 */
+  { 0x000B0D, 0x000B0E },                                       /* 0B0D-0B0E */
+  { 0x000B11, 0x000B12 },                                       /* 0B11-0B12 */
+  { 0x000B29           },                                            /* 0B29 */
+  { 0x000B31           },                                            /* 0B31 */
+  { 0x000B34, 0x000B35 },                                       /* 0B34-0B35 */
+  { 0x000B3A, 0x000B3B },                                       /* 0B3A-0B3B */
+  { 0x000B44, 0x000B46 },                                       /* 0B44-0B46 */
+  { 0x000B49, 0x000B4A },                                       /* 0B49-0B4A */
+  { 0x000B4E, 0x000B55 },                                       /* 0B4E-0B55 */
+  { 0x000B58, 0x000B5B },                                       /* 0B58-0B5B */
+  { 0x000B5E           },                                            /* 0B5E */
+  { 0x000B62, 0x000B65 },                                       /* 0B62-0B65 */
+  { 0x000B71, 0x000B81 },                                       /* 0B71-0B81 */
+  { 0x000B84           },                                            /* 0B84 */
+  { 0x000B8B, 0x000B8D },                                       /* 0B8B-0B8D */
+  { 0x000B91           },                                            /* 0B91 */
+  { 0x000B96, 0x000B98 },                                       /* 0B96-0B98 */
+  { 0x000B9B           },                                            /* 0B9B */
+  { 0x000B9D           },                                            /* 0B9D */
+  { 0x000BA0, 0x000BA2 },                                       /* 0BA0-0BA2 */
+  { 0x000BA5, 0x000BA7 },                                       /* 0BA5-0BA7 */
+  { 0x000BAB, 0x000BAD },                                       /* 0BAB-0BAD */
+  { 0x000BB6           },                                            /* 0BB6 */
+  { 0x000BBA, 0x000BBD },                                       /* 0BBA-0BBD */
+  { 0x000BC3, 0x000BC5 },                                       /* 0BC3-0BC5 */
+  { 0x000BC9           },                                            /* 0BC9 */
+  { 0x000BCE, 0x000BD6 },                                       /* 0BCE-0BD6 */
+  { 0x000BD8, 0x000BE6 },                                       /* 0BD8-0BE6 */
+  { 0x000BF3, 0x000C00 },                                       /* 0BF3-0C00 */
+  { 0x000C04           },                                            /* 0C04 */
+  { 0x000C0D           },                                            /* 0C0D */
+  { 0x000C11           },                                            /* 0C11 */
+  { 0x000C29           },                                            /* 0C29 */
+  { 0x000C34           },                                            /* 0C34 */
+  { 0x000C3A, 0x000C3D },                                       /* 0C3A-0C3D */
+  { 0x000C45           },                                            /* 0C45 */
+  { 0x000C49           },                                            /* 0C49 */
+  { 0x000C4E, 0x000C54 },                                       /* 0C4E-0C54 */
+  { 0x000C57, 0x000C5F },                                       /* 0C57-0C5F */
+  { 0x000C62, 0x000C65 },                                       /* 0C62-0C65 */
+  { 0x000C70, 0x000C81 },                                       /* 0C70-0C81 */
+  { 0x000C84           },                                            /* 0C84 */
+  { 0x000C8D           },                                            /* 0C8D */
+  { 0x000C91           },                                            /* 0C91 */
+  { 0x000CA9           },                                            /* 0CA9 */
+  { 0x000CB4           },                                            /* 0CB4 */
+  { 0x000CBA, 0x000CBD },                                       /* 0CBA-0CBD */
+  { 0x000CC5           },                                            /* 0CC5 */
+  { 0x000CC9           },                                            /* 0CC9 */
+  { 0x000CCE, 0x000CD4 },                                       /* 0CCE-0CD4 */
+  { 0x000CD7, 0x000CDD },                                       /* 0CD7-0CDD */
+  { 0x000CDF           },                                            /* 0CDF */
+  { 0x000CE2, 0x000CE5 },                                       /* 0CE2-0CE5 */
+  { 0x000CF0, 0x000D01 },                                       /* 0CF0-0D01 */
+  { 0x000D04           },                                            /* 0D04 */
+  { 0x000D0D           },                                            /* 0D0D */
+  { 0x000D11           },                                            /* 0D11 */
+  { 0x000D29           },                                            /* 0D29 */
+  { 0x000D3A, 0x000D3D },                                       /* 0D3A-0D3D */
+  { 0x000D44, 0x000D45 },                                       /* 0D44-0D45 */
+  { 0x000D49           },                                            /* 0D49 */
+  { 0x000D4E, 0x000D56 },                                       /* 0D4E-0D56 */
+  { 0x000D58, 0x000D5F },                                       /* 0D58-0D5F */
+  { 0x000D62, 0x000D65 },                                       /* 0D62-0D65 */
+  { 0x000D70, 0x000D81 },                                       /* 0D70-0D81 */
+  { 0x000D84           },                                            /* 0D84 */
+  { 0x000D97, 0x000D99 },                                       /* 0D97-0D99 */
+  { 0x000DB2           },                                            /* 0DB2 */
+  { 0x000DBC           },                                            /* 0DBC */
+  { 0x000DBE, 0x000DBF },                                       /* 0DBE-0DBF */
+  { 0x000DC7, 0x000DC9 },                                       /* 0DC7-0DC9 */
+  { 0x000DCB, 0x000DCE },                                       /* 0DCB-0DCE */
+  { 0x000DD5           },                                            /* 0DD5 */
+  { 0x000DD7           },                                            /* 0DD7 */
+  { 0x000DE0, 0x000DF1 },                                       /* 0DE0-0DF1 */
+  { 0x000DF5, 0x000E00 },                                       /* 0DF5-0E00 */
+  { 0x000E3B, 0x000E3E },                                       /* 0E3B-0E3E */
+  { 0x000E5C, 0x000E80 },                                       /* 0E5C-0E80 */
+  { 0x000E83           },                                            /* 0E83 */
+  { 0x000E85, 0x000E86 },                                       /* 0E85-0E86 */
+  { 0x000E89           },                                            /* 0E89 */
+  { 0x000E8B, 0x000E8C },                                       /* 0E8B-0E8C */
+  { 0x000E8E, 0x000E93 },                                       /* 0E8E-0E93 */
+  { 0x000E98           },                                            /* 0E98 */
+  { 0x000EA0           },                                            /* 0EA0 */
+  { 0x000EA4           },                                            /* 0EA4 */
+  { 0x000EA6           },                                            /* 0EA6 */
+  { 0x000EA8, 0x000EA9 },                                       /* 0EA8-0EA9 */
+  { 0x000EAC           },                                            /* 0EAC */
+  { 0x000EBA           },                                            /* 0EBA */
+  { 0x000EBE, 0x000EBF },                                       /* 0EBE-0EBF */
+  { 0x000EC5           },                                            /* 0EC5 */
+  { 0x000EC7           },                                            /* 0EC7 */
+  { 0x000ECE, 0x000ECF },                                       /* 0ECE-0ECF */
+  { 0x000EDA, 0x000EDB },                                       /* 0EDA-0EDB */
+  { 0x000EDE, 0x000EFF },                                       /* 0EDE-0EFF */
+  { 0x000F48           },                                            /* 0F48 */
+  { 0x000F6B, 0x000F70 },                                       /* 0F6B-0F70 */
+  { 0x000F8C, 0x000F8F },                                       /* 0F8C-0F8F */
+  { 0x000F98           },                                            /* 0F98 */
+  { 0x000FBD           },                                            /* 0FBD */
+  { 0x000FCD, 0x000FCE },                                       /* 0FCD-0FCE */
+  { 0x000FD0, 0x000FFF },                                       /* 0FD0-0FFF */
+  { 0x001022           },                                            /* 1022 */
+  { 0x001028           },                                            /* 1028 */
+  { 0x00102B           },                                            /* 102B */
+  { 0x001033, 0x001035 },                                       /* 1033-1035 */
+  { 0x00103A, 0x00103F },                                       /* 103A-103F */
+  { 0x00105A, 0x00109F },                                       /* 105A-109F */
+  { 0x0010C6, 0x0010CF },                                       /* 10C6-10CF */
+  { 0x0010F9, 0x0010FA },                                       /* 10F9-10FA */
+  { 0x0010FC, 0x0010FF },                                       /* 10FC-10FF */
+  { 0x00115A, 0x00115E },                                       /* 115A-115E */
+  { 0x0011A3, 0x0011A7 },                                       /* 11A3-11A7 */
+  { 0x0011FA, 0x0011FF },                                       /* 11FA-11FF */
+  { 0x001207           },                                            /* 1207 */
+  { 0x001247           },                                            /* 1247 */
+  { 0x001249           },                                            /* 1249 */
+  { 0x00124E, 0x00124F },                                       /* 124E-124F */
+  { 0x001257           },                                            /* 1257 */
+  { 0x001259           },                                            /* 1259 */
+  { 0x00125E, 0x00125F },                                       /* 125E-125F */
+  { 0x001287           },                                            /* 1287 */
+  { 0x001289           },                                            /* 1289 */
+  { 0x00128E, 0x00128F },                                       /* 128E-128F */
+  { 0x0012AF           },                                            /* 12AF */
+  { 0x0012B1           },                                            /* 12B1 */
+  { 0x0012B6, 0x0012B7 },                                       /* 12B6-12B7 */
+  { 0x0012BF           },                                            /* 12BF */
+  { 0x0012C1           },                                            /* 12C1 */
+  { 0x0012C6, 0x0012C7 },                                       /* 12C6-12C7 */
+  { 0x0012CF           },                                            /* 12CF */
+  { 0x0012D7           },                                            /* 12D7 */
+  { 0x0012EF           },                                            /* 12EF */
+  { 0x00130F           },                                            /* 130F */
+  { 0x001311           },                                            /* 1311 */
+  { 0x001316, 0x001317 },                                       /* 1316-1317 */
+  { 0x00131F           },                                            /* 131F */
+  { 0x001347           },                                            /* 1347 */
+  { 0x00135B, 0x001360 },                                       /* 135B-1360 */
+  { 0x00137D, 0x00139F },                                       /* 137D-139F */
+  { 0x0013F5, 0x001400 },                                       /* 13F5-1400 */
+  { 0x001677, 0x00167F },                                       /* 1677-167F */
+  { 0x00169D, 0x00169F },                                       /* 169D-169F */
+  { 0x0016F1, 0x0016FF },                                       /* 16F1-16FF */
+  { 0x00170D           },                                            /* 170D */
+  { 0x001715, 0x00171F },                                       /* 1715-171F */
+  { 0x001737, 0x00173F },                                       /* 1737-173F */
+  { 0x001754, 0x00175F },                                       /* 1754-175F */
+  { 0x00176D           },                                            /* 176D */
+  { 0x001771           },                                            /* 1771 */
+  { 0x001774, 0x00177F },                                       /* 1774-177F */
+  { 0x0017DD, 0x0017DF },                                       /* 17DD-17DF */
+  { 0x0017EA, 0x0017FF },                                       /* 17EA-17FF */
+  { 0x00180F           },                                            /* 180F */
+  { 0x00181A, 0x00181F },                                       /* 181A-181F */
+  { 0x001878, 0x00187F },                                       /* 1878-187F */
+  { 0x0018AA, 0x001DFF },                                       /* 18AA-1DFF */
+  { 0x001E9C, 0x001E9F },                                       /* 1E9C-1E9F */
+  { 0x001EFA, 0x001EFF },                                       /* 1EFA-1EFF */
+  { 0x001F16, 0x001F17 },                                       /* 1F16-1F17 */
+  { 0x001F1E, 0x001F1F },                                       /* 1F1E-1F1F */
+  { 0x001F46, 0x001F47 },                                       /* 1F46-1F47 */
+  { 0x001F4E, 0x001F4F },                                       /* 1F4E-1F4F */
+  { 0x001F58           },                                            /* 1F58 */
+  { 0x001F5A           },                                            /* 1F5A */
+  { 0x001F5C           },                                            /* 1F5C */
+  { 0x001F5E           },                                            /* 1F5E */
+  { 0x001F7E, 0x001F7F },                                       /* 1F7E-1F7F */
+  { 0x001FB5           },                                            /* 1FB5 */
+  { 0x001FC5           },                                            /* 1FC5 */
+  { 0x001FD4, 0x001FD5 },                                       /* 1FD4-1FD5 */
+  { 0x001FDC           },                                            /* 1FDC */
+  { 0x001FF0, 0x001FF1 },                                       /* 1FF0-1FF1 */
+  { 0x001FF5           },                                            /* 1FF5 */
+  { 0x001FFF           },                                            /* 1FFF */
+  { 0x002053, 0x002056 },                                       /* 2053-2056 */
+  { 0x002058, 0x00205E },                                       /* 2058-205E */
+  { 0x002064, 0x002069 },                                       /* 2064-2069 */
+  { 0x002072, 0x002073 },                                       /* 2072-2073 */
+  { 0x00208F, 0x00209F },                                       /* 208F-209F */
+  { 0x0020B2, 0x0020CF },                                       /* 20B2-20CF */
+  { 0x0020EB, 0x0020FF },                                       /* 20EB-20FF */
+  { 0x00213B, 0x00213C },                                       /* 213B-213C */
+  { 0x00214C, 0x002152 },                                       /* 214C-2152 */
+  { 0x002184, 0x00218F },                                       /* 2184-218F */
+  { 0x0023CF, 0x0023FF },                                       /* 23CF-23FF */
+  { 0x002427, 0x00243F },                                       /* 2427-243F */
+  { 0x00244B, 0x00245F },                                       /* 244B-245F */
+  { 0x0024FF           },                                            /* 24FF */
+  { 0x002614, 0x002615 },                                       /* 2614-2615 */
+  { 0x002618           },                                            /* 2618 */
+  { 0x00267E, 0x00267F },                                       /* 267E-267F */
+  { 0x00268A, 0x002700 },                                       /* 268A-2700 */
+  { 0x002705           },                                            /* 2705 */
+  { 0x00270A, 0x00270B },                                       /* 270A-270B */
+  { 0x002728           },                                            /* 2728 */
+  { 0x00274C           },                                            /* 274C */
+  { 0x00274E           },                                            /* 274E */
+  { 0x002753, 0x002755 },                                       /* 2753-2755 */
+  { 0x002757           },                                            /* 2757 */
+  { 0x00275F, 0x002760 },                                       /* 275F-2760 */
+  { 0x002795, 0x002797 },                                       /* 2795-2797 */
+  { 0x0027B0           },                                            /* 27B0 */
+  { 0x0027BF, 0x0027CF },                                       /* 27BF-27CF */
+  { 0x0027EC, 0x0027EF },                                       /* 27EC-27EF */
+  { 0x002B00, 0x002E7F },                                       /* 2B00-2E7F */
+  { 0x002E9A           },                                            /* 2E9A */
+  { 0x002EF4, 0x002EFF },                                       /* 2EF4-2EFF */
+  { 0x002FD6, 0x002FEF },                                       /* 2FD6-2FEF */
+  { 0x002FFC, 0x002FFF },                                       /* 2FFC-2FFF */
+  { 0x003040           },                                            /* 3040 */
+  { 0x003097, 0x003098 },                                       /* 3097-3098 */
+  { 0x003100, 0x003104 },                                       /* 3100-3104 */
+  { 0x00312D, 0x003130 },                                       /* 312D-3130 */
+  { 0x00318F           },                                            /* 318F */
+  { 0x0031B8, 0x0031EF },                                       /* 31B8-31EF */
+  { 0x00321D, 0x00321F },                                       /* 321D-321F */
+  { 0x003244, 0x003250 },                                       /* 3244-3250 */
+  { 0x00327C, 0x00327E },                                       /* 327C-327E */
+  { 0x0032CC, 0x0032CF },                                       /* 32CC-32CF */
+  { 0x0032FF           },                                            /* 32FF */
+  { 0x003377, 0x00337A },                                       /* 3377-337A */
+  { 0x0033DE, 0x0033DF },                                       /* 33DE-33DF */
+  { 0x0033FF           },                                            /* 33FF */
+  { 0x004DB6, 0x004DFF },                                       /* 4DB6-4DFF */
+  { 0x009FA6, 0x009FFF },                                       /* 9FA6-9FFF */
+  { 0x00A48D, 0x00A48F },                                       /* A48D-A48F */
+  { 0x00A4C7, 0x00ABFF },                                       /* A4C7-ABFF */
+  { 0x00D7A4, 0x00D7FF },                                       /* D7A4-D7FF */
+  { 0x00FA2E, 0x00FA2F },                                       /* FA2E-FA2F */
+  { 0x00FA6B, 0x00FAFF },                                       /* FA6B-FAFF */
+  { 0x00FB07, 0x00FB12 },                                       /* FB07-FB12 */
+  { 0x00FB18, 0x00FB1C },                                       /* FB18-FB1C */
+  { 0x00FB37           },                                            /* FB37 */
+  { 0x00FB3D           },                                            /* FB3D */
+  { 0x00FB3F           },                                            /* FB3F */
+  { 0x00FB42           },                                            /* FB42 */
+  { 0x00FB45           },                                            /* FB45 */
+  { 0x00FBB2, 0x00FBD2 },                                       /* FBB2-FBD2 */
+  { 0x00FD40, 0x00FD4F },                                       /* FD40-FD4F */
+  { 0x00FD90, 0x00FD91 },                                       /* FD90-FD91 */
+  { 0x00FDC8, 0x00FDCF },                                       /* FDC8-FDCF */
+  { 0x00FDFD, 0x00FDFF },                                       /* FDFD-FDFF */
+  { 0x00FE10, 0x00FE1F },                                       /* FE10-FE1F */
+  { 0x00FE24, 0x00FE2F },                                       /* FE24-FE2F */
+  { 0x00FE47, 0x00FE48 },                                       /* FE47-FE48 */
+  { 0x00FE53           },                                            /* FE53 */
+  { 0x00FE67           },                                            /* FE67 */
+  { 0x00FE6C, 0x00FE6F },                                       /* FE6C-FE6F */
+  { 0x00FE75           },                                            /* FE75 */
+  { 0x00FEFD, 0x00FEFE },                                       /* FEFD-FEFE */
+  { 0x00FF00           },                                            /* FF00 */
+  { 0x00FFBF, 0x00FFC1 },                                       /* FFBF-FFC1 */
+  { 0x00FFC8, 0x00FFC9 },                                       /* FFC8-FFC9 */
+  { 0x00FFD0, 0x00FFD1 },                                       /* FFD0-FFD1 */
+  { 0x00FFD8, 0x00FFD9 },                                       /* FFD8-FFD9 */
+  { 0x00FFDD, 0x00FFDF },                                       /* FFDD-FFDF */
+  { 0x00FFE7           },                                            /* FFE7 */
+  { 0x00FFEF, 0x00FFF8 },                                       /* FFEF-FFF8 */
+  { 0x010000, 0x0102FF },                                     /* 10000-102FF */
+  { 0x01031F           },                                           /* 1031F */
+  { 0x010324, 0x01032F },                                     /* 10324-1032F */
+  { 0x01034B, 0x0103FF },                                     /* 1034B-103FF */
+  { 0x010426, 0x010427 },                                     /* 10426-10427 */
+  { 0x01044E, 0x01CFFF },                                     /* 1044E-1CFFF */
+  { 0x01D0F6, 0x01D0FF },                                     /* 1D0F6-1D0FF */
+  { 0x01D127, 0x01D129 },                                     /* 1D127-1D129 */
+  { 0x01D1DE, 0x01D3FF },                                     /* 1D1DE-1D3FF */
+  { 0x01D455           },                                           /* 1D455 */
+  { 0x01D49D           },                                           /* 1D49D */
+  { 0x01D4A0, 0x01D4A1 },                                     /* 1D4A0-1D4A1 */
+  { 0x01D4A3, 0x01D4A4 },                                     /* 1D4A3-1D4A4 */
+  { 0x01D4A7, 0x01D4A8 },                                     /* 1D4A7-1D4A8 */
+  { 0x01D4AD           },                                           /* 1D4AD */
+  { 0x01D4BA           },                                           /* 1D4BA */
+  { 0x01D4BC           },                                           /* 1D4BC */
+  { 0x01D4C1           },                                           /* 1D4C1 */
+  { 0x01D4C4           },                                           /* 1D4C4 */
+  { 0x01D506           },                                           /* 1D506 */
+  { 0x01D50B, 0x01D50C },                                     /* 1D50B-1D50C */
+  { 0x01D515           },                                           /* 1D515 */
+  { 0x01D51D           },                                           /* 1D51D */
+  { 0x01D53A           },                                           /* 1D53A */
+  { 0x01D53F           },                                           /* 1D53F */
+  { 0x01D545           },                                           /* 1D545 */
+  { 0x01D547, 0x01D549 },                                     /* 1D547-1D549 */
+  { 0x01D551           },                                           /* 1D551 */
+  { 0x01D6A4, 0x01D6A7 },                                     /* 1D6A4-1D6A7 */
+  { 0x01D7CA, 0x01D7CD },                                     /* 1D7CA-1D7CD */
+  { 0x01D800, 0x01FFFD },                                     /* 1D800-1FFFD */
+  { 0x02A6D7, 0x02F7FF },                                     /* 2A6D7-2F7FF */
+  { 0x02FA1E, 0x02FFFD },                                     /* 2FA1E-2FFFD */
+  { 0x030000, 0x03FFFD },                                     /* 30000-3FFFD */
+  { 0x040000, 0x04FFFD },                                     /* 40000-4FFFD */
+  { 0x050000, 0x05FFFD },                                     /* 50000-5FFFD */
+  { 0x060000, 0x06FFFD },                                     /* 60000-6FFFD */
+  { 0x070000, 0x07FFFD },                                     /* 70000-7FFFD */
+  { 0x080000, 0x08FFFD },                                     /* 80000-8FFFD */
+  { 0x090000, 0x09FFFD },                                     /* 90000-9FFFD */
+  { 0x0A0000, 0x0AFFFD },                                     /* A0000-AFFFD */
+  { 0x0B0000, 0x0BFFFD },                                     /* B0000-BFFFD */
+  { 0x0C0000, 0x0CFFFD },                                     /* C0000-CFFFD */
+  { 0x0D0000, 0x0DFFFD },                                     /* D0000-DFFFD */
+  { 0x0E0000           },                                           /* E0000 */
+  { 0x0E0002, 0x0E001F },                                     /* E0002-E001F */
+  { 0x0E0080, 0x0EFFFD },                                     /* E0080-EFFFD */
+  { 0 },
+};
+
+
+/*
+ * B.1 Commonly mapped to nothing
+ * 
+ */
+
+const Stringprep_table_element stringprep_rfc3454_B_1[] = {
+  { 0x0000AD           },                          /* 00AD; ; Map to nothing */
+  { 0x00034F           },                          /* 034F; ; Map to nothing */
+  { 0x001806           },                          /* 1806; ; Map to nothing */
+  { 0x00180B           },                          /* 180B; ; Map to nothing */
+  { 0x00180C           },                          /* 180C; ; Map to nothing */
+  { 0x00180D           },                          /* 180D; ; Map to nothing */
+  { 0x00200B           },                          /* 200B; ; Map to nothing */
+  { 0x00200C           },                          /* 200C; ; Map to nothing */
+  { 0x00200D           },                          /* 200D; ; Map to nothing */
+  { 0x002060           },                          /* 2060; ; Map to nothing */
+  { 0x00FE00           },                          /* FE00; ; Map to nothing */
+  { 0x00FE01           },                          /* FE01; ; Map to nothing */
+  { 0x00FE02           },                          /* FE02; ; Map to nothing */
+  { 0x00FE03           },                          /* FE03; ; Map to nothing */
+  { 0x00FE04           },                          /* FE04; ; Map to nothing */
+  { 0x00FE05           },                          /* FE05; ; Map to nothing */
+  { 0x00FE06           },                          /* FE06; ; Map to nothing */
+  { 0x00FE07           },                          /* FE07; ; Map to nothing */
+  { 0x00FE08           },                          /* FE08; ; Map to nothing */
+  { 0x00FE09           },                          /* FE09; ; Map to nothing */
+  { 0x00FE0A           },                          /* FE0A; ; Map to nothing */
+  { 0x00FE0B           },                          /* FE0B; ; Map to nothing */
+  { 0x00FE0C           },                          /* FE0C; ; Map to nothing */
+  { 0x00FE0D           },                          /* FE0D; ; Map to nothing */
+  { 0x00FE0E           },                          /* FE0E; ; Map to nothing */
+  { 0x00FE0F           },                          /* FE0F; ; Map to nothing */
+  { 0x00FEFF           },                          /* FEFF; ; Map to nothing */
+  { 0 },
+};
+
+
+/*
+ * B.2 Mapping for case-folding used with NFKC
+ * 
+ */
+
+const Stringprep_table_element stringprep_rfc3454_B_2[] = {
+  { 0x000041, 0, { 0x000061 }},                      /* 0041; 0061; Case map */
+  { 0x000042, 0, { 0x000062 }},                      /* 0042; 0062; Case map */
+  { 0x000043, 0, { 0x000063 }},                      /* 0043; 0063; Case map */
+  { 0x000044, 0, { 0x000064 }},                      /* 0044; 0064; Case map */
+  { 0x000045, 0, { 0x000065 }},                      /* 0045; 0065; Case map */
+  { 0x000046, 0, { 0x000066 }},                      /* 0046; 0066; Case map */
+  { 0x000047, 0, { 0x000067 }},                      /* 0047; 0067; Case map */
+  { 0x000048, 0, { 0x000068 }},                      /* 0048; 0068; Case map */
+  { 0x000049, 0, { 0x000069 }},                      /* 0049; 0069; Case map */
+  { 0x00004A, 0, { 0x00006A }},                      /* 004A; 006A; Case map */
+  { 0x00004B, 0, { 0x00006B }},                      /* 004B; 006B; Case map */
+  { 0x00004C, 0, { 0x00006C }},                      /* 004C; 006C; Case map */
+  { 0x00004D, 0, { 0x00006D }},                      /* 004D; 006D; Case map */
+  { 0x00004E, 0, { 0x00006E }},                      /* 004E; 006E; Case map */
+  { 0x00004F, 0, { 0x00006F }},                      /* 004F; 006F; Case map */
+  { 0x000050, 0, { 0x000070 }},                      /* 0050; 0070; Case map */
+  { 0x000051, 0, { 0x000071 }},                      /* 0051; 0071; Case map */
+  { 0x000052, 0, { 0x000072 }},                      /* 0052; 0072; Case map */
+  { 0x000053, 0, { 0x000073 }},                      /* 0053; 0073; Case map */
+  { 0x000054, 0, { 0x000074 }},                      /* 0054; 0074; Case map */
+  { 0x000055, 0, { 0x000075 }},                      /* 0055; 0075; Case map */
+  { 0x000056, 0, { 0x000076 }},                      /* 0056; 0076; Case map */
+  { 0x000057, 0, { 0x000077 }},                      /* 0057; 0077; Case map */
+  { 0x000058, 0, { 0x000078 }},                      /* 0058; 0078; Case map */
+  { 0x000059, 0, { 0x000079 }},                      /* 0059; 0079; Case map */
+  { 0x00005A, 0, { 0x00007A }},                      /* 005A; 007A; Case map */
+  { 0x0000B5, 0, { 0x0003BC }},                      /* 00B5; 03BC; Case map */
+  { 0x0000C0, 0, { 0x0000E0 }},                      /* 00C0; 00E0; Case map */
+  { 0x0000C1, 0, { 0x0000E1 }},                      /* 00C1; 00E1; Case map */
+  { 0x0000C2, 0, { 0x0000E2 }},                      /* 00C2; 00E2; Case map */
+  { 0x0000C3, 0, { 0x0000E3 }},                      /* 00C3; 00E3; Case map */
+  { 0x0000C4, 0, { 0x0000E4 }},                      /* 00C4; 00E4; Case map */
+  { 0x0000C5, 0, { 0x0000E5 }},                      /* 00C5; 00E5; Case map */
+  { 0x0000C6, 0, { 0x0000E6 }},                      /* 00C6; 00E6; Case map */
+  { 0x0000C7, 0, { 0x0000E7 }},                      /* 00C7; 00E7; Case map */
+  { 0x0000C8, 0, { 0x0000E8 }},                      /* 00C8; 00E8; Case map */
+  { 0x0000C9, 0, { 0x0000E9 }},                      /* 00C9; 00E9; Case map */
+  { 0x0000CA, 0, { 0x0000EA }},                      /* 00CA; 00EA; Case map */
+  { 0x0000CB, 0, { 0x0000EB }},                      /* 00CB; 00EB; Case map */
+  { 0x0000CC, 0, { 0x0000EC }},                      /* 00CC; 00EC; Case map */
+  { 0x0000CD, 0, { 0x0000ED }},                      /* 00CD; 00ED; Case map */
+  { 0x0000CE, 0, { 0x0000EE }},                      /* 00CE; 00EE; Case map */
+  { 0x0000CF, 0, { 0x0000EF }},                      /* 00CF; 00EF; Case map */
+  { 0x0000D0, 0, { 0x0000F0 }},                      /* 00D0; 00F0; Case map */
+  { 0x0000D1, 0, { 0x0000F1 }},                      /* 00D1; 00F1; Case map */
+  { 0x0000D2, 0, { 0x0000F2 }},                      /* 00D2; 00F2; Case map */
+  { 0x0000D3, 0, { 0x0000F3 }},                      /* 00D3; 00F3; Case map */
+  { 0x0000D4, 0, { 0x0000F4 }},                      /* 00D4; 00F4; Case map */
+  { 0x0000D5, 0, { 0x0000F5 }},                      /* 00D5; 00F5; Case map */
+  { 0x0000D6, 0, { 0x0000F6 }},                      /* 00D6; 00F6; Case map */
+  { 0x0000D8, 0, { 0x0000F8 }},                      /* 00D8; 00F8; Case map */
+  { 0x0000D9, 0, { 0x0000F9 }},                      /* 00D9; 00F9; Case map */
+  { 0x0000DA, 0, { 0x0000FA }},                      /* 00DA; 00FA; Case map */
+  { 0x0000DB, 0, { 0x0000FB }},                      /* 00DB; 00FB; Case map */
+  { 0x0000DC, 0, { 0x0000FC }},                      /* 00DC; 00FC; Case map */
+  { 0x0000DD, 0, { 0x0000FD }},                      /* 00DD; 00FD; Case map */
+  { 0x0000DE, 0, { 0x0000FE }},                      /* 00DE; 00FE; Case map */
+  { 0x0000DF, 0, { 0x000073,                    /* 00DF; 0073 0073; Case map */
+                   0x000073 }},
+  { 0x000100, 0, { 0x000101 }},                      /* 0100; 0101; Case map */
+  { 0x000102, 0, { 0x000103 }},                      /* 0102; 0103; Case map */
+  { 0x000104, 0, { 0x000105 }},                      /* 0104; 0105; Case map */
+  { 0x000106, 0, { 0x000107 }},                      /* 0106; 0107; Case map */
+  { 0x000108, 0, { 0x000109 }},                      /* 0108; 0109; Case map */
+  { 0x00010A, 0, { 0x00010B }},                      /* 010A; 010B; Case map */
+  { 0x00010C, 0, { 0x00010D }},                      /* 010C; 010D; Case map */
+  { 0x00010E, 0, { 0x00010F }},                      /* 010E; 010F; Case map */
+  { 0x000110, 0, { 0x000111 }},                      /* 0110; 0111; Case map */
+  { 0x000112, 0, { 0x000113 }},                      /* 0112; 0113; Case map */
+  { 0x000114, 0, { 0x000115 }},                      /* 0114; 0115; Case map */
+  { 0x000116, 0, { 0x000117 }},                      /* 0116; 0117; Case map */
+  { 0x000118, 0, { 0x000119 }},                      /* 0118; 0119; Case map */
+  { 0x00011A, 0, { 0x00011B }},                      /* 011A; 011B; Case map */
+  { 0x00011C, 0, { 0x00011D }},                      /* 011C; 011D; Case map */
+  { 0x00011E, 0, { 0x00011F }},                      /* 011E; 011F; Case map */
+  { 0x000120, 0, { 0x000121 }},                      /* 0120; 0121; Case map */
+  { 0x000122, 0, { 0x000123 }},                      /* 0122; 0123; Case map */
+  { 0x000124, 0, { 0x000125 }},                      /* 0124; 0125; Case map */
+  { 0x000126, 0, { 0x000127 }},                      /* 0126; 0127; Case map */
+  { 0x000128, 0, { 0x000129 }},                      /* 0128; 0129; Case map */
+  { 0x00012A, 0, { 0x00012B }},                      /* 012A; 012B; Case map */
+  { 0x00012C, 0, { 0x00012D }},                      /* 012C; 012D; Case map */
+  { 0x00012E, 0, { 0x00012F }},                      /* 012E; 012F; Case map */
+  { 0x000130, 0, { 0x000069,                    /* 0130; 0069 0307; Case map */
+                   0x000307 }},
+  { 0x000132, 0, { 0x000133 }},                      /* 0132; 0133; Case map */
+  { 0x000134, 0, { 0x000135 }},                      /* 0134; 0135; Case map */
+  { 0x000136, 0, { 0x000137 }},                      /* 0136; 0137; Case map */
+  { 0x000139, 0, { 0x00013A }},                      /* 0139; 013A; Case map */
+  { 0x00013B, 0, { 0x00013C }},                      /* 013B; 013C; Case map */
+  { 0x00013D, 0, { 0x00013E }},                      /* 013D; 013E; Case map */
+  { 0x00013F, 0, { 0x000140 }},                      /* 013F; 0140; Case map */
+  { 0x000141, 0, { 0x000142 }},                      /* 0141; 0142; Case map */
+  { 0x000143, 0, { 0x000144 }},                      /* 0143; 0144; Case map */
+  { 0x000145, 0, { 0x000146 }},                      /* 0145; 0146; Case map */
+  { 0x000147, 0, { 0x000148 }},                      /* 0147; 0148; Case map */
+  { 0x000149, 0, { 0x0002BC,                    /* 0149; 02BC 006E; Case map */
+                   0x00006E }},
+  { 0x00014A, 0, { 0x00014B }},                      /* 014A; 014B; Case map */
+  { 0x00014C, 0, { 0x00014D }},                      /* 014C; 014D; Case map */
+  { 0x00014E, 0, { 0x00014F }},                      /* 014E; 014F; Case map */
+  { 0x000150, 0, { 0x000151 }},                      /* 0150; 0151; Case map */
+  { 0x000152, 0, { 0x000153 }},                      /* 0152; 0153; Case map */
+  { 0x000154, 0, { 0x000155 }},                      /* 0154; 0155; Case map */
+  { 0x000156, 0, { 0x000157 }},                      /* 0156; 0157; Case map */
+  { 0x000158, 0, { 0x000159 }},                      /* 0158; 0159; Case map */
+  { 0x00015A, 0, { 0x00015B }},                      /* 015A; 015B; Case map */
+  { 0x00015C, 0, { 0x00015D }},                      /* 015C; 015D; Case map */
+  { 0x00015E, 0, { 0x00015F }},                      /* 015E; 015F; Case map */
+  { 0x000160, 0, { 0x000161 }},                      /* 0160; 0161; Case map */
+  { 0x000162, 0, { 0x000163 }},                      /* 0162; 0163; Case map */
+  { 0x000164, 0, { 0x000165 }},                      /* 0164; 0165; Case map */
+  { 0x000166, 0, { 0x000167 }},                      /* 0166; 0167; Case map */
+  { 0x000168, 0, { 0x000169 }},                      /* 0168; 0169; Case map */
+  { 0x00016A, 0, { 0x00016B }},                      /* 016A; 016B; Case map */
+  { 0x00016C, 0, { 0x00016D }},                      /* 016C; 016D; Case map */
+  { 0x00016E, 0, { 0x00016F }},                      /* 016E; 016F; Case map */
+  { 0x000170, 0, { 0x000171 }},                      /* 0170; 0171; Case map */
+  { 0x000172, 0, { 0x000173 }},                      /* 0172; 0173; Case map */
+  { 0x000174, 0, { 0x000175 }},                      /* 0174; 0175; Case map */
+  { 0x000176, 0, { 0x000177 }},                      /* 0176; 0177; Case map */
+  { 0x000178, 0, { 0x0000FF }},                      /* 0178; 00FF; Case map */
+  { 0x000179, 0, { 0x00017A }},                      /* 0179; 017A; Case map */
+  { 0x00017B, 0, { 0x00017C }},                      /* 017B; 017C; Case map */
+  { 0x00017D, 0, { 0x00017E }},                      /* 017D; 017E; Case map */
+  { 0x00017F, 0, { 0x000073 }},                      /* 017F; 0073; Case map */
+  { 0x000181, 0, { 0x000253 }},                      /* 0181; 0253; Case map */
+  { 0x000182, 0, { 0x000183 }},                      /* 0182; 0183; Case map */
+  { 0x000184, 0, { 0x000185 }},                      /* 0184; 0185; Case map */
+  { 0x000186, 0, { 0x000254 }},                      /* 0186; 0254; Case map */
+  { 0x000187, 0, { 0x000188 }},                      /* 0187; 0188; Case map */
+  { 0x000189, 0, { 0x000256 }},                      /* 0189; 0256; Case map */
+  { 0x00018A, 0, { 0x000257 }},                      /* 018A; 0257; Case map */
+  { 0x00018B, 0, { 0x00018C }},                      /* 018B; 018C; Case map */
+  { 0x00018E, 0, { 0x0001DD }},                      /* 018E; 01DD; Case map */
+  { 0x00018F, 0, { 0x000259 }},                      /* 018F; 0259; Case map */
+  { 0x000190, 0, { 0x00025B }},                      /* 0190; 025B; Case map */
+  { 0x000191, 0, { 0x000192 }},                      /* 0191; 0192; Case map */
+  { 0x000193, 0, { 0x000260 }},                      /* 0193; 0260; Case map */
+  { 0x000194, 0, { 0x000263 }},                      /* 0194; 0263; Case map */
+  { 0x000196, 0, { 0x000269 }},                      /* 0196; 0269; Case map */
+  { 0x000197, 0, { 0x000268 }},                      /* 0197; 0268; Case map */
+  { 0x000198, 0, { 0x000199 }},                      /* 0198; 0199; Case map */
+  { 0x00019C, 0, { 0x00026F }},                      /* 019C; 026F; Case map */
+  { 0x00019D, 0, { 0x000272 }},                      /* 019D; 0272; Case map */
+  { 0x00019F, 0, { 0x000275 }},                      /* 019F; 0275; Case map */
+  { 0x0001A0, 0, { 0x0001A1 }},                      /* 01A0; 01A1; Case map */
+  { 0x0001A2, 0, { 0x0001A3 }},                      /* 01A2; 01A3; Case map */
+  { 0x0001A4, 0, { 0x0001A5 }},                      /* 01A4; 01A5; Case map */
+  { 0x0001A6, 0, { 0x000280 }},                      /* 01A6; 0280; Case map */
+  { 0x0001A7, 0, { 0x0001A8 }},                      /* 01A7; 01A8; Case map */
+  { 0x0001A9, 0, { 0x000283 }},                      /* 01A9; 0283; Case map */
+  { 0x0001AC, 0, { 0x0001AD }},                      /* 01AC; 01AD; Case map */
+  { 0x0001AE, 0, { 0x000288 }},                      /* 01AE; 0288; Case map */
+  { 0x0001AF, 0, { 0x0001B0 }},                      /* 01AF; 01B0; Case map */
+  { 0x0001B1, 0, { 0x00028A }},                      /* 01B1; 028A; Case map */
+  { 0x0001B2, 0, { 0x00028B }},                      /* 01B2; 028B; Case map */
+  { 0x0001B3, 0, { 0x0001B4 }},                      /* 01B3; 01B4; Case map */
+  { 0x0001B5, 0, { 0x0001B6 }},                      /* 01B5; 01B6; Case map */
+  { 0x0001B7, 0, { 0x000292 }},                      /* 01B7; 0292; Case map */
+  { 0x0001B8, 0, { 0x0001B9 }},                      /* 01B8; 01B9; Case map */
+  { 0x0001BC, 0, { 0x0001BD }},                      /* 01BC; 01BD; Case map */
+  { 0x0001C4, 0, { 0x0001C6 }},                      /* 01C4; 01C6; Case map */
+  { 0x0001C5, 0, { 0x0001C6 }},                      /* 01C5; 01C6; Case map */
+  { 0x0001C7, 0, { 0x0001C9 }},                      /* 01C7; 01C9; Case map */
+  { 0x0001C8, 0, { 0x0001C9 }},                      /* 01C8; 01C9; Case map */
+  { 0x0001CA, 0, { 0x0001CC }},                      /* 01CA; 01CC; Case map */
+  { 0x0001CB, 0, { 0x0001CC }},                      /* 01CB; 01CC; Case map */
+  { 0x0001CD, 0, { 0x0001CE }},                      /* 01CD; 01CE; Case map */
+  { 0x0001CF, 0, { 0x0001D0 }},                      /* 01CF; 01D0; Case map */
+  { 0x0001D1, 0, { 0x0001D2 }},                      /* 01D1; 01D2; Case map */
+  { 0x0001D3, 0, { 0x0001D4 }},                      /* 01D3; 01D4; Case map */
+  { 0x0001D5, 0, { 0x0001D6 }},                      /* 01D5; 01D6; Case map */
+  { 0x0001D7, 0, { 0x0001D8 }},                      /* 01D7; 01D8; Case map */
+  { 0x0001D9, 0, { 0x0001DA }},                      /* 01D9; 01DA; Case map */
+  { 0x0001DB, 0, { 0x0001DC }},                      /* 01DB; 01DC; Case map */
+  { 0x0001DE, 0, { 0x0001DF }},                      /* 01DE; 01DF; Case map */
+  { 0x0001E0, 0, { 0x0001E1 }},                      /* 01E0; 01E1; Case map */
+  { 0x0001E2, 0, { 0x0001E3 }},                      /* 01E2; 01E3; Case map */
+  { 0x0001E4, 0, { 0x0001E5 }},                      /* 01E4; 01E5; Case map */
+  { 0x0001E6, 0, { 0x0001E7 }},                      /* 01E6; 01E7; Case map */
+  { 0x0001E8, 0, { 0x0001E9 }},                      /* 01E8; 01E9; Case map */
+  { 0x0001EA, 0, { 0x0001EB }},                      /* 01EA; 01EB; Case map */
+  { 0x0001EC, 0, { 0x0001ED }},                      /* 01EC; 01ED; Case map */
+  { 0x0001EE, 0, { 0x0001EF }},                      /* 01EE; 01EF; Case map */
+  { 0x0001F0, 0, { 0x00006A,                    /* 01F0; 006A 030C; Case map */
+                   0x00030C }},
+  { 0x0001F1, 0, { 0x0001F3 }},                      /* 01F1; 01F3; Case map */
+  { 0x0001F2, 0, { 0x0001F3 }},                      /* 01F2; 01F3; Case map */
+  { 0x0001F4, 0, { 0x0001F5 }},                      /* 01F4; 01F5; Case map */
+  { 0x0001F6, 0, { 0x000195 }},                      /* 01F6; 0195; Case map */
+  { 0x0001F7, 0, { 0x0001BF }},                      /* 01F7; 01BF; Case map */
+  { 0x0001F8, 0, { 0x0001F9 }},                      /* 01F8; 01F9; Case map */
+  { 0x0001FA, 0, { 0x0001FB }},                      /* 01FA; 01FB; Case map */
+  { 0x0001FC, 0, { 0x0001FD }},                      /* 01FC; 01FD; Case map */
+  { 0x0001FE, 0, { 0x0001FF }},                      /* 01FE; 01FF; Case map */
+  { 0x000200, 0, { 0x000201 }},                      /* 0200; 0201; Case map */
+  { 0x000202, 0, { 0x000203 }},                      /* 0202; 0203; Case map */
+  { 0x000204, 0, { 0x000205 }},                      /* 0204; 0205; Case map */
+  { 0x000206, 0, { 0x000207 }},                      /* 0206; 0207; Case map */
+  { 0x000208, 0, { 0x000209 }},                      /* 0208; 0209; Case map */
+  { 0x00020A, 0, { 0x00020B }},                      /* 020A; 020B; Case map */
+  { 0x00020C, 0, { 0x00020D }},                      /* 020C; 020D; Case map */
+  { 0x00020E, 0, { 0x00020F }},                      /* 020E; 020F; Case map */
+  { 0x000210, 0, { 0x000211 }},                      /* 0210; 0211; Case map */
+  { 0x000212, 0, { 0x000213 }},                      /* 0212; 0213; Case map */
+  { 0x000214, 0, { 0x000215 }},                      /* 0214; 0215; Case map */
+  { 0x000216, 0, { 0x000217 }},                      /* 0216; 0217; Case map */
+  { 0x000218, 0, { 0x000219 }},                      /* 0218; 0219; Case map */
+  { 0x00021A, 0, { 0x00021B }},                      /* 021A; 021B; Case map */
+  { 0x00021C, 0, { 0x00021D }},                      /* 021C; 021D; Case map */
+  { 0x00021E, 0, { 0x00021F }},                      /* 021E; 021F; Case map */
+  { 0x000220, 0, { 0x00019E }},                      /* 0220; 019E; Case map */
+  { 0x000222, 0, { 0x000223 }},                      /* 0222; 0223; Case map */
+  { 0x000224, 0, { 0x000225 }},                      /* 0224; 0225; Case map */
+  { 0x000226, 0, { 0x000227 }},                      /* 0226; 0227; Case map */
+  { 0x000228, 0, { 0x000229 }},                      /* 0228; 0229; Case map */
+  { 0x00022A, 0, { 0x00022B }},                      /* 022A; 022B; Case map */
+  { 0x00022C, 0, { 0x00022D }},                      /* 022C; 022D; Case map */
+  { 0x00022E, 0, { 0x00022F }},                      /* 022E; 022F; Case map */
+  { 0x000230, 0, { 0x000231 }},                      /* 0230; 0231; Case map */
+  { 0x000232, 0, { 0x000233 }},                      /* 0232; 0233; Case map */
+  { 0x000345, 0, { 0x0003B9 }},                      /* 0345; 03B9; Case map */
+  { 0x00037A, 0, { 0x000020,          /* 037A; 0020 03B9; Additional folding */
+                   0x0003B9 }},
+  { 0x000386, 0, { 0x0003AC }},                      /* 0386; 03AC; Case map */
+  { 0x000388, 0, { 0x0003AD }},                      /* 0388; 03AD; Case map */
+  { 0x000389, 0, { 0x0003AE }},                      /* 0389; 03AE; Case map */
+  { 0x00038A, 0, { 0x0003AF }},                      /* 038A; 03AF; Case map */
+  { 0x00038C, 0, { 0x0003CC }},                      /* 038C; 03CC; Case map */
+  { 0x00038E, 0, { 0x0003CD }},                      /* 038E; 03CD; Case map */
+  { 0x00038F, 0, { 0x0003CE }},                      /* 038F; 03CE; Case map */
+  { 0x000390, 0, { 0x0003B9,               /* 0390; 03B9 0308 0301; Case map */
+                   0x000308, 0x000301 }},
+  { 0x000391, 0, { 0x0003B1 }},                      /* 0391; 03B1; Case map */
+  { 0x000392, 0, { 0x0003B2 }},                      /* 0392; 03B2; Case map */
+  { 0x000393, 0, { 0x0003B3 }},                      /* 0393; 03B3; Case map */
+  { 0x000394, 0, { 0x0003B4 }},                      /* 0394; 03B4; Case map */
+  { 0x000395, 0, { 0x0003B5 }},                      /* 0395; 03B5; Case map */
+  { 0x000396, 0, { 0x0003B6 }},                      /* 0396; 03B6; Case map */
+  { 0x000397, 0, { 0x0003B7 }},                      /* 0397; 03B7; Case map */
+  { 0x000398, 0, { 0x0003B8 }},                      /* 0398; 03B8; Case map */
+  { 0x000399, 0, { 0x0003B9 }},                      /* 0399; 03B9; Case map */
+  { 0x00039A, 0, { 0x0003BA }},                      /* 039A; 03BA; Case map */
+  { 0x00039B, 0, { 0x0003BB }},                      /* 039B; 03BB; Case map */
+  { 0x00039C, 0, { 0x0003BC }},                      /* 039C; 03BC; Case map */
+  { 0x00039D, 0, { 0x0003BD }},                      /* 039D; 03BD; Case map */
+  { 0x00039E, 0, { 0x0003BE }},                      /* 039E; 03BE; Case map */
+  { 0x00039F, 0, { 0x0003BF }},                      /* 039F; 03BF; Case map */
+  { 0x0003A0, 0, { 0x0003C0 }},                      /* 03A0; 03C0; Case map */
+  { 0x0003A1, 0, { 0x0003C1 }},                      /* 03A1; 03C1; Case map */
+  { 0x0003A3, 0, { 0x0003C3 }},                      /* 03A3; 03C3; Case map */
+  { 0x0003A4, 0, { 0x0003C4 }},                      /* 03A4; 03C4; Case map */
+  { 0x0003A5, 0, { 0x0003C5 }},                      /* 03A5; 03C5; Case map */
+  { 0x0003A6, 0, { 0x0003C6 }},                      /* 03A6; 03C6; Case map */
+  { 0x0003A7, 0, { 0x0003C7 }},                      /* 03A7; 03C7; Case map */
+  { 0x0003A8, 0, { 0x0003C8 }},                      /* 03A8; 03C8; Case map */
+  { 0x0003A9, 0, { 0x0003C9 }},                      /* 03A9; 03C9; Case map */
+  { 0x0003AA, 0, { 0x0003CA }},                      /* 03AA; 03CA; Case map */
+  { 0x0003AB, 0, { 0x0003CB }},                      /* 03AB; 03CB; Case map */
+  { 0x0003B0, 0, { 0x0003C5,               /* 03B0; 03C5 0308 0301; Case map */
+                   0x000308, 0x000301 }},
+  { 0x0003C2, 0, { 0x0003C3 }},                      /* 03C2; 03C3; Case map */
+  { 0x0003D0, 0, { 0x0003B2 }},                      /* 03D0; 03B2; Case map */
+  { 0x0003D1, 0, { 0x0003B8 }},                      /* 03D1; 03B8; Case map */
+  { 0x0003D2, 0, { 0x0003C5 }},            /* 03D2; 03C5; Additional folding */
+  { 0x0003D3, 0, { 0x0003CD }},            /* 03D3; 03CD; Additional folding */
+  { 0x0003D4, 0, { 0x0003CB }},            /* 03D4; 03CB; Additional folding */
+  { 0x0003D5, 0, { 0x0003C6 }},                      /* 03D5; 03C6; Case map */
+  { 0x0003D6, 0, { 0x0003C0 }},                      /* 03D6; 03C0; Case map */
+  { 0x0003D8, 0, { 0x0003D9 }},                      /* 03D8; 03D9; Case map */
+  { 0x0003DA, 0, { 0x0003DB }},                      /* 03DA; 03DB; Case map */
+  { 0x0003DC, 0, { 0x0003DD }},                      /* 03DC; 03DD; Case map */
+  { 0x0003DE, 0, { 0x0003DF }},                      /* 03DE; 03DF; Case map */
+  { 0x0003E0, 0, { 0x0003E1 }},                      /* 03E0; 03E1; Case map */
+  { 0x0003E2, 0, { 0x0003E3 }},                      /* 03E2; 03E3; Case map */
+  { 0x0003E4, 0, { 0x0003E5 }},                      /* 03E4; 03E5; Case map */
+  { 0x0003E6, 0, { 0x0003E7 }},                      /* 03E6; 03E7; Case map */
+  { 0x0003E8, 0, { 0x0003E9 }},                      /* 03E8; 03E9; Case map */
+  { 0x0003EA, 0, { 0x0003EB }},                      /* 03EA; 03EB; Case map */
+  { 0x0003EC, 0, { 0x0003ED }},                      /* 03EC; 03ED; Case map */
+  { 0x0003EE, 0, { 0x0003EF }},                      /* 03EE; 03EF; Case map */
+  { 0x0003F0, 0, { 0x0003BA }},                      /* 03F0; 03BA; Case map */
+  { 0x0003F1, 0, { 0x0003C1 }},                      /* 03F1; 03C1; Case map */
+  { 0x0003F2, 0, { 0x0003C3 }},                      /* 03F2; 03C3; Case map */
+  { 0x0003F4, 0, { 0x0003B8 }},                      /* 03F4; 03B8; Case map */
+  { 0x0003F5, 0, { 0x0003B5 }},                      /* 03F5; 03B5; Case map */
+  { 0x000400, 0, { 0x000450 }},                      /* 0400; 0450; Case map */
+  { 0x000401, 0, { 0x000451 }},                      /* 0401; 0451; Case map */
+  { 0x000402, 0, { 0x000452 }},                      /* 0402; 0452; Case map */
+  { 0x000403, 0, { 0x000453 }},                      /* 0403; 0453; Case map */
+  { 0x000404, 0, { 0x000454 }},                      /* 0404; 0454; Case map */
+  { 0x000405, 0, { 0x000455 }},                      /* 0405; 0455; Case map */
+  { 0x000406, 0, { 0x000456 }},                      /* 0406; 0456; Case map */
+  { 0x000407, 0, { 0x000457 }},                      /* 0407; 0457; Case map */
+  { 0x000408, 0, { 0x000458 }},                      /* 0408; 0458; Case map */
+  { 0x000409, 0, { 0x000459 }},                      /* 0409; 0459; Case map */
+  { 0x00040A, 0, { 0x00045A }},                      /* 040A; 045A; Case map */
+  { 0x00040B, 0, { 0x00045B }},                      /* 040B; 045B; Case map */
+  { 0x00040C, 0, { 0x00045C }},                      /* 040C; 045C; Case map */
+  { 0x00040D, 0, { 0x00045D }},                      /* 040D; 045D; Case map */
+  { 0x00040E, 0, { 0x00045E }},                      /* 040E; 045E; Case map */
+  { 0x00040F, 0, { 0x00045F }},                      /* 040F; 045F; Case map */
+  { 0x000410, 0, { 0x000430 }},                      /* 0410; 0430; Case map */
+  { 0x000411, 0, { 0x000431 }},                      /* 0411; 0431; Case map */
+  { 0x000412, 0, { 0x000432 }},                      /* 0412; 0432; Case map */
+  { 0x000413, 0, { 0x000433 }},                      /* 0413; 0433; Case map */
+  { 0x000414, 0, { 0x000434 }},                      /* 0414; 0434; Case map */
+  { 0x000415, 0, { 0x000435 }},                      /* 0415; 0435; Case map */
+  { 0x000416, 0, { 0x000436 }},                      /* 0416; 0436; Case map */
+  { 0x000417, 0, { 0x000437 }},                      /* 0417; 0437; Case map */
+  { 0x000418, 0, { 0x000438 }},                      /* 0418; 0438; Case map */
+  { 0x000419, 0, { 0x000439 }},                      /* 0419; 0439; Case map */
+  { 0x00041A, 0, { 0x00043A }},                      /* 041A; 043A; Case map */
+  { 0x00041B, 0, { 0x00043B }},                      /* 041B; 043B; Case map */
+  { 0x00041C, 0, { 0x00043C }},                      /* 041C; 043C; Case map */
+  { 0x00041D, 0, { 0x00043D }},                      /* 041D; 043D; Case map */
+  { 0x00041E, 0, { 0x00043E }},                      /* 041E; 043E; Case map */
+  { 0x00041F, 0, { 0x00043F }},                      /* 041F; 043F; Case map */
+  { 0x000420, 0, { 0x000440 }},                      /* 0420; 0440; Case map */
+  { 0x000421, 0, { 0x000441 }},                      /* 0421; 0441; Case map */
+  { 0x000422, 0, { 0x000442 }},                      /* 0422; 0442; Case map */
+  { 0x000423, 0, { 0x000443 }},                      /* 0423; 0443; Case map */
+  { 0x000424, 0, { 0x000444 }},                      /* 0424; 0444; Case map */
+  { 0x000425, 0, { 0x000445 }},                      /* 0425; 0445; Case map */
+  { 0x000426, 0, { 0x000446 }},                      /* 0426; 0446; Case map */
+  { 0x000427, 0, { 0x000447 }},                      /* 0427; 0447; Case map */
+  { 0x000428, 0, { 0x000448 }},                      /* 0428; 0448; Case map */
+  { 0x000429, 0, { 0x000449 }},                      /* 0429; 0449; Case map */
+  { 0x00042A, 0, { 0x00044A }},                      /* 042A; 044A; Case map */
+  { 0x00042B, 0, { 0x00044B }},                      /* 042B; 044B; Case map */
+  { 0x00042C, 0, { 0x00044C }},                      /* 042C; 044C; Case map */
+  { 0x00042D, 0, { 0x00044D }},                      /* 042D; 044D; Case map */
+  { 0x00042E, 0, { 0x00044E }},                      /* 042E; 044E; Case map */
+  { 0x00042F, 0, { 0x00044F }},                      /* 042F; 044F; Case map */
+  { 0x000460, 0, { 0x000461 }},                      /* 0460; 0461; Case map */
+  { 0x000462, 0, { 0x000463 }},                      /* 0462; 0463; Case map */
+  { 0x000464, 0, { 0x000465 }},                      /* 0464; 0465; Case map */
+  { 0x000466, 0, { 0x000467 }},                      /* 0466; 0467; Case map */
+  { 0x000468, 0, { 0x000469 }},                      /* 0468; 0469; Case map */
+  { 0x00046A, 0, { 0x00046B }},                      /* 046A; 046B; Case map */
+  { 0x00046C, 0, { 0x00046D }},                      /* 046C; 046D; Case map */
+  { 0x00046E, 0, { 0x00046F }},                      /* 046E; 046F; Case map */
+  { 0x000470, 0, { 0x000471 }},                      /* 0470; 0471; Case map */
+  { 0x000472, 0, { 0x000473 }},                      /* 0472; 0473; Case map */
+  { 0x000474, 0, { 0x000475 }},                      /* 0474; 0475; Case map */
+  { 0x000476, 0, { 0x000477 }},                      /* 0476; 0477; Case map */
+  { 0x000478, 0, { 0x000479 }},                      /* 0478; 0479; Case map */
+  { 0x00047A, 0, { 0x00047B }},                      /* 047A; 047B; Case map */
+  { 0x00047C, 0, { 0x00047D }},                      /* 047C; 047D; Case map */
+  { 0x00047E, 0, { 0x00047F }},                      /* 047E; 047F; Case map */
+  { 0x000480, 0, { 0x000481 }},                      /* 0480; 0481; Case map */
+  { 0x00048A, 0, { 0x00048B }},                      /* 048A; 048B; Case map */
+  { 0x00048C, 0, { 0x00048D }},                      /* 048C; 048D; Case map */
+  { 0x00048E, 0, { 0x00048F }},                      /* 048E; 048F; Case map */
+  { 0x000490, 0, { 0x000491 }},                      /* 0490; 0491; Case map */
+  { 0x000492, 0, { 0x000493 }},                      /* 0492; 0493; Case map */
+  { 0x000494, 0, { 0x000495 }},                      /* 0494; 0495; Case map */
+  { 0x000496, 0, { 0x000497 }},                      /* 0496; 0497; Case map */
+  { 0x000498, 0, { 0x000499 }},                      /* 0498; 0499; Case map */
+  { 0x00049A, 0, { 0x00049B }},                      /* 049A; 049B; Case map */
+  { 0x00049C, 0, { 0x00049D }},                      /* 049C; 049D; Case map */
+  { 0x00049E, 0, { 0x00049F }},                      /* 049E; 049F; Case map */
+  { 0x0004A0, 0, { 0x0004A1 }},                      /* 04A0; 04A1; Case map */
+  { 0x0004A2, 0, { 0x0004A3 }},                      /* 04A2; 04A3; Case map */
+  { 0x0004A4, 0, { 0x0004A5 }},                      /* 04A4; 04A5; Case map */
+  { 0x0004A6, 0, { 0x0004A7 }},                      /* 04A6; 04A7; Case map */
+  { 0x0004A8, 0, { 0x0004A9 }},                      /* 04A8; 04A9; Case map */
+  { 0x0004AA, 0, { 0x0004AB }},                      /* 04AA; 04AB; Case map */
+  { 0x0004AC, 0, { 0x0004AD }},                      /* 04AC; 04AD; Case map */
+  { 0x0004AE, 0, { 0x0004AF }},                      /* 04AE; 04AF; Case map */
+  { 0x0004B0, 0, { 0x0004B1 }},                      /* 04B0; 04B1; Case map */
+  { 0x0004B2, 0, { 0x0004B3 }},                      /* 04B2; 04B3; Case map */
+  { 0x0004B4, 0, { 0x0004B5 }},                      /* 04B4; 04B5; Case map */
+  { 0x0004B6, 0, { 0x0004B7 }},                      /* 04B6; 04B7; Case map */
+  { 0x0004B8, 0, { 0x0004B9 }},                      /* 04B8; 04B9; Case map */
+  { 0x0004BA, 0, { 0x0004BB }},                      /* 04BA; 04BB; Case map */
+  { 0x0004BC, 0, { 0x0004BD }},                      /* 04BC; 04BD; Case map */
+  { 0x0004BE, 0, { 0x0004BF }},                      /* 04BE; 04BF; Case map */
+  { 0x0004C1, 0, { 0x0004C2 }},                      /* 04C1; 04C2; Case map */
+  { 0x0004C3, 0, { 0x0004C4 }},                      /* 04C3; 04C4; Case map */
+  { 0x0004C5, 0, { 0x0004C6 }},                      /* 04C5; 04C6; Case map */
+  { 0x0004C7, 0, { 0x0004C8 }},                      /* 04C7; 04C8; Case map */
+  { 0x0004C9, 0, { 0x0004CA }},                      /* 04C9; 04CA; Case map */
+  { 0x0004CB, 0, { 0x0004CC }},                      /* 04CB; 04CC; Case map */
+  { 0x0004CD, 0, { 0x0004CE }},                      /* 04CD; 04CE; Case map */
+  { 0x0004D0, 0, { 0x0004D1 }},                      /* 04D0; 04D1; Case map */
+  { 0x0004D2, 0, { 0x0004D3 }},                      /* 04D2; 04D3; Case map */
+  { 0x0004D4, 0, { 0x0004D5 }},                      /* 04D4; 04D5; Case map */
+  { 0x0004D6, 0, { 0x0004D7 }},                      /* 04D6; 04D7; Case map */
+  { 0x0004D8, 0, { 0x0004D9 }},                      /* 04D8; 04D9; Case map */
+  { 0x0004DA, 0, { 0x0004DB }},                      /* 04DA; 04DB; Case map */
+  { 0x0004DC, 0, { 0x0004DD }},                      /* 04DC; 04DD; Case map */
+  { 0x0004DE, 0, { 0x0004DF }},                      /* 04DE; 04DF; Case map */
+  { 0x0004E0, 0, { 0x0004E1 }},                      /* 04E0; 04E1; Case map */
+  { 0x0004E2, 0, { 0x0004E3 }},                      /* 04E2; 04E3; Case map */
+  { 0x0004E4, 0, { 0x0004E5 }},                      /* 04E4; 04E5; Case map */
+  { 0x0004E6, 0, { 0x0004E7 }},                      /* 04E6; 04E7; Case map */
+  { 0x0004E8, 0, { 0x0004E9 }},                      /* 04E8; 04E9; Case map */
+  { 0x0004EA, 0, { 0x0004EB }},                      /* 04EA; 04EB; Case map */
+  { 0x0004EC, 0, { 0x0004ED }},                      /* 04EC; 04ED; Case map */
+  { 0x0004EE, 0, { 0x0004EF }},                      /* 04EE; 04EF; Case map */
+  { 0x0004F0, 0, { 0x0004F1 }},                      /* 04F0; 04F1; Case map */
+  { 0x0004F2, 0, { 0x0004F3 }},                      /* 04F2; 04F3; Case map */
+  { 0x0004F4, 0, { 0x0004F5 }},                      /* 04F4; 04F5; Case map */
+  { 0x0004F8, 0, { 0x0004F9 }},                      /* 04F8; 04F9; Case map */
+  { 0x000500, 0, { 0x000501 }},                      /* 0500; 0501; Case map */
+  { 0x000502, 0, { 0x000503 }},                      /* 0502; 0503; Case map */
+  { 0x000504, 0, { 0x000505 }},                      /* 0504; 0505; Case map */
+  { 0x000506, 0, { 0x000507 }},                      /* 0506; 0507; Case map */
+  { 0x000508, 0, { 0x000509 }},                      /* 0508; 0509; Case map */
+  { 0x00050A, 0, { 0x00050B }},                      /* 050A; 050B; Case map */
+  { 0x00050C, 0, { 0x00050D }},                      /* 050C; 050D; Case map */
+  { 0x00050E, 0, { 0x00050F }},                      /* 050E; 050F; Case map */
+  { 0x000531, 0, { 0x000561 }},                      /* 0531; 0561; Case map */
+  { 0x000532, 0, { 0x000562 }},                      /* 0532; 0562; Case map */
+  { 0x000533, 0, { 0x000563 }},                      /* 0533; 0563; Case map */
+  { 0x000534, 0, { 0x000564 }},                      /* 0534; 0564; Case map */
+  { 0x000535, 0, { 0x000565 }},                      /* 0535; 0565; Case map */
+  { 0x000536, 0, { 0x000566 }},                      /* 0536; 0566; Case map */
+  { 0x000537, 0, { 0x000567 }},                      /* 0537; 0567; Case map */
+  { 0x000538, 0, { 0x000568 }},                      /* 0538; 0568; Case map */
+  { 0x000539, 0, { 0x000569 }},                      /* 0539; 0569; Case map */
+  { 0x00053A, 0, { 0x00056A }},                      /* 053A; 056A; Case map */
+  { 0x00053B, 0, { 0x00056B }},                      /* 053B; 056B; Case map */
+  { 0x00053C, 0, { 0x00056C }},                      /* 053C; 056C; Case map */
+  { 0x00053D, 0, { 0x00056D }},                      /* 053D; 056D; Case map */
+  { 0x00053E, 0, { 0x00056E }},                      /* 053E; 056E; Case map */
+  { 0x00053F, 0, { 0x00056F }},                      /* 053F; 056F; Case map */
+  { 0x000540, 0, { 0x000570 }},                      /* 0540; 0570; Case map */
+  { 0x000541, 0, { 0x000571 }},                      /* 0541; 0571; Case map */
+  { 0x000542, 0, { 0x000572 }},                      /* 0542; 0572; Case map */
+  { 0x000543, 0, { 0x000573 }},                      /* 0543; 0573; Case map */
+  { 0x000544, 0, { 0x000574 }},                      /* 0544; 0574; Case map */
+  { 0x000545, 0, { 0x000575 }},                      /* 0545; 0575; Case map */
+  { 0x000546, 0, { 0x000576 }},                      /* 0546; 0576; Case map */
+  { 0x000547, 0, { 0x000577 }},                      /* 0547; 0577; Case map */
+  { 0x000548, 0, { 0x000578 }},                      /* 0548; 0578; Case map */
+  { 0x000549, 0, { 0x000579 }},                      /* 0549; 0579; Case map */
+  { 0x00054A, 0, { 0x00057A }},                      /* 054A; 057A; Case map */
+  { 0x00054B, 0, { 0x00057B }},                      /* 054B; 057B; Case map */
+  { 0x00054C, 0, { 0x00057C }},                      /* 054C; 057C; Case map */
+  { 0x00054D, 0, { 0x00057D }},                      /* 054D; 057D; Case map */
+  { 0x00054E, 0, { 0x00057E }},                      /* 054E; 057E; Case map */
+  { 0x00054F, 0, { 0x00057F }},                      /* 054F; 057F; Case map */
+  { 0x000550, 0, { 0x000580 }},                      /* 0550; 0580; Case map */
+  { 0x000551, 0, { 0x000581 }},                      /* 0551; 0581; Case map */
+  { 0x000552, 0, { 0x000582 }},                      /* 0552; 0582; Case map */
+  { 0x000553, 0, { 0x000583 }},                      /* 0553; 0583; Case map */
+  { 0x000554, 0, { 0x000584 }},                      /* 0554; 0584; Case map */
+  { 0x000555, 0, { 0x000585 }},                      /* 0555; 0585; Case map */
+  { 0x000556, 0, { 0x000586 }},                      /* 0556; 0586; Case map */
+  { 0x000587, 0, { 0x000565,                    /* 0587; 0565 0582; Case map */
+                   0x000582 }},
+  { 0x001E00, 0, { 0x001E01 }},                      /* 1E00; 1E01; Case map */
+  { 0x001E02, 0, { 0x001E03 }},                      /* 1E02; 1E03; Case map */
+  { 0x001E04, 0, { 0x001E05 }},                      /* 1E04; 1E05; Case map */
+  { 0x001E06, 0, { 0x001E07 }},                      /* 1E06; 1E07; Case map */
+  { 0x001E08, 0, { 0x001E09 }},                      /* 1E08; 1E09; Case map */
+  { 0x001E0A, 0, { 0x001E0B }},                      /* 1E0A; 1E0B; Case map */
+  { 0x001E0C, 0, { 0x001E0D }},                      /* 1E0C; 1E0D; Case map */
+  { 0x001E0E, 0, { 0x001E0F }},                      /* 1E0E; 1E0F; Case map */
+  { 0x001E10, 0, { 0x001E11 }},                      /* 1E10; 1E11; Case map */
+  { 0x001E12, 0, { 0x001E13 }},                      /* 1E12; 1E13; Case map */
+  { 0x001E14, 0, { 0x001E15 }},                      /* 1E14; 1E15; Case map */
+  { 0x001E16, 0, { 0x001E17 }},                      /* 1E16; 1E17; Case map */
+  { 0x001E18, 0, { 0x001E19 }},                      /* 1E18; 1E19; Case map */
+  { 0x001E1A, 0, { 0x001E1B }},                      /* 1E1A; 1E1B; Case map */
+  { 0x001E1C, 0, { 0x001E1D }},                      /* 1E1C; 1E1D; Case map */
+  { 0x001E1E, 0, { 0x001E1F }},                      /* 1E1E; 1E1F; Case map */
+  { 0x001E20, 0, { 0x001E21 }},                      /* 1E20; 1E21; Case map */
+  { 0x001E22, 0, { 0x001E23 }},                      /* 1E22; 1E23; Case map */
+  { 0x001E24, 0, { 0x001E25 }},                      /* 1E24; 1E25; Case map */
+  { 0x001E26, 0, { 0x001E27 }},                      /* 1E26; 1E27; Case map */
+  { 0x001E28, 0, { 0x001E29 }},                      /* 1E28; 1E29; Case map */
+  { 0x001E2A, 0, { 0x001E2B }},                      /* 1E2A; 1E2B; Case map */
+  { 0x001E2C, 0, { 0x001E2D }},                      /* 1E2C; 1E2D; Case map */
+  { 0x001E2E, 0, { 0x001E2F }},                      /* 1E2E; 1E2F; Case map */
+  { 0x001E30, 0, { 0x001E31 }},                      /* 1E30; 1E31; Case map */
+  { 0x001E32, 0, { 0x001E33 }},                      /* 1E32; 1E33; Case map */
+  { 0x001E34, 0, { 0x001E35 }},                      /* 1E34; 1E35; Case map */
+  { 0x001E36, 0, { 0x001E37 }},                      /* 1E36; 1E37; Case map */
+  { 0x001E38, 0, { 0x001E39 }},                      /* 1E38; 1E39; Case map */
+  { 0x001E3A, 0, { 0x001E3B }},                      /* 1E3A; 1E3B; Case map */
+  { 0x001E3C, 0, { 0x001E3D }},                      /* 1E3C; 1E3D; Case map */
+  { 0x001E3E, 0, { 0x001E3F }},                      /* 1E3E; 1E3F; Case map */
+  { 0x001E40, 0, { 0x001E41 }},                      /* 1E40; 1E41; Case map */
+  { 0x001E42, 0, { 0x001E43 }},                      /* 1E42; 1E43; Case map */
+  { 0x001E44, 0, { 0x001E45 }},                      /* 1E44; 1E45; Case map */
+  { 0x001E46, 0, { 0x001E47 }},                      /* 1E46; 1E47; Case map */
+  { 0x001E48, 0, { 0x001E49 }},                      /* 1E48; 1E49; Case map */
+  { 0x001E4A, 0, { 0x001E4B }},                      /* 1E4A; 1E4B; Case map */
+  { 0x001E4C, 0, { 0x001E4D }},                      /* 1E4C; 1E4D; Case map */
+  { 0x001E4E, 0, { 0x001E4F }},                      /* 1E4E; 1E4F; Case map */
+  { 0x001E50, 0, { 0x001E51 }},                      /* 1E50; 1E51; Case map */
+  { 0x001E52, 0, { 0x001E53 }},                      /* 1E52; 1E53; Case map */
+  { 0x001E54, 0, { 0x001E55 }},                      /* 1E54; 1E55; Case map */
+  { 0x001E56, 0, { 0x001E57 }},                      /* 1E56; 1E57; Case map */
+  { 0x001E58, 0, { 0x001E59 }},                      /* 1E58; 1E59; Case map */
+  { 0x001E5A, 0, { 0x001E5B }},                      /* 1E5A; 1E5B; Case map */
+  { 0x001E5C, 0, { 0x001E5D }},                      /* 1E5C; 1E5D; Case map */
+  { 0x001E5E, 0, { 0x001E5F }},                      /* 1E5E; 1E5F; Case map */
+  { 0x001E60, 0, { 0x001E61 }},                      /* 1E60; 1E61; Case map */
+  { 0x001E62, 0, { 0x001E63 }},                      /* 1E62; 1E63; Case map */
+  { 0x001E64, 0, { 0x001E65 }},                      /* 1E64; 1E65; Case map */
+  { 0x001E66, 0, { 0x001E67 }},                      /* 1E66; 1E67; Case map */
+  { 0x001E68, 0, { 0x001E69 }},                      /* 1E68; 1E69; Case map */
+  { 0x001E6A, 0, { 0x001E6B }},                      /* 1E6A; 1E6B; Case map */
+  { 0x001E6C, 0, { 0x001E6D }},                      /* 1E6C; 1E6D; Case map */
+  { 0x001E6E, 0, { 0x001E6F }},                      /* 1E6E; 1E6F; Case map */
+  { 0x001E70, 0, { 0x001E71 }},                      /* 1E70; 1E71; Case map */
+  { 0x001E72, 0, { 0x001E73 }},                      /* 1E72; 1E73; Case map */
+  { 0x001E74, 0, { 0x001E75 }},                      /* 1E74; 1E75; Case map */
+  { 0x001E76, 0, { 0x001E77 }},                      /* 1E76; 1E77; Case map */
+  { 0x001E78, 0, { 0x001E79 }},                      /* 1E78; 1E79; Case map */
+  { 0x001E7A, 0, { 0x001E7B }},                      /* 1E7A; 1E7B; Case map */
+  { 0x001E7C, 0, { 0x001E7D }},                      /* 1E7C; 1E7D; Case map */
+  { 0x001E7E, 0, { 0x001E7F }},                      /* 1E7E; 1E7F; Case map */
+  { 0x001E80, 0, { 0x001E81 }},                      /* 1E80; 1E81; Case map */
+  { 0x001E82, 0, { 0x001E83 }},                      /* 1E82; 1E83; Case map */
+  { 0x001E84, 0, { 0x001E85 }},                      /* 1E84; 1E85; Case map */
+  { 0x001E86, 0, { 0x001E87 }},                      /* 1E86; 1E87; Case map */
+  { 0x001E88, 0, { 0x001E89 }},                      /* 1E88; 1E89; Case map */
+  { 0x001E8A, 0, { 0x001E8B }},                      /* 1E8A; 1E8B; Case map */
+  { 0x001E8C, 0, { 0x001E8D }},                      /* 1E8C; 1E8D; Case map */
+  { 0x001E8E, 0, { 0x001E8F }},                      /* 1E8E; 1E8F; Case map */
+  { 0x001E90, 0, { 0x001E91 }},                      /* 1E90; 1E91; Case map */
+  { 0x001E92, 0, { 0x001E93 }},                      /* 1E92; 1E93; Case map */
+  { 0x001E94, 0, { 0x001E95 }},                      /* 1E94; 1E95; Case map */
+  { 0x001E96, 0, { 0x000068,                    /* 1E96; 0068 0331; Case map */
+                   0x000331 }},
+  { 0x001E97, 0, { 0x000074,                    /* 1E97; 0074 0308; Case map */
+                   0x000308 }},
+  { 0x001E98, 0, { 0x000077,                    /* 1E98; 0077 030A; Case map */
+                   0x00030A }},
+  { 0x001E99, 0, { 0x000079,                    /* 1E99; 0079 030A; Case map */
+                   0x00030A }},
+  { 0x001E9A, 0, { 0x000061,                    /* 1E9A; 0061 02BE; Case map */
+                   0x0002BE }},
+  { 0x001E9B, 0, { 0x001E61 }},                      /* 1E9B; 1E61; Case map */
+  { 0x001EA0, 0, { 0x001EA1 }},                      /* 1EA0; 1EA1; Case map */
+  { 0x001EA2, 0, { 0x001EA3 }},                      /* 1EA2; 1EA3; Case map */
+  { 0x001EA4, 0, { 0x001EA5 }},                      /* 1EA4; 1EA5; Case map */
+  { 0x001EA6, 0, { 0x001EA7 }},                      /* 1EA6; 1EA7; Case map */
+  { 0x001EA8, 0, { 0x001EA9 }},                      /* 1EA8; 1EA9; Case map */
+  { 0x001EAA, 0, { 0x001EAB }},                      /* 1EAA; 1EAB; Case map */
+  { 0x001EAC, 0, { 0x001EAD }},                      /* 1EAC; 1EAD; Case map */
+  { 0x001EAE, 0, { 0x001EAF }},                      /* 1EAE; 1EAF; Case map */
+  { 0x001EB0, 0, { 0x001EB1 }},                      /* 1EB0; 1EB1; Case map */
+  { 0x001EB2, 0, { 0x001EB3 }},                      /* 1EB2; 1EB3; Case map */
+  { 0x001EB4, 0, { 0x001EB5 }},                      /* 1EB4; 1EB5; Case map */
+  { 0x001EB6, 0, { 0x001EB7 }},                      /* 1EB6; 1EB7; Case map */
+  { 0x001EB8, 0, { 0x001EB9 }},                      /* 1EB8; 1EB9; Case map */
+  { 0x001EBA, 0, { 0x001EBB }},                      /* 1EBA; 1EBB; Case map */
+  { 0x001EBC, 0, { 0x001EBD }},                      /* 1EBC; 1EBD; Case map */
+  { 0x001EBE, 0, { 0x001EBF }},                      /* 1EBE; 1EBF; Case map */
+  { 0x001EC0, 0, { 0x001EC1 }},                      /* 1EC0; 1EC1; Case map */
+  { 0x001EC2, 0, { 0x001EC3 }},                      /* 1EC2; 1EC3; Case map */
+  { 0x001EC4, 0, { 0x001EC5 }},                      /* 1EC4; 1EC5; Case map */
+  { 0x001EC6, 0, { 0x001EC7 }},                      /* 1EC6; 1EC7; Case map */
+  { 0x001EC8, 0, { 0x001EC9 }},                      /* 1EC8; 1EC9; Case map */
+  { 0x001ECA, 0, { 0x001ECB }},                      /* 1ECA; 1ECB; Case map */
+  { 0x001ECC, 0, { 0x001ECD }},                      /* 1ECC; 1ECD; Case map */
+  { 0x001ECE, 0, { 0x001ECF }},                      /* 1ECE; 1ECF; Case map */
+  { 0x001ED0, 0, { 0x001ED1 }},                      /* 1ED0; 1ED1; Case map */
+  { 0x001ED2, 0, { 0x001ED3 }},                      /* 1ED2; 1ED3; Case map */
+  { 0x001ED4, 0, { 0x001ED5 }},                      /* 1ED4; 1ED5; Case map */
+  { 0x001ED6, 0, { 0x001ED7 }},                      /* 1ED6; 1ED7; Case map */
+  { 0x001ED8, 0, { 0x001ED9 }},                      /* 1ED8; 1ED9; Case map */
+  { 0x001EDA, 0, { 0x001EDB }},                      /* 1EDA; 1EDB; Case map */
+  { 0x001EDC, 0, { 0x001EDD }},                      /* 1EDC; 1EDD; Case map */
+  { 0x001EDE, 0, { 0x001EDF }},                      /* 1EDE; 1EDF; Case map */
+  { 0x001EE0, 0, { 0x001EE1 }},                      /* 1EE0; 1EE1; Case map */
+  { 0x001EE2, 0, { 0x001EE3 }},                      /* 1EE2; 1EE3; Case map */
+  { 0x001EE4, 0, { 0x001EE5 }},                      /* 1EE4; 1EE5; Case map */
+  { 0x001EE6, 0, { 0x001EE7 }},                      /* 1EE6; 1EE7; Case map */
+  { 0x001EE8, 0, { 0x001EE9 }},                      /* 1EE8; 1EE9; Case map */
+  { 0x001EEA, 0, { 0x001EEB }},                      /* 1EEA; 1EEB; Case map */
+  { 0x001EEC, 0, { 0x001EED }},                      /* 1EEC; 1EED; Case map */
+  { 0x001EEE, 0, { 0x001EEF }},                      /* 1EEE; 1EEF; Case map */
+  { 0x001EF0, 0, { 0x001EF1 }},                      /* 1EF0; 1EF1; Case map */
+  { 0x001EF2, 0, { 0x001EF3 }},                      /* 1EF2; 1EF3; Case map */
+  { 0x001EF4, 0, { 0x001EF5 }},                      /* 1EF4; 1EF5; Case map */
+  { 0x001EF6, 0, { 0x001EF7 }},                      /* 1EF6; 1EF7; Case map */
+  { 0x001EF8, 0, { 0x001EF9 }},                      /* 1EF8; 1EF9; Case map */
+  { 0x001F08, 0, { 0x001F00 }},                      /* 1F08; 1F00; Case map */
+  { 0x001F09, 0, { 0x001F01 }},                      /* 1F09; 1F01; Case map */
+  { 0x001F0A, 0, { 0x001F02 }},                      /* 1F0A; 1F02; Case map */
+  { 0x001F0B, 0, { 0x001F03 }},                      /* 1F0B; 1F03; Case map */
+  { 0x001F0C, 0, { 0x001F04 }},                      /* 1F0C; 1F04; Case map */
+  { 0x001F0D, 0, { 0x001F05 }},                      /* 1F0D; 1F05; Case map */
+  { 0x001F0E, 0, { 0x001F06 }},                      /* 1F0E; 1F06; Case map */
+  { 0x001F0F, 0, { 0x001F07 }},                      /* 1F0F; 1F07; Case map */
+  { 0x001F18, 0, { 0x001F10 }},                      /* 1F18; 1F10; Case map */
+  { 0x001F19, 0, { 0x001F11 }},                      /* 1F19; 1F11; Case map */
+  { 0x001F1A, 0, { 0x001F12 }},                      /* 1F1A; 1F12; Case map */
+  { 0x001F1B, 0, { 0x001F13 }},                      /* 1F1B; 1F13; Case map */
+  { 0x001F1C, 0, { 0x001F14 }},                      /* 1F1C; 1F14; Case map */
+  { 0x001F1D, 0, { 0x001F15 }},                      /* 1F1D; 1F15; Case map */
+  { 0x001F28, 0, { 0x001F20 }},                      /* 1F28; 1F20; Case map */
+  { 0x001F29, 0, { 0x001F21 }},                      /* 1F29; 1F21; Case map */
+  { 0x001F2A, 0, { 0x001F22 }},                      /* 1F2A; 1F22; Case map */
+  { 0x001F2B, 0, { 0x001F23 }},                      /* 1F2B; 1F23; Case map */
+  { 0x001F2C, 0, { 0x001F24 }},                      /* 1F2C; 1F24; Case map */
+  { 0x001F2D, 0, { 0x001F25 }},                      /* 1F2D; 1F25; Case map */
+  { 0x001F2E, 0, { 0x001F26 }},                      /* 1F2E; 1F26; Case map */
+  { 0x001F2F, 0, { 0x001F27 }},                      /* 1F2F; 1F27; Case map */
+  { 0x001F38, 0, { 0x001F30 }},                      /* 1F38; 1F30; Case map */
+  { 0x001F39, 0, { 0x001F31 }},                      /* 1F39; 1F31; Case map */
+  { 0x001F3A, 0, { 0x001F32 }},                      /* 1F3A; 1F32; Case map */
+  { 0x001F3B, 0, { 0x001F33 }},                      /* 1F3B; 1F33; Case map */
+  { 0x001F3C, 0, { 0x001F34 }},                      /* 1F3C; 1F34; Case map */
+  { 0x001F3D, 0, { 0x001F35 }},                      /* 1F3D; 1F35; Case map */
+  { 0x001F3E, 0, { 0x001F36 }},                      /* 1F3E; 1F36; Case map */
+  { 0x001F3F, 0, { 0x001F37 }},                      /* 1F3F; 1F37; Case map */
+  { 0x001F48, 0, { 0x001F40 }},                      /* 1F48; 1F40; Case map */
+  { 0x001F49, 0, { 0x001F41 }},                      /* 1F49; 1F41; Case map */
+  { 0x001F4A, 0, { 0x001F42 }},                      /* 1F4A; 1F42; Case map */
+  { 0x001F4B, 0, { 0x001F43 }},                      /* 1F4B; 1F43; Case map */
+  { 0x001F4C, 0, { 0x001F44 }},                      /* 1F4C; 1F44; Case map */
+  { 0x001F4D, 0, { 0x001F45 }},                      /* 1F4D; 1F45; Case map */
+  { 0x001F50, 0, { 0x0003C5,                    /* 1F50; 03C5 0313; Case map */
+                   0x000313 }},
+  { 0x001F52, 0, { 0x0003C5,               /* 1F52; 03C5 0313 0300; Case map */
+                   0x000313, 0x000300 }},
+  { 0x001F54, 0, { 0x0003C5,               /* 1F54; 03C5 0313 0301; Case map */
+                   0x000313, 0x000301 }},
+  { 0x001F56, 0, { 0x0003C5,               /* 1F56; 03C5 0313 0342; Case map */
+                   0x000313, 0x000342 }},
+  { 0x001F59, 0, { 0x001F51 }},                      /* 1F59; 1F51; Case map */
+  { 0x001F5B, 0, { 0x001F53 }},                      /* 1F5B; 1F53; Case map */
+  { 0x001F5D, 0, { 0x001F55 }},                      /* 1F5D; 1F55; Case map */
+  { 0x001F5F, 0, { 0x001F57 }},                      /* 1F5F; 1F57; Case map */
+  { 0x001F68, 0, { 0x001F60 }},                      /* 1F68; 1F60; Case map */
+  { 0x001F69, 0, { 0x001F61 }},                      /* 1F69; 1F61; Case map */
+  { 0x001F6A, 0, { 0x001F62 }},                      /* 1F6A; 1F62; Case map */
+  { 0x001F6B, 0, { 0x001F63 }},                      /* 1F6B; 1F63; Case map */
+  { 0x001F6C, 0, { 0x001F64 }},                      /* 1F6C; 1F64; Case map */
+  { 0x001F6D, 0, { 0x001F65 }},                      /* 1F6D; 1F65; Case map */
+  { 0x001F6E, 0, { 0x001F66 }},                      /* 1F6E; 1F66; Case map */
+  { 0x001F6F, 0, { 0x001F67 }},                      /* 1F6F; 1F67; Case map */
+  { 0x001F80, 0, { 0x001F00,                    /* 1F80; 1F00 03B9; Case map */
+                   0x0003B9 }},
+  { 0x001F81, 0, { 0x001F01,                    /* 1F81; 1F01 03B9; Case map */
+                   0x0003B9 }},
+  { 0x001F82, 0, { 0x001F02,                    /* 1F82; 1F02 03B9; Case map */
+                   0x0003B9 }},
+  { 0x001F83, 0, { 0x001F03,                    /* 1F83; 1F03 03B9; Case map */
+                   0x0003B9 }},
+  { 0x001F84, 0, { 0x001F04,                    /* 1F84; 1F04 03B9; Case map */
+                   0x0003B9 }},
+  { 0x001F85, 0, { 0x001F05,                    /* 1F85; 1F05 03B9; Case map */
+                   0x0003B9 }},
+  { 0x001F86, 0, { 0x001F06,                    /* 1F86; 1F06 03B9; Case map */
+                   0x0003B9 }},
+  { 0x001F87, 0, { 0x001F07,                    /* 1F87; 1F07 03B9; Case map */
+                   0x0003B9 }},
+  { 0x001F88, 0, { 0x001F00,                    /* 1F88; 1F00 03B9; Case map */
+                   0x0003B9 }},
+  { 0x001F89, 0, { 0x001F01,                    /* 1F89; 1F01 03B9; Case map */
+                   0x0003B9 }},
+  { 0x001F8A, 0, { 0x001F02,                    /* 1F8A; 1F02 03B9; Case map */
+                   0x0003B9 }},
+  { 0x001F8B, 0, { 0x001F03,                    /* 1F8B; 1F03 03B9; Case map */
+                   0x0003B9 }},
+  { 0x001F8C, 0, { 0x001F04,                    /* 1F8C; 1F04 03B9; Case map */
+                   0x0003B9 }},
+  { 0x001F8D, 0, { 0x001F05,                    /* 1F8D; 1F05 03B9; Case map */
+                   0x0003B9 }},
+  { 0x001F8E, 0, { 0x001F06,                    /* 1F8E; 1F06 03B9; Case map */
+                   0x0003B9 }},
+  { 0x001F8F, 0, { 0x001F07,                    /* 1F8F; 1F07 03B9; Case map */
+                   0x0003B9 }},
+  { 0x001F90, 0, { 0x001F20,                    /* 1F90; 1F20 03B9; Case map */
+                   0x0003B9 }},
+  { 0x001F91, 0, { 0x001F21,                    /* 1F91; 1F21 03B9; Case map */
+                   0x0003B9 }},
+  { 0x001F92, 0, { 0x001F22,                    /* 1F92; 1F22 03B9; Case map */
+                   0x0003B9 }},
+  { 0x001F93, 0, { 0x001F23,                    /* 1F93; 1F23 03B9; Case map */
+                   0x0003B9 }},
+  { 0x001F94, 0, { 0x001F24,                    /* 1F94; 1F24 03B9; Case map */
+                   0x0003B9 }},
+  { 0x001F95, 0, { 0x001F25,                    /* 1F95; 1F25 03B9; Case map */
+                   0x0003B9 }},
+  { 0x001F96, 0, { 0x001F26,                    /* 1F96; 1F26 03B9; Case map */
+                   0x0003B9 }},
+  { 0x001F97, 0, { 0x001F27,                    /* 1F97; 1F27 03B9; Case map */
+                   0x0003B9 }},
+  { 0x001F98, 0, { 0x001F20,                    /* 1F98; 1F20 03B9; Case map */
+                   0x0003B9 }},
+  { 0x001F99, 0, { 0x001F21,                    /* 1F99; 1F21 03B9; Case map */
+                   0x0003B9 }},
+  { 0x001F9A, 0, { 0x001F22,                    /* 1F9A; 1F22 03B9; Case map */
+                   0x0003B9 }},
+  { 0x001F9B, 0, { 0x001F23,                    /* 1F9B; 1F23 03B9; Case map */
+                   0x0003B9 }},
+  { 0x001F9C, 0, { 0x001F24,                    /* 1F9C; 1F24 03B9; Case map */
+                   0x0003B9 }},
+  { 0x001F9D, 0, { 0x001F25,                    /* 1F9D; 1F25 03B9; Case map */
+                   0x0003B9 }},
+  { 0x001F9E, 0, { 0x001F26,                    /* 1F9E; 1F26 03B9; Case map */
+                   0x0003B9 }},
+  { 0x001F9F, 0, { 0x001F27,                    /* 1F9F; 1F27 03B9; Case map */
+                   0x0003B9 }},
+  { 0x001FA0, 0, { 0x001F60,                    /* 1FA0; 1F60 03B9; Case map */
+                   0x0003B9 }},
+  { 0x001FA1, 0, { 0x001F61,                    /* 1FA1; 1F61 03B9; Case map */
+                   0x0003B9 }},
+  { 0x001FA2, 0, { 0x001F62,                    /* 1FA2; 1F62 03B9; Case map */
+                   0x0003B9 }},
+  { 0x001FA3, 0, { 0x001F63,                    /* 1FA3; 1F63 03B9; Case map */
+                   0x0003B9 }},
+  { 0x001FA4, 0, { 0x001F64,                    /* 1FA4; 1F64 03B9; Case map */
+                   0x0003B9 }},
+  { 0x001FA5, 0, { 0x001F65,                    /* 1FA5; 1F65 03B9; Case map */
+                   0x0003B9 }},
+  { 0x001FA6, 0, { 0x001F66,                    /* 1FA6; 1F66 03B9; Case map */
+                   0x0003B9 }},
+  { 0x001FA7, 0, { 0x001F67,                    /* 1FA7; 1F67 03B9; Case map */
+                   0x0003B9 }},
+  { 0x001FA8, 0, { 0x001F60,                    /* 1FA8; 1F60 03B9; Case map */
+                   0x0003B9 }},
+  { 0x001FA9, 0, { 0x001F61,                    /* 1FA9; 1F61 03B9; Case map */
+                   0x0003B9 }},
+  { 0x001FAA, 0, { 0x001F62,                    /* 1FAA; 1F62 03B9; Case map */
+                   0x0003B9 }},
+  { 0x001FAB, 0, { 0x001F63,                    /* 1FAB; 1F63 03B9; Case map */
+                   0x0003B9 }},
+  { 0x001FAC, 0, { 0x001F64,                    /* 1FAC; 1F64 03B9; Case map */
+                   0x0003B9 }},
+  { 0x001FAD, 0, { 0x001F65,                    /* 1FAD; 1F65 03B9; Case map */
+                   0x0003B9 }},
+  { 0x001FAE, 0, { 0x001F66,                    /* 1FAE; 1F66 03B9; Case map */
+                   0x0003B9 }},
+  { 0x001FAF, 0, { 0x001F67,                    /* 1FAF; 1F67 03B9; Case map */
+                   0x0003B9 }},
+  { 0x001FB2, 0, { 0x001F70,                    /* 1FB2; 1F70 03B9; Case map */
+                   0x0003B9 }},
+  { 0x001FB3, 0, { 0x0003B1,                    /* 1FB3; 03B1 03B9; Case map */
+                   0x0003B9 }},
+  { 0x001FB4, 0, { 0x0003AC,                    /* 1FB4; 03AC 03B9; Case map */
+                   0x0003B9 }},
+  { 0x001FB6, 0, { 0x0003B1,                    /* 1FB6; 03B1 0342; Case map */
+                   0x000342 }},
+  { 0x001FB7, 0, { 0x0003B1,               /* 1FB7; 03B1 0342 03B9; Case map */
+                   0x000342, 0x0003B9 }},
+  { 0x001FB8, 0, { 0x001FB0 }},                      /* 1FB8; 1FB0; Case map */
+  { 0x001FB9, 0, { 0x001FB1 }},                      /* 1FB9; 1FB1; Case map */
+  { 0x001FBA, 0, { 0x001F70 }},                      /* 1FBA; 1F70; Case map */
+  { 0x001FBB, 0, { 0x001F71 }},                      /* 1FBB; 1F71; Case map */
+  { 0x001FBC, 0, { 0x0003B1,                    /* 1FBC; 03B1 03B9; Case map */
+                   0x0003B9 }},
+  { 0x001FBE, 0, { 0x0003B9 }},                      /* 1FBE; 03B9; Case map */
+  { 0x001FC2, 0, { 0x001F74,                    /* 1FC2; 1F74 03B9; Case map */
+                   0x0003B9 }},
+  { 0x001FC3, 0, { 0x0003B7,                    /* 1FC3; 03B7 03B9; Case map */
+                   0x0003B9 }},
+  { 0x001FC4, 0, { 0x0003AE,                    /* 1FC4; 03AE 03B9; Case map */
+                   0x0003B9 }},
+  { 0x001FC6, 0, { 0x0003B7,                    /* 1FC6; 03B7 0342; Case map */
+                   0x000342 }},
+  { 0x001FC7, 0, { 0x0003B7,               /* 1FC7; 03B7 0342 03B9; Case map */
+                   0x000342, 0x0003B9 }},
+  { 0x001FC8, 0, { 0x001F72 }},                      /* 1FC8; 1F72; Case map */
+  { 0x001FC9, 0, { 0x001F73 }},                      /* 1FC9; 1F73; Case map */
+  { 0x001FCA, 0, { 0x001F74 }},                      /* 1FCA; 1F74; Case map */
+  { 0x001FCB, 0, { 0x001F75 }},                      /* 1FCB; 1F75; Case map */
+  { 0x001FCC, 0, { 0x0003B7,                    /* 1FCC; 03B7 03B9; Case map */
+                   0x0003B9 }},
+  { 0x001FD2, 0, { 0x0003B9,               /* 1FD2; 03B9 0308 0300; Case map */
+                   0x000308, 0x000300 }},
+  { 0x001FD3, 0, { 0x0003B9,               /* 1FD3; 03B9 0308 0301; Case map */
+                   0x000308, 0x000301 }},
+  { 0x001FD6, 0, { 0x0003B9,                    /* 1FD6; 03B9 0342; Case map */
+                   0x000342 }},
+  { 0x001FD7, 0, { 0x0003B9,               /* 1FD7; 03B9 0308 0342; Case map */
+                   0x000308, 0x000342 }},
+  { 0x001FD8, 0, { 0x001FD0 }},                      /* 1FD8; 1FD0; Case map */
+  { 0x001FD9, 0, { 0x001FD1 }},                      /* 1FD9; 1FD1; Case map */
+  { 0x001FDA, 0, { 0x001F76 }},                      /* 1FDA; 1F76; Case map */
+  { 0x001FDB, 0, { 0x001F77 }},                      /* 1FDB; 1F77; Case map */
+  { 0x001FE2, 0, { 0x0003C5,               /* 1FE2; 03C5 0308 0300; Case map */
+                   0x000308, 0x000300 }},
+  { 0x001FE3, 0, { 0x0003C5,               /* 1FE3; 03C5 0308 0301; Case map */
+                   0x000308, 0x000301 }},
+  { 0x001FE4, 0, { 0x0003C1,                    /* 1FE4; 03C1 0313; Case map */
+                   0x000313 }},
+  { 0x001FE6, 0, { 0x0003C5,                    /* 1FE6; 03C5 0342; Case map */
+                   0x000342 }},
+  { 0x001FE7, 0, { 0x0003C5,               /* 1FE7; 03C5 0308 0342; Case map */
+                   0x000308, 0x000342 }},
+  { 0x001FE8, 0, { 0x001FE0 }},                      /* 1FE8; 1FE0; Case map */
+  { 0x001FE9, 0, { 0x001FE1 }},                      /* 1FE9; 1FE1; Case map */
+  { 0x001FEA, 0, { 0x001F7A }},                      /* 1FEA; 1F7A; Case map */
+  { 0x001FEB, 0, { 0x001F7B }},                      /* 1FEB; 1F7B; Case map */
+  { 0x001FEC, 0, { 0x001FE5 }},                      /* 1FEC; 1FE5; Case map */
+  { 0x001FF2, 0, { 0x001F7C,                    /* 1FF2; 1F7C 03B9; Case map */
+                   0x0003B9 }},
+  { 0x001FF3, 0, { 0x0003C9,                    /* 1FF3; 03C9 03B9; Case map */
+                   0x0003B9 }},
+  { 0x001FF4, 0, { 0x0003CE,                    /* 1FF4; 03CE 03B9; Case map */
+                   0x0003B9 }},
+  { 0x001FF6, 0, { 0x0003C9,                    /* 1FF6; 03C9 0342; Case map */
+                   0x000342 }},
+  { 0x001FF7, 0, { 0x0003C9,               /* 1FF7; 03C9 0342 03B9; Case map */
+                   0x000342, 0x0003B9 }},
+  { 0x001FF8, 0, { 0x001F78 }},                      /* 1FF8; 1F78; Case map */
+  { 0x001FF9, 0, { 0x001F79 }},                      /* 1FF9; 1F79; Case map */
+  { 0x001FFA, 0, { 0x001F7C }},                      /* 1FFA; 1F7C; Case map */
+  { 0x001FFB, 0, { 0x001F7D }},                      /* 1FFB; 1F7D; Case map */
+  { 0x001FFC, 0, { 0x0003C9,                    /* 1FFC; 03C9 03B9; Case map */
+                   0x0003B9 }},
+  { 0x0020A8, 0, { 0x000072,          /* 20A8; 0072 0073; Additional folding */
+                   0x000073 }},
+  { 0x002102, 0, { 0x000063 }},            /* 2102; 0063; Additional folding */
+  { 0x002103, 0, { 0x0000B0,          /* 2103; 00B0 0063; Additional folding */
+                   0x000063 }},
+  { 0x002107, 0, { 0x00025B }},            /* 2107; 025B; Additional folding */
+  { 0x002109, 0, { 0x0000B0,          /* 2109; 00B0 0066; Additional folding */
+                   0x000066 }},
+  { 0x00210B, 0, { 0x000068 }},            /* 210B; 0068; Additional folding */
+  { 0x00210C, 0, { 0x000068 }},            /* 210C; 0068; Additional folding */
+  { 0x00210D, 0, { 0x000068 }},            /* 210D; 0068; Additional folding */
+  { 0x002110, 0, { 0x000069 }},            /* 2110; 0069; Additional folding */
+  { 0x002111, 0, { 0x000069 }},            /* 2111; 0069; Additional folding */
+  { 0x002112, 0, { 0x00006C }},            /* 2112; 006C; Additional folding */
+  { 0x002115, 0, { 0x00006E }},            /* 2115; 006E; Additional folding */
+  { 0x002116, 0, { 0x00006E,          /* 2116; 006E 006F; Additional folding */
+                   0x00006F }},
+  { 0x002119, 0, { 0x000070 }},            /* 2119; 0070; Additional folding */
+  { 0x00211A, 0, { 0x000071 }},            /* 211A; 0071; Additional folding */
+  { 0x00211B, 0, { 0x000072 }},            /* 211B; 0072; Additional folding */
+  { 0x00211C, 0, { 0x000072 }},            /* 211C; 0072; Additional folding */
+  { 0x00211D, 0, { 0x000072 }},            /* 211D; 0072; Additional folding */
+  { 0x002120, 0, { 0x000073,          /* 2120; 0073 006D; Additional folding */
+                   0x00006D }},
+  { 0x002121, 0, { 0x000074,     /* 2121; 0074 0065 006C; Additional folding */
+                   0x000065, 0x00006C }},
+  { 0x002122, 0, { 0x000074,          /* 2122; 0074 006D; Additional folding */
+                   0x00006D }},
+  { 0x002124, 0, { 0x00007A }},            /* 2124; 007A; Additional folding */
+  { 0x002126, 0, { 0x0003C9 }},                      /* 2126; 03C9; Case map */
+  { 0x002128, 0, { 0x00007A }},            /* 2128; 007A; Additional folding */
+  { 0x00212A, 0, { 0x00006B }},                      /* 212A; 006B; Case map */
+  { 0x00212B, 0, { 0x0000E5 }},                      /* 212B; 00E5; Case map */
+  { 0x00212C, 0, { 0x000062 }},            /* 212C; 0062; Additional folding */
+  { 0x00212D, 0, { 0x000063 }},            /* 212D; 0063; Additional folding */
+  { 0x002130, 0, { 0x000065 }},            /* 2130; 0065; Additional folding */
+  { 0x002131, 0, { 0x000066 }},            /* 2131; 0066; Additional folding */
+  { 0x002133, 0, { 0x00006D }},            /* 2133; 006D; Additional folding */
+  { 0x00213E, 0, { 0x0003B3 }},            /* 213E; 03B3; Additional folding */
+  { 0x00213F, 0, { 0x0003C0 }},            /* 213F; 03C0; Additional folding */
+  { 0x002145, 0, { 0x000064 }},            /* 2145; 0064; Additional folding */
+  { 0x002160, 0, { 0x002170 }},                      /* 2160; 2170; Case map */
+  { 0x002161, 0, { 0x002171 }},                      /* 2161; 2171; Case map */
+  { 0x002162, 0, { 0x002172 }},                      /* 2162; 2172; Case map */
+  { 0x002163, 0, { 0x002173 }},                      /* 2163; 2173; Case map */
+  { 0x002164, 0, { 0x002174 }},                      /* 2164; 2174; Case map */
+  { 0x002165, 0, { 0x002175 }},                      /* 2165; 2175; Case map */
+  { 0x002166, 0, { 0x002176 }},                      /* 2166; 2176; Case map */
+  { 0x002167, 0, { 0x002177 }},                      /* 2167; 2177; Case map */
+  { 0x002168, 0, { 0x002178 }},                      /* 2168; 2178; Case map */
+  { 0x002169, 0, { 0x002179 }},                      /* 2169; 2179; Case map */
+  { 0x00216A, 0, { 0x00217A }},                      /* 216A; 217A; Case map */
+  { 0x00216B, 0, { 0x00217B }},                      /* 216B; 217B; Case map */
+  { 0x00216C, 0, { 0x00217C }},                      /* 216C; 217C; Case map */
+  { 0x00216D, 0, { 0x00217D }},                      /* 216D; 217D; Case map */
+  { 0x00216E, 0, { 0x00217E }},                      /* 216E; 217E; Case map */
+  { 0x00216F, 0, { 0x00217F }},                      /* 216F; 217F; Case map */
+  { 0x0024B6, 0, { 0x0024D0 }},                      /* 24B6; 24D0; Case map */
+  { 0x0024B7, 0, { 0x0024D1 }},                      /* 24B7; 24D1; Case map */
+  { 0x0024B8, 0, { 0x0024D2 }},                      /* 24B8; 24D2; Case map */
+  { 0x0024B9, 0, { 0x0024D3 }},                      /* 24B9; 24D3; Case map */
+  { 0x0024BA, 0, { 0x0024D4 }},                      /* 24BA; 24D4; Case map */
+  { 0x0024BB, 0, { 0x0024D5 }},                      /* 24BB; 24D5; Case map */
+  { 0x0024BC, 0, { 0x0024D6 }},                      /* 24BC; 24D6; Case map */
+  { 0x0024BD, 0, { 0x0024D7 }},                      /* 24BD; 24D7; Case map */
+  { 0x0024BE, 0, { 0x0024D8 }},                      /* 24BE; 24D8; Case map */
+  { 0x0024BF, 0, { 0x0024D9 }},                      /* 24BF; 24D9; Case map */
+  { 0x0024C0, 0, { 0x0024DA }},                      /* 24C0; 24DA; Case map */
+  { 0x0024C1, 0, { 0x0024DB }},                      /* 24C1; 24DB; Case map */
+  { 0x0024C2, 0, { 0x0024DC }},                      /* 24C2; 24DC; Case map */
+  { 0x0024C3, 0, { 0x0024DD }},                      /* 24C3; 24DD; Case map */
+  { 0x0024C4, 0, { 0x0024DE }},                      /* 24C4; 24DE; Case map */
+  { 0x0024C5, 0, { 0x0024DF }},                      /* 24C5; 24DF; Case map */
+  { 0x0024C6, 0, { 0x0024E0 }},                      /* 24C6; 24E0; Case map */
+  { 0x0024C7, 0, { 0x0024E1 }},                      /* 24C7; 24E1; Case map */
+  { 0x0024C8, 0, { 0x0024E2 }},                      /* 24C8; 24E2; Case map */
+  { 0x0024C9, 0, { 0x0024E3 }},                      /* 24C9; 24E3; Case map */
+  { 0x0024CA, 0, { 0x0024E4 }},                      /* 24CA; 24E4; Case map */
+  { 0x0024CB, 0, { 0x0024E5 }},                      /* 24CB; 24E5; Case map */
+  { 0x0024CC, 0, { 0x0024E6 }},                      /* 24CC; 24E6; Case map */
+  { 0x0024CD, 0, { 0x0024E7 }},                      /* 24CD; 24E7; Case map */
+  { 0x0024CE, 0, { 0x0024E8 }},                      /* 24CE; 24E8; Case map */
+  { 0x0024CF, 0, { 0x0024E9 }},                      /* 24CF; 24E9; Case map */
+  { 0x003371, 0, { 0x000068,     /* 3371; 0068 0070 0061; Additional folding */
+                   0x000070, 0x000061 }},
+  { 0x003373, 0, { 0x000061,          /* 3373; 0061 0075; Additional folding */
+                   0x000075 }},
+  { 0x003375, 0, { 0x00006F,          /* 3375; 006F 0076; Additional folding */
+                   0x000076 }},
+  { 0x003380, 0, { 0x000070,          /* 3380; 0070 0061; Additional folding */
+                   0x000061 }},
+  { 0x003381, 0, { 0x00006E,          /* 3381; 006E 0061; Additional folding */
+                   0x000061 }},
+  { 0x003382, 0, { 0x0003BC,          /* 3382; 03BC 0061; Additional folding */
+                   0x000061 }},
+  { 0x003383, 0, { 0x00006D,          /* 3383; 006D 0061; Additional folding */
+                   0x000061 }},
+  { 0x003384, 0, { 0x00006B,          /* 3384; 006B 0061; Additional folding */
+                   0x000061 }},
+  { 0x003385, 0, { 0x00006B,          /* 3385; 006B 0062; Additional folding */
+                   0x000062 }},
+  { 0x003386, 0, { 0x00006D,          /* 3386; 006D 0062; Additional folding */
+                   0x000062 }},
+  { 0x003387, 0, { 0x000067,          /* 3387; 0067 0062; Additional folding */
+                   0x000062 }},
+  { 0x00338A, 0, { 0x000070,          /* 338A; 0070 0066; Additional folding */
+                   0x000066 }},
+  { 0x00338B, 0, { 0x00006E,          /* 338B; 006E 0066; Additional folding */
+                   0x000066 }},
+  { 0x00338C, 0, { 0x0003BC,          /* 338C; 03BC 0066; Additional folding */
+                   0x000066 }},
+  { 0x003390, 0, { 0x000068,          /* 3390; 0068 007A; Additional folding */
+                   0x00007A }},
+  { 0x003391, 0, { 0x00006B,     /* 3391; 006B 0068 007A; Additional folding */
+                   0x000068, 0x00007A }},
+  { 0x003392, 0, { 0x00006D,     /* 3392; 006D 0068 007A; Additional folding */
+                   0x000068, 0x00007A }},
+  { 0x003393, 0, { 0x000067,     /* 3393; 0067 0068 007A; Additional folding */
+                   0x000068, 0x00007A }},
+  { 0x003394, 0, { 0x000074,     /* 3394; 0074 0068 007A; Additional folding */
+                   0x000068, 0x00007A }},
+  { 0x0033A9, 0, { 0x000070,          /* 33A9; 0070 0061; Additional folding */
+                   0x000061 }},
+  { 0x0033AA, 0, { 0x00006B,     /* 33AA; 006B 0070 0061; Additional folding */
+                   0x000070, 0x000061 }},
+  { 0x0033AB, 0, { 0x00006D,     /* 33AB; 006D 0070 0061; Additional folding */
+                   0x000070, 0x000061 }},
+  { 0x0033AC, 0, { 0x000067,     /* 33AC; 0067 0070 0061; Additional folding */
+                   0x000070, 0x000061 }},
+  { 0x0033B4, 0, { 0x000070,          /* 33B4; 0070 0076; Additional folding */
+                   0x000076 }},
+  { 0x0033B5, 0, { 0x00006E,          /* 33B5; 006E 0076; Additional folding */
+                   0x000076 }},
+  { 0x0033B6, 0, { 0x0003BC,          /* 33B6; 03BC 0076; Additional folding */
+                   0x000076 }},
+  { 0x0033B7, 0, { 0x00006D,          /* 33B7; 006D 0076; Additional folding */
+                   0x000076 }},
+  { 0x0033B8, 0, { 0x00006B,          /* 33B8; 006B 0076; Additional folding */
+                   0x000076 }},
+  { 0x0033B9, 0, { 0x00006D,          /* 33B9; 006D 0076; Additional folding */
+                   0x000076 }},
+  { 0x0033BA, 0, { 0x000070,          /* 33BA; 0070 0077; Additional folding */
+                   0x000077 }},
+  { 0x0033BB, 0, { 0x00006E,          /* 33BB; 006E 0077; Additional folding */
+                   0x000077 }},
+  { 0x0033BC, 0, { 0x0003BC,          /* 33BC; 03BC 0077; Additional folding */
+                   0x000077 }},
+  { 0x0033BD, 0, { 0x00006D,          /* 33BD; 006D 0077; Additional folding */
+                   0x000077 }},
+  { 0x0033BE, 0, { 0x00006B,          /* 33BE; 006B 0077; Additional folding */
+                   0x000077 }},
+  { 0x0033BF, 0, { 0x00006D,          /* 33BF; 006D 0077; Additional folding */
+                   0x000077 }},
+  { 0x0033C0, 0, { 0x00006B,          /* 33C0; 006B 03C9; Additional folding */
+                   0x0003C9 }},
+  { 0x0033C1, 0, { 0x00006D,          /* 33C1; 006D 03C9; Additional folding */
+                   0x0003C9 }},
+  { 0x0033C3, 0, { 0x000062,          /* 33C3; 0062 0071; Additional folding */
+                   0x000071 }},
+  { 0x0033C6, 0, { 0x000063, /* 33C6; 0063 2215 006B 0067; Additional folding */
+                   0x002215, 0x00006B, 0x000067 }},
+  { 0x0033C7, 0, { 0x000063,     /* 33C7; 0063 006F 002E; Additional folding */
+                   0x00006F, 0x00002E }},
+  { 0x0033C8, 0, { 0x000064,          /* 33C8; 0064 0062; Additional folding */
+                   0x000062 }},
+  { 0x0033C9, 0, { 0x000067,          /* 33C9; 0067 0079; Additional folding */
+                   0x000079 }},
+  { 0x0033CB, 0, { 0x000068,          /* 33CB; 0068 0070; Additional folding */
+                   0x000070 }},
+  { 0x0033CD, 0, { 0x00006B,          /* 33CD; 006B 006B; Additional folding */
+                   0x00006B }},
+  { 0x0033CE, 0, { 0x00006B,          /* 33CE; 006B 006D; Additional folding */
+                   0x00006D }},
+  { 0x0033D7, 0, { 0x000070,          /* 33D7; 0070 0068; Additional folding */
+                   0x000068 }},
+  { 0x0033D9, 0, { 0x000070,     /* 33D9; 0070 0070 006D; Additional folding */
+                   0x000070, 0x00006D }},
+  { 0x0033DA, 0, { 0x000070,          /* 33DA; 0070 0072; Additional folding */
+                   0x000072 }},
+  { 0x0033DC, 0, { 0x000073,          /* 33DC; 0073 0076; Additional folding */
+                   0x000076 }},
+  { 0x0033DD, 0, { 0x000077,          /* 33DD; 0077 0062; Additional folding */
+                   0x000062 }},
+  { 0x00FB00, 0, { 0x000066,                    /* FB00; 0066 0066; Case map */
+                   0x000066 }},
+  { 0x00FB01, 0, { 0x000066,                    /* FB01; 0066 0069; Case map */
+                   0x000069 }},
+  { 0x00FB02, 0, { 0x000066,                    /* FB02; 0066 006C; Case map */
+                   0x00006C }},
+  { 0x00FB03, 0, { 0x000066,               /* FB03; 0066 0066 0069; Case map */
+                   0x000066, 0x000069 }},
+  { 0x00FB04, 0, { 0x000066,               /* FB04; 0066 0066 006C; Case map */
+                   0x000066, 0x00006C }},
+  { 0x00FB05, 0, { 0x000073,                    /* FB05; 0073 0074; Case map */
+                   0x000074 }},
+  { 0x00FB06, 0, { 0x000073,                    /* FB06; 0073 0074; Case map */
+                   0x000074 }},
+  { 0x00FB13, 0, { 0x000574,                    /* FB13; 0574 0576; Case map */
+                   0x000576 }},
+  { 0x00FB14, 0, { 0x000574,                    /* FB14; 0574 0565; Case map */
+                   0x000565 }},
+  { 0x00FB15, 0, { 0x000574,                    /* FB15; 0574 056B; Case map */
+                   0x00056B }},
+  { 0x00FB16, 0, { 0x00057E,                    /* FB16; 057E 0576; Case map */
+                   0x000576 }},
+  { 0x00FB17, 0, { 0x000574,                    /* FB17; 0574 056D; Case map */
+                   0x00056D }},
+  { 0x00FF21, 0, { 0x00FF41 }},                      /* FF21; FF41; Case map */
+  { 0x00FF22, 0, { 0x00FF42 }},                      /* FF22; FF42; Case map */
+  { 0x00FF23, 0, { 0x00FF43 }},                      /* FF23; FF43; Case map */
+  { 0x00FF24, 0, { 0x00FF44 }},                      /* FF24; FF44; Case map */
+  { 0x00FF25, 0, { 0x00FF45 }},                      /* FF25; FF45; Case map */
+  { 0x00FF26, 0, { 0x00FF46 }},                      /* FF26; FF46; Case map */
+  { 0x00FF27, 0, { 0x00FF47 }},                      /* FF27; FF47; Case map */
+  { 0x00FF28, 0, { 0x00FF48 }},                      /* FF28; FF48; Case map */
+  { 0x00FF29, 0, { 0x00FF49 }},                      /* FF29; FF49; Case map */
+  { 0x00FF2A, 0, { 0x00FF4A }},                      /* FF2A; FF4A; Case map */
+  { 0x00FF2B, 0, { 0x00FF4B }},                      /* FF2B; FF4B; Case map */
+  { 0x00FF2C, 0, { 0x00FF4C }},                      /* FF2C; FF4C; Case map */
+  { 0x00FF2D, 0, { 0x00FF4D }},                      /* FF2D; FF4D; Case map */
+  { 0x00FF2E, 0, { 0x00FF4E }},                      /* FF2E; FF4E; Case map */
+  { 0x00FF2F, 0, { 0x00FF4F }},                      /* FF2F; FF4F; Case map */
+  { 0x00FF30, 0, { 0x00FF50 }},                      /* FF30; FF50; Case map */
+  { 0x00FF31, 0, { 0x00FF51 }},                      /* FF31; FF51; Case map */
+  { 0x00FF32, 0, { 0x00FF52 }},                      /* FF32; FF52; Case map */
+  { 0x00FF33, 0, { 0x00FF53 }},                      /* FF33; FF53; Case map */
+  { 0x00FF34, 0, { 0x00FF54 }},                      /* FF34; FF54; Case map */
+  { 0x00FF35, 0, { 0x00FF55 }},                      /* FF35; FF55; Case map */
+  { 0x00FF36, 0, { 0x00FF56 }},                      /* FF36; FF56; Case map */
+  { 0x00FF37, 0, { 0x00FF57 }},                      /* FF37; FF57; Case map */
+  { 0x00FF38, 0, { 0x00FF58 }},                      /* FF38; FF58; Case map */
+  { 0x00FF39, 0, { 0x00FF59 }},                      /* FF39; FF59; Case map */
+  { 0x00FF3A, 0, { 0x00FF5A }},                      /* FF3A; FF5A; Case map */
+  { 0x010400, 0, { 0x010428 }},                    /* 10400; 10428; Case map */
+  { 0x010401, 0, { 0x010429 }},                    /* 10401; 10429; Case map */
+  { 0x010402, 0, { 0x01042A }},                    /* 10402; 1042A; Case map */
+  { 0x010403, 0, { 0x01042B }},                    /* 10403; 1042B; Case map */
+  { 0x010404, 0, { 0x01042C }},                    /* 10404; 1042C; Case map */
+  { 0x010405, 0, { 0x01042D }},                    /* 10405; 1042D; Case map */
+  { 0x010406, 0, { 0x01042E }},                    /* 10406; 1042E; Case map */
+  { 0x010407, 0, { 0x01042F }},                    /* 10407; 1042F; Case map */
+  { 0x010408, 0, { 0x010430 }},                    /* 10408; 10430; Case map */
+  { 0x010409, 0, { 0x010431 }},                    /* 10409; 10431; Case map */
+  { 0x01040A, 0, { 0x010432 }},                    /* 1040A; 10432; Case map */
+  { 0x01040B, 0, { 0x010433 }},                    /* 1040B; 10433; Case map */
+  { 0x01040C, 0, { 0x010434 }},                    /* 1040C; 10434; Case map */
+  { 0x01040D, 0, { 0x010435 }},                    /* 1040D; 10435; Case map */
+  { 0x01040E, 0, { 0x010436 }},                    /* 1040E; 10436; Case map */
+  { 0x01040F, 0, { 0x010437 }},                    /* 1040F; 10437; Case map */
+  { 0x010410, 0, { 0x010438 }},                    /* 10410; 10438; Case map */
+  { 0x010411, 0, { 0x010439 }},                    /* 10411; 10439; Case map */
+  { 0x010412, 0, { 0x01043A }},                    /* 10412; 1043A; Case map */
+  { 0x010413, 0, { 0x01043B }},                    /* 10413; 1043B; Case map */
+  { 0x010414, 0, { 0x01043C }},                    /* 10414; 1043C; Case map */
+  { 0x010415, 0, { 0x01043D }},                    /* 10415; 1043D; Case map */
+  { 0x010416, 0, { 0x01043E }},                    /* 10416; 1043E; Case map */
+  { 0x010417, 0, { 0x01043F }},                    /* 10417; 1043F; Case map */
+  { 0x010418, 0, { 0x010440 }},                    /* 10418; 10440; Case map */
+  { 0x010419, 0, { 0x010441 }},                    /* 10419; 10441; Case map */
+  { 0x01041A, 0, { 0x010442 }},                    /* 1041A; 10442; Case map */
+  { 0x01041B, 0, { 0x010443 }},                    /* 1041B; 10443; Case map */
+  { 0x01041C, 0, { 0x010444 }},                    /* 1041C; 10444; Case map */
+  { 0x01041D, 0, { 0x010445 }},                    /* 1041D; 10445; Case map */
+  { 0x01041E, 0, { 0x010446 }},                    /* 1041E; 10446; Case map */
+  { 0x01041F, 0, { 0x010447 }},                    /* 1041F; 10447; Case map */
+  { 0x010420, 0, { 0x010448 }},                    /* 10420; 10448; Case map */
+  { 0x010421, 0, { 0x010449 }},                    /* 10421; 10449; Case map */
+  { 0x010422, 0, { 0x01044A }},                    /* 10422; 1044A; Case map */
+  { 0x010423, 0, { 0x01044B }},                    /* 10423; 1044B; Case map */
+  { 0x010424, 0, { 0x01044C }},                    /* 10424; 1044C; Case map */
+  { 0x010425, 0, { 0x01044D }},                    /* 10425; 1044D; Case map */
+  { 0x01D400, 0, { 0x000061 }},           /* 1D400; 0061; Additional folding */
+  { 0x01D401, 0, { 0x000062 }},           /* 1D401; 0062; Additional folding */
+  { 0x01D402, 0, { 0x000063 }},           /* 1D402; 0063; Additional folding */
+  { 0x01D403, 0, { 0x000064 }},           /* 1D403; 0064; Additional folding */
+  { 0x01D404, 0, { 0x000065 }},           /* 1D404; 0065; Additional folding */
+  { 0x01D405, 0, { 0x000066 }},           /* 1D405; 0066; Additional folding */
+  { 0x01D406, 0, { 0x000067 }},           /* 1D406; 0067; Additional folding */
+  { 0x01D407, 0, { 0x000068 }},           /* 1D407; 0068; Additional folding */
+  { 0x01D408, 0, { 0x000069 }},           /* 1D408; 0069; Additional folding */
+  { 0x01D409, 0, { 0x00006A }},           /* 1D409; 006A; Additional folding */
+  { 0x01D40A, 0, { 0x00006B }},           /* 1D40A; 006B; Additional folding */
+  { 0x01D40B, 0, { 0x00006C }},           /* 1D40B; 006C; Additional folding */
+  { 0x01D40C, 0, { 0x00006D }},           /* 1D40C; 006D; Additional folding */
+  { 0x01D40D, 0, { 0x00006E }},           /* 1D40D; 006E; Additional folding */
+  { 0x01D40E, 0, { 0x00006F }},           /* 1D40E; 006F; Additional folding */
+  { 0x01D40F, 0, { 0x000070 }},           /* 1D40F; 0070; Additional folding */
+  { 0x01D410, 0, { 0x000071 }},           /* 1D410; 0071; Additional folding */
+  { 0x01D411, 0, { 0x000072 }},           /* 1D411; 0072; Additional folding */
+  { 0x01D412, 0, { 0x000073 }},           /* 1D412; 0073; Additional folding */
+  { 0x01D413, 0, { 0x000074 }},           /* 1D413; 0074; Additional folding */
+  { 0x01D414, 0, { 0x000075 }},           /* 1D414; 0075; Additional folding */
+  { 0x01D415, 0, { 0x000076 }},           /* 1D415; 0076; Additional folding */
+  { 0x01D416, 0, { 0x000077 }},           /* 1D416; 0077; Additional folding */
+  { 0x01D417, 0, { 0x000078 }},           /* 1D417; 0078; Additional folding */
+  { 0x01D418, 0, { 0x000079 }},           /* 1D418; 0079; Additional folding */
+  { 0x01D419, 0, { 0x00007A }},           /* 1D419; 007A; Additional folding */
+  { 0x01D434, 0, { 0x000061 }},           /* 1D434; 0061; Additional folding */
+  { 0x01D435, 0, { 0x000062 }},           /* 1D435; 0062; Additional folding */
+  { 0x01D436, 0, { 0x000063 }},           /* 1D436; 0063; Additional folding */
+  { 0x01D437, 0, { 0x000064 }},           /* 1D437; 0064; Additional folding */
+  { 0x01D438, 0, { 0x000065 }},           /* 1D438; 0065; Additional folding */
+  { 0x01D439, 0, { 0x000066 }},           /* 1D439; 0066; Additional folding */
+  { 0x01D43A, 0, { 0x000067 }},           /* 1D43A; 0067; Additional folding */
+  { 0x01D43B, 0, { 0x000068 }},           /* 1D43B; 0068; Additional folding */
+  { 0x01D43C, 0, { 0x000069 }},           /* 1D43C; 0069; Additional folding */
+  { 0x01D43D, 0, { 0x00006A }},           /* 1D43D; 006A; Additional folding */
+  { 0x01D43E, 0, { 0x00006B }},           /* 1D43E; 006B; Additional folding */
+  { 0x01D43F, 0, { 0x00006C }},           /* 1D43F; 006C; Additional folding */
+  { 0x01D440, 0, { 0x00006D }},           /* 1D440; 006D; Additional folding */
+  { 0x01D441, 0, { 0x00006E }},           /* 1D441; 006E; Additional folding */
+  { 0x01D442, 0, { 0x00006F }},           /* 1D442; 006F; Additional folding */
+  { 0x01D443, 0, { 0x000070 }},           /* 1D443; 0070; Additional folding */
+  { 0x01D444, 0, { 0x000071 }},           /* 1D444; 0071; Additional folding */
+  { 0x01D445, 0, { 0x000072 }},           /* 1D445; 0072; Additional folding */
+  { 0x01D446, 0, { 0x000073 }},           /* 1D446; 0073; Additional folding */
+  { 0x01D447, 0, { 0x000074 }},           /* 1D447; 0074; Additional folding */
+  { 0x01D448, 0, { 0x000075 }},           /* 1D448; 0075; Additional folding */
+  { 0x01D449, 0, { 0x000076 }},           /* 1D449; 0076; Additional folding */
+  { 0x01D44A, 0, { 0x000077 }},           /* 1D44A; 0077; Additional folding */
+  { 0x01D44B, 0, { 0x000078 }},           /* 1D44B; 0078; Additional folding */
+  { 0x01D44C, 0, { 0x000079 }},           /* 1D44C; 0079; Additional folding */
+  { 0x01D44D, 0, { 0x00007A }},           /* 1D44D; 007A; Additional folding */
+  { 0x01D468, 0, { 0x000061 }},           /* 1D468; 0061; Additional folding */
+  { 0x01D469, 0, { 0x000062 }},           /* 1D469; 0062; Additional folding */
+  { 0x01D46A, 0, { 0x000063 }},           /* 1D46A; 0063; Additional folding */
+  { 0x01D46B, 0, { 0x000064 }},           /* 1D46B; 0064; Additional folding */
+  { 0x01D46C, 0, { 0x000065 }},           /* 1D46C; 0065; Additional folding */
+  { 0x01D46D, 0, { 0x000066 }},           /* 1D46D; 0066; Additional folding */
+  { 0x01D46E, 0, { 0x000067 }},           /* 1D46E; 0067; Additional folding */
+  { 0x01D46F, 0, { 0x000068 }},           /* 1D46F; 0068; Additional folding */
+  { 0x01D470, 0, { 0x000069 }},           /* 1D470; 0069; Additional folding */
+  { 0x01D471, 0, { 0x00006A }},           /* 1D471; 006A; Additional folding */
+  { 0x01D472, 0, { 0x00006B }},           /* 1D472; 006B; Additional folding */
+  { 0x01D473, 0, { 0x00006C }},           /* 1D473; 006C; Additional folding */
+  { 0x01D474, 0, { 0x00006D }},           /* 1D474; 006D; Additional folding */
+  { 0x01D475, 0, { 0x00006E }},           /* 1D475; 006E; Additional folding */
+  { 0x01D476, 0, { 0x00006F }},           /* 1D476; 006F; Additional folding */
+  { 0x01D477, 0, { 0x000070 }},           /* 1D477; 0070; Additional folding */
+  { 0x01D478, 0, { 0x000071 }},           /* 1D478; 0071; Additional folding */
+  { 0x01D479, 0, { 0x000072 }},           /* 1D479; 0072; Additional folding */
+  { 0x01D47A, 0, { 0x000073 }},           /* 1D47A; 0073; Additional folding */
+  { 0x01D47B, 0, { 0x000074 }},           /* 1D47B; 0074; Additional folding */
+  { 0x01D47C, 0, { 0x000075 }},           /* 1D47C; 0075; Additional folding */
+  { 0x01D47D, 0, { 0x000076 }},           /* 1D47D; 0076; Additional folding */
+  { 0x01D47E, 0, { 0x000077 }},           /* 1D47E; 0077; Additional folding */
+  { 0x01D47F, 0, { 0x000078 }},           /* 1D47F; 0078; Additional folding */
+  { 0x01D480, 0, { 0x000079 }},           /* 1D480; 0079; Additional folding */
+  { 0x01D481, 0, { 0x00007A }},           /* 1D481; 007A; Additional folding */
+  { 0x01D49C, 0, { 0x000061 }},           /* 1D49C; 0061; Additional folding */
+  { 0x01D49E, 0, { 0x000063 }},           /* 1D49E; 0063; Additional folding */
+  { 0x01D49F, 0, { 0x000064 }},           /* 1D49F; 0064; Additional folding */
+  { 0x01D4A2, 0, { 0x000067 }},           /* 1D4A2; 0067; Additional folding */
+  { 0x01D4A5, 0, { 0x00006A }},           /* 1D4A5; 006A; Additional folding */
+  { 0x01D4A6, 0, { 0x00006B }},           /* 1D4A6; 006B; Additional folding */
+  { 0x01D4A9, 0, { 0x00006E }},           /* 1D4A9; 006E; Additional folding */
+  { 0x01D4AA, 0, { 0x00006F }},           /* 1D4AA; 006F; Additional folding */
+  { 0x01D4AB, 0, { 0x000070 }},           /* 1D4AB; 0070; Additional folding */
+  { 0x01D4AC, 0, { 0x000071 }},           /* 1D4AC; 0071; Additional folding */
+  { 0x01D4AE, 0, { 0x000073 }},           /* 1D4AE; 0073; Additional folding */
+  { 0x01D4AF, 0, { 0x000074 }},           /* 1D4AF; 0074; Additional folding */
+  { 0x01D4B0, 0, { 0x000075 }},           /* 1D4B0; 0075; Additional folding */
+  { 0x01D4B1, 0, { 0x000076 }},           /* 1D4B1; 0076; Additional folding */
+  { 0x01D4B2, 0, { 0x000077 }},           /* 1D4B2; 0077; Additional folding */
+  { 0x01D4B3, 0, { 0x000078 }},           /* 1D4B3; 0078; Additional folding */
+  { 0x01D4B4, 0, { 0x000079 }},           /* 1D4B4; 0079; Additional folding */
+  { 0x01D4B5, 0, { 0x00007A }},           /* 1D4B5; 007A; Additional folding */
+  { 0x01D4D0, 0, { 0x000061 }},           /* 1D4D0; 0061; Additional folding */
+  { 0x01D4D1, 0, { 0x000062 }},           /* 1D4D1; 0062; Additional folding */
+  { 0x01D4D2, 0, { 0x000063 }},           /* 1D4D2; 0063; Additional folding */
+  { 0x01D4D3, 0, { 0x000064 }},           /* 1D4D3; 0064; Additional folding */
+  { 0x01D4D4, 0, { 0x000065 }},           /* 1D4D4; 0065; Additional folding */
+  { 0x01D4D5, 0, { 0x000066 }},           /* 1D4D5; 0066; Additional folding */
+  { 0x01D4D6, 0, { 0x000067 }},           /* 1D4D6; 0067; Additional folding */
+  { 0x01D4D7, 0, { 0x000068 }},           /* 1D4D7; 0068; Additional folding */
+  { 0x01D4D8, 0, { 0x000069 }},           /* 1D4D8; 0069; Additional folding */
+  { 0x01D4D9, 0, { 0x00006A }},           /* 1D4D9; 006A; Additional folding */
+  { 0x01D4DA, 0, { 0x00006B }},           /* 1D4DA; 006B; Additional folding */
+  { 0x01D4DB, 0, { 0x00006C }},           /* 1D4DB; 006C; Additional folding */
+  { 0x01D4DC, 0, { 0x00006D }},           /* 1D4DC; 006D; Additional folding */
+  { 0x01D4DD, 0, { 0x00006E }},           /* 1D4DD; 006E; Additional folding */
+  { 0x01D4DE, 0, { 0x00006F }},           /* 1D4DE; 006F; Additional folding */
+  { 0x01D4DF, 0, { 0x000070 }},           /* 1D4DF; 0070; Additional folding */
+  { 0x01D4E0, 0, { 0x000071 }},           /* 1D4E0; 0071; Additional folding */
+  { 0x01D4E1, 0, { 0x000072 }},           /* 1D4E1; 0072; Additional folding */
+  { 0x01D4E2, 0, { 0x000073 }},           /* 1D4E2; 0073; Additional folding */
+  { 0x01D4E3, 0, { 0x000074 }},           /* 1D4E3; 0074; Additional folding */
+  { 0x01D4E4, 0, { 0x000075 }},           /* 1D4E4; 0075; Additional folding */
+  { 0x01D4E5, 0, { 0x000076 }},           /* 1D4E5; 0076; Additional folding */
+  { 0x01D4E6, 0, { 0x000077 }},           /* 1D4E6; 0077; Additional folding */
+  { 0x01D4E7, 0, { 0x000078 }},           /* 1D4E7; 0078; Additional folding */
+  { 0x01D4E8, 0, { 0x000079 }},           /* 1D4E8; 0079; Additional folding */
+  { 0x01D4E9, 0, { 0x00007A }},           /* 1D4E9; 007A; Additional folding */
+  { 0x01D504, 0, { 0x000061 }},           /* 1D504; 0061; Additional folding */
+  { 0x01D505, 0, { 0x000062 }},           /* 1D505; 0062; Additional folding */
+  { 0x01D507, 0, { 0x000064 }},           /* 1D507; 0064; Additional folding */
+  { 0x01D508, 0, { 0x000065 }},           /* 1D508; 0065; Additional folding */
+  { 0x01D509, 0, { 0x000066 }},           /* 1D509; 0066; Additional folding */
+  { 0x01D50A, 0, { 0x000067 }},           /* 1D50A; 0067; Additional folding */
+  { 0x01D50D, 0, { 0x00006A }},           /* 1D50D; 006A; Additional folding */
+  { 0x01D50E, 0, { 0x00006B }},           /* 1D50E; 006B; Additional folding */
+  { 0x01D50F, 0, { 0x00006C }},           /* 1D50F; 006C; Additional folding */
+  { 0x01D510, 0, { 0x00006D }},           /* 1D510; 006D; Additional folding */
+  { 0x01D511, 0, { 0x00006E }},           /* 1D511; 006E; Additional folding */
+  { 0x01D512, 0, { 0x00006F }},           /* 1D512; 006F; Additional folding */
+  { 0x01D513, 0, { 0x000070 }},           /* 1D513; 0070; Additional folding */
+  { 0x01D514, 0, { 0x000071 }},           /* 1D514; 0071; Additional folding */
+  { 0x01D516, 0, { 0x000073 }},           /* 1D516; 0073; Additional folding */
+  { 0x01D517, 0, { 0x000074 }},           /* 1D517; 0074; Additional folding */
+  { 0x01D518, 0, { 0x000075 }},           /* 1D518; 0075; Additional folding */
+  { 0x01D519, 0, { 0x000076 }},           /* 1D519; 0076; Additional folding */
+  { 0x01D51A, 0, { 0x000077 }},           /* 1D51A; 0077; Additional folding */
+  { 0x01D51B, 0, { 0x000078 }},           /* 1D51B; 0078; Additional folding */
+  { 0x01D51C, 0, { 0x000079 }},           /* 1D51C; 0079; Additional folding */
+  { 0x01D538, 0, { 0x000061 }},           /* 1D538; 0061; Additional folding */
+  { 0x01D539, 0, { 0x000062 }},           /* 1D539; 0062; Additional folding */
+  { 0x01D53B, 0, { 0x000064 }},           /* 1D53B; 0064; Additional folding */
+  { 0x01D53C, 0, { 0x000065 }},           /* 1D53C; 0065; Additional folding */
+  { 0x01D53D, 0, { 0x000066 }},           /* 1D53D; 0066; Additional folding */
+  { 0x01D53E, 0, { 0x000067 }},           /* 1D53E; 0067; Additional folding */
+  { 0x01D540, 0, { 0x000069 }},           /* 1D540; 0069; Additional folding */
+  { 0x01D541, 0, { 0x00006A }},           /* 1D541; 006A; Additional folding */
+  { 0x01D542, 0, { 0x00006B }},           /* 1D542; 006B; Additional folding */
+  { 0x01D543, 0, { 0x00006C }},           /* 1D543; 006C; Additional folding */
+  { 0x01D544, 0, { 0x00006D }},           /* 1D544; 006D; Additional folding */
+  { 0x01D546, 0, { 0x00006F }},           /* 1D546; 006F; Additional folding */
+  { 0x01D54A, 0, { 0x000073 }},           /* 1D54A; 0073; Additional folding */
+  { 0x01D54B, 0, { 0x000074 }},           /* 1D54B; 0074; Additional folding */
+  { 0x01D54C, 0, { 0x000075 }},           /* 1D54C; 0075; Additional folding */
+  { 0x01D54D, 0, { 0x000076 }},           /* 1D54D; 0076; Additional folding */
+  { 0x01D54E, 0, { 0x000077 }},           /* 1D54E; 0077; Additional folding */
+  { 0x01D54F, 0, { 0x000078 }},           /* 1D54F; 0078; Additional folding */
+  { 0x01D550, 0, { 0x000079 }},           /* 1D550; 0079; Additional folding */
+  { 0x01D56C, 0, { 0x000061 }},           /* 1D56C; 0061; Additional folding */
+  { 0x01D56D, 0, { 0x000062 }},           /* 1D56D; 0062; Additional folding */
+  { 0x01D56E, 0, { 0x000063 }},           /* 1D56E; 0063; Additional folding */
+  { 0x01D56F, 0, { 0x000064 }},           /* 1D56F; 0064; Additional folding */
+  { 0x01D570, 0, { 0x000065 }},           /* 1D570; 0065; Additional folding */
+  { 0x01D571, 0, { 0x000066 }},           /* 1D571; 0066; Additional folding */
+  { 0x01D572, 0, { 0x000067 }},           /* 1D572; 0067; Additional folding */
+  { 0x01D573, 0, { 0x000068 }},           /* 1D573; 0068; Additional folding */
+  { 0x01D574, 0, { 0x000069 }},           /* 1D574; 0069; Additional folding */
+  { 0x01D575, 0, { 0x00006A }},           /* 1D575; 006A; Additional folding */
+  { 0x01D576, 0, { 0x00006B }},           /* 1D576; 006B; Additional folding */
+  { 0x01D577, 0, { 0x00006C }},           /* 1D577; 006C; Additional folding */
+  { 0x01D578, 0, { 0x00006D }},           /* 1D578; 006D; Additional folding */
+  { 0x01D579, 0, { 0x00006E }},           /* 1D579; 006E; Additional folding */
+  { 0x01D57A, 0, { 0x00006F }},           /* 1D57A; 006F; Additional folding */
+  { 0x01D57B, 0, { 0x000070 }},           /* 1D57B; 0070; Additional folding */
+  { 0x01D57C, 0, { 0x000071 }},           /* 1D57C; 0071; Additional folding */
+  { 0x01D57D, 0, { 0x000072 }},           /* 1D57D; 0072; Additional folding */
+  { 0x01D57E, 0, { 0x000073 }},           /* 1D57E; 0073; Additional folding */
+  { 0x01D57F, 0, { 0x000074 }},           /* 1D57F; 0074; Additional folding */
+  { 0x01D580, 0, { 0x000075 }},           /* 1D580; 0075; Additional folding */
+  { 0x01D581, 0, { 0x000076 }},           /* 1D581; 0076; Additional folding */
+  { 0x01D582, 0, { 0x000077 }},           /* 1D582; 0077; Additional folding */
+  { 0x01D583, 0, { 0x000078 }},           /* 1D583; 0078; Additional folding */
+  { 0x01D584, 0, { 0x000079 }},           /* 1D584; 0079; Additional folding */
+  { 0x01D585, 0, { 0x00007A }},           /* 1D585; 007A; Additional folding */
+  { 0x01D5A0, 0, { 0x000061 }},           /* 1D5A0; 0061; Additional folding */
+  { 0x01D5A1, 0, { 0x000062 }},           /* 1D5A1; 0062; Additional folding */
+  { 0x01D5A2, 0, { 0x000063 }},           /* 1D5A2; 0063; Additional folding */
+  { 0x01D5A3, 0, { 0x000064 }},           /* 1D5A3; 0064; Additional folding */
+  { 0x01D5A4, 0, { 0x000065 }},           /* 1D5A4; 0065; Additional folding */
+  { 0x01D5A5, 0, { 0x000066 }},           /* 1D5A5; 0066; Additional folding */
+  { 0x01D5A6, 0, { 0x000067 }},           /* 1D5A6; 0067; Additional folding */
+  { 0x01D5A7, 0, { 0x000068 }},           /* 1D5A7; 0068; Additional folding */
+  { 0x01D5A8, 0, { 0x000069 }},           /* 1D5A8; 0069; Additional folding */
+  { 0x01D5A9, 0, { 0x00006A }},           /* 1D5A9; 006A; Additional folding */
+  { 0x01D5AA, 0, { 0x00006B }},           /* 1D5AA; 006B; Additional folding */
+  { 0x01D5AB, 0, { 0x00006C }},           /* 1D5AB; 006C; Additional folding */
+  { 0x01D5AC, 0, { 0x00006D }},           /* 1D5AC; 006D; Additional folding */
+  { 0x01D5AD, 0, { 0x00006E }},           /* 1D5AD; 006E; Additional folding */
+  { 0x01D5AE, 0, { 0x00006F }},           /* 1D5AE; 006F; Additional folding */
+  { 0x01D5AF, 0, { 0x000070 }},           /* 1D5AF; 0070; Additional folding */
+  { 0x01D5B0, 0, { 0x000071 }},           /* 1D5B0; 0071; Additional folding */
+  { 0x01D5B1, 0, { 0x000072 }},           /* 1D5B1; 0072; Additional folding */
+  { 0x01D5B2, 0, { 0x000073 }},           /* 1D5B2; 0073; Additional folding */
+  { 0x01D5B3, 0, { 0x000074 }},           /* 1D5B3; 0074; Additional folding */
+  { 0x01D5B4, 0, { 0x000075 }},           /* 1D5B4; 0075; Additional folding */
+  { 0x01D5B5, 0, { 0x000076 }},           /* 1D5B5; 0076; Additional folding */
+  { 0x01D5B6, 0, { 0x000077 }},           /* 1D5B6; 0077; Additional folding */
+  { 0x01D5B7, 0, { 0x000078 }},           /* 1D5B7; 0078; Additional folding */
+  { 0x01D5B8, 0, { 0x000079 }},           /* 1D5B8; 0079; Additional folding */
+  { 0x01D5B9, 0, { 0x00007A }},           /* 1D5B9; 007A; Additional folding */
+  { 0x01D5D4, 0, { 0x000061 }},           /* 1D5D4; 0061; Additional folding */
+  { 0x01D5D5, 0, { 0x000062 }},           /* 1D5D5; 0062; Additional folding */
+  { 0x01D5D6, 0, { 0x000063 }},           /* 1D5D6; 0063; Additional folding */
+  { 0x01D5D7, 0, { 0x000064 }},           /* 1D5D7; 0064; Additional folding */
+  { 0x01D5D8, 0, { 0x000065 }},           /* 1D5D8; 0065; Additional folding */
+  { 0x01D5D9, 0, { 0x000066 }},           /* 1D5D9; 0066; Additional folding */
+  { 0x01D5DA, 0, { 0x000067 }},           /* 1D5DA; 0067; Additional folding */
+  { 0x01D5DB, 0, { 0x000068 }},           /* 1D5DB; 0068; Additional folding */
+  { 0x01D5DC, 0, { 0x000069 }},           /* 1D5DC; 0069; Additional folding */
+  { 0x01D5DD, 0, { 0x00006A }},           /* 1D5DD; 006A; Additional folding */
+  { 0x01D5DE, 0, { 0x00006B }},           /* 1D5DE; 006B; Additional folding */
+  { 0x01D5DF, 0, { 0x00006C }},           /* 1D5DF; 006C; Additional folding */
+  { 0x01D5E0, 0, { 0x00006D }},           /* 1D5E0; 006D; Additional folding */
+  { 0x01D5E1, 0, { 0x00006E }},           /* 1D5E1; 006E; Additional folding */
+  { 0x01D5E2, 0, { 0x00006F }},           /* 1D5E2; 006F; Additional folding */
+  { 0x01D5E3, 0, { 0x000070 }},           /* 1D5E3; 0070; Additional folding */
+  { 0x01D5E4, 0, { 0x000071 }},           /* 1D5E4; 0071; Additional folding */
+  { 0x01D5E5, 0, { 0x000072 }},           /* 1D5E5; 0072; Additional folding */
+  { 0x01D5E6, 0, { 0x000073 }},           /* 1D5E6; 0073; Additional folding */
+  { 0x01D5E7, 0, { 0x000074 }},           /* 1D5E7; 0074; Additional folding */
+  { 0x01D5E8, 0, { 0x000075 }},           /* 1D5E8; 0075; Additional folding */
+  { 0x01D5E9, 0, { 0x000076 }},           /* 1D5E9; 0076; Additional folding */
+  { 0x01D5EA, 0, { 0x000077 }},           /* 1D5EA; 0077; Additional folding */
+  { 0x01D5EB, 0, { 0x000078 }},           /* 1D5EB; 0078; Additional folding */
+  { 0x01D5EC, 0, { 0x000079 }},           /* 1D5EC; 0079; Additional folding */
+  { 0x01D5ED, 0, { 0x00007A }},           /* 1D5ED; 007A; Additional folding */
+  { 0x01D608, 0, { 0x000061 }},           /* 1D608; 0061; Additional folding */
+  { 0x01D609, 0, { 0x000062 }},           /* 1D609; 0062; Additional folding */
+  { 0x01D60A, 0, { 0x000063 }},           /* 1D60A; 0063; Additional folding */
+  { 0x01D60B, 0, { 0x000064 }},           /* 1D60B; 0064; Additional folding */
+  { 0x01D60C, 0, { 0x000065 }},           /* 1D60C; 0065; Additional folding */
+  { 0x01D60D, 0, { 0x000066 }},           /* 1D60D; 0066; Additional folding */
+  { 0x01D60E, 0, { 0x000067 }},           /* 1D60E; 0067; Additional folding */
+  { 0x01D60F, 0, { 0x000068 }},           /* 1D60F; 0068; Additional folding */
+  { 0x01D610, 0, { 0x000069 }},           /* 1D610; 0069; Additional folding */
+  { 0x01D611, 0, { 0x00006A }},           /* 1D611; 006A; Additional folding */
+  { 0x01D612, 0, { 0x00006B }},           /* 1D612; 006B; Additional folding */
+  { 0x01D613, 0, { 0x00006C }},           /* 1D613; 006C; Additional folding */
+  { 0x01D614, 0, { 0x00006D }},           /* 1D614; 006D; Additional folding */
+  { 0x01D615, 0, { 0x00006E }},           /* 1D615; 006E; Additional folding */
+  { 0x01D616, 0, { 0x00006F }},           /* 1D616; 006F; Additional folding */
+  { 0x01D617, 0, { 0x000070 }},           /* 1D617; 0070; Additional folding */
+  { 0x01D618, 0, { 0x000071 }},           /* 1D618; 0071; Additional folding */
+  { 0x01D619, 0, { 0x000072 }},           /* 1D619; 0072; Additional folding */
+  { 0x01D61A, 0, { 0x000073 }},           /* 1D61A; 0073; Additional folding */
+  { 0x01D61B, 0, { 0x000074 }},           /* 1D61B; 0074; Additional folding */
+  { 0x01D61C, 0, { 0x000075 }},           /* 1D61C; 0075; Additional folding */
+  { 0x01D61D, 0, { 0x000076 }},           /* 1D61D; 0076; Additional folding */
+  { 0x01D61E, 0, { 0x000077 }},           /* 1D61E; 0077; Additional folding */
+  { 0x01D61F, 0, { 0x000078 }},           /* 1D61F; 0078; Additional folding */
+  { 0x01D620, 0, { 0x000079 }},           /* 1D620; 0079; Additional folding */
+  { 0x01D621, 0, { 0x00007A }},           /* 1D621; 007A; Additional folding */
+  { 0x01D63C, 0, { 0x000061 }},           /* 1D63C; 0061; Additional folding */
+  { 0x01D63D, 0, { 0x000062 }},           /* 1D63D; 0062; Additional folding */
+  { 0x01D63E, 0, { 0x000063 }},           /* 1D63E; 0063; Additional folding */
+  { 0x01D63F, 0, { 0x000064 }},           /* 1D63F; 0064; Additional folding */
+  { 0x01D640, 0, { 0x000065 }},           /* 1D640; 0065; Additional folding */
+  { 0x01D641, 0, { 0x000066 }},           /* 1D641; 0066; Additional folding */
+  { 0x01D642, 0, { 0x000067 }},           /* 1D642; 0067; Additional folding */
+  { 0x01D643, 0, { 0x000068 }},           /* 1D643; 0068; Additional folding */
+  { 0x01D644, 0, { 0x000069 }},           /* 1D644; 0069; Additional folding */
+  { 0x01D645, 0, { 0x00006A }},           /* 1D645; 006A; Additional folding */
+  { 0x01D646, 0, { 0x00006B }},           /* 1D646; 006B; Additional folding */
+  { 0x01D647, 0, { 0x00006C }},           /* 1D647; 006C; Additional folding */
+  { 0x01D648, 0, { 0x00006D }},           /* 1D648; 006D; Additional folding */
+  { 0x01D649, 0, { 0x00006E }},           /* 1D649; 006E; Additional folding */
+  { 0x01D64A, 0, { 0x00006F }},           /* 1D64A; 006F; Additional folding */
+  { 0x01D64B, 0, { 0x000070 }},           /* 1D64B; 0070; Additional folding */
+  { 0x01D64C, 0, { 0x000071 }},           /* 1D64C; 0071; Additional folding */
+  { 0x01D64D, 0, { 0x000072 }},           /* 1D64D; 0072; Additional folding */
+  { 0x01D64E, 0, { 0x000073 }},           /* 1D64E; 0073; Additional folding */
+  { 0x01D64F, 0, { 0x000074 }},           /* 1D64F; 0074; Additional folding */
+  { 0x01D650, 0, { 0x000075 }},           /* 1D650; 0075; Additional folding */
+  { 0x01D651, 0, { 0x000076 }},           /* 1D651; 0076; Additional folding */
+  { 0x01D652, 0, { 0x000077 }},           /* 1D652; 0077; Additional folding */
+  { 0x01D653, 0, { 0x000078 }},           /* 1D653; 0078; Additional folding */
+  { 0x01D654, 0, { 0x000079 }},           /* 1D654; 0079; Additional folding */
+  { 0x01D655, 0, { 0x00007A }},           /* 1D655; 007A; Additional folding */
+  { 0x01D670, 0, { 0x000061 }},           /* 1D670; 0061; Additional folding */
+  { 0x01D671, 0, { 0x000062 }},           /* 1D671; 0062; Additional folding */
+  { 0x01D672, 0, { 0x000063 }},           /* 1D672; 0063; Additional folding */
+  { 0x01D673, 0, { 0x000064 }},           /* 1D673; 0064; Additional folding */
+  { 0x01D674, 0, { 0x000065 }},           /* 1D674; 0065; Additional folding */
+  { 0x01D675, 0, { 0x000066 }},           /* 1D675; 0066; Additional folding */
+  { 0x01D676, 0, { 0x000067 }},           /* 1D676; 0067; Additional folding */
+  { 0x01D677, 0, { 0x000068 }},           /* 1D677; 0068; Additional folding */
+  { 0x01D678, 0, { 0x000069 }},           /* 1D678; 0069; Additional folding */
+  { 0x01D679, 0, { 0x00006A }},           /* 1D679; 006A; Additional folding */
+  { 0x01D67A, 0, { 0x00006B }},           /* 1D67A; 006B; Additional folding */
+  { 0x01D67B, 0, { 0x00006C }},           /* 1D67B; 006C; Additional folding */
+  { 0x01D67C, 0, { 0x00006D }},           /* 1D67C; 006D; Additional folding */
+  { 0x01D67D, 0, { 0x00006E }},           /* 1D67D; 006E; Additional folding */
+  { 0x01D67E, 0, { 0x00006F }},           /* 1D67E; 006F; Additional folding */
+  { 0x01D67F, 0, { 0x000070 }},           /* 1D67F; 0070; Additional folding */
+  { 0x01D680, 0, { 0x000071 }},           /* 1D680; 0071; Additional folding */
+  { 0x01D681, 0, { 0x000072 }},           /* 1D681; 0072; Additional folding */
+  { 0x01D682, 0, { 0x000073 }},           /* 1D682; 0073; Additional folding */
+  { 0x01D683, 0, { 0x000074 }},           /* 1D683; 0074; Additional folding */
+  { 0x01D684, 0, { 0x000075 }},           /* 1D684; 0075; Additional folding */
+  { 0x01D685, 0, { 0x000076 }},           /* 1D685; 0076; Additional folding */
+  { 0x01D686, 0, { 0x000077 }},           /* 1D686; 0077; Additional folding */
+  { 0x01D687, 0, { 0x000078 }},           /* 1D687; 0078; Additional folding */
+  { 0x01D688, 0, { 0x000079 }},           /* 1D688; 0079; Additional folding */
+  { 0x01D689, 0, { 0x00007A }},           /* 1D689; 007A; Additional folding */
+  { 0x01D6A8, 0, { 0x0003B1 }},           /* 1D6A8; 03B1; Additional folding */
+  { 0x01D6A9, 0, { 0x0003B2 }},           /* 1D6A9; 03B2; Additional folding */
+  { 0x01D6AA, 0, { 0x0003B3 }},           /* 1D6AA; 03B3; Additional folding */
+  { 0x01D6AB, 0, { 0x0003B4 }},           /* 1D6AB; 03B4; Additional folding */
+  { 0x01D6AC, 0, { 0x0003B5 }},           /* 1D6AC; 03B5; Additional folding */
+  { 0x01D6AD, 0, { 0x0003B6 }},           /* 1D6AD; 03B6; Additional folding */
+  { 0x01D6AE, 0, { 0x0003B7 }},           /* 1D6AE; 03B7; Additional folding */
+  { 0x01D6AF, 0, { 0x0003B8 }},           /* 1D6AF; 03B8; Additional folding */
+  { 0x01D6B0, 0, { 0x0003B9 }},           /* 1D6B0; 03B9; Additional folding */
+  { 0x01D6B1, 0, { 0x0003BA }},           /* 1D6B1; 03BA; Additional folding */
+  { 0x01D6B2, 0, { 0x0003BB }},           /* 1D6B2; 03BB; Additional folding */
+  { 0x01D6B3, 0, { 0x0003BC }},           /* 1D6B3; 03BC; Additional folding */
+  { 0x01D6B4, 0, { 0x0003BD }},           /* 1D6B4; 03BD; Additional folding */
+  { 0x01D6B5, 0, { 0x0003BE }},           /* 1D6B5; 03BE; Additional folding */
+  { 0x01D6B6, 0, { 0x0003BF }},           /* 1D6B6; 03BF; Additional folding */
+  { 0x01D6B7, 0, { 0x0003C0 }},           /* 1D6B7; 03C0; Additional folding */
+  { 0x01D6B8, 0, { 0x0003C1 }},           /* 1D6B8; 03C1; Additional folding */
+  { 0x01D6B9, 0, { 0x0003B8 }},           /* 1D6B9; 03B8; Additional folding */
+  { 0x01D6BA, 0, { 0x0003C3 }},           /* 1D6BA; 03C3; Additional folding */
+  { 0x01D6BB, 0, { 0x0003C4 }},           /* 1D6BB; 03C4; Additional folding */
+  { 0x01D6BC, 0, { 0x0003C5 }},           /* 1D6BC; 03C5; Additional folding */
+  { 0x01D6BD, 0, { 0x0003C6 }},           /* 1D6BD; 03C6; Additional folding */
+  { 0x01D6BE, 0, { 0x0003C7 }},           /* 1D6BE; 03C7; Additional folding */
+  { 0x01D6BF, 0, { 0x0003C8 }},           /* 1D6BF; 03C8; Additional folding */
+  { 0x01D6C0, 0, { 0x0003C9 }},           /* 1D6C0; 03C9; Additional folding */
+  { 0x01D6D3, 0, { 0x0003C3 }},           /* 1D6D3; 03C3; Additional folding */
+  { 0x01D6E2, 0, { 0x0003B1 }},           /* 1D6E2; 03B1; Additional folding */
+  { 0x01D6E3, 0, { 0x0003B2 }},           /* 1D6E3; 03B2; Additional folding */
+  { 0x01D6E4, 0, { 0x0003B3 }},           /* 1D6E4; 03B3; Additional folding */
+  { 0x01D6E5, 0, { 0x0003B4 }},           /* 1D6E5; 03B4; Additional folding */
+  { 0x01D6E6, 0, { 0x0003B5 }},           /* 1D6E6; 03B5; Additional folding */
+  { 0x01D6E7, 0, { 0x0003B6 }},           /* 1D6E7; 03B6; Additional folding */
+  { 0x01D6E8, 0, { 0x0003B7 }},           /* 1D6E8; 03B7; Additional folding */
+  { 0x01D6E9, 0, { 0x0003B8 }},           /* 1D6E9; 03B8; Additional folding */
+  { 0x01D6EA, 0, { 0x0003B9 }},           /* 1D6EA; 03B9; Additional folding */
+  { 0x01D6EB, 0, { 0x0003BA }},           /* 1D6EB; 03BA; Additional folding */
+  { 0x01D6EC, 0, { 0x0003BB }},           /* 1D6EC; 03BB; Additional folding */
+  { 0x01D6ED, 0, { 0x0003BC }},           /* 1D6ED; 03BC; Additional folding */
+  { 0x01D6EE, 0, { 0x0003BD }},           /* 1D6EE; 03BD; Additional folding */
+  { 0x01D6EF, 0, { 0x0003BE }},           /* 1D6EF; 03BE; Additional folding */
+  { 0x01D6F0, 0, { 0x0003BF }},           /* 1D6F0; 03BF; Additional folding */
+  { 0x01D6F1, 0, { 0x0003C0 }},           /* 1D6F1; 03C0; Additional folding */
+  { 0x01D6F2, 0, { 0x0003C1 }},           /* 1D6F2; 03C1; Additional folding */
+  { 0x01D6F3, 0, { 0x0003B8 }},           /* 1D6F3; 03B8; Additional folding */
+  { 0x01D6F4, 0, { 0x0003C3 }},           /* 1D6F4; 03C3; Additional folding */
+  { 0x01D6F5, 0, { 0x0003C4 }},           /* 1D6F5; 03C4; Additional folding */
+  { 0x01D6F6, 0, { 0x0003C5 }},           /* 1D6F6; 03C5; Additional folding */
+  { 0x01D6F7, 0, { 0x0003C6 }},           /* 1D6F7; 03C6; Additional folding */
+  { 0x01D6F8, 0, { 0x0003C7 }},           /* 1D6F8; 03C7; Additional folding */
+  { 0x01D6F9, 0, { 0x0003C8 }},           /* 1D6F9; 03C8; Additional folding */
+  { 0x01D6FA, 0, { 0x0003C9 }},           /* 1D6FA; 03C9; Additional folding */
+  { 0x01D70D, 0, { 0x0003C3 }},           /* 1D70D; 03C3; Additional folding */
+  { 0x01D71C, 0, { 0x0003B1 }},           /* 1D71C; 03B1; Additional folding */
+  { 0x01D71D, 0, { 0x0003B2 }},           /* 1D71D; 03B2; Additional folding */
+  { 0x01D71E, 0, { 0x0003B3 }},           /* 1D71E; 03B3; Additional folding */
+  { 0x01D71F, 0, { 0x0003B4 }},           /* 1D71F; 03B4; Additional folding */
+  { 0x01D720, 0, { 0x0003B5 }},           /* 1D720; 03B5; Additional folding */
+  { 0x01D721, 0, { 0x0003B6 }},           /* 1D721; 03B6; Additional folding */
+  { 0x01D722, 0, { 0x0003B7 }},           /* 1D722; 03B7; Additional folding */
+  { 0x01D723, 0, { 0x0003B8 }},           /* 1D723; 03B8; Additional folding */
+  { 0x01D724, 0, { 0x0003B9 }},           /* 1D724; 03B9; Additional folding */
+  { 0x01D725, 0, { 0x0003BA }},           /* 1D725; 03BA; Additional folding */
+  { 0x01D726, 0, { 0x0003BB }},           /* 1D726; 03BB; Additional folding */
+  { 0x01D727, 0, { 0x0003BC }},           /* 1D727; 03BC; Additional folding */
+  { 0x01D728, 0, { 0x0003BD }},           /* 1D728; 03BD; Additional folding */
+  { 0x01D729, 0, { 0x0003BE }},           /* 1D729; 03BE; Additional folding */
+  { 0x01D72A, 0, { 0x0003BF }},           /* 1D72A; 03BF; Additional folding */
+  { 0x01D72B, 0, { 0x0003C0 }},           /* 1D72B; 03C0; Additional folding */
+  { 0x01D72C, 0, { 0x0003C1 }},           /* 1D72C; 03C1; Additional folding */
+  { 0x01D72D, 0, { 0x0003B8 }},           /* 1D72D; 03B8; Additional folding */
+  { 0x01D72E, 0, { 0x0003C3 }},           /* 1D72E; 03C3; Additional folding */
+  { 0x01D72F, 0, { 0x0003C4 }},           /* 1D72F; 03C4; Additional folding */
+  { 0x01D730, 0, { 0x0003C5 }},           /* 1D730; 03C5; Additional folding */
+  { 0x01D731, 0, { 0x0003C6 }},           /* 1D731; 03C6; Additional folding */
+  { 0x01D732, 0, { 0x0003C7 }},           /* 1D732; 03C7; Additional folding */
+  { 0x01D733, 0, { 0x0003C8 }},           /* 1D733; 03C8; Additional folding */
+  { 0x01D734, 0, { 0x0003C9 }},           /* 1D734; 03C9; Additional folding */
+  { 0x01D747, 0, { 0x0003C3 }},           /* 1D747; 03C3; Additional folding */
+  { 0x01D756, 0, { 0x0003B1 }},           /* 1D756; 03B1; Additional folding */
+  { 0x01D757, 0, { 0x0003B2 }},           /* 1D757; 03B2; Additional folding */
+  { 0x01D758, 0, { 0x0003B3 }},           /* 1D758; 03B3; Additional folding */
+  { 0x01D759, 0, { 0x0003B4 }},           /* 1D759; 03B4; Additional folding */
+  { 0x01D75A, 0, { 0x0003B5 }},           /* 1D75A; 03B5; Additional folding */
+  { 0x01D75B, 0, { 0x0003B6 }},           /* 1D75B; 03B6; Additional folding */
+  { 0x01D75C, 0, { 0x0003B7 }},           /* 1D75C; 03B7; Additional folding */
+  { 0x01D75D, 0, { 0x0003B8 }},           /* 1D75D; 03B8; Additional folding */
+  { 0x01D75E, 0, { 0x0003B9 }},           /* 1D75E; 03B9; Additional folding */
+  { 0x01D75F, 0, { 0x0003BA }},           /* 1D75F; 03BA; Additional folding */
+  { 0x01D760, 0, { 0x0003BB }},           /* 1D760; 03BB; Additional folding */
+  { 0x01D761, 0, { 0x0003BC }},           /* 1D761; 03BC; Additional folding */
+  { 0x01D762, 0, { 0x0003BD }},           /* 1D762; 03BD; Additional folding */
+  { 0x01D763, 0, { 0x0003BE }},           /* 1D763; 03BE; Additional folding */
+  { 0x01D764, 0, { 0x0003BF }},           /* 1D764; 03BF; Additional folding */
+  { 0x01D765, 0, { 0x0003C0 }},           /* 1D765; 03C0; Additional folding */
+  { 0x01D766, 0, { 0x0003C1 }},           /* 1D766; 03C1; Additional folding */
+  { 0x01D767, 0, { 0x0003B8 }},           /* 1D767; 03B8; Additional folding */
+  { 0x01D768, 0, { 0x0003C3 }},           /* 1D768; 03C3; Additional folding */
+  { 0x01D769, 0, { 0x0003C4 }},           /* 1D769; 03C4; Additional folding */
+  { 0x01D76A, 0, { 0x0003C5 }},           /* 1D76A; 03C5; Additional folding */
+  { 0x01D76B, 0, { 0x0003C6 }},           /* 1D76B; 03C6; Additional folding */
+  { 0x01D76C, 0, { 0x0003C7 }},           /* 1D76C; 03C7; Additional folding */
+  { 0x01D76D, 0, { 0x0003C8 }},           /* 1D76D; 03C8; Additional folding */
+  { 0x01D76E, 0, { 0x0003C9 }},           /* 1D76E; 03C9; Additional folding */
+  { 0x01D781, 0, { 0x0003C3 }},           /* 1D781; 03C3; Additional folding */
+  { 0x01D790, 0, { 0x0003B1 }},           /* 1D790; 03B1; Additional folding */
+  { 0x01D791, 0, { 0x0003B2 }},           /* 1D791; 03B2; Additional folding */
+  { 0x01D792, 0, { 0x0003B3 }},           /* 1D792; 03B3; Additional folding */
+  { 0x01D793, 0, { 0x0003B4 }},           /* 1D793; 03B4; Additional folding */
+  { 0x01D794, 0, { 0x0003B5 }},           /* 1D794; 03B5; Additional folding */
+  { 0x01D795, 0, { 0x0003B6 }},           /* 1D795; 03B6; Additional folding */
+  { 0x01D796, 0, { 0x0003B7 }},           /* 1D796; 03B7; Additional folding */
+  { 0x01D797, 0, { 0x0003B8 }},           /* 1D797; 03B8; Additional folding */
+  { 0x01D798, 0, { 0x0003B9 }},           /* 1D798; 03B9; Additional folding */
+  { 0x01D799, 0, { 0x0003BA }},           /* 1D799; 03BA; Additional folding */
+  { 0x01D79A, 0, { 0x0003BB }},           /* 1D79A; 03BB; Additional folding */
+  { 0x01D79B, 0, { 0x0003BC }},           /* 1D79B; 03BC; Additional folding */
+  { 0x01D79C, 0, { 0x0003BD }},           /* 1D79C; 03BD; Additional folding */
+  { 0x01D79D, 0, { 0x0003BE }},           /* 1D79D; 03BE; Additional folding */
+  { 0x01D79E, 0, { 0x0003BF }},           /* 1D79E; 03BF; Additional folding */
+  { 0x01D79F, 0, { 0x0003C0 }},           /* 1D79F; 03C0; Additional folding */
+  { 0x01D7A0, 0, { 0x0003C1 }},           /* 1D7A0; 03C1; Additional folding */
+  { 0x01D7A1, 0, { 0x0003B8 }},           /* 1D7A1; 03B8; Additional folding */
+  { 0x01D7A2, 0, { 0x0003C3 }},           /* 1D7A2; 03C3; Additional folding */
+  { 0x01D7A3, 0, { 0x0003C4 }},           /* 1D7A3; 03C4; Additional folding */
+  { 0x01D7A4, 0, { 0x0003C5 }},           /* 1D7A4; 03C5; Additional folding */
+  { 0x01D7A5, 0, { 0x0003C6 }},           /* 1D7A5; 03C6; Additional folding */
+  { 0x01D7A6, 0, { 0x0003C7 }},           /* 1D7A6; 03C7; Additional folding */
+  { 0x01D7A7, 0, { 0x0003C8 }},           /* 1D7A7; 03C8; Additional folding */
+  { 0x01D7A8, 0, { 0x0003C9 }},           /* 1D7A8; 03C9; Additional folding */
+  { 0x01D7BB, 0, { 0x0003C3 }},           /* 1D7BB; 03C3; Additional folding */
+  { 0 },
+};
+
+
+/*
+ * B.3 Mapping for case-folding used with no normalization
+ * 
+ */
+
+const Stringprep_table_element stringprep_rfc3454_B_3[] = {
+  { 0x000041, 0, { 0x000061 }},                      /* 0041; 0061; Case map */
+  { 0x000042, 0, { 0x000062 }},                      /* 0042; 0062; Case map */
+  { 0x000043, 0, { 0x000063 }},                      /* 0043; 0063; Case map */
+  { 0x000044, 0, { 0x000064 }},                      /* 0044; 0064; Case map */
+  { 0x000045, 0, { 0x000065 }},                      /* 0045; 0065; Case map */
+  { 0x000046, 0, { 0x000066 }},                      /* 0046; 0066; Case map */
+  { 0x000047, 0, { 0x000067 }},                      /* 0047; 0067; Case map */
+  { 0x000048, 0, { 0x000068 }},                      /* 0048; 0068; Case map */
+  { 0x000049, 0, { 0x000069 }},                      /* 0049; 0069; Case map */
+  { 0x00004A, 0, { 0x00006A }},                      /* 004A; 006A; Case map */
+  { 0x00004B, 0, { 0x00006B }},                      /* 004B; 006B; Case map */
+  { 0x00004C, 0, { 0x00006C }},                      /* 004C; 006C; Case map */
+  { 0x00004D, 0, { 0x00006D }},                      /* 004D; 006D; Case map */
+  { 0x00004E, 0, { 0x00006E }},                      /* 004E; 006E; Case map */
+  { 0x00004F, 0, { 0x00006F }},                      /* 004F; 006F; Case map */
+  { 0x000050, 0, { 0x000070 }},                      /* 0050; 0070; Case map */
+  { 0x000051, 0, { 0x000071 }},                      /* 0051; 0071; Case map */
+  { 0x000052, 0, { 0x000072 }},                      /* 0052; 0072; Case map */
+  { 0x000053, 0, { 0x000073 }},                      /* 0053; 0073; Case map */
+  { 0x000054, 0, { 0x000074 }},                      /* 0054; 0074; Case map */
+  { 0x000055, 0, { 0x000075 }},                      /* 0055; 0075; Case map */
+  { 0x000056, 0, { 0x000076 }},                      /* 0056; 0076; Case map */
+  { 0x000057, 0, { 0x000077 }},                      /* 0057; 0077; Case map */
+  { 0x000058, 0, { 0x000078 }},                      /* 0058; 0078; Case map */
+  { 0x000059, 0, { 0x000079 }},                      /* 0059; 0079; Case map */
+  { 0x00005A, 0, { 0x00007A }},                      /* 005A; 007A; Case map */
+  { 0x0000B5, 0, { 0x0003BC }},                      /* 00B5; 03BC; Case map */
+  { 0x0000C0, 0, { 0x0000E0 }},                      /* 00C0; 00E0; Case map */
+  { 0x0000C1, 0, { 0x0000E1 }},                      /* 00C1; 00E1; Case map */
+  { 0x0000C2, 0, { 0x0000E2 }},                      /* 00C2; 00E2; Case map */
+  { 0x0000C3, 0, { 0x0000E3 }},                      /* 00C3; 00E3; Case map */
+  { 0x0000C4, 0, { 0x0000E4 }},                      /* 00C4; 00E4; Case map */
+  { 0x0000C5, 0, { 0x0000E5 }},                      /* 00C5; 00E5; Case map */
+  { 0x0000C6, 0, { 0x0000E6 }},                      /* 00C6; 00E6; Case map */
+  { 0x0000C7, 0, { 0x0000E7 }},                      /* 00C7; 00E7; Case map */
+  { 0x0000C8, 0, { 0x0000E8 }},                      /* 00C8; 00E8; Case map */
+  { 0x0000C9, 0, { 0x0000E9 }},                      /* 00C9; 00E9; Case map */
+  { 0x0000CA, 0, { 0x0000EA }},                      /* 00CA; 00EA; Case map */
+  { 0x0000CB, 0, { 0x0000EB }},                      /* 00CB; 00EB; Case map */
+  { 0x0000CC, 0, { 0x0000EC }},                      /* 00CC; 00EC; Case map */
+  { 0x0000CD, 0, { 0x0000ED }},                      /* 00CD; 00ED; Case map */
+  { 0x0000CE, 0, { 0x0000EE }},                      /* 00CE; 00EE; Case map */
+  { 0x0000CF, 0, { 0x0000EF }},                      /* 00CF; 00EF; Case map */
+  { 0x0000D0, 0, { 0x0000F0 }},                      /* 00D0; 00F0; Case map */
+  { 0x0000D1, 0, { 0x0000F1 }},                      /* 00D1; 00F1; Case map */
+  { 0x0000D2, 0, { 0x0000F2 }},                      /* 00D2; 00F2; Case map */
+  { 0x0000D3, 0, { 0x0000F3 }},                      /* 00D3; 00F3; Case map */
+  { 0x0000D4, 0, { 0x0000F4 }},                      /* 00D4; 00F4; Case map */
+  { 0x0000D5, 0, { 0x0000F5 }},                      /* 00D5; 00F5; Case map */
+  { 0x0000D6, 0, { 0x0000F6 }},                      /* 00D6; 00F6; Case map */
+  { 0x0000D8, 0, { 0x0000F8 }},                      /* 00D8; 00F8; Case map */
+  { 0x0000D9, 0, { 0x0000F9 }},                      /* 00D9; 00F9; Case map */
+  { 0x0000DA, 0, { 0x0000FA }},                      /* 00DA; 00FA; Case map */
+  { 0x0000DB, 0, { 0x0000FB }},                      /* 00DB; 00FB; Case map */
+  { 0x0000DC, 0, { 0x0000FC }},                      /* 00DC; 00FC; Case map */
+  { 0x0000DD, 0, { 0x0000FD }},                      /* 00DD; 00FD; Case map */
+  { 0x0000DE, 0, { 0x0000FE }},                      /* 00DE; 00FE; Case map */
+  { 0x0000DF, 0, { 0x000073,                    /* 00DF; 0073 0073; Case map */
+                   0x000073 }},
+  { 0x000100, 0, { 0x000101 }},                      /* 0100; 0101; Case map */
+  { 0x000102, 0, { 0x000103 }},                      /* 0102; 0103; Case map */
+  { 0x000104, 0, { 0x000105 }},                      /* 0104; 0105; Case map */
+  { 0x000106, 0, { 0x000107 }},                      /* 0106; 0107; Case map */
+  { 0x000108, 0, { 0x000109 }},                      /* 0108; 0109; Case map */
+  { 0x00010A, 0, { 0x00010B }},                      /* 010A; 010B; Case map */
+  { 0x00010C, 0, { 0x00010D }},                      /* 010C; 010D; Case map */
+  { 0x00010E, 0, { 0x00010F }},                      /* 010E; 010F; Case map */
+  { 0x000110, 0, { 0x000111 }},                      /* 0110; 0111; Case map */
+  { 0x000112, 0, { 0x000113 }},                      /* 0112; 0113; Case map */
+  { 0x000114, 0, { 0x000115 }},                      /* 0114; 0115; Case map */
+  { 0x000116, 0, { 0x000117 }},                      /* 0116; 0117; Case map */
+  { 0x000118, 0, { 0x000119 }},                      /* 0118; 0119; Case map */
+  { 0x00011A, 0, { 0x00011B }},                      /* 011A; 011B; Case map */
+  { 0x00011C, 0, { 0x00011D }},                      /* 011C; 011D; Case map */
+  { 0x00011E, 0, { 0x00011F }},                      /* 011E; 011F; Case map */
+  { 0x000120, 0, { 0x000121 }},                      /* 0120; 0121; Case map */
+  { 0x000122, 0, { 0x000123 }},                      /* 0122; 0123; Case map */
+  { 0x000124, 0, { 0x000125 }},                      /* 0124; 0125; Case map */
+  { 0x000126, 0, { 0x000127 }},                      /* 0126; 0127; Case map */
+  { 0x000128, 0, { 0x000129 }},                      /* 0128; 0129; Case map */
+  { 0x00012A, 0, { 0x00012B }},                      /* 012A; 012B; Case map */
+  { 0x00012C, 0, { 0x00012D }},                      /* 012C; 012D; Case map */
+  { 0x00012E, 0, { 0x00012F }},                      /* 012E; 012F; Case map */
+  { 0x000130, 0, { 0x000069,                    /* 0130; 0069 0307; Case map */
+                   0x000307 }},
+  { 0x000132, 0, { 0x000133 }},                      /* 0132; 0133; Case map */
+  { 0x000134, 0, { 0x000135 }},                      /* 0134; 0135; Case map */
+  { 0x000136, 0, { 0x000137 }},                      /* 0136; 0137; Case map */
+  { 0x000139, 0, { 0x00013A }},                      /* 0139; 013A; Case map */
+  { 0x00013B, 0, { 0x00013C }},                      /* 013B; 013C; Case map */
+  { 0x00013D, 0, { 0x00013E }},                      /* 013D; 013E; Case map */
+  { 0x00013F, 0, { 0x000140 }},                      /* 013F; 0140; Case map */
+  { 0x000141, 0, { 0x000142 }},                      /* 0141; 0142; Case map */
+  { 0x000143, 0, { 0x000144 }},                      /* 0143; 0144; Case map */
+  { 0x000145, 0, { 0x000146 }},                      /* 0145; 0146; Case map */
+  { 0x000147, 0, { 0x000148 }},                      /* 0147; 0148; Case map */
+  { 0x000149, 0, { 0x0002BC,                    /* 0149; 02BC 006E; Case map */
+                   0x00006E }},
+  { 0x00014A, 0, { 0x00014B }},                      /* 014A; 014B; Case map */
+  { 0x00014C, 0, { 0x00014D }},                      /* 014C; 014D; Case map */
+  { 0x00014E, 0, { 0x00014F }},                      /* 014E; 014F; Case map */
+  { 0x000150, 0, { 0x000151 }},                      /* 0150; 0151; Case map */
+  { 0x000152, 0, { 0x000153 }},                      /* 0152; 0153; Case map */
+  { 0x000154, 0, { 0x000155 }},                      /* 0154; 0155; Case map */
+  { 0x000156, 0, { 0x000157 }},                      /* 0156; 0157; Case map */
+  { 0x000158, 0, { 0x000159 }},                      /* 0158; 0159; Case map */
+  { 0x00015A, 0, { 0x00015B }},                      /* 015A; 015B; Case map */
+  { 0x00015C, 0, { 0x00015D }},                      /* 015C; 015D; Case map */
+  { 0x00015E, 0, { 0x00015F }},                      /* 015E; 015F; Case map */
+  { 0x000160, 0, { 0x000161 }},                      /* 0160; 0161; Case map */
+  { 0x000162, 0, { 0x000163 }},                      /* 0162; 0163; Case map */
+  { 0x000164, 0, { 0x000165 }},                      /* 0164; 0165; Case map */
+  { 0x000166, 0, { 0x000167 }},                      /* 0166; 0167; Case map */
+  { 0x000168, 0, { 0x000169 }},                      /* 0168; 0169; Case map */
+  { 0x00016A, 0, { 0x00016B }},                      /* 016A; 016B; Case map */
+  { 0x00016C, 0, { 0x00016D }},                      /* 016C; 016D; Case map */
+  { 0x00016E, 0, { 0x00016F }},                      /* 016E; 016F; Case map */
+  { 0x000170, 0, { 0x000171 }},                      /* 0170; 0171; Case map */
+  { 0x000172, 0, { 0x000173 }},                      /* 0172; 0173; Case map */
+  { 0x000174, 0, { 0x000175 }},                      /* 0174; 0175; Case map */
+  { 0x000176, 0, { 0x000177 }},                      /* 0176; 0177; Case map */
+  { 0x000178, 0, { 0x0000FF }},                      /* 0178; 00FF; Case map */
+  { 0x000179, 0, { 0x00017A }},                      /* 0179; 017A; Case map */
+  { 0x00017B, 0, { 0x00017C }},                      /* 017B; 017C; Case map */
+  { 0x00017D, 0, { 0x00017E }},                      /* 017D; 017E; Case map */
+  { 0x00017F, 0, { 0x000073 }},                      /* 017F; 0073; Case map */
+  { 0x000181, 0, { 0x000253 }},                      /* 0181; 0253; Case map */
+  { 0x000182, 0, { 0x000183 }},                      /* 0182; 0183; Case map */
+  { 0x000184, 0, { 0x000185 }},                      /* 0184; 0185; Case map */
+  { 0x000186, 0, { 0x000254 }},                      /* 0186; 0254; Case map */
+  { 0x000187, 0, { 0x000188 }},                      /* 0187; 0188; Case map */
+  { 0x000189, 0, { 0x000256 }},                      /* 0189; 0256; Case map */
+  { 0x00018A, 0, { 0x000257 }},                      /* 018A; 0257; Case map */
+  { 0x00018B, 0, { 0x00018C }},                      /* 018B; 018C; Case map */
+  { 0x00018E, 0, { 0x0001DD }},                      /* 018E; 01DD; Case map */
+  { 0x00018F, 0, { 0x000259 }},                      /* 018F; 0259; Case map */
+  { 0x000190, 0, { 0x00025B }},                      /* 0190; 025B; Case map */
+  { 0x000191, 0, { 0x000192 }},                      /* 0191; 0192; Case map */
+  { 0x000193, 0, { 0x000260 }},                      /* 0193; 0260; Case map */
+  { 0x000194, 0, { 0x000263 }},                      /* 0194; 0263; Case map */
+  { 0x000196, 0, { 0x000269 }},                      /* 0196; 0269; Case map */
+  { 0x000197, 0, { 0x000268 }},                      /* 0197; 0268; Case map */
+  { 0x000198, 0, { 0x000199 }},                      /* 0198; 0199; Case map */
+  { 0x00019C, 0, { 0x00026F }},                      /* 019C; 026F; Case map */
+  { 0x00019D, 0, { 0x000272 }},                      /* 019D; 0272; Case map */
+  { 0x00019F, 0, { 0x000275 }},                      /* 019F; 0275; Case map */
+  { 0x0001A0, 0, { 0x0001A1 }},                      /* 01A0; 01A1; Case map */
+  { 0x0001A2, 0, { 0x0001A3 }},                      /* 01A2; 01A3; Case map */
+  { 0x0001A4, 0, { 0x0001A5 }},                      /* 01A4; 01A5; Case map */
+  { 0x0001A6, 0, { 0x000280 }},                      /* 01A6; 0280; Case map */
+  { 0x0001A7, 0, { 0x0001A8 }},                      /* 01A7; 01A8; Case map */
+  { 0x0001A9, 0, { 0x000283 }},                      /* 01A9; 0283; Case map */
+  { 0x0001AC, 0, { 0x0001AD }},                      /* 01AC; 01AD; Case map */
+  { 0x0001AE, 0, { 0x000288 }},                      /* 01AE; 0288; Case map */
+  { 0x0001AF, 0, { 0x0001B0 }},                      /* 01AF; 01B0; Case map */
+  { 0x0001B1, 0, { 0x00028A }},                      /* 01B1; 028A; Case map */
+  { 0x0001B2, 0, { 0x00028B }},                      /* 01B2; 028B; Case map */
+  { 0x0001B3, 0, { 0x0001B4 }},                      /* 01B3; 01B4; Case map */
+  { 0x0001B5, 0, { 0x0001B6 }},                      /* 01B5; 01B6; Case map */
+  { 0x0001B7, 0, { 0x000292 }},                      /* 01B7; 0292; Case map */
+  { 0x0001B8, 0, { 0x0001B9 }},                      /* 01B8; 01B9; Case map */
+  { 0x0001BC, 0, { 0x0001BD }},                      /* 01BC; 01BD; Case map */
+  { 0x0001C4, 0, { 0x0001C6 }},                      /* 01C4; 01C6; Case map */
+  { 0x0001C5, 0, { 0x0001C6 }},                      /* 01C5; 01C6; Case map */
+  { 0x0001C7, 0, { 0x0001C9 }},                      /* 01C7; 01C9; Case map */
+  { 0x0001C8, 0, { 0x0001C9 }},                      /* 01C8; 01C9; Case map */
+  { 0x0001CA, 0, { 0x0001CC }},                      /* 01CA; 01CC; Case map */
+  { 0x0001CB, 0, { 0x0001CC }},                      /* 01CB; 01CC; Case map */
+  { 0x0001CD, 0, { 0x0001CE }},                      /* 01CD; 01CE; Case map */
+  { 0x0001CF, 0, { 0x0001D0 }},                      /* 01CF; 01D0; Case map */
+  { 0x0001D1, 0, { 0x0001D2 }},                      /* 01D1; 01D2; Case map */
+  { 0x0001D3, 0, { 0x0001D4 }},                      /* 01D3; 01D4; Case map */
+  { 0x0001D5, 0, { 0x0001D6 }},                      /* 01D5; 01D6; Case map */
+  { 0x0001D7, 0, { 0x0001D8 }},                      /* 01D7; 01D8; Case map */
+  { 0x0001D9, 0, { 0x0001DA }},                      /* 01D9; 01DA; Case map */
+  { 0x0001DB, 0, { 0x0001DC }},                      /* 01DB; 01DC; Case map */
+  { 0x0001DE, 0, { 0x0001DF }},                      /* 01DE; 01DF; Case map */
+  { 0x0001E0, 0, { 0x0001E1 }},                      /* 01E0; 01E1; Case map */
+  { 0x0001E2, 0, { 0x0001E3 }},                      /* 01E2; 01E3; Case map */
+  { 0x0001E4, 0, { 0x0001E5 }},                      /* 01E4; 01E5; Case map */
+  { 0x0001E6, 0, { 0x0001E7 }},                      /* 01E6; 01E7; Case map */
+  { 0x0001E8, 0, { 0x0001E9 }},                      /* 01E8; 01E9; Case map */
+  { 0x0001EA, 0, { 0x0001EB }},                      /* 01EA; 01EB; Case map */
+  { 0x0001EC, 0, { 0x0001ED }},                      /* 01EC; 01ED; Case map */
+  { 0x0001EE, 0, { 0x0001EF }},                      /* 01EE; 01EF; Case map */
+  { 0x0001F0, 0, { 0x00006A,                    /* 01F0; 006A 030C; Case map */
+                   0x00030C }},
+  { 0x0001F1, 0, { 0x0001F3 }},                      /* 01F1; 01F3; Case map */
+  { 0x0001F2, 0, { 0x0001F3 }},                      /* 01F2; 01F3; Case map */
+  { 0x0001F4, 0, { 0x0001F5 }},                      /* 01F4; 01F5; Case map */
+  { 0x0001F6, 0, { 0x000195 }},                      /* 01F6; 0195; Case map */
+  { 0x0001F7, 0, { 0x0001BF }},                      /* 01F7; 01BF; Case map */
+  { 0x0001F8, 0, { 0x0001F9 }},                      /* 01F8; 01F9; Case map */
+  { 0x0001FA, 0, { 0x0001FB }},                      /* 01FA; 01FB; Case map */
+  { 0x0001FC, 0, { 0x0001FD }},                      /* 01FC; 01FD; Case map */
+  { 0x0001FE, 0, { 0x0001FF }},                      /* 01FE; 01FF; Case map */
+  { 0x000200, 0, { 0x000201 }},                      /* 0200; 0201; Case map */
+  { 0x000202, 0, { 0x000203 }},                      /* 0202; 0203; Case map */
+  { 0x000204, 0, { 0x000205 }},                      /* 0204; 0205; Case map */
+  { 0x000206, 0, { 0x000207 }},                      /* 0206; 0207; Case map */
+  { 0x000208, 0, { 0x000209 }},                      /* 0208; 0209; Case map */
+  { 0x00020A, 0, { 0x00020B }},                      /* 020A; 020B; Case map */
+  { 0x00020C, 0, { 0x00020D }},                      /* 020C; 020D; Case map */
+  { 0x00020E, 0, { 0x00020F }},                      /* 020E; 020F; Case map */
+  { 0x000210, 0, { 0x000211 }},                      /* 0210; 0211; Case map */
+  { 0x000212, 0, { 0x000213 }},                      /* 0212; 0213; Case map */
+  { 0x000214, 0, { 0x000215 }},                      /* 0214; 0215; Case map */
+  { 0x000216, 0, { 0x000217 }},                      /* 0216; 0217; Case map */
+  { 0x000218, 0, { 0x000219 }},                      /* 0218; 0219; Case map */
+  { 0x00021A, 0, { 0x00021B }},                      /* 021A; 021B; Case map */
+  { 0x00021C, 0, { 0x00021D }},                      /* 021C; 021D; Case map */
+  { 0x00021E, 0, { 0x00021F }},                      /* 021E; 021F; Case map */
+  { 0x000220, 0, { 0x00019E }},                      /* 0220; 019E; Case map */
+  { 0x000222, 0, { 0x000223 }},                      /* 0222; 0223; Case map */
+  { 0x000224, 0, { 0x000225 }},                      /* 0224; 0225; Case map */
+  { 0x000226, 0, { 0x000227 }},                      /* 0226; 0227; Case map */
+  { 0x000228, 0, { 0x000229 }},                      /* 0228; 0229; Case map */
+  { 0x00022A, 0, { 0x00022B }},                      /* 022A; 022B; Case map */
+  { 0x00022C, 0, { 0x00022D }},                      /* 022C; 022D; Case map */
+  { 0x00022E, 0, { 0x00022F }},                      /* 022E; 022F; Case map */
+  { 0x000230, 0, { 0x000231 }},                      /* 0230; 0231; Case map */
+  { 0x000232, 0, { 0x000233 }},                      /* 0232; 0233; Case map */
+  { 0x000345, 0, { 0x0003B9 }},                      /* 0345; 03B9; Case map */
+  { 0x000386, 0, { 0x0003AC }},                      /* 0386; 03AC; Case map */
+  { 0x000388, 0, { 0x0003AD }},                      /* 0388; 03AD; Case map */
+  { 0x000389, 0, { 0x0003AE }},                      /* 0389; 03AE; Case map */
+  { 0x00038A, 0, { 0x0003AF }},                      /* 038A; 03AF; Case map */
+  { 0x00038C, 0, { 0x0003CC }},                      /* 038C; 03CC; Case map */
+  { 0x00038E, 0, { 0x0003CD }},                      /* 038E; 03CD; Case map */
+  { 0x00038F, 0, { 0x0003CE }},                      /* 038F; 03CE; Case map */
+  { 0x000390, 0, { 0x0003B9,               /* 0390; 03B9 0308 0301; Case map */
+                   0x000308, 0x000301 }},
+  { 0x000391, 0, { 0x0003B1 }},                      /* 0391; 03B1; Case map */
+  { 0x000392, 0, { 0x0003B2 }},                      /* 0392; 03B2; Case map */
+  { 0x000393, 0, { 0x0003B3 }},                      /* 0393; 03B3; Case map */
+  { 0x000394, 0, { 0x0003B4 }},                      /* 0394; 03B4; Case map */
+  { 0x000395, 0, { 0x0003B5 }},                      /* 0395; 03B5; Case map */
+  { 0x000396, 0, { 0x0003B6 }},                      /* 0396; 03B6; Case map */
+  { 0x000397, 0, { 0x0003B7 }},                      /* 0397; 03B7; Case map */
+  { 0x000398, 0, { 0x0003B8 }},                      /* 0398; 03B8; Case map */
+  { 0x000399, 0, { 0x0003B9 }},                      /* 0399; 03B9; Case map */
+  { 0x00039A, 0, { 0x0003BA }},                      /* 039A; 03BA; Case map */
+  { 0x00039B, 0, { 0x0003BB }},                      /* 039B; 03BB; Case map */
+  { 0x00039C, 0, { 0x0003BC }},                      /* 039C; 03BC; Case map */
+  { 0x00039D, 0, { 0x0003BD }},                      /* 039D; 03BD; Case map */
+  { 0x00039E, 0, { 0x0003BE }},                      /* 039E; 03BE; Case map */
+  { 0x00039F, 0, { 0x0003BF }},                      /* 039F; 03BF; Case map */
+  { 0x0003A0, 0, { 0x0003C0 }},                      /* 03A0; 03C0; Case map */
+  { 0x0003A1, 0, { 0x0003C1 }},                      /* 03A1; 03C1; Case map */
+  { 0x0003A3, 0, { 0x0003C3 }},                      /* 03A3; 03C3; Case map */
+  { 0x0003A4, 0, { 0x0003C4 }},                      /* 03A4; 03C4; Case map */
+  { 0x0003A5, 0, { 0x0003C5 }},                      /* 03A5; 03C5; Case map */
+  { 0x0003A6, 0, { 0x0003C6 }},                      /* 03A6; 03C6; Case map */
+  { 0x0003A7, 0, { 0x0003C7 }},                      /* 03A7; 03C7; Case map */
+  { 0x0003A8, 0, { 0x0003C8 }},                      /* 03A8; 03C8; Case map */
+  { 0x0003A9, 0, { 0x0003C9 }},                      /* 03A9; 03C9; Case map */
+  { 0x0003AA, 0, { 0x0003CA }},                      /* 03AA; 03CA; Case map */
+  { 0x0003AB, 0, { 0x0003CB }},                      /* 03AB; 03CB; Case map */
+  { 0x0003B0, 0, { 0x0003C5,               /* 03B0; 03C5 0308 0301; Case map */
+                   0x000308, 0x000301 }},
+  { 0x0003C2, 0, { 0x0003C3 }},                      /* 03C2; 03C3; Case map */
+  { 0x0003D0, 0, { 0x0003B2 }},                      /* 03D0; 03B2; Case map */
+  { 0x0003D1, 0, { 0x0003B8 }},                      /* 03D1; 03B8; Case map */
+  { 0x0003D5, 0, { 0x0003C6 }},                      /* 03D5; 03C6; Case map */
+  { 0x0003D6, 0, { 0x0003C0 }},                      /* 03D6; 03C0; Case map */
+  { 0x0003D8, 0, { 0x0003D9 }},                      /* 03D8; 03D9; Case map */
+  { 0x0003DA, 0, { 0x0003DB }},                      /* 03DA; 03DB; Case map */
+  { 0x0003DC, 0, { 0x0003DD }},                      /* 03DC; 03DD; Case map */
+  { 0x0003DE, 0, { 0x0003DF }},                      /* 03DE; 03DF; Case map */
+  { 0x0003E0, 0, { 0x0003E1 }},                      /* 03E0; 03E1; Case map */
+  { 0x0003E2, 0, { 0x0003E3 }},                      /* 03E2; 03E3; Case map */
+  { 0x0003E4, 0, { 0x0003E5 }},                      /* 03E4; 03E5; Case map */
+  { 0x0003E6, 0, { 0x0003E7 }},                      /* 03E6; 03E7; Case map */
+  { 0x0003E8, 0, { 0x0003E9 }},                      /* 03E8; 03E9; Case map */
+  { 0x0003EA, 0, { 0x0003EB }},                      /* 03EA; 03EB; Case map */
+  { 0x0003EC, 0, { 0x0003ED }},                      /* 03EC; 03ED; Case map */
+  { 0x0003EE, 0, { 0x0003EF }},                      /* 03EE; 03EF; Case map */
+  { 0x0003F0, 0, { 0x0003BA }},                      /* 03F0; 03BA; Case map */
+  { 0x0003F1, 0, { 0x0003C1 }},                      /* 03F1; 03C1; Case map */
+  { 0x0003F2, 0, { 0x0003C3 }},                      /* 03F2; 03C3; Case map */
+  { 0x0003F4, 0, { 0x0003B8 }},                      /* 03F4; 03B8; Case map */
+  { 0x0003F5, 0, { 0x0003B5 }},                      /* 03F5; 03B5; Case map */
+  { 0x000400, 0, { 0x000450 }},                      /* 0400; 0450; Case map */
+  { 0x000401, 0, { 0x000451 }},                      /* 0401; 0451; Case map */
+  { 0x000402, 0, { 0x000452 }},                      /* 0402; 0452; Case map */
+  { 0x000403, 0, { 0x000453 }},                      /* 0403; 0453; Case map */
+  { 0x000404, 0, { 0x000454 }},                      /* 0404; 0454; Case map */
+  { 0x000405, 0, { 0x000455 }},                      /* 0405; 0455; Case map */
+  { 0x000406, 0, { 0x000456 }},                      /* 0406; 0456; Case map */
+  { 0x000407, 0, { 0x000457 }},                      /* 0407; 0457; Case map */
+  { 0x000408, 0, { 0x000458 }},                      /* 0408; 0458; Case map */
+  { 0x000409, 0, { 0x000459 }},                      /* 0409; 0459; Case map */
+  { 0x00040A, 0, { 0x00045A }},                      /* 040A; 045A; Case map */
+  { 0x00040B, 0, { 0x00045B }},                      /* 040B; 045B; Case map */
+  { 0x00040C, 0, { 0x00045C }},                      /* 040C; 045C; Case map */
+  { 0x00040D, 0, { 0x00045D }},                      /* 040D; 045D; Case map */
+  { 0x00040E, 0, { 0x00045E }},                      /* 040E; 045E; Case map */
+  { 0x00040F, 0, { 0x00045F }},                      /* 040F; 045F; Case map */
+  { 0x000410, 0, { 0x000430 }},                      /* 0410; 0430; Case map */
+  { 0x000411, 0, { 0x000431 }},                      /* 0411; 0431; Case map */
+  { 0x000412, 0, { 0x000432 }},                      /* 0412; 0432; Case map */
+  { 0x000413, 0, { 0x000433 }},                      /* 0413; 0433; Case map */
+  { 0x000414, 0, { 0x000434 }},                      /* 0414; 0434; Case map */
+  { 0x000415, 0, { 0x000435 }},                      /* 0415; 0435; Case map */
+  { 0x000416, 0, { 0x000436 }},                      /* 0416; 0436; Case map */
+  { 0x000417, 0, { 0x000437 }},                      /* 0417; 0437; Case map */
+  { 0x000418, 0, { 0x000438 }},                      /* 0418; 0438; Case map */
+  { 0x000419, 0, { 0x000439 }},                      /* 0419; 0439; Case map */
+  { 0x00041A, 0, { 0x00043A }},                      /* 041A; 043A; Case map */
+  { 0x00041B, 0, { 0x00043B }},                      /* 041B; 043B; Case map */
+  { 0x00041C, 0, { 0x00043C }},                      /* 041C; 043C; Case map */
+  { 0x00041D, 0, { 0x00043D }},                      /* 041D; 043D; Case map */
+  { 0x00041E, 0, { 0x00043E }},                      /* 041E; 043E; Case map */
+  { 0x00041F, 0, { 0x00043F }},                      /* 041F; 043F; Case map */
+  { 0x000420, 0, { 0x000440 }},                      /* 0420; 0440; Case map */
+  { 0x000421, 0, { 0x000441 }},                      /* 0421; 0441; Case map */
+  { 0x000422, 0, { 0x000442 }},                      /* 0422; 0442; Case map */
+  { 0x000423, 0, { 0x000443 }},                      /* 0423; 0443; Case map */
+  { 0x000424, 0, { 0x000444 }},                      /* 0424; 0444; Case map */
+  { 0x000425, 0, { 0x000445 }},                      /* 0425; 0445; Case map */
+  { 0x000426, 0, { 0x000446 }},                      /* 0426; 0446; Case map */
+  { 0x000427, 0, { 0x000447 }},                      /* 0427; 0447; Case map */
+  { 0x000428, 0, { 0x000448 }},                      /* 0428; 0448; Case map */
+  { 0x000429, 0, { 0x000449 }},                      /* 0429; 0449; Case map */
+  { 0x00042A, 0, { 0x00044A }},                      /* 042A; 044A; Case map */
+  { 0x00042B, 0, { 0x00044B }},                      /* 042B; 044B; Case map */
+  { 0x00042C, 0, { 0x00044C }},                      /* 042C; 044C; Case map */
+  { 0x00042D, 0, { 0x00044D }},                      /* 042D; 044D; Case map */
+  { 0x00042E, 0, { 0x00044E }},                      /* 042E; 044E; Case map */
+  { 0x00042F, 0, { 0x00044F }},                      /* 042F; 044F; Case map */
+  { 0x000460, 0, { 0x000461 }},                      /* 0460; 0461; Case map */
+  { 0x000462, 0, { 0x000463 }},                      /* 0462; 0463; Case map */
+  { 0x000464, 0, { 0x000465 }},                      /* 0464; 0465; Case map */
+  { 0x000466, 0, { 0x000467 }},                      /* 0466; 0467; Case map */
+  { 0x000468, 0, { 0x000469 }},                      /* 0468; 0469; Case map */
+  { 0x00046A, 0, { 0x00046B }},                      /* 046A; 046B; Case map */
+  { 0x00046C, 0, { 0x00046D }},                      /* 046C; 046D; Case map */
+  { 0x00046E, 0, { 0x00046F }},                      /* 046E; 046F; Case map */
+  { 0x000470, 0, { 0x000471 }},                      /* 0470; 0471; Case map */
+  { 0x000472, 0, { 0x000473 }},                      /* 0472; 0473; Case map */
+  { 0x000474, 0, { 0x000475 }},                      /* 0474; 0475; Case map */
+  { 0x000476, 0, { 0x000477 }},                      /* 0476; 0477; Case map */
+  { 0x000478, 0, { 0x000479 }},                      /* 0478; 0479; Case map */
+  { 0x00047A, 0, { 0x00047B }},                      /* 047A; 047B; Case map */
+  { 0x00047C, 0, { 0x00047D }},                      /* 047C; 047D; Case map */
+  { 0x00047E, 0, { 0x00047F }},                      /* 047E; 047F; Case map */
+  { 0x000480, 0, { 0x000481 }},                      /* 0480; 0481; Case map */
+  { 0x00048A, 0, { 0x00048B }},                      /* 048A; 048B; Case map */
+  { 0x00048C, 0, { 0x00048D }},                      /* 048C; 048D; Case map */
+  { 0x00048E, 0, { 0x00048F }},                      /* 048E; 048F; Case map */
+  { 0x000490, 0, { 0x000491 }},                      /* 0490; 0491; Case map */
+  { 0x000492, 0, { 0x000493 }},                      /* 0492; 0493; Case map */
+  { 0x000494, 0, { 0x000495 }},                      /* 0494; 0495; Case map */
+  { 0x000496, 0, { 0x000497 }},                      /* 0496; 0497; Case map */
+  { 0x000498, 0, { 0x000499 }},                      /* 0498; 0499; Case map */
+  { 0x00049A, 0, { 0x00049B }},                      /* 049A; 049B; Case map */
+  { 0x00049C, 0, { 0x00049D }},                      /* 049C; 049D; Case map */
+  { 0x00049E, 0, { 0x00049F }},                      /* 049E; 049F; Case map */
+  { 0x0004A0, 0, { 0x0004A1 }},                      /* 04A0; 04A1; Case map */
+  { 0x0004A2, 0, { 0x0004A3 }},                      /* 04A2; 04A3; Case map */
+  { 0x0004A4, 0, { 0x0004A5 }},                      /* 04A4; 04A5; Case map */
+  { 0x0004A6, 0, { 0x0004A7 }},                      /* 04A6; 04A7; Case map */
+  { 0x0004A8, 0, { 0x0004A9 }},                      /* 04A8; 04A9; Case map */
+  { 0x0004AA, 0, { 0x0004AB }},                      /* 04AA; 04AB; Case map */
+  { 0x0004AC, 0, { 0x0004AD }},                      /* 04AC; 04AD; Case map */
+  { 0x0004AE, 0, { 0x0004AF }},                      /* 04AE; 04AF; Case map */
+  { 0x0004B0, 0, { 0x0004B1 }},                      /* 04B0; 04B1; Case map */
+  { 0x0004B2, 0, { 0x0004B3 }},                      /* 04B2; 04B3; Case map */
+  { 0x0004B4, 0, { 0x0004B5 }},                      /* 04B4; 04B5; Case map */
+  { 0x0004B6, 0, { 0x0004B7 }},                      /* 04B6; 04B7; Case map */
+  { 0x0004B8, 0, { 0x0004B9 }},                      /* 04B8; 04B9; Case map */
+  { 0x0004BA, 0, { 0x0004BB }},                      /* 04BA; 04BB; Case map */
+  { 0x0004BC, 0, { 0x0004BD }},                      /* 04BC; 04BD; Case map */
+  { 0x0004BE, 0, { 0x0004BF }},                      /* 04BE; 04BF; Case map */
+  { 0x0004C1, 0, { 0x0004C2 }},                      /* 04C1; 04C2; Case map */
+  { 0x0004C3, 0, { 0x0004C4 }},                      /* 04C3; 04C4; Case map */
+  { 0x0004C5, 0, { 0x0004C6 }},                      /* 04C5; 04C6; Case map */
+  { 0x0004C7, 0, { 0x0004C8 }},                      /* 04C7; 04C8; Case map */
+  { 0x0004C9, 0, { 0x0004CA }},                      /* 04C9; 04CA; Case map */
+  { 0x0004CB, 0, { 0x0004CC }},                      /* 04CB; 04CC; Case map */
+  { 0x0004CD, 0, { 0x0004CE }},                      /* 04CD; 04CE; Case map */
+  { 0x0004D0, 0, { 0x0004D1 }},                      /* 04D0; 04D1; Case map */
+  { 0x0004D2, 0, { 0x0004D3 }},                      /* 04D2; 04D3; Case map */
+  { 0x0004D4, 0, { 0x0004D5 }},                      /* 04D4; 04D5; Case map */
+  { 0x0004D6, 0, { 0x0004D7 }},                      /* 04D6; 04D7; Case map */
+  { 0x0004D8, 0, { 0x0004D9 }},                      /* 04D8; 04D9; Case map */
+  { 0x0004DA, 0, { 0x0004DB }},                      /* 04DA; 04DB; Case map */
+  { 0x0004DC, 0, { 0x0004DD }},                      /* 04DC; 04DD; Case map */
+  { 0x0004DE, 0, { 0x0004DF }},                      /* 04DE; 04DF; Case map */
+  { 0x0004E0, 0, { 0x0004E1 }},                      /* 04E0; 04E1; Case map */
+  { 0x0004E2, 0, { 0x0004E3 }},                      /* 04E2; 04E3; Case map */
+  { 0x0004E4, 0, { 0x0004E5 }},                      /* 04E4; 04E5; Case map */
+  { 0x0004E6, 0, { 0x0004E7 }},                      /* 04E6; 04E7; Case map */
+  { 0x0004E8, 0, { 0x0004E9 }},                      /* 04E8; 04E9; Case map */
+  { 0x0004EA, 0, { 0x0004EB }},                      /* 04EA; 04EB; Case map */
+  { 0x0004EC, 0, { 0x0004ED }},                      /* 04EC; 04ED; Case map */
+  { 0x0004EE, 0, { 0x0004EF }},                      /* 04EE; 04EF; Case map */
+  { 0x0004F0, 0, { 0x0004F1 }},                      /* 04F0; 04F1; Case map */
+  { 0x0004F2, 0, { 0x0004F3 }},                      /* 04F2; 04F3; Case map */
+  { 0x0004F4, 0, { 0x0004F5 }},                      /* 04F4; 04F5; Case map */
+  { 0x0004F8, 0, { 0x0004F9 }},                      /* 04F8; 04F9; Case map */
+  { 0x000500, 0, { 0x000501 }},                      /* 0500; 0501; Case map */
+  { 0x000502, 0, { 0x000503 }},                      /* 0502; 0503; Case map */
+  { 0x000504, 0, { 0x000505 }},                      /* 0504; 0505; Case map */
+  { 0x000506, 0, { 0x000507 }},                      /* 0506; 0507; Case map */
+  { 0x000508, 0, { 0x000509 }},                      /* 0508; 0509; Case map */
+  { 0x00050A, 0, { 0x00050B }},                      /* 050A; 050B; Case map */
+  { 0x00050C, 0, { 0x00050D }},                      /* 050C; 050D; Case map */
+  { 0x00050E, 0, { 0x00050F }},                      /* 050E; 050F; Case map */
+  { 0x000531, 0, { 0x000561 }},                      /* 0531; 0561; Case map */
+  { 0x000532, 0, { 0x000562 }},                      /* 0532; 0562; Case map */
+  { 0x000533, 0, { 0x000563 }},                      /* 0533; 0563; Case map */
+  { 0x000534, 0, { 0x000564 }},                      /* 0534; 0564; Case map */
+  { 0x000535, 0, { 0x000565 }},                      /* 0535; 0565; Case map */
+  { 0x000536, 0, { 0x000566 }},                      /* 0536; 0566; Case map */
+  { 0x000537, 0, { 0x000567 }},                      /* 0537; 0567; Case map */
+  { 0x000538, 0, { 0x000568 }},                      /* 0538; 0568; Case map */
+  { 0x000539, 0, { 0x000569 }},                      /* 0539; 0569; Case map */
+  { 0x00053A, 0, { 0x00056A }},                      /* 053A; 056A; Case map */
+  { 0x00053B, 0, { 0x00056B }},                      /* 053B; 056B; Case map */
+  { 0x00053C, 0, { 0x00056C }},                      /* 053C; 056C; Case map */
+  { 0x00053D, 0, { 0x00056D }},                      /* 053D; 056D; Case map */
+  { 0x00053E, 0, { 0x00056E }},                      /* 053E; 056E; Case map */
+  { 0x00053F, 0, { 0x00056F }},                      /* 053F; 056F; Case map */
+  { 0x000540, 0, { 0x000570 }},                      /* 0540; 0570; Case map */
+  { 0x000541, 0, { 0x000571 }},                      /* 0541; 0571; Case map */
+  { 0x000542, 0, { 0x000572 }},                      /* 0542; 0572; Case map */
+  { 0x000543, 0, { 0x000573 }},                      /* 0543; 0573; Case map */
+  { 0x000544, 0, { 0x000574 }},                      /* 0544; 0574; Case map */
+  { 0x000545, 0, { 0x000575 }},                      /* 0545; 0575; Case map */
+  { 0x000546, 0, { 0x000576 }},                      /* 0546; 0576; Case map */
+  { 0x000547, 0, { 0x000577 }},                      /* 0547; 0577; Case map */
+  { 0x000548, 0, { 0x000578 }},                      /* 0548; 0578; Case map */
+  { 0x000549, 0, { 0x000579 }},                      /* 0549; 0579; Case map */
+  { 0x00054A, 0, { 0x00057A }},                      /* 054A; 057A; Case map */
+  { 0x00054B, 0, { 0x00057B }},                      /* 054B; 057B; Case map */
+  { 0x00054C, 0, { 0x00057C }},                      /* 054C; 057C; Case map */
+  { 0x00054D, 0, { 0x00057D }},                      /* 054D; 057D; Case map */
+  { 0x00054E, 0, { 0x00057E }},                      /* 054E; 057E; Case map */
+  { 0x00054F, 0, { 0x00057F }},                      /* 054F; 057F; Case map */
+  { 0x000550, 0, { 0x000580 }},                      /* 0550; 0580; Case map */
+  { 0x000551, 0, { 0x000581 }},                      /* 0551; 0581; Case map */
+  { 0x000552, 0, { 0x000582 }},                      /* 0552; 0582; Case map */
+  { 0x000553, 0, { 0x000583 }},                      /* 0553; 0583; Case map */
+  { 0x000554, 0, { 0x000584 }},                      /* 0554; 0584; Case map */
+  { 0x000555, 0, { 0x000585 }},                      /* 0555; 0585; Case map */
+  { 0x000556, 0, { 0x000586 }},                      /* 0556; 0586; Case map */
+  { 0x000587, 0, { 0x000565,                    /* 0587; 0565 0582; Case map */
+                   0x000582 }},
+  { 0x001E00, 0, { 0x001E01 }},                      /* 1E00; 1E01; Case map */
+  { 0x001E02, 0, { 0x001E03 }},                      /* 1E02; 1E03; Case map */
+  { 0x001E04, 0, { 0x001E05 }},                      /* 1E04; 1E05; Case map */
+  { 0x001E06, 0, { 0x001E07 }},                      /* 1E06; 1E07; Case map */
+  { 0x001E08, 0, { 0x001E09 }},                      /* 1E08; 1E09; Case map */
+  { 0x001E0A, 0, { 0x001E0B }},                      /* 1E0A; 1E0B; Case map */
+  { 0x001E0C, 0, { 0x001E0D }},                      /* 1E0C; 1E0D; Case map */
+  { 0x001E0E, 0, { 0x001E0F }},                      /* 1E0E; 1E0F; Case map */
+  { 0x001E10, 0, { 0x001E11 }},                      /* 1E10; 1E11; Case map */
+  { 0x001E12, 0, { 0x001E13 }},                      /* 1E12; 1E13; Case map */
+  { 0x001E14, 0, { 0x001E15 }},                      /* 1E14; 1E15; Case map */
+  { 0x001E16, 0, { 0x001E17 }},                      /* 1E16; 1E17; Case map */
+  { 0x001E18, 0, { 0x001E19 }},                      /* 1E18; 1E19; Case map */
+  { 0x001E1A, 0, { 0x001E1B }},                      /* 1E1A; 1E1B; Case map */
+  { 0x001E1C, 0, { 0x001E1D }},                      /* 1E1C; 1E1D; Case map */
+  { 0x001E1E, 0, { 0x001E1F }},                      /* 1E1E; 1E1F; Case map */
+  { 0x001E20, 0, { 0x001E21 }},                      /* 1E20; 1E21; Case map */
+  { 0x001E22, 0, { 0x001E23 }},                      /* 1E22; 1E23; Case map */
+  { 0x001E24, 0, { 0x001E25 }},                      /* 1E24; 1E25; Case map */
+  { 0x001E26, 0, { 0x001E27 }},                      /* 1E26; 1E27; Case map */
+  { 0x001E28, 0, { 0x001E29 }},                      /* 1E28; 1E29; Case map */
+  { 0x001E2A, 0, { 0x001E2B }},                      /* 1E2A; 1E2B; Case map */
+  { 0x001E2C, 0, { 0x001E2D }},                      /* 1E2C; 1E2D; Case map */
+  { 0x001E2E, 0, { 0x001E2F }},                      /* 1E2E; 1E2F; Case map */
+  { 0x001E30, 0, { 0x001E31 }},                      /* 1E30; 1E31; Case map */
+  { 0x001E32, 0, { 0x001E33 }},                      /* 1E32; 1E33; Case map */
+  { 0x001E34, 0, { 0x001E35 }},                      /* 1E34; 1E35; Case map */
+  { 0x001E36, 0, { 0x001E37 }},                      /* 1E36; 1E37; Case map */
+  { 0x001E38, 0, { 0x001E39 }},                      /* 1E38; 1E39; Case map */
+  { 0x001E3A, 0, { 0x001E3B }},                      /* 1E3A; 1E3B; Case map */
+  { 0x001E3C, 0, { 0x001E3D }},                      /* 1E3C; 1E3D; Case map */
+  { 0x001E3E, 0, { 0x001E3F }},                      /* 1E3E; 1E3F; Case map */
+  { 0x001E40, 0, { 0x001E41 }},                      /* 1E40; 1E41; Case map */
+  { 0x001E42, 0, { 0x001E43 }},                      /* 1E42; 1E43; Case map */
+  { 0x001E44, 0, { 0x001E45 }},                      /* 1E44; 1E45; Case map */
+  { 0x001E46, 0, { 0x001E47 }},                      /* 1E46; 1E47; Case map */
+  { 0x001E48, 0, { 0x001E49 }},                      /* 1E48; 1E49; Case map */
+  { 0x001E4A, 0, { 0x001E4B }},                      /* 1E4A; 1E4B; Case map */
+  { 0x001E4C, 0, { 0x001E4D }},                      /* 1E4C; 1E4D; Case map */
+  { 0x001E4E, 0, { 0x001E4F }},                      /* 1E4E; 1E4F; Case map */
+  { 0x001E50, 0, { 0x001E51 }},                      /* 1E50; 1E51; Case map */
+  { 0x001E52, 0, { 0x001E53 }},                      /* 1E52; 1E53; Case map */
+  { 0x001E54, 0, { 0x001E55 }},                      /* 1E54; 1E55; Case map */
+  { 0x001E56, 0, { 0x001E57 }},                      /* 1E56; 1E57; Case map */
+  { 0x001E58, 0, { 0x001E59 }},                      /* 1E58; 1E59; Case map */
+  { 0x001E5A, 0, { 0x001E5B }},                      /* 1E5A; 1E5B; Case map */
+  { 0x001E5C, 0, { 0x001E5D }},                      /* 1E5C; 1E5D; Case map */
+  { 0x001E5E, 0, { 0x001E5F }},                      /* 1E5E; 1E5F; Case map */
+  { 0x001E60, 0, { 0x001E61 }},                      /* 1E60; 1E61; Case map */
+  { 0x001E62, 0, { 0x001E63 }},                      /* 1E62; 1E63; Case map */
+  { 0x001E64, 0, { 0x001E65 }},                      /* 1E64; 1E65; Case map */
+  { 0x001E66, 0, { 0x001E67 }},                      /* 1E66; 1E67; Case map */
+  { 0x001E68, 0, { 0x001E69 }},                      /* 1E68; 1E69; Case map */
+  { 0x001E6A, 0, { 0x001E6B }},                      /* 1E6A; 1E6B; Case map */
+  { 0x001E6C, 0, { 0x001E6D }},                      /* 1E6C; 1E6D; Case map */
+  { 0x001E6E, 0, { 0x001E6F }},                      /* 1E6E; 1E6F; Case map */
+  { 0x001E70, 0, { 0x001E71 }},                      /* 1E70; 1E71; Case map */
+  { 0x001E72, 0, { 0x001E73 }},                      /* 1E72; 1E73; Case map */
+  { 0x001E74, 0, { 0x001E75 }},                      /* 1E74; 1E75; Case map */
+  { 0x001E76, 0, { 0x001E77 }},                      /* 1E76; 1E77; Case map */
+  { 0x001E78, 0, { 0x001E79 }},                      /* 1E78; 1E79; Case map */
+  { 0x001E7A, 0, { 0x001E7B }},                      /* 1E7A; 1E7B; Case map */
+  { 0x001E7C, 0, { 0x001E7D }},                      /* 1E7C; 1E7D; Case map */
+  { 0x001E7E, 0, { 0x001E7F }},                      /* 1E7E; 1E7F; Case map */
+  { 0x001E80, 0, { 0x001E81 }},                      /* 1E80; 1E81; Case map */
+  { 0x001E82, 0, { 0x001E83 }},                      /* 1E82; 1E83; Case map */
+  { 0x001E84, 0, { 0x001E85 }},                      /* 1E84; 1E85; Case map */
+  { 0x001E86, 0, { 0x001E87 }},                      /* 1E86; 1E87; Case map */
+  { 0x001E88, 0, { 0x001E89 }},                      /* 1E88; 1E89; Case map */
+  { 0x001E8A, 0, { 0x001E8B }},                      /* 1E8A; 1E8B; Case map */
+  { 0x001E8C, 0, { 0x001E8D }},                      /* 1E8C; 1E8D; Case map */
+  { 0x001E8E, 0, { 0x001E8F }},                      /* 1E8E; 1E8F; Case map */
+  { 0x001E90, 0, { 0x001E91 }},                      /* 1E90; 1E91; Case map */
+  { 0x001E92, 0, { 0x001E93 }},                      /* 1E92; 1E93; Case map */
+  { 0x001E94, 0, { 0x001E95 }},                      /* 1E94; 1E95; Case map */
+  { 0x001E96, 0, { 0x000068,                    /* 1E96; 0068 0331; Case map */
+                   0x000331 }},
+  { 0x001E97, 0, { 0x000074,                    /* 1E97; 0074 0308; Case map */
+                   0x000308 }},
+  { 0x001E98, 0, { 0x000077,                    /* 1E98; 0077 030A; Case map */
+                   0x00030A }},
+  { 0x001E99, 0, { 0x000079,                    /* 1E99; 0079 030A; Case map */
+                   0x00030A }},
+  { 0x001E9A, 0, { 0x000061,                    /* 1E9A; 0061 02BE; Case map */
+                   0x0002BE }},
+  { 0x001E9B, 0, { 0x001E61 }},                      /* 1E9B; 1E61; Case map */
+  { 0x001EA0, 0, { 0x001EA1 }},                      /* 1EA0; 1EA1; Case map */
+  { 0x001EA2, 0, { 0x001EA3 }},                      /* 1EA2; 1EA3; Case map */
+  { 0x001EA4, 0, { 0x001EA5 }},                      /* 1EA4; 1EA5; Case map */
+  { 0x001EA6, 0, { 0x001EA7 }},                      /* 1EA6; 1EA7; Case map */
+  { 0x001EA8, 0, { 0x001EA9 }},                      /* 1EA8; 1EA9; Case map */
+  { 0x001EAA, 0, { 0x001EAB }},                      /* 1EAA; 1EAB; Case map */
+  { 0x001EAC, 0, { 0x001EAD }},                      /* 1EAC; 1EAD; Case map */
+  { 0x001EAE, 0, { 0x001EAF }},                      /* 1EAE; 1EAF; Case map */
+  { 0x001EB0, 0, { 0x001EB1 }},                      /* 1EB0; 1EB1; Case map */
+  { 0x001EB2, 0, { 0x001EB3 }},                      /* 1EB2; 1EB3; Case map */
+  { 0x001EB4, 0, { 0x001EB5 }},                      /* 1EB4; 1EB5; Case map */
+  { 0x001EB6, 0, { 0x001EB7 }},                      /* 1EB6; 1EB7; Case map */
+  { 0x001EB8, 0, { 0x001EB9 }},                      /* 1EB8; 1EB9; Case map */
+  { 0x001EBA, 0, { 0x001EBB }},                      /* 1EBA; 1EBB; Case map */
+  { 0x001EBC, 0, { 0x001EBD }},                      /* 1EBC; 1EBD; Case map */
+  { 0x001EBE, 0, { 0x001EBF }},                      /* 1EBE; 1EBF; Case map */
+  { 0x001EC0, 0, { 0x001EC1 }},                      /* 1EC0; 1EC1; Case map */
+  { 0x001EC2, 0, { 0x001EC3 }},                      /* 1EC2; 1EC3; Case map */
+  { 0x001EC4, 0, { 0x001EC5 }},                      /* 1EC4; 1EC5; Case map */
+  { 0x001EC6, 0, { 0x001EC7 }},                      /* 1EC6; 1EC7; Case map */
+  { 0x001EC8, 0, { 0x001EC9 }},                      /* 1EC8; 1EC9; Case map */
+  { 0x001ECA, 0, { 0x001ECB }},                      /* 1ECA; 1ECB; Case map */
+  { 0x001ECC, 0, { 0x001ECD }},                      /* 1ECC; 1ECD; Case map */
+  { 0x001ECE, 0, { 0x001ECF }},                      /* 1ECE; 1ECF; Case map */
+  { 0x001ED0, 0, { 0x001ED1 }},                      /* 1ED0; 1ED1; Case map */
+  { 0x001ED2, 0, { 0x001ED3 }},                      /* 1ED2; 1ED3; Case map */
+  { 0x001ED4, 0, { 0x001ED5 }},                      /* 1ED4; 1ED5; Case map */
+  { 0x001ED6, 0, { 0x001ED7 }},                      /* 1ED6; 1ED7; Case map */
+  { 0x001ED8, 0, { 0x001ED9 }},                      /* 1ED8; 1ED9; Case map */
+  { 0x001EDA, 0, { 0x001EDB }},                      /* 1EDA; 1EDB; Case map */
+  { 0x001EDC, 0, { 0x001EDD }},                      /* 1EDC; 1EDD; Case map */
+  { 0x001EDE, 0, { 0x001EDF }},                      /* 1EDE; 1EDF; Case map */
+  { 0x001EE0, 0, { 0x001EE1 }},                      /* 1EE0; 1EE1; Case map */
+  { 0x001EE2, 0, { 0x001EE3 }},                      /* 1EE2; 1EE3; Case map */
+  { 0x001EE4, 0, { 0x001EE5 }},                      /* 1EE4; 1EE5; Case map */
+  { 0x001EE6, 0, { 0x001EE7 }},                      /* 1EE6; 1EE7; Case map */
+  { 0x001EE8, 0, { 0x001EE9 }},                      /* 1EE8; 1EE9; Case map */
+  { 0x001EEA, 0, { 0x001EEB }},                      /* 1EEA; 1EEB; Case map */
+  { 0x001EEC, 0, { 0x001EED }},                      /* 1EEC; 1EED; Case map */
+  { 0x001EEE, 0, { 0x001EEF }},                      /* 1EEE; 1EEF; Case map */
+  { 0x001EF0, 0, { 0x001EF1 }},                      /* 1EF0; 1EF1; Case map */
+  { 0x001EF2, 0, { 0x001EF3 }},                      /* 1EF2; 1EF3; Case map */
+  { 0x001EF4, 0, { 0x001EF5 }},                      /* 1EF4; 1EF5; Case map */
+  { 0x001EF6, 0, { 0x001EF7 }},                      /* 1EF6; 1EF7; Case map */
+  { 0x001EF8, 0, { 0x001EF9 }},                      /* 1EF8; 1EF9; Case map */
+  { 0x001F08, 0, { 0x001F00 }},                      /* 1F08; 1F00; Case map */
+  { 0x001F09, 0, { 0x001F01 }},                      /* 1F09; 1F01; Case map */
+  { 0x001F0A, 0, { 0x001F02 }},                      /* 1F0A; 1F02; Case map */
+  { 0x001F0B, 0, { 0x001F03 }},                      /* 1F0B; 1F03; Case map */
+  { 0x001F0C, 0, { 0x001F04 }},                      /* 1F0C; 1F04; Case map */
+  { 0x001F0D, 0, { 0x001F05 }},                      /* 1F0D; 1F05; Case map */
+  { 0x001F0E, 0, { 0x001F06 }},                      /* 1F0E; 1F06; Case map */
+  { 0x001F0F, 0, { 0x001F07 }},                      /* 1F0F; 1F07; Case map */
+  { 0x001F18, 0, { 0x001F10 }},                      /* 1F18; 1F10; Case map */
+  { 0x001F19, 0, { 0x001F11 }},                      /* 1F19; 1F11; Case map */
+  { 0x001F1A, 0, { 0x001F12 }},                      /* 1F1A; 1F12; Case map */
+  { 0x001F1B, 0, { 0x001F13 }},                      /* 1F1B; 1F13; Case map */
+  { 0x001F1C, 0, { 0x001F14 }},                      /* 1F1C; 1F14; Case map */
+  { 0x001F1D, 0, { 0x001F15 }},                      /* 1F1D; 1F15; Case map */
+  { 0x001F28, 0, { 0x001F20 }},                      /* 1F28; 1F20; Case map */
+  { 0x001F29, 0, { 0x001F21 }},                      /* 1F29; 1F21; Case map */
+  { 0x001F2A, 0, { 0x001F22 }},                      /* 1F2A; 1F22; Case map */
+  { 0x001F2B, 0, { 0x001F23 }},                      /* 1F2B; 1F23; Case map */
+  { 0x001F2C, 0, { 0x001F24 }},                      /* 1F2C; 1F24; Case map */
+  { 0x001F2D, 0, { 0x001F25 }},                      /* 1F2D; 1F25; Case map */
+  { 0x001F2E, 0, { 0x001F26 }},                      /* 1F2E; 1F26; Case map */
+  { 0x001F2F, 0, { 0x001F27 }},                      /* 1F2F; 1F27; Case map */
+  { 0x001F38, 0, { 0x001F30 }},                      /* 1F38; 1F30; Case map */
+  { 0x001F39, 0, { 0x001F31 }},                      /* 1F39; 1F31; Case map */
+  { 0x001F3A, 0, { 0x001F32 }},                      /* 1F3A; 1F32; Case map */
+  { 0x001F3B, 0, { 0x001F33 }},                      /* 1F3B; 1F33; Case map */
+  { 0x001F3C, 0, { 0x001F34 }},                      /* 1F3C; 1F34; Case map */
+  { 0x001F3D, 0, { 0x001F35 }},                      /* 1F3D; 1F35; Case map */
+  { 0x001F3E, 0, { 0x001F36 }},                      /* 1F3E; 1F36; Case map */
+  { 0x001F3F, 0, { 0x001F37 }},                      /* 1F3F; 1F37; Case map */
+  { 0x001F48, 0, { 0x001F40 }},                      /* 1F48; 1F40; Case map */
+  { 0x001F49, 0, { 0x001F41 }},                      /* 1F49; 1F41; Case map */
+  { 0x001F4A, 0, { 0x001F42 }},                      /* 1F4A; 1F42; Case map */
+  { 0x001F4B, 0, { 0x001F43 }},                      /* 1F4B; 1F43; Case map */
+  { 0x001F4C, 0, { 0x001F44 }},                      /* 1F4C; 1F44; Case map */
+  { 0x001F4D, 0, { 0x001F45 }},                      /* 1F4D; 1F45; Case map */
+  { 0x001F50, 0, { 0x0003C5,                    /* 1F50; 03C5 0313; Case map */
+                   0x000313 }},
+  { 0x001F52, 0, { 0x0003C5,               /* 1F52; 03C5 0313 0300; Case map */
+                   0x000313, 0x000300 }},
+  { 0x001F54, 0, { 0x0003C5,               /* 1F54; 03C5 0313 0301; Case map */
+                   0x000313, 0x000301 }},
+  { 0x001F56, 0, { 0x0003C5,               /* 1F56; 03C5 0313 0342; Case map */
+                   0x000313, 0x000342 }},
+  { 0x001F59, 0, { 0x001F51 }},                      /* 1F59; 1F51; Case map */
+  { 0x001F5B, 0, { 0x001F53 }},                      /* 1F5B; 1F53; Case map */
+  { 0x001F5D, 0, { 0x001F55 }},                      /* 1F5D; 1F55; Case map */
+  { 0x001F5F, 0, { 0x001F57 }},                      /* 1F5F; 1F57; Case map */
+  { 0x001F68, 0, { 0x001F60 }},                      /* 1F68; 1F60; Case map */
+  { 0x001F69, 0, { 0x001F61 }},                      /* 1F69; 1F61; Case map */
+  { 0x001F6A, 0, { 0x001F62 }},                      /* 1F6A; 1F62; Case map */
+  { 0x001F6B, 0, { 0x001F63 }},                      /* 1F6B; 1F63; Case map */
+  { 0x001F6C, 0, { 0x001F64 }},                      /* 1F6C; 1F64; Case map */
+  { 0x001F6D, 0, { 0x001F65 }},                      /* 1F6D; 1F65; Case map */
+  { 0x001F6E, 0, { 0x001F66 }},                      /* 1F6E; 1F66; Case map */
+  { 0x001F6F, 0, { 0x001F67 }},                      /* 1F6F; 1F67; Case map */
+  { 0x001F80, 0, { 0x001F00,                    /* 1F80; 1F00 03B9; Case map */
+                   0x0003B9 }},
+  { 0x001F81, 0, { 0x001F01,                    /* 1F81; 1F01 03B9; Case map */
+                   0x0003B9 }},
+  { 0x001F82, 0, { 0x001F02,                    /* 1F82; 1F02 03B9; Case map */
+                   0x0003B9 }},
+  { 0x001F83, 0, { 0x001F03,                    /* 1F83; 1F03 03B9; Case map */
+                   0x0003B9 }},
+  { 0x001F84, 0, { 0x001F04,                    /* 1F84; 1F04 03B9; Case map */
+                   0x0003B9 }},
+  { 0x001F85, 0, { 0x001F05,                    /* 1F85; 1F05 03B9; Case map */
+                   0x0003B9 }},
+  { 0x001F86, 0, { 0x001F06,                    /* 1F86; 1F06 03B9; Case map */
+                   0x0003B9 }},
+  { 0x001F87, 0, { 0x001F07,                    /* 1F87; 1F07 03B9; Case map */
+                   0x0003B9 }},
+  { 0x001F88, 0, { 0x001F00,                    /* 1F88; 1F00 03B9; Case map */
+                   0x0003B9 }},
+  { 0x001F89, 0, { 0x001F01,                    /* 1F89; 1F01 03B9; Case map */
+                   0x0003B9 }},
+  { 0x001F8A, 0, { 0x001F02,                    /* 1F8A; 1F02 03B9; Case map */
+                   0x0003B9 }},
+  { 0x001F8B, 0, { 0x001F03,                    /* 1F8B; 1F03 03B9; Case map */
+                   0x0003B9 }},
+  { 0x001F8C, 0, { 0x001F04,                    /* 1F8C; 1F04 03B9; Case map */
+                   0x0003B9 }},
+  { 0x001F8D, 0, { 0x001F05,                    /* 1F8D; 1F05 03B9; Case map */
+                   0x0003B9 }},
+  { 0x001F8E, 0, { 0x001F06,                    /* 1F8E; 1F06 03B9; Case map */
+                   0x0003B9 }},
+  { 0x001F8F, 0, { 0x001F07,                    /* 1F8F; 1F07 03B9; Case map */
+                   0x0003B9 }},
+  { 0x001F90, 0, { 0x001F20,                    /* 1F90; 1F20 03B9; Case map */
+                   0x0003B9 }},
+  { 0x001F91, 0, { 0x001F21,                    /* 1F91; 1F21 03B9; Case map */
+                   0x0003B9 }},
+  { 0x001F92, 0, { 0x001F22,                    /* 1F92; 1F22 03B9; Case map */
+                   0x0003B9 }},
+  { 0x001F93, 0, { 0x001F23,                    /* 1F93; 1F23 03B9; Case map */
+                   0x0003B9 }},
+  { 0x001F94, 0, { 0x001F24,                    /* 1F94; 1F24 03B9; Case map */
+                   0x0003B9 }},
+  { 0x001F95, 0, { 0x001F25,                    /* 1F95; 1F25 03B9; Case map */
+                   0x0003B9 }},
+  { 0x001F96, 0, { 0x001F26,                    /* 1F96; 1F26 03B9; Case map */
+                   0x0003B9 }},
+  { 0x001F97, 0, { 0x001F27,                    /* 1F97; 1F27 03B9; Case map */
+                   0x0003B9 }},
+  { 0x001F98, 0, { 0x001F20,                    /* 1F98; 1F20 03B9; Case map */
+                   0x0003B9 }},
+  { 0x001F99, 0, { 0x001F21,                    /* 1F99; 1F21 03B9; Case map */
+                   0x0003B9 }},
+  { 0x001F9A, 0, { 0x001F22,                    /* 1F9A; 1F22 03B9; Case map */
+                   0x0003B9 }},
+  { 0x001F9B, 0, { 0x001F23,                    /* 1F9B; 1F23 03B9; Case map */
+                   0x0003B9 }},
+  { 0x001F9C, 0, { 0x001F24,                    /* 1F9C; 1F24 03B9; Case map */
+                   0x0003B9 }},
+  { 0x001F9D, 0, { 0x001F25,                    /* 1F9D; 1F25 03B9; Case map */
+                   0x0003B9 }},
+  { 0x001F9E, 0, { 0x001F26,                    /* 1F9E; 1F26 03B9; Case map */
+                   0x0003B9 }},
+  { 0x001F9F, 0, { 0x001F27,                    /* 1F9F; 1F27 03B9; Case map */
+                   0x0003B9 }},
+  { 0x001FA0, 0, { 0x001F60,                    /* 1FA0; 1F60 03B9; Case map */
+                   0x0003B9 }},
+  { 0x001FA1, 0, { 0x001F61,                    /* 1FA1; 1F61 03B9; Case map */
+                   0x0003B9 }},
+  { 0x001FA2, 0, { 0x001F62,                    /* 1FA2; 1F62 03B9; Case map */
+                   0x0003B9 }},
+  { 0x001FA3, 0, { 0x001F63,                    /* 1FA3; 1F63 03B9; Case map */
+                   0x0003B9 }},
+  { 0x001FA4, 0, { 0x001F64,                    /* 1FA4; 1F64 03B9; Case map */
+                   0x0003B9 }},
+  { 0x001FA5, 0, { 0x001F65,                    /* 1FA5; 1F65 03B9; Case map */
+                   0x0003B9 }},
+  { 0x001FA6, 0, { 0x001F66,                    /* 1FA6; 1F66 03B9; Case map */
+                   0x0003B9 }},
+  { 0x001FA7, 0, { 0x001F67,                    /* 1FA7; 1F67 03B9; Case map */
+                   0x0003B9 }},
+  { 0x001FA8, 0, { 0x001F60,                    /* 1FA8; 1F60 03B9; Case map */
+                   0x0003B9 }},
+  { 0x001FA9, 0, { 0x001F61,                    /* 1FA9; 1F61 03B9; Case map */
+                   0x0003B9 }},
+  { 0x001FAA, 0, { 0x001F62,                    /* 1FAA; 1F62 03B9; Case map */
+                   0x0003B9 }},
+  { 0x001FAB, 0, { 0x001F63,                    /* 1FAB; 1F63 03B9; Case map */
+                   0x0003B9 }},
+  { 0x001FAC, 0, { 0x001F64,                    /* 1FAC; 1F64 03B9; Case map */
+                   0x0003B9 }},
+  { 0x001FAD, 0, { 0x001F65,                    /* 1FAD; 1F65 03B9; Case map */
+                   0x0003B9 }},
+  { 0x001FAE, 0, { 0x001F66,                    /* 1FAE; 1F66 03B9; Case map */
+                   0x0003B9 }},
+  { 0x001FAF, 0, { 0x001F67,                    /* 1FAF; 1F67 03B9; Case map */
+                   0x0003B9 }},
+  { 0x001FB2, 0, { 0x001F70,                    /* 1FB2; 1F70 03B9; Case map */
+                   0x0003B9 }},
+  { 0x001FB3, 0, { 0x0003B1,                    /* 1FB3; 03B1 03B9; Case map */
+                   0x0003B9 }},
+  { 0x001FB4, 0, { 0x0003AC,                    /* 1FB4; 03AC 03B9; Case map */
+                   0x0003B9 }},
+  { 0x001FB6, 0, { 0x0003B1,                    /* 1FB6; 03B1 0342; Case map */
+                   0x000342 }},
+  { 0x001FB7, 0, { 0x0003B1,               /* 1FB7; 03B1 0342 03B9; Case map */
+                   0x000342, 0x0003B9 }},
+  { 0x001FB8, 0, { 0x001FB0 }},                      /* 1FB8; 1FB0; Case map */
+  { 0x001FB9, 0, { 0x001FB1 }},                      /* 1FB9; 1FB1; Case map */
+  { 0x001FBA, 0, { 0x001F70 }},                      /* 1FBA; 1F70; Case map */
+  { 0x001FBB, 0, { 0x001F71 }},                      /* 1FBB; 1F71; Case map */
+  { 0x001FBC, 0, { 0x0003B1,                    /* 1FBC; 03B1 03B9; Case map */
+                   0x0003B9 }},
+  { 0x001FBE, 0, { 0x0003B9 }},                      /* 1FBE; 03B9; Case map */
+  { 0x001FC2, 0, { 0x001F74,                    /* 1FC2; 1F74 03B9; Case map */
+                   0x0003B9 }},
+  { 0x001FC3, 0, { 0x0003B7,                    /* 1FC3; 03B7 03B9; Case map */
+                   0x0003B9 }},
+  { 0x001FC4, 0, { 0x0003AE,                    /* 1FC4; 03AE 03B9; Case map */
+                   0x0003B9 }},
+  { 0x001FC6, 0, { 0x0003B7,                    /* 1FC6; 03B7 0342; Case map */
+                   0x000342 }},
+  { 0x001FC7, 0, { 0x0003B7,               /* 1FC7; 03B7 0342 03B9; Case map */
+                   0x000342, 0x0003B9 }},
+  { 0x001FC8, 0, { 0x001F72 }},                      /* 1FC8; 1F72; Case map */
+  { 0x001FC9, 0, { 0x001F73 }},                      /* 1FC9; 1F73; Case map */
+  { 0x001FCA, 0, { 0x001F74 }},                      /* 1FCA; 1F74; Case map */
+  { 0x001FCB, 0, { 0x001F75 }},                      /* 1FCB; 1F75; Case map */
+  { 0x001FCC, 0, { 0x0003B7,                    /* 1FCC; 03B7 03B9; Case map */
+                   0x0003B9 }},
+  { 0x001FD2, 0, { 0x0003B9,               /* 1FD2; 03B9 0308 0300; Case map */
+                   0x000308, 0x000300 }},
+  { 0x001FD3, 0, { 0x0003B9,               /* 1FD3; 03B9 0308 0301; Case map */
+                   0x000308, 0x000301 }},
+  { 0x001FD6, 0, { 0x0003B9,                    /* 1FD6; 03B9 0342; Case map */
+                   0x000342 }},
+  { 0x001FD7, 0, { 0x0003B9,               /* 1FD7; 03B9 0308 0342; Case map */
+                   0x000308, 0x000342 }},
+  { 0x001FD8, 0, { 0x001FD0 }},                      /* 1FD8; 1FD0; Case map */
+  { 0x001FD9, 0, { 0x001FD1 }},                      /* 1FD9; 1FD1; Case map */
+  { 0x001FDA, 0, { 0x001F76 }},                      /* 1FDA; 1F76; Case map */
+  { 0x001FDB, 0, { 0x001F77 }},                      /* 1FDB; 1F77; Case map */
+  { 0x001FE2, 0, { 0x0003C5,               /* 1FE2; 03C5 0308 0300; Case map */
+                   0x000308, 0x000300 }},
+  { 0x001FE3, 0, { 0x0003C5,               /* 1FE3; 03C5 0308 0301; Case map */
+                   0x000308, 0x000301 }},
+  { 0x001FE4, 0, { 0x0003C1,                    /* 1FE4; 03C1 0313; Case map */
+                   0x000313 }},
+  { 0x001FE6, 0, { 0x0003C5,                    /* 1FE6; 03C5 0342; Case map */
+                   0x000342 }},
+  { 0x001FE7, 0, { 0x0003C5,               /* 1FE7; 03C5 0308 0342; Case map */
+                   0x000308, 0x000342 }},
+  { 0x001FE8, 0, { 0x001FE0 }},                      /* 1FE8; 1FE0; Case map */
+  { 0x001FE9, 0, { 0x001FE1 }},                      /* 1FE9; 1FE1; Case map */
+  { 0x001FEA, 0, { 0x001F7A }},                      /* 1FEA; 1F7A; Case map */
+  { 0x001FEB, 0, { 0x001F7B }},                      /* 1FEB; 1F7B; Case map */
+  { 0x001FEC, 0, { 0x001FE5 }},                      /* 1FEC; 1FE5; Case map */
+  { 0x001FF2, 0, { 0x001F7C,                    /* 1FF2; 1F7C 03B9; Case map */
+                   0x0003B9 }},
+  { 0x001FF3, 0, { 0x0003C9,                    /* 1FF3; 03C9 03B9; Case map */
+                   0x0003B9 }},
+  { 0x001FF4, 0, { 0x0003CE,                    /* 1FF4; 03CE 03B9; Case map */
+                   0x0003B9 }},
+  { 0x001FF6, 0, { 0x0003C9,                    /* 1FF6; 03C9 0342; Case map */
+                   0x000342 }},
+  { 0x001FF7, 0, { 0x0003C9,               /* 1FF7; 03C9 0342 03B9; Case map */
+                   0x000342, 0x0003B9 }},
+  { 0x001FF8, 0, { 0x001F78 }},                      /* 1FF8; 1F78; Case map */
+  { 0x001FF9, 0, { 0x001F79 }},                      /* 1FF9; 1F79; Case map */
+  { 0x001FFA, 0, { 0x001F7C }},                      /* 1FFA; 1F7C; Case map */
+  { 0x001FFB, 0, { 0x001F7D }},                      /* 1FFB; 1F7D; Case map */
+  { 0x001FFC, 0, { 0x0003C9,                    /* 1FFC; 03C9 03B9; Case map */
+                   0x0003B9 }},
+  { 0x002126, 0, { 0x0003C9 }},                      /* 2126; 03C9; Case map */
+  { 0x00212A, 0, { 0x00006B }},                      /* 212A; 006B; Case map */
+  { 0x00212B, 0, { 0x0000E5 }},                      /* 212B; 00E5; Case map */
+  { 0x002160, 0, { 0x002170 }},                      /* 2160; 2170; Case map */
+  { 0x002161, 0, { 0x002171 }},                      /* 2161; 2171; Case map */
+  { 0x002162, 0, { 0x002172 }},                      /* 2162; 2172; Case map */
+  { 0x002163, 0, { 0x002173 }},                      /* 2163; 2173; Case map */
+  { 0x002164, 0, { 0x002174 }},                      /* 2164; 2174; Case map */
+  { 0x002165, 0, { 0x002175 }},                      /* 2165; 2175; Case map */
+  { 0x002166, 0, { 0x002176 }},                      /* 2166; 2176; Case map */
+  { 0x002167, 0, { 0x002177 }},                      /* 2167; 2177; Case map */
+  { 0x002168, 0, { 0x002178 }},                      /* 2168; 2178; Case map */
+  { 0x002169, 0, { 0x002179 }},                      /* 2169; 2179; Case map */
+  { 0x00216A, 0, { 0x00217A }},                      /* 216A; 217A; Case map */
+  { 0x00216B, 0, { 0x00217B }},                      /* 216B; 217B; Case map */
+  { 0x00216C, 0, { 0x00217C }},                      /* 216C; 217C; Case map */
+  { 0x00216D, 0, { 0x00217D }},                      /* 216D; 217D; Case map */
+  { 0x00216E, 0, { 0x00217E }},                      /* 216E; 217E; Case map */
+  { 0x00216F, 0, { 0x00217F }},                      /* 216F; 217F; Case map */
+  { 0x0024B6, 0, { 0x0024D0 }},                      /* 24B6; 24D0; Case map */
+  { 0x0024B7, 0, { 0x0024D1 }},                      /* 24B7; 24D1; Case map */
+  { 0x0024B8, 0, { 0x0024D2 }},                      /* 24B8; 24D2; Case map */
+  { 0x0024B9, 0, { 0x0024D3 }},                      /* 24B9; 24D3; Case map */
+  { 0x0024BA, 0, { 0x0024D4 }},                      /* 24BA; 24D4; Case map */
+  { 0x0024BB, 0, { 0x0024D5 }},                      /* 24BB; 24D5; Case map */
+  { 0x0024BC, 0, { 0x0024D6 }},                      /* 24BC; 24D6; Case map */
+  { 0x0024BD, 0, { 0x0024D7 }},                      /* 24BD; 24D7; Case map */
+  { 0x0024BE, 0, { 0x0024D8 }},                      /* 24BE; 24D8; Case map */
+  { 0x0024BF, 0, { 0x0024D9 }},                      /* 24BF; 24D9; Case map */
+  { 0x0024C0, 0, { 0x0024DA }},                      /* 24C0; 24DA; Case map */
+  { 0x0024C1, 0, { 0x0024DB }},                      /* 24C1; 24DB; Case map */
+  { 0x0024C2, 0, { 0x0024DC }},                      /* 24C2; 24DC; Case map */
+  { 0x0024C3, 0, { 0x0024DD }},                      /* 24C3; 24DD; Case map */
+  { 0x0024C4, 0, { 0x0024DE }},                      /* 24C4; 24DE; Case map */
+  { 0x0024C5, 0, { 0x0024DF }},                      /* 24C5; 24DF; Case map */
+  { 0x0024C6, 0, { 0x0024E0 }},                      /* 24C6; 24E0; Case map */
+  { 0x0024C7, 0, { 0x0024E1 }},                      /* 24C7; 24E1; Case map */
+  { 0x0024C8, 0, { 0x0024E2 }},                      /* 24C8; 24E2; Case map */
+  { 0x0024C9, 0, { 0x0024E3 }},                      /* 24C9; 24E3; Case map */
+  { 0x0024CA, 0, { 0x0024E4 }},                      /* 24CA; 24E4; Case map */
+  { 0x0024CB, 0, { 0x0024E5 }},                      /* 24CB; 24E5; Case map */
+  { 0x0024CC, 0, { 0x0024E6 }},                      /* 24CC; 24E6; Case map */
+  { 0x0024CD, 0, { 0x0024E7 }},                      /* 24CD; 24E7; Case map */
+  { 0x0024CE, 0, { 0x0024E8 }},                      /* 24CE; 24E8; Case map */
+  { 0x0024CF, 0, { 0x0024E9 }},                      /* 24CF; 24E9; Case map */
+  { 0x00FB00, 0, { 0x000066,                    /* FB00; 0066 0066; Case map */
+                   0x000066 }},
+  { 0x00FB01, 0, { 0x000066,                    /* FB01; 0066 0069; Case map */
+                   0x000069 }},
+  { 0x00FB02, 0, { 0x000066,                    /* FB02; 0066 006C; Case map */
+                   0x00006C }},
+  { 0x00FB03, 0, { 0x000066,               /* FB03; 0066 0066 0069; Case map */
+                   0x000066, 0x000069 }},
+  { 0x00FB04, 0, { 0x000066,               /* FB04; 0066 0066 006C; Case map */
+                   0x000066, 0x00006C }},
+  { 0x00FB05, 0, { 0x000073,                    /* FB05; 0073 0074; Case map */
+                   0x000074 }},
+  { 0x00FB06, 0, { 0x000073,                    /* FB06; 0073 0074; Case map */
+                   0x000074 }},
+  { 0x00FB13, 0, { 0x000574,                    /* FB13; 0574 0576; Case map */
+                   0x000576 }},
+  { 0x00FB14, 0, { 0x000574,                    /* FB14; 0574 0565; Case map */
+                   0x000565 }},
+  { 0x00FB15, 0, { 0x000574,                    /* FB15; 0574 056B; Case map */
+                   0x00056B }},
+  { 0x00FB16, 0, { 0x00057E,                    /* FB16; 057E 0576; Case map */
+                   0x000576 }},
+  { 0x00FB17, 0, { 0x000574,                    /* FB17; 0574 056D; Case map */
+                   0x00056D }},
+  { 0x00FF21, 0, { 0x00FF41 }},                      /* FF21; FF41; Case map */
+  { 0x00FF22, 0, { 0x00FF42 }},                      /* FF22; FF42; Case map */
+  { 0x00FF23, 0, { 0x00FF43 }},                      /* FF23; FF43; Case map */
+  { 0x00FF24, 0, { 0x00FF44 }},                      /* FF24; FF44; Case map */
+  { 0x00FF25, 0, { 0x00FF45 }},                      /* FF25; FF45; Case map */
+  { 0x00FF26, 0, { 0x00FF46 }},                      /* FF26; FF46; Case map */
+  { 0x00FF27, 0, { 0x00FF47 }},                      /* FF27; FF47; Case map */
+  { 0x00FF28, 0, { 0x00FF48 }},                      /* FF28; FF48; Case map */
+  { 0x00FF29, 0, { 0x00FF49 }},                      /* FF29; FF49; Case map */
+  { 0x00FF2A, 0, { 0x00FF4A }},                      /* FF2A; FF4A; Case map */
+  { 0x00FF2B, 0, { 0x00FF4B }},                      /* FF2B; FF4B; Case map */
+  { 0x00FF2C, 0, { 0x00FF4C }},                      /* FF2C; FF4C; Case map */
+  { 0x00FF2D, 0, { 0x00FF4D }},                      /* FF2D; FF4D; Case map */
+  { 0x00FF2E, 0, { 0x00FF4E }},                      /* FF2E; FF4E; Case map */
+  { 0x00FF2F, 0, { 0x00FF4F }},                      /* FF2F; FF4F; Case map */
+  { 0x00FF30, 0, { 0x00FF50 }},                      /* FF30; FF50; Case map */
+  { 0x00FF31, 0, { 0x00FF51 }},                      /* FF31; FF51; Case map */
+  { 0x00FF32, 0, { 0x00FF52 }},                      /* FF32; FF52; Case map */
+  { 0x00FF33, 0, { 0x00FF53 }},                      /* FF33; FF53; Case map */
+  { 0x00FF34, 0, { 0x00FF54 }},                      /* FF34; FF54; Case map */
+  { 0x00FF35, 0, { 0x00FF55 }},                      /* FF35; FF55; Case map */
+  { 0x00FF36, 0, { 0x00FF56 }},                      /* FF36; FF56; Case map */
+  { 0x00FF37, 0, { 0x00FF57 }},                      /* FF37; FF57; Case map */
+  { 0x00FF38, 0, { 0x00FF58 }},                      /* FF38; FF58; Case map */
+  { 0x00FF39, 0, { 0x00FF59 }},                      /* FF39; FF59; Case map */
+  { 0x00FF3A, 0, { 0x00FF5A }},                      /* FF3A; FF5A; Case map */
+  { 0x010400, 0, { 0x010428 }},                    /* 10400; 10428; Case map */
+  { 0x010401, 0, { 0x010429 }},                    /* 10401; 10429; Case map */
+  { 0x010402, 0, { 0x01042A }},                    /* 10402; 1042A; Case map */
+  { 0x010403, 0, { 0x01042B }},                    /* 10403; 1042B; Case map */
+  { 0x010404, 0, { 0x01042C }},                    /* 10404; 1042C; Case map */
+  { 0x010405, 0, { 0x01042D }},                    /* 10405; 1042D; Case map */
+  { 0x010406, 0, { 0x01042E }},                    /* 10406; 1042E; Case map */
+  { 0x010407, 0, { 0x01042F }},                    /* 10407; 1042F; Case map */
+  { 0x010408, 0, { 0x010430 }},                    /* 10408; 10430; Case map */
+  { 0x010409, 0, { 0x010431 }},                    /* 10409; 10431; Case map */
+  { 0x01040A, 0, { 0x010432 }},                    /* 1040A; 10432; Case map */
+  { 0x01040B, 0, { 0x010433 }},                    /* 1040B; 10433; Case map */
+  { 0x01040C, 0, { 0x010434 }},                    /* 1040C; 10434; Case map */
+  { 0x01040D, 0, { 0x010435 }},                    /* 1040D; 10435; Case map */
+  { 0x01040E, 0, { 0x010436 }},                    /* 1040E; 10436; Case map */
+  { 0x01040F, 0, { 0x010437 }},                    /* 1040F; 10437; Case map */
+  { 0x010410, 0, { 0x010438 }},                    /* 10410; 10438; Case map */
+  { 0x010411, 0, { 0x010439 }},                    /* 10411; 10439; Case map */
+  { 0x010412, 0, { 0x01043A }},                    /* 10412; 1043A; Case map */
+  { 0x010413, 0, { 0x01043B }},                    /* 10413; 1043B; Case map */
+  { 0x010414, 0, { 0x01043C }},                    /* 10414; 1043C; Case map */
+  { 0x010415, 0, { 0x01043D }},                    /* 10415; 1043D; Case map */
+  { 0x010416, 0, { 0x01043E }},                    /* 10416; 1043E; Case map */
+  { 0x010417, 0, { 0x01043F }},                    /* 10417; 1043F; Case map */
+  { 0x010418, 0, { 0x010440 }},                    /* 10418; 10440; Case map */
+  { 0x010419, 0, { 0x010441 }},                    /* 10419; 10441; Case map */
+  { 0x01041A, 0, { 0x010442 }},                    /* 1041A; 10442; Case map */
+  { 0x01041B, 0, { 0x010443 }},                    /* 1041B; 10443; Case map */
+  { 0x01041C, 0, { 0x010444 }},                    /* 1041C; 10444; Case map */
+  { 0x01041D, 0, { 0x010445 }},                    /* 1041D; 10445; Case map */
+  { 0x01041E, 0, { 0x010446 }},                    /* 1041E; 10446; Case map */
+  { 0x01041F, 0, { 0x010447 }},                    /* 1041F; 10447; Case map */
+  { 0x010420, 0, { 0x010448 }},                    /* 10420; 10448; Case map */
+  { 0x010421, 0, { 0x010449 }},                    /* 10421; 10449; Case map */
+  { 0x010422, 0, { 0x01044A }},                    /* 10422; 1044A; Case map */
+  { 0x010423, 0, { 0x01044B }},                    /* 10423; 1044B; Case map */
+  { 0x010424, 0, { 0x01044C }},                    /* 10424; 1044C; Case map */
+  { 0x010425, 0, { 0x01044D }},                    /* 10425; 1044D; Case map */
+  { 0 },
+};
+
+
+/*
+ * C.1.1 ASCII space characters
+ * 
+ */
+
+const Stringprep_table_element stringprep_rfc3454_C_1_1[] = {
+  { 0x000020           },                                     /* 0020; SPACE */
+  { 0 },
+};
+
+
+/*
+ * C.1.2 Non-ASCII space characters
+ *  */
+
+const Stringprep_table_element stringprep_rfc3454_C_1_2[] = {
+  { 0x0000A0           },                            /* 00A0; NO-BREAK SPACE */
+  { 0x001680           },                          /* 1680; OGHAM SPACE MARK */
+  { 0x002000           },                                   /* 2000; EN QUAD */
+  { 0x002001           },                                   /* 2001; EM QUAD */
+  { 0x002002           },                                  /* 2002; EN SPACE */
+  { 0x002003           },                                  /* 2003; EM SPACE */
+  { 0x002004           },                        /* 2004; THREE-PER-EM SPACE */
+  { 0x002005           },                         /* 2005; FOUR-PER-EM SPACE */
+  { 0x002006           },                          /* 2006; SIX-PER-EM SPACE */
+  { 0x002007           },                              /* 2007; FIGURE SPACE */
+  { 0x002008           },                         /* 2008; PUNCTUATION SPACE */
+  { 0x002009           },                                /* 2009; THIN SPACE */
+  { 0x00200A           },                                /* 200A; HAIR SPACE */
+  { 0x00200B           },                          /* 200B; ZERO WIDTH SPACE */
+  { 0x00202F           },                     /* 202F; NARROW NO-BREAK SPACE */
+  { 0x00205F           },                 /* 205F; MEDIUM MATHEMATICAL SPACE */
+  { 0x003000           },                         /* 3000; IDEOGRAPHIC SPACE */
+  { 0 },
+};
+
+
+/*
+ * C.2.1 ASCII control characters
+ * 
+ */
+
+const Stringprep_table_element stringprep_rfc3454_C_2_1[] = {
+  { 0x000000, 0x00001F },                 /* 0000-001F; [CONTROL CHARACTERS] */
+  { 0x00007F           },                                    /* 007F; DELETE */
+  { 0 },
+};
+
+
+/*
+ * C.2.2 Non-ASCII control characters
+ * 
+ */
+
+const Stringprep_table_element stringprep_rfc3454_C_2_2[] = {
+  { 0x000080, 0x00009F },                 /* 0080-009F; [CONTROL CHARACTERS] */
+  { 0x0006DD           },                        /* 06DD; ARABIC END OF AYAH */
+  { 0x00070F           },                  /* 070F; SYRIAC ABBREVIATION MARK */
+  { 0x00180E           },                 /* 180E; MONGOLIAN VOWEL SEPARATOR */
+  { 0x00200C           },                     /* 200C; ZERO WIDTH NON-JOINER */
+  { 0x00200D           },                         /* 200D; ZERO WIDTH JOINER */
+  { 0x002028           },                            /* 2028; LINE SEPARATOR */
+  { 0x002029           },                       /* 2029; PARAGRAPH SEPARATOR */
+  { 0x002060           },                               /* 2060; WORD JOINER */
+  { 0x002061           },                      /* 2061; FUNCTION APPLICATION */
+  { 0x002062           },                           /* 2062; INVISIBLE TIMES */
+  { 0x002063           },                       /* 2063; INVISIBLE SEPARATOR */
+  { 0x00206A, 0x00206F },                 /* 206A-206F; [CONTROL CHARACTERS] */
+  { 0x00FEFF           },                 /* FEFF; ZERO WIDTH NO-BREAK SPACE */
+  { 0x00FFF9, 0x00FFFC },                 /* FFF9-FFFC; [CONTROL CHARACTERS] */
+  { 0x01D173, 0x01D17A },       /* 1D173-1D17A; [MUSICAL CONTROL CHARACTERS] */
+  { 0 },
+};
+
+
+/*
+ * C.3 Private use
+ * 
+ */
+
+const Stringprep_table_element stringprep_rfc3454_C_3[] = {
+  { 0x00E000, 0x00F8FF },               /* E000-F8FF; [PRIVATE USE, PLANE 0] */
+  { 0x0F0000, 0x0FFFFD },            /* F0000-FFFFD; [PRIVATE USE, PLANE 15] */
+  { 0x100000, 0x10FFFD },          /* 100000-10FFFD; [PRIVATE USE, PLANE 16] */
+  { 0 },
+};
+
+
+/*
+ * C.4 Non-character code points
+ * 
+ */
+
+const Stringprep_table_element stringprep_rfc3454_C_4[] = {
+  { 0x00FDD0, 0x00FDEF },           /* FDD0-FDEF; [NONCHARACTER CODE POINTS] */
+  { 0x00FFFE, 0x00FFFF },           /* FFFE-FFFF; [NONCHARACTER CODE POINTS] */
+  { 0x01FFFE, 0x01FFFF },         /* 1FFFE-1FFFF; [NONCHARACTER CODE POINTS] */
+  { 0x02FFFE, 0x02FFFF },         /* 2FFFE-2FFFF; [NONCHARACTER CODE POINTS] */
+  { 0x03FFFE, 0x03FFFF },         /* 3FFFE-3FFFF; [NONCHARACTER CODE POINTS] */
+  { 0x04FFFE, 0x04FFFF },         /* 4FFFE-4FFFF; [NONCHARACTER CODE POINTS] */
+  { 0x05FFFE, 0x05FFFF },         /* 5FFFE-5FFFF; [NONCHARACTER CODE POINTS] */
+  { 0x06FFFE, 0x06FFFF },         /* 6FFFE-6FFFF; [NONCHARACTER CODE POINTS] */
+  { 0x07FFFE, 0x07FFFF },         /* 7FFFE-7FFFF; [NONCHARACTER CODE POINTS] */
+  { 0x08FFFE, 0x08FFFF },         /* 8FFFE-8FFFF; [NONCHARACTER CODE POINTS] */
+  { 0x09FFFE, 0x09FFFF },         /* 9FFFE-9FFFF; [NONCHARACTER CODE POINTS] */
+  { 0x0AFFFE, 0x0AFFFF },         /* AFFFE-AFFFF; [NONCHARACTER CODE POINTS] */
+  { 0x0BFFFE, 0x0BFFFF },         /* BFFFE-BFFFF; [NONCHARACTER CODE POINTS] */
+  { 0x0CFFFE, 0x0CFFFF },         /* CFFFE-CFFFF; [NONCHARACTER CODE POINTS] */
+  { 0x0DFFFE, 0x0DFFFF },         /* DFFFE-DFFFF; [NONCHARACTER CODE POINTS] */
+  { 0x0EFFFE, 0x0EFFFF },         /* EFFFE-EFFFF; [NONCHARACTER CODE POINTS] */
+  { 0x0FFFFE, 0x0FFFFF },         /* FFFFE-FFFFF; [NONCHARACTER CODE POINTS] */
+  { 0x10FFFE, 0x10FFFF },       /* 10FFFE-10FFFF; [NONCHARACTER CODE POINTS] */
+  { 0 },
+};
+
+
+/*
+ * C.5 Surrogate codes
+ * 
+ */
+
+const Stringprep_table_element stringprep_rfc3454_C_5[] = {
+  { 0x00D800, 0x00DFFF },                    /* D800-DFFF; [SURROGATE CODES] */
+  { 0 },
+};
+
+
+/*
+ * C.6 Inappropriate for plain text
+ * 
+ */
+
+const Stringprep_table_element stringprep_rfc3454_C_6[] = {
+  { 0x00FFF9           },             /* FFF9; INTERLINEAR ANNOTATION ANCHOR */
+  { 0x00FFFA           },          /* FFFA; INTERLINEAR ANNOTATION SEPARATOR */
+  { 0x00FFFB           },         /* FFFB; INTERLINEAR ANNOTATION TERMINATOR */
+  { 0x00FFFC           },              /* FFFC; OBJECT REPLACEMENT CHARACTER */
+  { 0x00FFFD           },                     /* FFFD; REPLACEMENT CHARACTER */
+  { 0 },
+};
+
+
+/*
+ * C.7 Inappropriate for canonical representation
+ * 
+ */
+
+const Stringprep_table_element stringprep_rfc3454_C_7[] = {
+  { 0x002FF0, 0x002FFB }, /* 2FF0-2FFB; [IDEOGRAPHIC DESCRIPTION CHARACTERS] */
+  { 0 },
+};
+
+
+/*
+ * C.8 Change display properties or are deprecated
+ * 
+ */
+
+const Stringprep_table_element stringprep_rfc3454_C_8[] = {
+  { 0x000340           },                 /* 0340; COMBINING GRAVE TONE MARK */
+  { 0x000341           },                 /* 0341; COMBINING ACUTE TONE MARK */
+  { 0x00200E           },                        /* 200E; LEFT-TO-RIGHT MARK */
+  { 0x00200F           },                        /* 200F; RIGHT-TO-LEFT MARK */
+  { 0x00202A           },                   /* 202A; LEFT-TO-RIGHT EMBEDDING */
+  { 0x00202B           },                   /* 202B; RIGHT-TO-LEFT EMBEDDING */
+  { 0x00202C           },                /* 202C; POP DIRECTIONAL FORMATTING */
+  { 0x00202D           },                    /* 202D; LEFT-TO-RIGHT OVERRIDE */
+  { 0x00202E           },                    /* 202E; RIGHT-TO-LEFT OVERRIDE */
+  { 0x00206A           },                /* 206A; INHIBIT SYMMETRIC SWAPPING */
+  { 0x00206B           },               /* 206B; ACTIVATE SYMMETRIC SWAPPING */
+  { 0x00206C           },               /* 206C; INHIBIT ARABIC FORM SHAPING */
+  { 0x00206D           },              /* 206D; ACTIVATE ARABIC FORM SHAPING */
+  { 0x00206E           },                     /* 206E; NATIONAL DIGIT SHAPES */
+  { 0x00206F           },                      /* 206F; NOMINAL DIGIT SHAPES */
+  { 0 },
+};
+
+
+/*
+ * C.9 Tagging characters
+ * 
+ */
+
+const Stringprep_table_element stringprep_rfc3454_C_9[] = {
+  { 0x0E0001           },                             /* E0001; LANGUAGE TAG */
+  { 0x0E0020, 0x0E007F },               /* E0020-E007F; [TAGGING CHARACTERS] */
+  { 0 },
+};
+
+
+/*
+ * D.1 Characters with bidirectional property "R" or "AL"
+ * 
+ */
+
+const Stringprep_table_element stringprep_rfc3454_D_1[] = {
+  { 0x0005BE           },                                            /* 05BE */
+  { 0x0005C0           },                                            /* 05C0 */
+  { 0x0005C3           },                                            /* 05C3 */
+  { 0x0005D0, 0x0005EA },                                       /* 05D0-05EA */
+  { 0x0005F0, 0x0005F4 },                                       /* 05F0-05F4 */
+  { 0x00061B           },                                            /* 061B */
+  { 0x00061F           },                                            /* 061F */
+  { 0x000621, 0x00063A },                                       /* 0621-063A */
+  { 0x000640, 0x00064A },                                       /* 0640-064A */
+  { 0x00066D, 0x00066F },                                       /* 066D-066F */
+  { 0x000671, 0x0006D5 },                                       /* 0671-06D5 */
+  { 0x0006DD           },                                            /* 06DD */
+  { 0x0006E5, 0x0006E6 },                                       /* 06E5-06E6 */
+  { 0x0006FA, 0x0006FE },                                       /* 06FA-06FE */
+  { 0x000700, 0x00070D },                                       /* 0700-070D */
+  { 0x000710           },                                            /* 0710 */
+  { 0x000712, 0x00072C },                                       /* 0712-072C */
+  { 0x000780, 0x0007A5 },                                       /* 0780-07A5 */
+  { 0x0007B1           },                                            /* 07B1 */
+  { 0x00200F           },                                            /* 200F */
+  { 0x00FB1D           },                                            /* FB1D */
+  { 0x00FB1F, 0x00FB28 },                                       /* FB1F-FB28 */
+  { 0x00FB2A, 0x00FB36 },                                       /* FB2A-FB36 */
+  { 0x00FB38, 0x00FB3C },                                       /* FB38-FB3C */
+  { 0x00FB3E           },                                            /* FB3E */
+  { 0x00FB40, 0x00FB41 },                                       /* FB40-FB41 */
+  { 0x00FB43, 0x00FB44 },                                       /* FB43-FB44 */
+  { 0x00FB46, 0x00FBB1 },                                       /* FB46-FBB1 */
+  { 0x00FBD3, 0x00FD3D },                                       /* FBD3-FD3D */
+  { 0x00FD50, 0x00FD8F },                                       /* FD50-FD8F */
+  { 0x00FD92, 0x00FDC7 },                                       /* FD92-FDC7 */
+  { 0x00FDF0, 0x00FDFC },                                       /* FDF0-FDFC */
+  { 0x00FE70, 0x00FE74 },                                       /* FE70-FE74 */
+  { 0x00FE76, 0x00FEFC },                                       /* FE76-FEFC */
+  { 0 },
+};
+
+
+/*
+ * D.2 Characters with bidirectional property "L"
+ * 
+ */
+
+const Stringprep_table_element stringprep_rfc3454_D_2[] = {
+  { 0x000041, 0x00005A },                                       /* 0041-005A */
+  { 0x000061, 0x00007A },                                       /* 0061-007A */
+  { 0x0000AA           },                                            /* 00AA */
+  { 0x0000B5           },                                            /* 00B5 */
+  { 0x0000BA           },                                            /* 00BA */
+  { 0x0000C0, 0x0000D6 },                                       /* 00C0-00D6 */
+  { 0x0000D8, 0x0000F6 },                                       /* 00D8-00F6 */
+  { 0x0000F8, 0x000220 },                                       /* 00F8-0220 */
+  { 0x000222, 0x000233 },                                       /* 0222-0233 */
+  { 0x000250, 0x0002AD },                                       /* 0250-02AD */
+  { 0x0002B0, 0x0002B8 },                                       /* 02B0-02B8 */
+  { 0x0002BB, 0x0002C1 },                                       /* 02BB-02C1 */
+  { 0x0002D0, 0x0002D1 },                                       /* 02D0-02D1 */
+  { 0x0002E0, 0x0002E4 },                                       /* 02E0-02E4 */
+  { 0x0002EE           },                                            /* 02EE */
+  { 0x00037A           },                                            /* 037A */
+  { 0x000386           },                                            /* 0386 */
+  { 0x000388, 0x00038A },                                       /* 0388-038A */
+  { 0x00038C           },                                            /* 038C */
+  { 0x00038E, 0x0003A1 },                                       /* 038E-03A1 */
+  { 0x0003A3, 0x0003CE },                                       /* 03A3-03CE */
+  { 0x0003D0, 0x0003F5 },                                       /* 03D0-03F5 */
+  { 0x000400, 0x000482 },                                       /* 0400-0482 */
+  { 0x00048A, 0x0004CE },                                       /* 048A-04CE */
+  { 0x0004D0, 0x0004F5 },                                       /* 04D0-04F5 */
+  { 0x0004F8, 0x0004F9 },                                       /* 04F8-04F9 */
+  { 0x000500, 0x00050F },                                       /* 0500-050F */
+  { 0x000531, 0x000556 },                                       /* 0531-0556 */
+  { 0x000559, 0x00055F },                                       /* 0559-055F */
+  { 0x000561, 0x000587 },                                       /* 0561-0587 */
+  { 0x000589           },                                            /* 0589 */
+  { 0x000903           },                                            /* 0903 */
+  { 0x000905, 0x000939 },                                       /* 0905-0939 */
+  { 0x00093D, 0x000940 },                                       /* 093D-0940 */
+  { 0x000949, 0x00094C },                                       /* 0949-094C */
+  { 0x000950           },                                            /* 0950 */
+  { 0x000958, 0x000961 },                                       /* 0958-0961 */
+  { 0x000964, 0x000970 },                                       /* 0964-0970 */
+  { 0x000982, 0x000983 },                                       /* 0982-0983 */
+  { 0x000985, 0x00098C },                                       /* 0985-098C */
+  { 0x00098F, 0x000990 },                                       /* 098F-0990 */
+  { 0x000993, 0x0009A8 },                                       /* 0993-09A8 */
+  { 0x0009AA, 0x0009B0 },                                       /* 09AA-09B0 */
+  { 0x0009B2           },                                            /* 09B2 */
+  { 0x0009B6, 0x0009B9 },                                       /* 09B6-09B9 */
+  { 0x0009BE, 0x0009C0 },                                       /* 09BE-09C0 */
+  { 0x0009C7, 0x0009C8 },                                       /* 09C7-09C8 */
+  { 0x0009CB, 0x0009CC },                                       /* 09CB-09CC */
+  { 0x0009D7           },                                            /* 09D7 */
+  { 0x0009DC, 0x0009DD },                                       /* 09DC-09DD */
+  { 0x0009DF, 0x0009E1 },                                       /* 09DF-09E1 */
+  { 0x0009E6, 0x0009F1 },                                       /* 09E6-09F1 */
+  { 0x0009F4, 0x0009FA },                                       /* 09F4-09FA */
+  { 0x000A05, 0x000A0A },                                       /* 0A05-0A0A */
+  { 0x000A0F, 0x000A10 },                                       /* 0A0F-0A10 */
+  { 0x000A13, 0x000A28 },                                       /* 0A13-0A28 */
+  { 0x000A2A, 0x000A30 },                                       /* 0A2A-0A30 */
+  { 0x000A32, 0x000A33 },                                       /* 0A32-0A33 */
+  { 0x000A35, 0x000A36 },                                       /* 0A35-0A36 */
+  { 0x000A38, 0x000A39 },                                       /* 0A38-0A39 */
+  { 0x000A3E, 0x000A40 },                                       /* 0A3E-0A40 */
+  { 0x000A59, 0x000A5C },                                       /* 0A59-0A5C */
+  { 0x000A5E           },                                            /* 0A5E */
+  { 0x000A66, 0x000A6F },                                       /* 0A66-0A6F */
+  { 0x000A72, 0x000A74 },                                       /* 0A72-0A74 */
+  { 0x000A83           },                                            /* 0A83 */
+  { 0x000A85, 0x000A8B },                                       /* 0A85-0A8B */
+  { 0x000A8D           },                                            /* 0A8D */
+  { 0x000A8F, 0x000A91 },                                       /* 0A8F-0A91 */
+  { 0x000A93, 0x000AA8 },                                       /* 0A93-0AA8 */
+  { 0x000AAA, 0x000AB0 },                                       /* 0AAA-0AB0 */
+  { 0x000AB2, 0x000AB3 },                                       /* 0AB2-0AB3 */
+  { 0x000AB5, 0x000AB9 },                                       /* 0AB5-0AB9 */
+  { 0x000ABD, 0x000AC0 },                                       /* 0ABD-0AC0 */
+  { 0x000AC9           },                                            /* 0AC9 */
+  { 0x000ACB, 0x000ACC },                                       /* 0ACB-0ACC */
+  { 0x000AD0           },                                            /* 0AD0 */
+  { 0x000AE0           },                                            /* 0AE0 */
+  { 0x000AE6, 0x000AEF },                                       /* 0AE6-0AEF */
+  { 0x000B02, 0x000B03 },                                       /* 0B02-0B03 */
+  { 0x000B05, 0x000B0C },                                       /* 0B05-0B0C */
+  { 0x000B0F, 0x000B10 },                                       /* 0B0F-0B10 */
+  { 0x000B13, 0x000B28 },                                       /* 0B13-0B28 */
+  { 0x000B2A, 0x000B30 },                                       /* 0B2A-0B30 */
+  { 0x000B32, 0x000B33 },                                       /* 0B32-0B33 */
+  { 0x000B36, 0x000B39 },                                       /* 0B36-0B39 */
+  { 0x000B3D, 0x000B3E },                                       /* 0B3D-0B3E */
+  { 0x000B40           },                                            /* 0B40 */
+  { 0x000B47, 0x000B48 },                                       /* 0B47-0B48 */
+  { 0x000B4B, 0x000B4C },                                       /* 0B4B-0B4C */
+  { 0x000B57           },                                            /* 0B57 */
+  { 0x000B5C, 0x000B5D },                                       /* 0B5C-0B5D */
+  { 0x000B5F, 0x000B61 },                                       /* 0B5F-0B61 */
+  { 0x000B66, 0x000B70 },                                       /* 0B66-0B70 */
+  { 0x000B83           },                                            /* 0B83 */
+  { 0x000B85, 0x000B8A },                                       /* 0B85-0B8A */
+  { 0x000B8E, 0x000B90 },                                       /* 0B8E-0B90 */
+  { 0x000B92, 0x000B95 },                                       /* 0B92-0B95 */
+  { 0x000B99, 0x000B9A },                                       /* 0B99-0B9A */
+  { 0x000B9C           },                                            /* 0B9C */
+  { 0x000B9E, 0x000B9F },                                       /* 0B9E-0B9F */
+  { 0x000BA3, 0x000BA4 },                                       /* 0BA3-0BA4 */
+  { 0x000BA8, 0x000BAA },                                       /* 0BA8-0BAA */
+  { 0x000BAE, 0x000BB5 },                                       /* 0BAE-0BB5 */
+  { 0x000BB7, 0x000BB9 },                                       /* 0BB7-0BB9 */
+  { 0x000BBE, 0x000BBF },                                       /* 0BBE-0BBF */
+  { 0x000BC1, 0x000BC2 },                                       /* 0BC1-0BC2 */
+  { 0x000BC6, 0x000BC8 },                                       /* 0BC6-0BC8 */
+  { 0x000BCA, 0x000BCC },                                       /* 0BCA-0BCC */
+  { 0x000BD7           },                                            /* 0BD7 */
+  { 0x000BE7, 0x000BF2 },                                       /* 0BE7-0BF2 */
+  { 0x000C01, 0x000C03 },                                       /* 0C01-0C03 */
+  { 0x000C05, 0x000C0C },                                       /* 0C05-0C0C */
+  { 0x000C0E, 0x000C10 },                                       /* 0C0E-0C10 */
+  { 0x000C12, 0x000C28 },                                       /* 0C12-0C28 */
+  { 0x000C2A, 0x000C33 },                                       /* 0C2A-0C33 */
+  { 0x000C35, 0x000C39 },                                       /* 0C35-0C39 */
+  { 0x000C41, 0x000C44 },                                       /* 0C41-0C44 */
+  { 0x000C60, 0x000C61 },                                       /* 0C60-0C61 */
+  { 0x000C66, 0x000C6F },                                       /* 0C66-0C6F */
+  { 0x000C82, 0x000C83 },                                       /* 0C82-0C83 */
+  { 0x000C85, 0x000C8C },                                       /* 0C85-0C8C */
+  { 0x000C8E, 0x000C90 },                                       /* 0C8E-0C90 */
+  { 0x000C92, 0x000CA8 },                                       /* 0C92-0CA8 */
+  { 0x000CAA, 0x000CB3 },                                       /* 0CAA-0CB3 */
+  { 0x000CB5, 0x000CB9 },                                       /* 0CB5-0CB9 */
+  { 0x000CBE           },                                            /* 0CBE */
+  { 0x000CC0, 0x000CC4 },                                       /* 0CC0-0CC4 */
+  { 0x000CC7, 0x000CC8 },                                       /* 0CC7-0CC8 */
+  { 0x000CCA, 0x000CCB },                                       /* 0CCA-0CCB */
+  { 0x000CD5, 0x000CD6 },                                       /* 0CD5-0CD6 */
+  { 0x000CDE           },                                            /* 0CDE */
+  { 0x000CE0, 0x000CE1 },                                       /* 0CE0-0CE1 */
+  { 0x000CE6, 0x000CEF },                                       /* 0CE6-0CEF */
+  { 0x000D02, 0x000D03 },                                       /* 0D02-0D03 */
+  { 0x000D05, 0x000D0C },                                       /* 0D05-0D0C */
+  { 0x000D0E, 0x000D10 },                                       /* 0D0E-0D10 */
+  { 0x000D12, 0x000D28 },                                       /* 0D12-0D28 */
+  { 0x000D2A, 0x000D39 },                                       /* 0D2A-0D39 */
+  { 0x000D3E, 0x000D40 },                                       /* 0D3E-0D40 */
+  { 0x000D46, 0x000D48 },                                       /* 0D46-0D48 */
+  { 0x000D4A, 0x000D4C },                                       /* 0D4A-0D4C */
+  { 0x000D57           },                                            /* 0D57 */
+  { 0x000D60, 0x000D61 },                                       /* 0D60-0D61 */
+  { 0x000D66, 0x000D6F },                                       /* 0D66-0D6F */
+  { 0x000D82, 0x000D83 },                                       /* 0D82-0D83 */
+  { 0x000D85, 0x000D96 },                                       /* 0D85-0D96 */
+  { 0x000D9A, 0x000DB1 },                                       /* 0D9A-0DB1 */
+  { 0x000DB3, 0x000DBB },                                       /* 0DB3-0DBB */
+  { 0x000DBD           },                                            /* 0DBD */
+  { 0x000DC0, 0x000DC6 },                                       /* 0DC0-0DC6 */
+  { 0x000DCF, 0x000DD1 },                                       /* 0DCF-0DD1 */
+  { 0x000DD8, 0x000DDF },                                       /* 0DD8-0DDF */
+  { 0x000DF2, 0x000DF4 },                                       /* 0DF2-0DF4 */
+  { 0x000E01, 0x000E30 },                                       /* 0E01-0E30 */
+  { 0x000E32, 0x000E33 },                                       /* 0E32-0E33 */
+  { 0x000E40, 0x000E46 },                                       /* 0E40-0E46 */
+  { 0x000E4F, 0x000E5B },                                       /* 0E4F-0E5B */
+  { 0x000E81, 0x000E82 },                                       /* 0E81-0E82 */
+  { 0x000E84           },                                            /* 0E84 */
+  { 0x000E87, 0x000E88 },                                       /* 0E87-0E88 */
+  { 0x000E8A           },                                            /* 0E8A */
+  { 0x000E8D           },                                            /* 0E8D */
+  { 0x000E94, 0x000E97 },                                       /* 0E94-0E97 */
+  { 0x000E99, 0x000E9F },                                       /* 0E99-0E9F */
+  { 0x000EA1, 0x000EA3 },                                       /* 0EA1-0EA3 */
+  { 0x000EA5           },                                            /* 0EA5 */
+  { 0x000EA7           },                                            /* 0EA7 */
+  { 0x000EAA, 0x000EAB },                                       /* 0EAA-0EAB */
+  { 0x000EAD, 0x000EB0 },                                       /* 0EAD-0EB0 */
+  { 0x000EB2, 0x000EB3 },                                       /* 0EB2-0EB3 */
+  { 0x000EBD           },                                            /* 0EBD */
+  { 0x000EC0, 0x000EC4 },                                       /* 0EC0-0EC4 */
+  { 0x000EC6           },                                            /* 0EC6 */
+  { 0x000ED0, 0x000ED9 },                                       /* 0ED0-0ED9 */
+  { 0x000EDC, 0x000EDD },                                       /* 0EDC-0EDD */
+  { 0x000F00, 0x000F17 },                                       /* 0F00-0F17 */
+  { 0x000F1A, 0x000F34 },                                       /* 0F1A-0F34 */
+  { 0x000F36           },                                            /* 0F36 */
+  { 0x000F38           },                                            /* 0F38 */
+  { 0x000F3E, 0x000F47 },                                       /* 0F3E-0F47 */
+  { 0x000F49, 0x000F6A },                                       /* 0F49-0F6A */
+  { 0x000F7F           },                                            /* 0F7F */
+  { 0x000F85           },                                            /* 0F85 */
+  { 0x000F88, 0x000F8B },                                       /* 0F88-0F8B */
+  { 0x000FBE, 0x000FC5 },                                       /* 0FBE-0FC5 */
+  { 0x000FC7, 0x000FCC },                                       /* 0FC7-0FCC */
+  { 0x000FCF           },                                            /* 0FCF */
+  { 0x001000, 0x001021 },                                       /* 1000-1021 */
+  { 0x001023, 0x001027 },                                       /* 1023-1027 */
+  { 0x001029, 0x00102A },                                       /* 1029-102A */
+  { 0x00102C           },                                            /* 102C */
+  { 0x001031           },                                            /* 1031 */
+  { 0x001038           },                                            /* 1038 */
+  { 0x001040, 0x001057 },                                       /* 1040-1057 */
+  { 0x0010A0, 0x0010C5 },                                       /* 10A0-10C5 */
+  { 0x0010D0, 0x0010F8 },                                       /* 10D0-10F8 */
+  { 0x0010FB           },                                            /* 10FB */
+  { 0x001100, 0x001159 },                                       /* 1100-1159 */
+  { 0x00115F, 0x0011A2 },                                       /* 115F-11A2 */
+  { 0x0011A8, 0x0011F9 },                                       /* 11A8-11F9 */
+  { 0x001200, 0x001206 },                                       /* 1200-1206 */
+  { 0x001208, 0x001246 },                                       /* 1208-1246 */
+  { 0x001248           },                                            /* 1248 */
+  { 0x00124A, 0x00124D },                                       /* 124A-124D */
+  { 0x001250, 0x001256 },                                       /* 1250-1256 */
+  { 0x001258           },                                            /* 1258 */
+  { 0x00125A, 0x00125D },                                       /* 125A-125D */
+  { 0x001260, 0x001286 },                                       /* 1260-1286 */
+  { 0x001288           },                                            /* 1288 */
+  { 0x00128A, 0x00128D },                                       /* 128A-128D */
+  { 0x001290, 0x0012AE },                                       /* 1290-12AE */
+  { 0x0012B0           },                                            /* 12B0 */
+  { 0x0012B2, 0x0012B5 },                                       /* 12B2-12B5 */
+  { 0x0012B8, 0x0012BE },                                       /* 12B8-12BE */
+  { 0x0012C0           },                                            /* 12C0 */
+  { 0x0012C2, 0x0012C5 },                                       /* 12C2-12C5 */
+  { 0x0012C8, 0x0012CE },                                       /* 12C8-12CE */
+  { 0x0012D0, 0x0012D6 },                                       /* 12D0-12D6 */
+  { 0x0012D8, 0x0012EE },                                       /* 12D8-12EE */
+  { 0x0012F0, 0x00130E },                                       /* 12F0-130E */
+  { 0x001310           },                                            /* 1310 */
+  { 0x001312, 0x001315 },                                       /* 1312-1315 */
+  { 0x001318, 0x00131E },                                       /* 1318-131E */
+  { 0x001320, 0x001346 },                                       /* 1320-1346 */
+  { 0x001348, 0x00135A },                                       /* 1348-135A */
+  { 0x001361, 0x00137C },                                       /* 1361-137C */
+  { 0x0013A0, 0x0013F4 },                                       /* 13A0-13F4 */
+  { 0x001401, 0x001676 },                                       /* 1401-1676 */
+  { 0x001681, 0x00169A },                                       /* 1681-169A */
+  { 0x0016A0, 0x0016F0 },                                       /* 16A0-16F0 */
+  { 0x001700, 0x00170C },                                       /* 1700-170C */
+  { 0x00170E, 0x001711 },                                       /* 170E-1711 */
+  { 0x001720, 0x001731 },                                       /* 1720-1731 */
+  { 0x001735, 0x001736 },                                       /* 1735-1736 */
+  { 0x001740, 0x001751 },                                       /* 1740-1751 */
+  { 0x001760, 0x00176C },                                       /* 1760-176C */
+  { 0x00176E, 0x001770 },                                       /* 176E-1770 */
+  { 0x001780, 0x0017B6 },                                       /* 1780-17B6 */
+  { 0x0017BE, 0x0017C5 },                                       /* 17BE-17C5 */
+  { 0x0017C7, 0x0017C8 },                                       /* 17C7-17C8 */
+  { 0x0017D4, 0x0017DA },                                       /* 17D4-17DA */
+  { 0x0017DC           },                                            /* 17DC */
+  { 0x0017E0, 0x0017E9 },                                       /* 17E0-17E9 */
+  { 0x001810, 0x001819 },                                       /* 1810-1819 */
+  { 0x001820, 0x001877 },                                       /* 1820-1877 */
+  { 0x001880, 0x0018A8 },                                       /* 1880-18A8 */
+  { 0x001E00, 0x001E9B },                                       /* 1E00-1E9B */
+  { 0x001EA0, 0x001EF9 },                                       /* 1EA0-1EF9 */
+  { 0x001F00, 0x001F15 },                                       /* 1F00-1F15 */
+  { 0x001F18, 0x001F1D },                                       /* 1F18-1F1D */
+  { 0x001F20, 0x001F45 },                                       /* 1F20-1F45 */
+  { 0x001F48, 0x001F4D },                                       /* 1F48-1F4D */
+  { 0x001F50, 0x001F57 },                                       /* 1F50-1F57 */
+  { 0x001F59           },                                            /* 1F59 */
+  { 0x001F5B           },                                            /* 1F5B */
+  { 0x001F5D           },                                            /* 1F5D */
+  { 0x001F5F, 0x001F7D },                                       /* 1F5F-1F7D */
+  { 0x001F80, 0x001FB4 },                                       /* 1F80-1FB4 */
+  { 0x001FB6, 0x001FBC },                                       /* 1FB6-1FBC */
+  { 0x001FBE           },                                            /* 1FBE */
+  { 0x001FC2, 0x001FC4 },                                       /* 1FC2-1FC4 */
+  { 0x001FC6, 0x001FCC },                                       /* 1FC6-1FCC */
+  { 0x001FD0, 0x001FD3 },                                       /* 1FD0-1FD3 */
+  { 0x001FD6, 0x001FDB },                                       /* 1FD6-1FDB */
+  { 0x001FE0, 0x001FEC },                                       /* 1FE0-1FEC */
+  { 0x001FF2, 0x001FF4 },                                       /* 1FF2-1FF4 */
+  { 0x001FF6, 0x001FFC },                                       /* 1FF6-1FFC */
+  { 0x00200E           },                                            /* 200E */
+  { 0x002071           },                                            /* 2071 */
+  { 0x00207F           },                                            /* 207F */
+  { 0x002102           },                                            /* 2102 */
+  { 0x002107           },                                            /* 2107 */
+  { 0x00210A, 0x002113 },                                       /* 210A-2113 */
+  { 0x002115           },                                            /* 2115 */
+  { 0x002119, 0x00211D },                                       /* 2119-211D */
+  { 0x002124           },                                            /* 2124 */
+  { 0x002126           },                                            /* 2126 */
+  { 0x002128           },                                            /* 2128 */
+  { 0x00212A, 0x00212D },                                       /* 212A-212D */
+  { 0x00212F, 0x002131 },                                       /* 212F-2131 */
+  { 0x002133, 0x002139 },                                       /* 2133-2139 */
+  { 0x00213D, 0x00213F },                                       /* 213D-213F */
+  { 0x002145, 0x002149 },                                       /* 2145-2149 */
+  { 0x002160, 0x002183 },                                       /* 2160-2183 */
+  { 0x002336, 0x00237A },                                       /* 2336-237A */
+  { 0x002395           },                                            /* 2395 */
+  { 0x00249C, 0x0024E9 },                                       /* 249C-24E9 */
+  { 0x003005, 0x003007 },                                       /* 3005-3007 */
+  { 0x003021, 0x003029 },                                       /* 3021-3029 */
+  { 0x003031, 0x003035 },                                       /* 3031-3035 */
+  { 0x003038, 0x00303C },                                       /* 3038-303C */
+  { 0x003041, 0x003096 },                                       /* 3041-3096 */
+  { 0x00309D, 0x00309F },                                       /* 309D-309F */
+  { 0x0030A1, 0x0030FA },                                       /* 30A1-30FA */
+  { 0x0030FC, 0x0030FF },                                       /* 30FC-30FF */
+  { 0x003105, 0x00312C },                                       /* 3105-312C */
+  { 0x003131, 0x00318E },                                       /* 3131-318E */
+  { 0x003190, 0x0031B7 },                                       /* 3190-31B7 */
+  { 0x0031F0, 0x00321C },                                       /* 31F0-321C */
+  { 0x003220, 0x003243 },                                       /* 3220-3243 */
+  { 0x003260, 0x00327B },                                       /* 3260-327B */
+  { 0x00327F, 0x0032B0 },                                       /* 327F-32B0 */
+  { 0x0032C0, 0x0032CB },                                       /* 32C0-32CB */
+  { 0x0032D0, 0x0032FE },                                       /* 32D0-32FE */
+  { 0x003300, 0x003376 },                                       /* 3300-3376 */
+  { 0x00337B, 0x0033DD },                                       /* 337B-33DD */
+  { 0x0033E0, 0x0033FE },                                       /* 33E0-33FE */
+  { 0x003400, 0x004DB5 },                                       /* 3400-4DB5 */
+  { 0x004E00, 0x009FA5 },                                       /* 4E00-9FA5 */
+  { 0x00A000, 0x00A48C },                                       /* A000-A48C */
+  { 0x00AC00, 0x00D7A3 },                                       /* AC00-D7A3 */
+  { 0x00D800, 0x00FA2D },                                       /* D800-FA2D */
+  { 0x00FA30, 0x00FA6A },                                       /* FA30-FA6A */
+  { 0x00FB00, 0x00FB06 },                                       /* FB00-FB06 */
+  { 0x00FB13, 0x00FB17 },                                       /* FB13-FB17 */
+  { 0x00FF21, 0x00FF3A },                                       /* FF21-FF3A */
+  { 0x00FF41, 0x00FF5A },                                       /* FF41-FF5A */
+  { 0x00FF66, 0x00FFBE },                                       /* FF66-FFBE */
+  { 0x00FFC2, 0x00FFC7 },                                       /* FFC2-FFC7 */
+  { 0x00FFCA, 0x00FFCF },                                       /* FFCA-FFCF */
+  { 0x00FFD2, 0x00FFD7 },                                       /* FFD2-FFD7 */
+  { 0x00FFDA, 0x00FFDC },                                       /* FFDA-FFDC */
+  { 0x010300, 0x01031E },                                     /* 10300-1031E */
+  { 0x010320, 0x010323 },                                     /* 10320-10323 */
+  { 0x010330, 0x01034A },                                     /* 10330-1034A */
+  { 0x010400, 0x010425 },                                     /* 10400-10425 */
+  { 0x010428, 0x01044D },                                     /* 10428-1044D */
+  { 0x01D000, 0x01D0F5 },                                     /* 1D000-1D0F5 */
+  { 0x01D100, 0x01D126 },                                     /* 1D100-1D126 */
+  { 0x01D12A, 0x01D166 },                                     /* 1D12A-1D166 */
+  { 0x01D16A, 0x01D172 },                                     /* 1D16A-1D172 */
+  { 0x01D183, 0x01D184 },                                     /* 1D183-1D184 */
+  { 0x01D18C, 0x01D1A9 },                                     /* 1D18C-1D1A9 */
+  { 0x01D1AE, 0x01D1DD },                                     /* 1D1AE-1D1DD */
+  { 0x01D400, 0x01D454 },                                     /* 1D400-1D454 */
+  { 0x01D456, 0x01D49C },                                     /* 1D456-1D49C */
+  { 0x01D49E, 0x01D49F },                                     /* 1D49E-1D49F */
+  { 0x01D4A2           },                                           /* 1D4A2 */
+  { 0x01D4A5, 0x01D4A6 },                                     /* 1D4A5-1D4A6 */
+  { 0x01D4A9, 0x01D4AC },                                     /* 1D4A9-1D4AC */
+  { 0x01D4AE, 0x01D4B9 },                                     /* 1D4AE-1D4B9 */
+  { 0x01D4BB           },                                           /* 1D4BB */
+  { 0x01D4BD, 0x01D4C0 },                                     /* 1D4BD-1D4C0 */
+  { 0x01D4C2, 0x01D4C3 },                                     /* 1D4C2-1D4C3 */
+  { 0x01D4C5, 0x01D505 },                                     /* 1D4C5-1D505 */
+  { 0x01D507, 0x01D50A },                                     /* 1D507-1D50A */
+  { 0x01D50D, 0x01D514 },                                     /* 1D50D-1D514 */
+  { 0x01D516, 0x01D51C },                                     /* 1D516-1D51C */
+  { 0x01D51E, 0x01D539 },                                     /* 1D51E-1D539 */
+  { 0x01D53B, 0x01D53E },                                     /* 1D53B-1D53E */
+  { 0x01D540, 0x01D544 },                                     /* 1D540-1D544 */
+  { 0x01D546           },                                           /* 1D546 */
+  { 0x01D54A, 0x01D550 },                                     /* 1D54A-1D550 */
+  { 0x01D552, 0x01D6A3 },                                     /* 1D552-1D6A3 */
+  { 0x01D6A8, 0x01D7C9 },                                     /* 1D6A8-1D7C9 */
+  { 0x020000, 0x02A6D6 },                                     /* 20000-2A6D6 */
+  { 0x02F800, 0x02FA1D },                                     /* 2F800-2FA1D */
+  { 0x0F0000, 0x0FFFFD },                                     /* F0000-FFFFD */
+  { 0x100000, 0x10FFFD },                                   /* 100000-10FFFD */
+  { 0 },
+};
+
diff --git a/lib/contrib/stringprep.c b/lib/contrib/stringprep.c
new file mode 100644 (file)
index 0000000..497b5bf
--- /dev/null
@@ -0,0 +1,675 @@
+/* stringprep.c --- Core stringprep implementation.
+ * Copyright (C) 2002, 2003, 2004, 2005  Simon Josefsson
+ *
+ * This file is part of GNU Libidn.
+ *
+ * GNU Libidn is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * GNU Libidn is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with GNU Libidn; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ */
+
+#include <stdlib.h>
+#include <string.h>
+
+#include "stringprep.h"
+
+const Stringprep_profiles stringprep_profiles[] = {
+  {NULL, NULL}
+};
+
+static ssize_t
+stringprep_find_character_in_table (uint32_t ucs4,
+                                   const Stringprep_table_element * table)
+{
+  ssize_t i;
+
+  /* This is where typical uses of Libidn spends very close to all CPU
+     time and causes most cache misses.  One could easily do a binary
+     search instead.  Before rewriting this, I want hard evidence this
+     slowness is at all relevant in typical applications.  (I don't
+     dispute optimization may improve matters significantly, I'm
+     mostly interested in having someone give real-world benchmark on
+     the impact of libidn.) */
+
+  for (i = 0; table[i].start || table[i].end; i++)
+    if (ucs4 >= table[i].start &&
+       ucs4 <= (table[i].end ? table[i].end : table[i].start))
+      return i;
+
+  return -1;
+}
+
+static ssize_t
+stringprep_find_string_in_table (uint32_t * ucs4,
+                                size_t ucs4len,
+                                size_t * tablepos,
+                                const Stringprep_table_element * table)
+{
+  size_t j;
+  ssize_t pos;
+
+  for (j = 0; j < ucs4len; j++)
+    if ((pos = stringprep_find_character_in_table (ucs4[j], table)) != -1)
+      {
+       if (tablepos)
+         *tablepos = pos;
+       return j;
+      }
+
+  return -1;
+}
+
+static int
+stringprep_apply_table_to_string (uint32_t * ucs4,
+                                 size_t * ucs4len,
+                                 size_t maxucs4len,
+                                 const Stringprep_table_element * table)
+{
+  ssize_t pos;
+  size_t i, maplen;
+
+  while ((pos = stringprep_find_string_in_table (ucs4, *ucs4len,
+                                                &i, table)) != -1)
+    {
+      for (maplen = STRINGPREP_MAX_MAP_CHARS;
+          maplen > 0 && table[i].map[maplen - 1] == 0; maplen--)
+       ;
+
+      if (*ucs4len - 1 + maplen >= maxucs4len)
+       return STRINGPREP_TOO_SMALL_BUFFER;
+
+      memmove (&ucs4[pos + maplen], &ucs4[pos + 1],
+              sizeof (uint32_t) * (*ucs4len - pos - 1));
+      memcpy (&ucs4[pos], table[i].map, sizeof (uint32_t) * maplen);
+      *ucs4len = *ucs4len - 1 + maplen;
+    }
+
+  return STRINGPREP_OK;
+}
+
+#define INVERTED(x) ((x) & ((~0UL) >> 1))
+#define UNAPPLICAPLEFLAGS(flags, profileflags) \
+  ((!INVERTED(profileflags) && !(profileflags & flags) && profileflags) || \
+   ( INVERTED(profileflags) && (profileflags & flags)))
+
+/**
+ * stringprep_4i:
+ * @ucs4: input/output array with string to prepare.
+ * @len: on input, length of input array with Unicode code points,
+ *   on exit, length of output array with Unicode code points.
+ * @maxucs4len: maximum length of input/output array.
+ * @flags: a #Stringprep_profile_flags value, or 0.
+ * @profile: pointer to #Stringprep_profile to use.
+ *
+ * Prepare the input UCS-4 string according to the stringprep profile,
+ * and write back the result to the input string.
+ *
+ * The input is not required to be zero terminated (@ucs4[@len] = 0).
+ * The output will not be zero terminated unless @ucs4[@len] = 0.
+ * Instead, see stringprep_4zi() if your input is zero terminated or
+ * if you want the output to be.
+ *
+ * Since the stringprep operation can expand the string, @maxucs4len
+ * indicate how large the buffer holding the string is.  This function
+ * will not read or write to code points outside that size.
+ *
+ * The @flags are one of #Stringprep_profile_flags values, or 0.
+ *
+ * The @profile contain the #Stringprep_profile instructions to
+ * perform.  Your application can define new profiles, possibly
+ * re-using the generic stringprep tables that always will be part of
+ * the library, or use one of the currently supported profiles.
+ *
+ * Return value: Returns %STRINGPREP_OK iff successful, or an
+ *   #Stringprep_rc error code.
+ **/
+int
+stringprep_4i (uint32_t * ucs4, size_t * len, size_t maxucs4len,
+              Stringprep_profile_flags flags,
+              const Stringprep_profile * profile)
+{
+  size_t i, j;
+  ssize_t k;
+  size_t ucs4len = *len;
+  int rc;
+
+  for (i = 0; profile[i].operation; i++)
+    {
+      switch (profile[i].operation)
+       {
+       case STRINGPREP_NFKC:
+         {
+           uint32_t *q = 0;
+
+           if (UNAPPLICAPLEFLAGS (flags, profile[i].flags))
+             break;
+
+           if (flags & STRINGPREP_NO_NFKC && !profile[i].flags)
+             /* Profile requires NFKC, but callee asked for no NFKC. */
+             return STRINGPREP_FLAG_ERROR;
+
+           q = stringprep_ucs4_nfkc_normalize (ucs4, ucs4len);
+           if (!q)
+             return STRINGPREP_NFKC_FAILED;
+
+           for (ucs4len = 0; q[ucs4len]; ucs4len++)
+             ;
+
+           if (ucs4len >= maxucs4len)
+             {
+               free (q);
+               return STRINGPREP_TOO_SMALL_BUFFER;
+             }
+
+           memcpy (ucs4, q, ucs4len * sizeof (ucs4[0]));
+
+           free (q);
+         }
+         break;
+
+       case STRINGPREP_PROHIBIT_TABLE:
+         k = stringprep_find_string_in_table (ucs4, ucs4len,
+                                              NULL, profile[i].table);
+         if (k != -1)
+           return STRINGPREP_CONTAINS_PROHIBITED;
+         break;
+
+       case STRINGPREP_UNASSIGNED_TABLE:
+         if (UNAPPLICAPLEFLAGS (flags, profile[i].flags))
+           break;
+         if (flags & STRINGPREP_NO_UNASSIGNED)
+           {
+             k = stringprep_find_string_in_table
+               (ucs4, ucs4len, NULL, profile[i].table);
+             if (k != -1)
+               return STRINGPREP_CONTAINS_UNASSIGNED;
+           }
+         break;
+
+       case STRINGPREP_MAP_TABLE:
+         if (UNAPPLICAPLEFLAGS (flags, profile[i].flags))
+           break;
+         rc = stringprep_apply_table_to_string
+           (ucs4, &ucs4len, maxucs4len, profile[i].table);
+         if (rc != STRINGPREP_OK)
+           return rc;
+         break;
+
+       case STRINGPREP_BIDI_PROHIBIT_TABLE:
+       case STRINGPREP_BIDI_RAL_TABLE:
+       case STRINGPREP_BIDI_L_TABLE:
+         break;
+
+       case STRINGPREP_BIDI:
+         {
+           int done_prohibited = 0;
+           int done_ral = 0;
+           int done_l = 0;
+           int contains_ral = -1;
+           int contains_l = -1;
+
+           for (j = 0; profile[j].operation; j++)
+             if (profile[j].operation == STRINGPREP_BIDI_PROHIBIT_TABLE)
+               {
+                 done_prohibited = 1;
+                 k = stringprep_find_string_in_table (ucs4, ucs4len,
+                                                      NULL,
+                                                      profile[j].table);
+                 if (k != -1)
+                   return STRINGPREP_BIDI_CONTAINS_PROHIBITED;
+               }
+             else if (profile[j].operation == STRINGPREP_BIDI_RAL_TABLE)
+               {
+                 done_ral = 1;
+                 if (stringprep_find_string_in_table
+                     (ucs4, ucs4len, NULL, profile[j].table) != -1)
+                   contains_ral = j;
+               }
+             else if (profile[j].operation == STRINGPREP_BIDI_L_TABLE)
+               {
+                 done_l = 1;
+                 if (stringprep_find_string_in_table
+                     (ucs4, ucs4len, NULL, profile[j].table) != -1)
+                   contains_l = j;
+               }
+
+           if (!done_prohibited || !done_ral || !done_l)
+             return STRINGPREP_PROFILE_ERROR;
+
+           if (contains_ral != -1 && contains_l != -1)
+             return STRINGPREP_BIDI_BOTH_L_AND_RAL;
+
+           if (contains_ral != -1)
+             {
+               if (!(stringprep_find_character_in_table
+                     (ucs4[0], profile[contains_ral].table) != -1 &&
+                     stringprep_find_character_in_table
+                     (ucs4[ucs4len - 1], profile[contains_ral].table) != -1))
+                 return STRINGPREP_BIDI_LEADTRAIL_NOT_RAL;
+             }
+         }
+         break;
+
+       default:
+         return STRINGPREP_PROFILE_ERROR;
+         break;
+       }
+    }
+
+  *len = ucs4len;
+
+  return STRINGPREP_OK;
+}
+
+static int
+stringprep_4zi_1 (uint32_t * ucs4, size_t ucs4len, size_t maxucs4len,
+                 Stringprep_profile_flags flags,
+                 const Stringprep_profile * profile)
+{
+  int rc;
+
+  rc = stringprep_4i (ucs4, &ucs4len, maxucs4len, flags, profile);
+  if (rc != STRINGPREP_OK)
+    return rc;
+
+  if (ucs4len >= maxucs4len)
+    return STRINGPREP_TOO_SMALL_BUFFER;
+
+  ucs4[ucs4len] = 0;
+
+  return STRINGPREP_OK;
+}
+
+/**
+ * stringprep_4zi:
+ * @ucs4: input/output array with zero terminated string to prepare.
+ * @maxucs4len: maximum length of input/output array.
+ * @flags: a #Stringprep_profile_flags value, or 0.
+ * @profile: pointer to #Stringprep_profile to use.
+ *
+ * Prepare the input zero terminated UCS-4 string according to the
+ * stringprep profile, and write back the result to the input string.
+ *
+ * Since the stringprep operation can expand the string, @maxucs4len
+ * indicate how large the buffer holding the string is.  This function
+ * will not read or write to code points outside that size.
+ *
+ * The @flags are one of #Stringprep_profile_flags values, or 0.
+ *
+ * The @profile contain the #Stringprep_profile instructions to
+ * perform.  Your application can define new profiles, possibly
+ * re-using the generic stringprep tables that always will be part of
+ * the library, or use one of the currently supported profiles.
+ *
+ * Return value: Returns %STRINGPREP_OK iff successful, or an
+ *   #Stringprep_rc error code.
+ **/
+int
+stringprep_4zi (uint32_t * ucs4, size_t maxucs4len,
+               Stringprep_profile_flags flags,
+               const Stringprep_profile * profile)
+{
+  size_t ucs4len;
+
+  for (ucs4len = 0; ucs4len < maxucs4len && ucs4[ucs4len] != 0; ucs4len++)
+    ;
+
+  return stringprep_4zi_1 (ucs4, ucs4len, maxucs4len, flags, profile);
+}
+
+/**
+ * stringprep:
+ * @in: input/ouput array with string to prepare.
+ * @maxlen: maximum length of input/output array.
+ * @flags: a #Stringprep_profile_flags value, or 0.
+ * @profile: pointer to #Stringprep_profile to use.
+ *
+ * Prepare the input zero terminated UTF-8 string according to the
+ * stringprep profile, and write back the result to the input string.
+ *
+ * Note that you must convert strings entered in the systems locale
+ * into UTF-8 before using this function, see
+ * stringprep_locale_to_utf8().
+ *
+ * Since the stringprep operation can expand the string, @maxlen
+ * indicate how large the buffer holding the string is.  This function
+ * will not read or write to characters outside that size.
+ *
+ * The @flags are one of #Stringprep_profile_flags values, or 0.
+ *
+ * The @profile contain the #Stringprep_profile instructions to
+ * perform.  Your application can define new profiles, possibly
+ * re-using the generic stringprep tables that always will be part of
+ * the library, or use one of the currently supported profiles.
+ *
+ * Return value: Returns %STRINGPREP_OK iff successful, or an error code.
+ **/
+int
+stringprep (char *in,
+           size_t maxlen,
+           Stringprep_profile_flags flags,
+           const Stringprep_profile * profile)
+{
+  int rc;
+  char *utf8 = NULL;
+  uint32_t *ucs4 = NULL;
+  size_t ucs4len, maxucs4len, adducs4len = 50;
+
+  do
+    {
+      uint32_t *newp;
+
+      if (ucs4)
+       free (ucs4);
+      ucs4 = stringprep_utf8_to_ucs4 (in, -1, &ucs4len);
+      maxucs4len = ucs4len + adducs4len;
+      newp = realloc (ucs4, maxucs4len * sizeof (uint32_t));
+      if (!newp)
+       {
+         free (ucs4);
+         return STRINGPREP_MALLOC_ERROR;
+       }
+      ucs4 = newp;
+
+      rc = stringprep_4i (ucs4, &ucs4len, maxucs4len, flags, profile);
+      adducs4len += 50;
+    }
+  while (rc == STRINGPREP_TOO_SMALL_BUFFER);
+  if (rc != STRINGPREP_OK)
+    {
+      free (ucs4);
+      return rc;
+    }
+
+  utf8 = stringprep_ucs4_to_utf8 (ucs4, ucs4len, 0, 0);
+  free (ucs4);
+  if (!utf8)
+    return STRINGPREP_MALLOC_ERROR;
+
+  if (strlen (utf8) >= maxlen)
+    {
+      free (utf8);
+      return STRINGPREP_TOO_SMALL_BUFFER;
+    }
+
+  strcpy (in, utf8);           /* flawfinder: ignore */
+
+  free (utf8);
+
+  return STRINGPREP_OK;
+}
+
+/**
+ * stringprep_profile:
+ * @in: input array with UTF-8 string to prepare.
+ * @out: output variable with pointer to newly allocate string.
+ * @profile: name of stringprep profile to use.
+ * @flags: a #Stringprep_profile_flags value, or 0.
+ *
+ * Prepare the input zero terminated UTF-8 string according to the
+ * stringprep profile, and return the result in a newly allocated
+ * variable.
+ *
+ * Note that you must convert strings entered in the systems locale
+ * into UTF-8 before using this function, see
+ * stringprep_locale_to_utf8().
+ *
+ * The output @out variable must be deallocated by the caller.
+ *
+ * The @flags are one of #Stringprep_profile_flags values, or 0.
+ *
+ * The @profile specifies the name of the stringprep profile to use.
+ * It must be one of the internally supported stringprep profiles.
+ *
+ * Return value: Returns %STRINGPREP_OK iff successful, or an error code.
+ **/
+int
+stringprep_profile (const char *in,
+                   char **out,
+                   const char *profile, Stringprep_profile_flags flags)
+{
+  const Stringprep_profiles *p;
+  char *str = NULL;
+  size_t len = strlen (in) + 1;
+  int rc;
+
+  for (p = &stringprep_profiles[0]; p->name; p++)
+    if (strcmp (p->name, profile) == 0)
+      break;
+
+  if (!p || !p->name || !p->tables)
+    return STRINGPREP_UNKNOWN_PROFILE;
+
+  do
+    {
+      if (str)
+       free (str);
+      str = (char *) malloc (len);
+      if (str == NULL)
+       return STRINGPREP_MALLOC_ERROR;
+
+      strcpy (str, in);
+
+      rc = stringprep (str, len, flags, p->tables);
+      len += 50;
+    }
+  while (rc == STRINGPREP_TOO_SMALL_BUFFER);
+
+  if (rc == STRINGPREP_OK)
+    *out = str;
+  else
+    free (str);
+
+  return rc;
+}
+
+/*! \mainpage GNU Internationalized Domain Name Library
+ *
+ * \section intro Introduction
+ *
+ * GNU Libidn is an implementation of the Stringprep, Punycode and IDNA
+ * specifications defined by the IETF Internationalized Domain Names
+ * (IDN) working group, used for internationalized domain names.  The
+ * package is available under the GNU Lesser General Public License.
+ *
+ * The library contains a generic Stringprep implementation that does
+ * Unicode 3.2 NFKC normalization, mapping and prohibitation of
+ * characters, and bidirectional character handling.  Profiles for
+ * Nameprep, iSCSI, SASL and XMPP are included.  Punycode and ASCII
+ * Compatible Encoding (ACE) via IDNA are supported.  A mechanism to
+ * define Top-Level Domain (TLD) specific validation tables, and to
+ * compare strings against those tables, is included.  Default tables
+ * for some TLDs are also included.
+ *
+ * The Stringprep API consists of two main functions, one for
+ * converting data from the system's native representation into UTF-8,
+ * and one function to perform the Stringprep processing.  Adding a
+ * new Stringprep profile for your application within the API is
+ * straightforward.  The Punycode API consists of one encoding
+ * function and one decoding function.  The IDNA API consists of the
+ * ToASCII and ToUnicode functions, as well as an high-level interface
+ * for converting entire domain names to and from the ACE encoded
+ * form.  The TLD API consists of one set of functions to extract the
+ * TLD name from a domain string, one set of functions to locate the
+ * proper TLD table to use based on the TLD name, and core functions
+ * to validate a string against a TLD table, and some utility wrappers
+ * to perform all the steps in one call.
+ *
+ * The library is used by, e.g., GNU SASL and Shishi to process user
+ * names and passwords.  Libidn can be built into GNU Libc to enable a
+ * new system-wide getaddrinfo() flag for IDN processing.
+ *
+ * Libidn is developed for the GNU/Linux system, but runs on over 20 Unix
+ * platforms (including Solaris, IRIX, AIX, and Tru64) and Windows.
+ * Libidn is written in C and (parts of) the API is accessible from C,
+ * C++, Emacs Lisp, Python and Java.
+ *
+ * The project web page:\n
+ * http://www.gnu.org/software/libidn/
+ *
+ * The software archive:\n
+ * ftp://alpha.gnu.org/pub/gnu/libidn/
+ *
+ * For more information see:\n
+ * http://www.ietf.org/html.charters/idn-charter.html\n
+ * http://www.ietf.org/rfc/rfc3454.txt (stringprep specification)\n
+ * http://www.ietf.org/rfc/rfc3490.txt (idna specification)\n
+ * http://www.ietf.org/rfc/rfc3491.txt (nameprep specification)\n
+ * http://www.ietf.org/rfc/rfc3492.txt (punycode specification)\n
+ * http://www.ietf.org/internet-drafts/draft-ietf-ips-iscsi-string-prep-04.txt\n
+ * http://www.ietf.org/internet-drafts/draft-ietf-krb-wg-utf8-profile-01.txt\n
+ * http://www.ietf.org/internet-drafts/draft-ietf-sasl-anon-00.txt\n
+ * http://www.ietf.org/internet-drafts/draft-ietf-sasl-saslprep-00.txt\n
+ * http://www.ietf.org/internet-drafts/draft-ietf-xmpp-nodeprep-01.txt\n
+ * http://www.ietf.org/internet-drafts/draft-ietf-xmpp-resourceprep-01.txt\n
+ *
+ * Further information and paid contract development:\n
+ * Simon Josefsson <simon@josefsson.org>
+ *
+ * \section examples Examples
+ *
+ * \include example.c
+ * \include example3.c
+ * \include example4.c
+ * \include example5.c
+ */
+
+/**
+ * STRINGPREP_VERSION
+ *
+ * String defined via CPP denoting the header file version number.
+ * Used together with stringprep_check_version() to verify header file
+ * and run-time library consistency.
+ */
+
+/**
+ * STRINGPREP_MAX_MAP_CHARS
+ *
+ * Maximum number of code points that can replace a single code point,
+ * during stringprep mapping.
+ */
+
+/**
+ * Stringprep_rc:
+ * @STRINGPREP_OK: Successful operation.  This value is guaranteed to
+ *   always be zero, the remaining ones are only guaranteed to hold
+ *   non-zero values, for logical comparison purposes.
+ * @STRINGPREP_CONTAINS_UNASSIGNED: String contain unassigned Unicode
+ *   code points, which is forbidden by the profile.
+ * @STRINGPREP_CONTAINS_PROHIBITED: String contain code points
+ *   prohibited by the profile.
+ * @STRINGPREP_BIDI_BOTH_L_AND_RAL: String contain code points with
+ *   conflicting bidirection category.
+ * @STRINGPREP_BIDI_LEADTRAIL_NOT_RAL: Leading and trailing character
+ *   in string not of proper bidirectional category.
+ * @STRINGPREP_BIDI_CONTAINS_PROHIBITED: Contains prohibited code
+ *   points detected by bidirectional code.
+ * @STRINGPREP_TOO_SMALL_BUFFER: Buffer handed to function was too
+ *   small.  This usually indicate a problem in the calling
+ *   application.
+ * @STRINGPREP_PROFILE_ERROR: The stringprep profile was inconsistent.
+ *   This usually indicate an internal error in the library.
+ * @STRINGPREP_FLAG_ERROR: The supplied flag conflicted with profile.
+ *   This usually indicate a problem in the calling application.
+ * @STRINGPREP_UNKNOWN_PROFILE: The supplied profile name was not
+ *   known to the library.
+ * @STRINGPREP_NFKC_FAILED: The Unicode NFKC operation failed.  This
+ *   usually indicate an internal error in the library.
+ * @STRINGPREP_MALLOC_ERROR: The malloc() was out of memory.  This is
+ *   usually a fatal error.
+ *
+ * Enumerated return codes of stringprep(), stringprep_profile()
+ * functions (and macros using those functions).  The value 0 is
+ * guaranteed to always correspond to success.
+ */
+
+/**
+ * Stringprep_profile_flags:
+ * @STRINGPREP_NO_NFKC: Disable the NFKC normalization, as well as
+ *   selecting the non-NFKC case folding tables.  Usually the profile
+ *   specifies BIDI and NFKC settings, and applications should not
+ *   override it unless in special situations.
+ * @STRINGPREP_NO_BIDI: Disable the BIDI step.  Usually the profile
+ *   specifies BIDI and NFKC settings, and applications should not
+ *   override it unless in special situations.
+ * @STRINGPREP_NO_UNASSIGNED: Make the library return with an error if
+ *   string contains unassigned characters according to profile.
+ *
+ * Stringprep profile flags.
+ */
+
+/**
+ * Stringprep_profile_steps:
+ *
+ * Various steps in the stringprep algorithm.  You really want to
+ * study the source code to understand this one.  Only useful if you
+ * want to add another profile.
+ */
+
+/**
+ * stringprep_nameprep:
+ * @in: input/ouput array with string to prepare.
+ * @maxlen: maximum length of input/output array.
+ *
+ * Prepare the input UTF-8 string according to the nameprep profile.
+ * The AllowUnassigned flag is true, use
+ * stringprep_nameprep_no_unassigned() if you want a false
+ * AllowUnassigned.  Returns 0 iff successful, or an error code.
+ **/
+
+/**
+ * stringprep_nameprep_no_unassigned:
+ * @in: input/ouput array with string to prepare.
+ * @maxlen: maximum length of input/output array.
+ *
+ * Prepare the input UTF-8 string according to the nameprep profile.
+ * The AllowUnassigned flag is false, use stringprep_nameprep() for
+ * true AllowUnassigned.  Returns 0 iff successful, or an error code.
+ **/
+
+/**
+ * stringprep_iscsi:
+ * @in: input/ouput array with string to prepare.
+ * @maxlen: maximum length of input/output array.
+ *
+ * Prepare the input UTF-8 string according to the draft iSCSI
+ * stringprep profile.  Returns 0 iff successful, or an error code.
+ **/
+
+/**
+ * stringprep_plain:
+ * @in: input/ouput array with string to prepare.
+ * @maxlen: maximum length of input/output array.
+ *
+ * Prepare the input UTF-8 string according to the draft SASL
+ * ANONYMOUS profile.  Returns 0 iff successful, or an error code.
+ **/
+
+/**
+ * stringprep_xmpp_nodeprep:
+ * @in: input/ouput array with string to prepare.
+ * @maxlen: maximum length of input/output array.
+ *
+ * Prepare the input UTF-8 string according to the draft XMPP node
+ * identifier profile.  Returns 0 iff successful, or an error code.
+ **/
+
+/**
+ * stringprep_xmpp_resourceprep:
+ * @in: input/ouput array with string to prepare.
+ * @maxlen: maximum length of input/output array.
+ *
+ * Prepare the input UTF-8 string according to the draft XMPP resource
+ * identifier profile.  Returns 0 iff successful, or an error code.
+ **/
diff --git a/lib/contrib/stringprep.h b/lib/contrib/stringprep.h
new file mode 100644 (file)
index 0000000..74d3dfb
--- /dev/null
@@ -0,0 +1,176 @@
+/* stringprep.h --- Header file for stringprep functions.             -*- c -*-
+ * Copyright (C) 2002, 2003, 2004, 2005  Simon Josefsson
+ *
+ * This file is part of GNU Libidn.
+ *
+ * GNU Libidn is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * GNU Libidn is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with GNU Libidn; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ */
+
+#ifndef _STRINGPREP_H
+#define _STRINGPREP_H
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#include <stddef.h>            /* size_t */
+#include <stdlib.h>
+#include <idn-int.h>           /* uint32_t */
+
+#include "silcincludes.h"
+
+#ifndef uint32_t
+#define uint32_t SilcUInt32
+#endif
+#ifndef ssize_t
+#define ssize_t int
+#endif
+
+#define STRINGPREP_VERSION "0.5.9"
+
+/* Error codes. */
+  typedef enum
+  {
+    STRINGPREP_OK = 0,
+    /* Stringprep errors. */
+    STRINGPREP_CONTAINS_UNASSIGNED = 1,
+    STRINGPREP_CONTAINS_PROHIBITED = 2,
+    STRINGPREP_BIDI_BOTH_L_AND_RAL = 3,
+    STRINGPREP_BIDI_LEADTRAIL_NOT_RAL = 4,
+    STRINGPREP_BIDI_CONTAINS_PROHIBITED = 5,
+    /* Error in calling application. */
+    STRINGPREP_TOO_SMALL_BUFFER = 100,
+    STRINGPREP_PROFILE_ERROR = 101,
+    STRINGPREP_FLAG_ERROR = 102,
+    STRINGPREP_UNKNOWN_PROFILE = 103,
+    /* Internal errors. */
+    STRINGPREP_NFKC_FAILED = 200,
+    STRINGPREP_MALLOC_ERROR = 201
+  } Stringprep_rc;
+
+/* Flags used when calling stringprep(). */
+  typedef enum
+  {
+    STRINGPREP_NO_NFKC = 1,
+    STRINGPREP_NO_BIDI = 2,
+    STRINGPREP_NO_UNASSIGNED = 4
+  } Stringprep_profile_flags;
+
+/* Steps in a stringprep profile. */
+  typedef enum
+  {
+    STRINGPREP_NFKC = 1,
+    STRINGPREP_BIDI = 2,
+    STRINGPREP_MAP_TABLE = 3,
+    STRINGPREP_UNASSIGNED_TABLE = 4,
+    STRINGPREP_PROHIBIT_TABLE = 5,
+    STRINGPREP_BIDI_PROHIBIT_TABLE = 6,
+    STRINGPREP_BIDI_RAL_TABLE = 7,
+    STRINGPREP_BIDI_L_TABLE = 8
+  } Stringprep_profile_steps;
+
+#define STRINGPREP_MAX_MAP_CHARS 4
+
+  struct Stringprep_table_element
+  {
+    uint32_t start;
+    uint32_t end;              /* 0 if only one character */
+    uint32_t map[STRINGPREP_MAX_MAP_CHARS];    /* NULL if end is not 0 */
+  };
+  typedef struct Stringprep_table_element Stringprep_table_element;
+
+  struct Stringprep_table
+  {
+    Stringprep_profile_steps operation;
+    Stringprep_profile_flags flags;
+    const Stringprep_table_element *table;
+  };
+  typedef struct Stringprep_table Stringprep_profile;
+
+  struct Stringprep_profiles
+  {
+    const char *name;
+    const Stringprep_profile *tables;
+  };
+  typedef struct Stringprep_profiles Stringprep_profiles;
+
+  extern const Stringprep_profiles stringprep_profiles[];
+
+/* Profiles */
+  extern const Stringprep_table_element stringprep_rfc3454_A_1[];
+  extern const Stringprep_table_element stringprep_rfc3454_B_1[];
+  extern const Stringprep_table_element stringprep_rfc3454_B_2[];
+  extern const Stringprep_table_element stringprep_rfc3454_B_3[];
+  extern const Stringprep_table_element stringprep_rfc3454_C_1_1[];
+  extern const Stringprep_table_element stringprep_rfc3454_C_1_2[];
+  extern const Stringprep_table_element stringprep_rfc3454_C_2_1[];
+  extern const Stringprep_table_element stringprep_rfc3454_C_2_2[];
+  extern const Stringprep_table_element stringprep_rfc3454_C_3[];
+  extern const Stringprep_table_element stringprep_rfc3454_C_4[];
+  extern const Stringprep_table_element stringprep_rfc3454_C_5[];
+  extern const Stringprep_table_element stringprep_rfc3454_C_6[];
+  extern const Stringprep_table_element stringprep_rfc3454_C_7[];
+  extern const Stringprep_table_element stringprep_rfc3454_C_8[];
+  extern const Stringprep_table_element stringprep_rfc3454_C_9[];
+  extern const Stringprep_table_element stringprep_rfc3454_D_1[];
+  extern const Stringprep_table_element stringprep_rfc3454_D_2[];
+
+  extern int stringprep_4i (uint32_t * ucs4, size_t * len, size_t maxucs4len,
+                           Stringprep_profile_flags flags,
+                           const Stringprep_profile * profile);
+  extern int stringprep_4zi (uint32_t * ucs4, size_t maxucs4len,
+                            Stringprep_profile_flags flags,
+                            const Stringprep_profile * profile);
+  extern int stringprep (char *in, size_t maxlen,
+                        Stringprep_profile_flags flags,
+                        const Stringprep_profile * profile);
+
+  extern int stringprep_profile (const char *in,
+                                char **out,
+                                const char *profile,
+                                Stringprep_profile_flags flags);
+
+  extern const char *stringprep_strerror (Stringprep_rc rc);
+
+  extern const char *stringprep_check_version (const char *req_version);
+
+/* Utility */
+
+  extern int stringprep_unichar_to_utf8 (uint32_t c, char *outbuf);
+  extern uint32_t stringprep_utf8_to_unichar (const char *p);
+
+  extern uint32_t *stringprep_utf8_to_ucs4 (const char *str, int len,
+                                           size_t * items_written);
+  extern char *stringprep_ucs4_to_utf8 (const uint32_t * str, int len,
+                                       size_t * items_read,
+                                       size_t * items_written);
+
+  extern char *stringprep_utf8_nfkc_normalize (const char *str, int len);
+  extern uint32_t *stringprep_ucs4_nfkc_normalize (uint32_t * str,
+                                                  int len);
+
+  extern const char *stringprep_locale_charset (void);
+  extern char *stringprep_convert (const char *str,
+                                  const char *to_codeset,
+                                  const char *from_codeset);
+  extern char *stringprep_locale_to_utf8 (const char *str);
+  extern char *stringprep_utf8_to_locale (const char *str);
+
+#ifdef __cplusplus
+}
+#endif
+#endif                         /* _STRINGPREP_H */
index 6204f283caccd82def3fd809dbebbb2bc998c0b9..330a1e2b4a4ce0297b71dbca909544aa1b7f8c4b 100644 (file)
@@ -593,3 +593,6 @@ EXPORTS
        silc_hash_babbleprint @ 918 ;
        silc_get_real_name @ 919 ;
        silc_get_username @ 920 ;
+       silc_utf8_strcasecmp @ 921 ;
+       silc_utf8_strncasecmp @ 922 ;
+       silc_stringprep @ 923;