bug-gnulib
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

new modules for grapheme cluster breaking


From: Ben Pfaff
Subject: new modules for grapheme cluster breaking
Date: Sun, 26 Dec 2010 16:43:54 -0800
User-agent: Gnus/5.13 (Gnus v5.13) Emacs/23.2 (gnu/linux)

These new modules implement detection of grapheme cluster
boundaries as specified in Unicode Annex UAX #29 section
"Grapheme Cluster Boundaries".  I followed the precedents set by
the existing libunistring modules to the greatest extent that I
understood them, including integrating with the gen-uni-tables.c
program.

Bruno, comments on this?

Thanks,

Ben.

--8<--------------------------cut here-------------------------->8--

From: Ben Pfaff <address@hidden>
Date: Sun, 26 Dec 2010 16:37:56 -0800
Subject: [PATCH] New modules for grapheme cluster breaking.

New module 'unigbrk/base'.
* modules/unigbrk/base: New file.
* lib/unigbrk.in.h: New file.

New module 'unigbrk/uc-gbrk-prop'.
* lib/gen-uni-tables.c: Generate lib/unigbrk/gbrkprop.h.
* modules/unigbrk/uc-gbrk-prop: New file.
* lib/unigbrk/gbrkprop.h: New file.
* lib/unigbrk/uc-gbrk-prop.c: New file.

New module unigbrk/uc-is-grapheme-break'.
* modules/unigbrk/uc-is-grapheme-break: New file.
* modules/unigbrk/uc-is-grapheme-break-tests: New file.
* lib/unigbrk/uc-is-grapheme-break.c: New file.
* tests/unigbrk/test-uc-is-grapheme-break.c: New file.
* tests/unigbrk/test-uc-is-grapheme-break.sh: New file.
* tests/unigbrk/GraphemeBreakTest.txt: New file.
---
 ChangeLog                                  |   20 +
 lib/gen-uni-tables.c                       |  251 +++++++++-
 lib/unigbrk.in.h                           |   88 ++++
 lib/unigbrk/gbrkprop.h                     |  762 ++++++++++++++++++++++++++++
 lib/unigbrk/uc-gbrk-prop.c                 |   46 ++
 lib/unigbrk/uc-is-grapheme-break.c         |  106 ++++
 modules/unigbrk/base                       |   33 ++
 modules/unigbrk/uc-gbrk-prop               |   27 +
 modules/unigbrk/uc-is-grapheme-break       |   27 +
 modules/unigbrk/uc-is-grapheme-break-tests |   14 +
 tests/unigbrk/GraphemeBreakTest.txt        |  311 +++++++++++
 tests/unigbrk/test-uc-is-grapheme-break.c  |  157 ++++++
 tests/unigbrk/test-uc-is-grapheme-break.sh |    3 +
 13 files changed, 1837 insertions(+), 8 deletions(-)
 create mode 100644 lib/unigbrk.in.h
 create mode 100644 lib/unigbrk/gbrkprop.h
 create mode 100644 lib/unigbrk/uc-gbrk-prop.c
 create mode 100644 lib/unigbrk/uc-is-grapheme-break.c
 create mode 100644 modules/unigbrk/base
 create mode 100644 modules/unigbrk/uc-gbrk-prop
 create mode 100644 modules/unigbrk/uc-is-grapheme-break
 create mode 100644 modules/unigbrk/uc-is-grapheme-break-tests
 create mode 100644 tests/unigbrk/GraphemeBreakTest.txt
 create mode 100644 tests/unigbrk/test-uc-is-grapheme-break.c
 create mode 100755 tests/unigbrk/test-uc-is-grapheme-break.sh

diff --git a/ChangeLog b/ChangeLog
index 3024bec..0379179 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,23 @@
+2010-12-26  Ben Pfaff  <address@hidden>
+
+       New module 'unigbrk/base'.
+       * modules/unigbrk/base: New file.
+       * lib/unigbrk.in.h: New file.
+
+       New module 'unigbrk/uc-gbrk-prop'.
+       * lib/gen-uni-tables.c: Generate lib/unigbrk/gbrkprop.h.
+       * modules/unigbrk/uc-gbrk-prop: New file.
+       * lib/unigbrk/gbrkprop.h: New file.
+       * lib/unigbrk/uc-gbrk-prop.c: New file.
+
+       New module unigbrk/uc-is-grapheme-break'.
+       * modules/unigbrk/uc-is-grapheme-break: New file.
+       * modules/unigbrk/uc-is-grapheme-break-tests: New file.
+       * lib/unigbrk/uc-is-grapheme-break.c: New file.
+       * tests/unigbrk/test-uc-is-grapheme-break.c: New file.
+       * tests/unigbrk/test-uc-is-grapheme-break.sh: New file.
+       * tests/unigbrk/GraphemeBreakTest.txt: New file.
+
 2010-12-19  Bruno Haible  <address@hidden>
 
        ldexpl test: Fix link error on OSF/1 5.1.
diff --git a/lib/gen-uni-tables.c b/lib/gen-uni-tables.c
index 8080b1f..085e2d6 100644
--- a/lib/gen-uni-tables.c
+++ b/lib/gen-uni-tables.c
@@ -25,6 +25,7 @@
                       /usr/local/share/Unidata/Blocks.txt \
                       /usr/local/share/Unidata/PropList-3.0.1.txt \
                       /usr/local/share/Unidata/EastAsianWidth.txt \
+                      /usr/local/share/Unidata/GraphemeBreakProperty.txt \
                       /usr/local/share/Unidata/LineBreak.txt \
                       /usr/local/share/Unidata/WordBreakProperty.txt \
                       /usr/local/share/Unidata/CompositionExclusions.txt \
@@ -5141,6 +5142,234 @@ fill_width (const char *width_filename)
     }
 }
 
+/* ========================================================================= */
+
+/* Grapheme break property.  */
+
+/* Possible values of the Grapheme_Cluster_Break property.  */
+enum
+{
+  GBP_OTHER        = 0,
+  GBP_CR           = 1,
+  GBP_LF           = 2,
+  GBP_CONTROL      = 3,
+  GBP_EXTEND       = 4,
+  GBP_PREPEND      = 5,
+  GBP_SPACINGMARK  = 6,
+  GBP_L            = 7,
+  GBP_V            = 8,
+  GBP_T            = 9,
+  GBP_LV           = 10,
+  GBP_LVT          = 11
+};
+
+/* Construction of sparse 3-level tables.  */
+#define TABLE gbp_table
+#define ELEMENT unsigned char
+#define DEFAULT GBP_OTHER
+#define xmalloc malloc
+#define xrealloc realloc
+#include "3level.h"
+
+/* The grapheme break property from the GraphemeBreakProperty.txt file.  */
+int unicode_org_gbp[0x110000];
+
+/* Output the per-character grapheme break property table.  */
+static void
+output_gbp (const char *filename, const char *version)
+{
+  FILE *stream;
+  unsigned int ch, i;
+  struct gbp_table t;
+  unsigned int level1_offset, level2_offset, level3_offset;
+
+  stream = fopen (filename, "w");
+  if (stream == NULL)
+    {
+      fprintf (stderr, "cannot open '%s' for writing\n", filename);
+      exit (1);
+    }
+
+  fprintf (stream, "/* DO NOT EDIT! GENERATED AUTOMATICALLY! */\n");
+  fprintf (stream, "/* Grapheme break property of Unicode characters.  */\n");
+  fprintf (stream, "/* Generated automatically by gen-uni-tables.c for Unicode 
%s.  */\n",
+           version);
+
+  t.p = 7;
+  t.q = 9;
+  gbp_table_init (&t);
+
+  for (ch = 0; ch < 0x110000; ch++)
+    gbp_table_add (&t, ch, unicode_org_gbp[ch]);
+
+  gbp_table_finalize (&t);
+
+  /* Offsets in t.result, in memory of this process.  */
+  level1_offset =
+    5 * sizeof (uint32_t);
+  level2_offset =
+    5 * sizeof (uint32_t)
+    + t.level1_size * sizeof (uint32_t);
+  level3_offset =
+    5 * sizeof (uint32_t)
+    + t.level1_size * sizeof (uint32_t)
+    + (t.level2_size << t.q) * sizeof (uint32_t);
+
+  for (i = 0; i < 5; i++)
+    fprintf (stream, "#define gbrkprop_header_%d %d\n", i,
+             ((uint32_t *) t.result)[i]);
+  fprintf (stream, "static const\n");
+  fprintf (stream, "struct\n");
+  fprintf (stream, "  {\n");
+  fprintf (stream, "    int level1[%zu];\n", t.level1_size);
+  fprintf (stream, "    short level2[%zu << %d];\n", t.level2_size, t.q);
+  fprintf (stream, "    unsigned char level3[(%zu << %d) / 2];\n",
+           t.level3_size, t.p);
+  fprintf (stream, "  }\n");
+  fprintf (stream, "unigbrkprop =\n");
+  fprintf (stream, "{\n");
+  fprintf (stream, "  {");
+  if (t.level1_size > 8)
+    fprintf (stream, "\n   ");
+  for (i = 0; i < t.level1_size; i++)
+    {
+      uint32_t offset;
+      if (i > 0 && (i % 8) == 0)
+        fprintf (stream, "\n   ");
+      offset = ((uint32_t *) (t.result + level1_offset))[i];
+      if (offset == 0)
+        fprintf (stream, " %5d", -1);
+      else
+        fprintf (stream, " %5zu",
+                 (offset - level2_offset) / sizeof (uint32_t));
+      if (i+1 < t.level1_size)
+        fprintf (stream, ",");
+    }
+  if (t.level1_size > 8)
+    fprintf (stream, "\n ");
+  fprintf (stream, " },\n");
+  fprintf (stream, "  {");
+  if (t.level2_size << t.q > 8)
+    fprintf (stream, "\n   ");
+  for (i = 0; i < t.level2_size << t.q; i++)
+    {
+      uint32_t offset;
+      if (i > 0 && (i % 8) == 0)
+        fprintf (stream, "\n   ");
+      offset = ((uint32_t *) (t.result + level2_offset))[i];
+      if (offset == 0)
+        fprintf (stream, " %5d", -1);
+      else
+        fprintf (stream, " %5zu",
+                 (offset - level3_offset) / sizeof (uint8_t) / 2);
+      if (i+1 < t.level2_size << t.q)
+        fprintf (stream, ",");
+    }
+  if (t.level2_size << t.q > 8)
+    fprintf (stream, "\n ");
+  fprintf (stream, " },\n");
+  fprintf (stream, "  {");
+  if (t.level3_size << t.p > 8)
+    fprintf (stream, "\n   ");
+  for (i = 0; i < (t.level3_size << t.p) / 2; i++)
+    {
+      unsigned char *p = (unsigned char *) (t.result + level3_offset);
+      unsigned char value0 = p[i * 2];
+      unsigned char value1 = p[i * 2 + 1];
+      if (i > 0 && (i % 8) == 0)
+        fprintf (stream, "\n   ");
+      fprintf (stream, " 0x%02x%s", (value1 << 4) + value0,
+               (i+1 < (t.level3_size << t.p) / 2 ? "," : ""));
+    }
+  if (t.level3_size << t.p > 8)
+    fprintf (stream, "\n ");
+  fprintf (stream, " }\n");
+  fprintf (stream, "};\n");
+
+  if (ferror (stream) || fclose (stream))
+    {
+      fprintf (stderr, "error writing to '%s'\n", filename);
+      exit (1);
+    }
+}
+
+/* Stores in unicode_org_gbp[] the grapheme breaking property from the
+   GraphemeBreakProperty.txt file.  */
+static void
+fill_org_gbp (const char *graphemebreakproperty_filename)
+{
+  unsigned int i;
+  FILE *stream;
+  int lineno = 0;
+
+  for (i = 0; i < 0x110000; i++)
+    unicode_org_gbp[i] = GBP_OTHER;
+
+  stream = fopen (graphemebreakproperty_filename, "r");
+  if (stream == NULL)
+    {
+      fprintf (stderr, "error during fopen of '%s'\n",
+               graphemebreakproperty_filename);
+      exit (1);
+    }
+
+  for (;;)
+    {
+      char buf[200+1];
+      unsigned int i1, i2;
+      char padding[200+1];
+      char propname[200+1];
+      int propvalue;
+
+      lineno++;
+      if (fscanf (stream, "%200[^\n]\n", buf) < 1)
+        break;
+
+      if (buf[0] == '\0' || buf[0] == '#')
+        continue;
+
+      if (sscanf (buf, "%X..%X%[ ;]%[^ ]", &i1, &i2, padding, propname) != 4)
+        {
+          if (sscanf (buf, "%X%[ ;]%[^ ]", &i1, padding, propname) != 3)
+            {
+              fprintf (stderr, "parse error in '%s'\n",
+                       graphemebreakproperty_filename);
+              exit (1);
+            }
+          i2 = i1;
+        }
+#define PROP(name,value) \
+      if (strcmp (propname, name) == 0) propvalue = value; else
+      PROP ("CR", GBP_CR)
+      PROP ("LF", GBP_LF)
+      PROP ("Control", GBP_CONTROL)
+      PROP ("Extend", GBP_EXTEND)
+      PROP ("Prepend", GBP_PREPEND)
+      PROP ("SpacingMark", GBP_SPACINGMARK)
+      PROP ("L", GBP_L)
+      PROP ("V", GBP_V)
+      PROP ("T", GBP_T)
+      PROP ("LV", GBP_LV)
+      PROP ("LVT", GBP_LVT)
+#undef PROP
+        {
+          fprintf (stderr, "unknown property value '%s' in %s:%d\n", propname,
+                   graphemebreakproperty_filename, lineno);
+          exit (1);
+        }
+      if (!(i1 <= i2 && i2 < 0x110000))
+        abort ();
+
+      for (i = i1; i <= i2; i++)
+        unicode_org_gbp[i] = propvalue;
+    }
+  if (ferror (stream) || fclose (stream))
+    {
+      fprintf (stderr, "error reading from '%s'\n", 
graphemebreakproperty_filename);
+      exit (1);
+    }
+}
+
 /* Line breaking classification.  */
 
 enum
@@ -8277,6 +8506,7 @@ main (int argc, char * argv[])
   const char *blocks_filename;
   const char *proplist30_filename;
   const char *eastasianwidth_filename;
+  const char *graphemebreakproperty_filename;
   const char *linebreak_filename;
   const char *wordbreakproperty_filename;
   const char *compositionexclusions_filename;
@@ -8284,9 +8514,9 @@ main (int argc, char * argv[])
   const char *casefolding_filename;
   const char *version;
 
-  if (argc != 14)
+  if (argc != 15)
     {
-      fprintf (stderr, "Usage: %s UnicodeData.txt PropList.txt 
DerivedCoreProperties.txt Scripts.txt Blocks.txt PropList-3.0.1.txt 
EastAsianWidth.txt LineBreak.txt WordBreakProperty.txt 
CompositionExclusions.txt SpecialCasing.txt CaseFolding.txt version\n",
+      fprintf (stderr, "Usage: %s UnicodeData.txt PropList.txt 
DerivedCoreProperties.txt Scripts.txt Blocks.txt PropList-3.0.1.txt 
EastAsianWidth.txt GraphemeBreakProperty.txt LineBreak.txt 
WordBreakProperty.txt CompositionExclusions.txt SpecialCasing.txt 
CaseFolding.txt version\n",
                argv[0]);
       exit (1);
     }
@@ -8298,12 +8528,13 @@ main (int argc, char * argv[])
   blocks_filename = argv[5];
   proplist30_filename = argv[6];
   eastasianwidth_filename = argv[7];
-  linebreak_filename = argv[8];
-  wordbreakproperty_filename = argv[9];
-  compositionexclusions_filename = argv[10];
-  specialcasing_filename = argv[11];
-  casefolding_filename = argv[12];
-  version = argv[13];
+  graphemebreakproperty_filename = argv[8];
+  linebreak_filename = argv[9];
+  wordbreakproperty_filename = argv[10];
+  compositionexclusions_filename = argv[11];
+  specialcasing_filename = argv[12];
+  casefolding_filename = argv[13];
+  version = argv[14];
 
   fill_attributes (unicodedata_filename);
   clear_properties ();
@@ -8313,6 +8544,7 @@ main (int argc, char * argv[])
   fill_scripts (scripts_filename);
   fill_blocks (blocks_filename);
   fill_width (eastasianwidth_filename);
+  fill_org_gbp (graphemebreakproperty_filename);
   fill_org_lbp (linebreak_filename);
   fill_org_wbp (wordbreakproperty_filename);
   fill_composition_exclusions (compositionexclusions_filename);
@@ -8339,6 +8571,8 @@ main (int argc, char * argv[])
   output_ident_properties (version);
   output_old_ctype (version);
 
+  output_gbp ("unigbrk/gbrkprop.h", version);
+
   debug_output_lbrk_tables ("unilbrk/lbrkprop.txt");
   debug_output_org_lbrk_tables ("unilbrk/lbrkprop_org.txt");
   output_lbrk_tables ("unilbrk/lbrkprop1.h", "unilbrk/lbrkprop2.h", version);
@@ -8377,6 +8611,7 @@ main (int argc, char * argv[])
         
/gfs/petix/Volumes/ExtData/www-archive/software/i18n/unicode/ftp.unicode.org/ArchiveVersions/5.1.0/ucd/Blocks.txt
 \
         
/gfs/petix/Volumes/ExtData/www-archive/software/i18n/unicode/ftp.unicode.org/ArchiveVersions/3.0.1/PropList-3.0.1.txt
 \
         
/gfs/petix/Volumes/ExtData/www-archive/software/i18n/unicode/ftp.unicode.org/ArchiveVersions/5.1.0/ucd/EastAsianWidth.txt
 \
+        
/gfs/petix/Volumes/ExtData/www-archive/software/i18n/unicode/ftp.unicode.org/ArchiveVersions/5.1.0/ucd/auxiliary/GraphemeBreakProperty.txt
 \
         
/gfs/petix/Volumes/ExtData/www-archive/software/i18n/unicode/ftp.unicode.org/ArchiveVersions/5.1.0/ucd/LineBreak.txt
 \
         
/gfs/petix/Volumes/ExtData/www-archive/software/i18n/unicode/ftp.unicode.org/ArchiveVersions/5.1.0/ucd/auxiliary/WordBreakProperty.txt
 \
         
/gfs/petix/Volumes/ExtData/www-archive/software/i18n/unicode/ftp.unicode.org/ArchiveVersions/5.1.0/ucd/CompositionExclusions.txt
 \
diff --git a/lib/unigbrk.in.h b/lib/unigbrk.in.h
new file mode 100644
index 0000000..525c825
--- /dev/null
+++ b/lib/unigbrk.in.h
@@ -0,0 +1,88 @@
+/* Grapheme cluster breaks in Unicode strings.
+   Copyright (C) 2010 Free Software Foundation, Inc.
+   Written by Ben Pfaff <address@hidden>, 2010.
+
+   This program 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 3 of the License, or
+   (at your option) any later version.
+
+   This program 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 this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+#ifndef _UNIGBRK_H
+#define _UNIGBRK_H
+
+/* Get size_t.  */
+#include <stddef.h>
+
+/* Get bool.  */
+#include <stdbool.h>
+
+#include "unitypes.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* ========================================================================= */
+
+/* Property defined in Unicode Standard Annex #29, section "Grapheme Cluster
+   Boundaries"
+   <http://unicode.org/reports/tr29/#Grapheme_Cluster_Boundaries> */
+
+/* Possible values of the Grapheme_Cluster_Break property.
+   This enumeration may be extended in the future.  */
+enum
+{
+  GBP_OTHER        = 0,
+  GBP_CR           = 1,
+  GBP_LF           = 2,
+  GBP_CONTROL      = 3,
+  GBP_EXTEND       = 4,
+  GBP_PREPEND      = 5,
+  GBP_SPACINGMARK  = 6,
+  GBP_L            = 7,
+  GBP_V            = 8,
+  GBP_T            = 9,
+  GBP_LV           = 10,
+  GBP_LVT          = 11
+};
+
+/* Return the Grapheme_Cluster_Break property of a Unicode character. */
+extern int
+       uc_graphemeclusterbreak_property (ucs4_t uc);
+
+/* ========================================================================= */
+
+/* Grapheme cluster breaks.  */
+
+/* Returns true if there is an grapheme cluster boundary between Unicode code
+   points A and B.  A "grapheme cluster" is an approximation to a
+   user-perceived character, which sometimes corresponds to multiple code
+   points.  For example, an English letter followed by an acute accent can be
+   expressed as two consecutive Unicode code points, but it is perceived by the
+   user as only a single character and therefore constitutes a single grapheme
+   cluster.
+
+   Implements extended (not legacy) grapheme cluster rules, because UAX #29
+   indicates that they are preferred.
+
+   Use A == 0 or B == 0 to indicate start of text or end of text,
+   respectively. */
+extern bool
+       uc_is_grapheme_cluster_break (ucs4_t a, ucs4_t b);
+
+/* ========================================================================= */
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif /* _UNIGBRK_H */
diff --git a/lib/unigbrk/gbrkprop.h b/lib/unigbrk/gbrkprop.h
new file mode 100644
index 0000000..d071a34
--- /dev/null
+++ b/lib/unigbrk/gbrkprop.h
@@ -0,0 +1,762 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Grapheme break property of Unicode characters.  */
+/* Generated automatically by gen-uni-tables.c for Unicode 5.1.0.  */
+#define gbrkprop_header_0 16
+#define gbrkprop_header_1 15
+#define gbrkprop_header_2 7
+#define gbrkprop_header_3 511
+#define gbrkprop_header_4 127
+static const
+struct
+  {
+    int level1[15];
+    short level2[3 << 9];
+    unsigned char level3[(68 << 7) / 2];
+  }
+unigbrkprop =
+{
+  {
+        0,   512,    -1,    -1,    -1,    -1,    -1,    -1,
+       -1,    -1,    -1,    -1,    -1,    -1,  1024
+  },
+  {
+        0,   128,    -1,    -1,    -1,    -1,   256,    -1,
+       -1,   384,    -1,   512,   640,   768,   896,  1024,
+       -1,    -1,  1152,  1280,  1408,  1536,  1664,  1792,
+     1920,  2048,  2176,  2304,  2432,  2560,  2688,  2816,
+     2944,  3072,  3200,  3328,    -1,    -1,  3456,    -1,
+       -1,    -1,    -1,    -1,    -1,    -1,  3584,  3712,
+     3840,  3968,  4096,  4224,  4352,    -1,  4480,  4608,
+     4736,    -1,    -1,  4864,    -1,    -1,    -1,    -1,
+     4992,  5120,    -1,    -1,    -1,    -1,    -1,    -1,
+       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+       -1,    -1,    -1,  5248,    -1,    -1,    -1,    -1,
+     5376,  5504,    -1,    -1,    -1,    -1,    -1,    -1,
+       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+       -1,    -1,    -1,    -1,  5632,    -1,    -1,    -1,
+     5760,  5888,  6016,    -1,  6144,    -1,    -1,    -1,
+     6272,  6400,  6528,  6656,  6784,  6912,  7040,  6272,
+     6400,  6528,  6656,  6784,  6912,  7040,  6272,  6400,
+     6528,  6656,  6784,  6912,  7040,  6272,  6400,  6528,
+     6656,  6784,  6912,  7040,  6272,  6400,  6528,  6656,
+     6784,  6912,  7040,  6272,  6400,  6528,  6656,  6784,
+     6912,  7040,  6272,  6400,  6528,  6656,  6784,  6912,
+     7040,  6272,  6400,  6528,  6656,  6784,  6912,  7040,
+     6272,  6400,  6528,  6656,  6784,  6912,  7040,  6272,
+     6400,  6528,  6656,  6784,  6912,  7040,  6272,  6400,
+     6528,  6656,  6784,  6912,  7040,  6272,  6400,  6528,
+     6656,  6784,  6912,  7040,  6272,  6400,  6528,  7168,
+       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+       -1,    -1,    -1,    -1,    -1,    -1,  7296,    -1,
+       -1,    -1,    -1,    -1,  7424,  7552,    -1,  7680,
+       -1,    -1,    -1,  7808,    -1,    -1,    -1,    -1,
+       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+       -1,    -1,    -1,    -1,  7936,    -1,    -1,    -1,
+       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+       -1,    -1,  8064,  8192,  8320,    -1,    -1,    -1,
+       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+     8448,    -1,  8576,   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,    -1,    -1,    -1,    -1,
+       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1
+  },
+  {
+    0x33, 0x33, 0x33, 0x33, 0x33, 0x32, 0x13, 0x33,
+    0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30,
+    0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33,
+    0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
+    0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
+    0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
+    0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
+    0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
+    0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
+    0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x40, 0x44, 0x44, 0x44, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x40, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
+    0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
+    0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x40,
+    0x40, 0x04, 0x44, 0x40, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x33, 0x33, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x44, 0x44, 0x44, 0x44, 0x44, 0x04, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x44, 0x44,
+    0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x04,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x44, 0x44, 0x44, 0x34, 0x44,
+    0x44, 0x44, 0x04, 0x40, 0x04, 0x44, 0x44, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30,
+    0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
+    0x44, 0x44, 0x44, 0x44, 0x44, 0x04, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x44, 0x44, 0x44, 0x44, 0x44,
+    0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x44, 0x44,
+    0x44, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x40, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x66,
+    0x46, 0x44, 0x44, 0x44, 0x64, 0x66, 0x46, 0x00,
+    0x40, 0x44, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x40, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x64,
+    0x46, 0x44, 0x04, 0x60, 0x06, 0x60, 0x46, 0x00,
+    0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x40, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x66,
+    0x46, 0x04, 0x00, 0x40, 0x04, 0x40, 0x44, 0x00,
+    0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x44, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x40, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x66,
+    0x46, 0x44, 0x44, 0x40, 0x64, 0x60, 0x46, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x40, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44,
+    0x46, 0x44, 0x04, 0x60, 0x06, 0x60, 0x46, 0x00,
+    0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x64,
+    0x64, 0x06, 0x00, 0x66, 0x06, 0x66, 0x46, 0x00,
+    0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x60, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44,
+    0x64, 0x66, 0x06, 0x44, 0x04, 0x44, 0x44, 0x00,
+    0x00, 0x00, 0x40, 0x04, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x46,
+    0x66, 0x64, 0x06, 0x64, 0x06, 0x66, 0x44, 0x00,
+    0x00, 0x00, 0x40, 0x04, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x64,
+    0x46, 0x44, 0x04, 0x66, 0x06, 0x66, 0x46, 0x00,
+    0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x40,
+    0x66, 0x44, 0x04, 0x04, 0x66, 0x66, 0x66, 0x46,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x44, 0x44, 0x44, 0x44, 0x44, 0x04, 0x00, 0x00,
+    0x55, 0x55, 0x45, 0x40, 0x44, 0x44, 0x44, 0x04,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x44, 0x44, 0x44, 0x44, 0x44, 0x40, 0x04, 0x00,
+    0x55, 0x55, 0x05, 0x00, 0x44, 0x44, 0x44, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x40, 0x40, 0x40, 0x00, 0x00, 0x66,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x40, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x64,
+    0x44, 0x44, 0x04, 0x44, 0x00, 0x00, 0x00, 0x00,
+    0x44, 0x44, 0x44, 0x44, 0x40, 0x44, 0x44, 0x44,
+    0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
+    0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x04, 0x00,
+    0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x46, 0x44,
+    0x64, 0x44, 0x44, 0x44, 0x46, 0x64, 0x46, 0x04,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x66, 0x44, 0x00, 0x00, 0x44,
+    0x04, 0x66, 0x06, 0x60, 0x66, 0x66, 0x66, 0x00,
+    0x40, 0x44, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x64, 0x46, 0x64, 0x66, 0x66, 0x46, 0x60,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+    0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+    0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+    0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+    0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+    0x77, 0x77, 0x77, 0x77, 0x77, 0x00, 0x00, 0x70,
+    0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
+    0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
+    0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
+    0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
+    0x88, 0x08, 0x00, 0x00, 0x99, 0x99, 0x99, 0x99,
+    0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99,
+    0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99,
+    0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99,
+    0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99,
+    0x99, 0x99, 0x99, 0x99, 0x99, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x44, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x44, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x33, 0x46, 0x44, 0x44, 0x44, 0x66,
+    0x66, 0x66, 0x66, 0x64, 0x46, 0x44, 0x44, 0x44,
+    0x44, 0x44, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x44, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x44, 0x64, 0x66, 0x46, 0x64, 0x66, 0x00, 0x00,
+    0x66, 0x64, 0x66, 0x66, 0x46, 0x44, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66,
+    0x06, 0x00, 0x00, 0x00, 0x66, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x40, 0x64, 0x66, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x44, 0x44, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x64, 0x44, 0x44, 0x64, 0x64, 0x66,
+    0x66, 0x64, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x44, 0x44,
+    0x44, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x44, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x60, 0x44, 0x44, 0x66, 0x44, 0x06, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x66, 0x66, 0x66, 0x66, 0x44, 0x44,
+    0x44, 0x44, 0x66, 0x44, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
+    0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
+    0x44, 0x44, 0x44, 0x04, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x44, 0x33,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x33, 0x33, 0x33, 0x03,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x33, 0x33, 0x03, 0x00, 0x00, 0x33, 0x33, 0x33,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
+    0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
+    0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
+    0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x44, 0x44,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x40, 0x04, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40,
+    0x44, 0x04, 0x00, 0x00, 0x00, 0x00, 0x44, 0x00,
+    0x00, 0x04, 0x00, 0x04, 0x00, 0x40, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x60, 0x46, 0x64, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66,
+    0x66, 0x66, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x44, 0x44, 0x44, 0x44, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x40, 0x44, 0x44, 0x44, 0x44,
+    0x44, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x40, 0x44, 0x44, 0x64,
+    0x46, 0x64, 0x46, 0x04, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x64, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0xba, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb,
+    0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xba, 0xbb,
+    0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb,
+    0xbb, 0xbb, 0xbb, 0xbb, 0xba, 0xbb, 0xbb, 0xbb,
+    0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb,
+    0xbb, 0xbb, 0xba, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb,
+    0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb,
+    0xba, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb,
+    0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xba, 0xbb,
+    0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb,
+    0xbb, 0xbb, 0xbb, 0xbb, 0xba, 0xbb, 0xbb, 0xbb,
+    0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb,
+    0xbb, 0xbb, 0xba, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb,
+    0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb,
+    0xba, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb,
+    0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xba, 0xbb,
+    0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb,
+    0xbb, 0xbb, 0xbb, 0xbb, 0xba, 0xbb, 0xbb, 0xbb,
+    0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb,
+    0xbb, 0xbb, 0xba, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb,
+    0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb,
+    0xba, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb,
+    0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xba, 0xbb,
+    0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb,
+    0xbb, 0xbb, 0xbb, 0xbb, 0xba, 0xbb, 0xbb, 0xbb,
+    0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb,
+    0xbb, 0xbb, 0xba, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb,
+    0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb,
+    0xba, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb,
+    0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xba, 0xbb,
+    0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb,
+    0xbb, 0xbb, 0xbb, 0xbb, 0xba, 0xbb, 0xbb, 0xbb,
+    0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb,
+    0xbb, 0xbb, 0xba, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb,
+    0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb,
+    0xba, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb,
+    0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xba, 0xbb,
+    0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb,
+    0xbb, 0xbb, 0xbb, 0xbb, 0xba, 0xbb, 0xbb, 0xbb,
+    0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb,
+    0xbb, 0xbb, 0xba, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb,
+    0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb,
+    0xba, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb,
+    0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xba, 0xbb,
+    0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb,
+    0xbb, 0xbb, 0xbb, 0xbb, 0xba, 0xbb, 0xbb, 0xbb,
+    0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb,
+    0xbb, 0xbb, 0xba, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb,
+    0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb,
+    0xba, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb,
+    0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xba, 0xbb,
+    0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb,
+    0xbb, 0xbb, 0xbb, 0xbb, 0xba, 0xbb, 0xbb, 0xbb,
+    0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb,
+    0xbb, 0xbb, 0xba, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb,
+    0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb,
+    0xbb, 0xbb, 0xbb, 0xbb, 0xba, 0xbb, 0xbb, 0xbb,
+    0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb,
+    0xbb, 0xbb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x44, 0x44, 0x44, 0x04, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x30, 0x33, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00,
+    0x40, 0x44, 0x40, 0x04, 0x00, 0x00, 0x44, 0x44,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x44, 0x04, 0x00, 0x40,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x40, 0x46, 0x44, 0x00, 0x60, 0x44,
+    0x44, 0x34, 0x33, 0x33, 0x33, 0x43, 0x44, 0x44,
+    0x44, 0x04, 0x40, 0x44, 0x44, 0x44, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x44, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x44, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33,
+    0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33,
+    0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33,
+    0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33,
+    0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33,
+    0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33,
+    0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
+    0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
+    0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
+    0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
+    0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
+    0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
+    0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
+    0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44
+  }
+};
diff --git a/lib/unigbrk/uc-gbrk-prop.c b/lib/unigbrk/uc-gbrk-prop.c
new file mode 100644
index 0000000..51e5b62
--- /dev/null
+++ b/lib/unigbrk/uc-gbrk-prop.c
@@ -0,0 +1,46 @@
+/* Grapheme cluster break property function.
+   Copyright (C) 2010 Free Software Foundation, Inc.
+   Written by Ben Pfaff <address@hidden>, 2010.
+
+   This program 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 3 of the License, or
+   (at your option) any later version.
+
+   This program 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 this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+#include <config.h>
+
+/* Specification.  */
+#include "unigbrk.h"
+
+#include "gbrkprop.h"
+
+int
+uc_graphemeclusterbreak_property (ucs4_t uc)
+{
+  unsigned int index1 = uc >> gbrkprop_header_0;
+  if (index1 < gbrkprop_header_1)
+    {
+      int lookup1 = unigbrkprop.level1[index1];
+      if (lookup1 >= 0)
+        {
+          unsigned int index2 = (uc >> gbrkprop_header_2) & gbrkprop_header_3;
+          int lookup2 = unigbrkprop.level2[lookup1 + index2] / 2;
+          if (lookup2 >= 0)
+            {
+              unsigned int index3 = uc & gbrkprop_header_4;
+              unsigned char lookup3 = unigbrkprop.level3[lookup2 + index3 / 2];
+              return (lookup3 >> ((uc & 1) << 2)) & 0x0f;
+            }
+        }
+    }
+  return GBP_OTHER;
+}
+
diff --git a/lib/unigbrk/uc-is-grapheme-break.c 
b/lib/unigbrk/uc-is-grapheme-break.c
new file mode 100644
index 0000000..1ce01ab
--- /dev/null
+++ b/lib/unigbrk/uc-is-grapheme-break.c
@@ -0,0 +1,106 @@
+/* Grapheme cluster break function.
+   Copyright (C) 2010 Free Software Foundation, Inc.
+   Written by Ben Pfaff <address@hidden>, 2010.
+
+   This program 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 3 of the License, or
+   (at your option) any later version.
+
+   This program 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 this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+#include <config.h>
+
+/* Specification.  */
+#include "unigbrk.h"
+
+/* Evaluates to true if there is an extended grapheme cluster break between
+   code points with GBP_* values A and B, false if there is not.  The comments
+   are the grapheme cluster boundary rules from in UAX #29. */
+#define UC_IS_GRAPHEME_BREAK(A, B)                                      \
+  (/* GB1 and GB2 are covered--just use a GBP_CONTROL character, such   \
+      as 0, for sot and eot. */                                         \
+                                                                        \
+   /* GB3 */                                                            \
+   (A) == GBP_CR && (B) == GBP_LF ? false :                             \
+                                                                        \
+   /* GB4 */                                                            \
+   (A) == GBP_CONTROL || (A) == GBP_CR || (A) == GBP_LF ? true :        \
+                                                                        \
+   /* GB5 */                                                            \
+   (B) == GBP_CONTROL || (B) == GBP_CR || (B) == GBP_LF ? true :        \
+                                                                        \
+   /* GB6 */                                                            \
+   (A) == GBP_L && ((B) == GBP_L || (B) == GBP_V                        \
+                    || (B) == GBP_LV || (B) == GBP_LVT) ? false :       \
+                                                                        \
+   /* GB7 */                                                            \
+   ((A) == GBP_LV || (A) == GBP_V)                                      \
+   && ((B) == GBP_V || (B) == GBP_T) ? false :                          \
+                                                                        \
+   /* GB8 */                                                            \
+   ((A) == GBP_LVT || (A) == GBP_T) && (B) == GBP_T ? false :           \
+                                                                        \
+   /* GB9 */                                                            \
+   (B) == GBP_EXTEND ? false :                                          \
+                                                                        \
+   /* GB9a */                                                           \
+   (B) == GBP_SPACINGMARK ? false :                                     \
+                                                                        \
+   /* GB9b */                                                           \
+   (A) == GBP_PREPEND ? false                                           \
+                                                                        \
+   /* GB10 */                                                           \
+   : true)
+
+#define UC_GRAPHEME_BREAKS_FOR(A)                                       \
+  (  (UC_IS_GRAPHEME_BREAK(A, GBP_OTHER)       << GBP_OTHER)            \
+   | (UC_IS_GRAPHEME_BREAK(A, GBP_CR)          << GBP_CR)               \
+   | (UC_IS_GRAPHEME_BREAK(A, GBP_LF)          << GBP_LF)               \
+   | (UC_IS_GRAPHEME_BREAK(A, GBP_CONTROL)     << GBP_CONTROL)          \
+   | (UC_IS_GRAPHEME_BREAK(A, GBP_EXTEND)      << GBP_EXTEND)           \
+   | (UC_IS_GRAPHEME_BREAK(A, GBP_PREPEND)     << GBP_PREPEND)          \
+   | (UC_IS_GRAPHEME_BREAK(A, GBP_SPACINGMARK) << GBP_SPACINGMARK)      \
+   | (UC_IS_GRAPHEME_BREAK(A, GBP_L)           << GBP_L)                \
+   | (UC_IS_GRAPHEME_BREAK(A, GBP_V)           << GBP_V)                \
+   | (UC_IS_GRAPHEME_BREAK(A, GBP_T)           << GBP_T)                \
+   | (UC_IS_GRAPHEME_BREAK(A, GBP_LV)          << GBP_LV)               \
+   | (UC_IS_GRAPHEME_BREAK(A, GBP_LVT)         << GBP_LVT))
+
+static const unsigned short int gb_table[12] =
+  {
+    UC_GRAPHEME_BREAKS_FOR(0),  /* GBP_OTHER */
+    UC_GRAPHEME_BREAKS_FOR(1),  /* GBP_CR */
+    UC_GRAPHEME_BREAKS_FOR(2),  /* GBP_LF */
+    UC_GRAPHEME_BREAKS_FOR(3),  /* GBP_CONTROL */
+    UC_GRAPHEME_BREAKS_FOR(4),  /* GBP_EXTEND */
+    UC_GRAPHEME_BREAKS_FOR(5),  /* GBP_PREPEND */
+    UC_GRAPHEME_BREAKS_FOR(6),  /* GBP_SPACINGMARK */
+    UC_GRAPHEME_BREAKS_FOR(7),  /* GBP_L */
+    UC_GRAPHEME_BREAKS_FOR(8),  /* GBP_V */
+    UC_GRAPHEME_BREAKS_FOR(9),  /* GBP_T */
+    UC_GRAPHEME_BREAKS_FOR(10), /* GBP_LV */
+    UC_GRAPHEME_BREAKS_FOR(11), /* GBP_LVT */
+  };
+
+bool
+uc_is_grapheme_cluster_break (ucs4_t a, ucs4_t b)
+{
+  int a_gcp, b_gcp;
+
+  if ((a | b) < 0x300)
+    {
+      /* GB3 is the only relevant rule for this case. */
+      return a != '\r' || b != '\n';
+    }
+
+  a_gcp = uc_graphemeclusterbreak_property (a);
+  b_gcp = uc_graphemeclusterbreak_property (b);
+  return (gb_table[a_gcp] >> b_gcp) & 1;
+}
diff --git a/modules/unigbrk/base b/modules/unigbrk/base
new file mode 100644
index 0000000..dae852b
--- /dev/null
+++ b/modules/unigbrk/base
@@ -0,0 +1,33 @@
+Description:
+Base layer for grapheme cluster breaking.
+
+Files:
+lib/unigbrk.in.h
+m4/libunistring-base.m4
+
+Depends-on:
+unitypes
+stdbool
+
+configure.ac:
+gl_LIBUNISTRING_LIBHEADER([0.9], [unigbrk.h])
+
+Makefile.am:
+BUILT_SOURCES += $(LIBUNISTRING_UNIGBRK_H)
+
+unigbrk.h: unigbrk.in.h
+       $(AM_V_GEN)rm -f address@hidden $@ && \
+       { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
+         cat $(srcdir)/unigbrk.in.h; \
+       } > address@hidden && \
+       mv -f address@hidden $@
+MOSTLYCLEANFILES += unigbrk.h unigbrk.h-t
+
+Include:
+"unigbrk.h"
+
+License:
+LGPL
+
+Maintainer:
+Ben Pfaff, Bruno Haible
diff --git a/modules/unigbrk/uc-gbrk-prop b/modules/unigbrk/uc-gbrk-prop
new file mode 100644
index 0000000..358eef7
--- /dev/null
+++ b/modules/unigbrk/uc-gbrk-prop
@@ -0,0 +1,27 @@
+Description:
+Determine a Unicode character's Grapheme_Cluster_Break property.
+
+Files:
+lib/unigbrk/gbrkprop.h
+lib/unigbrk/uc-gbrk-prop.c
+
+Depends-on:
+unigbrk/base
+
+configure.ac:
+gl_LIBUNISTRING_MODULE([0.9], [unigbrk/uc-gbrk-prop])
+
+Makefile.am:
+if LIBUNISTRING_COMPILE_UNIGBRK_UC_GBRK_PROP
+lib_SOURCES += unigbrk/uc-gbrk-prop.c
+endif
+
+Include:
+"unigbrk.h"
+
+License:
+LGPL
+
+Maintainer:
+Ben Pfaff, Bruno Haible
+
diff --git a/modules/unigbrk/uc-is-grapheme-break 
b/modules/unigbrk/uc-is-grapheme-break
new file mode 100644
index 0000000..51b270f
--- /dev/null
+++ b/modules/unigbrk/uc-is-grapheme-break
@@ -0,0 +1,27 @@
+Description:
+Test for grapheme cluster breakpoints.
+
+Files:
+lib/unigbrk/uc-is-grapheme-break.c
+
+Depends-on:
+unigbrk/base
+unigbrk/uc-gbrk-prop
+
+configure.ac:
+gl_LIBUNISTRING_MODULE([0.9], [unigbrk/uc-is-grapheme-break])
+
+Makefile.am:
+if LIBUNISTRING_COMPILE_UNIGBRK_UC_IS_GRAPHEME_BREAK
+lib_SOURCES += unigbrk/uc-is-grapheme-break.c
+endif
+
+Include:
+"unigbrk.h"
+
+License:
+LGPL
+
+Maintainer:
+Ben Pfaff, Bruno Haible
+
diff --git a/modules/unigbrk/uc-is-grapheme-break-tests 
b/modules/unigbrk/uc-is-grapheme-break-tests
new file mode 100644
index 0000000..b3f8276
--- /dev/null
+++ b/modules/unigbrk/uc-is-grapheme-break-tests
@@ -0,0 +1,14 @@
+Files:
+tests/unigbrk/test-uc-is-grapheme-break.c
+tests/unigbrk/test-uc-is-grapheme-break.sh
+tests/unigbrk/GraphemeBreakTest.txt
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += unigbrk/test-uc-is-grapheme-break.sh
+check_PROGRAMS += test-uc-is-grapheme-break
+test_uc_is_grapheme_break_SOURCES = unigbrk/test-uc-is-grapheme-break.c
+test_uc_is_grapheme_break_LDADD = $(LDADD) $(LIBUNISTRING)
diff --git a/tests/unigbrk/GraphemeBreakTest.txt 
b/tests/unigbrk/GraphemeBreakTest.txt
new file mode 100644
index 0000000..6de8a1a
--- /dev/null
+++ b/tests/unigbrk/GraphemeBreakTest.txt
@@ -0,0 +1,311 @@
+# GraphemeBreakTest-5.1.0.txt
+# Date: 2008-03-11, 02:19:22 GMT [MD]
+#
+# Unicode Character Database
+# Copyright (c) 1991-2008 Unicode, Inc.
+# For terms of use, see http://www.unicode.org/terms_of_use.html
+# For documentation, see UCD.html
+#
+# Default Grapheme Break Test
+#
+# Format:
+# <string> (# <comment>)? 
+#  <string> contains hex Unicode code points, with 
+#      ÷ wherever there is a break opportunity, and 
+#      × wherever there is not.
+#  <comment> the format can change, but currently it shows:
+#      - the sample character name
+#      - (x) the line_break property* for the sample character
+#      - [x] the rule that determines whether there is a break or not
+#
+# These samples may be extended or changed in the future.
+#
+÷ 0020 ÷ 0020 ÷        #  ÷ [0.2] SPACE (Other) ÷ [999.0] SPACE (Other) ÷ [0.3]
+÷ 0020 × 0308 ÷ 0020 ÷ #  ÷ [0.2] SPACE (Other) × [9.0] COMBINING DIAERESIS 
(Extend) ÷ [999.0] SPACE (Other) ÷ [0.3]
+÷ 0020 ÷ 000D ÷        #  ÷ [0.2] SPACE (Other) ÷ [5.0] <CARRIAGE RETURN (CR)> 
(CR) ÷ [0.3]
+÷ 0020 × 0308 ÷ 000D ÷ #  ÷ [0.2] SPACE (Other) × [9.0] COMBINING DIAERESIS 
(Extend) ÷ [5.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
+÷ 0020 ÷ 000A ÷        #  ÷ [0.2] SPACE (Other) ÷ [5.0] <LINE FEED (LF)> (LF) 
÷ [0.3]
+÷ 0020 × 0308 ÷ 000A ÷ #  ÷ [0.2] SPACE (Other) × [9.0] COMBINING DIAERESIS 
(Extend) ÷ [5.0] <LINE FEED (LF)> (LF) ÷ [0.3]
+÷ 0020 ÷ 0001 ÷        #  ÷ [0.2] SPACE (Other) ÷ [5.0] <START OF HEADING> 
(Control) ÷ [0.3]
+÷ 0020 × 0308 ÷ 0001 ÷ #  ÷ [0.2] SPACE (Other) × [9.0] COMBINING DIAERESIS 
(Extend) ÷ [5.0] <START OF HEADING> (Control) ÷ [0.3]
+÷ 0020 × 0300 ÷        #  ÷ [0.2] SPACE (Other) × [9.0] COMBINING GRAVE ACCENT 
(Extend) ÷ [0.3]
+÷ 0020 × 0308 × 0300 ÷ #  ÷ [0.2] SPACE (Other) × [9.0] COMBINING DIAERESIS 
(Extend) × [9.0] COMBINING GRAVE ACCENT (Extend) ÷ [0.3]
+÷ 0020 ÷ 0E40 ÷        #  ÷ [0.2] SPACE (Other) ÷ [999.0] THAI CHARACTER SARA 
E (Prepend) ÷ [0.3]
+÷ 0020 × 0308 ÷ 0E40 ÷ #  ÷ [0.2] SPACE (Other) × [9.0] COMBINING DIAERESIS 
(Extend) ÷ [999.0] THAI CHARACTER SARA E (Prepend) ÷ [0.3]
+÷ 0020 × 0903 ÷        #  ÷ [0.2] SPACE (Other) × [9.1] DEVANAGARI SIGN 
VISARGA (SpacingMark) ÷ [0.3]
+÷ 0020 × 0308 × 0903 ÷ #  ÷ [0.2] SPACE (Other) × [9.0] COMBINING DIAERESIS 
(Extend) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [0.3]
+÷ 0020 ÷ 1100 ÷        #  ÷ [0.2] SPACE (Other) ÷ [999.0] HANGUL CHOSEONG 
KIYEOK (L) ÷ [0.3]
+÷ 0020 × 0308 ÷ 1100 ÷ #  ÷ [0.2] SPACE (Other) × [9.0] COMBINING DIAERESIS 
(Extend) ÷ [999.0] HANGUL CHOSEONG KIYEOK (L) ÷ [0.3]
+÷ 0020 ÷ 1160 ÷        #  ÷ [0.2] SPACE (Other) ÷ [999.0] HANGUL JUNGSEONG 
FILLER (V) ÷ [0.3]
+÷ 0020 × 0308 ÷ 1160 ÷ #  ÷ [0.2] SPACE (Other) × [9.0] COMBINING DIAERESIS 
(Extend) ÷ [999.0] HANGUL JUNGSEONG FILLER (V) ÷ [0.3]
+÷ 0020 ÷ 11A8 ÷        #  ÷ [0.2] SPACE (Other) ÷ [999.0] HANGUL JONGSEONG 
KIYEOK (T) ÷ [0.3]
+÷ 0020 × 0308 ÷ 11A8 ÷ #  ÷ [0.2] SPACE (Other) × [9.0] COMBINING DIAERESIS 
(Extend) ÷ [999.0] HANGUL JONGSEONG KIYEOK (T) ÷ [0.3]
+÷ 0020 ÷ AC00 ÷        #  ÷ [0.2] SPACE (Other) ÷ [999.0] HANGUL SYLLABLE GA 
(LV) ÷ [0.3]
+÷ 0020 × 0308 ÷ AC00 ÷ #  ÷ [0.2] SPACE (Other) × [9.0] COMBINING DIAERESIS 
(Extend) ÷ [999.0] HANGUL SYLLABLE GA (LV) ÷ [0.3]
+÷ 0020 ÷ AC01 ÷        #  ÷ [0.2] SPACE (Other) ÷ [999.0] HANGUL SYLLABLE GAG 
(LVT) ÷ [0.3]
+÷ 0020 × 0308 ÷ AC01 ÷ #  ÷ [0.2] SPACE (Other) × [9.0] COMBINING DIAERESIS 
(Extend) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3]
+÷ 000D ÷ 0020 ÷        #  ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [4.0] SPACE 
(Other) ÷ [0.3]
+÷ 000D ÷ 0308 ÷ 0020 ÷ #  ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [4.0] 
COMBINING DIAERESIS (Extend) ÷ [999.0] SPACE (Other) ÷ [0.3]
+÷ 000D ÷ 000D ÷        #  ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [4.0] 
<CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
+÷ 000D ÷ 0308 ÷ 000D ÷ #  ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [4.0] 
COMBINING DIAERESIS (Extend) ÷ [5.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
+÷ 000D × 000A ÷        #  ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) × [3.0] <LINE 
FEED (LF)> (LF) ÷ [0.3]
+÷ 000D ÷ 0308 ÷ 000A ÷ #  ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [4.0] 
COMBINING DIAERESIS (Extend) ÷ [5.0] <LINE FEED (LF)> (LF) ÷ [0.3]
+÷ 000D ÷ 0001 ÷        #  ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [4.0] <START 
OF HEADING> (Control) ÷ [0.3]
+÷ 000D ÷ 0308 ÷ 0001 ÷ #  ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [4.0] 
COMBINING DIAERESIS (Extend) ÷ [5.0] <START OF HEADING> (Control) ÷ [0.3]
+÷ 000D ÷ 0300 ÷        #  ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [4.0] 
COMBINING GRAVE ACCENT (Extend) ÷ [0.3]
+÷ 000D ÷ 0308 × 0300 ÷ #  ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [4.0] 
COMBINING DIAERESIS (Extend) × [9.0] COMBINING GRAVE ACCENT (Extend) ÷ [0.3]
+÷ 000D ÷ 0E40 ÷        #  ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [4.0] THAI 
CHARACTER SARA E (Prepend) ÷ [0.3]
+÷ 000D ÷ 0308 ÷ 0E40 ÷ #  ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [4.0] 
COMBINING DIAERESIS (Extend) ÷ [999.0] THAI CHARACTER SARA E (Prepend) ÷ [0.3]
+÷ 000D ÷ 0903 ÷        #  ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [4.0] 
DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [0.3]
+÷ 000D ÷ 0308 × 0903 ÷ #  ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [4.0] 
COMBINING DIAERESIS (Extend) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ 
[0.3]
+÷ 000D ÷ 1100 ÷        #  ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [4.0] HANGUL 
CHOSEONG KIYEOK (L) ÷ [0.3]
+÷ 000D ÷ 0308 ÷ 1100 ÷ #  ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [4.0] 
COMBINING DIAERESIS (Extend) ÷ [999.0] HANGUL CHOSEONG KIYEOK (L) ÷ [0.3]
+÷ 000D ÷ 1160 ÷        #  ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [4.0] HANGUL 
JUNGSEONG FILLER (V) ÷ [0.3]
+÷ 000D ÷ 0308 ÷ 1160 ÷ #  ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [4.0] 
COMBINING DIAERESIS (Extend) ÷ [999.0] HANGUL JUNGSEONG FILLER (V) ÷ [0.3]
+÷ 000D ÷ 11A8 ÷        #  ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [4.0] HANGUL 
JONGSEONG KIYEOK (T) ÷ [0.3]
+÷ 000D ÷ 0308 ÷ 11A8 ÷ #  ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [4.0] 
COMBINING DIAERESIS (Extend) ÷ [999.0] HANGUL JONGSEONG KIYEOK (T) ÷ [0.3]
+÷ 000D ÷ AC00 ÷        #  ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [4.0] HANGUL 
SYLLABLE GA (LV) ÷ [0.3]
+÷ 000D ÷ 0308 ÷ AC00 ÷ #  ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [4.0] 
COMBINING DIAERESIS (Extend) ÷ [999.0] HANGUL SYLLABLE GA (LV) ÷ [0.3]
+÷ 000D ÷ AC01 ÷        #  ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [4.0] HANGUL 
SYLLABLE GAG (LVT) ÷ [0.3]
+÷ 000D ÷ 0308 ÷ AC01 ÷ #  ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [4.0] 
COMBINING DIAERESIS (Extend) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3]
+÷ 000A ÷ 0020 ÷        #  ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [4.0] SPACE (Other) 
÷ [0.3]
+÷ 000A ÷ 0308 ÷ 0020 ÷ #  ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [4.0] COMBINING 
DIAERESIS (Extend) ÷ [999.0] SPACE (Other) ÷ [0.3]
+÷ 000A ÷ 000D ÷        #  ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [4.0] <CARRIAGE 
RETURN (CR)> (CR) ÷ [0.3]
+÷ 000A ÷ 0308 ÷ 000D ÷ #  ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [4.0] COMBINING 
DIAERESIS (Extend) ÷ [5.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
+÷ 000A ÷ 000A ÷        #  ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [4.0] <LINE FEED 
(LF)> (LF) ÷ [0.3]
+÷ 000A ÷ 0308 ÷ 000A ÷ #  ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [4.0] COMBINING 
DIAERESIS (Extend) ÷ [5.0] <LINE FEED (LF)> (LF) ÷ [0.3]
+÷ 000A ÷ 0001 ÷        #  ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [4.0] <START OF 
HEADING> (Control) ÷ [0.3]
+÷ 000A ÷ 0308 ÷ 0001 ÷ #  ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [4.0] COMBINING 
DIAERESIS (Extend) ÷ [5.0] <START OF HEADING> (Control) ÷ [0.3]
+÷ 000A ÷ 0300 ÷        #  ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [4.0] COMBINING 
GRAVE ACCENT (Extend) ÷ [0.3]
+÷ 000A ÷ 0308 × 0300 ÷ #  ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [4.0] COMBINING 
DIAERESIS (Extend) × [9.0] COMBINING GRAVE ACCENT (Extend) ÷ [0.3]
+÷ 000A ÷ 0E40 ÷        #  ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [4.0] THAI CHARACTER 
SARA E (Prepend) ÷ [0.3]
+÷ 000A ÷ 0308 ÷ 0E40 ÷ #  ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [4.0] COMBINING 
DIAERESIS (Extend) ÷ [999.0] THAI CHARACTER SARA E (Prepend) ÷ [0.3]
+÷ 000A ÷ 0903 ÷        #  ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [4.0] DEVANAGARI 
SIGN VISARGA (SpacingMark) ÷ [0.3]
+÷ 000A ÷ 0308 × 0903 ÷ #  ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [4.0] COMBINING 
DIAERESIS (Extend) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [0.3]
+÷ 000A ÷ 1100 ÷        #  ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [4.0] HANGUL 
CHOSEONG KIYEOK (L) ÷ [0.3]
+÷ 000A ÷ 0308 ÷ 1100 ÷ #  ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [4.0] COMBINING 
DIAERESIS (Extend) ÷ [999.0] HANGUL CHOSEONG KIYEOK (L) ÷ [0.3]
+÷ 000A ÷ 1160 ÷        #  ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [4.0] HANGUL 
JUNGSEONG FILLER (V) ÷ [0.3]
+÷ 000A ÷ 0308 ÷ 1160 ÷ #  ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [4.0] COMBINING 
DIAERESIS (Extend) ÷ [999.0] HANGUL JUNGSEONG FILLER (V) ÷ [0.3]
+÷ 000A ÷ 11A8 ÷        #  ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [4.0] HANGUL 
JONGSEONG KIYEOK (T) ÷ [0.3]
+÷ 000A ÷ 0308 ÷ 11A8 ÷ #  ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [4.0] COMBINING 
DIAERESIS (Extend) ÷ [999.0] HANGUL JONGSEONG KIYEOK (T) ÷ [0.3]
+÷ 000A ÷ AC00 ÷        #  ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [4.0] HANGUL 
SYLLABLE GA (LV) ÷ [0.3]
+÷ 000A ÷ 0308 ÷ AC00 ÷ #  ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [4.0] COMBINING 
DIAERESIS (Extend) ÷ [999.0] HANGUL SYLLABLE GA (LV) ÷ [0.3]
+÷ 000A ÷ AC01 ÷        #  ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [4.0] HANGUL 
SYLLABLE GAG (LVT) ÷ [0.3]
+÷ 000A ÷ 0308 ÷ AC01 ÷ #  ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [4.0] COMBINING 
DIAERESIS (Extend) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3]
+÷ 0001 ÷ 0020 ÷        #  ÷ [0.2] <START OF HEADING> (Control) ÷ [4.0] SPACE 
(Other) ÷ [0.3]
+÷ 0001 ÷ 0308 ÷ 0020 ÷ #  ÷ [0.2] <START OF HEADING> (Control) ÷ [4.0] 
COMBINING DIAERESIS (Extend) ÷ [999.0] SPACE (Other) ÷ [0.3]
+÷ 0001 ÷ 000D ÷        #  ÷ [0.2] <START OF HEADING> (Control) ÷ [4.0] 
<CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
+÷ 0001 ÷ 0308 ÷ 000D ÷ #  ÷ [0.2] <START OF HEADING> (Control) ÷ [4.0] 
COMBINING DIAERESIS (Extend) ÷ [5.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
+÷ 0001 ÷ 000A ÷        #  ÷ [0.2] <START OF HEADING> (Control) ÷ [4.0] <LINE 
FEED (LF)> (LF) ÷ [0.3]
+÷ 0001 ÷ 0308 ÷ 000A ÷ #  ÷ [0.2] <START OF HEADING> (Control) ÷ [4.0] 
COMBINING DIAERESIS (Extend) ÷ [5.0] <LINE FEED (LF)> (LF) ÷ [0.3]
+÷ 0001 ÷ 0001 ÷        #  ÷ [0.2] <START OF HEADING> (Control) ÷ [4.0] <START 
OF HEADING> (Control) ÷ [0.3]
+÷ 0001 ÷ 0308 ÷ 0001 ÷ #  ÷ [0.2] <START OF HEADING> (Control) ÷ [4.0] 
COMBINING DIAERESIS (Extend) ÷ [5.0] <START OF HEADING> (Control) ÷ [0.3]
+÷ 0001 ÷ 0300 ÷        #  ÷ [0.2] <START OF HEADING> (Control) ÷ [4.0] 
COMBINING GRAVE ACCENT (Extend) ÷ [0.3]
+÷ 0001 ÷ 0308 × 0300 ÷ #  ÷ [0.2] <START OF HEADING> (Control) ÷ [4.0] 
COMBINING DIAERESIS (Extend) × [9.0] COMBINING GRAVE ACCENT (Extend) ÷ [0.3]
+÷ 0001 ÷ 0E40 ÷        #  ÷ [0.2] <START OF HEADING> (Control) ÷ [4.0] THAI 
CHARACTER SARA E (Prepend) ÷ [0.3]
+÷ 0001 ÷ 0308 ÷ 0E40 ÷ #  ÷ [0.2] <START OF HEADING> (Control) ÷ [4.0] 
COMBINING DIAERESIS (Extend) ÷ [999.0] THAI CHARACTER SARA E (Prepend) ÷ [0.3]
+÷ 0001 ÷ 0903 ÷        #  ÷ [0.2] <START OF HEADING> (Control) ÷ [4.0] 
DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [0.3]
+÷ 0001 ÷ 0308 × 0903 ÷ #  ÷ [0.2] <START OF HEADING> (Control) ÷ [4.0] 
COMBINING DIAERESIS (Extend) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ 
[0.3]
+÷ 0001 ÷ 1100 ÷        #  ÷ [0.2] <START OF HEADING> (Control) ÷ [4.0] HANGUL 
CHOSEONG KIYEOK (L) ÷ [0.3]
+÷ 0001 ÷ 0308 ÷ 1100 ÷ #  ÷ [0.2] <START OF HEADING> (Control) ÷ [4.0] 
COMBINING DIAERESIS (Extend) ÷ [999.0] HANGUL CHOSEONG KIYEOK (L) ÷ [0.3]
+÷ 0001 ÷ 1160 ÷        #  ÷ [0.2] <START OF HEADING> (Control) ÷ [4.0] HANGUL 
JUNGSEONG FILLER (V) ÷ [0.3]
+÷ 0001 ÷ 0308 ÷ 1160 ÷ #  ÷ [0.2] <START OF HEADING> (Control) ÷ [4.0] 
COMBINING DIAERESIS (Extend) ÷ [999.0] HANGUL JUNGSEONG FILLER (V) ÷ [0.3]
+÷ 0001 ÷ 11A8 ÷        #  ÷ [0.2] <START OF HEADING> (Control) ÷ [4.0] HANGUL 
JONGSEONG KIYEOK (T) ÷ [0.3]
+÷ 0001 ÷ 0308 ÷ 11A8 ÷ #  ÷ [0.2] <START OF HEADING> (Control) ÷ [4.0] 
COMBINING DIAERESIS (Extend) ÷ [999.0] HANGUL JONGSEONG KIYEOK (T) ÷ [0.3]
+÷ 0001 ÷ AC00 ÷        #  ÷ [0.2] <START OF HEADING> (Control) ÷ [4.0] HANGUL 
SYLLABLE GA (LV) ÷ [0.3]
+÷ 0001 ÷ 0308 ÷ AC00 ÷ #  ÷ [0.2] <START OF HEADING> (Control) ÷ [4.0] 
COMBINING DIAERESIS (Extend) ÷ [999.0] HANGUL SYLLABLE GA (LV) ÷ [0.3]
+÷ 0001 ÷ AC01 ÷        #  ÷ [0.2] <START OF HEADING> (Control) ÷ [4.0] HANGUL 
SYLLABLE GAG (LVT) ÷ [0.3]
+÷ 0001 ÷ 0308 ÷ AC01 ÷ #  ÷ [0.2] <START OF HEADING> (Control) ÷ [4.0] 
COMBINING DIAERESIS (Extend) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3]
+÷ 0300 ÷ 0020 ÷        #  ÷ [0.2] COMBINING GRAVE ACCENT (Extend) ÷ [999.0] 
SPACE (Other) ÷ [0.3]
+÷ 0300 × 0308 ÷ 0020 ÷ #  ÷ [0.2] COMBINING GRAVE ACCENT (Extend) × [9.0] 
COMBINING DIAERESIS (Extend) ÷ [999.0] SPACE (Other) ÷ [0.3]
+÷ 0300 ÷ 000D ÷        #  ÷ [0.2] COMBINING GRAVE ACCENT (Extend) ÷ [5.0] 
<CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
+÷ 0300 × 0308 ÷ 000D ÷ #  ÷ [0.2] COMBINING GRAVE ACCENT (Extend) × [9.0] 
COMBINING DIAERESIS (Extend) ÷ [5.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
+÷ 0300 ÷ 000A ÷        #  ÷ [0.2] COMBINING GRAVE ACCENT (Extend) ÷ [5.0] 
<LINE FEED (LF)> (LF) ÷ [0.3]
+÷ 0300 × 0308 ÷ 000A ÷ #  ÷ [0.2] COMBINING GRAVE ACCENT (Extend) × [9.0] 
COMBINING DIAERESIS (Extend) ÷ [5.0] <LINE FEED (LF)> (LF) ÷ [0.3]
+÷ 0300 ÷ 0001 ÷        #  ÷ [0.2] COMBINING GRAVE ACCENT (Extend) ÷ [5.0] 
<START OF HEADING> (Control) ÷ [0.3]
+÷ 0300 × 0308 ÷ 0001 ÷ #  ÷ [0.2] COMBINING GRAVE ACCENT (Extend) × [9.0] 
COMBINING DIAERESIS (Extend) ÷ [5.0] <START OF HEADING> (Control) ÷ [0.3]
+÷ 0300 × 0300 ÷        #  ÷ [0.2] COMBINING GRAVE ACCENT (Extend) × [9.0] 
COMBINING GRAVE ACCENT (Extend) ÷ [0.3]
+÷ 0300 × 0308 × 0300 ÷ #  ÷ [0.2] COMBINING GRAVE ACCENT (Extend) × [9.0] 
COMBINING DIAERESIS (Extend) × [9.0] COMBINING GRAVE ACCENT (Extend) ÷ [0.3]
+÷ 0300 ÷ 0E40 ÷        #  ÷ [0.2] COMBINING GRAVE ACCENT (Extend) ÷ [999.0] 
THAI CHARACTER SARA E (Prepend) ÷ [0.3]
+÷ 0300 × 0308 ÷ 0E40 ÷ #  ÷ [0.2] COMBINING GRAVE ACCENT (Extend) × [9.0] 
COMBINING DIAERESIS (Extend) ÷ [999.0] THAI CHARACTER SARA E (Prepend) ÷ [0.3]
+÷ 0300 × 0903 ÷        #  ÷ [0.2] COMBINING GRAVE ACCENT (Extend) × [9.1] 
DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [0.3]
+÷ 0300 × 0308 × 0903 ÷ #  ÷ [0.2] COMBINING GRAVE ACCENT (Extend) × [9.0] 
COMBINING DIAERESIS (Extend) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ 
[0.3]
+÷ 0300 ÷ 1100 ÷        #  ÷ [0.2] COMBINING GRAVE ACCENT (Extend) ÷ [999.0] 
HANGUL CHOSEONG KIYEOK (L) ÷ [0.3]
+÷ 0300 × 0308 ÷ 1100 ÷ #  ÷ [0.2] COMBINING GRAVE ACCENT (Extend) × [9.0] 
COMBINING DIAERESIS (Extend) ÷ [999.0] HANGUL CHOSEONG KIYEOK (L) ÷ [0.3]
+÷ 0300 ÷ 1160 ÷        #  ÷ [0.2] COMBINING GRAVE ACCENT (Extend) ÷ [999.0] 
HANGUL JUNGSEONG FILLER (V) ÷ [0.3]
+÷ 0300 × 0308 ÷ 1160 ÷ #  ÷ [0.2] COMBINING GRAVE ACCENT (Extend) × [9.0] 
COMBINING DIAERESIS (Extend) ÷ [999.0] HANGUL JUNGSEONG FILLER (V) ÷ [0.3]
+÷ 0300 ÷ 11A8 ÷        #  ÷ [0.2] COMBINING GRAVE ACCENT (Extend) ÷ [999.0] 
HANGUL JONGSEONG KIYEOK (T) ÷ [0.3]
+÷ 0300 × 0308 ÷ 11A8 ÷ #  ÷ [0.2] COMBINING GRAVE ACCENT (Extend) × [9.0] 
COMBINING DIAERESIS (Extend) ÷ [999.0] HANGUL JONGSEONG KIYEOK (T) ÷ [0.3]
+÷ 0300 ÷ AC00 ÷        #  ÷ [0.2] COMBINING GRAVE ACCENT (Extend) ÷ [999.0] 
HANGUL SYLLABLE GA (LV) ÷ [0.3]
+÷ 0300 × 0308 ÷ AC00 ÷ #  ÷ [0.2] COMBINING GRAVE ACCENT (Extend) × [9.0] 
COMBINING DIAERESIS (Extend) ÷ [999.0] HANGUL SYLLABLE GA (LV) ÷ [0.3]
+÷ 0300 ÷ AC01 ÷        #  ÷ [0.2] COMBINING GRAVE ACCENT (Extend) ÷ [999.0] 
HANGUL SYLLABLE GAG (LVT) ÷ [0.3]
+÷ 0300 × 0308 ÷ AC01 ÷ #  ÷ [0.2] COMBINING GRAVE ACCENT (Extend) × [9.0] 
COMBINING DIAERESIS (Extend) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3]
+÷ 0E40 × 0020 ÷        #  ÷ [0.2] THAI CHARACTER SARA E (Prepend) × [9.2] 
SPACE (Other) ÷ [0.3]
+÷ 0E40 × 0308 ÷ 0020 ÷ #  ÷ [0.2] THAI CHARACTER SARA E (Prepend) × [9.0] 
COMBINING DIAERESIS (Extend) ÷ [999.0] SPACE (Other) ÷ [0.3]
+÷ 0E40 ÷ 000D ÷        #  ÷ [0.2] THAI CHARACTER SARA E (Prepend) ÷ [5.0] 
<CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
+÷ 0E40 × 0308 ÷ 000D ÷ #  ÷ [0.2] THAI CHARACTER SARA E (Prepend) × [9.0] 
COMBINING DIAERESIS (Extend) ÷ [5.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
+÷ 0E40 ÷ 000A ÷        #  ÷ [0.2] THAI CHARACTER SARA E (Prepend) ÷ [5.0] 
<LINE FEED (LF)> (LF) ÷ [0.3]
+÷ 0E40 × 0308 ÷ 000A ÷ #  ÷ [0.2] THAI CHARACTER SARA E (Prepend) × [9.0] 
COMBINING DIAERESIS (Extend) ÷ [5.0] <LINE FEED (LF)> (LF) ÷ [0.3]
+÷ 0E40 ÷ 0001 ÷        #  ÷ [0.2] THAI CHARACTER SARA E (Prepend) ÷ [5.0] 
<START OF HEADING> (Control) ÷ [0.3]
+÷ 0E40 × 0308 ÷ 0001 ÷ #  ÷ [0.2] THAI CHARACTER SARA E (Prepend) × [9.0] 
COMBINING DIAERESIS (Extend) ÷ [5.0] <START OF HEADING> (Control) ÷ [0.3]
+÷ 0E40 × 0300 ÷        #  ÷ [0.2] THAI CHARACTER SARA E (Prepend) × [9.0] 
COMBINING GRAVE ACCENT (Extend) ÷ [0.3]
+÷ 0E40 × 0308 × 0300 ÷ #  ÷ [0.2] THAI CHARACTER SARA E (Prepend) × [9.0] 
COMBINING DIAERESIS (Extend) × [9.0] COMBINING GRAVE ACCENT (Extend) ÷ [0.3]
+÷ 0E40 × 0E40 ÷        #  ÷ [0.2] THAI CHARACTER SARA E (Prepend) × [9.2] THAI 
CHARACTER SARA E (Prepend) ÷ [0.3]
+÷ 0E40 × 0308 ÷ 0E40 ÷ #  ÷ [0.2] THAI CHARACTER SARA E (Prepend) × [9.0] 
COMBINING DIAERESIS (Extend) ÷ [999.0] THAI CHARACTER SARA E (Prepend) ÷ [0.3]
+÷ 0E40 × 0903 ÷        #  ÷ [0.2] THAI CHARACTER SARA E (Prepend) × [9.1] 
DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [0.3]
+÷ 0E40 × 0308 × 0903 ÷ #  ÷ [0.2] THAI CHARACTER SARA E (Prepend) × [9.0] 
COMBINING DIAERESIS (Extend) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ 
[0.3]
+÷ 0E40 × 1100 ÷        #  ÷ [0.2] THAI CHARACTER SARA E (Prepend) × [9.2] 
HANGUL CHOSEONG KIYEOK (L) ÷ [0.3]
+÷ 0E40 × 0308 ÷ 1100 ÷ #  ÷ [0.2] THAI CHARACTER SARA E (Prepend) × [9.0] 
COMBINING DIAERESIS (Extend) ÷ [999.0] HANGUL CHOSEONG KIYEOK (L) ÷ [0.3]
+÷ 0E40 × 1160 ÷        #  ÷ [0.2] THAI CHARACTER SARA E (Prepend) × [9.2] 
HANGUL JUNGSEONG FILLER (V) ÷ [0.3]
+÷ 0E40 × 0308 ÷ 1160 ÷ #  ÷ [0.2] THAI CHARACTER SARA E (Prepend) × [9.0] 
COMBINING DIAERESIS (Extend) ÷ [999.0] HANGUL JUNGSEONG FILLER (V) ÷ [0.3]
+÷ 0E40 × 11A8 ÷        #  ÷ [0.2] THAI CHARACTER SARA E (Prepend) × [9.2] 
HANGUL JONGSEONG KIYEOK (T) ÷ [0.3]
+÷ 0E40 × 0308 ÷ 11A8 ÷ #  ÷ [0.2] THAI CHARACTER SARA E (Prepend) × [9.0] 
COMBINING DIAERESIS (Extend) ÷ [999.0] HANGUL JONGSEONG KIYEOK (T) ÷ [0.3]
+÷ 0E40 × AC00 ÷        #  ÷ [0.2] THAI CHARACTER SARA E (Prepend) × [9.2] 
HANGUL SYLLABLE GA (LV) ÷ [0.3]
+÷ 0E40 × 0308 ÷ AC00 ÷ #  ÷ [0.2] THAI CHARACTER SARA E (Prepend) × [9.0] 
COMBINING DIAERESIS (Extend) ÷ [999.0] HANGUL SYLLABLE GA (LV) ÷ [0.3]
+÷ 0E40 × AC01 ÷        #  ÷ [0.2] THAI CHARACTER SARA E (Prepend) × [9.2] 
HANGUL SYLLABLE GAG (LVT) ÷ [0.3]
+÷ 0E40 × 0308 ÷ AC01 ÷ #  ÷ [0.2] THAI CHARACTER SARA E (Prepend) × [9.0] 
COMBINING DIAERESIS (Extend) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3]
+÷ 0903 ÷ 0020 ÷        #  ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ 
[999.0] SPACE (Other) ÷ [0.3]
+÷ 0903 × 0308 ÷ 0020 ÷ #  ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) × 
[9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] SPACE (Other) ÷ [0.3]
+÷ 0903 ÷ 000D ÷        #  ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ 
[5.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
+÷ 0903 × 0308 ÷ 000D ÷ #  ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) × 
[9.0] COMBINING DIAERESIS (Extend) ÷ [5.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
+÷ 0903 ÷ 000A ÷        #  ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ 
[5.0] <LINE FEED (LF)> (LF) ÷ [0.3]
+÷ 0903 × 0308 ÷ 000A ÷ #  ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) × 
[9.0] COMBINING DIAERESIS (Extend) ÷ [5.0] <LINE FEED (LF)> (LF) ÷ [0.3]
+÷ 0903 ÷ 0001 ÷        #  ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ 
[5.0] <START OF HEADING> (Control) ÷ [0.3]
+÷ 0903 × 0308 ÷ 0001 ÷ #  ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) × 
[9.0] COMBINING DIAERESIS (Extend) ÷ [5.0] <START OF HEADING> (Control) ÷ [0.3]
+÷ 0903 × 0300 ÷        #  ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) × 
[9.0] COMBINING GRAVE ACCENT (Extend) ÷ [0.3]
+÷ 0903 × 0308 × 0300 ÷ #  ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) × 
[9.0] COMBINING DIAERESIS (Extend) × [9.0] COMBINING GRAVE ACCENT (Extend) ÷ 
[0.3]
+÷ 0903 ÷ 0E40 ÷        #  ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ 
[999.0] THAI CHARACTER SARA E (Prepend) ÷ [0.3]
+÷ 0903 × 0308 ÷ 0E40 ÷ #  ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) × 
[9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] THAI CHARACTER SARA E (Prepend) ÷ 
[0.3]
+÷ 0903 × 0903 ÷        #  ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) × 
[9.1] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [0.3]
+÷ 0903 × 0308 × 0903 ÷ #  ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) × 
[9.0] COMBINING DIAERESIS (Extend) × [9.1] DEVANAGARI SIGN VISARGA 
(SpacingMark) ÷ [0.3]
+÷ 0903 ÷ 1100 ÷        #  ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ 
[999.0] HANGUL CHOSEONG KIYEOK (L) ÷ [0.3]
+÷ 0903 × 0308 ÷ 1100 ÷ #  ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) × 
[9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] HANGUL CHOSEONG KIYEOK (L) ÷ [0.3]
+÷ 0903 ÷ 1160 ÷        #  ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ 
[999.0] HANGUL JUNGSEONG FILLER (V) ÷ [0.3]
+÷ 0903 × 0308 ÷ 1160 ÷ #  ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) × 
[9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] HANGUL JUNGSEONG FILLER (V) ÷ [0.3]
+÷ 0903 ÷ 11A8 ÷        #  ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ 
[999.0] HANGUL JONGSEONG KIYEOK (T) ÷ [0.3]
+÷ 0903 × 0308 ÷ 11A8 ÷ #  ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) × 
[9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] HANGUL JONGSEONG KIYEOK (T) ÷ [0.3]
+÷ 0903 ÷ AC00 ÷        #  ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ 
[999.0] HANGUL SYLLABLE GA (LV) ÷ [0.3]
+÷ 0903 × 0308 ÷ AC00 ÷ #  ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) × 
[9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] HANGUL SYLLABLE GA (LV) ÷ [0.3]
+÷ 0903 ÷ AC01 ÷        #  ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ 
[999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3]
+÷ 0903 × 0308 ÷ AC01 ÷ #  ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) × 
[9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3]
+÷ 1100 ÷ 0020 ÷        #  ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) ÷ [999.0] SPACE 
(Other) ÷ [0.3]
+÷ 1100 × 0308 ÷ 0020 ÷ #  ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) × [9.0] COMBINING 
DIAERESIS (Extend) ÷ [999.0] SPACE (Other) ÷ [0.3]
+÷ 1100 ÷ 000D ÷        #  ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) ÷ [5.0] <CARRIAGE 
RETURN (CR)> (CR) ÷ [0.3]
+÷ 1100 × 0308 ÷ 000D ÷ #  ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) × [9.0] COMBINING 
DIAERESIS (Extend) ÷ [5.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
+÷ 1100 ÷ 000A ÷        #  ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) ÷ [5.0] <LINE 
FEED (LF)> (LF) ÷ [0.3]
+÷ 1100 × 0308 ÷ 000A ÷ #  ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) × [9.0] COMBINING 
DIAERESIS (Extend) ÷ [5.0] <LINE FEED (LF)> (LF) ÷ [0.3]
+÷ 1100 ÷ 0001 ÷        #  ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) ÷ [5.0] <START OF 
HEADING> (Control) ÷ [0.3]
+÷ 1100 × 0308 ÷ 0001 ÷ #  ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) × [9.0] COMBINING 
DIAERESIS (Extend) ÷ [5.0] <START OF HEADING> (Control) ÷ [0.3]
+÷ 1100 × 0300 ÷        #  ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) × [9.0] COMBINING 
GRAVE ACCENT (Extend) ÷ [0.3]
+÷ 1100 × 0308 × 0300 ÷ #  ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) × [9.0] COMBINING 
DIAERESIS (Extend) × [9.0] COMBINING GRAVE ACCENT (Extend) ÷ [0.3]
+÷ 1100 ÷ 0E40 ÷        #  ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) ÷ [999.0] THAI 
CHARACTER SARA E (Prepend) ÷ [0.3]
+÷ 1100 × 0308 ÷ 0E40 ÷ #  ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) × [9.0] COMBINING 
DIAERESIS (Extend) ÷ [999.0] THAI CHARACTER SARA E (Prepend) ÷ [0.3]
+÷ 1100 × 0903 ÷        #  ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) × [9.1] 
DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [0.3]
+÷ 1100 × 0308 × 0903 ÷ #  ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) × [9.0] COMBINING 
DIAERESIS (Extend) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [0.3]
+÷ 1100 × 1100 ÷        #  ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) × [6.0] HANGUL 
CHOSEONG KIYEOK (L) ÷ [0.3]
+÷ 1100 × 0308 ÷ 1100 ÷ #  ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) × [9.0] COMBINING 
DIAERESIS (Extend) ÷ [999.0] HANGUL CHOSEONG KIYEOK (L) ÷ [0.3]
+÷ 1100 × 1160 ÷        #  ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) × [6.0] HANGUL 
JUNGSEONG FILLER (V) ÷ [0.3]
+÷ 1100 × 0308 ÷ 1160 ÷ #  ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) × [9.0] COMBINING 
DIAERESIS (Extend) ÷ [999.0] HANGUL JUNGSEONG FILLER (V) ÷ [0.3]
+÷ 1100 ÷ 11A8 ÷        #  ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) ÷ [999.0] HANGUL 
JONGSEONG KIYEOK (T) ÷ [0.3]
+÷ 1100 × 0308 ÷ 11A8 ÷ #  ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) × [9.0] COMBINING 
DIAERESIS (Extend) ÷ [999.0] HANGUL JONGSEONG KIYEOK (T) ÷ [0.3]
+÷ 1100 × AC00 ÷        #  ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) × [6.0] HANGUL 
SYLLABLE GA (LV) ÷ [0.3]
+÷ 1100 × 0308 ÷ AC00 ÷ #  ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) × [9.0] COMBINING 
DIAERESIS (Extend) ÷ [999.0] HANGUL SYLLABLE GA (LV) ÷ [0.3]
+÷ 1100 × AC01 ÷        #  ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) × [6.0] HANGUL 
SYLLABLE GAG (LVT) ÷ [0.3]
+÷ 1100 × 0308 ÷ AC01 ÷ #  ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) × [9.0] COMBINING 
DIAERESIS (Extend) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3]
+÷ 1160 ÷ 0020 ÷        #  ÷ [0.2] HANGUL JUNGSEONG FILLER (V) ÷ [999.0] SPACE 
(Other) ÷ [0.3]
+÷ 1160 × 0308 ÷ 0020 ÷ #  ÷ [0.2] HANGUL JUNGSEONG FILLER (V) × [9.0] 
COMBINING DIAERESIS (Extend) ÷ [999.0] SPACE (Other) ÷ [0.3]
+÷ 1160 ÷ 000D ÷        #  ÷ [0.2] HANGUL JUNGSEONG FILLER (V) ÷ [5.0] 
<CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
+÷ 1160 × 0308 ÷ 000D ÷ #  ÷ [0.2] HANGUL JUNGSEONG FILLER (V) × [9.0] 
COMBINING DIAERESIS (Extend) ÷ [5.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
+÷ 1160 ÷ 000A ÷        #  ÷ [0.2] HANGUL JUNGSEONG FILLER (V) ÷ [5.0] <LINE 
FEED (LF)> (LF) ÷ [0.3]
+÷ 1160 × 0308 ÷ 000A ÷ #  ÷ [0.2] HANGUL JUNGSEONG FILLER (V) × [9.0] 
COMBINING DIAERESIS (Extend) ÷ [5.0] <LINE FEED (LF)> (LF) ÷ [0.3]
+÷ 1160 ÷ 0001 ÷        #  ÷ [0.2] HANGUL JUNGSEONG FILLER (V) ÷ [5.0] <START 
OF HEADING> (Control) ÷ [0.3]
+÷ 1160 × 0308 ÷ 0001 ÷ #  ÷ [0.2] HANGUL JUNGSEONG FILLER (V) × [9.0] 
COMBINING DIAERESIS (Extend) ÷ [5.0] <START OF HEADING> (Control) ÷ [0.3]
+÷ 1160 × 0300 ÷        #  ÷ [0.2] HANGUL JUNGSEONG FILLER (V) × [9.0] 
COMBINING GRAVE ACCENT (Extend) ÷ [0.3]
+÷ 1160 × 0308 × 0300 ÷ #  ÷ [0.2] HANGUL JUNGSEONG FILLER (V) × [9.0] 
COMBINING DIAERESIS (Extend) × [9.0] COMBINING GRAVE ACCENT (Extend) ÷ [0.3]
+÷ 1160 ÷ 0E40 ÷        #  ÷ [0.2] HANGUL JUNGSEONG FILLER (V) ÷ [999.0] THAI 
CHARACTER SARA E (Prepend) ÷ [0.3]
+÷ 1160 × 0308 ÷ 0E40 ÷ #  ÷ [0.2] HANGUL JUNGSEONG FILLER (V) × [9.0] 
COMBINING DIAERESIS (Extend) ÷ [999.0] THAI CHARACTER SARA E (Prepend) ÷ [0.3]
+÷ 1160 × 0903 ÷        #  ÷ [0.2] HANGUL JUNGSEONG FILLER (V) × [9.1] 
DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [0.3]
+÷ 1160 × 0308 × 0903 ÷ #  ÷ [0.2] HANGUL JUNGSEONG FILLER (V) × [9.0] 
COMBINING DIAERESIS (Extend) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ 
[0.3]
+÷ 1160 ÷ 1100 ÷        #  ÷ [0.2] HANGUL JUNGSEONG FILLER (V) ÷ [999.0] HANGUL 
CHOSEONG KIYEOK (L) ÷ [0.3]
+÷ 1160 × 0308 ÷ 1100 ÷ #  ÷ [0.2] HANGUL JUNGSEONG FILLER (V) × [9.0] 
COMBINING DIAERESIS (Extend) ÷ [999.0] HANGUL CHOSEONG KIYEOK (L) ÷ [0.3]
+÷ 1160 × 1160 ÷        #  ÷ [0.2] HANGUL JUNGSEONG FILLER (V) × [7.0] HANGUL 
JUNGSEONG FILLER (V) ÷ [0.3]
+÷ 1160 × 0308 ÷ 1160 ÷ #  ÷ [0.2] HANGUL JUNGSEONG FILLER (V) × [9.0] 
COMBINING DIAERESIS (Extend) ÷ [999.0] HANGUL JUNGSEONG FILLER (V) ÷ [0.3]
+÷ 1160 × 11A8 ÷        #  ÷ [0.2] HANGUL JUNGSEONG FILLER (V) × [7.0] HANGUL 
JONGSEONG KIYEOK (T) ÷ [0.3]
+÷ 1160 × 0308 ÷ 11A8 ÷ #  ÷ [0.2] HANGUL JUNGSEONG FILLER (V) × [9.0] 
COMBINING DIAERESIS (Extend) ÷ [999.0] HANGUL JONGSEONG KIYEOK (T) ÷ [0.3]
+÷ 1160 ÷ AC00 ÷        #  ÷ [0.2] HANGUL JUNGSEONG FILLER (V) ÷ [999.0] HANGUL 
SYLLABLE GA (LV) ÷ [0.3]
+÷ 1160 × 0308 ÷ AC00 ÷ #  ÷ [0.2] HANGUL JUNGSEONG FILLER (V) × [9.0] 
COMBINING DIAERESIS (Extend) ÷ [999.0] HANGUL SYLLABLE GA (LV) ÷ [0.3]
+÷ 1160 ÷ AC01 ÷        #  ÷ [0.2] HANGUL JUNGSEONG FILLER (V) ÷ [999.0] HANGUL 
SYLLABLE GAG (LVT) ÷ [0.3]
+÷ 1160 × 0308 ÷ AC01 ÷ #  ÷ [0.2] HANGUL JUNGSEONG FILLER (V) × [9.0] 
COMBINING DIAERESIS (Extend) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3]
+÷ 11A8 ÷ 0020 ÷        #  ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) ÷ [999.0] SPACE 
(Other) ÷ [0.3]
+÷ 11A8 × 0308 ÷ 0020 ÷ #  ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) × [9.0] 
COMBINING DIAERESIS (Extend) ÷ [999.0] SPACE (Other) ÷ [0.3]
+÷ 11A8 ÷ 000D ÷        #  ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) ÷ [5.0] 
<CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
+÷ 11A8 × 0308 ÷ 000D ÷ #  ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) × [9.0] 
COMBINING DIAERESIS (Extend) ÷ [5.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
+÷ 11A8 ÷ 000A ÷        #  ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) ÷ [5.0] <LINE 
FEED (LF)> (LF) ÷ [0.3]
+÷ 11A8 × 0308 ÷ 000A ÷ #  ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) × [9.0] 
COMBINING DIAERESIS (Extend) ÷ [5.0] <LINE FEED (LF)> (LF) ÷ [0.3]
+÷ 11A8 ÷ 0001 ÷        #  ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) ÷ [5.0] <START 
OF HEADING> (Control) ÷ [0.3]
+÷ 11A8 × 0308 ÷ 0001 ÷ #  ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) × [9.0] 
COMBINING DIAERESIS (Extend) ÷ [5.0] <START OF HEADING> (Control) ÷ [0.3]
+÷ 11A8 × 0300 ÷        #  ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) × [9.0] 
COMBINING GRAVE ACCENT (Extend) ÷ [0.3]
+÷ 11A8 × 0308 × 0300 ÷ #  ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) × [9.0] 
COMBINING DIAERESIS (Extend) × [9.0] COMBINING GRAVE ACCENT (Extend) ÷ [0.3]
+÷ 11A8 ÷ 0E40 ÷        #  ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) ÷ [999.0] THAI 
CHARACTER SARA E (Prepend) ÷ [0.3]
+÷ 11A8 × 0308 ÷ 0E40 ÷ #  ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) × [9.0] 
COMBINING DIAERESIS (Extend) ÷ [999.0] THAI CHARACTER SARA E (Prepend) ÷ [0.3]
+÷ 11A8 × 0903 ÷        #  ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) × [9.1] 
DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [0.3]
+÷ 11A8 × 0308 × 0903 ÷ #  ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) × [9.0] 
COMBINING DIAERESIS (Extend) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ 
[0.3]
+÷ 11A8 ÷ 1100 ÷        #  ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) ÷ [999.0] HANGUL 
CHOSEONG KIYEOK (L) ÷ [0.3]
+÷ 11A8 × 0308 ÷ 1100 ÷ #  ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) × [9.0] 
COMBINING DIAERESIS (Extend) ÷ [999.0] HANGUL CHOSEONG KIYEOK (L) ÷ [0.3]
+÷ 11A8 ÷ 1160 ÷        #  ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) ÷ [999.0] HANGUL 
JUNGSEONG FILLER (V) ÷ [0.3]
+÷ 11A8 × 0308 ÷ 1160 ÷ #  ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) × [9.0] 
COMBINING DIAERESIS (Extend) ÷ [999.0] HANGUL JUNGSEONG FILLER (V) ÷ [0.3]
+÷ 11A8 × 11A8 ÷        #  ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) × [8.0] HANGUL 
JONGSEONG KIYEOK (T) ÷ [0.3]
+÷ 11A8 × 0308 ÷ 11A8 ÷ #  ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) × [9.0] 
COMBINING DIAERESIS (Extend) ÷ [999.0] HANGUL JONGSEONG KIYEOK (T) ÷ [0.3]
+÷ 11A8 ÷ AC00 ÷        #  ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) ÷ [999.0] HANGUL 
SYLLABLE GA (LV) ÷ [0.3]
+÷ 11A8 × 0308 ÷ AC00 ÷ #  ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) × [9.0] 
COMBINING DIAERESIS (Extend) ÷ [999.0] HANGUL SYLLABLE GA (LV) ÷ [0.3]
+÷ 11A8 ÷ AC01 ÷        #  ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) ÷ [999.0] HANGUL 
SYLLABLE GAG (LVT) ÷ [0.3]
+÷ 11A8 × 0308 ÷ AC01 ÷ #  ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) × [9.0] 
COMBINING DIAERESIS (Extend) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3]
+÷ AC00 ÷ 0020 ÷        #  ÷ [0.2] HANGUL SYLLABLE GA (LV) ÷ [999.0] SPACE 
(Other) ÷ [0.3]
+÷ AC00 × 0308 ÷ 0020 ÷ #  ÷ [0.2] HANGUL SYLLABLE GA (LV) × [9.0] COMBINING 
DIAERESIS (Extend) ÷ [999.0] SPACE (Other) ÷ [0.3]
+÷ AC00 ÷ 000D ÷        #  ÷ [0.2] HANGUL SYLLABLE GA (LV) ÷ [5.0] <CARRIAGE 
RETURN (CR)> (CR) ÷ [0.3]
+÷ AC00 × 0308 ÷ 000D ÷ #  ÷ [0.2] HANGUL SYLLABLE GA (LV) × [9.0] COMBINING 
DIAERESIS (Extend) ÷ [5.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
+÷ AC00 ÷ 000A ÷        #  ÷ [0.2] HANGUL SYLLABLE GA (LV) ÷ [5.0] <LINE FEED 
(LF)> (LF) ÷ [0.3]
+÷ AC00 × 0308 ÷ 000A ÷ #  ÷ [0.2] HANGUL SYLLABLE GA (LV) × [9.0] COMBINING 
DIAERESIS (Extend) ÷ [5.0] <LINE FEED (LF)> (LF) ÷ [0.3]
+÷ AC00 ÷ 0001 ÷        #  ÷ [0.2] HANGUL SYLLABLE GA (LV) ÷ [5.0] <START OF 
HEADING> (Control) ÷ [0.3]
+÷ AC00 × 0308 ÷ 0001 ÷ #  ÷ [0.2] HANGUL SYLLABLE GA (LV) × [9.0] COMBINING 
DIAERESIS (Extend) ÷ [5.0] <START OF HEADING> (Control) ÷ [0.3]
+÷ AC00 × 0300 ÷        #  ÷ [0.2] HANGUL SYLLABLE GA (LV) × [9.0] COMBINING 
GRAVE ACCENT (Extend) ÷ [0.3]
+÷ AC00 × 0308 × 0300 ÷ #  ÷ [0.2] HANGUL SYLLABLE GA (LV) × [9.0] COMBINING 
DIAERESIS (Extend) × [9.0] COMBINING GRAVE ACCENT (Extend) ÷ [0.3]
+÷ AC00 ÷ 0E40 ÷        #  ÷ [0.2] HANGUL SYLLABLE GA (LV) ÷ [999.0] THAI 
CHARACTER SARA E (Prepend) ÷ [0.3]
+÷ AC00 × 0308 ÷ 0E40 ÷ #  ÷ [0.2] HANGUL SYLLABLE GA (LV) × [9.0] COMBINING 
DIAERESIS (Extend) ÷ [999.0] THAI CHARACTER SARA E (Prepend) ÷ [0.3]
+÷ AC00 × 0903 ÷        #  ÷ [0.2] HANGUL SYLLABLE GA (LV) × [9.1] DEVANAGARI 
SIGN VISARGA (SpacingMark) ÷ [0.3]
+÷ AC00 × 0308 × 0903 ÷ #  ÷ [0.2] HANGUL SYLLABLE GA (LV) × [9.0] COMBINING 
DIAERESIS (Extend) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [0.3]
+÷ AC00 ÷ 1100 ÷        #  ÷ [0.2] HANGUL SYLLABLE GA (LV) ÷ [999.0] HANGUL 
CHOSEONG KIYEOK (L) ÷ [0.3]
+÷ AC00 × 0308 ÷ 1100 ÷ #  ÷ [0.2] HANGUL SYLLABLE GA (LV) × [9.0] COMBINING 
DIAERESIS (Extend) ÷ [999.0] HANGUL CHOSEONG KIYEOK (L) ÷ [0.3]
+÷ AC00 × 1160 ÷        #  ÷ [0.2] HANGUL SYLLABLE GA (LV) × [7.0] HANGUL 
JUNGSEONG FILLER (V) ÷ [0.3]
+÷ AC00 × 0308 ÷ 1160 ÷ #  ÷ [0.2] HANGUL SYLLABLE GA (LV) × [9.0] COMBINING 
DIAERESIS (Extend) ÷ [999.0] HANGUL JUNGSEONG FILLER (V) ÷ [0.3]
+÷ AC00 × 11A8 ÷        #  ÷ [0.2] HANGUL SYLLABLE GA (LV) × [7.0] HANGUL 
JONGSEONG KIYEOK (T) ÷ [0.3]
+÷ AC00 × 0308 ÷ 11A8 ÷ #  ÷ [0.2] HANGUL SYLLABLE GA (LV) × [9.0] COMBINING 
DIAERESIS (Extend) ÷ [999.0] HANGUL JONGSEONG KIYEOK (T) ÷ [0.3]
+÷ AC00 ÷ AC00 ÷        #  ÷ [0.2] HANGUL SYLLABLE GA (LV) ÷ [999.0] HANGUL 
SYLLABLE GA (LV) ÷ [0.3]
+÷ AC00 × 0308 ÷ AC00 ÷ #  ÷ [0.2] HANGUL SYLLABLE GA (LV) × [9.0] COMBINING 
DIAERESIS (Extend) ÷ [999.0] HANGUL SYLLABLE GA (LV) ÷ [0.3]
+÷ AC00 ÷ AC01 ÷        #  ÷ [0.2] HANGUL SYLLABLE GA (LV) ÷ [999.0] HANGUL 
SYLLABLE GAG (LVT) ÷ [0.3]
+÷ AC00 × 0308 ÷ AC01 ÷ #  ÷ [0.2] HANGUL SYLLABLE GA (LV) × [9.0] COMBINING 
DIAERESIS (Extend) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3]
+÷ AC01 ÷ 0020 ÷        #  ÷ [0.2] HANGUL SYLLABLE GAG (LVT) ÷ [999.0] SPACE 
(Other) ÷ [0.3]
+÷ AC01 × 0308 ÷ 0020 ÷ #  ÷ [0.2] HANGUL SYLLABLE GAG (LVT) × [9.0] COMBINING 
DIAERESIS (Extend) ÷ [999.0] SPACE (Other) ÷ [0.3]
+÷ AC01 ÷ 000D ÷        #  ÷ [0.2] HANGUL SYLLABLE GAG (LVT) ÷ [5.0] <CARRIAGE 
RETURN (CR)> (CR) ÷ [0.3]
+÷ AC01 × 0308 ÷ 000D ÷ #  ÷ [0.2] HANGUL SYLLABLE GAG (LVT) × [9.0] COMBINING 
DIAERESIS (Extend) ÷ [5.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
+÷ AC01 ÷ 000A ÷        #  ÷ [0.2] HANGUL SYLLABLE GAG (LVT) ÷ [5.0] <LINE FEED 
(LF)> (LF) ÷ [0.3]
+÷ AC01 × 0308 ÷ 000A ÷ #  ÷ [0.2] HANGUL SYLLABLE GAG (LVT) × [9.0] COMBINING 
DIAERESIS (Extend) ÷ [5.0] <LINE FEED (LF)> (LF) ÷ [0.3]
+÷ AC01 ÷ 0001 ÷        #  ÷ [0.2] HANGUL SYLLABLE GAG (LVT) ÷ [5.0] <START OF 
HEADING> (Control) ÷ [0.3]
+÷ AC01 × 0308 ÷ 0001 ÷ #  ÷ [0.2] HANGUL SYLLABLE GAG (LVT) × [9.0] COMBINING 
DIAERESIS (Extend) ÷ [5.0] <START OF HEADING> (Control) ÷ [0.3]
+÷ AC01 × 0300 ÷        #  ÷ [0.2] HANGUL SYLLABLE GAG (LVT) × [9.0] COMBINING 
GRAVE ACCENT (Extend) ÷ [0.3]
+÷ AC01 × 0308 × 0300 ÷ #  ÷ [0.2] HANGUL SYLLABLE GAG (LVT) × [9.0] COMBINING 
DIAERESIS (Extend) × [9.0] COMBINING GRAVE ACCENT (Extend) ÷ [0.3]
+÷ AC01 ÷ 0E40 ÷        #  ÷ [0.2] HANGUL SYLLABLE GAG (LVT) ÷ [999.0] THAI 
CHARACTER SARA E (Prepend) ÷ [0.3]
+÷ AC01 × 0308 ÷ 0E40 ÷ #  ÷ [0.2] HANGUL SYLLABLE GAG (LVT) × [9.0] COMBINING 
DIAERESIS (Extend) ÷ [999.0] THAI CHARACTER SARA E (Prepend) ÷ [0.3]
+÷ AC01 × 0903 ÷        #  ÷ [0.2] HANGUL SYLLABLE GAG (LVT) × [9.1] DEVANAGARI 
SIGN VISARGA (SpacingMark) ÷ [0.3]
+÷ AC01 × 0308 × 0903 ÷ #  ÷ [0.2] HANGUL SYLLABLE GAG (LVT) × [9.0] COMBINING 
DIAERESIS (Extend) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [0.3]
+÷ AC01 ÷ 1100 ÷        #  ÷ [0.2] HANGUL SYLLABLE GAG (LVT) ÷ [999.0] HANGUL 
CHOSEONG KIYEOK (L) ÷ [0.3]
+÷ AC01 × 0308 ÷ 1100 ÷ #  ÷ [0.2] HANGUL SYLLABLE GAG (LVT) × [9.0] COMBINING 
DIAERESIS (Extend) ÷ [999.0] HANGUL CHOSEONG KIYEOK (L) ÷ [0.3]
+÷ AC01 ÷ 1160 ÷        #  ÷ [0.2] HANGUL SYLLABLE GAG (LVT) ÷ [999.0] HANGUL 
JUNGSEONG FILLER (V) ÷ [0.3]
+÷ AC01 × 0308 ÷ 1160 ÷ #  ÷ [0.2] HANGUL SYLLABLE GAG (LVT) × [9.0] COMBINING 
DIAERESIS (Extend) ÷ [999.0] HANGUL JUNGSEONG FILLER (V) ÷ [0.3]
+÷ AC01 × 11A8 ÷        #  ÷ [0.2] HANGUL SYLLABLE GAG (LVT) × [8.0] HANGUL 
JONGSEONG KIYEOK (T) ÷ [0.3]
+÷ AC01 × 0308 ÷ 11A8 ÷ #  ÷ [0.2] HANGUL SYLLABLE GAG (LVT) × [9.0] COMBINING 
DIAERESIS (Extend) ÷ [999.0] HANGUL JONGSEONG KIYEOK (T) ÷ [0.3]
+÷ AC01 ÷ AC00 ÷        #  ÷ [0.2] HANGUL SYLLABLE GAG (LVT) ÷ [999.0] HANGUL 
SYLLABLE GA (LV) ÷ [0.3]
+÷ AC01 × 0308 ÷ AC00 ÷ #  ÷ [0.2] HANGUL SYLLABLE GAG (LVT) × [9.0] COMBINING 
DIAERESIS (Extend) ÷ [999.0] HANGUL SYLLABLE GA (LV) ÷ [0.3]
+÷ AC01 ÷ AC01 ÷        #  ÷ [0.2] HANGUL SYLLABLE GAG (LVT) ÷ [999.0] HANGUL 
SYLLABLE GAG (LVT) ÷ [0.3]
+÷ AC01 × 0308 ÷ AC01 ÷ #  ÷ [0.2] HANGUL SYLLABLE GAG (LVT) × [9.0] COMBINING 
DIAERESIS (Extend) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3]
+# Lines: 288
diff --git a/tests/unigbrk/test-uc-is-grapheme-break.c 
b/tests/unigbrk/test-uc-is-grapheme-break.c
new file mode 100644
index 0000000..c0aa0eb
--- /dev/null
+++ b/tests/unigbrk/test-uc-is-grapheme-break.c
@@ -0,0 +1,157 @@
+/* Grapheme cluster break function test.
+   Copyright (C) 2010 Free Software Foundation, Inc.
+
+   This program 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 3 of the License, or
+   (at your option) any later version.
+
+   This program 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 this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+/* Written by Ben Pfaff <address@hidden>, 2010. */
+
+#include <config.h>
+
+/* Specification. */
+#include <unigbrk.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+const char *
+graphemebreakproperty_to_string (int gbp)
+{
+  printf ("%d\n", gbp);
+  switch (gbp)
+    {
+#define CASE(VALUE) case GBP_##VALUE: return #VALUE;
+      CASE(OTHER)
+      CASE(CR)
+      CASE(LF)
+      CASE(CONTROL)
+      CASE(EXTEND)
+      CASE(PREPEND)
+      CASE(SPACINGMARK)
+      CASE(L)
+      CASE(V)
+      CASE(T)
+      CASE(LV)
+      CASE(LVT)
+    }
+  abort ();
+}
+
+int
+main (int argc, char *argv[])
+{
+  const char *filename;
+  char line[1024];
+  int exit_code;
+  FILE *stream;
+  int lineno;
+
+  if (argc != 2)
+    {
+      fprintf (stderr, "usage: %s FILENAME\n"
+               "where FILENAME is the location of the GraphemeBreakTest.txt\n"
+               "test file.\n", argv[0]);
+      exit (1);
+    }
+
+  filename = argv[1];
+  stream = fopen (filename, "r");
+  if (stream == NULL)
+    {
+      fprintf (stderr, "error during fopen of '%s'\n", filename);
+      exit (1);
+    }
+
+  exit_code = 0;
+  lineno = 0;
+  while (fgets (line, sizeof line, stream))
+    {
+      char *comment;
+      const char *p;
+      ucs4_t prev;
+
+      lineno++;
+
+      comment = strchr (line, '#');
+      if (comment != NULL)
+        *comment = '\0';
+      if (line[strspn (line, " \t\r\n")] == '\0')
+        continue;
+
+      prev = 0;
+      p = line;
+      do
+        {
+          bool should_break;
+          ucs4_t next;
+
+          p += strspn (p, " \t\r\n");
+          if (!strncmp (p, "\xc3\xb7" /* ÷ */, 2))
+            {
+              should_break = true;
+              p += 2;
+            }
+          else if (!strncmp (p, "\xc3\x97" /* × */, 2))
+            {
+              should_break = false;
+              p += 2;
+            }
+          else
+            {
+              fprintf (stderr, "%s:%d.%d: syntax error expecting `÷' or `÷'\n",
+                       filename, lineno, p - line + 1);
+              exit (1);
+            }
+
+          p += strspn (p, " \t\r\n");
+          if (*p == '\0')
+            next = 0;
+          else
+            {
+              unsigned int next_int;
+              int n;
+
+              if (sscanf (p, "%x%n", &next_int, &n) != 1)
+                {
+                  fprintf (stderr, "%s:%d.%d: syntax error at `%s' expecting "
+                           "hexadecimal Unicode code point number\n",
+                           filename, lineno, p - line + 1, p);
+                  exit (1);
+                }
+              p += n;
+
+              next = next_int;
+            }
+
+          if (uc_is_grapheme_cluster_break (prev, next) != should_break)
+            {
+              int prev_gbp = uc_graphemeclusterbreak_property (prev);
+              int next_gbp = uc_graphemeclusterbreak_property (next);
+              fprintf (stderr, "%s:%d: should %s U+%04X (%s) and "
+                       "U+%04X (%s)\n",
+                       filename, lineno,
+                       should_break ? "break" : "join",
+                       prev, graphemebreakproperty_to_string (prev_gbp),
+                       next, graphemebreakproperty_to_string (next_gbp));
+              exit_code = 1;
+            }
+
+          p += strspn (p, " \t\r\n");
+          prev = next;
+        }
+      while (*p != '\0');
+    }
+
+  return exit_code;
+}
diff --git a/tests/unigbrk/test-uc-is-grapheme-break.sh 
b/tests/unigbrk/test-uc-is-grapheme-break.sh
new file mode 100755
index 0000000..37473e1
--- /dev/null
+++ b/tests/unigbrk/test-uc-is-grapheme-break.sh
@@ -0,0 +1,3 @@
+#!/bin/sh
+
+./test-uc-is-grapheme-break${EXEEXT} "${srcdir}/unigbrk/GraphemeBreakTest.txt"
-- 
1.7.1



-- 
Ben Pfaff 
http://benpfaff.org



reply via email to

[Prev in Thread] Current Thread [Next in Thread]